@keboola/design 11.9.0 → 13.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 (367) hide show
  1. package/AGENTS.md +45 -14
  2. package/CHANGELOG.md +246 -0
  3. package/COMPONENT-API.md +352 -294
  4. package/README.md +11 -1
  5. package/dist/{AIKit-ELIsegJz.js → AIKit-DcOlHIBr.js} +420 -247
  6. package/dist/AIKit-DcOlHIBr.js.map +1 -0
  7. package/dist/{Alert-BsIM_oFK.js → Alert-UI-CIs-1.js} +16 -16
  8. package/dist/Alert-UI-CIs-1.js.map +1 -0
  9. package/dist/{AlertModal-BGJdaRRj.js → AlertModal-mbSnuuka.js} +8 -8
  10. package/dist/AlertModal-mbSnuuka.js.map +1 -0
  11. package/dist/{AppShell-DRgJxpXW.js → AppShell-WSQabK8r.js} +15 -52
  12. package/dist/AppShell-WSQabK8r.js.map +1 -0
  13. package/dist/{AutoSaveTextarea-BeuWuszr.js → AutoSaveTextarea-C5iIr2Ts.js} +2 -2
  14. package/dist/{AutoSaveTextarea-BeuWuszr.js.map → AutoSaveTextarea-C5iIr2Ts.js.map} +1 -1
  15. package/dist/{Badge-o5jURtpB.js → Badge-DIjhwPvh.js} +4 -9
  16. package/dist/Badge-DIjhwPvh.js.map +1 -0
  17. package/dist/{BrandEditor-BsTBM3s6.js → BrandEditor-Bkd6dhb8.js} +7 -7
  18. package/dist/{BrandEditor-BsTBM3s6.js.map → BrandEditor-Bkd6dhb8.js.map} +1 -1
  19. package/dist/{BrandLogo-CoKBk4MI.js → BrandLogo-CKpVSZb6.js} +4 -4
  20. package/dist/BrandLogo-CKpVSZb6.js.map +1 -0
  21. package/dist/{Breadcrumb-xqEUxfwn.js → Breadcrumb-BUoAZyhO.js} +8 -14
  22. package/dist/Breadcrumb-BUoAZyhO.js.map +1 -0
  23. package/dist/{Button-DsRrU5F1.js → Button-B21oVcPU.js} +31 -14
  24. package/dist/Button-B21oVcPU.js.map +1 -0
  25. package/dist/{Calendar-cG5NIJ4O.js → Calendar-DFtmZzbF.js} +99 -99
  26. package/dist/Calendar-DFtmZzbF.js.map +1 -0
  27. package/dist/{Card-Dyo7055Q.js → Card-BQmBWHXl.js} +35 -7
  28. package/dist/Card-BQmBWHXl.js.map +1 -0
  29. package/dist/{Checkbox-Dq5fPNrO.js → Checkbox-8yIIgY7g.js} +4 -4
  30. package/dist/Checkbox-8yIIgY7g.js.map +1 -0
  31. package/dist/{Clipboard-BZitKiSA.js → Clipboard-_xf6hMDD.js} +2 -2
  32. package/dist/{Clipboard-BZitKiSA.js.map → Clipboard-_xf6hMDD.js.map} +1 -1
  33. package/dist/{ClipboardButton-KHQnPEh_.js → ClipboardButton-srUgWgwH.js} +4 -4
  34. package/dist/{ClipboardButton-KHQnPEh_.js.map → ClipboardButton-srUgWgwH.js.map} +1 -1
  35. package/dist/{CodeEditor-BJKJXA0c.js → CodeEditor-jZMw1ioj.js} +55 -165
  36. package/dist/CodeEditor-jZMw1ioj.js.map +1 -0
  37. package/dist/{ColorInput-Bj3dfPFA.js → ColorInput-B3gBZ8Ya.js} +12 -27
  38. package/dist/ColorInput-B3gBZ8Ya.js.map +1 -0
  39. package/dist/{ColorModeSwitch-CWt-DZGC.js → ColorModeSwitch-Bw9wMyoL.js} +7 -17
  40. package/dist/ColorModeSwitch-Bw9wMyoL.js.map +1 -0
  41. package/dist/Combobox-C_MTpQ1l.js +1081 -0
  42. package/dist/Combobox-C_MTpQ1l.js.map +1 -0
  43. package/dist/{Command-BDU3C1gg.js → Command-BQPiZCNz.js} +4 -4
  44. package/dist/{Command-BDU3C1gg.js.map → Command-BQPiZCNz.js.map} +1 -1
  45. package/dist/{CopyField-BHRQUyuF.js → CopyField-Ba7h8MqZ.js} +19 -55
  46. package/dist/{CopyField-BHRQUyuF.js.map → CopyField-Ba7h8MqZ.js.map} +1 -1
  47. package/dist/{DateInput-B6N8g0ra.js → DateInput-D0nWUasV.js} +6 -6
  48. package/dist/{DateInput-B6N8g0ra.js.map → DateInput-D0nWUasV.js.map} +1 -1
  49. package/dist/{DatePicker-nA8YdE84.js → DatePicker-CtSa9b3V.js} +3 -3
  50. package/dist/{DatePicker-nA8YdE84.js.map → DatePicker-CtSa9b3V.js.map} +1 -1
  51. package/dist/{DateRangeInput-7M9Z4cVO.js → DateRangeInput-i6wE45-V.js} +10 -14
  52. package/dist/DateRangeInput-i6wE45-V.js.map +1 -0
  53. package/dist/{DateRangePicker-DjSUFjh4.js → DateRangePicker-BAnuz6vO.js} +9 -13
  54. package/dist/DateRangePicker-BAnuz6vO.js.map +1 -0
  55. package/dist/DiffView-ppTIzh2h.js.map +1 -1
  56. package/dist/{DropdownMenu-CgVwhDvl.js → DropdownMenu-gRM-A8qU.js} +3 -3
  57. package/dist/DropdownMenu-gRM-A8qU.js.map +1 -0
  58. package/dist/{FieldItem-DZGIdiXE.js → FieldItem-BHViBJS3.js} +12 -25
  59. package/dist/FieldItem-BHViBJS3.js.map +1 -0
  60. package/dist/{FieldItem-vhIJW4pj.d.ts → FieldItem-CPN1xjN5.d.ts} +11 -25
  61. package/dist/{FileUpload-DYQCTGjU.js → FileUpload-Ch2hrIWq.js} +11 -16
  62. package/dist/{FileUpload-DYQCTGjU.js.map → FileUpload-Ch2hrIWq.js.map} +1 -1
  63. package/dist/{Form-CcK7dRrC.js → Form-VkzfVPyT.js} +15 -23
  64. package/dist/{Form-CcK7dRrC.js.map → Form-VkzfVPyT.js.map} +1 -1
  65. package/dist/{FormGroup-DR_gZ25-.js → FormGroup-CmCppxOn.js} +11 -17
  66. package/dist/FormGroup-CmCppxOn.js.map +1 -0
  67. package/dist/{FullScreenModal-CN9nAs72.js → FullScreenModal-Cwnm8WdM.js} +15 -29
  68. package/dist/FullScreenModal-Cwnm8WdM.js.map +1 -0
  69. package/dist/{HoverCard-B9ZMJxjn.js → HoverCard-B8OKu9XZ.js} +2 -2
  70. package/dist/{HoverCard-B9ZMJxjn.js.map → HoverCard-B8OKu9XZ.js.map} +1 -1
  71. package/dist/{InputGroup-Do8K2hvD.js → InputGroup-CrlMRz4X.js} +11 -13
  72. package/dist/InputGroup-CrlMRz4X.js.map +1 -0
  73. package/dist/{Kbd-LCFMumoq.js → Kbd-J4n1J6i4.js} +23 -13
  74. package/dist/Kbd-J4n1J6i4.js.map +1 -0
  75. package/dist/{MarkedText-DNGEUVWc.js → MarkedText-DlmlJO0u.js} +2 -2
  76. package/dist/{MarkedText-DNGEUVWc.js.map → MarkedText-DlmlJO0u.js.map} +1 -1
  77. package/dist/{MermaidDiagram-ZG0iiDV_.js → MermaidDiagram-B30x2yV7.js} +16 -34
  78. package/dist/MermaidDiagram-B30x2yV7.js.map +1 -0
  79. package/dist/{Modal-I3VWk2oo.js → Modal-BkSuS9Yz.js} +17 -34
  80. package/dist/Modal-BkSuS9Yz.js.map +1 -0
  81. package/dist/{ModalTitle-CeLM_mX9.js → ModalTitle-BxopkIoQ.js} +3 -3
  82. package/dist/ModalTitle-BxopkIoQ.js.map +1 -0
  83. package/dist/{MultiActionButtonGroup-CYZ8IgSf.js → MultiActionButtonGroup-AWLj1Tg7.js} +3 -3
  84. package/dist/{MultiActionButtonGroup-CYZ8IgSf.js.map → MultiActionButtonGroup-AWLj1Tg7.js.map} +1 -1
  85. package/dist/{Navbar-Liy1TPI7.js → Navbar-B_DNpv5s.js} +9 -13
  86. package/dist/{Navbar-Liy1TPI7.js.map → Navbar-B_DNpv5s.js.map} +1 -1
  87. package/dist/{OtpInput-CbbymqYs.js → OtpInput-I8B8Vjdl.js} +2 -2
  88. package/dist/{OtpInput-CbbymqYs.js.map → OtpInput-I8B8Vjdl.js.map} +1 -1
  89. package/dist/{PageHeader-Q3IpCnQd.js → PageHeader-CgfyXpf1.js} +13 -26
  90. package/dist/PageHeader-CgfyXpf1.js.map +1 -0
  91. package/dist/{PageLayout-DSVM-ASz.js → PageLayout-DiAAILuS.js} +12 -20
  92. package/dist/PageLayout-DiAAILuS.js.map +1 -0
  93. package/dist/{PageToolbar-BKVJiDAL.js → PageToolbar-CIW0VmKe.js} +12 -42
  94. package/dist/PageToolbar-CIW0VmKe.js.map +1 -0
  95. package/dist/{Pagination-C_b7Xhey.js → Pagination-DH3f6LN0.js} +3 -3
  96. package/dist/{Pagination-C_b7Xhey.js.map → Pagination-DH3f6LN0.js.map} +1 -1
  97. package/dist/{Popconfirm-5pBzT_HQ.js → Popconfirm-Dhzn7sy6.js} +3 -3
  98. package/dist/{Popconfirm-5pBzT_HQ.js.map → Popconfirm-Dhzn7sy6.js.map} +1 -1
  99. package/dist/{Popover-BEbQrC_P.js → Popover-CEk915I1.js} +4 -3
  100. package/dist/Popover-CEk915I1.js.map +1 -0
  101. package/dist/{RadioGroup-Byc2mym4.js → RadioGroup-CBPRLRN0.js} +4 -4
  102. package/dist/{RadioGroup-Byc2mym4.js.map → RadioGroup-CBPRLRN0.js.map} +1 -1
  103. package/dist/{Search-Dhig_hPD.js → Search-DmkQo716.js} +3 -3
  104. package/dist/{Search-Dhig_hPD.js.map → Search-DmkQo716.js.map} +1 -1
  105. package/dist/{SearchInput-92r2bkA7.js → SearchInput-D3qMkHaW.js} +8 -13
  106. package/dist/SearchInput-D3qMkHaW.js.map +1 -0
  107. package/dist/{SectionNav-CNLJsiVG.js → SectionNav-TU5i3JeM.js} +10 -42
  108. package/dist/SectionNav-TU5i3JeM.js.map +1 -0
  109. package/dist/{Select-DV3Hak_l.js → Select-B4uK0QVm.js} +10 -12
  110. package/dist/Select-B4uK0QVm.js.map +1 -0
  111. package/dist/{Sheet-OparjIi-.js → Sheet-D0fAE14T.js} +5 -9
  112. package/dist/Sheet-D0fAE14T.js.map +1 -0
  113. package/dist/{Sidebar-CLEbBtNY.js → Sidebar-ZLMNIbg5.js} +16 -33
  114. package/dist/Sidebar-ZLMNIbg5.js.map +1 -0
  115. package/dist/{Slider-DLclvRws.js → Slider-B0ou9r0B.js} +3 -3
  116. package/dist/{Slider-DLclvRws.js.map → Slider-B0ou9r0B.js.map} +1 -1
  117. package/dist/{Stepper-C8sm9ZFM.js → Stepper-BLkLhfnd.js} +6 -9
  118. package/dist/{Stepper-C8sm9ZFM.js.map → Stepper-BLkLhfnd.js.map} +1 -1
  119. package/dist/{Switch-B0WdGSjz.js → Switch-DZvNePOm.js} +2 -2
  120. package/dist/{Switch-B0WdGSjz.js.map → Switch-DZvNePOm.js.map} +1 -1
  121. package/dist/{Table-CvYuTuNU.js → Table-BaVT5Tkn.js} +6 -11
  122. package/dist/{Table-CvYuTuNU.js.map → Table-BaVT5Tkn.js.map} +1 -1
  123. package/dist/{Tabs-eB974xJf.js → Tabs-CTDmye1N.js} +3 -3
  124. package/dist/{Tabs-eB974xJf.js.map → Tabs-CTDmye1N.js.map} +1 -1
  125. package/dist/{TextInput-CFTf4Cz1.js → TextInput-BWYXbfs4.js} +10 -14
  126. package/dist/TextInput-BWYXbfs4.js.map +1 -0
  127. package/dist/{ThemeProvider-DAmNn9Sd.js → ThemeProvider-VF38VfUa.js} +13 -31
  128. package/dist/ThemeProvider-VF38VfUa.js.map +1 -0
  129. package/dist/{TimePicker-BGeqc-Ed.js → TimePicker-CDGYrRxi.js} +2 -2
  130. package/dist/{TimePicker-BGeqc-Ed.js.map → TimePicker-CDGYrRxi.js.map} +1 -1
  131. package/dist/{Timeline-C8-wnRRr.js → Timeline-B-I6sb0M.js} +2 -2
  132. package/dist/{Timeline-C8-wnRRr.js.map → Timeline-B-I6sb0M.js.map} +1 -1
  133. package/dist/{Toast-Dr6Uw7ao.js → Toast-PfQf3vj-.js} +2 -2
  134. package/dist/{Toast-Dr6Uw7ao.js.map → Toast-PfQf3vj-.js.map} +1 -1
  135. package/dist/{Workbench-UR2FBC7I.js → Workbench-DmZzpkj7.js} +2 -2
  136. package/dist/{Workbench-UR2FBC7I.js.map → Workbench-DmZzpkj7.js.map} +1 -1
  137. package/dist/{ZoomableSvg-BZlk3PFJ.js → ZoomableSvg-C65nta_r.js} +5 -19
  138. package/dist/ZoomableSvg-C65nta_r.js.map +1 -0
  139. package/dist/charts.d.ts +21 -52
  140. package/dist/charts.js +13 -39
  141. package/dist/charts.js.map +1 -1
  142. package/dist/{context-D7X470dy.js → context-U293r3v-.js} +5 -9
  143. package/dist/context-U293r3v-.js.map +1 -0
  144. package/dist/editors.d.ts +27 -124
  145. package/dist/editors.js +29 -71
  146. package/dist/editors.js.map +1 -1
  147. package/dist/{findLiteralMatches-BGBw8Vbl.js → findLiteralMatches-DgGLzyG0.js} +8 -20
  148. package/dist/findLiteralMatches-DgGLzyG0.js.map +1 -0
  149. package/dist/flint.d.ts +3 -6
  150. package/dist/flint.js +31 -80
  151. package/dist/flint.js.map +1 -1
  152. package/dist/{icons-Cek151jC.js → icons-wcA70iQx.js} +105 -2
  153. package/dist/icons-wcA70iQx.js.map +1 -0
  154. package/dist/icons.d.ts +2 -2
  155. package/dist/icons.js +2 -2
  156. package/dist/{index-m-kQEWiY.d.ts → index-B7k-09i1.d.ts} +14 -2
  157. package/dist/index.d.ts +1180 -1867
  158. package/dist/index.js +69 -68
  159. package/dist/internal/blocks/AIKit.js +2 -2
  160. package/dist/internal/blocks/AppShell.js +1 -1
  161. package/dist/internal/blocks/AuthLayout.js +7 -27
  162. package/dist/internal/blocks/AuthLayout.js.map +1 -1
  163. package/dist/internal/blocks/AutoSaveTextarea.js +1 -1
  164. package/dist/internal/blocks/BrandEditor.js +1 -1
  165. package/dist/internal/blocks/ChartPanel.js +4 -8
  166. package/dist/internal/blocks/ChartPanel.js.map +1 -1
  167. package/dist/internal/blocks/ChipEditor.js +13 -21
  168. package/dist/internal/blocks/ChipEditor.js.map +1 -1
  169. package/dist/internal/blocks/ClipboardButton.js +1 -1
  170. package/dist/internal/blocks/ColorInput.js +1 -1
  171. package/dist/internal/blocks/ColorModeSwitch.js +1 -1
  172. package/dist/internal/blocks/Command.js +1 -1
  173. package/dist/internal/blocks/CopyField.js +1 -1
  174. package/dist/internal/blocks/DashboardHero.js +4 -7
  175. package/dist/internal/blocks/DashboardHero.js.map +1 -1
  176. package/dist/internal/blocks/DateInput.js +1 -1
  177. package/dist/internal/blocks/DateRangeInput.js +1 -1
  178. package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
  179. package/dist/internal/blocks/EmptyState.js +5 -9
  180. package/dist/internal/blocks/EmptyState.js.map +1 -1
  181. package/dist/internal/blocks/ErrorState.js +5 -9
  182. package/dist/internal/blocks/ErrorState.js.map +1 -1
  183. package/dist/internal/blocks/ExportMenu.js +6 -10
  184. package/dist/internal/blocks/ExportMenu.js.map +1 -1
  185. package/dist/internal/blocks/Form/connectors/ComboboxField.js +40 -0
  186. package/dist/internal/blocks/Form/connectors/ComboboxField.js.map +1 -0
  187. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +5 -22
  188. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js.map +1 -1
  189. package/dist/internal/blocks/Form.js +1 -1
  190. package/dist/internal/blocks/FormGroup.js +1 -1
  191. package/dist/internal/blocks/GoogleButton.js +1 -1
  192. package/dist/internal/blocks/MicrosoftButton.js +1 -1
  193. package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
  194. package/dist/internal/blocks/MultiCombobox.js +160 -154
  195. package/dist/internal/blocks/MultiCombobox.js.map +1 -1
  196. package/dist/internal/blocks/NumberInput.js +1 -1
  197. package/dist/internal/blocks/OtpInput.js +1 -1
  198. package/dist/internal/blocks/PageHeader.js +1 -1
  199. package/dist/internal/blocks/PageLayout.js +1 -1
  200. package/dist/internal/blocks/PageToolbar.js +1 -1
  201. package/dist/internal/blocks/PasswordInput.js +4 -4
  202. package/dist/internal/blocks/PasswordInput.js.map +1 -1
  203. package/dist/internal/blocks/SearchInput.js +1 -1
  204. package/dist/internal/blocks/SearchInputWithNavigation.js +4 -4
  205. package/dist/internal/blocks/SectionNav.js +1 -1
  206. package/dist/internal/blocks/SplitButton.js +3 -3
  207. package/dist/internal/blocks/StatCard.js +4 -8
  208. package/dist/internal/blocks/StatCard.js.map +1 -1
  209. package/dist/internal/blocks/TextInput.js +1 -1
  210. package/dist/internal/blocks/Textarea.js +2 -2
  211. package/dist/internal/blocks/TimeInput.js +5 -5
  212. package/dist/internal/blocks/TimeInput.js.map +1 -1
  213. package/dist/internal/components/Alert.js +1 -1
  214. package/dist/internal/components/AlertModal.js +1 -1
  215. package/dist/internal/components/Avatar.js +1 -1
  216. package/dist/internal/components/Badge.js +1 -1
  217. package/dist/internal/components/BrandLogo.js +1 -1
  218. package/dist/internal/components/Breadcrumb.js +1 -1
  219. package/dist/internal/components/Button.js +1 -1
  220. package/dist/internal/components/ButtonGroup.js.map +1 -1
  221. package/dist/internal/components/Calendar.js +1 -1
  222. package/dist/internal/components/Card.js +1 -1
  223. package/dist/internal/components/Checkbox.js +1 -1
  224. package/dist/internal/components/Clipboard.js +1 -1
  225. package/dist/internal/components/CollapsiblePanel.js +3 -3
  226. package/dist/internal/components/CollapsiblePanel.js.map +1 -1
  227. package/dist/internal/components/Combobox.js +2 -2
  228. package/dist/internal/components/DatePicker.js +1 -1
  229. package/dist/internal/components/DateRangePicker.js +1 -1
  230. package/dist/internal/components/DropdownMenu.js +1 -1
  231. package/dist/internal/components/FileUpload.js +1 -1
  232. package/dist/internal/components/FullScreenModal.js +1 -1
  233. package/dist/internal/components/HoverCard.js +1 -1
  234. package/dist/internal/components/InputGroup.js +1 -1
  235. package/dist/internal/components/Kbd.js +1 -1
  236. package/dist/internal/components/MarkedText.js +1 -1
  237. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +1 -1
  238. package/dist/internal/components/Modal.js +1 -1
  239. package/dist/internal/components/Navbar.js +1 -1
  240. package/dist/internal/components/Pagination.js +1 -1
  241. package/dist/internal/components/PanelWithDetails.js +1 -1
  242. package/dist/internal/components/Popconfirm.js +1 -1
  243. package/dist/internal/components/Popover.js +1 -1
  244. package/dist/internal/components/RadioGroup.js +1 -1
  245. package/dist/internal/components/Search.js +1 -1
  246. package/dist/internal/components/Select.js +1 -1
  247. package/dist/internal/components/Separator.js.map +1 -1
  248. package/dist/internal/components/Sheet.js +1 -1
  249. package/dist/internal/components/Sidebar.js +1 -1
  250. package/dist/internal/components/Skeleton/Skeleton.js +5 -9
  251. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -1
  252. package/dist/internal/components/Slider.js +1 -1
  253. package/dist/internal/components/SpotlightBackdrop.js +3 -8
  254. package/dist/internal/components/SpotlightBackdrop.js.map +1 -1
  255. package/dist/internal/components/Stepper.js +1 -1
  256. package/dist/internal/components/Switch.js +1 -1
  257. package/dist/internal/components/Table.js +1 -1
  258. package/dist/internal/components/Tabs.js +1 -1
  259. package/dist/internal/components/ThemeProvider.js +3 -3
  260. package/dist/internal/components/TimePicker.js +1 -1
  261. package/dist/internal/components/Timeline.js +1 -1
  262. package/dist/internal/components/Toast.js +2 -2
  263. package/dist/internal/components/Tooltip.js +1 -1
  264. package/dist/internal/components/Truncated.js +4 -8
  265. package/dist/internal/components/Truncated.js.map +1 -1
  266. package/dist/internal/components/Workbench.js +1 -1
  267. package/dist/internal/components/ZoomableSvg.js +1 -1
  268. package/dist/internal/hooks/useScrollbarPosition.js +1 -1
  269. package/dist/internal/hooks/useStableCallback.js +4 -13
  270. package/dist/internal/hooks/useStableCallback.js.map +1 -1
  271. package/dist/internal/utils/accessibleName.js +11 -0
  272. package/dist/internal/utils/accessibleName.js.map +1 -0
  273. package/dist/internal/utils.js +2 -2
  274. package/dist/markdown-editor.d.ts +15 -37
  275. package/dist/markdown-editor.js +17 -23
  276. package/dist/markdown-editor.js.map +1 -1
  277. package/dist/mermaid.d.ts +4 -6
  278. package/dist/mermaid.js +1 -1
  279. package/dist/rjsf.d.ts +9 -19
  280. package/dist/rjsf.js +44 -84
  281. package/dist/rjsf.js.map +1 -1
  282. package/dist/{styles-BAFscjSV.js → styles-gzcjOyKv.js} +6 -6
  283. package/dist/styles-gzcjOyKv.js.map +1 -0
  284. package/dist/styles.css +1 -1
  285. package/dist/svgTransforms-Dw2hRA-i.js +51 -0
  286. package/dist/svgTransforms-Dw2hRA-i.js.map +1 -0
  287. package/dist/testing.d.ts +3 -10
  288. package/dist/testing.js +7 -15
  289. package/dist/testing.js.map +1 -1
  290. package/dist/themeTokens-7DEab0kp.js +31 -0
  291. package/dist/themeTokens-7DEab0kp.js.map +1 -0
  292. package/dist/{toast-DIC0iNRf.js → toast-CyXEdaCZ.js} +3 -3
  293. package/dist/toast-CyXEdaCZ.js.map +1 -0
  294. package/dist/{themeScopeContext-D7fSyb06.js → useColorSchemeState-Cw4MCXUs.js} +14 -14
  295. package/dist/useColorSchemeState-Cw4MCXUs.js.map +1 -0
  296. package/dist/{useControllableState-M6494mCT.js → useControllableState-CUYXMsfz.js} +3 -7
  297. package/dist/useControllableState-CUYXMsfz.js.map +1 -0
  298. package/dist/useElement-D-RjrGa4.js +21 -0
  299. package/dist/useElement-D-RjrGa4.js.map +1 -0
  300. package/dist/useThemeAttributes-B199Regy.js +67 -0
  301. package/dist/useThemeAttributes-B199Regy.js.map +1 -0
  302. package/dist/{utils-BW4AE8VP.js → utils-Bd28bWgm.js} +31 -26
  303. package/dist/utils-Bd28bWgm.js.map +1 -0
  304. package/dist/vega.d.ts +8 -30
  305. package/dist/vega.js +5 -13
  306. package/dist/vega.js.map +1 -1
  307. package/dist/{vegaTheme-CSvFEMBl.js → vegaTheme-VQMWTlBw.js} +7 -21
  308. package/dist/vegaTheme-VQMWTlBw.js.map +1 -0
  309. package/package.json +28 -27
  310. package/src/styles.css +120 -14
  311. package/src/theme.css +130 -5
  312. package/dist/AIKit-ELIsegJz.js.map +0 -1
  313. package/dist/Alert-BsIM_oFK.js.map +0 -1
  314. package/dist/AlertModal-BGJdaRRj.js.map +0 -1
  315. package/dist/AppShell-DRgJxpXW.js.map +0 -1
  316. package/dist/Badge-o5jURtpB.js.map +0 -1
  317. package/dist/BrandLogo-CoKBk4MI.js.map +0 -1
  318. package/dist/Breadcrumb-xqEUxfwn.js.map +0 -1
  319. package/dist/Button-DsRrU5F1.js.map +0 -1
  320. package/dist/Calendar-cG5NIJ4O.js.map +0 -1
  321. package/dist/Card-Dyo7055Q.js.map +0 -1
  322. package/dist/Checkbox-Dq5fPNrO.js.map +0 -1
  323. package/dist/CodeEditor-BJKJXA0c.js.map +0 -1
  324. package/dist/ColorInput-Bj3dfPFA.js.map +0 -1
  325. package/dist/ColorModeSwitch-CWt-DZGC.js.map +0 -1
  326. package/dist/Combobox-D8PrEqTG.js +0 -619
  327. package/dist/Combobox-D8PrEqTG.js.map +0 -1
  328. package/dist/DateRangeInput-7M9Z4cVO.js.map +0 -1
  329. package/dist/DateRangePicker-DjSUFjh4.js.map +0 -1
  330. package/dist/DropdownMenu-CgVwhDvl.js.map +0 -1
  331. package/dist/FieldItem-DZGIdiXE.js.map +0 -1
  332. package/dist/FormGroup-DR_gZ25-.js.map +0 -1
  333. package/dist/FullScreenModal-CN9nAs72.js.map +0 -1
  334. package/dist/InputGroup-Do8K2hvD.js.map +0 -1
  335. package/dist/Kbd-LCFMumoq.js.map +0 -1
  336. package/dist/MermaidDiagram-ZG0iiDV_.js.map +0 -1
  337. package/dist/Modal-I3VWk2oo.js.map +0 -1
  338. package/dist/ModalTitle-CeLM_mX9.js.map +0 -1
  339. package/dist/PageHeader-Q3IpCnQd.js.map +0 -1
  340. package/dist/PageLayout-DSVM-ASz.js.map +0 -1
  341. package/dist/PageToolbar-BKVJiDAL.js.map +0 -1
  342. package/dist/Popover-BEbQrC_P.js.map +0 -1
  343. package/dist/SearchInput-92r2bkA7.js.map +0 -1
  344. package/dist/SectionNav-CNLJsiVG.js.map +0 -1
  345. package/dist/Select-DV3Hak_l.js.map +0 -1
  346. package/dist/Sheet-OparjIi-.js.map +0 -1
  347. package/dist/Sidebar-CLEbBtNY.js.map +0 -1
  348. package/dist/TextInput-CFTf4Cz1.js.map +0 -1
  349. package/dist/ThemeProvider-DAmNn9Sd.js.map +0 -1
  350. package/dist/ZoomableSvg-BZlk3PFJ.js.map +0 -1
  351. package/dist/context-D7X470dy.js.map +0 -1
  352. package/dist/findLiteralMatches-BGBw8Vbl.js.map +0 -1
  353. package/dist/icons-Cek151jC.js.map +0 -1
  354. package/dist/internal/components/StatusDot.js +0 -67
  355. package/dist/internal/components/StatusDot.js.map +0 -1
  356. package/dist/styles-BAFscjSV.js.map +0 -1
  357. package/dist/svgTransforms-CJAYPk7o.js +0 -81
  358. package/dist/svgTransforms-CJAYPk7o.js.map +0 -1
  359. package/dist/themeScopeContext-D7fSyb06.js.map +0 -1
  360. package/dist/themeTokens-qP1-55O7.js +0 -119
  361. package/dist/themeTokens-qP1-55O7.js.map +0 -1
  362. package/dist/toast-DIC0iNRf.js.map +0 -1
  363. package/dist/useControllableState-M6494mCT.js.map +0 -1
  364. package/dist/useElement-BK3AAiIf.js +0 -24
  365. package/dist/useElement-BK3AAiIf.js.map +0 -1
  366. package/dist/utils-BW4AE8VP.js.map +0 -1
  367. package/dist/vegaTheme-CSvFEMBl.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,81 +1,82 @@
