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.

KQ-1682 · QUICK/CAPTURE
My tasks
  • Replace P2 mechanical sealRiverside upgrade
  • Send flow readings to MaraWeir survey
  • Book the crane for ThursdayRiverside upgrade
  • Sign off as-built drawingsHandover pack

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.