themelia-react-ui 2.0.5 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/MIGRATION.md +119 -0
  3. package/README.md +13 -6
  4. package/dist/{accordion-B9MHG0cT.js → accordion-0tQUZ20r.js} +7 -7
  5. package/dist/accordion-0tQUZ20r.js.map +1 -0
  6. package/dist/{action-menu-Dr8K-ghE.js → action-menu-C0gjzLyE.js} +7 -7
  7. package/dist/{action-menu-Dr8K-ghE.js.map → action-menu-C0gjzLyE.js.map} +1 -1
  8. package/dist/{ai-artifact-C58tQcBy.js → ai-artifact-CGGpQryR.js} +172 -157
  9. package/dist/ai-artifact-CGGpQryR.js.map +1 -0
  10. package/dist/{app-shell-B_IuNWOo.js → app-shell-EHuuRDGy.js} +5 -5
  11. package/dist/{app-shell-B_IuNWOo.js.map → app-shell-EHuuRDGy.js.map} +1 -1
  12. package/dist/{attachment-Dg_69lPS.js → attachment-BCpA4e7i.js} +8 -8
  13. package/dist/{attachment-Dg_69lPS.js.map → attachment-BCpA4e7i.js.map} +1 -1
  14. package/dist/{auth-DTkkshS8.js → auth-B0girIk_.js} +15 -15
  15. package/dist/auth-B0girIk_.js.map +1 -0
  16. package/dist/{avatar-CeZaFmNH.js → avatar-B9Jnp-T-.js} +3 -3
  17. package/dist/{avatar-CeZaFmNH.js.map → avatar-B9Jnp-T-.js.map} +1 -1
  18. package/dist/{badge-xIiV_E7f.js → badge-wWauMgAt.js} +3 -3
  19. package/dist/{badge-xIiV_E7f.js.map → badge-wWauMgAt.js.map} +1 -1
  20. package/dist/base/accordion.js +1 -1
  21. package/dist/base/action-menu.js +1 -1
  22. package/dist/base/attachment.js +1 -1
  23. package/dist/base/avatar.js +1 -1
  24. package/dist/base/badge.js +1 -1
  25. package/dist/base/batch-action-bar.js +1 -1
  26. package/dist/base/buttons.js +1 -1
  27. package/dist/base/cards.js +2 -2
  28. package/dist/base/carousel.js +3 -3
  29. package/dist/base/cascader.js +1 -1
  30. package/dist/base/chart.js +1 -1
  31. package/dist/base/choice-inputs.js +2 -2
  32. package/dist/base/code-block.js +1 -1
  33. package/dist/base/combobox.js +1 -1
  34. package/dist/base/command.js +1 -1
  35. package/dist/base/copyable.js +1 -1
  36. package/dist/base/date-pickers.js +2 -2
  37. package/dist/base/display.js +6 -6
  38. package/dist/base/feedback.js +4 -4
  39. package/dist/base/forms-numeric.js +1 -1
  40. package/dist/base/forms.js +2 -2
  41. package/dist/base/inline-edit.js +8 -8
  42. package/dist/base/item.js +1 -1
  43. package/dist/base/media-gallery.js +1 -1
  44. package/dist/base/metadata-list.js +1 -1
  45. package/dist/base/navigation.js +6 -6
  46. package/dist/base/popover-menu.js +1 -1
  47. package/dist/base/popover.js +1 -1
  48. package/dist/base/qr-code.js +1 -1
  49. package/dist/base/repeaters.js +195 -188
  50. package/dist/base/repeaters.js.map +1 -1
  51. package/dist/base/sheet.js +1 -1
  52. package/dist/base/sidebar.js +2 -2
  53. package/dist/base/signature-pad.js +7 -7
  54. package/dist/base/skeleton.js +1 -1
  55. package/dist/base/spinner.js +5 -5
  56. package/dist/base/spinner.js.map +1 -1
  57. package/dist/base/structure.js +1 -1
  58. package/dist/base/table.js +1 -1
  59. package/dist/base/text-inputs.js +2 -2
  60. package/dist/base/toaster.js +1 -1
  61. package/dist/base/tree.js +1 -1
  62. package/dist/base/upload-queue.js +1 -1
  63. package/dist/base/upload.js +3 -3
  64. package/dist/base/value-inputs.js +1 -1
  65. package/dist/{batch-action-bar-Cb8cuvyy.js → batch-action-bar-BoqWIIpV.js} +5 -5
  66. package/dist/{batch-action-bar-Cb8cuvyy.js.map → batch-action-bar-BoqWIIpV.js.map} +1 -1
  67. package/dist/blocks/admin.js +17 -17
  68. package/dist/blocks/ai.js +227 -221
  69. package/dist/blocks/ai.js.map +1 -1
  70. package/dist/blocks/analytics/usage-card.js +1 -1
  71. package/dist/blocks/analytics.js +424 -449
  72. package/dist/blocks/analytics.js.map +1 -1
  73. package/dist/blocks/collaboration.js +1 -1
  74. package/dist/blocks/commerce/receipt.js +1 -1
  75. package/dist/blocks/commerce.js +225 -220
  76. package/dist/blocks/commerce.js.map +1 -1
  77. package/dist/blocks/data-display.js +2 -2
  78. package/dist/blocks/onboarding.js +5 -5
  79. package/dist/blocks/planning.js +11 -11
  80. package/dist/blocks/timelines.js +1 -1
  81. package/dist/{breadcrumbs-J-K2kl4c.js → breadcrumbs-Bp9Ke7kd.js} +4 -4
  82. package/dist/breadcrumbs-Bp9Ke7kd.js.map +1 -0
  83. package/dist/{button-S2Cubiiz.js → button-ChBovTx0.js} +2 -2
  84. package/dist/{button-S2Cubiiz.js.map → button-ChBovTx0.js.map} +1 -1
  85. package/dist/{buttons-BedGfygC.js → buttons-DeW0bQeK.js} +6 -6
  86. package/dist/{buttons-BedGfygC.js.map → buttons-DeW0bQeK.js.map} +1 -1
  87. package/dist/{cards-rNX1M4Xn.js → cards-CNXnmvV5.js} +8 -8
  88. package/dist/{cards-rNX1M4Xn.js.map → cards-CNXnmvV5.js.map} +1 -1
  89. package/dist/{cascader-B1MiqkBq.js → cascader-CrAl9zD5.js} +15 -15
  90. package/dist/{cascader-B1MiqkBq.js.map → cascader-CrAl9zD5.js.map} +1 -1
  91. package/dist/{chart-Darg_0Kv.js → chart-I7ROnsl8.js} +5 -5
  92. package/dist/{chart-Darg_0Kv.js.map → chart-I7ROnsl8.js.map} +1 -1
  93. package/dist/{checkbox-fflqmODR.js → checkbox-MoyHIAPs.js} +3 -3
  94. package/dist/{checkbox-fflqmODR.js.map → checkbox-MoyHIAPs.js.map} +1 -1
  95. package/dist/{choice-inputs-zUgBZfE4.js → choice-inputs-DHGtx0QV.js} +122 -110
  96. package/dist/choice-inputs-DHGtx0QV.js.map +1 -0
  97. package/dist/{code-block-BzmM9Eig.js → code-block-BSJyq9e-.js} +7 -7
  98. package/dist/{code-block-BzmM9Eig.js.map → code-block-BSJyq9e-.js.map} +1 -1
  99. package/dist/{collapsible-BkAI_XD4.js → collapsible-BzJ91LUG.js} +3 -3
  100. package/dist/{collapsible-BkAI_XD4.js.map → collapsible-BzJ91LUG.js.map} +1 -1
  101. package/dist/{collection-content-gDh1v6O4.js → collection-content-CSnwtOTH.js} +3 -3
  102. package/dist/{collection-content-gDh1v6O4.js.map → collection-content-CSnwtOTH.js.map} +1 -1
  103. package/dist/{combobox-BEx0vJgF.js → combobox-Bcvu5J8O.js} +11 -10
  104. package/dist/{combobox-BEx0vJgF.js.map → combobox-Bcvu5J8O.js.map} +1 -1
  105. package/dist/combobox-C2JiSQPc.js +915 -0
  106. package/dist/combobox-C2JiSQPc.js.map +1 -0
  107. package/dist/{command-CrlPIL6m.js → command-9e52NPgK.js} +6 -6
  108. package/dist/{command-CrlPIL6m.js.map → command-9e52NPgK.js.map} +1 -1
  109. package/dist/{comments-Dmpp0YIc.js → comments-BsgErEqd.js} +33 -28
  110. package/dist/comments-BsgErEqd.js.map +1 -0
  111. package/dist/components/base/choice-inputs/choice-types.d.ts +4 -0
  112. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
  113. package/dist/components/base/combobox/combobox-field.d.ts +2 -2
  114. package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
  115. package/dist/components/base/date-pickers/datepicker.types.d.ts +10 -4
  116. package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
  117. package/dist/components/base/feedback/state-display.d.ts +5 -1
  118. package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
  119. package/dist/components/base/forms/form-field.d.ts +7 -2
  120. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -1
  121. package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
  122. package/dist/components/base/forms-numeric/dimensions-input.d.ts +4 -1
  123. package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
  124. package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
  125. package/dist/components/base/navigation/language-switcher.d.ts +12 -4
  126. package/dist/components/base/repeaters/key-value-editor.d.ts +2 -1
  127. package/dist/components/base/sidebar/sidebar.d.ts +2 -0
  128. package/dist/components/base/upload/avatar-upload.d.ts +2 -1
  129. package/dist/components/base/upload/image-upload.d.ts +2 -1
  130. package/dist/components/blocks/ai/ai-citation/types.d.ts +2 -0
  131. package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
  132. package/dist/components/blocks/ai/ai-sources/types.d.ts +2 -0
  133. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +2 -0
  134. package/dist/components/blocks/analytics/metric/metric.d.ts +4 -0
  135. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  136. package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
  137. package/dist/components/blocks/analytics/types.d.ts +2 -2
  138. package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
  139. package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +4 -3
  140. package/dist/components/features/activities/activities.types.d.ts +18 -11
  141. package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
  142. package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
  143. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
  144. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +4 -2
  145. package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
  146. package/dist/components/features/combobox/combobox.d.ts +2 -2
  147. package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -1
  148. package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
  149. package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
  150. package/dist/components/features/combobox/types.d.ts +37 -8
  151. package/dist/components/features/email-composer/types.d.ts +3 -1
  152. package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
  153. package/dist/components/features/filters/facets/range-facet.d.ts +12 -0
  154. package/dist/components/features/filters/filters.types.d.ts +3 -3
  155. package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
  156. package/dist/components/features/filters/partials/filter-popover-content.d.ts +4 -2
  157. package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
  158. package/dist/components/features/filters/utils/filter-utils.d.ts +5 -1
  159. package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
  160. package/dist/components/features/media-library/media-library.d.ts +1 -1
  161. package/dist/components/features/media-library/media-library.strings.d.ts +6 -0
  162. package/dist/components/features/media-library/media-library.types.d.ts +36 -8
  163. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  164. package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
  165. package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +5 -1
  166. package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +1 -7
  167. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
  168. package/dist/components/features/products/products.types.d.ts +2 -2
  169. package/dist/components/features/questionnaire/questionnaire.types.d.ts +3 -0
  170. package/dist/components/features/resource/resource.d.ts +1 -1
  171. package/dist/components/features/resource/resource.types.d.ts +2 -0
  172. package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
  173. package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +1 -1
  174. package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
  175. package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +3 -1
  176. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  177. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +17 -3
  178. package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -1
  179. package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
  180. package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
  181. package/dist/components/features/suggestions/suggestions.types.d.ts +1 -1
  182. package/dist/components/features/table/data-table.d.ts +1 -1
  183. package/dist/components/features/table/index.d.ts +1 -0
  184. package/dist/components/features/table/table-body.d.ts +1 -1
  185. package/dist/components/features/table/table-helpers.d.ts +6 -3
  186. package/dist/components/features/table/table.strings.d.ts +3 -0
  187. package/dist/components/features/table/table.types.d.ts +17 -1
  188. package/dist/components/layout/header/header.types.d.ts +3 -2
  189. package/dist/components/layout/layout.types.d.ts +5 -3
  190. package/dist/components/layout/navigation/side-nav.d.ts +3 -2
  191. package/dist/components/layout/normalize-layout-path.d.ts +1 -0
  192. package/dist/components/layout/settings/settings.d.ts +1 -1
  193. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  194. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +3 -1
  195. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -0
  196. package/dist/components/layout/sidebar/sidebar.types.d.ts +2 -0
  197. package/dist/components/primitives/link.d.ts +3 -2
  198. package/dist/components/primitives/money.d.ts +1 -1
  199. package/dist/components/primitives/number.d.ts +1 -1
  200. package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
  201. package/dist/{containers-CIxwbZt5.js → containers-CSdc32h9.js} +2 -2
  202. package/dist/{containers-CIxwbZt5.js.map → containers-CSdc32h9.js.map} +1 -1
  203. package/dist/{copyable-DIznBqiT.js → copyable-3fdHfMR3.js} +4 -4
  204. package/dist/{copyable-DIznBqiT.js.map → copyable-3fdHfMR3.js.map} +1 -1
  205. package/dist/{data-display-BdgCAw8T.js → data-display-Cmj-xZYl.js} +16 -15
  206. package/dist/data-display-Cmj-xZYl.js.map +1 -0
  207. package/dist/{date-Cq8ioE4o.js → date-Br0FicVv.js} +4 -4
  208. package/dist/{date-Cq8ioE4o.js.map → date-Br0FicVv.js.map} +1 -1
  209. package/dist/date-picker-CyQlFYsP.js +1617 -0
  210. package/dist/date-picker-CyQlFYsP.js.map +1 -0
  211. package/dist/date-pickers-tj2MXmXd.js +185 -0
  212. package/dist/date-pickers-tj2MXmXd.js.map +1 -0
  213. package/dist/{display-KsZLw9Ov.js → display-CT_N2a3w.js} +7 -7
  214. package/dist/{display-KsZLw9Ov.js.map → display-CT_N2a3w.js.map} +1 -1
  215. package/dist/{dropdown-menu-CLs8Lihj.js → dropdown-menu-C08iIugv.js} +6 -6
  216. package/dist/{dropdown-menu-CLs8Lihj.js.map → dropdown-menu-C08iIugv.js.map} +1 -1
  217. package/dist/features/activities.js +283 -270
  218. package/dist/features/activities.js.map +1 -1
  219. package/dist/features/ai-chat.js +40 -27
  220. package/dist/features/ai-chat.js.map +1 -1
  221. package/dist/features/appointment-calendar.js +126 -126
  222. package/dist/features/appointment-calendar.js.map +1 -1
  223. package/dist/features/async-preview.js +9 -9
  224. package/dist/features/combobox.js +1 -1
  225. package/dist/features/comments.js +1 -1
  226. package/dist/features/data-view.js +10 -10
  227. package/dist/features/email-composer.js +24 -19
  228. package/dist/features/email-composer.js.map +1 -1
  229. package/dist/features/event-calendar.js +129 -125
  230. package/dist/features/event-calendar.js.map +1 -1
  231. package/dist/features/filters.js +2 -2
  232. package/dist/features/global-search.js +16 -20
  233. package/dist/features/global-search.js.map +1 -1
  234. package/dist/features/kanban.js +18 -28
  235. package/dist/features/kanban.js.map +1 -1
  236. package/dist/features/map/style.css +15 -0
  237. package/dist/features/map.js +331 -314
  238. package/dist/features/map.js.map +1 -1
  239. package/dist/features/media-library.js +1044 -866
  240. package/dist/features/media-library.js.map +1 -1
  241. package/dist/features/mentions.js +2 -2
  242. package/dist/features/overlays.js +1 -1
  243. package/dist/features/products.js +978 -964
  244. package/dist/features/products.js.map +1 -1
  245. package/dist/features/questionnaire.js +159 -152
  246. package/dist/features/questionnaire.js.map +1 -1
  247. package/dist/features/resource-assignment.js +8 -8
  248. package/dist/features/resource.js +74 -71
  249. package/dist/features/resource.js.map +1 -1
  250. package/dist/features/rich-text-editor.js +28 -19
  251. package/dist/features/rich-text-editor.js.map +1 -1
  252. package/dist/features/schema-form.js +297 -256
  253. package/dist/features/schema-form.js.map +1 -1
  254. package/dist/features/suggestions.js +57 -50
  255. package/dist/features/suggestions.js.map +1 -1
  256. package/dist/features/sync.js +3 -3
  257. package/dist/features/table.js +1 -1
  258. package/dist/features/theme-tweaker.js +400 -399
  259. package/dist/features/theme-tweaker.js.map +1 -1
  260. package/dist/feedback-Dzo1xtAU.js +246 -0
  261. package/dist/feedback-Dzo1xtAU.js.map +1 -0
  262. package/dist/{field-affordance-recipes-DWcNcOjh.js → field-affordance-recipes-D6H7tVJi.js} +2 -2
  263. package/dist/{field-affordance-recipes-DWcNcOjh.js.map → field-affordance-recipes-D6H7tVJi.js.map} +1 -1
  264. package/dist/field-control-attributes-B6i335wr.js +18 -0
  265. package/dist/field-control-attributes-B6i335wr.js.map +1 -0
  266. package/dist/{field-state-recipes-BVA2CWHo.js → field-state-recipes-7sza8QbC.js} +4 -2
  267. package/dist/{field-state-recipes-BVA2CWHo.js.map → field-state-recipes-7sza8QbC.js.map} +1 -1
  268. package/dist/{filters-DzgSJpMK.js → filters-Dl80yYtN.js} +763 -605
  269. package/dist/filters-Dl80yYtN.js.map +1 -0
  270. package/dist/form-field-CAPdwdnZ.js +74 -0
  271. package/dist/form-field-CAPdwdnZ.js.map +1 -0
  272. package/dist/{form-sizing-Bs2qFUeE.js → form-sizing-CgcrUbLU.js} +2 -2
  273. package/dist/{form-sizing-Bs2qFUeE.js.map → form-sizing-CgcrUbLU.js.map} +1 -1
  274. package/dist/{forms-C0RGnJTe.js → forms-B3W8CH7-.js} +8 -8
  275. package/dist/{forms-C0RGnJTe.js.map → forms-B3W8CH7-.js.map} +1 -1
  276. package/dist/forms-numeric-CwjQJe-O.js +991 -0
  277. package/dist/forms-numeric-CwjQJe-O.js.map +1 -0
  278. package/dist/{header-DMMxG__r.js → header-ZIIsRKxP.js} +113 -113
  279. package/dist/header-ZIIsRKxP.js.map +1 -0
  280. package/dist/hooks/use-files.d.ts +2 -0
  281. package/dist/{hooks-DB6CJ4MR.js → hooks-BitHSh-Y.js} +3 -3
  282. package/dist/{hooks-DB6CJ4MR.js.map → hooks-BitHSh-Y.js.map} +1 -1
  283. package/dist/{icon-badge-DZF-YjQp.js → icon-badge-npxF1SLX.js} +2 -2
  284. package/dist/{icon-badge-DZF-YjQp.js.map → icon-badge-npxF1SLX.js.map} +1 -1
  285. package/dist/index.js +1 -1
  286. package/dist/{input-CvyDQlY7.js → input-7KAc7XQL.js} +6 -6
  287. package/dist/{input-CvyDQlY7.js.map → input-7KAc7XQL.js.map} +1 -1
  288. package/dist/{input-DMBwAZmr.js → input-DIREVYHs.js} +3 -3
  289. package/dist/{input-DMBwAZmr.js.map → input-DIREVYHs.js.map} +1 -1
  290. package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-4wZ2tvfb.js} +2 -2
  291. package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-4wZ2tvfb.js.map} +1 -1
  292. package/dist/{item-DjCcM18E.js → item-FfWnaYST.js} +99 -98
  293. package/dist/item-FfWnaYST.js.map +1 -0
  294. package/dist/layout/app-shell.js +1 -1
  295. package/dist/layout/auth.js +1 -1
  296. package/dist/layout/containers.js +1 -1
  297. package/dist/layout/header.js +1 -1
  298. package/dist/layout/hooks.js +1 -1
  299. package/dist/layout/navigation.js +1 -1
  300. package/dist/layout/page.js +1 -1
  301. package/dist/layout/settings.js +1 -1
  302. package/dist/layout/sidebar.js +2 -2
  303. package/dist/layout/workspace.js +1 -1
  304. package/dist/layout.js +11 -11
  305. package/dist/layout.types-E_GAApzO.js +30 -0
  306. package/dist/layout.types-E_GAApzO.js.map +1 -0
  307. package/dist/lib/field-control-attributes.d.ts +11 -0
  308. package/dist/lib/field-state-recipes.d.ts +2 -0
  309. package/dist/lib/format.d.ts +1 -0
  310. package/dist/lib/surface-recipes.d.ts +1 -1
  311. package/dist/lib/token-merge.generated.d.ts +6 -6
  312. package/dist/lib/utils.js +1 -1
  313. package/dist/{media-gallery-C-vChPmE.js → media-gallery-C81DAnKI.js} +6 -6
  314. package/dist/{media-gallery-C-vChPmE.js.map → media-gallery-C81DAnKI.js.map} +1 -1
  315. package/dist/{mentions-0_4nWuI-.js → mentions-qOnedSt4.js} +236 -167
  316. package/dist/mentions-qOnedSt4.js.map +1 -0
  317. package/dist/message-BJHnn43M.js +135 -0
  318. package/dist/message-BJHnn43M.js.map +1 -0
  319. package/dist/{metadata-list-C3MkU-Om.js → metadata-list-XkqZ_UXH.js} +11 -11
  320. package/dist/{metadata-list-C3MkU-Om.js.map → metadata-list-XkqZ_UXH.js.map} +1 -1
  321. package/dist/{navigation-DaRjthVk.js → navigation-BgtPJAhi.js} +119 -119
  322. package/dist/navigation-BgtPJAhi.js.map +1 -0
  323. package/dist/{navigation-C90-oQFq.js → navigation-Bt-v7rWP.js} +52 -46
  324. package/dist/navigation-Bt-v7rWP.js.map +1 -0
  325. package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
  326. package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
  327. package/dist/{number-CRU3kGuk.js → number-CYqBcrSj.js} +78 -86
  328. package/dist/number-CYqBcrSj.js.map +1 -0
  329. package/dist/{overflow-tab-bar-IVFVQFV6.js → overflow-tab-bar-BQCA2Zn2.js} +7 -7
  330. package/dist/{overflow-tab-bar-IVFVQFV6.js.map → overflow-tab-bar-BQCA2Zn2.js.map} +1 -1
  331. package/dist/{overlays-BSgCtM2v.js → overlays-CC8zI3Du.js} +264 -260
  332. package/dist/overlays-CC8zI3Du.js.map +1 -0
  333. package/dist/{page-DUUKDAjo.js → page-BoQ1VaFJ.js} +13 -13
  334. package/dist/{page-DUUKDAjo.js.map → page-BoQ1VaFJ.js.map} +1 -1
  335. package/dist/{page-header-commands-7P3sfE9u.js → page-header-commands-DIKspJfx.js} +4 -4
  336. package/dist/{page-header-commands-7P3sfE9u.js.map → page-header-commands-DIKspJfx.js.map} +1 -1
  337. package/dist/{pagination-CgCjElfu.js → pagination-Br8TdV9A.js} +4 -4
  338. package/dist/{pagination-CgCjElfu.js.map → pagination-Br8TdV9A.js.map} +1 -1
  339. package/dist/{popover-B85RenIl.js → popover-k8TdUcAt.js} +10 -10
  340. package/dist/popover-k8TdUcAt.js.map +1 -0
  341. package/dist/{popover-menu-DlnQ2zlR.js → popover-menu-yn-o0kyA.js} +7 -7
  342. package/dist/{popover-menu-DlnQ2zlR.js.map → popover-menu-yn-o0kyA.js.map} +1 -1
  343. package/dist/{popover.recipes-DdiEp0rd.js → popover.recipes-DJ0AkUan.js} +2 -2
  344. package/dist/{popover.recipes-DdiEp0rd.js.map → popover.recipes-DJ0AkUan.js.map} +1 -1
  345. package/dist/{portal-recipes-BpsV_iRw.js → portal-recipes-DyUXqUtD.js} +2 -2
  346. package/dist/{portal-recipes-BpsV_iRw.js.map → portal-recipes-DyUXqUtD.js.map} +1 -1
  347. package/dist/{primitives-ByWgGUgt.js → primitives-BkkQjYl7.js} +22 -17
  348. package/dist/primitives-BkkQjYl7.js.map +1 -0
  349. package/dist/primitives.js +4 -4
  350. package/dist/{progress-BJhQP9WX.js → progress-DZFXXzPs.js} +4 -4
  351. package/dist/{progress-BJhQP9WX.js.map → progress-DZFXXzPs.js.map} +1 -1
  352. package/dist/{receipt-tOc7B3hw.js → receipt-C7LhOg7Q.js} +6 -6
  353. package/dist/{receipt-tOc7B3hw.js.map → receipt-C7LhOg7Q.js.map} +1 -1
  354. package/dist/rich-text-BnTzZjIo.js +45 -0
  355. package/dist/rich-text-BnTzZjIo.js.map +1 -0
  356. package/dist/rich-text-editor-CAurDwT5.js +1273 -0
  357. package/dist/rich-text-editor-CAurDwT5.js.map +1 -0
  358. package/dist/{rich-text-editor-toolbar-laT3tpBT.js → rich-text-editor-toolbar-DbXig7Jk.js} +36 -35
  359. package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +1 -0
  360. package/dist/rich-text-tree-BqyQ_7-R.js +66 -0
  361. package/dist/rich-text-tree-BqyQ_7-R.js.map +1 -0
  362. package/dist/{sanitize-html-DsQmI48u.js → sanitize-html-BWkH4dLM.js} +29 -16
  363. package/dist/sanitize-html-BWkH4dLM.js.map +1 -0
  364. package/dist/{scroll-area-B0dB2cBi.js → scroll-area-Bj6CRUif.js} +2 -2
  365. package/dist/{scroll-area-B0dB2cBi.js.map → scroll-area-Bj6CRUif.js.map} +1 -1
  366. package/dist/{separator-Bb17I4pu.js → separator-B9ewiCGO.js} +2 -2
  367. package/dist/{separator-Bb17I4pu.js.map → separator-B9ewiCGO.js.map} +1 -1
  368. package/dist/{separator-Ct_WSWTJ.js → separator-DM6gs2vu.js} +3 -3
  369. package/dist/{separator-Ct_WSWTJ.js.map → separator-DM6gs2vu.js.map} +1 -1
  370. package/dist/services/actions.js +1 -1
  371. package/dist/settings-DZPHgpx4.js +155 -0
  372. package/dist/settings-DZPHgpx4.js.map +1 -0
  373. package/dist/{sheet-BGPERY55.js → sheet-C4DHsgLk.js} +6 -6
  374. package/dist/{sheet-BGPERY55.js.map → sheet-C4DHsgLk.js.map} +1 -1
  375. package/dist/sidebar-C8BnDwTH.js +709 -0
  376. package/dist/sidebar-C8BnDwTH.js.map +1 -0
  377. package/dist/{sidebar-f9gRWXIR.js → sidebar-CmD6a-HK.js} +16 -13
  378. package/dist/sidebar-CmD6a-HK.js.map +1 -0
  379. package/dist/{skeleton-BapcJd9C.js → skeleton-DDgdhmu9.js} +5 -5
  380. package/dist/{skeleton-BapcJd9C.js.map → skeleton-DDgdhmu9.js.map} +1 -1
  381. package/dist/{smart-card-CW0hjetE.js → smart-card-B6vLxqa_.js} +8 -8
  382. package/dist/{smart-card-CW0hjetE.js.map → smart-card-B6vLxqa_.js.map} +1 -1
  383. package/dist/{structure-DuxKl954.js → structure-DZJ2wbAU.js} +2 -2
  384. package/dist/{structure-DuxKl954.js.map → structure-DZJ2wbAU.js.map} +1 -1
  385. package/dist/style.css +1 -1
  386. package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-C8mNycaY.js} +2 -2
  387. package/dist/{surface-recipes-BKRVW8Os.js.map → surface-recipes-C8mNycaY.js.map} +1 -1
  388. package/dist/{table-CFOWY9pQ.js → table-CBonSdTp.js} +534 -486
  389. package/dist/table-CBonSdTp.js.map +1 -0
  390. package/dist/{table-B4TE7iOV.js → table-CXSPHH25.js} +75 -71
  391. package/dist/table-CXSPHH25.js.map +1 -0
  392. package/dist/{tabs-e7ko9S2o.js → tabs-C4Kr_hCr.js} +50 -49
  393. package/dist/tabs-C4Kr_hCr.js.map +1 -0
  394. package/dist/{text-inputs-B1culiSK.js → text-inputs-jdkS3ReG.js} +9 -9
  395. package/dist/{text-inputs-B1culiSK.js.map → text-inputs-jdkS3ReG.js.map} +1 -1
  396. package/dist/{timelines-D3Sl9ueq.js → timelines-CoPwdJP0.js} +10 -10
  397. package/dist/{timelines-D3Sl9ueq.js.map → timelines-CoPwdJP0.js.map} +1 -1
  398. package/dist/{tooltip-8wz5S_Zr.js → tooltip-31NwIpTo.js} +4 -4
  399. package/dist/{tooltip-8wz5S_Zr.js.map → tooltip-31NwIpTo.js.map} +1 -1
  400. package/dist/{tree-CzUJHnFs.js → tree-CeYVzdFE.js} +6 -6
  401. package/dist/{tree-CzUJHnFs.js.map → tree-CeYVzdFE.js.map} +1 -1
  402. package/dist/typography/rich-text.js +1 -1
  403. package/dist/{typography-BQnine1k.js → typography-C7-YMW1S.js} +2 -2
  404. package/dist/{typography-BQnine1k.js.map → typography-C7-YMW1S.js.map} +1 -1
  405. package/dist/typography.js +1 -1
  406. package/dist/{upload-BOW6U2tI.js → upload-Hdm5gObf.js} +303 -291
  407. package/dist/upload-Hdm5gObf.js.map +1 -0
  408. package/dist/{upload-queue-qUXn1ykN.js → upload-queue-D0sYPuqo.js} +8 -8
  409. package/dist/{upload-queue-qUXn1ykN.js.map → upload-queue-D0sYPuqo.js.map} +1 -1
  410. package/dist/{usage-card-BeSLY0i0.js → usage-card-9s8hLDfn.js} +9 -9
  411. package/dist/{usage-card-BeSLY0i0.js.map → usage-card-9s8hLDfn.js.map} +1 -1
  412. package/dist/{utils-B6kKb8jB.js → utils-DhuoqFy4.js} +31 -37
  413. package/dist/utils-DhuoqFy4.js.map +1 -0
  414. package/dist/{value-inputs-skdVB2zh.js → value-inputs-D3aPgq9H.js} +15 -15
  415. package/dist/{value-inputs-skdVB2zh.js.map → value-inputs-D3aPgq9H.js.map} +1 -1
  416. package/dist/{value-typography-uAmWUAL1.js → value-typography-uSzzG9Gf.js} +32 -26
  417. package/dist/value-typography-uSzzG9Gf.js.map +1 -0
  418. package/dist/{workspace-DHeHv0qw.js → workspace-CC8Vchiu.js} +12 -12
  419. package/dist/{workspace-DHeHv0qw.js.map → workspace-CC8Vchiu.js.map} +1 -1
  420. package/docs/consumer-skill/examples/edit.tsx +3 -3
  421. package/docs/consumer-skill/references/agents-md.md +19 -19
  422. package/docs/consumer-skill/references/analytics.md +15 -0
  423. package/docs/consumer-skill/references/component-contracts.json +14724 -13057
  424. package/docs/consumer-skill/references/composition.md +21 -4
  425. package/docs/consumer-skill/references/design-contract.md +1 -0
  426. package/docs/consumer-skill/references/installation.md +51 -8
  427. package/docs/consumer-skill/references/integration.md +24 -1
  428. package/docs/consumer-skill/references/public-api.json +172 -34
  429. package/docs/consumer-skill/references/review.md +51 -11
  430. package/docs/consumer-skill/references/rhf-workflows.md +72 -0
  431. package/docs/consumer-skill/references/theming.md +7 -2
  432. package/docs/consumer-skill/references/tokens.json +1 -1
  433. package/docs/consumer-skill/scripts/composition-policy.mjs +144 -30
  434. package/docs/consumer-skill/scripts/setup-skills.mjs +46 -9
  435. package/package.json +4 -2
  436. package/templates/admin-shell-template.tsx +1 -2
  437. package/templates/customers-template.tsx +18 -16
  438. package/dist/accordion-B9MHG0cT.js.map +0 -1
  439. package/dist/ai-artifact-C58tQcBy.js.map +0 -1
  440. package/dist/auth-DTkkshS8.js.map +0 -1
  441. package/dist/breadcrumbs-J-K2kl4c.js.map +0 -1
  442. package/dist/choice-inputs-zUgBZfE4.js.map +0 -1
  443. package/dist/combobox-BwzoXFSG.js +0 -884
  444. package/dist/combobox-BwzoXFSG.js.map +0 -1
  445. package/dist/comments-Dmpp0YIc.js.map +0 -1
  446. package/dist/data-display-BdgCAw8T.js.map +0 -1
  447. package/dist/date-picker-RlIzKom_.js +0 -1551
  448. package/dist/date-picker-RlIzKom_.js.map +0 -1
  449. package/dist/date-pickers-DY-CpXS1.js +0 -179
  450. package/dist/date-pickers-DY-CpXS1.js.map +0 -1
  451. package/dist/feedback-Dm4izqFn.js +0 -240
  452. package/dist/feedback-Dm4izqFn.js.map +0 -1
  453. package/dist/filters-DzgSJpMK.js.map +0 -1
  454. package/dist/form-field-BriWAXyg.js +0 -63
  455. package/dist/form-field-BriWAXyg.js.map +0 -1
  456. package/dist/forms-numeric-DIhghX1Q.js +0 -910
  457. package/dist/forms-numeric-DIhghX1Q.js.map +0 -1
  458. package/dist/header-DMMxG__r.js.map +0 -1
  459. package/dist/item-DjCcM18E.js.map +0 -1
  460. package/dist/layout.types-Cn7aUzJp.js +0 -20
  461. package/dist/layout.types-Cn7aUzJp.js.map +0 -1
  462. package/dist/mentions-0_4nWuI-.js.map +0 -1
  463. package/dist/message-g8p7eVtN.js +0 -128
  464. package/dist/message-g8p7eVtN.js.map +0 -1
  465. package/dist/navigation-C90-oQFq.js.map +0 -1
  466. package/dist/navigation-DaRjthVk.js.map +0 -1
  467. package/dist/number-CRU3kGuk.js.map +0 -1
  468. package/dist/overlays-BSgCtM2v.js.map +0 -1
  469. package/dist/popover-B85RenIl.js.map +0 -1
  470. package/dist/primitives-ByWgGUgt.js.map +0 -1
  471. package/dist/rich-text-Dth5E882.js +0 -78
  472. package/dist/rich-text-Dth5E882.js.map +0 -1
  473. package/dist/rich-text-editor-C1fOjBTd.js +0 -1195
  474. package/dist/rich-text-editor-C1fOjBTd.js.map +0 -1
  475. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +0 -1
  476. package/dist/safe-image-src-C6kQSMBZ.js +0 -17
  477. package/dist/safe-image-src-C6kQSMBZ.js.map +0 -1
  478. package/dist/sanitize-html-DsQmI48u.js.map +0 -1
  479. package/dist/settings-Bar5wiSo.js +0 -167
  480. package/dist/settings-Bar5wiSo.js.map +0 -1
  481. package/dist/sidebar-D-JYMMbY.js +0 -686
  482. package/dist/sidebar-D-JYMMbY.js.map +0 -1
  483. package/dist/sidebar-f9gRWXIR.js.map +0 -1
  484. package/dist/table-B4TE7iOV.js.map +0 -1
  485. package/dist/table-CFOWY9pQ.js.map +0 -1
  486. package/dist/tabs-e7ko9S2o.js.map +0 -1
  487. package/dist/upload-BOW6U2tI.js.map +0 -1
  488. package/dist/utils-B6kKb8jB.js.map +0 -1
  489. package/dist/value-typography-uAmWUAL1.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"kanban.js","names":["Text","popoverWidthRecipes","ActionMenu","getKanbanKeyboardPosition","ids","columns","columnIndex","position","key","nextId","createKanbanKeyboardCoordinates","event","active","context","destination","findItem","next","value","onPositionChange","item","id","getItemValue","rect","activeRect","currentCoordinates","useKanban","useCallback","columnId","items","index","move","found","itemId","toColumnId","fromColumnId","fromIndex","targetItems","resolvedToIndex","toIndex","sourceCopy","targetCopy","landingIndex","onValueChange","onItemMove","useMemo","KanbanContext","createContext","KanbanContextProvider","useKanbanContext","ctx","useContext","KanbanItemContext","KanbanItemContextProvider","useKanbanItemContext","defaultKanbanStrings","interpolateKanbanString","params","acc","template","Kanban","stringsProp","strings","useStrings","activeId","setActiveId","useState","boardRef","useRef","keyboardFocusId","node","handle","dragOrigin","completedDestination","keyboardPosition","setKeyboardPosition","keyboardDestination","keyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","activeItem","handleDragStart","getItemLabel","handleDragEnd","source","over","overData","overId","targetColumnId","ctxValue","itemActions","onItemClick","announcementParams","origin","columnName","getColumnLabel","DndContext","cn","className","children","KanbanBoard","KanbanColumn","useDroppable","setNodeRef","isOver","KanbanColumnContent","SortableContext","verticalListSortingStrategy","KanbanItem","useSortable","style","CSS","transform","isDragging","handleCount","setHandleCount","hasHandle","registerHandle","count","itemCtx","listeners","attributes","setActivatorNodeRef","rootClick","handleClick","onClick","isClickable","KanbanItemHandle","forwardRef","setMergedRef","forwardedRef","Button","KanbanItemActions","rawActions","actions","visible","action","disabled","menuActions","icon","ariaLabel","KanbanOverlay","DragOverlay","render","toneRecipes"],"sources":["../../src/components/features/kanban/kanban-keyboard.ts","../../src/components/features/kanban/hooks/use-kanban.ts","../../src/components/features/kanban/kanban-context.tsx","../../src/components/features/kanban/kanban.strings.ts","../../src/components/features/kanban/kanban.tsx"],"sourcesContent":["import type { KeyboardCoordinateGetter } from '@dnd-kit/core';\n\nexport interface KanbanKeyboardPosition { columnId: string; index: number }\n\n/** Resolve arrow movement from board order, including columns with no cards. */\nexport function getKanbanKeyboardPosition(\n\tcolumns: Record<string, unknown[]>,\n\tposition: KanbanKeyboardPosition,\n\tkey: string,\n): KanbanKeyboardPosition {\n\tconst ids = Object.keys(columns);\n\tconst columnIndex = ids.indexOf(position.columnId);\n\tif (key === 'ArrowLeft' || key === 'ArrowRight') {\n\t\tconst nextId = ids[columnIndex + (key === 'ArrowRight' ? 1 : -1)];\n\t\treturn nextId ? { columnId: nextId, index: Math.min(position.index, columns[nextId].length) } : position;\n\t}\n\tif (key === 'ArrowUp' || key === 'ArrowDown') {\n\t\treturn { columnId: position.columnId, index: Math.max(0, Math.min(columns[position.columnId].length - 1, position.index + (key === 'ArrowDown' ? 1 : -1))) };\n\t}\n\treturn position;\n}\n\nexport function createKanbanKeyboardCoordinates(\n\tvalue: Record<string, unknown[]>,\n\tgetItemValue: (item: unknown) => string,\n\tfindItem: (id: string) => KanbanKeyboardPosition | undefined,\n\tdestination: { current: KanbanKeyboardPosition | null },\n\tonPositionChange?: (position: KanbanKeyboardPosition) => void,\n): KeyboardCoordinateGetter {\n\treturn (event, { currentCoordinates, context }) => {\n\t\tif (!['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code)) return undefined;\n\t\tconst active = context.active;\n\t\tif (!active) return undefined;\n\t\tconst position = destination.current ?? findItem(String(active.id));\n\t\tif (!position) return undefined;\n\t\tevent.preventDefault();\n\t\tconst next = getKanbanKeyboardPosition(value, position, event.code);\n\t\tdestination.current = next;\n\t\tonPositionChange?.(next);\n\t\tconst item = value[next.columnId][next.index];\n\t\tconst id = item === undefined ? next.columnId : getItemValue(item);\n\t\tconst rect = context.droppableRects.get(id);\n\t\tconst activeRect = context.collisionRect;\n\t\tif (!rect || !activeRect) return currentCoordinates;\n\t\treturn {\n\t\t\tx: currentCoordinates.x + rect.left - activeRect.left,\n\t\t\ty: currentCoordinates.y + rect.top - activeRect.top,\n\t\t};\n\t};\n}\n","import { useCallback, useMemo } from 'react';\n\nimport type { KanbanItemMoveEvent, KanbanValue } from '../kanban.types';\n\n/**\n * Headless hook — exposes the same state machine `<Kanban>` uses\n * internally so consumers can build a fully custom UI against it.\n *\n * const { findItem, move } = useKanban({ value, onValueChange,\n * getItemValue });\n * move({ itemId: 'card-1', toColumnId: 'shipped', toIndex: 0 });\n */\nexport interface UseKanbanOptions<T> {\n\tvalue: KanbanValue<T>;\n\tonValueChange: (next: KanbanValue<T>) => void;\n\tgetItemValue: (item: T) => string;\n\tonItemMove?: (event: KanbanItemMoveEvent<T>) => void;\n}\n\nexport interface UseKanbanResult<T> {\n\tfindItem: (id: string) => { columnId: string; index: number; item: T } | undefined;\n\t/**\n\t * Move an item between columns / within the same column. Idempotent:\n\t * a no-op move is safe.\n\t */\n\tmove: (input: { itemId: string; toColumnId: string; toIndex?: number }) => void;\n}\n\nexport function useKanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tonItemMove,\n}: UseKanbanOptions<T>): UseKanbanResult<T> {\n\tconst findItem = useCallback(\n\t\t(id: string) => {\n\t\t\tfor (const [columnId, items] of Object.entries(value)) {\n\t\t\t\tconst index = items.findIndex((item) => getItemValue(item) === id);\n\t\t\t\tif (index >= 0) return { columnId, index, item: items[index] };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t[value, getItemValue],\n\t);\n\n\tconst move = useCallback(\n\t\t({ itemId, toColumnId, toIndex }: { itemId: string; toColumnId: string; toIndex?: number }) => {\n\t\t\tconst found = findItem(itemId);\n\t\t\tif (!found) return;\n\t\t\tif (!Object.prototype.hasOwnProperty.call(value, toColumnId)) return;\n\n\t\t\tconst { columnId: fromColumnId, index: fromIndex, item } = found;\n\n\t\t\t// Same column, same slot — nothing to do.\n\t\t\tconst targetItems = value[toColumnId];\n\t\t\tconst resolvedToIndex =\n\t\t\t\ttoIndex === undefined\n\t\t\t\t\t? targetItems.length\n\t\t\t\t\t: Math.max(0, Math.min(toIndex, targetItems.length));\n\n\t\t\tif (fromColumnId === toColumnId && fromIndex === resolvedToIndex) return;\n\n\t\t\tconst next: KanbanValue<T> = { ...value };\n\t\t\tconst sourceCopy = [...next[fromColumnId]];\n\t\t\tsourceCopy.splice(fromIndex, 1);\n\t\t\tnext[fromColumnId] = sourceCopy;\n\n\t\t\tconst targetCopy = [...(fromColumnId === toColumnId ? sourceCopy : next[toColumnId])];\n\t\t\t// When moving within the same column to a later index, the splice\n\t\t\t// above shifted everything left — re-resolve the destination.\n\t\t\tlet landingIndex = resolvedToIndex;\n\t\t\tif (fromColumnId === toColumnId && fromIndex < resolvedToIndex) {\n\t\t\t\tlandingIndex = Math.max(0, resolvedToIndex - 1);\n\t\t\t}\n\t\t\ttargetCopy.splice(landingIndex, 0, item);\n\t\t\tnext[toColumnId] = targetCopy;\n\n\t\t\tonValueChange(next);\n\t\t\tonItemMove?.({\n\t\t\t\titem,\n\t\t\t\titemId,\n\t\t\t\tfrom: { columnId: fromColumnId, index: fromIndex },\n\t\t\t\tto: { columnId: toColumnId, index: landingIndex },\n\t\t\t});\n\t\t},\n\t\t[value, findItem, onValueChange, onItemMove],\n\t);\n\n\treturn useMemo(() => ({ findItem, move }), [findItem, move]);\n}\n","import { createContext, useContext } from 'react';\n\nimport type { KanbanContextShape } from './kanban.types';\n\n/**\n * Internal context for the Kanban — the parts use this to read\n * shared state (current value, getItemValue, active drag id).\n */\nconst KanbanContext = createContext<KanbanContextShape | null>(null);\n\nexport const KanbanContextProvider = KanbanContext.Provider;\n\nexport function useKanbanContext<T = unknown>(): KanbanContextShape<T> {\n\tconst ctx = useContext(KanbanContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'Kanban subcomponents must be rendered inside a <Kanban> root.',\n\t\t);\n\t}\n\treturn ctx as unknown as KanbanContextShape<T>;\n}\n\n/**\n * Internal context exposed by `<KanbanItem>` so the optional\n * `<KanbanItemHandle>` knows which listeners + accessibility props to\n * wire to the dedicated drag handle. Also carries the resolved\n * domain item so `<KanbanItemActions>` (and any other item-aware\n * subcomponent) can render per-item content without prop drilling.\n *\n * The dnd-kit shapes are widened to `unknown` so consumers can spread\n * them onto any HTMLElement.\n */\nexport interface KanbanItemContextShape<T = unknown> {\n\tlisteners: unknown;\n\tattributes: unknown;\n\tsetActivatorNodeRef: (node: HTMLElement | null) => void;\n\tregisterHandle: () => () => void;\n\t/** Stable id (the value returned by `getItemValue`). */\n\titemId: string;\n\t/** The domain item itself — null if it can't be resolved. */\n\titem: T | null;\n}\n\nconst KanbanItemContext = createContext<KanbanItemContextShape | null>(null);\n\nexport const KanbanItemContextProvider = KanbanItemContext.Provider;\n\nexport function useKanbanItemContext<T = unknown>(): KanbanItemContextShape<T> {\n\tconst ctx = useContext(KanbanItemContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'<KanbanItemHandle> / <KanbanItemActions> must be rendered inside a <KanbanItem>.',\n\t\t);\n\t}\n\treturn ctx as KanbanItemContextShape<T>;\n}\n","/**\n * Strings for the Kanban — drag-and-drop screen-reader announcements\n * + accessibility labels. The library never renders user-visible copy\n * that the consumer hasn't already supplied via column headers / item\n * children, so the strings here are exclusively for assistive tech.\n */\nexport interface KanbanStrings {\n\t/** Read by screen readers when a drag begins. `{name}` = item label (or ID). */\n\tannounceDragStart: string;\n\t/** Read when an item moves over a column. `{from}` / `{to}` are column labels; `{position}` is one-based. */\n\tannounceDragMove: string;\n\t/** Read when an item is dropped into a column. */\n\tannounceDragEnd: string;\n\t/** Read when the user cancels a drag with Escape. */\n\tannounceDragCancel: string;\n\t/** Aria label on the drag handle. */\n\tdragHandleAria: string;\n\t/** Aria label on the board landmark. */\n\tboardAria: string;\n\t/** Aria label on the per-item actions trigger (`⋯`). */\n\titemActionsAria: string;\n}\n\nexport const defaultKanbanStrings: KanbanStrings = {\n\tannounceDragStart: 'Picked up item {name}.',\n\tannounceDragMove: 'Moving {name} from {from} to {to}, position {position}.',\n\tannounceDragEnd: 'Dropped {name} into {to}, position {position}.',\n\tannounceDragCancel: 'Cancelled drag of {name}.',\n\tdragHandleAria: 'Drag handle',\n\tboardAria: 'Kanban board',\n\titemActionsAria: 'Item actions',\n};\n\nexport function interpolateKanbanString(\n\ttemplate: string,\n\tparams: Record<string, string>,\n): string {\n\treturn Object.entries(params).reduce(\n\t\t(acc, [key, value]) => acc.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value),\n\t\ttemplate,\n\t);\n}\n","/**\n * Kanban — drag-and-drop board with multi-column item sorting and\n * cross-column moves. Headless behavior comes from `@dnd-kit/core` +\n * `@dnd-kit/sortable`; the library wires it into a callback-driven,\n * generic-T API:\n *\n * <Kanban\n * value={columns}\n * onValueChange={setColumns}\n * getItemValue={(c) => c.id}\n * onItemMove={(e) => api.persistMove(e)}\n * >\n * <KanbanBoard className=\"grid grid-cols-3 gap-3\">\n * {Object.entries(columns).map(([colId, items]) => (\n * <KanbanColumn key={colId} value={colId}>\n * <header>{COLUMNS[colId].title}</header>\n * <KanbanColumnContent value={colId}>\n * {items.map((card) => (\n * <KanbanItem key={card.id} value={card.id}>\n * …card body…\n * </KanbanItem>\n * ))}\n * </KanbanColumnContent>\n * </KanbanColumn>\n * ))}\n * </KanbanBoard>\n * <KanbanOverlay />\n * </Kanban>\n *\n * The library never reaches into a router, never persists state — your\n * `onValueChange` is the source of truth. Use `onItemMove` for\n * analytics / optimistic-update plumbing.\n */\nimport {\n\tDndContext,\n\tDragOverlay,\n\tPointerSensor,\n\tKeyboardSensor,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors,\n\ttype DragEndEvent,\n\ttype DragStartEvent,\n} from '@dnd-kit/core';\nimport {\n\tSortableContext,\n\tuseSortable,\n\tverticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type MouseEvent } from 'react';\n\nimport { Button } from '../../base/buttons';\nimport { ActionMenu, type ActionMenuAction } from '../../base/action-menu';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { createKanbanKeyboardCoordinates, type KanbanKeyboardPosition } from './kanban-keyboard';\nimport { useKanban } from './hooks/use-kanban';\nimport {\n\tKanbanContextProvider,\n\tKanbanItemContextProvider,\n\tuseKanbanContext,\n\tuseKanbanItemContext,\n} from './kanban-context';\nimport { defaultKanbanStrings, interpolateKanbanString } from './kanban.strings';\nimport type {\n\tKanbanBoardProps,\n\tKanbanColumnContentProps,\n\tKanbanColumnProps,\n\tKanbanItemAction,\n\tKanbanItemActionsConfig,\n\tKanbanItemActionsProps,\n\tKanbanItemHandleProps,\n\tKanbanItemProps,\n\tKanbanOverlayProps,\n\tKanbanProps,\n} from './kanban.types';\nimport { toneRecipes } from '../../../lib/tone-recipes';\nimport { popoverWidthRecipes } from '../../base/popover/popover.recipes';\n\nexport function Kanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tgetItemLabel,\n\tgetColumnLabel,\n\tonItemMove,\n\titemActions,\n\tonItemClick,\n\tstrings: stringsProp,\n\tclassName,\n\tchildren,\n}: KanbanProps<T>) {\n\tconst strings = useStrings(defaultKanbanStrings, stringsProp);\n\tconst { findItem, move } = useKanban({\n\t\tvalue,\n\t\tonValueChange,\n\t\tgetItemValue,\n\t\tonItemMove,\n\t});\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst boardRef = useRef<HTMLDivElement | null>(null);\n\tconst keyboardFocusId = useRef<string | null>(null);\n\tuseLayoutEffect(() => {\n\t\tif (activeId || !keyboardFocusId.current) return;\n\t\tconst item = Array.from(boardRef.current?.querySelectorAll<HTMLElement>('[data-kanban-item-id]') ?? []).find(node => node.dataset.kanbanItemId === keyboardFocusId.current);\n\t\tconst handle = item?.querySelector<HTMLElement>('[data-slot=\"kanban-item-handle\"]') ?? item;\n\t\tif (handle) { handle.focus(); keyboardFocusId.current = null; }\n\t}, [activeId, value]);\n\tconst dragOrigin = useRef<{ columnId: string; index: number; name: string } | null>(null);\n\tconst completedDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst [keyboardPosition, setKeyboardPosition] = useState<KanbanKeyboardPosition | null>(null);\n\tconst keyboardDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst keyboardCoordinates = useMemo(() => createKanbanKeyboardCoordinates(\n\t\tvalue, getItemValue as (item: unknown) => string, findItem, keyboardDestination, setKeyboardPosition,\n\t), [value, getItemValue, findItem]);\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n\t\tuseSensor(KeyboardSensor, { coordinateGetter: keyboardCoordinates }),\n\t);\n\n\tconst activeItem = useMemo(\n\t\t() => (activeId ? findItem(activeId)?.item ?? null : null),\n\t\t[activeId, findItem],\n\t);\n\n\tconst handleDragStart = useCallback(\n\t\t(event: DragStartEvent) => {\n\t\t\tconst item = findItem(String(event.active.id));\n\t\t\tdragOrigin.current = item ? { columnId: item.columnId, index: item.index, name: getItemLabel?.(item.item) ?? String(event.active.id) } : null;\n\t\t\tcompletedDestination.current = null;\n\t\t\tsetKeyboardPosition(null);\n\t\t\tkeyboardDestination.current = null;\n\t\t\tkeyboardFocusId.current = event.activatorEvent instanceof KeyboardEvent ? String(event.active.id) : null;\n\t\t\tsetActiveId(String(event.active.id));\n\t\t},\n\t\t[findItem, getItemLabel],\n\t);\n\n\tconst handleDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tsetActiveId(null);\n\t\t\tsetKeyboardPosition(null);\n\t\t\tconst { active, over } = event;\n\t\t\tconst destination = keyboardDestination.current;\n\t\t\tcompletedDestination.current = destination;\n\t\t\tkeyboardDestination.current = null;\n\t\t\tif (destination) {\n\t\t\t\tconst source = findItem(String(active.id));\n\t\t\t\tconst toIndex = source?.columnId === destination.columnId && source.index < destination.index ? destination.index + 1 : destination.index;\n\t\t\t\tmove({ itemId: String(active.id), toColumnId: destination.columnId, toIndex });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!over) return;\n\t\t\tconst activeData = active.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overData = over.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overId = String(over.id);\n\n\t\t\t// Dropping on a column container (not a sortable item) → append.\n\t\t\tconst targetColumnId =\n\t\t\t\toverData?.columnId ?? (Object.prototype.hasOwnProperty.call(value, overId) ? overId : undefined);\n\t\t\tif (!targetColumnId) return;\n\n\t\t\tconst toIndex =\n\t\t\t\toverData?.columnId !== undefined ? overData.index : value[targetColumnId].length;\n\n\t\t\tmove({\n\t\t\t\titemId: String(active.id),\n\t\t\t\ttoColumnId: targetColumnId,\n\t\t\t\ttoIndex,\n\t\t\t});\n\t\t\tvoid activeData;\n\t\t},\n\t\t[move, value, findItem],\n\t);\n\n\tconst ctxValue = useMemo(\n\t\t() => ({\n\t\t\tvalue: value as Record<string, unknown[]>,\n\t\t\tonValueChange: onValueChange as (next: Record<string, unknown[]>) => void,\n\t\t\tgetItemValue: getItemValue as (item: unknown) => string,\n\t\t\tactiveId,\n\t\t\tactiveItem: activeItem as unknown,\n\t\t\tfindItem: findItem as (id: string) => { columnId: string; index: number; item: unknown } | undefined,\n\t\t\titemActions: itemActions as KanbanItemActionsConfig<unknown> | undefined,\n\t\t\tonItemClick: onItemClick as ((item: unknown) => void) | undefined,\n\t\t}),\n\t\t[value, onValueChange, getItemValue, activeId, activeItem, findItem, itemActions, onItemClick],\n\t);\n\n\tconst announcementParams = (itemId: string, overId?: string) => {\n\t\tconst item = findItem(itemId);\n\t\tconst origin = dragOrigin.current;\n\t\tconst over = overId ? findItem(overId) : undefined;\n\t\tconst position = keyboardDestination.current ?? completedDestination.current ?? over ?? (overId && value[overId] ? { columnId: overId, index: value[overId].length } : origin);\n\t\tconst columnName = (id?: string) => id ? getColumnLabel?.(id) ?? id : '';\n\t\treturn {\n\t\t\tname: origin?.name ?? (item ? getItemLabel?.(item.item) ?? itemId : itemId),\n\t\t\tfrom: columnName(origin?.columnId),\n\t\t\tto: columnName(position?.columnId),\n\t\t\tposition: String((position?.index ?? 0) + 1),\n\t\t};\n\t};\n\treturn (\n\t\t<KanbanContextProvider value={ctxValue}>\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\tonDragCancel={() => { keyboardDestination.current = null; setKeyboardPosition(null); setActiveId(null); }}\n\t\t\t\taccessibility={{\n\t\t\t\t\tannouncements: {\n\t\t\t\t\t\tonDragStart({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragStart, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragMove({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragOver({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragEnd({ active, over }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragEnd, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragCancel({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragCancel, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tref={boardRef}\n\t\t\t\t\trole=\"application\"\n\t\t\t\t\taria-label={strings.boardAria}\n\t\t\t\t\tclassName={cn('kanban--component', 'w-full', className)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t<div className=\"kanban--keyboard-announcement sr-only\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">\n\t\t\t\t\t\t<Text tag=\"span\">{activeId && keyboardPosition ? interpolateKanbanString(strings.announceDragMove, announcementParams(activeId)) : ''}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DndContext>\n\t\t</KanbanContextProvider>\n\t);\n}\n\nKanban.displayName = 'Kanban';\n\nexport function KanbanBoard({ className, style, children }: KanbanBoardProps) {\n\treturn (\n\t\t<div className={cn('grid w-full gap-space-lg', className)} style={style}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanBoard.displayName = 'KanbanBoard';\n\nexport function KanbanColumn({ value, className, children }: KanbanColumnProps) {\n\tconst { setNodeRef, isOver } = useDroppable({ id: value });\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tdata-slot=\"kanban-column\"\n\t\t\tdata-column-id={value}\n\t\t\tdata-over={isOver ? 'true' : undefined}\n\t\t\tclassName={cn('flex min-w-0 flex-col', className)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanColumn.displayName = 'KanbanColumn';\n\nexport function KanbanColumnContent({\n\tvalue,\n\tclassName,\n\tchildren,\n}: KanbanColumnContentProps) {\n\tconst ctx = useKanbanContext();\n\tconst items = ctx.value[value] ?? [];\n\tconst ids = items.map((item) => ctx.getItemValue(item));\n\treturn (\n\t\t<SortableContext items={ids} strategy={verticalListSortingStrategy}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"kanban-column-content\"\n\t\t\t\tclassName={cn('flex flex-col gap-space-md', className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</SortableContext>\n\t);\n}\n\nKanbanColumnContent.displayName = 'KanbanColumnContent';\n\nexport function KanbanItem({\n\tvalue,\n\tclassName,\n\tdisabled = false,\n\tonClick,\n\tchildren,\n}: KanbanItemProps) {\n\tconst ctx = useKanbanContext();\n\tconst found = ctx.findItem(value);\n\tconst {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetNodeRef,\n\t\tsetActivatorNodeRef,\n\t\ttransform,\n\t\ttransition,\n\t\tisDragging,\n\t} = useSortable({\n\t\tid: value,\n\t\tdisabled,\n\t\tdata: { columnId: found?.columnId, index: found?.index },\n\t});\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : undefined,\n\t};\n\tconst [handleCount, setHandleCount] = useState(0);\n\tconst hasHandle = handleCount > 0;\n\tconst registerHandle = useCallback(() => {\n\t\tsetHandleCount((count) => count + 1);\n\t\treturn () => setHandleCount((count) => Math.max(0, count - 1));\n\t}, []);\n\n\tconst itemCtx = useMemo(\n\t\t() => ({\n\t\t\tlisteners,\n\t\t\tattributes,\n\t\t\tsetActivatorNodeRef,\n\t\t\tregisterHandle,\n\t\t\titemId: value,\n\t\t\titem: found?.item ?? null,\n\t\t}),\n\t\t[listeners, attributes, setActivatorNodeRef, registerHandle, value, found?.item],\n\t);\n\n\tconst rootClick = ctx.onItemClick;\n\tconst handleClick = useCallback(\n\t\t(event: MouseEvent<HTMLDivElement>) => {\n\t\t\t// `<KanbanItemHandle>` and `<KanbanItemActions>` mark themselves\n\t\t\t// with `data-stop-item-click` so a click on the drag handle or\n\t\t\t// the actions menu doesn't bubble up as a card click.\n\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\tif (target?.closest('[data-stop-item-click]')) return;\n\t\t\tif (onClick) {\n\t\t\t\tonClick();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rootClick && found?.item !== undefined) {\n\t\t\t\trootClick(found.item);\n\t\t\t}\n\t\t},\n\t\t[onClick, rootClick, found?.item],\n\t);\n\n\tconst isClickable = Boolean(onClick || rootClick);\n\n\t// When no <KanbanItemHandle> is used, the whole row is the activator.\n\t// We attach listeners + attributes here as the default — KanbanItemHandle\n\t// can then override by wiring them to a more specific element.\n\treturn (\n\t\t<KanbanItemContextProvider value={itemCtx}>\n\t\t\t<div\n\t\t\t\tref={setNodeRef}\n\t\t\t\tstyle={style}\n\t\t\t\tdata-slot=\"kanban-item\"\n\t\t\t\tdata-kanban-item-id={value}\n\t\t\t\tdata-dragging={isDragging ? 'true' : undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'touch-none select-none',\n\t\t\t\t\tisClickable && 'cursor-pointer',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={isClickable ? handleClick : undefined}\n\t\t\t\t{...(!hasHandle ? attributes : {})}\n\t\t\t\t{...(!hasHandle ? listeners : {})}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</KanbanItemContextProvider>\n\t);\n}\n\nKanbanItem.displayName = 'KanbanItem';\n\nexport const KanbanItemHandle = forwardRef<HTMLButtonElement, KanbanItemHandleProps>(function KanbanItemHandle({ className, children }, forwardedRef) {\n\tconst { setActivatorNodeRef, listeners, attributes, registerHandle } = useKanbanItemContext();\n\tuseEffect(() => registerHandle(), [registerHandle]);\n\t// Merge dnd-kit's activator ref with the consumer's forwarded ref so a\n\t// `<Tooltip><KanbanItemHandle ref={…}/></Tooltip>` wiring still gets a\n\t// real ref to the button element.\n\tconst setMergedRef = useCallback(\n\t\t(node: HTMLButtonElement | null) => {\n\t\t\tsetActivatorNodeRef(node);\n\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\tforwardedRef(node);\n\t\t\t} else if (forwardedRef) {\n\t\t\t\tforwardedRef.current = node;\n\t\t\t}\n\t\t},\n\t\t[setActivatorNodeRef, forwardedRef],\n\t);\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"sm\" iconOnly\n\t\t\tref={setMergedRef}\n\t\t\tdata-slot=\"kanban-item-handle\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tclassName={cn(\n\t\t\t\t'cursor-grab shadow-none active:cursor-grabbing',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...(attributes as Record<string, unknown>)}\n\t\t\t{...(listeners as Record<string, unknown>)}\n\t\t>\n\t\t\t{children}\n\t\t</Button>\n\t);\n});\n\nKanbanItemHandle.displayName = 'KanbanItemHandle';\n\n/**\n * Per-item actions menu (`⋯` trigger → popover with the actions\n * registered at the `<Kanban itemActions>` root). Place inside any\n * `<KanbanItem>` — typically in the card's top-right corner.\n *\n * The trigger marks itself with `data-stop-item-click` so opening the\n * menu doesn't fire the parent `onItemClick` callback.\n */\nexport function KanbanItemActions<T = unknown>({\n\tclassName,\n\ticon,\n\tariaLabel,\n}: KanbanItemActionsProps) {\n\tconst ctx = useKanbanContext<T>();\n\tconst itemCtx = useKanbanItemContext<T>();\n\tconst strings = useStrings(defaultKanbanStrings, undefined);\n\n\tconst item = itemCtx.item;\n\tconst rawActions = ctx.itemActions;\n\tconst actions = useMemo<ReadonlyArray<\n\t\tOmit<KanbanItemAction<T>, 'visible' | 'disabled'> & {\n\t\t\tvisible: boolean;\n\t\t\tdisabled: boolean;\n\t\t}\n\t>>(() => {\n\t\tif (!rawActions || item === null || item === undefined) return [];\n\t\tconst list = typeof rawActions === 'function' ? rawActions(item) : rawActions;\n\t\treturn list.flatMap((action) => {\n\t\t\tconst visible = typeof action.visible === 'function'\n\t\t\t\t? action.visible(item)\n\t\t\t\t: action.visible ?? true;\n\t\t\tif (!visible) return [];\n\t\t\tconst disabled = typeof action.disabled === 'function'\n\t\t\t\t? action.disabled(item)\n\t\t\t\t: action.disabled ?? false;\n\t\t\treturn [{ ...action, visible, disabled }];\n\t\t});\n\t}, [rawActions, item]);\n\n\tif (item === null || actions.length === 0) return null;\n\n\tconst menuActions: ActionMenuAction[] = actions.map((action) => ({\n\t\tid: action.id,\n\t\tlabel: action.label,\n\t\ticon: action.icon,\n\t\tdisabled: action.disabled,\n\t\ttone: action.tone,\n\t\tbuttonStyle: action.buttonStyle,\n\t\tonClick: () => action.onClick(item),\n\t}));\n\n\treturn (\n\t\t<span\n\t\t\tclassName=\"kanban-item-actions--component inline-flex\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tonPointerDown={(event) => event.stopPropagation()}\n\t\t>\n\t\t\t<ActionMenu\n\t\t\t\tactions={menuActions}\n\t\t\t\ticon={icon ?? undefined}\n\t\t\t\tsrText={ariaLabel ?? strings.itemActionsAria}\n\t\t\t\twidth={popoverWidthRecipes.xs}\n\t\t\t\talign=\"end\"\n\t\t\t\tbuttonProps={{\n\t\t\t\t\tclassName,\n\t\t\t\t\t'data-slot': 'kanban-item-actions-trigger',\n\t\t\t\t\t'data-stop-item-click': true,\n\t\t\t\t\t'aria-label': ariaLabel ?? strings.itemActionsAria,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nKanbanItemActions.displayName = 'KanbanItemActions';\n\nexport function KanbanOverlay<T = unknown>({ className, render }: KanbanOverlayProps<T>) {\n\tconst { activeItem, activeId, findItem } = useKanbanContext<T>();\n\treturn (\n\t\t<DragOverlay>\n\t\t\t{activeId\n\t\t\t\t? render\n\t\t\t\t\t? render({\n\t\t\t\t\t\t\titem: activeItem,\n\t\t\t\t\t\t\tcolumnId: findItem(activeId)?.columnId ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'kanban-overlay--component pointer-events-none rounded-surface border-2 border-dashed p-surface shadow-lg',\n\t\t\t\t\t\t\t\ttoneRecipes.primary.edge,\n\t\t\t\t\t\t\t\ttoneRecipes.primary.wash,\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"text-primary-accent\">{activeId}</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t: null}\n\t\t</DragOverlay>\n\t);\n}\n\nKanbanOverlay.displayName = 'KanbanOverlay';\n"],"mappings":"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"}