1
1
  import { cn } from "./classNames-BzrkDnOD.js";
2
- import { HINT_UNDERLINE_CLASS_NAME, Tooltip, TooltipProvider, copyToClipboard, isMac } from "./utils-BW4AE8VP.js";
2
+ import { HINT_UNDERLINE_CLASS_NAME, Tooltip, TooltipProvider, copyToClipboard, isMac } from "./utils-Bd28bWgm.js";
3
3
  import { DEFAULT_BRAND_ID, DEFAULT_COLOR_SCHEME } from "./defaults-i_xG2F_1.js";
4
- import { ArgoDesignContext, useArgoDesign, useTheme } from "./context-D7X470dy.js";
5
- import { findLiteralMatches, hasLiteralMatch } from "./findLiteralMatches-BGBw8Vbl.js";
4
+ import { ArgoDesignContext, useArgoDesign, useTheme } from "./context-U293r3v-.js";
5
+ import { findLiteralMatches, hasLiteralMatch } from "./findLiteralMatches-DgGLzyG0.js";
6
6
  import { mergeRefs } from "./internal/utils/mergeRefs.js";
7
- import { Button, ButtonInline, argoVariants } from "./Button-DsRrU5F1.js";
7
+ import { Button, ButtonInline, argoVariants } from "./Button-B21oVcPU.js";
8
8
  import { ButtonGroup } from "./internal/components/ButtonGroup.js";
