KQ-1682 · QUICK/CAPTURE
Quick Capture
A keyboard-first create-task dialog: type a title, and @, #, + and ^ open the assignee, project, label and due-date lists where you type, turning picks into tokens that each reopen as their own combobox. Creating lifts the filled form into a toast that shrinks to a pill on springs.glide while it travels to its sidebar count — x on glide and y on springs.snap, so the path bows — and sinks in as the count bumps on springs.recoil and its digits roll on snap; a failed create rolls the count back and flies the draft home intact. Cmd or Ctrl+Enter creates and keeps the dialog open for the next one, and Escape asks before letting typed text go.
- Replace P2 mechanical sealRiverside upgrade
- Send flow readings to MaraWeir survey
- Book the crane for ThursdayRiverside upgrade
- Sign off as-built drawingsHandover pack
New task
draft · weir survey · enter creates, ⌘ enter keeps going
Install
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/quick-capture
Props
- projects
- QuickCaptureProject[]
- default defaultQuickCaptureProjects
- Projects a task can go to: { id, name, count }; each count sits in the sidebar.
- people
- QuickCapturePerson[]
- default defaultQuickCapturePeople
- People a task can be assigned to: { id, name, handle }.
- labels
- QuickCaptureLabel[]
- default defaultQuickCaptureLabels
- Labels a task can carry: { id, name }.
- me
- string
- default "noor"
- The person using it; a task assigned to them with no project lands in My tasks.
- inboxCount
- number
- default 3
- Tasks waiting in the Inbox.
- mineCount
- number
- default 7
- Tasks in My tasks.
- defaultDraft
- Partial<QuickCaptureTask>
- default —
- What the form holds when it first opens: { title, notes, assignee, project, due, labels }.
- onCreate
- (task) => void | Promise<void>
- default —
- A task was created (optimistically). A rejection rolls the count back and flies the draft home with its message.
- onCreateAnother
- (task) => void
- default —
- A task was created and the dialog stayed open for the next one.
- onDiscard
- (draft) => void
- default —
- The draft was let go after Escape's question.
- open / defaultOpen
- boolean
- default — / true
- Whether the dialog is open over the app, controlled or initial.
- onOpenChange
- (open) => void
- default —
- New task, a create, Discard, the close button or Escape opened or closed it.
- createAnother / defaultCreateAnother
- boolean
- default — / false
- When on, Enter behaves like Cmd/Ctrl+Enter and keeps the dialog open.
- onCreateAnotherChange
- (on) => void
- default —
- Fires from the press that flipped the Create another switch.
- now
- number
- default defaultQuickCaptureNow
- The moment the due-date choices count from, in ms; never read from the clock.
- placeholder
- string
- default "Task title"
- The title field's placeholder.
- tokenStyle
- "pill" | "tag" | "plain"
- default "pill"
- Tokens as rounded pills, square tags with an accent edge, or plain words with a dotted underline.
- density
- "compact" | "cozy" | "roomy"
- default "cozy"
- Padding, gaps and the title's size.
- accent
- string
- default "var(--accent-bright)"
- The caret, filled tokens, Create, the toast and the count's tint; text on it flips light or dark with its lightness.
- height
- number
- default 520
- Height of the frame in px.
- disabled
- boolean
- default false
- Nothing can be created.
- className
- string
- default —
- Classes for the frame.
| Prop | Type | Default | Description |
|---|---|---|---|
| projects | QuickCaptureProject[] | defaultQuickCaptureProjects | Projects a task can go to: { id, name, count }; each count sits in the sidebar. |
| people | QuickCapturePerson[] | defaultQuickCapturePeople | People a task can be assigned to: { id, name, handle }. |
| labels | QuickCaptureLabel[] | defaultQuickCaptureLabels | Labels a task can carry: { id, name }. |
| me | string | "noor" | The person using it; a task assigned to them with no project lands in My tasks. |
| inboxCount | number | 3 | Tasks waiting in the Inbox. |
| mineCount | number | 7 | Tasks in My tasks. |
| defaultDraft | Partial<QuickCaptureTask> | — | What the form holds when it first opens: { title, notes, assignee, project, due, labels }. |
| onCreate | (task) => void | Promise<void> | — | A task was created (optimistically). A rejection rolls the count back and flies the draft home with its message. |
| onCreateAnother | (task) => void | — | A task was created and the dialog stayed open for the next one. |
| onDiscard | (draft) => void | — | The draft was let go after Escape's question. |
| open / defaultOpen | boolean | — / true | Whether the dialog is open over the app, controlled or initial. |
| onOpenChange | (open) => void | — | New task, a create, Discard, the close button or Escape opened or closed it. |
| createAnother / defaultCreateAnother | boolean | — / false | When on, Enter behaves like Cmd/Ctrl+Enter and keeps the dialog open. |
| onCreateAnotherChange | (on) => void | — | Fires from the press that flipped the Create another switch. |
| now | number | defaultQuickCaptureNow | The moment the due-date choices count from, in ms; never read from the clock. |
| placeholder | string | "Task title" | The title field's placeholder. |
| tokenStyle | "pill" | "tag" | "plain" | "pill" | Tokens as rounded pills, square tags with an accent edge, or plain words with a dotted underline. |
| density | "compact" | "cozy" | "roomy" | "cozy" | Padding, gaps and the title's size. |
| accent | string | "var(--accent-bright)" | The caret, filled tokens, Create, the toast and the count's tint; text on it flips light or dark with its lightness. |
| height | number | 520 | Height of the frame in px. |
| disabled | boolean | false | Nothing can be created. |
| className | string | — | Classes for the frame. |