74a7c068bc
feat(ux): rename creativity levels with descriptive labels and inline descriptions
...
- "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
2026-04-08 15:03:51 -07:00
e203ad4bdc
fix(a11y): WCAG accessibility improvements across frontend
...
- 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)
2026-04-08 14:35:18 -07:00
793df1b5cf
feat: saved recipes, recipe browser, and recipe detail panel
...
- 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
2026-04-08 14:35:02 -07:00
c064933b14
refactor: use shorter circuitforge_core.api import for feedback router
2026-04-05 21:21:50 -07:00
f3bc796f2c
feat: migrate feedback endpoint to circuitforge-core router
...
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.
2026-04-05 17:57:36 -07:00
6a59c8dfd1
fix: row_factory in _household_store; validate household_id from Heimdall; monkeypatch CLOUD_DATA_ROOT in accept test; add KIWI_BASE_URL to compose.cloud.yml
2026-04-04 22:59:06 -07:00
11a0d1f3a6
feat: handle household invite accept on app load via URL hash
2026-04-04 22:53:55 -07:00
7cce05b95a
feat: household management UI in Settings (Premium-gated)
2026-04-04 22:51:03 -07:00
70b1319b60
feat: add householdAPI typed wrappers to api.ts
2026-04-04 22:48:25 -07:00
c7861344b7
feat: add MessageResponse schema; wire response_model on leave + remove-member endpoints
2026-04-04 22:47:39 -07:00
7650747651
feat: household API endpoints (create, status, invite, accept, leave, remove-member)
2026-04-04 22:45:12 -07:00
dce8d05a09
refactor: use str | None + Field(default_factory=list) in household schemas
2026-04-04 22:41:53 -07:00
2db4de6d8f
feat: add household Pydantic schemas
2026-04-04 22:40:30 -07:00
e605954254
chore: bump circuitforge-core dep to >=0.8.0; fix stale resources imports
...
- 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
2026-04-04 22:39:04 -07:00
ed6813713e
test: use tmp_path for _user_db_path tests; remove duplicate comment
...
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.
2026-04-04 22:38:41 -07:00
9985d12156
feat: extend CloudUser with household_id + update session resolution
...
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.
2026-04-04 22:30:07 -07:00
9602f84e62
feat: add household_invites migration (017)
2026-04-04 22:27:56 -07:00