{"name":"kanban","helper":"rui_kanban","complexity":"simple","param_count":9,"slot_count":0,"form_builder":false,"standalone":true,"ai_score":null,"human_score":null,"token_estimate":58,"slots":{},"gotchas":[{"id":"kanban_max_cards_silent_drop_rejection","severity":"medium","component":"rui_kanban","summary":"max_cards: on a full column rejects the drop with zero user feedback — no error event, no shake animation, no message","params":["max_cards"],"behavior":"kanban_controller.js checks the target column's data-max-cards against its current card count on both dragover and drop; when the column is full it does a bare `return` and the drop is silently rejected — no kanban:move-failed event fires (that event is reserved for SERVER-side rejections after a move_url PATCH), no visual feedback, nothing in the console. A user dragging a card to a full column just sees it snap back with no explanation.","wrong":"\u003c%= rui_kanban do |board| %\u003e\u003c% board.with_column(title: \"WIP\", id: \"wip\", max_cards: 3) do |col| %\u003e...\u003c% end %\u003e\u003c% end %\u003e","right":"\u003c%# Pair max_cards: with a visible affordance — e.g. badge_count: showing \"3/3\" so the limit is visible before a user attempts the drag %\u003e\u003c% board.with_column(title: \"WIP\", id: \"wip\", max_cards: 3, badge_count: current_wip_count) do |col| %\u003e","notes":"If you need user-visible feedback on a rejected drop (toast, shake animation), you must add it yourself by listening for dragover/drop on the column element — the gem does not expose a client-side kanban:drop-rejected event as of this writing.","detection":"Scan for rui_kanban columns with max_cards: set but no accompanying badge_count: or other visible WIP-limit indicator in the same with_column call.","recovery":"Add badge_count: to the column so the limit is visible before the drag starts, and/or add custom dragover/drop listeners on the column element for rejection feedback."}],"families":[],"compositions":[],"relationships":{}}