{"version":"v1.0","client_state":{"Studio.default":{"fields":{"primary":"#682747","secondary":"#3a52b0","success":"#2f9e64","warning":"#f0a91b","error":"#e5484d","info":"#0e9bc4","background":"#fafafa","surface":"#ffffff","interface":"#f0f0f1","text":"#171717","muted":"#6b6b6e","d_primary":"#682747","d_secondary":"#3a52b0","d_success":"#2f9e64","d_warning":"#f0a91b","d_error":"#e5484d","d_info":"#0e9bc4","d_background":"#0a0a0a","d_surface":"#151515","d_interface":"#212121","d_text":"#f5f5f5","d_muted":"#a0a0a3","spacing":0.1875,"box":0.75,"field_":0.75,"selector":0.375,"stroke":1.0,"font":"ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'"},"persist":"local","send_to_server":true},"ColorScheme.default":{"fields":{"mode":"system"},"persist":"local","send_to_server":true}},"endpoints":{"action":"/_bretzel/action","sse":"/_bretzel/sse","refetch":"/_bretzel/refetch"},"csrf":"0c4d45ac51adc0e2fb1810b9703c7b47","page_id":"bc077190d98b4b949f64516ec429e470","address":""}
ui.drag_and_drop

Drag and drop

Pick a card up, drop it elsewhere: the drop calls a Python handler with a typed Move, and the server decides.

A kanban board

Three dropzones share the group "task". A drop posts a Move (item_key, from_zone, to_zone, indexes) to move_task, which updates the board on the server.
Backlog2
Dark mode for charts
DesignHL
Export invoices to CSV
BillingAT
In progress1
Faster customer search
SearchGH
Done1
SSO with Google
AuthAL

Reorder a list

handle=True grabs by the grip only, and disabled= takes a predicate: the pinned item cannot be picked up.
1Security review before launch
2Migrate billing to the new API
3Onboarding emails, round two
4Clean up unused feature flags

Drop to archive

terminal=True makes a zone an action rather than a column: the file never lands in it, the handler archives it.
Q3-report.pdf
brand-kit.zip
invoice-2041.pdf
team-photo.jpg
Drop here to archive · 0 so far

Fill a role

holds="one" marks a slot for a single person; dropping someone new replaces the current one. The team row uses ui.draggable directly, in an ordinary loop.
ALAda Lovelace
GHGrace Hopper
ATAlan Turing
HLHedy Lamarr
ReviewerDrop someone here
ApproverGHGrace Hopper