diff --git a/server/static/base.css b/server/static/base.css
new file mode 100644
index 0000000..4175424
--- /dev/null
+++ b/server/static/base.css
@@ -0,0 +1,73 @@
+: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: 17.5rem;
+ --topnav-height: 3.5rem;
+ --border-radius-sm: 0.25rem;
+ --border-radius-md: 0.5rem;
+ --border-radius-lg: 0.75rem;
+ --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: 1rem;
+ line-height: 1.5;
+ color: var(--on-surface);
+ background: var(--surface);
+ display: flex;
+}
+
+input, select, textarea, button {
+ font-family: inherit;
+}
+
+.htmx-request {
+ opacity: 0.6;
+ pointer-events: none;
+}
+
+.hidden {
+ display: none !important;
+}
diff --git a/server/static/basket.css b/server/static/basket.css
new file mode 100644
index 0000000..381d178
--- /dev/null
+++ b/server/static/basket.css
@@ -0,0 +1,116 @@
+/* ========== ORDER SUMMARY ========== */
+#basket-items {
+ flex: 1;
+ overflow-y: auto;
+ padding: 1rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ list-style: none;
+
+ > li {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ padding-bottom: 0.5rem;
+ border-bottom: 1px solid var(--outline-variant);
+
+ > div:first-child {
+ flex: 1;
+ min-width: 0;
+ padding-right: 0.5rem;
+ }
+
+ .name {
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: var(--on-surface);
+ }
+
+ .detail {
+ font-size: 0.75rem;
+ color: var(--on-surface-variant);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .price {
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: var(--on-surface);
+ white-space: nowrap;
+ }
+
+ .remove {
+ color: var(--error);
+ cursor: pointer;
+ transition: opacity var(--transition);
+ background: none;
+ border: none;
+ margin-left: 0.25rem;
+
+ &:hover {
+ opacity: 0.8;
+ }
+
+ .material-symbols-outlined {
+ font-size: 1rem;
+ }
+ }
+ }
+}
+
+.summary-totals {
+ padding: 1rem;
+ border-top: 1px solid var(--outline-variant);
+ background: var(--surface-bright);
+
+ .total-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 0.75rem;
+ color: var(--on-surface-variant);
+
+ + .total-row {
+ margin-top: 0.5rem;
+ }
+
+ &.grand {
+ font-size: 1rem;
+ font-weight: 700;
+ color: var(--on-surface);
+ padding-top: 0.5rem;
+ border-top: 1px solid var(--outline-variant);
+ margin-top: 0.5rem;
+ }
+ }
+
+ .btn-finalize {
+ width: 100%;
+ height: 2.5rem;
+ margin-top: 0.5rem;
+ background: var(--primary);
+ color: var(--on-primary);
+ border: none;
+ border-radius: var(--border-radius-sm);
+ font-size: 0.75rem;
+ font-weight: 600;
+ letter-spacing: 0.02em;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ cursor: pointer;
+ transition: opacity var(--transition);
+
+ &:hover {
+ opacity: 0.9;
+ }
+
+ .material-symbols-outlined {
+ font-size: 1.25rem;
+ }
+ }
+}
diff --git a/server/static/card.css b/server/static/card.css
new file mode 100644
index 0000000..06b27c1
--- /dev/null
+++ b/server/static/card.css
@@ -0,0 +1,241 @@
+/* ========== CARDS ========== */
+.card {
+ background: var(--surface-container-lowest);
+ border: 1px solid var(--outline-variant);
+ border-radius: var(--border-radius-md);
+ display: flex;
+ flex-direction: column;
+
+ > header {
+ padding: 0.75rem 1rem;
+ border-bottom: 1px solid var(--outline-variant);
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ background: var(--surface-container-low);
+
+ h2 {
+ font-size: 1rem;
+ font-weight: 600;
+ color: var(--on-surface);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+
+ .material-symbols-outlined {
+ font-size: 1.25rem;
+ color: var(--on-surface-variant);
+ }
+ }
+ }
+
+ > div,
+ > form {
+ padding: 1rem;
+ flex: 1;
+ }
+
+ > footer {
+ padding: 0.5rem 0.75rem;
+ border-top: 1px solid var(--outline-variant);
+ background: var(--surface-container-lowest);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 0.75rem;
+ color: var(--on-surface-variant);
+ }
+}
+
+.card > .table-container {
+ overflow-x: auto;
+ padding: 0;
+}
+
+/* ========== METRICS GRID ========== */
+.metrics-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 0.75rem;
+
+ > div {
+ background: var(--surface-container-lowest);
+ border: 1px solid var(--outline-variant);
+ border-radius: var(--border-radius-md);
+ padding: 1rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+
+ .label {
+ font-size: 0.75rem;
+ font-weight: 500;
+ color: var(--on-surface-variant);
+ letter-spacing: 0.02em;
+ display: flex;
+ align-items: center;
+ gap: 0.25rem;
+
+ .material-symbols-outlined {
+ font-size: 1rem;
+ }
+ }
+
+ .value {
+ font-size: 1.75rem;
+ font-weight: 700;
+ color: var(--on-surface);
+ line-height: 1.2;
+ }
+
+ .change {
+ font-size: 0.75rem;
+ font-weight: 600;
+ display: flex;
+ align-items: center;
+ gap: 0.25rem;
+
+ &.positive {
+ color: var(--success-text);
+ }
+
+ &.warning {
+ color: var(--warning-text);
+ }
+
+ .material-symbols-outlined {
+ font-size: 1rem;
+ }
+ }
+ }
+}
+
+@media (max-width: 64em) {
+ .metrics-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 48em) {
+ .metrics-grid {
+ grid-template-columns: 1fr 1fr;
+ }
+}
+
+/* ========== SPLIT PANE ========== */
+.split-pane {
+ display: flex;
+ gap: 1rem;
+ flex: 1;
+ min-height: 0;
+
+ > div:first-child {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ min-width: 0;
+ }
+
+ > aside {
+ width: 20rem;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ }
+}
+
+@media (max-width: 64em) {
+ .split-pane {
+ flex-direction: column;
+ }
+
+ .split-pane > aside {
+ width: 100%;
+ }
+}
+
+/* ========== DATA TABLE ========== */
+.data-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.75rem;
+
+ thead {
+ background: var(--surface-container-low);
+ border-bottom: 1px solid var(--outline-variant);
+ }
+
+ th {
+ padding: 0.5rem 0.75rem;
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+ text-transform: uppercase;
+ letter-spacing: 0.04em;
+ text-align: left;
+ white-space: nowrap;
+
+ &.right {
+ text-align: right;
+ }
+
+ &.center {
+ text-align: center;
+ }
+ }
+
+ td {
+ padding: 0.5rem 0.75rem;
+ color: var(--on-surface);
+ white-space: nowrap;
+
+ .truncate {
+ max-width: 12.5rem;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ display: block;
+ }
+ }
+
+ tbody tr {
+ border-bottom: 1px solid var(--outline-variant);
+ transition: background var(--transition);
+ height: 2.5rem;
+
+ &:hover {
+ background: var(--surface-container-low);
+ }
+
+ &:nth-child(even) {
+ background: var(--surface-bright);
+
+ &:hover {
+ background: var(--surface-container-low);
+ }
+ }
+ }
+
+ .order-id {
+ font-weight: 700;
+ color: var(--primary);
+ text-decoration: none;
+ }
+
+ .customer {
+ font-weight: 500;
+ }
+
+ .text-right {
+ text-align: right;
+ }
+
+ .text-center {
+ text-align: center;
+ }
+
+ .text-muted {
+ color: var(--on-surface-variant);
+ }
+}
diff --git a/server/static/catalogue.css b/server/static/catalogue.css
new file mode 100644
index 0000000..305bdcb
--- /dev/null
+++ b/server/static/catalogue.css
@@ -0,0 +1,117 @@
+/* ========== CATALOGUE GRID ========== */
+#catalogue-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(8.75rem, 1fr));
+ gap: 0.5rem;
+
+ > li {
+ border: 1px solid var(--outline-variant);
+ border-radius: var(--border-radius-sm);
+ padding: 0.5rem;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ background: var(--surface-bright);
+ transition: border-color var(--transition);
+ list-style: none;
+
+ &:hover {
+ border-color: var(--outline);
+ }
+
+ > div:first-child {
+ display: flex;
+ align-items: flex-start;
+ gap: 0.5rem;
+ }
+
+ .icon {
+ width: 2rem;
+ height: 2rem;
+ border-radius: var(--border-radius-sm);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ font-size: 1rem;
+
+ &.cake {
+ background: var(--primary-container);
+ color: var(--primary);
+ }
+
+ &.cookie {
+ background: var(--surface-container-high);
+ color: var(--on-surface-variant);
+ }
+ }
+
+ .name {
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: var(--on-surface);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .price {
+ font-size: 0.75rem;
+ color: var(--on-surface-variant);
+ }
+
+ .actions {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-top: 0.5rem;
+ padding-top: 0.5rem;
+ border-top: 1px solid var(--outline-variant);
+
+ .qty {
+ width: 1.5rem;
+ height: 1.5rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: none;
+ border-radius: var(--border-radius-sm);
+ cursor: pointer;
+ font-size: 1rem;
+ transition: all var(--transition);
+
+ .material-symbols-outlined {
+ font-size: 1rem;
+ }
+
+ &.minus {
+ background: var(--surface-container-low);
+ color: var(--on-surface-variant);
+
+ &:hover {
+ background: var(--outline-variant);
+ color: var(--on-surface);
+ }
+ }
+
+ &.plus {
+ background: var(--surface-container-high);
+ color: var(--on-surface);
+
+ &:hover {
+ background: var(--primary);
+ color: var(--on-primary);
+ }
+ }
+ }
+
+ .value {
+ font-size: 0.75rem;
+ font-weight: 500;
+ color: var(--on-surface);
+ width: 1.5rem;
+ text-align: center;
+ }
+ }
+ }
+}
diff --git a/server/static/component.css b/server/static/component.css
new file mode 100644
index 0000000..e21d2db
--- /dev/null
+++ b/server/static/component.css
@@ -0,0 +1,277 @@
+/* ========== BUTTONS ========== */
+.btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ padding: 0 1rem;
+ height: 2.5rem;
+ border: none;
+ border-radius: var(--border-radius-sm);
+ font-size: 0.75rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all var(--transition);
+ text-decoration: none;
+
+ .material-symbols-outlined {
+ font-size: 1.25rem;
+ }
+
+ &.primary {
+ background: var(--primary);
+ color: var(--on-primary);
+
+ &:hover {
+ opacity: 0.9;
+ }
+ }
+
+ &.outline {
+ background: transparent;
+ border: 1px solid var(--outline-variant);
+ color: var(--on-surface);
+
+ &:hover {
+ background: var(--surface-container-high);
+ }
+ }
+
+ &.sm {
+ height: 2rem;
+ padding: 0 0.75rem;
+ }
+}
+
+/* ========== TABLE ACTIONS ========== */
+.action-btn {
+ color: var(--on-surface-variant);
+ cursor: pointer;
+ transition: color var(--transition);
+ background: none;
+ border: none;
+
+ &:hover {
+ color: var(--primary);
+ }
+
+ .material-symbols-outlined {
+ font-size: 1.25rem;
+ }
+}
+
+/* ========== STATUS CHIPS ========== */
+.status-chip {
+ display: inline-flex;
+ align-items: center;
+ padding: 0.25rem 0.5rem;
+ border-radius: var(--border-radius-full);
+ font-size: 0.75rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+
+ &.ready,
+ &.done {
+ background: var(--success-bg);
+ color: var(--success-text);
+ }
+
+ &.decorating {
+ background: var(--warning-bg);
+ color: var(--warning-text);
+ }
+
+ &.baking {
+ background: var(--danger-bg);
+ color: var(--danger-text);
+ }
+
+ &.queued {
+ background: var(--info-bg);
+ color: var(--info-text);
+ }
+
+ &.accepted {
+ background: #fff3e0;
+ color: #e65100;
+ }
+}
+
+/* ========== BADGE PILLS ========== */
+.badge-pill {
+ display: inline-flex;
+ align-items: center;
+ padding: 0.25rem 0.5rem;
+ border-radius: var(--border-radius-full);
+ font-size: 0.75rem;
+ font-weight: 600;
+
+ &.signature {
+ background: var(--primary-container);
+ color: var(--primary);
+ }
+
+ &.seasonal {
+ background: var(--surface-container-high);
+ color: var(--on-surface);
+ }
+}
+
+/* ========== PAGINATION ========== */
+.pagination {
+ display: flex;
+ gap: 0.25rem;
+ align-items: center;
+
+ .btn {
+ width: 1.5rem;
+ height: 1.5rem;
+ 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: 0.75rem;
+
+ &:hover {
+ background: var(--surface-container-low);
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: default;
+ }
+
+ &.active {
+ background: var(--primary);
+ color: var(--on-primary);
+ border-color: var(--primary);
+ }
+
+ .material-symbols-outlined {
+ font-size: 1rem;
+ }
+ }
+}
+
+/* ========== CONFIRMATION ========== */
+section.confirmation {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ flex: 1;
+ gap: 0.5rem;
+ text-align: center;
+
+ h2 {
+ font-size: 1.25rem;
+ 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: 2.5rem;
+ box-shadow: 0 0.25rem 1.5rem rgba(0, 0, 0, 0.1);
+ width: 100%;
+ max-width: 25rem;
+ position: relative;
+ overflow: hidden;
+
+ &::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 0.25rem;
+ background: linear-gradient(
+ 90deg,
+ var(--primary),
+ var(--primary-container)
+ );
+ }
+
+ .icon {
+ display: flex;
+ justify-content: center;
+ margin-bottom: 1.5rem;
+ color: var(--primary);
+ }
+
+ h1 {
+ font-size: 1.5rem;
+ font-weight: 700;
+ margin-bottom: 1.5rem;
+ color: var(--on-background);
+ text-align: center;
+ letter-spacing: -0.02em;
+ }
+
+ form {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ label {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+ }
+
+ input {
+ padding: 0.5rem 0.75rem;
+ border: 1px solid var(--outline-variant);
+ border-radius: var(--border-radius-sm);
+ font-size: 1rem;
+ font-family: inherit;
+ background-color: var(--surface);
+ color: var(--on-surface);
+ transition: border-color var(--transition);
+
+ &:focus {
+ outline: none;
+ border-color: var(--primary);
+ }
+ }
+
+ button {
+ padding: 0.5rem 2rem;
+ background-color: var(--primary);
+ color: #fff;
+ border: none;
+ border-radius: var(--border-radius-md);
+ font-size: 1rem;
+ font-weight: 600;
+ font-family: inherit;
+ cursor: pointer;
+ transition: opacity var(--transition);
+ margin-top: 0.5rem;
+
+ &:hover {
+ opacity: 0.9;
+ }
+ }
+}
diff --git a/server/static/form.css b/server/static/form.css
new file mode 100644
index 0000000..2455355
--- /dev/null
+++ b/server/static/form.css
@@ -0,0 +1,82 @@
+/* ========== FORM ========== */
+.form-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 0.75rem;
+}
+
+@media (max-width: 64em) {
+ .form-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 48em) {
+ .form-grid {
+ grid-template-columns: 1fr;
+ }
+}
+
+.form-group {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+
+ label {
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+ letter-spacing: 0.02em;
+ }
+}
+
+.form-input {
+ height: 2rem;
+ padding: 0 0.5rem;
+ border: 1px solid var(--outline-variant);
+ border-radius: var(--border-radius-sm);
+ background: var(--surface-container-lowest);
+ font-size: 0.75rem;
+ color: var(--on-surface);
+ outline: none;
+ transition: border-color var(--transition);
+ width: 100%;
+
+ &:focus {
+ border-color: var(--primary);
+ }
+
+ &::placeholder {
+ color: var(--on-surface-variant);
+ opacity: 0.6;
+ }
+}
+
+textarea.form-input {
+ height: auto;
+ padding: 0.5rem;
+ resize: vertical;
+}
+
+select.form-input {
+ appearance: auto;
+}
+
+.form-card {
+ max-width: 30rem;
+
+ .card > div {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ }
+}
+
+.form-actions {
+ display: flex;
+ justify-content: flex-end;
+ gap: 0.5rem;
+ padding-top: 0.5rem;
+ border-top: 1px solid var(--outline-variant);
+ margin-top: 0.5rem;
+}
diff --git a/server/static/layout.css b/server/static/layout.css
new file mode 100644
index 0000000..b91203d
--- /dev/null
+++ b/server/static/layout.css
@@ -0,0 +1,277 @@
+/* ========== SIDEBAR ========== */
+aside.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: 1rem;
+ z-index: 40;
+
+ .brand {
+ margin-bottom: 1.5rem;
+ padding: 0 0.5rem;
+
+ h1 {
+ font-size: 1.25rem;
+ font-weight: 700;
+ color: var(--primary);
+ letter-spacing: -0.01em;
+ line-height: 1.3;
+ }
+
+ p {
+ font-size: 0.75rem;
+ color: var(--on-surface-variant);
+ margin-top: 0.25rem;
+ }
+ }
+
+ .cta {
+ width: 100%;
+ height: 2.5rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ background: var(--primary);
+ color: var(--on-primary);
+ border: none;
+ border-radius: var(--border-radius-md);
+ font-size: 0.75rem;
+ font-weight: 600;
+ letter-spacing: 0.02em;
+ cursor: pointer;
+ text-decoration: none;
+ margin-bottom: 1.5rem;
+ transition: opacity var(--transition);
+
+ &:hover {
+ opacity: 0.9;
+ }
+
+ .material-symbols-outlined {
+ font-size: 1.25rem;
+ }
+ }
+
+ nav {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+
+ a.link {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ padding: 0.75rem 1rem;
+ border-radius: var(--border-radius-md);
+ font-size: 0.75rem;
+ font-weight: 500;
+ text-decoration: none;
+ color: var(--on-surface-variant);
+ transition: all var(--transition);
+ cursor: pointer;
+
+ &:hover {
+ background: var(--surface-container-low);
+ color: var(--on-surface);
+ }
+
+ &.active {
+ background: var(--primary-container);
+ color: var(--primary);
+ font-weight: 700;
+ }
+
+ .material-symbols-outlined {
+ font-size: 1.25rem;
+ }
+ }
+ }
+
+ footer {
+ margin-top: auto;
+ padding-top: 1rem;
+ border-top: 1px solid var(--outline-variant);
+
+ .user {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ padding: 0.5rem;
+ margin-top: 0.75rem;
+
+ .avatar {
+ width: 2rem;
+ height: 2rem;
+ border-radius: 50%;
+ background: var(--surface-container-high);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: var(--on-surface);
+ font-size: 1rem;
+ font-weight: 700;
+ flex-shrink: 0;
+ }
+
+ .info {
+ display: flex;
+ flex-direction: column;
+
+ .name {
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: var(--on-surface);
+ }
+
+ .status {
+ font-size: 0.75rem;
+ color: var(--on-surface-variant);
+ }
+ }
+ }
+ }
+}
+
+/* ========== MAIN LAYOUT ========== */
+main {
+ margin-left: var(--sidebar-width);
+ width: calc(100% - var(--sidebar-width));
+ display: flex;
+ flex-direction: column;
+ height: 100dvh;
+}
+
+/* ========== TOP NAVBAR ========== */
+header.topnav {
+ height: var(--topnav-height);
+ border-bottom: 1px solid var(--outline-variant);
+ background: var(--surface);
+ display: flex;
+ align-items: center;
+ gap: 1.5rem;
+ padding: 0 1.5rem;
+ flex-shrink: 0;
+ position: sticky;
+ top: 0;
+ z-index: 30;
+
+ h1 {
+ font-size: 1.25rem;
+ font-weight: 700;
+ color: var(--on-surface);
+ letter-spacing: -0.01em;
+ white-space: nowrap;
+ margin-right: auto;
+ }
+
+ search {
+ position: relative;
+ width: 15rem;
+
+ .material-symbols-outlined {
+ position: absolute;
+ left: 0.5rem;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 1.25rem;
+ color: var(--on-surface-variant);
+ pointer-events: none;
+ }
+
+ input {
+ width: 100%;
+ height: 2rem;
+ padding: 0 0.5rem 0 2rem;
+ border: 1px solid var(--outline-variant);
+ border-radius: var(--border-radius-sm);
+ background: var(--surface-container-lowest);
+ font-size: 0.75rem;
+ color: var(--on-surface);
+ outline: none;
+ transition: border-color var(--transition);
+
+ &:focus {
+ border-color: var(--primary);
+ }
+
+ &::placeholder {
+ color: var(--on-surface-variant);
+ opacity: 0.6;
+ }
+ }
+ }
+}
+
+/* ========== MAIN CONTENT ========== */
+.main-content {
+ flex: 1;
+ overflow-y: auto;
+ padding: 1rem;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+/* ========== RESPONSIVE ========== */
+@media (max-width: 64em) {
+ header.topnav search {
+ width: 10rem;
+ }
+}
+
+@media (max-width: 48em) {
+ aside.sidebar {
+ width: 3.5rem;
+ padding: 0.5rem;
+
+ .brand h1,
+ .brand p,
+ nav a.link span:not(.material-symbols-outlined),
+ .cta span:not(.material-symbols-outlined),
+ .user .info {
+ display: none;
+ }
+
+ .cta {
+ padding: 0;
+ width: 2.5rem;
+ height: 2.5rem;
+ margin: 0 auto 1rem;
+ border-radius: 50%;
+ }
+
+ nav a.link {
+ justify-content: center;
+ padding: 0.75rem 0.5rem;
+ }
+
+ .user {
+ justify-content: center;
+ }
+ }
+
+ main {
+ margin-left: 3.5rem;
+ width: calc(100% - 3.5rem);
+ }
+
+ header.topnav {
+ padding: 0 0.75rem;
+
+ search {
+ display: none;
+ }
+ }
+
+ .main-content {
+ padding: 0.5rem;
+ }
+}
diff --git a/server/static/order.js b/server/static/order.js
index a655658..ca03351 100644
--- a/server/static/order.js
+++ b/server/static/order.js
@@ -3,41 +3,40 @@ function changeCake(id, name, price, delta) {
if (input != null) {
var qty = Number(input.value) + delta;
if (qty <= 0) {
- var item = input.closest('.summary-item');
+ var item = input.closest('li');
if (item) item.remove();
updateTotals();
updateCatalogueQty(id, 0);
return;
}
input.value = qty;
- var item = input.closest('.summary-item');
- item.querySelector('.cake-qty').innerText = qty;
- item.querySelector('.cake-total').innerText = (price * qty) + ' PLN';
+ var item = input.closest('li');
+ item.querySelector('.qty').innerText = qty;
+ item.querySelector('.price').innerText = (price * qty) + ' PLN';
updateTotals();
updateCatalogueQty(id, qty);
return;
}
if (delta <= 0) return;
- var item = document.createElement('div');
- item.className = 'summary-item';
+ var item = document.createElement('li');
item.setAttribute('data-cake-id', id);
item.innerHTML =
- '
' +
- '
' + name + '
' +
- '
' + price + ' PLN × 1
' +
+ '
' +
+ '
' + name + '
' +
+ '
' + price + ' PLN × 1
' +
'
' +
- '
' + price + ' PLN
' +
- '