@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,14 +1,41 @@
1
- import { splitEntry } from "../../utils-Bd28bWgm.js";
1
+ import { cn } from "../../classNames-DcGnTh2N.js";
2
+ import { Tooltip, TooltipProvider, splitEntry } from "../../utils-LQ4jJA-9.js";
2
3
  import { useArgoDesign } from "../../context-U293r3v-.js";
4
+ import { PanelRightClose, PanelRightOpen, Search } from "../../icons-ZIeZXXS7.js";
5
+ import { Button } from "../../Button-D2JqBAq7.js";
3
6
  import { useControllableState } from "../../useControllableState-CUYXMsfz.js";
4
7
  import { forwardAccessibleName } from "../utils/accessibleName.js";
5
- import { Combobox as Combobox$1, ComboboxClearButton, ComboboxOpenButton, ComboboxOptions, createCreatableItem, defaultGroupToLabel, defaultItemToDisabled, defaultItemToIcon, defaultQueryToCreateLabel, defaultRowLabel, defaultToCreateValue, flatItems, isCreatableItem, isGroupHeaderItem, isSelectAllItem, sanitizeTypedInput, selectAllItem, toEntries, toLabel, useCreatableStringValue, useGroupHeaders, useItemEquality, useQueryReporter, useVirtualList, useWithCreated } from "../../Combobox-BNhW0TDB.js";
8
+ import { Combobox as Combobox$1, ComboboxClearButton, ComboboxOpenButton, ComboboxOptions, createCreatableItem, defaultGroupToLabel, defaultItemToDisabled, defaultItemToIcon, defaultQueryToCreateLabel, defaultRowLabel, defaultToCreateValue, flatItems, isCreatableItem, isGroupHeaderItem, isSelectAllItem, sanitizeTypedInput, selectAllItem, toEntries, toLabel, useCreatableStringValue, useGroupHeaders, useItemEquality, useQueryReporter, useVirtualList, useWithCreated } from "../../Combobox-CEesMe2M.js";
6
9
  import { useCallback, useMemo, useState } from "react";
7
10
  import { jsx, jsxs } from "react/jsx-runtime";
8
11
  import { Combobox } from "@base-ui/react/combobox";
9
12
  //#region src/blocks/MultiCombobox/MultiCombobox.tsx
10
13
  /** Joins the create row's values with the entry's separator; a `RegExp` uses the default one. */
11
14
  const joinCreateParts = (parts, separator) => parts.join(`${typeof separator === "string" ? separator : ","} `);
15
+ /**
16
+ * White group cards on a grey list: each group's row and open items sit on one card.
17
+ *
18
+ * - The grey is `--secondary` at 45% over the popover, about 1.10:1 against white.
19
+ * - The gap is space under each card's last row, so a windowed list measures it with the row.
20
+ * - Base UI's `role="group"` wraps a group's row and items in either list.
21
+ * - Rows are square; the card's first and last rows take its corners. Enabled rows show a pointer.
22
+ */
23
+ const GROUP_BANDED = [
24
+ "tw:bg-[color-mix(in_oklab,rgb(var(--secondary))_45%,rgb(var(--popover)))]",
25
+ "tw:[&_[role=listbox]]:bg-[color-mix(in_oklab,rgb(var(--secondary))_45%,rgb(var(--popover)))]",
26
+ "tw:[&_[role=group]]:relative tw:[&_[role=group]]:isolate",
27
+ "tw:[&_[role=group]]:before:absolute tw:[&_[role=group]]:before:inset-x-0 tw:[&_[role=group]]:before:top-0",
28
+ "tw:[&_[role=group]]:before:bottom-2 tw:[&_[role=group]]:before:-z-10",
29
+ "tw:[&_[role=group]]:before:rounded-lg tw:[&_[role=group]]:before:bg-popover",
30
+ "tw:[&_[role=group]>[role=option]:last-child]:mb-2 tw:[&_[data-group-last]]:pb-2",
31
+ "tw:[&_[role=group]_[role=option]]:rounded-none",
32
+ "tw:[&_[role=group]>:first-child_[role=option]]:rounded-t-lg",
33
+ "tw:[&_[role=group]>:last-child_[role=option]]:rounded-b-lg",
34
+ "tw:[&_[role=option]:not([data-disabled]):not([data-locked])]:cursor-pointer",
35
+ "tw:[&_[role=option]]:items-start",
36
+ "tw:[&_[role=option]>:not([data-slot=combobox-item-label]):not([data-slot=combobox-group-toggle])]:mt-0.5",
37
+ "tw:[&_[role=option]>[data-slot=combobox-group-toggle]]:-mt-0.5"
38
+ ].join(" ");
12
39
  const NO_ITEMS = [];
13
40
  const NO_VALUES = [];
14
41
  /**
@@ -17,7 +44,7 @@ const NO_VALUES = [];
17
44
  * @see RECIPES.md#creatable-multi-combobox
18
45
  * @see RECIPES.md#filter-toolbar
19
46
  */
20
- const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onValueChange, itemToStringLabel, itemToStringValue, disabled, filter: filterProp, isItemEqualToValue: isItemEqualToValueProp, inputRef, variant, sizing, focusVariant, state, placeholder, allowClear = true, name, onBlur, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-required": ariaRequired, className, allowSelectAll = false, empty = "No items", isLoading = false, indicator, virtualized = false, inputValueSanitizer, onQueryChange, allowCreate, canCreate, queryToCreateValue, queryToCreateLabel = defaultQueryToCreateLabel, createSeparator = ",", itemToDisabled = defaultItemToDisabled, itemToLabel: itemToLabelProp, itemToIcon = defaultItemToIcon, groupToLabel = defaultGroupToLabel, collapsibleGroups = false, selectableGroups = false, itemToChipLabel, itemToChipColor, pinnedChipLabels, renderChips, maxVisible = 3, ...accessibleName }) => {
47
+ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onValueChange, itemToStringLabel, itemToStringValue, disabled, filter: filterProp, isItemEqualToValue: isItemEqualToValueProp, inputRef, variant, sizing, focusVariant, state, placeholder, allowClear = true, name, onBlur, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-required": ariaRequired, className, allowSelectAll = false, empty = "No items", isLoading = false, indicator, virtualized = false, inputValueSanitizer, onQueryChange, allowCreate, canCreate, queryToCreateValue, queryToCreateLabel = defaultQueryToCreateLabel, createSeparator = ",", itemToDisabled = defaultItemToDisabled, itemToLocked, itemToLabel: itemToLabelProp, itemToIcon = defaultItemToIcon, groupToLabel = defaultGroupToLabel, collapsibleGroups = false, selectableGroups = false, collapseSelectedGroups = false, groupAppearance = "plain", itemToChipLabel, itemToChipColor, pinnedChipLabels, renderChips, renderAside, asideOpen: asideOpenProp, onAsideOpenChange, defaultOpen = false, onOpenChange, anchor, query: queryProp, maxVisible = 3, ...accessibleName }) => {
21
48
  const itemsProp = _itemsProp ?? NO_ITEMS;
22
49
  const [valueProp, setValueProp] = useControllableState({
23
50
  prop: _valueProp === null ? NO_VALUES : _valueProp,
@@ -27,11 +54,17 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
27
54
  const itemToLabel = itemToLabelProp ?? defaultRowLabel(itemToStringLabel);
28
55
  const chipVariant = useArgoDesign() ? "pill" : "default";
29
56
  const [inputValue, setInputValue] = useState("");
57
+ const [asideOpen, setAsideOpen] = useControllableState({
58
+ prop: asideOpenProp,
59
+ defaultProp: true,
60
+ onChange: onAsideOpenChange
61
+ });
62
+ const [lastHighlighted, setLastHighlighted] = useState(null);
30
63
  const [createdItems, setCreatedItems] = useState([]);
31
- const query = inputValue.trim();
64
+ const query = (queryProp ?? inputValue).trim();
32
65
  useQueryReporter(query, onQueryChange);
33
66
  const busy = isLoading || void 0;
34
- const ownsInput = Boolean(allowCreate || inputValueSanitizer || onQueryChange || itemToLabelProp || collapsibleGroups || selectableGroups);
67
+ const ownsInput = Boolean(queryProp !== void 0 || allowCreate || inputValueSanitizer || onQueryChange || itemToLabelProp || collapsibleGroups || selectableGroups);
35
68
  const baseItems = useWithCreated(itemsProp, createdItems);
36
69
  const allFlatItems = flatItems(baseItems);
37
70
  const sampleItem = allFlatItems[0];
@@ -63,7 +96,9 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
63
96
  selectable: selectableGroups,
64
97
  query,
65
98
  matches: (item) => itemFilter(item, query, wrappedItemToStringLabel),
66
- isItemEqualToValue
99
+ isItemEqualToValue,
100
+ startsCollapsed: collapseSelectedGroups ? (group) => group.items.length > 0 && group.items.every((item) => valueProp.some((selected) => isItemEqualToValue(item, selected))) : void 0,
101
+ startsOpen: defaultOpen
67
102
  });
68
103
  const listItems = useWithCreated(groupHeaders.items, createdItems);
69
104
  const virtualList = useVirtualList(baseItems, virtualized);
@@ -107,7 +142,7 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
107
142
  const selectedSet = selectableGroups && !isItemEqualToValueProp ? new Set(valueProp) : void 0;
108
143
  const isSelected = (item) => selectedSet?.has(item) ?? valueProp.some((selected) => isItemEqualToValue(item, selected));
109
144
  /** What a group's row selects: the group's items the query matches, the disabled aside. */
