@keboola/design 10.1.0 → 11.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 (504) hide show
  1. package/AGENTS.md +2 -0
  2. package/dist/MermaidDiagram-ZU5KAVRT.js +18 -0
  3. package/dist/{MermaidDiagram-EOKJHQQV.js.map → MermaidDiagram-ZU5KAVRT.js.map} +1 -1
  4. package/dist/charts.d.ts +14 -8
  5. package/dist/charts.js +6 -1
  6. package/dist/charts.js.map +1 -1
  7. package/dist/chunk-2YYJDKSP.js +51 -0
  8. package/dist/chunk-2YYJDKSP.js.map +1 -0
  9. package/dist/chunk-3P5UUCFI.js +385 -0
  10. package/dist/chunk-3P5UUCFI.js.map +1 -0
  11. package/dist/chunk-3QDFDDWZ.js +99 -0
  12. package/dist/chunk-3QDFDDWZ.js.map +1 -0
  13. package/dist/chunk-3W27OLK5.js +15 -0
  14. package/dist/chunk-3W27OLK5.js.map +1 -0
  15. package/dist/chunk-4FIZZONW.js +40 -0
  16. package/dist/chunk-4FIZZONW.js.map +1 -0
  17. package/dist/chunk-4GIAXOJG.js +133 -0
  18. package/dist/chunk-4GIAXOJG.js.map +1 -0
  19. package/dist/chunk-52NDNMK7.js +99 -0
  20. package/dist/chunk-52NDNMK7.js.map +1 -0
  21. package/dist/chunk-576G5OES.js +201 -0
  22. package/dist/chunk-576G5OES.js.map +1 -0
  23. package/dist/chunk-5AIE6SET.js +659 -0
  24. package/dist/chunk-5AIE6SET.js.map +1 -0
  25. package/dist/chunk-5FTNAZRW.js +327 -0
  26. package/dist/chunk-5FTNAZRW.js.map +1 -0
  27. package/dist/chunk-5IG2S7ZY.js +70 -0
  28. package/dist/chunk-5IG2S7ZY.js.map +1 -0
  29. package/dist/chunk-5QCXHNCW.js +404 -0
  30. package/dist/chunk-5QCXHNCW.js.map +1 -0
  31. package/dist/chunk-6DUMGC7Y.js +105 -0
  32. package/dist/chunk-6DUMGC7Y.js.map +1 -0
  33. package/dist/chunk-6J25CVST.js +174 -0
  34. package/dist/chunk-6J25CVST.js.map +1 -0
  35. package/dist/chunk-6NN35XOP.js +120 -0
  36. package/dist/chunk-6NN35XOP.js.map +1 -0
  37. package/dist/chunk-6NZBVA4T.js +24 -0
  38. package/dist/chunk-6NZBVA4T.js.map +1 -0
  39. package/dist/chunk-6W5BHRCL.js +295 -0
  40. package/dist/chunk-6W5BHRCL.js.map +1 -0
  41. package/dist/chunk-72BKRCEG.js +409 -0
  42. package/dist/chunk-72BKRCEG.js.map +1 -0
  43. package/dist/{chunk-Q7NWXLCT.js → chunk-7GTI3PPI.js} +53 -48
  44. package/dist/chunk-7GTI3PPI.js.map +1 -0
  45. package/dist/chunk-7P6PLZ4B.js +74 -0
  46. package/dist/chunk-7P6PLZ4B.js.map +1 -0
  47. package/dist/chunk-7WZWY5IA.js +46 -0
  48. package/dist/chunk-7WZWY5IA.js.map +1 -0
  49. package/dist/chunk-AIYO2632.js +489 -0
  50. package/dist/chunk-AIYO2632.js.map +1 -0
  51. package/dist/chunk-ANFZWPNE.js +112 -0
  52. package/dist/chunk-ANFZWPNE.js.map +1 -0
  53. package/dist/chunk-ANZTVAJU.js +73 -0
  54. package/dist/chunk-ANZTVAJU.js.map +1 -0
  55. package/dist/chunk-BD5BTJKX.js +166 -0
  56. package/dist/chunk-BD5BTJKX.js.map +1 -0
  57. package/dist/chunk-BHGIDSRJ.js +140 -0
  58. package/dist/chunk-BHGIDSRJ.js.map +1 -0
  59. package/dist/chunk-BSQWZITZ.js +507 -0
  60. package/dist/chunk-BSQWZITZ.js.map +1 -0
  61. package/dist/chunk-D3LAIK62.js +23 -0
  62. package/dist/chunk-D3LAIK62.js.map +1 -0
  63. package/dist/chunk-DODCR43C.js +155 -0
  64. package/dist/chunk-DODCR43C.js.map +1 -0
  65. package/dist/chunk-EEK5NGZF.js +40 -0
  66. package/dist/chunk-EEK5NGZF.js.map +1 -0
  67. package/dist/chunk-ENRG7TXA.js +11 -0
  68. package/dist/chunk-ENRG7TXA.js.map +1 -0
  69. package/dist/chunk-EQRMGIGY.js +239 -0
  70. package/dist/chunk-EQRMGIGY.js.map +1 -0
  71. package/dist/{chunk-XV3UUOYF.js → chunk-ERAHK5YQ.js} +9 -359
  72. package/dist/chunk-ERAHK5YQ.js.map +1 -0
  73. package/dist/chunk-F3FOFY2P.js +124 -0
  74. package/dist/chunk-F3FOFY2P.js.map +1 -0
  75. package/dist/chunk-F6BTWFOC.js +507 -0
  76. package/dist/chunk-F6BTWFOC.js.map +1 -0
  77. package/dist/chunk-F6J6NNAL.js +34 -0
  78. package/dist/chunk-F6J6NNAL.js.map +1 -0
  79. package/dist/chunk-FCHJ7D5O.js +59 -0
  80. package/dist/chunk-FCHJ7D5O.js.map +1 -0
  81. package/dist/chunk-FFJTEQCC.js +80 -0
  82. package/dist/chunk-FFJTEQCC.js.map +1 -0
  83. package/dist/chunk-FUFMVW7O.js +64 -0
  84. package/dist/chunk-FUFMVW7O.js.map +1 -0
  85. package/dist/chunk-FVPGQ6UE.js +25 -0
  86. package/dist/chunk-FVPGQ6UE.js.map +1 -0
  87. package/dist/{chunk-JP7PNHLH.js → chunk-G3PMV62Z.js} +3 -10
  88. package/dist/chunk-G3PMV62Z.js.map +1 -0
  89. package/dist/chunk-GACFOW3E.js +51 -0
  90. package/dist/chunk-GACFOW3E.js.map +1 -0
  91. package/dist/chunk-GDT6HQMK.js +42 -0
  92. package/dist/chunk-GDT6HQMK.js.map +1 -0
  93. package/dist/chunk-HLGU22C6.js +2589 -0
  94. package/dist/chunk-HLGU22C6.js.map +1 -0
  95. package/dist/chunk-HPMYYGP7.js +134 -0
  96. package/dist/chunk-HPMYYGP7.js.map +1 -0
  97. package/dist/chunk-I2UCOD45.js +197 -0
  98. package/dist/chunk-I2UCOD45.js.map +1 -0
  99. package/dist/chunk-IEGDZUVM.js +75 -0
  100. package/dist/chunk-IEGDZUVM.js.map +1 -0
  101. package/dist/chunk-IIS7INHF.js +47 -0
  102. package/dist/chunk-IIS7INHF.js.map +1 -0
  103. package/dist/chunk-ITELSEFU.js +256 -0
  104. package/dist/chunk-ITELSEFU.js.map +1 -0
  105. package/dist/{chunk-CTCFYWJC.js → chunk-IXAYNBOY.js} +6 -6
  106. package/dist/{chunk-CTCFYWJC.js.map → chunk-IXAYNBOY.js.map} +1 -1
  107. package/dist/chunk-JUW2ETEI.js +191 -0
  108. package/dist/chunk-JUW2ETEI.js.map +1 -0
  109. package/dist/chunk-K65C7CVE.js +127 -0
  110. package/dist/chunk-K65C7CVE.js.map +1 -0
  111. package/dist/chunk-KDI64MCY.js +189 -0
  112. package/dist/chunk-KDI64MCY.js.map +1 -0
  113. package/dist/chunk-KN4ASMH5.js +160 -0
  114. package/dist/chunk-KN4ASMH5.js.map +1 -0
  115. package/dist/chunk-KQW7QNTU.js +1549 -0
  116. package/dist/chunk-KQW7QNTU.js.map +1 -0
  117. package/dist/chunk-KR7NXXHC.js +66 -0
  118. package/dist/chunk-KR7NXXHC.js.map +1 -0
  119. package/dist/chunk-KRZKIVMA.js +142 -0
  120. package/dist/chunk-KRZKIVMA.js.map +1 -0
  121. package/dist/{chunk-C3L3TBBT.js → chunk-KTTLLKGQ.js} +6 -63
  122. package/dist/chunk-KTTLLKGQ.js.map +1 -0
  123. package/dist/chunk-KWKSHPDP.js +234 -0
  124. package/dist/chunk-KWKSHPDP.js.map +1 -0
  125. package/dist/chunk-KZVC7OYG.js +57 -0
  126. package/dist/chunk-KZVC7OYG.js.map +1 -0
  127. package/dist/chunk-L5DHUN2V.js +204 -0
  128. package/dist/chunk-L5DHUN2V.js.map +1 -0
  129. package/dist/chunk-LCTGEH57.js +1376 -0
  130. package/dist/chunk-LCTGEH57.js.map +1 -0
  131. package/dist/chunk-LXLIQ2D6.js +12 -0
  132. package/dist/chunk-LXLIQ2D6.js.map +1 -0
  133. package/dist/chunk-M4CTURKX.js +84 -0
  134. package/dist/chunk-M4CTURKX.js.map +1 -0
  135. package/dist/chunk-M6LTUPVP.js +301 -0
  136. package/dist/chunk-M6LTUPVP.js.map +1 -0
  137. package/dist/chunk-MA6RRHDT.js +291 -0
  138. package/dist/chunk-MA6RRHDT.js.map +1 -0
  139. package/dist/chunk-MODE4QIA.js +6 -0
  140. package/dist/chunk-MODE4QIA.js.map +1 -0
  141. package/dist/chunk-MVILMVGG.js +118 -0
  142. package/dist/chunk-MVILMVGG.js.map +1 -0
  143. package/dist/chunk-MWS4VCLV.js +17 -0
  144. package/dist/chunk-MWS4VCLV.js.map +1 -0
  145. package/dist/chunk-NEUX74SO.js +315 -0
  146. package/dist/chunk-NEUX74SO.js.map +1 -0
  147. package/dist/chunk-NFHKYBRD.js +156 -0
  148. package/dist/chunk-NFHKYBRD.js.map +1 -0
  149. package/dist/chunk-NHJNNXD3.js +89 -0
  150. package/dist/chunk-NHJNNXD3.js.map +1 -0
  151. package/dist/chunk-O2BF3HZL.js +33 -0
  152. package/dist/chunk-O2BF3HZL.js.map +1 -0
  153. package/dist/chunk-OANXCZYD.js +212 -0
  154. package/dist/chunk-OANXCZYD.js.map +1 -0
  155. package/dist/chunk-ODJF7YIP.js +230 -0
  156. package/dist/chunk-ODJF7YIP.js.map +1 -0
  157. package/dist/chunk-ON4BJTHI.js +101 -0
  158. package/dist/chunk-ON4BJTHI.js.map +1 -0
  159. package/dist/{chunk-VMFSRV5H.js → chunk-OTL5WXIJ.js} +2 -2
  160. package/dist/{chunk-VMFSRV5H.js.map → chunk-OTL5WXIJ.js.map} +1 -1
  161. package/dist/{chunk-VPPM7UUQ.js → chunk-PACNBKJV.js} +3 -3
  162. package/dist/{chunk-VPPM7UUQ.js.map → chunk-PACNBKJV.js.map} +1 -1
  163. package/dist/{chunk-ESBL3IPF.js → chunk-PROCA7K7.js} +2 -2
  164. package/dist/{chunk-ESBL3IPF.js.map → chunk-PROCA7K7.js.map} +1 -1
  165. package/dist/chunk-QGMIPA67.js +85 -0
  166. package/dist/chunk-QGMIPA67.js.map +1 -0
  167. package/dist/chunk-QQA37LFB.js +190 -0
  168. package/dist/chunk-QQA37LFB.js.map +1 -0
  169. package/dist/chunk-QZAWRSEB.js +61 -0
  170. package/dist/chunk-QZAWRSEB.js.map +1 -0
  171. package/dist/chunk-R74KGWNS.js +699 -0
  172. package/dist/chunk-R74KGWNS.js.map +1 -0
  173. package/dist/chunk-RFDLHMKL.js +110 -0
  174. package/dist/chunk-RFDLHMKL.js.map +1 -0
  175. package/dist/chunk-RL64HN7S.js +40 -0
  176. package/dist/chunk-RL64HN7S.js.map +1 -0
  177. package/dist/chunk-RMRQKPL7.js +115 -0
  178. package/dist/chunk-RMRQKPL7.js.map +1 -0
  179. package/dist/{chunk-BOHNXTMM.js → chunk-RQVK4IYC.js} +3 -3
  180. package/dist/{chunk-BOHNXTMM.js.map → chunk-RQVK4IYC.js.map} +1 -1
  181. package/dist/chunk-RTW56PWZ.js +59 -0
  182. package/dist/chunk-RTW56PWZ.js.map +1 -0
  183. package/dist/chunk-RUTPQNLR.js +266 -0
  184. package/dist/chunk-RUTPQNLR.js.map +1 -0
  185. package/dist/chunk-S6TAF63G.js +25 -0
  186. package/dist/chunk-S6TAF63G.js.map +1 -0
  187. package/dist/chunk-SBGAUGXY.js +224 -0
  188. package/dist/chunk-SBGAUGXY.js.map +1 -0
  189. package/dist/chunk-SC275NHZ.js +407 -0
  190. package/dist/chunk-SC275NHZ.js.map +1 -0
  191. package/dist/chunk-SCQPU4UE.js +97 -0
  192. package/dist/chunk-SCQPU4UE.js.map +1 -0
  193. package/dist/chunk-SFFF2WQP.js +8 -0
  194. package/dist/chunk-SFFF2WQP.js.map +1 -0
  195. package/dist/chunk-SJYMHZKA.js +36 -0
  196. package/dist/chunk-SJYMHZKA.js.map +1 -0
  197. package/dist/chunk-SLCCUJVN.js +125 -0
  198. package/dist/chunk-SLCCUJVN.js.map +1 -0
  199. package/dist/{chunk-IJTHFNNJ.js → chunk-SVBSNSD4.js} +10 -12
  200. package/dist/chunk-SVBSNSD4.js.map +1 -0
  201. package/dist/chunk-SVPLTL35.js +62 -0
  202. package/dist/chunk-SVPLTL35.js.map +1 -0
  203. package/dist/{chunk-63NSN2VL.js → chunk-SWQFYNYG.js} +115 -51
  204. package/dist/chunk-SWQFYNYG.js.map +1 -0
  205. package/dist/chunk-THHB4EWS.js +72 -0
  206. package/dist/chunk-THHB4EWS.js.map +1 -0
  207. package/dist/chunk-TUCDD33E.js +246 -0
  208. package/dist/chunk-TUCDD33E.js.map +1 -0
  209. package/dist/chunk-TV4WAP2R.js +14 -0
  210. package/dist/chunk-TV4WAP2R.js.map +1 -0
  211. package/dist/chunk-U3A6YBTZ.js +134 -0
  212. package/dist/chunk-U3A6YBTZ.js.map +1 -0
  213. package/dist/chunk-UGT6DKWM.js +95 -0
  214. package/dist/chunk-UGT6DKWM.js.map +1 -0
  215. package/dist/chunk-VSERHUWD.js +212 -0
  216. package/dist/chunk-VSERHUWD.js.map +1 -0
  217. package/dist/chunk-VYG7BDXC.js +49 -0
  218. package/dist/chunk-VYG7BDXC.js.map +1 -0
  219. package/dist/chunk-WETKNYZX.js +52 -0
  220. package/dist/chunk-WETKNYZX.js.map +1 -0
  221. package/dist/chunk-WGG4AML3.js +216 -0
  222. package/dist/chunk-WGG4AML3.js.map +1 -0
  223. package/dist/chunk-WKAUEL6I.js +30 -0
  224. package/dist/chunk-WKAUEL6I.js.map +1 -0
  225. package/dist/chunk-WPOLA5CG.js +81 -0
  226. package/dist/chunk-WPOLA5CG.js.map +1 -0
  227. package/dist/chunk-WPVETCGJ.js +254 -0
  228. package/dist/chunk-WPVETCGJ.js.map +1 -0
  229. package/dist/chunk-WTSM3A7E.js +13 -0
  230. package/dist/chunk-WTSM3A7E.js.map +1 -0
  231. package/dist/chunk-WU3F2K3T.js +148 -0
  232. package/dist/chunk-WU3F2K3T.js.map +1 -0
  233. package/dist/chunk-WZZK2DTZ.js +39 -0
  234. package/dist/chunk-WZZK2DTZ.js.map +1 -0
  235. package/dist/chunk-X4IHLKRD.js +42 -0
  236. package/dist/chunk-X4IHLKRD.js.map +1 -0
  237. package/dist/chunk-XAHEXZJC.js +80 -0
  238. package/dist/chunk-XAHEXZJC.js.map +1 -0
  239. package/dist/chunk-XCYGJDUX.js +31 -0
  240. package/dist/chunk-XCYGJDUX.js.map +1 -0
  241. package/dist/chunk-Y4W3JORC.js +104 -0
  242. package/dist/chunk-Y4W3JORC.js.map +1 -0
  243. package/dist/{chunk-7PUUHEJQ.js → chunk-YFZJ3ZLG.js} +26 -42
  244. package/dist/chunk-YFZJ3ZLG.js.map +1 -0
  245. package/dist/{chunk-6FPEI4EM.js → chunk-YI3WLXEN.js} +27 -2323
  246. package/dist/chunk-YI3WLXEN.js.map +1 -0
  247. package/dist/chunk-ZBKFSPD3.js +29 -0
  248. package/dist/chunk-ZBKFSPD3.js.map +1 -0
  249. package/dist/chunk-ZOERRQ6A.js +79 -0
  250. package/dist/chunk-ZOERRQ6A.js.map +1 -0
  251. package/dist/chunk-ZSTGUKHU.js +10 -0
  252. package/dist/chunk-ZSTGUKHU.js.map +1 -0
  253. package/dist/chunk-ZUEHDL27.js +65 -0
  254. package/dist/chunk-ZUEHDL27.js.map +1 -0
  255. package/dist/editors.js +22 -14
  256. package/dist/editors.js.map +1 -1
  257. package/dist/icons.js +7 -2
  258. package/dist/index.d.ts +8 -18
  259. package/dist/index.js +121 -15800
  260. package/dist/index.js.map +1 -1
  261. package/dist/internal/blocks/AIKit.js +30 -0
  262. package/dist/internal/blocks/AIKit.js.map +1 -0
  263. package/dist/internal/blocks/AppShell.js +11 -0
  264. package/dist/internal/blocks/AppShell.js.map +1 -0
  265. package/dist/internal/blocks/AutoSaveTextarea.js +14 -0
  266. package/dist/internal/blocks/AutoSaveTextarea.js.map +1 -0
  267. package/dist/internal/blocks/BrandEditor.js +23 -0
  268. package/dist/internal/blocks/BrandEditor.js.map +1 -0
  269. package/dist/internal/blocks/ChartPanel.js +10 -0
  270. package/dist/internal/blocks/ChartPanel.js.map +1 -0
  271. package/dist/internal/blocks/ClipboardButton.js +12 -0
  272. package/dist/internal/blocks/ClipboardButton.js.map +1 -0
  273. package/dist/internal/blocks/ColorInput.js +13 -0
  274. package/dist/internal/blocks/ColorInput.js.map +1 -0
  275. package/dist/internal/blocks/ColorModeSwitch.js +13 -0
  276. package/dist/internal/blocks/ColorModeSwitch.js.map +1 -0
  277. package/dist/internal/blocks/Command.js +15 -0
  278. package/dist/internal/blocks/Command.js.map +1 -0
  279. package/dist/internal/blocks/CopyField.js +11 -0
  280. package/dist/internal/blocks/CopyField.js.map +1 -0
  281. package/dist/internal/blocks/DashboardHero.js +9 -0
  282. package/dist/internal/blocks/DashboardHero.js.map +1 -0
  283. package/dist/internal/blocks/DateInput.js +16 -0
  284. package/dist/internal/blocks/DateInput.js.map +1 -0
  285. package/dist/internal/blocks/DateRangeInput.js +16 -0
  286. package/dist/internal/blocks/DateRangeInput.js.map +1 -0
  287. package/dist/internal/blocks/EmptyConfigurationActionCard.js +10 -0
  288. package/dist/internal/blocks/EmptyConfigurationActionCard.js.map +1 -0
  289. package/dist/internal/blocks/EmptyState.js +4 -0
  290. package/dist/internal/blocks/EmptyState.js.map +1 -0
  291. package/dist/internal/blocks/ErrorState.js +5 -0
  292. package/dist/internal/blocks/ErrorState.js.map +1 -0
  293. package/dist/internal/blocks/ExportMenu.js +13 -0
  294. package/dist/internal/blocks/ExportMenu.js.map +1 -0
  295. package/dist/internal/blocks/Form.js +29 -0
  296. package/dist/internal/blocks/Form.js.map +1 -0
  297. package/dist/internal/blocks/FormGroup.js +18 -0
  298. package/dist/internal/blocks/FormGroup.js.map +1 -0
  299. package/dist/internal/blocks/GoogleButton.js +10 -0
  300. package/dist/internal/blocks/GoogleButton.js.map +1 -0
  301. package/dist/internal/blocks/MicrosoftButton.js +10 -0
  302. package/dist/internal/blocks/MicrosoftButton.js.map +1 -0
  303. package/dist/internal/blocks/MultiActionButtonGroup.js +12 -0
  304. package/dist/internal/blocks/MultiActionButtonGroup.js.map +1 -0
  305. package/dist/internal/blocks/MultiCombobox.js +14 -0
  306. package/dist/internal/blocks/MultiCombobox.js.map +1 -0
  307. package/dist/internal/blocks/NumberInput.js +12 -0
  308. package/dist/internal/blocks/NumberInput.js.map +1 -0
  309. package/dist/internal/blocks/OtpInput.js +10 -0
  310. package/dist/internal/blocks/OtpInput.js.map +1 -0
  311. package/dist/internal/blocks/PageHeader.js +9 -0
  312. package/dist/internal/blocks/PageHeader.js.map +1 -0
  313. package/dist/internal/blocks/PageLayout.js +9 -0
  314. package/dist/internal/blocks/PageLayout.js.map +1 -0
  315. package/dist/internal/blocks/PageToolbar.js +13 -0
  316. package/dist/internal/blocks/PageToolbar.js.map +1 -0
  317. package/dist/internal/blocks/PasswordInput.js +13 -0
  318. package/dist/internal/blocks/PasswordInput.js.map +1 -0
  319. package/dist/internal/blocks/SearchInput.js +12 -0
  320. package/dist/internal/blocks/SearchInput.js.map +1 -0
  321. package/dist/internal/blocks/SearchInputWithNavigation.js +16 -0
  322. package/dist/internal/blocks/SearchInputWithNavigation.js.map +1 -0
  323. package/dist/internal/blocks/SectionNav.js +15 -0
  324. package/dist/internal/blocks/SectionNav.js.map +1 -0
  325. package/dist/internal/blocks/SplitButton.js +14 -0
  326. package/dist/internal/blocks/SplitButton.js.map +1 -0
  327. package/dist/internal/blocks/StatCard.js +10 -0
  328. package/dist/internal/blocks/StatCard.js.map +1 -0
  329. package/dist/internal/blocks/TextInput.js +13 -0
  330. package/dist/internal/blocks/TextInput.js.map +1 -0
  331. package/dist/internal/blocks/Textarea.js +13 -0
  332. package/dist/internal/blocks/Textarea.js.map +1 -0
  333. package/dist/internal/blocks/TimeInput.js +17 -0
  334. package/dist/internal/blocks/TimeInput.js.map +1 -0
  335. package/dist/internal/components/Alert.js +11 -0
  336. package/dist/internal/components/Alert.js.map +1 -0
  337. package/dist/internal/components/AlertModal.js +11 -0
  338. package/dist/internal/components/AlertModal.js.map +1 -0
  339. package/dist/internal/components/Avatar.js +9 -0
  340. package/dist/internal/components/Avatar.js.map +1 -0
  341. package/dist/internal/components/Badge.js +9 -0
  342. package/dist/internal/components/Badge.js.map +1 -0
  343. package/dist/internal/components/BrandLogo.js +11 -0
  344. package/dist/internal/components/BrandLogo.js.map +1 -0
  345. package/dist/internal/components/Breadcrumb.js +14 -0
  346. package/dist/internal/components/Breadcrumb.js.map +1 -0
  347. package/dist/internal/components/Button.js +10 -0
  348. package/dist/internal/components/Button.js.map +1 -0
  349. package/dist/internal/components/ButtonGroup.js +9 -0
  350. package/dist/internal/components/ButtonGroup.js.map +1 -0
  351. package/dist/internal/components/Calendar.js +9 -0
  352. package/dist/internal/components/Calendar.js.map +1 -0
  353. package/dist/internal/components/Card.js +9 -0
  354. package/dist/internal/components/Card.js.map +1 -0
  355. package/dist/internal/components/Checkbox.js +11 -0
  356. package/dist/internal/components/Checkbox.js.map +1 -0
  357. package/dist/internal/components/Clipboard.js +9 -0
  358. package/dist/internal/components/Clipboard.js.map +1 -0
  359. package/dist/internal/components/Collapsible.js +9 -0
  360. package/dist/internal/components/Collapsible.js.map +1 -0
  361. package/dist/internal/components/CollapsiblePanel.js +11 -0
  362. package/dist/internal/components/CollapsiblePanel.js.map +1 -0
  363. package/dist/internal/components/Combobox.js +13 -0
  364. package/dist/internal/components/Combobox.js.map +1 -0
  365. package/dist/internal/components/DatePicker.js +11 -0
  366. package/dist/internal/components/DatePicker.js.map +1 -0
  367. package/dist/internal/components/DateRangePicker.js +17 -0
  368. package/dist/internal/components/DateRangePicker.js.map +1 -0
  369. package/dist/internal/components/DiffView.js +9 -0
  370. package/dist/internal/components/DiffView.js.map +1 -0
  371. package/dist/internal/components/DotsLoader.js +5 -0
  372. package/dist/internal/components/DotsLoader.js.map +1 -0
  373. package/dist/internal/components/DropdownMenu.js +11 -0
  374. package/dist/internal/components/DropdownMenu.js.map +1 -0
  375. package/dist/internal/components/EmptySearchContent.js +4 -0
  376. package/dist/internal/components/EmptySearchContent.js.map +1 -0
  377. package/dist/internal/components/FileUpload.js +11 -0
  378. package/dist/internal/components/FileUpload.js.map +1 -0
  379. package/dist/internal/components/FullScreenModal.js +12 -0
  380. package/dist/internal/components/FullScreenModal.js.map +1 -0
  381. package/dist/internal/components/HelpBlock.js +4 -0
  382. package/dist/internal/components/HelpBlock.js.map +1 -0
  383. package/dist/internal/components/HoverCard.js +9 -0
  384. package/dist/internal/components/HoverCard.js.map +1 -0
  385. package/dist/internal/components/InputGroup.js +11 -0
  386. package/dist/internal/components/InputGroup.js.map +1 -0
  387. package/dist/internal/components/Kbd.js +9 -0
  388. package/dist/internal/components/Kbd.js.map +1 -0
  389. package/dist/internal/components/Label.js +9 -0
  390. package/dist/internal/components/Label.js.map +1 -0
  391. package/dist/internal/components/Link.js +9 -0
  392. package/dist/internal/components/Link.js.map +1 -0
  393. package/dist/internal/components/MarkedText.js +5 -0
  394. package/dist/internal/components/MarkedText.js.map +1 -0
  395. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +10 -0
  396. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js.map +1 -0
  397. package/dist/internal/components/MergeEditor/PaneHeader.js +4 -0
  398. package/dist/internal/components/MergeEditor/PaneHeader.js.map +1 -0
  399. package/dist/internal/components/MergeEditor/constants.js +4 -0
  400. package/dist/internal/components/MergeEditor/constants.js.map +1 -0
  401. package/dist/internal/components/MergeEditor/useMergeDiff.js +5 -0
  402. package/dist/internal/components/MergeEditor/useMergeDiff.js.map +1 -0
  403. package/dist/internal/components/Modal.js +13 -0
  404. package/dist/internal/components/Modal.js.map +1 -0
  405. package/dist/internal/components/Navbar.js +14 -0
  406. package/dist/internal/components/Navbar.js.map +1 -0
  407. package/dist/internal/components/Pagination.js +11 -0
  408. package/dist/internal/components/Pagination.js.map +1 -0
  409. package/dist/internal/components/PanelWithDetails.js +11 -0
  410. package/dist/internal/components/PanelWithDetails.js.map +1 -0
  411. package/dist/internal/components/Popconfirm.js +12 -0
  412. package/dist/internal/components/Popconfirm.js.map +1 -0
  413. package/dist/internal/components/Popover.js +9 -0
  414. package/dist/internal/components/Popover.js.map +1 -0
  415. package/dist/internal/components/Progress.js +9 -0
  416. package/dist/internal/components/Progress.js.map +1 -0
  417. package/dist/internal/components/RadioGroup.js +12 -0
  418. package/dist/internal/components/RadioGroup.js.map +1 -0
  419. package/dist/internal/components/Resizable.js +9 -0
  420. package/dist/internal/components/Resizable.js.map +1 -0
  421. package/dist/internal/components/ScrollArea.js +9 -0
  422. package/dist/internal/components/ScrollArea.js.map +1 -0
  423. package/dist/internal/components/Search.js +10 -0
  424. package/dist/internal/components/Search.js.map +1 -0
  425. package/dist/internal/components/Select.js +12 -0
  426. package/dist/internal/components/Select.js.map +1 -0
  427. package/dist/internal/components/Separator.js +9 -0
  428. package/dist/internal/components/Separator.js.map +1 -0
  429. package/dist/internal/components/Sheet.js +12 -0
  430. package/dist/internal/components/Sheet.js.map +1 -0
  431. package/dist/internal/components/Sidebar.js +20 -0
  432. package/dist/internal/components/Sidebar.js.map +1 -0
  433. package/dist/internal/components/Skeleton/Skeleton.js +9 -0
  434. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -0
  435. package/dist/internal/components/Skeleton/SkeletonList.js +10 -0
  436. package/dist/internal/components/Skeleton/SkeletonList.js.map +1 -0
  437. package/dist/internal/components/Slider.js +11 -0
  438. package/dist/internal/components/Slider.js.map +1 -0
  439. package/dist/internal/components/SpotlightBackdrop.js +9 -0
  440. package/dist/internal/components/SpotlightBackdrop.js.map +1 -0
  441. package/dist/internal/components/Stepper.js +10 -0
  442. package/dist/internal/components/Stepper.js.map +1 -0
  443. package/dist/internal/components/Switch.js +10 -0
  444. package/dist/internal/components/Switch.js.map +1 -0
  445. package/dist/internal/components/Table.js +10 -0
  446. package/dist/internal/components/Table.js.map +1 -0
  447. package/dist/internal/components/Tabs.js +12 -0
  448. package/dist/internal/components/Tabs.js.map +1 -0
  449. package/dist/internal/components/ThemeProvider.js +10 -0
  450. package/dist/internal/components/ThemeProvider.js.map +1 -0
  451. package/dist/internal/components/TimePicker.js +12 -0
  452. package/dist/internal/components/TimePicker.js.map +1 -0
  453. package/dist/internal/components/Timeline.js +10 -0
  454. package/dist/internal/components/Timeline.js.map +1 -0
  455. package/dist/internal/components/Toast.js +11 -0
  456. package/dist/internal/components/Toast.js.map +1 -0
  457. package/dist/internal/components/Toggle.js +9 -0
  458. package/dist/internal/components/Toggle.js.map +1 -0
  459. package/dist/internal/components/ToggleGroup.js +9 -0
  460. package/dist/internal/components/ToggleGroup.js.map +1 -0
  461. package/dist/internal/components/Tooltip.js +8 -0
  462. package/dist/internal/components/Tooltip.js.map +1 -0
  463. package/dist/internal/components/Truncated.js +9 -0
  464. package/dist/internal/components/Truncated.js.map +1 -0
  465. package/dist/internal/components/Workbench.js +11 -0
  466. package/dist/internal/components/Workbench.js.map +1 -0
  467. package/dist/internal/components/ZoomableSvg.js +13 -0
  468. package/dist/internal/components/ZoomableSvg.js.map +1 -0
  469. package/dist/internal/hooks/useAutosizeInput.js +4 -0
  470. package/dist/internal/hooks/useAutosizeInput.js.map +1 -0
  471. package/dist/internal/hooks/useScrollbarPosition.js +5 -0
  472. package/dist/internal/hooks/useScrollbarPosition.js.map +1 -0
  473. package/dist/internal/hooks/useStableCallback.js +4 -0
  474. package/dist/internal/hooks/useStableCallback.js.map +1 -0
  475. package/dist/internal/utils/mergeRefs.js +4 -0
  476. package/dist/internal/utils/mergeRefs.js.map +1 -0
  477. package/dist/internal/utils.js +8 -0
  478. package/dist/internal/utils.js.map +1 -0
  479. package/dist/markdown-editor.js +23 -9
  480. package/dist/markdown-editor.js.map +1 -1
  481. package/dist/mermaid.js +16 -8
  482. package/dist/rjsf.js +102 -29
  483. package/dist/rjsf.js.map +1 -1
  484. package/dist/styles.css +1 -1
  485. package/dist/testing.js +8 -3
  486. package/dist/testing.js.map +1 -1
  487. package/package.json +9 -8
  488. package/src/styles.css +35 -7
  489. package/src/theme.css +64 -0
  490. package/dist/MermaidDiagram-EOKJHQQV.js +0 -10
  491. package/dist/chunk-63NSN2VL.js.map +0 -1
  492. package/dist/chunk-6FPEI4EM.js.map +0 -1
  493. package/dist/chunk-7PUUHEJQ.js.map +0 -1
  494. package/dist/chunk-C3L3TBBT.js.map +0 -1
  495. package/dist/chunk-IJTHFNNJ.js.map +0 -1
  496. package/dist/chunk-JP7PNHLH.js.map +0 -1
  497. package/dist/chunk-KPNAW5MU.js +0 -229
  498. package/dist/chunk-KPNAW5MU.js.map +0 -1
  499. package/dist/chunk-L37JJ6MR.js +0 -152
  500. package/dist/chunk-L37JJ6MR.js.map +0 -1
  501. package/dist/chunk-Q7NWXLCT.js.map +0 -1
  502. package/dist/chunk-SYIEF644.js +0 -1016
  503. package/dist/chunk-SYIEF644.js.map +0 -1
  504. package/dist/chunk-XV3UUOYF.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/CodeEditor/modes/dbt.ts","../src/components/CodeEditor/modes/jsonnet.ts","../src/components/CodeEditor/tokenTheme.ts","../src/components/CodeEditor/helpers.ts","../src/components/CodeEditor/ButtonToolbar.tsx","../src/components/CodeEditor/editorChrome.ts","../src/components/CodeEditor/search.ts","../src/components/CodeEditor/ToggleComponentHelp.tsx","../src/components/CodeEditor/tooltips.ts","../src/components/CodeEditor/variableCompletion.ts","../src/components/CodeEditor/CodeEditor.tsx","../src/components/CodeEditor/activeQueryHighlight.ts","../src/components/CodeEditor/highlighting.ts","../src/components/CodeEditor/SqlEditor.tsx"],"names":["colors","jsxs","jsx","ViewPlugin","placeholder","useMemo","EditorView","keymap","cmPlaceholder","Decoration","StateEffect","StateField","useRef","useEffect","CodeMirror"],"mappings":"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","file":"chunk-7PUUHEJQ.js","sourcesContent":["import type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport { simpleMode } from '@codemirror/legacy-modes/mode/simple-mode';\n\n// A dbt step is `dbt <command> [<subcommand>] [arguments, flags and selectors]`,\n// and the vocabulary below is grouped by the slot it belongs to — both to colour\n// it and to decide what is worth offering where.\nconst COMMANDS = [\n 'run-operation',\n 'run',\n 'test',\n 'seed',\n 'snapshot',\n 'list',\n 'ls',\n 'compile',\n 'build',\n 'deps',\n 'docs',\n 'source',\n];\nconst SUBCOMMANDS: Record<string, string[]> = { docs: ['generate'], source: ['freshness'] };\nconst ARGUMENTS = ['--select', '--exclude', '--selector', '--defer', '--resource-type', '-s'];\n// The arguments whose value is a graph selector, and so the only ones a selector\n// method has anything to attach to.\nconst SELECTORS = ['--select', '--exclude', '-s'];\nconst METHODS = [\n 'path:',\n 'source:',\n 'tag:',\n 'package:',\n 'config:',\n 'test_type:',\n 'test_name:',\n 'state:',\n 'exposure:',\n 'metric:',\n 'result:',\n 'source_status:',\n 'column_name:',\n];\nconst FLAGS = [\n '--fail-fast',\n '--warn-error',\n '--favor-state',\n '--vars',\n '--models',\n '--threads',\n '--profiles-dir',\n '--profile',\n '--full-refresh',\n];\n\n// A subcommand only ever highlights together with its command, so `dbt docs` stays\n// unpainted until `generate` follows it.\nconst COMMAND_PHRASES = COMMANDS.flatMap((command) => {\n const subcommands = SUBCOMMANDS[command];\n\n return subcommands ? subcommands.map((subcommand) => `${command} ${subcommand}`) : [command];\n});\n\n// Alternation is first-match, so a word that prefixes another has to come first\n// (`run-operation` before `run`, `--profiles-dir` before `--profile`). Sorting by\n// length keeps that true however the lists above are written.\nconst alternation = (list: string[]) => [...list].sort((a, b) => b.length - a.length).join('|');\n\n// Every keyword follows whitespace, so the leading run is part of the match.\n// Commands and arguments end on a word boundary; methods and flags carry their\n// own terminator (`:`) or need none.\nconst word = (list: string[]) => new RegExp(`^\\\\s+(?:${alternation(list)})\\\\b`, 'i');\nconst prefix = (list: string[]) => new RegExp(`^\\\\s+(?:${alternation(list)})`, 'i');\n\n// The word being completed: letters, digits, `_`, `-` and the `:` a selector\n// method ends with. Whitespace stays out of it, so a two-word label like `docs\n// generate` cannot stretch the match back across the words before the cursor.\nconst WORD = /[\\w:-]*$/;\n\nconst asOptions = (list: string[], type: string): Completion[] =>\n list.map((label) => ({ label, type }));\n\n// `type` drives the popup icon, so each group carries the one that matches the\n// colour the mode paints it in.\nconst DBT: Completion[] = [{ label: 'dbt', type: 'keyword' }];\nconst COMMAND_OPTIONS = asOptions(COMMANDS, 'keyword');\nconst SUBCOMMAND_OPTIONS: Record<string, Completion[]> = Object.fromEntries(\n Object.entries(SUBCOMMANDS).map(([command, subcommands]) => [\n command,\n asOptions(subcommands, 'keyword'),\n ]),\n);\nconst ARGUMENT_OPTIONS = asOptions(ARGUMENTS, 'variable');\nconst FLAG_OPTIONS = asOptions(FLAGS, 'constant');\nconst METHOD_OPTIONS = asOptions(METHODS, 'property');\n\n// Which slice of the vocabulary the cursor's slot can hold, given the words\n// already finished ahead of it. Offering the whole vocabulary everywhere proposes\n// `dbt` mid-command and a selector method with no selector to attach to.\nconst optionsAfter = (words: string[]): Completion[] => {\n const [step, command, ...rest] = words;\n\n if (step === undefined) return DBT;\n if (step.toLowerCase() !== 'dbt') return [];\n if (command === undefined) return COMMAND_OPTIONS;\n\n const subcommands = SUBCOMMAND_OPTIONS[command.toLowerCase()];\n if (subcommands && rest.length === 0) return subcommands;\n\n // A selector argument takes any number of space-separated values, so what\n // decides the slot is the last argument, not whether a selector appeared at all:\n // `--select tag:a tag:b` keeps offering methods, `--select a --profile p` stops.\n const lastArgument = rest.filter((it) => it.startsWith('-')).at(-1);\n const selecting = lastArgument !== undefined && SELECTORS.includes(lastArgument.toLowerCase());\n\n return selecting\n ? [...ARGUMENT_OPTIONS, ...FLAG_OPTIONS, ...METHOD_OPTIONS]\n : [...ARGUMENT_OPTIONS, ...FLAG_OPTIONS];\n};\n\nconst complete = (context: CompletionContext): CompletionResult | null => {\n const typed = context.matchBefore(WORD);\n\n // `WORD` also matches the empty string, so without this the popup would open on\n // every space. Asking for completions explicitly still opens it there.\n if (!typed?.text && !context.explicit) return null;\n\n const from = typed?.from ?? context.pos;\n const line = context.state.doc.lineAt(from);\n const options = optionsAfter(\n line.text\n .slice(0, from - line.from)\n .split(/\\s+/)\n .filter(Boolean),\n );\n\n return options.length > 0 ? { from, options, validFor: WORD } : null;\n};\n\nexport const dbt = simpleMode({\n languageData: {\n // `toggleComment` is a no-op without these, so Mod-/ silently does nothing.\n commentTokens: { line: '--', block: { open: '/*', close: '*/' } },\n autocomplete: complete,\n },\n start: [\n { regex: /\"(?:[^\\\\]|\\\\.)*?(?:\"|$)/, token: 'string' },\n // Word-bounded, so `dbtX` is not a dbt step whose first word happens to\n // colour — the same thing the completion source asks of it.\n { regex: /dbt\\b/, token: 'keyword', sol: true },\n { regex: word(COMMAND_PHRASES), token: 'keyword' },\n { regex: word(ARGUMENTS), token: 'variableName' },\n { regex: prefix(METHODS), token: 'propertyName' },\n { regex: prefix(FLAGS), token: 'attributeName' },\n { regex: /(?:@|\\*|,|\\+\\d+|\\d+\\+|\\+)/, token: 'operator' },\n { regex: /'.*'/, token: 'string' },\n { regex: /true|false/, token: 'atom' },\n ],\n});\n","import type { StreamParser } from '@codemirror/language';\n\n/**\n * Ported from google/codemirror-mode-jsonnet (Apache-2.0), the mode written by\n * the language's own authors, which was never taken past CodeMirror 5.\n * CodeMirror 5 style names are replaced by their CodeMirror 6 highlight tags:\n * `string-2` is `escape`, `error` is `invalid`.\n *\n * Every pattern is anchored and hoisted. `StringStream.match` slices the rest of\n * the line and, without `^`, scans all of it for a match it then discards unless\n * it started at the cursor — so an unanchored probe costs the whole remaining\n * line, and this tokenizer makes up to twenty of them per token.\n */\n\nconst COMMENT_END = /^\\*\\//;\nconst COMMENT_START = /^\\/\\/|^#/;\nconst C_COMMENT_START = /^\\/\\*/;\nconst TEXT_BLOCK = /^\\|\\|\\|/;\nconst TEXT_BLOCK_END = /^\\s*\\|\\|\\|/;\nconst RAW_DOUBLE = /^\"\"/;\nconst RAW_SINGLE = /^''/;\nconst CLOSE_DOUBLE = /^\"/;\nconst CLOSE_SINGLE = /^'/;\nconst ESCAPE = /^\\\\[\\\\\"'/bfnrt0]/;\nconst UNICODE_ESCAPE = /^\\\\u[0-9a-fA-F]{4}/;\nconst BACKSLASH = /^\\\\/;\nconst IMPORT = /^import(?:str)?\\s*(@?)([\"'])/;\nconst QUOTE = /^(@?)([\"'])/;\nconst ROOT = /^\\$/;\nconst NUMBER = /^(?:\\.\\d+|\\d+\\.?\\d*)(?:e[-+]?\\d+)?/i;\nconst OPERATOR = /^[-+/*=<>!&~^|$%]+/;\nconst IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*/;\n\nconst KEYWORDS: Record<string, 'keyword' | 'atom'> = {\n local: 'keyword',\n self: 'keyword',\n super: 'keyword',\n assert: 'keyword',\n function: 'keyword',\n if: 'keyword',\n then: 'keyword',\n else: 'keyword',\n for: 'keyword',\n in: 'keyword',\n tailstrict: 'keyword',\n error: 'keyword',\n true: 'atom',\n false: 'atom',\n null: 'atom',\n};\n\ntype State = {\n cComment: boolean;\n textBlock: boolean;\n textBlockIndent: number | null;\n string: boolean;\n importString: boolean;\n stringSingle: boolean;\n stringRaw: boolean;\n};\n\nexport const jsonnet: StreamParser<State> = {\n name: 'jsonnet',\n\n // `toggleComment` is a no-op without these, so Mod-/ silently does nothing.\n languageData: { commentTokens: { line: '//', block: { open: '/*', close: '*/' } } },\n\n startState: () => ({\n cComment: false,\n textBlock: false,\n textBlockIndent: null,\n string: false,\n importString: false,\n stringSingle: false,\n stringRaw: false,\n }),\n\n token: (stream, state) => {\n if (state.cComment) {\n if (stream.match(COMMENT_END)) {\n state.cComment = false;\n return 'comment';\n }\n stream.next();\n return 'comment';\n }\n\n // A `|||` block runs from its own first content line to the first line\n // indented less than that — so the closing `|||` has to be recognised\n // before the indent is measured, or a block closed at column 0 never ends.\n if (state.textBlock) {\n if (state.textBlockIndent == null) {\n if (stream.match(TEXT_BLOCK_END)) {\n state.textBlock = false;\n return 'string';\n }\n state.textBlockIndent = stream.indentation();\n }\n if (stream.indentation() >= state.textBlockIndent) {\n stream.skipToEnd();\n return 'string';\n }\n if (stream.match(TEXT_BLOCK_END)) {\n state.textBlock = false;\n return 'string';\n }\n stream.next();\n return 'invalid';\n }\n\n // Quoted and `@`-raw strings, single or double, plain or after an import.\n if (state.string || state.importString) {\n const style = state.string ? 'string' : 'meta';\n\n if (state.stringRaw) {\n if (stream.match(state.stringSingle ? RAW_SINGLE : RAW_DOUBLE)) return 'escape';\n } else {\n if (stream.match(ESCAPE)) return 'escape';\n if (stream.match(UNICODE_ESCAPE)) return 'escape';\n if (stream.match(BACKSLASH)) return 'invalid';\n }\n\n if (stream.match(state.stringSingle ? CLOSE_SINGLE : CLOSE_DOUBLE)) {\n state.string = false;\n state.importString = false;\n return style;\n }\n\n stream.next();\n return style;\n }\n\n if (stream.match(COMMENT_START)) {\n stream.skipToEnd();\n return 'comment';\n }\n if (stream.match(C_COMMENT_START)) {\n state.cComment = true;\n return 'comment';\n }\n\n // An import opens a string that is styled as meta rather than as content.\n const imported = stream.match(IMPORT);\n if (Array.isArray(imported)) {\n state.importString = true;\n state.stringRaw = imported[1] === '@';\n state.stringSingle = imported[2] === \"'\";\n return 'meta';\n }\n\n const quoted = stream.match(QUOTE);\n if (Array.isArray(quoted)) {\n state.string = true;\n state.stringRaw = quoted[1] === '@';\n state.stringSingle = quoted[2] === \"'\";\n return 'string';\n }\n\n if (stream.match(TEXT_BLOCK)) {\n state.textBlock = true;\n state.textBlockIndent = null;\n return 'string';\n }\n\n if (stream.match(ROOT)) return 'keyword';\n if (stream.match(NUMBER)) return 'number';\n if (stream.match(OPERATOR)) return 'operator';\n\n // Consumed whole so that a keyword's prefix (`locally`) is not styled.\n const identifier = stream.match(IDENTIFIER);\n if (Array.isArray(identifier)) return KEYWORDS[identifier[0]] ?? null;\n\n stream.next();\n return null;\n },\n};\n","import { useSyncExternalStore } from 'react';\nimport { type Extension } from '@codemirror/state';\n\n/**\n * CodeMirror themes are plain objects handed to CodeMirror at build time — they\n * cannot reference CSS custom properties the way a Tailwind class can. To let the\n * in-editor chrome (surface, gutter, selection, read-only wash) re-skin with the\n * active brand and light/dark mode, we resolve the live `--*` values at\n * theme-build time and feed the resulting `rgb()` strings into the theme.\n *\n * Mirrors `MermaidDiagram.resolvePrimary()`: SSR/no-document guard, read the\n * space-separated RGB channels off `<html>`, fall back to a literal when the\n * variable is absent, and wrap in `rgb(...)`.\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 alpha === undefined ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;\n};\n\n/**\n * Whether the dark colour scheme is active, for theme values that are a\n * light/dark *pair* rather than a single token lookup — a categorical wash\n * (diff added/removed, deleted pane) has no semantic token to resolve, but an\n * opaque light pastel still has to become a low-alpha tint under dark or it\n * strands the near-white `foreground` on a light slab.\n *\n * Only meaningful inside a `useThemedExtension` builder, which already rebuilds\n * on `data-theme` changes.\n */\nexport const isDarkScheme = (): boolean =>\n typeof document !== 'undefined' && document.documentElement.getAttribute('data-theme') === 'dark';\n\nconst SSR_SIGNAL = 'ssr';\n\n// Both axes that change the resolved `--*` values live as attributes on\n// `<html>` (see ThemeProvider): `data-theme` (light/dark) and `data-brand`.\nconst readThemeSignal = (): string => {\n if (typeof document === 'undefined') return SSR_SIGNAL;\n const root = document.documentElement;\n return `${root.getAttribute('data-theme') ?? ''}:${root.getAttribute('data-brand') ?? ''}`;\n};\n\nconst subscribeThemeSignal = (onChange: () => void): (() => void) => {\n if (typeof document === 'undefined') return () => {};\n const observer = new MutationObserver(onChange);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'data-brand'],\n });\n return () => observer.disconnect();\n};\n\n// Deliberately reads `<html>` attributes rather than `useColorScheme()` /\n// `useTheme()`: the editors must re-skin even when rendered without a\n// `ThemeProvider` (matching MermaidDiagram), and a DOM subscription is the only\n// provider-independent source of the light/dark + brand signal.\nconst useThemeSignal = (): string =>\n useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);\n\n// Cached across component instances, not just across renders. A CodeMirror theme\n// extension carries its own StyleModule, and mounting an EditorView appends its\n// rules to a document-level stylesheet — which invalidates style for the whole\n// document. Sharing one module per theme keeps the stylesheet a constant size no\n// matter how many editors mount.\nconst themeCache = new Map<string, Extension>();\n\n/**\n * Memoize a CodeMirror theme/extension built from `resolveToken`, shared across\n * every instance that passes the same `cacheKey` and rebuilt whenever the active\n * brand / light-dark mode changes. `build` reads live `--*` values off\n * `<html>`, so the theme signal is an invisible dependency a deps array can't see.\n *\n * `cacheKey` is the extension's full identity: anything the builder closes over\n * must be part of it (e.g. `` `merge-pane:${deleted}` ``), or instances built\n * from different inputs would share one theme.\n */\nexport const useThemedExtension = (cacheKey: string, build: () => Extension): Extension => {\n const themeSignal = useThemeSignal();\n const key = `${themeSignal} ${cacheKey}`;\n\n // The module-level cache is the memo; reading and filling it during render is\n // idempotent and keyed only on values already stable for the render.\n let cached = themeCache.get(key);\n if (!cached) {\n cached = build();\n themeCache.set(key, cached);\n }\n\n return cached;\n};\n","import { javascript } from '@codemirror/lang-javascript';\nimport { json } from '@codemirror/lang-json';\nimport { python } from '@codemirror/lang-python';\nimport { MSSQL, MySQL, PLSQL, PostgreSQL, StandardSQL } from '@codemirror/lang-sql';\nimport { StreamLanguage } from '@codemirror/language';\nimport { r } from '@codemirror/legacy-modes/mode/r';\nimport { shell } from '@codemirror/legacy-modes/mode/shell';\nimport { toml } from '@codemirror/legacy-modes/mode/toml';\nimport { tags } from '@lezer/highlight';\nimport { githubLightInit } from '@uiw/codemirror-theme-github';\nimport type { BasicSetupOptions } from '@uiw/react-codemirror';\n\nimport { getSqlLanguageSupport } from '@keboola/codemirror-lang-sql';\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { dbt } from './modes/dbt';\nimport { jsonnet } from './modes/jsonnet';\nimport { resolveToken } from './tokenTheme';\n\n// The MIME vocabulary callers pass. Kept as a const so the runtime whitelist and\n// the type stay one list — an annotated `LANGUAGE_MODE[]` copy elsewhere silently\n// drifts, since the type checker accepts a short one.\nexport const LANGUAGE_MODES = [\n 'application/json',\n 'text/plain',\n 'text/x-python',\n 'text/x-sql',\n 'text/x-mysql',\n 'text/x-pgsql',\n 'text/x-mssql',\n // Snowflake, under a historical name — these strings are a published prop contract.\n 'text/x-sfsql',\n 'text/x-bqsql',\n 'text/x-plsql',\n 'text/x-rsrc',\n 'text/x-sh',\n 'text/x-toml',\n 'text/jsonnet',\n 'text/x-dbt',\n 'text/javascript',\n 'text/typescript',\n] as const;\n\nexport type LANGUAGE_MODE = (typeof LANGUAGE_MODES)[number];\n\nexport const isLanguageMode = (mode: string): mode is LANGUAGE_MODE =>\n (LANGUAGE_MODES as readonly string[]).includes(mode);\n\n// `readOnly` reaches CodeMirror as `contenteditable`, so the two states are only\n// addressable through it. Exported because `fieldChrome` overrides the read-only\n// wash below by re-declaring the same key — which only works while the strings\n// match exactly.\nexport const READ_ONLY_EDITOR = '&.cm-editor:has(.cm-content[contenteditable=\"false\"])';\nexport const EDITABLE_EDITOR = '&.cm-editor:has(.cm-content[contenteditable=\"true\"])';\n\n// Chrome surfaces (selection, read-only wash) resolve from live `--*`\n// tokens so they re-skin with brand + dark mode; diff/syntax colors below stay\n// categorical (fixed across brands). Fallback channels mirror the light-mode\n// token values for SSR / no-provider parity.\nexport const buildBaseThemeStyles = () => ({\n '*': { lineHeight: '20px' },\n '*::selection': {\n backgroundColor: resolveToken('primary', '31 143 255'),\n color: `${resolveToken('primary-foreground', '255 255 255')} !important`,\n },\n [READ_ONLY_EDITOR]: {\n backgroundColor: resolveToken('secondary', '226 232 240'),\n },\n [`${READ_ONLY_EDITOR} .cm-gutters`]: {\n backgroundColor: resolveToken('border', '229 231 235'),\n },\n '&.cm-editor .cm-scroller': { overflowAnchor: 'none' },\n '&.cm-editor, &.cm-editor .cm-scroller': {\n minHeight: '100%',\n flexGrow: 1,\n alignItems: 'stretch !important',\n outline: 'none',\n },\n '.cm-gutter.cm-foldGutter': { display: 'none !important' },\n '.cm-gutter.cm-lineNumbers': { paddingLeft: '20px', paddingRight: '6px' },\n '.cm-gutters': { height: 'auto' },\n\n // merge (diff) view\n '&[class*=\"cm-merge-\"] .cm-deletedLine': { backgroundColor: colors.error[100] },\n '&[class*=\"cm-merge-\"] .cm-changedLine': { backgroundColor: colors.green[100] },\n '&[class*=\"cm-merge-\"] .cm-deletedLineGutter': { backgroundColor: colors.error[200] },\n '&[class*=\"cm-merge-\"] .cm-changedLineGutter': { backgroundColor: colors.green[200] },\n '&[class*=\"cm-merge-\"] .cm-deletedText': { background: colors.error[200] },\n '&[class*=\"cm-merge-\"] .cm-changedText': { background: colors.green[200] },\n '&[class*=\"cm-merge-\"]': {\n backgroundColor: `${colors.white} !important`,\n },\n '&[class*=\"cm-merge-\"] .cm-gutters': {\n backgroundColor: `${colors.white} !important`,\n },\n '.cm-changeGutter': { position: 'absolute', zIndex: -1, width: '100%', paddingLeft: 0 },\n '&[class*=\"cm-merge-\"] .cm-changedLine,&[class*=\"cm-merge-\"] .cm-line, &[class*=\"cm-merge-\"] .cm-deletedChunk':\n { paddingLeft: 0 },\n});\n\n// Dead whatever the editor does with them: `buildBaseThemeStyles` hides the fold\n// gutter outright, and `buildCustomTheme` paints the active line transparent.\nconst ALWAYS_OFF = {\n drawSelection: false,\n foldGutter: false,\n foldKeymap: false,\n highlightActiveLine: false,\n highlightActiveLineGutter: false,\n} as const;\n\n// `basicSetup` enables everything it is not told to skip, so a viewer would\n// otherwise install bracket closing and keybindings for commands a read-only\n// document rejects. Search stays — Mod-f is useful on a viewer. Same reasoning\n// as `shouldLintJson` below.\n//\n// `history` stays too, though a viewer can never add an entry: a caller that\n// flips `readOnly` mid-session reconfigures the view, and a reconfigure discards\n// state fields the new configuration doesn't have. Leaving it out saves nothing\n// and costs the editable session its undo stack.\n//\n// Autocompletion is absent here on purpose: `CodeEditor` installs its own\n// `autocompletion()` extension, which is appended after this object and would\n// re-add the plugin and its keymap. It gates that call on `readOnly` instead.\nexport const buildBasicSetup = (readOnly: boolean): BasicSetupOptions => ({\n ...ALWAYS_OFF,\n ...(readOnly\n ? {\n closeBrackets: false,\n closeBracketsKeymap: false,\n lintKeymap: false,\n indentOnInput: false,\n rectangularSelection: false,\n dropCursor: false,\n highlightSelectionMatches: false,\n }\n : null),\n});\n\n// Editor surface + gutter resolve from live `--*` tokens; the github\n// syntax palette stays categorical. Fallback channels mirror the light-mode\n// token values. `foreground` / `gutterForeground` pair the token-driven\n// surfaces with token-driven text so line content and line numbers stay\n// readable when the background goes dark (e.g. standalone, no surrounding\n// `tw:text-foreground`).\n//\n// `styles` corrects the stock github palette where a colour stops carrying\n// meaning (later entries win over the stock rule for the same tag), for every\n// language this theme paints — the SQL modes that motivated it (UT-5024) and\n// JSON, python, JS alike. The github theme paints every `name`-family tag\n// green, and in SQL nearly every token is a name — identifiers, function calls\n// and `$variables` all drowned in one colour, and a keyword that doubles as a\n// function (`create or REPLACE`) read as a value. Instead: plain identifiers,\n// quoted identifiers (`\"a column\"`) and brackets carry no colour (matching\n// github.com's own rendering; stock github also lumped brackets in with\n// comments), functions and special vars get their own hues, and amber is\n// unique to string literals — in JSON that shifts string values from navy to\n// amber, the one visible non-SQL change.\nexport const buildCustomTheme = () => {\n const foreground = resolveToken('foreground', '30 41 59');\n\n return githubLightInit({\n settings: {\n fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,\n background: resolveToken('background', '249 250 251'),\n foreground,\n gutterBackground: resolveToken('muted', '241 245 249'),\n gutterForeground: resolveToken('muted-foreground', '100 116 139'),\n gutterBorder: 'transparent',\n lineHighlight: 'transparent',\n selection: resolveToken('primary', '31 143 255'),\n },\n styles: [\n { tag: [tags.name, tags.special(tags.string), tags.bracket], color: foreground },\n { tag: tags.standard(tags.name), color: colors.purple[600] },\n { tag: tags.special(tags.name), color: colors.cyan[700] },\n { tag: tags.string, color: colors.warning[700] },\n ],\n });\n};\n\nexport const getLanguageMode = (mode?: LANGUAGE_MODE) => {\n switch (mode) {\n case undefined:\n case 'application/json':\n return json();\n case 'text/x-python':\n return python();\n case 'text/x-sql':\n return getSqlLanguageSupport(StandardSQL);\n case 'text/x-mysql':\n return getSqlLanguageSupport(MySQL);\n case 'text/x-pgsql':\n return getSqlLanguageSupport(PostgreSQL);\n case 'text/x-mssql':\n return getSqlLanguageSupport(MSSQL);\n case 'text/x-sfsql':\n return getSqlLanguageSupport('snowflake');\n case 'text/x-bqsql':\n return getSqlLanguageSupport('bigquery');\n case 'text/x-plsql':\n return getSqlLanguageSupport(PLSQL);\n case 'text/x-rsrc':\n return StreamLanguage.define(r);\n case 'text/x-sh':\n return StreamLanguage.define(shell);\n case 'text/x-toml':\n return StreamLanguage.define(toml);\n case 'text/jsonnet':\n return StreamLanguage.define(jsonnet);\n case 'text/x-dbt':\n return StreamLanguage.define(dbt);\n case 'text/javascript':\n return javascript({ jsx: true });\n case 'text/typescript':\n return javascript({ jsx: true, typescript: true });\n // No language — `text/plain` lands here, and so does any mode added to\n // LANGUAGE_MODES without an arm above. Unstyled text is the safe degradation;\n // a `json()` default would colour unrelated content as if it were JSON.\n default:\n return [];\n }\n};\n\n// The JSON parse linter is only useful on an editable editor — a read-only one\n// can't act on the errors, so running it is wasted work and its underlines are\n// noise (e.g. non-strict JSON shown read-only in Kai chat).\nexport const shouldLintJson = (mode: LANGUAGE_MODE | undefined, readOnly: boolean): boolean =>\n mode === 'application/json' && !readOnly;\n","import type { ReactNode } from 'react';\n\nimport { ClipboardButton } from '../../blocks/ClipboardButton';\n\n// Floats over the top-right corner of the editor it is rendered into — private to\n// `CodeEditor`, which is the `relative` ancestor it positions against. `right-3`\n// leaves room for the scrollbar track, whose width the browser owns and no token\n// here describes.\nexport const ButtonToolbar = ({ value, children }: { value?: string; children?: ReactNode }) => {\n if (!value && !children) return null;\n\n return (\n <div className=\"tw:absolute tw:right-3 tw:top-1 tw:z-10 tw:flex tw:gap-0.5 tw:overflow-visible tw:rounded tw:border tw:border-solid tw:border-border tw:!bg-background tw:p-px tw:shadow-sm\">\n {!!value && <ClipboardButton size=\"icon-xs\" variant=\"invisible\" text={value} />}\n {children}\n </div>\n );\n};\n","import colors from '@keboola/tailwind-config/colors';\n\nimport { EDITABLE_EDITOR, READ_ONLY_EDITOR } from './helpers';\nimport { resolveToken } from './tokenTheme';\n\n/**\n * The parts of an editor's outer chrome that differ between presets; how they\n * reach CodeMirror's selectors lives once in `buildChromeStyles`.\n */\nexport type EditorChrome = {\n surface: string;\n borderColor: string;\n readOnlySurface: string;\n readOnlyBorderColor: string;\n /** `null` for a preset with no hover affordance — form inputs have none. */\n hoverBorderColor: string | null;\n focusBorderColor: string;\n focusRing: string;\n radius: string;\n paddingY: string;\n /** `null` leaves CodeMirror's own 6px/2px line inset alone. */\n paddingX: { left: string; right: string } | null;\n};\n\n/**\n * Mirrors `InputGroup` at the sizing each design language gives a `TextInput`,\n * so an editor dropped into a form reads as one of its fields.\n *\n * The legacy preset reads the neutral ramp because the legacy `secondary`\n * variant does. No semantic token holds that grey, and the nearest one\n * (`--muted`) is a few points off — which is the \"almost, but not quite, the\n * input next to it\" mismatch this preset exists to remove.\n */\nexport const buildInputChrome = (isArgo: boolean): EditorChrome => ({\n surface: isArgo ? resolveToken('muted', '241 245 249') : colors.neutral[100],\n borderColor: isArgo ? resolveToken('input', '203 213 225') : colors.neutral[100],\n readOnlySurface: isArgo ? resolveToken('muted', '241 245 249') : colors.neutral[150],\n readOnlyBorderColor: isArgo ? resolveToken('input', '203 213 225') : colors.neutral[150],\n hoverBorderColor: null,\n focusBorderColor: isArgo\n ? resolveToken('primary', '37 99 235')\n : resolveToken('ring', '31 143 255'),\n focusRing: `0 0 0 4px ${resolveToken('ring', '31 143 255', isArgo ? 0.5 : 0.3)}`,\n radius: isArgo ? 'var(--radius-lg, 0.25rem)' : '0.25rem',\n // 2px border + 2×this + `.cm-content`'s own 4px + a 20px line, against the\n // height a one-line `TextInput` has: argo forces `sizing: 'medium'` (36px),\n // legacy leaves it at `default` (40px).\n paddingY: isArgo ? '3px' : '5px',\n // Tops `.cm-line`'s 6px/2px up to the 16px an input's text is inset by.\n paddingX: { left: '10px', right: '14px' },\n});\n\n/** The SQL workspace's notebook cell: a white canvas, not a form control. */\nexport const buildCanvasChrome = (): EditorChrome => ({\n surface: resolveToken('card', '255 255 255'),\n borderColor: 'transparent',\n readOnlySurface: resolveToken('muted', '241 245 249'),\n readOnlyBorderColor: 'transparent',\n hoverBorderColor: resolveToken('ring', '31 143 255'),\n focusBorderColor: resolveToken('ring', '31 143 255'),\n focusRing: `0 0 0 4px ${resolveToken('ring', '31 143 255', 0.3)}`,\n radius: '8px',\n paddingY: '8px',\n paddingX: null,\n});\n\n/**\n * Spread over `buildBaseThemeStyles()` — never used alone. The read-only keys\n * are the base's own, so they replace its wash instead of landing beside it.\n */\nexport const buildChromeStyles = (chrome: EditorChrome) => ({\n '&.cm-editor': {\n border: `solid 1px ${chrome.borderColor}`,\n borderRadius: chrome.radius,\n backgroundColor: chrome.surface,\n paddingTop: chrome.paddingY,\n paddingBottom: chrome.paddingY,\n },\n '&.cm-editor :is(.cm-gutters,.cm-scroller)': { backgroundColor: chrome.surface },\n\n ...(chrome.paddingX\n ? {\n // Only without a gutter: there the editor reads as a one-line input and\n // its text should start where a neighbouring `TextInput`'s does. With a\n // gutter, the gutter owns the left edge.\n '&.cm-editor:not(:has(.cm-gutters)) .cm-content': {\n paddingLeft: chrome.paddingX.left,\n paddingRight: chrome.paddingX.right,\n },\n }\n : null),\n\n ...(chrome.hoverBorderColor\n ? { [`${EDITABLE_EDITOR}:hover`]: { borderColor: chrome.hoverBorderColor } }\n : null),\n [`${EDITABLE_EDITOR}:focus-within`]: {\n borderColor: chrome.focusBorderColor,\n boxShadow: chrome.focusRing,\n },\n\n [READ_ONLY_EDITOR]: {\n backgroundColor: chrome.readOnlySurface,\n borderColor: chrome.readOnlyBorderColor,\n },\n [`${READ_ONLY_EDITOR} .cm-gutters`]: { backgroundColor: chrome.readOnlySurface },\n [`${READ_ONLY_EDITOR} .cm-scroller`]: { backgroundColor: chrome.readOnlySurface },\n});\n","import { StateEffect, StateField, type Text } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { escapeStringRegexp } from '../../utils/escapeStringRegexp';\n\n// Represents a single search match in the editor\ntype SearchMatch = {\n /** Start position in document */\n from: number;\n /** End position in document */\n to: number;\n /** Text content of the match */\n text: string;\n /** Local match index within this editor (0-based) */\n localIndex: number;\n};\n\n// Effect to update search state\nconst setSearchEffect = StateEffect.define<{\n query: string;\n selectedMatchIndex?: number;\n}>();\n\n// State to track current search matches\ntype SearchState = {\n query: string;\n selectedMatchIndex?: number;\n matches: SearchMatch[];\n decorations: DecorationSet;\n};\n\n// Find all matches in the document\nfunction findMatches(doc: Text, query: string): SearchMatch[] {\n if (!query) return [];\n\n const text = doc.toString();\n\n try {\n const regex = new RegExp(escapeStringRegexp(query), 'gi');\n\n return Array.from(text.matchAll(regex)).map((match, index) => {\n const from = match.index!;\n const to = from + match[0].length;\n\n return { from, to, text: match[0], localIndex: index };\n });\n } catch (e) {\n // Invalid regex - return no matches\n console.warn('Invalid search regex:', e);\n return [];\n }\n}\n\n// Create decorations for search matches\nfunction createDecorations(matches: SearchMatch[], selectedLocalIndex?: number): DecorationSet {\n const decorations = matches.map((match) => {\n const isSelected = match.localIndex === selectedLocalIndex;\n\n const decoration = Decoration.mark({\n class: isSelected ? 'cm-searchMatch-selected' : 'cm-searchMatch',\n });\n\n return decoration.range(match.from, match.to);\n });\n\n return Decoration.set(decorations, true);\n}\n\n// StateField to manage search state\nconst searchField = StateField.define<SearchState>({\n create() {\n return {\n query: '',\n selectedMatchIndex: undefined,\n matches: [],\n decorations: Decoration.none,\n };\n },\n\n update(state, tr) {\n let newState = state;\n\n // Handle search effect\n for (const effect of tr.effects) {\n if (!effect.is(setSearchEffect)) {\n continue;\n }\n\n const { query, selectedMatchIndex } = effect.value;\n\n // Find matches\n const matches = findMatches(tr.state.doc, query);\n\n // Create decorations\n const decorations = createDecorations(matches, selectedMatchIndex);\n\n newState = {\n query,\n selectedMatchIndex,\n matches,\n decorations,\n };\n }\n\n // Map decorations through document changes\n if (tr.docChanged && newState.query) {\n const matches = findMatches(tr.state.doc, newState.query);\n const decorations = createDecorations(matches, newState.selectedMatchIndex);\n\n newState = {\n ...newState,\n matches,\n decorations,\n };\n }\n\n return newState;\n },\n\n provide: (field) => EditorView.decorations.from(field, (state) => state.decorations),\n});\n\n// View plugin to handle scrolling to selected match\nconst searchViewPlugin = ViewPlugin.fromClass(\n class {\n private lastSelectedIndex?: number;\n\n update(update: ViewUpdate) {\n const state = update.state.field(searchField);\n\n // Scroll to selected match when it changes\n if (\n state.selectedMatchIndex !== undefined &&\n state.selectedMatchIndex !== this.lastSelectedIndex\n ) {\n const match = state.matches[state.selectedMatchIndex];\n\n if (match) {\n requestAnimationFrame(() => {\n update.view.dispatch({\n effects: EditorView.scrollIntoView(match.from, { y: 'center' }),\n });\n });\n }\n\n this.lastSelectedIndex = state.selectedMatchIndex;\n }\n\n // Reset if no selection\n if (state.selectedMatchIndex === undefined) {\n this.lastSelectedIndex = undefined;\n }\n }\n },\n);\n\nconst searchTheme = EditorView.baseTheme({\n '.cm-searchMatch': {\n backgroundColor: colors.blue[100],\n },\n '.cm-searchMatch > span': {\n color: `${colors.blue[600]} !important`,\n },\n '.cm-searchMatch-selected': {\n backgroundColor: colors.blue[600],\n },\n '.cm-searchMatch-selected > span': {\n color: `${colors.white} !important`,\n },\n});\n\nexport function searchExtension() {\n return [searchField, searchViewPlugin, searchTheme];\n}\n\nexport function updateSearch(view: EditorView, query: string, selectedMatchIndex?: number) {\n view.dispatch({ effects: setSearchEffect.of({ query, selectedMatchIndex }) });\n}\n","import { isMac } from '../../utils';\nimport { Kbd } from '../Kbd';\n\nexport const ToggleComponentHelp = () => (\n <div>\n Use <Kbd>{isMac ? 'Command+/' : 'Ctrl+/'}</Kbd> to toggle comments.\n </div>\n);\n","import { useMemo } from 'react';\nimport { Compartment, type Extension } from '@codemirror/state';\nimport { tooltips, ViewPlugin } from '@codemirror/view';\n\n// A `position: fixed` box is laid out against the viewport — and so escapes\n// every scroll container above it — only while no ancestor claims the job of\n// being its containing block. This encodes the CSS rule for who claims it\n// rather than the subset this repo happens to use today; `contain` and\n// `will-change` take value lists, so those two are matched loosely.\n//\n// `content-visibility` is absent on purpose: it implies containment without\n// saying so through `contain`, and it is handled below as a clipper — which is\n// the stronger of the two properties for our purposes.\nconst establishesFixedContainingBlock = (style: CSSStyleDeclaration) =>\n style.transform !== 'none' ||\n style.translate !== 'none' ||\n style.rotate !== 'none' ||\n style.scale !== 'none' ||\n style.perspective !== 'none' ||\n style.filter !== 'none' ||\n style.backdropFilter !== 'none' ||\n /\\b(paint|layout|strict|content)\\b/.test(style.contain) ||\n /\\b(transform|perspective|filter|contain)\\b/.test(style.willChange);\n\n// Crops its content, so hosting the tooltip inside it would not help. Paint\n// containment — which `content-visibility: auto` turns on without ever showing\n// up in computed `contain` — crops even a fixed-position descendant, and so\n// does a mask.\nconst crops = (style: CSSStyleDeclaration) =>\n style.overflowX !== 'visible' ||\n style.overflowY !== 'visible' ||\n style.maskImage !== 'none' ||\n style.contentVisibility !== 'visible' ||\n /\\b(paint|strict|content)\\b/.test(style.contain);\n\n/**\n * Where a tooltip can hang without being cropped, or `null` for \"wherever\n * CodeMirror would put it anyway\".\n *\n * Two ancestors matter, and they are not the same ancestor. The **outermost\n * cropper** is the one to get above — landing anywhere below it leaves the\n * tooltip inside the box doing the cropping. The **containing block** is where\n * the search can stop, because from there upwards `position: fixed` is measured\n * against that element and nothing higher can crop it.\n *\n * `document.body` and `<html>` are not treated as croppers: a fixed box whose\n * containing block is the viewport is not clipped by their overflow, and\n * hosting outside `<body>` would drop the tooltip out of the app's stacking and\n * pointer-events scope for no gain.\n */\nconst findTooltipHost = (from: HTMLElement) => {\n let outermostCropper: HTMLElement | null = null;\n\n for (let node = from.parentElement; node && node !== document.body; node = node.parentElement) {\n const style = getComputedStyle(node);\n\n if (crops(style)) {\n outermostCropper = node;\n } else if (establishesFixedContainingBlock(style)) {\n return outermostCropper?.parentElement ?? node;\n }\n }\n\n return outermostCropper?.parentElement ?? null;\n};\n\n/**\n * `tooltips()`, re-hosted so the completion popup is never cropped.\n *\n * CodeMirror hangs tooltips inside the editor and lets `position: fixed` carry\n * them past its edges. That holds only while the viewport is their containing\n * block — a modal centred with a translate, a sheet sliding in, or a box under\n * paint containment takes that job, and then every scroller, mask and contained\n * box in between crops the popup instead. A tall editor hides the damage; a\n * one-line one shows a sliver of an unreadable list.\n *\n * The two shapes this has to survive in production are a `Modal`, whose body\n * scrolls and carries the argo fade mask, and kbc-ui's SQL editor, which wraps\n * every code block in `content-visibility: auto` to keep long scripts cheap.\n *\n * Hosting the layer above the outermost cropper clears all of that while keeping\n * the popup inside the modal's stacking, focus and pointer-events scope — which\n * `document.body` would not: the popup would sit behind the modal, and Radix\n * leaves the body `pointer-events: none` while a dialog is open.\n *\n * Both editors install this, and it is the only place either of them configures\n * a tooltip host. Keep it that way: CodeMirror's tooltip config takes the first\n * contributor that names a parent, so a second mechanism would not compose with\n * this one — it would silently win or lose on extension order.\n */\nconst tooltipsExtension = (): Extension => {\n // The resolved host lives in a compartment, not in an appended config: React\n // hands CodeMirror a new extension array whenever the editor's props move,\n // which dispatches a full reconfigure. That replaces appended config, while\n // compartment contents are carried over.\n const layer = new Compartment();\n\n return [\n layer.of(tooltips()),\n ViewPlugin.define((view) => {\n // Deferred on two counts: a plugin cannot dispatch while the view it\n // belongs to is still being built, and reading computed styles here would\n // force a style and layout flush in the middle of the commit that inserted\n // the editor. The lookup is one-shot — an ancestor that gains a transform\n // afterwards is not picked up.\n const scheduled = setTimeout(() => {\n if (!view.dom.isConnected) return;\n\n const parent = findTooltipHost(view.dom);\n if (parent) view.dispatch({ effects: layer.reconfigure(tooltips({ parent })) });\n });\n\n return { destroy: () => clearTimeout(scheduled) };\n }),\n ];\n};\n\n/**\n * The extension above, built once per editor. Rebuilding it would hand\n * CodeMirror a fresh compartment and plugin on every reconfigure, dropping the\n * host it had already resolved — so it is only ever reached through this hook.\n */\nexport const useTooltipsExtension = () => useMemo(tooltipsExtension, []);\n","import type { Completion, CompletionContext, CompletionSource } from '@codemirror/autocomplete';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\n\nexport type EditorVariable = { name: string; value?: string };\n\n// Keywords come by the hundred from the language, so a variable would otherwise rank\n// below every one of them that shares a prefix.\nconst BOOST = 2000;\n\n// One brace or two, because `closeBrackets` turns a typed `{` into `{}` and a caret\n// that has only opened the placeholder is still asking for a variable. One charset\n// for the name throughout: a second, narrower one would start the range mid-name on\n// anything it disagreed about, and a range that starts mid-name never matches.\nconst NAME = String.raw`[\\w-]*`;\nconst AT_CARET = new RegExp(String.raw`(?:\\{{1,2} ?)?${NAME}$`);\nconst NAME_AT_END = new RegExp(`${NAME}$`);\nconst OPENING = /\\{{1,2} ?$/;\nconst CLOSING = /^ ?\\}{1,2}/;\n\n/**\n * Completes a mustache-style `{{name}}` placeholder.\n */\nexport const completeVariables = (variables: EditorVariable[] = []): CompletionSource => {\n if (variables.length === 0) return () => null;\n\n const options: Completion[] = variables.map(({ name, value }) => ({\n // The bare name: `SqlEditor` filters prefix-only while `CodeEditor` filters\n // fuzzily, and this is the only spelling both accept whether or not the caret\n // has typed the braces. The braces are `displayLabel`, which is what renders.\n label: name,\n displayLabel: `{{${name}}}`,\n detail: value,\n type: 'variable',\n boost: BOOST,\n apply: (view, completion, from, to) => {\n const { doc } = view.state;\n const line = doc.lineAt(from);\n const insert = `{{${completion.label}}}`;\n\n // The range covers the name alone, so the braces around it are found rather\n // than assumed — `closeBrackets` may have added a closing one nobody typed.\n const opening = OPENING.exec(doc.sliceString(line.from, from));\n const closing = CLOSING.exec(doc.sliceString(to, line.to));\n const start = opening ? from - opening[0].length : from;\n const end = closing ? to + closing[0].length : to;\n\n view.dispatch({\n changes: { from: start, to: end, insert },\n selection: { anchor: start + insert.length },\n });\n },\n }));\n\n return (context: CompletionContext) => {\n const match = context.matchBefore(AT_CARET);\n\n if (!match?.text) return null;\n\n const [name = ''] = NAME_AT_END.exec(match.text) ?? [];\n\n return { from: match.to - name.length, options };\n };\n};\n\n/**\n * The completion source both editors install, with an identity that never moves.\n *\n * Both hold it inside the memo that keys their whole extension tree, and callers\n * build the list inline — a config row mapped to `{ name, value }` in a store\n * selector, so a fresh array arrives on every store push. Because CodeMirror asks\n * the source for options rather than reading them up front, holding it steady costs\n * nothing: a completion request always reaches the latest render's variables.\n */\nexport const useVariableCompletion = (variables: EditorVariable[] = []): CompletionSource =>\n useStableCallback(completeVariables(variables));\n","import { useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport type { KeyboardEvent, ReactNode } from 'react';\nimport type { CompletionSource } from '@codemirror/autocomplete';\nimport { autocompletion, completeAnyWord } from '@codemirror/autocomplete';\nimport { jsonParseLinter } from '@codemirror/lang-json';\nimport { linter } from '@codemirror/lint';\nimport { unifiedMergeView } from '@codemirror/merge';\nimport { EditorView, keymap, placeholder as cmPlaceholder } from '@codemirror/view';\nimport CodeMirror, {\n EditorState,\n type Extension,\n type ReactCodeMirrorRef,\n} from '@uiw/react-codemirror';\n\nimport { keyCodes } from '../../constants/keyCodes';\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { cn } from '../../utils';\nimport { HelpBlock } from '../HelpBlock';\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nimport { ButtonToolbar } from './ButtonToolbar';\nimport { buildChromeStyles, buildInputChrome } from './editorChrome';\nimport type { LANGUAGE_MODE } from './helpers';\nimport {\n buildBaseThemeStyles,\n buildBasicSetup,\n buildCustomTheme,\n getLanguageMode,\n shouldLintJson,\n} from './helpers';\nimport { searchExtension, updateSearch } from './search';\nimport { ToggleComponentHelp } from './ToggleComponentHelp';\nimport { useThemedExtension } from './tokenTheme';\nimport { useTooltipsExtension } from './tooltips';\nimport { type EditorVariable, useVariableCompletion } from './variableCompletion';\n\ntype Props = {\n value: string;\n previousValue?: string;\n /**\n * `'field'` draws the chrome an `InputGroup` draws — surface, border, radius,\n * focus ring, read-only wash — for an editor that is one control among others\n * in a form. It sizes to its content, so don't pin its height.\n *\n * `'plain'` (the default) is the full-bleed surface of an editor that *is* the\n * panel: a modal body, a chat block, a fixed-height viewer already framed by\n * whatever contains it.\n */\n variant?: 'plain' | 'field';\n mode?: LANGUAGE_MODE;\n placeholder?: string;\n /** Names the editable region for screen readers — the editor has no visible label of its own. */\n ariaLabel?: string;\n /**\n * Highlights every occurrence and scrolls the selected one into view. The find\n * UI is the caller's — pass the query it holds, and omit both props entirely to\n * leave the search extension uninstalled.\n */\n searchQuery?: string;\n searchMatchIndex?: number;\n readOnly?: boolean;\n /**\n * Refuses edits while leaving the editor looking and behaving as it did — for a\n * transient lock such as an in-flight save, where a keystroke landing mid-request\n * would be overwritten by the response. `readOnly` is the wrong prop for that:\n * it turns the editor into a viewer, greying the surface and taking the lint\n * marks and completions with it.\n */\n inputLocked?: boolean;\n /**\n * A flat list of completions, offered everywhere in the document. One word per\n * label: CodeMirror derives the pattern for the word being completed from the\n * labels' characters, so a space in one widens it across whitespace and the\n * editor offers nothing past the first word of a line. A phrase belongs in\n * `completionSource`.\n *\n * Compared by identity, like `completionSource` — hand the editor a stable array.\n */\n autocompletions?: string[];\n /**\n * Completions that depend on where the cursor is — a column list offered only\n * after its table, say. Wins over both `autocompletions` and `completeAny`,\n * which stay the right props for a list that is the same everywhere in the\n * document and for having no list at all. Like them, it opens on typing.\n *\n * Compared by identity: build it in a `useMemo` or the editor rebuilds its whole\n * extension tree on every render.\n */\n completionSource?: CompletionSource;\n /**\n * Configuration variables, completed into `{{name}}`. Independent of\n * `completionSource`: both are offered, so a caller keeps its own completions and\n * gets variables spelled the way the rest of the platform writes them.\n */\n variables?: EditorVariable[];\n extraKeys?: Record<string, () => void>;\n withToggleCommentHint?: boolean;\n withAutofocus?: boolean;\n withLineNumbers?: boolean;\n withLineWrapping?: boolean;\n withCollapseUnchanged?: boolean;\n withCopyButton?: boolean;\n completeAny?: boolean;\n help?: ReactNode;\n helpPostfix?: ReactNode;\n /**\n * Extra actions for the toolbar that floats over the editor's top-right corner,\n * beside the copy button. The toolbar is a 28px chip, so pass `size=\"icon-xs\"`\n * buttons — a default-sized one grows the chip and de-aligns the copy button.\n */\n renderAdditionalButtons?: (value?: string) => ReactNode;\n className?: string;\n} & (\n | { readOnly: true; onChange?: never }\n // `boolean` rather than `false`: a field the user's permissions may lock still\n // needs its handler for the case where they can edit.\n | { readOnly?: boolean; onChange: (value: string) => void }\n);\n\nconst emptyObject = {};\n\nexport const CodeEditor = ({\n value,\n previousValue,\n onChange,\n variant = 'plain',\n mode = 'application/json',\n placeholder = '',\n ariaLabel,\n searchQuery,\n searchMatchIndex,\n readOnly = false,\n inputLocked = false,\n autocompletions,\n completionSource,\n variables,\n extraKeys = emptyObject,\n withToggleCommentHint = false,\n withAutofocus = false,\n withLineNumbers = true,\n withLineWrapping = true,\n withCollapseUnchanged = false,\n withCopyButton = false,\n completeAny = false,\n help = null,\n helpPostfix = null,\n renderAdditionalButtons,\n className,\n}: Props) => {\n // CodeMirror rebuilds and re-resolves the whole extension tree whenever the\n // change handler's identity moves, and callers pass inline arrows.\n const handleChange = useStableCallback((next: string) => onChange?.(next));\n\n // Themes re-resolve their `--*` tokens on brand / light-dark change. The\n // syntax palette is keyed without a component prefix so `SqlEditor` — which\n // builds it from the same `buildCustomTheme` — shares this one module.\n // Presence, not truthiness: a caller that searches always passes the prop, so\n // the extension set stays stable while the query changes.\n const withSearch = searchQuery !== undefined;\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n\n useEffect(() => {\n const view = editorRef.current?.view;\n if (view && withSearch) updateSearch(view, searchQuery, searchMatchIndex);\n }, [withSearch, searchQuery, searchMatchIndex]);\n\n // A view created while a query is already set — a remount, a tab switch —\n // starts with no highlights unless the search is applied as it is built.\n const handleCreateEditor = useStableCallback((view: EditorView) => {\n if (searchQuery) updateSearch(view, searchQuery, searchMatchIndex);\n });\n\n // Same reasoning as `onChange` above, one level out: callers build this object\n // inline, so keying the extensions on it would reconfigure the editor on every\n // parent render. Only the set of bound keys can change what the keymap *is* —\n // the handlers behind them are read when the key is actually pressed.\n const extraKeysRef = useRef(extraKeys);\n useLayoutEffect(() => {\n extraKeysRef.current = extraKeys;\n });\n\n const boundKeysSignature = Object.keys(extraKeys).join('\\n');\n const boundKeys = useMemo(\n () => boundKeysSignature.split('\\n').filter(Boolean),\n [boundKeysSignature],\n );\n\n const tooltipLayer = useTooltipsExtension();\n\n // `languageData.of` takes a function CodeMirror calls per completion request, so\n // the source is built here rather than inside it — otherwise every keystroke that\n // opens the popup rebuilds an option per variable.\n const variableCompletion = useVariableCompletion(variables);\n\n const customTheme = useThemedExtension('editor:syntax', buildCustomTheme);\n\n // The brand decides which `InputGroup` the field chrome has to match, so it is\n // part of the theme's identity — `useThemedExtension` caches per key across\n // every instance, and the theme signal it keys on carries only `<html>`.\n const isArgo = useArgoDesign();\n const isField = variant === 'field';\n const baseTheme = useThemedExtension(\n isField ? `code-editor:field:${isArgo ? 'argo' : 'legacy'}` : 'code-editor:chrome',\n () =>\n EditorView.theme({\n ...buildBaseThemeStyles(),\n ...(isField ? buildChromeStyles(buildInputChrome(isArgo)) : null),\n }),\n );\n\n const commonExtensions: Extension[] = useMemo(() => {\n const callerCompletions =\n completionSource ??\n (completeAny ? completeAnyWord : autocompletions?.length ? autocompletions : null);\n\n // An empty list is left out: CodeMirror wraps a list in `completeFromList`, which\n // answers an empty result rather than none, so the editor would run a source that\n // can never match on every keystroke.\n const completionEntries = [\n ...(callerCompletions ? [{ autocomplete: callerCompletions }] : []),\n { autocomplete: variableCompletion },\n ];\n\n return [\n getLanguageMode(mode),\n shouldLintJson(mode, readOnly) ? linter(jsonParseLinter()) : [],\n withLineWrapping ? EditorView.lineWrapping : [],\n EditorState.languageData.of(() => completionEntries),\n keymap.of(\n boundKeys.map((key) => ({\n key,\n run: () => {\n extraKeysRef.current[key]?.();\n return true;\n },\n })),\n ),\n readOnly\n ? []\n : [\n // CodeMirror's own default. Gating it on the props hid completions the\n // *language* supplies — dbt's vocabulary, Snowflake's keywords — behind\n // a shortcut, and macOS leaves no usable one. With nothing to offer, no\n // popup opens anyway.\n autocompletion(),\n ],\n ariaLabel ? EditorView.contentAttributes.of({ 'aria-label': ariaLabel }) : [],\n withSearch ? searchExtension() : [],\n tooltipLayer,\n baseTheme,\n ];\n }, [\n autocompletions,\n completionSource,\n variableCompletion,\n completeAny,\n boundKeys,\n mode,\n readOnly,\n withLineWrapping,\n baseTheme,\n ariaLabel,\n withSearch,\n tooltipLayer,\n ]);\n\n const extensions = useMemo(() => {\n return [\n ...commonExtensions,\n cmPlaceholder(placeholder),\n EditorView.editable.of(!readOnly),\n // The lock is this facet and nothing else. `contenteditable` is what the\n // read-only wash keys off, and `basicSetup` is what holds the undo history,\n // so leaving both alone is what makes the lock invisible.\n EditorState.readOnly.of(readOnly || inputLocked),\n previousValue\n ? unifiedMergeView({\n original: previousValue,\n mergeControls: false,\n highlightChanges: false,\n collapseUnchanged: withCollapseUnchanged ? {} : undefined,\n })\n : [],\n ];\n }, [commonExtensions, placeholder, readOnly, inputLocked, previousValue, withCollapseUnchanged]);\n\n const config = useMemo(() => {\n return {\n ...buildBasicSetup(readOnly),\n lineNumbers: withLineNumbers,\n // Mod-f opens CodeMirror's own panel, which would run a second query and a\n // second match count over the same document beside the caller's input.\n ...(withSearch ? { searchKeymap: false } : null),\n };\n }, [withLineNumbers, readOnly, withSearch]);\n\n return (\n // oxlint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n data-variant={variant}\n className={cn(\n // Scoped to the box CodeMirror renders into rather than to every child, so\n // the toolbar below does not have to undo all three in `!important`.\n 'tw:relative tw:flex tw:min-h-0 tw:flex-col tw:[&_.cm-mergeViewEditor]:overflow-visible tw:[&_.cm-mergeViewEditors]:h-full tw:[&_.cm-mergeView]:h-full tw:[&_>.cm-theme]:h-full',\n // A field's `.cm-editor` is rounded, so the square box behind it would show\n // at the corners, and `overflow-auto` would crop the focus ring — a shadow\n // painted outside the editor's own box.\n isField\n ? 'tw:[&_>.cm-theme]:overflow-visible tw:[&_>.cm-theme]:bg-transparent'\n : 'tw:[&_>.cm-theme]:overflow-auto tw:[&_>.cm-theme]:bg-background',\n className,\n )}\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === keyCodes.ESCAPE) {\n event.stopPropagation();\n }\n }}\n >\n <ButtonToolbar value={withCopyButton ? value : undefined}>\n {renderAdditionalButtons?.(value)}\n </ButtonToolbar>\n <CodeMirror\n ref={editorRef}\n onCreateEditor={handleCreateEditor}\n theme={customTheme}\n value={value}\n onChange={handleChange}\n extensions={extensions}\n autoFocus={withAutofocus}\n basicSetup={config}\n />\n {!readOnly && (withToggleCommentHint || help || helpPostfix) && (\n <HelpBlock className=\"tw:mt-2 tw:flex tw:flex-wrap tw:gap-1\">\n {help}\n {withToggleCommentHint ? <ToggleComponentHelp /> : null}\n {helpPostfix}\n </HelpBlock>\n )}\n </div>\n );\n};\n","import type { ChangeSet, Range } from '@codemirror/state';\nimport { Decoration, EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nconst activeQueryFirstLine = Decoration.line({ class: 'cm-active-query cm-active-query-first' });\nconst activeQueryMiddleLine = Decoration.line({ class: 'cm-active-query' });\nconst activeQueryLastLine = Decoration.line({ class: 'cm-active-query cm-active-query-last' });\nconst activeQuerySingleLine = Decoration.line({\n class: 'cm-active-query cm-active-query-first cm-active-query-last',\n});\n\ntype QueryBoundary = { from: number; to: number };\n\n/**\n * Given pre-computed query boundaries and a cursor position, find which query\n * the cursor is in. Returns trimmed character offsets or null.\n */\nexport const findActiveQueryRange = (\n doc: string,\n cursorPos: number,\n boundaries: QueryBoundary[],\n): { from: number; to: number } | null => {\n if (boundaries.length === 0) return null;\n\n let match: QueryBoundary | undefined = boundaries[boundaries.length - 1];\n for (const boundary of boundaries) {\n if (cursorPos <= boundary.to) {\n match = boundary;\n break;\n }\n }\n\n if (!match) return null;\n\n // Trim leading/trailing whitespace from the query range for tighter boundaries\n const queryText = doc.slice(match.from, match.to);\n const leadingWhitespace = queryText.length - queryText.trimStart().length;\n const trailingWhitespace = queryText.length - queryText.trimEnd().length;\n\n const trimmedStart = match.from + leadingWhitespace;\n const trimmedEnd = match.to - trailingWhitespace;\n\n if (trimmedStart >= trimmedEnd) return null;\n\n return { from: trimmedStart, to: trimmedEnd };\n};\n\n/**\n * Convert splitSqlQueries result (array of query strings that join back to the\n * original doc) into character-offset boundaries.\n */\nconst computeBoundaries = (queries: string[]): QueryBoundary[] => {\n const boundaries: QueryBoundary[] = [];\n let offset = 0;\n for (const query of queries) {\n boundaries.push({ from: offset, to: offset + query.length });\n offset += query.length;\n }\n return boundaries;\n};\n\n/**\n * Synchronously map cached boundaries through a changeset.\n *\n * Boundaries can outlive the document state they were computed from (the async\n * re-parse in `scheduleDocParse` is debounced, so several edits may land\n * before new boundaries are produced). When that happens a cached position\n * can exceed the changeset's pre-change length and `ChangeSet.mapPos` throws\n * `RangeError: Position X is out of range for changeset of length Y`.\n *\n * Clamp positions into the valid `[0, changes.length]` range before mapping\n * and drop degenerate boundaries so the mapping is safe even with stale cache.\n */\nexport const mapBoundariesThroughChanges = (\n boundaries: QueryBoundary[],\n changes: ChangeSet,\n): QueryBoundary[] => {\n const prevLen = changes.length;\n const mapped: QueryBoundary[] = [];\n for (const b of boundaries) {\n const from = changes.mapPos(Math.max(0, Math.min(b.from, prevLen)), -1);\n const to = changes.mapPos(Math.max(0, Math.min(b.to, prevLen)), 1);\n if (from < to) mapped.push({ from, to });\n }\n return mapped;\n};\n\nconst buildDecorations = (view: EditorView, range: { from: number; to: number }) => {\n const startLine = view.state.doc.lineAt(range.from).number;\n const endLine = view.state.doc.lineAt(range.to).number;\n\n const decorations: Range<Decoration>[] = [];\n for (let lineNum = startLine; lineNum <= endLine; lineNum++) {\n const lineStart = view.state.doc.line(lineNum).from;\n if (startLine === endLine) {\n decorations.push(activeQuerySingleLine.range(lineStart));\n } else if (lineNum === startLine) {\n decorations.push(activeQueryFirstLine.range(lineStart));\n } else if (lineNum === endLine) {\n decorations.push(activeQueryLastLine.range(lineStart));\n } else {\n decorations.push(activeQueryMiddleLine.range(lineStart));\n }\n }\n\n return Decoration.set(decorations);\n};\n\nexport const activeQueryHighlight = (splitQueries: (sql: string) => Promise<string[]>) => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations = Decoration.none;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private seq = 0;\n private cachedDoc = '';\n private cachedBoundaries: QueryBoundary[] = [];\n private destroyed = false;\n\n constructor(view: EditorView) {\n this.scheduleDocParse(view);\n }\n\n update(update: ViewUpdate) {\n if (update.focusChanged && !update.view.hasFocus) {\n this.decorations = Decoration.none;\n return;\n }\n\n if (update.docChanged) {\n // Synchronously map cached boundaries through document changes\n // so decorations update immediately without waiting for async re-parse.\n // Positions are clamped inside mapBoundariesThroughChanges because\n // the async re-parse is debounced and boundaries can be stale.\n if (this.cachedBoundaries.length > 0) {\n this.cachedBoundaries = mapBoundariesThroughChanges(\n this.cachedBoundaries,\n update.changes,\n );\n this.cachedDoc = update.state.doc.toString();\n this.updateFromCache(update.view);\n }\n // Still re-parse for accurate boundaries (handles structural changes like new semicolons)\n this.scheduleDocParse(update.view);\n } else if (update.selectionSet || (update.focusChanged && update.view.hasFocus)) {\n this.updateFromCache(update.view);\n }\n }\n\n destroy() {\n this.destroyed = true;\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n }\n\n /**\n * Update decorations using cached query boundaries.\n * Only mutates this.decorations — does NOT call view.dispatch().\n * When called from update() (sync), CodeMirror picks up the new\n * decorations via the accessor. When called from the async\n * scheduleDocParse callback, the caller must dispatch separately.\n */\n private updateFromCache(view: EditorView) {\n if (!view.hasFocus) {\n this.decorations = Decoration.none;\n return;\n }\n\n const { main } = view.state.selection;\n\n if (main.from !== main.to) {\n // User has text selected — hide highlight\n this.decorations = Decoration.none;\n return;\n }\n\n const doc = view.state.doc.toString();\n if (doc !== this.cachedDoc) return;\n if (this.cachedBoundaries.length === 0) {\n this.decorations = Decoration.none;\n return;\n }\n\n const range = findActiveQueryRange(doc, main.head, this.cachedBoundaries);\n this.decorations = range ? buildDecorations(view, range) : Decoration.none;\n }\n\n /** Parse queries async (debounced) and update decorations. */\n private scheduleDocParse(view: EditorView) {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n\n this.debounceTimer = setTimeout(async () => {\n const seq = ++this.seq;\n const doc = view.state.doc.toString();\n\n if (!doc.trim()) {\n this.cachedDoc = doc;\n this.cachedBoundaries = [];\n if (this.decorations !== Decoration.none) {\n this.decorations = Decoration.none;\n if (!this.destroyed) view.dispatch();\n }\n return;\n }\n\n let queries: string[];\n try {\n queries = await splitQueries(doc);\n } catch {\n return;\n }\n\n // Discard stale results\n if (this.destroyed || seq !== this.seq) return;\n\n this.cachedDoc = doc;\n this.cachedBoundaries = computeBoundaries(queries);\n\n this.updateFromCache(view);\n if (!this.destroyed) view.dispatch();\n }, 100);\n }\n },\n { decorations: (v) => v.decorations },\n ),\n EditorView.baseTheme({\n '.cm-active-query': {\n boxShadow: `inset -1px 0 0 0 ${colors.blue[300]}, inset 1px 0 0 0 ${colors.blue[300]}`,\n marginRight: '8px',\n },\n '.cm-active-query-first': {\n boxShadow: `inset -1px 0 0 0 ${colors.blue[300]}, inset 1px 0 0 0 ${colors.blue[300]}, inset 0 1px 0 0 ${colors.blue[300]}`,\n borderRadius: '4px 4px 0 0',\n },\n '.cm-active-query-last': {\n boxShadow: `inset -1px 0 0 0 ${colors.blue[300]}, inset 1px 0 0 0 ${colors.blue[300]}, inset 0 -1px 0 0 ${colors.blue[300]}`,\n borderRadius: '0 0 4px 4px',\n },\n '.cm-active-query-first.cm-active-query-last': {\n boxShadow: `inset 0 0 0 1px ${colors.blue[300]}`,\n borderRadius: '4px',\n },\n }),\n ];\n};\n","import type { Extension } from '@codemirror/state';\nimport { RangeSet, StateEffect, StateField } from '@codemirror/state';\nimport { Decoration, EditorView, gutter, GutterMarker } from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nexport type HighlightedLines = {\n from: number;\n to: number;\n error?: { from: number; to: number };\n processing?: { from: number; to: number };\n} | null;\n\n// Gutter markers for highlighting\nclass HighlightMarker extends GutterMarker {\n override toDOM() {\n const marker = document.createElement('div');\n marker.className = 'cm-highlight-marker';\n return marker;\n }\n}\n\nconst highlightMarker = new HighlightMarker();\n\n// Helper function to iterate over line range and apply a callback\nconst forEachLineInRange = <T>(\n doc: { lines: number; line: (n: number) => { from: number } },\n from: number,\n to: number,\n callback: (lineFrom: number) => T,\n): T[] => {\n const results: T[] = [];\n\n // Convert 0-based to 1-based for CodeMirror\n const fromLine = Math.max(1, from + 1);\n const toLine = Math.min(doc.lines, to + 1);\n\n for (let i = fromLine; i <= toLine; i++) {\n const line = doc.line(i);\n results.push(callback(line.from));\n }\n\n return results;\n};\n\n// State effect for setting highlighted lines\nconst setHighlightedLinesEffect = StateEffect.define<HighlightedLines>();\n\n// State field for storing highlighted lines info\nconst highlightedLinesField = StateField.define<HighlightedLines>({\n create() {\n return null;\n },\n update(value, transaction) {\n for (const effect of transaction.effects) {\n if (effect.is(setHighlightedLinesEffect)) {\n return effect.value;\n }\n }\n return value;\n },\n});\n\n// Gutter extension that displays highlight markers\nconst highlightGutter = gutter({\n class: 'cm-highlight-gutter',\n markers: (view): RangeSet<GutterMarker> => {\n const highlightInfo = view.state.field(highlightedLinesField, false);\n\n if (!highlightInfo) {\n return RangeSet.empty;\n }\n\n // Add blue markers for all running query lines\n const markers = forEachLineInRange(\n view.state.doc,\n highlightInfo.from,\n highlightInfo.to,\n (lineFrom) => highlightMarker.range(lineFrom),\n );\n\n return RangeSet.of(markers);\n },\n});\n\n// State field for error line background decorations\nconst errorLineDecorations = StateField.define({\n create() {\n return Decoration.none;\n },\n update(decorations, transaction) {\n decorations = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (!effect.is(setHighlightedLinesEffect)) {\n continue;\n }\n\n if (!effect.value || !effect.value.error) {\n return Decoration.none;\n }\n\n // Add error line background decorations\n const decorationArray = forEachLineInRange(\n transaction.state.doc,\n effect.value.error.from,\n effect.value.error.to,\n (lineFrom) => Decoration.line({ class: 'cm-error-line' }).range(lineFrom),\n );\n\n return Decoration.set(decorationArray);\n }\n return decorations;\n },\n provide: (f) => EditorView.decorations.from(f),\n});\n\n// State field for processing line background decorations\nconst processingLineDecorations = StateField.define({\n create() {\n return Decoration.none;\n },\n update(decorations, transaction) {\n decorations = decorations.map(transaction.changes);\n for (const effect of transaction.effects) {\n if (!effect.is(setHighlightedLinesEffect)) {\n continue;\n }\n\n if (!effect.value || !effect.value.processing) {\n return Decoration.none;\n }\n\n const decorationArray = forEachLineInRange(\n transaction.state.doc,\n effect.value.processing.from,\n effect.value.processing.to,\n (lineFrom) => Decoration.line({ class: 'cm-processing-line' }).range(lineFrom),\n );\n\n return Decoration.set(decorationArray);\n }\n return decorations;\n },\n provide: (f) => EditorView.decorations.from(f),\n});\n\n// Theme for highlighted lines\nconst highlightedLinesTheme = EditorView.baseTheme({\n '.cm-highlight-gutter': {\n width: '2px',\n marginRight: '2px',\n },\n '.cm-highlight-marker': {\n width: '2px',\n height: '100%',\n backgroundColor: colors.blue[500],\n },\n '.cm-error-line': {\n backgroundColor: `${colors.error[100]} !important`,\n },\n '.cm-processing-line': {\n backgroundColor: `${colors.blue[100]} !important`,\n },\n});\n\n// Install highlight lines extension\nexport function highlightingExtension(): Extension[] {\n return [\n highlightedLinesField,\n highlightGutter,\n errorLineDecorations,\n processingLineDecorations,\n highlightedLinesTheme,\n ];\n}\n\nexport function updateHighlighting(view: EditorView, lines?: HighlightedLines) {\n view.dispatch({ effects: setHighlightedLinesEffect.of(lines ?? null) });\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { CompletionSource } from '@codemirror/autocomplete';\nimport { defaultKeymap } from '@codemirror/commands';\nimport type { SQLNamespace } from '@codemirror/lang-sql';\nimport type {\n EditorState,\n KeyBinding,\n ReactCodeMirrorRef,\n ViewUpdate,\n} from '@uiw/react-codemirror';\nimport CodeMirror, { EditorView, keymap } from '@uiw/react-codemirror';\n\nimport { installExtensions, type SqlDialectName } from '@keboola/codemirror-lang-sql';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\n\nimport { activeQueryHighlight } from './activeQueryHighlight';\nimport { buildCanvasChrome, buildChromeStyles } from './editorChrome';\nimport { buildBaseThemeStyles, buildBasicSetup, buildCustomTheme } from './helpers';\nimport type { HighlightedLines } from './highlighting';\nimport { highlightingExtension, updateHighlighting } from './highlighting';\nimport { searchExtension, updateSearch } from './search';\nimport { useThemedExtension } from './tokenTheme';\nimport { useTooltipsExtension } from './tooltips';\nimport { type EditorVariable, useVariableCompletion } from './variableCompletion';\n\n// SqlEditor installs its own keymaps: `CUSTOM_KEYMAP` ahead of `defaultKeymap`\n// for Escape, a Tab/Enter-filtered completion keymap from\n// `@keboola/codemirror-lang-sql`, and search driven by props rather than the\n// CodeMirror panel.\nconst OWN_KEYMAPS = {\n defaultKeymap: false,\n completionKeymap: false,\n searchKeymap: false,\n} as const;\n\nconst CUSTOM_KEYMAP: KeyBinding[] = [\n {\n key: 'Escape',\n stopPropagation: true,\n run: (view: EditorView) => {\n view.contentDOM.blur();\n return true;\n },\n },\n];\n\nconst OWN_KEYMAP_EXTENSION = keymap.of([...defaultKeymap, ...CUSTOM_KEYMAP]);\n\n// Editor surface, focus ring, and read-only wash resolve from live `--*`\n// tokens so the SQL editor chrome re-skins with brand + dark mode.\nconst buildTheme = () => ({\n ...buildBaseThemeStyles(),\n ...buildChromeStyles(buildCanvasChrome()),\n});\n\ntype Props = {\n value: string;\n onChange?: (value: string) => void;\n onSelectionChange?: (text: string) => void;\n onCreateEditor?: (view: EditorView, state: EditorState) => void;\n onDestroyEditor?: () => void;\n onBlurEditor?: (view: EditorView) => void;\n onFocusEditor?: (view: EditorView) => void;\n readOnly: boolean;\n placeholder?: string;\n searchQuery?: string;\n searchMatchIndex?: number;\n queryParser?: (sql: string) => Promise<string[]>;\n autoFocus?: boolean;\n lineNumbers?: boolean;\n className?: string;\n /**\n * A schema is too large to compare by value, so this one prop keeps the\n * identity requirement every other prop here is now free of: hand the editor\n * a stable object, or it rebuilds its whole extension tree on every render.\n */\n schema?: SQLNamespace;\n /**\n * Completions the caller knows and the schema does not — a table the code writes to\n * before it exists, say. Added to the schema, keyword and variable completions; unlike\n * `CodeEditor`'s prop of the same name, it replaces nothing.\n *\n * Compared by identity: build it in a `useMemo` or the editor rebuilds its whole\n * extension tree on every render.\n */\n completionSource?: CompletionSource;\n variables?: EditorVariable[];\n defaultSchema?: string;\n defaultDatabase?: string;\n highlightLines?: HighlightedLines;\n dialect?: SqlDialectName;\n};\n\nexport const SqlEditor = ({\n value,\n onChange,\n onSelectionChange,\n onCreateEditor,\n onDestroyEditor,\n onBlurEditor,\n onFocusEditor,\n placeholder = '',\n searchQuery = '',\n searchMatchIndex,\n readOnly = false,\n queryParser,\n autoFocus = false,\n lineNumbers = true,\n className,\n schema,\n completionSource,\n variables,\n defaultDatabase,\n defaultSchema,\n highlightLines,\n dialect,\n}: Props) => {\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n\n // CodeMirror holds these by identity and rebuilds its whole extension tree when one\n // moves, which is every render for the inline arrows callers pass.\n const handleChange = useStableCallback((next: string) => onChange?.(next));\n const parseQueries = useStableCallback(async (sql: string) => (await queryParser?.(sql)) ?? []);\n const handleBlur = useStableCallback((view: EditorView) => onBlurEditor?.(view));\n const handleFocus = useStableCallback((view: EditorView) => onFocusEditor?.(view));\n\n const handleUpdate = useStableCallback((update: ViewUpdate) => {\n if (update.selectionSet) {\n const { main } = update.state.selection;\n\n onSelectionChange?.(update.state.sliceDoc(main.from, main.to));\n }\n });\n\n const variableCompletion = useVariableCompletion(variables);\n\n // Whether a parser was given decides whether the active-query highlighter is\n // installed at all; which parser it is does not, so the caller's may change\n // without a reconfigure.\n const withQueryParser = queryParser !== undefined;\n\n const tooltipLayer = useTooltipsExtension();\n\n // Themes re-resolve their `--*` tokens on brand / light-dark change. The\n // syntax palette shares `CodeEditor`'s cache entry — same `buildCustomTheme`.\n const customTheme = useThemedExtension('editor:syntax', buildCustomTheme);\n const themeExtension = useThemedExtension('sql-editor:chrome', () =>\n EditorView.theme(buildTheme()),\n );\n\n const extensions = useMemo(() => {\n return [\n EditorView.lineWrapping,\n OWN_KEYMAP_EXTENSION,\n ...installExtensions({\n schema,\n defaultDatabase,\n defaultSchema,\n variableCompletion,\n completionSource,\n dialect,\n }),\n searchExtension(),\n highlightingExtension(),\n withQueryParser ? activeQueryHighlight(parseQueries) : [],\n tooltipLayer,\n themeExtension,\n EditorView.domEventHandlers({\n blur: (_, view) => handleBlur(view),\n focus: (_, view) => handleFocus(view),\n }),\n ];\n }, [\n withQueryParser,\n parseQueries,\n schema,\n completionSource,\n defaultDatabase,\n defaultSchema,\n variableCompletion,\n dialect,\n handleBlur,\n handleFocus,\n themeExtension,\n tooltipLayer,\n ]);\n\n const defaultSetup = useMemo(() => {\n return { ...buildBasicSetup(readOnly), ...OWN_KEYMAPS, lineNumbers };\n }, [readOnly, lineNumbers]);\n\n useEffect(() => {\n if (editorRef.current?.view) {\n updateHighlighting(editorRef.current.view, highlightLines);\n }\n }, [highlightLines]);\n\n useEffect(() => {\n if (editorRef.current?.view) {\n updateSearch(editorRef.current.view, searchQuery, searchMatchIndex);\n }\n }, [searchQuery, searchMatchIndex]);\n\n // Reports once, as the editor goes away, to whichever handler the last render passed.\n const handleDestroy = useStableCallback(() => onDestroyEditor?.());\n useEffect(() => handleDestroy, [handleDestroy]);\n\n const handleCreate = useStableCallback((view: EditorView, state: EditorState) => {\n onCreateEditor?.(view, state);\n\n if (highlightLines) {\n updateHighlighting(view, highlightLines);\n }\n\n if (searchQuery) {\n updateSearch(view, searchQuery, searchMatchIndex);\n }\n });\n\n return (\n <CodeMirror\n ref={editorRef}\n theme={customTheme}\n extensions={extensions}\n value={value}\n onChange={handleChange}\n onUpdate={handleUpdate}\n onCreateEditor={handleCreate}\n autoFocus={autoFocus}\n placeholder={placeholder}\n className={className}\n readOnly={readOnly}\n editable={!readOnly}\n basicSetup={defaultSetup}\n />\n );\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/ThemeProvider/AIGradientSvg.tsx","../src/components/ThemeProvider/useBrandState.ts","../src/components/ThemeProvider/useColorSchemeState.ts","../src/components/ThemeProvider/useThemeTokens.ts","../src/components/ThemeProvider/ThemeProvider.tsx"],"names":["defaultBrand","useState","useCallback","useEffect","jsxs","jsx"],"mappings":"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","file":"chunk-C3L3TBBT.js","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 { 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 { 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\nexport const useThemeTokens = (tokens: ThemeTokens) => {\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 const root = document.documentElement;\n const vars = tokensToCssVars(tokens);\n\n setTokens(root, vars);\n\n return () => removeTokens(root, vars);\n }, [tokens]);\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 }),\n [activeScheme, resolvedScheme, setScheme, activeBrandId, setBrand, themes, currentTheme],\n );\n\n return (\n <ThemeContext value={context}>\n <AIGradientsSvg />\n <TooltipProvider>{children}</TooltipProvider>\n </ThemeContext>\n );\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/blocks/MermaidDiagram/DiagramSkeleton.tsx","../src/components/ZoomableSvg/ZoomableSvg.tsx","../src/components/ZoomableSvg/exportSvg.ts"],"names":["jsx","width","height"],"mappings":"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","file":"chunk-IJTHFNNJ.js","sourcesContent":["import { Skeleton } from '../../components/Skeleton/Skeleton';\n\n// Lives apart from MermaidDiagram so callers can show it while that component's\n// chunk is still loading, without importing beautiful-mermaid to do it.\nexport const DiagramSkeleton = () => (\n <div className=\"tw:my-3 tw:overflow-hidden tw:rounded-md tw:border tw:border-neutral-150 tw:bg-neutral-50 tw:p-6\">\n <Skeleton className=\"tw:h-40\" />\n </div>\n);\n","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 className=\"tw:fixed tw:inset-0 tw:z-[1060] 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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/classNames.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,IAAM,UAAU,mBAAA,CAAoB;AAAA,EAClC,MAAA,EAAQ;AACV,CAAC,CAAA;AAEM,IAAM,KAAK,CAAA,GAAI,OAAA,KAA0B,QAAQ,IAAA,CAAK,GAAG,OAAO,CAAC","file":"chunk-JP7PNHLH.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// tailwind-merge v3 (Tailwind v4): the prefix drops the trailing separator —\n// `tw:` → `tw` (the `:` separator is implied).\nconst twMerge = extendTailwindMerge({\n prefix: 'tw',\n});\n\nexport const cn = (...classes: ClassValue[]) => twMerge(clsx(...classes));\n"]}