@keboola/design 14.0.0 → 15.1.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 (303) hide show
  1. package/AGENTS.md +11 -23
  2. package/CHANGELOG.md +58 -0
  3. package/COMPONENT-API.md +109 -115
  4. package/dist/{AIKit-BRSZ3nY7.js → AIKit-BR6jfsdI.js} +69 -35
  5. package/dist/AIKit-BR6jfsdI.js.map +1 -0
  6. package/dist/{Alert-CZ0dDsuk.js → Alert-Chz6KZ7e.js} +11 -20
  7. package/dist/Alert-Chz6KZ7e.js.map +1 -0
  8. package/dist/{AlertModal-BDle9ZVQ.js → AlertModal-DMsn62JJ.js} +16 -36
  9. package/dist/AlertModal-DMsn62JJ.js.map +1 -0
  10. package/dist/{AppShell-B03fj1j7.js → AppShell-C8V1KRr_.js} +2 -2
  11. package/dist/{AppShell-B03fj1j7.js.map → AppShell-C8V1KRr_.js.map} +1 -1
  12. package/dist/{AutoSaveTextarea-jiqNeeE4.js → AutoSaveTextarea-BbMhC5Aq.js} +3 -3
  13. package/dist/AutoSaveTextarea-BbMhC5Aq.js.map +1 -0
  14. package/dist/{Badge-Ba3epgcI.js → Badge-CqlOE5A2.js} +23 -12
  15. package/dist/Badge-CqlOE5A2.js.map +1 -0
  16. package/dist/{BrandEditor-CN2HJ_12.js → BrandEditor-D61pzWRq.js} +7 -9
  17. package/dist/BrandEditor-D61pzWRq.js.map +1 -0
  18. package/dist/{BrandLogo-BfITD0im.js → BrandLogo-DkESE19K.js} +2 -2
  19. package/dist/{BrandLogo-BfITD0im.js.map → BrandLogo-DkESE19K.js.map} +1 -1
  20. package/dist/{Breadcrumb-BnIlsoIH.js → Breadcrumb-DbqvDnYl.js} +4 -4
  21. package/dist/{Breadcrumb-BnIlsoIH.js.map → Breadcrumb-DbqvDnYl.js.map} +1 -1
  22. package/dist/{Button-D2JqBAq7.js → Button-BNkyYU8u.js} +9 -185
  23. package/dist/Button-BNkyYU8u.js.map +1 -0
  24. package/dist/{Card-Bpc_ZlL4.js → Card-DxjGiqH8.js} +11 -18
  25. package/dist/Card-DxjGiqH8.js.map +1 -0
  26. package/dist/{Checkbox-uFE8XLT_.js → Checkbox-CHDDJyAA.js} +20 -45
  27. package/dist/Checkbox-CHDDJyAA.js.map +1 -0
  28. package/dist/{Clipboard-D-9XOqy4.js → Clipboard-DlwVZS1P.js} +2 -2
  29. package/dist/{Clipboard-D-9XOqy4.js.map → Clipboard-DlwVZS1P.js.map} +1 -1
  30. package/dist/{ClipboardButton-DxvZG_H0.js → ClipboardButton-B1Hr_n_Z.js} +3 -3
  31. package/dist/{ClipboardButton-DxvZG_H0.js.map → ClipboardButton-B1Hr_n_Z.js.map} +1 -1
  32. package/dist/{CodeEditor-BfRSCKEs.js → CodeEditor-DVSPdfdo.js} +24 -31
  33. package/dist/CodeEditor-DVSPdfdo.js.map +1 -0
  34. package/dist/{ColorInput-CDKH8q_f.js → ColorInput-B_eZIu39.js} +5 -7
  35. package/dist/ColorInput-B_eZIu39.js.map +1 -0
  36. package/dist/{ColorModeSwitch-DR6J2U6M.js → ColorModeSwitch-BlrH8jAi.js} +3 -3
  37. package/dist/{ColorModeSwitch-DR6J2U6M.js.map → ColorModeSwitch-BlrH8jAi.js.map} +1 -1
  38. package/dist/{Combobox-CEesMe2M.js → Combobox-BLqX-Tdh.js} +16 -24
  39. package/dist/Combobox-BLqX-Tdh.js.map +1 -0
  40. package/dist/{Command-T3MLRaen.js → Command-DhXmqFLT.js} +46 -32
  41. package/dist/Command-DhXmqFLT.js.map +1 -0
  42. package/dist/{CopyField-CNbCHw9a.js → CopyField-D0Pg4Z0R.js} +2 -2
  43. package/dist/{CopyField-CNbCHw9a.js.map → CopyField-D0Pg4Z0R.js.map} +1 -1
  44. package/dist/{DateInput-ClK1lCxz.js → DateInput-duinbI9_.js} +5 -7
  45. package/dist/DateInput-duinbI9_.js.map +1 -0
  46. package/dist/{DatePicker-CgHAu9KX.js → DatePicker-Cg_aG_N4.js} +2 -2
  47. package/dist/{DatePicker-CgHAu9KX.js.map → DatePicker-Cg_aG_N4.js.map} +1 -1
  48. package/dist/{DateRangeInput-DtlAffS1.js → DateRangeInput-BYVHf9zo.js} +5 -7
  49. package/dist/DateRangeInput-BYVHf9zo.js.map +1 -0
  50. package/dist/{DateRangePicker-CXpXPMoh.js → DateRangePicker-m47cSV1r.js} +7 -12
  51. package/dist/DateRangePicker-m47cSV1r.js.map +1 -0
  52. package/dist/{DropdownMenu-B1gGvZoh.js → DropdownMenu-Bum99mVf.js} +35 -64
  53. package/dist/DropdownMenu-Bum99mVf.js.map +1 -0
  54. package/dist/{FieldItem-CYvJyjiI.js → FieldItem-BHUqgSO1.js} +3 -3
  55. package/dist/{FieldItem-CYvJyjiI.js.map → FieldItem-BHUqgSO1.js.map} +1 -1
  56. package/dist/{FileUpload-D6vPG3WB.js → FileUpload-BYFONpEl.js} +3 -3
  57. package/dist/FileUpload-BYFONpEl.js.map +1 -0
  58. package/dist/{Form-CD55zJiy.js → Form-Dqbt_tIs.js} +8 -8
  59. package/dist/{Form-CD55zJiy.js.map → Form-Dqbt_tIs.js.map} +1 -1
  60. package/dist/{FormGroup-DiYFdEhH.js → FormGroup-V5kIgQRN.js} +3 -3
  61. package/dist/{FormGroup-DiYFdEhH.js.map → FormGroup-V5kIgQRN.js.map} +1 -1
  62. package/dist/{FullScreenModal-CUuAakh3.js → FullScreenModal-DAvvlGOz.js} +2 -5
  63. package/dist/FullScreenModal-DAvvlGOz.js.map +1 -0
  64. package/dist/HoverCard-Cf9iYyaW.js +26 -0
  65. package/dist/HoverCard-Cf9iYyaW.js.map +1 -0
  66. package/dist/{InlineEdit-D5RdunZo.js → InlineEdit-D4P0SvCB.js} +5 -9
  67. package/dist/InlineEdit-D4P0SvCB.js.map +1 -0
  68. package/dist/{InputGroup-Dm014ruw.js → InputGroup-CZv_7QlM.js} +39 -146
  69. package/dist/InputGroup-CZv_7QlM.js.map +1 -0
  70. package/dist/{Kbd-3YM7NQO4.js → Kbd-CflKthfu.js} +5 -14
  71. package/dist/Kbd-CflKthfu.js.map +1 -0
  72. package/dist/{MermaidDiagram-CeiOkI60.js → MermaidDiagram-2-EuNu1i.js} +4 -4
  73. package/dist/{MermaidDiagram-CeiOkI60.js.map → MermaidDiagram-2-EuNu1i.js.map} +1 -1
  74. package/dist/{Modal-DMZRswk4.js → Modal-DwuvuiUx.js} +17 -36
  75. package/dist/Modal-DwuvuiUx.js.map +1 -0
  76. package/dist/{ModalTitle-CTECVgL8.js → ModalTitle-RGWwIMU6.js} +3 -3
  77. package/dist/ModalTitle-RGWwIMU6.js.map +1 -0
  78. package/dist/{MultiActionButtonGroup-CEv_txvz.js → MultiActionButtonGroup-Dzig87s1.js} +3 -3
  79. package/dist/{MultiActionButtonGroup-CEv_txvz.js.map → MultiActionButtonGroup-Dzig87s1.js.map} +1 -1
  80. package/dist/{Navbar-CtVYcRFn.js → Navbar-DHUS7XiU.js} +2 -2
  81. package/dist/{Navbar-CtVYcRFn.js.map → Navbar-DHUS7XiU.js.map} +1 -1
  82. package/dist/OtpInput-CY8yCaJk.js.map +1 -1
  83. package/dist/{PageToolbar-B_e7HGva.js → PageToolbar-LKP6PiP_.js} +4 -4
  84. package/dist/{PageToolbar-B_e7HGva.js.map → PageToolbar-LKP6PiP_.js.map} +1 -1
  85. package/dist/{Pagination-DDp6PRqf.js → Pagination-D27x5KmH.js} +2 -2
  86. package/dist/{Pagination-DDp6PRqf.js.map → Pagination-D27x5KmH.js.map} +1 -1
  87. package/dist/{Popconfirm-BgV6a0sl.js → Popconfirm-p72DiagN.js} +3 -3
  88. package/dist/{Popconfirm-BgV6a0sl.js.map → Popconfirm-p72DiagN.js.map} +1 -1
  89. package/dist/{Popover-BU7nGOv-.js → Popover-DnBw5Uay.js} +25 -38
  90. package/dist/Popover-DnBw5Uay.js.map +1 -0
  91. package/dist/{RadioGroup-C8EC3fqO.js → RadioGroup-B0TwHjBb.js} +9 -13
  92. package/dist/RadioGroup-B0TwHjBb.js.map +1 -0
  93. package/dist/{Search-aaUMI4ix.js → Search-vyZwGKMU.js} +3 -3
  94. package/dist/{Search-aaUMI4ix.js.map → Search-vyZwGKMU.js.map} +1 -1
  95. package/dist/{SearchInput-Dxi2GK4n.js → SearchInput-DyYXyw3u.js} +4 -6
  96. package/dist/SearchInput-DyYXyw3u.js.map +1 -0
  97. package/dist/{SectionNav-BnHOMLtE.js → SectionNav-6hcIpZLO.js} +5 -5
  98. package/dist/{SectionNav-BnHOMLtE.js.map → SectionNav-6hcIpZLO.js.map} +1 -1
  99. package/dist/{Select-CjQgU_6K.js → Select-C6zKeip5.js} +11 -25
  100. package/dist/Select-C6zKeip5.js.map +1 -0
  101. package/dist/{Sheet-utw4_rUa.js → Sheet-DKG20J7W.js} +13 -16
  102. package/dist/Sheet-DKG20J7W.js.map +1 -0
  103. package/dist/{Sidebar-BAmux2Uj.js → Sidebar-BlYqasnX.js} +11 -11
  104. package/dist/Sidebar-BlYqasnX.js.map +1 -0
  105. package/dist/{Slider-DbzzSDRV.js → Slider-DrcsM8_G.js} +4 -4
  106. package/dist/Slider-DrcsM8_G.js.map +1 -0
  107. package/dist/{Stepper-BBPembeK.js → Stepper-CQrUPVFL.js} +2 -2
  108. package/dist/Stepper-CQrUPVFL.js.map +1 -0
  109. package/dist/Switch-DccpSpzC.js +66 -0
  110. package/dist/Switch-DccpSpzC.js.map +1 -0
  111. package/dist/{Tabs-C0uvkPHc.js → Tabs-Ck4uWf8U.js} +2 -2
  112. package/dist/{Tabs-C0uvkPHc.js.map → Tabs-Ck4uWf8U.js.map} +1 -1
  113. package/dist/{TextInput-K2DSDs5O.js → TextInput-CR0_USaY.js} +4 -7
  114. package/dist/TextInput-CR0_USaY.js.map +1 -0
  115. package/dist/{ThemeProvider-C8yaKlM1.js → ThemeProvider-BTK7AL-T.js} +21 -8
  116. package/dist/ThemeProvider-BTK7AL-T.js.map +1 -0
  117. package/dist/{TimePicker-DyyV3nw8.js → TimePicker-lk3NGqeK.js} +2 -2
  118. package/dist/{TimePicker-DyyV3nw8.js.map → TimePicker-lk3NGqeK.js.map} +1 -1
  119. package/dist/{Toast-BGnUL4jV.js → Toast-937n7n8i.js} +2 -2
  120. package/dist/{Toast-BGnUL4jV.js.map → Toast-937n7n8i.js.map} +1 -1
  121. package/dist/{ToggleAllTooltip-Dlmq-yqS.js → ToggleAllTooltip-DEjbWFoj.js} +2 -2
  122. package/dist/{ToggleAllTooltip-Dlmq-yqS.js.map → ToggleAllTooltip-DEjbWFoj.js.map} +1 -1
  123. package/dist/Workbench-CxgNCs3I.js.map +1 -1
  124. package/dist/{ZoomableSvg-Dh1OstPN.js → ZoomableSvg-CxXKanUR.js} +5 -5
  125. package/dist/{ZoomableSvg-Dh1OstPN.js.map → ZoomableSvg-CxXKanUR.js.map} +1 -1
  126. package/dist/editors.js +4 -4
  127. package/dist/flint.js +4 -4
  128. package/dist/index.d.ts +113 -125
  129. package/dist/index.js +61 -61
  130. package/dist/internal/blocks/AIKit.js +1 -1
  131. package/dist/internal/blocks/AppShell.js +1 -1
  132. package/dist/internal/blocks/AuthLayout.js +1 -1
  133. package/dist/internal/blocks/AutoSaveTextarea.js +1 -1
  134. package/dist/internal/blocks/BrandEditor.js +1 -1
  135. package/dist/internal/blocks/ChartPanel.js +1 -1
  136. package/dist/internal/blocks/ChipEditor.js +5 -9
  137. package/dist/internal/blocks/ChipEditor.js.map +1 -1
  138. package/dist/internal/blocks/ClipboardButton.js +1 -1
  139. package/dist/internal/blocks/ColorInput.js +1 -1
  140. package/dist/internal/blocks/ColorModeSwitch.js +1 -1
  141. package/dist/internal/blocks/Command.js +1 -1
  142. package/dist/internal/blocks/CopyField.js +1 -1
  143. package/dist/internal/blocks/DateInput.js +1 -1
  144. package/dist/internal/blocks/DateRangeInput.js +1 -1
  145. package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
  146. package/dist/internal/blocks/ErrorState.js +18 -29
  147. package/dist/internal/blocks/ErrorState.js.map +1 -1
  148. package/dist/internal/blocks/ExportMenu.js +3 -3
  149. package/dist/internal/blocks/ExportMenu.js.map +1 -1
  150. package/dist/internal/blocks/Form/connectors/ComboboxField.js +2 -2
  151. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +1 -1
  152. package/dist/internal/blocks/Form.js +1 -1
  153. package/dist/internal/blocks/FormGroup.js +1 -1
  154. package/dist/internal/blocks/InlineEdit.js +1 -1
  155. package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
  156. package/dist/internal/blocks/MultiCombobox.js +5 -9
  157. package/dist/internal/blocks/MultiCombobox.js.map +1 -1
  158. package/dist/internal/blocks/NumberInput.js +2 -4
  159. package/dist/internal/blocks/NumberInput.js.map +1 -1
  160. package/dist/internal/blocks/PageToolbar.js +1 -1
  161. package/dist/internal/blocks/PasswordInput.js +3 -5
  162. package/dist/internal/blocks/PasswordInput.js.map +1 -1
  163. package/dist/internal/blocks/SearchInput.js +1 -1
  164. package/dist/internal/blocks/SearchInputWithNavigation.js +6 -7
  165. package/dist/internal/blocks/SearchInputWithNavigation.js.map +1 -1
  166. package/dist/internal/blocks/SectionNav.js +1 -1
  167. package/dist/internal/blocks/SplitButton.js +2 -2
  168. package/dist/internal/blocks/StatCard.js +1 -1
  169. package/dist/internal/blocks/TextInput.js +1 -1
  170. package/dist/internal/blocks/Textarea.js +3 -8
  171. package/dist/internal/blocks/Textarea.js.map +1 -1
  172. package/dist/internal/blocks/TimeInput.js +4 -6
  173. package/dist/internal/blocks/TimeInput.js.map +1 -1
  174. package/dist/internal/components/Alert.js +1 -1
  175. package/dist/internal/components/AlertModal.js +1 -1
  176. package/dist/internal/components/Avatar.js +1 -1
  177. package/dist/internal/components/Badge.js +1 -1
  178. package/dist/internal/components/BrandLogo.js +1 -1
  179. package/dist/internal/components/Breadcrumb.js +1 -1
  180. package/dist/internal/components/Button.js +2 -2
  181. package/dist/internal/components/ButtonGroup.js +1 -1
  182. package/dist/internal/components/ButtonGroup.js.map +1 -1
  183. package/dist/internal/components/Card.js +1 -1
  184. package/dist/internal/components/Checkbox.js +1 -1
  185. package/dist/internal/components/Clipboard.js +1 -1
  186. package/dist/internal/components/CollapsiblePanel.js +1 -1
  187. package/dist/internal/components/Combobox.js +1 -1
  188. package/dist/internal/components/DatePicker.js +1 -1
  189. package/dist/internal/components/DateRangePicker.js +1 -1
  190. package/dist/internal/components/DropdownMenu.js +1 -1
  191. package/dist/internal/components/FileUpload.js +1 -1
  192. package/dist/internal/components/FullScreenModal.js +1 -1
  193. package/dist/internal/components/HoverCard.js +1 -1
  194. package/dist/internal/components/InputGroup.js +1 -1
  195. package/dist/internal/components/Kbd.js +1 -1
  196. package/dist/internal/components/Modal.js +1 -1
  197. package/dist/internal/components/Navbar.js +1 -1
  198. package/dist/internal/components/Pagination.js +1 -1
  199. package/dist/internal/components/Popconfirm.js +1 -1
  200. package/dist/internal/components/Popover.js +1 -1
  201. package/dist/internal/components/RadioGroup.js +1 -1
  202. package/dist/internal/components/Search.js +1 -1
  203. package/dist/internal/components/Select.js +1 -1
  204. package/dist/internal/components/Sheet.js +1 -1
  205. package/dist/internal/components/Sidebar.js +1 -1
  206. package/dist/internal/components/Skeleton/Skeleton.js +1 -1
  207. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -1
  208. package/dist/internal/components/Slider.js +1 -1
  209. package/dist/internal/components/Stepper.js +1 -1
  210. package/dist/internal/components/Switch.js +1 -1
  211. package/dist/internal/components/Tabs.js +1 -1
  212. package/dist/internal/components/ThemeProvider.js +3 -4
  213. package/dist/internal/components/TimePicker.js +1 -1
  214. package/dist/internal/components/Toast.js +2 -2
  215. package/dist/internal/components/Toggle.js +13 -3
  216. package/dist/internal/components/Toggle.js.map +1 -1
  217. package/dist/internal/components/Tooltip.js +1 -1
  218. package/dist/internal/components/Truncated.js +1 -1
  219. package/dist/internal/components/ZoomableSvg.js +1 -1
  220. package/dist/internal/hooks/useTimeout.js +19 -0
  221. package/dist/internal/hooks/useTimeout.js.map +1 -0
  222. package/dist/internal/utils.js +1 -1
  223. package/dist/markdown-editor.js +16 -18
  224. package/dist/markdown-editor.js.map +1 -1
  225. package/dist/mermaid.js +1 -1
  226. package/dist/rjsf.js +33 -42
  227. package/dist/rjsf.js.map +1 -1
  228. package/dist/styles-DxazJ8Mz.js +81 -0
  229. package/dist/styles-DxazJ8Mz.js.map +1 -0
  230. package/dist/styles-T8xwr0sR.js +73 -0
  231. package/dist/styles-T8xwr0sR.js.map +1 -0
  232. package/dist/styles.css +1 -1
  233. package/dist/testing.d.ts +0 -2
  234. package/dist/testing.js +3 -10
  235. package/dist/testing.js.map +1 -1
  236. package/dist/{useColorSchemeState-Cw4MCXUs.js → themeScopeContext-CEVXbYvZ.js} +43 -15
  237. package/dist/themeScopeContext-CEVXbYvZ.js.map +1 -0
  238. package/dist/{useThemeAttributes-B199Regy.js → themeTokens-DCeb62ap.js} +22 -4
  239. package/dist/themeTokens-DCeb62ap.js.map +1 -0
  240. package/dist/{toast-D6Z6MOB5.js → toast-Y3cTMBW8.js} +7 -10
  241. package/dist/toast-Y3cTMBW8.js.map +1 -0
  242. package/dist/{utils-LQ4jJA-9.js → utils-DwC9u0tM.js} +26 -52
  243. package/dist/utils-DwC9u0tM.js.map +1 -0
  244. package/dist/vega.js +2 -2
  245. package/dist/{vegaTheme-BrmVoPEz.js → vegaTheme-ISwGXvof.js} +2 -2
  246. package/dist/{vegaTheme-BrmVoPEz.js.map → vegaTheme-ISwGXvof.js.map} +1 -1
  247. package/dist/{vegaTokens-Ce07C0DH.js → vegaTokens-DCkvpIVE.js} +2 -2
  248. package/dist/{vegaTokens-Ce07C0DH.js.map → vegaTokens-DCkvpIVE.js.map} +1 -1
  249. package/package.json +2 -2
  250. package/src/styles.css +0 -35
  251. package/src/theme.css +46 -0
  252. package/dist/AIKit-BRSZ3nY7.js.map +0 -1
  253. package/dist/Alert-CZ0dDsuk.js.map +0 -1
  254. package/dist/AlertModal-BDle9ZVQ.js.map +0 -1
  255. package/dist/AutoSaveTextarea-jiqNeeE4.js.map +0 -1
  256. package/dist/Badge-Ba3epgcI.js.map +0 -1
  257. package/dist/BrandEditor-CN2HJ_12.js.map +0 -1
  258. package/dist/Button-D2JqBAq7.js.map +0 -1
  259. package/dist/Card-Bpc_ZlL4.js.map +0 -1
  260. package/dist/Checkbox-uFE8XLT_.js.map +0 -1
  261. package/dist/CodeEditor-BfRSCKEs.js.map +0 -1
  262. package/dist/ColorInput-CDKH8q_f.js.map +0 -1
  263. package/dist/Combobox-CEesMe2M.js.map +0 -1
  264. package/dist/Command-T3MLRaen.js.map +0 -1
  265. package/dist/DateInput-ClK1lCxz.js.map +0 -1
  266. package/dist/DateRangeInput-DtlAffS1.js.map +0 -1
  267. package/dist/DateRangePicker-CXpXPMoh.js.map +0 -1
  268. package/dist/DropdownMenu-B1gGvZoh.js.map +0 -1
  269. package/dist/FileUpload-D6vPG3WB.js.map +0 -1
  270. package/dist/FullScreenModal-CUuAakh3.js.map +0 -1
  271. package/dist/HoverCard-BBdPYqEf.js +0 -31
  272. package/dist/HoverCard-BBdPYqEf.js.map +0 -1
  273. package/dist/InlineEdit-D5RdunZo.js.map +0 -1
  274. package/dist/InputGroup-Dm014ruw.js.map +0 -1
  275. package/dist/Kbd-3YM7NQO4.js.map +0 -1
  276. package/dist/Modal-DMZRswk4.js.map +0 -1
  277. package/dist/ModalTitle-CTECVgL8.js.map +0 -1
  278. package/dist/Popover-BU7nGOv-.js.map +0 -1
  279. package/dist/RadioGroup-C8EC3fqO.js.map +0 -1
  280. package/dist/SearchInput-Dxi2GK4n.js.map +0 -1
  281. package/dist/Select-CjQgU_6K.js.map +0 -1
  282. package/dist/Sheet-utw4_rUa.js.map +0 -1
  283. package/dist/Sidebar-BAmux2Uj.js.map +0 -1
  284. package/dist/Slider-DbzzSDRV.js.map +0 -1
  285. package/dist/Stepper-BBPembeK.js.map +0 -1
  286. package/dist/Switch-Dw4tvQls.js +0 -201
  287. package/dist/Switch-Dw4tvQls.js.map +0 -1
  288. package/dist/TextInput-K2DSDs5O.js.map +0 -1
  289. package/dist/ThemeProvider-C8yaKlM1.js.map +0 -1
  290. package/dist/context-U293r3v-.js +0 -29
  291. package/dist/context-U293r3v-.js.map +0 -1
  292. package/dist/defaults-i_xG2F_1.js +0 -32
  293. package/dist/defaults-i_xG2F_1.js.map +0 -1
  294. package/dist/styles-BDA5rQz3.js +0 -127
  295. package/dist/styles-BDA5rQz3.js.map +0 -1
  296. package/dist/styles-YQdM7G8c.js +0 -159
  297. package/dist/styles-YQdM7G8c.js.map +0 -1
  298. package/dist/themeTokens-l2Fsfcs7.js +0 -22
  299. package/dist/themeTokens-l2Fsfcs7.js.map +0 -1
  300. package/dist/toast-D6Z6MOB5.js.map +0 -1
  301. package/dist/useColorSchemeState-Cw4MCXUs.js.map +0 -1
  302. package/dist/useThemeAttributes-B199Regy.js.map +0 -1
  303. package/dist/utils-LQ4jJA-9.js.map +0 -1
