@keboola/design 10.1.0 → 11.0.1

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 (382) hide show
  1. package/AGENTS.md +2 -0
  2. package/dist/AIKit-Dre37SJr.js +1320 -0
  3. package/dist/AIKit-Dre37SJr.js.map +1 -0
  4. package/dist/Alert-DfZq9kGe.js +133 -0
  5. package/dist/Alert-DfZq9kGe.js.map +1 -0
  6. package/dist/AlertModal-BUC4Es8o.js +222 -0
  7. package/dist/AlertModal-BUC4Es8o.js.map +1 -0
  8. package/dist/AppShell-B5GQN6Zs.js +143 -0
  9. package/dist/AppShell-B5GQN6Zs.js.map +1 -0
  10. package/dist/AutoSaveTextarea-BeuWuszr.js +58 -0
  11. package/dist/AutoSaveTextarea-BeuWuszr.js.map +1 -0
  12. package/dist/Badge-Ch26CXoP.js +195 -0
  13. package/dist/Badge-Ch26CXoP.js.map +1 -0
  14. package/dist/BrandEditor-B8o9zdZO.js +903 -0
  15. package/dist/BrandEditor-B8o9zdZO.js.map +1 -0
  16. package/dist/BrandLogo-CJkRd0F8.js +46 -0
  17. package/dist/BrandLogo-CJkRd0F8.js.map +1 -0
  18. package/dist/Breadcrumb-DJp7WwSv.js +330 -0
  19. package/dist/Breadcrumb-DJp7WwSv.js.map +1 -0
  20. package/dist/Button-nzmDNS2q.js +391 -0
  21. package/dist/Button-nzmDNS2q.js.map +1 -0
  22. package/dist/Calendar-cG5NIJ4O.js +6768 -0
  23. package/dist/Calendar-cG5NIJ4O.js.map +1 -0
  24. package/dist/Card-BAoZ35CV.js +105 -0
  25. package/dist/Card-BAoZ35CV.js.map +1 -0
  26. package/dist/Checkbox-GJ8-srt4.js +97 -0
  27. package/dist/Checkbox-GJ8-srt4.js.map +1 -0
  28. package/dist/Clipboard-CBJZiviP.js +58 -0
  29. package/dist/Clipboard-CBJZiviP.js.map +1 -0
  30. package/dist/ClipboardButton-ez5V3fkk.js +43 -0
  31. package/dist/ClipboardButton-ez5V3fkk.js.map +1 -0
  32. package/dist/CodeEditor-BfQJfbhL.js +952 -0
  33. package/dist/CodeEditor-BfQJfbhL.js.map +1 -0
  34. package/dist/Collapsible-BQXWEOBC.js +34 -0
  35. package/dist/Collapsible-BQXWEOBC.js.map +1 -0
  36. package/dist/ColorInput-Dx8Dsv7Y.js +180 -0
  37. package/dist/ColorInput-Dx8Dsv7Y.js.map +1 -0
  38. package/dist/ColorModeSwitch-CCqj7tjE.js +77 -0
  39. package/dist/ColorModeSwitch-CCqj7tjE.js.map +1 -0
  40. package/dist/Combobox-c_xBjf0P.js +439 -0
  41. package/dist/Combobox-c_xBjf0P.js.map +1 -0
  42. package/dist/Command-CQ_bQsJp.js +102 -0
  43. package/dist/Command-CQ_bQsJp.js.map +1 -0
  44. package/dist/CopyField-BJ96zvXs.js +322 -0
  45. package/dist/CopyField-BJ96zvXs.js.map +1 -0
  46. package/dist/DateInput-CMD3dY-T.js +141 -0
  47. package/dist/DateInput-CMD3dY-T.js.map +1 -0
  48. package/dist/DatePicker-BbFbmsGl.js +24 -0
  49. package/dist/DatePicker-BbFbmsGl.js.map +1 -0
  50. package/dist/DateRangeInput-D3BhiKyk.js +139 -0
  51. package/dist/DateRangeInput-D3BhiKyk.js.map +1 -0
  52. package/dist/DateRangePicker-BiUgtt_M.js +159 -0
  53. package/dist/DateRangePicker-BiUgtt_M.js.map +1 -0
  54. package/dist/DiagramSkeleton-lwBS2YBa.js +11 -0
  55. package/dist/DiagramSkeleton-lwBS2YBa.js.map +1 -0
  56. package/dist/DiffView-ppTIzh2h.js +429 -0
  57. package/dist/DiffView-ppTIzh2h.js.map +1 -0
  58. package/dist/DropdownMenu-B6ZbYvaM.js +327 -0
  59. package/dist/DropdownMenu-B6ZbYvaM.js.map +1 -0
  60. package/dist/FieldBox-D7DYtX_m.js +70 -0
  61. package/dist/FieldBox-D7DYtX_m.js.map +1 -0
  62. package/dist/FileUpload-sXRv7JiY.js +2527 -0
  63. package/dist/FileUpload-sXRv7JiY.js.map +1 -0
  64. package/dist/Form-BDCef6O9.js +371 -0
  65. package/dist/Form-BDCef6O9.js.map +1 -0
  66. package/dist/FormGroup-S9mPNHKH.js +124 -0
  67. package/dist/FormGroup-S9mPNHKH.js.map +1 -0
  68. package/dist/FullScreenModal-CJa2VkJ2.js +96 -0
  69. package/dist/FullScreenModal-CJa2VkJ2.js.map +1 -0
  70. package/dist/HoverCard-WfDkLK1s.js +31 -0
  71. package/dist/HoverCard-WfDkLK1s.js.map +1 -0
  72. package/dist/InputGroup-BJWsI35s.js +292 -0
  73. package/dist/InputGroup-BJWsI35s.js.map +1 -0
  74. package/dist/Kbd-CxHAo1oo.js +111 -0
  75. package/dist/Kbd-CxHAo1oo.js.map +1 -0
  76. package/dist/MarkedText-Ckbft5mw.js +44 -0
  77. package/dist/MarkedText-Ckbft5mw.js.map +1 -0
  78. package/dist/MermaidDiagram-BB06gymm.js +399 -0
  79. package/dist/MermaidDiagram-BB06gymm.js.map +1 -0
  80. package/dist/Modal-BA5Wc3sx.js +185 -0
  81. package/dist/Modal-BA5Wc3sx.js.map +1 -0
  82. package/dist/ModalTitle-C76ke2eo.js +28 -0
  83. package/dist/ModalTitle-C76ke2eo.js.map +1 -0
  84. package/dist/MultiActionButtonGroup-CiBHxsSk.js +33 -0
  85. package/dist/MultiActionButtonGroup-CiBHxsSk.js.map +1 -0
  86. package/dist/Navbar-t16usFZQ.js +322 -0
  87. package/dist/Navbar-t16usFZQ.js.map +1 -0
  88. package/dist/OtpInput-CbbymqYs.js +93 -0
  89. package/dist/OtpInput-CbbymqYs.js.map +1 -0
  90. package/dist/PageHeader-Q3IpCnQd.js +177 -0
  91. package/dist/PageHeader-Q3IpCnQd.js.map +1 -0
  92. package/dist/PageLayout-DSVM-ASz.js +176 -0
  93. package/dist/PageLayout-DSVM-ASz.js.map +1 -0
  94. package/dist/PageToolbar-0_1OBzaZ.js +153 -0
  95. package/dist/PageToolbar-0_1OBzaZ.js.map +1 -0
  96. package/dist/Pagination-CM_Rszz-.js +70 -0
  97. package/dist/Pagination-CM_Rszz-.js.map +1 -0
  98. package/dist/Popconfirm-BGe1jLov.js +170 -0
  99. package/dist/Popconfirm-BGe1jLov.js.map +1 -0
  100. package/dist/Popover-Ca0V6AD1.js +92 -0
  101. package/dist/Popover-Ca0V6AD1.js.map +1 -0
  102. package/dist/RadioGroup-sIveSsNa.js +233 -0
  103. package/dist/RadioGroup-sIveSsNa.js.map +1 -0
  104. package/dist/Resizable-D3vYToZH.js +52 -0
  105. package/dist/Resizable-D3vYToZH.js.map +1 -0
  106. package/dist/Search-3UiqNZRj.js +184 -0
  107. package/dist/Search-3UiqNZRj.js.map +1 -0
  108. package/dist/SearchInput-D2fcOv7E.js +102 -0
  109. package/dist/SearchInput-D2fcOv7E.js.map +1 -0
  110. package/dist/SectionNav--7bw2b6u.js +276 -0
  111. package/dist/SectionNav--7bw2b6u.js.map +1 -0
  112. package/dist/Select-4YX38G5h.js +181 -0
  113. package/dist/Select-4YX38G5h.js.map +1 -0
  114. package/dist/Sheet-BQrX8-h5.js +169 -0
  115. package/dist/Sheet-BQrX8-h5.js.map +1 -0
  116. package/dist/Sidebar-ROaR_AqC.js +799 -0
  117. package/dist/Sidebar-ROaR_AqC.js.map +1 -0
  118. package/dist/Slider-Da_3mS5v.js +127 -0
  119. package/dist/Slider-Da_3mS5v.js.map +1 -0
  120. package/dist/Stepper-C8sm9ZFM.js +325 -0
  121. package/dist/Stepper-C8sm9ZFM.js.map +1 -0
  122. package/dist/Switch-CX2A0v50.js +201 -0
  123. package/dist/Switch-CX2A0v50.js.map +1 -0
  124. package/dist/Table-CvYuTuNU.js +104 -0
  125. package/dist/Table-CvYuTuNU.js.map +1 -0
  126. package/dist/Tabs-EAihyqCt.js +74 -0
  127. package/dist/Tabs-EAihyqCt.js.map +1 -0
  128. package/dist/TextInput-BGed-V13.js +110 -0
  129. package/dist/TextInput-BGed-V13.js.map +1 -0
  130. package/dist/ThemeProvider-QncUrfJn.js +203 -0
  131. package/dist/ThemeProvider-QncUrfJn.js.map +1 -0
  132. package/dist/TimePicker-B_NegL-7.js +98 -0
  133. package/dist/TimePicker-B_NegL-7.js.map +1 -0
  134. package/dist/Timeline-6btyJl4D.js +154 -0
  135. package/dist/Timeline-6btyJl4D.js.map +1 -0
  136. package/dist/Toast-DQSbs3oA.js +49 -0
  137. package/dist/Toast-DQSbs3oA.js.map +1 -0
  138. package/dist/ToggleGroup-Cy_10Mvu.js +47 -0
  139. package/dist/ToggleGroup-Cy_10Mvu.js.map +1 -0
  140. package/dist/Workbench-BzE-Vvd9.js +293 -0
  141. package/dist/Workbench-BzE-Vvd9.js.map +1 -0
  142. package/dist/ZoomableSvg-DG9PnAm8.js +248 -0
  143. package/dist/ZoomableSvg-DG9PnAm8.js.map +1 -0
  144. package/dist/charts.d.ts +124 -111
  145. package/dist/charts.js +303 -249
  146. package/dist/charts.js.map +1 -1
  147. package/dist/classNames-BzrkDnOD.js +9 -0
  148. package/dist/classNames-BzrkDnOD.js.map +1 -0
  149. package/dist/constants-D6JcsD4_.d.ts +41 -0
  150. package/dist/context-KxxeMHbR.js +62 -0
  151. package/dist/context-KxxeMHbR.js.map +1 -0
  152. package/dist/editors.d.ts +180 -173
  153. package/dist/editors.js +747 -420
  154. package/dist/editors.js.map +1 -1
  155. package/dist/escapeStringRegexp-8MxP2knR.js +6 -0
  156. package/dist/escapeStringRegexp-8MxP2knR.js.map +1 -0
  157. package/dist/icons-Cek151jC.js +640 -0
  158. package/dist/icons-Cek151jC.js.map +1 -0
  159. package/dist/icons.d.ts +2 -41
  160. package/dist/icons.js +2 -4
  161. package/dist/index-m-kQEWiY.d.ts +54 -0
  162. package/dist/index.d.ts +6192 -9904
  163. package/dist/index.js +112 -15803
  164. package/dist/internal/blocks/AIKit.js +2 -0
  165. package/dist/internal/blocks/AppShell.js +2 -0
  166. package/dist/internal/blocks/AutoSaveTextarea.js +2 -0
  167. package/dist/internal/blocks/BrandEditor.js +2 -0
  168. package/dist/internal/blocks/ChartPanel.js +46 -0
  169. package/dist/internal/blocks/ChartPanel.js.map +1 -0
  170. package/dist/internal/blocks/ClipboardButton.js +2 -0
  171. package/dist/internal/blocks/ColorInput.js +2 -0
  172. package/dist/internal/blocks/ColorModeSwitch.js +2 -0
  173. package/dist/internal/blocks/Command.js +2 -0
  174. package/dist/internal/blocks/CopyField.js +2 -0
  175. package/dist/internal/blocks/DashboardHero.js +59 -0
  176. package/dist/internal/blocks/DashboardHero.js.map +1 -0
  177. package/dist/internal/blocks/DateInput.js +2 -0
  178. package/dist/internal/blocks/DateRangeInput.js +2 -0
  179. package/dist/internal/blocks/EmptyConfigurationActionCard.js +16 -0
  180. package/dist/internal/blocks/EmptyConfigurationActionCard.js.map +1 -0
  181. package/dist/internal/blocks/EmptyState.js +142 -0
  182. package/dist/internal/blocks/EmptyState.js.map +1 -0
  183. package/dist/internal/blocks/ErrorState.js +179 -0
  184. package/dist/internal/blocks/ErrorState.js.map +1 -0
  185. package/dist/internal/blocks/ExportMenu.js +41 -0
  186. package/dist/internal/blocks/ExportMenu.js.map +1 -0
  187. package/dist/internal/blocks/Form.js +2 -0
  188. package/dist/internal/blocks/FormGroup.js +2 -0
  189. package/dist/internal/blocks/GoogleButton.js +95 -0
  190. package/dist/internal/blocks/GoogleButton.js.map +1 -0
  191. package/dist/internal/blocks/MicrosoftButton.js +64 -0
  192. package/dist/internal/blocks/MicrosoftButton.js.map +1 -0
  193. package/dist/internal/blocks/MultiActionButtonGroup.js +2 -0
  194. package/dist/internal/blocks/MultiCombobox.js +188 -0
  195. package/dist/internal/blocks/MultiCombobox.js.map +1 -0
  196. package/dist/internal/blocks/NumberInput.js +44 -0
  197. package/dist/internal/blocks/NumberInput.js.map +1 -0
  198. package/dist/internal/blocks/OtpInput.js +2 -0
  199. package/dist/internal/blocks/PageHeader.js +2 -0
  200. package/dist/internal/blocks/PageLayout.js +2 -0
  201. package/dist/internal/blocks/PageToolbar.js +2 -0
  202. package/dist/internal/blocks/PasswordInput.js +97 -0
  203. package/dist/internal/blocks/PasswordInput.js.map +1 -0
  204. package/dist/internal/blocks/SearchInput.js +2 -0
  205. package/dist/internal/blocks/SearchInputWithNavigation.js +65 -0
  206. package/dist/internal/blocks/SearchInputWithNavigation.js.map +1 -0
  207. package/dist/internal/blocks/SectionNav.js +2 -0
  208. package/dist/internal/blocks/SplitButton.js +46 -0
  209. package/dist/internal/blocks/SplitButton.js.map +1 -0
  210. package/dist/internal/blocks/StatCard.js +97 -0
  211. package/dist/internal/blocks/StatCard.js.map +1 -0
  212. package/dist/internal/blocks/TextInput.js +2 -0
  213. package/dist/internal/blocks/Textarea.js +32 -0
  214. package/dist/internal/blocks/Textarea.js.map +1 -0
  215. package/dist/internal/blocks/TimeInput.js +77 -0
  216. package/dist/internal/blocks/TimeInput.js.map +1 -0
  217. package/dist/internal/components/Alert.js +2 -0
  218. package/dist/internal/components/AlertModal.js +2 -0
  219. package/dist/internal/components/Avatar.js +53 -0
  220. package/dist/internal/components/Avatar.js.map +1 -0
  221. package/dist/internal/components/Badge.js +2 -0
  222. package/dist/internal/components/BrandLogo.js +2 -0
  223. package/dist/internal/components/Breadcrumb.js +2 -0
  224. package/dist/internal/components/Button.js +2 -0
  225. package/dist/internal/components/ButtonGroup.js +66 -0
  226. package/dist/internal/components/ButtonGroup.js.map +1 -0
  227. package/dist/internal/components/Calendar.js +2 -0
  228. package/dist/internal/components/Card.js +2 -0
  229. package/dist/internal/components/Checkbox.js +2 -0
  230. package/dist/internal/components/Clipboard.js +2 -0
  231. package/dist/internal/components/Collapsible.js +2 -0
  232. package/dist/internal/components/CollapsiblePanel.js +87 -0
  233. package/dist/internal/components/CollapsiblePanel.js.map +1 -0
  234. package/dist/internal/components/Combobox.js +2 -0
  235. package/dist/internal/components/DatePicker.js +2 -0
  236. package/dist/internal/components/DateRangePicker.js +2 -0
  237. package/dist/internal/components/DiffView.js +2 -0
  238. package/dist/internal/components/DotsLoader.js +18 -0
  239. package/dist/internal/components/DotsLoader.js.map +1 -0
  240. package/dist/internal/components/DropdownMenu.js +2 -0
  241. package/dist/internal/components/EmptySearchContent.js +12 -0
  242. package/dist/internal/components/EmptySearchContent.js.map +1 -0
  243. package/dist/internal/components/FileUpload.js +2 -0
  244. package/dist/internal/components/FullScreenModal.js +2 -0
  245. package/dist/internal/components/HelpBlock.js +25 -0
  246. package/dist/internal/components/HelpBlock.js.map +1 -0
  247. package/dist/internal/components/HoverCard.js +2 -0
  248. package/dist/internal/components/InputGroup.js +2 -0
  249. package/dist/internal/components/Kbd.js +2 -0
  250. package/dist/internal/components/Label.js +39 -0
  251. package/dist/internal/components/Label.js.map +1 -0
  252. package/dist/internal/components/Link.js +22 -0
  253. package/dist/internal/components/Link.js.map +1 -0
  254. package/dist/internal/components/MarkedText.js +2 -0
  255. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +20 -0
  256. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js.map +1 -0
  257. package/dist/internal/components/MergeEditor/PaneHeader.js +13 -0
  258. package/dist/internal/components/MergeEditor/PaneHeader.js.map +1 -0
  259. package/dist/internal/components/MergeEditor/constants.js +18 -0
  260. package/dist/internal/components/MergeEditor/constants.js.map +1 -0
  261. package/dist/internal/components/MergeEditor/useMergeDiff.js +2 -0
  262. package/dist/internal/components/Modal.js +2 -0
  263. package/dist/internal/components/Navbar.js +2 -0
  264. package/dist/internal/components/Pagination.js +2 -0
  265. package/dist/internal/components/PanelWithDetails.js +31 -0
  266. package/dist/internal/components/PanelWithDetails.js.map +1 -0
  267. package/dist/internal/components/Popconfirm.js +2 -0
  268. package/dist/internal/components/Popover.js +2 -0
  269. package/dist/internal/components/Progress.js +47 -0
  270. package/dist/internal/components/Progress.js.map +1 -0
  271. package/dist/internal/components/RadioGroup.js +2 -0
  272. package/dist/internal/components/Resizable.js +2 -0
  273. package/dist/internal/components/ScrollArea.js +42 -0
  274. package/dist/internal/components/ScrollArea.js.map +1 -0
  275. package/dist/internal/components/Search.js +2 -0
  276. package/dist/internal/components/Select.js +2 -0
  277. package/dist/internal/components/Separator.js +84 -0
  278. package/dist/internal/components/Separator.js.map +1 -0
  279. package/dist/internal/components/Sheet.js +2 -0
  280. package/dist/internal/components/Sidebar.js +2 -0
  281. package/dist/internal/components/Skeleton/Skeleton.js +39 -0
  282. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -0
  283. package/dist/internal/components/Skeleton/SkeletonList.js +41 -0
  284. package/dist/internal/components/Skeleton/SkeletonList.js.map +1 -0
  285. package/dist/internal/components/Slider.js +2 -0
  286. package/dist/internal/components/SpotlightBackdrop.js +132 -0
  287. package/dist/internal/components/SpotlightBackdrop.js.map +1 -0
  288. package/dist/internal/components/Stepper.js +2 -0
  289. package/dist/internal/components/Switch.js +2 -0
  290. package/dist/internal/components/Table.js +2 -0
  291. package/dist/internal/components/Tabs.js +2 -0
  292. package/dist/internal/components/ThemeProvider.js +3 -0
  293. package/dist/internal/components/TimePicker.js +2 -0
  294. package/dist/internal/components/Timeline.js +2 -0
  295. package/dist/internal/components/Toast.js +3 -0
  296. package/dist/internal/components/Toggle.js +169 -0
  297. package/dist/internal/components/Toggle.js.map +1 -0
  298. package/dist/internal/components/ToggleGroup.js +2 -0
  299. package/dist/internal/components/Tooltip.js +2 -0
  300. package/dist/internal/components/Truncated.js +45 -0
  301. package/dist/internal/components/Truncated.js.map +1 -0
  302. package/dist/internal/components/Workbench.js +2 -0
  303. package/dist/internal/components/ZoomableSvg.js +2 -0
  304. package/dist/internal/hooks/useAutosizeInput.js +77 -0
  305. package/dist/internal/hooks/useAutosizeInput.js.map +1 -0
  306. package/dist/internal/hooks/useScrollbarPosition.js +45 -0
  307. package/dist/internal/hooks/useScrollbarPosition.js.map +1 -0
  308. package/dist/internal/hooks/useStableCallback.js +29 -0
  309. package/dist/internal/hooks/useStableCallback.js.map +1 -0
  310. package/dist/internal/utils/mergeRefs.js +20 -0
  311. package/dist/internal/utils/mergeRefs.js.map +1 -0
  312. package/dist/internal/utils.js +5 -0
  313. package/dist/markdown-editor.d.ts +72 -72
  314. package/dist/markdown-editor.js +1122 -1193
  315. package/dist/markdown-editor.js.map +1 -1
  316. package/dist/mermaid.d.ts +12 -12
  317. package/dist/mermaid.js +2 -10
  318. package/dist/rjsf.d.ts +33 -34
  319. package/dist/rjsf.js +1543 -1600
  320. package/dist/rjsf.js.map +1 -1
  321. package/dist/rolldown-runtime-Bdc48AWt.js +33 -0
  322. package/dist/styles-DSUP_-9Z.js +158 -0
  323. package/dist/styles-DSUP_-9Z.js.map +1 -0
  324. package/dist/styles.css +1 -1
  325. package/dist/testing.d.ts +8 -7
  326. package/dist/testing.js +36 -16
  327. package/dist/testing.js.map +1 -1
  328. package/dist/themeTokens-BNg98Mu9.js +85 -0
  329. package/dist/themeTokens-BNg98Mu9.js.map +1 -0
  330. package/dist/toast-CjkURw0M.js +184 -0
  331. package/dist/toast-CjkURw0M.js.map +1 -0
  332. package/dist/useColorSchemeState-CYqcUfSH.js +61 -0
  333. package/dist/useColorSchemeState-CYqcUfSH.js.map +1 -0
  334. package/dist/useControllableState-M6494mCT.js +31 -0
  335. package/dist/useControllableState-M6494mCT.js.map +1 -0
  336. package/dist/useElement-DkF6esWL.js +15 -0
  337. package/dist/useElement-DkF6esWL.js.map +1 -0
  338. package/dist/useMergeDiff-CvowEXJ1.js +465 -0
  339. package/dist/useMergeDiff-CvowEXJ1.js.map +1 -0
  340. package/dist/utils-D0c5VAyF.js +308 -0
  341. package/dist/utils-D0c5VAyF.js.map +1 -0
  342. package/package.json +10 -9
  343. package/src/styles.css +35 -7
  344. package/src/theme.css +64 -0
  345. package/dist/MermaidDiagram-EOKJHQQV.js +0 -10
  346. package/dist/MermaidDiagram-EOKJHQQV.js.map +0 -1
  347. package/dist/chunk-63NSN2VL.js +0 -274
  348. package/dist/chunk-63NSN2VL.js.map +0 -1
  349. package/dist/chunk-6FPEI4EM.js +0 -6683
  350. package/dist/chunk-6FPEI4EM.js.map +0 -1
  351. package/dist/chunk-7PUUHEJQ.js +0 -1313
  352. package/dist/chunk-7PUUHEJQ.js.map +0 -1
  353. package/dist/chunk-BOHNXTMM.js +0 -606
  354. package/dist/chunk-BOHNXTMM.js.map +0 -1
  355. package/dist/chunk-C3L3TBBT.js +0 -242
  356. package/dist/chunk-C3L3TBBT.js.map +0 -1
  357. package/dist/chunk-CTCFYWJC.js +0 -407
  358. package/dist/chunk-CTCFYWJC.js.map +0 -1
  359. package/dist/chunk-ESBL3IPF.js +0 -23
  360. package/dist/chunk-ESBL3IPF.js.map +0 -1
  361. package/dist/chunk-IJTHFNNJ.js +0 -261
  362. package/dist/chunk-IJTHFNNJ.js.map +0 -1
  363. package/dist/chunk-JP7PNHLH.js +0 -40
  364. package/dist/chunk-JP7PNHLH.js.map +0 -1
  365. package/dist/chunk-KPNAW5MU.js +0 -229
  366. package/dist/chunk-KPNAW5MU.js.map +0 -1
  367. package/dist/chunk-L37JJ6MR.js +0 -152
  368. package/dist/chunk-L37JJ6MR.js.map +0 -1
  369. package/dist/chunk-Q7NWXLCT.js +0 -90
  370. package/dist/chunk-Q7NWXLCT.js.map +0 -1
  371. package/dist/chunk-SYIEF644.js +0 -1016
  372. package/dist/chunk-SYIEF644.js.map +0 -1
  373. package/dist/chunk-VMFSRV5H.js +0 -16
  374. package/dist/chunk-VMFSRV5H.js.map +0 -1
  375. package/dist/chunk-VPPM7UUQ.js +0 -47
  376. package/dist/chunk-VPPM7UUQ.js.map +0 -1
  377. package/dist/chunk-XV3UUOYF.js +0 -845
  378. package/dist/chunk-XV3UUOYF.js.map +0 -1
  379. package/dist/constants-D3gaMY-W.d.ts +0 -39
  380. package/dist/icons.js.map +0 -1
  381. package/dist/index.js.map +0 -1
  382. package/dist/mermaid.js.map +0 -1
