@@ -161,72 +213,93 @@ export default function App() {
))}
+ )}
+ {orderMode && (
-
Step 2
-
{selectedDrink?.name || "Select a drink"}
+
Step 2 • {activeMode.stepLabel}
+
{activeMode.title}
+
{activeMode.description}
+
+
+
+
{formatCurrency(ticketTotal(ticket, settings))}
-
{formatCurrency(ticketTotal(ticket, settings))}
{selectedDrink && builder ? (
<>
-
option.name)}
- value={builder.size}
- onChange={(size) => setBuilder((current) => ({ ...current, size }))}
- />
- setBuilder((current) => ({ ...current, sweetness }))}
- />
- setBuilder((current) => ({ ...current, ice }))}
- />
-
-
Toppings
-
- {settings.toppings.map((topping) => {
- const checked = builder.toppings.includes(topping.name);
- return (
-
- );
- })}
-
-
-
+ )}
+ {orderMode !== "premade" && (
+ setBuilder((current) => ({ ...current, sweetness }))}
+ />
+ )}
+ {orderMode === "detailed" && (
+ setBuilder((current) => ({ ...current, ice }))}
+ />
+ )}
+ {orderMode === "detailed" && (
+
+
Toppings
+
+ {settings.toppings.map((topping) => {
+ const checked = builder.toppings.includes(topping.name);
+ return (
+
+ );
+ })}
+
+
+ )}
+ {orderMode === "detailed" && (
+
+ )}
+ {orderMode === "premade" && (
+
+ This version uses the house recipe exactly as listed on the menu.
+
+ )}
{formatCurrency(lineTotal(selectedDrink, builder, settings))}
@@ -246,7 +319,7 @@ export default function App() {
setBuilder(initialBuilder(settings));
}}
>
- Add to ticket
+ {activeMode.buttonLabel}
>
@@ -334,6 +407,7 @@ export default function App() {
+ )}
)}
diff --git a/client/src/styles.css b/client/src/styles.css
index c883584..928702f 100644
--- a/client/src/styles.css
+++ b/client/src/styles.css
@@ -74,6 +74,7 @@ button {
.choice-row,
.chip-row,
.builder-actions,
+.builder-header-actions,
.ticket-header,
.line-meta,
.status-actions,
@@ -104,6 +105,49 @@ button {
box-shadow: var(--shadow);
}
+.mode-launcher {
+ grid-column: 1 / -1;
+ display: grid;
+ gap: 1.25rem;
+ padding: 1.4rem;
+ background:
+ radial-gradient(circle at top right, rgba(47, 93, 80, 0.1), transparent 24%),
+ linear-gradient(135deg, rgba(255, 250, 242, 0.96), rgba(247, 239, 227, 0.98));
+}
+
+.mode-launcher-copy {
+ max-width: 48rem;
+}
+
+.mode-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 1rem;
+}
+
+.mode-card {
+ display: grid;
+ gap: 0.65rem;
+ padding: 1.25rem;
+ border: 1px solid rgba(47, 93, 80, 0.14);
+ border-radius: 24px;
+ background: rgba(255, 255, 255, 0.9);
+ text-align: left;
+ box-shadow: 0 10px 24px rgba(59, 47, 34, 0.08);
+ transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease;
+}
+
+.mode-card:hover {
+ transform: translateY(-2px);
+ border-color: rgba(47, 93, 80, 0.34);
+ box-shadow: 0 16px 32px rgba(59, 47, 34, 0.12);
+}
+
+.mode-card h3,
+.mode-card p {
+ margin: 0;
+}
+
.panel-header,
.queue-card header,
.menu-form,
@@ -120,6 +164,11 @@ button {
margin-bottom: 1rem;
}
+.builder-header-actions {
+ align-items: center;
+ justify-content: flex-end;
+}
+
.tab,
.choice-btn,
.chip,
@@ -243,6 +292,14 @@ select {
font-weight: 800;
}
+.builder-intro {
+ max-width: 28rem;
+}
+
+.mode-note {
+ border: 1px dashed rgba(47, 93, 80, 0.16);
+}
+
.queue-summary {
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
}
@@ -290,6 +347,7 @@ select {
@media (max-width: 980px) {
.topbar,
.screen,
+ .mode-grid,
.queue-columns,
.menu-item,
.panel-header {