OGE logoOGE

Kanban

A task-board Kanban built on a framework-free kernel: columns and swimlanes over a plain card array with *Expr field mapping, per-column virtualization over a fixed card height (10k cards stay smooth), WIP limits with live drag previews, and a polished drag & drop — 3px threshold, live placeholder, lifted tilt, edge auto-scroll, mid-drag Escape restore, exactly one commit through the cancelable cardMoving pipeline. A built-in edit dialog, context menu and toolbar (search, collapse, add) come out of the box. No WAI-ARIA APG kanban pattern exists, so the widget is a set of labeled column lists with a roving focus over the cards — whose own buttons and template controls stay Tab-reachable — and adds Ctrl+Arrow keyboard card moving with polite live-region announcements, which no reference library offers.

@oge-ui/kanban is a commercial package — free for evaluation and development, with no watermark and no runtime license checks. See licensing for the terms.

columns + swimlanes WIP limits drag & drop keyboard moving virtualized

Getting started

One element, a working board. Drag a card between columns (Escape cancels mid-drag), double-click a card to edit it, double-click empty column space to add one there, right-click for the built-in menu, and type in the toolbar to search. Columns declare titles, colors and WIP limits — or derive from the data.

field mapping declared columns search context menu
To do2
In progress1 /3
Review1
Done1
Wallet UI polish
design
GHAT
Upgrade CI runners
Checkout revamp
New payment flow behind the feature flag
feature
Aug 21 AL
Fix login crash
Repro: expired refresh token
bug
Aug 5 AL
Q3 roadmap draft

Swimlanes

swimlaneExpr turns the board into swimlane rows × columns. Lane headers collapse — [(collapsedSwimlanes)] and [(collapsedColumns)] are two-way — and every lane scrolls its cells independently.

swimlaneExpr collapsible lanes
To do2
In progress2
Done1
Postgres 18 upgrade
Sharding rollout
Push notification opt-in
Biometric login
Design token migration

WIP limits

wipLimit is a soft limit: the column badge shows count/limit, turns to the danger tone on overflow, and previews the target column's +1 while a drag hovers it. Limits count real data — search filtering never changes them.

wipLimit danger badge drag preview
To do1
In progress3 /2
Done1
Docs sweep
Payments API
Search relevance
One too many — WIP exceeded
Login rate limits

Drag & drop pipeline

Every move — drag, Ctrl+Arrow or moveCard() — runs the same cancelable pipeline: cardMoving (set cancel to veto) then cardMoved. Here nothing may leave Done — try it. orderExpr persists the in-column order back onto your items; column headers drag too.

cardMoving Escape restore orderExpr column reorder
todo2
doing1
done1
Refactor auth
Ship dark mode
Bundle size audit
This card is locked in

drag a card

Keyboard moving & a11y

Arrows rove between cards and columns, Enter edits, Delete deletes — and Ctrl+Arrow moves the focused card, the exact keyboard twin of the drag, with a polite live-region announcement after every commit. Columns are labeled lists with their count and WIP in the accessible name, one Tab stop each; Tab from a card continues into its quick-action buttons and any controls a card template renders.

Ctrl+Arrow live region roving list
todo2
doing1
Tab to the board, then arrow around
Ctrl+ArrowRight moves me
Enter opens my dialog

Edit dialog & events

The built-in dialog (an OgeForm) covers the standard card fields; cardEditDialogShowing is both the veto and the customization point — formItems arrives pre-populated and may be mutated or replaced. This demo swaps the color field for a sprint picker.

cardEditDialogShowing formItems cancelable CRUD
todo1
doing1
Double-click me
Custom form field below
Right-click me for the menu

Card template

*ogeKanbanCardTemplate replaces the card body while drag, keyboard and ARIA stay on the component. Controls inside the template are real interactive content — Tab from a card reaches its Roll back button, which neither starts a drag nor steals the board's arrow keys (Escape returns to the card). Rich templates usually pair with a matching cardHeight — or opt out of virtualization entirely when heights must vary (documented exception).

*ogeKanbanCardTemplate cardHeight
staging2
production1
api-gatewayv2.14.0
searchv1.9.2
billingv3.1.1

Configuration & i18n

Every user-facing string — toolbar, menu, dialog, aria labels, live-region announcements — lives in OgeKanbanMessages: provide once, override per instance with [messages]. locale drives every Intl format (the due-date badges here render in German).

provideOgeKanbanConfig messages locale
Offen1
In Arbeit1
Fertig1
Angebot schreiben
14. Aug.
Rechnung prüfen
Kickoff-Termin