@keboola/design 9.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 (520) hide show
  1. package/AGENTS.md +119 -40
  2. package/COMPONENT-API.md +31 -9
  3. package/README.md +3 -3
  4. package/dist/MermaidDiagram-ZU5KAVRT.js +18 -0
  5. package/dist/MermaidDiagram-ZU5KAVRT.js.map +1 -0
  6. package/dist/charts.d.ts +37 -2
  7. package/dist/charts.js +11 -9
  8. package/dist/charts.js.map +1 -1
  9. package/dist/chunk-2YYJDKSP.js +51 -0
  10. package/dist/chunk-2YYJDKSP.js.map +1 -0
  11. package/dist/chunk-3P5UUCFI.js +385 -0
  12. package/dist/chunk-3P5UUCFI.js.map +1 -0
  13. package/dist/chunk-3QDFDDWZ.js +99 -0
  14. package/dist/chunk-3QDFDDWZ.js.map +1 -0
  15. package/dist/chunk-3W27OLK5.js +15 -0
  16. package/dist/chunk-3W27OLK5.js.map +1 -0
  17. package/dist/chunk-4FIZZONW.js +40 -0
  18. package/dist/chunk-4FIZZONW.js.map +1 -0
  19. package/dist/chunk-4GIAXOJG.js +133 -0
  20. package/dist/chunk-4GIAXOJG.js.map +1 -0
  21. package/dist/chunk-52NDNMK7.js +99 -0
  22. package/dist/chunk-52NDNMK7.js.map +1 -0
  23. package/dist/chunk-576G5OES.js +201 -0
  24. package/dist/chunk-576G5OES.js.map +1 -0
  25. package/dist/chunk-5AIE6SET.js +659 -0
  26. package/dist/chunk-5AIE6SET.js.map +1 -0
  27. package/dist/chunk-5FTNAZRW.js +327 -0
  28. package/dist/chunk-5FTNAZRW.js.map +1 -0
  29. package/dist/chunk-5IG2S7ZY.js +70 -0
  30. package/dist/chunk-5IG2S7ZY.js.map +1 -0
  31. package/dist/chunk-5QCXHNCW.js +404 -0
  32. package/dist/chunk-5QCXHNCW.js.map +1 -0
  33. package/dist/chunk-6DUMGC7Y.js +105 -0
  34. package/dist/chunk-6DUMGC7Y.js.map +1 -0
  35. package/dist/chunk-6J25CVST.js +174 -0
  36. package/dist/chunk-6J25CVST.js.map +1 -0
  37. package/dist/chunk-6NN35XOP.js +120 -0
  38. package/dist/chunk-6NN35XOP.js.map +1 -0
  39. package/dist/chunk-6NZBVA4T.js +24 -0
  40. package/dist/chunk-6NZBVA4T.js.map +1 -0
  41. package/dist/chunk-6W5BHRCL.js +295 -0
  42. package/dist/chunk-6W5BHRCL.js.map +1 -0
  43. package/dist/chunk-72BKRCEG.js +409 -0
  44. package/dist/chunk-72BKRCEG.js.map +1 -0
  45. package/dist/chunk-7GTI3PPI.js +95 -0
  46. package/dist/chunk-7GTI3PPI.js.map +1 -0
  47. package/dist/chunk-7P6PLZ4B.js +74 -0
  48. package/dist/chunk-7P6PLZ4B.js.map +1 -0
  49. package/dist/chunk-7WZWY5IA.js +46 -0
  50. package/dist/chunk-7WZWY5IA.js.map +1 -0
  51. package/dist/chunk-AIYO2632.js +489 -0
  52. package/dist/chunk-AIYO2632.js.map +1 -0
  53. package/dist/chunk-ANFZWPNE.js +112 -0
  54. package/dist/chunk-ANFZWPNE.js.map +1 -0
  55. package/dist/chunk-ANZTVAJU.js +73 -0
  56. package/dist/chunk-ANZTVAJU.js.map +1 -0
  57. package/dist/chunk-BD5BTJKX.js +166 -0
  58. package/dist/chunk-BD5BTJKX.js.map +1 -0
  59. package/dist/chunk-BHGIDSRJ.js +140 -0
  60. package/dist/chunk-BHGIDSRJ.js.map +1 -0
  61. package/dist/chunk-BSQWZITZ.js +507 -0
  62. package/dist/chunk-BSQWZITZ.js.map +1 -0
  63. package/dist/chunk-D3LAIK62.js +23 -0
  64. package/dist/chunk-D3LAIK62.js.map +1 -0
  65. package/dist/chunk-DODCR43C.js +155 -0
  66. package/dist/chunk-DODCR43C.js.map +1 -0
  67. package/dist/chunk-EEK5NGZF.js +40 -0
  68. package/dist/chunk-EEK5NGZF.js.map +1 -0
  69. package/dist/chunk-ENRG7TXA.js +11 -0
  70. package/dist/chunk-ENRG7TXA.js.map +1 -0
  71. package/dist/chunk-EQRMGIGY.js +239 -0
  72. package/dist/chunk-EQRMGIGY.js.map +1 -0
  73. package/dist/chunk-ERAHK5YQ.js +495 -0
  74. package/dist/chunk-ERAHK5YQ.js.map +1 -0
  75. package/dist/chunk-F3FOFY2P.js +124 -0
  76. package/dist/chunk-F3FOFY2P.js.map +1 -0
  77. package/dist/chunk-F6BTWFOC.js +507 -0
  78. package/dist/chunk-F6BTWFOC.js.map +1 -0
  79. package/dist/chunk-F6J6NNAL.js +34 -0
  80. package/dist/chunk-F6J6NNAL.js.map +1 -0
  81. package/dist/chunk-FCHJ7D5O.js +59 -0
  82. package/dist/chunk-FCHJ7D5O.js.map +1 -0
  83. package/dist/chunk-FFJTEQCC.js +80 -0
  84. package/dist/chunk-FFJTEQCC.js.map +1 -0
  85. package/dist/chunk-FUFMVW7O.js +64 -0
  86. package/dist/chunk-FUFMVW7O.js.map +1 -0
  87. package/dist/chunk-FVPGQ6UE.js +25 -0
  88. package/dist/chunk-FVPGQ6UE.js.map +1 -0
  89. package/dist/chunk-G3PMV62Z.js +33 -0
  90. package/dist/chunk-G3PMV62Z.js.map +1 -0
  91. package/dist/chunk-GACFOW3E.js +51 -0
  92. package/dist/chunk-GACFOW3E.js.map +1 -0
  93. package/dist/chunk-GDT6HQMK.js +42 -0
  94. package/dist/chunk-GDT6HQMK.js.map +1 -0
  95. package/dist/chunk-HLGU22C6.js +2589 -0
  96. package/dist/chunk-HLGU22C6.js.map +1 -0
  97. package/dist/chunk-HPMYYGP7.js +134 -0
  98. package/dist/chunk-HPMYYGP7.js.map +1 -0
  99. package/dist/chunk-I2UCOD45.js +197 -0
  100. package/dist/chunk-I2UCOD45.js.map +1 -0
  101. package/dist/chunk-IEGDZUVM.js +75 -0
  102. package/dist/chunk-IEGDZUVM.js.map +1 -0
  103. package/dist/chunk-IIS7INHF.js +47 -0
  104. package/dist/chunk-IIS7INHF.js.map +1 -0
  105. package/dist/chunk-ITELSEFU.js +256 -0
  106. package/dist/chunk-ITELSEFU.js.map +1 -0
  107. package/dist/chunk-IXAYNBOY.js +407 -0
  108. package/dist/chunk-IXAYNBOY.js.map +1 -0
  109. package/dist/chunk-JUW2ETEI.js +191 -0
  110. package/dist/chunk-JUW2ETEI.js.map +1 -0
  111. package/dist/chunk-K65C7CVE.js +127 -0
  112. package/dist/chunk-K65C7CVE.js.map +1 -0
  113. package/dist/chunk-KDI64MCY.js +189 -0
  114. package/dist/chunk-KDI64MCY.js.map +1 -0
  115. package/dist/chunk-KN4ASMH5.js +160 -0
  116. package/dist/chunk-KN4ASMH5.js.map +1 -0
  117. package/dist/chunk-KQW7QNTU.js +1549 -0
  118. package/dist/chunk-KQW7QNTU.js.map +1 -0
  119. package/dist/chunk-KR7NXXHC.js +66 -0
  120. package/dist/chunk-KR7NXXHC.js.map +1 -0
  121. package/dist/chunk-KRZKIVMA.js +142 -0
  122. package/dist/chunk-KRZKIVMA.js.map +1 -0
  123. package/dist/chunk-KTTLLKGQ.js +185 -0
  124. package/dist/chunk-KTTLLKGQ.js.map +1 -0
  125. package/dist/chunk-KWKSHPDP.js +234 -0
  126. package/dist/chunk-KWKSHPDP.js.map +1 -0
  127. package/dist/chunk-KZVC7OYG.js +57 -0
  128. package/dist/chunk-KZVC7OYG.js.map +1 -0
  129. package/dist/chunk-L5DHUN2V.js +204 -0
  130. package/dist/chunk-L5DHUN2V.js.map +1 -0
  131. package/dist/chunk-LCTGEH57.js +1376 -0
  132. package/dist/chunk-LCTGEH57.js.map +1 -0
  133. package/dist/chunk-LXLIQ2D6.js +12 -0
  134. package/dist/chunk-LXLIQ2D6.js.map +1 -0
  135. package/dist/chunk-M4CTURKX.js +84 -0
  136. package/dist/chunk-M4CTURKX.js.map +1 -0
  137. package/dist/chunk-M6LTUPVP.js +301 -0
  138. package/dist/chunk-M6LTUPVP.js.map +1 -0
  139. package/dist/chunk-MA6RRHDT.js +291 -0
  140. package/dist/chunk-MA6RRHDT.js.map +1 -0
  141. package/dist/chunk-MODE4QIA.js +6 -0
  142. package/dist/chunk-MODE4QIA.js.map +1 -0
  143. package/dist/chunk-MVILMVGG.js +118 -0
  144. package/dist/chunk-MVILMVGG.js.map +1 -0
  145. package/dist/chunk-MWS4VCLV.js +17 -0
  146. package/dist/chunk-MWS4VCLV.js.map +1 -0
  147. package/dist/chunk-NEUX74SO.js +315 -0
  148. package/dist/chunk-NEUX74SO.js.map +1 -0
  149. package/dist/chunk-NFHKYBRD.js +156 -0
  150. package/dist/chunk-NFHKYBRD.js.map +1 -0
  151. package/dist/chunk-NHJNNXD3.js +89 -0
  152. package/dist/chunk-NHJNNXD3.js.map +1 -0
  153. package/dist/chunk-O2BF3HZL.js +33 -0
  154. package/dist/chunk-O2BF3HZL.js.map +1 -0
  155. package/dist/chunk-OANXCZYD.js +212 -0
  156. package/dist/chunk-OANXCZYD.js.map +1 -0
  157. package/dist/chunk-ODJF7YIP.js +230 -0
  158. package/dist/chunk-ODJF7YIP.js.map +1 -0
  159. package/dist/chunk-ON4BJTHI.js +101 -0
  160. package/dist/chunk-ON4BJTHI.js.map +1 -0
  161. package/dist/chunk-OTL5WXIJ.js +16 -0
  162. package/dist/chunk-OTL5WXIJ.js.map +1 -0
  163. package/dist/chunk-PACNBKJV.js +47 -0
  164. package/dist/chunk-PACNBKJV.js.map +1 -0
  165. package/dist/chunk-PROCA7K7.js +23 -0
  166. package/dist/chunk-PROCA7K7.js.map +1 -0
  167. package/dist/chunk-QGMIPA67.js +85 -0
  168. package/dist/chunk-QGMIPA67.js.map +1 -0
  169. package/dist/chunk-QQA37LFB.js +190 -0
  170. package/dist/chunk-QQA37LFB.js.map +1 -0
  171. package/dist/chunk-QZAWRSEB.js +61 -0
  172. package/dist/chunk-QZAWRSEB.js.map +1 -0
  173. package/dist/chunk-R74KGWNS.js +699 -0
  174. package/dist/chunk-R74KGWNS.js.map +1 -0
  175. package/dist/chunk-RFDLHMKL.js +110 -0
  176. package/dist/chunk-RFDLHMKL.js.map +1 -0
  177. package/dist/chunk-RL64HN7S.js +40 -0
  178. package/dist/chunk-RL64HN7S.js.map +1 -0
  179. package/dist/chunk-RMRQKPL7.js +115 -0
  180. package/dist/chunk-RMRQKPL7.js.map +1 -0
  181. package/dist/chunk-RQVK4IYC.js +606 -0
  182. package/dist/chunk-RQVK4IYC.js.map +1 -0
  183. package/dist/chunk-RTW56PWZ.js +59 -0
  184. package/dist/chunk-RTW56PWZ.js.map +1 -0
  185. package/dist/chunk-RUTPQNLR.js +266 -0
  186. package/dist/chunk-RUTPQNLR.js.map +1 -0
  187. package/dist/chunk-S6TAF63G.js +25 -0
  188. package/dist/chunk-S6TAF63G.js.map +1 -0
  189. package/dist/chunk-SBGAUGXY.js +224 -0
  190. package/dist/chunk-SBGAUGXY.js.map +1 -0
  191. package/dist/chunk-SC275NHZ.js +407 -0
  192. package/dist/chunk-SC275NHZ.js.map +1 -0
  193. package/dist/chunk-SCQPU4UE.js +97 -0
  194. package/dist/chunk-SCQPU4UE.js.map +1 -0
  195. package/dist/chunk-SFFF2WQP.js +8 -0
  196. package/dist/chunk-SFFF2WQP.js.map +1 -0
  197. package/dist/chunk-SJYMHZKA.js +36 -0
  198. package/dist/chunk-SJYMHZKA.js.map +1 -0
  199. package/dist/chunk-SLCCUJVN.js +125 -0
  200. package/dist/chunk-SLCCUJVN.js.map +1 -0
  201. package/dist/chunk-SVBSNSD4.js +259 -0
  202. package/dist/chunk-SVBSNSD4.js.map +1 -0
  203. package/dist/chunk-SVPLTL35.js +62 -0
  204. package/dist/chunk-SVPLTL35.js.map +1 -0
  205. package/dist/chunk-SWQFYNYG.js +338 -0
  206. package/dist/chunk-SWQFYNYG.js.map +1 -0
  207. package/dist/chunk-THHB4EWS.js +72 -0
  208. package/dist/chunk-THHB4EWS.js.map +1 -0
  209. package/dist/chunk-TUCDD33E.js +246 -0
  210. package/dist/chunk-TUCDD33E.js.map +1 -0
  211. package/dist/chunk-TV4WAP2R.js +14 -0
  212. package/dist/chunk-TV4WAP2R.js.map +1 -0
  213. package/dist/chunk-U3A6YBTZ.js +134 -0
  214. package/dist/chunk-U3A6YBTZ.js.map +1 -0
  215. package/dist/chunk-UGT6DKWM.js +95 -0
  216. package/dist/chunk-UGT6DKWM.js.map +1 -0
  217. package/dist/chunk-VSERHUWD.js +212 -0
  218. package/dist/chunk-VSERHUWD.js.map +1 -0
  219. package/dist/chunk-VYG7BDXC.js +49 -0
  220. package/dist/chunk-VYG7BDXC.js.map +1 -0
  221. package/dist/chunk-WETKNYZX.js +52 -0
  222. package/dist/chunk-WETKNYZX.js.map +1 -0
  223. package/dist/chunk-WGG4AML3.js +216 -0
  224. package/dist/chunk-WGG4AML3.js.map +1 -0
  225. package/dist/chunk-WKAUEL6I.js +30 -0
  226. package/dist/chunk-WKAUEL6I.js.map +1 -0
  227. package/dist/chunk-WPOLA5CG.js +81 -0
  228. package/dist/chunk-WPOLA5CG.js.map +1 -0
  229. package/dist/chunk-WPVETCGJ.js +254 -0
  230. package/dist/chunk-WPVETCGJ.js.map +1 -0
  231. package/dist/chunk-WTSM3A7E.js +13 -0
  232. package/dist/chunk-WTSM3A7E.js.map +1 -0
  233. package/dist/chunk-WU3F2K3T.js +148 -0
  234. package/dist/chunk-WU3F2K3T.js.map +1 -0
  235. package/dist/chunk-WZZK2DTZ.js +39 -0
  236. package/dist/chunk-WZZK2DTZ.js.map +1 -0
  237. package/dist/chunk-X4IHLKRD.js +42 -0
  238. package/dist/chunk-X4IHLKRD.js.map +1 -0
  239. package/dist/chunk-XAHEXZJC.js +80 -0
  240. package/dist/chunk-XAHEXZJC.js.map +1 -0
  241. package/dist/chunk-XCYGJDUX.js +31 -0
  242. package/dist/chunk-XCYGJDUX.js.map +1 -0
  243. package/dist/chunk-Y4W3JORC.js +104 -0
  244. package/dist/chunk-Y4W3JORC.js.map +1 -0
  245. package/dist/chunk-YFZJ3ZLG.js +1297 -0
  246. package/dist/chunk-YFZJ3ZLG.js.map +1 -0
  247. package/dist/chunk-YI3WLXEN.js +4387 -0
  248. package/dist/chunk-YI3WLXEN.js.map +1 -0
  249. package/dist/chunk-ZBKFSPD3.js +29 -0
  250. package/dist/chunk-ZBKFSPD3.js.map +1 -0
  251. package/dist/chunk-ZOERRQ6A.js +79 -0
  252. package/dist/chunk-ZOERRQ6A.js.map +1 -0
  253. package/dist/chunk-ZSTGUKHU.js +10 -0
  254. package/dist/chunk-ZSTGUKHU.js.map +1 -0
  255. package/dist/chunk-ZUEHDL27.js +65 -0
  256. package/dist/chunk-ZUEHDL27.js.map +1 -0
  257. package/dist/editors.d.ts +27 -3
  258. package/dist/editors.js +93 -2081
  259. package/dist/editors.js.map +1 -1
  260. package/dist/icons.d.ts +29 -8
  261. package/dist/icons.js +7 -361
  262. package/dist/icons.js.map +1 -1
  263. package/dist/index.d.ts +715 -441
  264. package/dist/index.js +121 -24643
  265. package/dist/index.js.map +1 -1
  266. package/dist/internal/blocks/AIKit.js +30 -0
  267. package/dist/internal/blocks/AIKit.js.map +1 -0
  268. package/dist/internal/blocks/AppShell.js +11 -0
  269. package/dist/internal/blocks/AppShell.js.map +1 -0
  270. package/dist/internal/blocks/AutoSaveTextarea.js +14 -0
  271. package/dist/internal/blocks/AutoSaveTextarea.js.map +1 -0
  272. package/dist/internal/blocks/BrandEditor.js +23 -0
  273. package/dist/internal/blocks/BrandEditor.js.map +1 -0
  274. package/dist/internal/blocks/ChartPanel.js +10 -0
  275. package/dist/internal/blocks/ChartPanel.js.map +1 -0
  276. package/dist/internal/blocks/ClipboardButton.js +12 -0
  277. package/dist/internal/blocks/ClipboardButton.js.map +1 -0
  278. package/dist/internal/blocks/ColorInput.js +13 -0
  279. package/dist/internal/blocks/ColorInput.js.map +1 -0
  280. package/dist/internal/blocks/ColorModeSwitch.js +13 -0
  281. package/dist/internal/blocks/ColorModeSwitch.js.map +1 -0
  282. package/dist/internal/blocks/Command.js +15 -0
  283. package/dist/internal/blocks/Command.js.map +1 -0
  284. package/dist/internal/blocks/CopyField.js +11 -0
  285. package/dist/internal/blocks/CopyField.js.map +1 -0
  286. package/dist/internal/blocks/DashboardHero.js +9 -0
  287. package/dist/internal/blocks/DashboardHero.js.map +1 -0
  288. package/dist/internal/blocks/DateInput.js +16 -0
  289. package/dist/internal/blocks/DateInput.js.map +1 -0
  290. package/dist/internal/blocks/DateRangeInput.js +16 -0
  291. package/dist/internal/blocks/DateRangeInput.js.map +1 -0
  292. package/dist/internal/blocks/EmptyConfigurationActionCard.js +10 -0
  293. package/dist/internal/blocks/EmptyConfigurationActionCard.js.map +1 -0
  294. package/dist/internal/blocks/EmptyState.js +4 -0
  295. package/dist/internal/blocks/EmptyState.js.map +1 -0
  296. package/dist/internal/blocks/ErrorState.js +5 -0
  297. package/dist/internal/blocks/ErrorState.js.map +1 -0
  298. package/dist/internal/blocks/ExportMenu.js +13 -0
  299. package/dist/internal/blocks/ExportMenu.js.map +1 -0
  300. package/dist/internal/blocks/Form.js +29 -0
  301. package/dist/internal/blocks/Form.js.map +1 -0
  302. package/dist/internal/blocks/FormGroup.js +18 -0
  303. package/dist/internal/blocks/FormGroup.js.map +1 -0
  304. package/dist/internal/blocks/GoogleButton.js +10 -0
  305. package/dist/internal/blocks/GoogleButton.js.map +1 -0
  306. package/dist/internal/blocks/MicrosoftButton.js +10 -0
  307. package/dist/internal/blocks/MicrosoftButton.js.map +1 -0
  308. package/dist/internal/blocks/MultiActionButtonGroup.js +12 -0
  309. package/dist/internal/blocks/MultiActionButtonGroup.js.map +1 -0
  310. package/dist/internal/blocks/MultiCombobox.js +14 -0
  311. package/dist/internal/blocks/MultiCombobox.js.map +1 -0
  312. package/dist/internal/blocks/NumberInput.js +12 -0
  313. package/dist/internal/blocks/NumberInput.js.map +1 -0
  314. package/dist/internal/blocks/OtpInput.js +10 -0
  315. package/dist/internal/blocks/OtpInput.js.map +1 -0
  316. package/dist/internal/blocks/PageHeader.js +9 -0
  317. package/dist/internal/blocks/PageHeader.js.map +1 -0
  318. package/dist/internal/blocks/PageLayout.js +9 -0
  319. package/dist/internal/blocks/PageLayout.js.map +1 -0
  320. package/dist/internal/blocks/PageToolbar.js +13 -0
  321. package/dist/internal/blocks/PageToolbar.js.map +1 -0
  322. package/dist/internal/blocks/PasswordInput.js +13 -0
  323. package/dist/internal/blocks/PasswordInput.js.map +1 -0
  324. package/dist/internal/blocks/SearchInput.js +12 -0
  325. package/dist/internal/blocks/SearchInput.js.map +1 -0
  326. package/dist/internal/blocks/SearchInputWithNavigation.js +16 -0
  327. package/dist/internal/blocks/SearchInputWithNavigation.js.map +1 -0
  328. package/dist/internal/blocks/SectionNav.js +15 -0
  329. package/dist/internal/blocks/SectionNav.js.map +1 -0
  330. package/dist/internal/blocks/SplitButton.js +14 -0
  331. package/dist/internal/blocks/SplitButton.js.map +1 -0
  332. package/dist/internal/blocks/StatCard.js +10 -0
  333. package/dist/internal/blocks/StatCard.js.map +1 -0
  334. package/dist/internal/blocks/TextInput.js +13 -0
  335. package/dist/internal/blocks/TextInput.js.map +1 -0
  336. package/dist/internal/blocks/Textarea.js +13 -0
  337. package/dist/internal/blocks/Textarea.js.map +1 -0
  338. package/dist/internal/blocks/TimeInput.js +17 -0
  339. package/dist/internal/blocks/TimeInput.js.map +1 -0
  340. package/dist/internal/components/Alert.js +11 -0
  341. package/dist/internal/components/Alert.js.map +1 -0
  342. package/dist/internal/components/AlertModal.js +11 -0
  343. package/dist/internal/components/AlertModal.js.map +1 -0
  344. package/dist/internal/components/Avatar.js +9 -0
  345. package/dist/internal/components/Avatar.js.map +1 -0
  346. package/dist/internal/components/Badge.js +9 -0
  347. package/dist/internal/components/Badge.js.map +1 -0
  348. package/dist/internal/components/BrandLogo.js +11 -0
  349. package/dist/internal/components/BrandLogo.js.map +1 -0
  350. package/dist/internal/components/Breadcrumb.js +14 -0
  351. package/dist/internal/components/Breadcrumb.js.map +1 -0
  352. package/dist/internal/components/Button.js +10 -0
  353. package/dist/internal/components/Button.js.map +1 -0
  354. package/dist/internal/components/ButtonGroup.js +9 -0
  355. package/dist/internal/components/ButtonGroup.js.map +1 -0
  356. package/dist/internal/components/Calendar.js +9 -0
  357. package/dist/internal/components/Calendar.js.map +1 -0
  358. package/dist/internal/components/Card.js +9 -0
  359. package/dist/internal/components/Card.js.map +1 -0
  360. package/dist/internal/components/Checkbox.js +11 -0
  361. package/dist/internal/components/Checkbox.js.map +1 -0
  362. package/dist/internal/components/Clipboard.js +9 -0
  363. package/dist/internal/components/Clipboard.js.map +1 -0
  364. package/dist/internal/components/Collapsible.js +9 -0
  365. package/dist/internal/components/Collapsible.js.map +1 -0
  366. package/dist/internal/components/CollapsiblePanel.js +11 -0
  367. package/dist/internal/components/CollapsiblePanel.js.map +1 -0
  368. package/dist/internal/components/Combobox.js +13 -0
  369. package/dist/internal/components/Combobox.js.map +1 -0
  370. package/dist/internal/components/DatePicker.js +11 -0
  371. package/dist/internal/components/DatePicker.js.map +1 -0
  372. package/dist/internal/components/DateRangePicker.js +17 -0
  373. package/dist/internal/components/DateRangePicker.js.map +1 -0
  374. package/dist/internal/components/DiffView.js +9 -0
  375. package/dist/internal/components/DiffView.js.map +1 -0
  376. package/dist/internal/components/DotsLoader.js +5 -0
  377. package/dist/internal/components/DotsLoader.js.map +1 -0
  378. package/dist/internal/components/DropdownMenu.js +11 -0
  379. package/dist/internal/components/DropdownMenu.js.map +1 -0
  380. package/dist/internal/components/EmptySearchContent.js +4 -0
  381. package/dist/internal/components/EmptySearchContent.js.map +1 -0
  382. package/dist/internal/components/FileUpload.js +11 -0
  383. package/dist/internal/components/FileUpload.js.map +1 -0
  384. package/dist/internal/components/FullScreenModal.js +12 -0
  385. package/dist/internal/components/FullScreenModal.js.map +1 -0
  386. package/dist/internal/components/HelpBlock.js +4 -0
  387. package/dist/internal/components/HelpBlock.js.map +1 -0
  388. package/dist/internal/components/HoverCard.js +9 -0
  389. package/dist/internal/components/HoverCard.js.map +1 -0
  390. package/dist/internal/components/InputGroup.js +11 -0
  391. package/dist/internal/components/InputGroup.js.map +1 -0
  392. package/dist/internal/components/Kbd.js +9 -0
  393. package/dist/internal/components/Kbd.js.map +1 -0
  394. package/dist/internal/components/Label.js +9 -0
  395. package/dist/internal/components/Label.js.map +1 -0
  396. package/dist/internal/components/Link.js +9 -0
  397. package/dist/internal/components/Link.js.map +1 -0
  398. package/dist/internal/components/MarkedText.js +5 -0
  399. package/dist/internal/components/MarkedText.js.map +1 -0
  400. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +10 -0
  401. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js.map +1 -0
  402. package/dist/internal/components/MergeEditor/PaneHeader.js +4 -0
  403. package/dist/internal/components/MergeEditor/PaneHeader.js.map +1 -0
  404. package/dist/internal/components/MergeEditor/constants.js +4 -0
  405. package/dist/internal/components/MergeEditor/constants.js.map +1 -0
  406. package/dist/internal/components/MergeEditor/useMergeDiff.js +5 -0
  407. package/dist/internal/components/MergeEditor/useMergeDiff.js.map +1 -0
  408. package/dist/internal/components/Modal.js +13 -0
  409. package/dist/internal/components/Modal.js.map +1 -0
  410. package/dist/internal/components/Navbar.js +14 -0
  411. package/dist/internal/components/Navbar.js.map +1 -0
  412. package/dist/internal/components/Pagination.js +11 -0
  413. package/dist/internal/components/Pagination.js.map +1 -0
  414. package/dist/internal/components/PanelWithDetails.js +11 -0
  415. package/dist/internal/components/PanelWithDetails.js.map +1 -0
  416. package/dist/internal/components/Popconfirm.js +12 -0
  417. package/dist/internal/components/Popconfirm.js.map +1 -0
  418. package/dist/internal/components/Popover.js +9 -0
  419. package/dist/internal/components/Popover.js.map +1 -0
  420. package/dist/internal/components/Progress.js +9 -0
  421. package/dist/internal/components/Progress.js.map +1 -0
  422. package/dist/internal/components/RadioGroup.js +12 -0
  423. package/dist/internal/components/RadioGroup.js.map +1 -0
  424. package/dist/internal/components/Resizable.js +9 -0
  425. package/dist/internal/components/Resizable.js.map +1 -0
  426. package/dist/internal/components/ScrollArea.js +9 -0
  427. package/dist/internal/components/ScrollArea.js.map +1 -0
  428. package/dist/internal/components/Search.js +10 -0
  429. package/dist/internal/components/Search.js.map +1 -0
  430. package/dist/internal/components/Select.js +12 -0
  431. package/dist/internal/components/Select.js.map +1 -0
  432. package/dist/internal/components/Separator.js +9 -0
  433. package/dist/internal/components/Separator.js.map +1 -0
  434. package/dist/internal/components/Sheet.js +12 -0
  435. package/dist/internal/components/Sheet.js.map +1 -0
  436. package/dist/internal/components/Sidebar.js +20 -0
  437. package/dist/internal/components/Sidebar.js.map +1 -0
  438. package/dist/internal/components/Skeleton/Skeleton.js +9 -0
  439. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -0
  440. package/dist/internal/components/Skeleton/SkeletonList.js +10 -0
  441. package/dist/internal/components/Skeleton/SkeletonList.js.map +1 -0
  442. package/dist/internal/components/Slider.js +11 -0
  443. package/dist/internal/components/Slider.js.map +1 -0
  444. package/dist/internal/components/SpotlightBackdrop.js +9 -0
  445. package/dist/internal/components/SpotlightBackdrop.js.map +1 -0
  446. package/dist/internal/components/Stepper.js +10 -0
  447. package/dist/internal/components/Stepper.js.map +1 -0
  448. package/dist/internal/components/Switch.js +10 -0
  449. package/dist/internal/components/Switch.js.map +1 -0
  450. package/dist/internal/components/Table.js +10 -0
  451. package/dist/internal/components/Table.js.map +1 -0
  452. package/dist/internal/components/Tabs.js +12 -0
  453. package/dist/internal/components/Tabs.js.map +1 -0
  454. package/dist/internal/components/ThemeProvider.js +10 -0
  455. package/dist/internal/components/ThemeProvider.js.map +1 -0
  456. package/dist/internal/components/TimePicker.js +12 -0
  457. package/dist/internal/components/TimePicker.js.map +1 -0
  458. package/dist/internal/components/Timeline.js +10 -0
  459. package/dist/internal/components/Timeline.js.map +1 -0
  460. package/dist/internal/components/Toast.js +11 -0
  461. package/dist/internal/components/Toast.js.map +1 -0
  462. package/dist/internal/components/Toggle.js +9 -0
  463. package/dist/internal/components/Toggle.js.map +1 -0
  464. package/dist/internal/components/ToggleGroup.js +9 -0
  465. package/dist/internal/components/ToggleGroup.js.map +1 -0
  466. package/dist/internal/components/Tooltip.js +8 -0
  467. package/dist/internal/components/Tooltip.js.map +1 -0
  468. package/dist/internal/components/Truncated.js +9 -0
  469. package/dist/internal/components/Truncated.js.map +1 -0
  470. package/dist/internal/components/Workbench.js +11 -0
  471. package/dist/internal/components/Workbench.js.map +1 -0
  472. package/dist/internal/components/ZoomableSvg.js +13 -0
  473. package/dist/internal/components/ZoomableSvg.js.map +1 -0
  474. package/dist/internal/hooks/useAutosizeInput.js +4 -0
  475. package/dist/internal/hooks/useAutosizeInput.js.map +1 -0
  476. package/dist/internal/hooks/useScrollbarPosition.js +5 -0
  477. package/dist/internal/hooks/useScrollbarPosition.js.map +1 -0
  478. package/dist/internal/hooks/useStableCallback.js +4 -0
  479. package/dist/internal/hooks/useStableCallback.js.map +1 -0
  480. package/dist/internal/utils/mergeRefs.js +4 -0
  481. package/dist/internal/utils/mergeRefs.js.map +1 -0
  482. package/dist/internal/utils.js +8 -0
  483. package/dist/internal/utils.js.map +1 -0
  484. package/dist/markdown-editor.js +55 -3426
  485. package/dist/markdown-editor.js.map +1 -1
  486. package/dist/mermaid.js +16 -1129
  487. package/dist/mermaid.js.map +1 -1
  488. package/dist/rjsf.js +252 -9380
  489. package/dist/rjsf.js.map +1 -1
  490. package/dist/styles.css +1 -1
  491. package/dist/testing.js +10 -357
  492. package/dist/testing.js.map +1 -1
  493. package/package.json +31 -75
  494. package/src/styles.css +95 -10
  495. package/src/theme.css +65 -0
  496. package/dist/charts.cjs +0 -268
  497. package/dist/charts.cjs.map +0 -1
  498. package/dist/charts.d.cts +0 -181
  499. package/dist/constants-D3gaMY-W.d.cts +0 -39
  500. package/dist/editors.cjs +0 -2440
  501. package/dist/editors.cjs.map +0 -1
  502. package/dist/editors.d.cts +0 -165
  503. package/dist/icons.cjs +0 -23888
  504. package/dist/icons.cjs.map +0 -1
  505. package/dist/icons.d.cts +0 -20
  506. package/dist/index.cjs +0 -24894
  507. package/dist/index.cjs.map +0 -1
  508. package/dist/index.d.cts +0 -10438
  509. package/dist/markdown-editor.cjs +0 -4636
  510. package/dist/markdown-editor.cjs.map +0 -1
  511. package/dist/markdown-editor.d.cts +0 -75
  512. package/dist/mermaid.cjs +0 -1138
  513. package/dist/mermaid.cjs.map +0 -1
  514. package/dist/mermaid.d.cts +0 -15
  515. package/dist/rjsf.cjs +0 -10893
  516. package/dist/rjsf.cjs.map +0 -1
  517. package/dist/rjsf.d.cts +0 -55
  518. package/dist/testing.cjs +0 -373
  519. package/dist/testing.cjs.map +0 -1
  520. package/dist/testing.d.cts +0 -25
