:root { --surface: #fff8f0; --surface-container-low: #faf3e7; --surface-container: #f5ede0; --surface-container-high: #ede3d4; --surface-container-highest: #e5d9c8; --surface-container-lowest: #ffffff; --surface-bright: #fff8f0; --surface-dim: #e5d9c8; --primary: #8c4d50; --primary-hover: #7a3f42; --primary-container: #fcacaf; --on-primary: #ffffff; --on-surface: #363227; --on-surface-variant: #645f52; --outline: #b9b1a3; --outline-variant: #d4cdbe; --secondary: #b45309; --secondary-container: #fd8a42; --on-secondary-container: #682c00; --error: #ba1a1a; --error-container: #ffdad6; --on-error-container: #93000a; --success-bg: #dcfce7; --success-text: #166534; --warning-bg: #fef08a; --warning-text: #854d0e; --danger-bg: #fee2e2; --danger-text: #991b1b; --info-bg: #f1f5f9; --info-text: #475569; --sidebar-width: 280px; --topnav-height: 56px; --border-radius-sm: 4px; --border-radius-md: 8px; --border-radius-lg: 12px; --border-radius-full: 9999px; --font-family: 'Inter', system-ui, -apple-system, sans-serif; --transition: 0.15s ease; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html, body { height: 100%; overflow: hidden; } body { font-family: var(--font-family); font-size: 14px; line-height: 1.5; color: var(--on-surface); background: var(--surface); display: flex; } input, select, textarea, button { font-family: inherit; } /* ========== SIDEBAR ========== */ .sidebar { position: fixed; left: 0; top: 0; bottom: 0; width: var(--sidebar-width); background: var(--surface-container-lowest); border-right: 1px solid var(--outline-variant); display: flex; flex-direction: column; padding: 16px; z-index: 40; } .sidebar-brand { margin-bottom: 24px; padding: 0 8px; } .sidebar-brand h1 { font-size: 20px; font-weight: 700; color: var(--primary); letter-spacing: -0.01em; line-height: 1.3; } .sidebar-brand p { font-size: 13px; color: var(--on-surface-variant); margin-top: 4px; } .sidebar-cta { width: 100%; height: 40px; display: flex; align-items: center; justify-content: center; gap: 8px; background: var(--primary); color: var(--on-primary); border: none; border-radius: var(--border-radius-md); font-size: 12px; font-weight: 600; letter-spacing: 0.02em; cursor: pointer; text-decoration: none; margin-bottom: 24px; transition: opacity var(--transition); } .sidebar-cta:hover { opacity: 0.9; } .sidebar-cta .material-symbols-outlined { font-size: 18px; } .sidebar-nav { flex: 1; display: flex; flex-direction: column; gap: 2px; } .sidebar-link { display: flex; align-items: center; gap: 12px; padding: 12px 16px; border-radius: var(--border-radius-md); font-size: 12px; font-weight: 500; text-decoration: none; color: var(--on-surface-variant); transition: all var(--transition); cursor: pointer; } .sidebar-link:hover { background: var(--surface-container-low); color: var(--on-surface); } .sidebar-link.active { background: var(--primary-container); color: var(--primary); font-weight: 700; } .sidebar-link .material-symbols-outlined { font-size: 20px; } .sidebar-footer { margin-top: auto; padding-top: 16px; border-top: 1px solid var(--outline-variant); } .sidebar-user { display: flex; align-items: center; gap: 12px; padding: 8px; margin-top: 12px; } .sidebar-user-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--surface-container-high); display: flex; align-items: center; justify-content: center; color: var(--on-surface); font-size: 14px; font-weight: 700; flex-shrink: 0; } .sidebar-user-info { display: flex; flex-direction: column; } .sidebar-user-name { font-size: 12px; font-weight: 600; color: var(--on-surface); } .sidebar-user-status { font-size: 11px; color: var(--on-surface-variant); } /* ========== MAIN LAYOUT ========== */ .app-body { margin-left: var(--sidebar-width); width: calc(100% - var(--sidebar-width)); display: flex; flex-direction: column; height: 100dvh; } /* ========== TOP NAVBAR ========== */ .topnav { height: var(--topnav-height); border-bottom: 1px solid var(--outline-variant); background: var(--surface); display: flex; align-items: center; justify-content: space-between; padding: 0 24px; flex-shrink: 0; position: sticky; top: 0; z-index: 30; } .topnav-left { display: flex; align-items: center; gap: 24px; flex: 1; min-width: 0; } .topnav-title { font-size: 20px; font-weight: 700; color: var(--on-surface); letter-spacing: -0.01em; white-space: nowrap; } .topnav-search { position: relative; width: 240px; } .topnav-search .material-symbols-outlined { position: absolute; left: 8px; top: 50%; transform: translateY(-50%); font-size: 18px; color: var(--on-surface-variant); pointer-events: none; } .topnav-search input { width: 100%; height: 32px; padding: 0 8px 0 32px; border: 1px solid var(--outline-variant); border-radius: var(--border-radius-sm); background: var(--surface-container-lowest); font-size: 13px; color: var(--on-surface); outline: none; transition: border-color var(--transition); } .topnav-search input:focus { border-color: var(--primary); } .topnav-search input::placeholder { color: var(--on-surface-variant); opacity: 0.6; } .topnav-center { display: flex; align-items: center; gap: 24px; } .topnav-period { font-size: 13px; font-weight: 500; color: var(--on-surface-variant); text-decoration: none; cursor: pointer; padding-bottom: 2px; transition: color var(--transition); } .topnav-period:hover { color: var(--on-surface); } .topnav-period.active { color: var(--primary); font-weight: 700; border-bottom: 2px solid var(--secondary); } .topnav-right { display: flex; align-items: center; gap: 16px; } .topnav-btn { height: 32px; padding: 0 16px; display: flex; align-items: center; gap: 6px; border: 1px solid var(--outline-variant); border-radius: var(--border-radius-sm); background: transparent; color: var(--on-surface); font-size: 12px; font-weight: 500; cursor: pointer; transition: all var(--transition); text-decoration: none; } .topnav-btn:hover { background: var(--surface-container-low); } .topnav-btn .material-symbols-outlined { font-size: 16px; } .topnav-icon { color: var(--on-surface-variant); cursor: pointer; transition: color var(--transition); text-decoration: none; display: flex; align-items: center; } .topnav-icon:hover { color: var(--primary); } .topnav-icon .material-symbols-outlined { font-size: 22px; } /* ========== MAIN CONTENT ========== */ .main-content { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 16px; } /* ========== CARDS / SECTIONS ========== */ .card { background: var(--surface-container-lowest); border: 1px solid var(--outline-variant); border-radius: var(--border-radius-md); display: flex; flex-direction: column; } .card-header { padding: 12px 16px; border-bottom: 1px solid var(--outline-variant); display: flex; align-items: center; justify-content: space-between; background: var(--surface-container-low); } .card-header h2 { font-size: 16px; font-weight: 600; color: var(--on-surface); display: flex; align-items: center; gap: 8px; } .card-header h2 .material-symbols-outlined { font-size: 18px; color: var(--on-surface-variant); } .card-body { padding: 16px; flex: 1; } /* ========== METRICS GRID ========== */ .metrics-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; } .metric-card { background: var(--surface-container-lowest); border: 1px solid var(--outline-variant); border-radius: var(--border-radius-md); padding: 16px; display: flex; flex-direction: column; gap: 4px; } .metric-label { font-size: 12px; font-weight: 500; color: var(--on-surface-variant); letter-spacing: 0.02em; display: flex; align-items: center; gap: 4px; } .metric-label .material-symbols-outlined { font-size: 14px; } .metric-value { font-size: 28px; font-weight: 700; color: var(--on-surface); line-height: 1.2; } .metric-change { font-size: 11px; font-weight: 600; display: flex; align-items: center; gap: 2px; } .metric-change.positive { color: var(--success-text); } .metric-change.warning { color: var(--warning-text); } .metric-change .material-symbols-outlined { font-size: 14px; } /* ========== SPLIT PANE ========== */ .split-pane { display: flex; gap: 16px; flex: 1; min-height: 0; } .split-pane-left { flex: 1; display: flex; flex-direction: column; gap: 16px; min-width: 0; } .split-pane-right { width: 320px; flex-shrink: 0; display: flex; flex-direction: column; } /* ========== FORM ========== */ .form-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; } .form-group { display: flex; flex-direction: column; gap: 4px; } .form-group label { font-size: 11px; font-weight: 600; color: var(--on-surface-variant); letter-spacing: 0.02em; } .form-input { height: 32px; padding: 0 8px; border: 1px solid var(--outline-variant); border-radius: var(--border-radius-sm); background: var(--surface-container-lowest); font-size: 13px; color: var(--on-surface); outline: none; transition: border-color var(--transition); width: 100%; } .form-input:focus { border-color: var(--primary); } .form-input::placeholder { color: var(--on-surface-variant); opacity: 0.6; } textarea.form-input { height: auto; padding: 8px; resize: vertical; } select.form-input { appearance: auto; } /* ========== CATALOGUE GRID ========== */ .catalogue-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px; } .catalogue-item { border: 1px solid var(--outline-variant); border-radius: var(--border-radius-sm); padding: 8px; display: flex; flex-direction: column; justify-content: space-between; background: var(--surface-bright); transition: border-color var(--transition); } .catalogue-item:hover { border-color: var(--outline); } .catalogue-item-top { display: flex; align-items: flex-start; gap: 8px; } .catalogue-item-icon { width: 32px; height: 32px; border-radius: var(--border-radius-sm); display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 16px; } .catalogue-item-icon.icon-cake { background: var(--primary-container); color: var(--primary); } .catalogue-item-icon.icon-cookie { background: var(--surface-container-high); color: var(--on-surface-variant); } .catalogue-item-name { font-size: 11px; font-weight: 600; color: var(--on-surface); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .catalogue-item-price { font-size: 13px; color: var(--on-surface-variant); } .catalogue-item-actions { display: flex; align-items: center; justify-content: space-between; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--outline-variant); } .qty-btn { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; border: none; border-radius: var(--border-radius-sm); cursor: pointer; font-size: 14px; transition: all var(--transition); } .qty-btn.qty-minus { background: var(--surface-container-low); color: var(--on-surface-variant); } .qty-btn.qty-minus:hover { background: var(--outline-variant); color: var(--on-surface); } .qty-btn.qty-plus { background: var(--surface-container-high); color: var(--on-surface); } .qty-btn.qty-plus:hover { background: var(--primary); color: var(--on-primary); } .qty-btn .material-symbols-outlined { font-size: 14px; } .qty-value { font-size: 12px; font-weight: 500; color: var(--on-surface); width: 24px; text-align: center; } /* ========== ORDER SUMMARY ========== */ .summary-lineitems { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 8px; } .summary-item { display: flex; align-items: flex-start; justify-content: space-between; padding-bottom: 8px; border-bottom: 1px solid var(--outline-variant); } .summary-item-info { flex: 1; min-width: 0; padding-right: 8px; } .summary-item-name { font-size: 12px; font-weight: 600; color: var(--on-surface); } .summary-item-detail { font-size: 13px; color: var(--on-surface-variant); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .summary-item-price { font-size: 12px; font-weight: 600; color: var(--on-surface); white-space: nowrap; } .summary-item-remove { color: var(--error); cursor: pointer; transition: opacity var(--transition); background: none; border: none; margin-left: 4px; } .summary-item-remove:hover { opacity: 0.8; } .summary-item-remove .material-symbols-outlined { font-size: 16px; } .summary-totals { padding: 16px; border-top: 1px solid var(--outline-variant); background: var(--surface-bright); display: flex; flex-direction: column; gap: 8px; } .summary-total-row { display: flex; justify-content: space-between; align-items: center; font-size: 13px; color: var(--on-surface-variant); } .summary-total-row.total { font-size: 16px; font-weight: 700; color: var(--on-surface); padding-top: 8px; border-top: 1px solid var(--outline-variant); } .btn-finalize { width: 100%; height: 40px; margin-top: 8px; background: var(--primary); color: var(--on-primary); border: none; border-radius: var(--border-radius-sm); font-size: 12px; font-weight: 600; letter-spacing: 0.02em; display: flex; align-items: center; justify-content: center; gap: 8px; cursor: pointer; transition: opacity var(--transition); } .btn-finalize:hover { opacity: 0.9; } .btn-finalize .material-symbols-outlined { font-size: 18px; } /* ========== TABLES ========== */ .table-container { overflow-x: auto; } .data-table { width: 100%; border-collapse: collapse; font-size: 13px; } .data-table thead { background: var(--surface-container-low); border-bottom: 1px solid var(--outline-variant); } .data-table th { padding: 8px 12px; font-size: 11px; font-weight: 600; color: var(--on-surface-variant); text-transform: uppercase; letter-spacing: 0.04em; text-align: left; white-space: nowrap; } .data-table th.right { text-align: right; } .data-table th.center { text-align: center; } .data-table td { padding: 8px 12px; color: var(--on-surface); white-space: nowrap; } .data-table tbody tr { border-bottom: 1px solid var(--outline-variant); transition: background var(--transition); height: 40px; } .data-table tbody tr:hover { background: var(--surface-container-low); } .data-table tbody tr:nth-child(even) { background: var(--surface-bright); } .data-table tbody tr:nth-child(even):hover { background: var(--surface-container-low); } .data-table td .truncate { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } .data-table .order-id { font-weight: 700; color: var(--primary); } .data-table .customer-name { font-weight: 500; } .data-table .text-right { text-align: right; } .data-table .text-center { text-align: center; } .data-table .text-on-surface-variant { color: var(--on-surface-variant); } /* ========== STATUS CHIPS ========== */ .status-chip { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--border-radius-full); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.02em; } .status-chip.ready { background: var(--success-bg); color: var(--success-text); } .status-chip.decorating { background: var(--warning-bg); color: var(--warning-text); } .status-chip.baking { background: var(--danger-bg); color: var(--danger-text); } .status-chip.queued { background: var(--info-bg); color: var(--info-text); } .status-chip.accepted { background: #fff3e0; color: #e65100; } .status-chip.done { background: var(--success-bg); color: var(--success-text); } /* ========== TABLE PAGINATION ========== */ .table-footer { padding: 8px 12px; border-top: 1px solid var(--outline-variant); background: var(--surface-container-lowest); display: flex; justify-content: space-between; align-items: center; font-size: 11px; color: var(--on-surface-variant); } .pagination { display: flex; gap: 4px; align-items: center; } .pagination-btn { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--outline-variant); border-radius: var(--border-radius-sm); background: transparent; cursor: pointer; color: var(--on-surface-variant); transition: all var(--transition); font-size: 12px; } .pagination-btn:hover { background: var(--surface-container-low); } .pagination-btn:disabled { opacity: 0.5; cursor: default; } .pagination-btn .material-symbols-outlined { font-size: 14px; } .pagination-btn.active { background: var(--primary); color: var(--on-primary); border-color: var(--primary); } /* ========== BADGE PILLS ========== */ .badge-pill { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--border-radius-full); font-size: 10px; font-weight: 600; } .badge-pill.signature { background: var(--primary-container); color: var(--primary); } .badge-pill.seasonal { background: var(--surface-container-high); color: var(--on-surface); } /* ========== FORM CARD (single column) ========== */ .form-card { max-width: 480px; } .form-card .card-body { display: flex; flex-direction: column; gap: 16px; } .form-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 8px; border-top: 1px solid var(--outline-variant); margin-top: 8px; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 0 16px; height: 40px; border: none; border-radius: var(--border-radius-sm); font-size: 12px; font-weight: 600; cursor: pointer; transition: all var(--transition); text-decoration: none; } .btn-primary { background: var(--primary); color: var(--on-primary); } .btn-primary:hover { opacity: 0.9; } .btn-outline { background: transparent; border: 1px solid var(--outline-variant); color: var(--on-surface); } .btn-outline:hover { background: var(--surface-container-high); } .btn-sm { height: 32px; padding: 0 12px; } .btn .material-symbols-outlined { font-size: 18px; } /* ========== TABLE ACTIONS ========== */ .action-btn { color: var(--on-surface-variant); cursor: pointer; transition: color var(--transition); background: none; border: none; } .action-btn:hover { color: var(--primary); } .action-btn .material-symbols-outlined { font-size: 18px; } /* ========== CONFIRMATION ========== */ .confirmation { display: flex; flex-direction: column; align-items: center; justify-content: center; flex: 1; gap: 8px; text-align: center; } .confirmation h2 { font-size: 20px; font-weight: 600; color: var(--on-surface); } /* ========== LOGIN PAGE ========== */ .login-page { display: flex; justify-content: center; align-items: center; min-height: 100dvh; background-color: var(--surface-container-low); } .login-card { background-color: var(--surface); border: 1px solid var(--outline-variant); border-radius: var(--border-radius-md); padding: 40px; box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1); width: 100%; max-width: 400px; position: relative; overflow: hidden; } .login-card::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, var(--primary), var(--primary-container)); } .login-icon { display: flex; justify-content: center; margin-bottom: 24px; color: var(--primary); } .login-card h1 { font-size: 24px; font-weight: 700; margin-bottom: 24px; color: var(--on-background); text-align: center; letter-spacing: -0.02em; } .login-card form { display: flex; flex-direction: column; gap: 16px; } .login-card label { display: flex; flex-direction: column; gap: 4px; font-size: 13px; font-weight: 600; color: var(--on-surface-variant); } .login-card input { padding: 8px 12px; border: 1px solid var(--outline-variant); border-radius: var(--border-radius-sm); font-size: 14px; font-family: inherit; background-color: var(--surface); color: var(--on-surface); transition: border-color var(--transition); } .login-card input:focus { outline: none; border-color: var(--primary); } .login-card button { padding: 10px 32px; background-color: var(--primary); color: #fff; border: none; border-radius: var(--border-radius-md); font-size: 14px; font-weight: 600; font-family: inherit; cursor: pointer; transition: opacity var(--transition); margin-top: 8px; } .login-card button:hover { opacity: 0.9; } /* ========== HTMX ========== */ .htmx-request { opacity: 0.6; pointer-events: none; } /* ========== HIDDEN ========== */ .hidden { display: none !important; } /* ========== RESPONSIVE ========== */ @media (max-width: 1024px) { .metrics-grid { grid-template-columns: repeat(2, 1fr); } .split-pane { flex-direction: column; } .split-pane-right { width: 100%; } .form-grid { grid-template-columns: repeat(2, 1fr); } .topnav-center { display: none; } .topnav-search { width: 160px; } } @media (max-width: 768px) { .sidebar { width: 56px; padding: 8px; } .sidebar-brand h1, .sidebar-brand p, .sidebar-link span:not(.material-symbols-outlined), .sidebar-cta span:not(.material-symbols-outlined), .sidebar-user-info { display: none; } .sidebar-cta { padding: 0; width: 40px; height: 40px; margin: 0 auto 16px; border-radius: 50%; } .sidebar-link { justify-content: center; padding: 12px 8px; } .sidebar-user { justify-content: center; } .app-body { margin-left: 56px; width: calc(100% - 56px); } .topnav { padding: 0 12px; } .topnav-search { display: none; } .metrics-grid { grid-template-columns: 1fr 1fr; } .form-grid { grid-template-columns: 1fr; } .main-content { padding: 8px; } }