@keboola/design 13.1.3 → 14.0.0

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 (347) hide show
  1. package/AGENTS.md +68 -6
  2. package/CHANGELOG.md +196 -0
  3. package/COMPONENT-API.md +60 -50
  4. package/dist/{AIKit-BVCWP9Ks.js → AIKit-BRSZ3nY7.js} +2227 -313
  5. package/dist/AIKit-BRSZ3nY7.js.map +1 -0
  6. package/dist/{Alert-UI-CIs-1.js → Alert-CZ0dDsuk.js} +7 -7
  7. package/dist/{Alert-UI-CIs-1.js.map → Alert-CZ0dDsuk.js.map} +1 -1
  8. package/dist/{AlertModal-mbSnuuka.js → AlertModal-BDle9ZVQ.js} +6 -6
  9. package/dist/AlertModal-BDle9ZVQ.js.map +1 -0
  10. package/dist/{AppShell-WSQabK8r.js → AppShell-B03fj1j7.js} +2 -2
  11. package/dist/{AppShell-WSQabK8r.js.map → AppShell-B03fj1j7.js.map} +1 -1
  12. package/dist/{AutoSaveTextarea-C5iIr2Ts.js → AutoSaveTextarea-jiqNeeE4.js} +3 -3
  13. package/dist/{AutoSaveTextarea-C5iIr2Ts.js.map → AutoSaveTextarea-jiqNeeE4.js.map} +1 -1
  14. package/dist/{Badge-Dz0cj6rj.js → Badge-Ba3epgcI.js} +2 -2
  15. package/dist/{Badge-Dz0cj6rj.js.map → Badge-Ba3epgcI.js.map} +1 -1
  16. package/dist/{BrandEditor-P8OZX2hi.js → BrandEditor-CN2HJ_12.js} +155 -17
  17. package/dist/BrandEditor-CN2HJ_12.js.map +1 -0
  18. package/dist/{BrandLogo-CKpVSZb6.js → BrandLogo-BfITD0im.js} +2 -2
  19. package/dist/{BrandLogo-CKpVSZb6.js.map → BrandLogo-BfITD0im.js.map} +1 -1
  20. package/dist/{Breadcrumb-BUoAZyhO.js → Breadcrumb-BnIlsoIH.js} +62 -20
  21. package/dist/Breadcrumb-BnIlsoIH.js.map +1 -0
  22. package/dist/{Button-B21oVcPU.js → Button-D2JqBAq7.js} +199 -7
  23. package/dist/Button-D2JqBAq7.js.map +1 -0
  24. package/dist/{Calendar-DFtmZzbF.js → Calendar-BnKi1kPu.js} +4 -4
  25. package/dist/{Calendar-DFtmZzbF.js.map → Calendar-BnKi1kPu.js.map} +1 -1
  26. package/dist/{Card-BQmBWHXl.js → Card-Bpc_ZlL4.js} +3 -3
  27. package/dist/Card-Bpc_ZlL4.js.map +1 -0
  28. package/dist/{Checkbox-8yIIgY7g.js → Checkbox-uFE8XLT_.js} +6 -6
  29. package/dist/Checkbox-uFE8XLT_.js.map +1 -0
  30. package/dist/{Clipboard-_xf6hMDD.js → Clipboard-D-9XOqy4.js} +3 -3
  31. package/dist/{Clipboard-_xf6hMDD.js.map → Clipboard-D-9XOqy4.js.map} +1 -1
  32. package/dist/{ClipboardButton-srUgWgwH.js → ClipboardButton-DxvZG_H0.js} +4 -4
  33. package/dist/{ClipboardButton-srUgWgwH.js.map → ClipboardButton-DxvZG_H0.js.map} +1 -1
  34. package/dist/{CodeEditor-Df7VVx08.js → CodeEditor-BfRSCKEs.js} +6 -6
  35. package/dist/{CodeEditor-Df7VVx08.js.map → CodeEditor-BfRSCKEs.js.map} +1 -1
  36. package/dist/{Collapsible-BQXWEOBC.js → Collapsible-DD4xTL75.js} +2 -2
  37. package/dist/{Collapsible-BQXWEOBC.js.map → Collapsible-DD4xTL75.js.map} +1 -1
  38. package/dist/{ColorInput-B3gBZ8Ya.js → ColorInput-CDKH8q_f.js} +5 -5
  39. package/dist/{ColorInput-B3gBZ8Ya.js.map → ColorInput-CDKH8q_f.js.map} +1 -1
  40. package/dist/{ColorModeSwitch-D8Cki137.js → ColorModeSwitch-DR6J2U6M.js} +4 -4
  41. package/dist/{ColorModeSwitch-D8Cki137.js.map → ColorModeSwitch-DR6J2U6M.js.map} +1 -1
  42. package/dist/{Combobox-BNhW0TDB.js → Combobox-CEesMe2M.js} +246 -44
  43. package/dist/Combobox-CEesMe2M.js.map +1 -0
  44. package/dist/{Command-BQPiZCNz.js → Command-T3MLRaen.js} +10 -6
  45. package/dist/Command-T3MLRaen.js.map +1 -0
  46. package/dist/{CopyField-Ba7h8MqZ.js → CopyField-CNbCHw9a.js} +4 -4
  47. package/dist/{CopyField-Ba7h8MqZ.js.map → CopyField-CNbCHw9a.js.map} +1 -1
  48. package/dist/{DateInput-D0nWUasV.js → DateInput-ClK1lCxz.js} +5 -5
  49. package/dist/{DateInput-D0nWUasV.js.map → DateInput-ClK1lCxz.js.map} +1 -1
  50. package/dist/{DatePicker-CtSa9b3V.js → DatePicker-CgHAu9KX.js} +3 -3
  51. package/dist/{DatePicker-CtSa9b3V.js.map → DatePicker-CgHAu9KX.js.map} +1 -1
  52. package/dist/{DateRangeInput-i6wE45-V.js → DateRangeInput-DtlAffS1.js} +5 -5
  53. package/dist/{DateRangeInput-i6wE45-V.js.map → DateRangeInput-DtlAffS1.js.map} +1 -1
  54. package/dist/{DateRangePicker-BAnuz6vO.js → DateRangePicker-CXpXPMoh.js} +8 -8
  55. package/dist/{DateRangePicker-BAnuz6vO.js.map → DateRangePicker-CXpXPMoh.js.map} +1 -1
  56. package/dist/{DiffView-ppTIzh2h.js → DiffView-Dy4z-n-1.js} +3 -3
  57. package/dist/{DiffView-ppTIzh2h.js.map → DiffView-Dy4z-n-1.js.map} +1 -1
  58. package/dist/{DropdownMenu-BJGLjpVc.js → DropdownMenu-B1gGvZoh.js} +9 -9
  59. package/dist/DropdownMenu-B1gGvZoh.js.map +1 -0
  60. package/dist/{FieldBox-D7DYtX_m.js → FieldBox-BrxLkY9C.js} +8 -6
  61. package/dist/FieldBox-BrxLkY9C.js.map +1 -0
  62. package/dist/{FieldItem-BHViBJS3.js → FieldItem-CYvJyjiI.js} +4 -4
  63. package/dist/{FieldItem-BHViBJS3.js.map → FieldItem-CYvJyjiI.js.map} +1 -1
  64. package/dist/{FileUpload-Ch2hrIWq.js → FileUpload-D6vPG3WB.js} +9 -9
  65. package/dist/FileUpload-D6vPG3WB.js.map +1 -0
  66. package/dist/{Form-VkzfVPyT.js → Form-CD55zJiy.js} +10 -10
  67. package/dist/{Form-VkzfVPyT.js.map → Form-CD55zJiy.js.map} +1 -1
  68. package/dist/{FormGroup-CmCppxOn.js → FormGroup-DiYFdEhH.js} +4 -4
  69. package/dist/{FormGroup-CmCppxOn.js.map → FormGroup-DiYFdEhH.js.map} +1 -1
  70. package/dist/{FullScreenModal-Cwnm8WdM.js → FullScreenModal-CUuAakh3.js} +20 -6
  71. package/dist/{FullScreenModal-Cwnm8WdM.js.map → FullScreenModal-CUuAakh3.js.map} +1 -1
  72. package/dist/HoverCard-BBdPYqEf.js +31 -0
  73. package/dist/HoverCard-BBdPYqEf.js.map +1 -0
  74. package/dist/InlineEdit-D5RdunZo.js +370 -0
  75. package/dist/InlineEdit-D5RdunZo.js.map +1 -0
  76. package/dist/{InputGroup-CrlMRz4X.js → InputGroup-Dm014ruw.js} +4 -4
  77. package/dist/{InputGroup-CrlMRz4X.js.map → InputGroup-Dm014ruw.js.map} +1 -1
  78. package/dist/{Kbd-J4n1J6i4.js → Kbd-3YM7NQO4.js} +3 -3
  79. package/dist/{Kbd-J4n1J6i4.js.map → Kbd-3YM7NQO4.js.map} +1 -1
  80. package/dist/MermaidDiagram-CeiOkI60.js +199 -0
  81. package/dist/MermaidDiagram-CeiOkI60.js.map +1 -0
  82. package/dist/{Modal-BkSuS9Yz.js → Modal-DMZRswk4.js} +8 -7
  83. package/dist/Modal-DMZRswk4.js.map +1 -0
  84. package/dist/{ModalTitle-BxopkIoQ.js → ModalTitle-CTECVgL8.js} +3 -3
  85. package/dist/ModalTitle-CTECVgL8.js.map +1 -0
  86. package/dist/{MultiActionButtonGroup-AWLj1Tg7.js → MultiActionButtonGroup-CEv_txvz.js} +5 -5
  87. package/dist/{MultiActionButtonGroup-AWLj1Tg7.js.map → MultiActionButtonGroup-CEv_txvz.js.map} +1 -1
  88. package/dist/{Navbar-B_DNpv5s.js → Navbar-CtVYcRFn.js} +18 -14
  89. package/dist/Navbar-CtVYcRFn.js.map +1 -0
  90. package/dist/{OtpInput-I8B8Vjdl.js → OtpInput-CY8yCaJk.js} +4 -4
  91. package/dist/{OtpInput-I8B8Vjdl.js.map → OtpInput-CY8yCaJk.js.map} +1 -1
  92. package/dist/{PageHeader-CgfyXpf1.js → PageHeader-CL1A6jFM.js} +21 -14
  93. package/dist/PageHeader-CL1A6jFM.js.map +1 -0
  94. package/dist/{PageLayout-DiAAILuS.js → PageLayout-C9aXTpqV.js} +2 -2
  95. package/dist/{PageLayout-DiAAILuS.js.map → PageLayout-C9aXTpqV.js.map} +1 -1
  96. package/dist/{PageToolbar-C06RKIif.js → PageToolbar-B_e7HGva.js} +6 -6
  97. package/dist/{PageToolbar-C06RKIif.js.map → PageToolbar-B_e7HGva.js.map} +1 -1
  98. package/dist/{Pagination-DH3f6LN0.js → Pagination-DDp6PRqf.js} +5 -5
  99. package/dist/Pagination-DDp6PRqf.js.map +1 -0
  100. package/dist/{Popconfirm-Dhzn7sy6.js → Popconfirm-BgV6a0sl.js} +5 -5
  101. package/dist/{Popconfirm-Dhzn7sy6.js.map → Popconfirm-BgV6a0sl.js.map} +1 -1
  102. package/dist/{Popover-CEk915I1.js → Popover-BU7nGOv-.js} +3 -3
  103. package/dist/Popover-BU7nGOv-.js.map +1 -0
  104. package/dist/{RadioGroup-CYEp8Wnx.js → RadioGroup-C8EC3fqO.js} +6 -6
  105. package/dist/{RadioGroup-CYEp8Wnx.js.map → RadioGroup-C8EC3fqO.js.map} +1 -1
  106. package/dist/{Resizable-D3vYToZH.js → Resizable-D8zs0kcq.js} +2 -2
  107. package/dist/{Resizable-D3vYToZH.js.map → Resizable-D8zs0kcq.js.map} +1 -1
  108. package/dist/{Search-DmkQo716.js → Search-aaUMI4ix.js} +4 -4
  109. package/dist/{Search-DmkQo716.js.map → Search-aaUMI4ix.js.map} +1 -1
  110. package/dist/{SearchInput-D3qMkHaW.js → SearchInput-Dxi2GK4n.js} +4 -4
  111. package/dist/{SearchInput-D3qMkHaW.js.map → SearchInput-Dxi2GK4n.js.map} +1 -1
  112. package/dist/{SectionNav-I2p2uXTd.js → SectionNav-BnHOMLtE.js} +11 -11
  113. package/dist/{SectionNav-I2p2uXTd.js.map → SectionNav-BnHOMLtE.js.map} +1 -1
  114. package/dist/{Select-B4uK0QVm.js → Select-CjQgU_6K.js} +6 -6
  115. package/dist/Select-CjQgU_6K.js.map +1 -0
  116. package/dist/{Sheet-D0fAE14T.js → Sheet-utw4_rUa.js} +9 -9
  117. package/dist/Sheet-utw4_rUa.js.map +1 -0
  118. package/dist/{Sidebar-D9ytIs8V.js → Sidebar-BAmux2Uj.js} +21 -18
  119. package/dist/Sidebar-BAmux2Uj.js.map +1 -0
  120. package/dist/{Slider-B0ou9r0B.js → Slider-DbzzSDRV.js} +5 -5
  121. package/dist/{Slider-B0ou9r0B.js.map → Slider-DbzzSDRV.js.map} +1 -1
  122. package/dist/{Stepper-BLkLhfnd.js → Stepper-BBPembeK.js} +3 -3
  123. package/dist/{Stepper-BLkLhfnd.js.map → Stepper-BBPembeK.js.map} +1 -1
  124. package/dist/{Switch-DZvNePOm.js → Switch-Dw4tvQls.js} +3 -3
  125. package/dist/Switch-Dw4tvQls.js.map +1 -0
  126. package/dist/{Table-BaVT5Tkn.js → Table-CilEvpMq.js} +65 -6
  127. package/dist/Table-CilEvpMq.js.map +1 -0
  128. package/dist/{Tabs-CTDmye1N.js → Tabs-C0uvkPHc.js} +5 -5
  129. package/dist/Tabs-C0uvkPHc.js.map +1 -0
  130. package/dist/{TextInput-BWYXbfs4.js → TextInput-K2DSDs5O.js} +5 -5
  131. package/dist/{TextInput-BWYXbfs4.js.map → TextInput-K2DSDs5O.js.map} +1 -1
  132. package/dist/{ThemeProvider-VF38VfUa.js → ThemeProvider-C8yaKlM1.js} +22 -5
  133. package/dist/ThemeProvider-C8yaKlM1.js.map +1 -0
  134. package/dist/{TimePicker-CDGYrRxi.js → TimePicker-DyyV3nw8.js} +2 -2
  135. package/dist/{TimePicker-CDGYrRxi.js.map → TimePicker-DyyV3nw8.js.map} +1 -1
  136. package/dist/{Timeline-B-I6sb0M.js → Timeline-DUXgByUE.js} +3 -3
  137. package/dist/{Timeline-B-I6sb0M.js.map → Timeline-DUXgByUE.js.map} +1 -1
  138. package/dist/{Toast-NrOdDDru.js → Toast-BGnUL4jV.js} +2 -2
  139. package/dist/{Toast-NrOdDDru.js.map → Toast-BGnUL4jV.js.map} +1 -1
  140. package/dist/ToggleAllTooltip-Dlmq-yqS.js +37 -0
  141. package/dist/ToggleAllTooltip-Dlmq-yqS.js.map +1 -0
  142. package/dist/{ToggleGroup-Cy_10Mvu.js → ToggleGroup-BOz1yyz6.js} +3 -3
  143. package/dist/ToggleGroup-BOz1yyz6.js.map +1 -0
  144. package/dist/{Workbench-DmZzpkj7.js → Workbench-CxgNCs3I.js} +4 -4
  145. package/dist/{Workbench-DmZzpkj7.js.map → Workbench-CxgNCs3I.js.map} +1 -1
  146. package/dist/{ZoomableSvg-C65nta_r.js → ZoomableSvg-Dh1OstPN.js} +87 -83
  147. package/dist/ZoomableSvg-Dh1OstPN.js.map +1 -0
  148. package/dist/charts.js +1 -1
  149. package/dist/classNames-DcGnTh2N.js +21 -0
  150. package/dist/classNames-DcGnTh2N.js.map +1 -0
  151. package/dist/editors.js +6 -6
  152. package/dist/flint.js +10 -45
  153. package/dist/flint.js.map +1 -1
  154. package/dist/highlightCode-D354tCXO.js +81 -0
  155. package/dist/highlightCode-D354tCXO.js.map +1 -0
  156. package/dist/{icons-wcA70iQx.js → icons-ZIeZXXS7.js} +37 -4
  157. package/dist/icons-ZIeZXXS7.js.map +1 -0
  158. package/dist/icons.d.ts +2 -2
  159. package/dist/icons.js +2 -2
  160. package/dist/{index-B7k-09i1.d.ts → index-D-itZ3VP.d.ts} +14 -3
  161. package/dist/index.d.ts +942 -424
  162. package/dist/index.js +72 -70
  163. package/dist/internal/blocks/AIKit.js +2 -2
  164. package/dist/internal/blocks/AppShell.js +1 -1
  165. package/dist/internal/blocks/AuthLayout.js +2 -2
  166. package/dist/internal/blocks/AutoSaveTextarea.js +1 -1
  167. package/dist/internal/blocks/BrandEditor.js +1 -1
  168. package/dist/internal/blocks/ChartPanel.js +2 -2
  169. package/dist/internal/blocks/ChipEditor.js +4 -4
  170. package/dist/internal/blocks/ClipboardButton.js +1 -1
  171. package/dist/internal/blocks/ColorInput.js +1 -1
  172. package/dist/internal/blocks/ColorModeSwitch.js +1 -1
  173. package/dist/internal/blocks/Command.js +1 -1
  174. package/dist/internal/blocks/CopyField.js +1 -1
  175. package/dist/internal/blocks/DashboardHero.js +2 -2
  176. package/dist/internal/blocks/DashboardHero.js.map +1 -1
  177. package/dist/internal/blocks/DateInput.js +1 -1
  178. package/dist/internal/blocks/DateRangeInput.js +1 -1
  179. package/dist/internal/blocks/DiagramShared/DiagramSkeleton.js.map +1 -1
  180. package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
  181. package/dist/internal/blocks/ExportMenu.js +4 -4
  182. package/dist/internal/blocks/FacebookButton.js +66 -0
  183. package/dist/internal/blocks/FacebookButton.js.map +1 -0
  184. package/dist/internal/blocks/Form/connectors/ComboboxField.js +2 -2
  185. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +1 -1
  186. package/dist/internal/blocks/Form.js +1 -1
  187. package/dist/internal/blocks/FormGroup.js +1 -1
  188. package/dist/internal/blocks/GoogleButton.js +2 -2
  189. package/dist/internal/blocks/InlineEdit.js +2 -0
  190. package/dist/internal/blocks/MicrosoftButton.js +2 -2
  191. package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
  192. package/dist/internal/blocks/MultiCombobox.js +204 -68
  193. package/dist/internal/blocks/MultiCombobox.js.map +1 -1
  194. package/dist/internal/blocks/NumberInput.js +1 -1
  195. package/dist/internal/blocks/OtpInput.js +1 -1
  196. package/dist/internal/blocks/PageHeader.js +1 -1
  197. package/dist/internal/blocks/PageLayout.js +1 -1
  198. package/dist/internal/blocks/PageToolbar.js +1 -1
  199. package/dist/internal/blocks/PasswordInput.js +3 -3
  200. package/dist/internal/blocks/SearchInput.js +1 -1
  201. package/dist/internal/blocks/SearchInputWithNavigation.js +5 -5
  202. package/dist/internal/blocks/SectionNav.js +1 -1
  203. package/dist/internal/blocks/SplitButton.js +6 -5
  204. package/dist/internal/blocks/SplitButton.js.map +1 -1
  205. package/dist/internal/blocks/StatCard.js +2 -2
  206. package/dist/internal/blocks/TextInput.js +1 -1
  207. package/dist/internal/blocks/Textarea.js +1 -1
  208. package/dist/internal/blocks/TimeInput.js +4 -4
  209. package/dist/internal/components/Alert.js +1 -1
  210. package/dist/internal/components/AlertModal.js +1 -1
  211. package/dist/internal/components/Avatar.js +2 -2
  212. package/dist/internal/components/Badge.js +1 -1
  213. package/dist/internal/components/BrandLogo.js +1 -1
  214. package/dist/internal/components/Breadcrumb.js +1 -1
  215. package/dist/internal/components/Button.js +1 -1
  216. package/dist/internal/components/ButtonGroup.js +1 -1
  217. package/dist/internal/components/Calendar.js +1 -1
  218. package/dist/internal/components/Card.js +1 -1
  219. package/dist/internal/components/Checkbox.js +1 -1
  220. package/dist/internal/components/Clipboard.js +1 -1
  221. package/dist/internal/components/Collapsible.js +1 -1
  222. package/dist/internal/components/CollapsiblePanel.js +5 -5
  223. package/dist/internal/components/CollapsiblePanel.js.map +1 -1
  224. package/dist/internal/components/Combobox.js +1 -1
  225. package/dist/internal/components/DatePicker.js +1 -1
  226. package/dist/internal/components/DateRangePicker.js +1 -1
  227. package/dist/internal/components/DiffView.js +1 -1
  228. package/dist/internal/components/DotsLoader.js +1 -1
  229. package/dist/internal/components/DropdownMenu.js +1 -1
  230. package/dist/internal/components/FileUpload.js +1 -1
  231. package/dist/internal/components/FullScreenModal.js +1 -1
  232. package/dist/internal/components/HoverCard.js +1 -1
  233. package/dist/internal/components/InputGroup.js +1 -1
  234. package/dist/internal/components/Kbd.js +1 -1
  235. package/dist/internal/components/Label.js +2 -2
  236. package/dist/internal/components/Label.js.map +1 -1
  237. package/dist/internal/components/Link.js +1 -1
  238. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +2 -2
  239. package/dist/internal/components/Modal.js +1 -1
  240. package/dist/internal/components/Navbar.js +1 -1
  241. package/dist/internal/components/Pagination.js +1 -1
  242. package/dist/internal/components/PanelWithDetails.js +3 -3
  243. package/dist/internal/components/Popconfirm.js +1 -1
  244. package/dist/internal/components/Popover.js +1 -1
  245. package/dist/internal/components/Progress.js +1 -1
  246. package/dist/internal/components/RadioGroup.js +1 -1
  247. package/dist/internal/components/Resizable.js +1 -1
  248. package/dist/internal/components/ScrollArea.js +1 -1
  249. package/dist/internal/components/Search.js +1 -1
  250. package/dist/internal/components/Select.js +1 -1
  251. package/dist/internal/components/Separator.js +1 -1
  252. package/dist/internal/components/Sheet.js +1 -1
  253. package/dist/internal/components/Sidebar.js +1 -1
  254. package/dist/internal/components/Skeleton/Skeleton.js +2 -2
  255. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -1
  256. package/dist/internal/components/Skeleton/SkeletonList.js +1 -1
  257. package/dist/internal/components/Slider.js +1 -1
  258. package/dist/internal/components/SpotlightBackdrop.js +1 -1
  259. package/dist/internal/components/Stepper.js +1 -1
  260. package/dist/internal/components/Switch.js +1 -1
  261. package/dist/internal/components/Table.js +1 -1
  262. package/dist/internal/components/Tabs.js +1 -1
  263. package/dist/internal/components/ThemeProvider.js +1 -1
  264. package/dist/internal/components/TimePicker.js +1 -1
  265. package/dist/internal/components/Timeline.js +1 -1
  266. package/dist/internal/components/Toast.js +2 -2
  267. package/dist/internal/components/Toggle.js +5 -5
  268. package/dist/internal/components/Toggle.js.map +1 -1
  269. package/dist/internal/components/ToggleGroup.js +1 -1
  270. package/dist/internal/components/Tooltip.js +1 -1
  271. package/dist/internal/components/Truncated.js +2 -2
  272. package/dist/internal/components/Workbench.js +1 -1
  273. package/dist/internal/components/ZoomableSvg.js +1 -1
  274. package/dist/internal/utils.js +2 -2
  275. package/dist/markdown-editor.js +14 -14
  276. package/dist/markdown-editor.js.map +1 -1
  277. package/dist/mermaid.d.ts +1 -2
  278. package/dist/mermaid.js +1 -1
  279. package/dist/rjsf.js +101 -14
  280. package/dist/rjsf.js.map +1 -1
  281. package/dist/{styles-DBGXH5-_.js → styles-BDA5rQz3.js} +6 -6
  282. package/dist/styles-BDA5rQz3.js.map +1 -0
  283. package/dist/{styles-gzcjOyKv.js → styles-YQdM7G8c.js} +3 -3
  284. package/dist/{styles-gzcjOyKv.js.map → styles-YQdM7G8c.js.map} +1 -1
  285. package/dist/styles.css +1 -1
  286. package/dist/svgCache-Dhmbe-7i.js +26 -0
  287. package/dist/svgCache-Dhmbe-7i.js.map +1 -0
  288. package/dist/svgTransforms-Hnvev3Vs.js +38 -0
  289. package/dist/svgTransforms-Hnvev3Vs.js.map +1 -0
  290. package/dist/testing.js +1 -1
  291. package/dist/{themeTokens-7DEab0kp.js → themeTokens-l2Fsfcs7.js} +3 -12
  292. package/dist/themeTokens-l2Fsfcs7.js.map +1 -0
  293. package/dist/{toast-CyXEdaCZ.js → toast-D6Z6MOB5.js} +5 -5
  294. package/dist/toast-D6Z6MOB5.js.map +1 -0
  295. package/dist/{utils-Bd28bWgm.js → utils-LQ4jJA-9.js} +21 -5
  296. package/dist/utils-LQ4jJA-9.js.map +1 -0
  297. package/dist/vega.js +1 -1
  298. package/dist/vegaTheme-BrmVoPEz.js +49 -0
  299. package/dist/vegaTheme-BrmVoPEz.js.map +1 -0
  300. package/dist/{vegaTheme-VQMWTlBw.js → vegaTokens-Ce07C0DH.js} +36 -44
  301. package/dist/vegaTokens-Ce07C0DH.js.map +1 -0
  302. package/package.json +4 -4
  303. package/src/styles.css +183 -4
  304. package/src/theme.css +47 -3
  305. package/dist/AIKit-BVCWP9Ks.js.map +0 -1
  306. package/dist/AlertModal-mbSnuuka.js.map +0 -1
  307. package/dist/BrandEditor-P8OZX2hi.js.map +0 -1
  308. package/dist/Breadcrumb-BUoAZyhO.js.map +0 -1
  309. package/dist/Button-B21oVcPU.js.map +0 -1
  310. package/dist/Card-BQmBWHXl.js.map +0 -1
  311. package/dist/Checkbox-8yIIgY7g.js.map +0 -1
  312. package/dist/Combobox-BNhW0TDB.js.map +0 -1
  313. package/dist/Command-BQPiZCNz.js.map +0 -1
  314. package/dist/DiagramSource-C5_d8Gdj.js +0 -11
  315. package/dist/DiagramSource-C5_d8Gdj.js.map +0 -1
  316. package/dist/DropdownMenu-BJGLjpVc.js.map +0 -1
  317. package/dist/FieldBox-D7DYtX_m.js.map +0 -1
  318. package/dist/FileUpload-Ch2hrIWq.js.map +0 -1
  319. package/dist/HoverCard-B8OKu9XZ.js +0 -31
  320. package/dist/HoverCard-B8OKu9XZ.js.map +0 -1
  321. package/dist/MermaidDiagram-B30x2yV7.js +0 -302
  322. package/dist/MermaidDiagram-B30x2yV7.js.map +0 -1
  323. package/dist/Modal-BkSuS9Yz.js.map +0 -1
  324. package/dist/ModalTitle-BxopkIoQ.js.map +0 -1
  325. package/dist/Navbar-B_DNpv5s.js.map +0 -1
  326. package/dist/PageHeader-CgfyXpf1.js.map +0 -1
  327. package/dist/Pagination-DH3f6LN0.js.map +0 -1
  328. package/dist/Popover-CEk915I1.js.map +0 -1
  329. package/dist/Select-B4uK0QVm.js.map +0 -1
  330. package/dist/Sheet-D0fAE14T.js.map +0 -1
  331. package/dist/Sidebar-D9ytIs8V.js.map +0 -1
  332. package/dist/Switch-DZvNePOm.js.map +0 -1
  333. package/dist/Table-BaVT5Tkn.js.map +0 -1
  334. package/dist/Tabs-CTDmye1N.js.map +0 -1
  335. package/dist/ThemeProvider-VF38VfUa.js.map +0 -1
  336. package/dist/ToggleGroup-Cy_10Mvu.js.map +0 -1
  337. package/dist/ZoomableSvg-C65nta_r.js.map +0 -1
  338. package/dist/classNames-BzrkDnOD.js +0 -9
  339. package/dist/classNames-BzrkDnOD.js.map +0 -1
  340. package/dist/icons-wcA70iQx.js.map +0 -1
  341. package/dist/styles-DBGXH5-_.js.map +0 -1
  342. package/dist/svgTransforms-Dw2hRA-i.js +0 -51
  343. package/dist/svgTransforms-Dw2hRA-i.js.map +0 -1
  344. package/dist/themeTokens-7DEab0kp.js.map +0 -1
  345. package/dist/toast-CyXEdaCZ.js.map +0 -1
  346. package/dist/utils-Bd28bWgm.js.map +0 -1
  347. package/dist/vegaTheme-VQMWTlBw.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { cn } from "./classNames-BzrkDnOD.js";
