@keboola/design 13.1.3 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/AGENTS.md +68 -6
  2. package/CHANGELOG.md +196 -0
  3. package/COMPONENT-API.md +60 -50
  4. package/dist/{AIKit-BVCWP9Ks.js → AIKit-BRSZ3nY7.js} +2227 -313
  5. package/dist/AIKit-BRSZ3nY7.js.map +1 -0
  6. package/dist/{Alert-UI-CIs-1.js → Alert-CZ0dDsuk.js} +7 -7
  7. package/dist/{Alert-UI-CIs-1.js.map → Alert-CZ0dDsuk.js.map} +1 -1
  8. package/dist/{AlertModal-mbSnuuka.js → AlertModal-BDle9ZVQ.js} +6 -6
  9. package/dist/AlertModal-BDle9ZVQ.js.map +1 -0
  10. package/dist/{AppShell-WSQabK8r.js → AppShell-B03fj1j7.js} +2 -2
  11. package/dist/{AppShell-WSQabK8r.js.map → AppShell-B03fj1j7.js.map} +1 -1
  12. package/dist/{AutoSaveTextarea-C5iIr2Ts.js → AutoSaveTextarea-jiqNeeE4.js} +3 -3
  13. package/dist/{AutoSaveTextarea-C5iIr2Ts.js.map → AutoSaveTextarea-jiqNeeE4.js.map} +1 -1
  14. package/dist/{Badge-Dz0cj6rj.js → Badge-Ba3epgcI.js} +2 -2
  15. package/dist/{Badge-Dz0cj6rj.js.map → Badge-Ba3epgcI.js.map} +1 -1
  16. package/dist/{BrandEditor-P8OZX2hi.js → BrandEditor-CN2HJ_12.js} +155 -17
  17. package/dist/BrandEditor-CN2HJ_12.js.map +1 -0
  18. package/dist/{BrandLogo-CKpVSZb6.js → BrandLogo-BfITD0im.js} +2 -2
  19. package/dist/{BrandLogo-CKpVSZb6.js.map → BrandLogo-BfITD0im.js.map} +1 -1
  20. package/dist/{Breadcrumb-BUoAZyhO.js → Breadcrumb-BnIlsoIH.js} +62 -20
  21. package/dist/Breadcrumb-BnIlsoIH.js.map +1 -0
  22. package/dist/{Button-B21oVcPU.js → Button-D2JqBAq7.js} +199 -7
  23. package/dist/Button-D2JqBAq7.js.map +1 -0
  24. package/dist/{Calendar-DFtmZzbF.js → Calendar-BnKi1kPu.js} +4 -4
  25. package/dist/{Calendar-DFtmZzbF.js.map → Calendar-BnKi1kPu.js.map} +1 -1
  26. package/dist/{Card-BQmBWHXl.js → Card-Bpc_ZlL4.js} +3 -3
  27. package/dist/Card-Bpc_ZlL4.js.map +1 -0
  28. package/dist/{Checkbox-8yIIgY7g.js → Checkbox-uFE8XLT_.js} +6 -6
  29. package/dist/Checkbox-uFE8XLT_.js.map +1 -0
  30. package/dist/{Clipboard-_xf6hMDD.js → Clipboard-D-9XOqy4.js} +3 -3
  31. package/dist/{Clipboard-_xf6hMDD.js.map → Clipboard-D-9XOqy4.js.map} +1 -1
  32. package/dist/{ClipboardButton-srUgWgwH.js → ClipboardButton-DxvZG_H0.js} +4 -4
  33. package/dist/{ClipboardButton-srUgWgwH.js.map → ClipboardButton-DxvZG_H0.js.map} +1 -1
  34. package/dist/{CodeEditor-Df7VVx08.js → CodeEditor-BfRSCKEs.js} +6 -6
  35. package/dist/{CodeEditor-Df7VVx08.js.map → CodeEditor-BfRSCKEs.js.map} +1 -1
  36. package/dist/{Collapsible-BQXWEOBC.js → Collapsible-DD4xTL75.js} +2 -2
  37. package/dist/{Collapsible-BQXWEOBC.js.map → Collapsible-DD4xTL75.js.map} +1 -1
  38. package/dist/{ColorInput-B3gBZ8Ya.js → ColorInput-CDKH8q_f.js} +5 -5
  39. package/dist/{ColorInput-B3gBZ8Ya.js.map → ColorInput-CDKH8q_f.js.map} +1 -1
  40. package/dist/{ColorModeSwitch-D8Cki137.js → ColorModeSwitch-DR6J2U6M.js} +4 -4
  41. package/dist/{ColorModeSwitch-D8Cki137.js.map → ColorModeSwitch-DR6J2U6M.js.map} +1 -1
  42. package/dist/{Combobox-BNhW0TDB.js → Combobox-CEesMe2M.js} +246 -44
  43. package/dist/Combobox-CEesMe2M.js.map +1 -0
  44. package/dist/{Command-BQPiZCNz.js → Command-T3MLRaen.js} +10 -6
  45. package/dist/Command-T3MLRaen.js.map +1 -0
  46. package/dist/{CopyField-Ba7h8MqZ.js → CopyField-CNbCHw9a.js} +4 -4
  47. package/dist/{CopyField-Ba7h8MqZ.js.map → CopyField-CNbCHw9a.js.map} +1 -1
  48. package/dist/{DateInput-D0nWUasV.js → DateInput-ClK1lCxz.js} +5 -5
  49. package/dist/{DateInput-D0nWUasV.js.map → DateInput-ClK1lCxz.js.map} +1 -1
  50. package/dist/{DatePicker-CtSa9b3V.js → DatePicker-CgHAu9KX.js} +3 -3
  51. package/dist/{DatePicker-CtSa9b3V.js.map → DatePicker-CgHAu9KX.js.map} +1 -1
  52. package/dist/{DateRangeInput-i6wE45-V.js → DateRangeInput-DtlAffS1.js} +5 -5
  53. package/dist/{DateRangeInput-i6wE45-V.js.map → DateRangeInput-DtlAffS1.js.map} +1 -1
  54. package/dist/{DateRangePicker-BAnuz6vO.js → DateRangePicker-CXpXPMoh.js} +8 -8
  55. package/dist/{DateRangePicker-BAnuz6vO.js.map → DateRangePicker-CXpXPMoh.js.map} +1 -1
  56. package/dist/{DiffView-ppTIzh2h.js → DiffView-Dy4z-n-1.js} +3 -3
  57. package/dist/{DiffView-ppTIzh2h.js.map → DiffView-Dy4z-n-1.js.map} +1 -1
  58. package/dist/{DropdownMenu-BJGLjpVc.js → DropdownMenu-B1gGvZoh.js} +9 -9
  59. package/dist/DropdownMenu-B1gGvZoh.js.map +1 -0
  60. package/dist/{FieldBox-D7DYtX_m.js → FieldBox-BrxLkY9C.js} +8 -6
  61. package/dist/FieldBox-BrxLkY9C.js.map +1 -0
  62. package/dist/{FieldItem-BHViBJS3.js → FieldItem-CYvJyjiI.js} +4 -4
  63. package/dist/{FieldItem-BHViBJS3.js.map → FieldItem-CYvJyjiI.js.map} +1 -1
  64. package/dist/{FileUpload-Ch2hrIWq.js → FileUpload-D6vPG3WB.js} +9 -9
  65. package/dist/FileUpload-D6vPG3WB.js.map +1 -0
  66. package/dist/{Form-VkzfVPyT.js → Form-CD55zJiy.js} +10 -10
  67. package/dist/{Form-VkzfVPyT.js.map → Form-CD55zJiy.js.map} +1 -1
  68. package/dist/{FormGroup-CmCppxOn.js → FormGroup-DiYFdEhH.js} +4 -4
  69. package/dist/{FormGroup-CmCppxOn.js.map → FormGroup-DiYFdEhH.js.map} +1 -1
  70. package/dist/{FullScreenModal-Cwnm8WdM.js → FullScreenModal-CUuAakh3.js} +20 -6
  71. package/dist/{FullScreenModal-Cwnm8WdM.js.map → FullScreenModal-CUuAakh3.js.map} +1 -1
  72. package/dist/HoverCard-BBdPYqEf.js +31 -0
  73. package/dist/HoverCard-BBdPYqEf.js.map +1 -0
  74. package/dist/InlineEdit-D5RdunZo.js +370 -0
  75. package/dist/InlineEdit-D5RdunZo.js.map +1 -0
  76. package/dist/{InputGroup-CrlMRz4X.js → InputGroup-Dm014ruw.js} +4 -4
  77. package/dist/{InputGroup-CrlMRz4X.js.map → InputGroup-Dm014ruw.js.map} +1 -1
  78. package/dist/{Kbd-J4n1J6i4.js → Kbd-3YM7NQO4.js} +3 -3
  79. package/dist/{Kbd-J4n1J6i4.js.map → Kbd-3YM7NQO4.js.map} +1 -1
  80. package/dist/MermaidDiagram-CeiOkI60.js +199 -0
  81. package/dist/MermaidDiagram-CeiOkI60.js.map +1 -0
  82. package/dist/{Modal-BkSuS9Yz.js → Modal-DMZRswk4.js} +8 -7
  83. package/dist/Modal-DMZRswk4.js.map +1 -0
  84. package/dist/{ModalTitle-BxopkIoQ.js → ModalTitle-CTECVgL8.js} +3 -3
  85. package/dist/ModalTitle-CTECVgL8.js.map +1 -0
  86. package/dist/{MultiActionButtonGroup-AWLj1Tg7.js → MultiActionButtonGroup-CEv_txvz.js} +5 -5
  87. package/dist/{MultiActionButtonGroup-AWLj1Tg7.js.map → MultiActionButtonGroup-CEv_txvz.js.map} +1 -1
  88. package/dist/{Navbar-B_DNpv5s.js → Navbar-CtVYcRFn.js} +18 -14
  89. package/dist/Navbar-CtVYcRFn.js.map +1 -0
  90. package/dist/{OtpInput-I8B8Vjdl.js → OtpInput-CY8yCaJk.js} +4 -4
  91. package/dist/{OtpInput-I8B8Vjdl.js.map → OtpInput-CY8yCaJk.js.map} +1 -1
  92. package/dist/{PageHeader-CgfyXpf1.js → PageHeader-CL1A6jFM.js} +21 -14
  93. package/dist/PageHeader-CL1A6jFM.js.map +1 -0
  94. package/dist/{PageLayout-DiAAILuS.js → PageLayout-C9aXTpqV.js} +2 -2
  95. package/dist/{PageLayout-DiAAILuS.js.map → PageLayout-C9aXTpqV.js.map} +1 -1
  96. package/dist/{PageToolbar-C06RKIif.js → PageToolbar-B_e7HGva.js} +6 -6
  97. package/dist/{PageToolbar-C06RKIif.js.map → PageToolbar-B_e7HGva.js.map} +1 -1
  98. package/dist/{Pagination-DH3f6LN0.js → Pagination-DDp6PRqf.js} +5 -5
  99. package/dist/Pagination-DDp6PRqf.js.map +1 -0
  100. package/dist/{Popconfirm-Dhzn7sy6.js → Popconfirm-BgV6a0sl.js} +5 -5
  101. package/dist/{Popconfirm-Dhzn7sy6.js.map → Popconfirm-BgV6a0sl.js.map} +1 -1
  102. package/dist/{Popover-CEk915I1.js → Popover-BU7nGOv-.js} +3 -3
  103. package/dist/Popover-BU7nGOv-.js.map +1 -0
  104. package/dist/{RadioGroup-CYEp8Wnx.js → RadioGroup-C8EC3fqO.js} +6 -6
  105. package/dist/{RadioGroup-CYEp8Wnx.js.map → RadioGroup-C8EC3fqO.js.map} +1 -1
  106. package/dist/{Resizable-D3vYToZH.js → Resizable-D8zs0kcq.js} +2 -2
  107. package/dist/{Resizable-D3vYToZH.js.map → Resizable-D8zs0kcq.js.map} +1 -1
  108. package/dist/{Search-DmkQo716.js → Search-aaUMI4ix.js} +4 -4
  109. package/dist/{Search-DmkQo716.js.map → Search-aaUMI4ix.js.map} +1 -1
  110. package/dist/{SearchInput-D3qMkHaW.js → SearchInput-Dxi2GK4n.js} +4 -4
  111. package/dist/{SearchInput-D3qMkHaW.js.map → SearchInput-Dxi2GK4n.js.map} +1 -1
  112. package/dist/{SectionNav-I2p2uXTd.js → SectionNav-BnHOMLtE.js} +11 -11
  113. package/dist/{SectionNav-I2p2uXTd.js.map → SectionNav-BnHOMLtE.js.map} +1 -1
  114. package/dist/{Select-B4uK0QVm.js → Select-CjQgU_6K.js} +6 -6
  115. package/dist/Select-CjQgU_6K.js.map +1 -0
  116. package/dist/{Sheet-D0fAE14T.js → Sheet-utw4_rUa.js} +9 -9
  117. package/dist/Sheet-utw4_rUa.js.map +1 -0
  118. package/dist/{Sidebar-D9ytIs8V.js → Sidebar-BAmux2Uj.js} +21 -18
  119. package/dist/Sidebar-BAmux2Uj.js.map +1 -0
  120. package/dist/{Slider-B0ou9r0B.js → Slider-DbzzSDRV.js} +5 -5
  121. package/dist/{Slider-B0ou9r0B.js.map → Slider-DbzzSDRV.js.map} +1 -1
  122. package/dist/{Stepper-BLkLhfnd.js → Stepper-BBPembeK.js} +3 -3
  123. package/dist/{Stepper-BLkLhfnd.js.map → Stepper-BBPembeK.js.map} +1 -1
  124. package/dist/{Switch-DZvNePOm.js → Switch-Dw4tvQls.js} +3 -3
  125. package/dist/Switch-Dw4tvQls.js.map +1 -0
  126. package/dist/{Table-BaVT5Tkn.js → Table-CilEvpMq.js} +65 -6
  127. package/dist/Table-CilEvpMq.js.map +1 -0
  128. package/dist/{Tabs-CTDmye1N.js → Tabs-C0uvkPHc.js} +5 -5
  129. package/dist/Tabs-C0uvkPHc.js.map +1 -0
  130. package/dist/{TextInput-BWYXbfs4.js → TextInput-K2DSDs5O.js} +5 -5
  131. package/dist/{TextInput-BWYXbfs4.js.map → TextInput-K2DSDs5O.js.map} +1 -1
  132. package/dist/{ThemeProvider-VF38VfUa.js → ThemeProvider-C8yaKlM1.js} +22 -5
  133. package/dist/ThemeProvider-C8yaKlM1.js.map +1 -0
  134. package/dist/{TimePicker-CDGYrRxi.js → TimePicker-DyyV3nw8.js} +2 -2
  135. package/dist/{TimePicker-CDGYrRxi.js.map → TimePicker-DyyV3nw8.js.map} +1 -1
  136. package/dist/{Timeline-B-I6sb0M.js → Timeline-DUXgByUE.js} +3 -3
  137. package/dist/{Timeline-B-I6sb0M.js.map → Timeline-DUXgByUE.js.map} +1 -1
  138. package/dist/{Toast-NrOdDDru.js → Toast-BGnUL4jV.js} +2 -2
  139. package/dist/{Toast-NrOdDDru.js.map → Toast-BGnUL4jV.js.map} +1 -1
  140. package/dist/ToggleAllTooltip-Dlmq-yqS.js +37 -0
  141. package/dist/ToggleAllTooltip-Dlmq-yqS.js.map +1 -0
  142. package/dist/{ToggleGroup-Cy_10Mvu.js → ToggleGroup-BOz1yyz6.js} +3 -3
  143. package/dist/ToggleGroup-BOz1yyz6.js.map +1 -0
  144. package/dist/{Workbench-DmZzpkj7.js → Workbench-CxgNCs3I.js} +4 -4
  145. package/dist/{Workbench-DmZzpkj7.js.map → Workbench-CxgNCs3I.js.map} +1 -1
  146. package/dist/{ZoomableSvg-C65nta_r.js → ZoomableSvg-Dh1OstPN.js} +87 -83
  147. package/dist/ZoomableSvg-Dh1OstPN.js.map +1 -0
  148. package/dist/charts.js +1 -1
  149. package/dist/classNames-DcGnTh2N.js +21 -0
  150. package/dist/classNames-DcGnTh2N.js.map +1 -0
  151. package/dist/editors.js +6 -6
  152. package/dist/flint.js +10 -45
  153. package/dist/flint.js.map +1 -1
  154. package/dist/highlightCode-D354tCXO.js +81 -0
  155. package/dist/highlightCode-D354tCXO.js.map +1 -0
  156. package/dist/{icons-wcA70iQx.js → icons-ZIeZXXS7.js} +37 -4
  157. package/dist/icons-ZIeZXXS7.js.map +1 -0
  158. package/dist/icons.d.ts +2 -2
  159. package/dist/icons.js +2 -2
  160. package/dist/{index-B7k-09i1.d.ts → index-D-itZ3VP.d.ts} +14 -3
  161. package/dist/index.d.ts +942 -424
  162. package/dist/index.js +72 -70
  163. package/dist/internal/blocks/AIKit.js +2 -2
  164. package/dist/internal/blocks/AppShell.js +1 -1
  165. package/dist/internal/blocks/AuthLayout.js +2 -2
  166. package/dist/internal/blocks/AutoSaveTextarea.js +1 -1
  167. package/dist/internal/blocks/BrandEditor.js +1 -1
  168. package/dist/internal/blocks/ChartPanel.js +2 -2
  169. package/dist/internal/blocks/ChipEditor.js +4 -4
  170. package/dist/internal/blocks/ClipboardButton.js +1 -1
  171. package/dist/internal/blocks/ColorInput.js +1 -1
  172. package/dist/internal/blocks/ColorModeSwitch.js +1 -1
  173. package/dist/internal/blocks/Command.js +1 -1
  174. package/dist/internal/blocks/CopyField.js +1 -1
  175. package/dist/internal/blocks/DashboardHero.js +2 -2
  176. package/dist/internal/blocks/DashboardHero.js.map +1 -1
  177. package/dist/internal/blocks/DateInput.js +1 -1
  178. package/dist/internal/blocks/DateRangeInput.js +1 -1
  179. package/dist/internal/blocks/DiagramShared/DiagramSkeleton.js.map +1 -1
  180. package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
  181. package/dist/internal/blocks/ExportMenu.js +4 -4
  182. package/dist/internal/blocks/FacebookButton.js +66 -0
  183. package/dist/internal/blocks/FacebookButton.js.map +1 -0
  184. package/dist/internal/blocks/Form/connectors/ComboboxField.js +2 -2
  185. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +1 -1
  186. package/dist/internal/blocks/Form.js +1 -1
  187. package/dist/internal/blocks/FormGroup.js +1 -1
  188. package/dist/internal/blocks/GoogleButton.js +2 -2
  189. package/dist/internal/blocks/InlineEdit.js +2 -0
  190. package/dist/internal/blocks/MicrosoftButton.js +2 -2
  191. package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
  192. package/dist/internal/blocks/MultiCombobox.js +204 -68
  193. package/dist/internal/blocks/MultiCombobox.js.map +1 -1
  194. package/dist/internal/blocks/NumberInput.js +1 -1
  195. package/dist/internal/blocks/OtpInput.js +1 -1
  196. package/dist/internal/blocks/PageHeader.js +1 -1
  197. package/dist/internal/blocks/PageLayout.js +1 -1
  198. package/dist/internal/blocks/PageToolbar.js +1 -1
  199. package/dist/internal/blocks/PasswordInput.js +3 -3
  200. package/dist/internal/blocks/SearchInput.js +1 -1
  201. package/dist/internal/blocks/SearchInputWithNavigation.js +5 -5
  202. package/dist/internal/blocks/SectionNav.js +1 -1
  203. package/dist/internal/blocks/SplitButton.js +6 -5
  204. package/dist/internal/blocks/SplitButton.js.map +1 -1
  205. package/dist/internal/blocks/StatCard.js +2 -2
  206. package/dist/internal/blocks/TextInput.js +1 -1
  207. package/dist/internal/blocks/Textarea.js +1 -1
  208. package/dist/internal/blocks/TimeInput.js +4 -4
  209. package/dist/internal/components/Alert.js +1 -1
  210. package/dist/internal/components/AlertModal.js +1 -1
  211. package/dist/internal/components/Avatar.js +2 -2
  212. package/dist/internal/components/Badge.js +1 -1
  213. package/dist/internal/components/BrandLogo.js +1 -1
  214. package/dist/internal/components/Breadcrumb.js +1 -1
  215. package/dist/internal/components/Button.js +1 -1
  216. package/dist/internal/components/ButtonGroup.js +1 -1
  217. package/dist/internal/components/Calendar.js +1 -1
  218. package/dist/internal/components/Card.js +1 -1
  219. package/dist/internal/components/Checkbox.js +1 -1
  220. package/dist/internal/components/Clipboard.js +1 -1
  221. package/dist/internal/components/Collapsible.js +1 -1
  222. package/dist/internal/components/CollapsiblePanel.js +5 -5
  223. package/dist/internal/components/CollapsiblePanel.js.map +1 -1
  224. package/dist/internal/components/Combobox.js +1 -1
  225. package/dist/internal/components/DatePicker.js +1 -1
  226. package/dist/internal/components/DateRangePicker.js +1 -1
  227. package/dist/internal/components/DiffView.js +1 -1
  228. package/dist/internal/components/DotsLoader.js +1 -1
  229. package/dist/internal/components/DropdownMenu.js +1 -1
  230. package/dist/internal/components/FileUpload.js +1 -1
  231. package/dist/internal/components/FullScreenModal.js +1 -1
  232. package/dist/internal/components/HoverCard.js +1 -1
  233. package/dist/internal/components/InputGroup.js +1 -1
  234. package/dist/internal/components/Kbd.js +1 -1
  235. package/dist/internal/components/Label.js +2 -2
  236. package/dist/internal/components/Label.js.map +1 -1
  237. package/dist/internal/components/Link.js +1 -1
  238. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +2 -2
  239. package/dist/internal/components/Modal.js +1 -1
  240. package/dist/internal/components/Navbar.js +1 -1
  241. package/dist/internal/components/Pagination.js +1 -1
  242. package/dist/internal/components/PanelWithDetails.js +3 -3
  243. package/dist/internal/components/Popconfirm.js +1 -1
  244. package/dist/internal/components/Popover.js +1 -1
  245. package/dist/internal/components/Progress.js +1 -1
  246. package/dist/internal/components/RadioGroup.js +1 -1
  247. package/dist/internal/components/Resizable.js +1 -1
  248. package/dist/internal/components/ScrollArea.js +1 -1
  249. package/dist/internal/components/Search.js +1 -1
  250. package/dist/internal/components/Select.js +1 -1
  251. package/dist/internal/components/Separator.js +1 -1
  252. package/dist/internal/components/Sheet.js +1 -1
  253. package/dist/internal/components/Sidebar.js +1 -1
  254. package/dist/internal/components/Skeleton/Skeleton.js +2 -2
  255. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -1
  256. package/dist/internal/components/Skeleton/SkeletonList.js +1 -1
  257. package/dist/internal/components/Slider.js +1 -1
  258. package/dist/internal/components/SpotlightBackdrop.js +1 -1
  259. package/dist/internal/components/Stepper.js +1 -1
  260. package/dist/internal/components/Switch.js +1 -1
  261. package/dist/internal/components/Table.js +1 -1
  262. package/dist/internal/components/Tabs.js +1 -1
  263. package/dist/internal/components/ThemeProvider.js +1 -1
  264. package/dist/internal/components/TimePicker.js +1 -1
  265. package/dist/internal/components/Timeline.js +1 -1
  266. package/dist/internal/components/Toast.js +2 -2
  267. package/dist/internal/components/Toggle.js +5 -5
  268. package/dist/internal/components/Toggle.js.map +1 -1
  269. package/dist/internal/components/ToggleGroup.js +1 -1
  270. package/dist/internal/components/Tooltip.js +1 -1
  271. package/dist/internal/components/Truncated.js +2 -2
  272. package/dist/internal/components/Workbench.js +1 -1
  273. package/dist/internal/components/ZoomableSvg.js +1 -1
  274. package/dist/internal/utils.js +2 -2
  275. package/dist/markdown-editor.js +14 -14
  276. package/dist/markdown-editor.js.map +1 -1
  277. package/dist/mermaid.d.ts +1 -2
  278. package/dist/mermaid.js +1 -1
  279. package/dist/rjsf.js +101 -14
  280. package/dist/rjsf.js.map +1 -1
  281. package/dist/{styles-DBGXH5-_.js → styles-BDA5rQz3.js} +6 -6
  282. package/dist/styles-BDA5rQz3.js.map +1 -0
  283. package/dist/{styles-gzcjOyKv.js → styles-YQdM7G8c.js} +3 -3
  284. package/dist/{styles-gzcjOyKv.js.map → styles-YQdM7G8c.js.map} +1 -1
  285. package/dist/styles.css +1 -1
  286. package/dist/svgCache-Dhmbe-7i.js +26 -0
  287. package/dist/svgCache-Dhmbe-7i.js.map +1 -0
  288. package/dist/svgTransforms-Hnvev3Vs.js +38 -0
  289. package/dist/svgTransforms-Hnvev3Vs.js.map +1 -0
  290. package/dist/testing.js +1 -1
  291. package/dist/{themeTokens-7DEab0kp.js → themeTokens-l2Fsfcs7.js} +3 -12
  292. package/dist/themeTokens-l2Fsfcs7.js.map +1 -0
  293. package/dist/{toast-CyXEdaCZ.js → toast-D6Z6MOB5.js} +5 -5
  294. package/dist/toast-D6Z6MOB5.js.map +1 -0
  295. package/dist/{utils-Bd28bWgm.js → utils-LQ4jJA-9.js} +21 -5
  296. package/dist/utils-LQ4jJA-9.js.map +1 -0
  297. package/dist/vega.js +1 -1
  298. package/dist/vegaTheme-BrmVoPEz.js +49 -0
  299. package/dist/vegaTheme-BrmVoPEz.js.map +1 -0
  300. package/dist/{vegaTheme-VQMWTlBw.js → vegaTokens-Ce07C0DH.js} +36 -44
  301. package/dist/vegaTokens-Ce07C0DH.js.map +1 -0
  302. package/package.json +4 -4
  303. package/src/styles.css +183 -4
  304. package/src/theme.css +47 -3
  305. package/dist/AIKit-BVCWP9Ks.js.map +0 -1
  306. package/dist/AlertModal-mbSnuuka.js.map +0 -1
  307. package/dist/BrandEditor-P8OZX2hi.js.map +0 -1
  308. package/dist/Breadcrumb-BUoAZyhO.js.map +0 -1
  309. package/dist/Button-B21oVcPU.js.map +0 -1
  310. package/dist/Card-BQmBWHXl.js.map +0 -1
  311. package/dist/Checkbox-8yIIgY7g.js.map +0 -1
  312. package/dist/Combobox-BNhW0TDB.js.map +0 -1
  313. package/dist/Command-BQPiZCNz.js.map +0 -1
  314. package/dist/DiagramSource-C5_d8Gdj.js +0 -11
  315. package/dist/DiagramSource-C5_d8Gdj.js.map +0 -1
  316. package/dist/DropdownMenu-BJGLjpVc.js.map +0 -1
  317. package/dist/FieldBox-D7DYtX_m.js.map +0 -1
  318. package/dist/FileUpload-Ch2hrIWq.js.map +0 -1
  319. package/dist/HoverCard-B8OKu9XZ.js +0 -31
  320. package/dist/HoverCard-B8OKu9XZ.js.map +0 -1
  321. package/dist/MermaidDiagram-B30x2yV7.js +0 -302
  322. package/dist/MermaidDiagram-B30x2yV7.js.map +0 -1
  323. package/dist/Modal-BkSuS9Yz.js.map +0 -1
  324. package/dist/ModalTitle-BxopkIoQ.js.map +0 -1
  325. package/dist/Navbar-B_DNpv5s.js.map +0 -1
  326. package/dist/PageHeader-CgfyXpf1.js.map +0 -1
  327. package/dist/Pagination-DH3f6LN0.js.map +0 -1
  328. package/dist/Popover-CEk915I1.js.map +0 -1
  329. package/dist/Select-B4uK0QVm.js.map +0 -1
  330. package/dist/Sheet-D0fAE14T.js.map +0 -1
  331. package/dist/Sidebar-D9ytIs8V.js.map +0 -1
  332. package/dist/Switch-DZvNePOm.js.map +0 -1
  333. package/dist/Table-BaVT5Tkn.js.map +0 -1
  334. package/dist/Tabs-CTDmye1N.js.map +0 -1
  335. package/dist/ThemeProvider-VF38VfUa.js.map +0 -1
  336. package/dist/ToggleGroup-Cy_10Mvu.js.map +0 -1
  337. package/dist/ZoomableSvg-C65nta_r.js.map +0 -1
  338. package/dist/classNames-BzrkDnOD.js +0 -9
  339. package/dist/classNames-BzrkDnOD.js.map +0 -1
  340. package/dist/icons-wcA70iQx.js.map +0 -1
  341. package/dist/styles-DBGXH5-_.js.map +0 -1
  342. package/dist/svgTransforms-Dw2hRA-i.js +0 -51
  343. package/dist/svgTransforms-Dw2hRA-i.js.map +0 -1
  344. package/dist/themeTokens-7DEab0kp.js.map +0 -1
  345. package/dist/toast-CyXEdaCZ.js.map +0 -1
  346. package/dist/utils-Bd28bWgm.js.map +0 -1
  347. package/dist/vegaTheme-VQMWTlBw.js.map +0 -1