9
- import { DropdownMenu } from "./DropdownMenu-CgVwhDvl.js";
9
+ import { DropdownMenu } from "./DropdownMenu-gRM-A8qU.js";
10
10
  import { ScrollArea, ScrollBar } from "./internal/components/ScrollArea.js";
11
11
  import { SplitButton } from "./internal/blocks/SplitButton.js";
12
- import { MultiActionButtonGroup } from "./MultiActionButtonGroup-CYZ8IgSf.js";
12
+ import { MultiActionButtonGroup } from "./MultiActionButtonGroup-AWLj1Tg7.js";
13
13
  import { Toggle } from "./internal/components/Toggle.js";
14
14
  import { ToggleGroup } from "./ToggleGroup-Cy_10Mvu.js";
15
- import { Clipboard } from "./Clipboard-BZitKiSA.js";
16
- import { ClipboardButton, ClipboardInline } from "./ClipboardButton-KHQnPEh_.js";
15
+ import { Clipboard } from "./Clipboard-_xf6hMDD.js";
16
+ import { ClipboardButton, ClipboardInline } from "./ClipboardButton-srUgWgwH.js";
17
17
  import { ExportMenu } from "./internal/blocks/ExportMenu.js";
18
- import { CopyField } from "./CopyField-BHRQUyuF.js";
18
+ import { CopyField } from "./CopyField-Ba7h8MqZ.js";
19
19
  import { Label } from "./internal/components/Label.js";
20
20
  import { MicrosoftButton } from "./internal/blocks/MicrosoftButton.js";
21
21
  import { GoogleButton } from "./internal/blocks/GoogleButton.js";
22
22
  import { Link } from "./internal/components/Link.js";
23
- import { AlertModal } from "./AlertModal-BGJdaRRj.js";
24
- import { Modal } from "./Modal-I3VWk2oo.js";
23
+ import { AlertModal } from "./AlertModal-mbSnuuka.js";
24
+ import { Modal } from "./Modal-BkSuS9Yz.js";
25
25
  import { Separator } from "./internal/components/Separator.js";
26
- import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-CN9nAs72.js";
26
+ import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-Cwnm8WdM.js";
27
27
  import { Truncated } from "./internal/components/Truncated.js";
28
- import { Sheet } from "./Sheet-OparjIi-.js";
28
+ import { Sheet } from "./Sheet-D0fAE14T.js";
29
29
  import { useStableCallback } from "./internal/hooks/useStableCallback.js";
30
- import { Popover } from "./Popover-BEbQrC_P.js";
31
- import { Popconfirm } from "./Popconfirm-5pBzT_HQ.js";
32
- import { HoverCard } from "./HoverCard-B9ZMJxjn.js";
33
- import { Command, CommandGroup, CommandInput, CommandItem, CommandList, defaultFilter, useCommandState } from "./Command-BDU3C1gg.js";
34
- import { InputGroup } from "./InputGroup-Do8K2hvD.js";
35
- import { TextInput } from "./TextInput-CFTf4Cz1.js";
30
+ import { Popover } from "./Popover-CEk915I1.js";
31
+ import { Popconfirm } from "./Popconfirm-Dhzn7sy6.js";
32
+ import { HoverCard } from "./HoverCard-B8OKu9XZ.js";
33
+ import { Command, CommandGroup, CommandInput, CommandItem, CommandList, defaultFilter, useCommandState } from "./Command-BQPiZCNz.js";
34
+ import { InputGroup } from "./InputGroup-CrlMRz4X.js";
35
+ import { TextInput } from "./TextInput-BWYXbfs4.js";
36
36
  import { SpotlightBackdrop, useTargetRect } from "./internal/components/SpotlightBackdrop.js";
37
- import { Calendar } from "./Calendar-cG5NIJ4O.js";
38
- import { DatePicker } from "./DatePicker-nA8YdE84.js";
39
- import { TimePicker } from "./TimePicker-BGeqc-Ed.js";
40
- import { DateRangePicker } from "./DateRangePicker-DjSUFjh4.js";
41
- import { Switch } from "./Switch-B0WdGSjz.js";
42
- import { RadioGroup } from "./RadioGroup-Byc2mym4.js";
43
- import { Slider } from "./Slider-DLclvRws.js";
44
- import { Search, SearchForm } from "./Search-Dhig_hPD.js";
45
- import { Select } from "./Select-DV3Hak_l.js";
46
- import { Checkbox } from "./Checkbox-Dq5fPNrO.js";
47
- import { Combobox, filterByWords, matchByWords, namedLabel, withBlankValues } from "./Combobox-D8PrEqTG.js";
48
- import { Badge } from "./Badge-o5jURtpB.js";
37
+ import { Calendar } from "./Calendar-DFtmZzbF.js";
38
+ import { DatePicker } from "./DatePicker-CtSa9b3V.js";
39
+ import { TimePicker } from "./TimePicker-CDGYrRxi.js";
40
+ import { DateRangePicker } from "./DateRangePicker-BAnuz6vO.js";
41
+ import { Switch } from "./Switch-DZvNePOm.js";
42
+ import { RadioGroup } from "./RadioGroup-CBPRLRN0.js";
43
+ import { Slider } from "./Slider-B0ou9r0B.js";
44
+ import { Search, SearchForm } from "./Search-DmkQo716.js";
45
+ import { forwardAccessibleName } from "./internal/utils/accessibleName.js";
46
+ import { Select } from "./Select-B4uK0QVm.js";
47
+ import { Checkbox } from "./Checkbox-8yIIgY7g.js";
48
+ import { BLANK_VALUES, Combobox, filterByWords, matchByWords, namedLabel, withBlankValues } from "./Combobox-C_MTpQ1l.js";
49
+ import { Badge } from "./Badge-DIjhwPvh.js";
49
50
  import { MultiCombobox } from "./internal/blocks/MultiCombobox.js";
50
- import { FormGroup } from "./FormGroup-DR_gZ25-.js";
51
- import { ColorInput } from "./ColorInput-Bj3dfPFA.js";
51
+ import { FormGroup } from "./FormGroup-CmCppxOn.js";
52
+ import { ColorInput } from "./ColorInput-B3gBZ8Ya.js";
52
53
  import { HelpBlock } from "./internal/components/HelpBlock.js";
53
54
  import { NumberInput } from "./internal/blocks/NumberInput.js";
54
55
  import { Textarea } from "./internal/blocks/Textarea.js";
56
+ import { ComboboxField } from "./internal/blocks/Form/connectors/ComboboxField.js";
55
57
  import { MultiComboboxField } from "./internal/blocks/Form/connectors/MultiComboboxField.js";
56
58
  import { ChipEditor } from "./internal/blocks/ChipEditor.js";
57
- import { AutoSaveTextarea } from "./AutoSaveTextarea-BeuWuszr.js";
58
- import { ColorModeSwitch } from "./ColorModeSwitch-CWt-DZGC.js";
59
- import { DateInput } from "./DateInput-B6N8g0ra.js";
59
+ import { AutoSaveTextarea } from "./AutoSaveTextarea-C5iIr2Ts.js";
60
+ import { ColorModeSwitch } from "./ColorModeSwitch-Bw9wMyoL.js";
61
+ import { DateInput } from "./DateInput-D0nWUasV.js";
60
62
  import { PasswordInput } from "./internal/blocks/PasswordInput.js";
61
63
  import { TimeInput } from "./internal/blocks/TimeInput.js";
62
- import { DateRangeInput } from "./DateRangeInput-7M9Z4cVO.js";
63
- import { OtpInput, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS } from "./OtpInput-CbbymqYs.js";
64
- import { SearchInput } from "./SearchInput-92r2bkA7.js";
64
+ import { DateRangeInput } from "./DateRangeInput-i6wE45-V.js";
65
+ import { OtpInput, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS } from "./OtpInput-I8B8Vjdl.js";
66
+ import { SearchInput } from "./SearchInput-D3qMkHaW.js";
65
67
  import { SearchInputWithNavigation } from "./internal/blocks/SearchInputWithNavigation.js";
66
- import { FileUpload, useFileDropTarget, useFileUploadRejections } from "./FileUpload-DYQCTGjU.js";
67
- import { AnswerActions, AnswerSummary, ChatInlineIcon, CollapsibleStepHeader, DIAGRAM_LANGUAGES, InlineStepDetail, InlineStepGroup, InlineStepLabel, Markdown, MarkdownTable, MessageBubble, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageBar, UsageStats, UsageStatsRing, clampPercentage, formatPercentage, getChatInlineIconName } from "./AIKit-ELIsegJz.js";
68
- import { Table, tableAriaSort } from "./Table-CvYuTuNU.js";
68
+ import { FileUpload, useFileDropTarget, useFileUploadRejections } from "./FileUpload-Ch2hrIWq.js";
69
+ import { AnswerActions, AnswerSummary, ChatInlineIcon, CollapsibleStepHeader, DIAGRAM_LANGUAGES, FileDownloadChip, InlineStepDetail, InlineStepGroup, InlineStepLabel, Markdown, MarkdownTable, MessageBubble, PROMPT_INPUT_CONTAINER, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageBar, UsageStats, UsageStatsRing, clampPercentage, findMentionToken, findSlashToken, formatPercentage, getChatInlineIconName } from "./AIKit-DcOlHIBr.js";
70
+ import { Table, tableAriaSort } from "./Table-BaVT5Tkn.js";
69
71
  import { Skeleton } from "./internal/components/Skeleton/Skeleton.js";
70
72
  import { DiagramSkeleton } from "./internal/blocks/DiagramShared/DiagramSkeleton.js";
71
73
  import { Progress } from "./internal/components/Progress.js";
72
74
  import { Collapsible } from "./Collapsible-BQXWEOBC.js";
73
- import { Alert } from "./Alert-BsIM_oFK.js";
74
- import { StatusDot, statusDotVariants } from "./internal/components/StatusDot.js";
75
- import { toast } from "./toast-DIC0iNRf.js";
76
- import { Toaster, useNotification } from "./Toast-Dr6Uw7ao.js";
75
+ import { Alert } from "./Alert-UI-CIs-1.js";
76
+ import { toast } from "./toast-CyXEdaCZ.js";
77
+ import { Toaster, useNotification } from "./Toast-PfQf3vj-.js";
77
78
  import { EmptySearchContent } from "./internal/components/EmptySearchContent.js";
78
- import { Card } from "./Card-Dyo7055Q.js";
79
+ import { Card } from "./Card-BQmBWHXl.js";
79
80
  import { EmptyConfigurationActionCard } from "./internal/blocks/EmptyConfigurationActionCard.js";
80
81
  import { EmptyState } from "./internal/blocks/EmptyState.js";
81
82
  import { ErrorState } from "./internal/blocks/ErrorState.js";
@@ -83,27 +84,27 @@ import { SkeletonList } from "./internal/components/Skeleton/SkeletonList.js";
83
84
  import { DotsLoader } from "./internal/components/DotsLoader.js";
84
85
  import { CollapsiblePanel } from "./internal/components/CollapsiblePanel.js";
85
86
  import { PanelWithDetails } from "./internal/components/PanelWithDetails.js";
86
- import { ThemeProvider, ThemeScope, brandSchema, exampleCustomer, keboola, keboolaLegacySidebar, keboolaLegacyTopnav, useThemeScopeContainer } from "./ThemeProvider-DAmNn9Sd.js";
87
- import { AppShell, appShellSlotSelector } from "./AppShell-DRgJxpXW.js";
88
- import { BrandLogo } from "./BrandLogo-CoKBk4MI.js";
87
+ import { ThemeProvider, ThemeScope, agnes, brandSchema, exampleCustomer, harbor, keboola, keboolaLegacySidebar, useThemeScopeContainer } from "./ThemeProvider-VF38VfUa.js";
88
+ import { AppShell, appShellSlotSelector } from "./AppShell-WSQabK8r.js";
89
+ import { BrandLogo } from "./BrandLogo-CKpVSZb6.js";
89
90
  import { AuthLayout } from "./internal/blocks/AuthLayout.js";
90
- import { PageLayout } from "./PageLayout-DSVM-ASz.js";
91
- import { PageHeader } from "./PageHeader-Q3IpCnQd.js";
92
- import { PageToolbar } from "./PageToolbar-BKVJiDAL.js";
93
- import { SectionNav } from "./SectionNav-CNLJsiVG.js";
91
+ import { PageLayout } from "./PageLayout-DiAAILuS.js";
92
+ import { PageHeader } from "./PageHeader-CgfyXpf1.js";
93
+ import { PageToolbar } from "./PageToolbar-CIW0VmKe.js";
94
+ import { SectionNav } from "./SectionNav-TU5i3JeM.js";
94
95
  import { ResizableHandle, ResizablePanel, ResizablePanelGroup, useDefaultLayout } from "./Resizable-D3vYToZH.js";
95
- import { Sidebar, SidebarProvider, useOptionalSidebar, useSidebar } from "./Sidebar-CLEbBtNY.js";
96
+ import { Sidebar, SidebarProvider, useOptionalSidebar, useSidebar } from "./Sidebar-ZLMNIbg5.js";
96
97
  import { useScrollbarPosition } from "./internal/hooks/useScrollbarPosition.js";
97
- import { Navbar } from "./Navbar-Liy1TPI7.js";
98
- import { DEFAULT_WORKBENCH_BAR_HEIGHT_IN_REM, DEFAULT_WORKBENCH_PANEL_HEIGHT_IN_PX, MIN_WORKBENCH_PANEL_HEIGHT_IN_PX, Workbench, useWorkbench } from "./Workbench-UR2FBC7I.js";
99
- import { Breadcrumb } from "./Breadcrumb-xqEUxfwn.js";
100
- import { Tabs, TabsContent } from "./Tabs-eB974xJf.js";
101
- import { Stepper } from "./Stepper-C8sm9ZFM.js";
102
- import { Timeline } from "./Timeline-C8-wnRRr.js";
98
+ import { Navbar } from "./Navbar-B_DNpv5s.js";
99
+ import { DEFAULT_WORKBENCH_BAR_HEIGHT_IN_REM, DEFAULT_WORKBENCH_PANEL_HEIGHT_IN_PX, MIN_WORKBENCH_PANEL_HEIGHT_IN_PX, Workbench, useWorkbench } from "./Workbench-DmZzpkj7.js";
100
+ import { Breadcrumb } from "./Breadcrumb-BUoAZyhO.js";
101
+ import { Tabs, TabsContent } from "./Tabs-CTDmye1N.js";
102
+ import { Stepper } from "./Stepper-BLkLhfnd.js";
103
+ import { Timeline } from "./Timeline-B-I6sb0M.js";
103
104
  import { Avatar } from "./internal/components/Avatar.js";
