Files
SlabUploader/docs/UX-DESIGN.md
T
grokbot_ty 8d65984936 docs: single Gates home and honest UX ownership
Move Gate A/B/C meanings to IMPL-PLAN. List UX-DESIGN as non-normative with
signed UX.md winning conflicts. List INVENTORY in AGENTS §0.
2026-09-09 19:45:25 +00:00

22 KiB
Raw Blame History

UX Design — wireframes (non-normative)

Status: DESIGN · non-normative · 2026-09-03 · SlabUploader

Not normative. Signed presentation SoT is docs/UX.md (phone and PC browsers). If a wireframe here disagrees with docs/UX.md, AGENTS, or TECH-SPEC, follow those and ignore the wireframe. These ASCII screens are layout sketches for discussion, drawn at a 375px phone width; they do not lock mobile-only or override the phone+PC matrix.

Functional rules live in docs/UX.md. Confidence gating: AGENTS.md §6. Data model and status machine: docs/DATA-MODEL.md.


Screen inventory

  1. Settings (once)
  2. First-run guidance (once per device)
  3. Capture
  4. Length axis
  5. Type values
  6. Review
  7. Title / Description
  8. Publish
  9. Error states

1. Settings

One-time setup. All screen. Back to home after save.

┌─────────────────────────────────────┐
│ Settings                           │
├─────────────────────────────────────┤
│ Store URL                          │
│ https://www.whidbeywoodstore.com   │
│                                    │
│ WP Username                        │
│ [ slab-uploader          ]         │
│ Application Password               │
│ [ ••••••••••••••••••••  ]           │
│ [ Test Connection ]                │
│                                    │
│ Inference                          │
│ Endpoint: [ http://192.168.x.x:v1 ]│
│ API Key:  [ ••••••••••••••••••••  ]│
│ [ Test Connection ]                │
│ [ Enable Vision  ]                 │
│ [ Enable Content ]                │
│                                    │
│ Pricing Rules                      │
│ [+ Add Rule] [Edit]               │
│                                    │
│ Publish Status: [ Draft ▼ ]        │
│ Brand Voice: [ Premium lumber... ]│
│ GEO Context: [ Locally milled... ]│
│                                    │
│ [ Reset Capture Knobs ]           │
│ [ Refresh Store Lists ]          │
└─────────────────────────────────────┘

Interaction:

  • Test Connection (WP): attempts REST v3 auth, shows green check or red error. Always pulls fresh taxonomy on success.
  • Test Connection (Inference): two-turn probe. Shows stateful/stateless/fail.
  • Enable Vision: feature flag for Call 1. Defaults off.
  • Enable Content: feature flag for Call 2. Defaults off.
  • Publish Status: dropdown, default Draft.

2. First-run guidance

One short card shown on first launch. Dismissed via swipe or tap.

┌─────────────────────────────────────┐
│                                    │
│  First run on the floor             │
│                                    │
│  Lay a green or black sheet         │
│  under the slab.                    │
│                                    │
│  Shoot from above with the lens     │
│  parallel to the face.              │
│                                    │
│  Put a tape measure in the shot     │
│  so you can type the length later.  │
│                                    │
│  ──────────────────────────────────  │
│  [ Got it ]                        │
│                                    │
└─────────────────────────────────────┘

3. Capture

Camera view. Source photo on screen. Mask overlay draws on the source. Four knobs sit next to the overlay.

┌─────────────────────────────────────┐
│ Capture                        [R]  │
│ ┌─────────────────────────────────┐ │
│ │                                │ │
│ │        [ SOURCE PHOTO ]        │ │
│ │                                │ │
│ │       ~ mask overlay ~         │ │
│ │                                │ │
│ └─────────────────────────────────┘ │
│                                    │
│ Sheet: [ Auto ▼ ]                 │
│ Sensitivity: [◄─────●───►]        │
│ Edge Offset: [◄───●───►]          │
│ Feather:     [◄─────●───►]        │
│                                    │
│ [ Retake ]              [ Confirm ] │
└─────────────────────────────────────┘

R = retake current photo (new shot, same knobs)

Interaction:

  • Moving any knob immediately re-runs background removal on the current photo.
  • The overlay refreshes on the source image. No apply/save step. No server round-trip.
  • Confirm moves to length axis. Retake takes a new photo.
  • Knobs persist in localStorage until reset-to-default in Settings.

4. Length axis

Bounding rectangle and length axis drawn over the confirmed mask. Width sample lines every 6 inches.

┌─────────────────────────────────────┐
│ Length Axis                        │
│ ┌─────────────────────────────────┐ │
│ │                                │ │
│ │       ┌───────────────┐       │ │
│ │       │   SLAB MASK   │       │ │
│ │       │  ──── AXIS ── │       │ │
│ │       │  ┌──┐ ┌──┐ ┌──┐       │ │
│ │       │  │ 6"│ │6"│ │6"│       │ │
│ │       └───────────────┘       │ │
│ │                                │ │
│ └─────────────────────────────────┘ │
│                                    │
│ [ Rotate ↻ ]        [ Confirm ]    │
└─────────────────────────────────────┘

Interaction:

  • Rotate adjusts the axis. Width samples and sqft update live.
  • On nearly square slabs, user picks which side is length.
  • Confirm moves to type values.

5. Type values

Manual values win. Phone computes sqft, bdft, widths.

┌─────────────────────────────────────┐
│ Type Values                        │
│                                    │
│ SKU                                │
│ [ BW-0042            ]             │
│                                    │
│ Length (inches)                    │
│ [ 96.0             ]             │
│                                    │
│ Thickness (inches)                 │
│ [ 1.5              ]             │
│                                    │
│ Computed (read-only)               │
│ sqft: 0.64   bdft: 0.96           │
│ widths: 14.0 — 22.0 (avg 18.2)    │
│                                    │
│ [ Done ]                          │
└─────────────────────────────────────┘

Interaction:

  • SKU: [A-Z0-9-]{3,24}. Field-exit check against validation rules.
  • Length: 1/8" step. Typing recalculates widths/sqft/bdft live.
  • Thickness: 1/8" step pick.
  • Done moves to review screen. Draft uploads, status → calibrated.

6. Review

All store fields. Per-field nudges for missing mandatory fields. Vision pre-populates when confidence ≥ 0.7. Empty when below.

┌─────────────────────────────────────┐
│ Review                           [X]│
│ ──────────────────────────────────  │
│ Photos                             │
│ [ ▢ ] [ ▢ ] [ ▢ ] [ ▢ ] [ ▢ ]     │
│ (processed PNG thumbnails)          │
│ ──────────────────────────────────  │
│ SKU: BW-0042                       │
│ Length: 96.0"  Thickness: 1.5"     │
│ sqft: 0.64   bdft: 0.96            │
│ Widths: 14.0 — 22.0 (avg 18.2)     │
│ ──────────────────────────────────  │
│ Species  [ Black Walnut ▼ ]        │
│ Wood Cat [ Live edge ▼ ]          │
│ Edge Type [ Live Edge ▼ ]         │
│ Figure   [ Cathedral ▼ ]          │
│ Grade    [ Premium ▼ ]           │
│ Fig Tags [ Cathedral ▼ ]          │
│ Feat Tags [ None ▼ ]             │
│ ──────────────────────────────────  │
│ Thickness Band: [ 1"–1 1/2" ▼ ]    │
│ Moisture:     [ Kiln-dried ▼ ]     │
│ ──────────────────────────────────  │
│ Price: [ $12.00 ] (rec $12.00)    │
│ ──────────────────────────────────  │
│ [ Review Title / Desc ]  [ Publish ]│
└─────────────────────────────────────┘

X = exit review, returns to calibrated draft

Per-field gating:

  • Each missing mandatory field shows an inline empty state as the user works.
  • Below-threshold Call 1 leaves taxonomy fields empty. The user sees the empty field with a nudge: "Select species" or "Select a figure type".
  • Below-threshold leaves taxonomy fields empty. The user must manually fill species, wood category, edge type, figure, grade, fig-* tags, and grade to reach ready.
  • Submit-time validation only fires after all fields are filled.

Pre-populated field appearance:

  • Filled by Call 1: field shows the value with a small "AI" badge. User can tap to change. Badge disappears on edit.
  • User-filled: no badge.

Gating details:

  • Mandatory: exactly one species, ≥1 wood category, 1 edge type, ≥1 figure, ≥1 fig-* tag, ≥1 grade, thickness band, moisture, price, SKU, length, thickness, sqft/bdft/widths, ≥1 inventory PNG.
  • Optional: feat-* tags (zero is fine).
  • Publish button is disabled until all mandatory fields are filled.

7. Title / Description

Type or generate. Generate text is user-initiated.

┌─────────────────────────────────────┐
│ Title & Description                │
│ ──────────────────────────────────  │
│ Title                              │
│ [ Black Walnut 8ft × 18.2in Slab... │
│ ──────────────────────────────────  │
│ Short Title                        │
│ [ Black Walnut Slab — Cathedral ]  │
│ ──────────────────────────────────  │
│ Description                        │
│ [ A one-of-a-one cathedral black... │
│ ──────────────────────────────────  │
│ [ Generate Text ]  [ Done ]        │
└─────────────────────────────────────┘

Interaction:

  • Generate Text: triggers Call 2. Button disabled if content LLM is off or inference endpoint unreachable. LLM writes prose only. Templates inject deterministic numbers. User can always edit the result.
  • Done: returns to review. Title/description stored on the slab.

8. Publish

Status polling. Result shown inline.

┌─────────────────────────────────────┐
│ Publishing...                      │
│                                    │
│  ──────── ● ────────               │
│                                    │
│  Creating store listing...         │
│  Please wait.                      │
│                                    │
└─────────────────────────────────────┘

Success:

┌─────────────────────────────────────┐
│ Published!                         │
│                                    │
│  Listing created as draft.         │
│  SKU: BW-0042                      │
│  Store product ID: 1042            │
│                                    │
│  [ Open in Store ]  [ Done ]       │
└─────────────────────────────────────┘

Failed:

┌─────────────────────────────────────┐
│ Publish Failed                     │
│                                    │
│  The store rejected the listing.   │
│  Error shown inline on the field.   │
│                                    │
│  [ Retry ]  [ Back to Review ]      │
└─────────────────────────────────────┘

9. Error and empty states

9.1 Mask failure

┌─────────────────────────────────────┐
│ Mask Quality                        │
│ ──────────────────────────────────  │
│ Cannot isolate the slab edge.       │
│ Adjust the knobs or retake.         │
│ ──────────────────────────────────  │
│ [ Retake ]                        │
└─────────────────────────────────────┘

9.2 Axis misalignment

┌─────────────────────────────────────┐
│ Axis Check                          │
│ ──────────────────────────────────  │
│ Rotate the axis to match the        │
│ prevailing length of the slab.      │
│ ──────────────────────────────────  │
│ [ Rotate ↻ ]                      │
└─────────────────────────────────────┘

9.3 Source too small after crop

┌─────────────────────────────────────┐
│ Photo Quality                       │
│ ──────────────────────────────────  │
│ Photo will be too small after       │
│ cropping. Please retake with a      │
│ closer shot.                        │
│ ──────────────────────────────────  │
│ [ Retake ]                        │
└─────────────────────────────────────┘

9.4 SKU duplicate

┌─────────────────────────────────────┐
│ SKU Check                           │
│ ──────────────────────────────────  │
│ This SKU already exists in the      │
│ store (any status).                 │
│ ──────────────────────────────────  │
│ [ Edit SKU ]  [ Open Existing ]     │
└─────────────────────────────────────┘

9.5 Stale taxonomy value

┌─────────────────────────────────────┐
│ Field Check                         │
│ ──────────────────────────────────  │
│ This value is no longer valid.      │
│ Pick from the current list.         │
│ ──────────────────────────────────  │
│ [ Refresh Store Lists ]           │
└─────────────────────────────────────┘

9.6 Store unreachable

┌─────────────────────────────────────┐
│ Connection                          │
│ ──────────────────────────────────  │
│ Cannot reach the store. Check your  │
│ connection and settings.            │
│ ──────────────────────────────────  │
│ [ Retry ]  [ Open Settings ]       │
└─────────────────────────────────────┘

9.7 Vision off or below threshold

┌─────────────────────────────────────┐
│ Review (vision off)                │
│ ──────────────────────────────────  │
│ Species  [ Select ▼ ]  ◉ Select species
│ Wood Cat [ Select ▼ ]  ◉ Select category
│ Edge Type [ Select ▼ ]  ◉ Select edge
│ Figure   [ Select ▼ ]  ◉ Select figure
│ ──────────────────────────────────  │
└─────────────────────────────────────┘

◉ = inline nudge (per-field)

Interaction patterns

Per-field gating (review screen)

  • Each mandatory field that is empty shows an inline nudge as the user works.
  • The nudge is a small text hint to the right of the field.
  • Below-threshold Call 1 leaves fields empty with nudges visible.
  • Fill the field to dismiss the nudge.
  • Publish button stays disabled until all mandatory fields are filled.

Pre-populated field state

  • Fields filled by Call 1 show the value with an "AI" badge.
  • User can tap the field to change it. The badge disappears on edit.
  • User-filled fields have no badge.

Knob interaction (capture screen)

  • All four knobs are on the capture screen next to the overlay.
  • Moving a knob immediately re-runs background removal.
  • No apply/save step. No server round-trip for mask tuning.

Axis rotation

  • Drag or tap to rotate the axis. Width samples and sqft update live.
  • Confirm locks the axis for measurement.

Generate text

  • Button only appears if content LLM is enabled and inference is reachable.
  • Disabled if the text service is down.
  • Never runs automatically. User taps it.

Publish flow

  • Tap Publish. Status moves to publishing. Poll for result.
  • Success: show result, offer to open in store.
  • Failed: show error detail, keep draft and photos, allow retry.
  • SLAB-UAT-* SKUs always create as Woo draft regardless of settings.

Browser compatibility gate

Shown on load if browser lacks required APIs.

┌─────────────────────────────────────┐
│ Browser Update                      │
│ ──────────────────────────────────  │
│ This app requires a recent browser. │
│ Please update Safari or Chrome,     │
│ then try again.                     │
│ ──────────────────────────────────  │
│ [ Update Browser ]                  │
└─────────────────────────────────────┘

UAT test cases (derived from wireframes)

  1. Settings once: enter WP credentials, test connection, taxonomy syncs.
  2. First-run guidance: card shows and dismisses.
  3. Capture: take photo, mask overlays, adjust knob, overlay refreshes live, confirm.
  4. Length axis: bounding rect draws, rotate axis, confirm, widths update.
  5. Type values: enter SKU/length/thickness, computed values appear, done.
  6. Review — vision on, ≥ 0.7: taxonomy fields pre-filled with AI badge, editable.
  7. Review — vision on, < 0.7: taxonomy fields empty, per-field nudges visible, user fills manually.
  8. Review — vision off: all taxonomy fields empty, per-field nudges visible, user fills manually.
  9. Publish — success: draft created, product ID stored, images purged.
  10. Publish — duplicate SKU: error on SKU field, edit SKU or open existing.
  11. Publish — stale taxonomy: error on field, refresh store lists, pick current option.
  12. Publish — SLAB-UAT-*: always creates as draft regardless of settings.
  13. Generate text: button visible when enabled, disabled when service down, LLM prose injected.
  14. Retake paths: mask failure → retake, source too small → retake.