110
- const groupTargets = (row) => groupHeaders.headerOf(row)?.matching.filter((item) => !itemToDisabled(item)) ?? [];
145
+ const groupTargets = (row) => groupHeaders.headerOf(row)?.matching.filter((item) => !itemToDisabled(item) && !itemToLocked?.(item)) ?? [];
111
146
  /**
112
147
  * Replaces a pressed group row in `next` with its items.
113
148
  *
@@ -128,6 +163,7 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
128
163
  return selectedCount === targets.length ? true : "mixed";
129
164
  };
130
165
  const handleInputValueChange = (next, { reason }) => {
166
+ if (queryProp !== void 0) return;
131
167
  setInputValue(sanitizeTypedInput(next, reason, inputValueSanitizer));
132
168
  };
133
169
  const handleValueChange = (next, event) => {
@@ -160,9 +196,68 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
160
196
  const selected = new Set(newValue.map(itemToString));
161
197
  setCreatedItems((prev) => [...prev, ...created].filter((item) => selected.has(itemToString(item))));
162
198
  }
163
- setValueProp(newValue);
164
- onValueChange?.(newValue, event);
199
+ const kept = itemToLocked ? [...newValue.filter((item) => !itemToLocked(item) || isSelected(item)), ...valueProp.filter((item) => itemToLocked(item) && !newValue.some((picked) => isItemEqualToValue(picked, item)))] : newValue;
200
+ if (itemToLocked && kept.length === valueProp.length && kept.every(isSelected)) return;
201
+ setValueProp(kept);
202
+ onValueChange?.(kept, event);
165
203
  };
204
+ const toHighlighted = (item) => {
205
+ if (item === void 0 || isCreatableItem(item) || isSelectAllItem(item)) return null;
206
+ const header = groupHeaders.headerOf(item);
207
+ if (header) return {
208
+ kind: "group",
209
+ group: header.group
210
+ };
211
+ return isGroupHeaderItem(item) ? null : {
212
+ kind: "item",
213
+ item
214
+ };
215
+ };
216
+ const options = /* @__PURE__ */ jsx(ComboboxOptions, {
217
+ isLoading,
218
+ empty,
219
+ virtualized: virtualList.enabled,
220
+ listRef: virtualList.ref,
221
+ groupHeaders,
222
+ groupToLabel,
223
+ indicator,
224
+ itemToLabel: (item) => itemToLabel(item, query),
225
+ itemToIcon,
226
+ itemToDisabled,
227
+ itemToLocked,
228
+ createLabel: () => queryToCreateLabel(joinCreateParts(addedCreateParts, createSeparator)),
229
+ groupRowState: selectableGroups ? (row) => {
230
+ const targets = groupTargets(row);
231
+ const shown = (groupHeaders.headerOf(row)?.matching ?? []).filter((item) => !itemToDisabled(item) || isSelected(item));
232
+ const locked = targets.length === 0 && shown.some((item) => itemToLocked?.(item));
233
+ return {
234
+ checked: groupRowChecked(shown),
235
+ disabled: targets.length === 0 && !locked,
236
+ locked
237
+ };
238
+ } : void 0
239
+ });
240
+ const input = /* @__PURE__ */ jsx(Combobox$1.Input, {
241
+ ...forwardAccessibleName(accessibleName),
242
+ name,
243
+ onBlur,
244
+ "aria-describedby": ariaDescribedBy,
245
+ "aria-invalid": ariaInvalid,
246
+ "aria-required": ariaRequired,
247
+ "aria-busy": busy,
248
+ placeholder,
249
+ disabled,
250
+ tabIndex: anchor && queryProp !== void 0 ? -1 : void 0,
251
+ onKeyDown: groupHeaders.onInputKeyDown,
252
+ className: anchor ? "tw:min-w-0 tw:grow tw:!px-0 tw:!py-0" : "tw:w-auto tw:min-w-0 tw:grow tw:basis-[120px] tw:!px-0 tw:!py-0"
253
+ });
254
+ const popupSearch = anchor && queryProp === void 0 ? /* @__PURE__ */ jsx("div", {
255
+ className: "tw:flex tw:items-center tw:gap-2 tw:px-3 tw:pt-2.5 tw:pb-1",
256
+ children: /* @__PURE__ */ jsxs(Combobox$1.InputGroup, {
257
+ className: "tw:h-9 tw:flex-1 tw:gap-2 tw:bg-background tw:px-3",
258
+ children: [/* @__PURE__ */ jsx(Search, { className: "tw:size-4 tw:shrink-0 tw:text-muted-foreground" }), input]
259
+ })
260
+ }) : null;
166
261
  return /* @__PURE__ */ jsxs(Combobox$1.Root, {
167
262
  multiple: true,
168
263
  autoHighlight: true,
@@ -171,10 +266,17 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
171
266
  filter,
172
267
  isItemEqualToValue,
173
268
  onValueChange: handleValueChange,
174
- onOpenChange: groupHeaders.onOpenChange,
269
+ defaultOpen,
270
+ onOpenChange: (open) => {
271
+ groupHeaders.onOpenChange(open);
272
+ if (!open) setLastHighlighted(null);
273
+ onOpenChange?.(open);
274
+ },
175
275
  onItemHighlighted: (item, details) => {
176
276
  groupHeaders.onItemHighlighted(item);
177
277
  virtualList.onItemHighlighted(details);
278
+ const next = renderAside ? toHighlighted(item) : null;
279
+ if (next) setLastHighlighted(next);
178
280
  },
179
281
  virtualized: virtualList.enabled,
180
282
  itemToStringLabel: wrappedItemToStringLabel,
@@ -182,70 +284,104 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
182
284
  disabled,
183
285
  inputRef,
184
286
  ...ownsInput ? {
185
- inputValue,
287
+ inputValue: queryProp ?? inputValue,
186
288
  onInputValueChange: handleInputValueChange
187
289
  } : {},
188
- children: [/* @__PURE__ */ jsx(Combobox$1.InputGroup, {
189
- variant,
190
- sizing,
191
- state,
192
- focusVariant,
193
- className,
194
- children: /* @__PURE__ */ jsxs(Combobox.Chips, {
195
- className: "tw:flex tw:min-w-0 tw:flex-1 tw:flex-wrap tw:items-center tw:gap-1.5 tw:px-4 tw:py-1.5",
196
- children: [/* @__PURE__ */ jsx(Combobox$1.Chips, {
197
- maxVisible,
198
- variant: chipVariant,
199
- itemToChipLabel: itemToChipLabel ?? ((item) => itemToLabel(item, "")),
200
- itemToChipColor,
201
- pinnedChipLabels,
202
- children: renderChips
203
- }), /* @__PURE__ */ jsxs("div", {
204
- className: "tw:flex tw:min-w-0 tw:grow tw:items-center tw:gap-1",
205
- children: [
206
- /* @__PURE__ */ jsx(Combobox$1.Input, {
207
- ...forwardAccessibleName(accessibleName),
208
- name,
209
- onBlur,
210
- "aria-describedby": ariaDescribedBy,
211
- "aria-invalid": ariaInvalid,
212
- "aria-required": ariaRequired,
213
- "aria-busy": busy,
214
- placeholder,
215
- disabled,
216
- onKeyDown: groupHeaders.onInputKeyDown,
217
- className: "tw:w-auto tw:min-w-0 tw:grow tw:basis-[120px] tw:!px-0 tw:!py-0"
218
- }),
219
- allowClear && /* @__PURE__ */ jsx(ComboboxClearButton, { disabled }),
220
- /* @__PURE__ */ jsx(ComboboxOpenButton, {
221
- disabled,
222
- isLoading
290
+ children: [
291
+ anchor && queryProp !== void 0 && /* @__PURE__ */ jsx("div", {
292
+ className: "tw:sr-only",
293
+ children: input
294
+ }),
295
+ !anchor && /* @__PURE__ */ jsx(Combobox$1.InputGroup, {
296
+ variant,
297
+ sizing,
298
+ state,
299
+ focusVariant,
300
+ className,
301
+ children: /* @__PURE__ */ jsxs(Combobox.Chips, {
302
+ className: "tw:flex tw:min-w-0 tw:flex-1 tw:flex-wrap tw:items-center tw:gap-1.5 tw:px-4 tw:py-1.5",
303
+ children: [/* @__PURE__ */ jsx(Combobox$1.Chips, {
304
+ maxVisible,
305
+ variant: chipVariant,
306
+ itemToChipLabel: itemToChipLabel ?? ((item) => itemToLabel(item, "")),
307
+ itemToChipColor,
308
+ pinnedChipLabels,
309
+ children: renderChips
310
+ }), /* @__PURE__ */ jsxs("div", {
311
+ className: "tw:flex tw:min-w-0 tw:grow tw:items-center tw:gap-1",
312
+ children: [
313
+ input,
314
+ allowClear && /* @__PURE__ */ jsx(ComboboxClearButton, { disabled }),
315
+ /* @__PURE__ */ jsx(ComboboxOpenButton, {
316
+ disabled,
317
+ isLoading
318
+ })
319
+ ]
320
+ })]
321
+ })
322
+ }),
323
+ renderAside ? /* @__PURE__ */ jsxs(Combobox$1.Content, {
324
+ anchor,
325
+ className: cn("tw:@container tw:w-[max(var(--anchor-width),48rem)]", "tw:min-h-[min(var(--available-height),22rem)] tw:data-empty:min-h-0", anchor && "tw:max-h-[min(var(--available-height),32rem)]", groupAppearance === "banded" && GROUP_BANDED),
326
+ children: [
327
+ popupSearch,
328
+ /* @__PURE__ */ jsxs("div", {
329
+ className: cn("tw:grid tw:min-h-0 tw:flex-1 tw:grid-rows-[minmax(0,1fr)]", "tw:motion-safe:transition-[grid-template-columns] tw:motion-safe:duration-200 tw:motion-safe:ease-out", asideOpen ? "tw:grid-cols-[minmax(0,2fr)_1fr]" : "tw:grid-cols-[minmax(0,2fr)_0fr]", "tw:@max-[40rem]:grid-cols-[minmax(0,2fr)_0fr]"),
330
+ children: [/* @__PURE__ */ jsx("div", {
331
+ className: cn("tw:flex tw:min-h-0 tw:min-w-0 tw:flex-col tw:group-data-empty/combobox-content:col-span-2", !asideOpen && "tw:pb-10 tw:@max-[40rem]:pb-0 tw:group-data-empty/combobox-content:pb-0"),
332
+ children: options
333
+ }), /* @__PURE__ */ jsx("div", {
334
+ className: cn("tw:relative tw:min-w-0 tw:overflow-hidden tw:border-border", "tw:motion-safe:transition-opacity tw:motion-safe:duration-200", asideOpen ? "tw:border-l tw:opacity-100" : "tw:opacity-0", "tw:@max-[40rem]:invisible tw:@max-[40rem]:border-l-0 tw:@max-[40rem]:opacity-0", "tw:group-data-empty/combobox-content:hidden"),
335
+ "data-slot": "combobox-inspector",
336
+ inert: !asideOpen,
337
+ children: /* @__PURE__ */ jsx("div", {
338
+ className: "tw:absolute tw:inset-y-0 tw:left-0 tw:w-full tw:min-w-60 tw:overflow-y-auto tw:p-4 tw:pb-12",
339
+ children: renderAside(lastHighlighted)
340
+ })
341
+ })]
342
+ }),
343
+ /* @__PURE__ */ jsx("div", {
344
+ className: "tw:absolute tw:right-2 tw:bottom-2 tw:@max-[40rem]:hidden tw:group-data-empty/combobox-content:hidden",
345
+ children: /* @__PURE__ */ jsx(AsideToggle, {
346
+ open: asideOpen,
347
+ onOpenChange: setAsideOpen
223
348
  })
224
- ]
225
- })]
349
+ })
350
+ ]
351
+ }) : /* @__PURE__ */ jsxs(Combobox$1.Content, {
352
+ anchor,
353
+ className: cn(anchor && "tw:max-h-[min(var(--available-height),32rem)]", groupAppearance === "banded" && GROUP_BANDED),
354
+ children: [popupSearch, options]
226
355
  })
227
- }), /* @__PURE__ */ jsx(Combobox$1.Content, { children: /* @__PURE__ */ jsx(ComboboxOptions, {
228
- isLoading,
229
- empty,
230
- virtualized: virtualList.enabled,
231
- listRef: virtualList.ref,
232
- groupHeaders,
233
- groupToLabel,
234
- indicator,
235
- itemToLabel: (item) => itemToLabel(item, query),
236
- itemToIcon,
237
- itemToDisabled,
238
- createLabel: () => queryToCreateLabel(joinCreateParts(addedCreateParts, createSeparator)),
239
- groupRowState: selectableGroups ? (row) => {
240
- const targets = groupTargets(row);
241
- return {
242
- checked: groupRowChecked(targets),
243
- disabled: targets.length === 0
244
- };
245
- } : void 0
246
- }) })]
356
+ ]
247
357
  });
248
358
  };
359
+ /**
360
+ * Hides or shows the inspector beside the list, from the popup's bottom-right corner.
361
+ *
362
+ * - Floats over the list while the inspector is hidden; gone with it when the popup is too narrow.
363
+ * - Keeps the input focused, so the popup stays open.
364
+ */
365
+ const AsideToggle = ({ open, onOpenChange }) => {
366
+ const label = open ? "Hide inspector" : "Show inspector";
367
+ const Icon = open ? PanelRightClose : PanelRightOpen;
368
+ return /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(Tooltip.Root, { children: [/* @__PURE__ */ jsx(Tooltip.Trigger, {
369
+ asChild: true,
370
+ children: /* @__PURE__ */ jsx(Button, {
371
+ variant: "outline",
372
+ size: "icon-xs",
373
+ "aria-label": label,
374
+ "aria-expanded": open,
375
+ className: "tw:bg-popover tw:shadow-sm",
376
+ onMouseDown: (event) => event.preventDefault(),
377
+ onClick: () => onOpenChange(!open),
378
+ children: /* @__PURE__ */ jsx(Icon, {})
379
+ })
380
+ }), /* @__PURE__ */ jsx(Tooltip.Content, {
381
+ placement: "left",
382
+ children: label
383
+ })] }) });
384
+ };
249
385
  //#endregion
250
386
  export { MultiCombobox };
251
387
 
@@ -1 +1 @@
1
- {"version":3,"file":"MultiCombobox.js","names":["BaseCombobox","Combobox"],"sources":["../../../src/blocks/MultiCombobox/MultiCombobox.tsx"],"sourcesContent":["import { type ComponentProps, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { Combobox as BaseCombobox } from '@base-ui/react/combobox';\n\nimport { Combobox } from '../../components/Combobox';\nimport { ComboboxClearButton } from '../../components/Combobox/ComboboxClearButton';\nimport { ComboboxOpenButton } from '../../components/Combobox/ComboboxOpenButton';\nimport { ComboboxOptions } from '../../components/Combobox/ComboboxOptions';\nimport { useWithCreated } from '../../components/Combobox/createdItems';\nimport { useGroupHeaders } from '../../components/Combobox/groupHeaders';\nimport { sanitizeTypedInput, useQueryReporter } from '../../components/Combobox/query';\nimport type { Group } from '../../components/Combobox/types';\nimport {\n createCreatableItem,\n defaultGroupToLabel,\n defaultItemToDisabled,\n defaultItemToIcon,\n defaultQueryToCreateLabel,\n defaultRowLabel,\n defaultToCreateValue,\n flatItems,\n isCreatableItem,\n isGroupHeaderItem,\n isSelectAllItem,\n selectAllItem,\n toEntries,\n toLabel,\n useCreatableStringValue,\n useItemEquality,\n} from '../../components/Combobox/utils';\nimport { useVirtualList, type VirtualizedProps } from '../../components/Combobox/virtualList';\nimport { useArgoDesign } from '../../components/ThemeProvider/context';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { DEFAULT_ENTRY_SEPARATOR, splitEntry } from '../../utils';\nimport { forwardAccessibleName, type WithAccessibleName } from '../../utils/accessibleName';\n\ntype ComboboxProps<Value> = BaseCombobox.Root.Props<Value, true>;\ntype ComboboxInputProps = ComponentProps<typeof Combobox.Input>;\ntype ComboboxInputGroupProps = ComponentProps<typeof Combobox.InputGroup>;\ntype ComboboxItemProps = ComponentProps<typeof Combobox.Item>;\ntype ComboboxChipsProps<Value> = ComponentProps<typeof Combobox.Chips<Value>>;\n\ntype Indicator = Exclude<NonNullable<ComboboxItemProps['indicator']>, 'none'>;\n\n/** Joins the create row's values with the entry's separator; a `RegExp` uses the default one. */\nconst joinCreateParts = (parts: string[], separator: string | RegExp | null) =>\n parts.join(`${typeof separator === 'string' ? separator : DEFAULT_ENTRY_SEPARATOR} `);\n\ntype CreatableProps<Value> = {\n allowCreate?: boolean;\n /** Words the create row. Receives the values it adds, trimmed and re-joined — not the entry as typed. */\n queryToCreateLabel?: (query: string) => ReactNode;\n /** Projects one entered value into an item. Called once per trimmed part of a split entry. */\n queryToCreateValue?: (query: string) => Value;\n /** Rejects a value `allowCreate` would mint; values naming an item or already selected skip it. */\n canCreate?: (query: string) => boolean;\n /** Splits one entry into several values (default `','`). A `RegExp` must not capture; `null` never splits. */\n createSeparator?: string | RegExp | null;\n};\n\ntype BaseProps<Value, GroupShape extends Group<Value> = Group<Value>> = Pick<\n ComboboxInputProps,\n // Go to the input, which is the `combobox` role; on the group they reach nothing.\n // - The `aria-*` set links a form field's label, help and error text.\n // - `onBlur` is the gate `FieldItem` reveals errors on.\n | 'placeholder'\n | 'id'\n | 'name'\n | 'onBlur'\n | 'aria-label'\n | 'aria-labelledby'\n | 'aria-describedby'\n | 'aria-invalid'\n | 'aria-required'\n> &\n Pick<ComboboxInputGroupProps, 'variant' | 'focusVariant' | 'sizing' | 'state' | 'className'> &\n Pick<\n ComboboxProps<Value>,\n | 'disabled'\n | 'inputRef'\n | 'value'\n | 'defaultValue'\n | 'onValueChange'\n | 'itemToStringLabel'\n | 'itemToStringValue'\n | 'filter'\n | 'isItemEqualToValue'\n > &\n Pick<\n ComboboxChipsProps<Value>,\n 'itemToChipLabel' | 'itemToChipColor' | 'pinnedChipLabels' | 'maxVisible'\n > &\n CreatableProps<Value> &\n VirtualizedProps & {\n /** Read as immutable: pass a new array to change it; one mutated in place is not re-filtered. */\n items?: readonly (Value | GroupShape)[];\n\n // root specific\n /** Clear-all button, shown only while chips exist. Chips stay removable either way. */\n allowClear?: boolean;\n /** \"Select All\" row for the whole set; hidden while a query is active, clears when all are selected. */\n allowSelectAll?: boolean;\n empty?: ReactNode;\n /** Options still arriving; doesn't disable — pass `disabled` where the user must wait. */\n isLoading?: boolean;\n indicator?: Indicator;\n\n // query specific\n /** Rewrites typed text before filtering and creating. Sees the whole text per keystroke — don't `trim()`. */\n inputValueSanitizer?: (input: string) => string;\n /** Reports the sanitized query, on mount too. Notification only — the control owns the text. */\n onQueryChange?: (query: string) => void;\n\n // item specific\n /**\n * Row and chip content (unless `itemToChipLabel`), `itemToStringLabel` by default.\n * - `query` is the search text, for `MarkedText`; a chip gets `''`.\n */\n itemToLabel?: (item: Value, query: string) => ReactNode;\n itemToIcon?: (item: Value) => ReactNode;\n itemToDisabled?: (item: Value) => boolean;\n\n // chip specific\n /** Replaces the default chips; the chip props, `maxVisible` included, are then ignored. */\n renderChips?: (values: Value[]) => ReactNode;\n\n // group specific\n /** Defaults to the group's `label`, as `Select` shows it. */\n groupToLabel?: (group: GroupShape) => ReactNode;\n /** A row per group that folds it. A query shows every match regardless; state is keyed by position. */\n collapsibleGroups?: boolean;\n /** A group's row selects its matching enabled items. The row itself never enters `value`. */\n selectableGroups?: boolean;\n };\n\n/**\n * Props for `MultiCombobox`.\n *\n * - Pass `isItemEqualToValue` when a store recreates item objects — Base UI matches by reference.\n */\ntype Props<Value, GroupShape extends Group<Value> = Group<Value>> = WithAccessibleName<\n BaseProps<Value, GroupShape>\n>;\n\nconst NO_ITEMS: readonly never[] = [];\nconst NO_VALUES: never[] = [];\n\n/**\n * Searchable multi-select with chips, built on Base UI Combobox.\n *\n * @see RECIPES.md#creatable-multi-combobox\n * @see RECIPES.md#filter-toolbar\n */\nexport const MultiCombobox = <Value, GroupShape extends Group<Value> = Group<Value>>({\n // root props\n items: _itemsProp,\n value: _valueProp,\n defaultValue,\n onValueChange,\n itemToStringLabel,\n itemToStringValue,\n disabled,\n filter: filterProp,\n isItemEqualToValue: isItemEqualToValueProp,\n inputRef,\n\n // input props\n variant,\n sizing,\n focusVariant,\n state,\n placeholder,\n allowClear = true,\n name,\n onBlur,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n className,\n\n // own props\n allowSelectAll = false,\n empty = 'No items',\n isLoading = false,\n indicator,\n virtualized = false,\n\n // query\n inputValueSanitizer,\n onQueryChange,\n\n // creatable\n allowCreate,\n canCreate,\n queryToCreateValue,\n queryToCreateLabel = defaultQueryToCreateLabel,\n createSeparator = DEFAULT_ENTRY_SEPARATOR,\n\n // own item props\n itemToDisabled = defaultItemToDisabled,\n itemToLabel: itemToLabelProp,\n itemToIcon = defaultItemToIcon,\n groupToLabel = defaultGroupToLabel,\n collapsibleGroups = false,\n selectableGroups = false,\n itemToChipLabel,\n itemToChipColor,\n pinnedChipLabels,\n renderChips,\n // Value editors pass `Infinity` (a chip inside `+N` can't be removed); single-row filters `1`.\n maxVisible = 3,\n ...accessibleName\n}: Props<Value, GroupShape>) => {\n const itemsProp = _itemsProp ?? NO_ITEMS;\n // Held here while `value` is absent; Base UI always gets the selection as `value`.\n const [valueProp, setValueProp] = useControllableState<Value[]>({\n prop: _valueProp === null ? NO_VALUES : _valueProp,\n defaultProp: defaultValue ?? NO_VALUES,\n });\n const itemToString = useCallback(\n (item: Value) => itemToStringLabel?.(item) ?? toLabel(item),\n [itemToStringLabel],\n );\n const itemToLabel = itemToLabelProp ?? defaultRowLabel(itemToStringLabel);\n const renderArgo = useArgoDesign();\n const chipVariant = renderArgo ? 'pill' : 'default';\n\n const [inputValue, setInputValue] = useState('');\n const [createdItems, setCreatedItems] = useState<Value[]>([]);\n const query = inputValue.trim();\n\n useQueryReporter(query, onQueryChange);\n\n // `aria-busy` on the input only (list items stay pickable); absent rather than `false`.\n const busy = isLoading || undefined;\n\n // Held here only when needed — owning the text re-renders on every keystroke.\n // - `itemToLabel` needs it: its rows receive the query.\n const ownsInput = Boolean(\n allowCreate ||\n inputValueSanitizer ||\n onQueryChange ||\n itemToLabelProp ||\n collapsibleGroups ||\n selectableGroups,\n );\n\n const baseItems = useWithCreated(itemsProp, createdItems);\n\n const allFlatItems = flatItems(baseItems);\n const sampleItem = allFlatItems[0];\n // Otherwise `0 === 0` reads as all selected and puts the row's entry into `value`.\n const hasSelectAllRow = allowSelectAll && allFlatItems.length > 0;\n const isAllSelected = hasSelectAllRow && allFlatItems.length === (valueProp?.length ?? 0);\n\n const defaultFilter = BaseCombobox.useFilter({\n multiple: true,\n value: valueProp,\n });\n\n // Keeps the control's own rows (create, group header) away from the caller's projection.\n // Stable while the caller's accessor is: Base UI re-filters on every new identity.\n const wrappedItemToStringLabel = useMemo<ComboboxProps<Value>['itemToStringLabel']>(() => {\n // No caller projection keeps Base UI's own accessor.\n if (!allowCreate && !collapsibleGroups && !selectableGroups) {\n return itemToStringLabel && itemToString;\n }\n return (item) => {\n if (isCreatableItem(item)) return item.value;\n if (isGroupHeaderItem(item)) return item.label;\n return itemToString(item);\n };\n }, [allowCreate, collapsibleGroups, selectableGroups, itemToStringLabel, itemToString]);\n\n const itemFilter: NonNullable<ComboboxProps<Value>['filter']> =\n filterProp ?? defaultFilter.contains;\n\n const isItemEqualToValue = useItemEquality(isItemEqualToValueProp);\n\n const groupHeaders = useGroupHeaders<Value, GroupShape>({\n items: itemsProp,\n collapsible: collapsibleGroups,\n selectable: selectableGroups,\n query,\n matches: (item) => itemFilter(item, query, wrappedItemToStringLabel),\n isItemEqualToValue,\n });\n\n const listItems = useWithCreated(groupHeaders.items, createdItems);\n\n const virtualList = useVirtualList(baseItems, virtualized);\n\n const labelKey = (item: Value) => itemToString(item).toLowerCase();\n\n const createParts = !allowCreate || disabled || !query ? [] : splitEntry(query, createSeparator);\n\n const selectedKeys = new Set<string>();\n if (createParts.length > 0) for (const item of valueProp) selectedKeys.add(labelKey(item));\n\n // A set only when `canCreate` asks per value; otherwise one early-exiting scan is cheaper.\n const itemKeys = new Set<string>();\n if (createParts.length > 0 && canCreate) {\n for (const item of allFlatItems) itemKeys.add(labelKey(item));\n }\n const namesAnItem = (key: string) =>\n canCreate ? itemKeys.has(key) : allFlatItems.some((item) => labelKey(item) === key);\n\n /**\n * The entry's values not yet selected, minus those `canCreate` rejects.\n *\n * - Both names the create row and is exactly what committing it adds.\n * - A value naming an existing item counts and bypasses `canCreate` — committing selects it.\n */\n const addedCreateParts = createParts.filter((part) => {\n const key = part.toLowerCase();\n if (selectedKeys.has(key)) return false;\n return !canCreate || namesAnItem(key) || canCreate(part);\n });\n\n const soleValueKey = createParts.length === 1 ? createParts[0]!.toLowerCase() : undefined;\n\n // A single value naming an item already has its own row; a split entry matches no row.\n const showCreateRow =\n addedCreateParts.length > 0 && (soleValueKey === undefined || !namesAnItem(soleValueKey));\n\n const items = useMemo(() => {\n const withSelectAll = hasSelectAllRow\n ? [...toEntries(listItems, [selectAllItem]), ...listItems]\n : listItems;\n return showCreateRow\n ? [...withSelectAll, ...toEntries(listItems, [createCreatableItem(query)])]\n : withSelectAll;\n }, [hasSelectAllRow, showCreateRow, listItems, query]);\n\n const filterHeader = groupHeaders.enabled ? groupHeaders.filterHeader : undefined;\n const filter = useCallback(\n (item: Value, query: string, itemToString?: (value: Value) => string) => {\n // Select All covers the whole item set, so it exists only while no query narrows the list.\n if (isSelectAllItem(item)) return query.trim() === '';\n if (isCreatableItem(item)) return true;\n\n return filterHeader?.(item) ?? itemFilter(item, query, itemToString);\n },\n [filterHeader, itemFilter],\n );\n\n const wrappedItemToStringValue = useCreatableStringValue(itemToStringValue, allowCreate);\n\n const value = isAllSelected ? [...valueProp, selectAllItem as Value] : valueProp;\n\n // Without a comparer Base UI compares by identity, so a `Set` suffices.\n const selectedSet = selectableGroups && !isItemEqualToValueProp ? new Set(valueProp) : undefined;\n const isSelected = (item: Value) =>\n selectedSet?.has(item) ?? valueProp.some((selected) => isItemEqualToValue(item, selected));\n\n /** What a group's row selects: the group's items the query matches, the disabled aside. */\n const groupTargets = (row: unknown) =>\n groupHeaders.headerOf(row)?.matching.filter((item) => !itemToDisabled(item)) ?? [];\n\n /**\n * Replaces a pressed group row in `next` with its items.\n *\n * - Base UI adds the row to `value` like any unselected item.\n * - A row whose items are all selected deselects them.\n */\n const selectGroupRow = (next: Value[]) => {\n const row = next.find(isGroupHeaderItem);\n if (row === undefined) return next;\n\n const rest = next.filter((item) => item !== row);\n const targets = groupTargets(row);\n if (!targets.every(isSelected))\n return [...rest, ...targets.filter((item) => !isSelected(item))];\n return rest.filter((item) => !targets.some((target) => isItemEqualToValue(target, item)));\n };\n\n const groupRowChecked = (targets: Value[]) => {\n const selectedCount = targets.filter(isSelected).length;\n if (selectedCount === 0) return false;\n return selectedCount === targets.length ? true : 'mixed';\n };\n\n const handleInputValueChange: NonNullable<ComboboxProps<Value>['onInputValueChange']> = (\n next,\n { reason },\n ) => {\n setInputValue(sanitizeTypedInput(next, reason, inputValueSanitizer));\n };\n\n const handleValueChange: ComboboxProps<Value>['onValueChange'] = (next, event) => {\n // Base UI clears the text itself only when it owns it.\n if (ownsInput) setInputValue((prev) => (prev === '' ? prev : ''));\n // A pinned `value` with no handler: the change lands nowhere, so nothing is minted either.\n if (!onValueChange && _valueProp !== undefined) return;\n\n const picked = selectGroupRow(next);\n const created: Value[] = [];\n const converted = (() => {\n if (!allowCreate || !picked.some(isCreatableItem)) return picked;\n\n // A value naming an item selects it rather than minting a duplicate chip.\n const itemsByLabel = new Map<string, Value>();\n for (const item of allFlatItems) itemsByLabel.set(labelKey(item), item);\n\n return picked.flatMap((item) => {\n if (!isCreatableItem(item)) return [item];\n\n return addedCreateParts.map((part) => {\n const existing = itemsByLabel.get(part.toLowerCase());\n if (existing !== undefined) return existing;\n\n const value = defaultToCreateValue(part, sampleItem, queryToCreateValue) as Value;\n created.push(value);\n return value;\n });\n });\n })();\n\n const hasSelectAll = converted.some((item) => isSelectAllItem(item));\n const newValue = (() => {\n if (!hasSelectAllRow) return converted;\n if (!hasSelectAll) return isAllSelected ? [] : converted;\n return isAllSelected ? converted.filter((item) => !isSelectAllItem(item)) : allFlatItems;\n })();\n\n if (allowCreate) {\n // Filter by `newValue`: `valueProp` lacks values created in this change.\n const selected = new Set(newValue.map(itemToString));\n setCreatedItems((prev) =>\n [...prev, ...created].filter((item) => selected.has(itemToString(item))),\n );\n }\n\n setValueProp(newValue);\n onValueChange?.(newValue, event);\n };\n\n return (\n <Combobox.Root<Value, true>\n multiple\n // Otherwise Enter after typing selects nothing and closes the popup.\n autoHighlight\n items={items}\n value={value}\n filter={filter}\n isItemEqualToValue={isItemEqualToValue}\n onValueChange={handleValueChange}\n onOpenChange={groupHeaders.onOpenChange}\n onItemHighlighted={(item, details) => {\n groupHeaders.onItemHighlighted(item);\n virtualList.onItemHighlighted(details);\n }}\n virtualized={virtualList.enabled}\n itemToStringLabel={wrappedItemToStringLabel}\n itemToStringValue={wrappedItemToStringValue}\n disabled={disabled}\n inputRef={inputRef}\n {...(ownsInput ? { inputValue, onInputValueChange: handleInputValueChange } : {})}\n >\n <Combobox.InputGroup\n variant={variant}\n sizing={sizing}\n state={state}\n focusVariant={focusVariant}\n className={className}\n >\n {/* Chips plus the input row; its press handler focuses the input, arrows move between chips. */}\n <BaseCombobox.Chips className=\"tw:flex tw:min-w-0 tw:flex-1 tw:flex-wrap tw:items-center tw:gap-1.5 tw:px-4 tw:py-1.5\">\n <Combobox.Chips<Value>\n maxVisible={maxVisible}\n variant={chipVariant}\n itemToChipLabel={itemToChipLabel ?? ((item) => itemToLabel(item, ''))}\n itemToChipColor={itemToChipColor}\n pinnedChipLabels={pinnedChipLabels}\n >\n {renderChips}\n </Combobox.Chips>\n {/* Wraps below the chips under 120px; alone on its row it shrinks to keep both buttons inside. */}\n <div className=\"tw:flex tw:min-w-0 tw:grow tw:items-center tw:gap-1\">\n <Combobox.Input\n {...forwardAccessibleName(accessibleName)}\n name={name}\n onBlur={onBlur}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n aria-required={ariaRequired}\n aria-busy={busy}\n placeholder={placeholder}\n disabled={disabled}\n onKeyDown={groupHeaders.onInputKeyDown}\n // Cancels the group's `&_input` padding; the chip row already pads.\n className=\"tw:w-auto tw:min-w-0 tw:grow tw:basis-[120px] tw:!px-0 tw:!py-0\"\n />\n {allowClear && <ComboboxClearButton disabled={disabled} />}\n <ComboboxOpenButton disabled={disabled} isLoading={isLoading} />\n </div>\n </BaseCombobox.Chips>\n </Combobox.InputGroup>\n <Combobox.Content>\n <ComboboxOptions<Value, GroupShape>\n isLoading={isLoading}\n empty={empty}\n virtualized={virtualList.enabled}\n listRef={virtualList.ref}\n groupHeaders={groupHeaders}\n groupToLabel={groupToLabel}\n indicator={indicator}\n itemToLabel={(item) => itemToLabel(item, query)}\n itemToIcon={itemToIcon}\n itemToDisabled={itemToDisabled}\n // Names exactly the values committing the row adds.\n createLabel={() => queryToCreateLabel(joinCreateParts(addedCreateParts, createSeparator))}\n groupRowState={\n selectableGroups\n ? (row) => {\n const targets = groupTargets(row);\n return { checked: groupRowChecked(targets), disabled: targets.length === 0 };\n }\n : undefined\n }\n />\n </Combobox.Content>\n </Combobox.Root>\n );\n};\n"],"mappings":";;;;;;;;;;AA4CA,MAAM,mBAAmB,OAAiB,cACxC,MAAM,KAAK,GAAG,OAAO,cAAc,WAAW,YAAA,IAAoC,EAAE;AAkGtF,MAAM,WAA6B,CAAC;AACpC,MAAM,YAAqB,CAAC;;;;;;;AAQ5B,MAAa,iBAAwE,EAEnF,OAAO,YACP,OAAO,YACP,cACA,eACA,mBACA,mBACA,UACA,QAAQ,YACR,oBAAoB,wBACpB,UAGA,SACA,QACA,cACA,OACA,aACA,aAAa,MACb,MACA,QACA,oBAAoB,iBACpB,gBAAgB,aAChB,iBAAiB,cACjB,WAGA,iBAAiB,OACjB,QAAQ,YACR,YAAY,OACZ,WACA,cAAc,OAGd,qBACA,eAGA,aACA,WACA,oBACA,qBAAqB,2BACrB,kBAAA,KAGA,iBAAiB,uBACjB,aAAa,iBACb,aAAa,mBACb,eAAe,qBACf,oBAAoB,OACpB,mBAAmB,OACnB,iBACA,iBACA,kBACA,aAEA,aAAa,GACb,GAAG,qBAC2B;CAC9B,MAAM,YAAY,cAAc;CAEhC,MAAM,CAAC,WAAW,gBAAgB,qBAA8B;EAC9D,MAAM,eAAe,OAAO,YAAY;EACxC,aAAa,gBAAgB;CAC/B,CAAC;CACD,MAAM,eAAe,aAClB,SAAgB,oBAAoB,IAAI,KAAK,QAAQ,IAAI,GAC1D,CAAC,iBAAiB,CACpB;CACA,MAAM,cAAc,mBAAmB,gBAAgB,iBAAiB;CAExE,MAAM,cADa,cACU,IAAI,SAAS;CAE1C,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAC/C,MAAM,CAAC,cAAc,mBAAmB,SAAkB,CAAC,CAAC;CAC5D,MAAM,QAAQ,WAAW,KAAK;CAE9B,iBAAiB,OAAO,aAAa;CAGrC,MAAM,OAAO,aAAa,KAAA;CAI1B,MAAM,YAAY,QAChB,eACA,uBACA,iBACA,mBACA,qBACA,gBACF;CAEA,MAAM,YAAY,eAAe,WAAW,YAAY;CAExD,MAAM,eAAe,UAAU,SAAS;CACxC,MAAM,aAAa,aAAa;CAEhC,MAAM,kBAAkB,kBAAkB,aAAa,SAAS;CAChE,MAAM,gBAAgB,mBAAmB,aAAa,YAAY,WAAW,UAAU;CAEvF,MAAM,gBAAgBA,SAAa,UAAU;EAC3C,UAAU;EACV,OAAO;CACT,CAAC;CAID,MAAM,2BAA2B,cAAyD;EAExF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,kBACzC,OAAO,qBAAqB;EAE9B,QAAQ,SAAS;GACf,IAAI,gBAAgB,IAAI,GAAG,OAAO,KAAK;GACvC,IAAI,kBAAkB,IAAI,GAAG,OAAO,KAAK;GACzC,OAAO,aAAa,IAAI;EAC1B;CACF,GAAG;EAAC;EAAa;EAAmB;EAAkB;EAAmB;CAAY,CAAC;CAEtF,MAAM,aACJ,cAAc,cAAc;CAE9B,MAAM,qBAAqB,gBAAgB,sBAAsB;CAEjE,MAAM,eAAe,gBAAmC;EACtD,OAAO;EACP,aAAa;EACb,YAAY;EACZ;EACA,UAAU,SAAS,WAAW,MAAM,OAAO,wBAAwB;EACnE;CACF,CAAC;CAED,MAAM,YAAY,eAAe,aAAa,OAAO,YAAY;CAEjE,MAAM,cAAc,eAAe,WAAW,WAAW;CAEzD,MAAM,YAAY,SAAgB,aAAa,IAAI,CAAC,CAAC,YAAY;CAEjE,MAAM,cAAc,CAAC,eAAe,YAAY,CAAC,QAAQ,CAAC,IAAI,WAAW,OAAO,eAAe;CAE/F,MAAM,+BAAe,IAAI,IAAY;CACrC,IAAI,YAAY,SAAS,GAAG,KAAK,MAAM,QAAQ,WAAW,aAAa,IAAI,SAAS,IAAI,CAAC;CAGzF,MAAM,2BAAW,IAAI,IAAY;CACjC,IAAI,YAAY,SAAS,KAAK,WAC5B,KAAK,MAAM,QAAQ,cAAc,SAAS,IAAI,SAAS,IAAI,CAAC;CAE9D,MAAM,eAAe,QACnB,YAAY,SAAS,IAAI,GAAG,IAAI,aAAa,MAAM,SAAS,SAAS,IAAI,MAAM,GAAG;;;;;;;CAQpF,MAAM,mBAAmB,YAAY,QAAQ,SAAS;EACpD,MAAM,MAAM,KAAK,YAAY;EAC7B,IAAI,aAAa,IAAI,GAAG,GAAG,OAAO;EAClC,OAAO,CAAC,aAAa,YAAY,GAAG,KAAK,UAAU,IAAI;CACzD,CAAC;CAED,MAAM,eAAe,YAAY,WAAW,IAAI,YAAY,EAAE,CAAE,YAAY,IAAI,KAAA;CAGhF,MAAM,gBACJ,iBAAiB,SAAS,MAAM,iBAAiB,KAAA,KAAa,CAAC,YAAY,YAAY;CAEzF,MAAM,QAAQ,cAAc;EAC1B,MAAM,gBAAgB,kBAClB,CAAC,GAAG,UAAU,WAAW,CAAC,aAAa,CAAC,GAAG,GAAG,SAAS,IACvD;EACJ,OAAO,gBACH,CAAC,GAAG,eAAe,GAAG,UAAU,WAAW,CAAC,oBAAoB,KAAK,CAAC,CAAC,CAAC,IACxE;CACN,GAAG;EAAC;EAAiB;EAAe;EAAW;CAAK,CAAC;CAErD,MAAM,eAAe,aAAa,UAAU,aAAa,eAAe,KAAA;CACxE,MAAM,SAAS,aACZ,MAAa,OAAe,iBAA4C;EAEvE,IAAI,gBAAgB,IAAI,GAAG,OAAO,MAAM,KAAK,MAAM;EACnD,IAAI,gBAAgB,IAAI,GAAG,OAAO;EAElC,OAAO,eAAe,IAAI,KAAK,WAAW,MAAM,OAAO,YAAY;CACrE,GACA,CAAC,cAAc,UAAU,CAC3B;CAEA,MAAM,2BAA2B,wBAAwB,mBAAmB,WAAW;CAEvF,MAAM,QAAQ,gBAAgB,CAAC,GAAG,WAAW,aAAsB,IAAI;CAGvE,MAAM,cAAc,oBAAoB,CAAC,yBAAyB,IAAI,IAAI,SAAS,IAAI,KAAA;CACvF,MAAM,cAAc,SAClB,aAAa,IAAI,IAAI,KAAK,UAAU,MAAM,aAAa,mBAAmB,MAAM,QAAQ,CAAC;;CAG3F,MAAM,gBAAgB,QACpB,aAAa,SAAS,GAAG,CAAC,EAAE,SAAS,QAAQ,SAAS,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC;;;;;;;CAQnF,MAAM,kBAAkB,SAAkB;EACxC,MAAM,MAAM,KAAK,KAAK,iBAAiB;EACvC,IAAI,QAAQ,KAAA,GAAW,OAAO;EAE9B,MAAM,OAAO,KAAK,QAAQ,SAAS,SAAS,GAAG;EAC/C,MAAM,UAAU,aAAa,GAAG;EAChC,IAAI,CAAC,QAAQ,MAAM,UAAU,GAC3B,OAAO,CAAC,GAAG,MAAM,GAAG,QAAQ,QAAQ,SAAS,CAAC,WAAW,IAAI,CAAC,CAAC;EACjE,OAAO,KAAK,QAAQ,SAAS,CAAC,QAAQ,MAAM,WAAW,mBAAmB,QAAQ,IAAI,CAAC,CAAC;CAC1F;CAEA,MAAM,mBAAmB,YAAqB;EAC5C,MAAM,gBAAgB,QAAQ,OAAO,UAAU,CAAC,CAAC;EACjD,IAAI,kBAAkB,GAAG,OAAO;EAChC,OAAO,kBAAkB,QAAQ,SAAS,OAAO;CACnD;CAEA,MAAM,0BACJ,MACA,EAAE,aACC;EACH,cAAc,mBAAmB,MAAM,QAAQ,mBAAmB,CAAC;CACrE;CAEA,MAAM,qBAA4D,MAAM,UAAU;EAEhF,IAAI,WAAW,eAAe,SAAU,SAAS,KAAK,OAAO,EAAG;EAEhE,IAAI,CAAC,iBAAiB,eAAe,KAAA,GAAW;EAEhD,MAAM,SAAS,eAAe,IAAI;EAClC,MAAM,UAAmB,CAAC;EAC1B,MAAM,mBAAmB;GACvB,IAAI,CAAC,eAAe,CAAC,OAAO,KAAK,eAAe,GAAG,OAAO;GAG1D,MAAM,+BAAe,IAAI,IAAmB;GAC5C,KAAK,MAAM,QAAQ,cAAc,aAAa,IAAI,SAAS,IAAI,GAAG,IAAI;GAEtE,OAAO,OAAO,SAAS,SAAS;IAC9B,IAAI,CAAC,gBAAgB,IAAI,GAAG,OAAO,CAAC,IAAI;IAExC,OAAO,iBAAiB,KAAK,SAAS;KACpC,MAAM,WAAW,aAAa,IAAI,KAAK,YAAY,CAAC;KACpD,IAAI,aAAa,KAAA,GAAW,OAAO;KAEnC,MAAM,QAAQ,qBAAqB,MAAM,YAAY,kBAAkB;KACvE,QAAQ,KAAK,KAAK;KAClB,OAAO;IACT,CAAC;GACH,CAAC;EACH,EAAA,CAAG;EAEH,MAAM,eAAe,UAAU,MAAM,SAAS,gBAAgB,IAAI,CAAC;EACnE,MAAM,kBAAkB;GACtB,IAAI,CAAC,iBAAiB,OAAO;GAC7B,IAAI,CAAC,cAAc,OAAO,gBAAgB,CAAC,IAAI;GAC/C,OAAO,gBAAgB,UAAU,QAAQ,SAAS,CAAC,gBAAgB,IAAI,CAAC,IAAI;EAC9E,EAAA,CAAG;EAEH,IAAI,aAAa;GAEf,MAAM,WAAW,IAAI,IAAI,SAAS,IAAI,YAAY,CAAC;GACnD,iBAAiB,SACf,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,QAAQ,SAAS,SAAS,IAAI,aAAa,IAAI,CAAC,CAAC,CACzE;EACF;EAEA,aAAa,QAAQ;EACrB,gBAAgB,UAAU,KAAK;CACjC;CAEA,OACE,qBAACC,WAAS,MAAV;EACE,UAAA;EAEA,eAAA;EACO;EACA;EACC;EACY;EACpB,eAAe;EACf,cAAc,aAAa;EAC3B,oBAAoB,MAAM,YAAY;GACpC,aAAa,kBAAkB,IAAI;GACnC,YAAY,kBAAkB,OAAO;EACvC;EACA,aAAa,YAAY;EACzB,mBAAmB;EACnB,mBAAmB;EACT;EACA;EACV,GAAK,YAAY;GAAE;GAAY,oBAAoB;EAAuB,IAAI,CAAC;EAnBjF,UAAA,CAqBE,oBAACA,WAAS,YAAV;GACW;GACD;GACD;GACO;GACH;GAGX,UAAA,qBAACD,SAAa,OAAd;IAAoB,WAAU;IAA9B,UAAA,CACE,oBAACC,WAAS,OAAV;KACc;KACZ,SAAS;KACT,iBAAiB,qBAAqB,SAAS,YAAY,MAAM,EAAE;KAClD;KACC;KAEjB,UAAA;IACa,CAAA,GAEhB,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,oBAACA,WAAS,OAAV;OACE,GAAI,sBAAsB,cAAc;OAClC;OACE;OACR,oBAAkB;OAClB,gBAAc;OACd,iBAAe;OACf,aAAW;OACE;OACH;OACV,WAAW,aAAa;OAExB,WAAU;MACX,CAAA;MACA,cAAc,oBAAC,qBAAD,EAA+B,SAAW,CAAA;MACzD,oBAAC,oBAAD;OAA8B;OAAqB;MAAY,CAAA;KAC5D;IACa,CAAA,CAAA;;EACD,CAAA,GACrB,oBAACA,WAAS,SAAV,EAAA,UACE,oBAAC,iBAAD;GACa;GACJ;GACP,aAAa,YAAY;GACzB,SAAS,YAAY;GACP;GACA;GACH;GACX,cAAc,SAAS,YAAY,MAAM,KAAK;GAClC;GACI;GAEhB,mBAAmB,mBAAmB,gBAAgB,kBAAkB,eAAe,CAAC;GACxF,eACE,oBACK,QAAQ;IACP,MAAM,UAAU,aAAa,GAAG;IAChC,OAAO;KAAE,SAAS,gBAAgB,OAAO;KAAG,UAAU,QAAQ,WAAW;IAAE;GAC7E,IACA,KAAA;EAEP,CAAA,EACe,CAAA,CACL;;AAEnB"}
1
+ {"version":3,"file":"MultiCombobox.js","names":["BaseCombobox","Combobox"],"sources":["../../../src/blocks/MultiCombobox/MultiCombobox.tsx"],"sourcesContent":["import { type ComponentProps, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { Combobox as BaseCombobox } from '@base-ui/react/combobox';\n\nimport { Button } from '../../components/Button';\nimport { Combobox } from '../../components/Combobox';\nimport { ComboboxClearButton } from '../../components/Combobox/ComboboxClearButton';\nimport { ComboboxOpenButton } from '../../components/Combobox/ComboboxOpenButton';\nimport { ComboboxOptions } from '../../components/Combobox/ComboboxOptions';\nimport { useWithCreated } from '../../components/Combobox/createdItems';\nimport { useGroupHeaders } from '../../components/Combobox/groupHeaders';\nimport { sanitizeTypedInput, useQueryReporter } from '../../components/Combobox/query';\nimport type { Group } from '../../components/Combobox/types';\nimport {\n createCreatableItem,\n defaultGroupToLabel,\n defaultItemToDisabled,\n defaultItemToIcon,\n defaultQueryToCreateLabel,\n defaultRowLabel,\n defaultToCreateValue,\n flatItems,\n isCreatableItem,\n isGroupHeaderItem,\n isSelectAllItem,\n selectAllItem,\n toEntries,\n toLabel,\n useCreatableStringValue,\n useItemEquality,\n} from '../../components/Combobox/utils';\nimport { useVirtualList, type VirtualizedProps } from '../../components/Combobox/virtualList';\nimport { useArgoDesign } from '../../components/ThemeProvider/context';\nimport { Tooltip, TooltipProvider } from '../../components/Tooltip';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { PanelRightClose, PanelRightOpen, Search } from '../../icons';\nimport { cn, DEFAULT_ENTRY_SEPARATOR, splitEntry } from '../../utils';\nimport { forwardAccessibleName, type WithAccessibleName } from '../../utils/accessibleName';\n\ntype ComboboxProps<Value> = BaseCombobox.Root.Props<Value, true>;\ntype ComboboxInputProps = ComponentProps<typeof Combobox.Input>;\ntype ComboboxInputGroupProps = ComponentProps<typeof Combobox.InputGroup>;\ntype ComboboxItemProps = ComponentProps<typeof Combobox.Item>;\ntype ComboboxChipsProps<Value> = ComponentProps<typeof Combobox.Chips<Value>>;\n\ntype Indicator = Exclude<NonNullable<ComboboxItemProps['indicator']>, 'none'>;\n\n/** The row the pointer or the arrow keys are on: one of the items, or a group's own row. */\nexport type MultiComboboxHighlighted<Value, GroupShape> =\n | { kind: 'item'; item: Value }\n | { kind: 'group'; group: GroupShape }\n | null;\n\n/** Joins the create row's values with the entry's separator; a `RegExp` uses the default one. */\nconst joinCreateParts = (parts: string[], separator: string | RegExp | null) =>\n parts.join(`${typeof separator === 'string' ? separator : DEFAULT_ENTRY_SEPARATOR} `);\n\ntype CreatableProps<Value> = {\n allowCreate?: boolean;\n /** Words the create row. Receives the values it adds, trimmed and re-joined — not the entry as typed. */\n queryToCreateLabel?: (query: string) => ReactNode;\n /** Projects one entered value into an item. Called once per trimmed part of a split entry. */\n queryToCreateValue?: (query: string) => Value;\n /** Rejects a value `allowCreate` would mint; values naming an item or already selected skip it. */\n canCreate?: (query: string) => boolean;\n /** Splits one entry into several values (default `','`). A `RegExp` must not capture; `null` never splits. */\n createSeparator?: string | RegExp | null;\n};\n\ntype BaseProps<Value, GroupShape extends Group<Value> = Group<Value>> = Pick<\n ComboboxInputProps,\n // Go to the input, which is the `combobox` role; on the group they reach nothing.\n // - The `aria-*` set links a form field's label, help and error text.\n // - `onBlur` is the gate `FieldItem` reveals errors on.\n | 'placeholder'\n | 'id'\n | 'name'\n | 'onBlur'\n | 'aria-label'\n | 'aria-labelledby'\n | 'aria-describedby'\n | 'aria-invalid'\n | 'aria-required'\n> &\n Pick<ComboboxInputGroupProps, 'variant' | 'focusVariant' | 'sizing' | 'state' | 'className'> &\n Pick<\n ComboboxProps<Value>,\n | 'disabled'\n | 'inputRef'\n | 'value'\n | 'defaultValue'\n | 'onValueChange'\n | 'itemToStringLabel'\n | 'itemToStringValue'\n | 'filter'\n | 'isItemEqualToValue'\n > &\n Pick<\n ComboboxChipsProps<Value>,\n 'itemToChipLabel' | 'itemToChipColor' | 'pinnedChipLabels' | 'maxVisible'\n > &\n CreatableProps<Value> &\n VirtualizedProps & {\n /** Read as immutable: pass a new array to change it; one mutated in place is not re-filtered. */\n items?: readonly (Value | GroupShape)[];\n\n // root specific\n /** Clear-all button, shown only while chips exist. Chips stay removable either way. */\n allowClear?: boolean;\n /** \"Select All\" row for the whole set; hidden while a query is active, clears when all are selected. */\n allowSelectAll?: boolean;\n empty?: ReactNode;\n /** Options still arriving; doesn't disable — pass `disabled` where the user must wait. */\n isLoading?: boolean;\n indicator?: Indicator;\n\n // query specific\n /** Rewrites typed text before filtering and creating. Sees the whole text per keystroke — don't `trim()`. */\n inputValueSanitizer?: (input: string) => string;\n /** Reports the sanitized query, on mount too. Notification only — the control owns the text. */\n onQueryChange?: (query: string) => void;\n\n // item specific\n /**\n * Row and chip content (unless `itemToChipLabel`), `itemToStringLabel` by default.\n * - `query` is the search text, for `MarkedText`; a chip gets `''`.\n */\n itemToLabel?: (item: Value, query: string) => ReactNode;\n itemToIcon?: (item: Value) => ReactNode;\n itemToDisabled?: (item: Value) => boolean;\n /** A selected item no press removes: looks disabled, still highlights for `renderAside`. */\n itemToLocked?: (item: Value) => boolean;\n\n // chip specific\n /** Replaces the default chips; the chip props, `maxVisible` included, are then ignored. */\n renderChips?: (values: Value[]) => ReactNode;\n\n // group specific\n /** Defaults to the group's `label`, as `Select` shows it. */\n groupToLabel?: (group: GroupShape) => ReactNode;\n /** A row per group that folds it. A query shows every match regardless; state is keyed by position. */\n collapsibleGroups?: boolean;\n /** A group's row selects its matching enabled items. The row itself never enters `value`. */\n selectableGroups?: boolean;\n /** Each time the popup opens, a group whose items are all selected starts folded. */\n collapseSelectedGroups?: boolean;\n /** `banded`: each group, its row and open items, is a white card on a grey list. */\n groupAppearance?: 'plain' | 'banded';\n\n // popup specific\n /**\n * An inspector beside the list about the last highlighted row; `null` before any.\n * Hidden while the popup is under 40rem wide.\n */\n renderAside?: (highlighted: MultiComboboxHighlighted<Value, GroupShape>) => ReactNode;\n /** Whether the inspector shows; a button in the popup toggles it. Uncontrolled, it starts open. */\n asideOpen?: boolean;\n onAsideOpenChange?: (open: boolean) => void;\n /** The popup is open on mount, for a picker shown on demand. */\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** No field: the popup opens against this element, its search at the top. Pair with `defaultOpen`. */\n anchor?: ComponentProps<typeof Combobox.Content>['anchor'];\n /**\n * The search text, typed elsewhere (a chat composer): with `anchor`, the popup has no search.\n * The host forwards ArrowUp, ArrowDown, Enter and Escape to the `combobox` input it renders.\n */\n query?: string;\n };\n\n/**\n * Props for `MultiCombobox`.\n *\n * - Pass `isItemEqualToValue` when a store recreates item objects — Base UI matches by reference.\n */\ntype Props<Value, GroupShape extends Group<Value> = Group<Value>> = WithAccessibleName<\n BaseProps<Value, GroupShape>\n>;\n\n/**\n * White group cards on a grey list: each group's row and open items sit on one card.\n *\n * - The grey is `--secondary` at 45% over the popover, about 1.10:1 against white.\n * - The gap is space under each card's last row, so a windowed list measures it with the row.\n * - Base UI's `role=\"group\"` wraps a group's row and items in either list.\n * - Rows are square; the card's first and last rows take its corners. Enabled rows show a pointer.\n */\nconst GROUP_BANDED = [\n 'tw:bg-[color-mix(in_oklab,rgb(var(--secondary))_45%,rgb(var(--popover)))]',\n 'tw:[&_[role=listbox]]:bg-[color-mix(in_oklab,rgb(var(--secondary))_45%,rgb(var(--popover)))]',\n // The card is a layer behind the rows that stops 8px short: the grey below it is the gap.\n 'tw:[&_[role=group]]:relative tw:[&_[role=group]]:isolate',\n 'tw:[&_[role=group]]:before:absolute tw:[&_[role=group]]:before:inset-x-0 tw:[&_[role=group]]:before:top-0',\n 'tw:[&_[role=group]]:before:bottom-2 tw:[&_[role=group]]:before:-z-10',\n 'tw:[&_[role=group]]:before:rounded-lg tw:[&_[role=group]]:before:bg-popover',\n // The gap itself: below the last row, so a highlighted row never covers it.\n 'tw:[&_[role=group]>[role=option]:last-child]:mb-2 tw:[&_[data-group-last]]:pb-2',\n 'tw:[&_[role=group]_[role=option]]:rounded-none',\n 'tw:[&_[role=group]>:first-child_[role=option]]:rounded-t-lg',\n 'tw:[&_[role=group]>:last-child_[role=option]]:rounded-b-lg',\n 'tw:[&_[role=option]:not([data-disabled]):not([data-locked])]:cursor-pointer',\n // A row whose name wraps keeps its chevron and checkbox on the first line, beside the name.\n 'tw:[&_[role=option]]:items-start',\n 'tw:[&_[role=option]>:not([data-slot=combobox-item-label]):not([data-slot=combobox-group-toggle])]:mt-0.5',\n 'tw:[&_[role=option]>[data-slot=combobox-group-toggle]]:-mt-0.5',\n].join(' ');\n\nconst NO_ITEMS: readonly never[] = [];\nconst NO_VALUES: never[] = [];\n\n/**\n * Searchable multi-select with chips, built on Base UI Combobox.\n *\n * @see RECIPES.md#creatable-multi-combobox\n * @see RECIPES.md#filter-toolbar\n */\nexport const MultiCombobox = <Value, GroupShape extends Group<Value> = Group<Value>>({\n // root props\n items: _itemsProp,\n value: _valueProp,\n defaultValue,\n onValueChange,\n itemToStringLabel,\n itemToStringValue,\n disabled,\n filter: filterProp,\n isItemEqualToValue: isItemEqualToValueProp,\n inputRef,\n\n // input props\n variant,\n sizing,\n focusVariant,\n state,\n placeholder,\n allowClear = true,\n name,\n onBlur,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n className,\n\n // own props\n allowSelectAll = false,\n empty = 'No items',\n isLoading = false,\n indicator,\n virtualized = false,\n\n // query\n inputValueSanitizer,\n onQueryChange,\n\n // creatable\n allowCreate,\n canCreate,\n queryToCreateValue,\n queryToCreateLabel = defaultQueryToCreateLabel,\n createSeparator = DEFAULT_ENTRY_SEPARATOR,\n\n // own item props\n itemToDisabled = defaultItemToDisabled,\n itemToLocked,\n itemToLabel: itemToLabelProp,\n itemToIcon = defaultItemToIcon,\n groupToLabel = defaultGroupToLabel,\n collapsibleGroups = false,\n selectableGroups = false,\n collapseSelectedGroups = false,\n groupAppearance = 'plain',\n itemToChipLabel,\n itemToChipColor,\n pinnedChipLabels,\n renderChips,\n renderAside,\n asideOpen: asideOpenProp,\n onAsideOpenChange,\n defaultOpen = false,\n onOpenChange,\n anchor,\n query: queryProp,\n // Value editors pass `Infinity` (a chip inside `+N` can't be removed); single-row filters `1`.\n maxVisible = 3,\n ...accessibleName\n}: Props<Value, GroupShape>) => {\n const itemsProp = _itemsProp ?? NO_ITEMS;\n // Held here while `value` is absent; Base UI always gets the selection as `value`.\n const [valueProp, setValueProp] = useControllableState<Value[]>({\n prop: _valueProp === null ? NO_VALUES : _valueProp,\n defaultProp: defaultValue ?? NO_VALUES,\n });\n const itemToString = useCallback(\n (item: Value) => itemToStringLabel?.(item) ?? toLabel(item),\n [itemToStringLabel],\n );\n const itemToLabel = itemToLabelProp ?? defaultRowLabel(itemToStringLabel);\n const renderArgo = useArgoDesign();\n const chipVariant = renderArgo ? 'pill' : 'default';\n\n const [inputValue, setInputValue] = useState('');\n const [asideOpen, setAsideOpen] = useControllableState({\n prop: asideOpenProp,\n defaultProp: true,\n onChange: onAsideOpenChange,\n });\n const [lastHighlighted, setLastHighlighted] =\n useState<MultiComboboxHighlighted<Value, GroupShape>>(null);\n const [createdItems, setCreatedItems] = useState<Value[]>([]);\n const query = (queryProp ?? inputValue).trim();\n\n useQueryReporter(query, onQueryChange);\n\n // `aria-busy` on the input only (list items stay pickable); absent rather than `false`.\n const busy = isLoading || undefined;\n\n // Held here only when needed — owning the text re-renders on every keystroke.\n // - `itemToLabel` needs it: its rows receive the query.\n const ownsInput = Boolean(\n queryProp !== undefined ||\n allowCreate ||\n inputValueSanitizer ||\n onQueryChange ||\n itemToLabelProp ||\n collapsibleGroups ||\n selectableGroups,\n );\n\n const baseItems = useWithCreated(itemsProp, createdItems);\n\n const allFlatItems = flatItems(baseItems);\n const sampleItem = allFlatItems[0];\n // Otherwise `0 === 0` reads as all selected and puts the row's entry into `value`.\n const hasSelectAllRow = allowSelectAll && allFlatItems.length > 0;\n const isAllSelected = hasSelectAllRow && allFlatItems.length === (valueProp?.length ?? 0);\n\n const defaultFilter = BaseCombobox.useFilter({\n multiple: true,\n value: valueProp,\n });\n\n // Keeps the control's own rows (create, group header) away from the caller's projection.\n // Stable while the caller's accessor is: Base UI re-filters on every new identity.\n const wrappedItemToStringLabel = useMemo<ComboboxProps<Value>['itemToStringLabel']>(() => {\n // No caller projection keeps Base UI's own accessor.\n if (!allowCreate && !collapsibleGroups && !selectableGroups) {\n return itemToStringLabel && itemToString;\n }\n return (item) => {\n if (isCreatableItem(item)) return item.value;\n if (isGroupHeaderItem(item)) return item.label;\n return itemToString(item);\n };\n }, [allowCreate, collapsibleGroups, selectableGroups, itemToStringLabel, itemToString]);\n\n const itemFilter: NonNullable<ComboboxProps<Value>['filter']> =\n filterProp ?? defaultFilter.contains;\n\n const isItemEqualToValue = useItemEquality(isItemEqualToValueProp);\n\n const groupHeaders = useGroupHeaders<Value, GroupShape>({\n items: itemsProp,\n collapsible: collapsibleGroups,\n selectable: selectableGroups,\n query,\n matches: (item) => itemFilter(item, query, wrappedItemToStringLabel),\n isItemEqualToValue,\n // Runs on open, after render: `isSelected` below is in scope by then.\n startsCollapsed: collapseSelectedGroups\n ? (group) =>\n group.items.length > 0 &&\n // Not `isSelected`: with `defaultOpen` this runs during the first render, before it exists.\n group.items.every((item) =>\n valueProp.some((selected) => isItemEqualToValue(item, selected)),\n )\n : undefined,\n startsOpen: defaultOpen,\n });\n\n const listItems = useWithCreated(groupHeaders.items, createdItems);\n\n const virtualList = useVirtualList(baseItems, virtualized);\n\n const labelKey = (item: Value) => itemToString(item).toLowerCase();\n\n const createParts = !allowCreate || disabled || !query ? [] : splitEntry(query, createSeparator);\n\n const selectedKeys = new Set<string>();\n if (createParts.length > 0) for (const item of valueProp) selectedKeys.add(labelKey(item));\n\n // A set only when `canCreate` asks per value; otherwise one early-exiting scan is cheaper.\n const itemKeys = new Set<string>();\n if (createParts.length > 0 && canCreate) {\n for (const item of allFlatItems) itemKeys.add(labelKey(item));\n }\n const namesAnItem = (key: string) =>\n canCreate ? itemKeys.has(key) : allFlatItems.some((item) => labelKey(item) === key);\n\n /**\n * The entry's values not yet selected, minus those `canCreate` rejects.\n *\n * - Both names the create row and is exactly what committing it adds.\n * - A value naming an existing item counts and bypasses `canCreate` — committing selects it.\n */\n const addedCreateParts = createParts.filter((part) => {\n const key = part.toLowerCase();\n if (selectedKeys.has(key)) return false;\n return !canCreate || namesAnItem(key) || canCreate(part);\n });\n\n const soleValueKey = createParts.length === 1 ? createParts[0]!.toLowerCase() : undefined;\n\n // A single value naming an item already has its own row; a split entry matches no row.\n const showCreateRow =\n addedCreateParts.length > 0 && (soleValueKey === undefined || !namesAnItem(soleValueKey));\n\n const items = useMemo(() => {\n const withSelectAll = hasSelectAllRow\n ? [...toEntries(listItems, [selectAllItem]), ...listItems]\n : listItems;\n return showCreateRow\n ? [...withSelectAll, ...toEntries(listItems, [createCreatableItem(query)])]\n : withSelectAll;\n }, [hasSelectAllRow, showCreateRow, listItems, query]);\n\n const filterHeader = groupHeaders.enabled ? groupHeaders.filterHeader : undefined;\n const filter = useCallback(\n (item: Value, query: string, itemToString?: (value: Value) => string) => {\n // Select All covers the whole item set, so it exists only while no query narrows the list.\n if (isSelectAllItem(item)) return query.trim() === '';\n if (isCreatableItem(item)) return true;\n\n return filterHeader?.(item) ?? itemFilter(item, query, itemToString);\n },\n [filterHeader, itemFilter],\n );\n\n const wrappedItemToStringValue = useCreatableStringValue(itemToStringValue, allowCreate);\n\n const value = isAllSelected ? [...valueProp, selectAllItem as Value] : valueProp;\n\n // Without a comparer Base UI compares by identity, so a `Set` suffices.\n const selectedSet = selectableGroups && !isItemEqualToValueProp ? new Set(valueProp) : undefined;\n const isSelected = (item: Value) =>\n selectedSet?.has(item) ?? valueProp.some((selected) => isItemEqualToValue(item, selected));\n\n /** What a group's row selects: the group's items the query matches, the disabled aside. */\n const groupTargets = (row: unknown) =>\n groupHeaders\n .headerOf(row)\n ?.matching.filter((item) => !itemToDisabled(item) && !itemToLocked?.(item)) ?? [];\n\n /**\n * Replaces a pressed group row in `next` with its items.\n *\n * - Base UI adds the row to `value` like any unselected item.\n * - A row whose items are all selected deselects them.\n */\n const selectGroupRow = (next: Value[]) => {\n const row = next.find(isGroupHeaderItem);\n if (row === undefined) return next;\n\n const rest = next.filter((item) => item !== row);\n const targets = groupTargets(row);\n if (!targets.every(isSelected))\n return [...rest, ...targets.filter((item) => !isSelected(item))];\n return rest.filter((item) => !targets.some((target) => isItemEqualToValue(target, item)));\n };\n\n const groupRowChecked = (targets: Value[]) => {\n const selectedCount = targets.filter(isSelected).length;\n if (selectedCount === 0) return false;\n return selectedCount === targets.length ? true : 'mixed';\n };\n\n const handleInputValueChange: NonNullable<ComboboxProps<Value>['onInputValueChange']> = (\n next,\n { reason },\n ) => {\n // A host-owned query is not this input's to change.\n if (queryProp !== undefined) return;\n setInputValue(sanitizeTypedInput(next, reason, inputValueSanitizer));\n };\n\n const handleValueChange: ComboboxProps<Value>['onValueChange'] = (next, event) => {\n // Base UI clears the text itself only when it owns it.\n if (ownsInput) setInputValue((prev) => (prev === '' ? prev : ''));\n // A pinned `value` with no handler: the change lands nowhere, so nothing is minted either.\n if (!onValueChange && _valueProp !== undefined) return;\n\n const picked = selectGroupRow(next);\n const created: Value[] = [];\n const converted = (() => {\n if (!allowCreate || !picked.some(isCreatableItem)) return picked;\n\n // A value naming an item selects it rather than minting a duplicate chip.\n const itemsByLabel = new Map<string, Value>();\n for (const item of allFlatItems) itemsByLabel.set(labelKey(item), item);\n\n return picked.flatMap((item) => {\n if (!isCreatableItem(item)) return [item];\n\n return addedCreateParts.map((part) => {\n const existing = itemsByLabel.get(part.toLowerCase());\n if (existing !== undefined) return existing;\n\n const value = defaultToCreateValue(part, sampleItem, queryToCreateValue) as Value;\n created.push(value);\n return value;\n });\n });\n })();\n\n const hasSelectAll = converted.some((item) => isSelectAllItem(item));\n const newValue = (() => {\n if (!hasSelectAllRow) return converted;\n if (!hasSelectAll) return isAllSelected ? [] : converted;\n return isAllSelected ? converted.filter((item) => !isSelectAllItem(item)) : allFlatItems;\n })();\n\n if (allowCreate) {\n // Filter by `newValue`: `valueProp` lacks values created in this change.\n const selected = new Set(newValue.map(itemToString));\n setCreatedItems((prev) =>\n [...prev, ...created].filter((item) => selected.has(itemToString(item))),\n );\n }\n\n // Locked items stay exactly as selected; a change that touched only them is no change.\n const kept = itemToLocked\n ? [\n ...newValue.filter((item) => !itemToLocked(item) || isSelected(item)),\n ...valueProp.filter(\n (item) =>\n itemToLocked(item) && !newValue.some((picked) => isItemEqualToValue(picked, item)),\n ),\n ]\n : newValue;\n if (itemToLocked && kept.length === valueProp.length && kept.every(isSelected)) return;\n\n setValueProp(kept);\n onValueChange?.(kept, event);\n };\n\n // Only items and group rows have a pane; the create and Select All rows keep the last one.\n const toHighlighted = (item: Value | undefined): MultiComboboxHighlighted<Value, GroupShape> => {\n if (item === undefined || isCreatableItem(item) || isSelectAllItem(item)) return null;\n const header = groupHeaders.headerOf(item);\n if (header) return { kind: 'group', group: header.group };\n return isGroupHeaderItem(item) ? null : { kind: 'item', item };\n };\n\n const options = (\n <ComboboxOptions<Value, GroupShape>\n isLoading={isLoading}\n empty={empty}\n virtualized={virtualList.enabled}\n listRef={virtualList.ref}\n groupHeaders={groupHeaders}\n groupToLabel={groupToLabel}\n indicator={indicator}\n itemToLabel={(item) => itemToLabel(item, query)}\n itemToIcon={itemToIcon}\n itemToDisabled={itemToDisabled}\n itemToLocked={itemToLocked}\n // Names exactly the values committing the row adds.\n createLabel={() => queryToCreateLabel(joinCreateParts(addedCreateParts, createSeparator))}\n groupRowState={\n selectableGroups\n ? (row) => {\n const targets = groupTargets(row);\n // Its pickable items plus the locked ones already selected, so locked picks still show.\n const shown = (groupHeaders.headerOf(row)?.matching ?? []).filter(\n (item) => !itemToDisabled(item) || isSelected(item),\n );\n // A group of only locked items locks its row too: it still highlights for the inspector.\n const locked = targets.length === 0 && shown.some((item) => itemToLocked?.(item));\n return {\n checked: groupRowChecked(shown),\n disabled: targets.length === 0 && !locked,\n locked,\n };\n }\n : undefined\n }\n />\n );\n\n const input = (\n <Combobox.Input\n {...forwardAccessibleName(accessibleName)}\n name={name}\n onBlur={onBlur}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n aria-required={ariaRequired}\n aria-busy={busy}\n placeholder={placeholder}\n disabled={disabled}\n // Typed elsewhere, the input is hidden: no Tab stop the user can't see.\n tabIndex={anchor && queryProp !== undefined ? -1 : undefined}\n onKeyDown={groupHeaders.onInputKeyDown}\n // Cancels the group's `&_input` padding; the chip row already pads.\n className={\n anchor\n ? 'tw:min-w-0 tw:grow tw:!px-0 tw:!py-0'\n : 'tw:w-auto tw:min-w-0 tw:grow tw:basis-[120px] tw:!px-0 tw:!py-0'\n }\n />\n );\n\n // With an `anchor`, the search sits at the top of the popup instead of in a field.\n const popupSearch =\n anchor && queryProp === undefined ? (\n <div className=\"tw:flex tw:items-center tw:gap-2 tw:px-3 tw:pt-2.5 tw:pb-1\">\n <Combobox.InputGroup className=\"tw:h-9 tw:flex-1 tw:gap-2 tw:bg-background tw:px-3\">\n <Search className=\"tw:size-4 tw:shrink-0 tw:text-muted-foreground\" />\n {input}\n </Combobox.InputGroup>\n </div>\n ) : null;\n\n return (\n <Combobox.Root<Value, true>\n multiple\n // Otherwise Enter after typing selects nothing and closes the popup.\n autoHighlight\n items={items}\n value={value}\n filter={filter}\n isItemEqualToValue={isItemEqualToValue}\n onValueChange={handleValueChange}\n defaultOpen={defaultOpen}\n onOpenChange={(open) => {\n groupHeaders.onOpenChange(open);\n // Each opening starts the inspector afresh: the rows may have changed since.\n if (!open) setLastHighlighted(null);\n onOpenChange?.(open);\n }}\n onItemHighlighted={(item, details) => {\n groupHeaders.onItemHighlighted(item);\n virtualList.onItemHighlighted(details);\n const next = renderAside ? toHighlighted(item) : null;\n if (next) setLastHighlighted(next);\n }}\n virtualized={virtualList.enabled}\n itemToStringLabel={wrappedItemToStringLabel}\n itemToStringValue={wrappedItemToStringValue}\n disabled={disabled}\n inputRef={inputRef}\n {...(ownsInput\n ? { inputValue: queryProp ?? inputValue, onInputValueChange: handleInputValueChange }\n : {})}\n >\n {/* Typed elsewhere: Base UI keeps its input, hidden and outside the popup, for the keys it reads. */}\n {anchor && queryProp !== undefined && <div className=\"tw:sr-only\">{input}</div>}\n {!anchor && (\n <Combobox.InputGroup\n variant={variant}\n sizing={sizing}\n state={state}\n focusVariant={focusVariant}\n className={className}\n >\n {/* Chips plus the input row; its press handler focuses the input, arrows move between chips. */}\n <BaseCombobox.Chips className=\"tw:flex tw:min-w-0 tw:flex-1 tw:flex-wrap tw:items-center tw:gap-1.5 tw:px-4 tw:py-1.5\">\n <Combobox.Chips<Value>\n maxVisible={maxVisible}\n variant={chipVariant}\n itemToChipLabel={itemToChipLabel ?? ((item) => itemToLabel(item, ''))}\n itemToChipColor={itemToChipColor}\n pinnedChipLabels={pinnedChipLabels}\n >\n {renderChips}\n </Combobox.Chips>\n {/* Wraps below the chips under 120px; alone on its row it shrinks to keep both buttons inside. */}\n <div className=\"tw:flex tw:min-w-0 tw:grow tw:items-center tw:gap-1\">\n {input}\n {allowClear && <ComboboxClearButton disabled={disabled} />}\n <ComboboxOpenButton disabled={disabled} isLoading={isLoading} />\n </div>\n </BaseCombobox.Chips>\n </Combobox.InputGroup>\n )}\n {renderAside ? (\n <Combobox.Content\n anchor={anchor}\n className={cn(\n 'tw:@container tw:w-[max(var(--anchor-width),48rem)]',\n // Tall enough for the inspector's details when only a row or two match; none when nothing does.\n 'tw:min-h-[min(var(--available-height),22rem)] tw:data-empty:min-h-0',\n // Opened against a composer it has no field to stay near, so it keeps to a list's height.\n anchor && 'tw:max-h-[min(var(--available-height),32rem)]',\n groupAppearance === 'banded' && GROUP_BANDED,\n )}\n >\n {popupSearch}\n {/*\n `0fr` to `1fr` slides the inspector in and narrows the list; under 40rem it stays out.\n - Nothing matches: the inspector and its button go at once, and the list takes the width.\n */}\n <div\n className={cn(\n 'tw:grid tw:min-h-0 tw:flex-1 tw:grid-rows-[minmax(0,1fr)]',\n 'tw:motion-safe:transition-[grid-template-columns] tw:motion-safe:duration-200 tw:motion-safe:ease-out',\n asideOpen ? 'tw:grid-cols-[minmax(0,2fr)_1fr]' : 'tw:grid-cols-[minmax(0,2fr)_0fr]',\n 'tw:@max-[40rem]:grid-cols-[minmax(0,2fr)_0fr]',\n )}\n >\n {/* With the inspector hidden its button sits in the corner, so the list ends above it; no button, no room. */}\n <div\n className={cn(\n 'tw:flex tw:min-h-0 tw:min-w-0 tw:flex-col tw:group-data-empty/combobox-content:col-span-2',\n !asideOpen &&\n 'tw:pb-10 tw:@max-[40rem]:pb-0 tw:group-data-empty/combobox-content:pb-0',\n )}\n >\n {options}\n </div>\n <div\n className={cn(\n 'tw:relative tw:min-w-0 tw:overflow-hidden tw:border-border',\n 'tw:motion-safe:transition-opacity tw:motion-safe:duration-200',\n asideOpen ? 'tw:border-l tw:opacity-100' : 'tw:opacity-0',\n 'tw:@max-[40rem]:invisible tw:@max-[40rem]:border-l-0 tw:@max-[40rem]:opacity-0',\n 'tw:group-data-empty/combobox-content:hidden',\n )}\n data-slot=\"combobox-inspector\"\n inert={!asideOpen}\n >\n {/* Out of flow: the list alone sets the popup's height, the pane scrolls within it. */}\n <div className=\"tw:absolute tw:inset-y-0 tw:left-0 tw:w-full tw:min-w-60 tw:overflow-y-auto tw:p-4 tw:pb-12\">\n {renderAside(lastHighlighted)}\n </div>\n </div>\n </div>\n <div className=\"tw:absolute tw:right-2 tw:bottom-2 tw:@max-[40rem]:hidden tw:group-data-empty/combobox-content:hidden\">\n <AsideToggle open={asideOpen} onOpenChange={setAsideOpen} />\n </div>\n </Combobox.Content>\n ) : (\n <Combobox.Content\n anchor={anchor}\n className={cn(\n anchor && 'tw:max-h-[min(var(--available-height),32rem)]',\n groupAppearance === 'banded' && GROUP_BANDED,\n )}\n >\n {popupSearch}\n {options}\n </Combobox.Content>\n )}\n </Combobox.Root>\n );\n};\n\n/**\n * Hides or shows the inspector beside the list, from the popup's bottom-right corner.\n *\n * - Floats over the list while the inspector is hidden; gone with it when the popup is too narrow.\n * - Keeps the input focused, so the popup stays open.\n */\nconst AsideToggle = ({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) => {\n const label = open ? 'Hide inspector' : 'Show inspector';\n const Icon = open ? PanelRightClose : PanelRightOpen;\n return (\n // Its own provider, so a host without one still renders the inspector.\n <TooltipProvider>\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon-xs\"\n aria-label={label}\n aria-expanded={open}\n className=\"tw:bg-popover tw:shadow-sm\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onOpenChange(!open)}\n >\n <Icon />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Content placement=\"left\">{label}</Tooltip.Content>\n </Tooltip.Root>\n </TooltipProvider>\n );\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { InputGroup } from "../../InputGroup-CrlMRz4X.js";
1
+ import { InputGroup } from "../../InputGroup-Dm014ruw.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  //#region src/blocks/NumberInput/NumberInput.tsx
4
4
  const toNumberOrNull = (event) => Number.isNaN(event.target.valueAsNumber) ? null : event.target.valueAsNumber;
@@ -1,2 +1,2 @@
1
- import { OtpInput, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS } from "../../OtpInput-I8B8Vjdl.js";
1
+ import { OtpInput, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS } from "../../OtpInput-CY8yCaJk.js";
2
2
  export { OtpInput, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS };
@@ -1,2 +1,2 @@
1
- import { PageHeader } from "../../PageHeader-CgfyXpf1.js";
1
+ import { PageHeader } from "../../PageHeader-CL1A6jFM.js";
2
2
  export { PageHeader };
@@ -1,2 +1,2 @@
1
- import { PageLayout } from "../../PageLayout-DiAAILuS.js";
1
+ import { PageLayout } from "../../PageLayout-C9aXTpqV.js";
2
2
  export { PageLayout };
@@ -1,2 +1,2 @@
1
- import { PageToolbar } from "../../PageToolbar-C06RKIif.js";
1
+ import { PageToolbar } from "../../PageToolbar-B_e7HGva.js";
2
2
  export { PageToolbar };
@@ -1,7 +1,7 @@
1
- import { createChangeInputEvent } from "../../utils-Bd28bWgm.js";
1
+ import { createChangeInputEvent } from "../../utils-LQ4jJA-9.js";
2
2
  import { mergeRefs } from "../utils/mergeRefs.js";
3
- import { ArrowBigUpDash, Eye, EyeOff, X } from "../../icons-wcA70iQx.js";
4
- import { InputGroup } from "../../InputGroup-CrlMRz4X.js";
3
+ import { ArrowBigUpDash, Eye, EyeOff, X } from "../../icons-ZIeZXXS7.js";
4
+ import { InputGroup } from "../../InputGroup-Dm014ruw.js";
5
5
  import { useControllableState } from "../../useControllableState-CUYXMsfz.js";
6
6
  import { useRef, useState } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,2 +1,2 @@
1
- import { SearchInput } from "../../SearchInput-D3qMkHaW.js";
1
+ import { SearchInput } from "../../SearchInput-Dxi2GK4n.js";
2
2
  export { SearchInput };
@@ -1,10 +1,10 @@
1
- import { cn } from "../../classNames-BzrkDnOD.js";
2
- import { keyCodes } from "../../utils-Bd28bWgm.js";
3
- import { ChevronDown, ChevronUp, Search } from "../../icons-wcA70iQx.js";
4
- import { Button } from "../../Button-B21oVcPU.js";
1
+ import { cn } from "../../classNames-DcGnTh2N.js";
2
+ import { keyCodes } from "../../utils-LQ4jJA-9.js";
3
+ import { ChevronDown, ChevronUp, Search } from "../../icons-ZIeZXXS7.js";
4
+ import { Button } from "../../Button-D2JqBAq7.js";
5
5
  import { ButtonGroup } from "../components/ButtonGroup.js";
6
6
  import { Separator } from "../components/Separator.js";
7
- import { TextInput } from "../../TextInput-BWYXbfs4.js";
7
+ import { TextInput } from "../../TextInput-K2DSDs5O.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/blocks/SearchInputWithNavigation/SearchInputWithNavigation.tsx
10
10
  const SearchInputWithNavigation = ({ ref, value, onValueChange, placeholder = "Search...", variant = "secondary", onClear, focusVariant, currentIndex, totalResults, onNavigateNext, onNavigatePrevious, className }) => {
@@ -1,2 +1,2 @@
1
- import { SectionNav } from "../../SectionNav-I2p2uXTd.js";
1
+ import { SectionNav } from "../../SectionNav-BnHOMLtE.js";
2
2
  export { SectionNav };