104
- import { MarkedText } from "./MarkedText-DNGEUVWc.js";
105
- import { Kbd, kbdVariants, keys } from "./Kbd-LCFMumoq.js";
106
- import { Pagination } from "./Pagination-C_b7Xhey.js";
105
+ import { MarkedText } from "./MarkedText-DlmlJO0u.js";
106
+ import { Kbd, kbdVariants, keys } from "./Kbd-J4n1J6i4.js";
107
+ import { Pagination } from "./Pagination-DH3f6LN0.js";
107
108
  import { DiffType, DiffView, computeDiffRows, computeLineInformation } from "./DiffView-ppTIzh2h.js";
108
109
  import { PaneHeader } from "./internal/components/MergeEditor/PaneHeader.js";
109
110
  import { ConflictStatusIndicator } from "./internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js";
@@ -111,9 +112,9 @@ import { useMergeDiff } from "./useMergeDiff-CvowEXJ1.js";
111
112
  import { DashboardHero } from "./internal/blocks/DashboardHero.js";
112
113
  import { StatCard, StatCardGrid } from "./internal/blocks/StatCard.js";
113
114
  import { ChartPanel } from "./internal/blocks/ChartPanel.js";
114
- import { setServerFieldErrors, setSubmitError, useAppForm, withForm } from "./Form-CcK7dRrC.js";
115
+ import { setServerFieldErrors, setSubmitError, useAppForm, withForm } from "./Form-VkzfVPyT.js";
115
116
  import { useAutosizeInput } from "./internal/hooks/useAutosizeInput.js";
116
- import { ZoomableSvg, svgToPngBlob, toSvgFileContent } from "./ZoomableSvg-BZlk3PFJ.js";
117
- import { BrandEditor, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, channelsToHex, contrastRatio, hexToChannels, wcagLevel } from "./BrandEditor-BsTBM3s6.js";
117
+ import { ZoomableSvg, svgToPngBlob, toSvgFileContent } from "./ZoomableSvg-C65nta_r.js";
118
+ import { BrandEditor, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, channelsToHex, contrastRatio, hexToChannels, wcagLevel } from "./BrandEditor-Bkd6dhb8.js";
118
119
  import { Slot } from "@radix-ui/react-slot";
119
- export { Alert, AlertModal, AnswerActions, AnswerSummary, AppShell, ArgoDesignContext, AuthLayout, AutoSaveTextarea, Avatar, Badge, BrandEditor, BrandLogo, Breadcrumb, Button, ButtonGroup, ButtonInline, Calendar, Card, ChartPanel, ChatInlineIcon, Checkbox, ChipEditor, Clipboard, ClipboardButton, ClipboardInline, Collapsible, CollapsiblePanel, CollapsibleStepHeader, ColorInput, ColorModeSwitch, Combobox, Command, CommandGroup, CommandInput, CommandItem, CommandList, ConflictStatusIndicator, CopyField, DEFAULT_COLOR_SCHEME, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, DEFAULT_BRAND_ID as DEFAULT_KEBOOLA_BRAND_ID, DEFAULT_WORKBENCH_BAR_HEIGHT_IN_REM, DEFAULT_WORKBENCH_PANEL_HEIGHT_IN_PX, DIAGRAM_LANGUAGES, DashboardHero, DateInput, DatePicker, DateRangeInput, DateRangePicker, DiagramSkeleton, DiffType, DiffView, DotsLoader, DropdownMenu, EmptyConfigurationActionCard, EmptySearchContent, EmptyState, ErrorState, ExportMenu, FileUpload, FormGroup, FullScreenModal, FullScreenModalBody, FullScreenModalHeader, GoogleButton, HINT_UNDERLINE_CLASS_NAME, HelpBlock, HoverCard, InlineStepDetail, InlineStepGroup, InlineStepLabel, InputGroup, Kbd, Label, Link, MIN_WORKBENCH_PANEL_HEIGHT_IN_PX, Markdown, MarkdownTable, MarkedText, MessageBubble, MicrosoftButton, Modal, MultiActionButtonGroup, MultiCombobox, MultiComboboxField, Navbar, NumberInput, OtpInput, PageHeader, PageLayout, PageToolbar, Pagination, PaneHeader, PanelWithDetails, PasswordInput, PlanApproval, PlanRewritingIndicator, Popconfirm, Popover, Progress, PromptInput, Question, QuestionBlock, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS, RadioGroup, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Search, SearchForm, SearchInput, SearchInputWithNavigation, SectionNav, Select, Separator, Sheet, Sidebar, SidebarProvider, Skeleton, SkeletonList, Slider, Slot, SplitButton, SpotlightBackdrop, StatCard, StatCardGrid, StatusDot, Stepper, SuggestedPrompt, Switch, Table, Tabs, TabsContent, TextInput, Textarea, ThemeProvider, ThemeScope, ThinkingIndicator, TimeInput, TimePicker, Timeline, Toaster, Toggle, ToggleGroup, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, Tooltip, TooltipProvider, Truncated, UsageBar, UsageStats, UsageStatsRing, Workbench, ZoomableSvg, appShellSlotSelector, argoVariants, brandSchema, channelsToHex, clampPercentage, cn, computeDiffRows, computeLineInformation, contrastRatio, copyToClipboard, defaultFilter, exampleCustomer, filterByWords, findLiteralMatches, formatPercentage, getChatInlineIconName, hasLiteralMatch, hexToChannels, isMac, kbdVariants, keboola, keboolaLegacySidebar, keboolaLegacyTopnav, keys, matchByWords, mergeRefs, namedLabel, setServerFieldErrors, setSubmitError, statusDotVariants, svgToPngBlob, tableAriaSort, toSvgFileContent, toast, useAppForm, useArgoDesign, useAutosizeInput, useCommandState, useDefaultLayout, useFileDropTarget, useFileUploadRejections, useMergeDiff, useNotification, useOptionalSidebar, useScrollbarPosition, useSidebar, useStableCallback, useTargetRect, useTheme, useThemeScopeContainer, useWorkbench, wcagLevel, withBlankValues, withForm };
120
+ export { Alert, AlertModal, AnswerActions, AnswerSummary, AppShell, ArgoDesignContext, AuthLayout, AutoSaveTextarea, Avatar, BLANK_VALUES, Badge, BrandEditor, BrandLogo, Breadcrumb, Button, ButtonGroup, ButtonInline, Calendar, Card, ChartPanel, ChatInlineIcon, Checkbox, ChipEditor, Clipboard, ClipboardButton, ClipboardInline, Collapsible, CollapsiblePanel, CollapsibleStepHeader, ColorInput, ColorModeSwitch, Combobox, ComboboxField, Command, CommandGroup, CommandInput, CommandItem, CommandList, ConflictStatusIndicator, CopyField, DEFAULT_COLOR_SCHEME, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, DEFAULT_BRAND_ID as DEFAULT_KEBOOLA_BRAND_ID, DEFAULT_WORKBENCH_BAR_HEIGHT_IN_REM, DEFAULT_WORKBENCH_PANEL_HEIGHT_IN_PX, DIAGRAM_LANGUAGES, DashboardHero, DateInput, DatePicker, DateRangeInput, DateRangePicker, DiagramSkeleton, DiffType, DiffView, DotsLoader, DropdownMenu, EmptyConfigurationActionCard, EmptySearchContent, EmptyState, ErrorState, ExportMenu, FileDownloadChip, FileUpload, FormGroup, FullScreenModal, FullScreenModalBody, FullScreenModalHeader, GoogleButton, HINT_UNDERLINE_CLASS_NAME, HelpBlock, HoverCard, InlineStepDetail, InlineStepGroup, InlineStepLabel, InputGroup, Kbd, Label, Link, MIN_WORKBENCH_PANEL_HEIGHT_IN_PX, Markdown, MarkdownTable, MarkedText, MessageBubble, MicrosoftButton, Modal, MultiActionButtonGroup, MultiCombobox, MultiComboboxField, Navbar, NumberInput, OtpInput, PROMPT_INPUT_CONTAINER, PageHeader, PageLayout, PageToolbar, Pagination, PaneHeader, PanelWithDetails, PasswordInput, PlanApproval, PlanRewritingIndicator, Popconfirm, Popover, Progress, PromptInput, Question, QuestionBlock, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS, RadioGroup, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Search, SearchForm, SearchInput, SearchInputWithNavigation, SectionNav, Select, Separator, Sheet, Sidebar, SidebarProvider, Skeleton, SkeletonList, Slider, Slot, SplitButton, SpotlightBackdrop, StatCard, StatCardGrid, Stepper, SuggestedPrompt, Switch, Table, Tabs, TabsContent, TextInput, Textarea, ThemeProvider, ThemeScope, ThinkingIndicator, TimeInput, TimePicker, Timeline, Toaster, Toggle, ToggleGroup, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, Tooltip, TooltipProvider, Truncated, UsageBar, UsageStats, UsageStatsRing, Workbench, ZoomableSvg, agnes, appShellSlotSelector, argoVariants, brandSchema, channelsToHex, clampPercentage, cn, computeDiffRows, computeLineInformation, contrastRatio, copyToClipboard, defaultFilter, exampleCustomer, filterByWords, findLiteralMatches, findMentionToken, findSlashToken, formatPercentage, forwardAccessibleName, getChatInlineIconName, harbor, hasLiteralMatch, hexToChannels, isMac, kbdVariants, keboola, keboolaLegacySidebar, keys, matchByWords, mergeRefs, namedLabel, setServerFieldErrors, setSubmitError, svgToPngBlob, tableAriaSort, toSvgFileContent, toast, useAppForm, useArgoDesign, useAutosizeInput, useCommandState, useDefaultLayout, useFileDropTarget, useFileUploadRejections, useMergeDiff, useNotification, useOptionalSidebar, useScrollbarPosition, useSidebar, useStableCallback, useTargetRect, useTheme, useThemeScopeContainer, useWorkbench, wcagLevel, withBlankValues, withForm };
@@ -1,2 +1,2 @@
1
- import { AnswerActions, AnswerSummary, ChatInlineIcon, CollapsibleStepHeader, DIAGRAM_LANGUAGES, InlineStepDetail, InlineStepGroup, InlineStepLabel, Markdown, MarkdownTable, MessageBubble, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageBar, UsageStats, UsageStatsRing, clampPercentage, formatPercentage, getChatInlineIconName } from "../../AIKit-ELIsegJz.js";
2
- export { AnswerActions, AnswerSummary, ChatInlineIcon, CollapsibleStepHeader, DIAGRAM_LANGUAGES, InlineStepDetail, InlineStepGroup, InlineStepLabel, Markdown, MarkdownTable, MessageBubble, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageBar, UsageStats, UsageStatsRing, clampPercentage, formatPercentage, getChatInlineIconName };
1
+ import { AnswerActions, AnswerSummary, ChatInlineIcon, CollapsibleStepHeader, DIAGRAM_LANGUAGES, FileDownloadChip, InlineStepDetail, InlineStepGroup, InlineStepLabel, Markdown, MarkdownTable, MessageBubble, PROMPT_INPUT_CONTAINER, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageBar, UsageStats, UsageStatsRing, clampPercentage, findMentionToken, findSlashToken, formatPercentage, getChatInlineIconName } from "../../AIKit-DcOlHIBr.js";
2
+ export { AnswerActions, AnswerSummary, ChatInlineIcon, CollapsibleStepHeader, DIAGRAM_LANGUAGES, FileDownloadChip, InlineStepDetail, InlineStepGroup, InlineStepLabel, Markdown, MarkdownTable, MessageBubble, PROMPT_INPUT_CONTAINER, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageBar, UsageStats, UsageStatsRing, clampPercentage, findMentionToken, findSlashToken, formatPercentage, getChatInlineIconName };
@@ -1,2 +1,2 @@
1
- import { AppShell, appShellSlotSelector } from "../../AppShell-DRgJxpXW.js";
1
+ import { AppShell, appShellSlotSelector } from "../../AppShell-WSQabK8r.js";
2
2
  export { AppShell, appShellSlotSelector };
@@ -1,5 +1,5 @@
1
1
  import { cn } from "../../classNames-BzrkDnOD.js";