@@ -0,0 +1,308 @@
1
+ import { cn } from "./classNames-BzrkDnOD.js";
2
+ import { useArgoDesign } from "./context-KxxeMHbR.js";
3
+ import { Slot } from "@radix-ui/react-slot";
4
+ import { useEffect, useState } from "react";
5
+ import { Content, Portal, Provider, Root as Root$1, Trigger } from "@radix-ui/react-tooltip";
6
+ import { cva } from "class-variance-authority";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/utils/copyToClipboard.ts
9
+ /**
10
+ * The async Clipboard API requires the document to be focused and rejects with
11
+ * `NotAllowedError: Document is not focused` otherwise — which is the normal state
12
+ * for a page inside an iframe that has not taken focus, such as Storybook's canvas
13
+ * or an embedded preview. `execCommand` has no such requirement because it copies
14
+ * the selection of a node we focus ourselves, so it covers that gap.
15
+ */
16
+ const copyViaSelection = (text) => {
17
+ const node = document.createElement("textarea");
18
+ node.value = text;
19
+ node.setAttribute("readonly", "");
20
+ node.style.cssText = "position:fixed;top:0;left:0;opacity:0";
21
+ document.body.append(node);
22
+ node.select();
23
+ try {
24
+ return document.execCommand("copy");
25
+ } finally {
26
+ node.remove();
27
+ }
28
+ };
29
+ const copyToClipboard = async (text) => {
30
+ try {
31
+ await navigator.clipboard.writeText(text);
32
+ } catch (error) {
33
+ if (!copyViaSelection(text)) throw error;
34
+ }
35
+ };
36
+ //#endregion
37
+ //#region src/utils/createChangeInputEvent.ts
38
+ const createChangeInputEvent = (input) => {
39
+ const changeEvent = {
40
+ target: input,
41
+ currentTarget: input,
42
+ type: "change",
43
+ nativeEvent: new Event("change", { bubbles: true }),
44
+ bubbles: true,
45
+ cancelable: false,
46
+ defaultPrevented: false,
47
+ eventPhase: 2,
48
+ isTrusted: false,
49
+ preventDefault: () => {},
50
+ isDefaultPrevented: () => false,
51
+ stopPropagation: () => {},
52
+ isPropagationStopped: () => false,
53
+ persist: () => {},
54
+ timeStamp: Date.now()
55
+ };
56
+ Object.defineProperty(changeEvent, "target", {
57
+ value: input,
58
+ writable: false
59
+ });
60
+ return changeEvent;
61
+ };
62
+ //#endregion
63
+ //#region src/constants/keyCodes.ts
64
+ const keyCodes = {
65
+ ENTER: "Enter",
66
+ ESCAPE: "Escape",
67
+ SPACE: " "
68
+ };
69
+ //#endregion
70
+ //#region src/components/Tooltip/TooltipContent.tsx
71
+ const tooltipVariants = cva([
72
+ "tailwindcss-preflight",
73
+ "tw:inline-block",
74
+ "tw:break-anywhere",
75
+ "tw:max-h-96",
76
+ "tw:overflow-y-auto",
77
+ "tw:z-[1060]",
78
+ "tw:rounded",
79
+ "tw:bg-neutral-800",
80
+ "tw:text-white",
81
+ "tw:data-[argo=true]:rounded-2xl",
82
+ "tw:data-[argo=true]:border",
83
+ "tw:data-[argo=true]:border-solid",
84
+ "tw:data-[argo=true]:border-border",
85
+ "tw:data-[argo=true]:bg-popover",
86
+ "tw:data-[argo=true]:text-popover-foreground",
87
+ "tw:data-[argo=true]:shadow-md",
88
+ "tw:data-[argo=true]:data-[state=delayed-open]:animate-in",
89
+ "tw:data-[argo=true]:data-[state=instant-open]:animate-in",
90
+ "tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0",
91
+ "tw:data-[argo=true]:data-[state=instant-open]:fade-in-0",
92
+ "tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95",
93
+ "tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95",
94
+ "tw:data-[argo=true]:data-[state=closed]:animate-out",
95
+ "tw:data-[argo=true]:data-[state=closed]:fade-out-0",
96
+ "tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
97
+ "tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2",
98
+ "tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2",
99
+ "tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2",
100
+ "tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2"
101
+ ], {
102
+ defaultVariants: { variant: "action" },
103
+ variants: { variant: {
104
+ action: [
105
+ "tw:max-w-fit",
106
+ "tw:px-3",
107
+ "tw:py-2",
108
+ "tw:text-center",
109
+ "tw:text-xs",
110
+ "tw:font-medium",
111
+ "tw:uppercase",
112
+ "tw:tracking-wider",
113
+ "tw:[[data-brand=keboola]_&]:normal-case",
114
+ "tw:[[data-brand=keboola]_&]:tracking-normal"
115
+ ],
116
+ explanatory: [
117
+ "tw:max-w-80",
118
+ "tw:px-4",
119
+ "tw:py-3",
120
+ "tw:text-left",
121
+ "tw:text-sm",
122
+ "tw:font-normal"
123
+ ]
124
+ } }
125
+ });
126
+ const TooltipContent = ({ className, variant, keepOpenOnPointerDownOutside = false, children, onPointerDownOutside, sideOffset = 8, collisionPadding = 8, hideWhenDetached = true, placement = "right", ...rest }) => {
127
+ const renderArgo = useArgoDesign();
128
+ const handlePointerDownOutside = (event) => {
129
+ if (keepOpenOnPointerDownOutside) event.preventDefault();
130
+ onPointerDownOutside?.(event);
131
+ };
132
+ return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(Content, {
133
+ ...rest,
134
+ "data-tooltip-content": renderArgo ? void 0 : true,
135
+ "data-argo": renderArgo,
136
+ sideOffset,
137
+ collisionPadding,
138
+ onPointerDownOutside: handlePointerDownOutside,
139
+ className: tooltipVariants({
140
+ className,
141
+ variant
142
+ }),
143
+ hideWhenDetached,
144
+ side: placement,
145
+ children
146
+ }) });
147
+ };
148
+ //#endregion
149
+ //#region src/components/Tooltip/TooltipRoot.tsx
150
+ const DELAY_SHOW_TOOLTIP = 300;
151
+ const TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }) => /* @__PURE__ */ jsx(Root$1, {
152
+ ...rest,
153
+ delayDuration,
154
+ children
155
+ });
156
+ //#endregion
157
+ //#region src/components/Tooltip/TooltipTrigger.tsx
158
+ /**
159
+ * Radix stamps the tooltip's own open/closed `data-state` onto the trigger. Merged onto an
160
+ * `asChild` child that keeps a `data-state` of its own — `ToggleGroup.Item`, `Switch`, a `Tabs`
161
+ * trigger — it wins, because those primitives spread incoming props *after* their own attribute.
162
+ * The child then silently loses every `data-[state=…]` style it has, which is usually the only
163
+ * thing marking it as selected.
164
+ *
165
+ * The tooltip's trigger state is styled nowhere, so it is dropped before it reaches the child.
166
+ */
167
+ const WithoutTooltipState = ({ children, ...props }) => {
168
+ const { "data-state": _tooltipState, ...rest } = props;
169
+ return /* @__PURE__ */ jsx(Slot, {
170
+ ...rest,
171
+ children
172
+ });
173
+ };
174
+ const TooltipTrigger = ({ ref, children, className, keepOpenOnClick = false, onClick, onPointerDown, asChild, ...rest }) => {
175
+ const handleClick = (event) => {
176
+ if (keepOpenOnClick) event.preventDefault();
177
+ onClick?.(event);
178
+ };
179
+ const handlePointerDown = (event) => {
180
+ if (keepOpenOnClick) event.preventDefault();
181
+ onPointerDown?.(event);
182
+ };
183
+ return /* @__PURE__ */ jsx(Trigger, {
184
+ ...rest,
185
+ asChild: true,
186
+ ref,
187
+ className: cn("tailwindcss-preflight", className),
188
+ onClick: handleClick,
189
+ onPointerDown: handlePointerDown,
190
+ children: asChild ? /* @__PURE__ */ jsx(WithoutTooltipState, { children }) : /* @__PURE__ */ jsx("span", {
191
+ className: "tw:inline-flex tw:items-center",
192
+ children
193
+ })
194
+ });
195
+ };
196
+ //#endregion
197
+ //#region src/components/Tooltip/Tooltip.tsx
198
+ const ACTION_TOOLTIP_LIMIT = 30;
199
+ /** Re-export of Radix `Tooltip.Provider`. Mount once at the app root so tooltips share delay state. */
200
+ const TooltipProvider = Provider;
201
+ /**
202
+ * Short plain-text label that appears on hover or focus.
203
+ *
204
+ * **When to use:** describing an icon-only `Button`, explaining a disabled control, or labelling a
205
+ * truncated value. Plain text only — auto-switches to the longer `"explanatory"` variant when the string
206
+ * exceeds 30 characters.
207
+ * **When NOT to use:** for rich preview content (multiple lines, formatted text, structured data) use
208
+ * `HoverCard`; for tooltips containing links or buttons use `Popover` (interactive elements break a11y
209
+ * inside a `Tooltip`).
210
+ * **Composition:** wrap any focusable element via `triggerAsChild` so the tooltip targets the underlying
211
+ * native element. Mount `TooltipProvider` once at the app root.
212
+ *
213
+ * @see RECIPES.md#disabled-button-tooltip — for the disabled-button + tooltip pattern
214
+ */
215
+ const Tooltip = ({ tooltip, children, className, keepOpenOnTriggerClick = false, variant, placement = "right", forceHide = false, forceShow = false, delayDuration, triggerAsChild = false }) => {
216
+ const [open, setOpen] = useState(false);
217
+ const resolvedVariant = (() => {
218
+ if (!!variant) return variant;
219
+ if (typeof tooltip === "string" && tooltip.length > ACTION_TOOLTIP_LIMIT) return "explanatory";
220
+ return "action";
221
+ })();
222
+ const isActionVariant = resolvedVariant === "action";
223
+ const handleKeyUp = (event) => {
224
+ if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;
225
+ event.stopPropagation();
226
+ };
227
+ return /* @__PURE__ */ jsxs(TooltipRoot, {
228
+ open: !!tooltip && (open || forceShow) && !forceHide,
229
+ onOpenChange: setOpen,
230
+ delayDuration,
231
+ disableHoverableContent: isActionVariant,
232
+ children: [/* @__PURE__ */ jsx(TooltipTrigger, {
233
+ asChild: triggerAsChild,
234
+ keepOpenOnClick: keepOpenOnTriggerClick,
235
+ onKeyUp: handleKeyUp,
236
+ children
237
+ }), /* @__PURE__ */ jsx(TooltipContent, {
238
+ className,
239
+ variant: resolvedVariant,
240
+ placement,
241
+ keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
242
+ children: tooltip
243
+ })]
244
+ });
245
+ };
246
+ Tooltip.Root = TooltipRoot;
247
+ Tooltip.Content = TooltipContent;
248
+ Tooltip.Trigger = TooltipTrigger;
249
+ //#endregion
250
+ //#region src/utils/decorators.tsx
251
+ const withTooltipProvider = (Story) => /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsx(Story, {}) });
252
+ const withHiddenFullscreen = (Story) => /* @__PURE__ */ jsx("div", {
253
+ className: "tw:[&_[aria-label=Fullscreen]]:hidden",
254
+ children: /* @__PURE__ */ jsx(Story, {})
255
+ });
256
+ //#endregion
257
+ //#region src/utils/createPrefixedString.ts
258
+ const createPrefixedString = (prefix) => (literals) => literals.reduce((acc, literal) => acc + literal, `${prefix}-`);
259
+ //#endregion
260
+ //#region src/utils/noop.ts
261
+ const noop = () => void 0;
262
+ //#endregion
263
+ //#region src/utils/debounce.ts
264
+ const debounce = (fn, delay) => {
265
+ let timeoutId;
266
+ const debounced = (...args) => {
267
+ clearTimeout(timeoutId);
268
+ timeoutId = setTimeout(() => fn(...args), delay);
269
+ };
270
+ debounced.cancel = () => clearTimeout(timeoutId);
271
+ return debounced;
272
+ };
273
+ //#endregion
274
+ //#region src/utils/isMac.ts
275
+ const getIsMac = () => {
276
+ if (typeof navigator !== "undefined" && "userAgentData" in navigator) {
277
+ const platform = navigator.userAgentData.platform;
278
+ if (typeof platform === "string") return platform.toLowerCase() === "macos";
279
+ }
280
+ if (typeof navigator !== "undefined" && typeof navigator.platform === "string") return navigator.platform.toUpperCase().indexOf("MAC") >= 0;
281
+ return false;
282
+ };
283
+ const isMac = getIsMac();
284
+ //#endregion
285
+ //#region src/utils/useSHA256.ts
286
+ const sha256 = async (text) => {
287
+ const msgUint8 = new TextEncoder().encode(text);
288
+ const hashBuffer = await crypto.subtle.digest("SHA-256", msgUint8);
289
+ return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
290
+ };
291
+ const useSHA256 = (text) => {
292
+ const [hash, setHash] = useState("");
293
+ useEffect(() => {
294
+ if (!text) return;
295
+ let cancelled = false;
296
+ sha256(text).then((h) => {
297
+ if (!cancelled) setHash(h);
298
+ });
299
+ return () => {
300
+ cancelled = true;
301
+ };
302
+ }, [text]);
303
+ return text ? hash : "";
304
+ };
305
+ //#endregion
306
+ export { Tooltip, TooltipProvider, copyToClipboard, createChangeInputEvent, createPrefixedString, debounce, isMac, keyCodes, noop, useSHA256, withHiddenFullscreen, withTooltipProvider };
307
+
308
+ //# sourceMappingURL=utils-D0c5VAyF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-D0c5VAyF.js","names":["Root"],"sources":["../src/utils/copyToClipboard.ts","../src/utils/createChangeInputEvent.ts","../src/constants/keyCodes.ts","../src/components/Tooltip/TooltipContent.tsx","../src/components/Tooltip/TooltipRoot.tsx","../src/components/Tooltip/TooltipTrigger.tsx","../src/components/Tooltip/Tooltip.tsx","../src/utils/decorators.tsx","../src/utils/createPrefixedString.ts","../src/utils/noop.ts","../src/utils/debounce.ts","../src/utils/isMac.ts","../src/utils/useSHA256.ts"],"sourcesContent":["/**\n * The async Clipboard API requires the document to be focused and rejects with\n * `NotAllowedError: Document is not focused` otherwise — which is the normal state\n * for a page inside an iframe that has not taken focus, such as Storybook's canvas\n * or an embedded preview. `execCommand` has no such requirement because it copies\n * the selection of a node we focus ourselves, so it covers that gap.\n */\nconst copyViaSelection = (text: string) => {\n const node = document.createElement('textarea');\n node.value = text;\n node.setAttribute('readonly', '');\n node.style.cssText = 'position:fixed;top:0;left:0;opacity:0';\n document.body.append(node);\n node.select();\n\n try {\n return document.execCommand('copy');\n } finally {\n node.remove();\n }\n};\n\nexport const copyToClipboard = async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n } catch (error) {\n if (!copyViaSelection(text)) throw error;\n }\n};\n","import type { ChangeEvent } from 'react';\n\nexport const createChangeInputEvent = (input: HTMLInputElement) => {\n const changeEvent: ChangeEvent<HTMLInputElement> = {\n target: input,\n currentTarget: input,\n type: 'change',\n nativeEvent: new Event('change', { bubbles: true }),\n bubbles: true,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 2, // AT_TARGET\n isTrusted: false, // Synthetic events are not trusted\n preventDefault: () => {}, // Provide dummy functions if not needed\n isDefaultPrevented: () => false,\n stopPropagation: () => {},\n isPropagationStopped: () => false,\n persist: () => {},\n timeStamp: Date.now(),\n };\n\n Object.defineProperty(changeEvent, 'target', {\n value: input,\n writable: false,\n });\n\n return changeEvent;\n};\n","export const keyCodes = {\n ENTER: 'Enter',\n ESCAPE: 'Escape',\n SPACE: ' ',\n};\n","import type { ComponentProps } from 'react';\nimport { Content, Portal } from '@radix-ui/react-tooltip';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nconst tooltipVariants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:inline-block',\n 'tw:break-anywhere',\n 'tw:max-h-96',\n 'tw:overflow-y-auto',\n 'tw:z-[1060]',\n\n // legacy (dark) chrome — default\n 'tw:rounded',\n 'tw:bg-neutral-800',\n 'tw:text-white',\n\n // argo chrome overrides — semantic floating-panel tokens\n 'tw:data-[argo=true]:rounded-2xl',\n 'tw:data-[argo=true]:border',\n 'tw:data-[argo=true]:border-solid',\n 'tw:data-[argo=true]:border-border',\n 'tw:data-[argo=true]:bg-popover',\n 'tw:data-[argo=true]:text-popover-foreground',\n 'tw:data-[argo=true]:shadow-md',\n\n // argo open animation\n 'tw:data-[argo=true]:data-[state=delayed-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=instant-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=instant-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95',\n 'tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95',\n\n // argo closed animation\n 'tw:data-[argo=true]:data-[state=closed]:animate-out',\n 'tw:data-[argo=true]:data-[state=closed]:fade-out-0',\n 'tw:data-[argo=true]:data-[state=closed]:zoom-out-95',\n\n // argo position animation\n 'tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2',\n 'tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2',\n 'tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2',\n 'tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2',\n ],\n {\n defaultVariants: {\n variant: 'action',\n },\n variants: {\n variant: {\n action: [\n 'tw:max-w-fit',\n 'tw:px-3',\n 'tw:py-2',\n\n 'tw:text-center',\n 'tw:text-xs',\n 'tw:font-medium',\n // Legacy chrome uppercases the action tooltip; the Keboola V2 brand\n // (`data-brand=\"keboola\"`) renders it in standard case instead.\n 'tw:uppercase',\n 'tw:tracking-wider',\n 'tw:[[data-brand=keboola]_&]:normal-case',\n 'tw:[[data-brand=keboola]_&]:tracking-normal',\n ],\n explanatory: [\n 'tw:max-w-80',\n 'tw:px-4',\n 'tw:py-3',\n 'tw:text-left',\n\n 'tw:text-sm',\n 'tw:font-normal',\n ],\n },\n },\n },\n);\n\ntype Props = {\n keepOpenOnPointerDownOutside?: boolean;\n placement?: ComponentProps<typeof Content>['side'];\n} & Omit<ComponentProps<typeof Content>, 'side'> &\n VariantProps<typeof tooltipVariants>;\n\nexport const TooltipContent = ({\n className,\n variant,\n keepOpenOnPointerDownOutside = false,\n children,\n onPointerDownOutside,\n sideOffset = 8,\n collisionPadding = 8,\n hideWhenDetached = true,\n placement = 'right',\n ...rest\n}: Props) => {\n const renderArgo = useArgoDesign();\n\n const handlePointerDownOutside: ComponentProps<typeof Content>['onPointerDownOutside'] = (\n event,\n ) => {\n if (keepOpenOnPointerDownOutside) event.preventDefault();\n onPointerDownOutside?.(event);\n };\n\n return (\n <Portal>\n <Content\n {...rest}\n // Marks the dark (non-argo) tooltip chrome so styles.css can invert\n // nested `.tw\\:prose` for contrast.\n data-tooltip-content={renderArgo ? undefined : true}\n data-argo={renderArgo}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n onPointerDownOutside={handlePointerDownOutside}\n className={tooltipVariants({ className, variant })}\n hideWhenDetached={hideWhenDetached}\n side={placement}\n >\n {children}\n </Content>\n </Portal>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Root } from '@radix-ui/react-tooltip';\n\ntype Props = ComponentProps<typeof Root>;\n\nconst DELAY_SHOW_TOOLTIP = 300;\n\nexport const TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }: Props) => (\n <Root {...rest} delayDuration={delayDuration}>\n {children}\n </Root>\n);\n","import type { ComponentProps } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { Trigger } from '@radix-ui/react-tooltip';\n\nimport { cn } from '../../utils';\n\n/**\n * Radix stamps the tooltip's own open/closed `data-state` onto the trigger. Merged onto an\n * `asChild` child that keeps a `data-state` of its own — `ToggleGroup.Item`, `Switch`, a `Tabs`\n * trigger — it wins, because those primitives spread incoming props *after* their own attribute.\n * The child then silently loses every `data-[state=…]` style it has, which is usually the only\n * thing marking it as selected.\n *\n * The tooltip's trigger state is styled nowhere, so it is dropped before it reaches the child.\n */\nconst WithoutTooltipState = ({\n children,\n ...props\n // `Slot`'s own props, plus the one attribute this exists to remove: React's types declare no\n // `data-*`, so it has to be named to be destructured away.\n}: ComponentProps<typeof Slot> & { 'data-state'?: string }) => {\n const { 'data-state': _tooltipState, ...rest } = props;\n\n return <Slot {...rest}>{children}</Slot>;\n};\n\ntype Props = {\n keepOpenOnClick?: boolean;\n} & ComponentProps<typeof Trigger>;\n\nexport const TooltipTrigger = ({\n ref,\n children,\n className,\n keepOpenOnClick = false,\n onClick,\n onPointerDown,\n asChild,\n ...rest\n}: Props) => {\n const handleClick: ComponentProps<typeof Trigger>['onClick'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onClick?.(event);\n };\n\n const handlePointerDown: ComponentProps<typeof Trigger>['onPointerDown'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onPointerDown?.(event);\n };\n\n return (\n <Trigger\n {...rest}\n asChild\n ref={ref}\n className={cn('tailwindcss-preflight', className)}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n >\n {asChild ? (\n <WithoutTooltipState>{children}</WithoutTooltipState>\n ) : (\n // Default-mode trigger wraps children in a span so Radix has a\n // single DOM element to attach handlers to. `tailwindcss-preflight`\n // (merged in via Slot) activates Tailwind's preflight inside the\n // span, which sets `svg { display: block }` — without an inline-flex\n // container that would stack any bare Lucide icon onto its own\n // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.\n <span className=\"tw:inline-flex tw:items-center\">{children}</span>\n )}\n </Trigger>\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport type { Content, Trigger } from '@radix-ui/react-tooltip';\nimport { Provider } from '@radix-ui/react-tooltip';\n\nimport { keyCodes } from '../../constants/keyCodes';\n\nimport { TooltipContent } from './TooltipContent';\nimport { TooltipRoot } from './TooltipRoot';\nimport { TooltipTrigger } from './TooltipTrigger';\n\nconst ACTION_TOOLTIP_LIMIT = 30;\n\ntype TriggerProps = {\n triggerAsChild?: boolean;\n};\n\n/**\n * Props for `Tooltip`. `tooltip` is the popup content; `children` is the trigger element.\n * `variant` auto-resolves to `\"explanatory\"` for strings >30 chars, else `\"action\"`.\n */\nexport type Props = {\n /** Keep the tooltip visible when the user clicks the trigger (useful for click-to-copy feedback). */\n keepOpenOnTriggerClick?: boolean;\n /** Content rendered inside the tooltip. Plain text only — no interactive elements (use `HoverCard` or `Popover` for that). */\n tooltip: ReactNode;\n children: ReactNode;\n placement?: ComponentProps<typeof Content>['side'];\n /** Forcibly hide the tooltip regardless of hover state. */\n forceHide?: boolean;\n /** Forcibly show the tooltip regardless of hover state. Useful for guided-tour overlays. */\n forceShow?: boolean;\n /** Hover delay before the tooltip opens, in ms. Defaults to the shared 300ms. */\n delayDuration?: number;\n className?: string;\n} & TriggerProps &\n Pick<ComponentProps<typeof TooltipContent>, 'variant' | 'className'>;\n\n/** Re-export of Radix `Tooltip.Provider`. Mount once at the app root so tooltips share delay state. */\nexport const TooltipProvider = Provider;\n\n/**\n * Short plain-text label that appears on hover or focus.\n *\n * **When to use:** describing an icon-only `Button`, explaining a disabled control, or labelling a\n * truncated value. Plain text only — auto-switches to the longer `\"explanatory\"` variant when the string\n * exceeds 30 characters.\n * **When NOT to use:** for rich preview content (multiple lines, formatted text, structured data) use\n * `HoverCard`; for tooltips containing links or buttons use `Popover` (interactive elements break a11y\n * inside a `Tooltip`).\n * **Composition:** wrap any focusable element via `triggerAsChild` so the tooltip targets the underlying\n * native element. Mount `TooltipProvider` once at the app root.\n *\n * @see RECIPES.md#disabled-button-tooltip — for the disabled-button + tooltip pattern\n */\nexport const Tooltip = ({\n tooltip,\n children,\n className,\n keepOpenOnTriggerClick = false,\n variant,\n placement = 'right',\n forceHide = false,\n forceShow = false,\n delayDuration,\n // trigger props\n triggerAsChild = false,\n}: Props) => {\n const [open, setOpen] = useState(false);\n\n const resolvedVariant = (() => {\n if (!!variant) return variant;\n if (typeof tooltip === 'string' && tooltip.length > ACTION_TOOLTIP_LIMIT) return 'explanatory';\n\n return 'action';\n })();\n\n const isActionVariant = resolvedVariant === 'action';\n\n const handleKeyUp: ComponentProps<typeof Trigger>['onKeyUp'] = (event) => {\n if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;\n event.stopPropagation();\n };\n\n return (\n <TooltipRoot\n open={!!tooltip && (open || forceShow) && !forceHide}\n onOpenChange={setOpen}\n delayDuration={delayDuration}\n disableHoverableContent={isActionVariant}\n >\n <TooltipTrigger\n asChild={triggerAsChild}\n keepOpenOnClick={keepOpenOnTriggerClick}\n onKeyUp={handleKeyUp}\n >\n {children}\n </TooltipTrigger>\n\n <TooltipContent\n className={className}\n variant={resolvedVariant}\n placement={placement}\n keepOpenOnPointerDownOutside={keepOpenOnTriggerClick}\n >\n {tooltip}\n </TooltipContent>\n </TooltipRoot>\n );\n};\n\nTooltip.Root = TooltipRoot;\nTooltip.Content = TooltipContent;\nTooltip.Trigger = TooltipTrigger;\n","import type { ComponentType } from 'react';\n\nimport { TooltipProvider } from '../components/Tooltip';\n\nexport const withTooltipProvider = (Story: ComponentType) => (\n <TooltipProvider>\n <Story />\n </TooltipProvider>\n);\n\n// position:fixed only fills the Storybook iframe, not the browser window.\nexport const withHiddenFullscreen = (Story: ComponentType) => (\n <div className=\"tw:[&_[aria-label=Fullscreen]]:hidden\">\n <Story />\n </div>\n);\n","export const createPrefixedString = (prefix: string) => (literals: TemplateStringsArray) =>\n literals.reduce((acc, literal) => acc + literal, `${prefix}-`);\n","export const noop = () => void 0;\n","type DebouncedFn<T extends (...args: any[]) => void> = {\n (...args: Parameters<T>): void;\n cancel: () => void;\n};\n\nexport const debounce = <T extends (...args: any[]) => void>(\n fn: T,\n delay: number,\n): DebouncedFn<T> => {\n let timeoutId: ReturnType<typeof setTimeout>;\n const debounced = (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n debounced.cancel = () => clearTimeout(timeoutId);\n return debounced;\n};\n","// Platform detection\ntype NavigatorUAData = {\n platform: string;\n brands: { brand: string; version: string }[];\n mobile: boolean;\n};\n\nconst getIsMac = (): boolean => {\n // Modern approach using navigator.userAgentData\n if (typeof navigator !== 'undefined' && 'userAgentData' in navigator) {\n const platform = (navigator.userAgentData as NavigatorUAData).platform;\n\n if (typeof platform === 'string') {\n return platform.toLowerCase() === 'macos';\n }\n }\n\n if (typeof navigator !== 'undefined' && typeof navigator.platform === 'string') {\n return navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n }\n\n // Server-side rendering fallback\n return false;\n};\n\nexport const isMac = getIsMac();\n","import { useEffect, useState } from 'react';\n\n// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#converting_a_digest_to_a_hex_string\nconst sha256 = async (text: string) => {\n const msgUint8 = new TextEncoder().encode(text);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nexport const useSHA256 = (text?: string) => {\n const [hash, setHash] = useState('');\n\n useEffect(() => {\n if (!text) return;\n let cancelled = false;\n sha256(text).then((h) => {\n if (!cancelled) setHash(h);\n });\n return () => {\n cancelled = true;\n };\n }, [text]);\n\n // Empty input has no hash — derive it during render instead of syncing state\n // in the effect (avoids the extra render and a stale-value frame).\n return text ? hash : '';\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keboola/design",
3
- "version": "10.1.0",
3
+ "version": "11.0.1",
4
4
  "description": "Keboola UI platform design system — shadcn-aligned React primitives, Keboola-branded blocks, and the form bindings built on TanStack Form.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -140,7 +140,7 @@
