diff --git a/app/globals.css b/app/globals.css index 3e4f107..0c39c86 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1063,6 +1063,103 @@ label, border-color: color-mix(in srgb, var(--info) 28%, transparent); } + +.operator-priority-card { + padding: clamp(1rem, 2vw, 1.35rem); + border: 1px solid color-mix(in srgb, var(--accent) 36%, var(--border)); + border-radius: var(--radius-xl); + background: linear-gradient(180deg, color-mix(in srgb, var(--accent-soft) 58%, var(--surface)), var(--surface)); + box-shadow: var(--shadow-md); +} + +.operator-priority-card .eyebrow { + color: var(--accent-strong); +} + +.support-section { + opacity: 0.88; +} + +.support-section .panel, +.support-section.panel, +.support-section .subpanel, +.support-section.page-context-card { + box-shadow: none; +} + +.support-section .stat-card strong { + font-size: clamp(1.25rem, 2vw, 1.6rem); +} + +.shell-nav-admin { + opacity: 0.78; +} + +.shell-nav-admin .shell-nav-section-label::after { + content: ' / setup'; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: none; +} + +.shell-nav-link.is-admin-link { + color: var(--muted); + background: transparent; + border-color: transparent; +} + +.shell-nav-link.is-admin-link.is-active { + color: var(--ink-soft); + background: var(--surface-soft); + border-color: var(--border); + box-shadow: none; +} + +.badge, +.summary-pill { + cursor: default; +} + +a.summary-pill, +button.summary-pill, +.panel-link, +.inline-link, +.button-primary, +.button-secondary, +.button-ghost, +.shell-nav-link { + cursor: pointer; +} + +a.summary-pill { + transition: + border-color 140ms ease, + background-color 140ms ease, + box-shadow 140ms ease; +} + +a.summary-pill:hover, +a.summary-pill:focus-visible { + border-color: var(--border-strong); + background: var(--surface); + box-shadow: var(--shadow-sm); +} + +.order-card:hover, +.line-entry-card:hover, +.timeline-card:hover { + border-color: var(--border); +} + +.order-card:has(a:hover), +.order-card:has(a:focus-visible), +.line-entry-card:has(button:hover), +.line-entry-card:has(button:focus-visible), +.timeline-card:has(a:hover), +.timeline-card:has(a:focus-visible) { + border-color: var(--border-strong); +} + .button-primary { background: linear-gradient(180deg, var(--accent), var(--accent-strong)); color: white; diff --git a/app/handoff/page.tsx b/app/handoff/page.tsx index 58b9dbe..01bfe88 100644 --- a/app/handoff/page.tsx +++ b/app/handoff/page.tsx @@ -64,7 +64,23 @@ export default async function HandoffPage({ {params?.saved ?

{t('handoff.savedUpdate', { item: params.saved })}

: null} {params?.error ?

{params.error}

: null} -
+
+
+
+

Primary action

+

Release ready work and record handoff notes

+

Check pickup, packing, and assignment watches first. Use WIP and shift notes when work must cross a shift.

+
+ +
+
+ Review release watches + Record WIP / shift note + Production board +
+
+ +
@@ -123,7 +139,7 @@ export default async function HandoffPage({
-
+
@@ -232,7 +248,7 @@ export default async function HandoffPage({
-
+

{t('handoff.addWip')}

diff --git a/app/orders/page.tsx b/app/orders/page.tsx index 309f8b3..18180e0 100644 --- a/app/orders/page.tsx +++ b/app/orders/page.tsx @@ -154,7 +154,23 @@ export default async function OrdersPage({

) : null} -
+
+
+
+

Primary action

+

Create or review today's orders

+

Order capture is the first-deploy priority. Confirm products when useful, but freeform lines can keep work moving.

+
+ +
+
+ Create order + Confirm customers + Confirm products +
+
+ +
{t('orders.recurringDemand')} diff --git a/app/page.tsx b/app/page.tsx index fa3ed3b..e10246d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -149,27 +149,28 @@ export default async function HomePage() {
-
+
-

First deploy workflow

-

For a real first test, start with customers and order capture, then use production and handoff as the daily operating loop.

+

Today's priority

+

Start the daily loop

+

Create or confirm orders first. Production and handoff become useful once real orders exist.

MWP path
-
- Confirm customers - Create orders - Track production - Record handoff - Basic setup +
+ Create order + Track production + Record handoff + Customers + Basic setup
{gatewayState.demoModeActive ? (

This workspace is marked as demo data. Do not treat records here as live operational data.

) : null}
-
+
@@ -207,14 +208,16 @@ export default async function HomePage() {
- + +
-
+
{t('home.roleFocusTitle')} @@ -229,7 +232,7 @@ export default async function HomePage() {
-
+
{orderedQuickLinks.map((link, index) => { const Icon = link.icon; const isRecommended = homeWorkspace === 'home' ? index === 0 : link.href === `/${recommendedWorkspace}`; diff --git a/app/production/page.tsx b/app/production/page.tsx index a426f2a..2fbf831 100644 --- a/app/production/page.tsx +++ b/app/production/page.tsx @@ -69,7 +69,24 @@ export default async function ProductionPage() {
- {view.boards.map((board) => { +
+
+
+

Primary action

+

Update pending production work

+

Use the line update cards on each board to mark what is done. Create orders only when demand is missing.

+
+ +
+
+ Update production + Create order + Record WIP / handoff +
+
+ +
+ {view.boards.map((board) => { const sectionIdBase = board.productionDate; return ( @@ -130,7 +147,7 @@ export default async function ProductionPage() { ) : null}
@@ -163,7 +180,7 @@ export default async function ProductionPage() {
-
+
{t('production.fulfillmentSummary.standard')} @@ -240,7 +257,7 @@ export default async function ProductionPage() { ))}
-
+
@@ -307,7 +324,7 @@ export default async function ProductionPage() {
-
+
@@ -361,7 +378,7 @@ export default async function ProductionPage() {
-
+
@@ -565,7 +582,8 @@ export default async function ProductionPage() {
); - })} + })} + {!view.boards.length ? (
diff --git a/app/timeline/page.tsx b/app/timeline/page.tsx index 363a4c8..9c0df6b 100644 --- a/app/timeline/page.tsx +++ b/app/timeline/page.tsx @@ -175,15 +175,23 @@ export default async function TimelinePage() {
-
- -
- {t('timeline.focusDateTitle', { date: formatDateLabel(view.focusDate, locale) })} -

{t('timeline.focusDateBody')}

+
+
+
+

Support view

+

{t('timeline.focusDateTitle', { date: formatDateLabel(view.focusDate, locale) })}

+

Use timeline to spot timing risk. Daily work still happens in orders, production, and handoff.

+
+ +
+
+ Open orders + Production board + Handoff
-
+
{t('timeline.summary.overdue')} {view.summary.overdue} @@ -234,7 +242,7 @@ export default async function TimelinePage() {
-
+
diff --git a/components/primary-nav.tsx b/components/primary-nav.tsx index 591f8c8..80f6c8e 100644 --- a/components/primary-nav.tsx +++ b/components/primary-nav.tsx @@ -39,7 +39,7 @@ function NavLink({ return ( {children} diff --git a/docs/mwp-readiness-audit.md b/docs/mwp-readiness-audit.md index 3edff96..c7d8123 100644 --- a/docs/mwp-readiness-audit.md +++ b/docs/mwp-readiness-audit.md @@ -82,6 +82,12 @@ Do not include these in the first deploy readiness scope: - Added production entry links and clearer empty guidance for production boards with no visible orders. - Added handoff entry links and empty-list guidance for WIP, packing, assignment, pickup, and focus-day order watches. +## Product/menu benchmark note + +The current product setup path is intentionally MWP-only. It is meant to confirm basic sellable product names, default units, optional category labels, and active/inactive state so real orders can be captured. It should not be judged as a full POS/menu manager yet. + +Loyverse, Uber Eats, and DiDi Food are useful later benchmarks for product/menu UX patterns such as richer descriptions, prices, images, modifiers, variants, availability, menu grouping, and channel-specific presentation. Those remain post-MWP/beta work for SKOSS. The first deploy should preserve the current principle: product setup helps order capture, but incomplete catalog data must not block daily kitchen work. + ## Recommended next PR Run a first-deploy rehearsal against a fresh non-demo instance: bootstrap, create admin, confirm products/customers, create orders, update production, record WIP, record handoff, and verify browser-print output. Keep the rehearsal focused on operational confidence before adding richer catalog, procurement, inventory, or deployment automation.