Files
famapp/docs/tasks/20-dashboard.md
T
ginnoir b89690a9f2 Initial scaffold: tooling, plan, task briefs
- pnpm 10 workspace + TypeScript strict + ESLint flat + Prettier
- CLAUDE.md as canonical brief
- docs/tasks/ — 22 task briefs broken out by phase for sub-sessions
- docs/decisions/ — ADR scaffold

Implements task 01 (repo-init).
2026-05-06 00:05:50 -05:00

34 lines
1.3 KiB
Markdown

# 20 — Dashboard composition
## Goal
The `/` landing page composes widgets contributed by installed modules. No hardcoded widget list.
## Depends on
- 10, 11, 12
## Scope
- `DashboardWidget` type already in `_core` (from task 04). Each widget exports `{ id, priority, render }`.
- `/` reads `getRegistry().dashboardWidgets`, sorts by priority desc, renders them in a responsive grid (1 col mobile, 2-3 cols desktop).
- Widgets implemented:
- **calendar.upcoming** — next 3 days of events
- **lists.shopping** — top 5 unchecked items in default shopping list
- **lists.tasks** — my open tasks (assigned to me, due soon first)
- **notes.pinned** — pinned notes
- **core.activity** — recent activity feed (depends on task 22; until then render a stub)
- Skeleton loaders while widgets load (each widget is a server component with `loading.tsx`-equivalent Suspense boundary).
- "+" floating action button opens the quick-add menu (task 21).
## Out of scope
- User-configurable widget order or hide/show (defer; pin a sane default order).
- Drag-rearrange.
## Acceptance criteria
- [ ] Removing a module from `src/modules/index.ts` cleanly removes its widgets — no errors, no blank slot.
- [ ] Widgets load in parallel (verify in network tab — no waterfall).
- [ ] Mobile layout (375px) is usable without horizontal scroll.