@@ -1,5 +1,6 @@
1
- import { cn } from "./classNames-BzrkDnOD.js";
2
- import { ChevronDown, ChevronUp, ChevronsUpDown } from "./icons-wcA70iQx.js";
1
+ import { cn } from "./classNames-DcGnTh2N.js";
2
+ import { ChevronDown, ChevronUp, ChevronsUpDown } from "./icons-ZIeZXXS7.js";
3
+ import { Skeleton } from "./internal/components/Skeleton/Skeleton.js";
3
4
  import { jsx, jsxs } from "react/jsx-runtime";
4
5
  //#region src/components/Table/TableBody.tsx
5
6
  const TableBody = ({ withBorderSeparator = true, className, ...props }) => {
@@ -36,7 +37,7 @@ const TableHead = ({ className, ...props }) => {
36
37
  //#region src/components/Table/TableHeader.tsx
37
38
  const TableHeader = ({ withShadow = false, className, ...props }) => {
38
39
  return /* @__PURE__ */ jsx("thead", {
39
- className: cn("tw:sticky tw:top-0 tw:z-10 tw:[&_tr]:bg-table-header tw:[&_tr]:hover:bg-table-header tw:[&_tr]:border-b tw:[&_tr]:border-border", { "tw:shadow-table": withShadow }, className),
40
+ className: cn("tw:sticky tw:top-0 tw:z-10 tw:bg-card tw:[&_tr]:h-11 tw:[&_tr]:hover:bg-transparent tw:[&_tr]:border-b tw:[&_tr]:border-border", { "tw:shadow-table": withShadow }, className),
40
41
  ...props
41
42
  });
42
43
  };
@@ -44,10 +45,67 @@ const TableHeader = ({ withShadow = false, className, ...props }) => {
44
45
  //#region src/components/Table/TableRow.tsx
45
46
  const TableRow = ({ ref, className, ...props }) => /* @__PURE__ */ jsx("tr", {
46
47
  ref,
47
- className: cn("tw:hover:bg-muted/50 tw:aria-selected:bg-accent tw:aria-selected:hover:bg-accent", className),
48
+ className: cn("tw:hover:bg-[var(--hover,color-mix(in_oklab,rgb(var(--muted))_50%,transparent))] tw:aria-selected:bg-selected tw:aria-selected:hover:bg-selected tw:aria-selected:text-[var(--selected-foreground,currentColor)]", className),
48
49
  ...props
49
50
  });
50
51
  //#endregion
52
+ //#region src/components/Table/TableSkeletonRows.tsx
53
+ const NAME_WIDTHS = [
54
+ "tw:w-2/5",
55
+ "tw:w-1/3",
56
+ "tw:w-1/2",
57
+ "tw:w-1/4",
58
+ "tw:w-2/5 tw:max-w-60"
59
+ ];
60
+ const widthOf = (width, row) => typeof width === "string" ? width : width[row % width.length];
61
+ const SkeletonCellContent = ({ column, row }) => {
62
+ switch (column.type) {
63
+ case "empty": return null;
64
+ case "name": return /* @__PURE__ */ jsxs("div", {
65
+ className: cn("tw:flex tw:items-center", column.gapClassName ?? "tw:gap-3.5"),
66
+ children: [column.iconClassName && /* @__PURE__ */ jsx(Skeleton, {
67
+ height: "sm",
68
+ className: cn("tw:shrink-0", column.iconClassName)
69
+ }), /* @__PURE__ */ jsxs("div", {
70
+ className: "tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:gap-1.5",
71
+ children: [/* @__PURE__ */ jsx(Skeleton, {
72
+ height: "xs",
73
+ className: widthOf(column.widthClassName ?? NAME_WIDTHS, row)
74
+ }), column.descriptionClassName && /* @__PURE__ */ jsx(Skeleton, {
75
+ height: "xxs",
76
+ className: widthOf(column.descriptionClassName, row)
77
+ })]
78
+ })]
79
+ });
80
+ default: return /* @__PURE__ */ jsx(Skeleton, {
81
+ height: "xs",
82
+ className: widthOf(column.widthClassName ?? "tw:w-3/4", row)
83
+ });
84
+ }
85
+ };
86
+ /**
87
+ * Placeholder rows in a table's own columns while its rows load.
88
+ *
89
+ * - Render inside `Table.Body` in place of the rows.
90
+ * - The first row announces `Loading {noun}` to screen readers; pass the plural noun, e.g. `jobs`.
91
+ * - The rows don't take the hover tint, as there is nothing to act on yet.
92
+ */
93
+ const TableSkeletonRows = ({ columns, noun, rows = 5 }) => Array.from({ length: rows }, (_, row) => /* @__PURE__ */ jsx(TableRow, {
94
+ className: "tw:hover:bg-transparent",
95
+ children: columns.map((column, index) => /* @__PURE__ */ jsxs(TableCell, {
96
+ className: column.className,
97
+ colSpan: column.colSpan,
98
+ children: [row === 0 && index === 0 && /* @__PURE__ */ jsx("span", {
99
+ role: "status",
100
+ className: "tw:sr-only",
101
+ children: `Loading ${noun}`
102
+ }), /* @__PURE__ */ jsx(SkeletonCellContent, {
103
+ column,
104
+ row
105
+ })]
106
+ }, index))
107
+ }, row));
108
+ //#endregion
51
109
  //#region src/components/Table/TableSortHeader.tsx
52
110
  /** Maps a sort direction to the `aria-sort` value for the enclosing `Table.Head`. */
53
111
  const tableAriaSort = (sorted) => sorted === "asc" ? "ascending" : sorted === "desc" ? "descending" : "none";
@@ -81,7 +139,7 @@ const Table = ({ borderCollapsed = true, bordered = false, containerClassName, c
81
139
  return /* @__PURE__ */ jsx("div", {
82
140
  className: cn("tw:relative tw:w-full", bordered && "tw:overflow-auto tw:rounded-[10px] tw:border tw:border-solid tw:border-border", containerClassName),
83
141
  children: /* @__PURE__ */ jsx("table", {
84
- className: cn("tw:w-full tw:caption-bottom tw:text-sm tw:text-foreground", borderCollapsed ? "tw:border-collapse" : "tw:border-separate tw:border-spacing-y-1", className),
142
+ className: cn("tw:w-full tw:caption-bottom tw:bg-card tw:text-sm tw:text-foreground", borderCollapsed ? "tw:border-collapse" : "tw:border-separate tw:border-spacing-y-1", className),
85
143
  ...props
86
144
  })
87
145
  });
@@ -93,7 +151,8 @@ Table.Row = TableRow;
93
151
  Table.Cell = TableCell;
94
152
  Table.Footer = TableFooter;
95
153
  Table.SortHeader = TableSortHeader;
154
+ Table.SkeletonRows = TableSkeletonRows;
96
155
  //#endregion
97
156
  export { Table, TableSortHeader, tableAriaSort };
98
157
 
99
- //# sourceMappingURL=Table-BaVT5Tkn.js.map
158
+ //# sourceMappingURL=Table-CilEvpMq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table-CilEvpMq.js","names":[],"sources":["../src/components/Table/TableBody.tsx","../src/components/Table/TableCell.tsx","../src/components/Table/TableFooter.tsx","../src/components/Table/TableHead.tsx","../src/components/Table/TableHeader.tsx","../src/components/Table/TableRow.tsx","../src/components/Table/TableSkeletonRows.tsx","../src/components/Table/TableSortHeader.tsx","../src/components/Table/Table.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableBody = ({\n withBorderSeparator = true,\n className,\n ...props\n}: { withBorderSeparator?: boolean } & ComponentProps<'tbody'>) => {\n return (\n <tbody\n className={cn(\n {\n 'tw:[&_tr]:border-0 tw:[&_tr]:border-b-border tw:[&_tr]:border-b tw:[&_tr]:border-solid tw:[&_tr:last-child]:border-0':\n withBorderSeparator,\n },\n className,\n )}\n {...props}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableCell = ({ className, ...props }: ComponentProps<'td'>) => {\n return <td className={cn('tw:px-3 tw:py-2', className)} {...props} />;\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableFooter = ({ className, ...props }: ComponentProps<'tfoot'>) => {\n return (\n <tfoot\n className={cn(\n 'tw:bg-muted/50 tw:border-t tw:border-border tw:font-medium tw:[&>tr]:last:border-b-0',\n className,\n )}\n {...props}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableHead = ({ className, ...props }: ComponentProps<'th'>) => {\n return (\n <th\n className={cn(\n 'tw:px-3 tw:py-2 tw:text-left tw:font-medium tw:whitespace-nowrap tw:[&:has([role=checkbox])]:pr-0 tw:[&>[role=checkbox]]:translate-y-[2px] tw:focus-within:ring-2 tw:focus-within:ring-ring/50',\n className,\n )}\n {...props}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableHeader = ({\n withShadow = false,\n className,\n ...props\n}: { withShadow?: boolean } & ComponentProps<'thead'>) => {\n return (\n <thead\n className={cn(\n // - The surface sits on `thead`, so a caller's `bg-*` replaces it at rest and on hover.\n // - `[&_tr]:hover:` (0,2,1) outranks `TableRow`'s hover tint (0,2,0): a header is not hoverable.\n 'tw:sticky tw:top-0 tw:z-10 tw:bg-card tw:[&_tr]:h-11 tw:[&_tr]:hover:bg-transparent tw:[&_tr]:border-b tw:[&_tr]:border-border',\n { 'tw:shadow-table': withShadow },\n className,\n )}\n {...props}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableRow = ({ ref, className, ...props }: ComponentProps<'tr'>) => (\n <tr\n ref={ref}\n className={cn(\n 'tw:hover:bg-[var(--hover,color-mix(in_oklab,rgb(var(--muted))_50%,transparent))] tw:aria-selected:bg-selected tw:aria-selected:hover:bg-selected tw:aria-selected:text-[var(--selected-foreground,currentColor)]',\n className,\n )}\n {...props}\n />\n);\n","import { cn } from '../../utils';\nimport { Skeleton } from '../Skeleton/Skeleton';\n\nimport { TableCell } from './TableCell';\nimport { TableRow } from './TableRow';\n\n/** A width class, or one per row so the placeholders don't line up into a block. */\ntype Width = string | string[];\n\n/**\n * What one column shows while the rows load.\n *\n * - `className` and `colSpan` match the real column's cells, so the placeholders keep their layout.\n * - `text` (default): one line of `widthClassName`.\n * - `name`: an optional icon (`gapClassName` from the lines, `tw:gap-3.5` by default), a name line\n * varied per row by default, an optional description line.\n * - `empty`: nothing, e.g. for a row's actions.\n */\nexport type TableSkeletonColumn = { className?: string; colSpan?: number } & (\n | { type?: 'text'; widthClassName?: Width }\n | {\n type: 'name';\n iconClassName?: string;\n gapClassName?: string;\n widthClassName?: Width;\n descriptionClassName?: Width;\n }\n | { type: 'empty' }\n);\n\nconst NAME_WIDTHS = ['tw:w-2/5', 'tw:w-1/3', 'tw:w-1/2', 'tw:w-1/4', 'tw:w-2/5 tw:max-w-60'];\n\nconst widthOf = (width: Width, row: number) =>\n typeof width === 'string' ? width : width[row % width.length];\n\nconst SkeletonCellContent = ({ column, row }: { column: TableSkeletonColumn; row: number }) => {\n switch (column.type) {\n case 'empty':\n return null;\n case 'name':\n return (\n <div className={cn('tw:flex tw:items-center', column.gapClassName ?? 'tw:gap-3.5')}>\n {column.iconClassName && (\n <Skeleton height=\"sm\" className={cn('tw:shrink-0', column.iconClassName)} />\n )}\n <div className=\"tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:gap-1.5\">\n <Skeleton height=\"xs\" className={widthOf(column.widthClassName ?? NAME_WIDTHS, row)} />\n {column.descriptionClassName && (\n <Skeleton height=\"xxs\" className={widthOf(column.descriptionClassName, row)} />\n )}\n </div>\n </div>\n );\n default:\n return <Skeleton height=\"xs\" className={widthOf(column.widthClassName ?? 'tw:w-3/4', row)} />;\n }\n};\n\n/**\n * Placeholder rows in a table's own columns while its rows load.\n *\n * - Render inside `Table.Body` in place of the rows.\n * - The first row announces `Loading {noun}` to screen readers; pass the plural noun, e.g. `jobs`.\n * - The rows don't take the hover tint, as there is nothing to act on yet.\n */\nexport const TableSkeletonRows = ({\n columns,\n noun,\n rows = 5,\n}: {\n columns: TableSkeletonColumn[];\n noun: string;\n rows?: number;\n}) =>\n Array.from({ length: rows }, (_, row) => (\n // oxlint-disable-next-line react/no-array-index-key -- the rows are identical placeholders\n <TableRow key={row} className=\"tw:hover:bg-transparent\">\n {columns.map((column, index) => (\n // oxlint-disable-next-line react/no-array-index-key -- columns have no id of their own\n <TableCell key={index} className={column.className} colSpan={column.colSpan}>\n {row === 0 && index === 0 && (\n <span role=\"status\" className=\"tw:sr-only\">{`Loading ${noun}`}</span>\n )}\n <SkeletonCellContent column={column} row={row} />\n </TableCell>\n ))}\n </TableRow>\n ));\n","import type { ComponentProps, ReactNode } from 'react';\n\nimport { ChevronDown, ChevronsUpDown, ChevronUp } from '../../icons';\nimport { cn } from '../../utils';\n\nexport type TableSortDirection = 'asc' | 'desc' | false;\n\n/** Maps a sort direction to the `aria-sort` value for the enclosing `Table.Head`. */\nexport const tableAriaSort = (sorted: TableSortDirection): ComponentProps<'th'>['aria-sort'] =>\n sorted === 'asc' ? 'ascending' : sorted === 'desc' ? 'descending' : 'none';\n\ntype Props = {\n /** Current sort state for this column: `'asc'`, `'desc'`, or `false` when unsorted. */\n sorted: TableSortDirection;\n children: ReactNode;\n} & Omit<ComponentProps<'button'>, 'children' | 'type'>;\n\n/**\n * Clickable column-header label with a sort-direction chevron, for use inside `Table.Head`.\n *\n * Presentational only — it owns no sort state. Pair it with your sort model (a `useState`\n * key/direction pair, or `@tanstack/react-table`'s `getToggleSortingHandler()` / `getIsSorted()`)\n * and set `aria-sort` on the enclosing `Table.Head` via {@link tableAriaSort}.\n */\nexport const TableSortHeader = ({ sorted, children, className, ...props }: Props) => {\n const Icon = sorted === false ? ChevronsUpDown : sorted === 'asc' ? ChevronUp : ChevronDown;\n return (\n <button\n className={cn(\n 'tw:group tw:flex tw:cursor-pointer tw:items-center tw:gap-1 tw:border-0 tw:bg-transparent tw:p-0 tw:font-medium tw:text-inherit',\n className,\n )}\n {...props}\n type=\"button\"\n >\n {children}\n <Icon className=\"tw:size-3 tw:text-muted-foreground\" />\n </button>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { TableBody } from './TableBody';\nimport { TableCell } from './TableCell';\nimport { TableFooter } from './TableFooter';\nimport { TableHead } from './TableHead';\nimport { TableHeader } from './TableHeader';\nimport { TableRow } from './TableRow';\nimport { TableSkeletonRows } from './TableSkeletonRows';\nimport { TableSortHeader } from './TableSortHeader';\n\n/**\n * - `borderCollapsed`: collapsed borders vs separate row spacing.\n * - `bordered`: rounded bordered container with overflow scrolling.\n */\ntype Props = {\n borderCollapsed?: boolean;\n bordered?: boolean;\n containerClassName?: string;\n} & ComponentProps<'table'>;\n\n/**\n * Presentational table for rows sharing one schema; sort/filter state is the consumer's.\n *\n * - Not for rows of differing shape — use a `Card` list.\n * - Wrap in `PageLayout.Content`.\n *\n * @see RECIPES.md#list-detail\n */\nexport const Table = ({\n borderCollapsed = true,\n bordered = false,\n containerClassName,\n className,\n ...props\n}: Props) => {\n return (\n <div\n className={cn(\n 'tw:relative tw:w-full',\n bordered && 'tw:overflow-auto tw:rounded-[10px] tw:border tw:border-solid tw:border-border',\n containerClassName,\n )}\n >\n <table\n className={cn(\n // - Semantic tokens so text and fill flip under `[data-theme='dark']`.\n // - The body sits on the card surface, like `Table.Header`.\n 'tw:w-full tw:caption-bottom tw:bg-card tw:text-sm tw:text-foreground',\n borderCollapsed ? 'tw:border-collapse' : 'tw:border-separate tw:border-spacing-y-1',\n className,\n )}\n {...props}\n />\n </div>\n );\n};\n\nTable.Header = TableHeader;\nTable.Head = TableHead;\nTable.Body = TableBody;\nTable.Row = TableRow;\nTable.Cell = TableCell;\nTable.Footer = TableFooter;\nTable.SortHeader = TableSortHeader;\nTable.SkeletonRows = TableSkeletonRows;\n"],"mappings":";;;;;AAIA,MAAa,aAAa,EACxB,sBAAsB,MACtB,WACA,GAAG,YAC8D;CACjE,OACE,oBAAC,SAAD;EACE,WAAW,GACT,EACE,wHACE,oBACJ,GACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACjBA,MAAa,aAAa,EAAE,WAAW,GAAG,YAAkC;CAC1E,OAAO,oBAAC,MAAD;EAAI,WAAW,GAAG,mBAAmB,SAAS;EAAG,GAAI;CAAQ,CAAA;AACtE;;;ACFA,MAAa,eAAe,EAAE,WAAW,GAAG,YAAqC;CAC/E,OACE,oBAAC,SAAD;EACE,WAAW,GACT,wFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACVA,MAAa,aAAa,EAAE,WAAW,GAAG,YAAkC;CAC1E,OACE,oBAAC,MAAD;EACE,WAAW,GACT,kMACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACVA,MAAa,eAAe,EAC1B,aAAa,OACb,WACA,GAAG,YACqD;CACxD,OACE,oBAAC,SAAD;EACE,WAAW,GAGT,kIACA,EAAE,mBAAmB,WAAW,GAChC,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACjBA,MAAa,YAAY,EAAE,KAAK,WAAW,GAAG,YAC5C,oBAAC,MAAD;CACO;CACL,WAAW,GACT,oNACA,SACF;CACA,GAAI;AACL,CAAA;;;ACkBH,MAAM,cAAc;CAAC;CAAY;CAAY;CAAY;CAAY;AAAsB;AAE3F,MAAM,WAAW,OAAc,QAC7B,OAAO,UAAU,WAAW,QAAQ,MAAM,MAAM,MAAM;AAExD,MAAM,uBAAuB,EAAE,QAAQ,UAAwD;CAC7F,QAAQ,OAAO,MAAf;EACE,KAAK,SACH,OAAO;EACT,KAAK,QACH,OACE,qBAAC,OAAD;GAAK,WAAW,GAAG,2BAA2B,OAAO,gBAAgB,YAAY;GAAjF,UAAA,CACG,OAAO,iBACN,oBAAC,UAAD;IAAU,QAAO;IAAK,WAAW,GAAG,eAAe,OAAO,aAAa;GAAI,CAAA,GAE7E,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,UAAD;KAAU,QAAO;KAAK,WAAW,QAAQ,OAAO,kBAAkB,aAAa,GAAG;IAAI,CAAA,GACrF,OAAO,wBACN,oBAAC,UAAD;KAAU,QAAO;KAAM,WAAW,QAAQ,OAAO,sBAAsB,GAAG;IAAI,CAAA,CAE7E;GACF,CAAA,CAAA;;EAET,SACE,OAAO,oBAAC,UAAD;GAAU,QAAO;GAAK,WAAW,QAAQ,OAAO,kBAAkB,YAAY,GAAG;EAAI,CAAA;CAChG;AACF;;;;;;;;AASA,MAAa,qBAAqB,EAChC,SACA,MACA,OAAO,QAMP,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,QAE/B,oBAAC,UAAD;CAAoB,WAAU;CAC3B,UAAA,QAAQ,KAAK,QAAQ,UAEpB,qBAAC,WAAD;EAAuB,WAAW,OAAO;EAAW,SAAS,OAAO;EAApE,UAAA,CACG,QAAQ,KAAK,UAAU,KACtB,oBAAC,QAAD;GAAM,MAAK;GAAS,WAAU;GAAc,UAAA,WAAW;EAAa,CAAA,GAEtE,oBAAC,qBAAD;GAA6B;GAAa;EAAM,CAAA,CACvC;CALK,GAAA,KAKL,CACZ;AACO,GAVK,GAUL,CACX;;;;AC/EH,MAAa,iBAAiB,WAC5B,WAAW,QAAQ,cAAc,WAAW,SAAS,eAAe;;;;;;;;AAetE,MAAa,mBAAmB,EAAE,QAAQ,UAAU,WAAW,GAAG,YAAmB;CACnF,MAAM,OAAO,WAAW,QAAQ,iBAAiB,WAAW,QAAQ,YAAY;CAChF,OACE,qBAAC,UAAD;EACE,WAAW,GACT,mIACA,SACF;EACA,GAAI;EACJ,MAAK;EANP,UAAA,CAQG,UACD,oBAAC,MAAD,EAAM,WAAU,qCAAsC,CAAA,CAChD;;AAEZ;;;;;;;;;;;ACRA,MAAa,SAAS,EACpB,kBAAkB,MAClB,WAAW,OACX,oBACA,WACA,GAAG,YACQ;CACX,OACE,oBAAC,OAAD;EACE,WAAW,GACT,yBACA,YAAY,iFACZ,kBACF;EAEA,UAAA,oBAAC,SAAD;GACE,WAAW,GAGT,wEACA,kBAAkB,uBAAuB,4CACzC,SACF;GACA,GAAI;EACL,CAAA;CACE,CAAA;AAET;AAEA,MAAM,SAAS;AACf,MAAM,OAAO;AACb,MAAM,OAAO;AACb,MAAM,MAAM;AACZ,MAAM,OAAO;AACb,MAAM,SAAS;AACf,MAAM,aAAa;AACnB,MAAM,eAAe"}
@@ -1,6 +1,6 @@
1
- import { cn } from "./classNames-BzrkDnOD.js";
2
- import { X } from "./icons-wcA70iQx.js";
3
- import { Button } from "./Button-B21oVcPU.js";
1
+ import { cn } from "./classNames-DcGnTh2N.js";
2
+ import { X } from "./icons-ZIeZXXS7.js";
3
+ import { Button } from "./Button-D2JqBAq7.js";
4
4
  import { ScrollArea } from "./internal/components/ScrollArea.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import * as RadixTabs from "@radix-ui/react-tabs";
@@ -8,7 +8,7 @@ import * as RadixTabs from "@radix-ui/react-tabs";
8
8
  const tabsListWrapperClass = "tw:shrink-0 tw:border-t-0 tw:border-x-0 tw:border-b tw:border-solid tw:border-border";
9
9
  const tabsListClass = "tw:flex tw:gap-8 tw:shrink-0 tw:w-max";
10
10
  const tabsTriggerGroupClass = "tw:group/tab-trigger-group tw:flex tw:shrink-0 tw:items-center";
11
- const tabsTriggerClass = "tw:focus-visible:outline-hidden tw:focus-visible:ring-2 tw:focus-visible:ring-inset tw:focus-visible:ring-ring tw:flex tw:justify-center tw:items-center tw:gap-1.5 tw:bg-transparent tw:shrink-0 tw:border-t-0 tw:border-x-0 tw:border-b-[3px] tw:border-solid tw:border-transparent tw:pt-2.5 tw:pb-5 tw:px-0 tw:m-0 tw:font-medium tw:leading-5 tw:text-muted-foreground tw:text-base tw:data-[state=active]:text-primary tw:data-[state=active]:border-primary tw:data-[disabled]:text-muted-foreground tw:data-[disabled]:opacity-50 tw:data-[disabled]:cursor-not-allowed tw:group-hover/tab-trigger-group:enabled:text-primary tw:group-hover/tab-trigger-group:enabled:border-primary tw:group-hover/tab-trigger-group:enabled:cursor-pointer";
11
+ const tabsTriggerClass = "tw:focus-visible:outline-hidden tw:focus-visible:ring-2 tw:focus-visible:ring-inset tw:focus-visible:ring-ring tw:flex tw:justify-center tw:items-center tw:gap-1.5 tw:bg-transparent tw:shrink-0 tw:border-t-0 tw:border-x-0 tw:border-b-[3px] tw:border-solid tw:border-transparent tw:pt-2.5 tw:pb-5 tw:px-0 tw:m-0 tw:font-medium tw:leading-5 tw:text-muted-foreground tw:text-base tw:data-[state=active]:text-primary tw:data-[state=active]:border-primary tw:data-[disabled]:text-muted-foreground tw:data-[disabled]:opacity-disabled tw:data-[disabled]:cursor-not-allowed tw:group-hover/tab-trigger-group:enabled:text-primary tw:group-hover/tab-trigger-group:enabled:border-primary tw:group-hover/tab-trigger-group:enabled:cursor-pointer";
12
12
  //#endregion
13
13
  //#region src/components/Tabs/TabsList.tsx
14
14
  const TabsList = ({ className, children, ...rest }) => /* @__PURE__ */ jsx(ScrollArea, {
@@ -71,4 +71,4 @@ const TabsContent = (props) => /* @__PURE__ */ jsx(RadixTabs.Content, {
71
71
  //#endregion
72
72
  export { Tabs, TabsContent };
73
73
 
74
- //# sourceMappingURL=Tabs-CTDmye1N.js.map
74
+ //# sourceMappingURL=Tabs-C0uvkPHc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs-C0uvkPHc.js","names":[],"sources":["../src/components/Tabs/styles.ts","../src/components/Tabs/TabsList.tsx","../src/components/Tabs/TabsTrigger.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tabs/TabsContent.tsx"],"sourcesContent":["// Directional resets (border-t-0/border-x-0), NOT border-0: under Tailwind v4 a\n// consumer app's `border-0` utility can land after design's compiled bottom-border in\n// the shared `utilities` layer and zero its width (same layer + specificity → source\n// order wins), dropping the line. With directional resets, only the bottom-border\n// utility (`border-b` on the wrapper, `border-b-[3px]` on the trigger) sets the bottom.\nexport const tabsListWrapperClass =\n 'tw:shrink-0 tw:border-t-0 tw:border-x-0 tw:border-b tw:border-solid tw:border-border';\n\nexport const tabsListClass = 'tw:flex tw:gap-8 tw:shrink-0 tw:w-max';\n\nexport const tabsTriggerGroupClass =\n 'tw:group/tab-trigger-group tw:flex tw:shrink-0 tw:items-center';\n\n// The focus ring is **inset**, not an outline. `TabsList` wraps the row in a horizontal\n// `ScrollArea`, whose viewport is `overflow-y: hidden`, and a trigger is exactly as tall as that\n// viewport — so there is 0px of slack for anything painted outside the border box, and a focus\n// outline (the browser's, or a host app's global rule) gets cropped on the top and bottom edges,\n// plus the left edge on the first trigger. Painting inside the box cannot be clipped by any\n// ancestor. Owning the affordance here is also what stops the consumer's global rule applying.\nexport const tabsTriggerClass =\n 'tw:focus-visible:outline-hidden tw:focus-visible:ring-2 tw:focus-visible:ring-inset tw:focus-visible:ring-ring tw:flex tw:justify-center tw:items-center tw:gap-1.5 tw:bg-transparent tw:shrink-0 tw:border-t-0 tw:border-x-0 tw:border-b-[3px] tw:border-solid tw:border-transparent tw:pt-2.5 tw:pb-5 tw:px-0 tw:m-0 tw:font-medium tw:leading-5 tw:text-muted-foreground tw:text-base tw:data-[state=active]:text-primary tw:data-[state=active]:border-primary tw:data-[disabled]:text-muted-foreground tw:data-[disabled]:opacity-disabled tw:data-[disabled]:cursor-not-allowed tw:group-hover/tab-trigger-group:enabled:text-primary tw:group-hover/tab-trigger-group:enabled:border-primary tw:group-hover/tab-trigger-group:enabled:cursor-pointer';\n\nexport const tabsTriggerCompactClass = 'tw:text-sm tw:pb-4';\n","import * as RadixTabs from '@radix-ui/react-tabs';\n\nimport { cn } from '../../utils';\nimport { ScrollArea } from '../ScrollArea';\n\nimport { tabsListClass, tabsListWrapperClass } from './styles';\n\ntype Props = Omit<RadixTabs.TabsListProps, 'asChild'>;\n\nexport const TabsList = ({ className, children, ...rest }: Props) => (\n <ScrollArea orientation=\"horizontal\" className={tabsListWrapperClass}>\n <RadixTabs.List {...rest} data-slot=\"tabs-list\" className={cn(tabsListClass, className)}>\n {children}\n </RadixTabs.List>\n </ScrollArea>\n);\n","import * as RadixTabs from '@radix-ui/react-tabs';\n\nimport { cn } from '../../utils';\n\nimport { tabsTriggerClass, tabsTriggerCompactClass } from './styles';\n\ntype Props = Omit<RadixTabs.TabsTriggerProps, 'asChild'> & {\n compact?: boolean;\n};\n\nexport const TabsTrigger = ({ className, compact = false, ...rest }: Props) => (\n <RadixTabs.Trigger\n data-slot=\"tabs-trigger\"\n {...rest}\n className={cn(tabsTriggerClass, compact && tabsTriggerCompactClass, className)}\n />\n);\n","import type { ReactNode } from 'react';\nimport * as RadixTabs from '@radix-ui/react-tabs';\n\nimport { X } from '../../icons';\nimport { cn } from '../../utils';\nimport { Button } from '../Button';\n\nimport { tabsTriggerGroupClass } from './styles';\nimport { TabsList } from './TabsList';\nimport { TabsTrigger } from './TabsTrigger';\n\nexport type Trigger<T extends string> = {\n value: T;\n title: ReactNode;\n onClose?: (value: T) => void;\n} & Omit<RadixTabs.TabsTriggerProps, 'title' | 'asChild'>;\n\ntype Props<T extends string> = {\n triggers: readonly Trigger<T>[];\n compact?: boolean;\n children: ReactNode;\n defaultValue?: string;\n onValueChange?: (value: T) => void;\n rootClassName?: string;\n listClassName?: string;\n triggerClassName?: string;\n triggerGroupClassName?: string;\n} & Omit<RadixTabs.TabsProps, 'onValueChange'>;\n\nexport const Tabs = <T extends string>({\n triggers,\n compact = false,\n children,\n defaultValue,\n onValueChange,\n rootClassName,\n listClassName,\n triggerClassName,\n triggerGroupClassName,\n ...rest\n}: Props<T>) => (\n <RadixTabs.Root\n {...rest}\n data-slot=\"tabs-root\"\n className={cn('tw:flex tw:flex-col tw:gap-6', rootClassName)}\n defaultValue={defaultValue ?? triggers[0]?.value}\n onValueChange={onValueChange as (value: string) => void}\n >\n <TabsList className={listClassName}>\n {triggers.map(({ value, title, onClose, className: callerClassName, ...triggerRest }) => (\n <div\n key={value}\n className={cn(tabsTriggerGroupClass, triggerGroupClassName)}\n data-slot=\"tabs-trigger-group\"\n >\n <TabsTrigger\n value={value}\n compact={compact}\n {...triggerRest}\n className={cn(triggerClassName, callerClassName)}\n >\n {title}\n </TabsTrigger>\n {onClose && (\n <Button\n type=\"button\"\n variant=\"inline\"\n size=\"icon-3xs\"\n disabled={triggerRest.disabled}\n onClick={() => onClose(value)}\n onMouseDown={(e) => e.preventDefault()}\n className=\"tw:!size-8 tw:opacity-0 tw:duration-200 tw:focus-visible:opacity-100 tw:group-focus-within/tab-trigger-group:opacity-100 tw:group-hover/tab-trigger-group:opacity-100\"\n aria-label={typeof title === 'string' ? `Close ${title}` : 'Close tab'}\n >\n <X className=\"tw:size-4\" />\n </Button>\n )}\n </div>\n ))}\n </TabsList>\n {children}\n </RadixTabs.Root>\n);\n","import * as RadixTabs from '@radix-ui/react-tabs';\n\nexport const TabsContent = (props: RadixTabs.TabsContentProps) => (\n <RadixTabs.Content data-slot=\"tabs-content\" tabIndex={-1} {...props} />\n);\n"],"mappings":";;;;;;;AAKA,MAAa,uBACX;AAEF,MAAa,gBAAgB;AAE7B,MAAa,wBACX;AAQF,MAAa,mBACX;;;ACXF,MAAa,YAAY,EAAE,WAAW,UAAU,GAAG,WACjD,oBAAC,YAAD;CAAY,aAAY;CAAa,WAAW;CAC9C,UAAA,oBAAC,UAAU,MAAX;EAAgB,GAAI;EAAM,aAAU;EAAY,WAAW,GAAG,eAAe,SAAS;EACnF;CACa,CAAA;AACN,CAAA;;;ACJd,MAAa,eAAe,EAAE,WAAW,UAAU,OAAO,GAAG,WAC3D,oBAAC,UAAU,SAAX;CACE,aAAU;CACV,GAAI;CACJ,WAAW,GAAG,kBAAkB,WAAA,sBAAoC,SAAS;AAC9E,CAAA;;;ACcH,MAAa,QAA0B,EACrC,UACA,UAAU,OACV,UACA,cACA,eACA,eACA,eACA,kBACA,uBACA,GAAG,WAEH,qBAAC,UAAU,MAAX;CACE,GAAI;CACJ,aAAU;CACV,WAAW,GAAG,gCAAgC,aAAa;CAC3D,cAAc,gBAAgB,SAAS,EAAE,EAAE;CAC5B;CALjB,UAAA,CAOE,oBAAC,UAAD;EAAU,WAAW;EAClB,UAAA,SAAS,KAAK,EAAE,OAAO,OAAO,SAAS,WAAW,iBAAiB,GAAG,kBACrE,qBAAC,OAAD;GAEE,WAAW,GAAG,uBAAuB,qBAAqB;GAC1D,aAAU;GAHZ,UAAA,CAKE,oBAAC,aAAD;IACS;IACE;IACT,GAAI;IACJ,WAAW,GAAG,kBAAkB,eAAe;IAE9C,UAAA;GACU,CAAA,GACZ,WACC,oBAAC,QAAD;IACE,MAAK;IACL,SAAQ;IACR,MAAK;IACL,UAAU,YAAY;IACtB,eAAe,QAAQ,KAAK;IAC5B,cAAc,MAAM,EAAE,eAAe;IACrC,WAAU;IACV,cAAY,OAAO,UAAU,WAAW,SAAS,UAAU;IAE3D,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;GACpB,CAAA,CAEP;EA1BE,GAAA,KA0BF,CACN;CACO,CAAA,GACT,QACa;;;;AC/ElB,MAAa,eAAe,UAC1B,oBAAC,UAAU,SAAX;CAAmB,aAAU;CAAe,UAAU;CAAI,GAAI;AAAQ,CAAA"}
@@ -1,8 +1,8 @@
1
- import { cn } from "./classNames-BzrkDnOD.js";
2
- import { createChangeInputEvent, createPrefixedString } from "./utils-Bd28bWgm.js";
1
+ import { cn } from "./classNames-DcGnTh2N.js";
2
+ import { createChangeInputEvent, createPrefixedString } from "./utils-LQ4jJA-9.js";
3
3
  import { mergeRefs } from "./internal/utils/mergeRefs.js";
4
- import { X } from "./icons-wcA70iQx.js";
5
- import { InputGroup } from "./InputGroup-CrlMRz4X.js";
4
+ import { X } from "./icons-ZIeZXXS7.js";
5
+ import { InputGroup } from "./InputGroup-Dm014ruw.js";
6
6
  import { useControllableState } from "./useControllableState-CUYXMsfz.js";
7
7
  import { useRef } from "react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -104,4 +104,4 @@ const TextInput = ({ ref: forwardedRef, state = "default", sizing = "default", c
104
104
  //#endregion
105
105
  export { TextInput };
106
106
 
107
- //# sourceMappingURL=TextInput-BWYXbfs4.js.map
107
+ //# sourceMappingURL=TextInput-K2DSDs5O.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextInput-BWYXbfs4.js","names":[],"sources":["../src/blocks/TextInput/utils.ts","../src/blocks/TextInput/TextInput.tsx"],"sourcesContent":["import { createPrefixedString } from '../../utils';\n\nexport const genInputTestId = (prefix: string = '') => {\n const ps = createPrefixedString(prefix);\n return {\n toString: () => prefix,\n inputWrapper: ps`input-wrapper`,\n input: ps`input`,\n clearButton: ps`clear-button`,\n };\n};\n","import { useRef } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { cn, createChangeInputEvent, mergeRefs } from '../../utils';\n\nimport { genInputTestId } from './utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'sizing' | 'state'\n>;\n\ntype OwnProps = {\n prefix?: ReactNode;\n /** `rightSuffixVariant=\"addon\"` truncates it; the ellipsis needs inline content (text or `<span>`). */\n rightSuffix?: ReactNode;\n rightSuffixVariant?: 'addon' | 'default';\n leftSuffix?: ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n testId?: string;\n value?: string | null;\n defaultValue?: string | null;\n /** Receives the string value; `onChange` gets the raw event. */\n onValueChange?: (value: string) => void;\n /** Receives the string value; `onBlur` gets the raw event. */\n onValueBlur?: (value: string) => void;\n type?: 'text' | 'email' | 'password' | 'datetime-local' | 'date';\n};\n\n/** Props for `TextInput`; `null` / `undefined` values are coerced to `''`. */\nexport type Props = InputGroupProps &\n OwnProps &\n Omit<ComponentProps<'input'>, 'prefix' | 'value' | 'defaultValue' | 'type' | 'accept' | 'step'>;\n\nconst sanitizeTextInputValue = (value: string | null | undefined) => {\n if (typeof value === 'string' && value.trim() === '') return '';\n return value;\n};\n\n/**\n * Standard text input with a string-only API, built on `InputGroup`.\n *\n * **When to use:** plain text / email / password / date fields outside `useAppForm`.\n * **When NOT to use:** `FormGroup.TextInput` (labelled group), `field.TextField` (validated\n * form), `SearchInput` (search).\n * **Brand:** a modern brand always renders argo and ignores `variant`.\n */\nexport const TextInput = ({\n ref: forwardedRef,\n state = 'default',\n sizing = 'default',\n className,\n prefix = null,\n rightSuffix = null,\n rightSuffixVariant = 'default',\n leftSuffix = null,\n allowClear = false,\n onClear,\n disabled = false,\n testId: prefixTestId = '',\n autoFocus = false,\n id,\n name,\n variant,\n readOnly,\n type = 'text',\n focusVariant = 'default',\n onChange,\n onBlur,\n onValueChange,\n onValueBlur,\n value: valueProp,\n defaultValue,\n ...inputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any other value (incl. `null`) is controlled.\n prop: valueProp === undefined ? undefined : (sanitizeTextInputValue(valueProp) ?? ''),\n defaultProp: sanitizeTextInputValue(defaultValue) ?? '',\n onChange: onValueChange,\n });\n\n const testId = genInputTestId(prefixTestId);\n const isClearButtonVisible = (!!value && !disabled && !readOnly) || !!onClear;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (inputRef.current === null) return;\n inputRef.current.value = ''; // keep the DOM node in sync before firing the synthetic change\n inputRef.current.focus();\n onClear?.();\n handleChange(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 data-testid={testId.inputWrapper}\n >\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n\n <InputGroup.Input\n {...inputProps}\n value={value}\n autoFocus={autoFocus}\n type={type}\n onChange={handleChange}\n onBlur={handleBlur}\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n disabled={disabled}\n id={id}\n name={name}\n readOnly={readOnly}\n data-testid={testId.input}\n />\n\n {(leftSuffix || allowClear || rightSuffix) && (\n <InputGroup.Addon\n align=\"inline-end\"\n className={cn({ 'tw:min-w-0 tw:shrink': rightSuffixVariant === 'addon' })}\n >\n {leftSuffix}\n {allowClear && isClearButtonVisible && (\n <InputGroup.Button\n aria-label=\"Clear\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n data-testid={testId.clearButton}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {rightSuffix && (\n <div\n className={cn({\n 'tw:truncate tw:min-w-0 tw:bg-muted tw:px-4 tw:-mr-4 tw:py-2.5':\n rightSuffixVariant === 'addon',\n })}\n >\n {rightSuffix}\n </div>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;;AAEA,MAAa,kBAAkB,SAAiB,OAAO;CACrD,MAAM,KAAK,qBAAqB,MAAM;CACtC,OAAO;EACL,gBAAgB;EAChB,cAAc,EAAE;EAChB,OAAO,EAAE;EACT,aAAa,EAAE;CACjB;AACF;;;ACmCA,MAAM,0BAA0B,UAAqC;CACnE,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI,OAAO;CAC7D,OAAO;AACT;;;;;;;;;AAUA,MAAa,aAAa,EACxB,KAAK,cACL,QAAQ,WACR,SAAS,WACT,WACA,SAAS,MACT,cAAc,MACd,qBAAqB,WACrB,aAAa,MACb,aAAa,OACb,SACA,WAAW,OACX,QAAQ,eAAe,IACvB,YAAY,OACZ,IACA,MACA,SACA,UACA,OAAO,QACP,eAAe,WACf,UACA,QACA,eACA,aACA,OAAO,WACP,cACA,GAAG,iBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAErD,MAAM,cAAc,KAAA,IAAY,KAAA,IAAa,uBAAuB,SAAS,KAAK;EAClF,aAAa,uBAAuB,YAAY,KAAK;EACrD,UAAU;CACZ,CAAC;CAED,MAAM,SAAS,eAAe,YAAY;CAC1C,MAAM,uBAAwB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,YAAa,CAAC,CAAC;CAEtE,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,KAAK;EAC3B,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,cAAc,MAAM,OAAO,KAAK;EAChC,SAAS,KAAK;CAChB;CAEA,MAAM,oBAA0D;EAC9D,IAAI,SAAS,YAAY,MAAM;EAC/B,SAAS,QAAQ,QAAQ;EACzB,SAAS,QAAQ,MAAM;EACvB,UAAU;EACV,aAAa,uBAAuB,SAAS,OAAO,CAAC;CACvD;CAEA,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EACX,eAAa,OAAO;EANtB,UAAA;GAQG,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAgB,UAAA;GAAyB,CAAA;GAE5E,oBAAC,WAAW,OAAZ;IACE,GAAI;IACG;IACI;IACL;IACN,UAAU;IACV,QAAQ;IACR,KAAK,UAAU,gBAAgB,MAAM,QAAQ;IACnC;IACN;IACE;IACI;IACV,eAAa,OAAO;GACrB,CAAA;IAEC,cAAc,cAAc,gBAC5B,qBAAC,WAAW,OAAZ;IACE,OAAM;IACN,WAAW,GAAG,EAAE,wBAAwB,uBAAuB,QAAQ,CAAC;IAF1E,UAAA;KAIG;KACA,cAAc,wBACb,oBAAC,WAAW,QAAZ;MACE,cAAW;MACX,cAAc,MAAM,EAAE,eAAe;MACrC,SAAS;MACT,eAAa,OAAO;MAEpB,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;KACT,CAAA;KAEpB,eACC,oBAAC,OAAD;MACE,WAAW,GAAG,EACZ,iEACE,uBAAuB,QAC3B,CAAC;MAEA,UAAA;KACE,CAAA;IAES;;EAEV;;AAEhB"}
1
+ {"version":3,"file":"TextInput-K2DSDs5O.js","names":[],"sources":["../src/blocks/TextInput/utils.ts","../src/blocks/TextInput/TextInput.tsx"],"sourcesContent":["import { createPrefixedString } from '../../utils';\n\nexport const genInputTestId = (prefix: string = '') => {\n const ps = createPrefixedString(prefix);\n return {\n toString: () => prefix,\n inputWrapper: ps`input-wrapper`,\n input: ps`input`,\n clearButton: ps`clear-button`,\n };\n};\n","import { useRef } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { cn, createChangeInputEvent, mergeRefs } from '../../utils';\n\nimport { genInputTestId } from './utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'sizing' | 'state'\n>;\n\ntype OwnProps = {\n prefix?: ReactNode;\n /** `rightSuffixVariant=\"addon\"` truncates it; the ellipsis needs inline content (text or `<span>`). */\n rightSuffix?: ReactNode;\n rightSuffixVariant?: 'addon' | 'default';\n leftSuffix?: ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n testId?: string;\n value?: string | null;\n defaultValue?: string | null;\n /** Receives the string value; `onChange` gets the raw event. */\n onValueChange?: (value: string) => void;\n /** Receives the string value; `onBlur` gets the raw event. */\n onValueBlur?: (value: string) => void;\n type?: 'text' | 'email' | 'password' | 'datetime-local' | 'date';\n};\n\n/** Props for `TextInput`; `null` / `undefined` values are coerced to `''`. */\nexport type Props = InputGroupProps &\n OwnProps &\n Omit<ComponentProps<'input'>, 'prefix' | 'value' | 'defaultValue' | 'type' | 'accept' | 'step'>;\n\nconst sanitizeTextInputValue = (value: string | null | undefined) => {\n if (typeof value === 'string' && value.trim() === '') return '';\n return value;\n};\n\n/**\n * Standard text input with a string-only API, built on `InputGroup`.\n *\n * **When to use:** plain text / email / password / date fields outside `useAppForm`.\n * **When NOT to use:** `FormGroup.TextInput` (labelled group), `field.TextField` (validated\n * form), `SearchInput` (search).\n * **Brand:** a modern brand always renders argo and ignores `variant`.\n */\nexport const TextInput = ({\n ref: forwardedRef,\n state = 'default',\n sizing = 'default',\n className,\n prefix = null,\n rightSuffix = null,\n rightSuffixVariant = 'default',\n leftSuffix = null,\n allowClear = false,\n onClear,\n disabled = false,\n testId: prefixTestId = '',\n autoFocus = false,\n id,\n name,\n variant,\n readOnly,\n type = 'text',\n focusVariant = 'default',\n onChange,\n onBlur,\n onValueChange,\n onValueBlur,\n value: valueProp,\n defaultValue,\n ...inputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any other value (incl. `null`) is controlled.\n prop: valueProp === undefined ? undefined : (sanitizeTextInputValue(valueProp) ?? ''),\n defaultProp: sanitizeTextInputValue(defaultValue) ?? '',\n onChange: onValueChange,\n });\n\n const testId = genInputTestId(prefixTestId);\n const isClearButtonVisible = (!!value && !disabled && !readOnly) || !!onClear;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (inputRef.current === null) return;\n inputRef.current.value = ''; // keep the DOM node in sync before firing the synthetic change\n inputRef.current.focus();\n onClear?.();\n handleChange(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 data-testid={testId.inputWrapper}\n >\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n\n <InputGroup.Input\n {...inputProps}\n value={value}\n autoFocus={autoFocus}\n type={type}\n onChange={handleChange}\n onBlur={handleBlur}\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n disabled={disabled}\n id={id}\n name={name}\n readOnly={readOnly}\n data-testid={testId.input}\n />\n\n {(leftSuffix || allowClear || rightSuffix) && (\n <InputGroup.Addon\n align=\"inline-end\"\n className={cn({ 'tw:min-w-0 tw:shrink': rightSuffixVariant === 'addon' })}\n >\n {leftSuffix}\n {allowClear && isClearButtonVisible && (\n <InputGroup.Button\n aria-label=\"Clear\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n data-testid={testId.clearButton}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {rightSuffix && (\n <div\n className={cn({\n 'tw:truncate tw:min-w-0 tw:bg-muted tw:px-4 tw:-mr-4 tw:py-2.5':\n rightSuffixVariant === 'addon',\n })}\n >\n {rightSuffix}\n </div>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;;AAEA,MAAa,kBAAkB,SAAiB,OAAO;CACrD,MAAM,KAAK,qBAAqB,MAAM;CACtC,OAAO;EACL,gBAAgB;EAChB,cAAc,EAAE;EAChB,OAAO,EAAE;EACT,aAAa,EAAE;CACjB;AACF;;;ACmCA,MAAM,0BAA0B,UAAqC;CACnE,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI,OAAO;CAC7D,OAAO;AACT;;;;;;;;;AAUA,MAAa,aAAa,EACxB,KAAK,cACL,QAAQ,WACR,SAAS,WACT,WACA,SAAS,MACT,cAAc,MACd,qBAAqB,WACrB,aAAa,MACb,aAAa,OACb,SACA,WAAW,OACX,QAAQ,eAAe,IACvB,YAAY,OACZ,IACA,MACA,SACA,UACA,OAAO,QACP,eAAe,WACf,UACA,QACA,eACA,aACA,OAAO,WACP,cACA,GAAG,iBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAErD,MAAM,cAAc,KAAA,IAAY,KAAA,IAAa,uBAAuB,SAAS,KAAK;EAClF,aAAa,uBAAuB,YAAY,KAAK;EACrD,UAAU;CACZ,CAAC;CAED,MAAM,SAAS,eAAe,YAAY;CAC1C,MAAM,uBAAwB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,YAAa,CAAC,CAAC;CAEtE,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,KAAK;EAC3B,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,cAAc,MAAM,OAAO,KAAK;EAChC,SAAS,KAAK;CAChB;CAEA,MAAM,oBAA0D;EAC9D,IAAI,SAAS,YAAY,MAAM;EAC/B,SAAS,QAAQ,QAAQ;EACzB,SAAS,QAAQ,MAAM;EACvB,UAAU;EACV,aAAa,uBAAuB,SAAS,OAAO,CAAC;CACvD;CAEA,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EACX,eAAa,OAAO;EANtB,UAAA;GAQG,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAgB,UAAA;GAAyB,CAAA;GAE5E,oBAAC,WAAW,OAAZ;IACE,GAAI;IACG;IACI;IACL;IACN,UAAU;IACV,QAAQ;IACR,KAAK,UAAU,gBAAgB,MAAM,QAAQ;IACnC;IACN;IACE;IACI;IACV,eAAa,OAAO;GACrB,CAAA;IAEC,cAAc,cAAc,gBAC5B,qBAAC,WAAW,OAAZ;IACE,OAAM;IACN,WAAW,GAAG,EAAE,wBAAwB,uBAAuB,QAAQ,CAAC;IAF1E,UAAA;KAIG;KACA,cAAc,wBACb,oBAAC,WAAW,QAAZ;MACE,cAAW;MACX,cAAc,MAAM,EAAE,eAAe;MACrC,SAAS;MACT,eAAa,OAAO;MAEpB,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;KACT,CAAA;KAEpB,eACC,oBAAC,OAAD;MACE,WAAW,GAAG,EACZ,iEACE,uBAAuB,QAC3B,CAAC;MAEA,UAAA;KACE,CAAA;IAES;;EAEV;;AAEhB"}
@@ -1,9 +1,9 @@
1
- import { TooltipProvider } from "./utils-Bd28bWgm.js";
1
+ import { TooltipProvider } from "./utils-LQ4jJA-9.js";
2
2
  import { DEFAULT_BRANDS, createCssVars, createTheme, defaultBrand } from "./defaults-i_xG2F_1.js";
3
3
  import { ThemeContext, useTheme } from "./context-U293r3v-.js";
4
4
  import { ThemeScopeContainerContext, ThemeScopeSchemeContext, useBrandState, useColorSchemeState } from "./useColorSchemeState-Cw4MCXUs.js";
5
- import { Slot } from "@radix-ui/react-slot";
6
5
  import { use, useEffect, useInsertionEffect, useMemo, useRef, useState } from "react";
6
+ import { Slot } from "@radix-ui/react-slot";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import { agnes, brandSchema, exampleCustomer, harbor, keboola as keboola$1, keboolaLegacySidebar as keboolaLegacySidebar$1 } from "@keboola/brand-registry";
9
9
  //#region src/components/ThemeProvider/AIGradientSvg.tsx
@@ -58,9 +58,10 @@ const brandThemeToTokens = (theme, scheme) => ({
58
58
  shadows: theme.shadows,
59
59
  spacing: theme.spacing,
60
60
  motion: theme.motion,
61
- gradient: theme.gradient
61
+ gradient: theme.gradient,
62
+ opacity: theme.opacity
62
63
  });
63
- const tokensToCssVars = ({ colors, typography, radii, shadows, spacing, motion, gradient }) => {
64
+ const tokensToCssVars = ({ colors, typography, radii, shadows, spacing, motion, gradient, opacity }) => {
64
65
  const vars = createCssVars();
65
66
  vars.set("--background", colors?.background);
66
67
  vars.set("--foreground", colors?.foreground);
@@ -89,6 +90,12 @@ const tokensToCssVars = ({ colors, typography, radii, shadows, spacing, motion,
89
90
  vars.set("--warning-foreground", colors?.warningForeground);
90
91
  vars.set("--info", colors?.info);
91
92
  vars.set("--info-foreground", colors?.infoForeground);
93
+ vars.set("--hover", colors?.hover);
94
+ vars.set("--hover-foreground", colors?.hoverForeground);
95
+ vars.set("--pressed", colors?.pressed);
96
+ vars.set("--selected", colors?.selected);
97
+ vars.set("--selected-foreground", colors?.selectedForeground);
98
+ vars.set("--scrim", colors?.scrim);
92
99
  vars.set("--chart-1", colors?.chart?.chart1);
93
100
  vars.set("--chart-2", colors?.chart?.chart2);
94
101
  vars.set("--chart-3", colors?.chart?.chart3);
@@ -100,6 +107,10 @@ const tokensToCssVars = ({ colors, typography, radii, shadows, spacing, motion,
100
107
  vars.set("--sidebar-primary-foreground", colors?.sidebar?.sidebarPrimaryForeground);
101
108
  vars.set("--sidebar-accent", colors?.sidebar?.sidebarAccent);
102
109
  vars.set("--sidebar-accent-foreground", colors?.sidebar?.sidebarAccentForeground);
110
+ vars.set("--sidebar-hover", colors?.sidebar?.sidebarHover);
111
+ vars.set("--sidebar-hover-foreground", colors?.sidebar?.sidebarHoverForeground);
112
+ vars.set("--sidebar-selected", colors?.sidebar?.sidebarSelected);
113
+ vars.set("--sidebar-selected-foreground", colors?.sidebar?.sidebarSelectedForeground);
103
114
  vars.set("--sidebar-border", colors?.sidebar?.sidebarBorder);
104
115
  vars.set("--sidebar-ring", colors?.sidebar?.sidebarRing);
105
116
  vars.set("--font-sans", typography?.fontFamily?.trim() || void 0);
@@ -125,6 +136,11 @@ const tokensToCssVars = ({ colors, typography, radii, shadows, spacing, motion,
125
136
  vars.set("--radius-sm", radii?.sm);
126
137
  vars.set("--radius-md", radii?.md);
127
138
  vars.set("--radius-lg", radii?.lg);
139
+ vars.set("--radius-card", radii?.card);
140
+ vars.set("--radius-popover", radii?.popover);
141
+ vars.set("--radius-modal", radii?.modal);
142
+ vars.set("--radius-sheet", radii?.sheet);
143
+ vars.set("--radius-toast", radii?.toast);
128
144
  vars.set("--shadow-sm", shadows?.sm);
129
145
  vars.set("--shadow-md", shadows?.md);
130
146
  vars.set("--shadow-lg", shadows?.lg);
@@ -134,6 +150,7 @@ const tokensToCssVars = ({ colors, typography, radii, shadows, spacing, motion,
134
150
  vars.set("--motion-duration", motion?.duration);
135
151
  vars.set("--motion-easing", motion?.easing);
136
152
  vars.set("--gradient-brand", gradient?.brand);
153
+ vars.set("--disabled-opacity", opacity?.disabled);
137
154
  return vars.expose();
138
155
  };
139
156
  const setTokens = (node, vars) => {
@@ -263,4 +280,4 @@ const ThemeScope = ({ scheme, className, children }) => {
263
280
  //#endregion
264
281
  export { ThemeProvider, ThemeScope, agnes, brandSchema, exampleCustomer, harbor, keboola$1 as keboola, keboolaLegacySidebar$1 as keboolaLegacySidebar, useThemeScopeContainer };
265
282
 
266
- //# sourceMappingURL=ThemeProvider-VF38VfUa.js.map
283
+ //# sourceMappingURL=ThemeProvider-C8yaKlM1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeProvider-C8yaKlM1.js","names":[],"sources":["../src/components/ThemeProvider/AIGradientSvg.tsx","../src/components/ThemeProvider/useThemeTokens.ts","../src/components/ThemeProvider/ThemeProvider.tsx","../src/components/ThemeProvider/ThemeScope.tsx"],"sourcesContent":["export const AIGradientsSvg = () => (\n <svg width=\"0\" height=\"0\" style={{ position: 'absolute', visibility: 'hidden' }}>\n <defs>\n {/*aigradient-600*/}\n <linearGradient id=\"aigradient-600\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#61E4FF\" />\n <stop offset=\"50%\" stopColor=\"#1F8FFF\" />\n <stop offset=\"100%\" stopColor=\"#7C5CFF\" />\n </linearGradient>\n\n {/*aigradient-700*/}\n <linearGradient id=\"aigradient-700\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#075fb8\" />\n <stop offset=\"100%\" stopColor=\"#5b2cb8\" />\n </linearGradient>\n </defs>\n </svg>\n);\n","import { useInsertionEffect } from 'react';\n\nimport type {\n BrandTheme,\n Colors,\n Gradient,\n Motion,\n Opacity,\n Radii,\n Shadows,\n Spacing,\n Typography,\n} from '@keboola/brand-registry';\n\nimport type { ResolvedColorScheme } from './types';\nimport { createCssVars } from './utils';\n\nexport type ThemeTokens = {\n colors?: Colors;\n typography?: Typography;\n radii?: Radii;\n shadows?: Shadows;\n spacing?: Spacing;\n motion?: Motion;\n gradient?: Gradient;\n opacity?: Opacity;\n};\n\nexport const brandThemeToTokens = (\n theme: BrandTheme,\n scheme: ResolvedColorScheme,\n): ThemeTokens => ({\n colors: scheme === 'dark' ? theme.colorsDark : theme.colors,\n typography: theme.typography,\n radii: theme.radii,\n // Scheme-independent — the same values apply in light and dark.\n shadows: theme.shadows,\n spacing: theme.spacing,\n motion: theme.motion,\n gradient: theme.gradient,\n opacity: theme.opacity,\n});\n\nexport const tokensToCssVars = ({\n colors,\n typography,\n radii,\n shadows,\n spacing,\n motion,\n gradient,\n opacity,\n}: ThemeTokens): Record<string, string> => {\n const vars = createCssVars();\n\n vars.set('--background', colors?.background);\n vars.set('--foreground', colors?.foreground);\n vars.set('--muted', colors?.muted);\n vars.set('--muted-foreground', colors?.mutedForeground);\n vars.set('--border', colors?.border);\n vars.set('--input', colors?.input);\n vars.set('--input-background', colors?.inputBackground);\n vars.set('--ring', colors?.ring);\n vars.set('--ring-offset', colors?.ringOffset);\n vars.set('--primary', colors?.primary);\n vars.set('--primary-foreground', colors?.primaryForeground);\n vars.set('--secondary', colors?.secondary);\n vars.set('--secondary-foreground', colors?.secondaryForeground);\n vars.set('--accent', colors?.accent);\n vars.set('--accent-foreground', colors?.accentForeground);\n vars.set('--card', colors?.card);\n vars.set('--card-foreground', colors?.cardForeground);\n vars.set('--popover', colors?.popover);\n vars.set('--popover-foreground', colors?.popoverForeground);\n vars.set('--destructive', colors?.destructive);\n vars.set('--destructive-foreground', colors?.destructiveForeground);\n vars.set('--success', colors?.success);\n vars.set('--success-foreground', colors?.successForeground);\n vars.set('--warning', colors?.warning);\n vars.set('--warning-foreground', colors?.warningForeground);\n vars.set('--info', colors?.info);\n vars.set('--info-foreground', colors?.infoForeground);\n\n // Full CSS colours, not channels — read as `var(--hover, …)`, never wrapped in `rgb()`.\n vars.set('--hover', colors?.hover);\n vars.set('--hover-foreground', colors?.hoverForeground);\n vars.set('--pressed', colors?.pressed);\n vars.set('--selected', colors?.selected);\n vars.set('--selected-foreground', colors?.selectedForeground);\n vars.set('--scrim', colors?.scrim);\n\n vars.set('--chart-1', colors?.chart?.chart1);\n vars.set('--chart-2', colors?.chart?.chart2);\n vars.set('--chart-3', colors?.chart?.chart3);\n vars.set('--chart-4', colors?.chart?.chart4);\n vars.set('--chart-5', colors?.chart?.chart5);\n\n vars.set('--sidebar', colors?.sidebar?.sidebar);\n vars.set('--sidebar-foreground', colors?.sidebar?.sidebarForeground);\n vars.set('--sidebar-primary', colors?.sidebar?.sidebarPrimary);\n vars.set('--sidebar-primary-foreground', colors?.sidebar?.sidebarPrimaryForeground);\n vars.set('--sidebar-accent', colors?.sidebar?.sidebarAccent);\n vars.set('--sidebar-accent-foreground', colors?.sidebar?.sidebarAccentForeground);\n vars.set('--sidebar-hover', colors?.sidebar?.sidebarHover);\n vars.set('--sidebar-hover-foreground', colors?.sidebar?.sidebarHoverForeground);\n vars.set('--sidebar-selected', colors?.sidebar?.sidebarSelected);\n vars.set('--sidebar-selected-foreground', colors?.sidebar?.sidebarSelectedForeground);\n vars.set('--sidebar-border', colors?.sidebar?.sidebarBorder);\n vars.set('--sidebar-ring', colors?.sidebar?.sidebarRing);\n\n vars.set('--font-sans', typography?.fontFamily?.trim() || undefined);\n vars.set('--font-display', typography?.fontDisplay?.trim() || undefined);\n vars.set('--font-mono', typography?.fontMono?.trim() || undefined);\n\n // Chrome font-weight slots — read by Tailwind's `fontWeight` scale.\n vars.set('--font-weight-normal', typography?.weight?.normal);\n vars.set('--font-weight-medium', typography?.weight?.medium);\n vars.set('--font-weight-semibold', typography?.weight?.semibold);\n vars.set('--font-weight-bold', typography?.weight?.bold);\n\n // Chrome tracking — behind Button/Badge `tracking-chrome`.\n vars.set('--letter-spacing-chrome', typography?.letterSpacing?.chrome);\n\n // Type scale — display/heading/body steps read by `text-display/heading/body`.\n vars.set('--type-display-size', typography?.typeScale?.display?.size);\n vars.set('--type-display-weight', typography?.typeScale?.display?.weight);\n vars.set('--type-display-leading', typography?.typeScale?.display?.leading);\n vars.set('--type-display-tracking', typography?.typeScale?.display?.tracking);\n vars.set('--type-heading-size', typography?.typeScale?.heading?.size);\n vars.set('--type-heading-weight', typography?.typeScale?.heading?.weight);\n vars.set('--type-heading-leading', typography?.typeScale?.heading?.leading);\n vars.set('--type-heading-tracking', typography?.typeScale?.heading?.tracking);\n vars.set('--type-body-size', typography?.typeScale?.body?.size);\n vars.set('--type-body-weight', typography?.typeScale?.body?.weight);\n vars.set('--type-body-leading', typography?.typeScale?.body?.leading);\n vars.set('--type-body-tracking', typography?.typeScale?.body?.tracking);\n\n vars.set('--radius-sm', radii?.sm);\n vars.set('--radius-md', radii?.md);\n vars.set('--radius-lg', radii?.lg);\n vars.set('--radius-card', radii?.card);\n vars.set('--radius-popover', radii?.popover);\n vars.set('--radius-modal', radii?.modal);\n vars.set('--radius-sheet', radii?.sheet);\n vars.set('--radius-toast', radii?.toast);\n\n vars.set('--shadow-sm', shadows?.sm);\n vars.set('--shadow-md', shadows?.md);\n vars.set('--shadow-lg', shadows?.lg);\n vars.set('--shadow-lift', shadows?.lift);\n\n vars.set('--space-gutter', spacing?.gutter);\n vars.set('--space-inset', spacing?.inset);\n\n vars.set('--motion-duration', motion?.duration);\n vars.set('--motion-easing', motion?.easing);\n\n vars.set('--gradient-brand', gradient?.brand);\n\n vars.set('--disabled-opacity', opacity?.disabled);\n\n return vars.expose();\n};\n\nconst setTokens = (node: HTMLElement, vars: Record<string, string>) => {\n for (const [name, value] of Object.entries(vars)) {\n node.style.setProperty(name, value);\n }\n};\n\nconst removeTokens = (node: HTMLElement, vars: Record<string, string>) => {\n for (const name of Object.keys(vars)) {\n node.style.removeProperty(name);\n }\n};\n\n/**\n * Writes a brand's token overrides as inline custom properties.\n *\n * - `target` defaults to `<html>`; an element scopes them to its subtree (`ThemeScope`).\n * - A brand injects resolved `--color-*` aliases that `[data-theme='dark']` does not re-point,\n * so a nested scheme must re-inject its own values or light colours leak into dark.\n */\nexport const useThemeTokens = (tokens: ThemeTokens, target?: HTMLElement | null) => {\n // Runs before any descendant layout effect measures token-dependent geometry.\n // Unset slots fall through to the stylesheet's defaults.\n useInsertionEffect(() => {\n if (typeof document === 'undefined') return;\n // `undefined` = app-wide; `null` = scope node not mounted yet.\n const node = target === undefined ? document.documentElement : target;\n if (!node) return;\n\n const vars = tokensToCssVars(tokens);\n\n setTokens(node, vars);\n\n return () => removeTokens(node, vars);\n }, [tokens, target]);\n};\n","import { type ReactNode, useMemo } from 'react';\n\nimport type { Brand } from '@keboola/brand-registry';\n\nimport { TooltipProvider } from '../Tooltip';\n\nimport { AIGradientsSvg } from './AIGradientSvg';\nimport { ThemeContext, type ThemeContextValue } from './context';\nimport { DEFAULT_BRANDS, defaultBrand } from './defaults';\nimport { type UseBrandOptions, useBrandState } from './useBrandState';\nimport { type UseColorSchemeOptions, useColorSchemeState } from './useColorSchemeState';\nimport { brandThemeToTokens, useThemeTokens } from './useThemeTokens';\nimport { createTheme } from './utils';\n\ntype Props = UseColorSchemeOptions &\n UseBrandOptions & {\n /** Brands this provider knows about; the active brand id resolves against these. */\n brands?: readonly Brand[];\n children: ReactNode;\n };\n\nexport const ThemeProvider = ({\n defaultScheme,\n scheme,\n onSchemeChange,\n defaultBrandId,\n brandId,\n onBrandIdChange,\n brands = DEFAULT_BRANDS,\n children,\n}: Props) => {\n const colorSchemeState = useColorSchemeState({\n defaultScheme,\n scheme,\n onSchemeChange,\n });\n\n const brandState = useBrandState({\n defaultBrandId,\n brandId,\n onBrandIdChange,\n });\n\n // Resolve the active brand; an unknown id (incl. the default sentinel) falls\n // back to `defaultBrand`, whose empty theme injects nothing so the stylesheet\n // defaults apply.\n const brand = useMemo(\n () => brands.find((item) => item.id === brandState.brandId) ?? defaultBrand,\n [brands, brandState.brandId],\n );\n const themes = useMemo(() => brands.map(createTheme), [brands]);\n const currentTheme = useMemo(() => createTheme(brand), [brand]);\n\n // Only the brand's overrides for the resolved scheme are injected; every slot\n // it omits (including a missing dark palette) falls through to the stylesheet's\n // `:root` / `[data-theme='dark']` defaults — so dark mode works for any brand.\n const themeTokens = useMemo(\n () => brandThemeToTokens(brand.theme, colorSchemeState.resolvedScheme),\n [brand, colorSchemeState.resolvedScheme],\n );\n\n useThemeTokens(themeTokens);\n\n const { scheme: activeScheme, resolvedScheme, setScheme } = colorSchemeState;\n const { brandId: activeBrandId, setBrand } = brandState;\n const context = useMemo<ThemeContextValue>(\n () => ({\n scheme: activeScheme,\n resolvedScheme,\n setScheme,\n brandId: activeBrandId,\n setBrand,\n themes,\n currentTheme,\n brandTheme: brand.theme,\n }),\n [activeScheme, resolvedScheme, setScheme, activeBrandId, setBrand, themes, currentTheme, brand],\n );\n\n return (\n <ThemeContext value={context}>\n <AIGradientsSvg />\n <TooltipProvider>{children}</TooltipProvider>\n </ThemeContext>\n );\n};\n","import { type ReactNode, use, useEffect, useMemo, useRef, useState } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { useTheme } from './context';\nimport { ThemeScopeContainerContext, ThemeScopeSchemeContext } from './themeScopeContext';\nimport type { ColorScheme, ResolvedColorScheme } from './types';\nimport { brandThemeToTokens, tokensToCssVars, useThemeTokens } from './useThemeTokens';\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\n\n// Overlays portal to <body>, outside the scope; pass this as their `container` to keep its tokens.\n/** The scope's themed portal container, or `null` outside a `ThemeScope`. */\nexport const useThemeScopeContainer = () => use(ThemeScopeContainerContext);\n\nconst useResolvedScheme = (scheme: ColorScheme): ResolvedColorScheme => {\n const [systemPrefersDark, setSystemPrefersDark] = useState(\n () => globalThis.matchMedia?.(DARK_QUERY).matches ?? false,\n );\n\n useEffect(() => {\n const query = globalThis.matchMedia?.(DARK_QUERY);\n if (!query) return;\n\n const onChange = (event: MediaQueryListEvent) => setSystemPrefersDark(event.matches);\n query.addEventListener('change', onChange);\n\n return () => query.removeEventListener('change', onChange);\n }, []);\n\n if (scheme === 'system') return systemPrefersDark ? 'dark' : 'light';\n\n return scheme;\n};\n\ntype Props = {\n /** Colour scheme for this subtree. `system` follows the OS preference. */\n scheme: ColorScheme;\n /** Merged onto the child element. */\n className?: string;\n /** A single element to theme. Its props are merged — no wrapper is rendered. */\n children: ReactNode;\n};\n\n/**\n * Runs one subtree in its own colour scheme.\n *\n * - Also re-injects the brand's tokens for its scheme: a bare `data-theme` only re-points raw\n * tokens, not the brand's inline vars inherited from `<html>`.\n * - Renders no wrapper: one would break direct-child selectors like `[data-fill=true] > &`.\n */\nexport const ThemeScope = ({ scheme, className, children }: Props) => {\n const { brandTheme } = useTheme();\n const resolvedScheme = useResolvedScheme(scheme);\n const [portalContainer, setPortalContainer] = useState<HTMLDivElement | null>(null);\n\n const tokens = useMemo(\n () => brandThemeToTokens(brandTheme, resolvedScheme),\n [brandTheme, resolvedScheme],\n );\n const style = useMemo(() => tokensToCssVars(tokens), [tokens]);\n\n useThemeTokens(tokens, portalContainer);\n\n // Keeps the container from being rebuilt on every scheme flip.\n const schemeRef = useRef(resolvedScheme);\n schemeRef.current = resolvedScheme;\n\n useEffect(() => {\n const container = document.createElement('div');\n container.dataset.themeScopePortal = '';\n // Set before publishing, or a consumer would read and cache the page's palette.\n container.dataset.theme = schemeRef.current;\n document.body.append(container);\n setPortalContainer(container);\n\n return () => container.remove();\n }, []);\n\n // Keeps an existing container in step; the creation above covers the first commit.\n useEffect(() => {\n portalContainer?.setAttribute('data-theme', resolvedScheme);\n }, [portalContainer, resolvedScheme]);\n\n return (\n <ThemeScopeContainerContext value={portalContainer}>\n {/* Canvases (charts, editors) build palettes from this scope's scheme, not the page's. */}\n <ThemeScopeSchemeContext value={resolvedScheme}>\n <Slot data-theme={resolvedScheme} className={className} style={style}>\n {children}\n </Slot>\n </ThemeScopeSchemeContext>\n </ThemeScopeContainerContext>\n );\n};\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ScrollArea } from "./internal/components/ScrollArea.js";
2
2
  import { Toggle } from "./internal/components/Toggle.js";
3
- import { Popover } from "./Popover-CEk915I1.js";
3
+ import { Popover } from "./Popover-BU7nGOv-.js";
4
4
  import { useState } from "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/components/TimePicker/utils.ts
@@ -95,4 +95,4 @@ const TimePicker = ({ align = "end", alignOffset = -18, children, defaultOpen, d
95
95
  //#endregion
96
96
  export { TimePicker, formatTime, pad, parseTime };
97
97
 
98
- //# sourceMappingURL=TimePicker-CDGYrRxi.js.map
98
+ //# sourceMappingURL=TimePicker-DyyV3nw8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker-CDGYrRxi.js","names":[],"sources":["../src/components/TimePicker/utils.ts","../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["export const pad = (n: number) => n.toString().padStart(2, '0');\n\n/** The \"HH:mm\" shape `parseTime` parses back. */\nexport const formatTime = (hour: number, minute: number) => `${pad(hour)}:${pad(minute)}`;\n\nexport const parseTime = (time?: string | null) => {\n if (!time) return { hour: null, minute: null };\n\n const match = /^(\\d{1,2}):(\\d{1,2})$/.exec(time.trim());\n if (!match) return { hour: null, minute: null };\n\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n if (\n Number.isNaN(hour) ||\n Number.isNaN(minute) ||\n hour < 0 ||\n hour > 23 ||\n minute < 0 ||\n minute > 59\n )\n return { hour: null, minute: null };\n\n return { hour, minute };\n};\n\nexport const scrollToSelected = (viewport: HTMLDivElement | null) => {\n if (!viewport) return;\n // Defer scroll until after the popover open animation completes and layout is calculated\n requestAnimationFrame(() => {\n const selected = viewport.querySelector('[aria-pressed=\"true\"]');\n selected?.scrollIntoView({ block: 'center' });\n });\n};\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { PopoverContentProps, PopoverProps } from '@radix-ui/react-popover';\n\nimport { Popover } from '../Popover';\nimport { ScrollArea } from '../ScrollArea';\nimport { Toggle } from '../Toggle';\n\nimport { formatTime, pad, parseTime, scrollToSelected } from './utils';\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\nconst MINUTES = Array.from({ length: 60 }, (_, i) => i);\n\ntype Props = {\n children?: ReactNode;\n defaultSelected?: string | null;\n selected?: string | null;\n onSelect?: (time: string) => void;\n} & Pick<PopoverProps, 'open' | 'onOpenChange' | 'defaultOpen'> &\n Pick<PopoverContentProps, 'align' | 'alignOffset' | 'sideOffset'>;\n\nexport const TimePicker = ({\n align = 'end',\n alignOffset = -18,\n children,\n defaultOpen,\n defaultSelected,\n onOpenChange,\n onSelect,\n open,\n selected,\n sideOffset = 12,\n}: Props) => {\n const [internalSelected, setInternalSelected] = useState<string | null>(defaultSelected ?? null);\n\n const isControlled = selected !== undefined;\n const currentValue = isControlled ? selected : internalSelected;\n\n const parsed = parseTime(currentValue);\n const hour = parsed.hour ?? null;\n const minute = parsed.minute ?? null;\n\n const handleSelect = (time: string) => {\n if (!isControlled) {\n setInternalSelected(time);\n }\n onSelect?.(time);\n };\n\n const handleHourSelect = (h: number) => {\n handleSelect(formatTime(h, minute ?? 0));\n };\n\n const handleMinuteSelect = (m: number) => {\n handleSelect(formatTime(hour ?? 0, m));\n };\n\n return (\n <Popover defaultOpen={defaultOpen} onOpenChange={onOpenChange} open={open}>\n <Popover.Trigger asChild>{children}</Popover.Trigger>\n <Popover.Content\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className=\"tw:flex tw:flex-row\"\n >\n <ScrollArea type=\"always\" ref={scrollToSelected} viewPortClassName=\"tw:h-60 tw:p-3\">\n {HOURS.map((value) => (\n <Toggle\n key={value}\n variant=\"ghost\"\n className=\"tw:size-10 tw:p-0\"\n pressed={value === hour}\n onPressedChange={() => handleHourSelect(value)}\n >\n {pad(value)}\n </Toggle>\n ))}\n </ScrollArea>\n\n <ScrollArea type=\"always\" ref={scrollToSelected} viewPortClassName=\"tw:h-60 tw:p-3\">\n {MINUTES.map((value) => (\n <Toggle\n key={value}\n variant=\"ghost\"\n className=\"tw:size-10 tw:p-0\"\n pressed={value === minute}\n onPressedChange={() => handleMinuteSelect(value)}\n >\n {pad(value)}\n </Toggle>\n ))}\n </ScrollArea>\n </Popover.Content>\n </Popover>\n );\n};\n"],"mappings":";;;;;;AAAA,MAAa,OAAO,MAAc,EAAE,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG;;AAG9D,MAAa,cAAc,MAAc,WAAmB,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,MAAM;AAEtF,MAAa,aAAa,SAAyB;CACjD,IAAI,CAAC,MAAM,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAK;CAE7C,MAAM,QAAQ,wBAAwB,KAAK,KAAK,KAAK,CAAC;CACtD,IAAI,CAAC,OAAO,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAK;CAE9C,MAAM,OAAO,OAAO,MAAM,EAAE;CAC5B,MAAM,SAAS,OAAO,MAAM,EAAE;CAC9B,IACE,OAAO,MAAM,IAAI,KACjB,OAAO,MAAM,MAAM,KACnB,OAAO,KACP,OAAO,MACP,SAAS,KACT,SAAS,IAET,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAK;CAEpC,OAAO;EAAE;EAAM;CAAO;AACxB;AAEA,MAAa,oBAAoB,aAAoC;CACnE,IAAI,CAAC,UAAU;CAEf,4BAA4B;EAE1B,SAD0B,cAAc,yBACjC,CAAC,EAAE,eAAe,EAAE,OAAO,SAAS,CAAC;CAC9C,CAAC;AACH;;;ACvBA,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;AACpD,MAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;AAUtD,MAAa,cAAc,EACzB,QAAQ,OACR,cAAc,KACd,UACA,aACA,iBACA,cACA,UACA,MACA,UACA,aAAa,SACF;CACX,MAAM,CAAC,kBAAkB,uBAAuB,SAAwB,mBAAmB,IAAI;CAE/F,MAAM,eAAe,aAAa,KAAA;CAGlC,MAAM,SAAS,UAFM,eAAe,WAAW,gBAEV;CACrC,MAAM,OAAO,OAAO,QAAQ;CAC5B,MAAM,SAAS,OAAO,UAAU;CAEhC,MAAM,gBAAgB,SAAiB;EACrC,IAAI,CAAC,cACH,oBAAoB,IAAI;EAE1B,WAAW,IAAI;CACjB;CAEA,MAAM,oBAAoB,MAAc;EACtC,aAAa,WAAW,GAAG,UAAU,CAAC,CAAC;CACzC;CAEA,MAAM,sBAAsB,MAAc;EACxC,aAAa,WAAW,QAAQ,GAAG,CAAC,CAAC;CACvC;CAEA,OACE,qBAAC,SAAD;EAAsB;EAA2B;EAAoB;EAArE,UAAA,CACE,oBAAC,QAAQ,SAAT;GAAiB,SAAA;GAAS;EAA0B,CAAA,GACpD,qBAAC,QAAQ,SAAT;GACS;GACM;GACD;GACZ,WAAU;GAJZ,UAAA,CAME,oBAAC,YAAD;IAAY,MAAK;IAAS,KAAK;IAAkB,mBAAkB;IAChE,UAAA,MAAM,KAAK,UACV,oBAAC,QAAD;KAEE,SAAQ;KACR,WAAU;KACV,SAAS,UAAU;KACnB,uBAAuB,iBAAiB,KAAK;KAE5C,UAAA,IAAI,KAAK;IACJ,GAPD,KAOC,CACT;GACS,CAAA,GAEZ,oBAAC,YAAD;IAAY,MAAK;IAAS,KAAK;IAAkB,mBAAkB;IAChE,UAAA,QAAQ,KAAK,UACZ,oBAAC,QAAD;KAEE,SAAQ;KACR,WAAU;KACV,SAAS,UAAU;KACnB,uBAAuB,mBAAmB,KAAK;KAE9C,UAAA,IAAI,KAAK;IACJ,GAPD,KAOC,CACT;GACS,CAAA,CACG;EACV,CAAA,CAAA;;AAEb"}
1
+ {"version":3,"file":"TimePicker-DyyV3nw8.js","names":[],"sources":["../src/components/TimePicker/utils.ts","../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["export const pad = (n: number) => n.toString().padStart(2, '0');\n\n/** The \"HH:mm\" shape `parseTime` parses back. */\nexport const formatTime = (hour: number, minute: number) => `${pad(hour)}:${pad(minute)}`;\n\nexport const parseTime = (time?: string | null) => {\n if (!time) return { hour: null, minute: null };\n\n const match = /^(\\d{1,2}):(\\d{1,2})$/.exec(time.trim());\n if (!match) return { hour: null, minute: null };\n\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n if (\n Number.isNaN(hour) ||\n Number.isNaN(minute) ||\n hour < 0 ||\n hour > 23 ||\n minute < 0 ||\n minute > 59\n )\n return { hour: null, minute: null };\n\n return { hour, minute };\n};\n\nexport const scrollToSelected = (viewport: HTMLDivElement | null) => {\n if (!viewport) return;\n // Defer scroll until after the popover open animation completes and layout is calculated\n requestAnimationFrame(() => {\n const selected = viewport.querySelector('[aria-pressed=\"true\"]');\n selected?.scrollIntoView({ block: 'center' });\n });\n};\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { PopoverContentProps, PopoverProps } from '@radix-ui/react-popover';\n\nimport { Popover } from '../Popover';\nimport { ScrollArea } from '../ScrollArea';\nimport { Toggle } from '../Toggle';\n\nimport { formatTime, pad, parseTime, scrollToSelected } from './utils';\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\nconst MINUTES = Array.from({ length: 60 }, (_, i) => i);\n\ntype Props = {\n children?: ReactNode;\n defaultSelected?: string | null;\n selected?: string | null;\n onSelect?: (time: string) => void;\n} & Pick<PopoverProps, 'open' | 'onOpenChange' | 'defaultOpen'> &\n Pick<PopoverContentProps, 'align' | 'alignOffset' | 'sideOffset'>;\n\nexport const TimePicker = ({\n align = 'end',\n alignOffset = -18,\n children,\n defaultOpen,\n defaultSelected,\n onOpenChange,\n onSelect,\n open,\n selected,\n sideOffset = 12,\n}: Props) => {\n const [internalSelected, setInternalSelected] = useState<string | null>(defaultSelected ?? null);\n\n const isControlled = selected !== undefined;\n const currentValue = isControlled ? selected : internalSelected;\n\n const parsed = parseTime(currentValue);\n const hour = parsed.hour ?? null;\n const minute = parsed.minute ?? null;\n\n const handleSelect = (time: string) => {\n if (!isControlled) {\n setInternalSelected(time);\n }\n onSelect?.(time);\n };\n\n const handleHourSelect = (h: number) => {\n handleSelect(formatTime(h, minute ?? 0));\n };\n\n const handleMinuteSelect = (m: number) => {\n handleSelect(formatTime(hour ?? 0, m));\n };\n\n return (\n <Popover defaultOpen={defaultOpen} onOpenChange={onOpenChange} open={open}>\n <Popover.Trigger asChild>{children}</Popover.Trigger>\n <Popover.Content\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className=\"tw:flex tw:flex-row\"\n >\n <ScrollArea type=\"always\" ref={scrollToSelected} viewPortClassName=\"tw:h-60 tw:p-3\">\n {HOURS.map((value) => (\n <Toggle\n key={value}\n variant=\"ghost\"\n className=\"tw:size-10 tw:p-0\"\n pressed={value === hour}\n onPressedChange={() => handleHourSelect(value)}\n >\n {pad(value)}\n </Toggle>\n ))}\n </ScrollArea>\n\n <ScrollArea type=\"always\" ref={scrollToSelected} viewPortClassName=\"tw:h-60 tw:p-3\">\n {MINUTES.map((value) => (\n <Toggle\n key={value}\n variant=\"ghost\"\n className=\"tw:size-10 tw:p-0\"\n pressed={value === minute}\n onPressedChange={() => handleMinuteSelect(value)}\n >\n {pad(value)}\n </Toggle>\n ))}\n </ScrollArea>\n </Popover.Content>\n </Popover>\n );\n};\n"],"mappings":";;;;;;AAAA,MAAa,OAAO,MAAc,EAAE,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG;;AAG9D,MAAa,cAAc,MAAc,WAAmB,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,MAAM;AAEtF,MAAa,aAAa,SAAyB;CACjD,IAAI,CAAC,MAAM,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAK;CAE7C,MAAM,QAAQ,wBAAwB,KAAK,KAAK,KAAK,CAAC;CACtD,IAAI,CAAC,OAAO,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAK;CAE9C,MAAM,OAAO,OAAO,MAAM,EAAE;CAC5B,MAAM,SAAS,OAAO,MAAM,EAAE;CAC9B,IACE,OAAO,MAAM,IAAI,KACjB,OAAO,MAAM,MAAM,KACnB,OAAO,KACP,OAAO,MACP,SAAS,KACT,SAAS,IAET,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAK;CAEpC,OAAO;EAAE;EAAM;CAAO;AACxB;AAEA,MAAa,oBAAoB,aAAoC;CACnE,IAAI,CAAC,UAAU;CAEf,4BAA4B;EAE1B,SAD0B,cAAc,yBACjC,CAAC,EAAE,eAAe,EAAE,OAAO,SAAS,CAAC;CAC9C,CAAC;AACH;;;ACvBA,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;AACpD,MAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;AAUtD,MAAa,cAAc,EACzB,QAAQ,OACR,cAAc,KACd,UACA,aACA,iBACA,cACA,UACA,MACA,UACA,aAAa,SACF;CACX,MAAM,CAAC,kBAAkB,uBAAuB,SAAwB,mBAAmB,IAAI;CAE/F,MAAM,eAAe,aAAa,KAAA;CAGlC,MAAM,SAAS,UAFM,eAAe,WAAW,gBAEV;CACrC,MAAM,OAAO,OAAO,QAAQ;CAC5B,MAAM,SAAS,OAAO,UAAU;CAEhC,MAAM,gBAAgB,SAAiB;EACrC,IAAI,CAAC,cACH,oBAAoB,IAAI;EAE1B,WAAW,IAAI;CACjB;CAEA,MAAM,oBAAoB,MAAc;EACtC,aAAa,WAAW,GAAG,UAAU,CAAC,CAAC;CACzC;CAEA,MAAM,sBAAsB,MAAc;EACxC,aAAa,WAAW,QAAQ,GAAG,CAAC,CAAC;CACvC;CAEA,OACE,qBAAC,SAAD;EAAsB;EAA2B;EAAoB;EAArE,UAAA,CACE,oBAAC,QAAQ,SAAT;GAAiB,SAAA;GAAS;EAA0B,CAAA,GACpD,qBAAC,QAAQ,SAAT;GACS;GACM;GACD;GACZ,WAAU;GAJZ,UAAA,CAME,oBAAC,YAAD;IAAY,MAAK;IAAS,KAAK;IAAkB,mBAAkB;IAChE,UAAA,MAAM,KAAK,UACV,oBAAC,QAAD;KAEE,SAAQ;KACR,WAAU;KACV,SAAS,UAAU;KACnB,uBAAuB,iBAAiB,KAAK;KAE5C,UAAA,IAAI,KAAK;IACJ,GAPD,KAOC,CACT;GACS,CAAA,GAEZ,oBAAC,YAAD;IAAY,MAAK;IAAS,KAAK;IAAkB,mBAAkB;IAChE,UAAA,QAAQ,KAAK,UACZ,oBAAC,QAAD;KAEE,SAAQ;KACR,WAAU;KACV,SAAS,UAAU;KACnB,uBAAuB,mBAAmB,KAAK;KAE9C,UAAA,IAAI,KAAK;IACJ,GAPD,KAOC,CACT;GACS,CAAA,CACG;EACV,CAAA,CAAA;;AAEb"}
@@ -1,7 +1,7 @@
1
- import { cn } from "./classNames-BzrkDnOD.js";
1
+ import { cn } from "./classNames-DcGnTh2N.js";
2
2
  import { useElement } from "./useElement-D-RjrGa4.js";
3
- import { Root } from "@radix-ui/react-slot";
4
3
  import { useEffect, useState } from "react";
4
+ import { Root } from "@radix-ui/react-slot";
5
5
  import { cva } from "class-variance-authority";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region src/components/Timeline/useLastLineHeight.ts
@@ -151,4 +151,4 @@ Timeline.Connector = TimelineConnector;
151
151
  //#endregion
152
152
  export { Timeline };
153
153
 
154
- //# sourceMappingURL=Timeline-B-I6sb0M.js.map
154
+ //# sourceMappingURL=Timeline-DUXgByUE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Timeline-B-I6sb0M.js","names":[],"sources":["../src/components/Timeline/useLastLineHeight.ts","../src/components/Timeline/TimelineConnector.tsx","../src/components/Timeline/TimelineContent.tsx","../src/components/Timeline/TimelineItem.tsx","../src/components/Timeline/Timeline.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { useElement } from '../../hooks/useElement';\n\nconst CONNECTOR_MARGIN_TOP = 8;\n\nexport const useLastLineHeight = () => {\n const [wrapper, setWrapper] = useElement();\n const [connector, setConnector] = useElement();\n const [height, setHeight] = useState(0);\n\n useEffect(() => {\n if (wrapper === null) return;\n if (connector === null) return;\n\n const updateHeight = () => {\n const wrapperRect = wrapper.getBoundingClientRect();\n const connectorRect = connector.getBoundingClientRect();\n const distance = connectorRect.top - wrapperRect.top - CONNECTOR_MARGIN_TOP;\n setHeight(distance);\n };\n\n // Initial check.\n const rafId = requestAnimationFrame(updateHeight);\n\n return () => {\n cancelAnimationFrame(rafId);\n };\n }, [wrapper, connector]);\n\n return {\n height,\n setWrapper,\n setConnector,\n };\n};\n","import type { ComponentProps, CSSProperties } from 'react';\nimport { Root } from '@radix-ui/react-slot';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { useLastLineHeight } from './useLastLineHeight';\n\nconst connectorWrapper = cva(\n [\n 'tw:grow',\n 'tw:min-h-8',\n 'tw:py-2',\n\n // layout\n 'tw:flex',\n 'tw:justify-center',\n\n // CONNECTOR LINE\n 'tw:relative',\n 'tw:before:absolute',\n 'tw:before:self-start',\n\n // Centered on x-axis\n 'tw:before:left-1/2',\n 'tw:before:-translate-x-1/2',\n 'tw:before:w-px',\n 'tw:before:h-full',\n 'tw:group-last/timeline-item:before:h-(--connector-line-height)',\n\n // Solid line\n 'tw:group-data-[variant=solid]/timeline:before:bg-border',\n\n // Dashed line using gradient\n 'tw:group-data-[variant=dashed]/timeline:before:bg-gradient-to-b',\n 'tw:group-data-[variant=dashed]/timeline:before:from-border',\n 'tw:group-data-[variant=dashed]/timeline:before:from-50%',\n 'tw:group-data-[variant=dashed]/timeline:before:to-transparent',\n 'tw:group-data-[variant=dashed]/timeline:before:to-50%',\n 'tw:group-data-[variant=dashed]/timeline:before:bg-[length:1px_4px]',\n ],\n {\n defaultVariants: {\n align: 'start',\n },\n variants: {\n align: {\n start: ['tw:items-start'],\n center: ['tw:items-center'],\n end: ['tw:items-end'],\n baseline: ['tw:items-baseline'],\n },\n },\n },\n);\n\nconst connector = cva(\n [\n // ensure that it is always above the connector line.\n 'tw:z-10',\n 'tw:relative',\n ],\n {\n defaultVariants: {\n variant: 'label',\n },\n variants: {\n variant: {\n none: [],\n label: [\n 'tw:bg-muted',\n 'tw:text-muted-foreground',\n 'tw:rounded',\n 'tw:p-1.5',\n 'tw:text-nowrap',\n 'tw:text-xs',\n ],\n icon: [\n 'tw:bg-background',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n 'tw:[&_svg]:text-muted-foreground',\n ],\n line: [\n 'tw:min-w-8',\n 'tw:overflow-hidden',\n 'tw:w-full',\n // height of the curved corner\n 'tw:h-1',\n\n // small offset from top and bottom\n 'tw:my-1.5',\n // positioning\n 'tw:relative',\n 'tw:before:absolute',\n 'tw:before:left-1/2',\n 'tw:before:bottom-0',\n\n // sizing\n 'tw:before:w-full',\n 'tw:before:h-full',\n\n // l-shape\n 'tw:before:border-l',\n 'tw:before:border-b',\n 'tw:before:border-border',\n\n 'tw:before:rounded-bl',\n // Solid or dashed\n 'tw:group-data-[variant=dashed]/timeline:before:border-dashed',\n 'tw:group-data-[variant=solid]/timeline:before:!border-solid',\n ],\n },\n },\n },\n);\n\ntype Props = { asChild?: boolean; offset?: number } & ComponentProps<'div'> &\n VariantProps<typeof connectorWrapper> &\n VariantProps<typeof connector>;\n\nexport const TimelineConnector = ({\n className,\n children,\n asChild,\n variant,\n align,\n offset = 0,\n style,\n ...rest\n}: Props) => {\n const Comp = asChild ? Root : 'div';\n const { setConnector, setWrapper, height } = useLastLineHeight();\n\n return (\n <div\n ref={setWrapper}\n style={\n {\n '--connector-line-height': `${height}px`,\n } as CSSProperties\n }\n className={connectorWrapper({\n align,\n })}\n >\n <Comp\n {...rest}\n ref={setConnector}\n style={{\n top: align === 'end' ? -offset : offset,\n ...style,\n }}\n className={connector({ variant, className })}\n >\n {children}\n </Comp>\n </div>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const TimelineContent = ({ className, ...rest }: Props) => (\n <div\n {...rest}\n data-slot=\"timeline-content\"\n className={cn(\n 'tw:flex',\n // spacing in between timeline items\n 'tw:py-2',\n className,\n )}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'li'>;\n\nexport const TimelineItem = ({ className, ...rest }: Props) => {\n return (\n <li\n {...rest}\n className={cn('tw:contents', 'tw:relative', 'tw:group/timeline-item', className)}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { TimelineConnector } from './TimelineConnector';\nimport { TimelineContent } from './TimelineContent';\nimport { TimelineItem } from './TimelineItem';\n\ntype Props = ComponentProps<'ul'> & {\n variant?: 'solid' | 'dashed';\n};\n\nexport const Timeline = ({ className, variant = 'dashed', ...rest }: Props) => {\n return (\n <ul\n {...rest}\n data-variant={variant}\n className={cn(\n 'tailwindcss-preflight',\n 'tw:overflow-y-hidden',\n // reset default styling\n 'tw:p-0',\n 'tw:grid',\n 'tw:grid-cols-[auto_minmax(0,1fr)]',\n 'tw:group/timeline',\n 'tw:gap-x-4',\n className,\n )}\n />\n );\n};\n\nTimeline.Item = TimelineItem;\nTimeline.Content = TimelineContent;\nTimeline.Connector = TimelineConnector;\n"],"mappings":";;;;;;;AAIA,MAAM,uBAAuB;AAE7B,MAAa,0BAA0B;CACrC,MAAM,CAAC,SAAS,cAAc,WAAW;CACzC,MAAM,CAAC,WAAW,gBAAgB,WAAW;CAC7C,MAAM,CAAC,QAAQ,aAAa,SAAS,CAAC;CAEtC,gBAAgB;EACd,IAAI,YAAY,MAAM;EACtB,IAAI,cAAc,MAAM;EAExB,MAAM,qBAAqB;GACzB,MAAM,cAAc,QAAQ,sBAAsB;GAElD,MAAM,WADgB,UAAU,sBACH,CAAC,CAAC,MAAM,YAAY,MAAM;GACvD,UAAU,QAAQ;EACpB;EAGA,MAAM,QAAQ,sBAAsB,YAAY;EAEhD,aAAa;GACX,qBAAqB,KAAK;EAC5B;CACF,GAAG,CAAC,SAAS,SAAS,CAAC;CAEvB,OAAO;EACL;EACA;EACA;CACF;AACF;;;AC5BA,MAAM,mBAAmB,IACvB;CACE;CACA;CACA;CAGA;CACA;CAGA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CAGA;CAGA;CACA;CACA;CACA;CACA;CACA;AACF,GACA;CACE,iBAAiB,EACf,OAAO,QACT;CACA,UAAU,EACR,OAAO;EACL,OAAO,CAAC,gBAAgB;EACxB,QAAQ,CAAC,iBAAiB;EAC1B,KAAK,CAAC,cAAc;EACpB,UAAU,CAAC,mBAAmB;CAChC,EACF;AACF,CACF;AAEA,MAAM,YAAY,IAChB,CAEE,WACA,aACF,GACA;CACE,iBAAiB,EACf,SAAS,QACX;CACA,UAAU,EACR,SAAS;EACP,MAAM,CAAC;EACP,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;EACF;EACA,MAAM;GACJ;GACA;GACA;EACF;EACA,MAAM;GACJ;GACA;GACA;GAEA;GAGA;GAEA;GACA;GACA;GACA;GAGA;GACA;GAGA;GACA;GACA;GAEA;GAEA;GACA;EACF;CACF,EACF;AACF,CACF;AAMA,MAAa,qBAAqB,EAChC,WACA,UACA,SACA,SACA,OACA,SAAS,GACT,OACA,GAAG,WACQ;CACX,MAAM,OAAO,UAAU,OAAO;CAC9B,MAAM,EAAE,cAAc,YAAY,WAAW,kBAAkB;CAE/D,OACE,oBAAC,OAAD;EACE,KAAK;EACL,OACE,EACE,2BAA2B,GAAG,OAAO,IACvC;EAEF,WAAW,iBAAiB,EAC1B,MACF,CAAC;EAED,UAAA,oBAAC,MAAD;GACE,GAAI;GACJ,KAAK;GACL,OAAO;IACL,KAAK,UAAU,QAAQ,CAAC,SAAS;IACjC,GAAG;GACL;GACA,WAAW,UAAU;IAAE;IAAS;GAAU,CAAC;GAE1C;EACG,CAAA;CACH,CAAA;AAET;;;ACvJA,MAAa,mBAAmB,EAAE,WAAW,GAAG,WAC9C,oBAAC,OAAD;CACE,GAAI;CACJ,aAAU;CACV,WAAW,GACT,WAEA,WACA,SACF;AACD,CAAA;;;ACVH,MAAa,gBAAgB,EAAE,WAAW,GAAG,WAAkB;CAC7D,OACE,oBAAC,MAAD;EACE,GAAI;EACJ,WAAW,GAAG,eAAe,eAAe,0BAA0B,SAAS;CAChF,CAAA;AAEL;;;ACDA,MAAa,YAAY,EAAE,WAAW,UAAU,UAAU,GAAG,WAAkB;CAC7E,OACE,oBAAC,MAAD;EACE,GAAI;EACJ,gBAAc;EACd,WAAW,GACT,yBACA,wBAEA,UACA,WACA,qCACA,qBACA,cACA,SACF;CACD,CAAA;AAEL;AAEA,SAAS,OAAO;AAChB,SAAS,UAAU;AACnB,SAAS,YAAY"}
1
+ {"version":3,"file":"Timeline-DUXgByUE.js","names":[],"sources":["../src/components/Timeline/useLastLineHeight.ts","../src/components/Timeline/TimelineConnector.tsx","../src/components/Timeline/TimelineContent.tsx","../src/components/Timeline/TimelineItem.tsx","../src/components/Timeline/Timeline.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { useElement } from '../../hooks/useElement';\n\nconst CONNECTOR_MARGIN_TOP = 8;\n\nexport const useLastLineHeight = () => {\n const [wrapper, setWrapper] = useElement();\n const [connector, setConnector] = useElement();\n const [height, setHeight] = useState(0);\n\n useEffect(() => {\n if (wrapper === null) return;\n if (connector === null) return;\n\n const updateHeight = () => {\n const wrapperRect = wrapper.getBoundingClientRect();\n const connectorRect = connector.getBoundingClientRect();\n const distance = connectorRect.top - wrapperRect.top - CONNECTOR_MARGIN_TOP;\n setHeight(distance);\n };\n\n // Initial check.\n const rafId = requestAnimationFrame(updateHeight);\n\n return () => {\n cancelAnimationFrame(rafId);\n };\n }, [wrapper, connector]);\n\n return {\n height,\n setWrapper,\n setConnector,\n };\n};\n","import type { ComponentProps, CSSProperties } from 'react';\nimport { Root } from '@radix-ui/react-slot';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { useLastLineHeight } from './useLastLineHeight';\n\nconst connectorWrapper = cva(\n [\n 'tw:grow',\n 'tw:min-h-8',\n 'tw:py-2',\n\n // layout\n 'tw:flex',\n 'tw:justify-center',\n\n // CONNECTOR LINE\n 'tw:relative',\n 'tw:before:absolute',\n 'tw:before:self-start',\n\n // Centered on x-axis\n 'tw:before:left-1/2',\n 'tw:before:-translate-x-1/2',\n 'tw:before:w-px',\n 'tw:before:h-full',\n 'tw:group-last/timeline-item:before:h-(--connector-line-height)',\n\n // Solid line\n 'tw:group-data-[variant=solid]/timeline:before:bg-border',\n\n // Dashed line using gradient\n 'tw:group-data-[variant=dashed]/timeline:before:bg-gradient-to-b',\n 'tw:group-data-[variant=dashed]/timeline:before:from-border',\n 'tw:group-data-[variant=dashed]/timeline:before:from-50%',\n 'tw:group-data-[variant=dashed]/timeline:before:to-transparent',\n 'tw:group-data-[variant=dashed]/timeline:before:to-50%',\n 'tw:group-data-[variant=dashed]/timeline:before:bg-[length:1px_4px]',\n ],\n {\n defaultVariants: {\n align: 'start',\n },\n variants: {\n align: {\n start: ['tw:items-start'],\n center: ['tw:items-center'],\n end: ['tw:items-end'],\n baseline: ['tw:items-baseline'],\n },\n },\n },\n);\n\nconst connector = cva(\n [\n // ensure that it is always above the connector line.\n 'tw:z-10',\n 'tw:relative',\n ],\n {\n defaultVariants: {\n variant: 'label',\n },\n variants: {\n variant: {\n none: [],\n label: [\n 'tw:bg-muted',\n 'tw:text-muted-foreground',\n 'tw:rounded',\n 'tw:p-1.5',\n 'tw:text-nowrap',\n 'tw:text-xs',\n ],\n icon: [\n 'tw:bg-background',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n 'tw:[&_svg]:text-muted-foreground',\n ],\n line: [\n 'tw:min-w-8',\n 'tw:overflow-hidden',\n 'tw:w-full',\n // height of the curved corner\n 'tw:h-1',\n\n // small offset from top and bottom\n 'tw:my-1.5',\n // positioning\n 'tw:relative',\n 'tw:before:absolute',\n 'tw:before:left-1/2',\n 'tw:before:bottom-0',\n\n // sizing\n 'tw:before:w-full',\n 'tw:before:h-full',\n\n // l-shape\n 'tw:before:border-l',\n 'tw:before:border-b',\n 'tw:before:border-border',\n\n 'tw:before:rounded-bl',\n // Solid or dashed\n 'tw:group-data-[variant=dashed]/timeline:before:border-dashed',\n 'tw:group-data-[variant=solid]/timeline:before:!border-solid',\n ],\n },\n },\n },\n);\n\ntype Props = { asChild?: boolean; offset?: number } & ComponentProps<'div'> &\n VariantProps<typeof connectorWrapper> &\n VariantProps<typeof connector>;\n\nexport const TimelineConnector = ({\n className,\n children,\n asChild,\n variant,\n align,\n offset = 0,\n style,\n ...rest\n}: Props) => {\n const Comp = asChild ? Root : 'div';\n const { setConnector, setWrapper, height } = useLastLineHeight();\n\n return (\n <div\n ref={setWrapper}\n style={\n {\n '--connector-line-height': `${height}px`,\n } as CSSProperties\n }\n className={connectorWrapper({\n align,\n })}\n >\n <Comp\n {...rest}\n ref={setConnector}\n style={{\n top: align === 'end' ? -offset : offset,\n ...style,\n }}\n className={connector({ variant, className })}\n >\n {children}\n </Comp>\n </div>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const TimelineContent = ({ className, ...rest }: Props) => (\n <div\n {...rest}\n data-slot=\"timeline-content\"\n className={cn(\n 'tw:flex',\n // spacing in between timeline items\n 'tw:py-2',\n className,\n )}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'li'>;\n\nexport const TimelineItem = ({ className, ...rest }: Props) => {\n return (\n <li\n {...rest}\n className={cn('tw:contents', 'tw:relative', 'tw:group/timeline-item', className)}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { TimelineConnector } from './TimelineConnector';\nimport { TimelineContent } from './TimelineContent';\nimport { TimelineItem } from './TimelineItem';\n\ntype Props = ComponentProps<'ul'> & {\n variant?: 'solid' | 'dashed';\n};\n\nexport const Timeline = ({ className, variant = 'dashed', ...rest }: Props) => {\n return (\n <ul\n {...rest}\n data-variant={variant}\n className={cn(\n 'tailwindcss-preflight',\n 'tw:overflow-y-hidden',\n // reset default styling\n 'tw:p-0',\n 'tw:grid',\n 'tw:grid-cols-[auto_minmax(0,1fr)]',\n 'tw:group/timeline',\n 'tw:gap-x-4',\n className,\n )}\n />\n );\n};\n\nTimeline.Item = TimelineItem;\nTimeline.Content = TimelineContent;\nTimeline.Connector = TimelineConnector;\n"],"mappings":";;;;;;;AAIA,MAAM,uBAAuB;AAE7B,MAAa,0BAA0B;CACrC,MAAM,CAAC,SAAS,cAAc,WAAW;CACzC,MAAM,CAAC,WAAW,gBAAgB,WAAW;CAC7C,MAAM,CAAC,QAAQ,aAAa,SAAS,CAAC;CAEtC,gBAAgB;EACd,IAAI,YAAY,MAAM;EACtB,IAAI,cAAc,MAAM;EAExB,MAAM,qBAAqB;GACzB,MAAM,cAAc,QAAQ,sBAAsB;GAElD,MAAM,WADgB,UAAU,sBACH,CAAC,CAAC,MAAM,YAAY,MAAM;GACvD,UAAU,QAAQ;EACpB;EAGA,MAAM,QAAQ,sBAAsB,YAAY;EAEhD,aAAa;GACX,qBAAqB,KAAK;EAC5B;CACF,GAAG,CAAC,SAAS,SAAS,CAAC;CAEvB,OAAO;EACL;EACA;EACA;CACF;AACF;;;AC5BA,MAAM,mBAAmB,IACvB;CACE;CACA;CACA;CAGA;CACA;CAGA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CAGA;CAGA;CACA;CACA;CACA;CACA;CACA;AACF,GACA;CACE,iBAAiB,EACf,OAAO,QACT;CACA,UAAU,EACR,OAAO;EACL,OAAO,CAAC,gBAAgB;EACxB,QAAQ,CAAC,iBAAiB;EAC1B,KAAK,CAAC,cAAc;EACpB,UAAU,CAAC,mBAAmB;CAChC,EACF;AACF,CACF;AAEA,MAAM,YAAY,IAChB,CAEE,WACA,aACF,GACA;CACE,iBAAiB,EACf,SAAS,QACX;CACA,UAAU,EACR,SAAS;EACP,MAAM,CAAC;EACP,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;EACF;EACA,MAAM;GACJ;GACA;GACA;EACF;EACA,MAAM;GACJ;GACA;GACA;GAEA;GAGA;GAEA;GACA;GACA;GACA;GAGA;GACA;GAGA;GACA;GACA;GAEA;GAEA;GACA;EACF;CACF,EACF;AACF,CACF;AAMA,MAAa,qBAAqB,EAChC,WACA,UACA,SACA,SACA,OACA,SAAS,GACT,OACA,GAAG,WACQ;CACX,MAAM,OAAO,UAAU,OAAO;CAC9B,MAAM,EAAE,cAAc,YAAY,WAAW,kBAAkB;CAE/D,OACE,oBAAC,OAAD;EACE,KAAK;EACL,OACE,EACE,2BAA2B,GAAG,OAAO,IACvC;EAEF,WAAW,iBAAiB,EAC1B,MACF,CAAC;EAED,UAAA,oBAAC,MAAD;GACE,GAAI;GACJ,KAAK;GACL,OAAO;IACL,KAAK,UAAU,QAAQ,CAAC,SAAS;IACjC,GAAG;GACL;GACA,WAAW,UAAU;IAAE;IAAS;GAAU,CAAC;GAE1C;EACG,CAAA;CACH,CAAA;AAET;;;ACvJA,MAAa,mBAAmB,EAAE,WAAW,GAAG,WAC9C,oBAAC,OAAD;CACE,GAAI;CACJ,aAAU;CACV,WAAW,GACT,WAEA,WACA,SACF;AACD,CAAA;;;ACVH,MAAa,gBAAgB,EAAE,WAAW,GAAG,WAAkB;CAC7D,OACE,oBAAC,MAAD;EACE,GAAI;EACJ,WAAW,GAAG,eAAe,eAAe,0BAA0B,SAAS;CAChF,CAAA;AAEL;;;ACDA,MAAa,YAAY,EAAE,WAAW,UAAU,UAAU,GAAG,WAAkB;CAC7E,OACE,oBAAC,MAAD;EACE,GAAI;EACJ,gBAAc;EACd,WAAW,GACT,yBACA,wBAEA,UACA,WACA,qCACA,qBACA,cACA,SACF;CACD,CAAA;AAEL;AAEA,SAAS,OAAO;AAChB,SAAS,UAAU;AACnB,SAAS,YAAY"}
@@ -1,5 +1,5 @@
1
1
  import { useStableCallback } from "./internal/hooks/useStableCallback.js";
2
- import { toast as toast$1 } from "./toast-CyXEdaCZ.js";
2
+ import { toast as toast$1 } from "./toast-D6Z6MOB5.js";
3
3
  import { useEffect, useId, useRef } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  import { Toaster } from "sonner";
@@ -73,4 +73,4 @@ const Toaster$1 = ({ gap = 12, visibleToasts = 5, ...props }) => /* @__PURE__ */
73
73
  //#endregion
74
74
  export { Toaster$1 as Toaster, useNotification };
75
75
 
76
- //# sourceMappingURL=Toast-NrOdDDru.js.map
76
+ //# sourceMappingURL=Toast-BGnUL4jV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toast-NrOdDDru.js","names":["Toaster","SonnerToaster"],"sources":["../src/components/Toast/useNotification.tsx","../src/components/Toast/Toaster.tsx"],"sourcesContent":["import { useEffect, useId, useRef } from 'react';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\n\nimport { toast, type ToastOptions } from './toast';\n\ntype Props = {\n enabled?: boolean;\n /** Shows the notification again this many ms after the user dismisses it, while still enabled. */\n remindAfter?: number;\n} & ToastOptions;\n\n/**\n * A persistent, system-driven notification (trial expiry, upgrade prompt, billing alert).\n *\n * - Stays until the user dismisses it or the component unmounts; `toast()` is for transient\n * feedback after a user action.\n * - A visible one updates in place when its string `title` or `description` changes; other\n * options apply the next time it shows.\n */\nexport const useNotification = ({ enabled = true, remindAfter, ...toastOptions }: Props) => {\n const fallbackId = useId();\n const toastId = toastOptions.id ?? fallbackId;\n const isShownRef = useRef(false);\n const reminderRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n const show = useStableCallback(() => {\n isShownRef.current = true;\n toast({\n ...toastOptions,\n id: toastId,\n duration: toastOptions.duration ?? Infinity,\n onDismiss: (dismissed) => {\n toastOptions.onDismiss?.(dismissed);\n // sonner reports the hook's own cleanup dismissal too; that one is already hidden\n if (!isShownRef.current) return;\n\n isShownRef.current = false;\n if (remindAfter !== undefined) reminderRef.current = setTimeout(show, remindAfter);\n },\n });\n });\n\n useEffect(() => {\n if (!enabled) return;\n const frameId = requestAnimationFrame(show);\n\n return () => {\n cancelAnimationFrame(frameId);\n clearTimeout(reminderRef.current);\n if (!isShownRef.current) return;\n\n isShownRef.current = false;\n toast.dismiss(toastId);\n };\n }, [enabled, show, toastId]);\n\n const titleText = typeof toastOptions.title === 'string' ? toastOptions.title : undefined;\n const descriptionText =\n typeof toastOptions.description === 'string' ? toastOptions.description : undefined;\n\n useEffect(() => {\n if (isShownRef.current) show();\n }, [titleText, descriptionText, show]);\n};\n","import type { ComponentProps, PointerEvent } from 'react';\nimport { Toaster as SonnerToaster } from 'sonner';\n\ntype ToasterProps = ComponentProps<typeof SonnerToaster>;\n\nconst DEFAULT_STYLES = {\n '--width': '512px', // match max-w-lg\n} as React.CSSProperties;\n\nconst stopPropagation = (event: PointerEvent) => event.stopPropagation();\n\nexport const Toaster = ({ gap = 12, visibleToasts = 5, ...props }: ToasterProps) => (\n // Wrapper prevents toast clicks from reaching Radix Dialog's DismissableLayer,\n // which would otherwise close the modal on any \"outside\" pointer event.\n // oxlint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onPointerDown={stopPropagation}>\n <SonnerToaster\n {...props}\n gap={gap}\n visibleToasts={visibleToasts}\n className=\"tw:pointer-events-auto tw:flex tw:w-full tw:max-w-lg tw:justify-center\"\n style={DEFAULT_STYLES}\n />\n </div>\n);\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAa,mBAAmB,EAAE,UAAU,MAAM,aAAa,GAAG,mBAA0B;CAC1F,MAAM,aAAa,MAAM;CACzB,MAAM,UAAU,aAAa,MAAM;CACnC,MAAM,aAAa,OAAO,KAAK;CAC/B,MAAM,cAAc,OAAsC,KAAA,CAAS;CAEnE,MAAM,OAAO,wBAAwB;EACnC,WAAW,UAAU;EACrB,QAAM;GACJ,GAAG;GACH,IAAI;GACJ,UAAU,aAAa,YAAY;GACnC,YAAY,cAAc;IACxB,aAAa,YAAY,SAAS;IAElC,IAAI,CAAC,WAAW,SAAS;IAEzB,WAAW,UAAU;IACrB,IAAI,gBAAgB,KAAA,GAAW,YAAY,UAAU,WAAW,MAAM,WAAW;GACnF;EACF,CAAC;CACH,CAAC;CAED,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,MAAM,UAAU,sBAAsB,IAAI;EAE1C,aAAa;GACX,qBAAqB,OAAO;GAC5B,aAAa,YAAY,OAAO;GAChC,IAAI,CAAC,WAAW,SAAS;GAEzB,WAAW,UAAU;GACrB,QAAM,QAAQ,OAAO;EACvB;CACF,GAAG;EAAC;EAAS;EAAM;CAAO,CAAC;CAE3B,MAAM,YAAY,OAAO,aAAa,UAAU,WAAW,aAAa,QAAQ,KAAA;CAChF,MAAM,kBACJ,OAAO,aAAa,gBAAgB,WAAW,aAAa,cAAc,KAAA;CAE5E,gBAAgB;EACd,IAAI,WAAW,SAAS,KAAK;CAC/B,GAAG;EAAC;EAAW;EAAiB;CAAI,CAAC;AACvC;;;AC3DA,MAAM,iBAAiB,EACrB,WAAW,QACb;AAEA,MAAM,mBAAmB,UAAwB,MAAM,gBAAgB;AAEvE,MAAaA,aAAW,EAAE,MAAM,IAAI,gBAAgB,GAAG,GAAG,YAIxD,oBAAC,OAAD;CAAK,eAAe;CAClB,UAAA,oBAACC,SAAD;EACE,GAAI;EACC;EACU;EACf,WAAU;EACV,OAAO;CACR,CAAA;AACE,CAAA"}
1
+ {"version":3,"file":"Toast-BGnUL4jV.js","names":["Toaster","SonnerToaster"],"sources":["../src/components/Toast/useNotification.tsx","../src/components/Toast/Toaster.tsx"],"sourcesContent":["import { useEffect, useId, useRef } from 'react';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\n\nimport { toast, type ToastOptions } from './toast';\n\ntype Props = {\n enabled?: boolean;\n /** Shows the notification again this many ms after the user dismisses it, while still enabled. */\n remindAfter?: number;\n} & ToastOptions;\n\n/**\n * A persistent, system-driven notification (trial expiry, upgrade prompt, billing alert).\n *\n * - Stays until the user dismisses it or the component unmounts; `toast()` is for transient\n * feedback after a user action.\n * - A visible one updates in place when its string `title` or `description` changes; other\n * options apply the next time it shows.\n */\nexport const useNotification = ({ enabled = true, remindAfter, ...toastOptions }: Props) => {\n const fallbackId = useId();\n const toastId = toastOptions.id ?? fallbackId;\n const isShownRef = useRef(false);\n const reminderRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n const show = useStableCallback(() => {\n isShownRef.current = true;\n toast({\n ...toastOptions,\n id: toastId,\n duration: toastOptions.duration ?? Infinity,\n onDismiss: (dismissed) => {\n toastOptions.onDismiss?.(dismissed);\n // sonner reports the hook's own cleanup dismissal too; that one is already hidden\n if (!isShownRef.current) return;\n\n isShownRef.current = false;\n if (remindAfter !== undefined) reminderRef.current = setTimeout(show, remindAfter);\n },\n });\n });\n\n useEffect(() => {\n if (!enabled) return;\n const frameId = requestAnimationFrame(show);\n\n return () => {\n cancelAnimationFrame(frameId);\n clearTimeout(reminderRef.current);\n if (!isShownRef.current) return;\n\n isShownRef.current = false;\n toast.dismiss(toastId);\n };\n }, [enabled, show, toastId]);\n\n const titleText = typeof toastOptions.title === 'string' ? toastOptions.title : undefined;\n const descriptionText =\n typeof toastOptions.description === 'string' ? toastOptions.description : undefined;\n\n useEffect(() => {\n if (isShownRef.current) show();\n }, [titleText, descriptionText, show]);\n};\n","import type { ComponentProps, PointerEvent } from 'react';\nimport { Toaster as SonnerToaster } from 'sonner';\n\ntype ToasterProps = ComponentProps<typeof SonnerToaster>;\n\nconst DEFAULT_STYLES = {\n '--width': '512px', // match max-w-lg\n} as React.CSSProperties;\n\nconst stopPropagation = (event: PointerEvent) => event.stopPropagation();\n\nexport const Toaster = ({ gap = 12, visibleToasts = 5, ...props }: ToasterProps) => (\n // Wrapper prevents toast clicks from reaching Radix Dialog's DismissableLayer,\n // which would otherwise close the modal on any \"outside\" pointer event.\n // oxlint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onPointerDown={stopPropagation}>\n <SonnerToaster\n {...props}\n gap={gap}\n visibleToasts={visibleToasts}\n className=\"tw:pointer-events-auto tw:flex tw:w-full tw:max-w-lg tw:justify-center\"\n style={DEFAULT_STYLES}\n />\n </div>\n);\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAa,mBAAmB,EAAE,UAAU,MAAM,aAAa,GAAG,mBAA0B;CAC1F,MAAM,aAAa,MAAM;CACzB,MAAM,UAAU,aAAa,MAAM;CACnC,MAAM,aAAa,OAAO,KAAK;CAC/B,MAAM,cAAc,OAAsC,KAAA,CAAS;CAEnE,MAAM,OAAO,wBAAwB;EACnC,WAAW,UAAU;EACrB,QAAM;GACJ,GAAG;GACH,IAAI;GACJ,UAAU,aAAa,YAAY;GACnC,YAAY,cAAc;IACxB,aAAa,YAAY,SAAS;IAElC,IAAI,CAAC,WAAW,SAAS;IAEzB,WAAW,UAAU;IACrB,IAAI,gBAAgB,KAAA,GAAW,YAAY,UAAU,WAAW,MAAM,WAAW;GACnF;EACF,CAAC;CACH,CAAC;CAED,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,MAAM,UAAU,sBAAsB,IAAI;EAE1C,aAAa;GACX,qBAAqB,OAAO;GAC5B,aAAa,YAAY,OAAO;GAChC,IAAI,CAAC,WAAW,SAAS;GAEzB,WAAW,UAAU;GACrB,QAAM,QAAQ,OAAO;EACvB;CACF,GAAG;EAAC;EAAS;EAAM;CAAO,CAAC;CAE3B,MAAM,YAAY,OAAO,aAAa,UAAU,WAAW,aAAa,QAAQ,KAAA;CAChF,MAAM,kBACJ,OAAO,aAAa,gBAAgB,WAAW,aAAa,cAAc,KAAA;CAE5E,gBAAgB;EACd,IAAI,WAAW,SAAS,KAAK;CAC/B,GAAG;EAAC;EAAW;EAAiB;CAAI,CAAC;AACvC;;;AC3DA,MAAM,iBAAiB,EACrB,WAAW,QACb;AAEA,MAAM,mBAAmB,UAAwB,MAAM,gBAAgB;AAEvE,MAAaA,aAAW,EAAE,MAAM,IAAI,gBAAgB,GAAG,GAAG,YAIxD,oBAAC,OAAD;CAAK,eAAe;CAClB,UAAA,oBAACC,SAAD;EACE,GAAI;EACC;EACU;EACf,WAAU;EACV,OAAO;CACR,CAAA;AACE,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger, isMac } from "./utils-LQ4jJA-9.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ //#region src/components/Tooltip/toggleAll.ts
4
+ /** True for the click that should fold or unfold every group: Cmd on a Mac, Ctrl elsewhere. */
5
+ const isToggleAllClick = (event) => isMac ? event.metaKey : event.ctrlKey;
6
+ //#endregion
7
+ //#region src/components/Tooltip/ToggleAllTooltip.tsx
8
+ /**
9
+ * A fold chevron's tooltip: what a click does, and what the modifier click does to every group.
10
+ *
11
+ * - Its own provider, so a host without one still renders it.
12
+ */
13
+ const ToggleAllTooltip = ({ expanded, children }) => {
14
+ const verb = expanded ? "collapse" : "expand";
15
+ return /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(TooltipRoot, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
16
+ asChild: true,
17
+ children
18
+ }), /* @__PURE__ */ jsx(TooltipContent, {
19
+ placement: "top",
20
+ children: /* @__PURE__ */ jsxs("span", {
21
+ className: "tw:flex tw:flex-col",
22
+ children: [/* @__PURE__ */ jsxs("span", { children: ["Click to ", verb] }), /* @__PURE__ */ jsxs("span", {
23
+ className: "tw:opacity-70",
24
+ children: [
25
+ isMac ? "⌘" : "Ctrl",
26
+ "+click to ",
27
+ verb,
28
+ " all"
29
+ ]
30
+ })]
31
+ })
32
+ })] }) });
33
+ };
34
+ //#endregion
35
+ export { ToggleAllTooltip, isToggleAllClick };
36
+
37
+ //# sourceMappingURL=ToggleAllTooltip-Dlmq-yqS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleAllTooltip-Dlmq-yqS.js","names":[],"sources":["../src/components/Tooltip/toggleAll.ts","../src/components/Tooltip/ToggleAllTooltip.tsx"],"sourcesContent":["import { isMac } from '../../utils';\n\n/** True for the click that should fold or unfold every group: Cmd on a Mac, Ctrl elsewhere. */\nexport const isToggleAllClick = (event: { metaKey: boolean; ctrlKey: boolean }) =>\n isMac ? event.metaKey : event.ctrlKey;\n","import type { ReactElement } from 'react';\n\nimport { isMac } from '../../utils';\n\nimport { TooltipProvider } from './Tooltip';\nimport { TooltipContent } from './TooltipContent';\nimport { TooltipRoot } from './TooltipRoot';\nimport { TooltipTrigger } from './TooltipTrigger';\n\n/**\n * A fold chevron's tooltip: what a click does, and what the modifier click does to every group.\n *\n * - Its own provider, so a host without one still renders it.\n */\nexport const ToggleAllTooltip = ({\n expanded,\n children,\n}: {\n expanded: boolean;\n children: ReactElement;\n}) => {\n const verb = expanded ? 'collapse' : 'expand';\n return (\n <TooltipProvider>\n <TooltipRoot>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent placement=\"top\">\n <span className=\"tw:flex tw:flex-col\">\n <span>Click to {verb}</span>\n <span className=\"tw:opacity-70\">\n {isMac ? '⌘' : 'Ctrl'}+click to {verb} all\n </span>\n </span>\n </TooltipContent>\n </TooltipRoot>\n </TooltipProvider>\n );\n};\n"],"mappings":";;;;AAGA,MAAa,oBAAoB,UAC/B,QAAQ,MAAM,UAAU,MAAM;;;;;;;;ACUhC,MAAa,oBAAoB,EAC/B,UACA,eAII;CACJ,MAAM,OAAO,WAAW,aAAa;CACrC,OACE,oBAAC,iBAAD,EAAA,UACE,qBAAC,aAAD,EAAA,UAAA,CACE,oBAAC,gBAAD;EAAgB,SAAA;EAAS;CAAyB,CAAA,GAClD,oBAAC,gBAAD;EAAgB,WAAU;EACxB,UAAA,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,qBAAC,QAAD,EAAA,UAAA,CAAM,aAAU,IAAW,EAAA,CAAA,GAC3B,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KACG,QAAQ,MAAM;KAAO;KAAW;KAAK;IAClC;GACF,CAAA,CAAA;;CACQ,CAAA,CACL,EAAA,CAAA,EACE,CAAA;AAErB"}