я косяк, поправил веб. Капитан, работайте!

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
влад
2026-07-16 11:06:47 +03:00
co-authored by Cursor
parent 148d645760
commit 2c294424ef
85 changed files with 17410 additions and 110 deletions
+35
View File
@@ -0,0 +1,35 @@
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-display: swap;
src: url('/static/fonts/inter/inter-300.ttf') format('truetype');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('/static/fonts/inter/inter-400.ttf') format('truetype');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url('/static/fonts/inter/inter-500.ttf') format('truetype');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('/static/fonts/inter/inter-600.ttf') format('truetype');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('/static/fonts/inter/inter-700.ttf') format('truetype');
}
@@ -0,0 +1,93 @@
.kiosk-calibration-backdrop {
display: none;
position: fixed;
inset: 0;
background: rgba(26, 30, 28, 0.45);
z-index: 5000;
align-items: center;
justify-content: center;
padding: 16px;
box-sizing: border-box;
}
.kiosk-calibration-backdrop.is-open {
display: flex;
}
.kiosk-calibration-panel {
width: min(920px, 100%);
max-height: min(92vh, 900px);
display: flex;
flex-direction: column;
overflow: hidden;
border-radius: 16px;
box-shadow: 0 16px 48px rgba(26, 30, 28, 0.18);
}
.kiosk-calibration-panel--dark {
background: #1f1f1f;
color: #fff;
border: 1px solid #2f2f2f;
}
.kiosk-calibration-panel--light {
background: #fff;
color: #1a1e1c;
border: 1px solid rgba(26, 30, 28, 0.08);
}
.kiosk-calibration-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 14px 18px;
flex-shrink: 0;
}
.kiosk-calibration-panel--dark .kiosk-calibration-head {
border-bottom: 1px solid #2f2f2f;
}
.kiosk-calibration-panel--light .kiosk-calibration-head {
border-bottom: 1px solid rgba(26, 30, 28, 0.08);
}
.kiosk-calibration-title {
margin: 0;
font-family: system-ui, -apple-system, sans-serif;
font-size: 18px;
font-weight: 600;
line-height: 1.3;
}
.kiosk-calibration-close {
padding: 8px 14px;
border-radius: 8px;
cursor: pointer;
font-size: 14px;
font-family: inherit;
flex-shrink: 0;
}
.kiosk-calibration-panel--dark .kiosk-calibration-close {
border: 1px solid #7a7a7a;
background: #3a3a3a;
color: #fff;
}
.kiosk-calibration-panel--light .kiosk-calibration-close {
border: 1px solid rgba(26, 30, 28, 0.14);
background: #fff;
color: #1a1e1c;
}
.kiosk-calibration-frame {
border: 0;
width: 100%;
flex: 1 1 auto;
min-height: 320px;
max-height: calc(92vh - 64px);
background: #fff;
display: block;
}
@@ -0,0 +1,6 @@
/* Киоск: скрыть указатель мыши (Chromium + labwc). */
html.wesp-kiosk-hide-cursor,
html.wesp-kiosk-hide-cursor body,
html.wesp-kiosk-hide-cursor * {
cursor: none !important;
}
+404
View File
@@ -0,0 +1,404 @@
/**
* Тема киоск-модалок: в светлой теме (html[data-theme="light"]) шапки и панели
* совпадают со светлым интерфейсом, без «тёмного» вида заголовков.
*/
/* --- Меню ☰ --- */
html[data-theme="light"] #wespKioskMenuOverlay .wesp-kiosk-menu-panel {
background: #ffffff !important;
border-color: #e5e7eb !important;
color: #111827 !important;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12) !important;
}
html[data-theme="light"] #wespKioskMenuOverlay .wesp-kiosk-menu-link {
background: #f3f4f6 !important;
border-color: #e5e7eb !important;
color: #111827 !important;
}
html[data-theme="light"] #wespKioskMenuOverlay .wesp-kiosk-menu-link:hover {
background: #1b66a8 !important;
border-color: #4ea8ff !important;
color: #ffffff !important;
}
html[data-theme="light"] #wespKioskMenuOverlay .wesp-kiosk-menu-close {
border-color: #d1d5db !important;
background: #f3f4f6 !important;
color: #111827 !important;
}
/* --- Проверка БД / калибровка (iframe) --- */
html[data-theme="light"] #kioskDbCheckModal .kiosk-db-check-panel,
html[data-theme="light"] #kioskCalibrationModal .kiosk-calibration-panel {
background: #ffffff !important;
color: #111827 !important;
border-color: #e5e7eb !important;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12) !important;
}
html[data-theme="light"] #kioskDbCheckModal .kiosk-db-check-panel > div:first-child,
html[data-theme="light"] #kioskCalibrationModal .kiosk-calibration-panel > div:first-child {
border-bottom-color: #e5e7eb !important;
}
html[data-theme="light"] #kioskDbCheckModal .kiosk-db-check-panel h2,
html[data-theme="light"] #kioskCalibrationModal .kiosk-calibration-panel h2 {
color: #111827 !important;
}
html[data-theme="light"] #kioskDbCheckClose,
html[data-theme="light"] #kioskCalibrationClose {
border-color: #d1d5db !important;
background: #f3f4f6 !important;
color: #111827 !important;
}
/* --- Привязка терминала (QR) --- */
@keyframes kioskPairSpin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
#kioskPairModal {
display: none;
position: fixed;
inset: 0;
z-index: 5000;
box-sizing: border-box;
padding: 8px;
padding:
max(8px, env(safe-area-inset-top, 0px))
max(8px, env(safe-area-inset-right, 0px))
max(8px, env(safe-area-inset-bottom, 0px))
max(8px, env(safe-area-inset-left, 0px));
background: rgba(0, 0, 0, 0.55);
overflow: hidden;
}
#kioskPairModal.kiosk-pair-open {
display: flex;
align-items: stretch;
justify-content: center;
height: 100vh;
height: 100dvh;
}
body.kiosk-pair-modal-open {
overflow: hidden !important;
}
#kioskPairModal .kiosk-pair-panel {
box-sizing: border-box;
display: flex;
flex-direction: column;
width: min(480px, 100%);
height: 100%;
max-height: 100%;
min-height: 0;
margin: 0 auto;
overflow: hidden;
background: #1f1f1f;
color: #fff;
border-radius: 14px;
padding: 12px;
text-align: center;
border: 1px solid #2f2f2f;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.45);
}
#kioskPairModal .kiosk-pair-header {
flex: 0 0 auto;
}
#kioskPairModal .kiosk-pair-body {
flex: 1 1 auto;
min-height: 0;
display: flex;
flex-direction: column;
overflow-x: hidden;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
padding: 0 2px;
}
#kioskPairModal h3 {
margin: 0 0 4px 0;
font-size: clamp(0.95rem, 3.6vw, 1.1rem);
}
#kioskPairModal .kiosk-pair-subtitle {
margin: 0 0 6px 0;
font-size: clamp(0.8rem, 3vw, 0.9rem);
}
#kioskPairModal .kiosk-pair-steps {
flex: 0 0 auto;
margin: 0 auto 8px auto;
text-align: left;
max-width: 400px;
font-size: clamp(0.72rem, 2.6vw, 0.8rem);
line-height: 1.35;
color: #d7d7d7;
}
#kioskPairModal .kiosk-pair-loading {
display: none;
align-items: center;
justify-content: center;
gap: 10px;
margin: 8px auto;
color: #d7d7d7;
font-size: 14px;
}
#kioskPairModal .kiosk-pair-spinner {
display: inline-block;
width: 16px;
height: 16px;
border: 2px solid #5a5a5a;
border-top-color: #4ea8ff;
border-radius: 50%;
animation: kioskPairSpin 0.8s linear infinite;
flex-shrink: 0;
}
#kioskPairModal .kiosk-pair-qr-wrap {
display: none;
flex: 1 1 auto;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 0;
width: 100%;
margin: 4px auto;
padding: 4px 0;
}
#kioskPairModal .kiosk-pair-qr-wrap.kiosk-pair-qr-visible {
display: flex;
}
#kioskPairModal .kiosk-pair-qr {
display: block;
width: min(92vw, 52vh, 360px);
min-width: min(160px, 78vw);
height: auto;
aspect-ratio: 1 / 1;
object-fit: contain;
border: 1px solid #3b3b3b;
border-radius: 10px;
background: #fff;
}
#kioskPairModal .kiosk-pair-url {
flex: 0 0 auto;
font-size: clamp(0.62rem, 2.2vw, 0.72rem);
word-break: break-all;
margin: 6px 0;
color: #b8d8ff;
text-align: left;
max-height: 3.6em;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
#kioskPairModal .kiosk-pair-status {
flex: 0 0 auto;
font-size: clamp(0.72rem, 2.6vw, 0.8rem);
color: #d7d7d7;
margin: 4px 0 6px;
}
#kioskPairModal .kiosk-pair-actions {
flex: 0 0 auto;
display: flex;
gap: 8px;
justify-content: stretch;
align-items: stretch;
flex-wrap: nowrap;
margin: 8px -12px -12px;
padding: 12px;
border-top: 1px solid #333;
border-radius: 0 0 14px 14px;
background: #1f1f1f;
}
#kioskPairModal .kiosk-pair-btn {
box-sizing: border-box;
padding: 10px 12px;
border-radius: 8px;
border: 1px solid #7a7a7a;
background: #3a3a3a;
color: #fff;
cursor: pointer;
font: inherit;
font-size: clamp(0.75rem, 2.8vw, 0.875rem);
line-height: 1.25;
min-height: 42px;
flex: 1 1 0;
min-width: 0;
max-width: none;
appearance: none;
-webkit-appearance: none;
}
#kioskPairModal .kiosk-pair-btn--primary {
border-color: #4ea8ff;
background: #1b66a8;
color: #fff;
}
#kioskPairModal .kiosk-pair-btn--secondary {
border-color: #5a5a5a;
background: #2a2a2a;
color: #fff;
}
#kioskPairModal .kiosk-pair-btn--ghost {
border-color: #6a6a6a;
background: #333;
color: #f0f0f0;
}
#kioskPairModal .kiosk-pair-btn:focus-visible {
outline: 2px solid #4ea8ff;
outline-offset: 2px;
}
@media (max-height: 520px) {
#kioskPairModal .kiosk-pair-panel {
padding: 8px;
border-radius: 10px;
}
#kioskPairModal .kiosk-pair-qr {
width: min(88vw, 38vh, 280px);
}
#kioskPairModal .kiosk-pair-steps {
font-size: 0.7rem;
line-height: 1.25;
}
#kioskPairModal .kiosk-pair-btn {
min-height: 38px;
padding: 8px 10px;
}
#kioskPairModal .kiosk-pair-actions {
flex-wrap: wrap;
}
#kioskPairModal .kiosk-pair-btn {
flex: 1 1 calc(50% - 4px);
}
#kioskPairModal .kiosk-pair-btn--ghost {
flex: 1 1 100%;
}
}
#kioskBlockedOverlay {
box-sizing: border-box;
padding: max(16px, env(safe-area-inset-top, 0px)) 16px;
overflow-y: auto;
}
#kioskBlockedOverlay > div {
max-width: min(520px, 100%);
}
html[data-theme="light"] #kioskPairModal .kiosk-pair-panel {
background: #ffffff !important;
color: #111827 !important;
border-color: #e5e7eb !important;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12) !important;
}
html[data-theme="light"] #kioskPairModal h3 {
color: #111827 !important;
}
html[data-theme="light"] #kioskPairModal .kiosk-pair-subtitle {
color: #374151 !important;
}
html[data-theme="light"] #kioskPairModal .kiosk-pair-steps {
color: #4b5563 !important;
}
html[data-theme="light"] #kioskPairLoading,
html[data-theme="light"] #kioskPairModal .kiosk-pair-loading {
color: #4b5563 !important;
}
html[data-theme="light"] #kioskPairLoading span:first-child,
html[data-theme="light"] #kioskPairModal .kiosk-pair-spinner {
border-color: #d1d5db !important;
border-top-color: #2563eb !important;
}
html[data-theme="light"] #kioskPairUrl {
color: #2563eb !important;
}
html[data-theme="light"] #kioskPairStatus {
color: #6b7280 !important;
}
html[data-theme="dark"] #kioskPairStatus {
color: #d7d7d7 !important;
}
html[data-theme="light"] #kioskPairModal .kiosk-pair-actions {
background: #ffffff !important;
border-top-color: #e5e7eb !important;
}
html[data-theme="light"] #kioskPairModal .kiosk-pair-btn--primary,
html[data-theme="light"] #kioskPairCopy {
border-color: #2563eb !important;
background: #2563eb !important;
color: #ffffff !important;
}
html[data-theme="light"] #kioskPairModal .kiosk-pair-btn--secondary,
html[data-theme="light"] #kioskPairRefresh {
border-color: #d1d5db !important;
background: #ffffff !important;
color: #111827 !important;
}
html[data-theme="light"] #kioskPairModal .kiosk-pair-btn--ghost,
html[data-theme="light"] #kioskPairClose {
border-color: #d1d5db !important;
background: #f3f4f6 !important;
color: #111827 !important;
}
/* --- Блокировка до привязки --- */
html[data-theme="light"] #kioskBlockedOverlay {
background: rgba(15, 23, 42, 0.45) !important;
color: #111827 !important;
}
html[data-theme="light"] #kioskBlockedOverlay h2 {
color: #111827 !important;
}
html[data-theme="light"] #kioskBlockedOverlay p {
color: #4b5563 !important;
}
html[data-theme="light"] #kioskBlockedPairBtn {
background: #2563eb !important;
border: 1px solid #2563eb !important;
color: #ffffff !important;
padding: 10px 18px;
border-radius: 8px;
cursor: pointer;
font-size: 15px;
}
+24
View File
@@ -0,0 +1,24 @@
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
font-stretch: normal;
font-display: swap;
src: url('/static/fonts/roboto/roboto-400.ttf') format('truetype');
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
font-stretch: normal;
font-display: swap;
src: url('/static/fonts/roboto/roboto-500.ttf') format('truetype');
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
font-stretch: normal;
font-display: swap;
src: url('/static/fonts/roboto/roboto-700.ttf') format('truetype');
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,139 @@
/* Карточка в главных настройках + модалка контроля отклонений */
/* Поверх #settingsModal (z-index: 3000) */
#feedQualitySettingsModal.modal.wesp-shell-modal {
z-index: 3100;
}
.modal.wesp-shell-modal .modal-dialog.modal-dialog--shell-fq {
max-width: min(760px, calc(100vw - 1rem));
}
#feedQualitySettingsModal .modal-content.fq-settings-modal__content {
max-height: min(94vh, 900px);
display: flex;
flex-direction: column;
}
#feedQualitySettingsModal .wesp-shell-bsmodal-body {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
max-height: min(calc(94vh - 8rem), 760px);
}
#feedQualitySettingsModal .wesp-shell-bsmodal-actions {
flex-shrink: 0;
margin-top: 0;
padding-top: 12px;
border-top: 1px solid var(--border-light, #e2e8f0);
}
.settings-feed-quality-card {
background: #f8fafc;
border-radius: 12px;
padding: 1rem 1.25rem;
margin-bottom: 0.75rem;
border: 1px solid #e2e8f0;
}
.settings-feed-quality-card--clickable {
cursor: pointer;
transition: all 0.2s ease;
}
.settings-feed-quality-card--clickable:hover {
background: rgba(var(--primary-rgb), 0.05);
border-color: var(--primary-color, #2196f3);
}
.settings-feed-quality-card .settings-card-title {
margin: 0;
justify-content: center;
position: relative;
}
.settings-feed-quality-card .settings-card-title > i:first-child {
position: absolute;
left: 0;
}
.settings-feed-quality-card .settings-card-title .settings-chevron {
position: absolute;
right: 0;
}
.fq-settings-modal .fq-settings-section {
border: 1px solid var(--border-light, #e2e8f0);
border-radius: 10px;
padding: 0.85rem 1rem;
margin-bottom: 0.75rem;
background: var(--bg-light, #f8fafc);
}
.fq-settings-modal .fq-settings-section__head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
margin-bottom: 0.65rem;
}
.fq-settings-modal .fq-settings-section__title {
margin: 0;
font-size: 0.9rem;
font-weight: 600;
color: var(--text-dark, #1e293b);
}
.fq-settings-modal .fq-settings-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
gap: 0.65rem 1rem;
}
.fq-settings-modal .fq-settings-field label {
display: block;
font-size: 0.75rem;
font-weight: 500;
color: var(--text-muted, #64748b);
margin-bottom: 0.25rem;
}
.fq-settings-modal .fq-settings-checks {
display: flex;
flex-wrap: wrap;
gap: 0.75rem 1.25rem;
margin-top: 0.5rem;
}
.fq-settings-modal .fq-settings-check {
display: inline-flex;
align-items: center;
gap: 0.35rem;
font-size: 0.8125rem;
color: var(--text-dark, #334155);
margin: 0;
cursor: pointer;
}
html[data-theme="dark"] .settings-feed-quality-card {
background: rgba(255, 255, 255, 0.06);
border-color: var(--dm-border, rgba(255, 255, 255, 0.12));
}
html[data-theme="dark"] .settings-feed-quality-card--clickable:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.25);
}
html[data-theme="dark"] .fq-settings-modal .fq-settings-section {
background: rgba(255, 255, 255, 0.04);
border-color: rgba(255, 255, 255, 0.1);
}
html[data-theme="dark"] .fq-settings-modal .fq-settings-section__title,
html[data-theme="dark"] .fq-settings-modal .fq-settings-check {
color: #f1f5f9;
}
@@ -0,0 +1,204 @@
/**
* Kiosk/operator skeleton layouts — builds on wesp-recipes-skeleton.css primitives.
*/
/* --- Grid cards (direct children of .dispenser-grid) --- */
.dispenser-card.kiosk-skeleton-card {
pointer-events: none;
cursor: default;
}
.dispenser-card.kiosk-skeleton-card:nth-child(1) { --skel-i: 0; }
.dispenser-card.kiosk-skeleton-card:nth-child(2) { --skel-i: 1; }
.dispenser-card.kiosk-skeleton-card:nth-child(3) { --skel-i: 2; }
.dispenser-card.kiosk-skeleton-card:nth-child(4) { --skel-i: 3; }
.dispenser-grid.kiosk-skeleton-host--exit {
opacity: 0;
pointer-events: none;
transition: opacity 0.15s ease;
}
.dashboard-skeleton-bar--kiosk-title {
width: 72%;
height: 1.75rem;
margin-bottom: 12px;
}
.kiosk-skeleton-info {
display: flex;
flex-direction: column;
gap: 6px;
}
.dashboard-skeleton-bar--kiosk-meta {
width: 88%;
height: 0.72rem;
margin-bottom: 0;
}
.dashboard-skeleton-bar--kiosk-meta:last-child {
width: 62%;
}
/* Legacy grid wrapper (unused on recipes_selection; kept for compatibility) */
.kiosk-skeleton-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 16px;
width: 100%;
min-height: 8rem;
transition: opacity 0.15s ease;
}
.kiosk-skeleton-grid--exit {
opacity: 0;
pointer-events: none;
}
/* --- Unloading groups list --- */
.kiosk-skeleton-groups {
display: flex;
flex-direction: column;
gap: 12px;
min-height: 6rem;
transition: opacity 0.15s ease;
}
.kiosk-skeleton-groups--exit {
opacity: 0;
pointer-events: none;
}
.kiosk-skeleton-group-item {
background: var(--white, #fff);
border: 1px solid var(--gray-200, #e5e7eb);
border-radius: 8px;
padding: 16px 20px;
pointer-events: none;
}
.kiosk-skeleton-group-item:nth-child(1) { --skel-i: 0; }
.kiosk-skeleton-group-item:nth-child(2) { --skel-i: 1; }
.kiosk-skeleton-group-item:nth-child(3) { --skel-i: 2; }
.kiosk-skeleton-group-item .dashboard-skeleton-bar--title {
width: 55%;
height: 1.1rem;
margin-bottom: 10px;
}
.kiosk-skeleton-group-item .dashboard-skeleton-bar--meta {
width: 40%;
height: 0.85rem;
margin-bottom: 0;
}
/* --- Duplicate / weight panel --- */
.kiosk-skeleton-panel {
transition: opacity 0.15s ease;
}
.kiosk-skeleton-panel--exit {
opacity: 0;
pointer-events: none;
}
.kiosk-skeleton-weight-hero {
width: min(280px, 70%);
height: clamp(2.5rem, 8vmin, 4rem);
margin: 0 auto 16px;
border-radius: 8px;
}
.kiosk-skeleton-recipe-header {
padding: clamp(10px, 2.5vmin, 16px) clamp(12px, 3vw, 20px);
}
.kiosk-skeleton-recipe-header .dashboard-skeleton-bar--title {
width: 65%;
height: 1.25rem;
margin-bottom: 8px;
}
.kiosk-skeleton-recipe-header .dashboard-skeleton-bar--subtitle {
width: 45%;
height: 0.85rem;
margin-bottom: 0;
}
.kiosk-skeleton-component-name {
width: min(320px, 85%);
height: 1.5rem;
margin: 0 auto 20px;
}
/* --- Ingredients table skeleton --- */
.kiosk-skeleton-table {
display: flex;
flex-direction: column;
gap: 10px;
min-height: 12rem;
transition: opacity 0.15s ease;
}
.kiosk-skeleton-table--exit {
opacity: 0;
pointer-events: none;
}
.kiosk-skeleton-table-row {
display: flex;
gap: 12px;
align-items: center;
}
.kiosk-skeleton-table-row:nth-child(1) { --skel-i: 0; }
.kiosk-skeleton-table-row:nth-child(2) { --skel-i: 1; }
.kiosk-skeleton-table-row:nth-child(3) { --skel-i: 2; }
.kiosk-skeleton-table-row:nth-child(4) { --skel-i: 3; }
.kiosk-skeleton-table-row:nth-child(5) { --skel-i: 4; }
.kiosk-skeleton-table-row:nth-child(6) { --skel-i: 5; }
.kiosk-skeleton-table-row .dashboard-skeleton-bar {
margin-bottom: 0;
height: 0.85rem;
}
.kiosk-skeleton-table-row .dashboard-skeleton-bar:first-child {
flex: 2 1 0;
min-width: 0;
}
.kiosk-skeleton-table-row .dashboard-skeleton-bar:last-child {
flex: 1 1 0;
min-width: 0;
max-width: 35%;
}
/* --- Dark theme --- */
html[data-theme="dark"] .dispenser-card.kiosk-skeleton-card {
background: #242424;
border-color: #3a3a3a;
}
html[data-theme="dark"] .kiosk-skeleton-group-item {
background: #242424;
border-color: #3a3a3a;
}
@media (prefers-reduced-motion: reduce) {
.dispenser-grid.kiosk-skeleton-host--exit,
.kiosk-skeleton-grid--exit,
.kiosk-skeleton-groups--exit,
.kiosk-skeleton-panel--exit,
.kiosk-skeleton-table--exit {
transition: none;
}
}
@@ -0,0 +1,203 @@
.wesp-logo-loader {
position: fixed;
inset: 0;
z-index: 9999;
display: flex;
flex-direction: column;
justify-content: flex-end;
background: #f6f6f4;
transition: opacity 0.48s ease, visibility 0.48s;
overflow: hidden;
}
.wesp-logo-loader--exiting {
opacity: 0;
}
.wesp-logo-loader--exiting .wesp-logo-loader__canvas {
transform: scale(1.03);
opacity: 0.92;
}
.wesp-logo-loader--hidden {
opacity: 0;
visibility: hidden;
pointer-events: none;
}
.wesp-logo-loader--embedded {
position: relative;
inset: auto;
width: 100%;
height: 100%;
background: #fff;
overflow: hidden;
}
.wesp-logo-loader--embedded.wesp-logo-loader--transparent,
.wesp-logo-loader--plain.wesp-logo-loader--transparent {
background: transparent !important;
}
.wesp-logo-loader--embedded .wesp-logo-loader__canvas {
position: absolute;
inset: 0;
}
.wesp-logo-loader--embedded:not(.wesp-logo-loader--no-chrome) {
display: flex;
flex-direction: column;
}
.wesp-logo-loader--embedded:not(.wesp-logo-loader--no-chrome) .wesp-logo-loader__canvas {
position: relative;
flex: 1 1 auto;
min-height: 0;
inset: auto;
}
.wesp-logo-loader--embedded:not(.wesp-logo-loader--no-chrome) .wesp-logo-loader__footer {
flex: 0 0 auto;
padding: 0 12px 10px;
}
.wesp-logo-loader--embedded:not(.wesp-logo-loader--no-chrome) .wesp-logo-loader__footer-row {
margin-bottom: 8px;
}
.wesp-logo-loader--plain {
background: #fff;
}
.wesp-logo-loader--no-chrome .wesp-logo-loader__footer {
display: none;
}
.wesp-logo-loader__canvas {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
image-rendering: pixelated;
image-rendering: crisp-edges;
transition: transform 0.52s ease, opacity 0.52s ease;
transform-origin: 50% 44%;
}
.wesp-logo-loader__footer {
position: relative;
z-index: 2;
padding: 0 12px 12px;
pointer-events: none;
}
.wesp-logo-loader__footer-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
}
.wesp-logo-loader__label,
.wesp-logo-loader__percent {
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
font-size: 12px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: rgba(26, 30, 28, 0.72);
}
.wesp-logo-loader__percent {
font-variant-numeric: tabular-nums;
}
.wesp-logo-loader__bar {
position: relative;
height: 4px;
width: 100%;
background: rgba(26, 30, 28, 0.08);
}
.wesp-logo-loader__bar-fill {
position: absolute;
inset: 0 auto 0 0;
width: 0;
background: rgb(148, 152, 158);
transition: width 0.08s linear, background 0.18s ease;
}
.wesp-logo-loader__tagline {
margin: 14px 0 0;
padding: 0 8px;
text-align: center;
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
font-size: 0.92rem;
line-height: 1.45;
color: rgba(26, 30, 28, 0.52);
min-height: 1.45em;
transition: opacity 0.35s ease;
}
.wesp-logo-loader__tagline:empty {
display: none;
}
.wesp-logo-loader__tagline--fade {
opacity: 0;
}
@media (prefers-reduced-motion: reduce) {
.wesp-logo-loader__bar-fill {
transition: none;
}
}
/* Demo page helpers */
.wesp-logo-loader-demo {
min-height: 100vh;
background: #f6f6f4;
color: rgba(26, 30, 28, 0.72);
font-family: system-ui, -apple-system, sans-serif;
}
.wesp-logo-loader-demo__panel {
position: fixed;
left: 50%;
bottom: 72px;
transform: translateX(-50%);
display: flex;
flex-wrap: wrap;
gap: 10px;
justify-content: center;
padding: 12px 16px;
border-radius: 12px;
background: rgba(255, 255, 255, 0.72);
border: 1px solid rgba(26, 30, 28, 0.08);
box-shadow: 0 8px 24px rgba(26, 30, 28, 0.06);
}
.wesp-logo-loader-demo__btn {
appearance: none;
border: 1px solid rgba(26, 30, 28, 0.12);
background: rgba(72, 129, 109, 0.12);
color: #1a1e1c;
border-radius: 8px;
padding: 8px 14px;
font-size: 14px;
cursor: pointer;
}
.wesp-logo-loader-demo__btn:hover {
background: rgba(72, 129, 109, 0.22);
}
.wesp-logo-loader-demo__hint {
position: fixed;
top: 20px;
left: 50%;
transform: translateX(-50%);
margin: 0;
font-size: 14px;
text-align: center;
opacity: 0.65;
}
@@ -283,8 +283,13 @@
}
body.recipe-edit-mobile-open .mobile-navbar,
body.recipe-edit-mobile-open .mobile-menu-overlay,
body.recipe-edit-mobile-open .app-footer,
body.recipe-edit-mobile-open .page-content {
body.recipe-edit-mobile-open .page-content,
body.recipe-edit-mobile-open .wesp-zt-notify-fab,
body.ingredient-mobile-sheet-open .wesp-zt-notify-fab,
body.unloading-group-mobile-sheet-open .wesp-zt-notify-fab,
body.recipe-help-modal-open .wesp-zt-notify-fab {
display: none !important;
}
@@ -345,7 +350,14 @@
-webkit-overflow-scrolling: touch;
overscroll-behavior-y: contain;
touch-action: pan-y;
padding-bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
padding-bottom: calc(1.25rem + env(safe-area-inset-bottom, 0px));
}
/* Nested section cards inherit global .card { height: 100% } and stretch to fill the scroll viewport */
body.recipe-edit-mobile-open #recipeEdit .recipe-section-card,
#recipeEdit.recipe-edit--mobile-active .recipe-section-card {
height: auto !important;
flex-grow: 0;
}
body.recipe-edit-mobile-open #recipeEdit #recipeForm > .card-header,
@@ -435,12 +447,23 @@
}
/* --- Card layout for edit data grids --- */
/* !important: wesp-recipes-editor.css loads later and sets display:grid on __head/__row */
#recipeEdit .zt-data-grid__scroll {
overflow: visible;
overflow: visible !important;
}
#recipeEdit .zt-data-grid {
gap: 0 !important;
min-width: 0 !important;
}
#recipeEdit .zt-data-grid__head {
display: none;
display: none !important;
}
#recipeEdit #ingredientsTableBody .ingredient-row,
#recipeEdit #unloadingGroupsTableBody .unloading-group-row {
min-width: 0 !important;
}
#recipeEdit #ingredientsTable.ingredients-table--dm-unlocked .ingredient-detail-cell.dry-matter-per-head {
+32 -10
View File
@@ -300,13 +300,12 @@ html[data-theme="dark"] .reports-page .reports-filter-select .form-select {
opacity: 0.7;
}
.reports-page .reports-export-dropdown__menu {
position: absolute;
right: 0;
top: calc(100% + 0.35rem);
z-index: 1200;
.reports-page .reports-export-dropdown__menu,
#reportsExportMenu.reports-export-dropdown__menu {
position: fixed;
z-index: 3600;
min-width: 16.5rem;
max-width: 19rem;
max-width: min(19rem, calc(100vw - 1.5rem));
padding: 0.35rem;
border: 1px solid var(--border-light);
border-radius: var(--zt-radius-md, 10px);
@@ -314,6 +313,16 @@ html[data-theme="dark"] .reports-page .reports-filter-select .form-select {
box-shadow: var(--shadow-soft, 0 8px 24px rgba(15, 23, 42, 0.12));
}
#reportsExportMenu.reports-export-dropdown__menu[hidden] {
display: none !important;
pointer-events: none !important;
}
#reportsExportMenu.reports-export-dropdown__menu--open {
display: block !important;
pointer-events: auto !important;
}
.reports-page .reports-export-dropdown__group + .reports-export-dropdown__group {
margin-top: 0.35rem;
padding-top: 0.35rem;
@@ -375,7 +384,8 @@ html[data-theme="dark"] .reports-page .reports-filter-select .form-select {
margin-top: 0.1rem;
}
html[data-theme="dark"] .reports-page .reports-export-dropdown__menu {
html[data-theme="dark"] .reports-page .reports-export-dropdown__menu,
html[data-theme="dark"] #reportsExportMenu.reports-export-dropdown__menu {
background: var(--dm-field, #2c3338);
border-color: rgba(255, 255, 255, 0.12);
}
@@ -432,9 +442,10 @@ html[data-theme="dark"] .reports-page .reports-export-dropdown__menu {
flex-shrink: 0;
}
.reports-page .reports-drp__panel {
.reports-page .reports-drp__panel,
#reportsDateRangePanel.reports-drp__panel {
position: fixed;
z-index: 2500;
z-index: 3600;
width: min(19rem, calc(100vw - 1.5rem));
padding: 0.75rem;
border: 1px solid var(--border-light);
@@ -443,6 +454,16 @@ html[data-theme="dark"] .reports-page .reports-export-dropdown__menu {
box-shadow: var(--shadow-soft, 0 8px 24px rgba(15, 23, 42, 0.12));
}
#reportsDateRangePanel.reports-drp__panel[hidden] {
display: none !important;
pointer-events: none !important;
}
#reportsDateRangePanel.reports-drp__panel--open {
display: block !important;
pointer-events: auto !important;
}
.reports-page .reports-drp__presets {
display: flex;
gap: 0.35rem;
@@ -549,7 +570,8 @@ html[data-theme="dark"] .reports-page .reports-export-dropdown__menu {
html[data-theme="dark"] .reports-page .reports-drp__trigger,
html[data-theme="dark"] .reports-page .reports-drp__panel {
html[data-theme="dark"] .reports-page .reports-drp__panel,
html[data-theme="dark"] #reportsDateRangePanel.reports-drp__panel {
background: var(--dm-field, var(--bg-white, #2c3338));
border-color: rgba(255, 255, 255, 0.12);
color: #f5f5f5;
+737
View File
@@ -0,0 +1,737 @@
:root {
--setup-page-bg: #fff;
--setup-overlay-bg: #fff;
--setup-surface: #fff;
--setup-surface-muted: rgba(26, 30, 28, 0.04);
--setup-border: rgba(26, 30, 28, 0.08);
--setup-border-strong: rgba(26, 30, 28, 0.14);
--setup-text: #1a1e1c;
--setup-text-muted: rgba(26, 30, 28, 0.72);
--setup-text-soft: rgba(26, 30, 28, 0.55);
--setup-text-faint: rgba(26, 30, 28, 0.5);
--setup-accent: #2c7be5;
--setup-accent-soft: rgba(44, 123, 229, 0.08);
--setup-accent-text: #1a5bb8;
--setup-shadow: 0 16px 48px rgba(26, 30, 28, 0.08);
--setup-busy-bg: rgba(255, 255, 255, 0.82);
--setup-info-bg: rgba(44, 123, 229, 0.08);
--setup-info-text: rgba(26, 30, 28, 0.78);
--setup-warn-bg: #fff7e6;
--setup-warn-border: #ffd591;
--setup-warn-text: #874d00;
--setup-error: #b42318;
--setup-ok: #067647;
--setup-loader-bg: #fff;
}
html[data-theme="dark"] {
--setup-page-bg: #0f1114;
--setup-overlay-bg: #0f1114;
--setup-surface: #181b20;
--setup-surface-muted: rgba(255, 255, 255, 0.05);
--setup-border: rgba(255, 255, 255, 0.1);
--setup-border-strong: rgba(255, 255, 255, 0.16);
--setup-text: #eef0f3;
--setup-text-muted: rgba(238, 240, 243, 0.78);
--setup-text-soft: rgba(238, 240, 243, 0.58);
--setup-text-faint: rgba(238, 240, 243, 0.45);
--setup-accent: #4d93ef;
--setup-accent-soft: rgba(77, 147, 239, 0.14);
--setup-accent-text: #8eb8ff;
--setup-shadow: 0 16px 48px rgba(0, 0, 0, 0.45);
--setup-busy-bg: rgba(24, 27, 32, 0.88);
--setup-info-bg: rgba(77, 147, 239, 0.12);
--setup-info-text: rgba(238, 240, 243, 0.86);
--setup-warn-bg: rgba(255, 169, 64, 0.12);
--setup-warn-border: rgba(255, 169, 64, 0.35);
--setup-warn-text: #ffd591;
--setup-error: #ff8a80;
--setup-ok: #6ee7a8;
--setup-loader-bg: #181b20;
}
html,
body {
margin: 0;
background: var(--setup-page-bg);
color: var(--setup-text);
font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
-webkit-font-smoothing: antialiased;
}
.wesp-setup {
position: fixed;
inset: 0;
z-index: 10000;
background: var(--setup-overlay-bg);
}
.wesp-setup__intro {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 10001;
width: min(520px, calc(100vw - 32px));
height: min(240px, 36vh);
background: transparent;
transition: opacity 0.45s ease, visibility 0.45s;
}
.wesp-setup__intro--done {
opacity: 0;
visibility: hidden;
pointer-events: none;
}
.wesp-setup__intro .wesp-logo-loader,
.wesp-setup__intro .wesp-logo-loader--embedded,
.wesp-setup__intro .wesp-logo-loader--plain {
background: transparent !important;
}
.wesp-setup__panel {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 10002;
display: flex;
flex-direction: column;
width: min(520px, calc(100vw - 32px));
max-height: min(85vh, 620px);
overflow: hidden;
padding: 0;
border-radius: 16px;
background: var(--setup-surface);
border: 1px solid var(--setup-border);
box-shadow: var(--setup-shadow);
color: var(--setup-text);
opacity: 1;
visibility: visible;
transition: opacity 0.35s ease 0.08s, visibility 0.35s ease 0.08s, background 0.2s ease, color 0.2s ease;
isolation: isolate;
}
.wesp-setup__header {
flex: 0 0 auto;
padding: 22px 24px 0;
}
.wesp-setup__content {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
padding: 16px 24px 8px;
overscroll-behavior: contain;
}
.wesp-setup__footer {
flex: 0 0 auto;
padding: 12px 24px calc(16px + env(safe-area-inset-bottom, 0px));
border-top: 1px solid var(--setup-border);
background: var(--setup-surface);
}
.wesp-setup__panel--busy {
pointer-events: none;
}
.wesp-setup__busy {
position: absolute;
inset: 0;
z-index: 4;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
border-radius: 16px;
background: var(--setup-busy-bg);
backdrop-filter: blur(2px);
}
.wesp-setup__spinner {
width: 28px;
height: 28px;
border: 2px solid var(--setup-border-strong);
border-top-color: var(--setup-accent);
border-radius: 50%;
animation: wesp-setup-spin 0.75s linear infinite;
}
.wesp-setup__busy-label {
font-size: 13px;
color: var(--setup-text-muted);
}
@keyframes wesp-setup-spin {
to {
transform: rotate(360deg);
}
}
.wesp-setup__panel--hidden {
opacity: 0;
visibility: hidden;
pointer-events: none;
}
.wesp-setup__title {
margin: 0 0 6px;
font-size: 21px;
font-weight: 650;
letter-spacing: -0.02em;
line-height: 1.25;
color: var(--setup-text);
}
.wesp-setup__lead {
margin: 0;
font-size: 14px;
line-height: 1.55;
color: var(--setup-text-muted);
}
.wesp-setup__step-indicator {
margin-bottom: 10px;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 10px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--setup-text-faint);
}
.wesp-setup__field {
margin-bottom: 12px;
}
.wesp-setup__label {
display: block;
margin-bottom: 5px;
font-size: 13px;
font-weight: 500;
color: var(--setup-text);
}
.wesp-setup__input,
.wesp-setup__select {
width: 100%;
box-sizing: border-box;
padding: 11px 12px;
border: 1px solid var(--setup-border-strong);
border-radius: 10px;
font-size: 16px;
background: var(--setup-surface);
color: var(--setup-text);
transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.wesp-setup__input:focus,
.wesp-setup__select:focus {
outline: none;
border-color: var(--setup-accent);
box-shadow: 0 0 0 3px var(--setup-accent-soft);
}
.wesp-setup__input:-webkit-autofill,
.wesp-setup__input:-webkit-autofill:hover,
.wesp-setup__input:-webkit-autofill:focus,
.wesp-setup__input:-webkit-autofill:active {
-webkit-box-shadow: 0 0 0 1000px var(--setup-surface) inset !important;
box-shadow: 0 0 0 1000px var(--setup-surface) inset !important;
-webkit-text-fill-color: var(--setup-text) !important;
caret-color: var(--setup-text);
transition: background-color 600000s ease-in-out 0s;
}
.wesp-setup__input:autofill {
box-shadow: 0 0 0 1000px var(--setup-surface) inset !important;
-webkit-text-fill-color: var(--setup-text) !important;
caret-color: var(--setup-text);
}
.wesp-setup__input--readonly {
background: var(--setup-surface-muted);
color: var(--setup-text-muted);
cursor: default;
}
.wesp-setup__input-group {
display: flex;
align-items: stretch;
width: 100%;
}
.wesp-setup__input-group .wesp-setup__input {
flex: 1 1 auto;
min-width: 0;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-right: none;
}
.wesp-setup__input-suffix {
display: flex;
align-items: center;
padding: 0 12px;
border: 1px solid var(--setup-border-strong);
border-left: none;
border-radius: 0 8px 8px 0;
background: var(--setup-surface-muted);
color: var(--setup-text-soft);
font-size: 14px;
white-space: nowrap;
user-select: none;
}
.wesp-setup__checkbox-row {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 12px;
font-size: 14px;
}
.wesp-setup__role-grid {
display: grid;
gap: 10px;
margin-bottom: 4px;
}
.wesp-setup__role-grid--cards {
gap: 12px;
}
.wesp-setup__role-btn {
text-align: left;
padding: 12px 14px;
border-radius: 12px;
border: 1px solid var(--setup-border-strong);
background: var(--setup-surface);
color: var(--setup-text);
cursor: pointer;
font-size: 14px;
font-family: inherit;
transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
-webkit-tap-highlight-color: transparent;
}
.wesp-setup__role-btn:hover {
border-color: var(--setup-accent);
}
.wesp-setup__role-btn:focus-visible {
outline: none;
box-shadow: 0 0 0 3px var(--setup-accent-soft);
}
.wesp-setup__role-card {
display: flex;
align-items: center;
justify-content: center;
min-height: 84px;
padding: 20px 18px;
border-radius: 12px;
text-align: center;
}
.wesp-setup__theme-grid .wesp-setup__theme-card {
position: relative;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 0;
min-height: 0;
padding: 12px 14px 12px 62px;
text-align: left;
background: var(--setup-surface-muted);
border-color: var(--setup-border);
color: var(--setup-text);
transition: border-color 0.15s ease, background 0.15s ease;
}
.wesp-setup__theme-grid .wesp-setup__theme-card::before {
content: "";
position: absolute;
left: 14px;
top: 50%;
width: 32px;
height: 32px;
margin-top: -16px;
border-radius: 8px;
border: 1px solid var(--setup-border-strong);
box-sizing: border-box;
}
.wesp-setup__theme-card--light::before {
background: linear-gradient(145deg, #ffffff 0%, #d8dee8 100%);
}
.wesp-setup__theme-card--dark::before {
background: linear-gradient(145deg, #505662 0%, #171b21 100%);
}
.wesp-setup__theme-card span {
display: block;
margin-top: 2px;
font-size: 12px;
line-height: 1.45;
font-weight: 400;
color: var(--setup-text-soft);
}
.wesp-setup__role-btn strong {
display: block;
margin-bottom: 4px;
}
.wesp-setup__role-card strong {
margin: 0;
font-size: 17px;
font-weight: 600;
line-height: 1.25;
color: var(--setup-text);
}
.wesp-setup__theme-card strong {
margin-bottom: 0;
font-size: 15px;
}
.wesp-setup__role-btn.is-selected:not(.wesp-setup__theme-card) {
border-color: var(--setup-accent);
background: var(--setup-accent-soft);
box-shadow: 0 0 0 1px rgba(44, 123, 229, 0.18);
}
.wesp-setup__theme-card.is-selected {
border-color: var(--setup-accent);
background: var(--setup-accent-soft);
box-shadow: none;
}
.wesp-setup__role-card.is-selected:not(.wesp-setup__theme-card) strong {
color: var(--setup-accent-text);
}
.wesp-setup__theme-grid .wesp-setup__theme-card strong {
color: var(--setup-text);
}
.wesp-setup__theme-grid .wesp-setup__theme-card.is-selected strong {
color: var(--setup-accent-text);
}
.wesp-setup__actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.wesp-setup__actions-fill {
flex: 1 1 12px;
min-width: 8px;
}
.wesp-setup__btn {
appearance: none;
border: 1px solid var(--setup-border-strong);
border-radius: 10px;
padding: 10px 16px;
min-height: 42px;
font-size: 14px;
font-weight: 500;
font-family: inherit;
line-height: 1.2;
cursor: pointer;
background: var(--setup-surface);
color: var(--setup-text);
transition: background 0.15s ease, border-color 0.15s ease, opacity 0.15s ease;
-webkit-tap-highlight-color: transparent;
}
.wesp-setup__btn:hover:not(:disabled) {
border-color: var(--setup-accent);
}
.wesp-setup__btn:focus-visible {
outline: none;
box-shadow: 0 0 0 3px var(--setup-accent-soft);
}
.wesp-setup__btn--ghost {
background: transparent;
border-color: transparent;
color: var(--setup-text-muted);
}
.wesp-setup__btn--ghost:hover:not(:disabled) {
background: var(--setup-surface-muted);
border-color: var(--setup-border);
color: var(--setup-text);
}
.wesp-setup__btn--primary {
background: var(--setup-accent);
border-color: var(--setup-accent);
color: #fff;
padding-inline: 20px;
}
.wesp-setup__btn--primary:hover:not(:disabled) {
filter: brightness(1.06);
border-color: var(--setup-accent);
}
.wesp-setup__btn:disabled {
opacity: 0.55;
cursor: not-allowed;
}
.wesp-setup__msg {
margin: 10px 0 0;
font-size: 13px;
line-height: 1.5;
min-height: 1.4em;
}
.wesp-setup__msg--error {
color: var(--setup-error);
}
.wesp-setup__msg--ok {
color: var(--setup-ok);
}
.wesp-setup__hint {
margin: 0 0 12px;
font-size: 13px;
line-height: 1.5;
color: var(--setup-text-soft);
}
.wesp-setup__info {
margin: 0 0 12px;
padding: 10px 12px;
border-radius: 10px;
background: var(--setup-info-bg);
font-size: 13px;
line-height: 1.5;
color: var(--setup-info-text);
}
.wesp-setup__info--warn {
background: var(--setup-warn-bg);
border: 1px solid var(--setup-warn-border);
color: var(--setup-warn-text);
}
.wesp-setup__section-title {
margin: 18px 0 10px;
font-size: 15px;
font-weight: 600;
}
.wesp-setup__qr-wrap {
display: flex;
justify-content: center;
margin: 8px 0 10px;
padding: 14px;
border-radius: 12px;
background: var(--setup-surface-muted);
border: 1px solid var(--setup-border);
}
.wesp-setup__qr {
display: block;
width: min(200px, 100%);
height: auto;
margin: 0;
}
.wesp-setup__url {
word-break: break-all;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 11px;
line-height: 1.5;
text-align: center;
color: var(--setup-text-muted);
}
.wesp-setup__progress-bar {
height: 6px;
background: var(--setup-surface-muted);
border-radius: 999px;
overflow: hidden;
margin-top: 4px;
}
.wesp-setup__progress-fill {
height: 100%;
width: 0;
background: var(--setup-accent);
transition: width 0.2s linear;
}
.wesp-setup__summary-list {
margin: 0;
padding-left: 18px;
font-size: 14px;
line-height: 1.6;
}
.wesp-setup__input--touch {
cursor: text;
caret-color: var(--setup-accent);
}
.wesp-setup__keyboard {
flex: 0 0 auto;
display: none;
padding: 10px 16px 4px;
border-top: 1px solid var(--setup-border);
background: var(--setup-surface);
opacity: 0;
transform: translateY(6px);
transition: opacity 0.2s ease, transform 0.2s ease;
}
.wesp-setup__keyboard.is-visible {
display: block;
opacity: 1;
transform: translateY(0);
}
.wesp-setup__keyboard-grid {
display: grid;
grid-template-columns: repeat(10, minmax(0, 1fr));
gap: 6px;
max-width: 100%;
margin: 0 auto;
}
.wesp-setup__keyboard-key {
appearance: none;
display: flex;
align-items: center;
justify-content: center;
min-height: 42px;
padding: 8px 4px;
border: 1px solid var(--setup-border-strong);
border-radius: 8px;
background: var(--setup-surface-muted);
color: var(--setup-text);
font-size: 15px;
font-weight: 500;
font-family: inherit;
line-height: 1;
cursor: pointer;
user-select: none;
-webkit-tap-highlight-color: transparent;
transition: background 0.12s ease, border-color 0.12s ease, transform 0.08s ease;
}
.wesp-setup__keyboard-key:active {
transform: scale(0.96);
background: var(--setup-accent-soft);
border-color: var(--setup-accent);
}
.wesp-setup__keyboard-key--wide {
font-size: 18px;
}
.wesp-setup__keyboard-key--action {
font-size: 12px;
font-weight: 600;
letter-spacing: -0.02em;
}
@media (max-width: 520px) {
.wesp-setup__intro {
height: min(200px, 32vh);
}
.wesp-setup__panel {
left: 0;
right: 0;
top: auto;
bottom: 0;
transform: none;
width: 100%;
max-width: 100%;
max-height: min(92dvh, 720px);
border-radius: 18px 18px 0 0;
border-bottom: none;
}
.wesp-setup__header {
padding: 18px 18px 0;
}
.wesp-setup__content {
padding: 14px 18px 6px;
}
.wesp-setup__footer {
padding: 10px 18px calc(14px + env(safe-area-inset-bottom, 0px));
}
.wesp-setup__title {
font-size: 20px;
}
.wesp-setup__role-card {
min-height: 72px;
padding: 16px 14px;
}
.wesp-setup__theme-grid .wesp-setup__theme-card {
padding: 11px 12px 11px 56px;
}
.wesp-setup__theme-grid .wesp-setup__theme-card::before {
left: 12px;
width: 28px;
height: 28px;
margin-top: -14px;
}
.wesp-setup__btn {
min-height: 44px;
}
.wesp-setup__actions {
gap: 6px;
}
.wesp-setup__actions-fill {
flex-basis: 100%;
height: 0;
min-width: 0;
}
.wesp-setup__btn--primary {
flex: 1 1 auto;
min-width: calc(50% - 4px);
}
.wesp-setup__keyboard {
padding: 8px 14px 2px;
}
.wesp-setup__keyboard-grid {
gap: 5px;
}
.wesp-setup__keyboard-key {
min-height: 44px;
font-size: 14px;
}
.wesp-setup__keyboard-key--action {
font-size: 11px;
}
}
+75
View File
@@ -0,0 +1,75 @@
/* Экран /starting — тот же масштаб логотипа, что intro в setup wizard */
.wesp-startup-screen {
min-height: 100vh;
margin: 0;
background: #f6f6f4;
color: rgba(26, 30, 28, 0.72);
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
}
.wesp-startup__stage {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 10001;
width: min(520px, calc(100vw - 32px));
display: flex;
flex-direction: column;
align-items: stretch;
}
.wesp-startup__stage .wesp-setup__intro {
position: relative;
left: auto;
top: auto;
transform: none;
width: 100%;
height: min(240px, 36vh);
background: transparent;
}
.wesp-startup__stage .wesp-logo-loader,
.wesp-startup__stage .wesp-logo-loader--embedded,
.wesp-startup__stage .wesp-logo-loader--plain {
background: transparent !important;
}
/* Подпись только снаружи (#startupQuip), не пустой tagline внутри лоадера */
.wesp-startup__stage .wesp-logo-loader__tagline {
display: none !important;
}
.wesp-startup__quip {
flex: 0 0 auto;
margin: 10px 0 0;
padding: 0 12px;
text-align: center;
font-size: 0.92rem;
line-height: 1.5;
color: rgba(26, 30, 28, 0.58);
min-height: 3em;
max-width: 100%;
}
.wesp-startup__quip--fade {
opacity: 0;
}
.wesp-startup__quip--error {
color: #cf1322;
}
/* Киоск / логин зоотехника: --z-login-bg из zootechnician-login.css */
html[data-theme="dark"] .wesp-startup-screen {
background: #12181b;
color: #ffffff;
}
html[data-theme="dark"] .wesp-startup__quip {
color: #a8b0b8;
}
html[data-theme="dark"] .wesp-startup__quip--error {
color: #ff7875;
}
@@ -0,0 +1,227 @@
/* Ненавязчивый баннер «доступно обновление» — киоск и операторские страницы */
#wespUpdateBanner {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 4500;
display: none;
box-sizing: border-box;
padding: 10px 14px;
padding-bottom: max(10px, env(safe-area-inset-bottom, 0px));
background: linear-gradient(180deg, rgba(30, 58, 138, 0.97), rgba(29, 78, 216, 0.98));
color: #f8fafc;
font-family: Inter, system-ui, -apple-system, "Segoe UI", sans-serif;
font-size: 14px;
line-height: 1.45;
box-shadow: 0 -4px 24px rgba(15, 23, 42, 0.25);
border-top: 1px solid rgba(255, 255, 255, 0.12);
}
#wespUpdateBanner.wesp-update-banner--visible {
display: block;
}
#wespUpdateBanner .wesp-update-banner-inner {
max-width: 1200px;
margin: 0 auto;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px 14px;
}
#wespUpdateBanner .wesp-update-banner-text {
flex: 1 1 200px;
min-width: 0;
}
#wespUpdateBanner .wesp-update-banner-text strong {
font-weight: 600;
}
#wespUpdateBanner .wesp-update-banner-changelog {
display: none;
width: 100%;
margin: 4px 0 0;
padding: 8px 10px;
background: rgba(0, 0, 0, 0.18);
border-radius: 6px;
font-size: 13px;
white-space: pre-wrap;
word-break: break-word;
max-height: 120px;
overflow: auto;
}
#wespUpdateBanner.wesp-update-banner--expanded .wesp-update-banner-changelog {
display: block;
}
#wespUpdateBanner .wesp-update-banner-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
}
#wespUpdateBanner .wesp-update-banner-btn {
border: 1px solid rgba(255, 255, 255, 0.35);
background: rgba(255, 255, 255, 0.12);
color: #fff;
border-radius: 6px;
padding: 8px 14px;
font-size: 13px;
font-weight: 500;
cursor: pointer;
font-family: inherit;
transition: background 0.15s ease, border-color 0.15s ease;
}
#wespUpdateBanner .wesp-update-banner-btn:hover {
background: rgba(255, 255, 255, 0.22);
}
#wespUpdateBanner .wesp-update-banner-btn--primary {
background: #fff;
color: #1d4ed8;
border-color: #fff;
}
#wespUpdateBanner .wesp-update-banner-btn--primary:hover {
background: #eff6ff;
}
#wespUpdateOverlay {
position: fixed;
inset: 0;
z-index: 6000;
display: none;
align-items: center;
justify-content: center;
padding: 16px;
background: rgba(15, 23, 42, 0.72);
box-sizing: border-box;
}
#wespUpdateOverlay.wesp-update-overlay--visible {
display: flex;
}
#wespUpdateOverlay .wesp-update-overlay-panel {
background: #fff;
color: #111827;
border-radius: 10px;
padding: 24px 28px;
max-width: 420px;
width: 100%;
text-align: center;
font-family: Inter, system-ui, sans-serif;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25);
}
#wespUpdateOverlay .wesp-update-overlay-title {
margin: 0 0 10px;
font-size: 1.125rem;
font-weight: 600;
}
#wespUpdateOverlay .wesp-update-overlay-body {
margin: 0 0 16px;
font-size: 0.95rem;
color: #4b5563;
line-height: 1.5;
}
#wespUpdateOverlay .wesp-update-progress-wrap {
text-align: left;
}
#wespUpdateOverlay .wesp-update-progress-track {
height: 8px;
border-radius: 999px;
background: #e5e7eb;
overflow: hidden;
}
#wespUpdateOverlay .wesp-update-progress-bar {
height: 100%;
width: 0;
border-radius: 999px;
background: linear-gradient(
90deg,
var(--primary-color, #2196f3),
var(--primary-dark, #1976d2)
);
transition: width 0.25s ease;
}
#wespUpdateOverlay .wesp-update-progress-meta {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 12px;
margin-top: 8px;
font-size: 0.8125rem;
color: #6b7280;
}
#wespUpdateOverlay .wesp-update-progress-percent {
font-weight: 600;
color: #1d4ed8;
flex-shrink: 0;
}
#wespUpdateOverlay .wesp-update-progress-detail {
text-align: right;
min-width: 0;
word-break: break-word;
}
html[data-theme="dark"] #wespUpdateOverlay .wesp-update-overlay-panel {
background: #242424;
color: #f3f4f6;
}
#wespUpdateOverlay .wesp-update-progress-bar.wesp-update-progress-bar--error {
background: linear-gradient(90deg, #dc2626, #b91c1c);
}
#wespUpdateOverlay .wesp-update-overlay-panel--rollback {
border: 1px solid #fecaca;
}
html[data-theme="dark"] #wespUpdateOverlay .wesp-update-overlay-panel--rollback {
border-color: #7f1d1d;
}
html[data-theme="dark"] #wespUpdateOverlay .wesp-update-overlay-body {
color: #d1d5db;
}
html[data-theme="dark"] #wespUpdateOverlay .wesp-update-progress-track {
background: #374151;
}
html[data-theme="dark"] #wespUpdateOverlay .wesp-update-progress-meta {
color: #9ca3af;
}
html[data-theme="dark"] #wespUpdateOverlay .wesp-update-progress-percent {
color: #93c5fd;
}
@media (max-width: 480px) {
#wespUpdateBanner .wesp-update-banner-inner {
flex-direction: column;
align-items: stretch;
}
#wespUpdateBanner .wesp-update-banner-actions {
justify-content: stretch;
}
#wespUpdateBanner .wesp-update-banner-btn {
flex: 1;
text-align: center;
}
}
@@ -544,32 +544,44 @@ html[data-theme="dark"] .mobile-brand .logo--dark-theme {
inset: 0;
background: rgba(15, 23, 42, 0.55);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
z-index: 2000;
opacity: 0;
visibility: hidden;
pointer-events: none;
transition: opacity var(--transition), visibility var(--transition);
}
.mobile-menu-overlay.active {
opacity: 1;
visibility: visible;
pointer-events: auto;
}
.mobile-menu {
position: fixed;
position: absolute;
top: 0;
right: -100%;
right: 0;
width: min(88vw, 340px);
max-width: 100%;
height: 100%;
height: 100dvh;
background: var(--gradient-blue);
box-shadow: -8px 0 32px rgba(0, 0, 0, 0.25);
transition: right 0.28s cubic-bezier(0.22, 1, 0.36, 1);
transform: translateX(100%);
transition: transform 0.28s cubic-bezier(0.22, 1, 0.36, 1);
display: flex;
flex-direction: column;
overflow: hidden;
will-change: transform;
}
.mobile-menu-overlay.active .mobile-menu {
right: 0;
transform: translateX(0);
}
body.mobile-menu-open {
overflow: hidden;
}
.mobile-menu-header {
@@ -578,6 +590,7 @@ html[data-theme="dark"] .mobile-brand .logo--dark-theme {
align-items: center;
padding: 1.25rem 1.25rem 1rem;
border-bottom: 1px solid rgba(255, 255, 255, 0.12);
flex-shrink: 0;
}
.mobile-brand {
@@ -609,9 +622,11 @@ html[data-theme="dark"] .mobile-brand .logo--dark-theme {
}
.mobile-menu-items {
flex: 1;
flex: 1 1 auto;
min-height: 0;
padding: 0.5rem 0;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
.mobile-menu-item {
@@ -643,6 +658,7 @@ html[data-theme="dark"] .mobile-brand .logo--dark-theme {
.mobile-menu-footer {
padding: 1.25rem;
border-top: 1px solid rgba(255, 255, 255, 0.12);
flex-shrink: 0;
}
.mobile-user-info {
@@ -0,0 +1,345 @@
/* Страница входа зоотехника — тёмная тема по референсу, светлая — отдельная палитра */
:root {
--z-login-bg: var(--bg-page, #f5f7fa);
--z-login-surface: var(--surface, #ffffff);
--z-login-input-bg: #e8edf2;
--z-login-text: var(--text, #1e293b);
--z-login-muted: var(--muted, #64748b);
--z-login-icon: #4b5563;
--z-login-btn: var(--primary-color, #2196f3);
--z-login-btn-hover: var(--primary-dark, #1976d2);
--z-login-shadow: 0 16px 48px rgba(17, 24, 39, 0.1),
0 0 0 1px rgba(17, 24, 39, 0.06);
--z-login-switch-track: #cbd5e1;
--z-login-switch-thumb: #ffffff;
}
html[data-theme="dark"] {
--z-login-bg: var(--bg-page, #12181b);
--z-login-surface: var(--surface, #2c3338);
--z-login-input-bg: var(--field, #3e444a);
--z-login-text: var(--text, #f5f5f5);
--z-login-muted: var(--muted, #a8b0b8);
--z-login-icon: #ffffff;
--z-login-btn: var(--primary-color, #2196f3);
--z-login-btn-hover: var(--primary-light, #42a5f5);
--z-login-shadow: 0 20px 56px rgba(0, 0, 0, 0.45),
0 0 0 1px rgba(255, 255, 255, 0.04);
--z-login-switch-track: #252b30;
--z-login-switch-thumb: #ffffff;
}
html[data-theme="organic"] {
--z-login-bg: var(--bg-page, #f6f6f4);
--z-login-surface: var(--surface, #ffffff);
--z-login-input-bg: #eff4f2;
--z-login-text: var(--text, #1a1e1c);
--z-login-muted: var(--muted, #4a5a52);
--z-login-icon: #4a5a52;
--z-login-btn: var(--primary-color, #48816d);
--z-login-btn-hover: var(--primary-dark, #3a6b58);
--z-login-shadow: 0 16px 48px rgba(26, 30, 28, 0.08),
0 0 0 1px rgba(26, 30, 28, 0.04);
--z-login-switch-track: #e8e8e2;
--z-login-switch-thumb: #ffffff;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
body.zootech-login-body {
margin: 0;
min-height: 100vh;
font-family: var(--zootech-font, "Inter", system-ui, sans-serif);
background: var(--z-login-bg);
color: var(--z-login-text);
display: flex;
align-items: center;
justify-content: center;
padding: 24px 16px;
}
.z-login-page {
width: 100%;
max-width: 420px;
transition: opacity 0.25s ease, visibility 0.25s;
}
.z-login-page--hidden {
opacity: 0;
visibility: hidden;
pointer-events: none;
}
.z-login-backdrop {
position: fixed;
inset: 0;
z-index: 10000;
background: var(--z-login-bg);
}
.z-login-loader {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 10001;
width: min(520px, calc(100vw - 32px));
height: min(240px, 36vh);
border-radius: 16px;
overflow: hidden;
background: transparent;
box-shadow: none;
}
.z-login-loader .wesp-logo-loader,
.z-login-loader .wesp-logo-loader--embedded,
.z-login-loader .wesp-logo-loader--plain {
background: transparent !important;
}
.z-login-loader .wesp-logo-loader__label,
.z-login-loader .wesp-logo-loader__percent {
color: var(--z-login-muted);
}
.z-login-loader .wesp-logo-loader__bar {
background: rgba(26, 30, 28, 0.1);
}
html[data-theme="dark"] .z-login-loader .wesp-logo-loader__bar {
background: rgba(255, 255, 255, 0.12);
}
.z-login-card {
border-radius: 18px;
overflow: hidden;
box-shadow: var(--z-login-shadow);
background: var(--z-login-surface);
}
.z-login-form-panel {
padding: 40px;
display: flex;
flex-direction: column;
justify-content: center;
}
.z-login-title {
font-family: inherit;
font-size: 1.75rem;
font-weight: 700;
text-align: center;
color: var(--z-login-text);
margin: 0 0 28px;
letter-spacing: 0.02em;
}
.z-login-field {
margin-bottom: 16px;
}
.z-login-field--with-icon {
display: flex;
align-items: stretch;
gap: 0;
background: var(--z-login-input-bg);
border-radius: 8px;
overflow: hidden;
border: none;
}
.z-login-field-icon {
flex: 0 0 48px;
display: flex;
align-items: center;
justify-content: center;
color: var(--z-login-icon);
}
.z-login-field-icon svg {
display: block;
}
.z-login-input {
flex: 1;
min-width: 0;
padding: 14px 14px 14px 0;
font-size: 1rem;
font-family: inherit;
border: none;
background: transparent;
color: var(--z-login-text);
outline: none;
}
.z-login-input::placeholder {
color: var(--z-login-muted);
opacity: 1;
}
.z-login-input:focus {
outline: none;
}
.z-login-input:-webkit-autofill,
.z-login-input:-webkit-autofill:hover,
.z-login-input:-webkit-autofill:focus,
.z-login-input:-webkit-autofill:active {
-webkit-box-shadow: 0 0 0 1000px var(--z-login-input-bg) inset !important;
box-shadow: 0 0 0 1000px var(--z-login-input-bg) inset !important;
-webkit-text-fill-color: var(--z-login-text) !important;
caret-color: var(--z-login-text);
transition: background-color 600000s ease-in-out 0s;
}
.z-login-input:autofill {
box-shadow: 0 0 0 1000px var(--z-login-input-bg) inset !important;
-webkit-text-fill-color: var(--z-login-text) !important;
caret-color: var(--z-login-text);
}
.z-login-field--with-icon:focus-within {
box-shadow: 0 0 0 2px rgba(var(--primary-rgb, 33, 150, 243), 0.45);
}
html[data-theme="dark"] .z-login-field--with-icon:focus-within {
box-shadow: 0 0 0 2px rgba(var(--primary-rgb, 33, 150, 243), 0.5);
}
.z-login-submit {
width: 100%;
margin-top: 8px;
padding: 14px 20px;
font-size: 1rem;
font-weight: 700;
font-family: inherit;
color: #fff;
border: none;
border-radius: 8px;
cursor: pointer;
background: var(--gradient-blue, var(--z-login-btn));
box-shadow: 0 4px 14px rgba(var(--primary-rgb, 33, 150, 243), 0.35);
transition: background 0.15s ease, transform 0.15s ease, opacity 0.15s ease;
}
.z-login-submit:hover:not(:disabled) {
background: var(--z-login-btn-hover);
transform: translateY(-1px);
}
.z-login-submit:disabled {
opacity: 0.65;
cursor: not-allowed;
transform: none;
}
.z-login-remember {
display: flex;
align-items: center;
gap: 12px;
margin-top: 22px;
cursor: pointer;
user-select: none;
}
.z-login-switch-input {
position: absolute;
opacity: 0;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
}
.z-login-switch-ui {
flex-shrink: 0;
width: 44px;
height: 26px;
border-radius: 13px;
background: var(--z-login-switch-track);
position: relative;
transition: background 0.2s ease;
}
.z-login-switch-ui::after {
content: "";
position: absolute;
width: 22px;
height: 22px;
border-radius: 50%;
background: var(--z-login-switch-thumb);
top: 2px;
left: 2px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
transition: transform 0.2s ease;
}
.z-login-switch-input:checked + .z-login-switch-ui::after {
transform: translateX(18px);
}
.z-login-switch-input:focus-visible + .z-login-switch-ui {
outline: 2px solid var(--z-login-btn);
outline-offset: 2px;
}
.z-login-switch-input:disabled + .z-login-switch-ui {
opacity: 0.5;
}
.z-login-remember-text {
font-family: inherit;
font-size: 0.95rem;
color: var(--z-login-text);
}
.z-login-msg {
padding: 12px 14px;
border-radius: 8px;
margin-bottom: 16px;
font-size: 0.9rem;
display: none;
}
.z-login-msg--error {
background: #dc3545;
color: #fff;
}
.z-login-spinner {
display: none;
width: 22px;
height: 22px;
margin: 0 auto;
border: 2px solid rgba(255, 255, 255, 0.35);
border-top-color: #fff;
border-radius: 50%;
animation: z-login-spin 0.85s linear infinite;
}
@keyframes z-login-spin {
to {
transform: rotate(360deg);
}
}
@media (max-width: 520px) {
.z-login-loader {
height: min(200px, 32vh);
}
}
@media (max-width: 400px) {
.z-login-form-panel {
padding: 28px 22px 32px;
}
.z-login-title {
font-size: 1.5rem;
}
}