140
140
  "storybook": "^10.2.19",
141
141
  "tailwindcss": "^4.3.3",
142
142
  "tailwindcss-scoped-preflight": "^4.0.6",
143
- "tsup": "^8.5.1",
143
+ "tsdown": "^0.22.14",
144
144
  "tsx": "^4.19.4",
145
145
  "tw-animate-css": "^1.4.0",
146
146
  "typescript": "npm:@typescript/typescript6@^6.0.2",
@@ -233,18 +233,18 @@
233
233
  "remark-gfm": "^4.0.1",
234
234
  "sonner": "^2.0.7",
235
235
  "tailwind-merge": "^3.6.0",
236
- "@keboola/brand-registry": "^1.8.0",
237
- "@keboola/codemirror-lang-sql": "^0.6.0",
238
- "@keboola/tailwind-config": "^1.0.2"
236
+ "@keboola/codemirror-lang-sql": "^0.7.1",
237
+ "@keboola/tailwind-config": "^1.1.0",
238
+ "@keboola/brand-registry": "^1.9.2"
239
239
  },
240
240
  "scripts": {
241
241
  "dev": "storybook dev -p \"${PORT:-6006}\"",
242
242
  "build-storybook": "storybook build",
243
243
  "transit": "pnpm build",
244
244
  "build": "pnpm build:js && pnpm build:css",
245
- "build:js": "tsup",
245
+ "build:js": "tsdown",
246
246
  "build:css": "tailwindcss -i src/styles.css -o dist/styles.css --minify",
247
- "build:check": "attw --pack . --profile esm-only --exclude-entrypoints ./styles ./styles/compiled ./theme",
247
+ "build:check": "node ../../tooling/check-dist-exports.mjs && attw --pack . --profile esm-only --exclude-entrypoints ./styles ./styles/compiled ./theme",
248
248
  "test": "vitest run --config vite.config.ts --passWithNoTests --reporter=dot",
249
249
  "test:stories": "vitest run --config vitest.config.ts",
250
250
  "test:stories:coverage": "vitest run --config vitest.config.ts --coverage",
@@ -257,13 +257,14 @@
257
257
  "lint:format": "oxfmt --check",
258
258
  "lint:oxlint": "oxlint . --quiet",
259
259
  "lint:design": "designmd lint DESIGN.md",
260
- "ci-checks": "pnpm check:api && pnpm check:icons && pnpm size",
260
+ "ci-checks": "pnpm check:api && pnpm check:icons && pnpm check:contrast && pnpm size",
261
261
  "size": "size-limit",
262
262
  "generate:api": "tsx scripts/generate-component-api.ts",
263
263
  "check:api": "tsx scripts/generate-component-api.ts --check",
264
264
  "audit:contrast": "tsx scripts/contrast-audit.ts",
265
265
  "type-check": "tsc",
266
266
  "generate:icons": "tsx scripts/generate-icon-exports.ts",
267
- "check:icons": "tsx scripts/generate-icon-exports.ts && git diff --exit-code -- src/icons/index.ts"
267
+ "check:icons": "tsx scripts/generate-icon-exports.ts && git diff --exit-code -- src/icons/index.ts",
268
+ "check:contrast": "tsx scripts/contrast-audit.ts && git diff --exit-code -- CONTRAST-AUDIT.md"
268
269
  }