@@ -1,11 +1,10 @@
1
1
  import { cn } from "../../classNames-DcGnTh2N.js";
2
- import { Tooltip, TooltipProvider, splitEntry } from "../../utils-LQ4jJA-9.js";
3
- import { useArgoDesign } from "../../context-U293r3v-.js";
2
+ import { Tooltip, TooltipProvider, splitEntry } from "../../utils-DwC9u0tM.js";
4
3
  import { PanelRightClose, PanelRightOpen, Search } from "../../icons-ZIeZXXS7.js";
5
- import { Button } from "../../Button-D2JqBAq7.js";
4
+ import { Button } from "../../Button-BNkyYU8u.js";
6
5
  import { useControllableState } from "../../useControllableState-CUYXMsfz.js";
7
6
  import { forwardAccessibleName } from "../utils/accessibleName.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";
7
+ 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-BLqX-Tdh.js";
9
8
  import { useCallback, useMemo, useState } from "react";
10
9
  import { jsx, jsxs } from "react/jsx-runtime";
11
10
  import { Combobox } from "@base-ui/react/combobox";
@@ -44,7 +43,7 @@ const NO_VALUES = [];
44
43
  * @see RECIPES.md#creatable-multi-combobox
45
44
  * @see RECIPES.md#filter-toolbar
