- Add url field to QuickAddAction; make action optional - Add getQuickAdds() + SerializedQuickAddItem to registry so quick-add data can cross the server→client RSC boundary without serializing fns - Update calendar/lists/notes manifests with navigation URLs - QuickAddProvider wraps root layout: holds sheet/palette open state and global cmd/ctrl+k shortcut - QuickAddSheet: bottom drawer on mobile, right-side popover on desktop, actions grouped by module - CommandPalette: cmdk-powered modal with fuzzy filter and full keyboard nav (arrows + enter + esc) - QuickAddFab: client button replacing the plain + stub in the dashboard - Add .claude/** to ESLint ignores to prevent stale worktree artifacts from failing lint All 4 E2E specs pass; typecheck, lint, and build clean. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1.7 KiB
1.7 KiB
21 — Quick-add registry
Goal
A single global + button on the dashboard (and a cmd+k palette anywhere) that lists actions contributed by modules.
Depends on
- 20
Scope
QuickAddActiontype:{ id, label, icon?, shortcut?, run: () => void | Promise<void> }.- Modules register via manifest. Registry exposes a sorted list.
- UI: floating
+on dashboard opens a sheet of actions;cmd/ctrl+kopens a command-palette-style modal (usecmdkpackage). - Default actions: New event, Add to shopping, Add to tasks, New note.
Out of scope
- Fuzzy search across data (search adapter is a later concern).
- Action history / recents.
Acceptance criteria
- Adding a new module that registers a quick-add appears in both the FAB sheet and the cmd-k palette without touching core.
- Keyboard navigation works in the palette (arrows + enter + escape).
Implementation notes
QuickAddActiongained aurl: stringfield;actionmade optional (future inline modals).SerializedQuickAddItemstrips the non-serializableactionfn so it can cross the server→client RSC boundary as props toQuickAddProvider.getQuickAdds()in the registry returns oneSerializedQuickAddItemper registered quick-add, enriched withmoduleId/moduleNamefor grouping.- Root layout calls
getQuickAdds()and passes the result to<QuickAddProvider>which wraps the whole app.<QuickAddSheet>and<CommandPalette>live inside the provider and read from context. cmdkinstalled for the command palette; keyboard shortcut (cmd/ctrl+k) wired viauseEffectin the provider..claude/**added to ESLint ignores to prevent stale worktree.nextbuild artifacts from failing lint.