269
270
  }
package/src/styles.css CHANGED
@@ -13,10 +13,16 @@
13
13
  @import 'react-day-picker/src/style.css';
14
14
  @import './theme.css';
15
15
 
16
- /* Tokens, the (extended) theme, typography + our custom variants/utilities stay
17
- * in JS, loaded via v4's `@config` bridge — this keeps `colors.ts` and the
18
- * ThemeProvider/brand runtime-swap model unchanged (channel triples consumed as
19
- * `rgb(var(--*) / <alpha>)`). */
16
+ /* Test files name utility classes as data — `customUtilities.test.ts` compiles every custom
17
+ * utility by name, `brandNeutrality.test.ts` spells out colour literals — and v4 scans them like
18
+ * any other source, emitting those candidates into the bundle apps ship. Nothing a test alone
19
+ * mentions belongs in it. */
20
+ @source not '**/*.test.{ts,tsx}';
21
+
22
+ /* The remaining v3 token surface plus typography and scroll-fade stay in JS, loaded
23
+ * via v4's `@config` bridge — this keeps `colors.ts` and the ThemeProvider/brand
24
+ * runtime-swap model unchanged (channel triples consumed as `rgb(var(--*) / <alpha>)`).
25
+ * Anything an app authors belongs in `theme.css` instead: this bridge is design-only. */
20
26
  @config '../tailwind.config.js';
