@keboola/design 11.9.0 → 12.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 (363) hide show
  1. package/AGENTS.md +34 -8
  2. package/CHANGELOG.md +155 -0
  3. package/COMPONENT-API.md +337 -289
  4. package/README.md +11 -1
  5. package/dist/{AIKit-ELIsegJz.js → AIKit-BD4r7ff-.js} +404 -243
  6. package/dist/AIKit-BD4r7ff-.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-Th2khjPi.js} +5 -5
  10. package/dist/AlertModal-Th2khjPi.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-BU23Vl8V.js} +7 -7
  18. package/dist/{BrandEditor-BsTBM3s6.js.map → BrandEditor-BU23Vl8V.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-p9HtMLCc.js} +8 -14
  22. package/dist/Breadcrumb-p9HtMLCc.js.map +1 -0
  23. package/dist/{Button-DsRrU5F1.js → Button-Ca4Q3VJU.js} +31 -13
  24. package/dist/Button-Ca4Q3VJU.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-Cr9MBNHu.js} +4 -4
  28. package/dist/Card-Cr9MBNHu.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-DHa1trtI.js} +4 -4
  34. package/dist/{ClipboardButton-KHQnPEh_.js.map → ClipboardButton-DHa1trtI.js.map} +1 -1
  35. package/dist/{CodeEditor-BJKJXA0c.js → CodeEditor-BSo-oLFG.js} +55 -165
  36. package/dist/CodeEditor-BSo-oLFG.js.map +1 -0
  37. package/dist/{ColorInput-Bj3dfPFA.js → ColorInput-DSMqrs2-.js} +12 -27
  38. package/dist/ColorInput-DSMqrs2-.js.map +1 -0
  39. package/dist/{ColorModeSwitch-CWt-DZGC.js → ColorModeSwitch-D7EuWyJz.js} +7 -17
  40. package/dist/ColorModeSwitch-D7EuWyJz.js.map +1 -0
  41. package/dist/Combobox-CxRAYOBt.js +1069 -0
  42. package/dist/Combobox-CxRAYOBt.js.map +1 -0
  43. package/dist/{Command-BDU3C1gg.js → Command-BU_cVurn.js} +4 -4
  44. package/dist/{Command-BDU3C1gg.js.map → Command-BU_cVurn.js.map} +1 -1
  45. package/dist/{CopyField-BHRQUyuF.js → CopyField-6_c-NdLO.js} +17 -53
  46. package/dist/{CopyField-BHRQUyuF.js.map → CopyField-6_c-NdLO.js.map} +1 -1
  47. package/dist/{DateInput-B6N8g0ra.js → DateInput-DyEErfJf.js} +6 -6
  48. package/dist/{DateInput-B6N8g0ra.js.map → DateInput-DyEErfJf.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-Dg7-VUd9.js} +10 -14
  52. package/dist/DateRangeInput-Dg7-VUd9.js.map +1 -0
  53. package/dist/{DateRangePicker-DjSUFjh4.js → DateRangePicker-BoPnh4aH.js} +9 -13
  54. package/dist/DateRangePicker-BoPnh4aH.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-2wMXQ0Qw.js} +12 -25
  59. package/dist/FieldItem-2wMXQ0Qw.js.map +1 -0
  60. package/dist/{FieldItem-vhIJW4pj.d.ts → FieldItem-CPN1xjN5.d.ts} +11 -25
  61. package/dist/{FileUpload-DYQCTGjU.js → FileUpload-C83tXuE2.js} +11 -16
  62. package/dist/{FileUpload-DYQCTGjU.js.map → FileUpload-C83tXuE2.js.map} +1 -1
  63. package/dist/{Form-CcK7dRrC.js → Form-95rVLfX8.js} +15 -23
  64. package/dist/{Form-CcK7dRrC.js.map → Form-95rVLfX8.js.map} +1 -1
  65. package/dist/{FormGroup-DR_gZ25-.js → FormGroup-CmNiAtU6.js} +11 -17
  66. package/dist/FormGroup-CmNiAtU6.js.map +1 -0
  67. package/dist/{FullScreenModal-CN9nAs72.js → FullScreenModal-CD7mYeTz.js} +15 -29
  68. package/dist/FullScreenModal-CD7mYeTz.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-B4QOPxHl.js} +11 -13
  72. package/dist/InputGroup-B4QOPxHl.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-BQvz6bhv.js} +16 -34
  78. package/dist/MermaidDiagram-BQvz6bhv.js.map +1 -0
  79. package/dist/{Modal-I3VWk2oo.js → Modal-Driyqs_N.js} +17 -34
  80. package/dist/Modal-Driyqs_N.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-BPnmzBtw.js} +3 -3
  84. package/dist/{MultiActionButtonGroup-CYZ8IgSf.js.map → MultiActionButtonGroup-BPnmzBtw.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-DOAtAnfL.js} +12 -42
  94. package/dist/PageToolbar-DOAtAnfL.js.map +1 -0
  95. package/dist/{Pagination-C_b7Xhey.js → Pagination-LaSg-5cl.js} +3 -3
  96. package/dist/{Pagination-C_b7Xhey.js.map → Pagination-LaSg-5cl.js.map} +1 -1
  97. package/dist/{Popconfirm-5pBzT_HQ.js → Popconfirm-SLz0zodk.js} +3 -3
  98. package/dist/{Popconfirm-5pBzT_HQ.js.map → Popconfirm-SLz0zodk.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-CEfQDNl3.js} +8 -13
  106. package/dist/SearchInput-CEfQDNl3.js.map +1 -0
  107. package/dist/{SectionNav-CNLJsiVG.js → SectionNav-B_qf0AXi.js} +10 -42
  108. package/dist/SectionNav-B_qf0AXi.js.map +1 -0
  109. package/dist/{Select-DV3Hak_l.js → Select-ByRvkZ3D.js} +8 -11
  110. package/dist/{Select-DV3Hak_l.js.map → Select-ByRvkZ3D.js.map} +1 -1
  111. package/dist/{Sheet-OparjIi-.js → Sheet-C-yXk5Da.js} +5 -9
  112. package/dist/Sheet-C-yXk5Da.js.map +1 -0
  113. package/dist/{Sidebar-CLEbBtNY.js → Sidebar-Ds0E6PbR.js} +16 -33
  114. package/dist/Sidebar-Ds0E6PbR.js.map +1 -0
  115. package/dist/{Slider-DLclvRws.js → Slider-DWdu9NuM.js} +3 -3
  116. package/dist/{Slider-DLclvRws.js.map → Slider-DWdu9NuM.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-Dt9oLYHC.js} +3 -3
  124. package/dist/{Tabs-eB974xJf.js.map → Tabs-Dt9oLYHC.js.map} +1 -1
  125. package/dist/{TextInput-CFTf4Cz1.js → TextInput-CDG2XpBl.js} +10 -14
  126. package/dist/TextInput-CDG2XpBl.js.map +1 -0
  127. package/dist/{ThemeProvider-DAmNn9Sd.js → ThemeProvider-DXsxFg1U.js} +13 -31
  128. package/dist/ThemeProvider-DXsxFg1U.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-BzXVfgnI.js} +5 -19
  138. package/dist/ZoomableSvg-BzXVfgnI.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 +1151 -1838
  158. package/dist/index.js +68 -67
  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 +161 -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 +2 -2
  226. package/dist/internal/components/Combobox.js +2 -2
  227. package/dist/internal/components/DatePicker.js +1 -1
  228. package/dist/internal/components/DateRangePicker.js +1 -1
  229. package/dist/internal/components/DropdownMenu.js +1 -1
  230. package/dist/internal/components/FileUpload.js +1 -1
  231. package/dist/internal/components/FullScreenModal.js +1 -1
  232. package/dist/internal/components/HoverCard.js +1 -1
  233. package/dist/internal/components/InputGroup.js +1 -1
  234. package/dist/internal/components/Kbd.js +1 -1
  235. package/dist/internal/components/MarkedText.js +1 -1
  236. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +1 -1
  237. package/dist/internal/components/Modal.js +1 -1
  238. package/dist/internal/components/Navbar.js +1 -1
  239. package/dist/internal/components/Pagination.js +1 -1
  240. package/dist/internal/components/PanelWithDetails.js +1 -1
  241. package/dist/internal/components/Popconfirm.js +1 -1
  242. package/dist/internal/components/Popover.js +1 -1
  243. package/dist/internal/components/RadioGroup.js +1 -1
  244. package/dist/internal/components/Search.js +1 -1
  245. package/dist/internal/components/Select.js +1 -1
  246. package/dist/internal/components/Separator.js.map +1 -1
  247. package/dist/internal/components/Sheet.js +1 -1
  248. package/dist/internal/components/Sidebar.js +1 -1
  249. package/dist/internal/components/Skeleton/Skeleton.js +5 -9
  250. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -1
  251. package/dist/internal/components/Slider.js +1 -1
  252. package/dist/internal/components/SpotlightBackdrop.js +3 -8
  253. package/dist/internal/components/SpotlightBackdrop.js.map +1 -1
  254. package/dist/internal/components/StatusDot.js +8 -15
  255. package/dist/internal/components/StatusDot.js.map +1 -1
  256. package/dist/internal/components/Stepper.js +1 -1
  257. package/dist/internal/components/Switch.js +1 -1
  258. package/dist/internal/components/Table.js +1 -1
  259. package/dist/internal/components/Tabs.js +1 -1
  260. package/dist/internal/components/ThemeProvider.js +3 -3
  261. package/dist/internal/components/TimePicker.js +1 -1
  262. package/dist/internal/components/Timeline.js +1 -1
  263. package/dist/internal/components/Toast.js +2 -2
  264. package/dist/internal/components/Tooltip.js +1 -1
  265. package/dist/internal/components/Truncated.js +4 -8
  266. package/dist/internal/components/Truncated.js.map +1 -1
  267. package/dist/internal/components/Workbench.js +1 -1
  268. package/dist/internal/components/ZoomableSvg.js +1 -1
  269. package/dist/internal/hooks/useScrollbarPosition.js +1 -1
  270. package/dist/internal/hooks/useStableCallback.js +4 -13
  271. package/dist/internal/hooks/useStableCallback.js.map +1 -1
  272. package/dist/internal/utils.js +2 -2
  273. package/dist/markdown-editor.d.ts +15 -37
  274. package/dist/markdown-editor.js +17 -23
  275. package/dist/markdown-editor.js.map +1 -1
  276. package/dist/mermaid.d.ts +4 -6
  277. package/dist/mermaid.js +1 -1
  278. package/dist/rjsf.d.ts +9 -19
  279. package/dist/rjsf.js +44 -84
  280. package/dist/rjsf.js.map +1 -1
  281. package/dist/{styles-BAFscjSV.js → styles-gzcjOyKv.js} +6 -6
  282. package/dist/styles-gzcjOyKv.js.map +1 -0
  283. package/dist/styles.css +1 -1
  284. package/dist/svgTransforms-Dw2hRA-i.js +51 -0
  285. package/dist/svgTransforms-Dw2hRA-i.js.map +1 -0
  286. package/dist/testing.d.ts +3 -10
  287. package/dist/testing.js +5 -12
  288. package/dist/testing.js.map +1 -1
  289. package/dist/themeTokens-7DEab0kp.js +31 -0
  290. package/dist/themeTokens-7DEab0kp.js.map +1 -0
  291. package/dist/{toast-DIC0iNRf.js → toast-CyXEdaCZ.js} +3 -3
  292. package/dist/toast-CyXEdaCZ.js.map +1 -0
  293. package/dist/{themeScopeContext-D7fSyb06.js → useColorSchemeState-Cw4MCXUs.js} +14 -14
  294. package/dist/useColorSchemeState-Cw4MCXUs.js.map +1 -0
  295. package/dist/{useControllableState-M6494mCT.js → useControllableState-CUYXMsfz.js} +3 -7
  296. package/dist/useControllableState-CUYXMsfz.js.map +1 -0
  297. package/dist/useElement-D-RjrGa4.js +21 -0
  298. package/dist/useElement-D-RjrGa4.js.map +1 -0
  299. package/dist/useThemeAttributes-B199Regy.js +67 -0
  300. package/dist/useThemeAttributes-B199Regy.js.map +1 -0
  301. package/dist/{utils-BW4AE8VP.js → utils-Bd28bWgm.js} +31 -26
  302. package/dist/utils-Bd28bWgm.js.map +1 -0
  303. package/dist/vega.d.ts +8 -30
  304. package/dist/vega.js +5 -13
  305. package/dist/vega.js.map +1 -1
  306. package/dist/{vegaTheme-CSvFEMBl.js → vegaTheme-VQMWTlBw.js} +7 -21
  307. package/dist/vegaTheme-VQMWTlBw.js.map +1 -0
  308. package/package.json +10 -9
  309. package/src/styles.css +120 -14
  310. package/src/theme.css +126 -6
  311. package/dist/AIKit-ELIsegJz.js.map +0 -1
  312. package/dist/Alert-BsIM_oFK.js.map +0 -1
  313. package/dist/AlertModal-BGJdaRRj.js.map +0 -1
  314. package/dist/AppShell-DRgJxpXW.js.map +0 -1
  315. package/dist/Badge-o5jURtpB.js.map +0 -1
  316. package/dist/BrandLogo-CoKBk4MI.js.map +0 -1
  317. package/dist/Breadcrumb-xqEUxfwn.js.map +0 -1
  318. package/dist/Button-DsRrU5F1.js.map +0 -1
  319. package/dist/Calendar-cG5NIJ4O.js.map +0 -1
  320. package/dist/Card-Dyo7055Q.js.map +0 -1
  321. package/dist/Checkbox-Dq5fPNrO.js.map +0 -1
  322. package/dist/CodeEditor-BJKJXA0c.js.map +0 -1
  323. package/dist/ColorInput-Bj3dfPFA.js.map +0 -1
  324. package/dist/ColorModeSwitch-CWt-DZGC.js.map +0 -1
  325. package/dist/Combobox-D8PrEqTG.js +0 -619
  326. package/dist/Combobox-D8PrEqTG.js.map +0 -1
  327. package/dist/DateRangeInput-7M9Z4cVO.js.map +0 -1
  328. package/dist/DateRangePicker-DjSUFjh4.js.map +0 -1
  329. package/dist/DropdownMenu-CgVwhDvl.js.map +0 -1
  330. package/dist/FieldItem-DZGIdiXE.js.map +0 -1
  331. package/dist/FormGroup-DR_gZ25-.js.map +0 -1
  332. package/dist/FullScreenModal-CN9nAs72.js.map +0 -1
  333. package/dist/InputGroup-Do8K2hvD.js.map +0 -1
  334. package/dist/Kbd-LCFMumoq.js.map +0 -1
  335. package/dist/MermaidDiagram-ZG0iiDV_.js.map +0 -1
  336. package/dist/Modal-I3VWk2oo.js.map +0 -1
  337. package/dist/ModalTitle-CeLM_mX9.js.map +0 -1
  338. package/dist/PageHeader-Q3IpCnQd.js.map +0 -1
  339. package/dist/PageLayout-DSVM-ASz.js.map +0 -1
  340. package/dist/PageToolbar-BKVJiDAL.js.map +0 -1
  341. package/dist/Popover-BEbQrC_P.js.map +0 -1
  342. package/dist/SearchInput-92r2bkA7.js.map +0 -1
  343. package/dist/SectionNav-CNLJsiVG.js.map +0 -1
  344. package/dist/Sheet-OparjIi-.js.map +0 -1
  345. package/dist/Sidebar-CLEbBtNY.js.map +0 -1
  346. package/dist/TextInput-CFTf4Cz1.js.map +0 -1
  347. package/dist/ThemeProvider-DAmNn9Sd.js.map +0 -1
  348. package/dist/ZoomableSvg-BZlk3PFJ.js.map +0 -1
  349. package/dist/context-D7X470dy.js.map +0 -1
  350. package/dist/findLiteralMatches-BGBw8Vbl.js.map +0 -1
  351. package/dist/icons-Cek151jC.js.map +0 -1
  352. package/dist/styles-BAFscjSV.js.map +0 -1
  353. package/dist/svgTransforms-CJAYPk7o.js +0 -81
  354. package/dist/svgTransforms-CJAYPk7o.js.map +0 -1
  355. package/dist/themeScopeContext-D7fSyb06.js.map +0 -1
  356. package/dist/themeTokens-qP1-55O7.js +0 -119
  357. package/dist/themeTokens-qP1-55O7.js.map +0 -1
  358. package/dist/toast-DIC0iNRf.js.map +0 -1
  359. package/dist/useControllableState-M6494mCT.js.map +0 -1
  360. package/dist/useElement-BK3AAiIf.js +0 -24
  361. package/dist/useElement-BK3AAiIf.js.map +0 -1
  362. package/dist/utils-BW4AE8VP.js.map +0 -1
  363. package/dist/vegaTheme-CSvFEMBl.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"TextInput-CFTf4Cz1.js","names":[],"sources":["../src/blocks/TextInput/utils.ts","../src/blocks/TextInput/TextInput.tsx"],"sourcesContent":["import { createPrefixedString } from '../../utils';\n\nexport const genInputTestId = (prefix: string = '') => {\n const ps = createPrefixedString(prefix);\n return {\n toString: () => prefix,\n inputWrapper: ps`input-wrapper`,\n input: ps`input`,\n clearButton: ps`clear-button`,\n };\n};\n","import { useRef } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { cn, createChangeInputEvent, mergeRefs } from '../../utils';\n\nimport { genInputTestId } from './utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'sizing' | 'state'\n>;\n\ntype OwnProps = {\n prefix?: ReactNode;\n /**\n * Content after the input.\n *\n * - `rightSuffixVariant=\"addon\"` truncates it with an ellipsis when the group is narrower than its content.\n * - The ellipsis only renders for inline content — pass text or a `<span>`, not a block element.\n */\n rightSuffix?: ReactNode;\n rightSuffixVariant?: 'addon' | 'default';\n leftSuffix?: ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n testId?: string;\n value?: string | null;\n defaultValue?: string | null;\n /** Called with the unwrapped string value on every change. For the raw event use `onChange`. */\n onValueChange?: (value: string) => void;\n /** Called with the unwrapped string value on blur. For the raw event use `onBlur`. */\n onValueBlur?: (value: string) => void;\n type?: 'text' | 'email' | 'password' | 'datetime-local' | 'date';\n};\n\n/**\n * Props for `TextInput`. Combines `InputGroup` chrome (variant / sizing / state / focusVariant) with\n * input-specific slots (`prefix`, `leftSuffix`, `rightSuffix`, `allowClear`) and a string-typed\n * `value` / `defaultValue` plus convenience `onValueChange` / `onValueBlur` callbacks. `null` /\n * `undefined` are coerced to empty strings.\n */\nexport type Props = InputGroupProps &\n OwnProps &\n Omit<ComponentProps<'input'>, 'prefix' | 'value' | 'defaultValue' | 'type' | 'accept' | 'step'>;\n\nconst sanitizeTextInputValue = (value: string | null | undefined) => {\n if (typeof value === 'string' && value.trim() === '') return '';\n return value;\n};\n\n/**\n * Standard text input with a string-only API, built on `InputGroup` chrome — addons, clear button,\n * sizing, focus variants. The default choice for a bare text input.\n *\n * **When to use:** any plain text / email / password / date-input field outside `useAppForm`. Pair with\n * `onValueChange` instead of unwrapping `event.target.value` from `onChange`.\n * **When NOT to use:** for fields inside a labelled group use `FormGroup.TextInput`; for forms with\n * validation use `useAppForm` + `field.TextField`; for search use `SearchInput`.\n * **Composition:** wrap in a `FormGroup` for shared error / help-text state, or render directly inside\n * page layouts. Chrome resolves from the active brand automatically: a modern brand always renders argo\n * (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.\n */\nexport const TextInput = ({\n ref: forwardedRef,\n state = 'default',\n sizing = 'default',\n className,\n prefix = null,\n rightSuffix = null,\n rightSuffixVariant = 'default',\n leftSuffix = null,\n allowClear = false,\n onClear,\n disabled = false,\n testId: prefixTestId = '',\n autoFocus = false,\n id,\n name,\n variant,\n readOnly,\n type = 'text',\n focusVariant = 'default',\n onChange,\n onBlur,\n onValueChange,\n onValueBlur,\n value: valueProp,\n defaultValue,\n ...inputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled and coerced\n // to a string. Whitespace-only input collapses to '' via `sanitizeTextInputValue`.\n prop: valueProp === undefined ? undefined : (sanitizeTextInputValue(valueProp) ?? ''),\n defaultProp: sanitizeTextInputValue(defaultValue) ?? '',\n onChange: onValueChange,\n });\n\n const testId = genInputTestId(prefixTestId);\n const isClearButtonVisible = (!!value && !disabled && !readOnly) || !!onClear;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (inputRef.current === null) return;\n inputRef.current.value = ''; // keep the DOM node in sync before firing the synthetic change\n inputRef.current.focus();\n onClear?.();\n handleChange(createChangeInputEvent(inputRef.current));\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n data-testid={testId.inputWrapper}\n >\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n\n <InputGroup.Input\n {...inputProps}\n value={value}\n autoFocus={autoFocus}\n type={type}\n onChange={handleChange}\n onBlur={handleBlur}\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n disabled={disabled}\n id={id}\n name={name}\n readOnly={readOnly}\n data-testid={testId.input}\n />\n\n {(leftSuffix || allowClear || rightSuffix) && (\n <InputGroup.Addon\n align=\"inline-end\"\n className={cn({ 'tw:min-w-0 tw:shrink': rightSuffixVariant === 'addon' })}\n >\n {leftSuffix}\n {allowClear && isClearButtonVisible && (\n <InputGroup.Button\n aria-label=\"Clear\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n data-testid={testId.clearButton}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {rightSuffix && (\n <div\n className={cn({\n 'tw:truncate tw:min-w-0 tw:bg-muted tw:px-4 tw:-mr-4 tw:py-2.5':\n rightSuffixVariant === 'addon',\n })}\n >\n {rightSuffix}\n </div>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;;AAEA,MAAa,kBAAkB,SAAiB,OAAO;CACrD,MAAM,KAAK,qBAAqB,MAAM;CACtC,OAAO;EACL,gBAAgB;EAChB,cAAc,EAAE;EAChB,OAAO,EAAE;EACT,aAAa,EAAE;CACjB;AACF;;;AC6CA,MAAM,0BAA0B,UAAqC;CACnE,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI,OAAO;CAC7D,OAAO;AACT;;;;;;;;;;;;;AAcA,MAAa,aAAa,EACxB,KAAK,cACL,QAAQ,WACR,SAAS,WACT,WACA,SAAS,MACT,cAAc,MACd,qBAAqB,WACrB,aAAa,MACb,aAAa,OACb,SACA,WAAW,OACX,QAAQ,eAAe,IACvB,YAAY,OACZ,IACA,MACA,SACA,UACA,OAAO,QACP,eAAe,WACf,UACA,QACA,eACA,aACA,OAAO,WACP,cACA,GAAG,iBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAGrD,MAAM,cAAc,KAAA,IAAY,KAAA,IAAa,uBAAuB,SAAS,KAAK;EAClF,aAAa,uBAAuB,YAAY,KAAK;EACrD,UAAU;CACZ,CAAC;CAED,MAAM,SAAS,eAAe,YAAY;CAC1C,MAAM,uBAAwB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,YAAa,CAAC,CAAC;CAEtE,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,KAAK;EAC3B,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,cAAc,MAAM,OAAO,KAAK;EAChC,SAAS,KAAK;CAChB;CAEA,MAAM,oBAA0D;EAC9D,IAAI,SAAS,YAAY,MAAM;EAC/B,SAAS,QAAQ,QAAQ;EACzB,SAAS,QAAQ,MAAM;EACvB,UAAU;EACV,aAAa,uBAAuB,SAAS,OAAO,CAAC;CACvD;CAEA,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EACX,eAAa,OAAO;EANtB,UAAA;GAQG,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAgB,UAAA;GAAyB,CAAA;GAE5E,oBAAC,WAAW,OAAZ;IACE,GAAI;IACG;IACI;IACL;IACN,UAAU;IACV,QAAQ;IACR,KAAK,UAAU,gBAAgB,MAAM,QAAQ;IACnC;IACN;IACE;IACI;IACV,eAAa,OAAO;GACrB,CAAA;IAEC,cAAc,cAAc,gBAC5B,qBAAC,WAAW,OAAZ;IACE,OAAM;IACN,WAAW,GAAG,EAAE,wBAAwB,uBAAuB,QAAQ,CAAC;IAF1E,UAAA;KAIG;KACA,cAAc,wBACb,oBAAC,WAAW,QAAZ;MACE,cAAW;MACX,cAAc,MAAM,EAAE,eAAe;MACrC,SAAS;MACT,eAAa,OAAO;MAEpB,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;KACT,CAAA;KAEpB,eACC,oBAAC,OAAD;MACE,WAAW,GAAG,EACZ,iEACE,uBAAuB,QAC3B,CAAC;MAEA,UAAA;KACE,CAAA;IAES;;EAEV;;AAEhB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ThemeProvider-DAmNn9Sd.js","names":[],"sources":["../src/components/ThemeProvider/AIGradientSvg.tsx","../src/components/ThemeProvider/useThemeTokens.ts","../src/components/ThemeProvider/ThemeProvider.tsx","../src/components/ThemeProvider/ThemeScope.tsx"],"sourcesContent":["export const AIGradientsSvg = () => (\n <svg width=\"0\" height=\"0\" style={{ position: 'absolute', visibility: 'hidden' }}>\n <defs>\n {/*aigradient-600*/}\n <linearGradient id=\"aigradient-600\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#61E4FF\" />\n <stop offset=\"50%\" stopColor=\"#1F8FFF\" />\n <stop offset=\"100%\" stopColor=\"#7C5CFF\" />\n </linearGradient>\n\n {/*aigradient-700*/}\n <linearGradient id=\"aigradient-700\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#075fb8\" />\n <stop offset=\"100%\" stopColor=\"#5b2cb8\" />\n </linearGradient>\n </defs>\n </svg>\n);\n","import { useInsertionEffect } from 'react';\n\nimport type {\n BrandTheme,\n Colors,\n Gradient,\n Motion,\n Radii,\n Shadows,\n Spacing,\n Typography,\n} from '@keboola/brand-registry';\n\nimport type { ResolvedColorScheme } from './types';\nimport { createCssVars } from './utils';\n\nexport type ThemeTokens = {\n colors?: Colors;\n typography?: Typography;\n radii?: Radii;\n shadows?: Shadows;\n spacing?: Spacing;\n motion?: Motion;\n gradient?: Gradient;\n};\n\nexport const brandThemeToTokens = (\n theme: BrandTheme,\n scheme: ResolvedColorScheme,\n): ThemeTokens => ({\n colors: scheme === 'dark' ? theme.colorsDark : theme.colors,\n typography: theme.typography,\n radii: theme.radii,\n // Scheme-independent — the same values apply in light and dark.\n shadows: theme.shadows,\n spacing: theme.spacing,\n motion: theme.motion,\n gradient: theme.gradient,\n});\n\nexport const tokensToCssVars = ({\n colors,\n typography,\n radii,\n shadows,\n spacing,\n motion,\n gradient,\n}: ThemeTokens): Record<string, string> => {\n const vars = createCssVars();\n\n vars.set('--background', colors?.background);\n vars.set('--foreground', colors?.foreground);\n vars.set('--muted', colors?.muted);\n vars.set('--muted-foreground', colors?.mutedForeground);\n vars.set('--border', colors?.border);\n vars.set('--input', colors?.input);\n vars.set('--input-background', colors?.inputBackground);\n vars.set('--ring', colors?.ring);\n vars.set('--ring-offset', colors?.ringOffset);\n vars.set('--primary', colors?.primary);\n vars.set('--primary-foreground', colors?.primaryForeground);\n vars.set('--secondary', colors?.secondary);\n vars.set('--secondary-foreground', colors?.secondaryForeground);\n vars.set('--accent', colors?.accent);\n vars.set('--accent-foreground', colors?.accentForeground);\n vars.set('--card', colors?.card);\n vars.set('--card-foreground', colors?.cardForeground);\n vars.set('--popover', colors?.popover);\n vars.set('--popover-foreground', colors?.popoverForeground);\n vars.set('--destructive', colors?.destructive);\n vars.set('--destructive-foreground', colors?.destructiveForeground);\n vars.set('--success', colors?.success);\n vars.set('--success-foreground', colors?.successForeground);\n vars.set('--warning', colors?.warning);\n vars.set('--warning-foreground', colors?.warningForeground);\n vars.set('--info', colors?.info);\n vars.set('--info-foreground', colors?.infoForeground);\n\n vars.set('--chart-1', colors?.chart?.chart1);\n vars.set('--chart-2', colors?.chart?.chart2);\n vars.set('--chart-3', colors?.chart?.chart3);\n vars.set('--chart-4', colors?.chart?.chart4);\n vars.set('--chart-5', colors?.chart?.chart5);\n\n vars.set('--sidebar', colors?.sidebar?.sidebar);\n vars.set('--sidebar-foreground', colors?.sidebar?.sidebarForeground);\n vars.set('--sidebar-primary', colors?.sidebar?.sidebarPrimary);\n vars.set('--sidebar-primary-foreground', colors?.sidebar?.sidebarPrimaryForeground);\n vars.set('--sidebar-accent', colors?.sidebar?.sidebarAccent);\n vars.set('--sidebar-accent-foreground', colors?.sidebar?.sidebarAccentForeground);\n vars.set('--sidebar-border', colors?.sidebar?.sidebarBorder);\n vars.set('--sidebar-ring', colors?.sidebar?.sidebarRing);\n\n /**\n * TYPOGRAPHY\n */\n vars.set('--font-sans', typography?.fontFamily?.trim() || undefined);\n vars.set('--font-display', typography?.fontDisplay?.trim() || undefined);\n vars.set('--font-mono', typography?.fontMono?.trim() || undefined);\n\n // Chrome font-weight slots — read by Tailwind's `fontWeight` scale.\n vars.set('--font-weight-normal', typography?.weight?.normal);\n vars.set('--font-weight-medium', typography?.weight?.medium);\n vars.set('--font-weight-semibold', typography?.weight?.semibold);\n vars.set('--font-weight-bold', typography?.weight?.bold);\n\n // Chrome tracking — behind Button/Badge `tracking-chrome`.\n vars.set('--letter-spacing-chrome', typography?.letterSpacing?.chrome);\n\n // Type scale — display/heading/body steps read by `text-display/heading/body`.\n vars.set('--type-display-size', typography?.typeScale?.display?.size);\n vars.set('--type-display-weight', typography?.typeScale?.display?.weight);\n vars.set('--type-display-leading', typography?.typeScale?.display?.leading);\n vars.set('--type-display-tracking', typography?.typeScale?.display?.tracking);\n vars.set('--type-heading-size', typography?.typeScale?.heading?.size);\n vars.set('--type-heading-weight', typography?.typeScale?.heading?.weight);\n vars.set('--type-heading-leading', typography?.typeScale?.heading?.leading);\n vars.set('--type-heading-tracking', typography?.typeScale?.heading?.tracking);\n vars.set('--type-body-size', typography?.typeScale?.body?.size);\n vars.set('--type-body-weight', typography?.typeScale?.body?.weight);\n vars.set('--type-body-leading', typography?.typeScale?.body?.leading);\n vars.set('--type-body-tracking', typography?.typeScale?.body?.tracking);\n\n vars.set('--radius-sm', radii?.sm);\n vars.set('--radius-md', radii?.md);\n vars.set('--radius-lg', radii?.lg);\n\n /**\n * ELEVATION / DENSITY / MOTION / GRADIENT\n */\n vars.set('--shadow-sm', shadows?.sm);\n vars.set('--shadow-md', shadows?.md);\n vars.set('--shadow-lg', shadows?.lg);\n vars.set('--shadow-lift', shadows?.lift);\n\n vars.set('--space-gutter', spacing?.gutter);\n vars.set('--space-inset', spacing?.inset);\n\n vars.set('--motion-duration', motion?.duration);\n vars.set('--motion-easing', motion?.easing);\n\n vars.set('--gradient-brand', gradient?.brand);\n\n return vars.expose();\n};\n\nconst setTokens = (node: HTMLElement, vars: Record<string, string>) => {\n for (const [name, value] of Object.entries(vars)) {\n node.style.setProperty(name, value);\n }\n};\n\nconst removeTokens = (node: HTMLElement, vars: Record<string, string>) => {\n for (const name of Object.keys(vars)) {\n node.style.removeProperty(name);\n }\n};\n\n/**\n * Writes a brand's token overrides as inline custom properties.\n *\n * `target` defaults to `<html>` (the app-wide provider). Pass an element to\n * scope the overrides to that subtree instead — `ThemeScope` uses this so a\n * panel can run its own colour scheme: the stylesheet's `[data-theme='dark']`\n * block only re-points the *raw* tokens, while a brand injects the resolved\n * `--color-*` aliases, so a nested scheme must re-inject the brand's values for\n * its own scheme or the brand's light colours leak into a dark subtree.\n */\nexport const useThemeTokens = (tokens: ThemeTokens, target?: HTMLElement | null) => {\n // Insertion effect: runs before the DOM mutates and before any (descendant)\n // layout effect measures token-dependent geometry. Write-only, so it fits the\n // hook's constraints. Only the brand's overrides are set; unset slots fall\n // through to the stylesheet's `:root` / `[data-theme='dark']` defaults.\n useInsertionEffect(() => {\n if (typeof document === 'undefined') return;\n // `undefined` means \"app-wide\"; `null` means \"a scope whose node has not\n // mounted yet\" — nothing to write until the ref lands.\n const node = target === undefined ? document.documentElement : target;\n if (!node) return;\n\n const vars = tokensToCssVars(tokens);\n\n setTokens(node, vars);\n\n return () => removeTokens(node, vars);\n }, [tokens, target]);\n};\n","import { type ReactNode, useMemo } from 'react';\n\nimport type { Brand } from '@keboola/brand-registry';\n\nimport { TooltipProvider } from '../Tooltip';\n\nimport { AIGradientsSvg } from './AIGradientSvg';\nimport { ThemeContext, type ThemeContextValue } from './context';\nimport { DEFAULT_BRANDS, defaultBrand } from './defaults';\nimport { type UseBrandOptions, useBrandState } from './useBrandState';\nimport { type UseColorSchemeOptions, useColorSchemeState } from './useColorSchemeState';\nimport { brandThemeToTokens, useThemeTokens } from './useThemeTokens';\nimport { createTheme } from './utils';\n\ntype Props = UseColorSchemeOptions &\n UseBrandOptions & {\n /** Brands this provider knows about; the active brand id resolves against these. */\n brands?: readonly Brand[];\n children: ReactNode;\n };\n\nexport const ThemeProvider = ({\n defaultScheme,\n scheme,\n onSchemeChange,\n defaultBrandId,\n brandId,\n onBrandIdChange,\n brands = DEFAULT_BRANDS,\n children,\n}: Props) => {\n const colorSchemeState = useColorSchemeState({\n defaultScheme,\n scheme,\n onSchemeChange,\n });\n\n const brandState = useBrandState({\n defaultBrandId,\n brandId,\n onBrandIdChange,\n });\n\n // Resolve the active brand; an unknown id (incl. the default sentinel) falls\n // back to `defaultBrand`, whose empty theme injects nothing so the stylesheet\n // defaults apply.\n const brand = useMemo(\n () => brands.find((item) => item.id === brandState.brandId) ?? defaultBrand,\n [brands, brandState.brandId],\n );\n const themes = useMemo(() => brands.map(createTheme), [brands]);\n const currentTheme = useMemo(() => createTheme(brand), [brand]);\n\n // Only the brand's overrides for the resolved scheme are injected; every slot\n // it omits (including a missing dark palette) falls through to the stylesheet's\n // `:root` / `[data-theme='dark']` defaults — so dark mode works for any brand.\n const themeTokens = useMemo(\n () => brandThemeToTokens(brand.theme, colorSchemeState.resolvedScheme),\n [brand, colorSchemeState.resolvedScheme],\n );\n\n useThemeTokens(themeTokens);\n\n const { scheme: activeScheme, resolvedScheme, setScheme } = colorSchemeState;\n const { brandId: activeBrandId, setBrand } = brandState;\n const context = useMemo<ThemeContextValue>(\n () => ({\n scheme: activeScheme,\n resolvedScheme,\n setScheme,\n brandId: activeBrandId,\n setBrand,\n themes,\n currentTheme,\n brandTheme: brand.theme,\n }),\n [activeScheme, resolvedScheme, setScheme, activeBrandId, setBrand, themes, currentTheme, brand],\n );\n\n return (\n <ThemeContext value={context}>\n <AIGradientsSvg />\n <TooltipProvider>{children}</TooltipProvider>\n </ThemeContext>\n );\n};\n","import { type ReactNode, use, useEffect, useMemo, useRef, useState } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { useTheme } from './context';\nimport { ThemeScopeContainerContext, ThemeScopeSchemeContext } from './themeScopeContext';\nimport type { ColorScheme, ResolvedColorScheme } from './types';\nimport { brandThemeToTokens, tokensToCssVars, useThemeTokens } from './useThemeTokens';\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\n\n// Portalled overlays (menus, popovers) mount at the end of <body>, outside the\n// scope, so they would render in the app's scheme. The scope keeps a body-level\n// container carrying the same tokens and hands it to consumers, which pass it to\n// a `container` prop — themed, and without the clipping that portalling back\n// into the panel would cause.\n/** The scope's themed portal container, or `null` outside a `ThemeScope`. */\nexport const useThemeScopeContainer = () => use(ThemeScopeContainerContext);\n\nconst useResolvedScheme = (scheme: ColorScheme): ResolvedColorScheme => {\n const [systemPrefersDark, setSystemPrefersDark] = useState(\n () => globalThis.matchMedia?.(DARK_QUERY).matches ?? false,\n );\n\n useEffect(() => {\n const query = globalThis.matchMedia?.(DARK_QUERY);\n if (!query) return;\n\n const onChange = (event: MediaQueryListEvent) => setSystemPrefersDark(event.matches);\n query.addEventListener('change', onChange);\n\n return () => query.removeEventListener('change', onChange);\n }, []);\n\n if (scheme === 'system') return systemPrefersDark ? 'dark' : 'light';\n\n return scheme;\n};\n\ntype Props = {\n /** Colour scheme for this subtree. `system` follows the OS preference. */\n scheme: ColorScheme;\n /** Merged onto the child element. */\n className?: string;\n /** A single element to theme. Its props are merged — no wrapper is rendered. */\n children: ReactNode;\n};\n\n/**\n * Runs one subtree in its own colour scheme while the rest of the app keeps the\n * provider's.\n *\n * Two things have to happen for that to look right, and doing only the first is\n * why a bare `data-theme` attribute produces a half-themed panel: the\n * stylesheet's `[data-theme='dark']` block re-points the *raw* tokens\n * (`--foreground`), but a brand injects the resolved aliases as inline vars on\n * `<html>`, which the subtree inherits. So the scope also re-injects the active\n * brand's tokens **for its own scheme**, where they beat the inherited ones.\n *\n * It renders **no element of its own** — the attribute, vars and className are\n * merged onto the child. An extra wrapper (even `display: contents`, which\n * layout ignores but selectors do not) silently breaks direct-child selectors\n * like `[data-fill=true] > &` in the element it wraps.\n */\nexport const ThemeScope = ({ scheme, className, children }: Props) => {\n const { brandTheme } = useTheme();\n const resolvedScheme = useResolvedScheme(scheme);\n const [portalContainer, setPortalContainer] = useState<HTMLDivElement | null>(null);\n\n const tokens = useMemo(\n () => brandThemeToTokens(brandTheme, resolvedScheme),\n [brandTheme, resolvedScheme],\n );\n const style = useMemo(() => tokensToCssVars(tokens), [tokens]);\n\n useThemeTokens(tokens, portalContainer);\n\n // Read at creation without making the container depend on the scheme, which would rebuild it\n // on every flip.\n const schemeRef = useRef(resolvedScheme);\n schemeRef.current = resolvedScheme;\n\n useEffect(() => {\n const container = document.createElement('div');\n container.dataset.themeScopePortal = '';\n // Scoped before it is published: a consumer resolving tokens off this node in the very commit\n // it arrives would otherwise read the page's palette — and cache it under this scope's key.\n container.dataset.theme = schemeRef.current;\n document.body.append(container);\n setPortalContainer(container);\n\n return () => container.remove();\n }, []);\n\n // Keeps an existing container in step; the creation above covers the first commit.\n useEffect(() => {\n portalContainer?.setAttribute('data-theme', resolvedScheme);\n }, [portalContainer, resolvedScheme]);\n\n return (\n <ThemeScopeContainerContext value={portalContainer}>\n {/* The scheme is published as well as painted: a canvas (chart, diagram, editor) builds its\n own palette from the tokens and has to resolve this scope's, not the page's. */}\n <ThemeScopeSchemeContext value={resolvedScheme}>\n <Slot data-theme={resolvedScheme} className={className} style={style}>\n {children}\n </Slot>\n </ThemeScopeSchemeContext>\n </ThemeScopeContainerContext>\n );\n};\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ZoomableSvg-BZlk3PFJ.js","names":[],"sources":["../src/components/ZoomableSvg/ZoomableSvg.tsx","../src/components/ZoomableSvg/exportSvg.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport DOMPurify from 'dompurify';\n\nimport { ClipboardButton } from '../../blocks/ClipboardButton';\nimport { Maximize2, Minimize2 } from '../../icons';\nimport { cn } from '../../utils';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\n\nconst MIN_SCALE = 0.5;\nconst MAX_SCALE = 3;\nconst ZOOM_STEP = 0.1;\n\ntype Props = {\n /** Raw SVG markup. Sanitized internally with DOMPurify (SVG profile) before rendering, so it is\n * safe even when it originates from user/LLM-controlled content. Non-SVG HTML is stripped. */\n html: string;\n copyText?: string;\n className?: string;\n /**\n * Opt in to keeping `<foreignObject>` elements through sanitization. Off by\n * default — the SVG profile drops `<foreignObject>` so no HTML subtree can\n * survive. Only enable when the caller pre-flattens each `<foreignObject>` to\n * bare text (the SVG profile still strips any HTML children even when the\n * element itself is allowed). `MermaidDiagram` sets this for node/icon labels.\n */\n allowForeignObject?: boolean;\n /**\n * Extra toolbar controls, rendered between the copy and fullscreen buttons.\n *\n * Injected rather than built in, so export behaviour — filenames,\n * rasterization, error reporting — stays with the consumer and this component\n * keeps shipping in the lazy `@keboola/design/mermaid` chunk with no download\n * dependencies of its own. Pass `ExportMenu` here. Receives the sanitized\n * SVG so an exporter writes exactly what is on screen.\n */\n renderActions?: (safeSvg: string) => ReactNode;\n};\n\nexport const ZoomableSvg = ({\n html,\n copyText,\n className,\n allowForeignObject,\n renderActions,\n}: Props) => {\n const safeHtml = useMemo(\n () =>\n DOMPurify.sanitize(html, {\n USE_PROFILES: { svg: true, svgFilters: true },\n ...(allowForeignObject ? { ADD_TAGS: ['foreignObject'] } : {}),\n }),\n [html, allowForeignObject],\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [scale, setScale] = useState(1);\n const [translate, setTranslate] = useState({ x: 0, y: 0 });\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n useEffect(() => {\n if (!isFullscreen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n setIsFullscreen(false);\n }\n };\n document.addEventListener('keydown', onKeyDown, { capture: true });\n return () => document.removeEventListener('keydown', onKeyDown, { capture: true });\n }, [isFullscreen]);\n\n const dragRef = useRef<{\n startX: number;\n startY: number;\n startTx: number;\n startTy: number;\n } | null>(null);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const onWheel = (e: WheelEvent) => {\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n const delta = e.deltaY > 0 ? -ZOOM_STEP : ZOOM_STEP;\n setScale((s) => Math.min(MAX_SCALE, Math.max(MIN_SCALE, s + delta)));\n };\n\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => el.removeEventListener('wheel', onWheel);\n // Re-bind when toggling fullscreen: the portal/inline switch remounts the\n // container element, so the listener must attach to the new node.\n }, [isFullscreen]);\n\n const didDragRef = useRef(false);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n e.preventDefault();\n didDragRef.current = false;\n dragRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startTx: translate.x,\n startTy: translate.y,\n };\n },\n [translate],\n );\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!dragRef.current) return;\n didDragRef.current = true;\n setTranslate({\n x: dragRef.current.startTx + e.clientX - dragRef.current.startX,\n y: dragRef.current.startTy + e.clientY - dragRef.current.startY,\n });\n }, []);\n\n const handleMouseUp = useCallback(() => {\n dragRef.current = null;\n }, []);\n\n const handleReset = useCallback(() => {\n setScale(1);\n setTranslate({ x: 0, y: 0 });\n }, []);\n\n const isZoomed = Math.abs(scale - 1) > 0.001 || translate.x !== 0 || translate.y !== 0;\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (didDragRef.current) {\n e.stopPropagation();\n }\n }, []);\n\n const stopPropagation = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n }, []);\n\n const diagramContent = (\n <div\n role=\"presentation\"\n className={cn('tw:group/zoom tw:relative', isFullscreen && 'tw:h-full')}\n onClick={handleClick}\n >\n <div\n role=\"presentation\"\n ref={containerRef}\n className={cn(\n 'tw:overflow-hidden tw:cursor-grab tw:active:cursor-grabbing tw:p-3',\n isFullscreen && 'tw:h-full',\n )}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n <div\n className={cn(\n 'tw:flex tw:justify-center tw:origin-center',\n isFullscreen && 'tw:h-full tw:[&>svg]:h-full',\n )}\n style={{ transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` }}\n dangerouslySetInnerHTML={{ __html: safeHtml }}\n />\n </div>\n <div\n role=\"presentation\"\n // `focus-within` as well as hover: the toolbar is opacity-0 but still in\n // the tab order, so without this a keyboard user tabs through invisible\n // controls with no visible focus ring.\n className=\"tw:absolute tw:right-1 tw:top-1 tw:flex tw:gap-1 tw:opacity-0 tw:transition-opacity tw:focus-within:opacity-100 tw:group-hover/zoom:opacity-100\"\n onClick={stopPropagation}\n >\n {isZoomed && (\n <Tooltip tooltip=\"Reset zoom\" placement=\"top\" triggerAsChild>\n <Button size=\"small\" variant=\"outline\" onClick={handleReset}>\n Reset\n </Button>\n </Tooltip>\n )}\n {copyText && (\n <ClipboardButton text={copyText} tooltip=\"Copy code\" size=\"icon-sm\" variant=\"outline\" />\n )}\n {renderActions?.(safeHtml)}\n <Tooltip\n tooltip={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n placement=\"top\"\n triggerAsChild\n >\n <Button\n size=\"icon-sm\"\n variant=\"outline\"\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n onClick={() => setIsFullscreen((f) => !f)}\n >\n {isFullscreen ? (\n <Minimize2 className=\"tw:size-4\" />\n ) : (\n <Maximize2 className=\"tw:size-4\" />\n )}\n </Button>\n </Tooltip>\n </div>\n </div>\n );\n\n if (isFullscreen) {\n return createPortal(\n <div\n role=\"presentation\"\n data-testid=\"zoomable-svg-fullscreen\"\n /**\n * Stacking contract for this overlay, which portals to `document.body`.\n *\n * - Sits at z-1051, the Modal/Sheet band: above page chrome.\n * - Stays *below* the floating-panel layer (z-1055: DropdownMenu,\n * Popover, Select, Combobox), which portals to `document.body` too —\n * an overlay above it hides any menu opened from the toolbar.\n * - `Tooltip` (z-1060) renders above, as it does over a Modal.\n * - `SpotlightBackdrop` (z-1056) dims this overlay rather than sitting\n * under it — by design, since it deliberately covers the portalled\n * surface tier so a tour's dim can't be punched through.\n * - An app may clamp poppers into this same band, making it a tie that\n * DOM order settles; Radix mounts its portal after this one.\n */\n className=\"tw:fixed tw:inset-0 tw:z-[1051] tw:bg-muted tw:p-4 tailwindcss-preflight\"\n onClick={stopPropagation}\n >\n {diagramContent}\n </div>,\n document.body,\n );\n }\n\n return (\n <div\n className={cn(\n 'tw:overflow-hidden tw:rounded-md tw:border tw:border-border tw:bg-muted',\n className,\n )}\n >\n {diagramContent}\n </div>\n );\n};\n","const PNG_SCALE = 2;\n\n// The root `<svg …>` tag, so the namespace check looks only at its attributes.\n// A plain `includes('xmlns=')` would also match a nested element or body text,\n// and would miss `xmlns = \"…\"` — adding a second declaration, which parsers\n// reject outright with \"Attribute xmlns redefined\".\nconst ROOT_SVG_TAG = /^<svg\\b[^>]*>/i;\nconst HAS_DEFAULT_NAMESPACE = /\\bxmlns\\s*=/i;\n\n// A standalone SVG file needs the namespace declaration; mermaid's inline output\n// omits it because an inline <svg> inherits it from the host document.\n// Trim before matching: the anchored `^<svg` misses markup that arrives with a\n// leading newline or indentation, which would emit a standalone file with no\n// namespace — unopenable in an image viewer.\nconst withSvgNamespace = (svg: string) => {\n const trimmed = svg.trim();\n const rootTag = trimmed.match(ROOT_SVG_TAG)?.[0];\n\n if (!rootTag || HAS_DEFAULT_NAMESPACE.test(rootTag)) return trimmed;\n\n return trimmed.replace(/^<svg\\b/i, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n};\n\nexport const toSvgFileContent = (svg: string) =>\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n${withSvgNamespace(svg).trim()}\\n`;\n\n// A single decimal number: `12`, `12.5`, `.5`. Deliberately stricter than\n// `[\\d.]+`, which also matches `1.2.3` — and `parseFloat` truncates that to\n// `1.2` rather than rejecting it, so a malformed value would pass as a plausible\n// one.\nconst NUMBER = String.raw`\\d+(?:\\.\\d+)?|\\.\\d+`;\n\n// `parseFloat` happily reads a relative length as a number — `\"100%\"` becomes\n// `100`, `\"2em\"` becomes `2` — and `makeResponsive` sets `width=\"100%\"` on every\n// mermaid root, so an SVG with no usable viewBox would rasterize 100px wide with\n// no error. Accept only a unitless number or an explicit `px`.\nconst PIXEL_LENGTH = new RegExp(String.raw`^\\s*(?:${NUMBER})(?:px)?\\s*$`, 'i');\n\nconst parsePixelLength = (value: string | null): number | null => {\n if (!PIXEL_LENGTH.test(value ?? '')) return null;\n\n const parsed = Number.parseFloat(value ?? '');\n\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n};\n\nexport const parseSvgSize = (svg: string) => {\n const doc = new DOMParser().parseFromString(withSvgNamespace(svg), 'image/svg+xml');\n const element = doc.documentElement;\n\n const viewBox = element\n .getAttribute('viewBox')\n ?.split(/[\\s,]+/)\n .map(Number);\n // `> 0`, not truthiness: a negative extent is accepted by a truthy check, and\n // negative canvas dimensions silently fall back to the 300x150 default — an\n // export at the wrong size with no error. Falling through to width/height is\n // the better answer, since those are usually still valid.\n if (viewBox?.length === 4 && viewBox.every((value) => Number.isFinite(value))) {\n const [, , width, height] = viewBox;\n if (width !== undefined && height !== undefined && width > 0 && height > 0) {\n return { width, height };\n }\n }\n\n const width = parsePixelLength(element.getAttribute('width'));\n const height = parsePixelLength(element.getAttribute('height'));\n\n return width !== null && height !== null ? { width, height } : null;\n};\n\n// Resolve the themed page background so the exported PNG follows the active\n// brand and color scheme instead of a frozen literal. Falls back to `white`\n// (a CSS keyword, not a brand-locked hex) when the token is unset.\n//\n// The token holds Tailwind's bare channel triplet (\"249 250 251\") so utilities\n// can add an alpha. Canvas `fillStyle` rejects that form *silently* and keeps\n// its previous value (black), so wrap it back into rgb() before use.\nconst CHANNEL_TRIPLET = new RegExp(String.raw`^(?:${NUMBER})\\s+(?:${NUMBER})\\s+(?:${NUMBER})$`);\n\nexport const toCanvasColor = (token: string) => {\n const trimmed = token.trim();\n if (!trimmed) return 'white';\n\n // Only wrap a well-formed triplet. A malformed one (`1.2.3 4 5`) would produce\n // an invalid `rgb()` that `fillStyle` rejects silently, painting the PNG on\n // whatever colour was set before — passing it through unwrapped at least lets\n // a genuine CSS color value work.\n return CHANNEL_TRIPLET.test(trimmed) ? `rgb(${trimmed})` : trimmed;\n};\n\nconst resolveBackground = () =>\n toCanvasColor(getComputedStyle(document.documentElement).getPropertyValue('--color-background'));\n\n/**\n * Rasterize SVG markup to a PNG blob at 2x for legible text.\n *\n * The SVG is loaded as a data URL rather than a blob URL: an <img> loading SVG\n * is treated as a foreign resource, so a blob URL would taint the canvas and\n * make toBlob throw a SecurityError. A background is painted first because a\n * transparent PNG reads as unusable when pasted into a slide deck.\n */\nexport const svgToPngBlob = async (svg: string, background?: string): Promise<Blob> => {\n const size = parseSvgSize(svg);\n if (!size) throw new Error('Cannot determine diagram dimensions.');\n\n const encoded = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(toSvgFileContent(svg))}`;\n\n const image = new Image();\n image.decoding = 'sync';\n await new Promise<void>((resolve, reject) => {\n image.onload = () => resolve();\n image.onerror = () => reject(new Error('Failed to load the diagram for export.'));\n image.src = encoded;\n });\n\n const canvas = document.createElement('canvas');\n canvas.width = Math.round(size.width * PNG_SCALE);\n canvas.height = Math.round(size.height * PNG_SCALE);\n\n const context = canvas.getContext('2d');\n if (!context) throw new Error('Canvas is unavailable in this browser.');\n\n context.fillStyle = background ?? resolveBackground();\n context.fillRect(0, 0, canvas.width, canvas.height);\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => (blob ? resolve(blob) : reject(new Error('Failed to encode the PNG.'))),\n 'image/png',\n );\n });\n};\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-D7X470dy.js","names":[],"sources":["../src/components/ThemeProvider/context.tsx"],"sourcesContent":["import { createContext, use } from 'react';\n\nimport type { Brand } from '@keboola/brand-registry';\n\nimport { DEFAULT_COLOR_SCHEME, defaultBrand, defaultTheme } from './defaults';\nimport type { Theme } from './types';\nimport type { useBrandState } from './useBrandState';\nimport type { useColorSchemeState } from './useColorSchemeState';\n\nexport type ThemeContextValue = ReturnType<typeof useColorSchemeState> &\n ReturnType<typeof useBrandState> & {\n themes: Theme[];\n currentTheme: Theme;\n /**\n * The active brand's raw token payload. Exposed so a nested `ThemeScope`\n * can re-derive tokens for a different colour scheme; `currentTheme` only\n * carries the switcher metadata (id/name/shell/logo), not the tokens.\n */\n brandTheme: Brand['theme'];\n };\n\nconst noop = () => void 0;\n\nconst defaultContext: ThemeContextValue = {\n scheme: DEFAULT_COLOR_SCHEME,\n resolvedScheme: DEFAULT_COLOR_SCHEME,\n setScheme: noop,\n brandId: defaultTheme.id,\n setBrand: noop,\n\n themes: [defaultTheme],\n currentTheme: defaultTheme,\n brandTheme: defaultBrand.theme,\n};\n\nexport const ThemeContext = createContext(defaultContext);\n\nexport const useTheme = () => use(ThemeContext);\n\n/**\n * TEMPORARY — kbc-ui-internal only.\n *\n * Flags whether the subtree renders the argo design language. Defaults to argo\n * (`true`) — the modern default; legacy chrome is the exception. It exists\n * solely to bridge kbc-ui while its chrome is migrated off the legacy design\n * language: kbc-ui provides `false` for legacy brands/surfaces (see its\n * `AppThemeProvider`) and reads it via `useArgoDesign`. `ThemeProvider` does\n * not set it — argo is decoupled from the brand. Once every kbc-ui surface has\n * been migrated, this context and its hook can be deleted.\n */\nexport const ArgoDesignContext = createContext<boolean>(true);\n\nexport const useArgoDesign = () => use(ArgoDesignContext);\n"],"mappings":";;;AAqBA,MAAM,aAAa,KAAK;AAExB,MAAM,iBAAoC;CACxC,QAAQ;CACR,gBAAgB;CAChB,WAAW;CACX,SAAS,aAAa;CACtB,UAAU;CAEV,QAAQ,CAAC,YAAY;CACrB,cAAc;CACd,YAAY,aAAa;AAC3B;AAEA,MAAa,eAAe,cAAc,cAAc;AAExD,MAAa,iBAAiB,IAAI,YAAY;;;;;;;;;;;;AAa9C,MAAa,oBAAoB,cAAuB,IAAI;AAE5D,MAAa,sBAAsB,IAAI,iBAAiB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"findLiteralMatches-BGBw8Vbl.js","names":[],"sources":["../src/utils/findLiteralMatches.ts"],"sourcesContent":["/**\n * Lowercase without changing the length of the string.\n *\n * - `İ` (U+0130) is the only code point in Unicode whose `toLowerCase()` is two code units, so it\n * folds to `I` first and reads as a plain `i`.\n * - Every offset this module reports indexes the caller's own text, which holds only while the\n * fold is length-preserving.\n */\nconst foldCase = (text: string) => text.replaceAll('İ', 'I').toLowerCase();\n\n// A query longer than the text cannot occur in it — checked before either side is folded, so a\n// pasted document scanned line by line costs nothing per line.\nconst canContain = (text: string, query: string) => !!query && query.length <= text.length;\n\n// Start offsets of every non-overlapping occurrence of `needle` in `haystack`, verbatim — the\n// callers own the case folding.\nconst scan = (haystack: string, needle: string) => {\n const offsets: number[] = [];\n let at = haystack.indexOf(needle);\n\n while (at !== -1) {\n offsets.push(at);\n at = haystack.indexOf(needle, at + needle.length);\n }\n\n return offsets;\n};\n\n/**\n * Whether `text` holds `query`, ignoring case.\n *\n * - For callers that only need the answer — it stops at the first occurrence and allocates no\n * offsets.\n */\nexport const hasLiteralMatch = (text: string, query: string) =>\n canContain(text, query) && foldCase(text).includes(foldCase(query));\n\n/**\n * Start offsets of every occurrence of `query` in `text`, ignoring case unless `isCaseSensitive`.\n *\n * - The scan is literal, so every character of the query stands for itself. A search query is\n * pasted code as often as it is a word, and tens of kilobytes of it exceed what V8 can compile\n * as a regular expression.\n * - Occurrences do not overlap.\n * - An empty query matches nothing.\n * - CodeMirror's own `SearchCursor` does this over a `Text`, but it would reach the root barrel\n * the whole CodeMirror bundle is kept out of, and three of the four callers hold plain strings.\n */\nexport const findLiteralMatches = (\n text: string,\n query: string,\n { isCaseSensitive = false }: { isCaseSensitive?: boolean } = {},\n) => {\n if (!canContain(text, query)) return [];\n\n return isCaseSensitive ? scan(text, query) : scan(foldCase(text), foldCase(query));\n};\n\n/**\n * `findLiteralMatches` for many queries over one text, as `{ from, to }` ranges.\n *\n * - Folds `text` once, not once per term — the per-term cost is the scan alone.\n * - Ranges arrive in term order; ranges of different terms may overlap.\n */\nexport const findLiteralTermMatches = (\n text: string,\n terms: string[],\n { isCaseSensitive = false }: { isCaseSensitive?: boolean } = {},\n) => {\n const haystack = isCaseSensitive ? text : foldCase(text);\n\n return terms.flatMap((term) => {\n if (!canContain(text, term)) return [];\n\n return scan(haystack, isCaseSensitive ? term : foldCase(term)).map((from) => ({\n from,\n to: from + term.length,\n }));\n });\n};\n"],"mappings":";;;;;;;;;AAQA,MAAM,YAAY,SAAiB,KAAK,WAAW,KAAK,GAAG,CAAC,CAAC,YAAY;AAIzE,MAAM,cAAc,MAAc,UAAkB,CAAC,CAAC,SAAS,MAAM,UAAU,KAAK;AAIpF,MAAM,QAAQ,UAAkB,WAAmB;CACjD,MAAM,UAAoB,CAAC;CAC3B,IAAI,KAAK,SAAS,QAAQ,MAAM;CAEhC,OAAO,OAAO,IAAI;EAChB,QAAQ,KAAK,EAAE;EACf,KAAK,SAAS,QAAQ,QAAQ,KAAK,OAAO,MAAM;CAClD;CAEA,OAAO;AACT;;;;;;;AAQA,MAAa,mBAAmB,MAAc,UAC5C,WAAW,MAAM,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,SAAS,KAAK,CAAC;;;;;;;;;;;;AAapE,MAAa,sBACX,MACA,OACA,EAAE,kBAAkB,UAAyC,CAAC,MAC3D;CACH,IAAI,CAAC,WAAW,MAAM,KAAK,GAAG,OAAO,CAAC;CAEtC,OAAO,kBAAkB,KAAK,MAAM,KAAK,IAAI,KAAK,SAAS,IAAI,GAAG,SAAS,KAAK,CAAC;AACnF;;;;;;;AAQA,MAAa,0BACX,MACA,OACA,EAAE,kBAAkB,UAAyC,CAAC,MAC3D;CACH,MAAM,WAAW,kBAAkB,OAAO,SAAS,IAAI;CAEvD,OAAO,MAAM,SAAS,SAAS;EAC7B,IAAI,CAAC,WAAW,MAAM,IAAI,GAAG,OAAO,CAAC;EAErC,OAAO,KAAK,UAAU,kBAAkB,OAAO,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU;GAC5E;GACA,IAAI,OAAO,KAAK;EAClB,EAAE;CACJ,CAAC;AACH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"icons-Cek151jC.js","names":[],"sources":["../src/icons/flags/Eu.tsx","../src/icons/flags/Us.tsx","../src/icons/brandIcon.ts","../src/icons/vendors/Aws.tsx","../src/icons/vendors/Azure.tsx","../src/icons/vendors/ChatGpt.tsx","../src/icons/vendors/Claude.tsx","../src/icons/vendors/Cursor.tsx","../src/icons/vendors/Devin.tsx","../src/icons/vendors/Gcp.tsx","../src/icons/vendors/Google.tsx","../src/icons/vendors/Keboola.tsx","../src/icons/vendors/Make.tsx","../src/icons/vendors/Microsoft.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport type { LucideIcon, LucideProps } from 'lucide-react';\n\nimport { cn } from '../../utils';\n\nconst STAR =\n 'M0 -2 0.449 -0.618 1.902 -0.618 0.727 0.236 1.176 1.618 0 0.764 -1.176 1.618 -0.727 0.236 -1.902 -0.618 -0.449 -0.618Z';\n\nconst STAR_POSITIONS = Array.from({ length: 12 }, (_, index) => {\n const angle = (index * Math.PI) / 6 - Math.PI / 2;\n return { x: 12 + 5.882 * Math.cos(angle), y: 12 + 5.882 * Math.sin(angle) };\n});\n\nexport const Eu: LucideIcon = forwardRef<SVGSVGElement, LucideProps>(\n ({ size = 24, className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={cn('lucide', className)}\n {...rest}\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2\" fill=\"#039\" />\n <g fill=\"#FC0\">\n {STAR_POSITIONS.map(({ x, y }) => (\n <path key={`${x},${y}`} d={STAR} transform={`translate(${x} ${y})`} />\n ))}\n </g>\n {children}\n </svg>\n ),\n);\n\nEu.displayName = 'Eu';\n","import { forwardRef, useId } from 'react';\nimport type { LucideIcon, LucideProps } from 'lucide-react';\n\nimport { cn } from '../../utils';\n\nconst STRIPES =\n 'M2 3.538h20v1.538H2ZM2 6.615h20v1.538H2ZM2 9.692h20v1.538H2ZM2 12.769h20v1.538H2ZM2 15.846h20v1.538H2ZM2 18.923h20v1.538H2Z';\n\nexport const Us: LucideIcon = forwardRef<SVGSVGElement, LucideProps>(\n ({ size = 24, className, children, ...rest }, ref) => {\n const clipId = `${useId()}-tile`;\n\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={cn('lucide', className)}\n {...rest}\n >\n <clipPath id={clipId}>\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2\" />\n </clipPath>\n <g clipPath={`url(#${clipId})`}>\n <path fill=\"#B22234\" d=\"M2 2h20v20H2Z\" />\n <path fill=\"#fff\" d={STRIPES} />\n <path fill=\"#3C3B6E\" d=\"M2 2h8v10.769H2Z\" />\n </g>\n {children}\n </svg>\n );\n },\n);\n\nUs.displayName = 'Us';\n","import type { ForwardRefExoticComponent, RefAttributes } from 'react';\nimport type { LucideIcon, LucideProps } from 'lucide-react';\n\nimport { cn } from '../utils';\n\nexport type BrandIconProps = LucideProps & {\n /** Render the mark in `currentColor` instead of its own brand colours. */\n mono?: boolean;\n};\n\n/**\n * The vendor and flag marks: a Lucide icon plus `mono`. Intersecting `LucideIcon`\n * keeps them assignable to any `icon: LucideIcon` slot by construction.\n */\nexport type BrandIcon = LucideIcon &\n ForwardRefExoticComponent<BrandIconProps & RefAttributes<SVGSVGElement>>;\n\n/**\n * CSS wins over presentation attributes, so this recolours every shape without\n * touching the artwork. Both `defs` and its descendants are excluded: `fill` is an\n * inherited property, so recolouring `<defs>` itself would reach its children and\n * destroy a mask's `fill=\"white\"`, which is luminance rather than colour.\n */\nconst MONO = 'tw:[&_*:not(defs,defs_*)]:fill-current';\n\n/** Every brand mark's class list: the Lucide marker, the `mono` override, then caller overrides. */\nexport const brandClass = (mono: boolean | undefined, className: string | undefined) =>\n cn('lucide', mono && MONO, className);\n","import { forwardRef } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\n// `forwardRef` here is required for type compatibility with `LucideIcon` — see\n// `Keboola.tsx` for the full rationale. The AWS logo is a fixed two-color vendor\n// mark (`#252F3E` wordmark + `#FF9900` smile): its paths keep their own fills\n// and ignore `color`, and it must NOT re-skin under a customer brand.\nexport const Aws: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n // Lucide's grid — see `Keboola.tsx` for why every brand icon shares it.\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={brandClass(mono, className)}\n {...rest}\n >\n {/* Wordmark + smile is a wide lockup, so the 20-unit box caps its width; it is centered\n vertically. Measured artwork bbox: (5.12, 9.49) 21.76 × 13.01. */}\n <g transform=\"translate(-2.7059 -2.7013) scale(0.919118)\">\n <path\n fill=\"#252F3E\"\n d=\"M11.253 14.22c0 .267.029.484.08.644.057.159.13.333.23.52.037.059.051.117.051.167 0 .073-.043.145-.137.217l-.456.304a.347.347 0 0 1-.188.065c-.072 0-.145-.036-.217-.1a2.232 2.232 0 0 1-.26-.341 5.574 5.574 0 0 1-.225-.427c-.565.666-1.274.999-2.128.999-.608 0-1.092-.174-1.447-.521-.355-.348-.536-.81-.536-1.39 0-.615.217-1.114.659-1.49.441-.377 1.028-.565 1.773-.565.246 0 .5.022.767.058.268.036.543.094.832.159v-.528c0-.55-.115-.934-.34-1.158-.231-.225-.622-.333-1.18-.333-.253 0-.513.029-.781.094a5.764 5.764 0 0 0-.782.246 2.07 2.07 0 0 1-.253.094.444.444 0 0 1-.116.022c-.101 0-.152-.072-.152-.224v-.355c0-.116.015-.203.051-.253a.542.542 0 0 1 .203-.152c.253-.13.557-.24.911-.326.355-.094.731-.138 1.13-.138.86 0 1.49.196 1.895.587.399.39.601.984.601 1.78v2.345h.015Zm-2.939 1.1c.24 0 .485-.044.746-.13.26-.087.492-.247.687-.464.116-.137.203-.29.246-.463a2.6 2.6 0 0 0 .073-.63v-.303a6.071 6.071 0 0 0-.666-.123 5.462 5.462 0 0 0-.68-.044c-.485 0-.84.094-1.079.29-.238.195-.354.47-.354.832 0 .34.087.593.268.767.173.18.427.268.76.268Zm5.812.781c-.13 0-.217-.021-.275-.072-.058-.043-.109-.145-.152-.282l-1.701-5.594a1.269 1.269 0 0 1-.065-.29c0-.116.058-.18.174-.18h.709c.137 0 .231.02.282.072.058.043.101.144.145.282l1.216 4.79 1.129-4.79c.036-.145.08-.239.137-.282a.498.498 0 0 1 .29-.073h.578c.138 0 .232.022.29.073.058.043.108.144.137.282l1.144 4.848 1.252-4.848c.043-.145.094-.239.145-.282a.472.472 0 0 1 .282-.073h.673c.116 0 .18.058.18.181 0 .036-.007.072-.014.116a1.03 1.03 0 0 1-.05.18l-1.745 5.595c-.043.145-.094.239-.152.282a.463.463 0 0 1-.274.072h-.623c-.137 0-.231-.021-.29-.072-.057-.05-.108-.145-.137-.29L16.29 11.08l-1.114 4.66c-.036.145-.08.24-.138.29-.057.05-.159.072-.289.072h-.622Zm9.299.196c-.376 0-.753-.044-1.114-.13-.362-.088-.645-.182-.833-.29-.116-.065-.195-.138-.224-.203a.512.512 0 0 1-.044-.202v-.37c0-.151.058-.224.167-.224.043 0 .087.008.13.022.044.014.109.043.181.072.246.109.514.196.796.254.29.057.572.086.861.086.456 0 .81-.08 1.057-.238a.78.78 0 0 0 .376-.688.705.705 0 0 0-.195-.506c-.13-.138-.376-.261-.731-.377l-1.05-.325c-.528-.167-.918-.413-1.157-.739a1.724 1.724 0 0 1-.362-1.049c0-.304.065-.572.195-.803A1.86 1.86 0 0 1 22 9.993c.217-.166.463-.29.753-.376.29-.087.593-.123.912-.123.159 0 .325.007.485.029.166.022.318.05.47.08.145.036.282.072.413.115.13.044.231.087.303.13a.626.626 0 0 1 .218.181.39.39 0 0 1 .065.24v.34c0 .152-.058.231-.167.231a.753.753 0 0 1-.275-.087 3.311 3.311 0 0 0-1.39-.282c-.412 0-.737.065-.962.203-.224.137-.34.347-.34.644 0 .202.073.376.217.514.145.137.413.274.796.397l1.028.326c.521.167.897.398 1.122.695.224.297.333.637.333 1.013 0 .311-.066.594-.189.84-.13.246-.303.463-.528.636-.224.181-.492.312-.803.406a3.442 3.442 0 0 1-1.035.152Z\"\n />\n <path\n fill=\"#F90\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M24.793 19.814c-2.381 1.758-5.84 2.692-8.815 2.692-4.168 0-7.924-1.542-10.76-4.103-.225-.203-.023-.478.245-.319 3.069 1.78 6.853 2.859 10.769 2.859 2.641 0 5.543-.55 8.213-1.68.398-.18.739.261.348.55Z\"\n />\n <path\n fill=\"#F90\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M25.784 18.685c-.304-.391-2.012-.188-2.786-.094-.232.029-.268-.174-.058-.326 1.36-.955 3.597-.68 3.857-.362.26.326-.072 2.562-1.346 3.633-.195.167-.383.08-.296-.137.29-.717.933-2.33.63-2.714Z\"\n />\n </g>\n {children}\n </svg>\n ),\n);\n\nAws.displayName = 'Aws';\n","import { forwardRef, useId } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\n// `forwardRef` here is required for type compatibility with `LucideIcon` — see\n// `Keboola.tsx` for the full rationale. The Azure mark is a fixed vendor gradient\n// (`#114A8B → #0669BC`, `#3CCBF4 → #2892DF`, plus a solid `#0078D4`): it ignores\n// `color` and must NOT re-skin under a customer brand.\n//\n// The gradients are referenced by id, so the ids are derived from `useId()` — two\n// `Azure` icons on one page would otherwise define the same ids and the first\n// definition would win for both.\nexport const Azure: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, className, children, ...rest }, ref) => {\n const id = useId();\n const [left, shadow, right] = [`${id}-left`, `${id}-shadow`, `${id}-right`];\n\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n // Lucide's grid — see `Keboola.tsx` for why every brand icon shares it.\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={brandClass(mono, className)}\n {...rest}\n >\n {/* Measured artwork bbox: (6.83, 7.36) 18.33 × 17.27. The gradients are\n `userSpaceOnUse`, so they resolve in this group's space and need no adjustment. */}\n <g transform=\"translate(-5.4523 -5.4523) scale(1.091107)\">\n <path\n fill={`url(#${left})`}\n d=\"M12.945 7.363h5.425l-5.631 16.685a.865.865 0 0 1-.82.589H7.698a.863.863 0 0 1-.819-1.14l5.247-15.545a.864.864 0 0 1 .82-.589Z\"\n />\n <path\n fill=\"#0078D4\"\n d=\"M20.828 18.554h-8.602a.398.398 0 0 0-.272.69l5.528 5.159c.16.15.373.234.593.233h4.87l-2.117-6.082Z\"\n />\n <path\n fill={`url(#${shadow})`}\n d=\"M12.945 7.363a.858.858 0 0 0-.821.6l-5.238 15.52a.862.862 0 0 0 .814 1.153h4.33a.925.925 0 0 0 .711-.604l1.045-3.078 3.73 3.48c.157.13.353.2.556.202h4.853l-2.128-6.082-6.205.002L18.39 7.363h-5.445Z\"\n />\n <path\n fill={`url(#${right})`}\n d=\"M19.874 7.95a.863.863 0 0 0-.818-.587H13.01a.864.864 0 0 1 .818.588l5.247 15.546a.863.863 0 0 1-.818 1.14h6.045a.863.863 0 0 0 .819-1.14L19.874 7.95Z\"\n />\n </g>\n <defs>\n <linearGradient\n id={left}\n x1=\"14.922\"\n x2=\"9.289\"\n y1=\"8.643\"\n y2=\"25.286\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#114A8B\" />\n <stop offset=\"1\" stopColor=\"#0669BC\" />\n </linearGradient>\n <linearGradient\n id={shadow}\n x1=\"16.682\"\n x2=\"15.379\"\n y1=\"16.399\"\n y2=\"16.84\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopOpacity=\".3\" />\n <stop offset=\".071\" stopOpacity=\".2\" />\n <stop offset=\".321\" stopOpacity=\".1\" />\n <stop offset=\".623\" stopOpacity=\".05\" />\n <stop offset=\"1\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient\n id={right}\n x1=\"15.966\"\n x2=\"22.15\"\n y1=\"8.158\"\n y2=\"24.633\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#3CCBF4\" />\n <stop offset=\"1\" stopColor=\"#2892DF\" />\n </linearGradient>\n </defs>\n {children}\n </svg>\n );\n },\n);\n\nAzure.displayName = 'Azure';\n","import { forwardRef } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\nexport const ChatGpt: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, color = 'currentColor', className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={color}\n className={brandClass(mono, className)}\n {...rest}\n >\n <g transform=\"translate(-8.178339 -8.178357) scale(0.05639)\">\n <path d=\"M508.7 317.4C516.8 287.3 509 253.9 485.4 230.3C461.8 206.7 428.4 198.9 398.3 206.9C376.2 184.9 343.4 175 311.1 183.6C278.9 192.2 255.4 217.3 247.4 247.4C217.3 255.5 192.2 278.9 183.6 311.1C175 343.4 184.9 376.2 206.9 398.3C198.9 428.4 206.7 461.8 230.3 485.4C253.9 509 287.3 516.8 317.4 508.8C339.4 530.7 372.3 540.7 404.5 532.1C436.8 523.4 460.2 498.4 468.3 468.3C498.4 460.2 523.4 436.8 532.1 404.5C540.7 372.3 530.7 339.4 508.7 317.4V317.4ZM470.9 244.8C486.9 260.8 493.5 282.6 490.7 303.4L415.6 260C412.4 258.2 408.5 258.2 405.3 260L317.4 310.8V277.5C317.4 275.2 318.7 273 320.7 271.8L387.6 233.2C414.2 218.4 448.3 222.2 470.9 244.8H470.9ZM357.8 311.1L398.3 334.5V381.2L357.8 404.5L317.4 381.2V334.5L357.8 311.1ZM264.8 269.7C265.2 239.3 285.6 211.6 316.5 203.4C338.3 197.5 360.5 202.7 377.1 215.6L302 258.9C298.8 260.8 296.9 264.1 296.9 267.8V369.3L268.1 352.7C266 351.5 264.8 349.4 264.8 347V269.7V269.7ZM203.4 316.5C209.2 294.6 224.9 278 244.3 270V356.7C244.3 360.4 246.2 363.8 249.4 365.6L337.3 416.4L308.5 433C306.5 434.2 304 434.2 301.9 433L235 394.4C208.9 378.8 195.1 347.3 203.4 316.5ZM244.8 470.9C228.8 454.9 222.2 433.1 225 412.3L300.1 455.6C303.3 457.5 307.2 457.5 310.3 455.6L398.3 404.9V438.1C398.3 440.5 397 442.7 395 443.8L328 482.5C301.5 497.3 267.3 493.5 244.8 470.9H244.8ZM450.9 446C450.5 476.4 430 504 399.2 512.3C377.4 518.1 355.2 512.9 338.5 500.1L413.7 456.7C416.8 454.9 418.8 451.5 418.8 447.9V346.3L447.6 363C449.6 364.1 450.9 366.3 450.9 368.7V446V446ZM512.3 399.2C506.4 421.1 490.8 437.7 471.4 445.7V358.9C471.4 355.3 469.4 351.9 466.3 350.1L378.3 299.3L407.2 282.7C409.2 281.5 411.7 281.5 413.7 282.7L480.7 321.3C506.8 336.9 520.5 368.4 512.3 399.2Z\" />\n </g>\n {children}\n </svg>\n ),\n);\n\nChatGpt.displayName = 'ChatGpt';\n","import { forwardRef } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\nexport const Claude: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={brandClass(mono, className)}\n {...rest}\n >\n <g transform=\"translate(1.473684 1.473684) scale(0.08489)\">\n <path\n d=\"M52.4 162.9L98.8 136.9L99.5 134.6L98.8 133.3H96.5L88.7 132.9L62.2 132.2L39.3 131.2L17 130L11.4 128.8L6.2 121.9L6.7 118.4L11.4 115.3L18.2 115.8L33.1 116.9L55.5 118.4L71.7 119.4L95.7 121.9H99.5L100.1 120.3L98.8 119.4L97.8 118.4L74.6 102.7L49.5 86.2L36.4 76.6L29.4 71.8L25.8 67.3L24.3 57.4L30.7 50.3L39.3 50.9L41.5 51.5L50.3 58.2L69 72.7L93.4 90.7L97 93.6L98.4 92.7L98.7 92L97 89.3L83.8 65.3L69.6 40.8L63.3 30.7L61.6 24.6C61 22.1 60.6 20 60.6 17.4L67.8 7.5L71.9 6.2L81.7 7.5L85.8 11L91.9 25L101.7 46.8L117 76.6L121.5 85.5L123.9 93.6L124.8 96.1H126.3V94.7L127.6 77.9L129.9 57.4L132.2 30.9L132.9 23.5L136.6 14.5L144 9.6L149.7 12.3L154.4 19.1L153.8 23.5L151 41.6L145.5 70.1L142 89.3H144L146.4 86.8L156.1 74L172.3 53.7L179.4 45.7L187.8 36.8L193.2 32.5H203.3L210.7 43.7L207.4 55.1L197 68.3L188.3 79.6L175.9 96.2L168.2 109.6L168.9 110.7L170.7 110.5L198.8 104.5L213.9 101.8L232 98.7L240.1 102.5L241 106.4L237.9 114.3L218.5 119L195.8 123.6L162.1 131.6L161.7 131.9L162.1 132.5L177.4 133.9L183.9 134.3H199.8L229.4 136.5L237.2 141.6L241.8 147.9L241 152.7L229.1 158.7L213 155L175.4 146L162.6 142.8H160.8V143.8L171.5 154.4L191.2 172.1L215.8 195L217.1 200.7L213.9 205.2L210.6 204.7L188.9 188.4L180.5 181.1L161.7 165.1H160.4V166.8L164.8 173.2L187.8 207.8L188.9 218.4L187.3 221.8L181.3 224L174.8 222.8L161.2 203.8L147.3 182.5L136.1 163.3L134.7 164.2L128.1 235.4L125 239.1L117.9 241.8L111.9 237.3L108.7 230L111.9 215.5L115.7 196.5L118.8 181.5L121.6 162.9L123.3 156.6L123.1 156.2L121.8 156.4L107.7 175.8L86.3 204.7L69.4 222.8L65.3 224.4L58.3 220.8L58.9 214.3L62.9 208.5L86.3 178.7L100.4 160.2L109.6 149.5L109.5 148L109 147.9L46.7 188.5L35.6 189.9L30.8 185.4L31.4 178.1L33.7 175.8L52.4 162.9Z\"\n fill=\"#D97757\"\n />\n </g>\n {children}\n </svg>\n ),\n);\n\nClaude.displayName = 'Claude';\n","import { forwardRef } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\nexport const Cursor: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={brandClass(mono, className)}\n {...rest}\n >\n <g transform=\"translate(-38.617225 -39.361257) scale(0.104712)\">\n <path\n d=\"M483.4 490.5L566 538.3C565.5 539.2 564.8 539.9 563.8 540.5L486.6 585.1C484.6 586.3 482.2 586.3 480.2 585.1L402.9 540.5C402 539.9 401.3 539.2 400.8 538.3L483.4 490.5Z\"\n fill=\"#72716D\"\n />\n <path\n d=\"M483.4 395V490.5L400.8 538.3C400.3 537.4 400 536.4 400 535.3V445.7C400 443.5 401.1 441.6 402.9 440.5L480.1 395.9C481.2 395.3 482.3 395 483.4 395H483.4Z\"\n fill=\"#55544F\"\n />\n <path\n d=\"M566 442.7C565.5 441.8 564.8 441.1 563.8 440.5L486.6 395.9C485.6 395.3 484.5 395 483.4 395V490.5L566 538.3C566.5 537.4 566.8 536.4 566.8 535.3V445.7C566.8 444.6 566.5 443.6 566 442.7H566Z\"\n fill=\"#43413C\"\n />\n <path\n d=\"M560.2 446C560.7 446.9 560.8 447.9 560.2 448.8L485.2 579C484.7 579.9 483.4 579.5 483.4 578.5V492.7C483.4 492 483.2 491.4 482.9 490.8L560.2 446H560.2V446Z\"\n fill=\"#D6D5D2\"\n />\n <path\n d=\"M560.2 446L482.9 490.8C482.6 490.2 482.1 489.7 481.5 489.4L407.4 446.5C406.5 446 406.9 444.7 407.9 444.7H557.8C558.9 444.7 559.8 445.2 560.2 446Z\"\n fill=\"white\"\n />\n </g>\n {children}\n </svg>\n ),\n);\n\nCursor.displayName = 'Cursor';\n","import { forwardRef } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\nexport const Devin: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, color = 'currentColor', className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={color}\n className={brandClass(mono, className)}\n {...rest}\n >\n <g transform=\"translate(-0.993373 -0.985316) scale(0.060925)\">\n <path d=\"M70 159.3V91.3C70 88.4 71.6 85.6 74.2 84.1L133 50.1C135.6 48.6 138.8 48.6 141.4 50.1L200.3 84.1C202.9 85.6 204.4 88.4 204.4 91.3V126.1C204.7 137.6 210.8 148.7 221.5 154.9C232.3 161.1 244.9 160.8 255.1 155.3L285.1 137.9C287.7 136.4 290.9 136.4 293.5 137.9L352.4 171.9C354.9 173.4 356.5 176.2 356.5 179.2V247.1C356.5 250.1 354.9 252.9 352.4 254.4L293.5 288.4C290.9 289.8 287.7 289.8 285.1 288.4L255.3 271.1C245.1 265.5 232.3 265.1 221.5 271.4C210.8 277.6 204.7 288.7 204.5 300.2V334.9C204.5 337.9 202.9 340.7 200.3 342.2L141.4 376.2C138.8 377.6 135.6 377.6 133 376.2L74.2 342.2C71.6 340.7 70 337.9 70 334.9V267C70 264 71.6 261.2 74.2 259.7L133 225.7C135.6 224.2 138.8 224.2 141.4 225.7L171.5 243.1C181.7 248.6 194.3 248.9 205 242.7C215.8 236.5 221.9 225.2 222.1 213.6C221.8 202.1 215.7 189.7 205 183.5C194.3 177.4 181.6 177.6 171.5 183.2L141.3 200.7C138.7 202.2 135.5 202.2 132.9 200.7L74.2 166.6C71.6 165.1 70 162.3 70 159.3Z\" />\n </g>\n {children}\n </svg>\n ),\n);\n\nDevin.displayName = 'Devin';\n","import { forwardRef } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\n// `forwardRef` here is required for type compatibility with `LucideIcon` — see\n// `Keboola.tsx` for the full rationale. The Google Cloud mark carries the fixed\n// four-color Google palette (`#EA4335 / #4285F4 / #34A853 / #FBBC05`): its paths\n// keep their own fills and ignore `color`, and it must NOT re-skin under a\n// customer brand.\nexport const Gcp: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n // Lucide's grid — see `Keboola.tsx` for why every brand icon shares it.\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={brandClass(mono, className)}\n {...rest}\n >\n {/* Measured artwork bbox: (5.50, 7.55) 21.00 × 16.88. */}\n <g transform=\"translate(-3.2381 -3.2286) scale(0.952381)\">\n <path\n fill=\"#EA4335\"\n d=\"m19.466 12.212 1.825-1.826.122-.768C18.087 6.593 12.8 6.936 9.8 10.333a8.438 8.438 0 0 0-1.78 3.335l.654-.092 3.65-.602.282-.288c1.624-1.784 4.37-2.024 6.245-.506l.615.032Z\"\n />\n <path\n fill=\"#4285F4\"\n d=\"M23.892 13.614a8.223 8.223 0 0 0-2.479-3.996l-2.562 2.562a4.554 4.554 0 0 1 1.672 3.612v.455a2.28 2.28 0 0 1 2.28 2.28c0 1.26-1.02 2.255-2.28 2.255h-4.567l-.448.486v2.735l.448.43h4.567c3.275.025 5.951-2.584 5.977-5.86a5.931 5.931 0 0 0-2.608-4.959Z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M11.396 24.433h4.56v-3.651h-4.56c-.325 0-.64-.07-.936-.205l-.646.198-1.839 1.826-.16.62a5.919 5.919 0 0 0 3.58 1.212Z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M11.396 12.59a5.931 5.931 0 0 0-3.58 10.632l2.644-2.645a2.28 2.28 0 1 1 3.017-3.017l2.646-2.645a5.925 5.925 0 0 0-4.727-2.325Z\"\n />\n </g>\n {children}\n </svg>\n ),\n);\n\nGcp.displayName = 'Gcp';\n","import { forwardRef } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\n// `forwardRef` here is required for type compatibility with `LucideIcon` — see\n// `Keboola.tsx` for the full rationale. The Google \"G\" is a fixed four-color\n// vendor mark (`#4285F4 / #34A853 / #FBBC04 / #EA4335`): its paths keep their\n// own fills and ignore `color`, and it must NOT re-skin under a customer brand.\nexport const Google: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n // Lucide's grid — see `Keboola.tsx` for why every brand icon shares it.\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={brandClass(mono, className)}\n {...rest}\n >\n {/* Measured artwork bbox: (12, 10) 19.60 × 20.00. */}\n <g transform=\"translate(-9.8 -8)\">\n <path\n d=\"M31.6 20.2273C31.6 19.5182 31.5364 18.8364 31.4182 18.1818H22V22.05H27.3818C27.15 23.3 26.4455 24.3591 25.3864 25.0682V27.5773H28.6182C30.5091 25.8364 31.6 23.2727 31.6 20.2273Z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M22 30C24.7 30 26.9636 29.1045 28.6181 27.5773L25.3863 25.0682C24.4909 25.6682 23.3454 26.0227 22 26.0227C19.3954 26.0227 17.1909 24.2636 16.4045 21.9H13.0636V24.4909C14.7091 27.7591 18.0909 30 22 30Z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M16.4045 21.9C16.2045 21.3 16.0909 20.6591 16.0909 20C16.0909 19.3409 16.2045 18.7 16.4045 18.1V15.5091H13.0636C12.3864 16.8591 12 18.3864 12 20C12 21.6136 12.3864 23.1409 13.0636 24.4909L16.4045 21.9Z\"\n fill=\"#FBBC04\"\n />\n <path\n d=\"M22 13.9773C23.4681 13.9773 24.7863 14.4818 25.8227 15.4727L28.6909 12.6045C26.9591 10.9909 24.6954 10 22 10C18.0909 10 14.7091 12.2409 13.0636 15.5091L16.4045 18.1C17.1909 15.7364 19.3954 13.9773 22 13.9773Z\"\n fill=\"#EA4335\"\n />\n </g>\n {children}\n </svg>\n ),\n);\n\nGoogle.displayName = 'Google';\n","import { forwardRef } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\n// `forwardRef` here is required for type compatibility with `LucideIcon`\n// (a `ForwardRefExoticComponent` from lucide-react). React 19's ref-as-prop\n// pattern produces a plain function component which isn't structurally\n// assignable to `LucideIcon`, so consumers couldn't pass `Keboola`\n// interchangeably with imported Lucide icons (e.g. `<Button><Keboola className=\"tw:size-4\" /></Button>`).\nexport const Keboola: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, color = 'currentColor', className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n // Lucide's own 24-unit grid, and the artwork is scaled into the same 20-unit content box\n // Lucide's icons occupy (`square` is an 18-unit rect + 2-unit stroke = 20 visual units,\n // centered). Every brand icon in this folder follows it, so a brand mark and a Lucide icon\n // render at the same optical size for a given `size` / `tw:size-*`.\n viewBox=\"0 0 24 24\"\n // Kept from when the artwork ran flush to the viewBox edge (y=0..512): an `<svg>` defaults to\n // `overflow: hidden`, and sub-pixel rounding clipped the top of the mark flat. The 2-unit\n // inset above now provides that tolerance; this stays as belt-and-braces.\n overflow=\"visible\"\n fill={color}\n className={brandClass(mono, className)}\n {...rest}\n >\n {/* Measured artwork bbox: (0.13, 0) 299.69 × 512.20. */}\n <g transform=\"translate(6.1439 2) scale(0.039047)\">\n <path d=\"M152 320C79.7 320 24.5 233.9 24.5 124.7C24.5 15.6 70.5 0 152 0s123.6 15.6 123.6 124.7C275.5 233.9 217.7 320 152 320zm-8.7-50.5c0-11.2-9.5-20.3-21.2-20.3s-21.2 9.1-21.2 20.3c0 11.2 9.5 20.3 21.2 20.3s21.2-9.1 21.2-20.3zm55.7 0c0-11.2-9.5-20.3-21.2-20.3s-21.2 9.1-21.2 20.3c0 11.2 9.5 20.3 21.2 20.3s21.2-9.1 21.2-20.3zm68.9 115.1c10.2 9.3 20.2 20.5 29 35c5.9 9.7 2.6 22.1-7.5 27.8c-3.4 1.9-7.1 2.8-10.7 2.8c-7.2 0-14.3-3.6-18.3-10c-6.8-11.1-13.8-18.9-21.7-26.1c-7.3-6.7-15.6-12.7-24.9-19.5c-.7-.5-1.4-1-2.1-1.5c-5-3.6-10-6.8-14.9-9.4c.6 1 1.2 2.1 1.8 3.2c14.4 26.4 29.2 63.1 29.2 104.9c0 11.2-9.5 20.3-21.2 20.3c-11.7 0-21.2-9.1-21.2-20.3c.1-31.8-11.6-62.3-23.8-84.9c-4-7.4-8-13.9-11.6-19.3c-3.4 5.2-7.2 11.3-11 18.3c-12.5 22.7-24.5 53.8-24.4 86c0 11.2-9.5 20.3-21.2 20.3s-21.2-9.1-21.2-20.3c.1-41.8 14.9-78.4 29.2-104.9c.6-1.1 1.2-2.1 1.8-3.2c-5 2.7-9.9 5.8-14.9 9.4c-.6 .5-1.3 .9-1.9 1.4c-9.5 6.9-17.8 12.9-25.1 19.7c-7.9 7.2-14.9 15.1-21.7 26.1c-5.9 9.7-18.9 12.9-29 7.2C.5 441.8-2.9 429.3 3.1 419.7c8.9-14.4 18.8-25.7 29-35c9.2-8.4 18.5-15.1 27.6-21.7c1-.7 2-1.4 3-2.2c4.7-3.5 9.6-6.7 14.6-9.6c-5-2.9-9.8-6.1-14.6-9.6C39.8 325 19.9 302.5 3.1 275.1c-5.9-9.7-2.6-22.1 7.5-27.8c10.1-5.7 23.1-2.5 29 7.2c14.6 23.7 31.1 42 48.7 54.9c18.9 13.7 37.4 20.5 56.5 21.5c1.7-.1 3.5-.1 5.2-.1c1.8 0 3.5 .1 5.2 .1c0 0 0 0 0 0c19.1-1.1 37.6-7.9 56.5-21.5c17.6-12.8 34.2-31.2 48.7-54.9c6-9.7 18.9-12.9 29-7.2c10.1 5.7 13.4 18.1 7.5 27.8c-16.8 27.4-36.7 49.9-59.6 66.6c-4.7 3.5-9.6 6.7-14.5 9.6c4.9 2.9 9.8 6.1 14.5 9.6c.9 .7 1.8 1.3 2.7 2c9.2 6.7 18.5 13.5 27.9 22z\" />\n </g>\n {children}\n </svg>\n ),\n);\n\nKeboola.displayName = 'Keboola';\n","import { forwardRef, useId } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\nexport const Make: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, className, children, ...rest }, ref) => {\n const baseId = useId().replace(/:/g, '');\n\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={brandClass(mono, className)}\n {...rest}\n >\n <defs>\n <clipPath id={`${baseId}-clip0`}>\n <path d=\"m156,44.3h33.9c2.6,0,4.7,2.1,4.7,4.7v125.1c0,2.6-2.1,4.7-4.7,4.7h-33.9c-2.6,0-4.7-2.1-4.7-4.7V49c0-2.6,2.1-4.7,4.7-4.7Z\" />\n </clipPath>\n <clipPath id={`${baseId}-clip1`}>\n <path d=\"m56.7,46L.5,157.7c-1.2,2.3-.23,5.1,2.1,6.3l30.3,15.2c2.3,1.2,5.1.23,6.3-2.1l56.2-111.8c1.2-2.3.23-5.1-2.1-6.3l-30.3-15.2c-.68-.34-1.4-.5-2.1-.5-1.7,0-3.4.94-4.2,2.6\" />\n </clipPath>\n <clipPath id={`${baseId}-clip2`}>\n <path d=\"m103.9,46.4l-24,121.8c-.5,2.5,1.1,5,3.7,5.5l33.2,6.7c2.5.51,5-1.1,5.5-3.7l24-121.8c.5-2.5-1.1-5-3.7-5.5l-33.2-6.7c-.31-.06-.62-.09-.93-.09-2.2,0-4.2,1.5-4.6,3.8\" />\n </clipPath>\n <linearGradient\n id={`${baseId}-gradient0`}\n x1=\"-167.5\"\n y1=\"470.3\"\n x2=\"-166.5\"\n y2=\"470.3\"\n gradientTransform=\"translate(16426.9 45936.4) scale(97.45 -97.45)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#b02de9\" />\n <stop offset=\".02\" stopColor=\"#b02de9\" />\n <stop offset=\".8\" stopColor=\"#6d00cc\" />\n <stop offset=\"1\" stopColor=\"#6d00cc\" />\n </linearGradient>\n <linearGradient\n id={`${baseId}-gradient1`}\n x1=\"-167.5\"\n y1=\"470.3\"\n x2=\"-166.5\"\n y2=\"470.3\"\n gradientTransform=\"translate(17962.6 50466.15) scale(107.08 -107.08)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#f0f\" />\n <stop offset=\"0\" stopColor=\"#f0f\" />\n <stop offset=\".17\" stopColor=\"#e90cf9\" />\n <stop offset=\".54\" stopColor=\"#c023ed\" />\n <stop offset=\".73\" stopColor=\"#b02de9\" />\n <stop offset=\"1\" stopColor=\"#b02de9\" />\n </linearGradient>\n <linearGradient\n id={`${baseId}-gradient2`}\n x1=\"-167.5\"\n y1=\"470.3\"\n x2=\"-166.5\"\n y2=\"470.3\"\n gradientTransform=\"translate(35959.81 101077.55) scale(214.7 -214.7)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#f0f\" />\n <stop offset=\".02\" stopColor=\"#f0f\" />\n <stop offset=\".09\" stopColor=\"#e90cf9\" />\n <stop offset=\".23\" stopColor=\"#c023ed\" />\n <stop offset=\".3\" stopColor=\"#b02de9\" />\n <stop offset=\".42\" stopColor=\"#a42be3\" />\n <stop offset=\".63\" stopColor=\"#8626d5\" />\n <stop offset=\".85\" stopColor=\"#6021c3\" />\n <stop offset=\"1\" stopColor=\"#6021c3\" />\n </linearGradient>\n </defs>\n <g transform=\"translate(1.999921 0.535282) scale(0.102775)\">\n <g clipPath={`url(#${baseId}-clip0)`}>\n <rect\n x=\"129.4\"\n y=\"41\"\n width=\"87.1\"\n height=\"141.1\"\n transform=\"translate(-27.91 66.73) rotate(-20.24)\"\n fill={`url(#${baseId}-gradient0)`}\n />\n </g>\n <g clipPath={`url(#${baseId}-clip1)`}>\n <rect\n x=\"-23.9\"\n y=\"29.8\"\n width=\"143.5\"\n height=\"164.3\"\n transform=\"translate(-40.48 28.2) rotate(-23.38)\"\n fill={`url(#${baseId}-gradient1)`}\n />\n </g>\n <g clipPath={`url(#${baseId}-clip2)`}>\n <rect\n x=\"57.6\"\n y=\"35.2\"\n width=\"111\"\n height=\"153.1\"\n transform=\"translate(-31.65 45.95) rotate(-20.21)\"\n fill={`url(#${baseId}-gradient2)`}\n />\n </g>\n </g>\n {children}\n </svg>\n );\n },\n);\n\nMake.displayName = 'Make';\n","import { forwardRef } from 'react';\n\nimport type { BrandIcon, BrandIconProps } from '../brandIcon';\nimport { brandClass } from '../brandIcon';\n\n// `forwardRef` here is required for type compatibility with `LucideIcon`\n// (a `ForwardRefExoticComponent` from lucide-react). React 19's ref-as-prop\n// pattern produces a plain function component which isn't structurally\n// assignable to `LucideIcon`, so consumers couldn't pass `Microsoft`\n// interchangeably with imported Lucide icons. The four-square mark carries\n// fixed Microsoft brand colors and deliberately ignores `color` — it must NOT\n// re-skin under a customer brand.\nexport const Microsoft: BrandIcon = forwardRef<SVGSVGElement, BrandIconProps>(\n ({ size = 24, mono, className, children, ...rest }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n // Lucide's grid — see `Keboola.tsx` for why every brand icon shares it.\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={brandClass(mono, className)}\n {...rest}\n >\n {/* Measured artwork bbox: (0, 0) 21 × 21. */}\n <g transform=\"translate(2 2) scale(0.952381)\">\n <rect x=\"0\" y=\"0\" width=\"10\" height=\"10\" fill=\"#F25022\" />\n <rect x=\"11\" y=\"0\" width=\"10\" height=\"10\" fill=\"#7FBA00\" />\n <rect x=\"0\" y=\"11\" width=\"10\" height=\"10\" fill=\"#00A4EF\" />\n <rect x=\"11\" y=\"11\" width=\"10\" height=\"10\" fill=\"#FFB900\" />\n </g>\n {children}\n </svg>\n ),\n);\n\nMicrosoft.displayName = 'Microsoft';\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"styles-BAFscjSV.js","names":[],"sources":["../src/components/OverlayTrigger/styles.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n/**\n * Chrome for a control that looks like an input but opens an overlay on click. Shared by\n * `SelectTrigger` and `DateRangePicker`'s trigger so both sit at the same height and colour when\n * they stand next to each other in a filter row.\n */\nexport const overlayTriggerVariants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:group',\n 'tw:box-border',\n\n // layout\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-between',\n 'tw:gap-2',\n 'tw:w-full',\n 'tw:text-left',\n\n // base appearance\n 'tw:rounded',\n 'tw:border',\n 'tw:border-solid',\n // Ink for `secondary`, whose fixed light-grey fill a scheme-following colour would\n // sit on invisibly. `primary` and `argo` both re-pin it to `foreground`.\n 'tw:text-neutral-800',\n // Scoped transition (no `outline`) — prevents the UA focus-outline color\n // from interpolating through its dark default during state changes.\n 'tw:transition-[color,background-color,border-color,box-shadow]',\n\n // focus base — ring width here, color comes from state variant\n 'tw:!outline-hidden',\n 'tw:focus:ring-4',\n 'tw:data-[state=open]:ring-4',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n 'tw:aria-disabled:cursor-not-allowed',\n\n // placeholder (Radix sets data-placeholder on the trigger when no value)\n 'tw:data-[placeholder]:text-muted-foreground',\n\n // child svg defaults\n 'tw:[&_svg]:shrink-0',\n 'tw:[&_svg]:pointer-events-none',\n ],\n {\n defaultVariants: {\n variant: 'primary',\n state: 'default',\n sizing: 'medium',\n },\n compoundVariants: [\n {\n variant: 'secondary',\n state: 'error',\n className: ['tw:bg-error-100'],\n },\n {\n variant: 'secondary',\n state: 'warning',\n className: ['tw:bg-warning-100'],\n },\n // --- argo ---\n {\n variant: 'argo',\n state: 'default',\n className: [\n 'tw:focus:border-primary',\n 'tw:focus:ring-ring/50',\n 'tw:data-[state=open]:border-primary',\n 'tw:data-[state=open]:ring-ring/50',\n ],\n },\n {\n variant: 'argo',\n state: 'error',\n className: [\n 'tw:border-destructive',\n 'tw:focus:border-destructive',\n 'tw:focus:ring-destructive/20',\n 'tw:data-[state=open]:border-destructive',\n 'tw:data-[state=open]:ring-destructive/20',\n ],\n },\n ],\n variants: {\n variant: {\n primary: [\n // The same field trio the `primary` `InputGroup` beside it uses, so a trigger and\n // an input in one row stay the same colour.\n //\n // - `--input-background` resolves to white in light; the fill only moves in dark.\n // - The `neutral` ramp is scheme-blind — `[data-theme='dark']` redefines only the\n // semantic tokens — so a literal here paints light chrome on a dark surface.\n 'tw:bg-input-background',\n 'tw:text-foreground',\n 'tw:border-input',\n 'tw:disabled:opacity-40',\n 'tw:aria-disabled:opacity-40',\n // aria-invalid on the trigger surfaces the error chrome without a `state` prop — the\n // accessible path (mirrors the `state=\"error\"` legacy tokens). The extra attribute\n // selector outranks the default focus/open state, so it wins without `!important`.\n 'tw:aria-[invalid=true]:border-error-500',\n 'tw:aria-[invalid=true]:focus:border-error-500',\n 'tw:aria-[invalid=true]:focus:ring-error-200',\n 'tw:aria-[invalid=true]:data-[state=open]:border-error-500',\n 'tw:aria-[invalid=true]:data-[state=open]:ring-error-200',\n ],\n secondary: [\n 'tw:bg-neutral-100',\n 'tw:border-neutral-100',\n 'tw:disabled:opacity-40',\n 'tw:aria-disabled:opacity-40',\n 'tw:aria-[invalid=true]:border-error-500',\n 'tw:aria-[invalid=true]:focus:border-error-500',\n 'tw:aria-[invalid=true]:focus:ring-error-200',\n 'tw:aria-[invalid=true]:data-[state=open]:border-error-500',\n 'tw:aria-[invalid=true]:data-[state=open]:ring-error-200',\n ],\n argo: [\n // muted filled input surface — gray, distinct from white containers; not the app-background token\n 'tw:bg-muted',\n 'tw:border-input',\n // token-driven radius so the trigger tracks --radius-lg like sibling inputs (InputGroup/Combobox/Button)\n 'tw:rounded-[var(--radius-lg,0.25rem)]',\n 'tw:text-foreground',\n 'tw:disabled:opacity-50',\n 'tw:aria-disabled:opacity-50',\n // aria-invalid on the trigger surfaces the error chrome without a `state` prop — the\n // accessible path (uses the themeable `destructive` status token).\n 'tw:aria-[invalid=true]:border-destructive',\n 'tw:aria-[invalid=true]:focus:border-destructive',\n 'tw:aria-[invalid=true]:focus:ring-destructive/20',\n 'tw:aria-[invalid=true]:data-[state=open]:border-destructive',\n 'tw:aria-[invalid=true]:data-[state=open]:ring-destructive/20',\n ],\n },\n sizing: {\n // border-inclusive heights: 40 / 36 / 32 px (small matches Button small)\n default: ['tw:px-4', 'tw:py-2.5', 'tw:text-sm/[18px]', 'tw:h-10', 'tw:min-h-10'],\n medium: ['tw:px-4', 'tw:py-2', 'tw:text-sm/[18px]', 'tw:h-9', 'tw:min-h-9'],\n small: ['tw:px-4', 'tw:py-2', 'tw:text-sm/[16px]', 'tw:h-8', 'tw:min-h-8'],\n },\n state: {\n default: [\n 'tw:focus:border-ring',\n 'tw:focus:ring-ring/30',\n 'tw:data-[state=open]:border-ring',\n 'tw:data-[state=open]:ring-ring/30',\n ],\n error: [\n 'tw:border-error-500',\n 'tw:focus:border-error-500',\n 'tw:focus:ring-error-200',\n 'tw:data-[state=open]:border-error-500',\n 'tw:data-[state=open]:ring-error-200',\n ],\n warning: [\n 'tw:border-warning-500',\n 'tw:focus:border-warning-500',\n 'tw:focus:ring-warning-200',\n 'tw:data-[state=open]:border-warning-500',\n 'tw:data-[state=open]:ring-warning-200',\n ],\n },\n },\n },\n);\n"],"mappings":";;;;;;;AAOA,MAAa,yBAAyB,IACpC;CACE;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CAGA;CAGA;CAGA;CACA;CACA;CAGA;CACA;CAGA;CAGA;CACA;AACF,GACA;CACE,iBAAiB;EACf,SAAS;EACT,OAAO;EACP,QAAQ;CACV;CACA,kBAAkB;EAChB;GACE,SAAS;GACT,OAAO;GACP,WAAW,CAAC,iBAAiB;EAC/B;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW,CAAC,mBAAmB;EACjC;EAEA;GACE,SAAS;GACT,OAAO;GACP,WAAW;IACT;IACA;IACA;IACA;GACF;EACF;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;IACT;IACA;IACA;IACA;IACA;GACF;EACF;CACF;CACA,UAAU;EACR,SAAS;GACP,SAAS;IAOP;IACA;IACA;IACA;IACA;IAIA;IACA;IACA;IACA;IACA;GACF;GACA,WAAW;IACT;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACF;GACA,MAAM;IAEJ;IACA;IAEA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;GACF;EACF;EACA,QAAQ;GAEN,SAAS;IAAC;IAAW;IAAa;IAAqB;IAAW;GAAa;GAC/E,QAAQ;IAAC;IAAW;IAAW;IAAqB;IAAU;GAAY;GAC1E,OAAO;IAAC;IAAW;IAAW;IAAqB;IAAU;GAAY;EAC3E;EACA,OAAO;GACL,SAAS;IACP;IACA;IACA;IACA;GACF;GACA,OAAO;IACL;IACA;IACA;IACA;IACA;GACF;GACA,SAAS;IACP;IACA;IACA;IACA;IACA;GACF;EACF;CACF;AACF,CACF"}
@@ -1,81 +0,0 @@
1
- //#region src/blocks/DiagramShared/svgTransforms.ts
2
- const HTML_TAG = /<[^>]+>/g;
3
- const FOREIGN_OBJECT = /(<foreignObject\b[^>]*>)([\s\S]*?)(<\/foreignObject>)/g;
4
- const ROOT_SVG_TAG = /^(\s*<svg\b)([^>]*)(>)/i;
5
- /**
6
- * Mermaid renders node labels — including icon-shape (`@{ icon: … }`) labels — as
7
- * HTML (`<div><span><p>…</p></span></div>`) inside an SVG `<foreignObject>`. The
8
- * ZoomableSvg DOMPurify pass runs the SVG namespace profile, which strips every
9
- * XHTML-namespaced element under an `<svg>` root, so those wrapped labels vanish
10
- * (icon rendered, text gone). DOMPurify keeps *bare text* directly inside a
11
- * `<foreignObject>`, so collapse each label's HTML to its text content. Mermaid
12
- * has already sanitized that text under `securityLevel: 'strict'`, and dropping
13
- * the wrapper tags is strictly safer than keeping them.
14
- *
15
- * Entities are left encoded (`&amp;`, `&lt;`, …): as text-node content inside the
16
- * `<foreignObject>` the browser renders them correctly, and decoding them here
17
- * would risk turning `&lt;`/`&gt;` back into real angle brackets that could form
18
- * markup in the sanitized SVG.
19
- */
20
- const flattenForeignObjectLabels = (svg) => svg.replace(FOREIGN_OBJECT, (_match, open, inner, close) => {
21
- return `${open}${inner.replace(HTML_TAG, " ").replace(/\s+/g, " ").trim()}${close}`;
22
- });
23
- /**
24
- * Make the diagram fluid: strip the root `<svg>`'s fixed width/height/style and
25
- * set `width="100%"` plus a `max-width` from the viewBox width so it never
26
- * overflows its container.
27
- *
28
- * Only the ROOT `<svg>` tag is rewritten (anchored to string start). Icon-shape
29
- * nodes embed their own inner `<svg>` icons with fixed width/height; an earlier
30
- * unanchored regex matched the first `<svg …height…>` anywhere, so when the root
31
- * tag carried no height (mermaid emits `width="100%"` alone) it stripped the
32
- * FIRST icon's height instead — detaching and mis-sizing that icon.
33
- *
34
- * The existing `style` attribute is preserved (only an existing `max-width` is
35
- * replaced): beautiful-mermaid carries theme CSS vars (`--bg`, `--fg`) there that
36
- * its inner `<style>` block derives node/text colors from — dropping the whole
37
- * attribute made every derived color resolve to black.
38
- */
39
- const STYLE_ATTR = /\s+style="([^"]*)"/i;
40
- const makeResponsive = (svgString) => {
41
- const viewBoxMatch = svgString.match(/viewBox="[^"]*\s([\d.]+)\s[\d.]+"/);
42
- const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : void 0;
43
- return svgString.replace(ROOT_SVG_TAG, (_match, open, attrs, close) => {
44
- const styleDecls = (attrs.match(STYLE_ATTR)?.[1] ?? "").replace(/max-width:\s*[^;"]*;?\s*/gi, "").replace(/\s+/g, " ").trim().replace(/;$/, "");
45
- let nextAttrs = attrs.replace(/\s+width="[^"]*"/i, "").replace(/\s+height="[^"]*"/i, "").replace(STYLE_ATTR, "");
46
- nextAttrs += " width=\"100%\"";
47
- const styleParts = [styleDecls, vbWidth ? `max-width: ${vbWidth}px` : ""].filter(Boolean).join("; ");
48
- if (styleParts) nextAttrs += ` style="${styleParts}"`;
49
- return `${open}${nextAttrs}${close}`;
50
- });
51
- };
52
- /**
53
- * Whether an SVG has drawn content, i.e. a non-degenerate viewBox.
54
- *
55
- * - beautiful-mermaid does not throw on every syntax it cannot lay out: an
56
- * `erDiagram` entity whose quoted name contains a space (`"sample (Copy)"`)
57
- * returns a well-formed SVG with `viewBox="0 0 0 0"` and an empty `<defs>`.
58
- * - Such output is truthy, so it would be cached and rendered as an empty box,
59
- * and the async mermaid renderer — which parses the same code fine — would
60
- * never run.
61
- * - A missing viewBox counts as drawn: mermaid's own output is sized via
62
- * width/height attributes on some diagram types.
63
- * - Only the ROOT `<svg>` is inspected. Icon-shape nodes embed their own inner
64
- * `<svg>` / `<symbol>`, so an unanchored search reads a nested viewBox when the
65
- * root carries none — discarding a diagram that had in fact been drawn. Same
66
- * trap `makeResponsive` documents above.
67
- * - Either quote style is accepted, and whitespace around the `=`. Both current
68
- * renderers emit `viewBox="…"` exactly, so this is future-proofing rather than a
69
- * live case: a miss reads as "no viewBox", i.e. drawn, silently restoring the
70
- * empty-diagram bug.
71
- */
72
- const ROOT_VIEWBOX = /^\s*<svg\b[^>]*\sviewBox\s*=\s*(["'])\s*[\d.eE+-]+\s+[\d.eE+-]+\s+([\d.eE+-]+)\s+([\d.eE+-]+)\s*\1/i;
73
- const hasDrawnContent = (svg) => {
74
- const viewBox = svg.match(ROOT_VIEWBOX);
75
- if (!viewBox) return true;
76
- return Number(viewBox[2]) > 0 && Number(viewBox[3]) > 0;
77
- };
78
- //#endregion
79
- export { flattenForeignObjectLabels, hasDrawnContent, makeResponsive };
80
-
81
- //# sourceMappingURL=svgTransforms-CJAYPk7o.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"svgTransforms-CJAYPk7o.js","names":[],"sources":["../src/blocks/DiagramShared/svgTransforms.ts"],"sourcesContent":["// Pure post-processing of diagram SVG output (mermaid, vega), before it reaches\n// ZoomableSvg's DOMPurify pass. Extracted for unit testing.\n\nconst HTML_TAG = /<[^>]+>/g;\nconst FOREIGN_OBJECT = /(<foreignObject\\b[^>]*>)([\\s\\S]*?)(<\\/foreignObject>)/g;\n// The root <svg> open tag, anchored to the start of the string.\nconst ROOT_SVG_TAG = /^(\\s*<svg\\b)([^>]*)(>)/i;\n\n/**\n * Mermaid renders node labels — including icon-shape (`@{ icon: … }`) labels — as\n * HTML (`<div><span><p>…</p></span></div>`) inside an SVG `<foreignObject>`. The\n * ZoomableSvg DOMPurify pass runs the SVG namespace profile, which strips every\n * XHTML-namespaced element under an `<svg>` root, so those wrapped labels vanish\n * (icon rendered, text gone). DOMPurify keeps *bare text* directly inside a\n * `<foreignObject>`, so collapse each label's HTML to its text content. Mermaid\n * has already sanitized that text under `securityLevel: 'strict'`, and dropping\n * the wrapper tags is strictly safer than keeping them.\n *\n * Entities are left encoded (`&amp;`, `&lt;`, …): as text-node content inside the\n * `<foreignObject>` the browser renders them correctly, and decoding them here\n * would risk turning `&lt;`/`&gt;` back into real angle brackets that could form\n * markup in the sanitized SVG.\n */\nexport const flattenForeignObjectLabels = (svg: string): string =>\n svg.replace(FOREIGN_OBJECT, (_match, open: string, inner: string, close: string) => {\n const text = inner.replace(HTML_TAG, ' ').replace(/\\s+/g, ' ').trim();\n return `${open}${text}${close}`;\n });\n\n/**\n * Make the diagram fluid: strip the root `<svg>`'s fixed width/height/style and\n * set `width=\"100%\"` plus a `max-width` from the viewBox width so it never\n * overflows its container.\n *\n * Only the ROOT `<svg>` tag is rewritten (anchored to string start). Icon-shape\n * nodes embed their own inner `<svg>` icons with fixed width/height; an earlier\n * unanchored regex matched the first `<svg …height…>` anywhere, so when the root\n * tag carried no height (mermaid emits `width=\"100%\"` alone) it stripped the\n * FIRST icon's height instead — detaching and mis-sizing that icon.\n *\n * The existing `style` attribute is preserved (only an existing `max-width` is\n * replaced): beautiful-mermaid carries theme CSS vars (`--bg`, `--fg`) there that\n * its inner `<style>` block derives node/text colors from — dropping the whole\n * attribute made every derived color resolve to black.\n */\nconst STYLE_ATTR = /\\s+style=\"([^\"]*)\"/i;\n\nexport const makeResponsive = (svgString: string): string => {\n const viewBoxMatch = svgString.match(/viewBox=\"[^\"]*\\s([\\d.]+)\\s[\\d.]+\"/);\n const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : undefined;\n\n return svgString.replace(ROOT_SVG_TAG, (_match, open: string, attrs: string, close: string) => {\n const existingStyle = attrs.match(STYLE_ATTR)?.[1] ?? '';\n const styleDecls = existingStyle\n .replace(/max-width:\\s*[^;\"]*;?\\s*/gi, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/;$/, '');\n\n let nextAttrs = attrs\n .replace(/\\s+width=\"[^\"]*\"/i, '')\n .replace(/\\s+height=\"[^\"]*\"/i, '')\n .replace(STYLE_ATTR, '');\n\n nextAttrs += ' width=\"100%\"';\n\n const styleParts = [styleDecls, vbWidth ? `max-width: ${vbWidth}px` : '']\n .filter(Boolean)\n .join('; ');\n if (styleParts) nextAttrs += ` style=\"${styleParts}\"`;\n\n return `${open}${nextAttrs}${close}`;\n });\n};\n\n/**\n * Whether an SVG has drawn content, i.e. a non-degenerate viewBox.\n *\n * - beautiful-mermaid does not throw on every syntax it cannot lay out: an\n * `erDiagram` entity whose quoted name contains a space (`\"sample (Copy)\"`)\n * returns a well-formed SVG with `viewBox=\"0 0 0 0\"` and an empty `<defs>`.\n * - Such output is truthy, so it would be cached and rendered as an empty box,\n * and the async mermaid renderer — which parses the same code fine — would\n * never run.\n * - A missing viewBox counts as drawn: mermaid's own output is sized via\n * width/height attributes on some diagram types.\n * - Only the ROOT `<svg>` is inspected. Icon-shape nodes embed their own inner\n * `<svg>` / `<symbol>`, so an unanchored search reads a nested viewBox when the\n * root carries none — discarding a diagram that had in fact been drawn. Same\n * trap `makeResponsive` documents above.\n * - Either quote style is accepted, and whitespace around the `=`. Both current\n * renderers emit `viewBox=\"…\"` exactly, so this is future-proofing rather than a\n * live case: a miss reads as \"no viewBox\", i.e. drawn, silently restoring the\n * empty-diagram bug.\n */\nconst ROOT_VIEWBOX =\n /^\\s*<svg\\b[^>]*\\sviewBox\\s*=\\s*([\"'])\\s*[\\d.eE+-]+\\s+[\\d.eE+-]+\\s+([\\d.eE+-]+)\\s+([\\d.eE+-]+)\\s*\\1/i;\n\nexport const hasDrawnContent = (svg: string): boolean => {\n const viewBox = svg.match(ROOT_VIEWBOX);\n if (!viewBox) return true;\n return Number(viewBox[2]) > 0 && Number(viewBox[3]) > 0;\n};\n"],"mappings":";AAGA,MAAM,WAAW;AACjB,MAAM,iBAAiB;AAEvB,MAAM,eAAe;;;;;;;;;;;;;;;;AAiBrB,MAAa,8BAA8B,QACzC,IAAI,QAAQ,iBAAiB,QAAQ,MAAc,OAAe,UAAkB;CAElF,OAAO,GAAG,OADG,MAAM,QAAQ,UAAU,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAC3C,IAAI;AAC1B,CAAC;;;;;;;;;;;;;;;;;AAkBH,MAAM,aAAa;AAEnB,MAAa,kBAAkB,cAA8B;CAC3D,MAAM,eAAe,UAAU,MAAM,mCAAmC;CACxE,MAAM,UAAU,eAAe,KAAK,MAAM,OAAO,aAAa,EAAE,CAAC,IAAI,KAAA;CAErE,OAAO,UAAU,QAAQ,eAAe,QAAQ,MAAc,OAAe,UAAkB;EAE7F,MAAM,cADgB,MAAM,MAAM,UAAU,CAAC,GAAG,MAAM,GAAA,CAEnD,QAAQ,8BAA8B,EAAE,CAAC,CACzC,QAAQ,QAAQ,GAAG,CAAC,CACpB,KAAK,CAAC,CACN,QAAQ,MAAM,EAAE;EAEnB,IAAI,YAAY,MACb,QAAQ,qBAAqB,EAAE,CAAC,CAChC,QAAQ,sBAAsB,EAAE,CAAC,CACjC,QAAQ,YAAY,EAAE;EAEzB,aAAa;EAEb,MAAM,aAAa,CAAC,YAAY,UAAU,cAAc,QAAQ,MAAM,EAAE,CAAC,CACtE,OAAO,OAAO,CAAC,CACf,KAAK,IAAI;EACZ,IAAI,YAAY,aAAa,WAAW,WAAW;EAEnD,OAAO,GAAG,OAAO,YAAY;CAC/B,CAAC;AACH;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAM,eACJ;AAEF,MAAa,mBAAmB,QAAyB;CACvD,MAAM,UAAU,IAAI,MAAM,YAAY;CACtC,IAAI,CAAC,SAAS,OAAO;CACrB,OAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,OAAO,QAAQ,EAAE,IAAI;AACxD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"themeScopeContext-D7fSyb06.js","names":[],"sources":["../src/components/ThemeProvider/useBrandState.ts","../src/components/ThemeProvider/useColorSchemeState.ts","../src/components/ThemeProvider/themeScopeContext.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nimport { DEFAULT_BRAND_ID } from './defaults';\nimport type { BrandId } from './types';\n\nexport const BRAND_ATTRIBUTE = 'data-brand';\n\nexport type UseBrandOptions = {\n /** Initial active brand id for uncontrolled use. Defaults to the design-system sentinel (`DEFAULT_BRAND_ID`) — no brand tokens injected, so the stylesheet defaults apply. */\n defaultBrandId?: BrandId;\n /** Controlled active brand id. When set, the parent owns the value and `setBrand` only notifies via `onBrandIdChange` (it does not mutate internal state). */\n brandId?: BrandId;\n /** Called with the next id whenever `setBrand` runs — required to persist the choice in controlled mode. */\n onBrandIdChange?: (brandId: BrandId) => void;\n};\n\nexport const useBrandState = ({\n defaultBrandId: defaultBrand = DEFAULT_BRAND_ID,\n brandId: controlledBrand,\n onBrandIdChange: onBrandChange,\n}: UseBrandOptions = {}) => {\n const [uncontrolledBrand, setUncontrolledBrand] = useState(defaultBrand);\n\n const isControlled = controlledBrand !== undefined;\n const brandId = isControlled ? controlledBrand : uncontrolledBrand;\n\n const setBrand = useCallback(\n (next: BrandId) => {\n if (!isControlled) setUncontrolledBrand(next);\n onBrandChange?.(next);\n },\n [isControlled, onBrandChange],\n );\n\n useEffect(() => {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute(BRAND_ATTRIBUTE, brandId);\n }, [brandId]);\n\n return { brandId, setBrand };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { DEFAULT_COLOR_SCHEME } from './defaults';\nimport type { ColorScheme, ResolvedColorScheme } from './types';\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\nexport const THEME_ATTRIBUTE = 'data-theme';\n\nconst getSystemColorScheme = (): ResolvedColorScheme => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return 'light';\n return window.matchMedia(DARK_QUERY).matches ? 'dark' : 'light';\n};\n\nexport type UseColorSchemeOptions = {\n /** Initial colour scheme for uncontrolled use. Defaults to `light` (`DEFAULT_COLOR_SCHEME`). */\n defaultScheme?: ColorScheme;\n /** Controlled colour scheme (`light` / `dark` / `system`). When set, the parent owns the value and `setScheme` only notifies via `onSchemeChange`. `system` follows `prefers-color-scheme` and resolves reactively. */\n scheme?: ColorScheme;\n /** Called with the next scheme whenever `setScheme` runs — required to persist the choice in controlled mode. */\n onSchemeChange?: (theme: ColorScheme) => void;\n};\n\nexport const useColorSchemeState = ({\n defaultScheme = DEFAULT_COLOR_SCHEME,\n scheme: propScheme,\n onSchemeChange,\n}: UseColorSchemeOptions = {}) => {\n const [uncontrolledScheme, setUncontrolledScheme] = useState(defaultScheme);\n const [systemScheme, setSystemScheme] = useState<ResolvedColorScheme>(getSystemColorScheme);\n\n const isControlled = propScheme !== undefined;\n const scheme = isControlled ? propScheme : uncontrolledScheme;\n\n const setScheme = useCallback(\n (next: ColorScheme) => {\n if (!isControlled) setUncontrolledScheme(next);\n onSchemeChange?.(next);\n },\n [isControlled, onSchemeChange],\n );\n\n // Track the OS preference so `system` stays live as the user flips it.\n useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n const mq = window.matchMedia(DARK_QUERY);\n const onChange = () => setSystemScheme(mq.matches ? 'dark' : 'light');\n onChange();\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, []);\n\n const resolvedScheme: ResolvedColorScheme = scheme === 'system' ? systemScheme : scheme;\n\n useEffect(() => {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute(THEME_ATTRIBUTE, resolvedScheme);\n }, [resolvedScheme]);\n\n return { scheme, resolvedScheme, setScheme };\n};\n","import { createContext } from 'react';\n\nimport type { ResolvedColorScheme } from './types';\n\n/**\n * What a `ThemeScope` publishes about itself, in its own module so a hook can read it without\n * importing the component that provides it.\n *\n * - `scheme`: the scheme this subtree is pinned to, or `null` outside a scope.\n * - `container`: a body-level node carrying the scope's `data-theme` and token vars. A canvas\n * (chart, diagram) that resolves live `--*` values reads them off this rather than `<html>`,\n * which is still painting the page's scheme.\n */\nexport const ThemeScopeSchemeContext = createContext<ResolvedColorScheme | null>(null);\nexport const ThemeScopeContainerContext = createContext<HTMLElement | null>(null);\n"],"mappings":";;;AAKA,MAAa,kBAAkB;AAW/B,MAAa,iBAAiB,EAC5B,gBAAgB,eAAe,kBAC/B,SAAS,iBACT,iBAAiB,kBACE,CAAC,MAAM;CAC1B,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,YAAY;CAEvE,MAAM,eAAe,oBAAoB,KAAA;CACzC,MAAM,UAAU,eAAe,kBAAkB;CAEjD,MAAM,WAAW,aACd,SAAkB;EACjB,IAAI,CAAC,cAAc,qBAAqB,IAAI;EAC5C,gBAAgB,IAAI;CACtB,GACA,CAAC,cAAc,aAAa,CAC9B;CAEA,gBAAgB;EACd,IAAI,OAAO,aAAa,aAAa;EACrC,SAAS,gBAAgB,aAAa,iBAAiB,OAAO;CAChE,GAAG,CAAC,OAAO,CAAC;CAEZ,OAAO;EAAE;EAAS;CAAS;AAC7B;;;ACnCA,MAAM,aAAa;AACnB,MAAa,kBAAkB;AAE/B,MAAM,6BAAkD;CACtD,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY,OAAO;CACrF,OAAO,OAAO,WAAW,UAAU,CAAC,CAAC,UAAU,SAAS;AAC1D;AAWA,MAAa,uBAAuB,EAClC,gBAAgB,sBAChB,QAAQ,YACR,mBACyB,CAAC,MAAM;CAChC,MAAM,CAAC,oBAAoB,yBAAyB,SAAS,aAAa;CAC1E,MAAM,CAAC,cAAc,mBAAmB,SAA8B,oBAAoB;CAE1F,MAAM,eAAe,eAAe,KAAA;CACpC,MAAM,SAAS,eAAe,aAAa;CAE3C,MAAM,YAAY,aACf,SAAsB;EACrB,IAAI,CAAC,cAAc,sBAAsB,IAAI;EAC7C,iBAAiB,IAAI;CACvB,GACA,CAAC,cAAc,cAAc,CAC/B;CAGA,gBAAgB;EACd,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;EAC9E,MAAM,KAAK,OAAO,WAAW,UAAU;EACvC,MAAM,iBAAiB,gBAAgB,GAAG,UAAU,SAAS,OAAO;EACpE,SAAS;EACT,GAAG,iBAAiB,UAAU,QAAQ;EACtC,aAAa,GAAG,oBAAoB,UAAU,QAAQ;CACxD,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAsC,WAAW,WAAW,eAAe;CAEjF,gBAAgB;EACd,IAAI,OAAO,aAAa,aAAa;EACrC,SAAS,gBAAgB,aAAa,iBAAiB,cAAc;CACvE,GAAG,CAAC,cAAc,CAAC;CAEnB,OAAO;EAAE;EAAQ;EAAgB;CAAU;AAC7C;;;;;;;;;;;;AC9CA,MAAa,0BAA0B,cAA0C,IAAI;AACrF,MAAa,6BAA6B,cAAkC,IAAI"}
@@ -1,119 +0,0 @@
1
- import { DEFAULT_BRAND_ID, DEFAULT_COLOR_SCHEME } from "./defaults-i_xG2F_1.js";
2
- import { BRAND_ATTRIBUTE, THEME_ATTRIBUTE, ThemeScopeContainerContext, ThemeScopeSchemeContext } from "./themeScopeContext-D7fSyb06.js";
3
- import { use, useMemo, useSyncExternalStore } from "react";
4
- //#region src/components/ThemeProvider/useThemeAttributes.ts
5
- const DEFAULT_ATTRIBUTES = {
6
- cacheKey: `${DEFAULT_COLOR_SCHEME}:${DEFAULT_BRAND_ID}`,
7
- scheme: DEFAULT_COLOR_SCHEME,
8
- brandId: DEFAULT_BRAND_ID,
9
- scope: null
10
- };
11
- let snapshot = DEFAULT_ATTRIBUTES;
12
- const readThemeAttributes = () => {
13
- if (typeof document === "undefined") return DEFAULT_ATTRIBUTES;
14
- const root = document.documentElement;
15
- const theme = root.getAttribute(THEME_ATTRIBUTE);
16
- const scheme = theme === "dark" || theme === "light" ? theme : DEFAULT_COLOR_SCHEME;
17
- const brandId = root.getAttribute("data-brand") ?? "design-system";
18
- const cacheKey = `${scheme}:${brandId}`;
19
- if (cacheKey !== snapshot.cacheKey) snapshot = {
20
- cacheKey,
21
- scheme,
22
- brandId,
23
- scope: null
24
- };
25
- return snapshot;
26
- };
27
- const subscribe = (onChange) => {
28
- if (typeof document === "undefined") return () => {};
29
- const observer = new MutationObserver(onChange);
30
- observer.observe(document.documentElement, {
31
- attributes: true,
32
- attributeFilter: [THEME_ATTRIBUTE, BRAND_ATTRIBUTE]
33
- });
34
- return () => observer.disconnect();
35
- };
36
- const getServerSnapshot = () => DEFAULT_ATTRIBUTES;
37
- /**
38
- * The colour scheme and brand currently applied to `<html>`, plus a key that
39
- * changes whenever they do — for memoizing anything built from `resolveToken`.
40
- *
41
- * Read from the DOM rather than `useTheme()` on purpose: `ThemeProvider` writes
42
- * both attributes from passive effects, so during the render after a scheme
43
- * change the context already says `dark` while `<html>` — and therefore every
44
- * computed `--*` value — is still light. Keying off the attributes keeps the
45
- * values and the key that stands for them in lockstep, and works in a subtree
46
- * with no `ThemeProvider` above it.
47
- *
48
- * Returning `scheme` from the same read is what makes that safe by construction:
49
- * a caller cannot pick up the new key and the old scheme.
50
- *
51
- * Inside a `ThemeScope` the scope's scheme wins. `<html>` still carries the page's, but the
52
- * scope re-points the tokens for its own subtree, so a consumer that read the root would build
53
- * light values for a dark panel — a white chart on a dark card. Unlike the provider's, the
54
- * scope's attribute and vars are rendered in the same commit as the subtree, so context and
55
- * DOM cannot disagree here.
56
- */
57
- const useThemeAttributes = () => {
58
- const root = useSyncExternalStore(subscribe, readThemeAttributes, getServerSnapshot);
59
- const scopedScheme = use(ThemeScopeSchemeContext);
60
- const scope = use(ThemeScopeContainerContext);
61
- return useMemo(() => {
62
- if (scopedScheme === null && scope === null) return root;
63
- const scheme = scopedScheme ?? root.scheme;
64
- return {
65
- scheme,
66
- brandId: root.brandId,
67
- scope,
68
- cacheKey: `${scheme}:${root.brandId}${scope === null ? "" : ":scoped"}`
69
- };
70
- }, [
71
- scopedScheme,
72
- scope,
73
- root
74
- ]);
75
- };
76
- //#endregion
77
- //#region src/utils/themeTokens.ts
78
- /**
79
- * Live access to the semantic `--*` design tokens for consumers that cannot use
80
- * a Tailwind class — a CodeMirror theme object, a mermaid `themeVariables` map,
81
- * an SVG serialized for export. Those all need a concrete color string at build
82
- * time, so we resolve the value the browser currently computes for `<html>` and
83
- * hand the resulting `rgb(...)` to the library.
84
- *
85
- * SSR/no-document falls back to a literal; so does a token the stylesheet has
86
- * not defined (which is what unit tests see, since they load no CSS).
87
- */
88
- const format = (channels, alpha) => alpha === void 0 ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;
89
- const resolveToken = (token, fallbackChannels, alpha) => {
90
- const channels = typeof document === "undefined" ? fallbackChannels : getComputedStyle(document.documentElement).getPropertyValue(`--${token}`).trim() || fallbackChannels;
91
- return format(channels, alpha);
92
- };
93
- /**
94
- * A {@link resolveToken} bound to a single `getComputedStyle` snapshot.
95
- *
96
- * Reach for this when building a whole palette at once: `resolveToken` reads the
97
- * computed style per call, so a config with dozens of token lookups forces dozens
98
- * of style resolutions for one render. Take a snapshot, read every token off it,
99
- * throw it away.
100
- *
101
- * Snapshot per palette build, never module-level — the values change whenever the
102
- * scheme or brand does, and a cached resolver would keep serving the old ones.
103
- *
104
- * {@link createChannelResolver} is the same snapshot answering the raw `"R G B"`
105
- * channels, for a consumer that needs another serialization.
106
- */
107
- const createChannelResolver = (from) => {
108
- const element = from ?? (typeof document === "undefined" ? null : document.documentElement);
109
- const computed = element === null ? null : getComputedStyle(element);
110
- return (token, fallbackChannels) => computed?.getPropertyValue(`--${token}`).trim() || fallbackChannels;
111
- };
112
- const createTokenResolver = (from) => {
113
- const resolve = createChannelResolver(from);
114
- return (token, fallbackChannels, alpha) => format(resolve(token, fallbackChannels), alpha);
115
- };
116
- //#endregion
117
- export { createChannelResolver, createTokenResolver, resolveToken, useThemeAttributes };
118
-
119
- //# sourceMappingURL=themeTokens-qP1-55O7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"themeTokens-qP1-55O7.js","names":[],"sources":["../src/components/ThemeProvider/useThemeAttributes.ts","../src/utils/themeTokens.ts"],"sourcesContent":["import { use, useMemo, useSyncExternalStore } from 'react';\n\nimport { DEFAULT_BRAND_ID, DEFAULT_COLOR_SCHEME } from './defaults';\nimport { ThemeScopeContainerContext, ThemeScopeSchemeContext } from './themeScopeContext';\nimport type { BrandId, ResolvedColorScheme } from './types';\nimport { BRAND_ATTRIBUTE } from './useBrandState';\nimport { THEME_ATTRIBUTE } from './useColorSchemeState';\n\nexport type ThemeAttributes = {\n /** Changes whenever `scheme`, `brandId` or `scope` does — the memo key for anything built from live `--*` values. */\n cacheKey: string;\n scheme: ResolvedColorScheme;\n brandId: BrandId;\n /**\n * The element to read live `--*` values off, or `null` for `<html>`.\n *\n * Set inside a `ThemeScope`, whose subtree carries its own tokens. It arrives one commit\n * after the scope mounts, which is why it is part of `cacheKey` — a palette built against\n * `<html>` must not be served once the scope's own is available.\n */\n scope: HTMLElement | null;\n};\n\n// No attribute set means the stylesheet's own `:root` block is painting, which is\n// the default scheme — not a third \"unknown\" state. Same value on the server, so\n// the SSR snapshot and the client's first render agree.\nconst DEFAULT_ATTRIBUTES: ThemeAttributes = {\n cacheKey: `${DEFAULT_COLOR_SCHEME}:${DEFAULT_BRAND_ID}`,\n scheme: DEFAULT_COLOR_SCHEME,\n brandId: DEFAULT_BRAND_ID,\n scope: null,\n};\n\n// `useSyncExternalStore` re-renders forever on a snapshot whose reference changes\n// on every read, so the object is rebuilt only when the key it stands for moves.\nlet snapshot = DEFAULT_ATTRIBUTES;\n\nconst readThemeAttributes = (): ThemeAttributes => {\n if (typeof document === 'undefined') return DEFAULT_ATTRIBUTES;\n\n const root = document.documentElement;\n const theme = root.getAttribute(THEME_ATTRIBUTE);\n const scheme: ResolvedColorScheme =\n theme === 'dark' || theme === 'light' ? theme : DEFAULT_COLOR_SCHEME;\n const brandId = root.getAttribute(BRAND_ATTRIBUTE) ?? DEFAULT_BRAND_ID;\n const cacheKey = `${scheme}:${brandId}`;\n\n if (cacheKey !== snapshot.cacheKey) snapshot = { cacheKey, scheme, brandId, scope: null };\n\n return snapshot;\n};\n\nconst subscribe = (onChange: () => void): (() => void) => {\n if (typeof document === 'undefined') return () => {};\n\n const observer = new MutationObserver(onChange);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [THEME_ATTRIBUTE, BRAND_ATTRIBUTE],\n });\n\n return () => observer.disconnect();\n};\n\nconst getServerSnapshot = (): ThemeAttributes => DEFAULT_ATTRIBUTES;\n\n/**\n * The colour scheme and brand currently applied to `<html>`, plus a key that\n * changes whenever they do — for memoizing anything built from `resolveToken`.\n *\n * Read from the DOM rather than `useTheme()` on purpose: `ThemeProvider` writes\n * both attributes from passive effects, so during the render after a scheme\n * change the context already says `dark` while `<html>` — and therefore every\n * computed `--*` value — is still light. Keying off the attributes keeps the\n * values and the key that stands for them in lockstep, and works in a subtree\n * with no `ThemeProvider` above it.\n *\n * Returning `scheme` from the same read is what makes that safe by construction:\n * a caller cannot pick up the new key and the old scheme.\n *\n * Inside a `ThemeScope` the scope's scheme wins. `<html>` still carries the page's, but the\n * scope re-points the tokens for its own subtree, so a consumer that read the root would build\n * light values for a dark panel — a white chart on a dark card. Unlike the provider's, the\n * scope's attribute and vars are rendered in the same commit as the subtree, so context and\n * DOM cannot disagree here.\n */\nexport const useThemeAttributes = (): ThemeAttributes => {\n const root = useSyncExternalStore(subscribe, readThemeAttributes, getServerSnapshot);\n const scopedScheme = use(ThemeScopeSchemeContext);\n const scope = use(ThemeScopeContainerContext);\n\n // The reference is a memo key for callers, so it may only move when the values do.\n return useMemo(() => {\n if (scopedScheme === null && scope === null) return root;\n\n const scheme = scopedScheme ?? root.scheme;\n return {\n scheme,\n brandId: root.brandId,\n scope,\n cacheKey: `${scheme}:${root.brandId}${scope === null ? '' : ':scoped'}`,\n };\n }, [scopedScheme, scope, root]);\n};\n","/**\n * Live access to the semantic `--*` design tokens for consumers that cannot use\n * a Tailwind class — a CodeMirror theme object, a mermaid `themeVariables` map,\n * an SVG serialized for export. Those all need a concrete color string at build\n * time, so we resolve the value the browser currently computes for `<html>` and\n * hand the resulting `rgb(...)` to the library.\n *\n * SSR/no-document falls back to a literal; so does a token the stylesheet has\n * not defined (which is what unit tests see, since they load no CSS).\n */\nconst format = (channels: string, alpha?: number): string =>\n alpha === undefined ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;\n\nexport const resolveToken = (token: string, fallbackChannels: string, alpha?: number): string => {\n const channels =\n typeof document === 'undefined'\n ? fallbackChannels\n : getComputedStyle(document.documentElement).getPropertyValue(`--${token}`).trim() ||\n fallbackChannels;\n return format(channels, alpha);\n};\n\n/**\n * A {@link resolveToken} bound to a single `getComputedStyle` snapshot.\n *\n * Reach for this when building a whole palette at once: `resolveToken` reads the\n * computed style per call, so a config with dozens of token lookups forces dozens\n * of style resolutions for one render. Take a snapshot, read every token off it,\n * throw it away.\n *\n * Snapshot per palette build, never module-level — the values change whenever the\n * scheme or brand does, and a cached resolver would keep serving the old ones.\n *\n * {@link createChannelResolver} is the same snapshot answering the raw `\"R G B\"`\n * channels, for a consumer that needs another serialization.\n */\nexport const createChannelResolver = (from?: Element | null) => {\n // `from` is a node inside the subtree whose palette is wanted — a `ThemeScope` re-points the\n // tokens for its own subtree, so reading `<html>` there builds the page's palette instead.\n const element = from ?? (typeof document === 'undefined' ? null : document.documentElement);\n const computed = element === null ? null : getComputedStyle(element);\n\n return (token: string, fallbackChannels: string): string =>\n computed?.getPropertyValue(`--${token}`).trim() || fallbackChannels;\n};\n\nexport const createTokenResolver = (from?: Element | null) => {\n const resolve = createChannelResolver(from);\n\n return (token: string, fallbackChannels: string, alpha?: number): string =>\n format(resolve(token, fallbackChannels), alpha);\n};\n"],"mappings":";;;;AA0BA,MAAM,qBAAsC;CAC1C,UAAU,GAAG,qBAAqB,GAAG;CACrC,QAAQ;CACR,SAAS;CACT,OAAO;AACT;AAIA,IAAI,WAAW;AAEf,MAAM,4BAA6C;CACjD,IAAI,OAAO,aAAa,aAAa,OAAO;CAE5C,MAAM,OAAO,SAAS;CACtB,MAAM,QAAQ,KAAK,aAAa,eAAe;CAC/C,MAAM,SACJ,UAAU,UAAU,UAAU,UAAU,QAAQ;CAClD,MAAM,UAAU,KAAK,aAAA,YAA4B,KAAA;CACjD,MAAM,WAAW,GAAG,OAAO,GAAG;CAE9B,IAAI,aAAa,SAAS,UAAU,WAAW;EAAE;EAAU;EAAQ;EAAS,OAAO;CAAK;CAExF,OAAO;AACT;AAEA,MAAM,aAAa,aAAuC;CACxD,IAAI,OAAO,aAAa,aAAa,aAAa,CAAC;CAEnD,MAAM,WAAW,IAAI,iBAAiB,QAAQ;CAC9C,SAAS,QAAQ,SAAS,iBAAiB;EACzC,YAAY;EACZ,iBAAiB,CAAC,iBAAiB,eAAe;CACpD,CAAC;CAED,aAAa,SAAS,WAAW;AACnC;AAEA,MAAM,0BAA2C;;;;;;;;;;;;;;;;;;;;;AAsBjD,MAAa,2BAA4C;CACvD,MAAM,OAAO,qBAAqB,WAAW,qBAAqB,iBAAiB;CACnF,MAAM,eAAe,IAAI,uBAAuB;CAChD,MAAM,QAAQ,IAAI,0BAA0B;CAG5C,OAAO,cAAc;EACnB,IAAI,iBAAiB,QAAQ,UAAU,MAAM,OAAO;EAEpD,MAAM,SAAS,gBAAgB,KAAK;EACpC,OAAO;GACL;GACA,SAAS,KAAK;GACd;GACA,UAAU,GAAG,OAAO,GAAG,KAAK,UAAU,UAAU,OAAO,KAAK;EAC9D;CACF,GAAG;EAAC;EAAc;EAAO;CAAI,CAAC;AAChC;;;;;;;;;;;;;AC7FA,MAAM,UAAU,UAAkB,UAChC,UAAU,KAAA,IAAY,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK,MAAM;AAExE,MAAa,gBAAgB,OAAe,kBAA0B,UAA2B;CAC/F,MAAM,WACJ,OAAO,aAAa,cAChB,mBACA,iBAAiB,SAAS,eAAe,CAAC,CAAC,iBAAiB,KAAK,OAAO,CAAC,CAAC,KAAK,KAC/E;CACN,OAAO,OAAO,UAAU,KAAK;AAC/B;;;;;;;;;;;;;;;AAgBA,MAAa,yBAAyB,SAA0B;CAG9D,MAAM,UAAU,SAAS,OAAO,aAAa,cAAc,OAAO,SAAS;CAC3E,MAAM,WAAW,YAAY,OAAO,OAAO,iBAAiB,OAAO;CAEnE,QAAQ,OAAe,qBACrB,UAAU,iBAAiB,KAAK,OAAO,CAAC,CAAC,KAAK,KAAK;AACvD;AAEA,MAAa,uBAAuB,SAA0B;CAC5D,MAAM,UAAU,sBAAsB,IAAI;CAE1C,QAAQ,OAAe,kBAA0B,UAC/C,OAAO,QAAQ,OAAO,gBAAgB,GAAG,KAAK;AAClD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"toast-DIC0iNRf.js","names":["sonnerToast","toast","sonnerToast"],"sources":["../src/components/Toast/ToastAction.tsx","../src/components/Toast/ToastDescription.tsx","../src/components/Toast/ToastDismiss.tsx","../src/components/Toast/ToastDuration.tsx","../src/components/Toast/ToastTitle.tsx","../src/components/Toast/ToastRoot.tsx","../src/components/Toast/toast.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'button'>;\n\nexport const ToastAction = ({ ref, className, ...rest }: Props) => (\n <button\n {...rest}\n ref={ref}\n data-slot=\"toast-action\"\n type=\"button\"\n className={cn(\n // layout\n 'tw:col-start-3',\n 'tw:row-start-1',\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n\n // font\n 'tw:text-xs',\n 'tw:font-medium',\n 'tw:text-primary',\n\n // sizing\n 'tw:px-2',\n 'tw:h-6',\n\n // styles\n // Fixed white: this is the chip's surface, not ink on a primary fill.\n // - All four non-`default` toast variants paint a scheme-blind primitive\n // (`bg-error-550`, `bg-blue-600`, `bg-green-700`, `bg-warning-550`), so a\n // chip on them must not move with the scheme either.\n // - `default` (`bg-popover`) is scheme-aware, and the white chip is the same\n // in both schemes there. `text-primary` on it is 3.27:1 in dark — that ink\n // is a separate fix, tracked in UT-5239's follow-ups.\n 'tw:bg-white',\n 'tw:rounded',\n className,\n )}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const ToastDescription = ({ ref, className, children, ...rest }: Props) => (\n <div\n ref={ref}\n data-slot=\"toast-description\"\n className={cn(\n 'tw:col-start-2',\n 'tw:font-normal',\n 'tw:break-words',\n 'tw:text-white',\n 'tw:group-data-[variant=default]/toast:text-muted-foreground',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n);\n","import type { ComponentProps } from 'react';\n\nimport { X } from '../../icons';\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'button'>;\n\nexport const ToastDismiss = ({ ref, className, ...rest }: Props) => (\n <button\n ref={ref}\n data-slot=\"toast-dismiss\"\n className={cn(\n 'tw:flex',\n 'tw:justify-center',\n 'tw:col-start-4',\n 'tw:row-start-1',\n 'tailwindcss-preflight',\n 'tw:[&_svg]:aspect-square',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n 'tw:[&_svg]:m-1',\n\n 'tw:text-white',\n 'tw:group-data-[variant=default]/toast:[&_svg]:text-popover-foreground',\n 'tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:[&_svg]:text-foreground',\n className,\n )}\n type=\"button\"\n {...rest}\n >\n <X />\n <span className=\"tw:sr-only\">Dismiss</span>\n </button>\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype ToastDurationProps = ComponentProps<'span'> & {\n duration: number;\n};\n\nexport const ToastDuration = ({ ref, duration, className, style, ...rest }: ToastDurationProps) => (\n <span\n {...rest}\n ref={ref}\n className={cn(\n 'tw:bg-white/30',\n 'tw:group-data-[variant=default]/toast:bg-popover-foreground/20',\n 'tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:bg-foreground/20',\n 'tw:rounded-bl-lg',\n 'tw:mx-px',\n\n // positioning\n 'tw:absolute',\n 'tw:bottom-0',\n 'tw:left-0',\n\n // sizing\n 'tw:h-1',\n\n // animation\n 'tw:animate-toast-progress',\n 'tw:group-hover/toast:[animation-play-state:paused]',\n className,\n )}\n style={{\n animationDuration: `${duration}ms`,\n ...style,\n }}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const ToastTitle = ({ ref, className, children, ...rest }: Props) => (\n <div\n ref={ref}\n data-slot=\"toast-title\"\n className={cn(\n 'tw:col-start-2',\n 'tw:text-sm',\n 'tw:leading-6',\n 'tw:min-h-6',\n 'tw:self-center',\n 'tw:text-white',\n 'tw:group-data-[variant=default]/toast:text-popover-foreground',\n 'tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:text-foreground',\n\n 'tw:break-words',\n 'tw:font-medium',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n);\n","import type { MouseEventHandler, ReactNode } from 'react';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\nimport { type Action, toast as sonnerToast } from 'sonner';\n\nimport { AlertCircle, AlertTriangle, CircleCheck, Info, Loader2 } from '../../icons';\nimport { cn } from '../../utils';\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nimport { ToastAction } from './ToastAction';\nimport { ToastDescription } from './ToastDescription';\nimport { ToastDismiss } from './ToastDismiss';\nimport { ToastDuration } from './ToastDuration';\nimport { ToastTitle } from './ToastTitle';\n\nconst variants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:group/toast',\n 'tw:relative',\n\n // layout\n 'tw:grid',\n 'tw:grid-cols-[0_1fr_auto_auto]',\n 'tw:items-start',\n 'tw:has-[[data-slot=toast-description]]:grid-rows-[auto_auto]',\n 'tw:has-[[data-slot=toast-icon]]:grid-cols-[auto_1fr_auto_auto]',\n 'tw:[&_[data-slot=toast-icon]]:mr-2',\n 'tw:[&_[data-slot=toast-title]]:mr-2.5',\n 'tw:[&_[data-slot=toast-description]]:mr-2.5',\n 'tw:[&_[data-slot=toast-action]]:mr-2',\n 'tw:[&_[data-slot=toast-description]]:col-end-3',\n 'tw:gap-y-0',\n\n // styles\n 'tw:p-4',\n 'tw:rounded-lg',\n 'tw:shadow-md',\n ],\n {\n defaultVariants: {\n variant: 'info',\n },\n variants: {\n variant: {\n default: 'tw:border tw:border-border tw:bg-popover',\n error: 'tw:bg-error-550',\n info: 'tw:bg-blue-600',\n success: 'tw:bg-green-700',\n warning: 'tw:bg-warning-550',\n },\n },\n },\n);\n\ntype Variants = VariantProps<typeof variants>;\ntype Variant = NonNullable<Variants['variant']>;\ntype VariantIcon = Exclude<Variant, 'default'>;\n\ntype Props = {\n id: string | number;\n title: ReactNode;\n icon?: ReactNode;\n description?: ReactNode;\n action?: Action;\n loading?: boolean;\n duration?: number;\n // offset?: number;\n} & Variants;\n\nconst DEFAULT_VARIANT_ICON: Record<VariantIcon, ReactNode> = {\n error: <AlertTriangle />,\n info: <Info />,\n success: <CircleCheck />,\n warning: <AlertCircle />,\n};\n\nexport const ToastRoot = ({\n id,\n title,\n description,\n action,\n duration = Infinity,\n variant = 'info',\n loading = false,\n icon: iconProp,\n}: Props) => {\n const renderArgo = useArgoDesign();\n\n const icon: ReactNode = (() => {\n if (loading) return <Loader2 className=\"tw:animate-spin\" />;\n if (iconProp) return iconProp;\n if (variant === 'default' || variant === null) return null;\n return DEFAULT_VARIANT_ICON[variant];\n })();\n\n const handleActionClick: MouseEventHandler<HTMLButtonElement> = (event) => {\n sonnerToast.dismiss(id);\n action?.onClick(event);\n };\n\n return (\n <div\n data-variant={variant}\n data-argo={renderArgo}\n className={cn(\n variants({ variant }),\n 'tw:data-[variant=default]:data-[argo=true]:bg-background',\n )}\n >\n {icon && (\n <span\n data-slot=\"toast-icon\"\n className={cn(\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:self-center',\n 'tw:aspect-square',\n 'tw:size-5',\n 'tw:shrink-0',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-5',\n 'tw:text-white',\n 'tw:group-data-[variant=default]/toast:text-popover-foreground',\n 'tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:text-foreground',\n )}\n >\n {icon}\n </span>\n )}\n\n <ToastTitle>{title}</ToastTitle>\n {description && <ToastDescription>{description}</ToastDescription>}\n {action && (\n <ToastAction style={action?.actionButtonStyle} onClick={handleActionClick}>\n {action.label}\n </ToastAction>\n )}\n <ToastDismiss onClick={() => sonnerToast.dismiss(id)} />\n {duration !== Infinity && <ToastDuration duration={duration} />}\n </div>\n );\n};\n","import type { ComponentProps, ReactNode } from 'react';\nimport { type ExternalToast, toast as sonnerToast } from 'sonner';\n\nimport { cn } from '../../utils';\n\nimport { ToastRoot } from './ToastRoot';\n\ntype ToastProps = ComponentProps<typeof ToastRoot>;\ntype Title = ToastProps['title'] | ((opts: { dismiss: () => void }) => ReactNode);\n\nexport type ToastOptions = { id?: string | number; title: Title } & Omit<\n ToastProps,\n 'id' | 'title'\n> &\n Pick<\n ExternalToast,\n 'onAutoClose' | 'onDismiss' | 'testId' | 'toasterId' | 'dismissible' | 'position'\n >;\ntype DerivedToastOptions = Omit<ToastOptions, 'title' | 'variant'>;\n\nexport const toast = ({\n onAutoClose,\n onDismiss,\n testId,\n toasterId,\n dismissible = true,\n position,\n title: titleProp,\n ...toast\n}: ToastOptions) => {\n const duration = (() => {\n if (typeof toast.duration === 'number') return toast.duration;\n if (toast.variant === 'error' || toast.variant === 'warning') return Infinity;\n return toast.duration ?? 5000;\n })();\n\n const renderCustomToast: Parameters<typeof sonnerToast.custom>[0] = (id) => {\n const title =\n typeof titleProp === 'function'\n ? titleProp({ dismiss: () => sonnerToast.dismiss(id) })\n : titleProp;\n\n return <ToastRoot {...toast} id={id} title={title} duration={duration} />;\n };\n\n return sonnerToast.custom(renderCustomToast, {\n // toast generated by sonner will always have an id, but we want to allow users to specify their own id if they want to\n // can not pass undefined, as it will break dismiss\n ...(toast.id != null ? { id: toast.id } : {}),\n unstyled: true,\n position,\n onAutoClose,\n onDismiss,\n testId,\n toasterId,\n dismissible,\n duration,\n // override default focus-visible styles to match our design\n className: cn('tw:rounded-lg', 'tw:focus-visible:!ring-4', 'tw:focus-visible:!ring-ring/50'),\n });\n};\n\ntoast.success = (title: Title, options?: DerivedToastOptions) =>\n toast({\n ...options,\n title,\n variant: 'success',\n });\n\ntoast.error = (title: Title, options?: DerivedToastOptions) =>\n toast({\n ...options,\n title,\n variant: 'error',\n duration: options?.duration ?? Infinity,\n });\n\ntoast.warning = (title: Title, options?: DerivedToastOptions) =>\n toast({\n ...options,\n title,\n variant: 'warning',\n duration: options?.duration ?? Infinity,\n });\n\ntoast.info = (title: Title, options?: DerivedToastOptions) =>\n toast({\n ...options,\n title,\n variant: 'info',\n });\n\ntoast.dismiss = (toastId?: ToastOptions['id']) => sonnerToast.dismiss(toastId);\ntoast.dismissAll = () => sonnerToast.dismiss();\n"],"mappings":"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"}