package/dist/editors.cjs DELETED
@@ -1,2440 +0,0 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
- var autocomplete = require('@codemirror/autocomplete');
5
- var langJson = require('@codemirror/lang-json');
6
- var lint = require('@codemirror/lint');
7
- var merge = require('@codemirror/merge');
8
- var view = require('@codemirror/view');
9
- var CodeMirror = require('@uiw/react-codemirror');
10
- var clsx = require('clsx');
11
- var tailwindMerge = require('tailwind-merge');
12
- var reactTooltip = require('@radix-ui/react-tooltip');
13
- var classVarianceAuthority = require('class-variance-authority');
14
- var brandRegistry = require('@keboola/brand-registry');
15
- var jsxRuntime = require('react/jsx-runtime');
16
- var reactSlot = require('@radix-ui/react-slot');
17
- var lucideReact = require('lucide-react');
18
- var langJavascript = require('@codemirror/lang-javascript');
19
- var langPython = require('@codemirror/lang-python');
20
- var langSql = require('@codemirror/lang-sql');
21
- var language = require('@codemirror/language');
22
- var r = require('@codemirror/legacy-modes/mode/r');
23
- var shell = require('@codemirror/legacy-modes/mode/shell');
24
- var toml = require('@codemirror/legacy-modes/mode/toml');
25
- var codemirrorThemeGithub = require('@uiw/codemirror-theme-github');
26
- var codemirrorLangSql = require('@keboola/codemirror-lang-sql');
27
- var colors = require('@keboola/tailwind-config/colors');
28
- var simpleMode = require('@codemirror/legacy-modes/mode/simple-mode');
29
- var state = require('@codemirror/state');
30
- var commands = require('@codemirror/commands');
31
-
32
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
33
-
34
- var CodeMirror__default = /*#__PURE__*/_interopDefault(CodeMirror);
35
- var colors__default = /*#__PURE__*/_interopDefault(colors);
36
-
37
- // src/components/CodeEditor/CodeEditor.tsx
38
-
39
- // src/constants/keyCodes.ts
40
- var keyCodes = {
41
- ENTER: "Enter",
42
- ESCAPE: "Escape",
43
- SPACE: " "
44
- };
45
- var useStableCallback = (callback) => {
46
- const latestRef = react.useRef(callback);
47
- react.useLayoutEffect(() => {
48
- latestRef.current = callback;
49
- }, [callback]);
50
- return react.useCallback((...args) => latestRef.current(...args), []);
51
- };
52
- var twMerge = tailwindMerge.extendTailwindMerge({
53
- prefix: "tw"
54
- });
55
- var cn = (...classes) => twMerge(clsx.clsx(...classes));
56
-
57
- // src/utils/copyToClipboard.ts
58
- var copyToClipboard = (text) => {
59
- return navigator.clipboard.writeText(text);
60
- };
61
-
62
- // src/components/ThemeProvider/utils.ts
63
- var createTheme = (brand) => ({
64
- id: brand.id,
65
- name: brand.name,
66
- shell: brand.shell,
67
- logo: brand.logo
68
- });
69
-
70
- // src/components/ThemeProvider/defaults.ts
71
- [brandRegistry.keboolaLegacySidebar.id, brandRegistry.keboolaLegacyTopnav.id];
72
- var DEFAULT_COLOR_SCHEME = "light";
73
- var DEFAULT_BRAND_ID = "design-system";
74
- var defaultBrand = {
75
- id: DEFAULT_BRAND_ID,
76
- name: "Design System",
77
- shell: "sidebar"};
78
- var defaultTheme = createTheme(defaultBrand);
79
-
80
- // src/components/ThemeProvider/context.tsx
81
- var noop = () => void 0;
82
- var defaultContext = {
83
- scheme: DEFAULT_COLOR_SCHEME,
84
- resolvedScheme: DEFAULT_COLOR_SCHEME,
85
- setScheme: noop,
86
- brandId: defaultTheme.id,
87
- setBrand: noop,
88
- themes: [defaultTheme],
89
- currentTheme: defaultTheme
90
- };
91
- react.createContext(defaultContext);
92
- var ArgoDesignContext = react.createContext(true);
93
- var useArgoDesign = () => react.use(ArgoDesignContext);
94
- var tooltipVariants = classVarianceAuthority.cva(
95
- [
96
- "tailwindcss-preflight",
97
- "tw:inline-block",
98
- "tw:break-anywhere",
99
- "tw:max-h-96",
100
- "tw:overflow-y-auto",
101
- "tw:z-[1060]",
102
- // legacy (dark) chrome — default
103
- "tw:rounded",
104
- "tw:bg-neutral-800",
105
- "tw:text-white",
106
- // argo chrome overrides — semantic floating-panel tokens
107
- "tw:data-[argo=true]:rounded-2xl",
108
- "tw:data-[argo=true]:border",
109
- "tw:data-[argo=true]:border-solid",
110
- "tw:data-[argo=true]:border-border",
111
- "tw:data-[argo=true]:bg-popover",
112
- "tw:data-[argo=true]:text-popover-foreground",
113
- "tw:data-[argo=true]:shadow-md",
114
- // argo open animation
115
- "tw:data-[argo=true]:data-[state=delayed-open]:animate-in",
116
- "tw:data-[argo=true]:data-[state=instant-open]:animate-in",
117
- "tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0",
118
- "tw:data-[argo=true]:data-[state=instant-open]:fade-in-0",
119
- "tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95",
120
- "tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95",
121
- // argo closed animation
122
- "tw:data-[argo=true]:data-[state=closed]:animate-out",
123
- "tw:data-[argo=true]:data-[state=closed]:fade-out-0",
124
- "tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
125
- // argo position animation
126
- "tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2",
127
- "tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2",
128
- "tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2",
129
- "tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2"
130
- ],
131
- {
132
- defaultVariants: {
133
- variant: "action"
134
- },
135
- variants: {
136
- variant: {
137
- action: [
138
- "tw:max-w-fit",
139
- "tw:px-3",
140
- "tw:py-2",
141
- "tw:text-center",
142
- "tw:text-xs",
143
- "tw:font-medium",
144
- // Legacy chrome uppercases the action tooltip; the Keboola V2 brand
145
- // (`data-brand="keboola"`) renders it in standard case instead.
146
- "tw:uppercase",
147
- "tw:tracking-wider",
148
- "tw:[[data-brand=keboola]_&]:normal-case",
149
- "tw:[[data-brand=keboola]_&]:tracking-normal"
150
- ],
151
- explanatory: [
152
- "tw:max-w-80",
153
- "tw:px-4",
154
- "tw:py-3",
155
- "tw:text-left",
156
- "tw:text-sm",
157
- "tw:font-normal"
158
- ]
159
- }
160
- }
161
- }
162
- );
163
- var TooltipContent = ({
164
- className,
165
- variant,
166
- keepOpenOnPointerDownOutside = false,
167
- children,
168
- onPointerDownOutside,
169
- sideOffset = 8,
170
- collisionPadding = 8,
171
- hideWhenDetached = true,
172
- placement = "right",
173
- ...rest
174
- }) => {
175
- const renderArgo = useArgoDesign();
176
- const handlePointerDownOutside = (event) => {
177
- if (keepOpenOnPointerDownOutside) event.preventDefault();
178
- onPointerDownOutside?.(event);
179
- };
180
- return /* @__PURE__ */ jsxRuntime.jsx(reactTooltip.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
181
- reactTooltip.Content,
182
- {
183
- ...rest,
184
- "data-tooltip-content": renderArgo ? void 0 : true,
185
- "data-argo": renderArgo,
186
- sideOffset,
187
- collisionPadding,
188
- onPointerDownOutside: handlePointerDownOutside,
189
- className: tooltipVariants({ className, variant }),
190
- hideWhenDetached,
191
- side: placement,
192
- children
193
- }
194
- ) });
195
- };
196
- var DELAY_SHOW_TOOLTIP = 300;
197
- var TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }) => /* @__PURE__ */ jsxRuntime.jsx(reactTooltip.Root, { ...rest, delayDuration, children });
198
- var TooltipTrigger = ({
199
- ref,
200
- children,
201
- className,
202
- keepOpenOnClick = false,
203
- onClick,
204
- onPointerDown,
205
- asChild,
206
- ...rest
207
- }) => {
208
- const handleClick = (event) => {
209
- if (keepOpenOnClick) event.preventDefault();
210
- onClick?.(event);
211
- };
212
- const handlePointerDown = (event) => {
213
- if (keepOpenOnClick) event.preventDefault();
214
- onPointerDown?.(event);
215
- };
216
- return /* @__PURE__ */ jsxRuntime.jsx(
217
- reactTooltip.Trigger,
218
- {
219
- ...rest,
220
- asChild: true,
221
- ref,
222
- className: cn("tailwindcss-preflight", className),
223
- onClick: handleClick,
224
- onPointerDown: handlePointerDown,
225
- children: asChild ? children : (
226
- // Default-mode trigger wraps children in a span so Radix has a
227
- // single DOM element to attach handlers to. `tailwindcss-preflight`
228
- // (merged in via Slot) activates Tailwind's preflight inside the
229
- // span, which sets `svg { display: block }` — without an inline-flex
230
- // container that would stack any bare Lucide icon onto its own
231
- // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.
232
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tw:inline-flex tw:items-center", children })
233
- )
234
- }
235
- );
236
- };
237
- var ACTION_TOOLTIP_LIMIT = 30;
238
- var Tooltip = ({
239
- tooltip,
240
- children,
241
- className,
242
- keepOpenOnTriggerClick = false,
243
- variant,
244
- placement = "right",
245
- forceHide = false,
246
- forceShow = false,
247
- delayDuration,
248
- // trigger props
249
- triggerAsChild = false
250
- }) => {
251
- const [open, setOpen] = react.useState(false);
252
- const resolvedVariant = (() => {
253
- if (!!variant) return variant;
254
- if (typeof tooltip === "string" && tooltip.length > ACTION_TOOLTIP_LIMIT) return "explanatory";
255
- return "action";
256
- })();
257
- const isActionVariant = resolvedVariant === "action";
258
- const handleKeyUp = (event) => {
259
- if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;
260
- event.stopPropagation();
261
- };
262
- return /* @__PURE__ */ jsxRuntime.jsxs(
263
- TooltipRoot,
264
- {
265
- open: !!tooltip && (open || forceShow) && !forceHide,
266
- onOpenChange: setOpen,
267
- delayDuration,
268
- disableHoverableContent: isActionVariant,
269
- children: [
270
- /* @__PURE__ */ jsxRuntime.jsx(
271
- TooltipTrigger,
272
- {
273
- asChild: triggerAsChild,
274
- keepOpenOnClick: keepOpenOnTriggerClick,
275
- onKeyUp: handleKeyUp,
276
- children
277
- }
278
- ),
279
- /* @__PURE__ */ jsxRuntime.jsx(
280
- TooltipContent,
281
- {
282
- className,
283
- variant: resolvedVariant,
284
- placement,
285
- keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
286
- children: tooltip
287
- }
288
- )
289
- ]
290
- }
291
- );
292
- };
293
- Tooltip.Root = TooltipRoot;
294
- Tooltip.Content = TooltipContent;
295
- Tooltip.Trigger = TooltipTrigger;
296
-
297
- // src/utils/escapeStringRegexp.ts
298
- var escapeStringRegexp = (string) => string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
299
-
300
- // src/utils/isMac.ts
301
- var getIsMac = () => {
302
- if (typeof navigator !== "undefined" && "userAgentData" in navigator) {
303
- const platform = navigator.userAgentData.platform;
304
- if (typeof platform === "string") {
305
- return platform.toLowerCase() === "macos";
306
- }
307
- }
308
- if (typeof navigator !== "undefined" && typeof navigator.platform === "string") {
309
- return navigator.platform.toUpperCase().indexOf("MAC") >= 0;
310
- }
311
- return false;
312
- };
313
- var isMac = getIsMac();
314
- var helpVariants = classVarianceAuthority.cva(["tw:m-0", "tw:text-xs"], {
315
- defaultVariants: {
316
- state: "default"
317
- },
318
- variants: {
319
- state: {
320
- default: ["tw:text-muted-foreground"],
321
- warning: ["tw:text-warning"]
322
- }
323
- }
324
- });
325
- var HelpBlock = ({ children, className, state = "default", ...rest }) => {
326
- if (!children) return null;
327
- return /* @__PURE__ */ jsxRuntime.jsx("p", { ...rest, className: helpVariants({ state, className }), children });
328
- };
329
- var variants = classVarianceAuthority.cva(
330
- [
331
- "tailwindcss-preflight",
332
- "tw:group/button",
333
- "tw:border-box",
334
- // layout
335
- "tw:relative",
336
- "tw:flex",
337
- "tw:items-center",
338
- "tw:justify-center",
339
- "tw:gap-2",
340
- // text — chrome weight/tracking are brand-overridable tokens
341
- // (`--font-weight-medium` / `--letter-spacing-chrome`). Casing: standard case is
342
- // the default; only legacy brands (`keboola-legacy-*`) uppercase the chrome, so
343
- // modern brands (incl. Keboola V2) read naturally. Mirrors the V2 standard-case
344
- // treatment shipped for Tooltip/Badge (PR 7629).
345
- "tw:text-xs",
346
- "tw:leading-5",
347
- "tw:font-medium",
348
- "tw:[[data-brand^=keboola-legacy]_&]:tracking-chrome",
349
- "tw:[[data-brand^=keboola-legacy]_&]:uppercase",
350
- // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
351
- "tw:rounded",
352
- "tw:border",
353
- "tw:border-transparent",
354
- // styling
355
- "tw:shadow-none",
356
- "tw:[a]:cursor-pointer",
357
- // explicitly set for anchor
358
- "tw:focus-visible:outline",
359
- "tw:focus-visible:outline-1",
360
- "tw:focus-visible:-outline-offset-1",
361
- "tw:focus-visible:outline-ring",
362
- "tw:focus-visible:ring-4",
363
- "tw:focus-visible:ring-ring/30",
364
- // disabled
365
- "tw:disabled:opacity-40",
366
- "tw:disabled:cursor-not-allowed",
367
- // anchor support
368
- "tw:!no-underline",
369
- "tw:aria-disabled:opacity-40",
370
- "tw:aria-disabled:cursor-not-allowed",
371
- "tw:[&_svg]:shrink-0"
372
- ],
373
- {
374
- defaultVariants: {
375
- size: "medium",
376
- variant: "primary",
377
- block: false
378
- },
379
- variants: {
380
- block: {
381
- true: ["tw:w-full"]
382
- },
383
- variant: {
384
- primary: [
385
- "tw:text-white",
386
- "tw:bg-primary-500",
387
- "tw:focus:text-white",
388
- "tw:hover:text-white",
389
- "tw:hover:not-disabled:bg-primary-600",
390
- "tw:active:not-disabled:bg-primary-800",
391
- // anchor disabled override
392
- "tw:aria-disabled:!bg-primary-500"
393
- ],
394
- secondary: [
395
- "tw:text-white",
396
- "tw:bg-secondary-500",
397
- "tw:focus:text-white",
398
- "tw:hover:text-white",
399
- "tw:hover:not-disabled:bg-secondary-700",
400
- "tw:active:not-disabled:bg-secondary-800",
401
- // anchor disabled override
402
- "tw:aria-disabled:!bg-secondary-500"
403
- ],
404
- danger: [
405
- "tw:text-white",
406
- "tw:bg-error-500",
407
- "tw:focus:text-white",
408
- "tw:hover:text-white",
409
- "tw:hover:not-disabled:bg-error-600",
410
- "tw:active:not-disabled:bg-error-700",
411
- // anchor disabled override
412
- "tw:aria-disabled:!bg-error-500"
413
- ],
414
- invisible: [
415
- "tw:text-neutral-800",
416
- "tw:bg-transparent",
417
- "tw:focus:text-neutral-800",
418
- "tw:hover:not-disabled:bg-neutral-100",
419
- "tw:hover:text-neutral-800",
420
- "tw:active:not-disabled:bg-neutral-150",
421
- // contrasting icon on hover/active
422
- "tw:[&_svg]:text-neutral-400",
423
- "tw:hover:not-disabled:[&_svg]:text-secondary-600",
424
- "tw:active:not-disabled:[&_svg]:text-secondary-600",
425
- // anchor disabled override
426
- "tw:aria-disabled:!bg-transparent"
427
- ],
428
- outline: [
429
- "tw:text-neutral-800",
430
- "tw:bg-white",
431
- // border
432
- "tw:!border-neutral-200",
433
- "tw:hover:text-neutral-800",
434
- "tw:focus:text-neutral-800",
435
- "tw:hover:not-disabled:!border-neutral-300",
436
- "tw:hover:not-disabled:bg-neutral-100",
437
- "tw:active:not-disabled:bg-neutral-200",
438
- // contrasting icon hover, same as invisible
439
- "tw:[&_svg]:text-neutral-400",
440
- "tw:not-disabled:hover:[&_svg]:text-secondary-600",
441
- "tw:active:not-disabled:[&_svg]:text-secondary-600",
442
- // anchor disabled override
443
- "tw:aria-disabled:!bg-white",
444
- "tw:aria-disabled:!border-neutral-200"
445
- ],
446
- inline: [
447
- "tw:text-neutral-800",
448
- "tw:bg-transparent",
449
- "tw:rounded-full",
450
- "tw:[&_svg]:text-neutral-400",
451
- "tw:not-disabled:hover:[&_svg]:text-secondary-600",
452
- "tw:not-disabled:focus:[&_svg]:text-secondary-600"
453
- ]
454
- },
455
- size: {
456
- medium: [
457
- "tw:max-h-10",
458
- "tw:min-h-10",
459
- "tw:px-4",
460
- "tw:py-2.5",
461
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
462
- ],
463
- small: [
464
- "tw:max-h-8",
465
- "tw:min-h-8",
466
- "tw:px-4",
467
- "tw:py-1.5",
468
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
469
- ],
470
- large: [
471
- "tw:max-h-12",
472
- "tw:min-h-12",
473
- "tw:px-4",
474
- "tw:py-3.5",
475
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
476
- ],
477
- "icon-lg": ["tw:size-12", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-6'],
478
- icon: ["tw:size-10", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
479
- "icon-sm": ["tw:size-8", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
480
- "icon-xs": ["tw:size-6", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
481
- "icon-2xs": [
482
- "tw:!inline-flex",
483
- "tw:size-5",
484
- "tw:max-h-5",
485
- 'tw:[&_svg:not([class*="tw:size-"])]:size-3'
486
- ],
487
- "icon-3xs": ["tw:h-fit", "tw:w-fit", 'tw:[&_svg:not([class*="tw:size-"])]:size-4']
488
- }
489
- }
490
- }
491
- );
492
- var argoVariants = classVarianceAuthority.cva(
493
- [
494
- "tailwindcss-preflight",
495
- // layout
496
- "tw:relative",
497
- "tw:inline-flex",
498
- "tw:items-center",
499
- "tw:justify-center",
500
- "tw:whitespace-nowrap",
501
- "tw:gap-2",
502
- // border
503
- "tw:border",
504
- "tw:border-transparent",
505
- "tw:rounded-[var(--radius-lg,0.25rem)]",
506
- // text
507
- "tw:font-medium",
508
- "tw:select-none",
509
- // focus visible
510
- "tw:!outline-hidden",
511
- "tw:focus-visible:ring-2",
512
- // disabled
513
- "tw:disabled:cursor-not-allowed",
514
- "tw:disabled:opacity-50",
515
- "tw:active:opacity-60",
516
- "tw:transition-all",
517
- "tw:bg-clip-padding",
518
- // anchor support
519
- "tw:!no-underline",
520
- "tw:aria-disabled:cursor-not-allowed",
521
- "tw:aria-disabled:opacity-50",
522
- // icon
523
- "tw:shrink-0",
524
- "tw:[&_svg]:pointer-events-none",
525
- "tw:[&_svg]:shrink-0",
526
- "tw:[&_svg:not([class*='tw:size-'])]:size-4"
527
- ],
528
- {
529
- defaultVariants: {
530
- variant: "primary",
531
- size: "medium"
532
- },
533
- variants: {
534
- block: {
535
- true: ["tw:w-full"]
536
- },
537
- variant: {
538
- primary: [
539
- "tw:bg-primary",
540
- "tw:text-primary-foreground",
541
- "tw:[a]:hover:bg-primary/80",
542
- "tw:hover:not-disabled:bg-primary/90",
543
- "tw:hover:text-primary-foreground",
544
- "tw:focus:text-primary-foreground",
545
- "tw:focus-visible:border-primary",
546
- "tw:focus-visible:ring-ring/50"
547
- ],
548
- secondary: [
549
- "tw:bg-primary/10",
550
- "tw:text-primary",
551
- "tw:hover:not-disabled:bg-primary/20",
552
- "tw:focus-visible:border-primary",
553
- "tw:focus-visible:ring-ring/50"
554
- ],
555
- // should be called "destructive" by Figma
556
- danger: [
557
- "tw:bg-destructive",
558
- "tw:text-destructive-foreground",
559
- "tw:hover:text-destructive-foreground",
560
- "tw:focus:text-destructive-foreground",
561
- "tw:focus-visible:border-destructive",
562
- "tw:focus-visible:ring-destructive/20"
563
- ],
564
- outline: [
565
- "tw:!border-input",
566
- "tw:bg-background",
567
- // Semantic base text color so the label/icon flips in dark mode
568
- // (matches `invisible`); previously unset → inherited a fixed dark color.
569
- "tw:text-foreground",
570
- // Hover follows the brand primary (translucent tint), matching the
571
- // `secondary` variant — not the fixed `accent` blue.
572
- "tw:hover:not-disabled:bg-primary/10",
573
- "tw:hover:not-disabled:text-primary",
574
- "tw:hover:active:bg-background",
575
- "tw:focus-visible:!border-primary",
576
- "tw:focus-visible:ring-ring/50"
577
- ],
578
- // should be called "ghost" by Figma
579
- invisible: [
580
- "tw:bg-transparent",
581
- "tw:text-foreground",
582
- "tw:hover:not-disabled:bg-primary/10",
583
- "tw:hover:not-disabled:text-primary",
584
- "tw:hover:not-disabled:border-primary/10",
585
- "tw:focus-visible:ring-ring/50"
586
- ],
587
- // should be called "link" by Figma
588
- inline: [
589
- "tw:bg-transparent",
590
- "tw:text-primary",
591
- "tw:hover:underline",
592
- "tw:hover:active:bg-transparent",
593
- "tw:focus-visible:ring-ring/50"
594
- ]
595
- },
596
- size: {
597
- // should be called "default" by Figma
598
- medium: ["tw:max-h-9", "tw:py-2", "tw:px-4", "tw:text-sm"],
599
- // should be called "small" by Figma
600
- small: ["tw:max-h-8", "tw:py-2", "tw:px-3", "tw:text-xs"],
601
- // should be called "large" by Figma
602
- large: ["tw:max-h-10", "tw:py-2.5", "tw:px-6", "tw:text-sm"],
603
- "icon-lg": ["tw:size-10"],
604
- icon: ["tw:size-9"],
605
- "icon-sm": ["tw:size-8"],
606
- // unsupported in ARGO, remove when old design is gone
607
- "icon-xs": [],
608
- "icon-2xs": [],
609
- "icon-3xs": []
610
- }
611
- }
612
- }
613
- );
614
- var Button = ({
615
- ref,
616
- children,
617
- disabled = false,
618
- className,
619
- type = "button",
620
- isLoading = false,
621
- asChild = false,
622
- onClick,
623
- variant = "primary",
624
- size = "medium",
625
- block = false,
626
- ...buttonProps
627
- }) => {
628
- const renderArgo = useArgoDesign();
629
- const Comp = asChild ? reactSlot.Root : "button";
630
- const isIconOnly = String(size).startsWith("icon");
631
- const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
632
- const handleClick = (event) => {
633
- const isAnchor = event.currentTarget.tagName === "A";
634
- if (isAnchor && disabled) {
635
- event.preventDefault();
636
- return;
637
- }
638
- onClick?.(event);
639
- };
640
- return /* @__PURE__ */ jsxRuntime.jsxs(
641
- Comp,
642
- {
643
- ...buttonProps,
644
- ref,
645
- disabled,
646
- "aria-disabled": disabled,
647
- "data-variant": variant,
648
- "data-icon-only": isIconOnly,
649
- type,
650
- onClick: handleClick,
651
- className: cn(classNames),
652
- children: [
653
- isLoading && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "tw:size-4 tw:shrink-0 tw:animate-spin" }),
654
- /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slottable, { children: isLoading && isIconOnly ? null : children })
655
- ]
656
- }
657
- );
658
- };
659
- var Clipboard2 = ({
660
- ref,
661
- text: textProp,
662
- children,
663
- tooltip = "Copy to Clipboard",
664
- tooltipPlacement = "top",
665
- tooltipVariant: tooltipVariantProp = "action",
666
- asChild = false,
667
- onClick,
668
- className,
669
- ...restButtonProps
670
- }) => {
671
- const [isTooltipOpen, setIsTooltipOpen] = react.useState(false);
672
- const [state, setState] = react.useState("ready");
673
- const text = typeof textProp === "function" ? textProp() : textProp;
674
- const copy = async (text2) => {
675
- try {
676
- if (!document.hasFocus()) window.focus();
677
- await copyToClipboard(text2);
678
- setState("copied");
679
- } catch {
680
- setState("error");
681
- }
682
- };
683
- const handleOnClick = (event) => {
684
- setIsTooltipOpen(true);
685
- if (text && state === "ready") void copy(text);
686
- onClick?.(event);
687
- };
688
- const handleOnOpenChange = (open) => {
689
- if (!open && state !== "ready") setState("ready");
690
- setIsTooltipOpen(open);
691
- };
692
- const tooltipContent = (() => {
693
- if (!text) return "Nothing to copy";
694
- if (state === "error") return "Failed to copy";
695
- if (state === "copied") return "Copied to Clipboard";
696
- return tooltip;
697
- })();
698
- const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
699
- const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
700
- return /* @__PURE__ */ jsxRuntime.jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
701
- /* @__PURE__ */ jsxRuntime.jsx(
702
- Tooltip.Trigger,
703
- {
704
- ...restButtonProps,
705
- asChild,
706
- keepOpenOnClick: true,
707
- onClick: handleOnClick,
708
- className: cn("tw:cursor-pointer", className),
709
- ref,
710
- children: children ?? text
711
- }
712
- ),
713
- hasTooltipContent && /* @__PURE__ */ jsxRuntime.jsx(
714
- Tooltip.Content,
715
- {
716
- keepOpenOnPointerDownOutside: true,
717
- placement: tooltipPlacement,
718
- variant: tooltipVariant,
719
- children: tooltipContent
720
- }
721
- )
722
- ] });
723
- };
724
- var DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, {});
725
- var DEFAULT_ARIA_LABEL = "Copy";
726
- var ClipboardButton = ({
727
- // clipboard props
728
- text,
729
- tooltip,
730
- tooltipPlacement,
731
- tooltipVariant,
732
- // button props
733
- icon = DEFAULT_ICON,
734
- variant = "outline",
735
- children,
736
- ...rest
737
- }) => {
738
- const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
739
- const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
740
- return /* @__PURE__ */ jsxRuntime.jsx(
741
- Clipboard2,
742
- {
743
- asChild: true,
744
- tooltip,
745
- tooltipPlacement,
746
- tooltipVariant,
747
- text,
748
- children: /* @__PURE__ */ jsxRuntime.jsxs(Button, { ...rest, "aria-label": ariaLabel, variant, disabled: !text, children: [
749
- icon,
750
- children
751
- ] })
752
- }
753
- );
754
- };
755
- var ButtonToolbar = ({ value, children }) => {
756
- if (!value && !children) return null;
757
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "tw:pointer-events-auto tw:ml-auto tw:mr-4 tw:flex tw:w-fit tw:gap-1 tw:overflow-visible tw:rounded-lg tw:border tw:border-solid tw:border-border tw:!bg-background tw:p-[3px] tw:shadow", children: [
758
- !!value && /* @__PURE__ */ jsxRuntime.jsx(ClipboardButton, { size: "icon-sm", variant: "invisible", text: value }),
759
- children
760
- ] });
761
- };
762
- var COMMANDS = [
763
- "run-operation",
764
- "run",
765
- "test",
766
- "seed",
767
- "snapshot",
768
- "list",
769
- "ls",
770
- "compile",
771
- "build",
772
- "deps",
773
- "docs",
774
- "source"
775
- ];
776
- var SUBCOMMANDS = { docs: ["generate"], source: ["freshness"] };
777
- var ARGUMENTS = ["--select", "--exclude", "--selector", "--defer", "--resource-type", "-s"];
778
- var SELECTORS = ["--select", "--exclude", "-s"];
779
- var METHODS = [
780
- "path:",
781
- "source:",
782
- "tag:",
783
- "package:",
784
- "config:",
785
- "test_type:",
786
- "test_name:",
787
- "state:",
788
- "exposure:",
789
- "metric:",
790
- "result:",
791
- "source_status:",
792
- "column_name:"
793
- ];
794
- var FLAGS = [
795
- "--fail-fast",
796
- "--warn-error",
797
- "--favor-state",
798
- "--vars",
799
- "--models",
800
- "--threads",
801
- "--profiles-dir",
802
- "--profile",
803
- "--full-refresh"
804
- ];
805
- var COMMAND_PHRASES = COMMANDS.flatMap((command) => {
806
- const subcommands = SUBCOMMANDS[command];
807
- return subcommands ? subcommands.map((subcommand) => `${command} ${subcommand}`) : [command];
808
- });
809
- var alternation = (list) => [...list].sort((a, b) => b.length - a.length).join("|");
810
- var word = (list) => new RegExp(`^\\s+(?:${alternation(list)})\\b`, "i");
811
- var prefix = (list) => new RegExp(`^\\s+(?:${alternation(list)})`, "i");
812
- var WORD = /[\w:-]*$/;
813
- var asOptions = (list, type) => list.map((label) => ({ label, type }));
814
- var DBT = [{ label: "dbt", type: "keyword" }];
815
- var COMMAND_OPTIONS = asOptions(COMMANDS, "keyword");
816
- var SUBCOMMAND_OPTIONS = Object.fromEntries(
817
- Object.entries(SUBCOMMANDS).map(([command, subcommands]) => [
818
- command,
819
- asOptions(subcommands, "keyword")
820
- ])
821
- );
822
- var ARGUMENT_OPTIONS = asOptions(ARGUMENTS, "variable");
823
- var FLAG_OPTIONS = asOptions(FLAGS, "constant");
824
- var METHOD_OPTIONS = asOptions(METHODS, "property");
825
- var optionsAfter = (words) => {
826
- const [step, command, ...rest] = words;
827
- if (step === void 0) return DBT;
828
- if (step.toLowerCase() !== "dbt") return [];
829
- if (command === void 0) return COMMAND_OPTIONS;
830
- const subcommands = SUBCOMMAND_OPTIONS[command.toLowerCase()];
831
- if (subcommands && rest.length === 0) return subcommands;
832
- const lastArgument = rest.filter((it) => it.startsWith("-")).at(-1);
833
- const selecting = lastArgument !== void 0 && SELECTORS.includes(lastArgument.toLowerCase());
834
- return selecting ? [...ARGUMENT_OPTIONS, ...FLAG_OPTIONS, ...METHOD_OPTIONS] : [...ARGUMENT_OPTIONS, ...FLAG_OPTIONS];
835
- };
836
- var complete = (context) => {
837
- const typed = context.matchBefore(WORD);
838
- if (!typed?.text && !context.explicit) return null;
839
- const from = typed?.from ?? context.pos;
840
- const line = context.state.doc.lineAt(from);
841
- const options = optionsAfter(
842
- line.text.slice(0, from - line.from).split(/\s+/).filter(Boolean)
843
- );
844
- return options.length > 0 ? { from, options, validFor: WORD } : null;
845
- };
846
- var dbt = simpleMode.simpleMode({
847
- languageData: {
848
- // `toggleComment` is a no-op without these, so Mod-/ silently does nothing.
849
- commentTokens: { line: "--", block: { open: "/*", close: "*/" } },
850
- autocomplete: complete
851
- },
852
- start: [
853
- { regex: /"(?:[^\\]|\\.)*?(?:"|$)/, token: "string" },
854
- // Word-bounded, so `dbtX` is not a dbt step whose first word happens to
855
- // colour — the same thing the completion source asks of it.
856
- { regex: /dbt\b/, token: "keyword", sol: true },
857
- { regex: word(COMMAND_PHRASES), token: "keyword" },
858
- { regex: word(ARGUMENTS), token: "variableName" },
859
- { regex: prefix(METHODS), token: "propertyName" },
860
- { regex: prefix(FLAGS), token: "attributeName" },
861
- { regex: /(?:@|\*|,|\+\d+|\d+\+|\+)/, token: "operator" },
862
- { regex: /'.*'/, token: "string" },
863
- { regex: /true|false/, token: "atom" }
864
- ]
865
- });
866
-
867
- // src/components/CodeEditor/modes/jsonnet.ts
868
- var COMMENT_END = /^\*\//;
869
- var COMMENT_START = /^\/\/|^#/;
870
- var C_COMMENT_START = /^\/\*/;
871
- var TEXT_BLOCK = /^\|\|\|/;
872
- var TEXT_BLOCK_END = /^\s*\|\|\|/;
873
- var RAW_DOUBLE = /^""/;
874
- var RAW_SINGLE = /^''/;
875
- var CLOSE_DOUBLE = /^"/;
876
- var CLOSE_SINGLE = /^'/;
877
- var ESCAPE = /^\\[\\"'/bfnrt0]/;
878
- var UNICODE_ESCAPE = /^\\u[0-9a-fA-F]{4}/;
879
- var BACKSLASH = /^\\/;
880
- var IMPORT = /^import(?:str)?\s*(@?)(["'])/;
881
- var QUOTE = /^(@?)(["'])/;
882
- var ROOT = /^\$/;
883
- var NUMBER = /^(?:\.\d+|\d+\.?\d*)(?:e[-+]?\d+)?/i;
884
- var OPERATOR = /^[-+/*=<>!&~^|$%]+/;
885
- var IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*/;
886
- var KEYWORDS = {
887
- local: "keyword",
888
- self: "keyword",
889
- super: "keyword",
890
- assert: "keyword",
891
- function: "keyword",
892
- if: "keyword",
893
- then: "keyword",
894
- else: "keyword",
895
- for: "keyword",
896
- in: "keyword",
897
- tailstrict: "keyword",
898
- error: "keyword",
899
- true: "atom",
900
- false: "atom",
901
- null: "atom"
902
- };
903
- var jsonnet = {
904
- name: "jsonnet",
905
- // `toggleComment` is a no-op without these, so Mod-/ silently does nothing.
906
- languageData: { commentTokens: { line: "//", block: { open: "/*", close: "*/" } } },
907
- startState: () => ({
908
- cComment: false,
909
- textBlock: false,
910
- textBlockIndent: null,
911
- string: false,
912
- importString: false,
913
- stringSingle: false,
914
- stringRaw: false
915
- }),
916
- token: (stream, state) => {
917
- if (state.cComment) {
918
- if (stream.match(COMMENT_END)) {
919
- state.cComment = false;
920
- return "comment";
921
- }
922
- stream.next();
923
- return "comment";
924
- }
925
- if (state.textBlock) {
926
- if (state.textBlockIndent == null) {
927
- if (stream.match(TEXT_BLOCK_END)) {
928
- state.textBlock = false;
929
- return "string";
930
- }
931
- state.textBlockIndent = stream.indentation();
932
- }
933
- if (stream.indentation() >= state.textBlockIndent) {
934
- stream.skipToEnd();
935
- return "string";
936
- }
937
- if (stream.match(TEXT_BLOCK_END)) {
938
- state.textBlock = false;
939
- return "string";
940
- }
941
- stream.next();
942
- return "invalid";
943
- }
944
- if (state.string || state.importString) {
945
- const style = state.string ? "string" : "meta";
946
- if (state.stringRaw) {
947
- if (stream.match(state.stringSingle ? RAW_SINGLE : RAW_DOUBLE)) return "escape";
948
- } else {
949
- if (stream.match(ESCAPE)) return "escape";
950
- if (stream.match(UNICODE_ESCAPE)) return "escape";
951
- if (stream.match(BACKSLASH)) return "invalid";
952
- }
953
- if (stream.match(state.stringSingle ? CLOSE_SINGLE : CLOSE_DOUBLE)) {
954
- state.string = false;
955
- state.importString = false;
956
- return style;
957
- }
958
- stream.next();
959
- return style;
960
- }
961
- if (stream.match(COMMENT_START)) {
962
- stream.skipToEnd();
963
- return "comment";
964
- }
965
- if (stream.match(C_COMMENT_START)) {
966
- state.cComment = true;
967
- return "comment";
968
- }
969
- const imported = stream.match(IMPORT);
970
- if (Array.isArray(imported)) {
971
- state.importString = true;
972
- state.stringRaw = imported[1] === "@";
973
- state.stringSingle = imported[2] === "'";
974
- return "meta";
975
- }
976
- const quoted = stream.match(QUOTE);
977
- if (Array.isArray(quoted)) {
978
- state.string = true;
979
- state.stringRaw = quoted[1] === "@";
980
- state.stringSingle = quoted[2] === "'";
981
- return "string";
982
- }
983
- if (stream.match(TEXT_BLOCK)) {
984
- state.textBlock = true;
985
- state.textBlockIndent = null;
986
- return "string";
987
- }
988
- if (stream.match(ROOT)) return "keyword";
989
- if (stream.match(NUMBER)) return "number";
990
- if (stream.match(OPERATOR)) return "operator";
991
- const identifier = stream.match(IDENTIFIER);
992
- if (Array.isArray(identifier)) return KEYWORDS[identifier[0]] ?? null;
993
- stream.next();
994
- return null;
995
- }
996
- };
997
- var resolveToken = (token, fallbackChannels, alpha) => {
998
- const channels = typeof document === "undefined" ? fallbackChannels : getComputedStyle(document.documentElement).getPropertyValue(`--${token}`).trim() || fallbackChannels;
999
- return alpha === void 0 ? `rgb(${channels})` : `rgb(${channels} / ${alpha})`;
1000
- };
1001
- var SSR_SIGNAL = "ssr";
1002
- var readThemeSignal = () => {
1003
- if (typeof document === "undefined") return SSR_SIGNAL;
1004
- const root = document.documentElement;
1005
- return `${root.getAttribute("data-theme") ?? ""}:${root.getAttribute("data-brand") ?? ""}`;
1006
- };
1007
- var subscribeThemeSignal = (onChange) => {
1008
- if (typeof document === "undefined") return () => {
1009
- };
1010
- const observer = new MutationObserver(onChange);
1011
- observer.observe(document.documentElement, {
1012
- attributes: true,
1013
- attributeFilter: ["data-theme", "data-brand"]
1014
- });
1015
- return () => observer.disconnect();
1016
- };
1017
- var useThemeSignal = () => react.useSyncExternalStore(subscribeThemeSignal, readThemeSignal, () => SSR_SIGNAL);
1018
- var themeCache = /* @__PURE__ */ new Map();
1019
- var useThemedExtension = (cacheKey, build) => {
1020
- const themeSignal = useThemeSignal();
1021
- const key = `${themeSignal} ${cacheKey}`;
1022
- let cached = themeCache.get(key);
1023
- if (!cached) {
1024
- cached = build();
1025
- themeCache.set(key, cached);
1026
- }
1027
- return cached;
1028
- };
1029
-
1030
- // src/components/CodeEditor/helpers.ts
1031
- var LANGUAGE_MODES = [
1032
- "application/json",
1033
- "text/plain",
1034
- "text/x-python",
1035
- "text/x-sql",
1036
- "text/x-mysql",
1037
- "text/x-pgsql",
1038
- "text/x-mssql",
1039
- // Snowflake, under a historical name — these strings are a published prop contract.
1040
- "text/x-sfsql",
1041
- "text/x-plsql",
1042
- "text/x-rsrc",
1043
- "text/x-sh",
1044
- "text/x-toml",
1045
- "text/jsonnet",
1046
- "text/x-dbt",
1047
- "text/javascript",
1048
- "text/typescript"
1049
- ];
1050
- var isLanguageMode = (mode) => LANGUAGE_MODES.includes(mode);
1051
- var buildBaseThemeStyles = () => ({
1052
- "*": { lineHeight: "20px" },
1053
- "*::selection": {
1054
- backgroundColor: resolveToken("primary", "31 143 255"),
1055
- color: `${resolveToken("primary-foreground", "255 255 255")} !important`
1056
- },
1057
- '&.cm-editor:has(.cm-content[contenteditable="false"])': {
1058
- backgroundColor: resolveToken("secondary", "226 232 240")
1059
- },
1060
- '&.cm-editor:has(.cm-content[contenteditable="false"]) .cm-gutters': {
1061
- backgroundColor: resolveToken("border", "229 231 235")
1062
- },
1063
- "&.cm-editor .cm-scroller": { overflowAnchor: "none" },
1064
- "&.cm-editor, &.cm-editor .cm-scroller": {
1065
- minHeight: "100%",
1066
- flexGrow: 1,
1067
- alignItems: "stretch !important",
1068
- outline: "none"
1069
- },
1070
- ".cm-gutter.cm-foldGutter": { display: "none !important" },
1071
- ".cm-gutter.cm-lineNumbers": { paddingLeft: "20px", paddingRight: "6px" },
1072
- ".cm-gutters": { height: "auto" },
1073
- // tokens overrides
1074
- ".cm-line .tok-string": { color: colors__default.default.warning[700] },
1075
- // merge (diff) view
1076
- '&[class*="cm-merge-"] .cm-deletedLine': { backgroundColor: colors__default.default.error[100] },
1077
- '&[class*="cm-merge-"] .cm-changedLine': { backgroundColor: colors__default.default.green[100] },
1078
- '&[class*="cm-merge-"] .cm-deletedLineGutter': { backgroundColor: colors__default.default.error[200] },
1079
- '&[class*="cm-merge-"] .cm-changedLineGutter': { backgroundColor: colors__default.default.green[200] },
1080
- '&[class*="cm-merge-"] .cm-deletedText': { background: colors__default.default.error[200] },
1081
- '&[class*="cm-merge-"] .cm-changedText': { background: colors__default.default.green[200] },
1082
- '&[class*="cm-merge-"]': {
1083
- backgroundColor: `${colors__default.default.white} !important`
1084
- },
1085
- '&[class*="cm-merge-"] .cm-gutters': {
1086
- backgroundColor: `${colors__default.default.white} !important`
1087
- },
1088
- ".cm-changeGutter": { position: "absolute", zIndex: -1, width: "100%", paddingLeft: 0 },
1089
- '&[class*="cm-merge-"] .cm-changedLine,&[class*="cm-merge-"] .cm-line, &[class*="cm-merge-"] .cm-deletedChunk': { paddingLeft: 0 }
1090
- });
1091
- var ALWAYS_OFF = {
1092
- drawSelection: false,
1093
- foldGutter: false,
1094
- foldKeymap: false,
1095
- highlightActiveLine: false,
1096
- highlightActiveLineGutter: false
1097
- };
1098
- var buildBasicSetup = (readOnly) => ({
1099
- ...ALWAYS_OFF,
1100
- ...readOnly ? {
1101
- closeBrackets: false,
1102
- closeBracketsKeymap: false,
1103
- lintKeymap: false,
1104
- indentOnInput: false,
1105
- rectangularSelection: false,
1106
- dropCursor: false,
1107
- highlightSelectionMatches: false
1108
- } : null
1109
- });
1110
- var buildCustomTheme = () => codemirrorThemeGithub.githubLightInit({
1111
- settings: {
1112
- fontFamily: `'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New'`,
1113
- background: resolveToken("background", "249 250 251"),
1114
- foreground: resolveToken("foreground", "30 41 59"),
1115
- gutterBackground: resolveToken("muted", "241 245 249"),
1116
- gutterForeground: resolveToken("muted-foreground", "100 116 139"),
1117
- gutterBorder: "transparent",
1118
- lineHighlight: "transparent",
1119
- selection: resolveToken("primary", "31 143 255")
1120
- }
1121
- });
1122
- var getLanguageMode = (mode) => {
1123
- switch (mode) {
1124
- case void 0:
1125
- case "application/json":
1126
- return langJson.json();
1127
- case "text/x-python":
1128
- return langPython.python();
1129
- case "text/x-sql":
1130
- return langSql.sql({ upperCaseKeywords: true });
1131
- case "text/x-mysql":
1132
- return langSql.sql({ upperCaseKeywords: true, dialect: langSql.MySQL });
1133
- case "text/x-pgsql":
1134
- return langSql.sql({ upperCaseKeywords: true, dialect: langSql.PostgreSQL });
1135
- case "text/x-mssql":
1136
- return langSql.sql({ upperCaseKeywords: true, dialect: langSql.MSSQL });
1137
- case "text/x-sfsql":
1138
- return langSql.sql({ upperCaseKeywords: true, dialect: codemirrorLangSql.getSqlDialect("snowflake") });
1139
- case "text/x-plsql":
1140
- return langSql.sql({ upperCaseKeywords: true, dialect: langSql.PLSQL });
1141
- case "text/x-rsrc":
1142
- return language.StreamLanguage.define(r.r);
1143
- case "text/x-sh":
1144
- return language.StreamLanguage.define(shell.shell);
1145
- case "text/x-toml":
1146
- return language.StreamLanguage.define(toml.toml);
1147
- case "text/jsonnet":
1148
- return language.StreamLanguage.define(jsonnet);
1149
- case "text/x-dbt":
1150
- return language.StreamLanguage.define(dbt);
1151
- case "text/javascript":
1152
- return langJavascript.javascript({ jsx: true });
1153
- case "text/typescript":
1154
- return langJavascript.javascript({ jsx: true, typescript: true });
1155
- // No language — `text/plain` lands here, and so does any mode added to
1156
- // LANGUAGE_MODES without an arm above. Unstyled text is the safe degradation;
1157
- // a `json()` default would colour unrelated content as if it were JSON.
1158
- default:
1159
- return [];
1160
- }
1161
- };
1162
- var shouldLintJson = (mode, readOnly) => mode === "application/json" && !readOnly;
1163
- var setSearchEffect = state.StateEffect.define();
1164
- function findMatches(doc, query) {
1165
- if (!query) return [];
1166
- const text = doc.toString();
1167
- try {
1168
- const regex = new RegExp(escapeStringRegexp(query), "gi");
1169
- return Array.from(text.matchAll(regex)).map((match, index) => {
1170
- const from = match.index;
1171
- const to = from + match[0].length;
1172
- return { from, to, text: match[0], localIndex: index };
1173
- });
1174
- } catch (e) {
1175
- console.warn("Invalid search regex:", e);
1176
- return [];
1177
- }
1178
- }
1179
- function createDecorations(matches, selectedLocalIndex) {
1180
- const decorations = matches.map((match) => {
1181
- const isSelected = match.localIndex === selectedLocalIndex;
1182
- const decoration = view.Decoration.mark({
1183
- class: isSelected ? "cm-searchMatch-selected" : "cm-searchMatch"
1184
- });
1185
- return decoration.range(match.from, match.to);
1186
- });
1187
- return view.Decoration.set(decorations, true);
1188
- }
1189
- var searchField = state.StateField.define({
1190
- create() {
1191
- return {
1192
- query: "",
1193
- selectedMatchIndex: void 0,
1194
- matches: [],
1195
- decorations: view.Decoration.none
1196
- };
1197
- },
1198
- update(state, tr) {
1199
- let newState = state;
1200
- for (const effect of tr.effects) {
1201
- if (!effect.is(setSearchEffect)) {
1202
- continue;
1203
- }
1204
- const { query, selectedMatchIndex } = effect.value;
1205
- const matches = findMatches(tr.state.doc, query);
1206
- const decorations = createDecorations(matches, selectedMatchIndex);
1207
- newState = {
1208
- query,
1209
- selectedMatchIndex,
1210
- matches,
1211
- decorations
1212
- };
1213
- }
1214
- if (tr.docChanged && newState.query) {
1215
- const matches = findMatches(tr.state.doc, newState.query);
1216
- const decorations = createDecorations(matches, newState.selectedMatchIndex);
1217
- newState = {
1218
- ...newState,
1219
- matches,
1220
- decorations
1221
- };
1222
- }
1223
- return newState;
1224
- },
1225
- provide: (field) => view.EditorView.decorations.from(field, (state) => state.decorations)
1226
- });
1227
- var searchViewPlugin = view.ViewPlugin.fromClass(
1228
- class {
1229
- lastSelectedIndex;
1230
- update(update) {
1231
- const state = update.state.field(searchField);
1232
- if (state.selectedMatchIndex !== void 0 && state.selectedMatchIndex !== this.lastSelectedIndex) {
1233
- const match = state.matches[state.selectedMatchIndex];
1234
- if (match) {
1235
- requestAnimationFrame(() => {
1236
- update.view.dispatch({
1237
- effects: view.EditorView.scrollIntoView(match.from, { y: "center" })
1238
- });
1239
- });
1240
- }
1241
- this.lastSelectedIndex = state.selectedMatchIndex;
1242
- }
1243
- if (state.selectedMatchIndex === void 0) {
1244
- this.lastSelectedIndex = void 0;
1245
- }
1246
- }
1247
- }
1248
- );
1249
- var searchTheme = view.EditorView.baseTheme({
1250
- ".cm-searchMatch": {
1251
- backgroundColor: colors__default.default.blue[100]
1252
- },
1253
- ".cm-searchMatch > span": {
1254
- color: `${colors__default.default.blue[600]} !important`
1255
- },
1256
- ".cm-searchMatch-selected": {
1257
- backgroundColor: colors__default.default.blue[600]
1258
- },
1259
- ".cm-searchMatch-selected > span": {
1260
- color: `${colors__default.default.white} !important`
1261
- }
1262
- });
1263
- function searchExtension() {
1264
- return [searchField, searchViewPlugin, searchTheme];
1265
- }
1266
- function updateSearch(view, query, selectedMatchIndex) {
1267
- view.dispatch({ effects: setSearchEffect.of({ query, selectedMatchIndex }) });
1268
- }
1269
- var KbdSeparator = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("span", { ...props, className: cn("tw:text-xs tw:text-muted-foreground", className) });
1270
- var KbdGroup = ({ ref, className, children, separator, ...props }) => {
1271
- return /* @__PURE__ */ jsxRuntime.jsx(
1272
- "kbd",
1273
- {
1274
- ...props,
1275
- ref,
1276
- className: cn("tw:inline-flex", "tw:items-center", "tw:gap-1", className),
1277
- children: separator ? (
1278
- // oxlint-disable-next-line react-x/no-children-to-array
1279
- react.Children.toArray(children).map((child, index) => (
1280
- // oxlint-disable-next-line
1281
- /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
1282
- index > 0 && /* @__PURE__ */ jsxRuntime.jsx(KbdSeparator, { children: separator }),
1283
- child
1284
- ] }, index)
1285
- ))
1286
- ) : children
1287
- }
1288
- );
1289
- };
1290
- var kbdVariants = classVarianceAuthority.cva(
1291
- [
1292
- "tailwindcss-preflight",
1293
- // style
1294
- "tw:pointer-events-none",
1295
- "tw:w-fit",
1296
- "tw:h-5",
1297
- "tw:min-w-5",
1298
- // layout
1299
- "tw:inline-flex",
1300
- "tw:items-center",
1301
- "tw:justify-center",
1302
- "tw:gap-1",
1303
- "tw:shrink-0",
1304
- // spacing
1305
- "tw:px-1",
1306
- 'tw:[&_svg:not([class*="size-"])]:size-2.5',
1307
- "tw:text-xs",
1308
- "tw:font-medium",
1309
- "tw:rounded"
1310
- ],
1311
- {
1312
- defaultVariants: {
1313
- variant: "default"
1314
- },
1315
- variants: {
1316
- variant: {
1317
- default: "tw:bg-muted tw:text-muted-foreground",
1318
- primary: "tw:bg-white/20 tw:text-white"
1319
- }
1320
- }
1321
- }
1322
- );
1323
- var Kbd = ({ children, className, variant, ...rest }) => /* @__PURE__ */ jsxRuntime.jsx("kbd", { ...rest, className: kbdVariants({ className, variant }), children });
1324
- Kbd.Group = KbdGroup;
1325
- Kbd.Separator = KbdSeparator;
1326
- var ToggleComponentHelp = () => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1327
- "Use ",
1328
- /* @__PURE__ */ jsxRuntime.jsx(Kbd, { children: isMac ? "Command+/" : "Ctrl+/" }),
1329
- " to toggle comments."
1330
- ] });
1331
- var establishesFixedContainingBlock = (style) => style.transform !== "none" || style.translate !== "none" || style.rotate !== "none" || style.scale !== "none" || style.perspective !== "none" || style.filter !== "none" || style.backdropFilter !== "none" || /\b(paint|layout|strict|content)\b/.test(style.contain) || /\b(transform|perspective|filter|contain)\b/.test(style.willChange);
1332
- var crops = (style) => style.overflowX !== "visible" || style.overflowY !== "visible" || style.maskImage !== "none" || style.contentVisibility !== "visible" || /\b(paint|strict|content)\b/.test(style.contain);
1333
- var findTooltipHost = (from) => {
1334
- let outermostCropper = null;
1335
- for (let node = from.parentElement; node && node !== document.body; node = node.parentElement) {
1336
- const style = getComputedStyle(node);
1337
- if (crops(style)) {
1338
- outermostCropper = node;
1339
- } else if (establishesFixedContainingBlock(style)) {
1340
- return outermostCropper?.parentElement ?? node;
1341
- }
1342
- }
1343
- return outermostCropper?.parentElement ?? null;
1344
- };
1345
- var tooltipsExtension = () => {
1346
- const layer = new state.Compartment();
1347
- return [
1348
- layer.of(view.tooltips()),
1349
- view.ViewPlugin.define((view$1) => {
1350
- const scheduled = setTimeout(() => {
1351
- if (!view$1.dom.isConnected) return;
1352
- const parent = findTooltipHost(view$1.dom);
1353
- if (parent) view$1.dispatch({ effects: layer.reconfigure(view.tooltips({ parent })) });
1354
- });
1355
- return { destroy: () => clearTimeout(scheduled) };
1356
- })
1357
- ];
1358
- };
1359
- var useTooltipsExtension = () => react.useMemo(tooltipsExtension, []);
1360
-
1361
- // src/components/CodeEditor/variableCompletion.ts
1362
- var BOOST = 2e3;
1363
- var NAME = String.raw`[\w-]*`;
1364
- var AT_CARET = new RegExp(String.raw`(?:\{{1,2} ?)?${NAME}$`);
1365
- var NAME_AT_END = new RegExp(`${NAME}$`);
1366
- var OPENING = /\{{1,2} ?$/;
1367
- var CLOSING = /^ ?\}{1,2}/;
1368
- var completeVariables = (variables = []) => {
1369
- if (variables.length === 0) return () => null;
1370
- const options = variables.map(({ name, value }) => ({
1371
- // The bare name: `SqlEditor` filters prefix-only while `CodeEditor` filters
1372
- // fuzzily, and this is the only spelling both accept whether or not the caret
1373
- // has typed the braces. The braces are `displayLabel`, which is what renders.
1374
- label: name,
1375
- displayLabel: `{{${name}}}`,
1376
- detail: value,
1377
- type: "variable",
1378
- boost: BOOST,
1379
- apply: (view, completion, from, to) => {
1380
- const { doc } = view.state;
1381
- const line = doc.lineAt(from);
1382
- const insert = `{{${completion.label}}}`;
1383
- const opening = OPENING.exec(doc.sliceString(line.from, from));
1384
- const closing = CLOSING.exec(doc.sliceString(to, line.to));
1385
- const start = opening ? from - opening[0].length : from;
1386
- const end = closing ? to + closing[0].length : to;
1387
- view.dispatch({
1388
- changes: { from: start, to: end, insert },
1389
- selection: { anchor: start + insert.length }
1390
- });
1391
- }
1392
- }));
1393
- return (context) => {
1394
- const match = context.matchBefore(AT_CARET);
1395
- if (!match?.text) return null;
1396
- const [name = ""] = NAME_AT_END.exec(match.text) ?? [];
1397
- return { from: match.to - name.length, options };
1398
- };
1399
- };
1400
- var useVariableCompletion = (variables = []) => useStableCallback(completeVariables(variables));
1401
- var emptyObject = {};
1402
- var CodeEditor = ({
1403
- value,
1404
- previousValue,
1405
- onChange,
1406
- mode = "application/json",
1407
- placeholder = "",
1408
- ariaLabel,
1409
- searchQuery,
1410
- searchMatchIndex,
1411
- readOnly = false,
1412
- inputLocked = false,
1413
- autocompletions,
1414
- completionSource,
1415
- variables,
1416
- extraKeys = emptyObject,
1417
- withToggleCommentHint = false,
1418
- withAutofocus = false,
1419
- withLineNumbers = true,
1420
- withLineWrapping = true,
1421
- withCollapseUnchanged = false,
1422
- withCopyButton = false,
1423
- completeAny = false,
1424
- help = null,
1425
- helpPostfix = null,
1426
- renderAdditionalButtons,
1427
- className
1428
- }) => {
1429
- const handleChange = useStableCallback((next) => onChange?.(next));
1430
- const withSearch = searchQuery !== void 0;
1431
- const editorRef = react.useRef(null);
1432
- react.useEffect(() => {
1433
- const view = editorRef.current?.view;
1434
- if (view && withSearch) updateSearch(view, searchQuery, searchMatchIndex);
1435
- }, [withSearch, searchQuery, searchMatchIndex]);
1436
- const handleCreateEditor = useStableCallback((view) => {
1437
- if (searchQuery) updateSearch(view, searchQuery, searchMatchIndex);
1438
- });
1439
- const extraKeysRef = react.useRef(extraKeys);
1440
- react.useLayoutEffect(() => {
1441
- extraKeysRef.current = extraKeys;
1442
- });
1443
- const boundKeysSignature = Object.keys(extraKeys).join("\n");
1444
- const boundKeys = react.useMemo(
1445
- () => boundKeysSignature.split("\n").filter(Boolean),
1446
- [boundKeysSignature]
1447
- );
1448
- const tooltipLayer = useTooltipsExtension();
1449
- const variableCompletion = useVariableCompletion(variables);
1450
- const customTheme = useThemedExtension("editor:syntax", buildCustomTheme);
1451
- const baseTheme = useThemedExtension(
1452
- "code-editor:chrome",
1453
- () => view.EditorView.theme(buildBaseThemeStyles())
1454
- );
1455
- const commonExtensions = react.useMemo(() => {
1456
- const callerCompletions = completionSource ?? (completeAny ? autocomplete.completeAnyWord : autocompletions?.length ? autocompletions : null);
1457
- const completionEntries = [
1458
- ...callerCompletions ? [{ autocomplete: callerCompletions }] : [],
1459
- { autocomplete: variableCompletion }
1460
- ];
1461
- return [
1462
- getLanguageMode(mode),
1463
- shouldLintJson(mode, readOnly) ? lint.linter(langJson.jsonParseLinter()) : [],
1464
- withLineWrapping ? view.EditorView.lineWrapping : [],
1465
- CodeMirror.EditorState.languageData.of(() => completionEntries),
1466
- view.keymap.of(
1467
- boundKeys.map((key) => ({
1468
- key,
1469
- run: () => {
1470
- extraKeysRef.current[key]?.();
1471
- return true;
1472
- }
1473
- }))
1474
- ),
1475
- readOnly ? [] : [
1476
- // CodeMirror's own default. Gating it on the props hid completions the
1477
- // *language* supplies — dbt's vocabulary, Snowflake's keywords — behind
1478
- // a shortcut, and macOS leaves no usable one. With nothing to offer, no
1479
- // popup opens anyway.
1480
- autocomplete.autocompletion()
1481
- ],
1482
- ariaLabel ? view.EditorView.contentAttributes.of({ "aria-label": ariaLabel }) : [],
1483
- withSearch ? searchExtension() : [],
1484
- tooltipLayer,
1485
- baseTheme
1486
- ];
1487
- }, [
1488
- autocompletions,
1489
- completionSource,
1490
- variableCompletion,
1491
- completeAny,
1492
- boundKeys,
1493
- mode,
1494
- readOnly,
1495
- withLineWrapping,
1496
- baseTheme,
1497
- ariaLabel,
1498
- withSearch,
1499
- tooltipLayer
1500
- ]);
1501
- const extensions = react.useMemo(() => {
1502
- return [
1503
- ...commonExtensions,
1504
- view.placeholder(placeholder),
1505
- view.EditorView.editable.of(!readOnly),
1506
- // The lock is this facet and nothing else. `contenteditable` is what the
1507
- // read-only wash keys off, and `basicSetup` is what holds the undo history,
1508
- // so leaving both alone is what makes the lock invisible.
1509
- CodeMirror.EditorState.readOnly.of(readOnly || inputLocked),
1510
- previousValue ? merge.unifiedMergeView({
1511
- original: previousValue,
1512
- mergeControls: false,
1513
- highlightChanges: false,
1514
- collapseUnchanged: withCollapseUnchanged ? {} : void 0
1515
- }) : []
1516
- ];
1517
- }, [commonExtensions, placeholder, readOnly, inputLocked, previousValue, withCollapseUnchanged]);
1518
- const config = react.useMemo(() => {
1519
- return {
1520
- ...buildBasicSetup(readOnly),
1521
- lineNumbers: withLineNumbers,
1522
- // Mod-f opens CodeMirror's own panel, which would run a second query and a
1523
- // second match count over the same document beside the caller's input.
1524
- ...withSearch ? { searchKeymap: false } : null
1525
- };
1526
- }, [withLineNumbers, readOnly, withSearch]);
1527
- const additionalButtons = renderAdditionalButtons?.(value);
1528
- const hasToolbar = withCopyButton && !!value || !!additionalButtons;
1529
- return (
1530
- // oxlint-disable-next-line jsx-a11y/no-static-element-interactions
1531
- /* @__PURE__ */ jsxRuntime.jsxs(
1532
- "div",
1533
- {
1534
- className: cn(
1535
- "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:[&_>div]:h-full tw:[&_>div]:overflow-auto tw:[&_>div]:bg-background",
1536
- { "tw:mt-8": hasToolbar },
1537
- className
1538
- ),
1539
- onKeyDown: (event) => {
1540
- if (event.key === keyCodes.ESCAPE) {
1541
- event.stopPropagation();
1542
- }
1543
- },
1544
- children: [
1545
- hasToolbar && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:pointer-events-none tw:absolute tw:z-10 tw:flex tw:!h-auto tw:w-full tw:translate-y-[calc(-100%_+_8px)] tw:!overflow-visible tw:!bg-transparent", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(ButtonToolbar, { value: withCopyButton ? value : void 0, children: additionalButtons }) }) }),
1546
- /* @__PURE__ */ jsxRuntime.jsx(
1547
- CodeMirror__default.default,
1548
- {
1549
- ref: editorRef,
1550
- onCreateEditor: handleCreateEditor,
1551
- theme: customTheme,
1552
- value,
1553
- onChange: handleChange,
1554
- extensions,
1555
- autoFocus: withAutofocus,
1556
- basicSetup: config
1557
- }
1558
- ),
1559
- !readOnly && (withToggleCommentHint || help || helpPostfix) && /* @__PURE__ */ jsxRuntime.jsxs(HelpBlock, { className: "tw:mt-2 tw:flex tw:flex-wrap tw:gap-1", children: [
1560
- help,
1561
- withToggleCommentHint ? /* @__PURE__ */ jsxRuntime.jsx(ToggleComponentHelp, {}) : null,
1562
- helpPostfix
1563
- ] })
1564
- ]
1565
- }
1566
- )
1567
- );
1568
- };
1569
- var activeQueryFirstLine = view.Decoration.line({ class: "cm-active-query cm-active-query-first" });
1570
- var activeQueryMiddleLine = view.Decoration.line({ class: "cm-active-query" });
1571
- var activeQueryLastLine = view.Decoration.line({ class: "cm-active-query cm-active-query-last" });
1572
- var activeQuerySingleLine = view.Decoration.line({
1573
- class: "cm-active-query cm-active-query-first cm-active-query-last"
1574
- });
1575
- var findActiveQueryRange = (doc, cursorPos, boundaries) => {
1576
- if (boundaries.length === 0) return null;
1577
- let match = boundaries[boundaries.length - 1];
1578
- for (const boundary of boundaries) {
1579
- if (cursorPos <= boundary.to) {
1580
- match = boundary;
1581
- break;
1582
- }
1583
- }
1584
- if (!match) return null;
1585
- const queryText = doc.slice(match.from, match.to);
1586
- const leadingWhitespace = queryText.length - queryText.trimStart().length;
1587
- const trailingWhitespace = queryText.length - queryText.trimEnd().length;
1588
- const trimmedStart = match.from + leadingWhitespace;
1589
- const trimmedEnd = match.to - trailingWhitespace;
1590
- if (trimmedStart >= trimmedEnd) return null;
1591
- return { from: trimmedStart, to: trimmedEnd };
1592
- };
1593
- var computeBoundaries = (queries) => {
1594
- const boundaries = [];
1595
- let offset = 0;
1596
- for (const query of queries) {
1597
- boundaries.push({ from: offset, to: offset + query.length });
1598
- offset += query.length;
1599
- }
1600
- return boundaries;
1601
- };
1602
- var mapBoundariesThroughChanges = (boundaries, changes) => {
1603
- const prevLen = changes.length;
1604
- const mapped = [];
1605
- for (const b of boundaries) {
1606
- const from = changes.mapPos(Math.max(0, Math.min(b.from, prevLen)), -1);
1607
- const to = changes.mapPos(Math.max(0, Math.min(b.to, prevLen)), 1);
1608
- if (from < to) mapped.push({ from, to });
1609
- }
1610
- return mapped;
1611
- };
1612
- var buildDecorations = (view$1, range) => {
1613
- const startLine = view$1.state.doc.lineAt(range.from).number;
1614
- const endLine = view$1.state.doc.lineAt(range.to).number;
1615
- const decorations = [];
1616
- for (let lineNum = startLine; lineNum <= endLine; lineNum++) {
1617
- const lineStart = view$1.state.doc.line(lineNum).from;
1618
- if (startLine === endLine) {
1619
- decorations.push(activeQuerySingleLine.range(lineStart));
1620
- } else if (lineNum === startLine) {
1621
- decorations.push(activeQueryFirstLine.range(lineStart));
1622
- } else if (lineNum === endLine) {
1623
- decorations.push(activeQueryLastLine.range(lineStart));
1624
- } else {
1625
- decorations.push(activeQueryMiddleLine.range(lineStart));
1626
- }
1627
- }
1628
- return view.Decoration.set(decorations);
1629
- };
1630
- var activeQueryHighlight = (splitQueries) => {
1631
- return [
1632
- view.ViewPlugin.fromClass(
1633
- class {
1634
- decorations = view.Decoration.none;
1635
- debounceTimer = null;
1636
- seq = 0;
1637
- cachedDoc = "";
1638
- cachedBoundaries = [];
1639
- destroyed = false;
1640
- constructor(view) {
1641
- this.scheduleDocParse(view);
1642
- }
1643
- update(update) {
1644
- if (update.focusChanged && !update.view.hasFocus) {
1645
- this.decorations = view.Decoration.none;
1646
- return;
1647
- }
1648
- if (update.docChanged) {
1649
- if (this.cachedBoundaries.length > 0) {
1650
- this.cachedBoundaries = mapBoundariesThroughChanges(
1651
- this.cachedBoundaries,
1652
- update.changes
1653
- );
1654
- this.cachedDoc = update.state.doc.toString();
1655
- this.updateFromCache(update.view);
1656
- }
1657
- this.scheduleDocParse(update.view);
1658
- } else if (update.selectionSet || update.focusChanged && update.view.hasFocus) {
1659
- this.updateFromCache(update.view);
1660
- }
1661
- }
1662
- destroy() {
1663
- this.destroyed = true;
1664
- if (this.debounceTimer) clearTimeout(this.debounceTimer);
1665
- }
1666
- /**
1667
- * Update decorations using cached query boundaries.
1668
- * Only mutates this.decorations — does NOT call view.dispatch().
1669
- * When called from update() (sync), CodeMirror picks up the new
1670
- * decorations via the accessor. When called from the async
1671
- * scheduleDocParse callback, the caller must dispatch separately.
1672
- */
1673
- updateFromCache(view$1) {
1674
- if (!view$1.hasFocus) {
1675
- this.decorations = view.Decoration.none;
1676
- return;
1677
- }
1678
- const { main } = view$1.state.selection;
1679
- if (main.from !== main.to) {
1680
- this.decorations = view.Decoration.none;
1681
- return;
1682
- }
1683
- const doc = view$1.state.doc.toString();
1684
- if (doc !== this.cachedDoc) return;
1685
- if (this.cachedBoundaries.length === 0) {
1686
- this.decorations = view.Decoration.none;
1687
- return;
1688
- }
1689
- const range = findActiveQueryRange(doc, main.head, this.cachedBoundaries);
1690
- this.decorations = range ? buildDecorations(view$1, range) : view.Decoration.none;
1691
- }
1692
- /** Parse queries async (debounced) and update decorations. */
1693
- scheduleDocParse(view$1) {
1694
- if (this.debounceTimer) clearTimeout(this.debounceTimer);
1695
- this.debounceTimer = setTimeout(async () => {
1696
- const seq = ++this.seq;
1697
- const doc = view$1.state.doc.toString();
1698
- if (!doc.trim()) {
1699
- this.cachedDoc = doc;
1700
- this.cachedBoundaries = [];
1701
- if (this.decorations !== view.Decoration.none) {
1702
- this.decorations = view.Decoration.none;
1703
- if (!this.destroyed) view$1.dispatch();
1704
- }
1705
- return;
1706
- }
1707
- let queries;
1708
- try {
1709
- queries = await splitQueries(doc);
1710
- } catch {
1711
- return;
1712
- }
1713
- if (this.destroyed || seq !== this.seq) return;
1714
- this.cachedDoc = doc;
1715
- this.cachedBoundaries = computeBoundaries(queries);
1716
- this.updateFromCache(view$1);
1717
- if (!this.destroyed) view$1.dispatch();
1718
- }, 100);
1719
- }
1720
- },
1721
- { decorations: (v) => v.decorations }
1722
- ),
1723
- view.EditorView.baseTheme({
1724
- ".cm-active-query": {
1725
- boxShadow: `inset -1px 0 0 0 ${colors__default.default.blue[300]}, inset 1px 0 0 0 ${colors__default.default.blue[300]}`,
1726
- marginRight: "8px"
1727
- },
1728
- ".cm-active-query-first": {
1729
- boxShadow: `inset -1px 0 0 0 ${colors__default.default.blue[300]}, inset 1px 0 0 0 ${colors__default.default.blue[300]}, inset 0 1px 0 0 ${colors__default.default.blue[300]}`,
1730
- borderRadius: "4px 4px 0 0"
1731
- },
1732
- ".cm-active-query-last": {
1733
- boxShadow: `inset -1px 0 0 0 ${colors__default.default.blue[300]}, inset 1px 0 0 0 ${colors__default.default.blue[300]}, inset 0 -1px 0 0 ${colors__default.default.blue[300]}`,
1734
- borderRadius: "0 0 4px 4px"
1735
- },
1736
- ".cm-active-query-first.cm-active-query-last": {
1737
- boxShadow: `inset 0 0 0 1px ${colors__default.default.blue[300]}`,
1738
- borderRadius: "4px"
1739
- }
1740
- })
1741
- ];
1742
- };
1743
- var HighlightMarker = class extends view.GutterMarker {
1744
- toDOM() {
1745
- const marker = document.createElement("div");
1746
- marker.className = "cm-highlight-marker";
1747
- return marker;
1748
- }
1749
- };
1750
- var highlightMarker = new HighlightMarker();
1751
- var forEachLineInRange = (doc, from, to, callback) => {
1752
- const results = [];
1753
- const fromLine = Math.max(1, from + 1);
1754
- const toLine = Math.min(doc.lines, to + 1);
1755
- for (let i = fromLine; i <= toLine; i++) {
1756
- const line = doc.line(i);
1757
- results.push(callback(line.from));
1758
- }
1759
- return results;
1760
- };
1761
- var setHighlightedLinesEffect = state.StateEffect.define();
1762
- var highlightedLinesField = state.StateField.define({
1763
- create() {
1764
- return null;
1765
- },
1766
- update(value, transaction) {
1767
- for (const effect of transaction.effects) {
1768
- if (effect.is(setHighlightedLinesEffect)) {
1769
- return effect.value;
1770
- }
1771
- }
1772
- return value;
1773
- }
1774
- });
1775
- var highlightGutter = view.gutter({
1776
- class: "cm-highlight-gutter",
1777
- markers: (view) => {
1778
- const highlightInfo = view.state.field(highlightedLinesField, false);
1779
- if (!highlightInfo) {
1780
- return state.RangeSet.empty;
1781
- }
1782
- const markers = forEachLineInRange(
1783
- view.state.doc,
1784
- highlightInfo.from,
1785
- highlightInfo.to,
1786
- (lineFrom) => highlightMarker.range(lineFrom)
1787
- );
1788
- return state.RangeSet.of(markers);
1789
- }
1790
- });
1791
- var errorLineDecorations = state.StateField.define({
1792
- create() {
1793
- return view.Decoration.none;
1794
- },
1795
- update(decorations, transaction) {
1796
- decorations = decorations.map(transaction.changes);
1797
- for (const effect of transaction.effects) {
1798
- if (!effect.is(setHighlightedLinesEffect)) {
1799
- continue;
1800
- }
1801
- if (!effect.value || !effect.value.error) {
1802
- return view.Decoration.none;
1803
- }
1804
- const decorationArray = forEachLineInRange(
1805
- transaction.state.doc,
1806
- effect.value.error.from,
1807
- effect.value.error.to,
1808
- (lineFrom) => view.Decoration.line({ class: "cm-error-line" }).range(lineFrom)
1809
- );
1810
- return view.Decoration.set(decorationArray);
1811
- }
1812
- return decorations;
1813
- },
1814
- provide: (f) => view.EditorView.decorations.from(f)
1815
- });
1816
- var processingLineDecorations = state.StateField.define({
1817
- create() {
1818
- return view.Decoration.none;
1819
- },
1820
- update(decorations, transaction) {
1821
- decorations = decorations.map(transaction.changes);
1822
- for (const effect of transaction.effects) {
1823
- if (!effect.is(setHighlightedLinesEffect)) {
1824
- continue;
1825
- }
1826
- if (!effect.value || !effect.value.processing) {
1827
- return view.Decoration.none;
1828
- }
1829
- const decorationArray = forEachLineInRange(
1830
- transaction.state.doc,
1831
- effect.value.processing.from,
1832
- effect.value.processing.to,
1833
- (lineFrom) => view.Decoration.line({ class: "cm-processing-line" }).range(lineFrom)
1834
- );
1835
- return view.Decoration.set(decorationArray);
1836
- }
1837
- return decorations;
1838
- },
1839
- provide: (f) => view.EditorView.decorations.from(f)
1840
- });
1841
- var highlightedLinesTheme = view.EditorView.baseTheme({
1842
- ".cm-highlight-gutter": {
1843
- width: "2px",
1844
- marginRight: "2px"
1845
- },
1846
- ".cm-highlight-marker": {
1847
- width: "2px",
1848
- height: "100%",
1849
- backgroundColor: colors__default.default.blue[500]
1850
- },
1851
- ".cm-error-line": {
1852
- backgroundColor: `${colors__default.default.error[100]} !important`
1853
- },
1854
- ".cm-processing-line": {
1855
- backgroundColor: `${colors__default.default.blue[100]} !important`
1856
- }
1857
- });
1858
- function highlightingExtension() {
1859
- return [
1860
- highlightedLinesField,
1861
- highlightGutter,
1862
- errorLineDecorations,
1863
- processingLineDecorations,
1864
- highlightedLinesTheme
1865
- ];
1866
- }
1867
- function updateHighlighting(view, lines) {
1868
- view.dispatch({ effects: setHighlightedLinesEffect.of(lines ?? null) });
1869
- }
1870
- var OWN_KEYMAPS = {
1871
- defaultKeymap: false,
1872
- completionKeymap: false,
1873
- searchKeymap: false
1874
- };
1875
- var CUSTOM_KEYMAP = [
1876
- {
1877
- key: "Escape",
1878
- stopPropagation: true,
1879
- run: (view) => {
1880
- view.contentDOM.blur();
1881
- return true;
1882
- }
1883
- }
1884
- ];
1885
- var OWN_KEYMAP_EXTENSION = CodeMirror.keymap.of([...commands.defaultKeymap, ...CUSTOM_KEYMAP]);
1886
- var buildTheme = () => ({
1887
- ...buildBaseThemeStyles(),
1888
- "&.cm-editor": {
1889
- border: "solid 1px transparent",
1890
- background: resolveToken("card", "255 255 255"),
1891
- borderRadius: "8px",
1892
- paddingTop: "8px",
1893
- paddingBottom: "8px"
1894
- },
1895
- '&.cm-editor:has(.cm-content[contenteditable="true"]):hover': {
1896
- borderColor: resolveToken("ring", "31 143 255")
1897
- },
1898
- '&.cm-editor:has(.cm-content[contenteditable="true"]):focus-within': {
1899
- borderColor: resolveToken("ring", "31 143 255"),
1900
- boxShadow: `0 0 0 4px ${resolveToken("ring", "31 143 255", 0.3)}`
1901
- },
1902
- "&.cm-editor .cm-scroller": { overflowAnchor: "none" },
1903
- "&.cm-editor :is(.cm-gutters,.cm-scroller)": { background: resolveToken("card", "255 255 255") },
1904
- '&.cm-editor:has(.cm-content[contenteditable="false"])': {
1905
- background: resolveToken("muted", "241 245 249")
1906
- },
1907
- '&.cm-editor:has(.cm-content[contenteditable="false"]) :is(.cm-scroller,.cm-gutters)': {
1908
- background: resolveToken("muted", "241 245 249")
1909
- }
1910
- });
1911
- var SqlEditor = ({
1912
- value,
1913
- onChange,
1914
- onSelectionChange,
1915
- onCreateEditor,
1916
- onDestroyEditor,
1917
- onBlurEditor,
1918
- onFocusEditor,
1919
- placeholder = "",
1920
- searchQuery = "",
1921
- searchMatchIndex,
1922
- readOnly = false,
1923
- queryParser,
1924
- autoFocus = false,
1925
- lineNumbers = true,
1926
- className,
1927
- schema,
1928
- variables,
1929
- defaultDatabase,
1930
- defaultSchema,
1931
- highlightLines,
1932
- dialect
1933
- }) => {
1934
- const editorRef = react.useRef(null);
1935
- const handleChange = useStableCallback((next) => onChange?.(next));
1936
- const parseQueries = useStableCallback(async (sql2) => await queryParser?.(sql2) ?? []);
1937
- const handleBlur = useStableCallback((view) => onBlurEditor?.(view));
1938
- const handleFocus = useStableCallback((view) => onFocusEditor?.(view));
1939
- const handleUpdate = useStableCallback((update) => {
1940
- if (update.selectionSet) {
1941
- const { main } = update.state.selection;
1942
- onSelectionChange?.(update.state.sliceDoc(main.from, main.to));
1943
- }
1944
- });
1945
- const variableCompletion = useVariableCompletion(variables);
1946
- const withQueryParser = queryParser !== void 0;
1947
- const tooltipLayer = useTooltipsExtension();
1948
- const customTheme = useThemedExtension("editor:syntax", buildCustomTheme);
1949
- const themeExtension = useThemedExtension(
1950
- "sql-editor:chrome",
1951
- () => CodeMirror.EditorView.theme(buildTheme())
1952
- );
1953
- const extensions = react.useMemo(() => {
1954
- return [
1955
- CodeMirror.EditorView.lineWrapping,
1956
- OWN_KEYMAP_EXTENSION,
1957
- ...codemirrorLangSql.installExtensions({
1958
- schema,
1959
- defaultDatabase,
1960
- defaultSchema,
1961
- variableCompletion,
1962
- dialect
1963
- }),
1964
- searchExtension(),
1965
- highlightingExtension(),
1966
- withQueryParser ? activeQueryHighlight(parseQueries) : [],
1967
- tooltipLayer,
1968
- themeExtension,
1969
- CodeMirror.EditorView.domEventHandlers({
1970
- blur: (_, view) => handleBlur(view),
1971
- focus: (_, view) => handleFocus(view)
1972
- })
1973
- ];
1974
- }, [
1975
- withQueryParser,
1976
- parseQueries,
1977
- schema,
1978
- defaultDatabase,
1979
- defaultSchema,
1980
- variableCompletion,
1981
- dialect,
1982
- handleBlur,
1983
- handleFocus,
1984
- themeExtension,
1985
- tooltipLayer
1986
- ]);
1987
- const defaultSetup = react.useMemo(() => {
1988
- return { ...buildBasicSetup(readOnly), ...OWN_KEYMAPS, lineNumbers };
1989
- }, [readOnly, lineNumbers]);
1990
- react.useEffect(() => {
1991
- if (editorRef.current?.view) {
1992
- updateHighlighting(editorRef.current.view, highlightLines);
1993
- }
1994
- }, [highlightLines]);
1995
- react.useEffect(() => {
1996
- if (editorRef.current?.view) {
1997
- updateSearch(editorRef.current.view, searchQuery, searchMatchIndex);
1998
- }
1999
- }, [searchQuery, searchMatchIndex]);
2000
- const handleDestroy = useStableCallback(() => onDestroyEditor?.());
2001
- react.useEffect(() => handleDestroy, [handleDestroy]);
2002
- const handleCreate = useStableCallback((view, state) => {
2003
- onCreateEditor?.(view, state);
2004
- if (highlightLines) {
2005
- updateHighlighting(view, highlightLines);
2006
- }
2007
- if (searchQuery) {
2008
- updateSearch(view, searchQuery, searchMatchIndex);
2009
- }
2010
- });
2011
- return /* @__PURE__ */ jsxRuntime.jsx(
2012
- CodeMirror__default.default,
2013
- {
2014
- ref: editorRef,
2015
- theme: customTheme,
2016
- extensions,
2017
- value,
2018
- onChange: handleChange,
2019
- onUpdate: handleUpdate,
2020
- onCreateEditor: handleCreate,
2021
- autoFocus,
2022
- placeholder,
2023
- className,
2024
- readOnly,
2025
- editable: !readOnly,
2026
- basicSetup: defaultSetup
2027
- }
2028
- );
2029
- };
2030
-
2031
- // src/components/MergeEditor/constants.ts
2032
- var CHANGE_CLASS = {
2033
- SAFE: "safe"};
2034
- var LINE_HEIGHT_PX = 20;
2035
- var PANE_HEADER_HEIGHT_PX = 58;
2036
- var AcceptButton = ({ side, onAccept }) => {
2037
- const label = `Accept ${side === "left" ? "production" : "branch"} version`;
2038
- const Chevron = side === "left" ? lucideReact.ChevronsRight : lucideReact.ChevronsLeft;
2039
- return /* @__PURE__ */ jsxRuntime.jsx(Button, { onClick: onAccept, variant: "outline", size: "icon-sm", title: label, "aria-label": label, children: /* @__PURE__ */ jsxRuntime.jsx(Chevron, { className: "tw:size-5" }) });
2040
- };
2041
- var AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }) => /* @__PURE__ */ jsxRuntime.jsx(
2042
- "div",
2043
- {
2044
- className: cn(
2045
- "tw:z-10 tw:flex tw:shrink-0 tw:flex-col tw:items-center",
2046
- conflicts.length > 0 ? "tw:w-7" : "tw:w-0"
2047
- ),
2048
- children: conflicts.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2049
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:shrink-0", style: { height: `${PANE_HEADER_HEIGHT_PX}px` } }),
2050
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:relative tw:w-full tw:flex-1 tw:overflow-y-clip tw:overflow-x-visible", children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: contentRef, className: "tw:relative tw:size-full", children: conflicts.map((conflict) => {
2051
- const topLine = side === "left" ? conflict.oldStartLine : conflict.newStartLine;
2052
- const topOffset = (topLine - 1) * LINE_HEIGHT_PX - 2;
2053
- return /* @__PURE__ */ jsxRuntime.jsxs(
2054
- "div",
2055
- {
2056
- className: "tw:absolute tw:inset-x-0 tw:flex tw:flex-col tw:items-center tw:gap-0.5",
2057
- style: { top: `${topOffset}px` },
2058
- children: [
2059
- /* @__PURE__ */ jsxRuntime.jsx(AcceptButton, { side, onAccept: () => onAccept(conflict) }),
2060
- onDismiss && /* @__PURE__ */ jsxRuntime.jsx(
2061
- Button,
2062
- {
2063
- onClick: () => onDismiss(conflict),
2064
- variant: "outline",
2065
- size: "icon-sm",
2066
- title: "Dismiss",
2067
- "aria-label": `Dismiss ${side === "left" ? "production" : "branch"} change`,
2068
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "tw:size-4" })
2069
- }
2070
- )
2071
- ]
2072
- },
2073
- conflict.id
2074
- );
2075
- }) }) })
2076
- ] })
2077
- }
2078
- );
2079
- var setHighlightedLines = state.StateEffect.define();
2080
- var safeDecoration = view.Decoration.line({ class: "cm-merge-safe-line" });
2081
- var conflictDecoration = view.Decoration.line({ class: "cm-merge-conflict-line" });
2082
- var SafeGutterMarker = class extends view.GutterMarker {
2083
- elementClass = "cm-merge-safe-gutter";
2084
- };
2085
- var ConflictGutterMarker = class extends view.GutterMarker {
2086
- elementClass = "cm-merge-conflict-gutter";
2087
- };
2088
- var safeGutterMarker = new SafeGutterMarker();
2089
- var conflictGutterMarker = new ConflictGutterMarker();
2090
- var createDiffHighlightExtension = () => {
2091
- const field = state.StateField.define({
2092
- create: () => ({ decorations: view.Decoration.none, gutterMarkers: state.RangeSet.empty }),
2093
- update(value, tr) {
2094
- let payload = null;
2095
- for (const effect of tr.effects) {
2096
- if (effect.is(setHighlightedLines)) {
2097
- payload = effect.value;
2098
- }
2099
- }
2100
- if (!payload) {
2101
- return {
2102
- decorations: value.decorations.map(tr.changes),
2103
- gutterMarkers: value.gutterMarkers.map(tr.changes)
2104
- };
2105
- }
2106
- const decoBuilder = new state.RangeSetBuilder();
2107
- const gutterBuilder = new state.RangeSetBuilder();
2108
- const doc = tr.state.doc;
2109
- const { lines, classification } = payload;
2110
- const sorted = [...lines].filter((l) => l >= 1 && l <= doc.lines).sort((a, b) => a - b);
2111
- for (const i of sorted) {
2112
- const cls = classification.get(i);
2113
- if (!cls) continue;
2114
- const isSafe = cls === CHANGE_CLASS.SAFE;
2115
- const line = doc.line(i);
2116
- decoBuilder.add(line.from, line.from, isSafe ? safeDecoration : conflictDecoration);
2117
- gutterBuilder.add(line.from, line.from, isSafe ? safeGutterMarker : conflictGutterMarker);
2118
- }
2119
- return {
2120
- decorations: decoBuilder.finish(),
2121
- gutterMarkers: gutterBuilder.finish()
2122
- };
2123
- },
2124
- provide: (f) => [
2125
- view.EditorView.decorations.from(f, (val) => val.decorations),
2126
- view.gutterLineClass.from(f, (val) => val.gutterMarkers)
2127
- ]
2128
- });
2129
- const theme = view.EditorView.theme({
2130
- ".cm-merge-safe-line": {
2131
- backgroundColor: `${colors__default.default.green[100]} !important`,
2132
- boxShadow: `inset 3px 0 0 ${colors__default.default.green[500]}`
2133
- },
2134
- ".cm-merge-conflict-line": {
2135
- backgroundColor: `${colors__default.default.warning[100]} !important`,
2136
- boxShadow: `inset 3px 0 0 ${colors__default.default.warning[500]}`
2137
- },
2138
- ".cm-merge-safe-gutter": {
2139
- backgroundColor: `${colors__default.default.green[200]} !important`
2140
- },
2141
- ".cm-merge-conflict-gutter": {
2142
- backgroundColor: `${colors__default.default.warning[200]} !important`
2143
- }
2144
- });
2145
- return [field, theme];
2146
- };
2147
- var updateHighlightedLines = (view, lines, classification) => {
2148
- view.dispatch({ effects: setHighlightedLines.of({ lines, classification }) });
2149
- };
2150
- var EMPTY_LINES = /* @__PURE__ */ new Set();
2151
- var EMPTY_CLASSIFICATION = /* @__PURE__ */ new Map();
2152
- var MergePane = ({
2153
- value,
2154
- highlightedLines,
2155
- lineClassification,
2156
- readOnly = false,
2157
- onChange,
2158
- header,
2159
- headerClassName,
2160
- className,
2161
- onScrollDOMReady,
2162
- deleted = false
2163
- }) => {
2164
- const editorRef = react.useRef(null);
2165
- const handleChange = useStableCallback((next) => onChange?.(next));
2166
- const themeExtension = useThemedExtension(
2167
- `merge-pane:${deleted}`,
2168
- () => view.EditorView.theme({
2169
- "&.cm-editor": {
2170
- height: "100%",
2171
- backgroundColor: deleted ? colors__default.default.error[100] : resolveToken("background", "249 250 251"),
2172
- // Pair the token-driven surface with a token-driven text color so line
2173
- // content stays readable when the pane's `--background` goes dark.
2174
- // The deleted pane keeps default dark text on its fixed light-red wash.
2175
- ...deleted ? {} : { color: resolveToken("foreground", "30 41 59") },
2176
- outline: "none"
2177
- },
2178
- ".cm-gutters": {
2179
- backgroundColor: deleted ? colors__default.default.error[200] : resolveToken("muted", "241 245 249"),
2180
- ...deleted ? {} : { color: resolveToken("muted-foreground", "100 116 139") }
2181
- },
2182
- "*": { lineHeight: `${LINE_HEIGHT_PX}px` },
2183
- ".cm-lineNumbers .cm-gutterElement": { padding: "0 0 0 25px" }
2184
- })
2185
- );
2186
- const diffHighlightExtension = react.useMemo(() => createDiffHighlightExtension(), []);
2187
- const basicSetup = react.useMemo(
2188
- () => ({ ...buildBasicSetup(readOnly), lineNumbers: true }),
2189
- [readOnly]
2190
- );
2191
- const extensions = react.useMemo(
2192
- () => [
2193
- diffHighlightExtension,
2194
- themeExtension,
2195
- // Recalc viewport after every doc change so late-settling layouts (alerts
2196
- // appearing above the editor) don't leave trailing lines blank.
2197
- view.EditorView.updateListener.of((update) => {
2198
- if (update.docChanged) {
2199
- requestAnimationFrame(() => update.view.dispatch({}));
2200
- }
2201
- })
2202
- ],
2203
- [diffHighlightExtension, themeExtension]
2204
- );
2205
- react.useEffect(() => {
2206
- const view = editorRef.current?.view;
2207
- if (!view) return;
2208
- updateHighlightedLines(
2209
- view,
2210
- deleted ? EMPTY_LINES : highlightedLines,
2211
- deleted ? EMPTY_CLASSIFICATION : lineClassification
2212
- );
2213
- }, [highlightedLines, lineClassification, deleted]);
2214
- const handleCreateEditor = react.useCallback(
2215
- (view) => {
2216
- updateHighlightedLines(
2217
- view,
2218
- deleted ? EMPTY_LINES : highlightedLines,
2219
- deleted ? EMPTY_CLASSIFICATION : lineClassification
2220
- );
2221
- onScrollDOMReady?.(view.scrollDOM);
2222
- },
2223
- [highlightedLines, lineClassification, onScrollDOMReady, deleted]
2224
- );
2225
- react.useEffect(() => {
2226
- return () => onScrollDOMReady?.(null);
2227
- }, [onScrollDOMReady]);
2228
- react.useEffect(() => {
2229
- const view = editorRef.current?.view;
2230
- const wrapper = view?.dom.parentElement;
2231
- if (!view || !wrapper) return;
2232
- const observer = new ResizeObserver(() => view.dispatch({}));
2233
- observer.observe(wrapper);
2234
- return () => observer.disconnect();
2235
- }, []);
2236
- return /* @__PURE__ */ jsxRuntime.jsxs(
2237
- "div",
2238
- {
2239
- className: cn(
2240
- "tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:overflow-hidden",
2241
- className,
2242
- deleted && "tw:border-error-300"
2243
- ),
2244
- children: [
2245
- header && /* @__PURE__ */ jsxRuntime.jsx(
2246
- "div",
2247
- {
2248
- className: cn(
2249
- "tw:px-4 tw:py-3",
2250
- deleted ? "tw:border-b tw:border-error-200 tw:bg-error-100" : "tw:bg-background",
2251
- headerClassName
2252
- ),
2253
- children: header
2254
- }
2255
- ),
2256
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:flex tw:h-0 tw:flex-1 tw:flex-col tw:[&_>div]:h-full", children: /* @__PURE__ */ jsxRuntime.jsx(
2257
- CodeMirror__default.default,
2258
- {
2259
- ref: editorRef,
2260
- height: "100%",
2261
- value,
2262
- onChange: handleChange,
2263
- extensions,
2264
- readOnly,
2265
- onCreateEditor: handleCreateEditor,
2266
- basicSetup
2267
- }
2268
- ) })
2269
- ]
2270
- }
2271
- );
2272
- };
2273
- var useScrollSync = () => {
2274
- const scrollersRef = react.useRef([]);
2275
- const followersRef = react.useRef(/* @__PURE__ */ new Map());
2276
- const isSyncingRef = react.useRef(false);
2277
- const scrollerCallbacksRef = react.useRef(/* @__PURE__ */ new Map());
2278
- const followerCallbacksRef = react.useRef(/* @__PURE__ */ new Map());
2279
- const updateFollowers = react.useCallback(() => {
2280
- for (const [, { paneIndex, el }] of followersRef.current) {
2281
- const scroller = scrollersRef.current[paneIndex];
2282
- if (!scroller) continue;
2283
- el.style.transform = `translateY(-${scroller.scrollTop}px)`;
2284
- }
2285
- }, []);
2286
- const handleScroll = react.useCallback(
2287
- (e) => {
2288
- if (isSyncingRef.current) return;
2289
- isSyncingRef.current = true;
2290
- const sourceScrollTop = e.target.scrollTop;
2291
- for (const scroller of scrollersRef.current) {
2292
- if (!scroller || scroller === e.target) continue;
2293
- const targetMax = Math.max(0, scroller.scrollHeight - scroller.clientHeight);
2294
- scroller.scrollTop = Math.min(sourceScrollTop, targetMax);
2295
- }
2296
- updateFollowers();
2297
- isSyncingRef.current = false;
2298
- },
2299
- [updateFollowers]
2300
- );
2301
- const registerScroller = react.useCallback(
2302
- (index) => {
2303
- const existing = scrollerCallbacksRef.current.get(index);
2304
- if (existing) return existing;
2305
- const callback = (el) => {
2306
- const prev = scrollersRef.current[index];
2307
- if (prev === el) return;
2308
- prev?.removeEventListener("scroll", handleScroll);
2309
- scrollersRef.current[index] = el;
2310
- el?.addEventListener("scroll", handleScroll, { passive: true });
2311
- };
2312
- scrollerCallbacksRef.current.set(index, callback);
2313
- return callback;
2314
- },
2315
- [handleScroll]
2316
- );
2317
- const registerFollower = react.useCallback((paneIndex, key) => {
2318
- const existing = followerCallbacksRef.current.get(key);
2319
- if (existing) return existing;
2320
- const callback = (el) => {
2321
- if (el) {
2322
- followersRef.current.set(key, { paneIndex, el });
2323
- } else {
2324
- followersRef.current.delete(key);
2325
- }
2326
- };
2327
- followerCallbacksRef.current.set(key, callback);
2328
- return callback;
2329
- }, []);
2330
- return { registerScroller, registerFollower };
2331
- };
2332
- var EMPTY_LINES2 = /* @__PURE__ */ new Set();
2333
- var EMPTY_CLASSIFICATION2 = /* @__PURE__ */ new Map();
2334
- var MergeEditor = ({
2335
- mergeValue,
2336
- handleMergeChange,
2337
- leftText,
2338
- rightText,
2339
- leftConflicts,
2340
- rightConflicts,
2341
- leftHighlightedLines,
2342
- rightHighlightedLines,
2343
- leftClassification,
2344
- rightClassification,
2345
- mergeHighlightedLines,
2346
- mergeClassification,
2347
- acceptLeft,
2348
- acceptRight,
2349
- dismissLeft,
2350
- dismissRight,
2351
- leftHeader,
2352
- middleHeader,
2353
- middleHeaderClassName,
2354
- middleClassName,
2355
- rightHeader,
2356
- className,
2357
- leftDeleted = false,
2358
- rightDeleted = false
2359
- }) => {
2360
- const { registerScroller, registerFollower } = useScrollSync();
2361
- const anySideDeleted = leftDeleted || rightDeleted;
2362
- return /* @__PURE__ */ jsxRuntime.jsxs(
2363
- "div",
2364
- {
2365
- className: cn(
2366
- "tw:flex tw:h-full tw:min-h-0 tw:overflow-hidden tw:bg-background tw:gap-3",
2367
- className
2368
- ),
2369
- children: [
2370
- /* @__PURE__ */ jsxRuntime.jsx(
2371
- MergePane,
2372
- {
2373
- value: leftText,
2374
- highlightedLines: leftHighlightedLines,
2375
- lineClassification: leftClassification,
2376
- readOnly: true,
2377
- header: leftHeader,
2378
- className: "tw:rounded-r-lg tw:border tw:border-border",
2379
- onScrollDOMReady: registerScroller(0),
2380
- deleted: leftDeleted
2381
- }
2382
- ),
2383
- /* @__PURE__ */ jsxRuntime.jsx(
2384
- AcceptControls,
2385
- {
2386
- conflicts: leftDeleted ? [] : leftConflicts,
2387
- side: "left",
2388
- onAccept: acceptLeft,
2389
- onDismiss: dismissLeft,
2390
- contentRef: registerFollower(0, "left-controls")
2391
- }
2392
- ),
2393
- /* @__PURE__ */ jsxRuntime.jsx(
2394
- MergePane,
2395
- {
2396
- value: mergeValue,
2397
- highlightedLines: anySideDeleted ? EMPTY_LINES2 : mergeHighlightedLines,
2398
- lineClassification: anySideDeleted ? EMPTY_CLASSIFICATION2 : mergeClassification,
2399
- onChange: handleMergeChange,
2400
- header: middleHeader,
2401
- headerClassName: middleHeaderClassName,
2402
- className: cn("tw:border tw:border-border tw:rounded-lg", middleClassName),
2403
- onScrollDOMReady: registerScroller(1)
2404
- }
2405
- ),
2406
- /* @__PURE__ */ jsxRuntime.jsx(
2407
- AcceptControls,
2408
- {
2409
- conflicts: rightDeleted ? [] : rightConflicts,
2410
- side: "right",
2411
- onAccept: acceptRight,
2412
- onDismiss: dismissRight,
2413
- contentRef: registerFollower(2, "right-controls")
2414
- }
2415
- ),
2416
- /* @__PURE__ */ jsxRuntime.jsx(
2417
- MergePane,
2418
- {
2419
- value: rightText,
2420
- highlightedLines: rightHighlightedLines,
2421
- lineClassification: rightClassification,
2422
- readOnly: true,
2423
- header: rightHeader,
2424
- className: "tw:rounded-l-lg tw:border tw:border-border",
2425
- onScrollDOMReady: registerScroller(2),
2426
- deleted: rightDeleted
2427
- }
2428
- )
2429
- ]
2430
- }
2431
- );
2432
- };
2433
-
2434
- exports.CodeEditor = CodeEditor;
2435
- exports.LANGUAGE_MODES = LANGUAGE_MODES;
2436
- exports.MergeEditor = MergeEditor;
2437
- exports.SqlEditor = SqlEditor;
2438
- exports.isLanguageMode = isLanguageMode;
2439
- //# sourceMappingURL=editors.cjs.map
2440
- //# sourceMappingURL=editors.cjs.map