46
45
  */
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 }) => {
46
+ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onValueChange, itemToStringLabel, itemToStringValue, disabled, filter: filterProp, isItemEqualToValue: isItemEqualToValueProp, inputRef, 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 }) => {
48
47
  const itemsProp = _itemsProp ?? NO_ITEMS;
49
48
  const [valueProp, setValueProp] = useControllableState({
50
49
  prop: _valueProp === null ? NO_VALUES : _valueProp,
@@ -52,7 +51,6 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
52
51
  });
53
52
  const itemToString = useCallback((item) => itemToStringLabel?.(item) ?? toLabel(item), [itemToStringLabel]);
54
53
  const itemToLabel = itemToLabelProp ?? defaultRowLabel(itemToStringLabel);
55
- const chipVariant = useArgoDesign() ? "pill" : "default";
56
54
  const [inputValue, setInputValue] = useState("");
57
55
  const [asideOpen, setAsideOpen] = useControllableState({
58
56
  prop: asideOpenProp,
@@ -293,8 +291,6 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
293
291
  children: input
294
292
  }),
295
293
  !anchor && /* @__PURE__ */ jsx(Combobox$1.InputGroup, {
296
- variant,
297
- sizing,
298
294
  state,
299
295
  focusVariant,
300
296
  className,
@@ -302,7 +298,7 @@ const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onV
302
298
  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
299
  children: [/* @__PURE__ */ jsx(Combobox$1.Chips, {
304
300
  maxVisible,
305
- variant: chipVariant,
301
+ variant: "pill",
306
302
  itemToChipLabel: itemToChipLabel ?? ((item) => itemToLabel(item, "")),
307
303
  itemToChipColor,
308
304
  pinnedChipLabels,
@@ -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 { 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
+ {"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 { 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, 'focusVariant' | '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 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\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 state={state} focusVariant={focusVariant} className={className}>\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=\"pill\"\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,8 +1,8 @@
1
- import { InputGroup } from "../../InputGroup-Dm014ruw.js";
1
+ import { InputGroup } from "../../InputGroup-CZv_7QlM.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;
5
- const NumberInput = ({ ref, state, variant, focusVariant, sizing, className, value, defaultValue, onValueChange, onValueBlur, onChange, onBlur, prefix, suffix, ...inputProps }) => {
5
+ const NumberInput = ({ ref, state, focusVariant, className, value, defaultValue, onValueChange, onValueBlur, onChange, onBlur, prefix, suffix, ...inputProps }) => {
6
6
  const handleChange = (event) => {
7
7
  onValueChange?.(toNumberOrNull(event));
8
8
  onChange?.(event);
@@ -14,8 +14,6 @@ const NumberInput = ({ ref, state, variant, focusVariant, sizing, className, val
14
14
  const valueProp = value !== void 0 ? { value: value ?? "" } : { defaultValue: defaultValue ?? "" };
15
15
  return /* @__PURE__ */ jsxs(InputGroup, {
16
16
  state,
17
- variant,
18
- sizing,
19
17
  focusVariant,
20
18
  className,
21
19
  children: [
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.js","names":[],"sources":["../../../src/blocks/NumberInput/NumberInput.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n ChangeEventHandler,\n ComponentProps,\n FocusEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type' | 'prefix'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: number | null;\n defaultValue?: number | null;\n onValueChange?: (value: number | null) => void;\n onValueBlur?: (value: number | null) => void;\n prefix?: ReactNode;\n suffix?: ReactNode;\n };\n\nconst toNumberOrNull = (event: ChangeEvent<HTMLInputElement>) =>\n Number.isNaN(event.target.valueAsNumber) ? null : event.target.valueAsNumber;\n\nexport const NumberInput = ({\n ref,\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n value,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n\n prefix,\n suffix,\n\n ...inputProps\n}: Props) => {\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n onValueChange?.(toNumberOrNull(event));\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(toNumberOrNull(event));\n onBlur?.(event);\n };\n\n const isControlled = value !== undefined;\n const valueProp = isControlled ? { value: value ?? '' } : { defaultValue: defaultValue ?? '' };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n <InputGroup.Input\n {...inputProps}\n {...valueProp}\n ref={ref}\n type=\"number\"\n onChange={handleChange}\n onBlur={handleBlur}\n />\n {suffix && <InputGroup.Addon align=\"inline-end\">{suffix}</InputGroup.Addon>}\n </InputGroup>\n );\n};\n"],"mappings":";;;AA8BA,MAAM,kBAAkB,UACtB,OAAO,MAAM,MAAM,OAAO,aAAa,IAAI,OAAO,MAAM,OAAO;AAEjE,MAAa,eAAe,EAC1B,KACA,OACA,SACA,cACA,QACA,WAEA,OACA,cACA,eACA,aACA,UACA,QAEA,QACA,QAEA,GAAG,iBACQ;CACX,MAAM,gBAAsD,UAAU;EACpE,gBAAgB,eAAe,KAAK,CAAC;EACrC,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,cAAc,eAAe,KAAK,CAAC;EACnC,SAAS,KAAK;CAChB;CAGA,MAAM,YADe,UAAU,KAAA,IACE,EAAE,OAAO,SAAS,GAAG,IAAI,EAAE,cAAc,gBAAgB,GAAG;CAE7F,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EALb,UAAA;GAOG,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAgB,UAAA;GAAyB,CAAA;GAC5E,oBAAC,WAAW,OAAZ;IACE,GAAI;IACJ,GAAI;IACC;IACL,MAAK;IACL,UAAU;IACV,QAAQ;GACT,CAAA;GACA,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAc,UAAA;GAAyB,CAAA;EAChE;;AAEhB"}
1
+ {"version":3,"file":"NumberInput.js","names":[],"sources":["../../../src/blocks/NumberInput/NumberInput.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n ChangeEventHandler,\n ComponentProps,\n FocusEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\n\ntype InputGroupProps = Pick<ComponentProps<typeof InputGroup>, 'focusVariant' | 'state'>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type' | 'prefix'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: number | null;\n defaultValue?: number | null;\n onValueChange?: (value: number | null) => void;\n onValueBlur?: (value: number | null) => void;\n prefix?: ReactNode;\n suffix?: ReactNode;\n };\n\nconst toNumberOrNull = (event: ChangeEvent<HTMLInputElement>) =>\n Number.isNaN(event.target.valueAsNumber) ? null : event.target.valueAsNumber;\n\nexport const NumberInput = ({\n ref,\n state,\n focusVariant,\n className,\n\n value,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n\n prefix,\n suffix,\n\n ...inputProps\n}: Props) => {\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n onValueChange?.(toNumberOrNull(event));\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(toNumberOrNull(event));\n onBlur?.(event);\n };\n\n const isControlled = value !== undefined;\n const valueProp = isControlled ? { value: value ?? '' } : { defaultValue: defaultValue ?? '' };\n\n return (\n <InputGroup state={state} focusVariant={focusVariant} className={className}>\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n <InputGroup.Input\n {...inputProps}\n {...valueProp}\n ref={ref}\n type=\"number\"\n onChange={handleChange}\n onBlur={handleBlur}\n />\n {suffix && <InputGroup.Addon align=\"inline-end\">{suffix}</InputGroup.Addon>}\n </InputGroup>\n );\n};\n"],"mappings":";;;AA2BA,MAAM,kBAAkB,UACtB,OAAO,MAAM,MAAM,OAAO,aAAa,IAAI,OAAO,MAAM,OAAO;AAEjE,MAAa,eAAe,EAC1B,KACA,OACA,cACA,WAEA,OACA,cACA,eACA,aACA,UACA,QAEA,QACA,QAEA,GAAG,iBACQ;CACX,MAAM,gBAAsD,UAAU;EACpE,gBAAgB,eAAe,KAAK,CAAC;EACrC,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,cAAc,eAAe,KAAK,CAAC;EACnC,SAAS,KAAK;CAChB;CAGA,MAAM,YADe,UAAU,KAAA,IACE,EAAE,OAAO,SAAS,GAAG,IAAI,EAAE,cAAc,gBAAgB,GAAG;CAE7F,OACE,qBAAC,YAAD;EAAmB;EAAqB;EAAyB;EAAjE,UAAA;GACG,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAgB,UAAA;GAAyB,CAAA;GAC5E,oBAAC,WAAW,OAAZ;IACE,GAAI;IACJ,GAAI;IACC;IACL,MAAK;IACL,UAAU;IACV,QAAQ;GACT,CAAA;GACA,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAc,UAAA;GAAyB,CAAA;EAChE;;AAEhB"}
@@ -1,2 +1,2 @@
1
- import { PageToolbar } from "../../PageToolbar-B_e7HGva.js";
1
+ import { PageToolbar } from "../../PageToolbar-LKP6PiP_.js";
2
2
  export { PageToolbar };
@@ -1,12 +1,12 @@
1
- import { createChangeInputEvent } from "../../utils-LQ4jJA-9.js";
1
+ import { createChangeInputEvent } from "../../utils-DwC9u0tM.js";
2
2
  import { mergeRefs } from "../utils/mergeRefs.js";
3
3
  import { ArrowBigUpDash, Eye, EyeOff, X } from "../../icons-ZIeZXXS7.js";
4
- import { InputGroup } from "../../InputGroup-Dm014ruw.js";
4
+ import { InputGroup } from "../../InputGroup-CZv_7QlM.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";
8
8
  //#region src/blocks/PasswordInput/PasswordInput.tsx
9
- const PasswordInput = ({ ref, state, variant, focusVariant, sizing, className, value: valueProp, defaultValue, onValueChange, onValueBlur, onChange, onBlur, onKeyDown, onKeyUp, onMouseDown, allowClear = false, allowPasswordToggle = false, passwordToggleLabel, autoComplete = "new-password", defaultPasswordVisibility = false, disabled, readOnly, ...restInputProps }) => {
9
+ const PasswordInput = ({ ref, state, focusVariant, className, value: valueProp, defaultValue, onValueChange, onValueBlur, onChange, onBlur, onKeyDown, onKeyUp, onMouseDown, allowClear = false, allowPasswordToggle = false, passwordToggleLabel, autoComplete = "new-password", defaultPasswordVisibility = false, disabled, readOnly, ...restInputProps }) => {
10
10
  const inputRef = useRef(null);
11
11
  const [value, setValue] = useControllableState({
12
12
  prop: valueProp === null ? "" : valueProp,
@@ -51,8 +51,6 @@ const PasswordInput = ({ ref, state, variant, focusVariant, sizing, className, v
51
51
  };
52
52
  return /* @__PURE__ */ jsxs(InputGroup, {
53
53
  state,
54
- variant,
55
- sizing,
56
54
  focusVariant,
57
55
  className,
58
56
  children: [/* @__PURE__ */ jsx(InputGroup.Input, {
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordInput.js","names":[],"sources":["../../../src/blocks/PasswordInput/PasswordInput.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { ArrowBigUpDash, Eye, EyeOff, X } from '../../icons';\nimport { createChangeInputEvent, mergeRefs } from '../../utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type' | 'autoComplete'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n allowClear?: boolean;\n allowPasswordToggle?: boolean;\n /** Suffix of the reveal button's accessible name, to tell several password fields apart. */\n passwordToggleLabel?: string;\n autoComplete?: 'new-password' | 'current-password' | 'off';\n defaultPasswordVisibility?: boolean;\n };\n\nexport const PasswordInput = ({\n ref,\n\n // group props\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n // own props\n value: valueProp,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n onKeyDown,\n onKeyUp,\n onMouseDown,\n allowClear = false,\n allowPasswordToggle = false,\n passwordToggleLabel,\n autoComplete = 'new-password',\n defaultPasswordVisibility = false,\n\n // input props\n disabled,\n readOnly,\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.\n prop: valueProp === null ? '' : valueProp,\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n const [capsLock, setCapsLock] = useState(false);\n const [isPasswordVisible, setIsPasswordVisible] = useState(defaultPasswordVisibility);\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n if (capsLock) setCapsLock(false);\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n // keyUp too: pressing Caps Lock itself reports the old state on keyDown.\n const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onKeyDown?.(event);\n };\n\n const handleKeyUp: KeyboardEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onKeyUp?.(event);\n };\n\n // Caps Lock already on when clicking in; focus events cannot read modifier state.\n const handleMouseDown: MouseEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onMouseDown?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue('');\n onChange?.(createChangeInputEvent(inputRef.current));\n };\n\n const handleTogglePasswordVisibility = () => {\n setIsPasswordVisible((prev) => !prev);\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n <InputGroup.Input\n {...restInputProps}\n ref={mergeRefs(ref ?? null, inputRef)}\n type={isPasswordVisible ? 'text' : 'password'}\n autoComplete={autoComplete}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onMouseDown={handleMouseDown}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n {(capsLock || canClear || allowPasswordToggle) && (\n <InputGroup.Addon align=\"inline-end\">\n {capsLock && (\n <ArrowBigUpDash className=\"tw:size-4 tw:text-primary\">\n <title>Caps Lock is on</title>\n </ArrowBigUpDash>\n )}\n {canClear && (\n <InputGroup.Button\n aria-label=\"Clear password\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {allowPasswordToggle && (\n <InputGroup.Button\n aria-label={`${isPasswordVisible ? 'Hide password' : 'Show password'}${\n passwordToggleLabel ? `: ${passwordToggleLabel}` : ''\n }`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleTogglePasswordVisibility}\n >\n {isPasswordVisible ? <EyeOff className=\"tw:size-4\" /> : <Eye className=\"tw:size-4\" />}\n </InputGroup.Button>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;AAuCA,MAAa,iBAAiB,EAC5B,KAGA,OACA,SACA,cACA,QACA,WAGA,OAAO,WACP,cACA,eACA,aACA,UACA,QACA,WACA,SACA,aACA,aAAa,OACb,sBAAsB,OACtB,qBACA,eAAe,gBACf,4BAA4B,OAG5B,UACA,UACA,GAAG,qBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAErD,MAAM,cAAc,OAAO,KAAK;EAChC,aAAa,gBAAgB;EAC7B,UAAU;CACZ,CAAC;CAED,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,yBAAyB;CAEpF,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;CAExD,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,KAAK;EAC3B,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,IAAI,UAAU,YAAY,KAAK;EAC/B,cAAc,MAAM,OAAO,KAAK;EAChC,SAAS,KAAK;CAChB;CAGA,MAAM,iBAAyD,UAAU;EACvE,MAAM,OAAO,MAAM,iBAAiB,UAAU;EAC9C,IAAI,SAAS,UAAU,YAAY,IAAI;EACvC,YAAY,KAAK;CACnB;CAEA,MAAM,eAAuD,UAAU;EACrE,MAAM,OAAO,MAAM,iBAAiB,UAAU;EAC9C,IAAI,SAAS,UAAU,YAAY,IAAI;EACvC,UAAU,KAAK;CACjB;CAGA,MAAM,mBAAwD,UAAU;EACtE,MAAM,OAAO,MAAM,iBAAiB,UAAU;EAC9C,IAAI,SAAS,UAAU,YAAY,IAAI;EACvC,cAAc,KAAK;CACrB;CAEA,MAAM,oBAA0D;EAC9D,IAAI,CAAC,SAAS,SAAS;EACvB,SAAS,QAAQ,QAAQ;EACzB,SAAS,EAAE;EACX,WAAW,uBAAuB,SAAS,OAAO,CAAC;CACrD;CAEA,MAAM,uCAAuC;EAC3C,sBAAsB,SAAS,CAAC,IAAI;CACtC;CAEA,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EALb,UAAA,CAOE,oBAAC,WAAW,OAAZ;GACE,GAAI;GACJ,KAAK,UAAU,OAAO,MAAM,QAAQ;GACpC,MAAM,oBAAoB,SAAS;GACrB;GACP;GACP,UAAU;GACV,QAAQ;GACR,WAAW;GACX,SAAS;GACT,aAAa;GACH;GACA;EACX,CAAA,IAEC,YAAY,YAAY,wBACxB,qBAAC,WAAW,OAAZ;GAAkB,OAAM;GAAxB,UAAA;IACG,YACC,oBAAC,gBAAD;KAAgB,WAAU;KACxB,UAAA,oBAAC,SAAD,EAAA,UAAO,kBAAsB,CAAA;IACf,CAAA;IAEjB,YACC,oBAAC,WAAW,QAAZ;KACE,cAAW;KACX,cAAc,UAAU,MAAM,eAAe;KAC7C,SAAS;KAET,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;IACT,CAAA;IAEpB,uBACC,oBAAC,WAAW,QAAZ;KACE,cAAY,GAAG,oBAAoB,kBAAkB,kBACnD,sBAAsB,KAAK,wBAAwB;KAErD,cAAc,UAAU,MAAM,eAAe;KAC7C,SAAS;KAER,UAAA,oBAAoB,oBAAC,QAAD,EAAQ,WAAU,YAAa,CAAA,IAAI,oBAAC,KAAD,EAAK,WAAU,YAAa,CAAA;IACnE,CAAA;GAEL;EAEV,CAAA,CAAA;;AAEhB"}
1
+ {"version":3,"file":"PasswordInput.js","names":[],"sources":["../../../src/blocks/PasswordInput/PasswordInput.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { ArrowBigUpDash, Eye, EyeOff, X } from '../../icons';\nimport { createChangeInputEvent, mergeRefs } from '../../utils';\n\ntype InputGroupProps = Pick<ComponentProps<typeof InputGroup>, 'focusVariant' | 'state'>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type' | 'autoComplete'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n allowClear?: boolean;\n allowPasswordToggle?: boolean;\n /** Suffix of the reveal button's accessible name, to tell several password fields apart. */\n passwordToggleLabel?: string;\n autoComplete?: 'new-password' | 'current-password' | 'off';\n defaultPasswordVisibility?: boolean;\n };\n\nexport const PasswordInput = ({\n ref,\n\n // group props\n state,\n focusVariant,\n className,\n\n // own props\n value: valueProp,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n onKeyDown,\n onKeyUp,\n onMouseDown,\n allowClear = false,\n allowPasswordToggle = false,\n passwordToggleLabel,\n autoComplete = 'new-password',\n defaultPasswordVisibility = false,\n\n // input props\n disabled,\n readOnly,\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.\n prop: valueProp === null ? '' : valueProp,\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n const [capsLock, setCapsLock] = useState(false);\n const [isPasswordVisible, setIsPasswordVisible] = useState(defaultPasswordVisibility);\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n if (capsLock) setCapsLock(false);\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n // keyUp too: pressing Caps Lock itself reports the old state on keyDown.\n const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onKeyDown?.(event);\n };\n\n const handleKeyUp: KeyboardEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onKeyUp?.(event);\n };\n\n // Caps Lock already on when clicking in; focus events cannot read modifier state.\n const handleMouseDown: MouseEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onMouseDown?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue('');\n onChange?.(createChangeInputEvent(inputRef.current));\n };\n\n const handleTogglePasswordVisibility = () => {\n setIsPasswordVisible((prev) => !prev);\n };\n\n return (\n <InputGroup state={state} focusVariant={focusVariant} className={className}>\n <InputGroup.Input\n {...restInputProps}\n ref={mergeRefs(ref ?? null, inputRef)}\n type={isPasswordVisible ? 'text' : 'password'}\n autoComplete={autoComplete}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onMouseDown={handleMouseDown}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n {(capsLock || canClear || allowPasswordToggle) && (\n <InputGroup.Addon align=\"inline-end\">\n {capsLock && (\n <ArrowBigUpDash className=\"tw:size-4 tw:text-primary\">\n <title>Caps Lock is on</title>\n </ArrowBigUpDash>\n )}\n {canClear && (\n <InputGroup.Button\n aria-label=\"Clear password\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {allowPasswordToggle && (\n <InputGroup.Button\n aria-label={`${isPasswordVisible ? 'Hide password' : 'Show password'}${\n passwordToggleLabel ? `: ${passwordToggleLabel}` : ''\n }`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleTogglePasswordVisibility}\n >\n {isPasswordVisible ? <EyeOff className=\"tw:size-4\" /> : <Eye className=\"tw:size-4\" />}\n </InputGroup.Button>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;AAoCA,MAAa,iBAAiB,EAC5B,KAGA,OACA,cACA,WAGA,OAAO,WACP,cACA,eACA,aACA,UACA,QACA,WACA,SACA,aACA,aAAa,OACb,sBAAsB,OACtB,qBACA,eAAe,gBACf,4BAA4B,OAG5B,UACA,UACA,GAAG,qBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAErD,MAAM,cAAc,OAAO,KAAK;EAChC,aAAa,gBAAgB;EAC7B,UAAU;CACZ,CAAC;CAED,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,yBAAyB;CAEpF,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;CAExD,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,KAAK;EAC3B,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,IAAI,UAAU,YAAY,KAAK;EAC/B,cAAc,MAAM,OAAO,KAAK;EAChC,SAAS,KAAK;CAChB;CAGA,MAAM,iBAAyD,UAAU;EACvE,MAAM,OAAO,MAAM,iBAAiB,UAAU;EAC9C,IAAI,SAAS,UAAU,YAAY,IAAI;EACvC,YAAY,KAAK;CACnB;CAEA,MAAM,eAAuD,UAAU;EACrE,MAAM,OAAO,MAAM,iBAAiB,UAAU;EAC9C,IAAI,SAAS,UAAU,YAAY,IAAI;EACvC,UAAU,KAAK;CACjB;CAGA,MAAM,mBAAwD,UAAU;EACtE,MAAM,OAAO,MAAM,iBAAiB,UAAU;EAC9C,IAAI,SAAS,UAAU,YAAY,IAAI;EACvC,cAAc,KAAK;CACrB;CAEA,MAAM,oBAA0D;EAC9D,IAAI,CAAC,SAAS,SAAS;EACvB,SAAS,QAAQ,QAAQ;EACzB,SAAS,EAAE;EACX,WAAW,uBAAuB,SAAS,OAAO,CAAC;CACrD;CAEA,MAAM,uCAAuC;EAC3C,sBAAsB,SAAS,CAAC,IAAI;CACtC;CAEA,OACE,qBAAC,YAAD;EAAmB;EAAqB;EAAyB;EAAjE,UAAA,CACE,oBAAC,WAAW,OAAZ;GACE,GAAI;GACJ,KAAK,UAAU,OAAO,MAAM,QAAQ;GACpC,MAAM,oBAAoB,SAAS;GACrB;GACP;GACP,UAAU;GACV,QAAQ;GACR,WAAW;GACX,SAAS;GACT,aAAa;GACH;GACA;EACX,CAAA,IAEC,YAAY,YAAY,wBACxB,qBAAC,WAAW,OAAZ;GAAkB,OAAM;GAAxB,UAAA;IACG,YACC,oBAAC,gBAAD;KAAgB,WAAU;KACxB,UAAA,oBAAC,SAAD,EAAA,UAAO,kBAAsB,CAAA;IACf,CAAA;IAEjB,YACC,oBAAC,WAAW,QAAZ;KACE,cAAW;KACX,cAAc,UAAU,MAAM,eAAe;KAC7C,SAAS;KAET,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;IACT,CAAA;IAEpB,uBACC,oBAAC,WAAW,QAAZ;KACE,cAAY,GAAG,oBAAoB,kBAAkB,kBACnD,sBAAsB,KAAK,wBAAwB;KAErD,cAAc,UAAU,MAAM,eAAe;KAC7C,SAAS;KAER,UAAA,oBAAoB,oBAAC,QAAD,EAAQ,WAAU,YAAa,CAAA,IAAI,oBAAC,KAAD,EAAK,WAAU,YAAa,CAAA;IACnE,CAAA;GAEL;EAEV,CAAA,CAAA;;AAEhB"}
@@ -1,2 +1,2 @@
1
- import { SearchInput } from "../../SearchInput-Dxi2GK4n.js";
1
+ import { SearchInput } from "../../SearchInput-DyYXyw3u.js";
2
2
  export { SearchInput };
@@ -1,13 +1,13 @@
1
1
  import { cn } from "../../classNames-DcGnTh2N.js";
2
- import { keyCodes } from "../../utils-LQ4jJA-9.js";
2
+ import { keyCodes } from "../../utils-DwC9u0tM.js";
3
3
  import { ChevronDown, ChevronUp, Search } from "../../icons-ZIeZXXS7.js";
4
- import { Button } from "../../Button-D2JqBAq7.js";
4
+ import { Button } from "../../Button-BNkyYU8u.js";
5
5
  import { ButtonGroup } from "../components/ButtonGroup.js";
6
+ import { TextInput } from "../../TextInput-CR0_USaY.js";
6
7
  import { Separator } from "../components/Separator.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
- const SearchInputWithNavigation = ({ ref, value, onValueChange, placeholder = "Search...", variant = "secondary", onClear, focusVariant, currentIndex, totalResults, onNavigateNext, onNavigatePrevious, className }) => {
10
+ const SearchInputWithNavigation = ({ ref, value, onValueChange, placeholder = "Search...", onClear, focusVariant, currentIndex, totalResults, onNavigateNext, onNavigatePrevious, className }) => {
11
11
  const withControls = totalResults > 0;
12
12
  const handleKeyDown = (e) => {
13
13
  if (e.key === keyCodes.ENTER) {
@@ -22,16 +22,15 @@ const SearchInputWithNavigation = ({ ref, value, onValueChange, placeholder = "S
22
22
  placeholder,
23
23
  onValueChange,
24
24
  onClear,
25
- prefix: /* @__PURE__ */ jsx(Search, { className: "tw:size-4 tw:shrink-0 tw:text-neutral-400" }),
25
+ prefix: /* @__PURE__ */ jsx(Search, { className: "tw:size-4 tw:shrink-0 tw:text-muted-foreground" }),
26
26
  focusVariant,
27
27
  onKeyDown: handleKeyDown,
28
- variant,
29
28
  className,
30
29
  leftSuffix: /* @__PURE__ */ jsxs("div", {
31
30
  className: cn("tw:flex tw:items-center tw:gap-3", { "tw:hidden": !withControls }),
32
31
  children: [
33
32
  /* @__PURE__ */ jsxs("span", {
34
- className: "tw:text-xs tw:text-neutral-400",
33
+ className: "tw:text-xs tw:text-muted-foreground",
35
34
  children: [
36
35
  totalResults > 0 ? currentIndex ?? 0 : 0,
37
36
  "/",
@@ -1 +1 @@
1
- {"version":3,"file":"SearchInputWithNavigation.js","names":[],"sources":["../../../src/blocks/SearchInputWithNavigation/SearchInputWithNavigation.tsx"],"sourcesContent":["import type { ComponentProps, KeyboardEvent, Ref } from 'react';\n\nimport { Button } from '../../components/Button';\nimport { ButtonGroup } from '../../components/ButtonGroup';\nimport { Separator } from '../../components/Separator';\nimport { keyCodes } from '../../constants/keyCodes';\nimport { ChevronDown, ChevronUp, Search } from '../../icons';\nimport { cn } from '../../utils';\nimport { TextInput } from '../TextInput';\n\ntype SearchInputWithNavigationProps = {\n currentIndex: number | null;\n totalResults: number;\n onValueChange: (value: string) => void;\n onNavigateNext: () => void;\n onNavigatePrevious: () => void;\n\n value?: string;\n placeholder?: string;\n variant?: 'primary' | 'secondary';\n onClear?: () => void;\n focusVariant?: ComponentProps<typeof TextInput>['focusVariant'];\n className?: string;\n};\n\nexport const SearchInputWithNavigation = ({\n ref,\n value,\n onValueChange,\n placeholder = 'Search...',\n variant = 'secondary',\n onClear,\n focusVariant,\n currentIndex,\n totalResults,\n onNavigateNext,\n onNavigatePrevious,\n className,\n}: SearchInputWithNavigationProps & { ref?: Ref<HTMLInputElement> }) => {\n const withControls = totalResults > 0;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === keyCodes.ENTER) {\n e.preventDefault();\n\n e.shiftKey ? onNavigatePrevious() : onNavigateNext();\n }\n };\n\n return (\n <TextInput\n ref={ref}\n allowClear\n value={value}\n placeholder={placeholder}\n onValueChange={onValueChange}\n onClear={onClear}\n prefix={<Search className=\"tw:size-4 tw:shrink-0 tw:text-neutral-400\" />}\n focusVariant={focusVariant}\n onKeyDown={handleKeyDown}\n variant={variant}\n className={className}\n leftSuffix={\n <div\n className={cn('tw:flex tw:items-center tw:gap-3', {\n 'tw:hidden': !withControls,\n })}\n >\n <span className=\"tw:text-xs tw:text-neutral-400\">\n {totalResults > 0 ? (currentIndex ?? 0) : 0}/{totalResults}\n </span>\n <Separator orientation=\"vertical\" size=\"3/4\" />\n <ButtonGroup>\n <Button\n variant=\"inline\"\n size=\"icon-3xs\"\n onClick={onNavigatePrevious}\n disabled={!totalResults}\n >\n <ChevronUp className=\"tw:size-4\" />\n </Button>\n <Button\n variant=\"inline\"\n size=\"icon-3xs\"\n onClick={onNavigateNext}\n disabled={!totalResults}\n >\n <ChevronDown className=\"tw:size-4\" />\n </Button>\n </ButtonGroup>\n </div>\n }\n />\n );\n};\n"],"mappings":";;;;;;;;;AAyBA,MAAa,6BAA6B,EACxC,KACA,OACA,eACA,cAAc,aACd,UAAU,aACV,SACA,cACA,cACA,cACA,gBACA,oBACA,gBACsE;CACtE,MAAM,eAAe,eAAe;CAEpC,MAAM,iBAAiB,MAAqB;EAC1C,IAAI,EAAE,QAAQ,SAAS,OAAO;GAC5B,EAAE,eAAe;GAEjB,EAAE,WAAW,mBAAmB,IAAI,eAAe;EACrD;CACF;CAEA,OACE,oBAAC,WAAD;EACO;EACL,YAAA;EACO;EACM;EACE;EACN;EACT,QAAQ,oBAAC,QAAD,EAAQ,WAAU,4CAA6C,CAAA;EACzD;EACd,WAAW;EACF;EACE;EACX,YACE,qBAAC,OAAD;GACE,WAAW,GAAG,oCAAoC,EAChD,aAAa,CAAC,aAChB,CAAC;GAHH,UAAA;IAKE,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA;MACG,eAAe,IAAK,gBAAgB,IAAK;MAAE;MAAE;KAC1C;;IACN,oBAAC,WAAD;KAAW,aAAY;KAAW,MAAK;IAAO,CAAA;IAC9C,qBAAC,aAAD,EAAA,UAAA,CACE,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,SAAS;KACT,UAAU,CAAC;KAEX,UAAA,oBAAC,WAAD,EAAW,WAAU,YAAa,CAAA;IAC5B,CAAA,GACR,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,SAAS;KACT,UAAU,CAAC;KAEX,UAAA,oBAAC,aAAD,EAAa,WAAU,YAAa,CAAA;IAC9B,CAAA,CACG,EAAA,CAAA;GACV;;CAER,CAAA;AAEL"}
1
+ {"version":3,"file":"SearchInputWithNavigation.js","names":[],"sources":["../../../src/blocks/SearchInputWithNavigation/SearchInputWithNavigation.tsx"],"sourcesContent":["import type { ComponentProps, KeyboardEvent, Ref } from 'react';\n\nimport { Button } from '../../components/Button';\nimport { ButtonGroup } from '../../components/ButtonGroup';\nimport { Separator } from '../../components/Separator';\nimport { keyCodes } from '../../constants/keyCodes';\nimport { ChevronDown, ChevronUp, Search } from '../../icons';\nimport { cn } from '../../utils';\nimport { TextInput } from '../TextInput';\n\ntype SearchInputWithNavigationProps = {\n currentIndex: number | null;\n totalResults: number;\n onValueChange: (value: string) => void;\n onNavigateNext: () => void;\n onNavigatePrevious: () => void;\n\n value?: string;\n placeholder?: string;\n onClear?: () => void;\n focusVariant?: ComponentProps<typeof TextInput>['focusVariant'];\n className?: string;\n};\n\nexport const SearchInputWithNavigation = ({\n ref,\n value,\n onValueChange,\n placeholder = 'Search...',\n onClear,\n focusVariant,\n currentIndex,\n totalResults,\n onNavigateNext,\n onNavigatePrevious,\n className,\n}: SearchInputWithNavigationProps & { ref?: Ref<HTMLInputElement> }) => {\n const withControls = totalResults > 0;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === keyCodes.ENTER) {\n e.preventDefault();\n\n e.shiftKey ? onNavigatePrevious() : onNavigateNext();\n }\n };\n\n return (\n <TextInput\n ref={ref}\n allowClear\n value={value}\n placeholder={placeholder}\n onValueChange={onValueChange}\n onClear={onClear}\n prefix={<Search className=\"tw:size-4 tw:shrink-0 tw:text-muted-foreground\" />}\n focusVariant={focusVariant}\n onKeyDown={handleKeyDown}\n className={className}\n leftSuffix={\n <div\n className={cn('tw:flex tw:items-center tw:gap-3', {\n 'tw:hidden': !withControls,\n })}\n >\n <span className=\"tw:text-xs tw:text-muted-foreground\">\n {totalResults > 0 ? (currentIndex ?? 0) : 0}/{totalResults}\n </span>\n <Separator orientation=\"vertical\" size=\"3/4\" />\n <ButtonGroup>\n <Button\n variant=\"inline\"\n size=\"icon-3xs\"\n onClick={onNavigatePrevious}\n disabled={!totalResults}\n >\n <ChevronUp className=\"tw:size-4\" />\n </Button>\n <Button\n variant=\"inline\"\n size=\"icon-3xs\"\n onClick={onNavigateNext}\n disabled={!totalResults}\n >\n <ChevronDown className=\"tw:size-4\" />\n </Button>\n </ButtonGroup>\n </div>\n }\n />\n );\n};\n"],"mappings":";;;;;;;;;AAwBA,MAAa,6BAA6B,EACxC,KACA,OACA,eACA,cAAc,aACd,SACA,cACA,cACA,cACA,gBACA,oBACA,gBACsE;CACtE,MAAM,eAAe,eAAe;CAEpC,MAAM,iBAAiB,MAAqB;EAC1C,IAAI,EAAE,QAAQ,SAAS,OAAO;GAC5B,EAAE,eAAe;GAEjB,EAAE,WAAW,mBAAmB,IAAI,eAAe;EACrD;CACF;CAEA,OACE,oBAAC,WAAD;EACO;EACL,YAAA;EACO;EACM;EACE;EACN;EACT,QAAQ,oBAAC,QAAD,EAAQ,WAAU,iDAAkD,CAAA;EAC9D;EACd,WAAW;EACA;EACX,YACE,qBAAC,OAAD;GACE,WAAW,GAAG,oCAAoC,EAChD,aAAa,CAAC,aAChB,CAAC;GAHH,UAAA;IAKE,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA;MACG,eAAe,IAAK,gBAAgB,IAAK;MAAE;MAAE;KAC1C;;IACN,oBAAC,WAAD;KAAW,aAAY;KAAW,MAAK;IAAO,CAAA;IAC9C,qBAAC,aAAD,EAAA,UAAA,CACE,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,SAAS;KACT,UAAU,CAAC;KAEX,UAAA,oBAAC,WAAD,EAAW,WAAU,YAAa,CAAA;IAC5B,CAAA,GACR,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,SAAS;KACT,UAAU,CAAC;KAEX,UAAA,oBAAC,aAAD,EAAa,WAAU,YAAa,CAAA;IAC9B,CAAA,CACG,EAAA,CAAA;GACV;;CAER,CAAA;AAEL"}
@@ -1,2 +1,2 @@
1
- import { SectionNav } from "../../SectionNav-BnHOMLtE.js";
1
+ import { SectionNav } from "../../SectionNav-6hcIpZLO.js";
2
2
  export { SectionNav };
@@ -1,7 +1,7 @@
1
1
  import { ChevronDown } from "../../icons-ZIeZXXS7.js";
2
- import { Button } from "../../Button-D2JqBAq7.js";
2
+ import { Button } from "../../Button-BNkyYU8u.js";
3
3
  import { ButtonGroup } from "../components/ButtonGroup.js";
4
- import { DropdownMenu } from "../../DropdownMenu-B1gGvZoh.js";
4
+ import { DropdownMenu } from "../../DropdownMenu-Bum99mVf.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/blocks/SplitButton/SplitButton.tsx
7
7
  const iconSizeMap = {
@@ -1,5 +1,5 @@
1
1
  import { cn } from "../../classNames-DcGnTh2N.js";
2
- import { Card } from "../../Card-Bpc_ZlL4.js";
2
+ import { Card } from "../../Card-DxjGiqH8.js";
3
3
  import { cva } from "class-variance-authority";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/blocks/StatCard/StatCard.tsx
@@ -1,2 +1,2 @@
1
- import { TextInput } from "../../TextInput-K2DSDs5O.js";
1
+ import { TextInput } from "../../TextInput-CR0_USaY.js";
2
2
  export { TextInput };
@@ -1,12 +1,9 @@
1
- import { InputGroup } from "../../InputGroup-Dm014ruw.js";
1
+ import { InputGroup } from "../../InputGroup-CZv_7QlM.js";
2
2
  import { useControllableState } from "../../useControllableState-CUYXMsfz.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/blocks/Textarea/Textarea.tsx
5
- /**
6
- * Multi-line text input. Chrome resolves from the active brand automatically: a modern brand always
7
- * renders argo (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.
8
- */
9
- const Textarea = ({ ref, containerClassName, state = "default", variant, sizing, focusVariant, value: valueProp, defaultValue, onValueChange, ...rest }) => {
5
+ /** Multi-line text input in `InputGroup` chrome. */
6
+ const Textarea = ({ ref, containerClassName, state = "default", focusVariant, value: valueProp, defaultValue, onValueChange, ...rest }) => {
10
7
  const [value, setValue] = useControllableState({
11
8
  prop: valueProp === void 0 ? void 0 : valueProp ?? "",
12
9
  defaultProp: defaultValue ?? "",
@@ -14,9 +11,7 @@ const Textarea = ({ ref, containerClassName, state = "default", variant, sizing,
14
11
  });
15
12
  return /* @__PURE__ */ jsx(InputGroup, {
16
13
  state,
17
- sizing,
18
14
  focusVariant,
19
- variant,
20
15
  className: containerClassName,
21
16
  children: /* @__PURE__ */ jsx(InputGroup.TextArea, {
22
17
  ...rest,
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.js","names":[],"sources":["../../../src/blocks/Textarea/Textarea.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'sizing' | 'focusVariant' | 'state'\n>;\n\ntype TextareaNativeProps = Omit<\n ComponentProps<typeof InputGroup.TextArea>,\n 'value' | 'defaultValue' | 'rows' | 'maxRows'\n>;\n\ntype TextareaOwnProps = {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n maxRows?: number | 'unlimited';\n disableResize?: boolean;\n containerClassName?: string;\n};\n\ntype Props = InputGroupProps & TextareaNativeProps & TextareaOwnProps;\n\n/**\n * Multi-line text input. Chrome resolves from the active brand automatically: a modern brand always\n * renders argo (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.\n */\nexport const Textarea = ({\n ref,\n containerClassName,\n\n // group props\n state = 'default',\n variant,\n sizing,\n focusVariant,\n\n // value handling\n value: valueProp,\n defaultValue,\n onValueChange,\n\n ...rest\n}: Props) => {\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled, coerced to ''.\n prop: valueProp === undefined ? undefined : (valueProp ?? ''),\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n return (\n <InputGroup\n state={state}\n sizing={sizing}\n focusVariant={focusVariant}\n variant={variant}\n className={containerClassName}\n >\n <InputGroup.TextArea {...rest} ref={ref} value={value} onValueChange={setValue} />\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;AA+BA,MAAa,YAAY,EACvB,KACA,oBAGA,QAAQ,WACR,SACA,QACA,cAGA,OAAO,WACP,cACA,eAEA,GAAG,WACQ;CACX,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAErD,MAAM,cAAc,KAAA,IAAY,KAAA,IAAa,aAAa;EAC1D,aAAa,gBAAgB;EAC7B,UAAU;CACZ,CAAC;CAED,OACE,oBAAC,YAAD;EACS;EACC;EACM;EACL;EACT,WAAW;EAEX,UAAA,oBAAC,WAAW,UAAZ;GAAqB,GAAI;GAAW;GAAY;GAAO,eAAe;EAAW,CAAA;CACvE,CAAA;AAEhB"}
1
+ {"version":3,"file":"Textarea.js","names":[],"sources":["../../../src/blocks/Textarea/Textarea.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\n\ntype InputGroupProps = Pick<ComponentProps<typeof InputGroup>, 'focusVariant' | 'state'>;\n\ntype TextareaNativeProps = Omit<\n ComponentProps<typeof InputGroup.TextArea>,\n 'value' | 'defaultValue' | 'rows' | 'maxRows'\n>;\n\ntype TextareaOwnProps = {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n maxRows?: number | 'unlimited';\n disableResize?: boolean;\n containerClassName?: string;\n};\n\ntype Props = InputGroupProps & TextareaNativeProps & TextareaOwnProps;\n\n/** Multi-line text input in `InputGroup` chrome. */\nexport const Textarea = ({\n ref,\n containerClassName,\n\n // group props\n state = 'default',\n focusVariant,\n\n // value handling\n value: valueProp,\n defaultValue,\n onValueChange,\n\n ...rest\n}: Props) => {\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled, coerced to ''.\n prop: valueProp === undefined ? undefined : (valueProp ?? ''),\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n return (\n <InputGroup state={state} focusVariant={focusVariant} className={containerClassName}>\n <InputGroup.TextArea {...rest} ref={ref} value={value} onValueChange={setValue} />\n </InputGroup>\n );\n};\n"],"mappings":";;;;;AAyBA,MAAa,YAAY,EACvB,KACA,oBAGA,QAAQ,WACR,cAGA,OAAO,WACP,cACA,eAEA,GAAG,WACQ;CACX,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAErD,MAAM,cAAc,KAAA,IAAY,KAAA,IAAa,aAAa;EAC1D,aAAa,gBAAgB;EAC7B,UAAU;CACZ,CAAC;CAED,OACE,oBAAC,YAAD;EAAmB;EAAqB;EAAc,WAAW;EAC/D,UAAA,oBAAC,WAAW,UAAZ;GAAqB,GAAI;GAAW;GAAY;GAAO,eAAe;EAAW,CAAA;CACvE,CAAA;AAEhB"}
@@ -1,13 +1,13 @@
1
- import { createChangeInputEvent } from "../../utils-LQ4jJA-9.js";
1
+ import { createChangeInputEvent } from "../../utils-DwC9u0tM.js";
2
2
  import { mergeRefs } from "../utils/mergeRefs.js";
3
3
  import { Clock, X } from "../../icons-ZIeZXXS7.js";
4
- import { InputGroup } from "../../InputGroup-Dm014ruw.js";
4
+ import { InputGroup } from "../../InputGroup-CZv_7QlM.js";
5
5
  import { useControllableState } from "../../useControllableState-CUYXMsfz.js";
6
- import { TimePicker } from "../../TimePicker-DyyV3nw8.js";
6
+ import { TimePicker } from "../../TimePicker-lk3NGqeK.js";
7
7
  import { useRef, useState } from "react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/blocks/TimeInput/TimeInput.tsx
10
- const TimeInput = ({ ref, state, variant, focusVariant, sizing, className, value: valueProp, defaultValue, onValueChange, onValueBlur, onChange, onBlur, allowClear = false, disabled, readOnly, placeholder = "Select time", ...restInputProps }) => {
10
+ const TimeInput = ({ ref, state, focusVariant, className, value: valueProp, defaultValue, onValueChange, onValueBlur, onChange, onBlur, allowClear = false, disabled, readOnly, placeholder = "Select time", ...restInputProps }) => {
11
11
  const inputRef = useRef(null);
12
12
  const [isOpen, setIsOpen] = useState(false);
13
13
  const [value, setValue] = useControllableState({
@@ -36,8 +36,6 @@ const TimeInput = ({ ref, state, variant, focusVariant, sizing, className, value
36
36
  };
37
37
  return /* @__PURE__ */ jsxs(InputGroup, {
38
38
  state,
39
- variant,
40
- sizing,
41
39
  focusVariant,
42
40
  className,
43
41
  children: [/* @__PURE__ */ jsx(InputGroup.Input, {
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput.js","names":[],"sources":["../../../src/blocks/TimeInput/TimeInput.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { TimePicker } from '../../components/TimePicker';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { Clock, X } from '../../icons';\nimport { createChangeInputEvent, mergeRefs } from '../../utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string | null) => void;\n onValueBlur?: (value: string | null) => void;\n allowClear?: boolean;\n };\n\nexport const TimeInput = ({\n ref,\n\n // group props\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n // own props\n value: valueProp,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n allowClear = false,\n\n // input props\n disabled,\n readOnly,\n placeholder = 'Select time',\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n\n const [value, setValue] = useControllableState<string | null>({\n prop: valueProp,\n defaultProp: defaultValue ?? null,\n onChange: onValueChange,\n });\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n const showPicker = !disabled && !readOnly;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value || null);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n // The value is already committed on change via `setValue`, so blur only needs to notify.\n onValueBlur?.(event.target.value || null);\n onBlur?.(event);\n };\n\n const handleTimePickerSelect = (time: string) => {\n setValue(time);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue(null);\n onChange?.(createChangeInputEvent(inputRef.current));\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n <InputGroup.Input\n {...restInputProps}\n ref={mergeRefs(ref ?? null, inputRef)}\n type=\"time\"\n // Hide the native picker indicator (custom picker); zero the UA fields-wrapper padding\n // so the input isn't 2px taller than the InputGroup input.\n className=\"tw:[&::-webkit-calendar-picker-indicator]:hidden tw:[&::-webkit-datetime-edit-fields-wrapper]:py-0\"\n value={value ?? ''}\n placeholder={placeholder}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n {(canClear || showPicker) && (\n <InputGroup.Addon align=\"inline-end\">\n {canClear && (\n <InputGroup.Button\n aria-label=\"Clear time\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {showPicker && (\n <TimePicker\n open={isOpen}\n onOpenChange={setIsOpen}\n onSelect={handleTimePickerSelect}\n selected={value}\n >\n <InputGroup.Button aria-label=\"Select time\">\n <Clock className=\"tw:size-4\" />\n </InputGroup.Button>\n </TimePicker>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;;AAkCA,MAAa,aAAa,EACxB,KAGA,OACA,SACA,cACA,QACA,WAGA,OAAO,WACP,cACA,eACA,aACA,UACA,QACA,aAAa,OAGb,UACA,UACA,cAAc,eACd,GAAG,qBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAE1C,MAAM,CAAC,OAAO,YAAY,qBAAoC;EAC5D,MAAM;EACN,aAAa,gBAAgB;EAC7B,UAAU;CACZ,CAAC;CAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;CACxD,MAAM,aAAa,CAAC,YAAY,CAAC;CAEjC,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,SAAS,IAAI;EACnC,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EAEjE,cAAc,MAAM,OAAO,SAAS,IAAI;EACxC,SAAS,KAAK;CAChB;CAEA,MAAM,0BAA0B,SAAiB;EAC/C,SAAS,IAAI;CACf;CAEA,MAAM,oBAA0D;EAC9D,IAAI,CAAC,SAAS,SAAS;EACvB,SAAS,QAAQ,QAAQ;EACzB,SAAS,IAAI;EACb,WAAW,uBAAuB,SAAS,OAAO,CAAC;CACrD;CAEA,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EALb,UAAA,CAOE,oBAAC,WAAW,OAAZ;GACE,GAAI;GACJ,KAAK,UAAU,OAAO,MAAM,QAAQ;GACpC,MAAK;GAGL,WAAU;GACV,OAAO,SAAS;GACH;GACb,UAAU;GACV,QAAQ;GACE;GACA;EACX,CAAA,IAEC,YAAY,eACZ,qBAAC,WAAW,OAAZ;GAAkB,OAAM;GAAxB,UAAA,CACG,YACC,oBAAC,WAAW,QAAZ;IACE,cAAW;IACX,cAAc,UAAU,MAAM,eAAe;IAC7C,SAAS;IAET,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;GACT,CAAA,GAEpB,cACC,oBAAC,YAAD;IACE,MAAM;IACN,cAAc;IACd,UAAU;IACV,UAAU;IAEV,UAAA,oBAAC,WAAW,QAAZ;KAAmB,cAAW;KAC5B,UAAA,oBAAC,OAAD,EAAO,WAAU,YAAa,CAAA;IACb,CAAA;GACT,CAAA,CAEE;EAEV,CAAA,CAAA;;AAEhB"}
1
+ {"version":3,"file":"TimeInput.js","names":[],"sources":["../../../src/blocks/TimeInput/TimeInput.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { TimePicker } from '../../components/TimePicker';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { Clock, X } from '../../icons';\nimport { createChangeInputEvent, mergeRefs } from '../../utils';\n\ntype InputGroupProps = Pick<ComponentProps<typeof InputGroup>, 'focusVariant' | 'state'>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string | null) => void;\n onValueBlur?: (value: string | null) => void;\n allowClear?: boolean;\n };\n\nexport const TimeInput = ({\n ref,\n\n // group props\n state,\n focusVariant,\n className,\n\n // own props\n value: valueProp,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n allowClear = false,\n\n // input props\n disabled,\n readOnly,\n placeholder = 'Select time',\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n\n const [value, setValue] = useControllableState<string | null>({\n prop: valueProp,\n defaultProp: defaultValue ?? null,\n onChange: onValueChange,\n });\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n const showPicker = !disabled && !readOnly;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value || null);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n // The value is already committed on change via `setValue`, so blur only needs to notify.\n onValueBlur?.(event.target.value || null);\n onBlur?.(event);\n };\n\n const handleTimePickerSelect = (time: string) => {\n setValue(time);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue(null);\n onChange?.(createChangeInputEvent(inputRef.current));\n };\n\n return (\n <InputGroup state={state} focusVariant={focusVariant} className={className}>\n <InputGroup.Input\n {...restInputProps}\n ref={mergeRefs(ref ?? null, inputRef)}\n type=\"time\"\n // Hide the native picker indicator (custom picker); zero the UA fields-wrapper padding\n // so the input isn't 2px taller than the InputGroup input.\n className=\"tw:[&::-webkit-calendar-picker-indicator]:hidden tw:[&::-webkit-datetime-edit-fields-wrapper]:py-0\"\n value={value ?? ''}\n placeholder={placeholder}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n {(canClear || showPicker) && (\n <InputGroup.Addon align=\"inline-end\">\n {canClear && (\n <InputGroup.Button\n aria-label=\"Clear time\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {showPicker && (\n <TimePicker\n open={isOpen}\n onOpenChange={setIsOpen}\n onSelect={handleTimePickerSelect}\n selected={value}\n >\n <InputGroup.Button aria-label=\"Select time\">\n <Clock className=\"tw:size-4\" />\n </InputGroup.Button>\n </TimePicker>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;;AA+BA,MAAa,aAAa,EACxB,KAGA,OACA,cACA,WAGA,OAAO,WACP,cACA,eACA,aACA,UACA,QACA,aAAa,OAGb,UACA,UACA,cAAc,eACd,GAAG,qBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAE1C,MAAM,CAAC,OAAO,YAAY,qBAAoC;EAC5D,MAAM;EACN,aAAa,gBAAgB;EAC7B,UAAU;CACZ,CAAC;CAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;CACxD,MAAM,aAAa,CAAC,YAAY,CAAC;CAEjC,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,SAAS,IAAI;EACnC,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EAEjE,cAAc,MAAM,OAAO,SAAS,IAAI;EACxC,SAAS,KAAK;CAChB;CAEA,MAAM,0BAA0B,SAAiB;EAC/C,SAAS,IAAI;CACf;CAEA,MAAM,oBAA0D;EAC9D,IAAI,CAAC,SAAS,SAAS;EACvB,SAAS,QAAQ,QAAQ;EACzB,SAAS,IAAI;EACb,WAAW,uBAAuB,SAAS,OAAO,CAAC;CACrD;CAEA,OACE,qBAAC,YAAD;EAAmB;EAAqB;EAAyB;EAAjE,UAAA,CACE,oBAAC,WAAW,OAAZ;GACE,GAAI;GACJ,KAAK,UAAU,OAAO,MAAM,QAAQ;GACpC,MAAK;GAGL,WAAU;GACV,OAAO,SAAS;GACH;GACb,UAAU;GACV,QAAQ;GACE;GACA;EACX,CAAA,IAEC,YAAY,eACZ,qBAAC,WAAW,OAAZ;GAAkB,OAAM;GAAxB,UAAA,CACG,YACC,oBAAC,WAAW,QAAZ;IACE,cAAW;IACX,cAAc,UAAU,MAAM,eAAe;IAC7C,SAAS;IAET,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;GACT,CAAA,GAEpB,cACC,oBAAC,YAAD;IACE,MAAM;IACN,cAAc;IACd,UAAU;IACV,UAAU;IAEV,UAAA,oBAAC,WAAW,QAAZ;KAAmB,cAAW;KAC5B,UAAA,oBAAC,OAAD,EAAO,WAAU,YAAa,CAAA;IACb,CAAA;GACT,CAAA,CAEE;EAEV,CAAA,CAAA;;AAEhB"}
@@ -1,2 +1,2 @@
1
- import { Alert } from "../../Alert-CZ0dDsuk.js";
1
+ import { Alert } from "../../Alert-Chz6KZ7e.js";
2
2
  export { Alert };
@@ -1,2 +1,2 @@
1
- import { AlertModal } from "../../AlertModal-BDle9ZVQ.js";
1
+ import { AlertModal } from "../../AlertModal-DMsn62JJ.js";
2
2
  export { AlertModal };
@@ -1,5 +1,5 @@
1
1
  import { cn } from "../../classNames-DcGnTh2N.js";
2
- import { useSHA256 } from "../../utils-LQ4jJA-9.js";
2
+ import { useSHA256 } from "../../utils-DwC9u0tM.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import BoringAvatar from "boring-avatars";
5
5
  //#region src/components/Avatar.tsx