feat: Phase 2 — saved recipes, browser, accessibility, level UX #69

Merged
pyr0ball merged 17 commits from feature/orch-auto-lifecycle into main 2026-04-08 15:13:45 -07:00
Owner

Summary

  • Saved recipes: save/unsave, star ratings, notes, tags, collections (migrations 018–020)
  • Recipe browser: domain/category browsing with pantry match badges and pagination
  • Recipe detail panel: full directions, ingredient checklist, swap candidates, prep notes
  • Accessibility (WCAG): keyboard focus rings, icon-only button labels, modal focus management, tab ARIA semantics, aria-live results announcer, prefers-reduced-motion guard
  • Level UX: descriptive names (Use What I Have / Allow Swaps / Get Creative / Surprise Me) with inline descriptions

Test plan

  • Save a recipe from Find and Browse tabs
  • Edit saved recipe (rating, notes, tags, collection)
  • Browse by domain and category; verify pantry match badges
  • Open recipe detail panel; check ingredient checklist and directions
  • Keyboard-navigate the tab bar with arrow keys
  • Tab through the page — verify focus ring visible on all buttons
  • Screen reader: verify icon buttons announce contextual labels
  • Switch creativity levels — verify description updates below selector
  • Level 4 confirmation checkbox present and required
## Summary - **Saved recipes**: save/unsave, star ratings, notes, tags, collections (migrations 018–020) - **Recipe browser**: domain/category browsing with pantry match badges and pagination - **Recipe detail panel**: full directions, ingredient checklist, swap candidates, prep notes - **Accessibility (WCAG)**: keyboard focus rings, icon-only button labels, modal focus management, tab ARIA semantics, aria-live results announcer, prefers-reduced-motion guard - **Level UX**: descriptive names (Use What I Have / Allow Swaps / Get Creative / Surprise Me) with inline descriptions ## Test plan - [ ] Save a recipe from Find and Browse tabs - [ ] Edit saved recipe (rating, notes, tags, collection) - [ ] Browse by domain and category; verify pantry match badges - [ ] Open recipe detail panel; check ingredient checklist and directions - [ ] Keyboard-navigate the tab bar with arrow keys - [ ] Tab through the page — verify focus ring visible on all buttons - [ ] Screen reader: verify icon buttons announce contextual labels - [ ] Switch creativity levels — verify description updates below selector - [ ] Level 4 confirmation checkbox present and required
pyr0ball added 17 commits 2026-04-08 15:04:23 -07:00
Add household_id and is_household_owner fields to CloudUser dataclass.
Update _user_db_path to route household members to a shared DB path.
Update _fetch_cloud_tier to return a 3-tuple and cache a dict.
Update get_session to unpack and propagate household fields.
Patch _user_db_path tests to monkeypatch CLOUD_DATA_ROOT onto a
tmp_path so they never touch /devl or any real filesystem path.
Remove duplicate X-Real-IP comment block in cloud_session.get_session.
- pyproject.toml: circuitforge-core>=0.6.0 → >=0.8.0 (orch split)
- vl_model.py: circuitforge_core.resources → circuitforge_orch.client
- llm_recipe.py: circuitforge_core.resources → circuitforge_orch.client
Replace hand-rolled feedback.py with make_feedback_router() from
circuitforge_core.api.feedback. Update tests to mount the shared
router on a minimal FastAPI app and mock at the core module level.
- Saved recipes: save/unsave, star rating, notes, tags, collections (migrations 018-020)
- Recipe browser: domain/category browsing with pantry match badges, pagination
- Recipe detail panel: full directions, ingredient checklist, swap candidates, prep notes
- Grocery links: affiliate links for missing ingredients
- Nutrition filters and display chips on recipe cards
- Bookmark toggle persisted to saved_recipes table
- Tier gates on saved recipes (paid) and collections (premium)
- Browser telemetry for domain/category click tracking
- Cloud compose: CLOUD_DATA_ROOT volume mount for per-user SQLite trees
- manage.sh: cf-orch agent sidecar in local stack
- README: updated feature list and stack description
- Global :focus-visible ring in theme.css — covers all interactive elements
  with keyboard-nav focus ring without affecting mouse/touch users
- Removed pulse-urgent animation (safety policy violation — infinite animation)
- Global prefers-reduced-motion guard suppresses all animations system-wide
- Added .sr-only utility class for screen-reader-only content
- Tab bar (RecipesView): role=tablist/tab/tabpanel + aria-selected + arrow key nav
- Modal focus management: trap focus on open, restore on close, Escape to dismiss
  (SaveRecipeModal, RecipeDetailPanel, SavedRecipesPanel new-collection dialog)
- aria-modal=true on all modal dialogs
- Icon-only buttons now have contextual aria-labels:
  chip-remove: "Remove constraint: vegetarian" / "Remove allergy: peanuts"
  bookmark: "Bookmark: {title}" / "Remove bookmark: {title}"
  dismiss: "Hide recipe: {title}"
  browser save toggle: "Save recipe: {title}" / "Edit saved recipe: {title}"
- InventoryList qty +/- buttons: aria-label="Increase/Decrease quantity"
- Quantity number inputs: aria-label="Quantity"
- Select elements (SavedRecipesPanel): labelled via .sr-only for-id pattern
- Star rating group: role=group + aria-labelledby; each star: aria-pressed
- Ingredient checkboxes: label wraps input + span (label association fix)
- aria-live="polite" announcer for dynamic recipe results count
- Dynamic aria-labels on status messages (role=alert/status + aria-live)
- "Use What I Have" / "Allow Swaps" / "Get Creative" / "Surprise Me 🎲"
- Active level shows a one-liner description beneath the selector
- Hover tooltips repeat the description for mouse users
- Label changed from "Creativity Level" to "How far should we stretch?"
- Wildcard confirmation copy updated to match new framing
pyr0ball merged commit 3530071187 into main 2026-04-08 15:13:45 -07:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/kiwi#69
No description provided.