AdvancedKanban is a Kanban board component for SwiftUI on iOS, iPadOS, and macOS. You bring your own model types and card UI; it brings the board mechanics — cross-column pointer drag with autoscroll, a full keyboard move-mode, VoiceOver parity for every drag interaction, WIP limits, column collapse, and theming — so you don't reimplement drag-and-drop reordering from scratch again.
Pointer-driven reorder within and across columns, with edge autoscroll when dragging near the board's horizontal edges. onMove fires after the board has already mutated your columns binding — a pure persistence hook, never a manual diff.
Tab to focus a card, Space to enter move mode, arrow keys to move within or across columns, Return to commit, Escape to cancel and restore the card's original position. No mouse required.
Cards respond to hover with a theme-agnostic highlight visible in light and dark themes, a grab/grabbing cursor (macOS 15+), and a drag activation threshold tuned per platform — tight for pointer input, looser for touch.
Every drag interaction has an equivalent accessibility action (Move Up / Move Down / Move to <Column>) exposed through the rotor, so VoiceOver users get the same reordering power as pointer and keyboard users.
Set wipLimit per column and choose warnOnly (styling only) or preventDrop (drop rejected, card animates back) via wipLimitBehavior. Columns collapse to a title+count strip on tap, with state you own and can persist.
AdvancedKanbanSwiftData — a separate product — provides SwiftDataKanbanCard/SwiftDataKanbanColumn models and a KanbanStore that applies a KanbanMove to a ModelContext in one call. Not linked into the base library, so it's never forced on you.
There's no wrapper type to adopt and no separate board model to keep in sync with your data. Conform your existing types to two small protocols and the board drives reordering directly on your array via a Binding.
No. Conform your existing card type to KanbanCard (Identifiable + Equatable) and your column type to KanbanColumn (an ordered cards array plus optional wipLimit/isCollapsed) — no wrapper type required.
Yes — full keyboard move-mode and VoiceOver parity for every drag interaction are built in, not bolted on.
No. The base AdvancedKanban library has no persistence dependency. AdvancedKanbanSwiftData is a separate, optional product for apps that want a SwiftData-backed store.
Conform your types to KanbanCard and KanbanColumn, then call KanbanBoard with a Binding to your columns. See the full documentation site for theming, persistence, and accessibility recipes.