Item Catalog — UX Baseline References¶
Mapping from each FE page to the chosen-variant React mockup under src/ux-exploration/item-catalog/ (produced by frontend-ux-direction, approved in ui-direction.md § Decisions on 2026-05-21). The action-flow HTML prototypes the UX-direction skill synthesised from are cited only for traceability.
The mockups are the visual + UX baseline, not the spec. They are throwaway: hardcoded strings, no i18n, no Orval, no routing, no permission gating, and no real-component imports for any of the M0-prerequisite stubs. Implementer tickets translate them into real architecture per docs/standards.md and docs/architecture.md. Anything in a mockup that contradicts the BE OpenAPI (openapi/openapi.json) is dropped — those discrepancies are tracked in be-feedback.md.
Page → chosen variant¶
| Page | Chosen variant (source of truth for layout) | HTML prototype (background only) | Use as |
|---|---|---|---|
| ItemListPage | src/ux-exploration/item-catalog/item-list-a.tsx |
ux-tests/prototypes/action-flow-prototypes/02-production-list.html, 05-product-catalog.html |
StatsBar above labelled FilterBar above DataTable above split-pagination card. |
| ItemDetailPage | src/ux-exploration/item-catalog/item-detail-a.tsx |
ux-tests/prototypes/action-flow-prototypes/11-product-detail.html, 03-production-order-detail.html |
2-column grid (1fr main + 380 px side rail). Main: three InfoCards (Item information, Inventory parameters, Description & tags). Side rail: Audit + Activity-placeholder. |
| ItemCreatePage | src/ux-exploration/item-catalog/item-create-a.tsx |
ux-tests/prototypes/action-flow-prototypes/12-product-edit.html |
Single-column form with grouped Fieldset cards (Identity / Classification / Inventory / Description & tags). Sticky <FormActions> bar at the bottom. |
| ItemEditPage | src/ux-exploration/item-catalog/item-edit-a.tsx |
ux-tests/prototypes/action-flow-prototypes/12-product-edit.html |
Same shell as create-a. Identity fieldset shows code / storage_unit / item_type as disabled inputs with a "Locked fields" badge. Editable fieldsets below per forms.md § ItemEditForm. Composite-save dispatch per docs/standards.md § Composite Edits. |
| GroupListPage | src/ux-exploration/item-catalog/item-group-list-a.tsx |
ux-tests/prototypes/action-flow-prototypes/13-ingredient-groups.html |
StatsBar + FilterBar + DataTable + split pagination, like the item list. Row click routes to dedicated detail page. New / Edit via <FormDialog>; Delete via <ConfirmDialog>. |
| GroupDetailPage | src/ux-exploration/item-catalog/item-group-detail.tsx |
— (layout adapted from item-detail-a.tsx) |
Header card + 2-column grid. Main: items-in-group DataTable + split pagination. Side rail: Group metadata card + Audit card. Edit reuses the same <ItemGroupForm> in <FormDialog>. |
| ItemImportPage | src/ux-exploration/item-catalog/item-import-a.tsx |
— (no HTML prototype; designed during UX-direction phase per IC-UC-06) | Horizontal <Stepper> across the top, single panel per step (Download template → Upload file → Review → Confirm). Errors in Step 2 block advancing. |
The 7 chosen TSX files plus _stubs.tsx are mounted under the dev-only /ux/item-catalog/... aggregator route — they exist only to support side-by-side review during planning and implementation kick-off. The rejected *-b.tsx variants stay in the folder for reference until the last ticket lands, then the whole src/ux-exploration/item-catalog/ directory is removed (see § Lifecycle).
What to ignore in the mockups¶
These are intentional shortcuts in the prototypes. Implementer tickets must NOT preserve them:
- Hardcoded English strings. Replaced by i18n keys per
i18n-keys.md. Never hand-write user-facing copy in components. - Hardcoded example data arrays. Replaced by Orval hooks per
data-fetching.md. The mockups embed example rows so the layout reads; real pages render from server state. - Inline
MISSING_COMPONENT_*stubs from_stubs.tsx. Replaced by either an existing component (cross-checked againstsrc/components/) or an M0 prerequisite ticket. Seefe-plan.md§ Component prerequisites for the validated list. - Inline
<table>markup with localTh/Td/ActionBtnhelpers. Replaced by the reusable<DataTable>(M0 prereq #1) perfe-plan.md§ Component prerequisites anddocs/standards.md. List pages pass a typedcolumnsarray, not row markup. - No
<RequirePermission>/<PermissionGate>wrapping. Real implementations gate perpages.md§ Permission tables anddocs/standards.md§ Permission-Gated UI. - No routing, no URL-bound search params. Real implementations read filter state from URL via
Route.useSearch()perroutes.md§ Search-param schemas. AppShellis wrapped on the dev/ux/...aggregator route only. Real pages are mounted undersrc/routes/_auth/catalog/...and the shell is owned by the route tree, not the page component.- CSS-variable colour references in the mockups for
StatusBadgevariants (--status-success-*,--status-warning-*, etc.) that aren't currently defined insrc/styles/tokens.css—ui-direction.md§ Cross-cutting decisions records this as a separate foundation concern. Implementer tickets useStatusBadgeas-is; the badge's known limitation is fixed in a foundation ticket, not in this module. - Any field or action the BE OpenAPI does not expose. Cross-checked in Phase 1.5 of planning and tracked in
be-feedback.md. Implementer tickets do not ship unsupported controls. Theis_systemflag is consumed for read-only state on the detail page but no FE action ever modifies it. - Responsive treatment. The chosen-variant TSX files were authored before the responsive policy in
../../responsive-strategy.mdshipped, so they are desktop-only baselines — no<md/<smadaptation, no<DesktopOnly>gate, no<DataCardList>swap, noSheet-mode FilterBar. Implementer tickets must still adapt their real components to the per-page bucket declared inpages.md§ Responsive buckets, leaning on the M8 RF foundation primitives (useBreakpoint,<DataCardList>,<FilterBar>-as-Sheet,Steppervertical-at-md,FormActionsreverse-stack, …). The TSX baselines themselves are refreshed with responsive overlays by GRF-114; until that ships, prefer the bucket table inpages.mdover the TSX when the two disagree on phone behaviour.
Responsive variants (pending GRF-114)¶
The chosen-variant TSX files under src/ux-exploration/item-catalog/ synthesise layout, sections, and control set at desktop widths only. The per-page responsive contract lives in ./pages.md § Responsive buckets — that table is authoritative until GRF-114 updates the TSX prototypes to demo the responsive treatment side-by-side at sm / md / lg.
Per-page expectations the implementing tickets need to deliver even before the TSX is refreshed:
| Page | Responsive deviation from current TSX |
|---|---|
| ItemListPage | Real implementation swaps <DataTable> ↔ <DataCardList> at <md and collapses <FilterBar> into a Sheet trigger at <md. TSX renders neither. |
| ItemDetailPage | 2-col grid collapses to single column at <md; the side rail stacks below. TSX leaves the grid hard-coded at all widths. |
| ItemCreatePage | <FormActions> reverse-stacks with primary on top + full-width at <sm. TSX hard-codes a horizontal row. |
| ItemEditPage | Same as create plus locked-fieldset hint remains anchored to the top of the Identity card after stacking. TSX shows the row layout only. |
| GroupListPage | Same list-page swaps as ItemListPage. <FormDialog> for create/edit goes fullscreen at <sm. TSX renders the dialog modal at every width. |
| GroupDetailPage | Items-in-group <DataTable> swaps to <DataCardList> at <md; metadata + audit cards stack. TSX hard-codes the grid. |
| ItemImportPage | Real implementation renders <DesktopOnly> at <sm with continue-anyway; once continued, <Stepper> renders vertical at <md, <FileDropzone> swaps to tap-to-browse on touch, <ImportErrorList> rows stack. TSX is horizontal-only and has no soft-gate. |
Lifecycle¶
The src/ux-exploration/item-catalog/ files exist as a visual baseline only until the chosen variants have been translated into real features/item-catalog/ code. Once every page in this module has shipped per its tickets, the worktree that lands the last page deletes src/ux-exploration/item-catalog/ and removes the corresponding rows from the /ux/... aggregator route under src/routes/_dev/.
The planner never modifies these files. The chosen variants are read structurally (sections, controls, imports) during planning; the rejected *-b.tsx variants are referenced only for traceability and are not opened during implementation.