Parent
#44
What to build
Final polish pass: first-time empty state, category color bleeding into item backgrounds, remaining tests, and edge-case hardening.
First-time empty state: When the todo panel is opened and there are zero categories, show a subtle centered prompt: "No categories yet. Click + to create one." This disappears once the first category is created.
Color bleed: Each category's color is applied as a full tint to the header background. Items within the category get a lighter variant of the same color as a subtle background. Use CSS color-mix or opacity to derive the lighter variant. This creates a visual scanning aid.
Remaining tests: Fill in any missing coverage from prior slices. Focus on todoStore edge cases:
- Empty state transitions
- Invalid operations (deleting non-empty category, cycling non-existent item)
- Reorder with gaps
- Concurrent mutations (debounced write handling)
Edge cases:
- Sidebar reopens to last state (not reset)
- Markdown XSS safety (no raw HTML injection)
- Empty item title handling (prevent creation with empty title)
- Very long category names (truncation)
Acceptance criteria
Blocked by
Serves as the integration and polish slice. All prior slices should be merged before starting this one.
Parent
#44
What to build
Final polish pass: first-time empty state, category color bleeding into item backgrounds, remaining tests, and edge-case hardening.
First-time empty state: When the todo panel is opened and there are zero categories, show a subtle centered prompt: "No categories yet. Click + to create one." This disappears once the first category is created.
Color bleed: Each category's color is applied as a full tint to the header background. Items within the category get a lighter variant of the same color as a subtle background. Use CSS
color-mixor opacity to derive the lighter variant. This creates a visual scanning aid.Remaining tests: Fill in any missing coverage from prior slices. Focus on
todoStoreedge cases:Edge cases:
Acceptance criteria
bun fmt,bun lint,bun typecheck,bun run testall passBlocked by
Serves as the integration and polish slice. All prior slices should be merged before starting this one.