2
- import { BrandLogo } from "../../BrandLogo-CoKBk4MI.js";
2
+ import { BrandLogo } from "../../BrandLogo-CKpVSZb6.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/blocks/AuthLayout/AuthLayout.tsx
5
5
  const widthClass = {
@@ -7,13 +7,9 @@ const widthClass = {
7
7
  wide: "tw:max-w-[34rem]"
8
8
  };
9
9
  /**
10
- * Column tracks of the split geometry: the form track carries a floor, the aside takes the rest.
10
+ * Split-geometry column tracks.
11
11
  *
12
- * - The floor is the column's own width plus `SURFACE`'s gutters (`2rem` a side from `sm` up).
13
- * - A bare `1fr` makes the track a share of the viewport instead — `1fr` of `1fr 2fr` is a third of
14
- * it — so the floor binds up to 1536px for `form` and 1824px for `wide`. Below that a bare `1fr`
15
- * hands the column less than `widthClass` asks for and a two-field row collapses to ~180px each.
16
- * - `2fr` keeps the aside the wider half once the floor is met.
12
+ * - The form floor is `widthClass` plus `SURFACE`'s gutters; a bare `1fr` would squeeze the form.
17
13
  */
18
14
  const splitClass = {
19
15
  form: {
@@ -85,31 +81,15 @@ const Footer = ({ ref, className, children, ...props }) => /* @__PURE__ */ jsx("
85
81
  children
86
82
  });
87
83
  /**
88
- * The signed-out page frame — sign-in, sign-up, password reset, MFA, project picker, stack picker.
84
+ * The signed-out page frame — sign-in, sign-up, password reset, MFA, project and stack pickers.
89
85
  *
90
- * - Third member of the page-chrome family: `AppShell` frames the signed-in app, `PageLayout` its
91
- * content column, `AuthLayout` the pages a visitor reaches without a session.
92
- * - Owns the landmarks. `Header` / `Content` / `Footer` are `header` / `main` / `footer`, so every
93
- * element on the page sits inside one — the thing each hand-built copy got wrong differently.
94
- * - Owns the lockup. `Header` pairs the active brand's mark with the `productName` it is given, so
95
- * the page re-skins and still names the product when the brand ships no logo; pass children
96
- * instead to replace the pair with an app-specific lockup.
97
- * - Does **not** own the card. Two of the pages it frames deliberately have none (the form column
98
- * *is* the surface), so `Content` is a plain column — wrap the body in `Card` at the call site.
99
- * - The tinted surface is whatever is not the form: without an `aside` the page is `bg-muted` and the
100
- * card supplies the contrast; with one the form column is `bg-background` and the panel `bg-muted`.
101
- * - Below `lg` the split collapses to one column and the `aside` is dropped. A page whose pitch has
102
- * to survive that — an acquisition funnel — passes `asideCollapse="stack"` to keep it.
103
- *
104
- * **When NOT to use:** a signed-out page that is *navigational* rather than an auth step — a public
105
- * catalog, a shared authorization link — is a document, not a form. Use `AppShell` + `PageLayout`.
86
+ * - Owns the `header` / `main` / `footer` landmarks and the brand lockup.
87
+ * - No card: wrap the body in `Card` at the call site.
88
+ * - Not for navigational signed-out pages (public catalog) — use `AppShell` + `PageLayout`.
106
89
  */
107
90
  const AuthLayout = Object.assign(Root, {
108
- /** Lockup row: `productName` beside the brand's mark, or your own children. `actions` sit opposite. */
109
91
  Header,
110
- /** The form column. Wrap the body in `Card` here if the page wants one. */
111
92
  Content,
112
- /** Legal copy, a way back out, social proof. Pinned to the bottom of the column in the split geometry. */
113
93
  Footer
114
94
  });
115
95
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"AuthLayout.js","names":[],"sources":["../../../src/blocks/AuthLayout/AuthLayout.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\n\nimport { BrandLogo } from '../../components/BrandLogo';\nimport { cn } from '../../utils';\n\n/**\n * Content-column width.\n *\n * - `form` (28rem) — one field per row: sign-in, MFA, password reset, project picker.\n * - `wide` (34rem) — multi-field or two-column forms: registration.\n */\ntype Width = 'form' | 'wide';\n\nconst widthClass = {\n form: 'tw:max-w-md',\n wide: 'tw:max-w-[34rem]',\n} as const satisfies Record<Width, string>;\n\n/**\n * Column tracks of the split geometry: the form track carries a floor, the aside takes the rest.\n *\n * - The floor is the column's own width plus `SURFACE`'s gutters (`2rem` a side from `sm` up).\n * - A bare `1fr` makes the track a share of the viewport instead — `1fr` of `1fr 2fr` is a third of\n * it — so the floor binds up to 1536px for `form` and 1824px for `wide`. Below that a bare `1fr`\n * hands the column less than `widthClass` asks for and a two-field row collapses to ~180px each.\n * - `2fr` keeps the aside the wider half once the floor is met.\n */\nconst splitClass = {\n form: {\n end: 'tw:lg:grid-cols-[minmax(32rem,1fr)_2fr]',\n start: 'tw:lg:grid-cols-[2fr_minmax(32rem,1fr)]',\n },\n wide: {\n end: 'tw:lg:grid-cols-[minmax(38rem,1fr)_2fr]',\n start: 'tw:lg:grid-cols-[2fr_minmax(38rem,1fr)]',\n },\n} as const satisfies Record<Width, Record<'start' | 'end', string>>;\n\n// `svh` rather than `vh`: the page is one screen tall by design, and `vh` on mobile reserves height\n// for browser chrome that is not there, leaving the column scrollable by the height of the toolbar.\nconst SCREEN = 'tw:min-h-svh';\n\n// Padding and horizontal centring of the form column — the screen height is deliberately not here.\n// In the split geometry the grid root carries it and its rows stretch to fill, so the column is\n// full-height anyway; its own `min-h-svh` would instead reserve a whole screen *under* a stacked\n// aside, leaving a short card with an empty viewport below it.\nconst SURFACE = 'tw:flex tw:justify-center tw:px-4 tw:py-12 tw:sm:px-8';\n\nconst COLUMN = 'tw:flex tw:w-full tw:flex-col tw:items-center tw:gap-6';\n\ntype RootProps = ComponentProps<'div'> & {\n width?: Width;\n /** Marketing / illustration panel. Its presence switches the page to the split geometry. */\n aside?: ReactNode;\n /** Which side the `aside` takes on wide screens. */\n asideSide?: 'start' | 'end';\n /**\n * What the `aside` does below `lg`, where the split collapses to one column.\n *\n * - `hide` (default) — the panel is dropped. Right for a page a signed-out *user* asked for: they\n * came to sign in, and the pitch is not why they are here.\n * - `stack` — the panel keeps its `asideSide` order relative to the form and renders above or\n * below it. Right for a page that has to sell: an acquisition funnel loses its social proof\n * otherwise, on the devices most of it arrives on.\n */\n asideCollapse?: 'hide' | 'stack';\n};\n\nconst Root = ({\n ref,\n className,\n width = 'form',\n aside,\n asideSide = 'end',\n asideCollapse = 'hide',\n children,\n ...props\n}: RootProps) => {\n const column = <div className={cn(COLUMN, widthClass[width])}>{children}</div>;\n\n if (!aside) {\n return (\n <div\n ref={ref}\n className={cn(SURFACE, SCREEN, 'tw:items-center tw:bg-muted', className)}\n {...props}\n >\n {column}\n </div>\n );\n }\n\n // The form column is always the floored track and the aside the `2fr` one, whichever side it takes —\n // so DOM order, not an `order` utility, decides the side and the reading order matches the visual one.\n const panel = (\n <aside\n className={cn('tw:bg-muted', asideCollapse === 'stack' ? 'tw:flex' : 'tw:hidden tw:lg:flex')}\n >\n {aside}\n </aside>\n );\n const form = <div className={cn(SURFACE, 'tw:bg-background')}>{column}</div>;\n\n return (\n <div\n ref={ref}\n className={cn('tw:grid', SCREEN, splitClass[width][asideSide], className)}\n {...props}\n >\n {asideSide === 'start' ? panel : form}\n {asideSide === 'start' ? form : panel}\n </div>\n );\n};\n\n/**\n * The lockup: either the page's own, or the brand's mark beside the product name.\n *\n * - Exactly one of the two is required. A logo-only default cannot be trusted to name the product:\n * `BrandLogo` returns `null` for a brand that ships no logo, and falls back to the mark for one\n * that ships no wordmark — an auth page has no bar around it, so what is left names nothing.\n * - `productName` is text, not part of the image, for the same reason.\n */\ntype Lockup =\n | { children: ReactNode; productName?: never }\n | { children?: never; productName: ReactNode };\n\ntype HeaderProps = Omit<ComponentProps<'header'>, 'children'> & {\n actions?: ReactNode;\n} & Lockup;\n\nconst Header = ({ ref, className, actions, productName, children, ...props }: HeaderProps) => (\n <header\n ref={ref}\n className={cn(\n 'tw:flex tw:items-center tw:gap-4',\n // Controls need somewhere to sit apart from the mark; without them the mark centres instead.\n actions && 'tw:w-full tw:justify-between',\n className,\n )}\n {...props}\n >\n {children ?? (\n <span className=\"tw:flex tw:items-center tw:gap-3\">\n {/* `variant=\"mark\"`: a wordmark already spells the brand, so pairing it with the product\n name states the brand twice. `h-8`, not the bar's `h-6` — with no chrome around it the\n lockup is the only thing naming the product. */}\n <BrandLogo variant=\"mark\" className=\"tw:h-8 tw:text-primary\" />\n <span className=\"tw:text-lg tw:font-semibold\">{productName}</span>\n </span>\n )}\n {actions && <div className=\"tw:flex tw:items-center tw:gap-1\">{actions}</div>}\n </header>\n);\n\nconst Content = ({ ref, className, children, ...props }: ComponentProps<'main'>) => (\n <main\n ref={ref}\n className={cn('tw:flex tw:min-h-0 tw:w-full tw:flex-1 tw:flex-col tw:gap-6', className)}\n {...props}\n >\n {children}\n </main>\n);\n\nconst Footer = ({ ref, className, children, ...props }: ComponentProps<'footer'>) => (\n <footer\n ref={ref}\n className={cn('tw:mt-auto tw:w-full tw:text-xs tw:text-muted-foreground', className)}\n {...props}\n >\n {children}\n </footer>\n);\n\n/**\n * The signed-out page frame — sign-in, sign-up, password reset, MFA, project picker, stack picker.\n *\n * - Third member of the page-chrome family: `AppShell` frames the signed-in app, `PageLayout` its\n * content column, `AuthLayout` the pages a visitor reaches without a session.\n * - Owns the landmarks. `Header` / `Content` / `Footer` are `header` / `main` / `footer`, so every\n * element on the page sits inside one — the thing each hand-built copy got wrong differently.\n * - Owns the lockup. `Header` pairs the active brand's mark with the `productName` it is given, so\n * the page re-skins and still names the product when the brand ships no logo; pass children\n * instead to replace the pair with an app-specific lockup.\n * - Does **not** own the card. Two of the pages it frames deliberately have none (the form column\n * *is* the surface), so `Content` is a plain column — wrap the body in `Card` at the call site.\n * - The tinted surface is whatever is not the form: without an `aside` the page is `bg-muted` and the\n * card supplies the contrast; with one the form column is `bg-background` and the panel `bg-muted`.\n * - Below `lg` the split collapses to one column and the `aside` is dropped. A page whose pitch has\n * to survive that — an acquisition funnel — passes `asideCollapse=\"stack\"` to keep it.\n *\n * **When NOT to use:** a signed-out page that is *navigational* rather than an auth step — a public\n * catalog, a shared authorization link — is a document, not a form. Use `AppShell` + `PageLayout`.\n */\nexport const AuthLayout = Object.assign(Root, {\n /** Lockup row: `productName` beside the brand's mark, or your own children. `actions` sit opposite. */\n Header,\n /** The form column. Wrap the body in `Card` here if the page wants one. */\n Content,\n /** Legal copy, a way back out, social proof. Pinned to the bottom of the column in the split geometry. */\n Footer,\n});\n\nexport type { RootProps as AuthLayoutProps };\n"],"mappings":";;;;AAaA,MAAM,aAAa;CACjB,MAAM;CACN,MAAM;AACR;;;;;;;;;;AAWA,MAAM,aAAa;CACjB,MAAM;EACJ,KAAK;EACL,OAAO;CACT;CACA,MAAM;EACJ,KAAK;EACL,OAAO;CACT;AACF;AAIA,MAAM,SAAS;AAMf,MAAM,UAAU;AAEhB,MAAM,SAAS;AAoBf,MAAM,QAAQ,EACZ,KACA,WACA,QAAQ,QACR,OACA,YAAY,OACZ,gBAAgB,QAChB,UACA,GAAG,YACY;CACf,MAAM,SAAS,oBAAC,OAAD;EAAK,WAAW,GAAG,QAAQ,WAAW,MAAM;EAAI;CAAc,CAAA;CAE7E,IAAI,CAAC,OACH,OACE,oBAAC,OAAD;EACO;EACL,WAAW,GAAG,SAAS,QAAQ,+BAA+B,SAAS;EACvE,GAAI;EAEH,UAAA;CACE,CAAA;CAMT,MAAM,QACJ,oBAAC,SAAD;EACE,WAAW,GAAG,eAAe,kBAAkB,UAAU,YAAY,sBAAsB;EAE1F,UAAA;CACI,CAAA;CAET,MAAM,OAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,SAAS,kBAAkB;EAAI,UAAA;CAAY,CAAA;CAE3E,OACE,qBAAC,OAAD;EACO;EACL,WAAW,GAAG,WAAW,QAAQ,WAAW,MAAM,CAAC,YAAY,SAAS;EACxE,GAAI;EAHN,UAAA,CAKG,cAAc,UAAU,QAAQ,MAChC,cAAc,UAAU,OAAO,KAC7B;;AAET;AAkBA,MAAM,UAAU,EAAE,KAAK,WAAW,SAAS,aAAa,UAAU,GAAG,YACnE,qBAAC,UAAD;CACO;CACL,WAAW,GACT,oCAEA,WAAW,gCACX,SACF;CACA,GAAI;CARN,UAAA,CAUG,YACC,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA,CAIE,oBAAC,WAAD;GAAW,SAAQ;GAAO,WAAU;EAA0B,CAAA,GAC9D,oBAAC,QAAD;GAAM,WAAU;GAA+B,UAAA;EAAkB,CAAA,CAC7D;CAEP,CAAA,GAAA,WAAW,oBAAC,OAAD;EAAK,WAAU;EAAoC,UAAA;CAAa,CAAA,CACtE;;AAGV,MAAM,WAAW,EAAE,KAAK,WAAW,UAAU,GAAG,YAC9C,oBAAC,QAAD;CACO;CACL,WAAW,GAAG,+DAA+D,SAAS;CACtF,GAAI;CAEH;AACG,CAAA;AAGR,MAAM,UAAU,EAAE,KAAK,WAAW,UAAU,GAAG,YAC7C,oBAAC,UAAD;CACO;CACL,WAAW,GAAG,4DAA4D,SAAS;CACnF,GAAI;CAEH;AACK,CAAA;;;;;;;;;;;;;;;;;;;;;AAuBV,MAAa,aAAa,OAAO,OAAO,MAAM;;CAE5C;;CAEA;;CAEA;AACF,CAAC"}
1
+ {"version":3,"file":"AuthLayout.js","names":[],"sources":["../../../src/blocks/AuthLayout/AuthLayout.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\n\nimport { BrandLogo } from '../../components/BrandLogo';\nimport { cn } from '../../utils';\n\n/**\n * Content-column width.\n *\n * - `form` (28rem) — one field per row: sign-in, MFA, password reset, project picker.\n * - `wide` (34rem) — multi-field or two-column forms: registration.\n */\ntype Width = 'form' | 'wide';\n\nconst widthClass = {\n form: 'tw:max-w-md',\n wide: 'tw:max-w-[34rem]',\n} as const satisfies Record<Width, string>;\n\n/**\n * Split-geometry column tracks.\n *\n * - The form floor is `widthClass` plus `SURFACE`'s gutters; a bare `1fr` would squeeze the form.\n */\nconst splitClass = {\n form: {\n end: 'tw:lg:grid-cols-[minmax(32rem,1fr)_2fr]',\n start: 'tw:lg:grid-cols-[2fr_minmax(32rem,1fr)]',\n },\n wide: {\n end: 'tw:lg:grid-cols-[minmax(38rem,1fr)_2fr]',\n start: 'tw:lg:grid-cols-[2fr_minmax(38rem,1fr)]',\n },\n} as const satisfies Record<Width, Record<'start' | 'end', string>>;\n\n// `svh`, not `vh`: `vh` on mobile makes the page scrollable by the toolbar's height.\nconst SCREEN = 'tw:min-h-svh';\n\n// No `SCREEN` here: in the split geometry the grid root carries it, and a column `min-h-svh`\n// would leave an empty screen under a stacked aside.\nconst SURFACE = 'tw:flex tw:justify-center tw:px-4 tw:py-12 tw:sm:px-8';\n\nconst COLUMN = 'tw:flex tw:w-full tw:flex-col tw:items-center tw:gap-6';\n\ntype RootProps = ComponentProps<'div'> & {\n width?: Width;\n /** Marketing / illustration panel. Its presence switches the page to the split geometry. */\n aside?: ReactNode;\n /** Which side the `aside` takes on wide screens. */\n asideSide?: 'start' | 'end';\n /** The `aside` below `lg`: `hide` it (sign-in) or `stack` it by the form (acquisition funnels). */\n asideCollapse?: 'hide' | 'stack';\n};\n\nconst Root = ({\n ref,\n className,\n width = 'form',\n aside,\n asideSide = 'end',\n asideCollapse = 'hide',\n children,\n ...props\n}: RootProps) => {\n const column = <div className={cn(COLUMN, widthClass[width])}>{children}</div>;\n\n if (!aside) {\n return (\n <div\n ref={ref}\n className={cn(SURFACE, SCREEN, 'tw:items-center tw:bg-muted', className)}\n {...props}\n >\n {column}\n </div>\n );\n }\n\n // DOM order, not an `order` utility, picks the side, so reading order matches the visual one.\n const panel = (\n <aside\n className={cn('tw:bg-muted', asideCollapse === 'stack' ? 'tw:flex' : 'tw:hidden tw:lg:flex')}\n >\n {aside}\n </aside>\n );\n const form = <div className={cn(SURFACE, 'tw:bg-background')}>{column}</div>;\n\n return (\n <div\n ref={ref}\n className={cn('tw:grid', SCREEN, splitClass[width][asideSide], className)}\n {...props}\n >\n {asideSide === 'start' ? panel : form}\n {asideSide === 'start' ? form : panel}\n </div>\n );\n};\n\n/**\n * The lockup: either the page's own, or the brand's mark beside the product name.\n *\n * - Exactly one is required: `BrandLogo` alone may render nothing or a bare mark.\n */\ntype Lockup =\n | { children: ReactNode; productName?: never }\n | { children?: never; productName: ReactNode };\n\ntype HeaderProps = Omit<ComponentProps<'header'>, 'children'> & {\n actions?: ReactNode;\n} & Lockup;\n\nconst Header = ({ ref, className, actions, productName, children, ...props }: HeaderProps) => (\n <header\n ref={ref}\n className={cn(\n 'tw:flex tw:items-center tw:gap-4',\n actions && 'tw:w-full tw:justify-between',\n className,\n )}\n {...props}\n >\n {children ?? (\n <span className=\"tw:flex tw:items-center tw:gap-3\">\n {/* `mark`: a wordmark beside the product name would state the brand twice. */}\n <BrandLogo variant=\"mark\" className=\"tw:h-8 tw:text-primary\" />\n <span className=\"tw:text-lg tw:font-semibold\">{productName}</span>\n </span>\n )}\n {actions && <div className=\"tw:flex tw:items-center tw:gap-1\">{actions}</div>}\n </header>\n);\n\nconst Content = ({ ref, className, children, ...props }: ComponentProps<'main'>) => (\n <main\n ref={ref}\n className={cn('tw:flex tw:min-h-0 tw:w-full tw:flex-1 tw:flex-col tw:gap-6', className)}\n {...props}\n >\n {children}\n </main>\n);\n\nconst Footer = ({ ref, className, children, ...props }: ComponentProps<'footer'>) => (\n <footer\n ref={ref}\n className={cn('tw:mt-auto tw:w-full tw:text-xs tw:text-muted-foreground', className)}\n {...props}\n >\n {children}\n </footer>\n);\n\n/**\n * The signed-out page frame — sign-in, sign-up, password reset, MFA, project and stack pickers.\n *\n * - Owns the `header` / `main` / `footer` landmarks and the brand lockup.\n * - No card: wrap the body in `Card` at the call site.\n * - Not for navigational signed-out pages (public catalog) — use `AppShell` + `PageLayout`.\n */\nexport const AuthLayout = Object.assign(Root, {\n Header,\n Content,\n Footer,\n});\n\nexport type { RootProps as AuthLayoutProps };\n"],"mappings":";;;;AAaA,MAAM,aAAa;CACjB,MAAM;CACN,MAAM;AACR;;;;;;AAOA,MAAM,aAAa;CACjB,MAAM;EACJ,KAAK;EACL,OAAO;CACT;CACA,MAAM;EACJ,KAAK;EACL,OAAO;CACT;AACF;AAGA,MAAM,SAAS;AAIf,MAAM,UAAU;AAEhB,MAAM,SAAS;AAYf,MAAM,QAAQ,EACZ,KACA,WACA,QAAQ,QACR,OACA,YAAY,OACZ,gBAAgB,QAChB,UACA,GAAG,YACY;CACf,MAAM,SAAS,oBAAC,OAAD;EAAK,WAAW,GAAG,QAAQ,WAAW,MAAM;EAAI;CAAc,CAAA;CAE7E,IAAI,CAAC,OACH,OACE,oBAAC,OAAD;EACO;EACL,WAAW,GAAG,SAAS,QAAQ,+BAA+B,SAAS;EACvE,GAAI;EAEH,UAAA;CACE,CAAA;CAKT,MAAM,QACJ,oBAAC,SAAD;EACE,WAAW,GAAG,eAAe,kBAAkB,UAAU,YAAY,sBAAsB;EAE1F,UAAA;CACI,CAAA;CAET,MAAM,OAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,SAAS,kBAAkB;EAAI,UAAA;CAAY,CAAA;CAE3E,OACE,qBAAC,OAAD;EACO;EACL,WAAW,GAAG,WAAW,QAAQ,WAAW,MAAM,CAAC,YAAY,SAAS;EACxE,GAAI;EAHN,UAAA,CAKG,cAAc,UAAU,QAAQ,MAChC,cAAc,UAAU,OAAO,KAC7B;;AAET;AAeA,MAAM,UAAU,EAAE,KAAK,WAAW,SAAS,aAAa,UAAU,GAAG,YACnE,qBAAC,UAAD;CACO;CACL,WAAW,GACT,oCACA,WAAW,gCACX,SACF;CACA,GAAI;CAPN,UAAA,CASG,YACC,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA,CAEE,oBAAC,WAAD;GAAW,SAAQ;GAAO,WAAU;EAA0B,CAAA,GAC9D,oBAAC,QAAD;GAAM,WAAU;GAA+B,UAAA;EAAkB,CAAA,CAC7D;CAEP,CAAA,GAAA,WAAW,oBAAC,OAAD;EAAK,WAAU;EAAoC,UAAA;CAAa,CAAA,CACtE;;AAGV,MAAM,WAAW,EAAE,KAAK,WAAW,UAAU,GAAG,YAC9C,oBAAC,QAAD;CACO;CACL,WAAW,GAAG,+DAA+D,SAAS;CACtF,GAAI;CAEH;AACG,CAAA;AAGR,MAAM,UAAU,EAAE,KAAK,WAAW,UAAU,GAAG,YAC7C,oBAAC,UAAD;CACO;CACL,WAAW,GAAG,4DAA4D,SAAS;CACnF,GAAI;CAEH;AACK,CAAA;;;;;;;;AAUV,MAAa,aAAa,OAAO,OAAO,MAAM;CAC5C;CACA;CACA;AACF,CAAC"}
@@ -1,2 +1,2 @@
1
- import { AutoSaveTextarea } from "../../AutoSaveTextarea-BeuWuszr.js";
1
+ import { AutoSaveTextarea } from "../../AutoSaveTextarea-C5iIr2Ts.js";
2
2
  export { AutoSaveTextarea };
@@ -1,2 +1,2 @@
1
- import { BrandEditor, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, channelsToHex, contrastRatio, hexToChannels, wcagLevel } from "../../BrandEditor-BsTBM3s6.js";
1
+ import { BrandEditor, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, channelsToHex, contrastRatio, hexToChannels, wcagLevel } from "../../BrandEditor-Bkd6dhb8.js";
2
2
  export { BrandEditor, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, channelsToHex, contrastRatio, hexToChannels, wcagLevel };
@@ -1,16 +1,12 @@
1
1
  import { cn } from "../../classNames-BzrkDnOD.js";
2
- import { Card } from "../../Card-Dyo7055Q.js";
2
+ import { Card } from "../../Card-BQmBWHXl.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/blocks/ChartPanel/ChartPanel.tsx
5
5
  /**
6
- * Signature chart panel — a `Card` shell with a title/description header, an optional toolbar,
7
- * a chart body, and an optional footer. Pass a `@keboola/design/charts` chart (`LineChart`,
8
- * `BarChart`, `AreaChart`, `PieChart`) as children; the panel owns the chrome, the chart owns
9
- * its own responsive container and themed palette.
6
+ * `Card` chrome around a `@keboola/design/charts` chart passed as children.
10
7
  *
11
- * **When to use:** any framed data-viz block on a dashboard.
12
- * **When NOT to use:** for a KPI number use `StatCard`; for a raw unframed chart drop the chart
13
- * component directly. Charts follow the active brand's chart palette — never hardcode colours.
8
+ * - The chart owns its responsive container and brand palette — never hardcode colours.
9
+ * - For a KPI number use `StatCard`; for an unframed chart use the chart directly.
14
10
  */
15
11
  const ChartPanel = ({ title, description, titleAs = "h3", toolbar, footer, className, bordered = true, children, ...rest }) => /* @__PURE__ */ jsxs(Card, {
16
12
  bordered,
@@ -1 +1 @@
1
- {"version":3,"file":"ChartPanel.js","names":[],"sources":["../../../src/blocks/ChartPanel/ChartPanel.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\n\nimport { Card } from '../../components/Card';\nimport { cn } from '../../utils';\n\ntype RootProps = Omit<ComponentProps<typeof Card>, 'title'> & {\n /** Panel heading. */\n title: ReactNode;\n /** Optional supporting line under the title. */\n description?: ReactNode;\n /** Heading level for the title — defaults to `h3`. Set to sit correctly under a page `h1`/`h2`. */\n titleAs?: ComponentProps<typeof Card.Title>['as'];\n /** Right-aligned header slot — range picker, legend toggle, menu, etc. */\n toolbar?: ReactNode;\n /** Optional footer row (e.g. a source note or an inline legend). */\n footer?: ReactNode;\n};\n\n/**\n * Signature chart panel — a `Card` shell with a title/description header, an optional toolbar,\n * a chart body, and an optional footer. Pass a `@keboola/design/charts` chart (`LineChart`,\n * `BarChart`, `AreaChart`, `PieChart`) as children; the panel owns the chrome, the chart owns\n * its own responsive container and themed palette.\n *\n * **When to use:** any framed data-viz block on a dashboard.\n * **When NOT to use:** for a KPI number use `StatCard`; for a raw unframed chart drop the chart\n * component directly. Charts follow the active brand's chart palette — never hardcode colours.\n */\nexport const ChartPanel = ({\n title,\n description,\n titleAs = 'h3',\n toolbar,\n footer,\n className,\n bordered = true,\n children,\n ...rest\n}: RootProps) => (\n <Card bordered={bordered} className={cn('tw:gap-4', className)} {...rest}>\n <Card.Header className=\"tw:flex tw:items-start tw:justify-between tw:gap-4\">\n <div className=\"tw:flex tw:flex-col tw:gap-1\">\n <Card.Title as={titleAs}>{title}</Card.Title>\n {description ? (\n <p className=\"tw:m-0 tw:text-sm tw:text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n {toolbar ? (\n <div className=\"tw:flex tw:shrink-0 tw:items-center tw:gap-2\">{toolbar}</div>\n ) : null}\n </Card.Header>\n <Card.Content>{children}</Card.Content>\n {footer ? (\n <div className=\"tw:border-0 tw:border-t tw:border-solid tw:border-border tw:pt-3 tw:text-sm tw:text-muted-foreground\">\n {footer}\n </div>\n ) : null}\n </Card>\n);\n\nexport type { RootProps as ChartPanelProps };\n"],"mappings":";;;;;;;;;;;;;;AA4BA,MAAa,cAAc,EACzB,OACA,aACA,UAAU,MACV,SACA,QACA,WACA,WAAW,MACX,UACA,GAAG,WAEH,qBAAC,MAAD;CAAgB;CAAU,WAAW,GAAG,YAAY,SAAS;CAAG,GAAI;CAApE,UAAA;EACE,qBAAC,KAAK,QAAN;GAAa,WAAU;GAAvB,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,KAAK,OAAN;KAAY,IAAI;KAAU,UAAA;IAAkB,CAAA,GAC3C,cACC,oBAAC,KAAD;KAAG,WAAU;KAA8C,UAAA;IAAe,CAAA,IACxE,IACD;GACJ,CAAA,GAAA,UACC,oBAAC,OAAD;IAAK,WAAU;IAAgD,UAAA;GAAa,CAAA,IAC1E,IACO;;EACb,oBAAC,KAAK,SAAN,EAAe,SAAuB,CAAA;EACrC,SACC,oBAAC,OAAD;GAAK,WAAU;GACZ,UAAA;EACE,CAAA,IACH;CACA"}
1
+ {"version":3,"file":"ChartPanel.js","names":[],"sources":["../../../src/blocks/ChartPanel/ChartPanel.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\n\nimport { Card } from '../../components/Card';\nimport { cn } from '../../utils';\n\ntype RootProps = Omit<ComponentProps<typeof Card>, 'title'> & {\n title: ReactNode;\n description?: ReactNode;\n /** Defaults to `h3`; set it to fit the page's heading outline. */\n titleAs?: ComponentProps<typeof Card.Title>['as'];\n /** Right-aligned header slot. */\n toolbar?: ReactNode;\n footer?: ReactNode;\n};\n\n/**\n * `Card` chrome around a `@keboola/design/charts` chart passed as children.\n *\n * - The chart owns its responsive container and brand palette — never hardcode colours.\n * - For a KPI number use `StatCard`; for an unframed chart use the chart directly.\n */\nexport const ChartPanel = ({\n title,\n description,\n titleAs = 'h3',\n toolbar,\n footer,\n className,\n bordered = true,\n children,\n ...rest\n}: RootProps) => (\n <Card bordered={bordered} className={cn('tw:gap-4', className)} {...rest}>\n <Card.Header className=\"tw:flex tw:items-start tw:justify-between tw:gap-4\">\n <div className=\"tw:flex tw:flex-col tw:gap-1\">\n <Card.Title as={titleAs}>{title}</Card.Title>\n {description ? (\n <p className=\"tw:m-0 tw:text-sm tw:text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n {toolbar ? (\n <div className=\"tw:flex tw:shrink-0 tw:items-center tw:gap-2\">{toolbar}</div>\n ) : null}\n </Card.Header>\n <Card.Content>{children}</Card.Content>\n {footer ? (\n <div className=\"tw:border-0 tw:border-t tw:border-solid tw:border-border tw:pt-3 tw:text-sm tw:text-muted-foreground\">\n {footer}\n </div>\n ) : null}\n </Card>\n);\n\nexport type { RootProps as ChartPanelProps };\n"],"mappings":";;;;;;;;;;AAqBA,MAAa,cAAc,EACzB,OACA,aACA,UAAU,MACV,SACA,QACA,WACA,WAAW,MACX,UACA,GAAG,WAEH,qBAAC,MAAD;CAAgB;CAAU,WAAW,GAAG,YAAY,SAAS;CAAG,GAAI;CAApE,UAAA;EACE,qBAAC,KAAK,QAAN;GAAa,WAAU;GAAvB,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,KAAK,OAAN;KAAY,IAAI;KAAU,UAAA;IAAkB,CAAA,GAC3C,cACC,oBAAC,KAAD;KAAG,WAAU;KAA8C,UAAA;IAAe,CAAA,IACxE,IACD;GACJ,CAAA,GAAA,UACC,oBAAC,OAAD;IAAK,WAAU;IAAgD,UAAA;GAAa,CAAA,IAC1E,IACO;;EACb,oBAAC,KAAK,SAAN,EAAe,SAAuB,CAAA;EACrC,SACC,oBAAC,OAAD;GAAK,WAAU;GACZ,UAAA;EACE,CAAA,IACH;CACA"}
@@ -1,10 +1,10 @@
1
- import { splitEntry } from "../../utils-BW4AE8VP.js";
2
- import { useArgoDesign } from "../../context-D7X470dy.js";
1
+ import { splitEntry } from "../../utils-Bd28bWgm.js";
2
+ import { useArgoDesign } from "../../context-U293r3v-.js";
3
3
  import { mergeRefs } from "../utils/mergeRefs.js";
4
- import { X } from "../../icons-Cek151jC.js";
5
- import { InputGroup } from "../../InputGroup-Do8K2hvD.js";
6
- import { useControllableState } from "../../useControllableState-M6494mCT.js";
7
- import { Badge } from "../../Badge-o5jURtpB.js";
4
+ import { X } from "../../icons-wcA70iQx.js";
5
+ import { InputGroup } from "../../InputGroup-CrlMRz4X.js";
6
+ import { useControllableState } from "../../useControllableState-CUYXMsfz.js";
7
+ import { Badge } from "../../Badge-DIjhwPvh.js";
8
8
  import { useRef, useState } from "react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/blocks/ChipEditor/ChipEditor.tsx
@@ -13,15 +13,10 @@ const sameValue = (a, b) => a.toLowerCase() === b.toLowerCase();
13
13
  /**
14
14
  * Free-text token editor — type a value, press Enter, it becomes a removable chip.
15
15
  *
16
- * **When to use:** a list of strings the user writes rather than picks — tags, feature flags,
17
- * column names, permitted email domains. It is the one chip editor on the platform, so an app
18
- * never rebuilds the input-plus-chips row itself.
19
- * **When NOT to use:** when the values come from a known list use `MultiCombobox` (with
20
- * `allowCreate` when the list is open-ended) — a searchable popup beats blind typing. A list the
21
- * user cannot edit is a row of plain `Badge`s.
22
- * **Composition:** wrap in a `FormGroup` for a label and error state, or pass `state="error"` /
23
- * `aria-invalid` directly. Values are compared case-insensitively, so one already held is never
24
- * added twice.
16
+ * - **Use** for strings the user writes rather than picks; the platform's one chip editor.
17
+ * - **Not** for values from a known list — use `MultiCombobox` (`allowCreate` if open-ended).
18
+ * - Wrap in a `FormGroup` for label and error state.
19
+ * - Values are compared case-insensitively.
25
20
  */
26
21
  const ChipEditor = ({ ref: forwardedRef, value: valueProp, defaultValue, onValueChange, separator = ",", canAdd, chipColor, removeLabel = defaultRemoveLabel, testId, state = "default", sizing = "default", variant, focusVariant = "default", className, disabled = false, readOnly = false, onChange, onBlur, onKeyDown, ...inputProps }) => {
27
22
  const renderArgo = useArgoDesign();
@@ -34,13 +29,10 @@ const ChipEditor = ({ ref: forwardedRef, value: valueProp, defaultValue, onValue
34
29
  });
35
30
  const isEditable = !disabled && !readOnly;
36
31
  /**
37
- * Turns typed text into chips, and answers whether the text is spent.
32
+ * Turns typed text into chips; returns whether the text is spent.
38
33
  *
39
- * - The split runs first, so one entry can add several values.
40
- * - A value already held adds nothing, but the text is still spent — the user's intent is
41
- * satisfied by the chip that is already there.
42
- * - A value `canAdd` rejects is the one case the text survives: the field still shows what the
43
- * user has to fix.
34
+ * - A duplicate adds nothing but still spends the text.
35
+ * - Only a value `canAdd` rejects keeps the text, so the user can fix it.
44
36
  */
45
37
  const commit = (entry) => {
46
38
  const parts = splitEntry(entry, separator).map((part) => part.trim()).filter((part) => part !== "");
@@ -1 +1 @@
1
- {"version":3,"file":"ChipEditor.js","names":[],"sources":["../../../src/blocks/ChipEditor/ChipEditor.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { ChangeEvent, ComponentProps, ComponentRef, FocusEvent, KeyboardEvent } from 'react';\n\nimport { Badge } from '../../components/Badge';\nimport { InputGroup } from '../../components/InputGroup';\nimport { useArgoDesign } from '../../components/ThemeProvider/context';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { DEFAULT_ENTRY_SEPARATOR, mergeRefs, splitEntry } from '../../utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'sizing' | 'state'\n>;\n\ntype BadgeColor = ComponentProps<typeof Badge>['color'];\n\ntype OwnProps = {\n value?: string[];\n defaultValue?: string[];\n /** Called with the whole next list whenever a value is added or removed. */\n onValueChange?: (value: string[]) => void;\n /**\n * Splits one committed entry into several values — the same split as `MultiCombobox`'s\n * `createSeparator`, so a pasted list becomes one chip per value rather than a chip literally\n * named `id1, id2, id3`. `null` for a value that can itself contain the separator.\n */\n separator?: string | RegExp | null;\n /**\n * Gates each value, after the split and before it becomes a chip.\n *\n * - Reach for it when the value has a **format** the user must get right — an identifier, an\n * email, a domain.\n * - A pasted list keeps the values that pass and drops the rest, so one bad value never costs\n * the good ones.\n */\n canAdd?: (value: string) => boolean;\n /** The chip colour. Decorative — it categorises values, it does not encode their state. */\n chipColor?: BadgeColor;\n /** Names each remove button for a screen reader. */\n removeLabel?: (value: string) => string;\n testId?: string;\n};\n\nexport type Props = InputGroupProps &\n OwnProps &\n Omit<ComponentProps<'input'>, 'value' | 'defaultValue' | 'type' | 'prefix'>;\n\nconst defaultRemoveLabel = (value: string) => `Remove ${value}`;\n\nconst sameValue = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\n\n/**\n * Free-text token editor — type a value, press Enter, it becomes a removable chip.\n *\n * **When to use:** a list of strings the user writes rather than picks — tags, feature flags,\n * column names, permitted email domains. It is the one chip editor on the platform, so an app\n * never rebuilds the input-plus-chips row itself.\n * **When NOT to use:** when the values come from a known list use `MultiCombobox` (with\n * `allowCreate` when the list is open-ended) — a searchable popup beats blind typing. A list the\n * user cannot edit is a row of plain `Badge`s.\n * **Composition:** wrap in a `FormGroup` for a label and error state, or pass `state=\"error\"` /\n * `aria-invalid` directly. Values are compared case-insensitively, so one already held is never\n * added twice.\n */\nexport const ChipEditor = ({\n ref: forwardedRef,\n value: valueProp,\n defaultValue,\n onValueChange,\n separator = DEFAULT_ENTRY_SEPARATOR,\n canAdd,\n chipColor,\n removeLabel = defaultRemoveLabel,\n testId,\n state = 'default',\n sizing = 'default',\n variant,\n focusVariant = 'default',\n className,\n disabled = false,\n readOnly = false,\n onChange,\n onBlur,\n onKeyDown,\n ...inputProps\n}: Props) => {\n const renderArgo = useArgoDesign();\n const inputRef = useRef<ComponentRef<'input'>>(null);\n const [query, setQuery] = useState('');\n\n const [values, setValues] = useControllableState<string[]>({\n prop: valueProp,\n defaultProp: defaultValue ?? [],\n onChange: onValueChange,\n });\n\n const isEditable = !disabled && !readOnly;\n\n /**\n * Turns typed text into chips, and answers whether the text is spent.\n *\n * - The split runs first, so one entry can add several values.\n * - A value already held adds nothing, but the text is still spent — the user's intent is\n * satisfied by the chip that is already there.\n * - A value `canAdd` rejects is the one case the text survives: the field still shows what the\n * user has to fix.\n */\n const commit = (entry: string): { isSpent: boolean } => {\n const parts = splitEntry(entry, separator)\n .map((part) => part.trim())\n .filter((part) => part !== '');\n\n const accepted = parts.filter((part) => canAdd?.(part) ?? true);\n const added = accepted.filter(\n (part, index) =>\n !values.some((held) => sameValue(held, part)) &&\n accepted.findIndex((other) => sameValue(other, part)) === index,\n );\n\n if (added.length > 0) setValues([...values, ...added]);\n\n return { isSpent: accepted.length === parts.length };\n };\n\n const commitAndClear = (entry: string) => {\n if (commit(entry).isSpent) setQuery('');\n };\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event);\n const next = event.target.value;\n\n // Typing (or pasting) the separator ends a value on the spot. Everything up to the last one\n // commits; the fragment after it stays in the field, because the user may still be typing it.\n // A `RegExp` separator has no character to look for, so only a string one does this.\n if (typeof separator === 'string' && next.includes(separator)) {\n const cut = next.lastIndexOf(separator);\n commit(next.slice(0, cut));\n setQuery(next.slice(cut + separator.length));\n return;\n }\n\n setQuery(next);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (event.key === 'Enter') {\n // Always prevented: Enter in a field that takes several values means \"add this one\", never\n // \"submit the form it happens to sit in\".\n event.preventDefault();\n commitAndClear(query);\n return;\n }\n\n if (event.key === 'Backspace' && query === '' && values.length > 0) {\n setValues(values.slice(0, -1));\n return;\n }\n\n if (event.key === 'Escape' && query !== '') {\n // Only while there is text to discard — an empty field lets Escape reach whatever overlay\n // the editor sits in.\n event.preventDefault();\n event.stopPropagation();\n setQuery('');\n }\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n onBlur?.(event);\n // A value typed and then clicked away from is a value the user meant to add — dropping it\n // silently is what every hand-rolled chip row got wrong.\n commitAndClear(query);\n };\n\n const removeAt = (index: number) => {\n setValues(values.filter((_, position) => position !== index));\n inputRef.current?.focus();\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}\n >\n <InputGroup.Addon align=\"block-start\" className=\"tw:flex-wrap\" role=\"list\">\n {values.map((value, index) => (\n <Badge.Root\n key={value}\n role=\"listitem\"\n color={chipColor}\n variant={renderArgo ? 'pill' : 'default'}\n className=\"tw:max-w-40\"\n >\n {/* Same cap and the same `title` as a `MultiCombobox` chip — the two chip rows are the\n same object to a user, so they truncate at the same width. */}\n <Badge.Label title={value}>{value}</Badge.Label>\n {isEditable && (\n <Badge.Addon variant=\"inline\" align=\"inline-end\">\n <Badge.Button aria-label={removeLabel(value)} onClick={() => removeAt(index)}>\n <X className=\"tw:size-3\" />\n </Badge.Button>\n </Badge.Addon>\n )}\n </Badge.Root>\n ))}\n </InputGroup.Addon>\n\n <InputGroup.Input\n {...inputProps}\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n type=\"text\"\n value={query}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n />\n </InputGroup>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ChipEditor.js","names":[],"sources":["../../../src/blocks/ChipEditor/ChipEditor.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { ChangeEvent, ComponentProps, ComponentRef, FocusEvent, KeyboardEvent } from 'react';\n\nimport { Badge } from '../../components/Badge';\nimport { InputGroup } from '../../components/InputGroup';\nimport { useArgoDesign } from '../../components/ThemeProvider/context';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { DEFAULT_ENTRY_SEPARATOR, mergeRefs, splitEntry } from '../../utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'sizing' | 'state'\n>;\n\ntype BadgeColor = ComponentProps<typeof Badge>['color'];\n\ntype OwnProps = {\n value?: string[];\n defaultValue?: string[];\n /** Called with the whole next list whenever a value is added or removed. */\n onValueChange?: (value: string[]) => void;\n /**\n * Splits one entry into several values, like `MultiCombobox`'s `createSeparator`.\n * `null` when a value can itself contain the separator.\n */\n separator?: string | RegExp | null;\n /** Gates each value after the split; a pasted list keeps the values that pass. */\n canAdd?: (value: string) => boolean;\n /** The chip colour. Decorative — it categorises values, it does not encode their state. */\n chipColor?: BadgeColor;\n /** Names each remove button for a screen reader. */\n removeLabel?: (value: string) => string;\n testId?: string;\n};\n\nexport type Props = InputGroupProps &\n OwnProps &\n Omit<ComponentProps<'input'>, 'value' | 'defaultValue' | 'type' | 'prefix'>;\n\nconst defaultRemoveLabel = (value: string) => `Remove ${value}`;\n\nconst sameValue = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\n\n/**\n * Free-text token editor — type a value, press Enter, it becomes a removable chip.\n *\n * - **Use** for strings the user writes rather than picks; the platform's one chip editor.\n * - **Not** for values from a known list — use `MultiCombobox` (`allowCreate` if open-ended).\n * - Wrap in a `FormGroup` for label and error state.\n * - Values are compared case-insensitively.\n */\nexport const ChipEditor = ({\n ref: forwardedRef,\n value: valueProp,\n defaultValue,\n onValueChange,\n separator = DEFAULT_ENTRY_SEPARATOR,\n canAdd,\n chipColor,\n removeLabel = defaultRemoveLabel,\n testId,\n state = 'default',\n sizing = 'default',\n variant,\n focusVariant = 'default',\n className,\n disabled = false,\n readOnly = false,\n onChange,\n onBlur,\n onKeyDown,\n ...inputProps\n}: Props) => {\n const renderArgo = useArgoDesign();\n const inputRef = useRef<ComponentRef<'input'>>(null);\n const [query, setQuery] = useState('');\n\n const [values, setValues] = useControllableState<string[]>({\n prop: valueProp,\n defaultProp: defaultValue ?? [],\n onChange: onValueChange,\n });\n\n const isEditable = !disabled && !readOnly;\n\n /**\n * Turns typed text into chips; returns whether the text is spent.\n *\n * - A duplicate adds nothing but still spends the text.\n * - Only a value `canAdd` rejects keeps the text, so the user can fix it.\n */\n const commit = (entry: string): { isSpent: boolean } => {\n const parts = splitEntry(entry, separator)\n .map((part) => part.trim())\n .filter((part) => part !== '');\n\n const accepted = parts.filter((part) => canAdd?.(part) ?? true);\n const added = accepted.filter(\n (part, index) =>\n !values.some((held) => sameValue(held, part)) &&\n accepted.findIndex((other) => sameValue(other, part)) === index,\n );\n\n if (added.length > 0) setValues([...values, ...added]);\n\n return { isSpent: accepted.length === parts.length };\n };\n\n const commitAndClear = (entry: string) => {\n if (commit(entry).isSpent) setQuery('');\n };\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event);\n const next = event.target.value;\n\n // A typed string separator commits everything before the last one; the rest stays in the field.\n // `RegExp` separators only split on commit.\n if (typeof separator === 'string' && next.includes(separator)) {\n const cut = next.lastIndexOf(separator);\n commit(next.slice(0, cut));\n setQuery(next.slice(cut + separator.length));\n return;\n }\n\n setQuery(next);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (event.key === 'Enter') {\n // Always prevented: Enter adds a value, never submits the surrounding form.\n event.preventDefault();\n commitAndClear(query);\n return;\n }\n\n if (event.key === 'Backspace' && query === '' && values.length > 0) {\n setValues(values.slice(0, -1));\n return;\n }\n\n if (event.key === 'Escape' && query !== '') {\n // Only with text to discard — otherwise Escape reaches the enclosing overlay.\n event.preventDefault();\n event.stopPropagation();\n setQuery('');\n }\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n onBlur?.(event);\n // A value typed then blurred is one the user meant to add.\n commitAndClear(query);\n };\n\n const removeAt = (index: number) => {\n setValues(values.filter((_, position) => position !== index));\n inputRef.current?.focus();\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}\n >\n <InputGroup.Addon align=\"block-start\" className=\"tw:flex-wrap\" role=\"list\">\n {values.map((value, index) => (\n <Badge.Root\n key={value}\n role=\"listitem\"\n color={chipColor}\n variant={renderArgo ? 'pill' : 'default'}\n className=\"tw:max-w-40\"\n >\n {/* Same cap and the same `title` as a `MultiCombobox` chip — the two chip rows are the\n same object to a user, so they truncate at the same width. */}\n <Badge.Label title={value}>{value}</Badge.Label>\n {isEditable && (\n <Badge.Addon variant=\"inline\" align=\"inline-end\">\n <Badge.Button aria-label={removeLabel(value)} onClick={() => removeAt(index)}>\n <X className=\"tw:size-3\" />\n </Badge.Button>\n </Badge.Addon>\n )}\n </Badge.Root>\n ))}\n </InputGroup.Addon>\n\n <InputGroup.Input\n {...inputProps}\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n type=\"text\"\n value={query}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n />\n </InputGroup>\n );\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { ClipboardButton, ClipboardInline } from "../../ClipboardButton-KHQnPEh_.js";
1
+ import { ClipboardButton, ClipboardInline } from "../../ClipboardButton-srUgWgwH.js";
2
2
  export { ClipboardButton, ClipboardInline };
@@ -1,2 +1,2 @@
1
- import { ColorInput } from "../../ColorInput-Bj3dfPFA.js";
1
+ import { ColorInput } from "../../ColorInput-B3gBZ8Ya.js";
2
2
  export { ColorInput };
@@ -1,2 +1,2 @@
1
- import { ColorModeSwitch } from "../../ColorModeSwitch-CWt-DZGC.js";
1
+ import { ColorModeSwitch } from "../../ColorModeSwitch-Bw9wMyoL.js";
2
2
  export { ColorModeSwitch };
@@ -1,2 +1,2 @@
1
- import { Command, CommandGroup, CommandInput, CommandItem, CommandList, defaultFilter, useCommandState } from "../../Command-BDU3C1gg.js";
1
+ import { Command, CommandGroup, CommandInput, CommandItem, CommandList, defaultFilter, useCommandState } from "../../Command-BQPiZCNz.js";
2
2
  export { Command, CommandGroup, CommandInput, CommandItem, CommandList, defaultFilter, useCommandState };
@@ -1,2 +1,2 @@
1
- import { CopyField } from "../../CopyField-BHRQUyuF.js";
1
+ import { CopyField } from "../../CopyField-Ba7h8MqZ.js";
2
2
  export { CopyField };
@@ -2,14 +2,11 @@ import { cn } from "../../classNames-BzrkDnOD.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/blocks/DashboardHero/DashboardHero.tsx
4
4
  /**
5
- * Signature dashboard hero banner — the opinionated top-of-page welcome/summary surface
6
- * (daily-brief header, project overview, greeting + primary CTA).
5
+ * Top-of-dashboard welcome/summary banner: eyebrow, title, lead paragraph, actions.
7
6
  *
8
- * **When to use:** the first block on a landing or dashboard page, above the KPI strip and
9
- * chart panels. It sets tone with an eyebrow, a large title, a lead paragraph, and an actions row.
10
- * **When NOT to use:** for an in-app page title use `PageHeader.Index`; for an empty page use
11
- * `EmptyState`. **Composition:** `DashboardHero.Eyebrow`, `.Title`, `.Description`, `.Actions`,
12
- * and an optional `.Aside` that floats to the right on wide screens. Reads semantic tokens only.
7
+ * - First block on a landing/dashboard page, above KPIs and charts.
8
+ * - Not for in-app page titles (`PageHeader.Index`) or empty pages (`EmptyState`).
9
+ * - `.Aside` floats right on wide screens.
13
10
  */
14
11
  const DashboardHeroRoot = ({ className, children, ...rest }) => /* @__PURE__ */ jsx("section", {
15
12
  className: cn("tw:flex tw:flex-col tw:gap-6 tw:rounded-lg tw:border tw:border-solid tw:border-border tw:bg-card tw:p-8 tw:text-card-foreground", "tw:md:flex-row tw:md:items-center tw:md:justify-between", className),
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardHero.js","names":[],"sources":["../../../src/blocks/DashboardHero/DashboardHero.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype RootProps = ComponentProps<'section'>;\n\n/**\n * Signature dashboard hero banner — the opinionated top-of-page welcome/summary surface\n * (daily-brief header, project overview, greeting + primary CTA).\n *\n * **When to use:** the first block on a landing or dashboard page, above the KPI strip and\n * chart panels. It sets tone with an eyebrow, a large title, a lead paragraph, and an actions row.\n * **When NOT to use:** for an in-app page title use `PageHeader.Index`; for an empty page use\n * `EmptyState`. **Composition:** `DashboardHero.Eyebrow`, `.Title`, `.Description`, `.Actions`,\n * and an optional `.Aside` that floats to the right on wide screens. Reads semantic tokens only.\n */\nconst DashboardHeroRoot = ({ className, children, ...rest }: RootProps) => (\n <section\n className={cn(\n 'tw:flex tw:flex-col tw:gap-6 tw:rounded-lg tw:border tw:border-solid tw:border-border tw:bg-card tw:p-8 tw:text-card-foreground',\n 'tw:md:flex-row tw:md:items-center tw:md:justify-between',\n className,\n )}\n {...rest}\n >\n {children}\n </section>\n);\n\ntype BodyProps = ComponentProps<'div'>;\n\nconst DashboardHeroBody = ({ className, children, ...rest }: BodyProps) => (\n <div className={cn('tw:flex tw:flex-col tw:gap-3', className)} {...rest}>\n {children}\n </div>\n);\n\ntype EyebrowProps = ComponentProps<'p'>;\n\nconst DashboardHeroEyebrow = ({ className, children, ...rest }: EyebrowProps) => (\n <p\n className={cn(\n 'tw:m-0 tw:text-sm tw:font-semibold tw:uppercase tw:tracking-wide tw:text-primary',\n className,\n )}\n {...rest}\n >\n {children}\n </p>\n);\n\ntype TitleProps = ComponentProps<'h1'>;\n\nconst DashboardHeroTitle = ({ className, children, ...rest }: TitleProps) => (\n <h1\n className={cn(\n 'tw:m-0 tw:text-3xl tw:font-semibold tw:leading-tight tw:tracking-tight tw:text-foreground',\n className,\n )}\n {...rest}\n >\n {children}\n </h1>\n);\n\ntype DescriptionProps = ComponentProps<'p'>;\n\nconst DashboardHeroDescription = ({ className, children, ...rest }: DescriptionProps) => (\n <p\n className={cn('tw:m-0 tw:max-w-prose tw:text-base tw:text-muted-foreground', className)}\n {...rest}\n >\n {children}\n </p>\n);\n\ntype ActionsProps = ComponentProps<'div'>;\n\nconst DashboardHeroActions = ({ className, children, ...rest }: ActionsProps) => (\n <div className={cn('tw:mt-2 tw:flex tw:flex-wrap tw:items-center tw:gap-3', className)} {...rest}>\n {children}\n </div>\n);\n\ntype AsideProps = ComponentProps<'div'>;\n\nconst DashboardHeroAside = ({ className, children, ...rest }: AsideProps) => (\n <div className={cn('tw:flex tw:shrink-0 tw:flex-col tw:gap-2', className)} {...rest}>\n {children}\n </div>\n);\n\nexport const DashboardHero = DashboardHeroRoot as typeof DashboardHeroRoot & {\n Body: typeof DashboardHeroBody;\n Eyebrow: typeof DashboardHeroEyebrow;\n Title: typeof DashboardHeroTitle;\n Description: typeof DashboardHeroDescription;\n Actions: typeof DashboardHeroActions;\n Aside: typeof DashboardHeroAside;\n};\n\nDashboardHero.Body = DashboardHeroBody;\nDashboardHero.Eyebrow = DashboardHeroEyebrow;\nDashboardHero.Title = DashboardHeroTitle;\nDashboardHero.Description = DashboardHeroDescription;\nDashboardHero.Actions = DashboardHeroActions;\nDashboardHero.Aside = DashboardHeroAside;\n\nexport type { RootProps as DashboardHeroProps };\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAM,qBAAqB,EAAE,WAAW,UAAU,GAAG,WACnD,oBAAC,WAAD;CACE,WAAW,GACT,mIACA,2DACA,SACF;CACA,GAAI;CAEH;AACM,CAAA;AAKX,MAAM,qBAAqB,EAAE,WAAW,UAAU,GAAG,WACnD,oBAAC,OAAD;CAAK,WAAW,GAAG,gCAAgC,SAAS;CAAG,GAAI;CAChE;AACE,CAAA;AAKP,MAAM,wBAAwB,EAAE,WAAW,UAAU,GAAG,WACtD,oBAAC,KAAD;CACE,WAAW,GACT,oFACA,SACF;CACA,GAAI;CAEH;AACA,CAAA;AAKL,MAAM,sBAAsB,EAAE,WAAW,UAAU,GAAG,WACpD,oBAAC,MAAD;CACE,WAAW,GACT,6FACA,SACF;CACA,GAAI;CAEH;AACC,CAAA;AAKN,MAAM,4BAA4B,EAAE,WAAW,UAAU,GAAG,WAC1D,oBAAC,KAAD;CACE,WAAW,GAAG,+DAA+D,SAAS;CACtF,GAAI;CAEH;AACA,CAAA;AAKL,MAAM,wBAAwB,EAAE,WAAW,UAAU,GAAG,WACtD,oBAAC,OAAD;CAAK,WAAW,GAAG,yDAAyD,SAAS;CAAG,GAAI;CACzF;AACE,CAAA;AAKP,MAAM,sBAAsB,EAAE,WAAW,UAAU,GAAG,WACpD,oBAAC,OAAD;CAAK,WAAW,GAAG,4CAA4C,SAAS;CAAG,GAAI;CAC5E;AACE,CAAA;AAGP,MAAa,gBAAgB;AAS7B,cAAc,OAAO;AACrB,cAAc,UAAU;AACxB,cAAc,QAAQ;AACtB,cAAc,cAAc;AAC5B,cAAc,UAAU;AACxB,cAAc,QAAQ"}
1
+ {"version":3,"file":"DashboardHero.js","names":[],"sources":["../../../src/blocks/DashboardHero/DashboardHero.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype RootProps = ComponentProps<'section'>;\n\n/**\n * Top-of-dashboard welcome/summary banner: eyebrow, title, lead paragraph, actions.\n *\n * - First block on a landing/dashboard page, above KPIs and charts.\n * - Not for in-app page titles (`PageHeader.Index`) or empty pages (`EmptyState`).\n * - `.Aside` floats right on wide screens.\n */\nconst DashboardHeroRoot = ({ className, children, ...rest }: RootProps) => (\n <section\n className={cn(\n 'tw:flex tw:flex-col tw:gap-6 tw:rounded-lg tw:border tw:border-solid tw:border-border tw:bg-card tw:p-8 tw:text-card-foreground',\n 'tw:md:flex-row tw:md:items-center tw:md:justify-between',\n className,\n )}\n {...rest}\n >\n {children}\n </section>\n);\n\ntype BodyProps = ComponentProps<'div'>;\n\nconst DashboardHeroBody = ({ className, children, ...rest }: BodyProps) => (\n <div className={cn('tw:flex tw:flex-col tw:gap-3', className)} {...rest}>\n {children}\n </div>\n);\n\ntype EyebrowProps = ComponentProps<'p'>;\n\nconst DashboardHeroEyebrow = ({ className, children, ...rest }: EyebrowProps) => (\n <p\n className={cn(\n 'tw:m-0 tw:text-sm tw:font-semibold tw:uppercase tw:tracking-wide tw:text-primary',\n className,\n )}\n {...rest}\n >\n {children}\n </p>\n);\n\ntype TitleProps = ComponentProps<'h1'>;\n\nconst DashboardHeroTitle = ({ className, children, ...rest }: TitleProps) => (\n <h1\n className={cn(\n 'tw:m-0 tw:text-3xl tw:font-semibold tw:leading-tight tw:tracking-tight tw:text-foreground',\n className,\n )}\n {...rest}\n >\n {children}\n </h1>\n);\n\ntype DescriptionProps = ComponentProps<'p'>;\n\nconst DashboardHeroDescription = ({ className, children, ...rest }: DescriptionProps) => (\n <p\n className={cn('tw:m-0 tw:max-w-prose tw:text-base tw:text-muted-foreground', className)}\n {...rest}\n >\n {children}\n </p>\n);\n\ntype ActionsProps = ComponentProps<'div'>;\n\nconst DashboardHeroActions = ({ className, children, ...rest }: ActionsProps) => (\n <div className={cn('tw:mt-2 tw:flex tw:flex-wrap tw:items-center tw:gap-3', className)} {...rest}>\n {children}\n </div>\n);\n\ntype AsideProps = ComponentProps<'div'>;\n\nconst DashboardHeroAside = ({ className, children, ...rest }: AsideProps) => (\n <div className={cn('tw:flex tw:shrink-0 tw:flex-col tw:gap-2', className)} {...rest}>\n {children}\n </div>\n);\n\nexport const DashboardHero = DashboardHeroRoot as typeof DashboardHeroRoot & {\n Body: typeof DashboardHeroBody;\n Eyebrow: typeof DashboardHeroEyebrow;\n Title: typeof DashboardHeroTitle;\n Description: typeof DashboardHeroDescription;\n Actions: typeof DashboardHeroActions;\n Aside: typeof DashboardHeroAside;\n};\n\nDashboardHero.Body = DashboardHeroBody;\nDashboardHero.Eyebrow = DashboardHeroEyebrow;\nDashboardHero.Title = DashboardHeroTitle;\nDashboardHero.Description = DashboardHeroDescription;\nDashboardHero.Actions = DashboardHeroActions;\nDashboardHero.Aside = DashboardHeroAside;\n\nexport type { RootProps as DashboardHeroProps };\n"],"mappings":";;;;;;;;;;AAaA,MAAM,qBAAqB,EAAE,WAAW,UAAU,GAAG,WACnD,oBAAC,WAAD;CACE,WAAW,GACT,mIACA,2DACA,SACF;CACA,GAAI;CAEH;AACM,CAAA;AAKX,MAAM,qBAAqB,EAAE,WAAW,UAAU,GAAG,WACnD,oBAAC,OAAD;CAAK,WAAW,GAAG,gCAAgC,SAAS;CAAG,GAAI;CAChE;AACE,CAAA;AAKP,MAAM,wBAAwB,EAAE,WAAW,UAAU,GAAG,WACtD,oBAAC,KAAD;CACE,WAAW,GACT,oFACA,SACF;CACA,GAAI;CAEH;AACA,CAAA;AAKL,MAAM,sBAAsB,EAAE,WAAW,UAAU,GAAG,WACpD,oBAAC,MAAD;CACE,WAAW,GACT,6FACA,SACF;CACA,GAAI;CAEH;AACC,CAAA;AAKN,MAAM,4BAA4B,EAAE,WAAW,UAAU,GAAG,WAC1D,oBAAC,KAAD;CACE,WAAW,GAAG,+DAA+D,SAAS;CACtF,GAAI;CAEH;AACA,CAAA;AAKL,MAAM,wBAAwB,EAAE,WAAW,UAAU,GAAG,WACtD,oBAAC,OAAD;CAAK,WAAW,GAAG,yDAAyD,SAAS;CAAG,GAAI;CACzF;AACE,CAAA;AAKP,MAAM,sBAAsB,EAAE,WAAW,UAAU,GAAG,WACpD,oBAAC,OAAD;CAAK,WAAW,GAAG,4CAA4C,SAAS;CAAG,GAAI;CAC5E;AACE,CAAA;AAGP,MAAa,gBAAgB;AAS7B,cAAc,OAAO;AACrB,cAAc,UAAU;AACxB,cAAc,QAAQ;AACtB,cAAc,cAAc;AAC5B,cAAc,UAAU;AACxB,cAAc,QAAQ"}
@@ -1,2 +1,2 @@
1
- import { DateInput } from "../../DateInput-B6N8g0ra.js";
1
+ import { DateInput } from "../../DateInput-D0nWUasV.js";
2
2
  export { DateInput };
@@ -1,2 +1,2 @@
1
- import { DateRangeInput } from "../../DateRangeInput-7M9Z4cVO.js";
1
+ import { DateRangeInput } from "../../DateRangeInput-i6wE45-V.js";
2
2
  export { DateRangeInput };
@@ -1,4 +1,4 @@
1
- import { Card } from "../../Card-Dyo7055Q.js";
1
+ import { Card } from "../../Card-BQmBWHXl.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  //#region src/blocks/EmptyConfigurationActionCard/EmptyConfigurationActionCard.tsx
4
4
  const EmptyConfigurationActionCard = ({ title, children, className }) => {