Design redesign (dark-first) — long-lived integration PR#89
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…rred Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Manual Test Plan —
|
Manual Test Plan —
|
Mirrors chunk-01 blocks so every nav destination is populated for the nav-chrome test plan (PR #89 comment). Seeds the local worktree dev DB only. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Manual Test Plan —
|
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Use userData?.sharedRatings directly (structurally identical to Stars' SharedRating[]) instead of an `as` cast; remove the unused deleteRecipe import in the test. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… prop Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…te nav) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…r.push) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s/components Apply dark design tokens to src/app/recipes/loading.tsx (token-colored skeletons matching the new list layout) and error.tsx (danger-muted Alert matching sibling error boundaries). Delete 10 orphaned recipe components (RecipeViewDialog, RecipeEditorDialog, RecipeSharingSection, RecipeFilterBar, RecipeStarRating, RecipeTagsEditor, RecipeIngredients, RecipeInstructionsView, IngredientInput, IngredientGroup) and their 10 test files; all replaced by components/recipes/* in earlier tasks. Grep-confirmed no remaining importers outside the deleted set. EmojiPicker.tsx kept (shopping-lists still imports it). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- test-001: add delete-flow test to RecipeDetail (⋯ menu → confirm → deleteRecipe + push) - architecture-001: dynamic-import RecipeEditor in RecipeDetail + RecipeSharingDialog/RecipeEditor in recipes/page.tsx (ssr:false) - test-003/004: add beforeEach(vi.clearAllMocks) to RecipeFilterBar and RecipeSharingDialog test files - code-001: fix DotBadge comment to say "danger color" not "orange dot" - code-002: add rationale comment above the useMemo dep array in RecipeEditor (removed stale eslint-disable) - code-003: fix back-button aria-label from "‹ Recipes" to "Back to recipes" - code-004: remove dead emojiOf indirection in EmojiPicker; use e.emoji directly - code-005: always render emoji tile in RecipeDetail with recipe.emoji || '🍽️' fallback - test-005: push.mockClear() already at top-level beforeEach (no change needed) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…i/icons-material Replaced all remaining @mui/icons-material imports in the 5 call sites (DialogTitle, recipes/page, CachedAvatar, MealPlanBrowser, StoreHistoryDialog) with the project's Icon component. Then uninstalled the dependency via npm uninstall — no more MUI icon font bundle in the build. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…feature atoms) Both components are consumed by nav, marketing, user-management, and app pages — making them nav-internal was an incorrect home. git mv the components and their tests to ui/, update all 10 importers (using @/ paths throughout), and re-export from ui/index.ts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…al qualification Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Final Qualification Checklist — overnight autonomous run (chunks 8–11)All four remaining chunks are implemented, reviewed, tagged, and browser-verified by Claude (2026-06-10, per the overnight directive). Everything below is what still needs your eyes before PR #89 leaves draft. Chunk 8 — User Management & Pending Approval
Chunk 9 — Settings placeholder
Chunk 10 — Marketing / signed-out home
Chunk 11 — Cleanup
After your pass
Generated by the overnight autonomous run, 2026-06-10. Full detail: |
…erified findings) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Display reads plan.items mealType:'staples' entry (same source meal-plan-to-shopping-list consumes), falling back to template.weeklyStaples only for legacy plans - Save calls PUT /api/meal-plans/<id> via updateMealPlan, never /api/meal-plans/template - Removes updateMealPlanTemplate import (no longer used in PlanDetail) - Snackbar error feedback on failed staples save - Tests: plan-side staples rendered over snapshot, PUT target verified, Snackbar on failure Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…failed save (scrub fix-now 2) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…x-now 3) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…(scrub follow-up 4) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…up 7) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tate (scrub) - Snapshot last non-empty title/body/labels/color in a ref so the closing animation plays with content intact even when the consumer nulls dialog data in the same render that sets open=false. - Add optional busy prop: disables both buttons, shows CircularProgress overlay on the confirm button (label stays in DOM for a11y via aria-label), ignores onClose while active. Also auto-guards async onConfirm via internal busy state. - Extend confirmColor to accept 'warning' (needed for Leave Store migration). - Simplify user-management/page.tsx: remove hand-rolled lastDialogDataRef now that ConfirmDialog handles the snapshot internally. - New tests: snapshot-through-exit, busy state. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s to ui/ConfirmDialog (scrub follow-up 5) Replace three hand-rolled full-screen-on-mobile Dialog confirms with the ConfirmDialog bottom-sheet/dialog component: - Delete Store (shopping-lists): preserves the ReactNode body with the shared-users Alert warning; confirmColor="error" - Leave Store (shopping-lists): confirmColor="warning" (now supported) - Leave Shared Meal Plans (meal-plans): confirmColor="error" Remove now-unused MUI Dialog, DialogContent, Typography from both pages' imports, plus the custom DialogTitle/DialogActions ui wrappers and responsiveDialogStyle from each import set. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…crub follow-up 2)
Sync recipes list search, page, tags and ratings to URL query params via
router.replace({ scroll: false }) so navigating to a detail and returning via
browser back or the '< Recipes' link restores the full filter/page state.
RecipeDetail back affordance now uses useBackOrHome('/recipes') so browser back
preserves URL params naturally; fresh-tab fallback pushes bare /recipes.
useServerPagination gains an initialPage option and useDebouncedSearch gains an
initialValue option (both additive, no existing consumers affected).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eal-plans)
- BottomNav: avatar slot goes active (ink text + aria-current) when
useActiveSection() returns null (system pages) or 'pantry' (section
with no bottom slot); add two tests covering the behaviour.
- recipes/page: fix title fontFamily hardcode → var(--font-display);
drop one-off #d4944f hover override from New recipe CTA.
- recipes/page + shopping-lists/page: replace stock blue Alert empty
states with the established raised-box idiom (surface.raised + border.subtle).
- shopping-lists/page: restyle Delete Store ConfirmDialog shared-user
warning from Alert severity="warning" to plain warn-toned Box.
- pantry/page: add color="primary" + mobile shed props (siblingCount,
boundaryCount, size, flexWrap:nowrap) to the MuiPagination pager.
- meal-plans/page: add letterSpacing:'-0.02em' to "Your plans" h1.
- PlanDetail + TemplateSettings: replace literal '‹' glyph with
<Icon name="chevron_left" size={18}/> matching RecipeDetail idiom.
- user-management/page: render "pending approval" at md+, "pending"
on xs via two display-gated spans.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- theme.ts: add h5 (18px/700/-0.01em) and h6 (16px/700/-0.01em) display-font overrides continuing the h3/h4 ramp, closing the rem-clipping trap for any MUI component that defaults to h5/h6. - ItemEditorDialog: replace variant="h6" Typography title with the sibling px display-font Box pattern (fontFamily:var(--font-display), fontSize:18, fontWeight:700) matching StoreEditorDialog et al.; remove now-unused Typography import. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Apply xs full-frame overrides (margin 0, 100% width/height, borderRadius 0) matching the established sibling pattern from ItemEditorDialog / StoreEditorDialog. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…g bottom sheet (scrub) - Create SheetGrabber (centered 36×4 bar, rgba(255,255,255,0.18), borderRadius 2px, pb 10px) matching the ConfirmDialog archetype; export from ui/index.ts - Use SheetGrabber in ConfirmDialog replacing its inline handle - Replace 5 drifted handles (tokens.border.strong tint, bare-numeric borderRadius) with SheetGrabber: ShareMealPlansDialog, UnitConflictDialog, FinishShopConfirm, RecipeFilterBar, RecipeSharingDialog - Add SheetGrabber + boxShadow:tokens.shadow.sheet to 3 sheets that omitted it: QtyEditor, UnitEditor, EmojiPicker - MealPlanCreateDialog: mobile bottom sheet (grab handle + Cancel/title/Create header row) using Dialog sx override pattern matching MealEditorDialog; desktop presentation unchanged; add mobile matchMedia-stubbed test asserting sheet title and Create button Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rub follow-up 9) Switch UnitEditor selected bg (alpha 16%), radio ring/dot, and QtyEditor Done button from tokens.section.plans / tokens.accent.muted to theme.palette.primary.main — renders plans-blue on /meal-plans (primary unchanged) and correct orange inside /recipes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ary (scrub follow-up 6) Rebuilt pantry/loading.tsx to skeleton the redesigned PantryListView geometry (title/subtitle header, 40px bordered search, flat list block; maxWidth md, tokens throughout). Rebuilt shopping-lists/loading.tsx to skeleton the StoreListView store-index shell (title/subtitle header, 40px desktop search capped at 360px, flat store-list block; maxWidth xl). Rebuilt shopping-lists/error.tsx to use the same tokenized danger Alert pattern as meal-plans/error.tsx instead of the bare untokenized Alert. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rub follow-ups 8, 18) Deleted AdminOnly.tsx and SessionWrapper.tsx (zero importers verified). Deleted src/lib/hooks/use-food-items.ts and its test (only the barrel and test referenced it). Removed the barrel re-export. Deleted the POST handler from the user/settings route (zero client callers outside the route itself; GET retained for meal-plans/page.tsx; defaultMealPlanOwner READ path untouched). Updated route.test.ts to drop the POST test cases. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ow-ups 16, 17) architecture.md: rewrote ThemeContext section to reflect the always-dark thin wrapper (ThemeProviderWrapper — no toggle, no settings fetch, no cookies; User.theme plumbing noted as preserved). Deleted the stale useTheme hook row. Updated Feature Routes Settings row and the loading/error-boundary caveat to match which routes actually have those files. product.md: updated Design System (dark-first, Bricolage Grotesque + Outfit, 10px button radius, design-tokens.ts source of truth), Responsive Design (TopNav/BottomNav app shell), Loading/Error States, and Settings core feature description. CLAUDE.md: softened the loading/error blanket claim to name the four routes that have them. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… page param, test hardening) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Long-lived draft integration PR for the dark-first redesign migration. Lands surface-by-surface in chunks; stays in draft until the final squash merge into
main.docs/superpowers/specs/2026-05-28-design-redesign-migration-design.mddocs/superpowers/plans/redesign-progress.mddocs/design/weekly-eats-redesign/Per-chunk manual-test checklists are posted as their own slot comments (from Chunk 2 onward).
Chunk 1 — Foundation
Dark-first token + theme + typography + icon foundation; light mode dropped (plumbing preserved); one-time redesign setup.
src/lib/design-tokens.ts— canonical dark tokenssrc/lib/theme.ts— single dark MUI theme bridging tokens + custom palette keys/typography variants (src/types/mui.d.ts);responsiveDialogStylepreserved; tabular-nums applied app-widenext/font; Material Symbols via stylesheet<link>(next/font lacks the face)src/components/ui/Icon.tsx— decorative-by-default Material Symbols icon (realSxProps)ThemeColorMetahard-dark, Settings → placeholderreview-code --baseoverride, Vercel beta deploymentExisting screens render with new tokens/fonts (rough/mixed look interim — expected; surfaces land in later chunks). Server-side approval enforcement is handled separately.
🤖 Generated with Claude Code