1
+ {"version":3,"file":"kanban.js","names":["Text","popoverWidthRecipes","ActionMenu","getKanbanKeyboardPosition","ids","columns","columnIndex","position","key","nextId","createKanbanKeyboardCoordinates","event","active","context","destination","findItem","next","value","onPositionChange","item","id","getItemValue","rect","activeRect","currentCoordinates","useKanban","useCallback","columnId","items","index","move","found","itemId","toColumnId","fromColumnId","fromIndex","targetItems","sameColumn","resolvedToIndex","toIndex","landingIndex","sourceCopy","targetCopy","onValueChange","onItemMove","useMemo","KanbanContext","createContext","KanbanContextProvider","useKanbanContext","ctx","useContext","KanbanItemContext","KanbanItemContextProvider","useKanbanItemContext","defaultKanbanStrings","interpolateKanbanString","params","acc","template","Kanban","stringsProp","strings","useStrings","activeId","setActiveId","useState","boardRef","useRef","keyboardFocusId","node","handle","dragOrigin","completedDestination","keyboardPosition","setKeyboardPosition","keyboardDestination","keyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","activeItem","handleDragStart","getItemLabel","handleDragEnd","overData","over","overId","targetColumnId","source","targetIndex","ctxValue","itemActions","onItemClick","announcementParams","origin","columnName","getColumnLabel","DndContext","cn","className","children","KanbanBoard","KanbanColumn","useDroppable","setNodeRef","isOver","KanbanColumnContent","SortableContext","verticalListSortingStrategy","KanbanItem","useSortable","style","CSS","transform","isDragging","handleCount","setHandleCount","hasHandle","registerHandle","count","itemCtx","listeners","attributes","setActivatorNodeRef","rootClick","handleClick","onClick","isClickable","KanbanItemHandle","forwardRef","setMergedRef","forwardedRef","Button","KanbanItemActions","rawActions","actions","visible","action","disabled","menuActions","icon","ariaLabel","KanbanOverlay","DragOverlay","render","toneRecipes"],"sources":["../../src/components/features/kanban/kanban-keyboard.ts","../../src/components/features/kanban/hooks/use-kanban.ts","../../src/components/features/kanban/kanban-context.tsx","../../src/components/features/kanban/kanban.strings.ts","../../src/components/features/kanban/kanban.tsx"],"sourcesContent":["import type { KeyboardCoordinateGetter } from '@dnd-kit/core';\n\nexport interface KanbanKeyboardPosition { columnId: string; index: number }\n\n/** Resolve arrow movement from board order, including columns with no cards. */\nexport function getKanbanKeyboardPosition(\n\tcolumns: Record<string, unknown[]>,\n\tposition: KanbanKeyboardPosition,\n\tkey: string,\n): KanbanKeyboardPosition {\n\tconst ids = Object.keys(columns);\n\tconst columnIndex = ids.indexOf(position.columnId);\n\tif (key === 'ArrowLeft' || key === 'ArrowRight') {\n\t\tconst nextId = ids[columnIndex + (key === 'ArrowRight' ? 1 : -1)];\n\t\treturn nextId ? { columnId: nextId, index: Math.min(position.index, columns[nextId].length) } : position;\n\t}\n\tif (key === 'ArrowUp' || key === 'ArrowDown') {\n\t\treturn { columnId: position.columnId, index: Math.max(0, Math.min(columns[position.columnId].length - 1, position.index + (key === 'ArrowDown' ? 1 : -1))) };\n\t}\n\treturn position;\n}\n\nexport function createKanbanKeyboardCoordinates(\n\tvalue: Record<string, unknown[]>,\n\tgetItemValue: (item: unknown) => string,\n\tfindItem: (id: string) => KanbanKeyboardPosition | undefined,\n\tdestination: { current: KanbanKeyboardPosition | null },\n\tonPositionChange?: (position: KanbanKeyboardPosition) => void,\n): KeyboardCoordinateGetter {\n\treturn (event, { currentCoordinates, context }) => {\n\t\tif (!['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code)) return undefined;\n\t\tconst active = context.active;\n\t\tif (!active) return undefined;\n\t\tconst position = destination.current ?? findItem(String(active.id));\n\t\tif (!position) return undefined;\n\t\tevent.preventDefault();\n\t\tconst next = getKanbanKeyboardPosition(value, position, event.code);\n\t\tdestination.current = next;\n\t\tonPositionChange?.(next);\n\t\tconst item = value[next.columnId][next.index];\n\t\tconst id = item === undefined ? next.columnId : getItemValue(item);\n\t\tconst rect = context.droppableRects.get(id);\n\t\tconst activeRect = context.collisionRect;\n\t\tif (!rect || !activeRect) return currentCoordinates;\n\t\treturn {\n\t\t\tx: currentCoordinates.x + rect.left - activeRect.left,\n\t\t\ty: currentCoordinates.y + rect.top - activeRect.top,\n\t\t};\n\t};\n}\n","import { useCallback, useMemo } from 'react';\n\nimport type { KanbanItemMoveEvent, KanbanValue } from '../kanban.types';\n\n/**\n * Headless hook — exposes the same state machine `<Kanban>` uses\n * internally so consumers can build a fully custom UI against it.\n *\n * const { findItem, move } = useKanban({ value, onValueChange,\n * getItemValue });\n * move({ itemId: 'card-1', toColumnId: 'shipped', toIndex: 0 });\n */\nexport interface UseKanbanOptions<T> {\n\tvalue: KanbanValue<T>;\n\tonValueChange: (next: KanbanValue<T>) => void;\n\tgetItemValue: (item: T) => string;\n\tonItemMove?: (event: KanbanItemMoveEvent<T>) => void;\n}\n\nexport interface UseKanbanResult<T> {\n\tfindItem: (id: string) => { columnId: string; index: number; item: T } | undefined;\n\t/**\n\t * Move an item between columns / within the same column. Idempotent:\n\t * a no-op move is safe.\n\t */\n\tmove: (input: { itemId: string; toColumnId: string; toIndex?: number }) => void;\n}\n\nexport function useKanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tonItemMove,\n}: UseKanbanOptions<T>): UseKanbanResult<T> {\n\tconst findItem = useCallback(\n\t\t(id: string) => {\n\t\t\tfor (const [columnId, items] of Object.entries(value)) {\n\t\t\t\tconst index = items.findIndex((item) => getItemValue(item) === id);\n\t\t\t\tif (index >= 0) return { columnId, index, item: items[index] };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t[value, getItemValue],\n\t);\n\n\tconst move = useCallback(\n\t\t({ itemId, toColumnId, toIndex }: { itemId: string; toColumnId: string; toIndex?: number }) => {\n\t\t\tconst found = findItem(itemId);\n\t\t\tif (!found) return;\n\t\t\tif (!Object.prototype.hasOwnProperty.call(value, toColumnId)) return;\n\n\t\t\tconst { columnId: fromColumnId, index: fromIndex, item } = found;\n\n\t\t\tconst targetItems = value[toColumnId];\n\t\t\tconst sameColumn = fromColumnId === toColumnId;\n\t\t\tconst resolvedToIndex =\n\t\t\t\ttoIndex === undefined\n\t\t\t\t\t? targetItems.length\n\t\t\t\t\t: Math.max(0, Math.min(toIndex, targetItems.length));\n\n\t\t\t// Removing a card shifts later slots in the same column.\n\t\t\tconst landingIndex = sameColumn && fromIndex < resolvedToIndex ? resolvedToIndex - 1 : resolvedToIndex;\n\t\t\tif (sameColumn && fromIndex === landingIndex) return;\n\n\t\t\tconst next: KanbanValue<T> = { ...value };\n\t\t\tconst sourceCopy = [...next[fromColumnId]];\n\t\t\tsourceCopy.splice(fromIndex, 1);\n\t\t\tnext[fromColumnId] = sourceCopy;\n\n\t\t\tconst targetCopy = sameColumn ? sourceCopy : [...next[toColumnId]];\n\t\t\ttargetCopy.splice(landingIndex, 0, item);\n\t\t\tnext[toColumnId] = targetCopy;\n\n\t\t\tonValueChange(next);\n\t\t\tonItemMove?.({\n\t\t\t\titem,\n\t\t\t\titemId,\n\t\t\t\tfrom: { columnId: fromColumnId, index: fromIndex },\n\t\t\t\tto: { columnId: toColumnId, index: landingIndex },\n\t\t\t});\n\t\t},\n\t\t[value, findItem, onValueChange, onItemMove],\n\t);\n\n\treturn useMemo(() => ({ findItem, move }), [findItem, move]);\n}\n","import { createContext, useContext } from 'react';\n\nimport type { KanbanContextShape } from './kanban.types';\n\n/**\n * Internal context for the Kanban — the parts use this to read\n * shared state (current value, getItemValue, active drag id).\n */\nconst KanbanContext = createContext<KanbanContextShape | null>(null);\n\nexport const KanbanContextProvider = KanbanContext.Provider;\n\nexport function useKanbanContext<T = unknown>(): KanbanContextShape<T> {\n\tconst ctx = useContext(KanbanContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'Kanban subcomponents must be rendered inside a <Kanban> root.',\n\t\t);\n\t}\n\treturn ctx as unknown as KanbanContextShape<T>;\n}\n\n/**\n * Internal context exposed by `<KanbanItem>` so the optional\n * `<KanbanItemHandle>` knows which listeners + accessibility props to\n * wire to the dedicated drag handle. Also carries the resolved\n * domain item so `<KanbanItemActions>` (and any other item-aware\n * subcomponent) can render per-item content without prop drilling.\n *\n * The dnd-kit shapes are widened to `unknown` so consumers can spread\n * them onto any HTMLElement.\n */\nexport interface KanbanItemContextShape<T = unknown> {\n\tlisteners: unknown;\n\tattributes: unknown;\n\tsetActivatorNodeRef: (node: HTMLElement | null) => void;\n\tregisterHandle: () => () => void;\n\t/** Stable id (the value returned by `getItemValue`). */\n\titemId: string;\n\t/** The domain item itself — null if it can't be resolved. */\n\titem: T | null;\n}\n\nconst KanbanItemContext = createContext<KanbanItemContextShape | null>(null);\n\nexport const KanbanItemContextProvider = KanbanItemContext.Provider;\n\nexport function useKanbanItemContext<T = unknown>(): KanbanItemContextShape<T> {\n\tconst ctx = useContext(KanbanItemContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'<KanbanItemHandle> / <KanbanItemActions> must be rendered inside a <KanbanItem>.',\n\t\t);\n\t}\n\treturn ctx as KanbanItemContextShape<T>;\n}\n","/**\n * Strings for the Kanban — drag-and-drop screen-reader announcements\n * + accessibility labels. The library never renders user-visible copy\n * that the consumer hasn't already supplied via column headers / item\n * children, so the strings here are exclusively for assistive tech.\n */\nexport interface KanbanStrings {\n\t/** Read by screen readers when a drag begins. `{name}` = item label (or ID). */\n\tannounceDragStart: string;\n\t/** Read when an item moves over a column. `{from}` / `{to}` are column labels; `{position}` is one-based. */\n\tannounceDragMove: string;\n\t/** Read when an item is dropped into a column. */\n\tannounceDragEnd: string;\n\t/** Read when the user cancels a drag with Escape. */\n\tannounceDragCancel: string;\n\t/** Aria label on the drag handle. */\n\tdragHandleAria: string;\n\t/** Aria label on the board landmark. */\n\tboardAria: string;\n\t/** Aria label on the per-item actions trigger (`⋯`). */\n\titemActionsAria: string;\n}\n\nexport const defaultKanbanStrings: KanbanStrings = {\n\tannounceDragStart: 'Picked up item {name}.',\n\tannounceDragMove: 'Moving {name} from {from} to {to}, position {position}.',\n\tannounceDragEnd: 'Dropped {name} into {to}, position {position}.',\n\tannounceDragCancel: 'Cancelled drag of {name}.',\n\tdragHandleAria: 'Drag handle',\n\tboardAria: 'Kanban board',\n\titemActionsAria: 'Item actions',\n};\n\nexport function interpolateKanbanString(\n\ttemplate: string,\n\tparams: Record<string, string>,\n): string {\n\treturn Object.entries(params).reduce(\n\t\t(acc, [key, value]) => acc.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value),\n\t\ttemplate,\n\t);\n}\n","/**\n * Kanban — drag-and-drop board with multi-column item sorting and\n * cross-column moves. Headless behavior comes from `@dnd-kit/core` +\n * `@dnd-kit/sortable`; the library wires it into a callback-driven,\n * generic-T API:\n *\n * <Kanban\n * value={columns}\n * onValueChange={setColumns}\n * getItemValue={(c) => c.id}\n * onItemMove={(e) => api.persistMove(e)}\n * >\n * <KanbanBoard className=\"grid grid-cols-3 gap-3\">\n * {Object.entries(columns).map(([colId, items]) => (\n * <KanbanColumn key={colId} value={colId}>\n * <header>{COLUMNS[colId].title}</header>\n * <KanbanColumnContent value={colId}>\n * {items.map((card) => (\n * <KanbanItem key={card.id} value={card.id}>\n * …card body…\n * </KanbanItem>\n * ))}\n * </KanbanColumnContent>\n * </KanbanColumn>\n * ))}\n * </KanbanBoard>\n * <KanbanOverlay />\n * </Kanban>\n *\n * The library never reaches into a router, never persists state — your\n * `onValueChange` is the source of truth. Use `onItemMove` for\n * analytics / optimistic-update plumbing.\n */\nimport {\n\tDndContext,\n\tDragOverlay,\n\tPointerSensor,\n\tKeyboardSensor,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors,\n\ttype DragEndEvent,\n\ttype DragStartEvent,\n} from '@dnd-kit/core';\nimport {\n\tSortableContext,\n\tuseSortable,\n\tverticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type MouseEvent } from 'react';\n\nimport { Button } from '../../base/buttons';\nimport { ActionMenu, type ActionMenuAction } from '../../base/action-menu';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { createKanbanKeyboardCoordinates, type KanbanKeyboardPosition } from './kanban-keyboard';\nimport { useKanban } from './hooks/use-kanban';\nimport {\n\tKanbanContextProvider,\n\tKanbanItemContextProvider,\n\tuseKanbanContext,\n\tuseKanbanItemContext,\n} from './kanban-context';\nimport { defaultKanbanStrings, interpolateKanbanString } from './kanban.strings';\nimport type {\n\tKanbanBoardProps,\n\tKanbanColumnContentProps,\n\tKanbanColumnProps,\n\tKanbanItemAction,\n\tKanbanItemActionsConfig,\n\tKanbanItemActionsProps,\n\tKanbanItemHandleProps,\n\tKanbanItemProps,\n\tKanbanOverlayProps,\n\tKanbanProps,\n} from './kanban.types';\nimport { toneRecipes } from '../../../lib/tone-recipes';\nimport { popoverWidthRecipes } from '../../base/popover/popover.recipes';\n\nexport function Kanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tgetItemLabel,\n\tgetColumnLabel,\n\tonItemMove,\n\titemActions,\n\tonItemClick,\n\tstrings: stringsProp,\n\tclassName,\n\tchildren,\n}: KanbanProps<T>) {\n\tconst strings = useStrings(defaultKanbanStrings, stringsProp);\n\tconst { findItem, move } = useKanban({\n\t\tvalue,\n\t\tonValueChange,\n\t\tgetItemValue,\n\t\tonItemMove,\n\t});\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst boardRef = useRef<HTMLDivElement | null>(null);\n\tconst keyboardFocusId = useRef<string | null>(null);\n\tuseLayoutEffect(() => {\n\t\tif (activeId || !keyboardFocusId.current) return;\n\t\tconst item = Array.from(boardRef.current?.querySelectorAll<HTMLElement>('[data-kanban-item-id]') ?? []).find(node => node.dataset.kanbanItemId === keyboardFocusId.current);\n\t\tconst handle = item?.querySelector<HTMLElement>('[data-slot=\"kanban-item-handle\"]') ?? item;\n\t\tif (handle) { handle.focus(); keyboardFocusId.current = null; }\n\t}, [activeId, value]);\n\tconst dragOrigin = useRef<{ columnId: string; index: number; name: string } | null>(null);\n\tconst completedDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst [keyboardPosition, setKeyboardPosition] = useState<KanbanKeyboardPosition | null>(null);\n\tconst keyboardDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst keyboardCoordinates = useMemo(() => createKanbanKeyboardCoordinates(\n\t\tvalue, getItemValue as (item: unknown) => string, findItem, keyboardDestination, setKeyboardPosition,\n\t), [value, getItemValue, findItem]);\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n\t\tuseSensor(KeyboardSensor, { coordinateGetter: keyboardCoordinates }),\n\t);\n\n\tconst activeItem = useMemo(\n\t\t() => (activeId ? findItem(activeId)?.item ?? null : null),\n\t\t[activeId, findItem],\n\t);\n\n\tconst handleDragStart = useCallback(\n\t\t(event: DragStartEvent) => {\n\t\t\tconst item = findItem(String(event.active.id));\n\t\t\tdragOrigin.current = item ? { columnId: item.columnId, index: item.index, name: getItemLabel?.(item.item) ?? String(event.active.id) } : null;\n\t\t\tcompletedDestination.current = null;\n\t\t\tsetKeyboardPosition(null);\n\t\t\tkeyboardDestination.current = null;\n\t\t\tkeyboardFocusId.current = event.activatorEvent instanceof KeyboardEvent ? String(event.active.id) : null;\n\t\t\tsetActiveId(String(event.active.id));\n\t\t},\n\t\t[findItem, getItemLabel],\n\t);\n\n\tconst handleDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tsetActiveId(null);\n\t\t\tsetKeyboardPosition(null);\n\t\t\tconst { active, over } = event;\n\t\t\tconst destination = keyboardDestination.current;\n\t\t\tcompletedDestination.current = destination;\n\t\t\tkeyboardDestination.current = null;\n\t\t\tconst overData = over?.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overId = over ? String(over.id) : undefined;\n\n\t\t\tconst targetColumnId =\n\t\t\t\tdestination?.columnId ?? overData?.columnId ?? (overId !== undefined && Object.hasOwn(value, overId) ? overId : undefined);\n\t\t\tif (targetColumnId === undefined) return;\n\n\t\t\tconst itemId = String(active.id);\n\t\t\tconst source = findItem(itemId);\n\t\t\tconst targetIndex = destination?.index ?? overData?.index;\n\t\t\t// Convert the occupied slot to the insert-before index used by move().\n\t\t\t// A column container supplies no index and appends.\n\t\t\tconst toIndex = targetIndex !== undefined && source?.columnId === targetColumnId && source.index < targetIndex\n\t\t\t\t? targetIndex + 1\n\t\t\t\t: targetIndex;\n\t\t\tmove({ itemId, toColumnId: targetColumnId, toIndex });\n\t\t},\n\t\t[move, value, findItem],\n\t);\n\n\tconst ctxValue = useMemo(\n\t\t() => ({\n\t\t\tvalue: value as Record<string, unknown[]>,\n\t\t\tonValueChange: onValueChange as (next: Record<string, unknown[]>) => void,\n\t\t\tgetItemValue: getItemValue as (item: unknown) => string,\n\t\t\tactiveId,\n\t\t\tactiveItem: activeItem as unknown,\n\t\t\tfindItem: findItem as (id: string) => { columnId: string; index: number; item: unknown } | undefined,\n\t\t\titemActions: itemActions as KanbanItemActionsConfig<unknown> | undefined,\n\t\t\tonItemClick: onItemClick as ((item: unknown) => void) | undefined,\n\t\t}),\n\t\t[value, onValueChange, getItemValue, activeId, activeItem, findItem, itemActions, onItemClick],\n\t);\n\n\tconst announcementParams = (itemId: string, overId?: string) => {\n\t\tconst item = findItem(itemId);\n\t\tconst origin = dragOrigin.current;\n\t\tconst over = overId ? findItem(overId) : undefined;\n\t\tconst position = keyboardDestination.current ?? completedDestination.current ?? over ?? (overId && value[overId] ? { columnId: overId, index: value[overId].length } : origin);\n\t\tconst columnName = (id?: string) => id ? getColumnLabel?.(id) ?? id : '';\n\t\treturn {\n\t\t\tname: origin?.name ?? (item ? getItemLabel?.(item.item) ?? itemId : itemId),\n\t\t\tfrom: columnName(origin?.columnId),\n\t\t\tto: columnName(position?.columnId),\n\t\t\tposition: String((position?.index ?? 0) + 1),\n\t\t};\n\t};\n\treturn (\n\t\t<KanbanContextProvider value={ctxValue}>\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\tonDragCancel={() => { keyboardDestination.current = null; setKeyboardPosition(null); setActiveId(null); }}\n\t\t\t\taccessibility={{\n\t\t\t\t\tannouncements: {\n\t\t\t\t\t\tonDragStart({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragStart, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragMove({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragOver({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragEnd({ active, over }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragEnd, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragCancel({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragCancel, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tref={boardRef}\n\t\t\t\t\trole=\"application\"\n\t\t\t\t\taria-label={strings.boardAria}\n\t\t\t\t\tclassName={cn('kanban--component', 'w-full', className)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t<div className=\"kanban--keyboard-announcement sr-only\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">\n\t\t\t\t\t\t<Text tag=\"span\">{activeId && keyboardPosition ? interpolateKanbanString(strings.announceDragMove, announcementParams(activeId)) : ''}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DndContext>\n\t\t</KanbanContextProvider>\n\t);\n}\n\nKanban.displayName = 'Kanban';\n\nexport function KanbanBoard({ className, style, children }: KanbanBoardProps) {\n\treturn (\n\t\t<div className={cn('grid w-full gap-space-lg', className)} style={style}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanBoard.displayName = 'KanbanBoard';\n\nexport function KanbanColumn({ value, className, children }: KanbanColumnProps) {\n\tconst { setNodeRef, isOver } = useDroppable({ id: value });\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tdata-slot=\"kanban-column\"\n\t\t\tdata-column-id={value}\n\t\t\tdata-over={isOver ? 'true' : undefined}\n\t\t\tclassName={cn('flex min-w-0 flex-col', className)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanColumn.displayName = 'KanbanColumn';\n\nexport function KanbanColumnContent({\n\tvalue,\n\tclassName,\n\tchildren,\n}: KanbanColumnContentProps) {\n\tconst ctx = useKanbanContext();\n\tconst items = ctx.value[value] ?? [];\n\tconst ids = items.map((item) => ctx.getItemValue(item));\n\treturn (\n\t\t<SortableContext items={ids} strategy={verticalListSortingStrategy}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"kanban-column-content\"\n\t\t\t\tclassName={cn('flex flex-col gap-space-md', className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</SortableContext>\n\t);\n}\n\nKanbanColumnContent.displayName = 'KanbanColumnContent';\n\nexport function KanbanItem({\n\tvalue,\n\tclassName,\n\tdisabled = false,\n\tonClick,\n\tchildren,\n}: KanbanItemProps) {\n\tconst ctx = useKanbanContext();\n\tconst found = ctx.findItem(value);\n\tconst {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetNodeRef,\n\t\tsetActivatorNodeRef,\n\t\ttransform,\n\t\ttransition,\n\t\tisDragging,\n\t} = useSortable({\n\t\tid: value,\n\t\tdisabled,\n\t\tdata: { columnId: found?.columnId, index: found?.index },\n\t});\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : undefined,\n\t};\n\tconst [handleCount, setHandleCount] = useState(0);\n\tconst hasHandle = handleCount > 0;\n\tconst registerHandle = useCallback(() => {\n\t\tsetHandleCount((count) => count + 1);\n\t\treturn () => setHandleCount((count) => Math.max(0, count - 1));\n\t}, []);\n\n\tconst itemCtx = useMemo(\n\t\t() => ({\n\t\t\tlisteners,\n\t\t\tattributes,\n\t\t\tsetActivatorNodeRef,\n\t\t\tregisterHandle,\n\t\t\titemId: value,\n\t\t\titem: found?.item ?? null,\n\t\t}),\n\t\t[listeners, attributes, setActivatorNodeRef, registerHandle, value, found?.item],\n\t);\n\n\tconst rootClick = ctx.onItemClick;\n\tconst handleClick = useCallback(\n\t\t(event: MouseEvent<HTMLDivElement>) => {\n\t\t\t// `<KanbanItemHandle>` and `<KanbanItemActions>` mark themselves\n\t\t\t// with `data-stop-item-click` so a click on the drag handle or\n\t\t\t// the actions menu doesn't bubble up as a card click.\n\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\tif (target?.closest('[data-stop-item-click]')) return;\n\t\t\tif (onClick) {\n\t\t\t\tonClick();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rootClick && found?.item !== undefined) {\n\t\t\t\trootClick(found.item);\n\t\t\t}\n\t\t},\n\t\t[onClick, rootClick, found?.item],\n\t);\n\n\tconst isClickable = Boolean(onClick || rootClick);\n\n\t// When no <KanbanItemHandle> is used, the whole row is the activator.\n\t// We attach listeners + attributes here as the default — KanbanItemHandle\n\t// can then override by wiring them to a more specific element.\n\treturn (\n\t\t<KanbanItemContextProvider value={itemCtx}>\n\t\t\t<div\n\t\t\t\tref={setNodeRef}\n\t\t\t\tstyle={style}\n\t\t\t\tdata-slot=\"kanban-item\"\n\t\t\t\tdata-kanban-item-id={value}\n\t\t\t\tdata-dragging={isDragging ? 'true' : undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'touch-none select-none',\n\t\t\t\t\tisClickable && 'cursor-pointer',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={isClickable ? handleClick : undefined}\n\t\t\t\t{...(!hasHandle ? attributes : {})}\n\t\t\t\t{...(!hasHandle ? listeners : {})}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</KanbanItemContextProvider>\n\t);\n}\n\nKanbanItem.displayName = 'KanbanItem';\n\nexport const KanbanItemHandle = forwardRef<HTMLButtonElement, KanbanItemHandleProps>(function KanbanItemHandle({ className, children }, forwardedRef) {\n\tconst { setActivatorNodeRef, listeners, attributes, registerHandle } = useKanbanItemContext();\n\tuseEffect(() => registerHandle(), [registerHandle]);\n\t// Merge dnd-kit's activator ref with the consumer's forwarded ref so a\n\t// `<Tooltip><KanbanItemHandle ref={…}/></Tooltip>` wiring still gets a\n\t// real ref to the button element.\n\tconst setMergedRef = useCallback(\n\t\t(node: HTMLButtonElement | null) => {\n\t\t\tsetActivatorNodeRef(node);\n\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\tforwardedRef(node);\n\t\t\t} else if (forwardedRef) {\n\t\t\t\tforwardedRef.current = node;\n\t\t\t}\n\t\t},\n\t\t[setActivatorNodeRef, forwardedRef],\n\t);\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"sm\" iconOnly\n\t\t\tref={setMergedRef}\n\t\t\tdata-slot=\"kanban-item-handle\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tclassName={cn(\n\t\t\t\t'cursor-grab shadow-none active:cursor-grabbing',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...(attributes as Record<string, unknown>)}\n\t\t\t{...(listeners as Record<string, unknown>)}\n\t\t>\n\t\t\t{children}\n\t\t</Button>\n\t);\n});\n\nKanbanItemHandle.displayName = 'KanbanItemHandle';\n\n/**\n * Per-item actions menu (`⋯` trigger → popover with the actions\n * registered at the `<Kanban itemActions>` root). Place inside any\n * `<KanbanItem>` — typically in the card's top-right corner.\n *\n * The trigger marks itself with `data-stop-item-click` so opening the\n * menu doesn't fire the parent `onItemClick` callback.\n */\nexport function KanbanItemActions<T = unknown>({\n\tclassName,\n\ticon,\n\tariaLabel,\n}: KanbanItemActionsProps) {\n\tconst ctx = useKanbanContext<T>();\n\tconst itemCtx = useKanbanItemContext<T>();\n\tconst strings = useStrings(defaultKanbanStrings, undefined);\n\n\tconst item = itemCtx.item;\n\tconst rawActions = ctx.itemActions;\n\tconst actions = useMemo<ReadonlyArray<\n\t\tOmit<KanbanItemAction<T>, 'visible' | 'disabled'> & {\n\t\t\tvisible: boolean;\n\t\t\tdisabled: boolean;\n\t\t}\n\t>>(() => {\n\t\tif (!rawActions || item === null || item === undefined) return [];\n\t\tconst list = typeof rawActions === 'function' ? rawActions(item) : rawActions;\n\t\treturn list.flatMap((action) => {\n\t\t\tconst visible = typeof action.visible === 'function'\n\t\t\t\t? action.visible(item)\n\t\t\t\t: action.visible ?? true;\n\t\t\tif (!visible) return [];\n\t\t\tconst disabled = typeof action.disabled === 'function'\n\t\t\t\t? action.disabled(item)\n\t\t\t\t: action.disabled ?? false;\n\t\t\treturn [{ ...action, visible, disabled }];\n\t\t});\n\t}, [rawActions, item]);\n\n\tif (item === null || actions.length === 0) return null;\n\n\tconst menuActions: ActionMenuAction[] = actions.map((action) => ({\n\t\tid: action.id,\n\t\tlabel: action.label,\n\t\ticon: action.icon,\n\t\tdisabled: action.disabled,\n\t\ttone: action.tone,\n\t\tbuttonStyle: action.buttonStyle,\n\t\tonClick: () => action.onClick(item),\n\t}));\n\n\treturn (\n\t\t<span\n\t\t\tclassName=\"kanban-item-actions--component inline-flex\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tonPointerDown={(event) => event.stopPropagation()}\n\t\t>\n\t\t\t<ActionMenu\n\t\t\t\tactions={menuActions}\n\t\t\t\ticon={icon ?? undefined}\n\t\t\t\tsrText={ariaLabel ?? strings.itemActionsAria}\n\t\t\t\twidth={popoverWidthRecipes.xs}\n\t\t\t\talign=\"end\"\n\t\t\t\tbuttonProps={{\n\t\t\t\t\tclassName,\n\t\t\t\t\t'data-slot': 'kanban-item-actions-trigger',\n\t\t\t\t\t'data-stop-item-click': true,\n\t\t\t\t\t'aria-label': ariaLabel ?? strings.itemActionsAria,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nKanbanItemActions.displayName = 'KanbanItemActions';\n\nexport function KanbanOverlay<T = unknown>({ className, render }: KanbanOverlayProps<T>) {\n\tconst { activeItem, activeId, findItem } = useKanbanContext<T>();\n\treturn (\n\t\t<DragOverlay>\n\t\t\t{activeId\n\t\t\t\t? render\n\t\t\t\t\t? render({\n\t\t\t\t\t\t\titem: activeItem,\n\t\t\t\t\t\t\tcolumnId: findItem(activeId)?.columnId ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'kanban-overlay--component pointer-events-none rounded-surface border-2 border-dashed p-surface shadow-lg',\n\t\t\t\t\t\t\t\ttoneRecipes.primary.edge,\n\t\t\t\t\t\t\t\ttoneRecipes.primary.wash,\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"text-primary-accent\">{activeId}</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t: null}\n\t\t</DragOverlay>\n\t);\n}\n\nKanbanOverlay.displayName = 'KanbanOverlay';\n"],"mappings":"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"}
@@ -807,3 +807,18 @@ svg.leaflet-image-layer.leaflet-interactive path {
807
807
  .map-popup--component .leaflet-popup-close-button {
808
808
  color: var(--muted-foreground);
809
809
  }
810
+
811
+ /* Leaflet owns placement and its one external arrow. Let the package's layered
812
+ * tooltip recipe own chrome instead of Leaflet's unlayered white surface. */
813
+ .map-tooltip--component.leaflet-tooltip {
814
+ padding: revert-layer;
815
+ background-color: revert-layer;
816
+ color: revert-layer;
817
+ border: revert-layer;
818
+ border-radius: revert-layer;
819
+ box-shadow: revert-layer;
820
+ }
821
+ .map-tooltip--component.leaflet-tooltip-top::before { border-top-color: var(--inverse-background); }
822
+ .map-tooltip--component.leaflet-tooltip-bottom::before { border-bottom-color: var(--inverse-background); }
823
+ .map-tooltip--component.leaflet-tooltip-left::before { border-left-color: var(--inverse-background); }
824
+ .map-tooltip--component.leaflet-tooltip-right::before { border-right-color: var(--inverse-background); }