21
27
 
22
28
  /* Scoped, opt-in preflight — the v4 replacement for v3's
@@ -31,7 +37,7 @@
31
37
  /*
32
38
  * Semantic color tokens — read by Tailwind via rgb(var(--*) / <alpha-value>) in
33
39
  * packages/tailwind-config/colors.ts. Channel values are stored as space-separated RGB so
34
- * Tailwind opacity modifiers (e.g. `tw-bg-muted/50`) resolve correctly.
40
+ * Tailwind opacity modifiers (e.g. `tw:bg-muted/50`) resolve correctly.
35
41
  * Primitive scales (neutral-*, primary-*, error-*, warning-*, etc.) remain hardcoded in colors.ts.
36
42
  */
37
43
  :root {
@@ -119,6 +125,14 @@
119
125
  with a black shadow so it doesn't read as a light halo on dark surfaces. */
120
126
  --shadow-raised: 0 2px 6px 0 rgb(100 135 153 / 0.13);
121
127
 
128
+ /* Runtime mirrors of the `shadow-card` / `shadow-table` @theme tokens, so a rule
129
+ can read `var(--shadow-card)` and follow the colour scheme. Declared here rather
130
+ than left to @theme: v4 inlines an @theme value into the utility it generates and
131
+ emits no custom property for it, so `var(--shadow-table)` would resolve to nothing
132
+ and drop the shadow entirely. Values match theme.css; the dark block overrides both. */
133
+ --shadow-card: 0px 1px 4px rgb(100 135 153 / 0.15);
134
+ --shadow-table: 0px 6px 6px -4px rgb(100 135 153 / 0.13);
135
+
122
136
  /* Typography pairing — display + mono faces; a brand overrides via
123
137
  `theme.typography.fontDisplay` / `fontMono`. Display defaults to the body
124
138
  face (`--font-sans`), then the canonical Inter stack, so unset brands keep
@@ -250,6 +264,20 @@
250
264
  blue-gray, which reads as a halo around Card / Search on dark surfaces. */
251
265
  --shadow-raised: 0 2px 6px 0 rgb(0 0 0 / 0.4);
252
266
 
267
+ /* Same correction for the two elevation tokens apps author directly — the pale
268
+ blue-gray lights up against a dark surface instead of reading as depth, and under
269
+ a sticky table header it read as a glowing seam. `--shadow-table` is softer than
270
+ `--shadow-raised` because the header casts a full-width band.
271
+
272
+ Reaches rules that read `var(--shadow-table)` / `var(--shadow-card)` directly,
273
+ which is how kbc-ui's Less consumes them. It does NOT reach the `shadow-table` /
274
+ `shadow-card` Tailwind utilities: those are `@theme` tokens (theme.css), so v4
275
+ inlines the light literal into the generated class at build time. Making the
276
+ utilities scheme-aware needs the token to carry a `var(--runtime, fallback)`
277
+ shape, which is a separate change with control-ui / boilerplate to verify against. */
278
+ --shadow-card: 0px 1px 4px rgb(0 0 0 / 0.4);
279
+ --shadow-table: 0px 6px 6px -4px rgb(0 0 0 / 0.3);
280
+
253
281
  /* Table header — lighter than card so the header row reads as raised on dark
254
282
  (light value is the tailwind-config fallback: 219 225 235). */
255
283
  --table-header: 54 55 65;
@@ -292,8 +320,8 @@
292
320
  html {
293
321
  /* Brand font opt-in: a brand's `typography.fontFamily` is injected as
294
322
  `--font-sans` by ThemeProvider and inherited from `html`; absent a brand
295
- the fallback reproduces the canonical `tw-font-sans` stack so default
296
- rendering is unchanged. Elements that set `tw-font-sans` explicitly also
323
+ the fallback reproduces the canonical `tw:font-sans` stack so default
324
+ rendering is unchanged. Elements that set `tw:font-sans` explicitly also
297
325
  follow the brand — the Tailwind `fontFamily.sans` scale reads `--font-sans`
298
326
  with the same `Inter` fallback. */
299
327
  font-family: var(
package/src/theme.css CHANGED
@@ -11,6 +11,20 @@
11
11
  * design AND every v4 app) so those utilities resolve again. Each token keeps the
12
12
  * v3 `var(--runtime-var, fallback)` shape so `ThemeProvider` can still re-skin it. */
13
13
  @theme {
14
+ /* Body face — `font-sans`. Design keeps the v3 `fontFamily.sans` scale through its
15
+ * `@config` bridge, but the apps have no such bridge, so there `font-sans` resolved
16
+ * to v4's stock stack: no `Inter`, no brand hook. Every element that sets the
17
+ * utility explicitly (top-bar nav, inputs, menu descriptions) therefore rendered in
18
+ * a system face while its siblings inherited Inter from `html`. Re-registering the
19
+ * token restores the v3 value: the brand's `--font-sans` (emitted by ThemeProvider)
20
+ * first, then the canonical Inter stack. Safe as a @theme token because the emitted
21
+ * name is prefixed (`--tw-font-sans`) and so cannot cycle with the runtime var it
22
+ * reads — unlike `font-display`, which must stay an @utility. */
23
+ --font-sans:
24
+ var(--font-sans, Inter), system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
25
+ 'Noto Sans', 'Liberation Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
26
+ 'Segoe UI Symbol', 'Noto Color Emoji';
27
+
14
28
  /* Legacy Bootstrap-era breakpoints (screens). */
15
29
  --breakpoint-sm-legacy: 992px;
16
30
  --breakpoint-md-legacy: 1092px;
@@ -32,6 +46,12 @@
32
46
  --shadow-table: 0px 6px 6px -4px rgba(100, 135, 153, 0.13);
33
47
  --radius-card: 10px;
34
48
 
49
+ /* Raised-surface elevation — `shadow-raised`. Dark-aware: `styles.css` flips the runtime
50
+ * `--shadow-raised` to a black shadow under `[data-theme='dark']`. Reading a var of the same
51
+ * name is safe here because the emitted token is prefixed (`--tw-shadow-raised`), so the two
52
+ * cannot cycle — same reasoning as `--font-sans` above. */
53
+ --shadow-raised: var(--shadow-raised, 0 2px 6px 0 rgb(100 135 153 / 0.13));
54
+
35
55
  /* Brand easing — `ease-brand`. The runtime override var (`--motion-easing`) differs from
36
56
  * this @theme token name, so registering it here drops no fallback (unlike bg-brand /
37
57
  * shadow-lift, whose runtime var name collides → they stay @utility below). */
@@ -41,6 +61,12 @@
41
61
  --animate-progress-bar: progress-bar var(--progress-bar-duration, 3s) linear forwards;
42
62
  --animate-spinner-dots: spinner-dots 1s ease-in-out infinite;
43
63
  --animate-marching-ants: marching-ants 1s linear infinite;
64
+
65
+ /* Collapsible disclosure — keyframes below. `tw-animate-css` owns `collapsible-down`/`-up`
66
+ * and every app imports it unlayered, so those two names are unusable here.
67
+ * 300ms `ease` is the motion the retired `Collapse` had. */
68
+ --animate-collapsible-open: collapsible-open 300ms ease;
69
+ --animate-collapsible-close: collapsible-close 300ms ease;
44
70
  }
45
71
 
46
72
  @keyframes progress-bar {
@@ -68,6 +94,29 @@
68
94
  stroke-dashoffset: -12;
69
95
  }
70
96
  }
97
+ /* `overflow` animates discretely — it flips mid-animation, so both endpoints must clip for the
98
+ * content to stay inside the box the whole way. No fill mode, so a settled-open panel is back to
99
+ * its own `overflow: visible` at its own height. */
100
+ @keyframes collapsible-open {
101
+ from {
102
+ height: 0;
103
+ overflow: hidden;
104
+ }
105
+ to {
106
+ height: var(--radix-collapsible-content-height);
107
+ overflow: hidden;
108
+ }
109
+ }
110
+ @keyframes collapsible-close {
111
+ from {
112
+ height: var(--radix-collapsible-content-height);
113
+ overflow: hidden;
114
+ }
115
+ to {
116
+ height: 0;
117
+ overflow: hidden;
118
+ }
119
+ }
71
120
 
72
121
  /* Fallback-chain utilities (kept as @utility, not @theme, so the runtime-var +
73
122
  * fallback chain is preserved exactly as v3 emitted it — a @theme token whose name
@@ -100,6 +149,21 @@
100
149
  sans-serif;
101
150
  }
102
151
 
152
+ /* Interaction-state variant — `not-disabled:hover:…`. Skips BOTH ways a control reports being
153
+ * disabled; v4's core `not-*` compound reads the same name as `:not(:disabled)` alone, so this
154
+ * deliberately shadows it. That shadowing is why the variant has to live here and not in an
155
+ * `addVariant` in design's `@config` plugin: an app's own build has no bridge to that plugin, so
156
+ * it fell through to the core variant and silently dropped the `data-disabled` half — every
157
+ * `tw:not-disabled:*` class kbc-ui authors that design's compiled CSS did not already carry
158
+ * still highlighted a `[data-disabled="true"]` control on hover and focus. */
159
+ @custom-variant not-disabled (&:not([data-disabled="true"]):not(:disabled));
160
+
161
+ /* `overflow-wrap: anywhere` — no v4 core utility covers it (`break-words` is `break-word`,
162
+ * which keeps long unbroken tokens overflowing). Authored in 16 app files. */
163
+ @utility break-anywhere {
164
+ overflow-wrap: anywhere;
165
+ }
166
+
103
167
  @theme inline {
104
168
  --color-inherit: inherit;
105
169
  --color-transparent: rgba(255, 255, 255, 0);
@@ -1,10 +0,0 @@
1
- export { MermaidDiagram } from './chunk-KPNAW5MU.js';
2
- import './chunk-IJTHFNNJ.js';
3
- import './chunk-VPPM7UUQ.js';
4
- import './chunk-L37JJ6MR.js';
5
- import './chunk-CTCFYWJC.js';
6
- import './chunk-BOHNXTMM.js';
7
- import './chunk-63NSN2VL.js';
8
- import './chunk-JP7PNHLH.js';
9
- //# sourceMappingURL=MermaidDiagram-EOKJHQQV.js.map
10
- //# sourceMappingURL=MermaidDiagram-EOKJHQQV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"MermaidDiagram-EOKJHQQV.js"}