/* Global CSS Variables & Theme Setup */ :root { --color-bg-darkest: #0a0d14; --color-bg-dark: #101420; --color-bg-card: rgba(21, 27, 43, 0.75); --color-bg-input: #151b2a; --color-primary: #6366f1; /* Vibrant Indigo */ --color-primary-glow: rgba(99, 102, 241, 0.35); --color-accent: #a855f7; /* Electric Purple */ --color-accent-glow: rgba(168, 85, 247, 0.25); --color-success: #10b981; /* Emerald Green */ --color-success-glow: rgba(16, 185, 129, 0.25); --color-warning: #f59e0b; /* Amber */ --color-danger: #ef4444; /* Rose Red */ --text-primary: #f3f4f6; --text-secondary: #9ca3af; --text-muted: #6b7280; --border-glass: rgba(255, 255, 255, 0.08); --border-focus: rgba(99, 102, 241, 0.5); --shadow-soft: 0 10px 30px -10px rgba(0, 0, 0, 0.5); --shadow-glow: 0 0 20px var(--color-primary-glow); --font-heading: 'Outfit', sans-serif; --font-body: 'Inter', sans-serif; --border-radius-lg: 16px; --border-radius-md: 10px; --border-radius-sm: 6px; } /* Reset & Base Styles */ * { box-sizing: border-box; margin: 0; padding: 0; } body { background-color: var(--color-bg-darkest); background-image: radial-gradient(circle at 10% 20%, rgba(99, 102, 241, 0.05) 0%, transparent 40%), radial-gradient(circle at 90% 80%, rgba(168, 85, 247, 0.05) 0%, transparent 40%); background-attachment: fixed; color: var(--text-primary); font-family: var(--font-body); -webkit-font-smoothing: antialiased; min-height: 100vh; } .app-container { display: flex; flex-direction: column; min-height: 100vh; padding: 0 24px; max-width: 1600px; margin: 0 auto; } /* Header styling */ .app-header { display: flex; justify-content: space-between; align-items: center; padding: 20px 0; border-bottom: 1px solid var(--border-glass); } .header-logo { display: flex; align-items: center; gap: 12px; } .header-logo h1 { font-family: var(--font-heading); font-size: 24px; font-weight: 700; letter-spacing: -0.5px; color: var(--text-primary); } .header-logo h1 span.badge { font-size: 11px; font-family: var(--font-body); font-weight: 600; letter-spacing: 0.5px; padding: 3px 8px; background: linear-gradient(135deg, var(--color-primary), var(--color-accent)); border-radius: 20px; margin-left: 6px; vertical-align: middle; box-shadow: 0 0 10px rgba(99, 102, 241, 0.2); } .header-nav { display: flex; gap: 12px; background: rgba(16, 20, 32, 0.6); padding: 4px; border-radius: var(--border-radius-md); border: 1px solid var(--border-glass); backdrop-filter: blur(8px); } .nav-btn { display: flex; align-items: center; gap: 8px; background: transparent; border: none; color: var(--text-secondary); padding: 8px 16px; font-family: var(--font-body); font-size: 14px; font-weight: 500; border-radius: var(--border-radius-sm); cursor: pointer; transition: all 0.2s ease; } .nav-btn:hover { color: var(--text-primary); background: rgba(255, 255, 255, 0.04); } .nav-btn.active { color: var(--text-primary); background: var(--color-primary); box-shadow: 0 4px 12px rgba(99, 102, 241, 0.25); } /* Main layouts */ .app-main { flex-grow: 1; padding: 24px 0; } .tab-content { display: none; animation: fadeIn 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; } .tab-content.active { display: block; } @keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } /* Card components */ .card { background: var(--color-bg-card); border: 1px solid var(--border-glass); border-radius: var(--border-radius-lg); box-shadow: var(--shadow-soft); backdrop-filter: blur(16px); overflow: hidden; margin-bottom: 24px; } .card-header { padding: 20px 24px; border-bottom: 1px solid var(--border-glass); display: flex; justify-content: space-between; align-items: center; } .card-title { font-family: var(--font-heading); font-size: 18px; font-weight: 600; color: var(--text-primary); } .card-subtitle { font-size: 13px; color: var(--text-secondary); margin-top: 2px; } .card-body { padding: 24px; } /* Checkout View Layout */ .checkout-grid { display: grid; grid-template-columns: 1.6fr 1fr; gap: 24px; align-items: start; } @media (max-width: 1024px) { .checkout-grid { grid-template-columns: 1fr; } } .camera-card { margin-bottom: 0; } .camera-viewport-container { position: relative; width: 100%; aspect-ratio: 4/3; max-height: 520px; background: #000; border-bottom: 1px solid var(--border-glass); display: flex; align-items: center; justify-content: center; overflow: hidden; } #camera-canvas { width: 100%; height: 100%; object-fit: cover; } /* Weight Scale target frame overlap overlay */ .scale-target-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; display: flex; align-items: center; justify-content: center; } .scale-target-box { width: 70%; height: 65%; border: 2px dashed rgba(255, 255, 255, 0.25); border-radius: var(--border-radius-lg); box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.4); position: relative; transition: all 0.3s ease; } .scale-target-box::before, .scale-target-box::after { content: ''; position: absolute; width: 24px; height: 24px; border-color: rgba(255, 255, 255, 0.5); border-style: solid; } .scale-target-box::before { top: -2px; left: -2px; border-width: 3px 0 0 3px; border-top-left-radius: 8px; } .scale-target-box::after { bottom: -2px; right: -2px; border-width: 0 3px 3px 0; border-bottom-right-radius: 8px; } .scale-flash .scale-target-box { border-color: var(--color-success); box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.2), 0 0 40px var(--color-success-glow); } .stream-badge { position: absolute; top: 16px; left: 16px; background: rgba(0, 0, 0, 0.7); border: 1px solid var(--border-glass); padding: 4px 10px; border-radius: var(--border-radius-sm); font-size: 11px; font-weight: 600; letter-spacing: 0.5px; color: var(--text-primary); backdrop-filter: blur(4px); } .status-indicator { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 500; padding: 4px 10px; background: rgba(255, 255, 255, 0.05); border: 1px solid var(--border-glass); border-radius: 20px; } .status-indicator::before { content: ''; display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--text-muted); } .status-indicator.live::before { background: var(--color-success); box-shadow: 0 0 8px var(--color-success); animation: pulse 1.5s infinite; } .status-indicator.training::before { background: var(--color-warning); box-shadow: 0 0 8px var(--color-warning); animation: pulse 1.5s infinite; } @keyframes pulse { 0% { transform: scale(0.9); opacity: 0.6; } 50% { transform: scale(1.2); opacity: 1; } 100% { transform: scale(0.9); opacity: 0.6; } } .camera-controls { padding: 16px 24px; display: flex; align-items: center; gap: 16px; } /* POS Quick buttons layout */ .quick-buttons-container { padding: 20px; display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 12px; min-height: 100px; } .quick-btn { background: linear-gradient(135deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.01)); border: 1px solid var(--border-glass); color: var(--text-primary); padding: 14px; border-radius: var(--border-radius-md); cursor: pointer; display: flex; flex-direction: column; align-items: center; gap: 6px; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .quick-btn:hover { transform: translateY(-2px); border-color: var(--color-primary); background: rgba(99, 102, 241, 0.08); } .quick-btn:active { transform: translateY(0); } .quick-btn .btn-label { font-size: 13px; font-weight: 500; text-align: center; text-transform: capitalize; } .quick-btn .btn-conf { font-size: 11px; font-weight: 600; padding: 2px 6px; border-radius: 20px; } /* Style conf badge color dynamically based on class values */ .quick-btn.high-conf { border-color: rgba(16, 185, 129, 0.4); background: rgba(16, 185, 129, 0.05); } .quick-btn.high-conf:hover { background: rgba(16, 185, 129, 0.1); border-color: var(--color-success); } .quick-btn.high-conf .btn-conf { background: var(--color-success-glow); color: #34d399; } .quick-btn.low-conf .btn-conf { background: rgba(255, 255, 255, 0.05); color: var(--text-secondary); } .empty-state { grid-column: 1 / -1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--text-muted); padding: 24px; text-align: center; } .empty-state span { font-size: 12px; margin-top: 4px; } /* Shopping Cart styling - Kassenzettel */ .cart-card { display: none !important; } .cart-items { padding: 20px 24px; flex-grow: 1; min-height: 180px; max-height: 320px; overflow-y: auto; border-bottom: 1px dashed var(--border-glass); } .empty-cart-state { display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--text-muted); height: 100%; gap: 8px; padding: 24px; } .empty-cart-state p { font-size: 14px; } .cart-item-row { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.03); } .cart-item-row:last-child { border-bottom: none; } .item-details { display: flex; flex-direction: column; } .item-name { font-weight: 500; font-size: 14px; text-transform: capitalize; } .item-meta { font-size: 11px; color: var(--text-secondary); margin-top: 2px; } .item-price-actions { display: flex; align-items: center; gap: 16px; } .item-price { font-weight: 600; font-size: 14px; } .delete-item-btn { background: transparent; border: none; color: var(--text-muted); cursor: pointer; padding: 4px; border-radius: 4px; transition: all 0.2s ease; } .delete-item-btn:hover { color: var(--color-danger); background: rgba(239, 68, 68, 0.08); } .cart-summary { padding: 16px 24px; background: rgba(0, 0, 0, 0.15); border-bottom: 1px solid var(--border-glass); } .summary-row { display: flex; justify-content: space-between; font-size: 13px; color: var(--text-secondary); margin-bottom: 6px; } .summary-row:last-child { margin-bottom: 0; } .summary-row.total { font-family: var(--font-heading); font-size: 18px; font-weight: 700; color: var(--text-primary); margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border-glass); } .cart-actions { padding: 16px 24px; display: flex; gap: 12px; } .cart-actions button { flex-grow: 1; } /* Button UI system */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 10px 20px; font-family: var(--font-body); font-size: 14px; font-weight: 500; border-radius: var(--border-radius-md); border: 1px solid transparent; cursor: pointer; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .btn:active { transform: scale(0.98); } .btn-primary { background: var(--color-primary); color: #fff; box-shadow: 0 4px 14px rgba(99, 102, 241, 0.3); } .btn-primary:hover { background: #4f46e5; transform: translateY(-1px); } .btn-secondary { background: rgba(255, 255, 255, 0.04); border-color: var(--border-glass); color: var(--text-primary); } .btn-secondary:hover { background: rgba(255, 255, 255, 0.08); transform: translateY(-1px); } .btn-accent { background: var(--color-accent); color: #fff; box-shadow: 0 4px 14px rgba(168, 85, 247, 0.3); } .btn-accent:hover { background: #9333ea; transform: translateY(-1px); } .btn-success { background: var(--color-success); color: #fff; box-shadow: 0 4px 14px rgba(16, 185, 129, 0.3); } .btn-success:hover { background: #059669; transform: translateY(-1px); } .btn-danger { background: rgba(239, 68, 68, 0.1); border-color: rgba(239, 68, 68, 0.2); color: var(--color-danger); } .btn-danger:hover { background: var(--color-danger); color: #fff; transform: translateY(-1px); } .btn-text { background: transparent; border: none; color: var(--color-primary); padding: 4px 8px; border-radius: 4px; font-size: 13px; } .btn-text:hover { background: rgba(99, 102, 241, 0.08); } .btn-glow:hover { box-shadow: 0 0 25px var(--color-primary-glow); } .btn-success.btn-glow:hover { box-shadow: 0 0 25px var(--color-success-glow); } /* Toggle Switches */ .toggle-control { display: flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; } .toggle-slider { position: relative; display: inline-block; width: 44px; height: 24px; background-color: rgba(255, 255, 255, 0.1); border: 1px solid var(--border-glass); border-radius: 20px; transition: all 0.3s ease; } .toggle-slider::before { content: ''; position: absolute; height: 16px; width: 16px; left: 3px; bottom: 3px; background-color: var(--text-secondary); border-radius: 50%; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } input:checked + .toggle-slider { background-color: var(--color-primary); border-color: var(--color-primary); } input:checked + .toggle-slider::before { transform: translateX(20px); background-color: #fff; } .toggle-label { font-size: 13px; font-weight: 500; color: var(--text-primary); } .toggle-control input { display: none; } /* Developer Dashboard layout */ .dashboard-grid { display: grid; grid-template-columns: 1fr 1.1fr; gap: 24px; } @media (max-width: 1024px) { .dashboard-grid { grid-template-columns: 1fr; } } .dashboard-column { display: flex; flex-direction: column; } .step-num { font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--color-accent); padding: 3px 8px; background: var(--color-accent-glow); border-radius: 4px; border: 1px solid rgba(168, 85, 247, 0.15); } .action-row { display: flex; align-items: center; gap: 20px; margin-bottom: 20px; } .action-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.4; } /* Preview Augmentations styling */ .augmentation-section { border-top: 1px solid var(--border-glass); padding-top: 20px; margin-top: 20px; } .section-title-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; } .section-title-row h3 { font-size: 15px; font-weight: 600; } .section-desc { font-size: 12px; color: var(--text-muted); margin-bottom: 12px; line-height: 1.4; } .preview-container { width: 100%; aspect-ratio: 2/1; background: #090b10; border: 1px solid var(--border-glass); border-radius: var(--border-radius-md); display: flex; align-items: center; justify-content: center; overflow: hidden; } .preview-placeholder { color: var(--text-muted); font-size: 12px; text-align: center; padding: 24px; max-width: 80%; } .preview-image { width: 100%; height: 100%; object-fit: contain; } /* Terminal compiler output simulation */ .terminal-container { background: #090c12; border: 1px solid var(--border-glass); border-radius: var(--border-radius-md); padding: 12px; margin-top: 12px; margin-bottom: 20px; } .terminal-header { font-family: monospace; font-size: 11px; color: var(--text-muted); margin-bottom: 6px; padding-bottom: 4px; border-bottom: 1px solid rgba(255, 255, 255, 0.03); } .terminal-output { font-family: 'Courier New', Courier, monospace; font-size: 11px; color: #38bdf8; /* light blue */ white-space: pre-wrap; max-height: 120px; overflow-y: auto; line-height: 1.4; } /* Metrics Dashboard Cards */ .metric-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } .metric-card { background: rgba(0, 0, 0, 0.15); border: 1px solid var(--border-glass); border-radius: var(--border-radius-md); padding: 16px; display: flex; flex-direction: column; } .metric-label { font-size: 11px; font-weight: 500; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.5px; } .metric-value { font-family: var(--font-heading); font-size: 26px; font-weight: 700; margin: 8px 0 4px 0; } .metric-desc { font-size: 11px; color: var(--text-muted); } .text-accent { color: var(--color-accent); } .text-success { color: var(--color-success); } /* Training panel inputs & controls */ .training-controls-row { display: flex; align-items: flex-end; gap: 16px; margin-bottom: 24px; } .control-group { display: flex; flex-direction: column; gap: 6px; } .control-group label { font-size: 12px; font-weight: 500; color: var(--text-secondary); } .control-group input, .control-group select { background: var(--color-bg-input); border: 1px solid var(--border-glass); border-radius: var(--border-radius-md); padding: 8px 12px; color: var(--text-primary); font-family: var(--font-body); font-size: 14px; width: 100px; } .control-group input:focus, .control-group select:focus { outline: none; border-color: var(--color-primary); } .training-controls-row button { flex-grow: 1; } /* Training status monitor card */ .training-status-box { background: rgba(0, 0, 0, 0.2); border: 1px solid var(--border-glass); border-radius: var(--border-radius-md); padding: 16px; margin-bottom: 24px; } .status-header-row { display: flex; justify-content: space-between; font-size: 13px; margin-bottom: 10px; } .status-epoch { color: var(--text-secondary); } .progress-bar-container { width: 100%; height: 8px; background: rgba(255, 255, 255, 0.05); border-radius: 10px; overflow: hidden; margin-bottom: 12px; } .progress-bar-fill { height: 100%; background: linear-gradient(90deg, var(--color-primary), var(--color-accent)); border-radius: 10px; transition: width 0.4s ease; box-shadow: 0 0 10px var(--color-primary-glow); } .status-log-message { font-size: 12px; color: var(--text-secondary); line-height: 1.4; } /* Training chart */ .chart-container h3 { font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px; } .chart-wrapper { background: #090c12; border: 1px solid var(--border-glass); border-radius: var(--border-radius-md); padding: 12px; } .training-chart { width: 100%; height: auto; overflow: visible; } .training-chart text { font-family: monospace; } .chart-legend { display: flex; gap: 16px; justify-content: center; margin-top: 10px; } .legend-item { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--text-secondary); } .legend-color { width: 12px; height: 4px; border-radius: 2px; display: inline-block; } .legend-color.train { background: var(--color-primary); } .legend-color.val { background: var(--color-accent); border-top: 1px dashed #fff; /* indicates dash array */ } /* Real Data Capture Panel Styles */ .capture-training-panel { padding: 16px 24px; border-top: 1px dashed var(--border-glass); background: rgba(0, 0, 0, 0.12); } .capture-training-panel h3 { font-size: 13px; font-weight: 600; margin-bottom: 10px; color: var(--text-primary); text-transform: uppercase; letter-spacing: 0.5px; } .capture-controls-row { display: flex; gap: 12px; align-items: center; margin-bottom: 8px; } .capture-controls-row select { flex-grow: 1; background: var(--color-bg-input); border: 1px solid var(--border-glass); border-radius: var(--border-radius-md); padding: 8px 12px; color: var(--text-primary); font-family: var(--font-body); font-size: 14px; outline: none; } .capture-controls-row select:focus { border-color: var(--color-accent); } .capture-count-badge { font-size: 12px; font-weight: 600; padding: 6px 12px; background: var(--color-accent-glow); border: 1px solid rgba(168, 85, 247, 0.2); color: var(--color-accent); border-radius: var(--border-radius-sm); white-space: nowrap; } .panel-info-text { font-size: 11px; color: var(--text-muted); line-height: 1.4; } /* Article Management Table Styles */ .articles-table th, .articles-table td { padding: 12px 16px; border-bottom: 1px solid var(--border-glass); } .articles-table tbody tr:hover { background: rgba(255, 255, 255, 0.02); } .articles-table input { background: var(--color-bg-input); border: 1px solid var(--border-glass); border-radius: var(--border-radius-sm); padding: 6px 12px; color: var(--text-primary); font-family: monospace; font-size: 14px; width: 100%; max-width: 250px; outline: none; transition: all 0.2s ease; } .articles-table input:focus { border-color: var(--color-primary); box-shadow: 0 0 8px var(--color-primary-glow); } /* Footer styling */ .app-footer { border-top: 1px solid var(--border-glass); padding: 16px 0; text-align: center; color: var(--text-muted); font-size: 11px; }