2
- import { createChangeInputEvent } from "./utils-Bd28bWgm.js";
1
+ import { cn } from "./classNames-DcGnTh2N.js";
2
+ import { createChangeInputEvent } from "./utils-LQ4jJA-9.js";
3
3
  import { mergeRefs } from "./internal/utils/mergeRefs.js";
4
- import { Pipette, X } from "./icons-wcA70iQx.js";
5
- import { InputGroup } from "./InputGroup-CrlMRz4X.js";
4
+ import { Pipette, X } from "./icons-ZIeZXXS7.js";
5
+ import { InputGroup } from "./InputGroup-Dm014ruw.js";
6
6
  import { useControllableState } from "./useControllableState-CUYXMsfz.js";
7
7
  import { useRef } from "react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -162,4 +162,4 @@ const ColorInput = ({ ref, state, variant, focusVariant, sizing, className, valu
162
162
  //#endregion
163
163
  export { ColorInput };
164
164
 
165
- //# sourceMappingURL=ColorInput-B3gBZ8Ya.js.map
165
+ //# sourceMappingURL=ColorInput-CDKH8q_f.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColorInput-B3gBZ8Ya.js","names":[],"sources":["../src/blocks/ColorInput/utils.ts","../src/blocks/ColorInput/ColorPicker.tsx","../src/blocks/ColorInput/ColorInput.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nconst HEX_CHARSET = /^[0-9a-fA-F]+$/;\nconst COMPLETE_HEX_PATTERN = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nconst MAX_HEX_BODY_LENGTH = 8;\n// Native <input type=\"color\"> default when fed anything unparseable.\nconst PICKER_FALLBACK = '#000000';\n\nconst extractHexBody = (value: unknown): string | null => {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (trimmed === '') return null;\n return trimmed.startsWith('#') ? trimmed.slice(1) : trimmed;\n};\n\nexport const isCompleteHexColor = (value: string): boolean => COMPLETE_HEX_PATTERN.test(value);\n\n// @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/showPicker\nexport const showPicker = (input: HTMLInputElement) => {\n const isShowPickerSupported = 'showPicker' in HTMLInputElement.prototype;\n isShowPickerSupported ? input.showPicker() : input.click();\n};\n\n/**\n * Coerces free-form text into a partial hex color (up to `#rrggbbaa`) for the text input.\n *\n * - Adds a missing `#`, keeps only the leading hex digits.\n * - `''` for non-strings or when no hex digits remain.\n * - May be a prefix (`#ab`) — gate rendering on `isCompleteHexColor`.\n */\nexport const coerceHexInputValue = (value?: string | null): string => {\n const body = extractHexBody(value);\n if (body === null) return '';\n const [validBody] = body.match(/^[0-9a-fA-F]+/) ?? [];\n if (!validBody) return '';\n return `#${validBody.slice(0, MAX_HEX_BODY_LENGTH)}`;\n};\n\n/**\n * Coerces any value into the lowercase `#rrggbb` the native `<input type=\"color\">` requires.\n *\n * - Shorthand is expanded, alpha dropped, anything invalid → `#000000`.\n * - Lowercased because the native picker lowercases, so values round-trip.\n */\nexport const coerceColorPickerValue = (value: ComponentProps<'input'>['value'] | null) => {\n const body = extractHexBody(value);\n if (body === null || !HEX_CHARSET.test(body)) return PICKER_FALLBACK;\n\n if (body.length === 3 || body.length === 4) {\n const [r, g, b] = body;\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\n }\n if (body.length === 6 || body.length === 8) {\n return `#${body.slice(0, 6).toLowerCase()}`;\n }\n return PICKER_FALLBACK;\n};\n","import { type ComponentProps, type ComponentRef, useRef } from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { Pipette } from '../../icons';\n\nimport { coerceColorPickerValue, showPicker } from './utils';\n\ntype Props = Omit<ComponentProps<'input'>, 'type'>;\n\nexport const ColorPicker = ({ value, disabled, readOnly, ...props }: Props) => {\n const pickerRef = useRef<ComponentRef<'input'>>(null);\n\n const handleOpenPicker = () => {\n if (!pickerRef.current) return;\n showPicker(pickerRef.current);\n };\n\n return (\n <div className=\"tw:relative\">\n <input\n {...props}\n ref={pickerRef}\n type=\"color\"\n value={coerceColorPickerValue(value)}\n tabIndex={-1}\n aria-hidden\n className=\"tw:pointer-events-none tw:absolute tw:left-0 tw:top-full tw:size-0 tw:opacity-0\"\n disabled={disabled}\n readOnly={readOnly}\n />\n <InputGroup.Button\n onMouseDown={(event) => event.preventDefault()}\n disabled={disabled || readOnly}\n onClick={handleOpenPicker}\n aria-label=\"Pick color\"\n >\n <Pipette className=\"tw:size-4\" />\n </InputGroup.Button>\n </div>\n );\n};\n","import { useRef } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { cn, createChangeInputEvent, mergeRefs } from '../../utils';\n\nimport { ColorPicker } from './ColorPicker';\nimport { coerceHexInputValue, isCompleteHexColor } from './utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<ComponentProps<typeof InputGroup.Input>, 'value' | 'defaultValue'>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n allowClear?: boolean;\n };\n\nexport const ColorInput = ({\n ref,\n\n // group props\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n // own props\n value: valueProp,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n defaultValue,\n allowClear = false,\n\n // input props\n disabled,\n readOnly,\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.\n prop: valueProp === null ? '' : valueProp,\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n const isControlled = valueProp !== undefined;\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n const swatchColor = coerceHexInputValue(value);\n const isValidSwatch = isCompleteHexColor(swatchColor);\n\n // Preserve raw text while the user is typing — sanitise on blur.\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n const newValue = event.target.value;\n const sanitizedNewValue = coerceHexInputValue(newValue);\n\n if (sanitizedNewValue !== newValue) {\n // In controlled mode, let the parent decide whether to apply the\n // sanitised value via `onValueChange` — don't fight its `value` prop.\n if (!isControlled) event.target.value = sanitizedNewValue;\n setValue(sanitizedNewValue);\n }\n\n onValueBlur?.(sanitizedNewValue);\n onBlur?.(event);\n };\n\n const handlePickerChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(coerceHexInputValue(event.target.value));\n onChange?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue('');\n onChange?.(createChangeInputEvent(inputRef.current));\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n <InputGroup.Addon\n align=\"inline-start\"\n className={cn(\n { 'tw:-ml-7 tw:opacity-0': !value },\n 'tw:transition-[opacity,margin]',\n 'tw:ease-linear',\n 'tw:duration-200',\n )}\n >\n <div\n style={isValidSwatch ? { background: swatchColor } : undefined}\n className={cn(\n 'tw:size-5',\n 'tw:shrink-0',\n 'tw:rounded-sm',\n 'tw:border',\n 'tw:border-solid',\n 'tw:border-neutral-300',\n {\n 'tw:bg-[linear-gradient(to_top_right,transparent_calc(50%_-_1px),theme(colors.red.300)_calc(50%_-_1px),theme(colors.red.300)_calc(50%_+_1px),transparent_calc(50%_+_1px))]':\n !isValidSwatch,\n },\n )}\n />\n </InputGroup.Addon>\n\n <InputGroup.Input\n {...restInputProps}\n type=\"text\"\n ref={mergeRefs(ref ?? null, inputRef)}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n <InputGroup.Addon align=\"inline-end\">\n {canClear && (\n <InputGroup.Button\n // prevents input focus stealing\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n aria-label=\"Clear color\"\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n <ColorPicker\n disabled={disabled}\n readOnly={readOnly}\n value={value}\n onChange={handlePickerChange}\n />\n </InputGroup.Addon>\n </InputGroup>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ColorInput-CDKH8q_f.js","names":[],"sources":["../src/blocks/ColorInput/utils.ts","../src/blocks/ColorInput/ColorPicker.tsx","../src/blocks/ColorInput/ColorInput.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nconst HEX_CHARSET = /^[0-9a-fA-F]+$/;\nconst COMPLETE_HEX_PATTERN = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nconst MAX_HEX_BODY_LENGTH = 8;\n// Native <input type=\"color\"> default when fed anything unparseable.\nconst PICKER_FALLBACK = '#000000';\n\nconst extractHexBody = (value: unknown): string | null => {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (trimmed === '') return null;\n return trimmed.startsWith('#') ? trimmed.slice(1) : trimmed;\n};\n\nexport const isCompleteHexColor = (value: string): boolean => COMPLETE_HEX_PATTERN.test(value);\n\n// @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/showPicker\nexport const showPicker = (input: HTMLInputElement) => {\n const isShowPickerSupported = 'showPicker' in HTMLInputElement.prototype;\n isShowPickerSupported ? input.showPicker() : input.click();\n};\n\n/**\n * Coerces free-form text into a partial hex color (up to `#rrggbbaa`) for the text input.\n *\n * - Adds a missing `#`, keeps only the leading hex digits.\n * - `''` for non-strings or when no hex digits remain.\n * - May be a prefix (`#ab`) — gate rendering on `isCompleteHexColor`.\n */\nexport const coerceHexInputValue = (value?: string | null): string => {\n const body = extractHexBody(value);\n if (body === null) return '';\n const [validBody] = body.match(/^[0-9a-fA-F]+/) ?? [];\n if (!validBody) return '';\n return `#${validBody.slice(0, MAX_HEX_BODY_LENGTH)}`;\n};\n\n/**\n * Coerces any value into the lowercase `#rrggbb` the native `<input type=\"color\">` requires.\n *\n * - Shorthand is expanded, alpha dropped, anything invalid → `#000000`.\n * - Lowercased because the native picker lowercases, so values round-trip.\n */\nexport const coerceColorPickerValue = (value: ComponentProps<'input'>['value'] | null) => {\n const body = extractHexBody(value);\n if (body === null || !HEX_CHARSET.test(body)) return PICKER_FALLBACK;\n\n if (body.length === 3 || body.length === 4) {\n const [r, g, b] = body;\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\n }\n if (body.length === 6 || body.length === 8) {\n return `#${body.slice(0, 6).toLowerCase()}`;\n }\n return PICKER_FALLBACK;\n};\n","import { type ComponentProps, type ComponentRef, useRef } from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { Pipette } from '../../icons';\n\nimport { coerceColorPickerValue, showPicker } from './utils';\n\ntype Props = Omit<ComponentProps<'input'>, 'type'>;\n\nexport const ColorPicker = ({ value, disabled, readOnly, ...props }: Props) => {\n const pickerRef = useRef<ComponentRef<'input'>>(null);\n\n const handleOpenPicker = () => {\n if (!pickerRef.current) return;\n showPicker(pickerRef.current);\n };\n\n return (\n <div className=\"tw:relative\">\n <input\n {...props}\n ref={pickerRef}\n type=\"color\"\n value={coerceColorPickerValue(value)}\n tabIndex={-1}\n aria-hidden\n className=\"tw:pointer-events-none tw:absolute tw:left-0 tw:top-full tw:size-0 tw:opacity-0\"\n disabled={disabled}\n readOnly={readOnly}\n />\n <InputGroup.Button\n onMouseDown={(event) => event.preventDefault()}\n disabled={disabled || readOnly}\n onClick={handleOpenPicker}\n aria-label=\"Pick color\"\n >\n <Pipette className=\"tw:size-4\" />\n </InputGroup.Button>\n </div>\n );\n};\n","import { useRef } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { cn, createChangeInputEvent, mergeRefs } from '../../utils';\n\nimport { ColorPicker } from './ColorPicker';\nimport { coerceHexInputValue, isCompleteHexColor } from './utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<ComponentProps<typeof InputGroup.Input>, 'value' | 'defaultValue'>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n allowClear?: boolean;\n };\n\nexport const ColorInput = ({\n ref,\n\n // group props\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n // own props\n value: valueProp,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n defaultValue,\n allowClear = false,\n\n // input props\n disabled,\n readOnly,\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.\n prop: valueProp === null ? '' : valueProp,\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n const isControlled = valueProp !== undefined;\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n const swatchColor = coerceHexInputValue(value);\n const isValidSwatch = isCompleteHexColor(swatchColor);\n\n // Preserve raw text while the user is typing — sanitise on blur.\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n const newValue = event.target.value;\n const sanitizedNewValue = coerceHexInputValue(newValue);\n\n if (sanitizedNewValue !== newValue) {\n // In controlled mode, let the parent decide whether to apply the\n // sanitised value via `onValueChange` — don't fight its `value` prop.\n if (!isControlled) event.target.value = sanitizedNewValue;\n setValue(sanitizedNewValue);\n }\n\n onValueBlur?.(sanitizedNewValue);\n onBlur?.(event);\n };\n\n const handlePickerChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(coerceHexInputValue(event.target.value));\n onChange?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue('');\n onChange?.(createChangeInputEvent(inputRef.current));\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n <InputGroup.Addon\n align=\"inline-start\"\n className={cn(\n { 'tw:-ml-7 tw:opacity-0': !value },\n 'tw:transition-[opacity,margin]',\n 'tw:ease-linear',\n 'tw:duration-200',\n )}\n >\n <div\n style={isValidSwatch ? { background: swatchColor } : undefined}\n className={cn(\n 'tw:size-5',\n 'tw:shrink-0',\n 'tw:rounded-sm',\n 'tw:border',\n 'tw:border-solid',\n 'tw:border-neutral-300',\n {\n 'tw:bg-[linear-gradient(to_top_right,transparent_calc(50%_-_1px),theme(colors.red.300)_calc(50%_-_1px),theme(colors.red.300)_calc(50%_+_1px),transparent_calc(50%_+_1px))]':\n !isValidSwatch,\n },\n )}\n />\n </InputGroup.Addon>\n\n <InputGroup.Input\n {...restInputProps}\n type=\"text\"\n ref={mergeRefs(ref ?? null, inputRef)}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n <InputGroup.Addon align=\"inline-end\">\n {canClear && (\n <InputGroup.Button\n // prevents input focus stealing\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n aria-label=\"Clear color\"\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n <ColorPicker\n disabled={disabled}\n readOnly={readOnly}\n value={value}\n onChange={handlePickerChange}\n />\n </InputGroup.Addon>\n </InputGroup>\n );\n};\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { Monitor, Moon, Sun } from "./icons-wcA70iQx.js";
2
- import { Button } from "./Button-B21oVcPU.js";
3
- import { DropdownMenu } from "./DropdownMenu-BJGLjpVc.js";
1
+ import { Monitor, Moon, Sun } from "./icons-ZIeZXXS7.js";
2
+ import { Button } from "./Button-D2JqBAq7.js";
3
+ import { DropdownMenu } from "./DropdownMenu-B1gGvZoh.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/blocks/ColorModeSwitch/ColorModeSwitch.tsx
6
6
  const OPTIONS = [
@@ -64,4 +64,4 @@ const ColorModeSwitch = ({ value, onValueChange, size = "small", className }) =>
64
64
  //#endregion
65
65
  export { ColorModeSwitch };
66
66
 
67
- //# sourceMappingURL=ColorModeSwitch-D8Cki137.js.map
67
+ //# sourceMappingURL=ColorModeSwitch-DR6J2U6M.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColorModeSwitch-D8Cki137.js","names":[],"sources":["../src/blocks/ColorModeSwitch/ColorModeSwitch.tsx"],"sourcesContent":["import { Button } from '../../components/Button';\nimport { DropdownMenu } from '../../components/DropdownMenu';\nimport type { ColorScheme } from '../../components/ThemeProvider';\nimport type { LucideIcon } from '../../icons';\nimport { Monitor, Moon, Sun } from '../../icons';\n\ntype Props = {\n /** Controlled — pair with `onValueChange`. */\n value: ColorScheme;\n onValueChange: (value: ColorScheme) => void;\n size?: 'small' | 'medium';\n className?: string;\n};\n\nconst OPTIONS: { value: ColorScheme; label: string; icon: LucideIcon }[] = [\n { value: 'light', label: 'Light', icon: Sun },\n { value: 'dark', label: 'Dark', icon: Moon },\n { value: 'system', label: 'System', icon: Monitor },\n];\n\nconst triggerSizeMap = { small: 'icon-sm', medium: 'icon' } as const;\n\n/**\n * Light / dark / system switch: an icon button opening a radio `DropdownMenu`.\n *\n * - Controlled: owns no state; wire it to the same state as `ThemeProvider.colorScheme`.\n * - The trigger's `aria-label` names the current scheme.\n */\nexport const ColorModeSwitch = ({ value, onValueChange, size = 'small', className }: Props) => {\n const active = OPTIONS.find((option) => option.value === value);\n const ActiveIcon = active?.icon ?? Monitor;\n const activeLabel = active?.label ?? 'System';\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size={triggerSizeMap[size]}\n aria-label={`Color mode: ${activeLabel}`}\n title={`Color mode: ${activeLabel}`}\n className={className}\n >\n <ActiveIcon className=\"tw:size-4\" />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n <DropdownMenu.RadioGroup value={value} onValueChange={onValueChange}>\n {OPTIONS.map(({ value: option, label, icon: Icon }) => (\n <DropdownMenu.RadioItem\n key={option}\n value={option}\n icon={<Icon />}\n indicator=\"check\"\n indicatorAlign=\"end\"\n closeOnSelect\n >\n {label}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n};\n"],"mappings":";;;;;AAcA,MAAM,UAAqE;CACzE;EAAE,OAAO;EAAS,OAAO;EAAS,MAAM;CAAI;CAC5C;EAAE,OAAO;EAAQ,OAAO;EAAQ,MAAM;CAAK;CAC3C;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAQ;AACpD;AAEA,MAAM,iBAAiB;CAAE,OAAO;CAAW,QAAQ;AAAO;;;;;;;AAQ1D,MAAa,mBAAmB,EAAE,OAAO,eAAe,OAAO,SAAS,gBAAuB;CAC7F,MAAM,SAAS,QAAQ,MAAM,WAAW,OAAO,UAAU,KAAK;CAC9D,MAAM,aAAa,QAAQ,QAAQ;CACnC,MAAM,cAAc,QAAQ,SAAS;CAErC,OACE,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,aAAa,SAAd;EAAsB,SAAA;EACpB,UAAA,oBAAC,QAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAM,eAAe;GACrB,cAAY,eAAe;GAC3B,OAAO,eAAe;GACX;GAEX,UAAA,oBAAC,YAAD,EAAY,WAAU,YAAa,CAAA;EAC7B,CAAA;CACY,CAAA,GACtB,oBAAC,aAAa,SAAd;EAAsB,OAAM;EAC1B,UAAA,oBAAC,aAAa,YAAd;GAAgC;GAAsB;GACnD,UAAA,QAAQ,KAAK,EAAE,OAAO,QAAQ,OAAO,MAAM,WAC1C,oBAAC,aAAa,WAAd;IAEE,OAAO;IACP,MAAM,oBAAC,MAAD,CAAO,CAAA;IACb,WAAU;IACV,gBAAe;IACf,eAAA;IAEC,UAAA;GACqB,GARjB,MAQiB,CACzB;EACsB,CAAA;CACL,CAAA,CACV,EAAA,CAAA;AAElB"}
1
+ {"version":3,"file":"ColorModeSwitch-DR6J2U6M.js","names":[],"sources":["../src/blocks/ColorModeSwitch/ColorModeSwitch.tsx"],"sourcesContent":["import { Button } from '../../components/Button';\nimport { DropdownMenu } from '../../components/DropdownMenu';\nimport type { ColorScheme } from '../../components/ThemeProvider';\nimport type { LucideIcon } from '../../icons';\nimport { Monitor, Moon, Sun } from '../../icons';\n\ntype Props = {\n /** Controlled — pair with `onValueChange`. */\n value: ColorScheme;\n onValueChange: (value: ColorScheme) => void;\n size?: 'small' | 'medium';\n className?: string;\n};\n\nconst OPTIONS: { value: ColorScheme; label: string; icon: LucideIcon }[] = [\n { value: 'light', label: 'Light', icon: Sun },\n { value: 'dark', label: 'Dark', icon: Moon },\n { value: 'system', label: 'System', icon: Monitor },\n];\n\nconst triggerSizeMap = { small: 'icon-sm', medium: 'icon' } as const;\n\n/**\n * Light / dark / system switch: an icon button opening a radio `DropdownMenu`.\n *\n * - Controlled: owns no state; wire it to the same state as `ThemeProvider.colorScheme`.\n * - The trigger's `aria-label` names the current scheme.\n */\nexport const ColorModeSwitch = ({ value, onValueChange, size = 'small', className }: Props) => {\n const active = OPTIONS.find((option) => option.value === value);\n const ActiveIcon = active?.icon ?? Monitor;\n const activeLabel = active?.label ?? 'System';\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size={triggerSizeMap[size]}\n aria-label={`Color mode: ${activeLabel}`}\n title={`Color mode: ${activeLabel}`}\n className={className}\n >\n <ActiveIcon className=\"tw:size-4\" />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n <DropdownMenu.RadioGroup value={value} onValueChange={onValueChange}>\n {OPTIONS.map(({ value: option, label, icon: Icon }) => (\n <DropdownMenu.RadioItem\n key={option}\n value={option}\n icon={<Icon />}\n indicator=\"check\"\n indicatorAlign=\"end\"\n closeOnSelect\n >\n {label}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n};\n"],"mappings":";;;;;AAcA,MAAM,UAAqE;CACzE;EAAE,OAAO;EAAS,OAAO;EAAS,MAAM;CAAI;CAC5C;EAAE,OAAO;EAAQ,OAAO;EAAQ,MAAM;CAAK;CAC3C;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;CAAQ;AACpD;AAEA,MAAM,iBAAiB;CAAE,OAAO;CAAW,QAAQ;AAAO;;;;;;;AAQ1D,MAAa,mBAAmB,EAAE,OAAO,eAAe,OAAO,SAAS,gBAAuB;CAC7F,MAAM,SAAS,QAAQ,MAAM,WAAW,OAAO,UAAU,KAAK;CAC9D,MAAM,aAAa,QAAQ,QAAQ;CACnC,MAAM,cAAc,QAAQ,SAAS;CAErC,OACE,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,aAAa,SAAd;EAAsB,SAAA;EACpB,UAAA,oBAAC,QAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAM,eAAe;GACrB,cAAY,eAAe;GAC3B,OAAO,eAAe;GACX;GAEX,UAAA,oBAAC,YAAD,EAAY,WAAU,YAAa,CAAA;EAC7B,CAAA;CACY,CAAA,GACtB,oBAAC,aAAa,SAAd;EAAsB,OAAM;EAC1B,UAAA,oBAAC,aAAa,YAAd;GAAgC;GAAsB;GACnD,UAAA,QAAQ,KAAK,EAAE,OAAO,QAAQ,OAAO,MAAM,WAC1C,oBAAC,aAAa,WAAd;IAEE,OAAO;IACP,MAAM,oBAAC,MAAD,CAAO,CAAA;IACb,WAAU;IACV,gBAAe;IACf,eAAA;IAEC,UAAA;GACqB,GARjB,MAQiB,CACzB;EACsB,CAAA;CACL,CAAA,CACV,EAAA,CAAA;AAElB"}
@@ -1,14 +1,15 @@
1
- import { cn } from "./classNames-BzrkDnOD.js";
2
- import { Tooltip, TooltipProvider, noop } from "./utils-Bd28bWgm.js";
1
+ import { cn } from "./classNames-DcGnTh2N.js";
2
+ import { Tooltip, TooltipProvider, noop } from "./utils-LQ4jJA-9.js";
3
3
  import { useArgoDesign } from "./context-U293r3v-.js";
4
- import { Check, ChevronDown, ChevronRight, Loader2, Minus, Plus, X } from "./icons-wcA70iQx.js";
4
+ import { Check, ChevronDown, ChevronRight, Loader2, Minus, Plus, X } from "./icons-ZIeZXXS7.js";
5
5
  import { hasTruncationOverflow } from "./internal/components/Truncated.js";
6
6
  import { useStableCallback } from "./internal/hooks/useStableCallback.js";
7
- import { InputGroup } from "./InputGroup-CrlMRz4X.js";
7
+ import { InputGroup } from "./InputGroup-Dm014ruw.js";
8
8
  import { forwardAccessibleName } from "./internal/utils/accessibleName.js";
9
- import { Badge } from "./Badge-Dz0cj6rj.js";
9
+ import { Badge } from "./Badge-Ba3epgcI.js";
10
+ import { ToggleAllTooltip, isToggleAllClick } from "./ToggleAllTooltip-Dlmq-yqS.js";
10
11
  import { useElement } from "./useElement-D-RjrGa4.js";
11
- import { Fragment, createContext, isValidElement, use, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
12
+ import { Fragment, createContext, isValidElement, use, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
12
13
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
13
14
  import { Combobox } from "@base-ui/react/combobox";
14
15
  import { DismissableLayer } from "@radix-ui/react-dismissable-layer";
@@ -276,6 +277,7 @@ const ComboboxContent = ({ ref, align = "start", side = "bottom", sideOffset = 4
276
277
  className: "tw:isolate tw:z-[1055] tailwindcss-preflight",
277
278
  children: /* @__PURE__ */ jsx(Combobox.Popup, {
278
279
  ref,
280
+ "data-slot": "combobox-content",
279
281
  "data-chips": !!anchor,
280
282
  "data-variant": effectiveVariant,
281
283
  className: cn("tw:!pointer-events-auto", "tw:group/combobox-content", "tw:relative", "tw:flex tw:flex-col tw:overflow-hidden", "tw:max-h-[var(--available-height)]", "tw:w-[var(--anchor-width)]", "tw:max-w-[var(--available-width)]", "tw:origin-[var(--transform-origin)]", "tw:data-[chips=true]:min-w-[var(--anchor-width)]", "tw:rounded-lg", "tw:data-[variant=default]:rounded", "tw:bg-popover", "tw:text-popover-foreground", "tw:shadow-md", "tw:ring-1", "tw:ring-foreground/10", "tw:duration-100", "data-open:animate-in", "data-open:fade-in-0", "data-open:zoom-in-95", "data-closed:animate-out", "data-closed:fade-out-0", "data-closed:zoom-out-95", "tw:data-[side=bottom]:slide-in-from-top-2", "tw:data-[side=top]:slide-in-from-bottom-2", "tw:data-[side=left]:slide-in-from-right-2", "tw:data-[side=right]:slide-in-from-left-2", "tw:data-[side=inline-start]:slide-in-from-right-2", "tw:data-[side=inline-end]:slide-in-from-left-2", className),
@@ -326,7 +328,7 @@ const ComboboxItemIndicator = ({ ref, className, variant = "check", ...props })
326
328
  return /* @__PURE__ */ jsx(Combobox.ItemIndicator, {
327
329
  ...props,
328
330
  ref,
329
- className: cn("tw:pointer-events-none", "tw:absolute", "tw:right-2", "tw:group-data-[variant=default]/combobox-content:right-4", "tw:size-4", "tw:group-data-[highlighted]/combobox-item:text-accent-foreground", "tw:group-data-[variant=default]/combobox-content:group-data-[highlighted]/combobox-item:text-secondary-foreground", className),
331
+ className: cn("tw:pointer-events-none", "tw:absolute", "tw:right-2", "tw:group-data-[variant=default]/combobox-content:right-4", "tw:size-4", "tw:group-data-[highlighted]/combobox-item:text-hover-foreground", "tw:group-data-[variant=default]/combobox-content:group-data-[highlighted]/combobox-item:text-secondary-foreground", className),
330
332
  render: /* @__PURE__ */ jsx(Check, {})
331
333
  });
332
334
  };
@@ -362,17 +364,19 @@ const useVirtualList = (items, virtualized) => {
362
364
  };
363
365
  //#endregion
364
366
  //#region src/components/Combobox/ComboboxItem.tsx
365
- const ComboboxItem = ({ ref, className, children, icon, indicator: variant = "check", ...props }) => /* @__PURE__ */ jsxs(Combobox.Item, {
367
+ const ComboboxItem = ({ ref, className, children, icon, indicator: variant = "check", locked, ...props }) => /* @__PURE__ */ jsxs(Combobox.Item, {
366
368
  ...props,
367
369
  ...use(VirtualRowContext),
368
370
  ref,
369
371
  "data-slot": "combobox-item",
370
- className: cn("tw:group/combobox-item", "tw:relative", "tw:flex", "tw:flex-1", "tw:items-center", "tw:gap-2", "tw:py-2", "tw:px-2", "tw:group-data-[variant=default]/combobox-content:px-4", "tw:rounded-lg", "tw:group-data-[variant=default]/combobox-content:rounded-none", "tw:text-sm", "tw:select-none", "tw:cursor-default", "tw:outline-hidden", "tw:data-[highlighted]:bg-accent", "tw:group-data-[variant=default]/combobox-content:data-[highlighted]:bg-secondary", "tw:data-[highlighted]:text-accent-foreground", "tw:group-data-[variant=default]/combobox-content:data-[highlighted]:text-secondary-foreground", "tw:data-disabled:pointer-events-none", "tw:data-disabled:opacity-50", "tw:[&_svg]:pointer-events-none", "tw:[&_svg]:shrink-0", "tw:[&_svg]:text-muted-foreground", "tw:[&_svg:not([class*='size-'])]:size-4", className),
372
+ "data-locked": locked || void 0,
373
+ className: cn("tw:group/combobox-item", "tw:relative", "tw:flex", "tw:flex-1", "tw:items-center", "tw:gap-2", "tw:py-2", "tw:px-2", "tw:group-data-[variant=default]/combobox-content:px-4", "tw:rounded-lg", "tw:group-data-[variant=default]/combobox-content:rounded-none", "tw:text-sm", "tw:select-none", "tw:cursor-default", "tw:outline-hidden", "tw:data-[highlighted]:bg-hover", "tw:group-data-[variant=default]/combobox-content:data-[highlighted]:bg-secondary", "tw:data-[highlighted]:text-hover-foreground", "tw:group-data-[variant=default]/combobox-content:data-[highlighted]:text-secondary-foreground", "tw:data-disabled:pointer-events-none", "tw:data-disabled:opacity-disabled", "tw:data-locked:opacity-disabled", "tw:[&_svg]:pointer-events-none", "tw:[&_svg]:shrink-0", "tw:[&_svg]:text-muted-foreground", "tw:[&_svg:not([class*='size-'])]:size-4", className),
371
374
  children: [
372
375
  variant !== "none" && /* @__PURE__ */ jsx(ComboboxItemIndicator, { variant }),
373
376
  icon,
374
377
  /* @__PURE__ */ jsx("span", {
375
- className: "tw:min-w-0 tw:wrap-anywhere",
378
+ "data-slot": "combobox-item-label",
379
+ className: "tw:min-w-0 tw:flex-1 tw:wrap-anywhere",
376
380
  children
377
381
  })
378
382
  ]
@@ -400,38 +404,39 @@ const ComboboxOpenButton = ({ disabled, isLoading }) => /* @__PURE__ */ jsx(Inpu
400
404
  "aria-label": "Open combobox",
401
405
  children: /* @__PURE__ */ jsx(Combobox.Trigger, { children: isLoading ? /* @__PURE__ */ jsx(Loader2, { className: "tw:size-4 tw:animate-spin" }) : /* @__PURE__ */ jsx(ChevronDown, { className: "tw:size-4" }) })
402
406
  });
403
- //#endregion
404
- //#region src/components/Combobox/Group/ComboboxGroupHeader.tsx
405
- /** Indent of a header's children (chevron + gap); the legacy variant pads its rows wider. */
406
- const GROUP_CHILD_INDENT = "tw:pl-8 tw:group-data-[variant=default]/combobox-content:pl-10";
407
407
  /**
408
408
  * A group's own row, standing for the whole group.
409
409
  *
410
410
  * - Keyboard-navigable like any other row.
411
- * - The chevron toggles by pointer; `ArrowRight` / `ArrowLeft` are handled by the owning control.
411
+ * - The chevron toggles by pointer, Cmd- or Ctrl-click toggles every group; its tooltip says so.
412
+ * - `ArrowRight` / `ArrowLeft` are handled by the owning control.
412
413
  */
413
- const ComboboxGroupHeader = ({ value, children, expanded, onToggle, checked, indicator = "check", disabled }) => {
414
+ const ComboboxGroupHeader = ({ value, children, expanded, onToggle, checked, indicator = "check", disabled, locked }) => {
414
415
  const toggleFromChevron = (event) => {
415
416
  event.stopPropagation();
416
- onToggle();
417
+ onToggle(isToggleAllClick(event), event.currentTarget);
417
418
  };
418
419
  return /* @__PURE__ */ jsx(ComboboxItem, {
419
420
  value,
420
421
  disabled,
422
+ locked,
421
423
  "aria-description": expanded === void 0 ? void 0 : expanded ? "Expanded" : "Collapsed",
422
424
  ...checked !== void 0 && { "aria-selected": checked === true },
423
425
  indicator: "none",
424
426
  className: "tw:font-medium",
425
427
  onClick: checked !== void 0 ? void 0 : (event) => {
426
428
  event.preventBaseUIHandler();
427
- onToggle();
429
+ onToggle(isToggleAllClick(event), event.currentTarget);
428
430
  },
429
- icon: /* @__PURE__ */ jsxs(Fragment$1, { children: [expanded !== void 0 && /* @__PURE__ */ jsx("span", {
430
- "aria-hidden": true,
431
- "data-slot": "combobox-group-toggle",
432
- className: "tw:inline-flex tw:shrink-0",
433
- onClick: toggleFromChevron,
434
- children: /* @__PURE__ */ jsx(ChevronRight, { className: cn("tw:transition-transform", expanded && "tw:rotate-90") })
431
+ icon: /* @__PURE__ */ jsxs(Fragment$1, { children: [expanded !== void 0 && /* @__PURE__ */ jsx(ToggleAllTooltip, {
432
+ expanded,
433
+ children: /* @__PURE__ */ jsx("span", {
434
+ "aria-hidden": true,
435
+ "data-slot": "combobox-group-toggle",
436
+ className: "tw:pointer-events-auto tw:-m-1 tw:inline-flex tw:shrink-0 tw:cursor-pointer tw:rounded tw:p-1 tw:transition-colors tw:hover:bg-foreground/10",
437
+ onClick: toggleFromChevron,
438
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: cn("tw:transition-transform", expanded && "tw:rotate-90") })
439
+ })
435
440
  }), checked !== void 0 && /* @__PURE__ */ jsx(GroupIndicator, {
436
441
  checked,
437
442
  variant: indicator
@@ -456,7 +461,7 @@ const GroupIndicator = ({ checked, variant }) => {
456
461
  if (checked === false) return null;
457
462
  return /* @__PURE__ */ jsx(Mark, {
458
463
  "aria-hidden": true,
459
- className: cn("tw:pointer-events-none tw:absolute tw:right-2 tw:size-4", "tw:group-data-[variant=default]/combobox-content:right-4", "tw:group-data-[highlighted]/combobox-item:text-accent-foreground", "tw:group-data-[variant=default]/combobox-content:group-data-[highlighted]/combobox-item:text-secondary-foreground")
464
+ className: cn("tw:pointer-events-none tw:absolute tw:right-2 tw:size-4", "tw:group-data-[variant=default]/combobox-content:right-4", "tw:group-data-[highlighted]/combobox-item:text-hover-foreground", "tw:group-data-[variant=default]/combobox-content:group-data-[highlighted]/combobox-item:text-secondary-foreground")
460
465
  });
461
466
  };
462
467
  //#endregion
@@ -516,7 +521,21 @@ const ComboboxLoadingEmpty = () => /* @__PURE__ */ jsxs("span", {
516
521
  //#region src/components/Combobox/ComboboxVirtualList.tsx
517
522
  /** Rows rendered past each edge of the viewport, so a fast scroll does not paint blank. */
518
523
  const OVERSCAN = 12;
519
- const kindOf = (row) => row.type === "label" ? "label" : row.padded ? "padded" : "plain";
524
+ const isGroupLast = (row) => row.type === "item" && row.group !== void 0 && row.posInSet === row.setSize;
525
+ const kindOf = (row) => row.type === "label" ? "label" : `${row.padded ? "padded" : "plain"}${isGroupLast(row) ? "-last" : ""}`;
526
+ /** A row's React key: its group and its place in it, so a fold leaves other rows mounted. */
527
+ const placeOf = (row, index) => {
528
+ if (!row) return String(index);
529
+ if (row.type === "label") return `${row.group}:label`;
530
+ return `${row.group ?? "loose"}:${row.posInSet}`;
531
+ };
532
+ /**
533
+ * A row's key for the virtualizer, which keeps measured heights by it.
534
+ *
535
+ * - Folding one group leaves every other row's height in place.
536
+ * - A row that becomes its group's last is estimated afresh, its element kept.
537
+ */
538
+ const keyOf = (row, index) => `${placeOf(row, index)}${row && isGroupLast(row) ? ":last" : ""}`;
520
539
  /**
521
540
  * Base UI's filtered entries as one row per option or group label, in list order.
522
541
  *
@@ -601,11 +620,14 @@ const ComboboxVirtualList = ({ renderItem, renderGroupItem, groupToLabel, ref })
601
620
  const [rem] = useState(() => Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 0);
602
621
  const virtualizer = useVirtualizer({
603
622
  count: rows.length,
623
+ getItemKey: (index) => keyOf(rows[index], index),
604
624
  getScrollElement: () => listElement,
605
625
  estimateSize: (index) => {
606
626
  const row = rows[index];
607
627
  const measured = sizesRef.current;
608
- return (row && measured[kindOf(row)]) ?? measured.plain ?? measured.padded ?? rem;
628
+ const kind = row && kindOf(row);
629
+ const lastKinds = kind?.endsWith("-last") ? [measured["plain-last"], measured["padded-last"]] : [];
630
+ return (kind && measured[kind]) ?? lastKinds.find((size) => size !== void 0) ?? measured.plain ?? measured.padded ?? rem;
609
631
  },
610
632
  measureElement: (element, entry, instance) => {
611
633
  const size = measureElement(element, entry, instance);
@@ -645,7 +667,7 @@ const ComboboxVirtualList = ({ renderItem, renderGroupItem, groupToLabel, ref })
645
667
  width: "100%",
646
668
  transform: `translateY(${start - scrollMargin}px)`
647
669
  });
648
- const renderRow = ({ key, index, start }) => {
670
+ const renderRow = ({ index, start }) => {
649
671
  const row = rows[index];
650
672
  if (!row) return null;
651
673
  return /* @__PURE__ */ jsx("div", {
@@ -653,6 +675,7 @@ const ComboboxVirtualList = ({ renderItem, renderGroupItem, groupToLabel, ref })
653
675
  ref: virtualizer.measureElement,
654
676
  className: row.padded ? "tw:pt-0.5" : void 0,
655
677
  style: row.group === void 0 ? placeAt(start) : void 0,
678
+ "data-group-last": isGroupLast(row) ? "" : void 0,
656
679
  children: row.type === "label" ? /* @__PURE__ */ jsx(ComboboxGroupLabel, { children: labels.get(row.group ?? "") }) : /* @__PURE__ */ jsx(VirtualRowContext, {
657
680
  value: {
658
681
  index: row.index,
@@ -661,7 +684,7 @@ const ComboboxVirtualList = ({ renderItem, renderGroupItem, groupToLabel, ref })
661
684
  },
662
685
  children: row.group === void 0 ? renderItem(row.item) : renderGroupItem(row.item)
663
686
  })
664
- }, key);
687
+ }, placeOf(row, index));
665
688
  };
666
689
  return /* @__PURE__ */ jsx(ComboboxList, {
667
690
  ref: attachList,
@@ -689,12 +712,17 @@ const ComboboxVirtualList = ({ renderItem, renderGroupItem, groupToLabel, ref })
689
712
  };
690
713
  //#endregion
691
714
  //#region src/components/Combobox/ComboboxOptions.tsx
715
+ /** A group's items fade and slide in as it unfolds and out as it folds; nothing under reduced motion. */
716
+ const ITEM_MOTION = {
717
+ entering: "tw:motion-safe:animate-in tw:motion-safe:fade-in-0 tw:motion-safe:slide-in-from-top-1 tw:motion-safe:duration-150 tw:motion-safe:ease-out",
718
+ leaving: "tw:motion-safe:animate-out tw:motion-safe:fade-out-0 tw:motion-safe:slide-out-to-top-1 tw:motion-safe:duration-100 tw:motion-safe:ease-in tw:motion-safe:fill-mode-forwards"
719
+ };
692
720
  /**
693
721
  * What a combobox popup lists: every row, the empty slot, and the loading text in it.
694
722
  *
695
723
  * - The list is windowed while `virtualized`, fully rendered otherwise.
696
724
  */
697
- const ComboboxOptions = ({ isLoading, empty, virtualized, listRef, groupHeaders, groupToLabel, indicator, itemToLabel, itemToIcon, itemToDisabled, createLabel, groupRowState }) => {
725
+ const ComboboxOptions = ({ isLoading, empty, virtualized, listRef, groupHeaders, groupToLabel, indicator, itemToLabel, itemToIcon, itemToDisabled, itemToLocked, createLabel, groupRowState }) => {
698
726
  const renderItem = (item, className) => {
699
727
  if (isSelectAllItem(item)) return /* @__PURE__ */ jsx(ComboboxItem, {
700
728
  value: item,
@@ -711,21 +739,26 @@ const ComboboxOptions = ({ isLoading, empty, virtualized, listRef, groupHeaders,
711
739
  indicator,
712
740
  icon: itemToIcon(item),
713
741
  disabled: itemToDisabled(item),
742
+ locked: itemToLocked?.(item),
714
743
  className,
715
744
  children: itemToLabel(item)
716
745
  });
717
746
  };
718
747
  const renderGroupItem = (item) => {
719
748
  const header = groupHeaders.headerOf(item);
720
- if (!header) return renderItem(item, groupHeaders.collapsible ? GROUP_CHILD_INDENT : void 0);
749
+ if (!header) {
750
+ const motion = groupHeaders.motionOf(item);
751
+ return renderItem(item, cn(groupHeaders.collapsible && "tw:pl-8 tw:group-data-[variant=default]/combobox-content:pl-10", motion && ITEM_MOTION[motion]));
752
+ }
721
753
  const state = groupRowState?.(item);
722
754
  return /* @__PURE__ */ jsx(ComboboxGroupHeader, {
723
755
  value: item,
724
756
  expanded: groupHeaders.collapsible ? !header.collapsed : void 0,
725
- onToggle: () => groupHeaders.toggle(header.index),
757
+ onToggle: (all, from) => all ? groupHeaders.setAllCollapsed(!header.collapsed, from) : groupHeaders.toggle(header.index, from),
726
758
  checked: state?.checked,
727
759
  indicator,
728
760
  disabled: state?.disabled ?? false,
761
+ locked: state?.locked,
729
762
  children: groupToLabel(header.group)
730
763
  });
731
764
  };
@@ -759,22 +792,114 @@ const ComboboxSeparator = ({ ref, className, ...props }) => /* @__PURE__ */ jsx(
759
792
  */
760
793
  const useWithCreated = (list, created) => useMemo(() => created.length === 0 ? list : [...list, ...toEntries(list, created)], [list, created]);
761
794
  //#endregion
795
+ //#region src/components/Combobox/groupFlip.ts
796
+ /** How long the groups under a fold take to slide to their new place. */
797
+ const SLIDE_MS = 150;
798
+ /** A capture no commit moved anything for in this long is dropped. */
799
+ const STALE_MS = 500;
800
+ const listOf = (from) => from.closest("[role=listbox]") ?? from.ownerDocument.getElementById(from.getAttribute("aria-controls") ?? "");
801
+ const topIn = (list, element) => element.getBoundingClientRect().top - list.getBoundingClientRect().top + list.scrollTop;
802
+ /**
803
+ * Slides a list's groups from where they sat before a fold to where it puts them.
804
+ *
805
+ * - `capture` records each group's place; the next commit that moves one plays the slide.
806
+ * - A group the windowed list only now renders slides by the move of the group above it.
807
+ * - The caller skips `capture` under reduced motion; nothing plays without Web Animations.
808
+ */
809
+ const useGroupFlip = (enabled) => {
810
+ const captureRef = useRef(null);
811
+ const slidesRef = useRef(/* @__PURE__ */ new WeakMap());
812
+ const settledTop = (list, group) => {
813
+ const slide = slidesRef.current.get(group);
814
+ const progress = slide?.animation.effect?.getComputedTiming().progress;
815
+ const offset = slide && typeof progress === "number" ? slide.shift * (1 - progress) : 0;
816
+ return topIn(list, group) - offset;
817
+ };
818
+ useLayoutEffect(() => {
819
+ const capture = captureRef.current;
820
+ if (!capture) return;
821
+ if (performance.now() - capture.at > STALE_MS) {
822
+ captureRef.current = null;
823
+ return;
824
+ }
825
+ const groups = [...capture.list.querySelectorAll("[role=group]")];
826
+ let lastShift = 0;
827
+ const shifts = groups.map((group) => {
828
+ const before = capture.tops.get(group);
829
+ const shift = before === void 0 ? lastShift : before - settledTop(capture.list, group);
830
+ lastShift = shift;
831
+ return shift;
832
+ });
833
+ if (shifts.every((shift) => Math.abs(shift) < .5)) return;
834
+ captureRef.current = null;
835
+ groups.forEach((group, index) => {
836
+ const shift = shifts[index] ?? 0;
837
+ slidesRef.current.get(group)?.animation.cancel();
838
+ if (Math.abs(shift) < .5) return;
839
+ const animation = group.animate([{ transform: `translateY(${shift}px)` }, { transform: "translateY(0)" }], {
840
+ duration: SLIDE_MS,
841
+ easing: "ease-out",
842
+ composite: "add"
843
+ });
844
+ slidesRef.current.set(group, {
845
+ animation,
846
+ shift
847
+ });
848
+ });
849
+ });
850
+ return {
851
+ /** Records where the groups of the list `from` belongs to sit now. */
852
+ capture: (from) => {
853
+ const list = from && listOf(from);
854
+ if (!enabled || !list || typeof list.animate !== "function") return;
855
+ const tops = /* @__PURE__ */ new Map();
856
+ for (const group of list.querySelectorAll("[role=group]")) tops.set(group, topIn(list, group));
857
+ captureRef.current = {
858
+ list,
859
+ tops,
860
+ at: performance.now()
861
+ };
862
+ } };
863
+ };
864
+ //#endregion
762
865
  //#region src/components/Combobox/groupHeaders.ts
866
+ /** How long a folding group's items fade out before they leave the list. */
867
+ const FOLD_MS = 100;
868
+ /** How long an unfolding group's items animate in; their marker clears after it. */
869
+ const ENTER_MS = 150;
870
+ const NO_FOLDS = /* @__PURE__ */ new Set();
871
+ const hasMotion = () => typeof window.matchMedia === "function" && !window.matchMedia("(prefers-reduced-motion: reduce)").matches;
763
872
  /**
764
873
  * Gives each group a row (rendered with `ComboboxGroupHeader`) and collapses groups on request.
765
874
  *
766
875
  * - The row is the group's first item, so Base UI navigates, filters and presses it.
767
876
  * - A collapsed group hands Base UI only its row: Base UI never filters an empty query.
768
- * - A query shows every match regardless of collapse; a row shows only while its group matches.
877
+ * - A query opens every group with a match; a fold made under it lasts until the query changes.
878
+ * - A row shows only while its group matches.
769
879
  * - Collapse state is keyed by a group's position in `items`.
770
880
  */
771
- const useGroupHeaders = ({ items, collapsible, selectable, query, matches, groupToValue, isItemEqualToValue }) => {
772
- const [collapsedIndexes, setCollapsedIndexes] = useState(() => /* @__PURE__ */ new Set());
881
+ const useGroupHeaders = ({ items, collapsible, selectable, query, matches, groupToValue, isItemEqualToValue, startsCollapsed, startsOpen = false }) => {
882
+ const [collapsedIndexes, setCollapsedIndexes] = useState(() => startsOpen && collapsible && startsCollapsed && isGroupItems(items) ? new Set(items.flatMap((group, index) => startsCollapsed(group) ? [index] : [])) : /* @__PURE__ */ new Set());
883
+ const [searchFolds, setSearchFolds] = useState({
884
+ query: "",
885
+ indexes: /* @__PURE__ */ new Set()
886
+ });
887
+ /** The folds that apply now: those made without a query, or under this very query. */
888
+ const folded = query === "" ? collapsedIndexes : searchFolds.query === query ? searchFolds.indexes : NO_FOLDS;
889
+ const queryRef = useRef(query);
890
+ useLayoutEffect(() => {
891
+ queryRef.current = query;
892
+ }, [query]);
773
893
  const highlightedRef = useRef(void 0);
894
+ /** The groups animating, and the query their fold belongs to. */
895
+ const [motion, setMotion] = useState(null);
896
+ const foldTimerRef = useRef(void 0);
897
+ useEffect(() => () => clearTimeout(foldTimerRef.current), []);
898
+ const flip = useGroupFlip(collapsible);
774
899
  const enabled = (collapsible || selectable) && isGroupItems(items);
775
900
  const headers = /* @__PURE__ */ new Map();
776
901
  const listItems = !enabled ? items : items.map((group, index) => {
777
- const collapsed = collapsible && query === "" && collapsedIndexes.has(index);
902
+ const collapsed = collapsible && folded.has(index);
778
903
  const matching = query === "" ? group.items : group.items.filter(matches);
779
904
  const row = groupToValue ? groupToValue(group) : createGroupHeaderItem(index);
780
905
  headers.set(row, {
@@ -788,11 +913,78 @@ const useGroupHeaders = ({ items, collapsible, selectable, query, matches, group
788
913
  items: collapsed ? [row] : [row, ...group.items]
789
914
  };
790
915
  });
791
- const toggle = (index) => setCollapsedIndexes((prev) => {
792
- const next = new Set(prev);
793
- if (!next.delete(index)) next.add(index);
794
- return next;
795
- });
916
+ /**
917
+ * Folds or unfolds groups under `scope`, the query the toggle was made under.
918
+ *
919
+ * - A fold made without a query always lands.
920
+ * - A fold made under a query the input no longer holds is dropped: it would never show.
921
+ */
922
+ const setCollapsed = (indexes, collapsed, scope = query) => {
923
+ const apply = (prev) => {
924
+ const next = new Set(prev);
925
+ for (const index of indexes) if (collapsed) next.add(index);
926
+ else next.delete(index);
927
+ return next.size === prev.size && [...next].every((index) => prev.has(index)) ? prev : next;
928
+ };
929
+ if (scope === "") setCollapsedIndexes(apply);
930
+ else if (scope === queryRef.current) setSearchFolds((prev) => {
931
+ const base = prev.query === scope ? prev.indexes : NO_FOLDS;
932
+ const next = apply(base);
933
+ return next === base && prev.query === scope ? prev : {
934
+ query: scope,
935
+ indexes: next
936
+ };
937
+ });
938
+ };
939
+ const endMotionAfter = (ms, then) => {
940
+ clearTimeout(foldTimerRef.current);
941
+ foldTimerRef.current = setTimeout(() => {
942
+ then?.();
943
+ setMotion(null);
944
+ }, ms);
945
+ };
946
+ const folding = motion?.folding ? motion.indexes : /* @__PURE__ */ new Set();
947
+ /** A group still fading out counts as folded. */
948
+ const isCollapsed = (index) => folded.has(index) || folding.has(index);
949
+ /**
950
+ * Unfolds groups with their items animating in, or fades them out, then folds them.
951
+ *
952
+ * - The groups under them slide to their new place.
953
+ * - Folds still fading out finish at once, except those this call unfolds again.
954
+ */
955
+ const animate = (indexes, collapse, from) => {
956
+ clearTimeout(foldTimerRef.current);
957
+ const animated = hasMotion();
958
+ const finishing = [...folding].filter((index) => collapse || !indexes.includes(index));
959
+ const changing = indexes.filter((index) => isCollapsed(index) !== collapse);
960
+ if (animated && (finishing.length > 0 || changing.length > 0)) flip.capture(from);
961
+ if (motion) setCollapsed(finishing, true, motion.scope);
962
+ if (!animated || changing.length === 0) {
963
+ setCollapsed(changing, collapse);
964
+ setMotion(null);
965
+ return;
966
+ }
967
+ const scope = query;
968
+ setMotion({
969
+ indexes: new Set(changing),
970
+ folding: collapse,
971
+ scope
972
+ });
973
+ if (collapse) endMotionAfter(FOLD_MS, () => setCollapsed(changing, true, scope));
974
+ else {
975
+ setCollapsed(changing, false);
976
+ endMotionAfter(ENTER_MS);
977
+ }
978
+ };
979
+ /** Unfolds a folded group, folds an open one. */
980
+ const toggle = (index, from) => animate([index], !isCollapsed(index), from);
981
+ /** Folds or unfolds every group. */
982
+ const setAllCollapsed = (collapse, from) => {
983
+ if (!isGroupItems(items)) return;
984
+ animate(items.map((_, index) => index), collapse, from);
985
+ };
986
+ const groupIndexOf = /* @__PURE__ */ new Map();
987
+ if (motion && enabled && isGroupItems(items)) for (const index of motion.indexes) for (const item of items[index]?.items ?? []) groupIndexOf.set(item, index);
796
988
  const headerOf = (item) => headers.get(item);
797
989
  const highlightedHeader = () => {
798
990
  const item = highlightedRef.current;
@@ -808,6 +1000,12 @@ const useGroupHeaders = ({ items, collapsible, selectable, query, matches, group
808
1000
  collapsible,
809
1001
  headerOf,
810
1002
  toggle,
1003
+ setAllCollapsed,
1004
+ /** `entering` / `leaving` for an item of the group that last unfolded / is folding. */
1005
+ motionOf: (item) => {
1006
+ if (!motion || !groupIndexOf.has(item)) return void 0;
1007
+ return motion.folding ? "leaving" : "entering";
1008
+ },
811
1009
  /** `filter` verdict for a group row (matches while its group does); `undefined` otherwise. */
812
1010
  filterHeader: (item) => {
813
1011
  const header = headerOf(item);
@@ -817,9 +1015,13 @@ const useGroupHeaders = ({ items, collapsible, selectable, query, matches, group
817
1015
  onItemHighlighted: (item) => {
818
1016
  highlightedRef.current = item;
819
1017
  },
820
- /** For the root's `onOpenChange`: a closed popup has no highlighted row to toggle. */
1018
+ /** For the root's `onOpenChange`: clears the highlight on close, folds `startsCollapsed` on open. */
821
1019
  onOpenChange: (open) => {
822
1020
  if (!open) highlightedRef.current = void 0;
1021
+ clearTimeout(foldTimerRef.current);
1022
+ if (motion?.folding) setCollapsed(motion.indexes, true, motion.scope);
1023
+ setMotion(null);
1024
+ if (open && collapsible && startsCollapsed && isGroupItems(items)) setCollapsedIndexes(new Set(items.flatMap((group, index) => startsCollapsed(group) ? [index] : [])));
823
1025
  },
824
1026
  /**
825
1027
  * For the input's `onKeyDown`: `ArrowRight` / `ArrowLeft` expand / collapse the highlighted row.
@@ -832,7 +1034,7 @@ const useGroupHeaders = ({ items, collapsible, selectable, query, matches, group
832
1034
  if (!header) return;
833
1035
  event.preventDefault();
834
1036
  event.preventBaseUIHandler();
835
- if (header.collapsed === (event.key === "ArrowRight")) toggle(header.index);
1037
+ if (isCollapsed(header.index) === (event.key === "ArrowRight")) toggle(header.index, event.currentTarget);
836
1038
  }
837
1039
  };
838
1040
  };
@@ -1078,4 +1280,4 @@ const filterByWords = (item, query, itemToString) => matchByWords(itemToString?.
1078
1280
  //#endregion
1079
1281
  export { BLANK_VALUES, Combobox$1 as Combobox, ComboboxClearButton, ComboboxOpenButton, ComboboxOptions, createCreatableItem, defaultGroupToLabel, defaultItemToDisabled, defaultItemToIcon, defaultQueryToCreateLabel, defaultRowLabel, defaultToCreateValue, filterByWords, flatItems, isCreatableItem, isGroupHeaderItem, isSelectAllItem, matchByWords, namedLabel, sanitizeTypedInput, selectAllItem, toEntries, toLabel, useCreatableStringValue, useGroupHeaders, useItemEquality, useQueryReporter, useVirtualList, useWithCreated, withBlankValues };
1080
1282
 
1081
- //# sourceMappingURL=Combobox-BNhW0TDB.js.map
1283
+ //# sourceMappingURL=Combobox-CEesMe2M.js.map