@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
@@ -1,4636 +0,0 @@
1
- 'use strict';
2
-
3
- var clsx = require('clsx');
4
- var tailwindMerge = require('tailwind-merge');
5
- var brandRegistry = require('@keboola/brand-registry');
6
- var react = require('react');
7
- var reactTooltip = require('@radix-ui/react-tooltip');
8
- var classVarianceAuthority = require('class-variance-authority');
9
- var jsxRuntime = require('react/jsx-runtime');
10
- var lucideReact = require('lucide-react');
11
- var reactSlot = require('@radix-ui/react-slot');
12
- var reactDom = require('react-dom');
13
- var DOMPurify = require('dompurify');
14
- var beautifulMermaid = require('beautiful-mermaid');
15
- var colors = require('@keboola/tailwind-config/colors');
16
- var code = require('@lexical/code');
17
- var link = require('@lexical/link');
18
- var list = require('@lexical/list');
19
- var markdown = require('@lexical/markdown');
20
- var LexicalAutoFocusPlugin = require('@lexical/react/LexicalAutoFocusPlugin');
21
- var LexicalCheckListPlugin = require('@lexical/react/LexicalCheckListPlugin');
22
- var LexicalClickableLinkPlugin = require('@lexical/react/LexicalClickableLinkPlugin');
23
- var LexicalComposer = require('@lexical/react/LexicalComposer');
24
- var LexicalContentEditable = require('@lexical/react/LexicalContentEditable');
25
- var LexicalErrorBoundary = require('@lexical/react/LexicalErrorBoundary');
26
- var LexicalHistoryPlugin = require('@lexical/react/LexicalHistoryPlugin');
27
- var LexicalHorizontalRuleNode = require('@lexical/react/LexicalHorizontalRuleNode');
28
- var LexicalHorizontalRulePlugin = require('@lexical/react/LexicalHorizontalRulePlugin');
29
- var LexicalLinkPlugin = require('@lexical/react/LexicalLinkPlugin');
30
- var LexicalListPlugin = require('@lexical/react/LexicalListPlugin');
31
- var LexicalMarkdownShortcutPlugin = require('@lexical/react/LexicalMarkdownShortcutPlugin');
32
- var LexicalRichTextPlugin = require('@lexical/react/LexicalRichTextPlugin');
33
- var LexicalTabIndentationPlugin = require('@lexical/react/LexicalTabIndentationPlugin');
34
- var richText = require('@lexical/rich-text');
35
- var lexical = require('lexical');
36
- var LexicalComposerContext = require('@lexical/react/LexicalComposerContext');
37
- var sonner = require('sonner');
38
- var utils = require('@lexical/utils');
39
- var DropdownMenuPrimitive3 = require('@radix-ui/react-dropdown-menu');
40
- var ScrollAreaPrimitive2 = require('@radix-ui/react-scroll-area');
41
- var TextareaAutosize = require('react-textarea-autosize');
42
- var RLabel = require('@radix-ui/react-label');
43
-
44
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
45
-
46
- function _interopNamespace(e) {
47
- if (e && e.__esModule) return e;
48
- var n = Object.create(null);
49
- if (e) {
50
- Object.keys(e).forEach(function (k) {
51
- if (k !== 'default') {
52
- var d = Object.getOwnPropertyDescriptor(e, k);
53
- Object.defineProperty(n, k, d.get ? d : {
54
- enumerable: true,
55
- get: function () { return e[k]; }
56
- });
57
- }
58
- });
59
- }
60
- n.default = e;
61
- return Object.freeze(n);
62
- }
63
-
64
- var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
65
- var colors__default = /*#__PURE__*/_interopDefault(colors);
66
- var DropdownMenuPrimitive3__namespace = /*#__PURE__*/_interopNamespace(DropdownMenuPrimitive3);
67
- var ScrollAreaPrimitive2__namespace = /*#__PURE__*/_interopNamespace(ScrollAreaPrimitive2);
68
- var TextareaAutosize__default = /*#__PURE__*/_interopDefault(TextareaAutosize);
69
- var RLabel__namespace = /*#__PURE__*/_interopNamespace(RLabel);
70
-
71
- var __defProp = Object.defineProperty;
72
- var __getOwnPropNames = Object.getOwnPropertyNames;
73
- var __esm = (fn, res) => function __init() {
74
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
75
- };
76
- var __export = (target, all) => {
77
- for (var name in all)
78
- __defProp(target, name, { get: all[name], enumerable: true });
79
- };
80
- var twMerge, cn;
81
- var init_classNames = __esm({
82
- "src/utils/classNames.ts"() {
83
- twMerge = tailwindMerge.extendTailwindMerge({
84
- prefix: "tw"
85
- });
86
- cn = (...classes) => twMerge(clsx.clsx(...classes));
87
- }
88
- });
89
-
90
- // src/utils/copyToClipboard.ts
91
- var copyToClipboard;
92
- var init_copyToClipboard = __esm({
93
- "src/utils/copyToClipboard.ts"() {
94
- copyToClipboard = (text) => {
95
- return navigator.clipboard.writeText(text);
96
- };
97
- }
98
- });
99
-
100
- // src/utils/createChangeInputEvent.ts
101
- var createChangeInputEvent;
102
- var init_createChangeInputEvent = __esm({
103
- "src/utils/createChangeInputEvent.ts"() {
104
- createChangeInputEvent = (input) => {
105
- const changeEvent = {
106
- target: input,
107
- currentTarget: input,
108
- type: "change",
109
- nativeEvent: new Event("change", { bubbles: true }),
110
- bubbles: true,
111
- cancelable: false,
112
- defaultPrevented: false,
113
- eventPhase: 2,
114
- // AT_TARGET
115
- isTrusted: false,
116
- // Synthetic events are not trusted
117
- preventDefault: () => {
118
- },
119
- // Provide dummy functions if not needed
120
- isDefaultPrevented: () => false,
121
- stopPropagation: () => {
122
- },
123
- isPropagationStopped: () => false,
124
- persist: () => {
125
- },
126
- timeStamp: Date.now()
127
- };
128
- Object.defineProperty(changeEvent, "target", {
129
- value: input,
130
- writable: false
131
- });
132
- return changeEvent;
133
- };
134
- }
135
- });
136
-
137
- // src/constants/keyCodes.ts
138
- var keyCodes;
139
- var init_keyCodes = __esm({
140
- "src/constants/keyCodes.ts"() {
141
- keyCodes = {
142
- ENTER: "Enter",
143
- ESCAPE: "Escape",
144
- SPACE: " "
145
- };
146
- }
147
- });
148
-
149
- // src/components/ThemeProvider/utils.ts
150
- var createTheme;
151
- var init_utils = __esm({
152
- "src/components/ThemeProvider/utils.ts"() {
153
- createTheme = (brand) => ({
154
- id: brand.id,
155
- name: brand.name,
156
- shell: brand.shell,
157
- logo: brand.logo
158
- });
159
- }
160
- });
161
- var DEFAULT_COLOR_SCHEME, DEFAULT_BRAND_ID, defaultBrand, defaultTheme;
162
- var init_defaults = __esm({
163
- "src/components/ThemeProvider/defaults.ts"() {
164
- init_utils();
165
- [brandRegistry.keboolaLegacySidebar.id, brandRegistry.keboolaLegacyTopnav.id];
166
- DEFAULT_COLOR_SCHEME = "light";
167
- DEFAULT_BRAND_ID = "design-system";
168
- defaultBrand = {
169
- id: DEFAULT_BRAND_ID,
170
- name: "Design System",
171
- shell: "sidebar",
172
- theme: {}
173
- };
174
- defaultTheme = createTheme(defaultBrand);
175
- }
176
- });
177
- var noop, defaultContext, ArgoDesignContext, useArgoDesign;
178
- var init_context = __esm({
179
- "src/components/ThemeProvider/context.tsx"() {
180
- init_defaults();
181
- noop = () => void 0;
182
- defaultContext = {
183
- scheme: DEFAULT_COLOR_SCHEME,
184
- resolvedScheme: DEFAULT_COLOR_SCHEME,
185
- setScheme: noop,
186
- brandId: defaultTheme.id,
187
- setBrand: noop,
188
- themes: [defaultTheme],
189
- currentTheme: defaultTheme
190
- };
191
- react.createContext(defaultContext);
192
- ArgoDesignContext = react.createContext(true);
193
- useArgoDesign = () => react.use(ArgoDesignContext);
194
- }
195
- });
196
- var tooltipVariants, TooltipContent;
197
- var init_TooltipContent = __esm({
198
- "src/components/Tooltip/TooltipContent.tsx"() {
199
- init_context();
200
- tooltipVariants = classVarianceAuthority.cva(
201
- [
202
- "tailwindcss-preflight",
203
- "tw:inline-block",
204
- "tw:break-anywhere",
205
- "tw:max-h-96",
206
- "tw:overflow-y-auto",
207
- "tw:z-[1060]",
208
- // legacy (dark) chrome — default
209
- "tw:rounded",
210
- "tw:bg-neutral-800",
211
- "tw:text-white",
212
- // argo chrome overrides — semantic floating-panel tokens
213
- "tw:data-[argo=true]:rounded-2xl",
214
- "tw:data-[argo=true]:border",
215
- "tw:data-[argo=true]:border-solid",
216
- "tw:data-[argo=true]:border-border",
217
- "tw:data-[argo=true]:bg-popover",
218
- "tw:data-[argo=true]:text-popover-foreground",
219
- "tw:data-[argo=true]:shadow-md",
220
- // argo open animation
221
- "tw:data-[argo=true]:data-[state=delayed-open]:animate-in",
222
- "tw:data-[argo=true]:data-[state=instant-open]:animate-in",
223
- "tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0",
224
- "tw:data-[argo=true]:data-[state=instant-open]:fade-in-0",
225
- "tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95",
226
- "tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95",
227
- // argo closed animation
228
- "tw:data-[argo=true]:data-[state=closed]:animate-out",
229
- "tw:data-[argo=true]:data-[state=closed]:fade-out-0",
230
- "tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
231
- // argo position animation
232
- "tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2",
233
- "tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2",
234
- "tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2",
235
- "tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2"
236
- ],
237
- {
238
- defaultVariants: {
239
- variant: "action"
240
- },
241
- variants: {
242
- variant: {
243
- action: [
244
- "tw:max-w-fit",
245
- "tw:px-3",
246
- "tw:py-2",
247
- "tw:text-center",
248
- "tw:text-xs",
249
- "tw:font-medium",
250
- // Legacy chrome uppercases the action tooltip; the Keboola V2 brand
251
- // (`data-brand="keboola"`) renders it in standard case instead.
252
- "tw:uppercase",
253
- "tw:tracking-wider",
254
- "tw:[[data-brand=keboola]_&]:normal-case",
255
- "tw:[[data-brand=keboola]_&]:tracking-normal"
256
- ],
257
- explanatory: [
258
- "tw:max-w-80",
259
- "tw:px-4",
260
- "tw:py-3",
261
- "tw:text-left",
262
- "tw:text-sm",
263
- "tw:font-normal"
264
- ]
265
- }
266
- }
267
- }
268
- );
269
- TooltipContent = ({
270
- className,
271
- variant,
272
- keepOpenOnPointerDownOutside = false,
273
- children,
274
- onPointerDownOutside,
275
- sideOffset = 8,
276
- collisionPadding = 8,
277
- hideWhenDetached = true,
278
- placement = "right",
279
- ...rest
280
- }) => {
281
- const renderArgo = useArgoDesign();
282
- const handlePointerDownOutside = (event) => {
283
- if (keepOpenOnPointerDownOutside) event.preventDefault();
284
- onPointerDownOutside?.(event);
285
- };
286
- return /* @__PURE__ */ jsxRuntime.jsx(reactTooltip.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
287
- reactTooltip.Content,
288
- {
289
- ...rest,
290
- "data-tooltip-content": renderArgo ? void 0 : true,
291
- "data-argo": renderArgo,
292
- sideOffset,
293
- collisionPadding,
294
- onPointerDownOutside: handlePointerDownOutside,
295
- className: tooltipVariants({ className, variant }),
296
- hideWhenDetached,
297
- side: placement,
298
- children
299
- }
300
- ) });
301
- };
302
- }
303
- });
304
- var DELAY_SHOW_TOOLTIP, TooltipRoot;
305
- var init_TooltipRoot = __esm({
306
- "src/components/Tooltip/TooltipRoot.tsx"() {
307
- DELAY_SHOW_TOOLTIP = 300;
308
- TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }) => /* @__PURE__ */ jsxRuntime.jsx(reactTooltip.Root, { ...rest, delayDuration, children });
309
- }
310
- });
311
- var TooltipTrigger;
312
- var init_TooltipTrigger = __esm({
313
- "src/components/Tooltip/TooltipTrigger.tsx"() {
314
- init_utils2();
315
- TooltipTrigger = ({
316
- ref,
317
- children,
318
- className,
319
- keepOpenOnClick = false,
320
- onClick,
321
- onPointerDown,
322
- asChild,
323
- ...rest
324
- }) => {
325
- const handleClick = (event) => {
326
- if (keepOpenOnClick) event.preventDefault();
327
- onClick?.(event);
328
- };
329
- const handlePointerDown = (event) => {
330
- if (keepOpenOnClick) event.preventDefault();
331
- onPointerDown?.(event);
332
- };
333
- return /* @__PURE__ */ jsxRuntime.jsx(
334
- reactTooltip.Trigger,
335
- {
336
- ...rest,
337
- asChild: true,
338
- ref,
339
- className: cn("tailwindcss-preflight", className),
340
- onClick: handleClick,
341
- onPointerDown: handlePointerDown,
342
- children: asChild ? children : (
343
- // Default-mode trigger wraps children in a span so Radix has a
344
- // single DOM element to attach handlers to. `tailwindcss-preflight`
345
- // (merged in via Slot) activates Tailwind's preflight inside the
346
- // span, which sets `svg { display: block }` — without an inline-flex
347
- // container that would stack any bare Lucide icon onto its own
348
- // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.
349
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tw:inline-flex tw:items-center", children })
350
- )
351
- }
352
- );
353
- };
354
- }
355
- });
356
- var ACTION_TOOLTIP_LIMIT, Tooltip;
357
- var init_Tooltip = __esm({
358
- "src/components/Tooltip/Tooltip.tsx"() {
359
- init_keyCodes();
360
- init_TooltipContent();
361
- init_TooltipRoot();
362
- init_TooltipTrigger();
363
- ACTION_TOOLTIP_LIMIT = 30;
364
- Tooltip = ({
365
- tooltip,
366
- children,
367
- className,
368
- keepOpenOnTriggerClick = false,
369
- variant,
370
- placement = "right",
371
- forceHide = false,
372
- forceShow = false,
373
- delayDuration,
374
- // trigger props
375
- triggerAsChild = false
376
- }) => {
377
- const [open, setOpen] = react.useState(false);
378
- const resolvedVariant = (() => {
379
- if (!!variant) return variant;
380
- if (typeof tooltip === "string" && tooltip.length > ACTION_TOOLTIP_LIMIT) return "explanatory";
381
- return "action";
382
- })();
383
- const isActionVariant = resolvedVariant === "action";
384
- const handleKeyUp = (event) => {
385
- if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;
386
- event.stopPropagation();
387
- };
388
- return /* @__PURE__ */ jsxRuntime.jsxs(
389
- TooltipRoot,
390
- {
391
- open: !!tooltip && (open || forceShow) && !forceHide,
392
- onOpenChange: setOpen,
393
- delayDuration,
394
- disableHoverableContent: isActionVariant,
395
- children: [
396
- /* @__PURE__ */ jsxRuntime.jsx(
397
- TooltipTrigger,
398
- {
399
- asChild: triggerAsChild,
400
- keepOpenOnClick: keepOpenOnTriggerClick,
401
- onKeyUp: handleKeyUp,
402
- children
403
- }
404
- ),
405
- /* @__PURE__ */ jsxRuntime.jsx(
406
- TooltipContent,
407
- {
408
- className,
409
- variant: resolvedVariant,
410
- placement,
411
- keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
412
- children: tooltip
413
- }
414
- )
415
- ]
416
- }
417
- );
418
- };
419
- Tooltip.Root = TooltipRoot;
420
- Tooltip.Content = TooltipContent;
421
- Tooltip.Trigger = TooltipTrigger;
422
- }
423
- });
424
-
425
- // src/components/Tooltip/index.ts
426
- var init_Tooltip2 = __esm({
427
- "src/components/Tooltip/index.ts"() {
428
- init_Tooltip();
429
- }
430
- });
431
- var init_decorators = __esm({
432
- "src/utils/decorators.tsx"() {
433
- }
434
- });
435
-
436
- // src/utils/createPrefixedString.ts
437
- var createPrefixedString;
438
- var init_createPrefixedString = __esm({
439
- "src/utils/createPrefixedString.ts"() {
440
- createPrefixedString = (prefix) => (literals) => literals.reduce((acc, literal) => acc + literal, `${prefix}-`);
441
- }
442
- });
443
-
444
- // src/utils/escapeStringRegexp.ts
445
- var init_escapeStringRegexp = __esm({
446
- "src/utils/escapeStringRegexp.ts"() {
447
- }
448
- });
449
-
450
- // src/utils/mergeRefs.ts
451
- function setRef(ref, value) {
452
- if (typeof ref === "function") {
453
- ref(value);
454
- } else if (ref != null) {
455
- ref.current = value;
456
- }
457
- }
458
- var mergeRefs;
459
- var init_mergeRefs = __esm({
460
- "src/utils/mergeRefs.ts"() {
461
- mergeRefs = (...refs) => {
462
- return (node) => refs.forEach((ref) => setRef(ref, node));
463
- };
464
- }
465
- });
466
-
467
- // src/utils/noop.ts
468
- var init_noop = __esm({
469
- "src/utils/noop.ts"() {
470
- }
471
- });
472
-
473
- // src/utils/debounce.ts
474
- var init_debounce = __esm({
475
- "src/utils/debounce.ts"() {
476
- }
477
- });
478
-
479
- // src/utils/isMac.ts
480
- var getIsMac;
481
- var init_isMac = __esm({
482
- "src/utils/isMac.ts"() {
483
- getIsMac = () => {
484
- if (typeof navigator !== "undefined" && "userAgentData" in navigator) {
485
- const platform = navigator.userAgentData.platform;
486
- if (typeof platform === "string") {
487
- return platform.toLowerCase() === "macos";
488
- }
489
- }
490
- if (typeof navigator !== "undefined" && typeof navigator.platform === "string") {
491
- return navigator.platform.toUpperCase().indexOf("MAC") >= 0;
492
- }
493
- return false;
494
- };
495
- getIsMac();
496
- }
497
- });
498
- var init_useSHA256 = __esm({
499
- "src/utils/useSHA256.ts"() {
500
- }
501
- });
502
-
503
- // src/utils/index.ts
504
- var init_utils2 = __esm({
505
- "src/utils/index.ts"() {
506
- init_classNames();
507
- init_copyToClipboard();
508
- init_createChangeInputEvent();
509
- init_decorators();
510
- init_createPrefixedString();
511
- init_escapeStringRegexp();
512
- init_mergeRefs();
513
- init_noop();
514
- init_debounce();
515
- init_isMac();
516
- init_useSHA256();
517
- }
518
- });
519
- var HEIGHT_CLASS_NAME, ANIMATION_CLASS_NAME, Skeleton;
520
- var init_Skeleton = __esm({
521
- "src/components/Skeleton/Skeleton.tsx"() {
522
- init_utils2();
523
- HEIGHT_CLASS_NAME = {
524
- xxs: "tw:h-3 tw:rounded",
525
- xs: "tw:h-4 tw:rounded",
526
- sm: "tw:h-5 tw:rounded",
527
- md: "tw:h-6 tw:rounded-md",
528
- lg: "tw:h-8 tw:rounded-lg",
529
- xl: "tw:h-10 tw:rounded-lg",
530
- "2xl": "tw:h-12 tw:rounded-lg"
531
- };
532
- ANIMATION_CLASS_NAME = cn(
533
- // base styles
534
- "tw:relative",
535
- "tw:overflow-hidden",
536
- "tw:pointer-events-none",
537
- "tw:bg-skeleton",
538
- // before
539
- 'tw:before:content-[""]',
540
- "tw:before:opacity-100",
541
- "tw:before:absolute",
542
- "tw:before:inset-0",
543
- "tw:before:-translate-x-full",
544
- "tw:before:animate-[shimmer_2s_infinite]",
545
- "tw:before:bg-gradient-to-r",
546
- "tw:before:from-transparent",
547
- "tw:before:to-transparent",
548
- "tw:before:via-white/40"
549
- );
550
- Skeleton = ({ height = "md", className, count = 1 }) => {
551
- const prefixId = react.useId();
552
- const keys = Array.from({ length: count }, (_, i) => `${prefixId}-${i}`);
553
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: keys.map((key) => /* @__PURE__ */ jsxRuntime.jsx(
554
- "div",
555
- {
556
- "data-skeleton": "true",
557
- className: cn(HEIGHT_CLASS_NAME[height], ANIMATION_CLASS_NAME, className)
558
- },
559
- key
560
- )) });
561
- };
562
- }
563
- });
564
- var init_icons = __esm({
565
- "src/icons/index.ts"() {
566
- }
567
- });
568
- var variants, argoVariants;
569
- var init_styles = __esm({
570
- "src/components/Button/styles.ts"() {
571
- variants = classVarianceAuthority.cva(
572
- [
573
- "tailwindcss-preflight",
574
- "tw:group/button",
575
- "tw:border-box",
576
- // layout
577
- "tw:relative",
578
- "tw:flex",
579
- "tw:items-center",
580
- "tw:justify-center",
581
- "tw:gap-2",
582
- // text — chrome weight/tracking are brand-overridable tokens
583
- // (`--font-weight-medium` / `--letter-spacing-chrome`). Casing: standard case is
584
- // the default; only legacy brands (`keboola-legacy-*`) uppercase the chrome, so
585
- // modern brands (incl. Keboola V2) read naturally. Mirrors the V2 standard-case
586
- // treatment shipped for Tooltip/Badge (PR 7629).
587
- "tw:text-xs",
588
- "tw:leading-5",
589
- "tw:font-medium",
590
- "tw:[[data-brand^=keboola-legacy]_&]:tracking-chrome",
591
- "tw:[[data-brand^=keboola-legacy]_&]:uppercase",
592
- // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
593
- "tw:rounded",
594
- "tw:border",
595
- "tw:border-transparent",
596
- // styling
597
- "tw:shadow-none",
598
- "tw:[a]:cursor-pointer",
599
- // explicitly set for anchor
600
- "tw:focus-visible:outline",
601
- "tw:focus-visible:outline-1",
602
- "tw:focus-visible:-outline-offset-1",
603
- "tw:focus-visible:outline-ring",
604
- "tw:focus-visible:ring-4",
605
- "tw:focus-visible:ring-ring/30",
606
- // disabled
607
- "tw:disabled:opacity-40",
608
- "tw:disabled:cursor-not-allowed",
609
- // anchor support
610
- "tw:!no-underline",
611
- "tw:aria-disabled:opacity-40",
612
- "tw:aria-disabled:cursor-not-allowed",
613
- "tw:[&_svg]:shrink-0"
614
- ],
615
- {
616
- defaultVariants: {
617
- size: "medium",
618
- variant: "primary",
619
- block: false
620
- },
621
- variants: {
622
- block: {
623
- true: ["tw:w-full"]
624
- },
625
- variant: {
626
- primary: [
627
- "tw:text-white",
628
- "tw:bg-primary-500",
629
- "tw:focus:text-white",
630
- "tw:hover:text-white",
631
- "tw:hover:not-disabled:bg-primary-600",
632
- "tw:active:not-disabled:bg-primary-800",
633
- // anchor disabled override
634
- "tw:aria-disabled:!bg-primary-500"
635
- ],
636
- secondary: [
637
- "tw:text-white",
638
- "tw:bg-secondary-500",
639
- "tw:focus:text-white",
640
- "tw:hover:text-white",
641
- "tw:hover:not-disabled:bg-secondary-700",
642
- "tw:active:not-disabled:bg-secondary-800",
643
- // anchor disabled override
644
- "tw:aria-disabled:!bg-secondary-500"
645
- ],
646
- danger: [
647
- "tw:text-white",
648
- "tw:bg-error-500",
649
- "tw:focus:text-white",
650
- "tw:hover:text-white",
651
- "tw:hover:not-disabled:bg-error-600",
652
- "tw:active:not-disabled:bg-error-700",
653
- // anchor disabled override
654
- "tw:aria-disabled:!bg-error-500"
655
- ],
656
- invisible: [
657
- "tw:text-neutral-800",
658
- "tw:bg-transparent",
659
- "tw:focus:text-neutral-800",
660
- "tw:hover:not-disabled:bg-neutral-100",
661
- "tw:hover:text-neutral-800",
662
- "tw:active:not-disabled:bg-neutral-150",
663
- // contrasting icon on hover/active
664
- "tw:[&_svg]:text-neutral-400",
665
- "tw:hover:not-disabled:[&_svg]:text-secondary-600",
666
- "tw:active:not-disabled:[&_svg]:text-secondary-600",
667
- // anchor disabled override
668
- "tw:aria-disabled:!bg-transparent"
669
- ],
670
- outline: [
671
- "tw:text-neutral-800",
672
- "tw:bg-white",
673
- // border
674
- "tw:!border-neutral-200",
675
- "tw:hover:text-neutral-800",
676
- "tw:focus:text-neutral-800",
677
- "tw:hover:not-disabled:!border-neutral-300",
678
- "tw:hover:not-disabled:bg-neutral-100",
679
- "tw:active:not-disabled:bg-neutral-200",
680
- // contrasting icon hover, same as invisible
681
- "tw:[&_svg]:text-neutral-400",
682
- "tw:not-disabled:hover:[&_svg]:text-secondary-600",
683
- "tw:active:not-disabled:[&_svg]:text-secondary-600",
684
- // anchor disabled override
685
- "tw:aria-disabled:!bg-white",
686
- "tw:aria-disabled:!border-neutral-200"
687
- ],
688
- inline: [
689
- "tw:text-neutral-800",
690
- "tw:bg-transparent",
691
- "tw:rounded-full",
692
- "tw:[&_svg]:text-neutral-400",
693
- "tw:not-disabled:hover:[&_svg]:text-secondary-600",
694
- "tw:not-disabled:focus:[&_svg]:text-secondary-600"
695
- ]
696
- },
697
- size: {
698
- medium: [
699
- "tw:max-h-10",
700
- "tw:min-h-10",
701
- "tw:px-4",
702
- "tw:py-2.5",
703
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
704
- ],
705
- small: [
706
- "tw:max-h-8",
707
- "tw:min-h-8",
708
- "tw:px-4",
709
- "tw:py-1.5",
710
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
711
- ],
712
- large: [
713
- "tw:max-h-12",
714
- "tw:min-h-12",
715
- "tw:px-4",
716
- "tw:py-3.5",
717
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
718
- ],
719
- "icon-lg": ["tw:size-12", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-6'],
720
- icon: ["tw:size-10", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
721
- "icon-sm": ["tw:size-8", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
722
- "icon-xs": ["tw:size-6", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
723
- "icon-2xs": [
724
- "tw:!inline-flex",
725
- "tw:size-5",
726
- "tw:max-h-5",
727
- 'tw:[&_svg:not([class*="tw:size-"])]:size-3'
728
- ],
729
- "icon-3xs": ["tw:h-fit", "tw:w-fit", 'tw:[&_svg:not([class*="tw:size-"])]:size-4']
730
- }
731
- }
732
- }
733
- );
734
- argoVariants = classVarianceAuthority.cva(
735
- [
736
- "tailwindcss-preflight",
737
- // layout
738
- "tw:relative",
739
- "tw:inline-flex",
740
- "tw:items-center",
741
- "tw:justify-center",
742
- "tw:whitespace-nowrap",
743
- "tw:gap-2",
744
- // border
745
- "tw:border",
746
- "tw:border-transparent",
747
- "tw:rounded-[var(--radius-lg,0.25rem)]",
748
- // text
749
- "tw:font-medium",
750
- "tw:select-none",
751
- // focus visible
752
- "tw:!outline-hidden",
753
- "tw:focus-visible:ring-2",
754
- // disabled
755
- "tw:disabled:cursor-not-allowed",
756
- "tw:disabled:opacity-50",
757
- "tw:active:opacity-60",
758
- "tw:transition-all",
759
- "tw:bg-clip-padding",
760
- // anchor support
761
- "tw:!no-underline",
762
- "tw:aria-disabled:cursor-not-allowed",
763
- "tw:aria-disabled:opacity-50",
764
- // icon
765
- "tw:shrink-0",
766
- "tw:[&_svg]:pointer-events-none",
767
- "tw:[&_svg]:shrink-0",
768
- "tw:[&_svg:not([class*='tw:size-'])]:size-4"
769
- ],
770
- {
771
- defaultVariants: {
772
- variant: "primary",
773
- size: "medium"
774
- },
775
- variants: {
776
- block: {
777
- true: ["tw:w-full"]
778
- },
779
- variant: {
780
- primary: [
781
- "tw:bg-primary",
782
- "tw:text-primary-foreground",
783
- "tw:[a]:hover:bg-primary/80",
784
- "tw:hover:not-disabled:bg-primary/90",
785
- "tw:hover:text-primary-foreground",
786
- "tw:focus:text-primary-foreground",
787
- "tw:focus-visible:border-primary",
788
- "tw:focus-visible:ring-ring/50"
789
- ],
790
- secondary: [
791
- "tw:bg-primary/10",
792
- "tw:text-primary",
793
- "tw:hover:not-disabled:bg-primary/20",
794
- "tw:focus-visible:border-primary",
795
- "tw:focus-visible:ring-ring/50"
796
- ],
797
- // should be called "destructive" by Figma
798
- danger: [
799
- "tw:bg-destructive",
800
- "tw:text-destructive-foreground",
801
- "tw:hover:text-destructive-foreground",
802
- "tw:focus:text-destructive-foreground",
803
- "tw:focus-visible:border-destructive",
804
- "tw:focus-visible:ring-destructive/20"
805
- ],
806
- outline: [
807
- "tw:!border-input",
808
- "tw:bg-background",
809
- // Semantic base text color so the label/icon flips in dark mode
810
- // (matches `invisible`); previously unset → inherited a fixed dark color.
811
- "tw:text-foreground",
812
- // Hover follows the brand primary (translucent tint), matching the
813
- // `secondary` variant — not the fixed `accent` blue.
814
- "tw:hover:not-disabled:bg-primary/10",
815
- "tw:hover:not-disabled:text-primary",
816
- "tw:hover:active:bg-background",
817
- "tw:focus-visible:!border-primary",
818
- "tw:focus-visible:ring-ring/50"
819
- ],
820
- // should be called "ghost" by Figma
821
- invisible: [
822
- "tw:bg-transparent",
823
- "tw:text-foreground",
824
- "tw:hover:not-disabled:bg-primary/10",
825
- "tw:hover:not-disabled:text-primary",
826
- "tw:hover:not-disabled:border-primary/10",
827
- "tw:focus-visible:ring-ring/50"
828
- ],
829
- // should be called "link" by Figma
830
- inline: [
831
- "tw:bg-transparent",
832
- "tw:text-primary",
833
- "tw:hover:underline",
834
- "tw:hover:active:bg-transparent",
835
- "tw:focus-visible:ring-ring/50"
836
- ]
837
- },
838
- size: {
839
- // should be called "default" by Figma
840
- medium: ["tw:max-h-9", "tw:py-2", "tw:px-4", "tw:text-sm"],
841
- // should be called "small" by Figma
842
- small: ["tw:max-h-8", "tw:py-2", "tw:px-3", "tw:text-xs"],
843
- // should be called "large" by Figma
844
- large: ["tw:max-h-10", "tw:py-2.5", "tw:px-6", "tw:text-sm"],
845
- "icon-lg": ["tw:size-10"],
846
- icon: ["tw:size-9"],
847
- "icon-sm": ["tw:size-8"],
848
- // unsupported in ARGO, remove when old design is gone
849
- "icon-xs": [],
850
- "icon-2xs": [],
851
- "icon-3xs": []
852
- }
853
- }
854
- }
855
- );
856
- }
857
- });
858
- var Button;
859
- var init_Button = __esm({
860
- "src/components/Button/Button.tsx"() {
861
- init_icons();
862
- init_utils2();
863
- init_context();
864
- init_styles();
865
- Button = ({
866
- ref,
867
- children,
868
- disabled = false,
869
- className,
870
- type = "button",
871
- isLoading = false,
872
- asChild = false,
873
- onClick,
874
- variant = "primary",
875
- size = "medium",
876
- block = false,
877
- ...buttonProps
878
- }) => {
879
- const renderArgo = useArgoDesign();
880
- const Comp = asChild ? reactSlot.Root : "button";
881
- const isIconOnly = String(size).startsWith("icon");
882
- const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
883
- const handleClick = (event) => {
884
- const isAnchor = event.currentTarget.tagName === "A";
885
- if (isAnchor && disabled) {
886
- event.preventDefault();
887
- return;
888
- }
889
- onClick?.(event);
890
- };
891
- return /* @__PURE__ */ jsxRuntime.jsxs(
892
- Comp,
893
- {
894
- ...buttonProps,
895
- ref,
896
- disabled,
897
- "aria-disabled": disabled,
898
- "data-variant": variant,
899
- "data-icon-only": isIconOnly,
900
- type,
901
- onClick: handleClick,
902
- className: cn(classNames),
903
- children: [
904
- isLoading && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "tw:size-4 tw:shrink-0 tw:animate-spin" }),
905
- /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slottable, { children: isLoading && isIconOnly ? null : children })
906
- ]
907
- }
908
- );
909
- };
910
- }
911
- });
912
- var init_ButtonInline = __esm({
913
- "src/components/Button/ButtonInline.tsx"() {
914
- classVarianceAuthority.cva(
915
- [
916
- "tailwindcss-preflight",
917
- "tw:inline-flex",
918
- "tw:items-center",
919
- "tw:gap-2",
920
- "tw:underline-offset-2",
921
- "tw:disabled:opacity-40",
922
- "tw:disabled:cursor-not-allowed",
923
- "tw:disabled:text-neutral-500",
924
- "tw:disabled:no-underline",
925
- "tw:disabled:[&_svg]:text-neutral-400",
926
- // Default size for nested Lucide icons; callers can override on the icon.
927
- "tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4",
928
- "tw:[&_svg]:shrink-0"
929
- ],
930
- {
931
- defaultVariants: {
932
- variant: "link",
933
- color: "link"
934
- },
935
- variants: {
936
- color: {
937
- link: ["tw:text-primary", "tw:hover:text-primary/90", "tw:[&_svg]:text-primary"],
938
- dark: ["tw:text-neutral-800 tw:[&_svg]:text-neutral-400"],
939
- danger: ["tw:text-error-500 tw:[&_svg]:text-error-500"],
940
- muted: ["tw:text-muted-foreground tw:[&_svg]:text-muted-foreground"],
941
- custom: []
942
- },
943
- variant: {
944
- link: ["tw:underline", "tw:hover:no-underline"],
945
- "link-reverse": ["tw:no-underline", "", "tw:hover:underline"],
946
- custom: []
947
- }
948
- }
949
- }
950
- );
951
- }
952
- });
953
-
954
- // src/components/Button/index.ts
955
- var init_Button2 = __esm({
956
- "src/components/Button/index.ts"() {
957
- init_Button();
958
- init_ButtonInline();
959
- }
960
- });
961
- var Clipboard2;
962
- var init_Clipboard = __esm({
963
- "src/components/Clipboard/Clipboard.tsx"() {
964
- init_utils2();
965
- init_Tooltip2();
966
- Clipboard2 = ({
967
- ref,
968
- text: textProp,
969
- children,
970
- tooltip = "Copy to Clipboard",
971
- tooltipPlacement = "top",
972
- tooltipVariant: tooltipVariantProp = "action",
973
- asChild = false,
974
- onClick,
975
- className,
976
- ...restButtonProps
977
- }) => {
978
- const [isTooltipOpen, setIsTooltipOpen] = react.useState(false);
979
- const [state, setState] = react.useState("ready");
980
- const text = typeof textProp === "function" ? textProp() : textProp;
981
- const copy = async (text2) => {
982
- try {
983
- if (!document.hasFocus()) window.focus();
984
- await copyToClipboard(text2);
985
- setState("copied");
986
- } catch {
987
- setState("error");
988
- }
989
- };
990
- const handleOnClick = (event) => {
991
- setIsTooltipOpen(true);
992
- if (text && state === "ready") void copy(text);
993
- onClick?.(event);
994
- };
995
- const handleOnOpenChange = (open) => {
996
- if (!open && state !== "ready") setState("ready");
997
- setIsTooltipOpen(open);
998
- };
999
- const tooltipContent = (() => {
1000
- if (!text) return "Nothing to copy";
1001
- if (state === "error") return "Failed to copy";
1002
- if (state === "copied") return "Copied to Clipboard";
1003
- return tooltip;
1004
- })();
1005
- const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
1006
- const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
1007
- return /* @__PURE__ */ jsxRuntime.jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
1008
- /* @__PURE__ */ jsxRuntime.jsx(
1009
- Tooltip.Trigger,
1010
- {
1011
- ...restButtonProps,
1012
- asChild,
1013
- keepOpenOnClick: true,
1014
- onClick: handleOnClick,
1015
- className: cn("tw:cursor-pointer", className),
1016
- ref,
1017
- children: children ?? text
1018
- }
1019
- ),
1020
- hasTooltipContent && /* @__PURE__ */ jsxRuntime.jsx(
1021
- Tooltip.Content,
1022
- {
1023
- keepOpenOnPointerDownOutside: true,
1024
- placement: tooltipPlacement,
1025
- variant: tooltipVariant,
1026
- children: tooltipContent
1027
- }
1028
- )
1029
- ] });
1030
- };
1031
- }
1032
- });
1033
-
1034
- // src/components/Clipboard/index.ts
1035
- var init_Clipboard2 = __esm({
1036
- "src/components/Clipboard/index.ts"() {
1037
- init_Clipboard();
1038
- }
1039
- });
1040
- var DEFAULT_ICON, DEFAULT_ARIA_LABEL, ClipboardButton;
1041
- var init_ClipboardButton = __esm({
1042
- "src/blocks/ClipboardButton/ClipboardButton.tsx"() {
1043
- init_Button2();
1044
- init_Clipboard2();
1045
- init_icons();
1046
- DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, {});
1047
- DEFAULT_ARIA_LABEL = "Copy";
1048
- ClipboardButton = ({
1049
- // clipboard props
1050
- text,
1051
- tooltip,
1052
- tooltipPlacement,
1053
- tooltipVariant,
1054
- // button props
1055
- icon = DEFAULT_ICON,
1056
- variant = "outline",
1057
- children,
1058
- ...rest
1059
- }) => {
1060
- const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
1061
- const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
1062
- return /* @__PURE__ */ jsxRuntime.jsx(
1063
- Clipboard2,
1064
- {
1065
- asChild: true,
1066
- tooltip,
1067
- tooltipPlacement,
1068
- tooltipVariant,
1069
- text,
1070
- children: /* @__PURE__ */ jsxRuntime.jsxs(Button, { ...rest, "aria-label": ariaLabel, variant, disabled: !text, children: [
1071
- icon,
1072
- children
1073
- ] })
1074
- }
1075
- );
1076
- };
1077
- }
1078
- });
1079
-
1080
- // src/blocks/ClipboardButton/index.ts
1081
- var init_ClipboardButton2 = __esm({
1082
- "src/blocks/ClipboardButton/index.ts"() {
1083
- init_ClipboardButton();
1084
- }
1085
- });
1086
- var MIN_SCALE, MAX_SCALE, ZOOM_STEP, ZoomableSvg;
1087
- var init_ZoomableSvg = __esm({
1088
- "src/components/ZoomableSvg/ZoomableSvg.tsx"() {
1089
- init_ClipboardButton2();
1090
- init_icons();
1091
- init_utils2();
1092
- init_Button2();
1093
- init_Tooltip2();
1094
- MIN_SCALE = 0.5;
1095
- MAX_SCALE = 3;
1096
- ZOOM_STEP = 0.1;
1097
- ZoomableSvg = ({
1098
- html,
1099
- copyText,
1100
- className,
1101
- allowForeignObject,
1102
- renderActions
1103
- }) => {
1104
- const safeHtml = react.useMemo(
1105
- () => DOMPurify__default.default.sanitize(html, {
1106
- USE_PROFILES: { svg: true, svgFilters: true },
1107
- ...allowForeignObject ? { ADD_TAGS: ["foreignObject"] } : {}
1108
- }),
1109
- [html, allowForeignObject]
1110
- );
1111
- const containerRef = react.useRef(null);
1112
- const [scale, setScale] = react.useState(1);
1113
- const [translate, setTranslate] = react.useState({ x: 0, y: 0 });
1114
- const [isFullscreen, setIsFullscreen] = react.useState(false);
1115
- react.useEffect(() => {
1116
- if (!isFullscreen) return;
1117
- const onKeyDown = (e) => {
1118
- if (e.key === "Escape") {
1119
- e.stopPropagation();
1120
- setIsFullscreen(false);
1121
- }
1122
- };
1123
- document.addEventListener("keydown", onKeyDown, { capture: true });
1124
- return () => document.removeEventListener("keydown", onKeyDown, { capture: true });
1125
- }, [isFullscreen]);
1126
- const dragRef = react.useRef(null);
1127
- react.useEffect(() => {
1128
- const el = containerRef.current;
1129
- if (!el) return;
1130
- const onWheel = (e) => {
1131
- if (!e.ctrlKey && !e.metaKey) return;
1132
- e.preventDefault();
1133
- const delta = e.deltaY > 0 ? -ZOOM_STEP : ZOOM_STEP;
1134
- setScale((s) => Math.min(MAX_SCALE, Math.max(MIN_SCALE, s + delta)));
1135
- };
1136
- el.addEventListener("wheel", onWheel, { passive: false });
1137
- return () => el.removeEventListener("wheel", onWheel);
1138
- }, [isFullscreen]);
1139
- const didDragRef = react.useRef(false);
1140
- const handleMouseDown = react.useCallback(
1141
- (e) => {
1142
- if (e.button !== 0) return;
1143
- e.preventDefault();
1144
- didDragRef.current = false;
1145
- dragRef.current = {
1146
- startX: e.clientX,
1147
- startY: e.clientY,
1148
- startTx: translate.x,
1149
- startTy: translate.y
1150
- };
1151
- },
1152
- [translate]
1153
- );
1154
- const handleMouseMove = react.useCallback((e) => {
1155
- if (!dragRef.current) return;
1156
- didDragRef.current = true;
1157
- setTranslate({
1158
- x: dragRef.current.startTx + e.clientX - dragRef.current.startX,
1159
- y: dragRef.current.startTy + e.clientY - dragRef.current.startY
1160
- });
1161
- }, []);
1162
- const handleMouseUp = react.useCallback(() => {
1163
- dragRef.current = null;
1164
- }, []);
1165
- const handleReset = react.useCallback(() => {
1166
- setScale(1);
1167
- setTranslate({ x: 0, y: 0 });
1168
- }, []);
1169
- const isZoomed = Math.abs(scale - 1) > 1e-3 || translate.x !== 0 || translate.y !== 0;
1170
- const handleClick = react.useCallback((e) => {
1171
- if (didDragRef.current) {
1172
- e.stopPropagation();
1173
- }
1174
- }, []);
1175
- const stopPropagation = react.useCallback((e) => {
1176
- e.stopPropagation();
1177
- }, []);
1178
- const diagramContent = /* @__PURE__ */ jsxRuntime.jsxs(
1179
- "div",
1180
- {
1181
- role: "presentation",
1182
- className: cn("tw:group/zoom tw:relative", isFullscreen && "tw:h-full"),
1183
- onClick: handleClick,
1184
- children: [
1185
- /* @__PURE__ */ jsxRuntime.jsx(
1186
- "div",
1187
- {
1188
- role: "presentation",
1189
- ref: containerRef,
1190
- className: cn(
1191
- "tw:overflow-hidden tw:cursor-grab tw:active:cursor-grabbing tw:p-3",
1192
- isFullscreen && "tw:h-full"
1193
- ),
1194
- onMouseDown: handleMouseDown,
1195
- onMouseMove: handleMouseMove,
1196
- onMouseUp: handleMouseUp,
1197
- onMouseLeave: handleMouseUp,
1198
- children: /* @__PURE__ */ jsxRuntime.jsx(
1199
- "div",
1200
- {
1201
- className: cn(
1202
- "tw:flex tw:justify-center tw:origin-center",
1203
- isFullscreen && "tw:h-full tw:[&>svg]:h-full"
1204
- ),
1205
- style: { transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` },
1206
- dangerouslySetInnerHTML: { __html: safeHtml }
1207
- }
1208
- )
1209
- }
1210
- ),
1211
- /* @__PURE__ */ jsxRuntime.jsxs(
1212
- "div",
1213
- {
1214
- role: "presentation",
1215
- className: "tw:absolute tw:right-1 tw:top-1 tw:flex tw:gap-1 tw:opacity-0 tw:transition-opacity tw:focus-within:opacity-100 tw:group-hover/zoom:opacity-100",
1216
- onClick: stopPropagation,
1217
- children: [
1218
- isZoomed && /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { tooltip: "Reset zoom", placement: "top", triggerAsChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "small", variant: "outline", onClick: handleReset, children: "Reset" }) }),
1219
- copyText && /* @__PURE__ */ jsxRuntime.jsx(ClipboardButton, { text: copyText, tooltip: "Copy code", size: "icon-sm", variant: "outline" }),
1220
- renderActions?.(safeHtml),
1221
- /* @__PURE__ */ jsxRuntime.jsx(
1222
- Tooltip,
1223
- {
1224
- tooltip: isFullscreen ? "Exit fullscreen" : "Fullscreen",
1225
- placement: "top",
1226
- triggerAsChild: true,
1227
- children: /* @__PURE__ */ jsxRuntime.jsx(
1228
- Button,
1229
- {
1230
- size: "icon-sm",
1231
- variant: "outline",
1232
- "aria-label": isFullscreen ? "Exit fullscreen" : "Fullscreen",
1233
- onClick: () => setIsFullscreen((f) => !f),
1234
- children: isFullscreen ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minimize2, { className: "tw:size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize2, { className: "tw:size-4" })
1235
- }
1236
- )
1237
- }
1238
- )
1239
- ]
1240
- }
1241
- )
1242
- ]
1243
- }
1244
- );
1245
- if (isFullscreen) {
1246
- return reactDom.createPortal(
1247
- /* @__PURE__ */ jsxRuntime.jsx(
1248
- "div",
1249
- {
1250
- role: "presentation",
1251
- "data-testid": "zoomable-svg-fullscreen",
1252
- className: "tw:fixed tw:inset-0 tw:z-[1060] tw:bg-muted tw:p-4 tailwindcss-preflight",
1253
- onClick: stopPropagation,
1254
- children: diagramContent
1255
- }
1256
- ),
1257
- document.body
1258
- );
1259
- }
1260
- return /* @__PURE__ */ jsxRuntime.jsx(
1261
- "div",
1262
- {
1263
- className: cn(
1264
- "tw:overflow-hidden tw:rounded-md tw:border tw:border-border tw:bg-muted",
1265
- className
1266
- ),
1267
- children: diagramContent
1268
- }
1269
- );
1270
- };
1271
- }
1272
- });
1273
-
1274
- // src/components/ZoomableSvg/index.ts
1275
- var init_ZoomableSvg2 = __esm({
1276
- "src/components/ZoomableSvg/index.ts"() {
1277
- init_ZoomableSvg();
1278
- }
1279
- });
1280
- var DiagramSkeleton;
1281
- var init_DiagramSkeleton = __esm({
1282
- "src/blocks/MermaidDiagram/DiagramSkeleton.tsx"() {
1283
- init_Skeleton();
1284
- DiagramSkeleton = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:my-3 tw:overflow-hidden tw:rounded-md tw:border tw:border-neutral-150 tw:bg-neutral-50 tw:p-6", children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "tw:h-40" }) });
1285
- }
1286
- });
1287
-
1288
- // src/blocks/MermaidDiagram/svgTransforms.ts
1289
- var HTML_TAG, FOREIGN_OBJECT, ROOT_SVG_TAG, flattenForeignObjectLabels, STYLE_ATTR, makeResponsive;
1290
- var init_svgTransforms = __esm({
1291
- "src/blocks/MermaidDiagram/svgTransforms.ts"() {
1292
- HTML_TAG = /<[^>]+>/g;
1293
- FOREIGN_OBJECT = /(<foreignObject\b[^>]*>)([\s\S]*?)(<\/foreignObject>)/g;
1294
- ROOT_SVG_TAG = /^(\s*<svg\b)([^>]*)(>)/i;
1295
- flattenForeignObjectLabels = (svg) => svg.replace(FOREIGN_OBJECT, (_match, open, inner, close) => {
1296
- const text = inner.replace(HTML_TAG, " ").replace(/\s+/g, " ").trim();
1297
- return `${open}${text}${close}`;
1298
- });
1299
- STYLE_ATTR = /\s+style="([^"]*)"/i;
1300
- makeResponsive = (svgString) => {
1301
- const viewBoxMatch = svgString.match(/viewBox="[^"]*\s([\d.]+)\s[\d.]+"/);
1302
- const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : void 0;
1303
- return svgString.replace(ROOT_SVG_TAG, (_match, open, attrs, close) => {
1304
- const existingStyle = attrs.match(STYLE_ATTR)?.[1] ?? "";
1305
- const styleDecls = existingStyle.replace(/max-width:\s*[^;"]*;?\s*/gi, "").replace(/\s+/g, " ").trim().replace(/;$/, "");
1306
- let nextAttrs = attrs.replace(/\s+width="[^"]*"/i, "").replace(/\s+height="[^"]*"/i, "").replace(STYLE_ATTR, "");
1307
- nextAttrs += ' width="100%"';
1308
- const styleParts = [styleDecls, vbWidth ? `max-width: ${vbWidth}px` : ""].filter(Boolean).join("; ");
1309
- if (styleParts) nextAttrs += ` style="${styleParts}"`;
1310
- return `${open}${nextAttrs}${close}`;
1311
- });
1312
- };
1313
- }
1314
- });
1315
-
1316
- // src/blocks/MermaidDiagram/MermaidDiagram.tsx
1317
- var MermaidDiagram_exports = {};
1318
- __export(MermaidDiagram_exports, {
1319
- MermaidDiagram: () => MermaidDiagram
1320
- });
1321
- var PRIMARY_FALLBACK_CHANNELS, resolvePrimary, mermaidPromise, registerLucideIconPack, getMermaid, stripFontImports, hasIconSyntax, tryFastRender, RENDER_DEBOUNCE_MS, svgCache, resolveSyncSvg, MermaidDiagram;
1322
- var init_MermaidDiagram = __esm({
1323
- "src/blocks/MermaidDiagram/MermaidDiagram.tsx"() {
1324
- init_ZoomableSvg2();
1325
- init_utils2();
1326
- init_DiagramSkeleton();
1327
- init_svgTransforms();
1328
- PRIMARY_FALLBACK_CHANNELS = "31 143 255";
1329
- resolvePrimary = () => {
1330
- const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--primary").trim() || PRIMARY_FALLBACK_CHANNELS;
1331
- return `rgb(${channels})`;
1332
- };
1333
- mermaidPromise = null;
1334
- registerLucideIconPack = (m) => {
1335
- m.registerIconPacks([
1336
- {
1337
- name: "lucide",
1338
- loader: () => import('@iconify-json/lucide/icons.json').then((mod) => mod.default)
1339
- }
1340
- ]);
1341
- };
1342
- getMermaid = () => {
1343
- if (!mermaidPromise) {
1344
- mermaidPromise = import('mermaid').then((m) => {
1345
- registerLucideIconPack(m.default);
1346
- m.default.initialize({
1347
- startOnLoad: false,
1348
- securityLevel: "strict",
1349
- theme: "base",
1350
- themeVariables: {
1351
- primaryColor: colors__default.default.blue[100],
1352
- primaryTextColor: colors__default.default.neutral[800],
1353
- primaryBorderColor: colors__default.default.blue[700],
1354
- secondaryColor: colors__default.default.white,
1355
- secondaryTextColor: colors__default.default.neutral[800],
1356
- secondaryBorderColor: colors__default.default.neutral[150],
1357
- tertiaryColor: colors__default.default.warning[100],
1358
- tertiaryTextColor: colors__default.default.neutral[800],
1359
- tertiaryBorderColor: colors__default.default.warning[500],
1360
- lineColor: colors__default.default.neutral[300],
1361
- textColor: colors__default.default.neutral[800],
1362
- mainBkg: colors__default.default.blue[100],
1363
- nodeBorder: colors__default.default.blue[700],
1364
- clusterBkg: colors__default.default.white,
1365
- clusterBorder: colors__default.default.neutral[150],
1366
- titleColor: colors__default.default.neutral[800],
1367
- edgeLabelBackground: colors__default.default.white,
1368
- nodeTextColor: colors__default.default.neutral[800],
1369
- actorBorder: colors__default.default.blue[700],
1370
- actorBkg: colors__default.default.blue[100],
1371
- actorTextColor: colors__default.default.neutral[800],
1372
- actorLineColor: colors__default.default.neutral[300],
1373
- signalColor: colors__default.default.neutral[800],
1374
- signalTextColor: colors__default.default.neutral[800],
1375
- labelBoxBkgColor: colors__default.default.blue[100],
1376
- labelBoxBorderColor: colors__default.default.blue[700],
1377
- labelTextColor: colors__default.default.neutral[800],
1378
- loopTextColor: colors__default.default.neutral[800],
1379
- noteBorderColor: colors__default.default.warning[500],
1380
- noteBkgColor: colors__default.default.warning[100],
1381
- noteTextColor: colors__default.default.neutral[800],
1382
- sectionBkgColor: colors__default.default.blue[100],
1383
- altSectionBkgColor: colors__default.default.white,
1384
- sectionBkgColor2: colors__default.default.neutral[100],
1385
- taskBorderColor: colors__default.default.blue[700],
1386
- taskBkgColor: colors__default.default.blue[100],
1387
- taskTextColor: colors__default.default.neutral[800],
1388
- taskTextDarkColor: colors__default.default.neutral[800],
1389
- taskTextLightColor: colors__default.default.neutral[800],
1390
- activeTaskBorderColor: resolvePrimary(),
1391
- activeTaskBkgColor: colors__default.default.blue[200],
1392
- doneTaskBorderColor: colors__default.default.green[600],
1393
- doneTaskBkgColor: colors__default.default.green[100],
1394
- critBorderColor: colors__default.default.error[500],
1395
- critBkgColor: colors__default.default.error[100],
1396
- fontFamily: "Inter, system-ui, sans-serif",
1397
- fontSize: "14px"
1398
- }
1399
- });
1400
- return m;
1401
- }).catch((err) => {
1402
- mermaidPromise = null;
1403
- throw err;
1404
- });
1405
- }
1406
- return mermaidPromise;
1407
- };
1408
- stripFontImports = (svg) => svg.replace(/@import\s+url\([^)]*fonts\.googleapis\.com[^)]*\);?\s*/g, "");
1409
- hasIconSyntax = (code) => /@\{[^}]*\bicon\s*:/.test(code) || /\b(?:icon|service|group)\b[^\n(]*\(\s*[\w-]+:/.test(code) || /\bfa[bslr]?:fa-/.test(code);
1410
- tryFastRender = (code) => {
1411
- if (hasIconSyntax(code)) return null;
1412
- try {
1413
- return stripFontImports(
1414
- beautifulMermaid.renderMermaidSVG(code, {
1415
- bg: colors__default.default.white,
1416
- fg: colors__default.default.neutral[800],
1417
- transparent: true,
1418
- font: "Inter, system-ui, sans-serif"
1419
- })
1420
- );
1421
- } catch (err) {
1422
- console.debug("[MermaidDiagram] fast render unavailable, using async fallback:", err);
1423
- return null;
1424
- }
1425
- };
1426
- RENDER_DEBOUNCE_MS = 300;
1427
- svgCache = /* @__PURE__ */ new Map();
1428
- resolveSyncSvg = (code) => {
1429
- const cached = svgCache.get(code);
1430
- if (cached) return cached;
1431
- const fast = tryFastRender(code);
1432
- if (fast) svgCache.set(code, fast);
1433
- return fast;
1434
- };
1435
- MermaidDiagram = ({ code, renderActions }) => {
1436
- const id = react.useId();
1437
- const [svg, setSvg] = react.useState(() => resolveSyncSvg(code));
1438
- const [renderFailed, setRenderFailed] = react.useState(false);
1439
- const debounceRef = react.useRef(null);
1440
- const renderIdRef = react.useRef(0);
1441
- const [prevCode, setPrevCode] = react.useState(code);
1442
- if (code !== prevCode) {
1443
- setPrevCode(code);
1444
- setSvg(resolveSyncSvg(code));
1445
- setRenderFailed(false);
1446
- }
1447
- react.useEffect(() => {
1448
- if (svgCache.has(code)) return;
1449
- const currentRenderId = ++renderIdRef.current;
1450
- if (debounceRef.current) {
1451
- clearTimeout(debounceRef.current);
1452
- }
1453
- debounceRef.current = setTimeout(() => {
1454
- getMermaid().then(async (mermaidModule) => {
1455
- if (renderIdRef.current !== currentRenderId) return;
1456
- const rendererId = `mermaid-${id.replaceAll(":", "")}`;
1457
- const container = document.createElement("div");
1458
- container.style.visibility = "hidden";
1459
- container.style.position = "absolute";
1460
- container.style.top = "-9999px";
1461
- container.style.width = "900px";
1462
- document.body.appendChild(container);
1463
- try {
1464
- const result = await mermaidModule.default.render(rendererId, code, container);
1465
- if (renderIdRef.current === currentRenderId && result) {
1466
- const svgOutput = flattenForeignObjectLabels(result.svg);
1467
- svgCache.set(code, svgOutput);
1468
- setSvg(svgOutput);
1469
- setRenderFailed(false);
1470
- }
1471
- } finally {
1472
- container.remove();
1473
- }
1474
- }).catch((err) => {
1475
- if (renderIdRef.current === currentRenderId) {
1476
- console.error("[MermaidDiagram] fallback failed:", err);
1477
- setSvg(null);
1478
- setRenderFailed(true);
1479
- }
1480
- });
1481
- }, RENDER_DEBOUNCE_MS);
1482
- const timer = debounceRef.current;
1483
- const renderId = renderIdRef;
1484
- return () => {
1485
- renderId.current++;
1486
- if (timer) {
1487
- clearTimeout(timer);
1488
- }
1489
- };
1490
- }, [code, id]);
1491
- const processedSvg = svg ? makeResponsive(svg) : null;
1492
- if (renderFailed) {
1493
- return /* @__PURE__ */ jsxRuntime.jsx(
1494
- "pre",
1495
- {
1496
- className: cn(
1497
- "tw:my-3 tw:overflow-auto tw:whitespace-pre-wrap tw:break-all",
1498
- "tw:py-3 tw:px-4",
1499
- "tw:bg-neutral-50",
1500
- "tw:rounded-md tw:text-neutral-400",
1501
- "tw:text-sm tw:font-mono"
1502
- ),
1503
- children: /* @__PURE__ */ jsxRuntime.jsx("code", { children: code })
1504
- }
1505
- );
1506
- }
1507
- if (processedSvg) {
1508
- return /* @__PURE__ */ jsxRuntime.jsx(
1509
- ZoomableSvg,
1510
- {
1511
- html: processedSvg,
1512
- copyText: `\`\`\`mermaid
1513
- ${code}
1514
- \`\`\``,
1515
- className: "tw:my-3",
1516
- allowForeignObject: true,
1517
- renderActions
1518
- },
1519
- code
1520
- );
1521
- }
1522
- return /* @__PURE__ */ jsxRuntime.jsx(DiagramSkeleton, {});
1523
- };
1524
- }
1525
- });
1526
-
1527
- // src/blocks/MarkdownEditor/MarkdownEditor.tsx
1528
- init_utils2();
1529
- var ImageRendererContext = react.createContext(null);
1530
- var ImageRendererProvider = ImageRendererContext;
1531
- var useImageRenderer = () => react.use(ImageRendererContext);
1532
- var isPlaceholder = (src) => src.startsWith("upload-placeholder-");
1533
- var ImageNodeComponent = ({ src, alt }) => {
1534
- const renderer = useImageRenderer();
1535
- if (isPlaceholder(src)) {
1536
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tw:inline-flex tw:items-center tw:gap-1 tw:rounded tw:bg-neutral-100 tw:px-2 tw:py-1 tw:text-xs tw:text-neutral-400", children: "Uploading image\u2026" });
1537
- }
1538
- if (renderer) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderer({ src, alt }) });
1539
- return /* @__PURE__ */ jsxRuntime.jsx("img", { src, alt });
1540
- };
1541
- var ImageNode = class _ImageNode extends lexical.DecoratorNode {
1542
- __src;
1543
- __altText;
1544
- static getType() {
1545
- return "image";
1546
- }
1547
- static clone(node) {
1548
- return new _ImageNode(node.__src, node.__altText, node.__key);
1549
- }
1550
- constructor(src, altText, key) {
1551
- super(key);
1552
- this.__src = src;
1553
- this.__altText = altText;
1554
- }
1555
- getSrc() {
1556
- return this.__src;
1557
- }
1558
- getAlt() {
1559
- return this.__altText;
1560
- }
1561
- setSrc(src) {
1562
- const writable = this.getWritable();
1563
- writable.__src = src;
1564
- }
1565
- setAlt(altText) {
1566
- const writable = this.getWritable();
1567
- writable.__altText = altText;
1568
- }
1569
- createDOM(config) {
1570
- const span = document.createElement("span");
1571
- const className = config.theme.image;
1572
- if (typeof className === "string") {
1573
- span.className = className;
1574
- }
1575
- return span;
1576
- }
1577
- updateDOM() {
1578
- return false;
1579
- }
1580
- decorate() {
1581
- return /* @__PURE__ */ jsxRuntime.jsx(ImageNodeComponent, { src: this.__src, alt: this.__altText });
1582
- }
1583
- isInline() {
1584
- return true;
1585
- }
1586
- static importJSON(serializedNode) {
1587
- return $createImageNode(serializedNode.src, serializedNode.altText);
1588
- }
1589
- exportJSON() {
1590
- return {
1591
- type: "image",
1592
- version: 1,
1593
- src: this.__src,
1594
- altText: this.__altText
1595
- };
1596
- }
1597
- exportDOM() {
1598
- const element = document.createElement("img");
1599
- element.setAttribute("src", this.__src);
1600
- element.setAttribute("alt", this.__altText);
1601
- return { element };
1602
- }
1603
- static importDOM() {
1604
- return {
1605
- img: () => ({
1606
- conversion: (domNode) => {
1607
- const src = domNode.getAttribute("src") || "";
1608
- const alt = domNode.getAttribute("alt") || "";
1609
- return { node: $createImageNode(src, alt) };
1610
- },
1611
- priority: 0
1612
- })
1613
- };
1614
- }
1615
- };
1616
- var $createImageNode = (src, altText) => {
1617
- return new ImageNode(src, altText);
1618
- };
1619
- var $isImageNode = (node) => {
1620
- return node instanceof ImageNode;
1621
- };
1622
-
1623
- // src/blocks/MarkdownEditor/nodes/MermaidNodeComponent.tsx
1624
- init_Skeleton();
1625
- var MermaidDiagram2 = react.lazy(
1626
- () => Promise.resolve().then(() => (init_MermaidDiagram(), MermaidDiagram_exports)).then(
1627
- (m) => ({ default: m.MermaidDiagram }),
1628
- (error) => {
1629
- console.error("[MarkdownEditor] failed to load MermaidDiagram chunk", error);
1630
- return {
1631
- default: ({ code }) => /* @__PURE__ */ jsxRuntime.jsx("pre", { children: /* @__PURE__ */ jsxRuntime.jsx("code", { children: code }) })
1632
- };
1633
- }
1634
- )
1635
- );
1636
- var MermaidNodeComponent = ({ code }) => {
1637
- return /* @__PURE__ */ jsxRuntime.jsx(
1638
- react.Suspense,
1639
- {
1640
- fallback: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:my-3 tw:overflow-hidden tw:rounded-card tw:border tw:border-neutral-150 tw:bg-neutral-50 tw:p-6", children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "tw:h-40" }) }),
1641
- children: /* @__PURE__ */ jsxRuntime.jsx(MermaidDiagram2, { code })
1642
- }
1643
- );
1644
- };
1645
- var MermaidNode = class _MermaidNode extends lexical.DecoratorNode {
1646
- __code;
1647
- static getType() {
1648
- return "mermaid";
1649
- }
1650
- static clone(node) {
1651
- return new _MermaidNode(node.__code, node.__key);
1652
- }
1653
- constructor(code, key) {
1654
- super(key);
1655
- this.__code = code;
1656
- }
1657
- getCode() {
1658
- return this.__code;
1659
- }
1660
- setCode(code) {
1661
- const writable = this.getWritable();
1662
- writable.__code = code;
1663
- }
1664
- createDOM() {
1665
- const div = document.createElement("div");
1666
- div.setAttribute("data-lexical-mermaid", "true");
1667
- return div;
1668
- }
1669
- updateDOM() {
1670
- return false;
1671
- }
1672
- decorate() {
1673
- return /* @__PURE__ */ jsxRuntime.jsx(MermaidNodeComponent, { code: this.__code });
1674
- }
1675
- isInline() {
1676
- return false;
1677
- }
1678
- static importJSON(serializedNode) {
1679
- return $createMermaidNode(serializedNode.code);
1680
- }
1681
- exportJSON() {
1682
- return {
1683
- type: "mermaid",
1684
- version: 1,
1685
- code: this.__code
1686
- };
1687
- }
1688
- };
1689
- var $createMermaidNode = (code) => {
1690
- return new MermaidNode(code);
1691
- };
1692
- var $isMermaidNode = (node) => {
1693
- return node instanceof MermaidNode;
1694
- };
1695
-
1696
- // src/components/Toast/toast.tsx
1697
- init_utils2();
1698
-
1699
- // src/components/Toast/ToastRoot.tsx
1700
- init_icons();
1701
- init_utils2();
1702
- init_context();
1703
-
1704
- // src/components/Toast/ToastAction.tsx
1705
- init_utils2();
1706
- var ToastAction = ({ ref, className, ...rest }) => /* @__PURE__ */ jsxRuntime.jsx(
1707
- "button",
1708
- {
1709
- ...rest,
1710
- ref,
1711
- "data-slot": "toast-action",
1712
- type: "button",
1713
- className: cn(
1714
- // layout
1715
- "tw:col-start-3",
1716
- "tw:row-start-1",
1717
- "tw:flex",
1718
- "tw:items-center",
1719
- "tw:justify-center",
1720
- // font
1721
- "tw:text-xs",
1722
- "tw:font-medium",
1723
- "tw:text-primary",
1724
- // sizing
1725
- "tw:px-2",
1726
- "tw:h-6",
1727
- // styles
1728
- "tw:bg-primary-foreground",
1729
- "tw:rounded",
1730
- className
1731
- )
1732
- }
1733
- );
1734
-
1735
- // src/components/Toast/ToastDescription.tsx
1736
- init_utils2();
1737
- var ToastDescription = ({ ref, className, children, ...rest }) => /* @__PURE__ */ jsxRuntime.jsx(
1738
- "div",
1739
- {
1740
- ref,
1741
- "data-slot": "toast-description",
1742
- className: cn(
1743
- "tw:col-start-2",
1744
- "tw:font-normal",
1745
- "tw:break-words",
1746
- "tw:text-white",
1747
- "tw:group-data-[variant=default]/toast:text-muted-foreground",
1748
- className
1749
- ),
1750
- ...rest,
1751
- children
1752
- }
1753
- );
1754
-
1755
- // src/components/Toast/ToastDismiss.tsx
1756
- init_icons();
1757
- init_utils2();
1758
- var ToastDismiss = ({ ref, className, ...rest }) => /* @__PURE__ */ jsxRuntime.jsxs(
1759
- "button",
1760
- {
1761
- ref,
1762
- "data-slot": "toast-dismiss",
1763
- className: cn(
1764
- "tw:flex",
1765
- "tw:justify-center",
1766
- "tw:col-start-4",
1767
- "tw:row-start-1",
1768
- "tailwindcss-preflight",
1769
- "tw:[&_svg]:aspect-square",
1770
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4',
1771
- "tw:[&_svg]:m-1",
1772
- "tw:text-white",
1773
- "tw:group-data-[variant=default]/toast:[&_svg]:text-popover-foreground",
1774
- "tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:[&_svg]:text-foreground",
1775
- className
1776
- ),
1777
- type: "button",
1778
- ...rest,
1779
- children: [
1780
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, {}),
1781
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tw:sr-only", children: "Dismiss" })
1782
- ]
1783
- }
1784
- );
1785
-
1786
- // src/components/Toast/ToastDuration.tsx
1787
- init_utils2();
1788
- var ToastDuration = ({ ref, duration, className, style, ...rest }) => /* @__PURE__ */ jsxRuntime.jsx(
1789
- "span",
1790
- {
1791
- ...rest,
1792
- ref,
1793
- className: cn(
1794
- "tw:bg-white/30",
1795
- "tw:group-data-[variant=default]/toast:bg-popover-foreground/20",
1796
- "tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:bg-foreground/20",
1797
- "tw:rounded-bl-lg",
1798
- "tw:mx-px",
1799
- // positioning
1800
- "tw:absolute",
1801
- "tw:bottom-0",
1802
- "tw:left-0",
1803
- // sizing
1804
- "tw:h-1",
1805
- // animation
1806
- "tw:animate-toast-progress",
1807
- "tw:group-hover/toast:[animation-play-state:paused]",
1808
- className
1809
- ),
1810
- style: {
1811
- animationDuration: `${duration}ms`,
1812
- ...style
1813
- }
1814
- }
1815
- );
1816
-
1817
- // src/components/Toast/ToastTitle.tsx
1818
- init_utils2();
1819
- var ToastTitle = ({ ref, className, children, ...rest }) => /* @__PURE__ */ jsxRuntime.jsx(
1820
- "div",
1821
- {
1822
- ref,
1823
- "data-slot": "toast-title",
1824
- className: cn(
1825
- "tw:col-start-2",
1826
- "tw:text-sm",
1827
- "tw:leading-6",
1828
- "tw:min-h-6",
1829
- "tw:self-center",
1830
- "tw:text-white",
1831
- "tw:group-data-[variant=default]/toast:text-popover-foreground",
1832
- "tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:text-foreground",
1833
- "tw:break-words",
1834
- "tw:font-medium",
1835
- className
1836
- ),
1837
- ...rest,
1838
- children
1839
- }
1840
- );
1841
- var variants2 = classVarianceAuthority.cva(
1842
- [
1843
- "tailwindcss-preflight",
1844
- "tw:group/toast",
1845
- "tw:relative",
1846
- // layout
1847
- "tw:grid",
1848
- "tw:grid-cols-[0_1fr_auto_auto]",
1849
- "tw:items-start",
1850
- "tw:has-[[data-slot=toast-description]]:grid-rows-[auto_auto]",
1851
- "tw:has-[[data-slot=toast-icon]]:grid-cols-[auto_1fr_auto_auto]",
1852
- "tw:[&_[data-slot=toast-icon]]:mr-2",
1853
- "tw:[&_[data-slot=toast-title]]:mr-2.5",
1854
- "tw:[&_[data-slot=toast-description]]:mr-2.5",
1855
- "tw:[&_[data-slot=toast-action]]:mr-2",
1856
- "tw:[&_[data-slot=toast-description]]:col-end-3",
1857
- "tw:gap-y-0",
1858
- // styles
1859
- "tw:p-4",
1860
- "tw:rounded-lg",
1861
- "tw:shadow-md"
1862
- ],
1863
- {
1864
- defaultVariants: {
1865
- variant: "info"
1866
- },
1867
- variants: {
1868
- variant: {
1869
- default: "tw:border tw:border-border tw:bg-popover",
1870
- error: "tw:bg-error-550",
1871
- info: "tw:bg-blue-600",
1872
- success: "tw:bg-green-700",
1873
- warning: "tw:bg-warning-550"
1874
- }
1875
- }
1876
- }
1877
- );
1878
- var DEFAULT_VARIANT_ICON = {
1879
- error: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, {}),
1880
- info: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, {}),
1881
- success: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CircleCheck, {}),
1882
- warning: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircle, {})
1883
- };
1884
- var ToastRoot = ({
1885
- id,
1886
- title,
1887
- description,
1888
- action,
1889
- duration = Infinity,
1890
- variant = "info",
1891
- loading = false,
1892
- icon: iconProp
1893
- }) => {
1894
- const renderArgo = useArgoDesign();
1895
- const icon = (() => {
1896
- if (loading) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "tw:animate-spin" });
1897
- if (iconProp) return iconProp;
1898
- if (variant === "default" || variant === null) return null;
1899
- return DEFAULT_VARIANT_ICON[variant];
1900
- })();
1901
- const handleActionClick = (event) => {
1902
- sonner.toast.dismiss(id);
1903
- action?.onClick(event);
1904
- };
1905
- return /* @__PURE__ */ jsxRuntime.jsxs(
1906
- "div",
1907
- {
1908
- "data-variant": variant,
1909
- "data-argo": renderArgo,
1910
- className: cn(
1911
- variants2({ variant }),
1912
- "tw:data-[variant=default]:data-[argo=true]:bg-background"
1913
- ),
1914
- children: [
1915
- icon && /* @__PURE__ */ jsxRuntime.jsx(
1916
- "span",
1917
- {
1918
- "data-slot": "toast-icon",
1919
- className: cn(
1920
- "tw:inline-flex",
1921
- "tw:items-center",
1922
- "tw:justify-center",
1923
- "tw:self-center",
1924
- "tw:aspect-square",
1925
- "tw:size-5",
1926
- "tw:shrink-0",
1927
- 'tw:[&_svg:not([class*="tw:size-"])]:size-5',
1928
- "tw:text-white",
1929
- "tw:group-data-[variant=default]/toast:text-popover-foreground",
1930
- "tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:text-foreground"
1931
- ),
1932
- children: icon
1933
- }
1934
- ),
1935
- /* @__PURE__ */ jsxRuntime.jsx(ToastTitle, { children: title }),
1936
- description && /* @__PURE__ */ jsxRuntime.jsx(ToastDescription, { children: description }),
1937
- action && /* @__PURE__ */ jsxRuntime.jsx(ToastAction, { style: action?.actionButtonStyle, onClick: handleActionClick, children: action.label }),
1938
- /* @__PURE__ */ jsxRuntime.jsx(ToastDismiss, { onClick: () => sonner.toast.dismiss(id) }),
1939
- duration !== Infinity && /* @__PURE__ */ jsxRuntime.jsx(ToastDuration, { duration })
1940
- ]
1941
- }
1942
- );
1943
- };
1944
- var toast = ({
1945
- onAutoClose,
1946
- onDismiss,
1947
- testId,
1948
- toasterId,
1949
- dismissible = true,
1950
- position,
1951
- title: titleProp,
1952
- ...toast2
1953
- }) => {
1954
- const duration = (() => {
1955
- if (typeof toast2.duration === "number") return toast2.duration;
1956
- if (toast2.variant === "error" || toast2.variant === "warning") return Infinity;
1957
- return toast2.duration ?? 5e3;
1958
- })();
1959
- const renderCustomToast = (id) => {
1960
- const title = typeof titleProp === "function" ? titleProp({ dismiss: () => sonner.toast.dismiss(id) }) : titleProp;
1961
- return /* @__PURE__ */ jsxRuntime.jsx(ToastRoot, { ...toast2, id, title, duration });
1962
- };
1963
- return sonner.toast.custom(renderCustomToast, {
1964
- // toast generated by sonner will always have an id, but we want to allow users to specify their own id if they want to
1965
- // can not pass undefined, as it will break dismiss
1966
- ...toast2.id != null ? { id: toast2.id } : {},
1967
- unstyled: true,
1968
- position,
1969
- onAutoClose,
1970
- onDismiss,
1971
- testId,
1972
- toasterId,
1973
- dismissible,
1974
- duration,
1975
- // override default focus-visible styles to match our design
1976
- className: cn("tw:rounded-lg", "tw:focus-visible:!ring-4", "tw:focus-visible:!ring-ring/50")
1977
- });
1978
- };
1979
- toast.success = (title, options) => toast({
1980
- ...options,
1981
- title,
1982
- variant: "success"
1983
- });
1984
- toast.error = (title, options) => toast({
1985
- ...options,
1986
- title,
1987
- variant: "error",
1988
- duration: options?.duration ?? Infinity
1989
- });
1990
- toast.warning = (title, options) => toast({
1991
- ...options,
1992
- title,
1993
- variant: "warning",
1994
- duration: options?.duration ?? Infinity
1995
- });
1996
- toast.info = (title, options) => toast({
1997
- ...options,
1998
- title,
1999
- variant: "info"
2000
- });
2001
- toast.dismiss = (toastId) => sonner.toast.dismiss(toastId);
2002
- toast.dismissAll = () => sonner.toast.dismiss();
2003
-
2004
- // src/blocks/MarkdownEditor/plugins/ImagePastePlugin.tsx
2005
- var ACCEPTED_IMAGE_TYPES = [
2006
- "image/png",
2007
- "image/jpeg",
2008
- "image/gif",
2009
- "image/webp",
2010
- "image/svg+xml"
2011
- ];
2012
- var MAX_IMAGE_SIZE = 10 * 1024 * 1024;
2013
- var PLACEHOLDER_PREFIX = "upload-placeholder-";
2014
- var generatePlaceholderId = () => {
2015
- if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
2016
- return crypto.randomUUID();
2017
- }
2018
- return `${Date.now()}-${Math.random().toString(36).slice(2)}`;
2019
- };
2020
- var isAcceptedImageType = (type) => ACCEPTED_IMAGE_TYPES.includes(type);
2021
- var getImageFilesFromDataTransfer = (dataTransfer) => {
2022
- if (!dataTransfer) return [];
2023
- if (dataTransfer.items.length > 0) {
2024
- const files = [];
2025
- for (const item of dataTransfer.items) {
2026
- if (item.kind === "file" && isAcceptedImageType(item.type)) {
2027
- const file = item.getAsFile();
2028
- if (file) files.push(file);
2029
- }
2030
- }
2031
- if (files.length > 0) return files;
2032
- }
2033
- return Array.from(dataTransfer.files).filter((file) => isAcceptedImageType(file.type));
2034
- };
2035
- var escapeMarkdownAlt = (text) => text.replace(/[[\]()]/g, "");
2036
- var ImagePastePlugin = ({ onImageUpload }) => {
2037
- const [editor] = LexicalComposerContext.useLexicalComposerContext();
2038
- const onImageUploadRef = react.useRef(onImageUpload);
2039
- onImageUploadRef.current = onImageUpload;
2040
- react.useEffect(() => {
2041
- const uploadFile = (file) => {
2042
- const upload = onImageUploadRef.current;
2043
- if (!upload) return;
2044
- if (file.size > MAX_IMAGE_SIZE) {
2045
- toast.error(`Image "${file.name}" is too large. Maximum size is 10 MB.`);
2046
- return;
2047
- }
2048
- let nodeKey = null;
2049
- editor.update(() => {
2050
- const placeholderNode = $createImageNode(
2051
- `${PLACEHOLDER_PREFIX}${generatePlaceholderId()}`,
2052
- "Uploading image\u2026"
2053
- );
2054
- lexical.$insertNodes([placeholderNode]);
2055
- nodeKey = placeholderNode.getKey();
2056
- });
2057
- if (!nodeKey) return;
2058
- const capturedKey = nodeKey;
2059
- upload(file).then(({ url }) => {
2060
- editor.update(() => {
2061
- const node = lexical.$getNodeByKey(capturedKey);
2062
- if ($isImageNode(node)) {
2063
- const altText = escapeMarkdownAlt(file.name.replace(/\.[^.]+$/, "") || "image");
2064
- node.setSrc(url);
2065
- node.setAlt(altText);
2066
- }
2067
- });
2068
- }).catch((error) => {
2069
- console.error("[MarkdownEditor] image upload failed", error);
2070
- toast.error(`Failed to upload "${file.name}". Please try again.`);
2071
- editor.update(() => {
2072
- const node = lexical.$getNodeByKey(capturedKey);
2073
- if (node) node.remove();
2074
- });
2075
- });
2076
- };
2077
- const removePaste = editor.registerCommand(
2078
- lexical.PASTE_COMMAND,
2079
- (event) => {
2080
- if (!onImageUploadRef.current) return false;
2081
- if (!(event instanceof ClipboardEvent)) return false;
2082
- const files = getImageFilesFromDataTransfer(event.clipboardData);
2083
- if (files.length === 0) return false;
2084
- event.preventDefault();
2085
- Promise.resolve().then(() => files.forEach(uploadFile));
2086
- return true;
2087
- },
2088
- lexical.COMMAND_PRIORITY_CRITICAL
2089
- );
2090
- const removeDrop = editor.registerCommand(
2091
- lexical.DROP_COMMAND,
2092
- (event) => {
2093
- if (!onImageUploadRef.current) return false;
2094
- const files = getImageFilesFromDataTransfer(event.dataTransfer);
2095
- if (files.length === 0) return false;
2096
- event.preventDefault();
2097
- Promise.resolve().then(() => files.forEach(uploadFile));
2098
- return true;
2099
- },
2100
- lexical.COMMAND_PRIORITY_CRITICAL
2101
- );
2102
- return () => {
2103
- removePaste();
2104
- removeDrop();
2105
- };
2106
- }, [editor]);
2107
- return null;
2108
- };
2109
- var KeyboardPlugin = ({
2110
- onSave,
2111
- onCancel,
2112
- singleLine,
2113
- blurOnEscape,
2114
- skipBlurSaveRef
2115
- }) => {
2116
- const [editor] = LexicalComposerContext.useLexicalComposerContext();
2117
- const onSaveRef = react.useRef(onSave);
2118
- onSaveRef.current = onSave;
2119
- const onCancelRef = react.useRef(onCancel);
2120
- onCancelRef.current = onCancel;
2121
- const singleLineRef = react.useRef(singleLine);
2122
- singleLineRef.current = singleLine;
2123
- const blurOnEscapeRef = react.useRef(blurOnEscape);
2124
- blurOnEscapeRef.current = blurOnEscape;
2125
- const skipBlurSaveExternalRef = skipBlurSaveRef;
2126
- react.useEffect(() => {
2127
- return editor.registerCommand(
2128
- lexical.KEY_DOWN_COMMAND,
2129
- (event) => {
2130
- if (event.key === "Enter" && (event.ctrlKey || event.metaKey)) {
2131
- event.preventDefault();
2132
- onSaveRef.current?.();
2133
- return true;
2134
- }
2135
- if (event.key === "Enter" && !event.shiftKey && !event.altKey && singleLineRef.current) {
2136
- event.preventDefault();
2137
- editor.getRootElement()?.blur();
2138
- return true;
2139
- }
2140
- if (event.key === "Escape" && blurOnEscapeRef.current) {
2141
- if (skipBlurSaveExternalRef) skipBlurSaveExternalRef.current = true;
2142
- onCancelRef.current?.();
2143
- editor.getRootElement()?.blur();
2144
- return true;
2145
- }
2146
- return false;
2147
- },
2148
- lexical.COMMAND_PRIORITY_HIGH
2149
- );
2150
- }, [editor, skipBlurSaveExternalRef]);
2151
- return null;
2152
- };
2153
- var IMAGE = {
2154
- dependencies: [ImageNode],
2155
- export: (node) => {
2156
- if (!$isImageNode(node)) return null;
2157
- return `![${node.getAlt()}](${node.getSrc()})`;
2158
- },
2159
- importRegExp: /!\[([^\]]*)\]\(([^)]+)\)/,
2160
- regExp: /!\[([^\]]*)\]\(([^)]+)\)$/,
2161
- replace: (textNode, match) => {
2162
- const [, alt = "", src = ""] = match;
2163
- const imageNode = $createImageNode(src, alt);
2164
- textNode.replace(imageNode);
2165
- },
2166
- trigger: ")",
2167
- type: "text-match"
2168
- };
2169
- var HORIZONTAL_RULE = {
2170
- dependencies: [LexicalHorizontalRuleNode.HorizontalRuleNode],
2171
- export: (node) => {
2172
- return LexicalHorizontalRuleNode.$isHorizontalRuleNode(node) ? "---" : null;
2173
- },
2174
- regExp: /^(---|\*\*\*|___)$/,
2175
- replace: (parentNode) => {
2176
- const node = LexicalHorizontalRuleNode.$createHorizontalRuleNode();
2177
- parentNode.replace(node);
2178
- },
2179
- type: "element"
2180
- };
2181
- var MERMAID = {
2182
- dependencies: [MermaidNode],
2183
- export: (node) => {
2184
- if (!$isMermaidNode(node)) return null;
2185
- return "```mermaid\n" + node.getCode() + "\n```";
2186
- },
2187
- regExpStart: /^[ \t]*(`{3,})mermaid(?:\s.*)?$/,
2188
- regExpEnd: {
2189
- optional: true,
2190
- regExp: /^[ \t]*`{3,}$/
2191
- },
2192
- replace: (rootNode, _children, _startMatch, _endMatch, linesInBetween) => {
2193
- if (!linesInBetween) return;
2194
- const code = linesInBetween.join("\n").trim();
2195
- if (code) {
2196
- rootNode.append($createMermaidNode(code));
2197
- }
2198
- },
2199
- handleImportAfterStartMatch: ({
2200
- lines,
2201
- rootNode,
2202
- startLineIndex,
2203
- startMatch
2204
- }) => {
2205
- const fence = startMatch[1];
2206
- if (!fence) return [false, startLineIndex];
2207
- const fenceLength = fence.trim().length;
2208
- const endRegex = new RegExp(`^[ \\t]*\`{${fenceLength},}$`);
2209
- for (let i = startLineIndex + 1; i < lines.length; i++) {
2210
- if (endRegex.test(lines[i] ?? "")) {
2211
- const code2 = lines.slice(startLineIndex + 1, i).join("\n").trim();
2212
- if (code2) {
2213
- rootNode.append($createMermaidNode(code2));
2214
- }
2215
- return [true, i];
2216
- }
2217
- }
2218
- const code = lines.slice(startLineIndex + 1).join("\n").trim();
2219
- if (code) {
2220
- rootNode.append($createMermaidNode(code));
2221
- }
2222
- return [true, lines.length - 1];
2223
- },
2224
- type: "multiline-element"
2225
- };
2226
- var CUSTOM_TRANSFORMERS = [
2227
- IMAGE,
2228
- HORIZONTAL_RULE,
2229
- markdown.CHECK_LIST,
2230
- MERMAID,
2231
- ...markdown.TRANSFORMERS
2232
- ];
2233
- var SINGLE_LINE_TRANSFORMERS = [];
2234
- var TABLE_FENCE_LANG = "__kbc_table__";
2235
- var isTableLine = (line) => {
2236
- const trimmed = line.trim();
2237
- return trimmed.startsWith("|") && trimmed.endsWith("|");
2238
- };
2239
- var CODE_FENCE_REGEX = /^[ \t]*`{3,}/;
2240
- var preprocessMarkdown = (markdown) => {
2241
- const lines = markdown.split("\n");
2242
- const result = [];
2243
- let tableLines = [];
2244
- let insideCodeFence = false;
2245
- const flushTable = () => {
2246
- if (tableLines.length >= 2) {
2247
- result.push(`\`\`\`${TABLE_FENCE_LANG}`);
2248
- result.push(...tableLines);
2249
- result.push("```");
2250
- } else {
2251
- result.push(...tableLines);
2252
- }
2253
- tableLines = [];
2254
- };
2255
- for (const line of lines) {
2256
- if (CODE_FENCE_REGEX.test(line)) {
2257
- if (tableLines.length > 0) flushTable();
2258
- insideCodeFence = !insideCodeFence;
2259
- result.push(line);
2260
- continue;
2261
- }
2262
- if (insideCodeFence) {
2263
- result.push(line);
2264
- continue;
2265
- }
2266
- if (isTableLine(line)) {
2267
- tableLines.push(line);
2268
- } else {
2269
- if (tableLines.length > 0) flushTable();
2270
- result.push(line);
2271
- }
2272
- }
2273
- if (tableLines.length > 0) flushTable();
2274
- return result.join("\n");
2275
- };
2276
- var postprocessMarkdown = (markdown) => {
2277
- const regex = new RegExp(`\`\`\`${TABLE_FENCE_LANG}\\n([\\s\\S]*?)\\n\`\`\``, "g");
2278
- return markdown.replace(regex, "$1");
2279
- };
2280
- var unescapeMarkdownText = (markdown) => markdown.replace(/\\([*_`~\\])/g, "$1");
2281
-
2282
- // src/blocks/MarkdownEditor/plugins/MarkdownSyncPlugin.tsx
2283
- var IMPORT_TAG = "markdown-import";
2284
- var MarkdownSyncPlugin = ({
2285
- value,
2286
- editable,
2287
- onChange,
2288
- transformers = CUSTOM_TRANSFORMERS,
2289
- singleLine = false
2290
- }) => {
2291
- const [editor] = LexicalComposerContext.useLexicalComposerContext();
2292
- const lastExportedRef = react.useRef(value);
2293
- const onChangeRef = react.useRef(onChange);
2294
- onChangeRef.current = onChange;
2295
- const transformersRef = react.useRef(transformers);
2296
- transformersRef.current = transformers;
2297
- const singleLineRef = react.useRef(singleLine);
2298
- singleLineRef.current = singleLine;
2299
- react.useEffect(() => {
2300
- editor.setEditable(editable);
2301
- }, [editor, editable]);
2302
- react.useEffect(() => {
2303
- if (value === lastExportedRef.current) return;
2304
- lastExportedRef.current = value;
2305
- editor.update(
2306
- () => {
2307
- markdown.$convertFromMarkdownString(preprocessMarkdown(value), transformersRef.current);
2308
- },
2309
- { tag: IMPORT_TAG }
2310
- );
2311
- }, [editor, value]);
2312
- react.useEffect(() => {
2313
- return editor.registerUpdateListener(({ tags }) => {
2314
- if (tags.has(IMPORT_TAG)) return;
2315
- editor.getEditorState().read(() => {
2316
- const raw = markdown.$convertToMarkdownString(transformersRef.current);
2317
- const markdown$1 = singleLineRef.current ? unescapeMarkdownText(raw) : postprocessMarkdown(raw);
2318
- if (markdown$1 !== lastExportedRef.current) {
2319
- lastExportedRef.current = markdown$1;
2320
- onChangeRef.current?.(markdown$1);
2321
- }
2322
- });
2323
- });
2324
- }, [editor]);
2325
- return null;
2326
- };
2327
-
2328
- // src/blocks/MarkdownEditor/plugins/ToolbarPlugin.tsx
2329
- init_icons();
2330
-
2331
- // src/components/DropdownMenu/DropdownMenu.tsx
2332
- init_context();
2333
-
2334
- // src/components/DropdownMenu/DropdownMenuCheckboxItem.tsx
2335
- init_icons();
2336
- init_utils2();
2337
-
2338
- // src/components/DropdownMenu/DropdownMenuItemIndicator.tsx
2339
- init_icons();
2340
- var variants3 = classVarianceAuthority.cva(
2341
- [
2342
- "tailwindcss-preflight",
2343
- "tw:pointer-events-none",
2344
- // sizing
2345
- "tw:size-4",
2346
- "tw:aspect-square",
2347
- "tw:shrink-0",
2348
- // layout
2349
- "tw:flex",
2350
- "tw:items-center",
2351
- "tw:justify-center"
2352
- ],
2353
- {
2354
- variants: {
2355
- variant: {
2356
- none: [],
2357
- radio: [
2358
- "tw:border",
2359
- "tw:border-solid",
2360
- "tw:border-border",
2361
- "tw:rounded-full",
2362
- "tw:group-data-[variant=default]/dropdown-menu-content:bg-white",
2363
- "tw:group-data-[variant=argo]/dropdown-menu-content:bg-background",
2364
- 'tw:[&_svg:not([class*="tw:size-"])]:size-2',
2365
- "tw:data-[state=unchecked]:[&_svg]:hidden",
2366
- // Lucide Circle is stroke-only — force fill to match the stroke
2367
- // (currentColor) so the indicator reads as a solid dot.
2368
- "tw:[&_svg]:fill-current",
2369
- "tw:group-data-[variant=argo]/dropdown-menu-content:[&_svg]:text-primary",
2370
- "tw:group-data-[variant=default]/dropdown-menu-content:[&_svg]:text-primary"
2371
- ],
2372
- check: ['tw:[&_svg:not([class*="tw:size-"])]:size-3.5', "tw:[&_svg]:text-primary"],
2373
- checkbox: [
2374
- "tw:[&_svg]:text-primary-foreground",
2375
- "tw:border",
2376
- "tw:border-solid",
2377
- "tw:rounded",
2378
- "tw:group-data-[variant=default]/dropdown-menu-content:border-neutral-200",
2379
- "tw:group-data-[variant=argo]/dropdown-menu-content:border-input",
2380
- 'tw:[&_svg:not([class*="tw:size-"])]:size-3',
2381
- "tw:data-[state=unchecked]:[&_svg]:hidden",
2382
- "tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:border-primary",
2383
- "tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:bg-primary",
2384
- "tw:group-data-[variant=default]/dropdown-menu-content:data-[state=checked]:border-primary",
2385
- "tw:group-data-[variant=default]/dropdown-menu-content:data-[state=checked]:bg-primary"
2386
- ],
2387
- switch: [
2388
- "tw:size-5",
2389
- // Lucide SVGs default to 24×24 — constrain the rendered ToggleRight
2390
- // to the indicator slot so it doesn't overflow.
2391
- 'tw:[&_svg:not([class*="tw:size-"])]:size-5',
2392
- "tw:text-neutral-400",
2393
- "tw:data-[state=unchecked]:rotate-180",
2394
- "tw:group-data-[variant=default]/dropdown-menu-content:data-[state=checked]:text-primary",
2395
- "tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:text-primary"
2396
- ]
2397
- }
2398
- }
2399
- }
2400
- );
2401
- var DropdownMenuItemIndicator = ({
2402
- variant,
2403
- className,
2404
- forceMount: forceMountProp,
2405
- ...rest
2406
- }) => {
2407
- const IconComp = (() => {
2408
- if (variant === "switch") return lucideReact.ToggleRight;
2409
- if (variant === "radio") return lucideReact.Circle;
2410
- return lucideReact.Check;
2411
- })();
2412
- const forceMount = (() => {
2413
- if (forceMountProp) return true;
2414
- return variant === "check" ? void 0 : true;
2415
- })();
2416
- if (variant === "none") return null;
2417
- return /* @__PURE__ */ jsxRuntime.jsx(
2418
- DropdownMenuPrimitive3__namespace.ItemIndicator,
2419
- {
2420
- ...rest,
2421
- forceMount,
2422
- className: variants3({ variant, className }),
2423
- children: /* @__PURE__ */ jsxRuntime.jsx(IconComp, {})
2424
- }
2425
- );
2426
- };
2427
-
2428
- // src/components/DropdownMenu/ItemIcon.tsx
2429
- init_utils2();
2430
- var ItemIcon = ({ className, children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
2431
- "span",
2432
- {
2433
- ...props,
2434
- className: cn(
2435
- "tw:inline-flex",
2436
- "tw:items-center",
2437
- "tw:justify-center",
2438
- "tw:aspect-square",
2439
- // 20px container fits the 16px Lucide glyph plus 2px breathing room
2440
- // each side — the previous tw:size-4 + tw:p-0.5 clipped the 16px child.
2441
- "tw:size-5",
2442
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4',
2443
- "tw:group-data-[variant=default]/dropdown-menu-content:text-neutral-400",
2444
- "tw:group-data-[variant=argo]/dropdown-menu-content:text-primary",
2445
- "tw:group-data-[variant=argo]/dropdown-menu-content:group-aria-disabled:text-muted-foreground",
2446
- "tw:group-data-[variant=default]/dropdown-menu-content:group-hover:text-primary",
2447
- className
2448
- ),
2449
- children
2450
- }
2451
- );
2452
-
2453
- // src/components/DropdownMenu/styles.ts
2454
- init_utils2();
2455
- var itemVariants = cn(
2456
- // reset
2457
- "tailwindcss-preflight",
2458
- "tw:outline-hidden",
2459
- "tw:group",
2460
- "tw:peer",
2461
- "tw:relative",
2462
- // positioning
2463
- "tw:flex",
2464
- "tw:flex-1",
2465
- "tw:items-center",
2466
- "tw:gap-2",
2467
- "tw:cursor-pointer",
2468
- "tw:select-none",
2469
- "tw:transition-colors",
2470
- // spacing
2471
- "tw:p-2",
2472
- // typography
2473
- "tw:font-sans",
2474
- "tw:text-sm",
2475
- "tw:aria-disabled:pointer-events-none",
2476
- "tw:aria-disabled:opacity-50",
2477
- "tw:focus-visible:outline-hidden",
2478
- "tw:group-data-[variant=default]/dropdown-menu-content:rounded",
2479
- "tw:group-data-[variant=default]/dropdown-menu-content:focus:bg-neutral-100",
2480
- "tw:group-data-[variant=default]/dropdown-menu-content:focus:text-neutral-900",
2481
- "tw:group-data-[variant=default]/dropdown-menu-content:hover:bg-neutral-100",
2482
- "tw:group-data-[variant=default]/dropdown-menu-content:hover:text-neutral-900",
2483
- "tw:group-data-[variant=argo]/dropdown-menu-content:rounded-md",
2484
- "tw:group-data-[variant=argo]/dropdown-menu-content:text-popover-foreground",
2485
- "tw:group-data-[variant=argo]/dropdown-menu-content:focus:text-primary",
2486
- "tw:group-data-[variant=argo]/dropdown-menu-content:focus:bg-primary/10",
2487
- "tw:group-data-[variant=argo]/dropdown-menu-content:hover:text-primary",
2488
- "tw:group-data-[variant=argo]/dropdown-menu-content:hover:bg-primary/10"
2489
- );
2490
- var contentVariants = cn(
2491
- "tailwindcss-preflight",
2492
- "tw:group/dropdown-menu-content",
2493
- // Sit above Modal/Sheet (z-1051), matching the other floating overlays (Popover/Select z-1055)
2494
- "tw:z-[1055]",
2495
- // positioning
2496
- "tw:flex",
2497
- "tw:flex-col",
2498
- "tw:origin-(--radix-dropdown-menu-content-transform-origin)",
2499
- // sizing
2500
- "tw:max-h-[var(--radix-dropdown-menu-content-available-height)]",
2501
- "tw:min-w-32",
2502
- // border
2503
- "tw:border",
2504
- "tw:shadow-md",
2505
- // Legacy surface — fixed white panel.
2506
- "tw:data-[variant=default]:rounded-md",
2507
- "tw:data-[variant=default]:bg-white",
2508
- "tw:data-[variant=default]:border-neutral-100",
2509
- "tw:data-[variant=default]:text-neutral-800",
2510
- // Argo surface — semantic popover tokens (brand + dark aware).
2511
- "tw:data-[variant=argo]:rounded-2xl",
2512
- "tw:data-[variant=argo]:bg-popover",
2513
- "tw:data-[variant=argo]:text-popover-foreground",
2514
- "tw:data-[variant=argo]:border-border",
2515
- // animations
2516
- "tw:data-[state=open]:animate-in",
2517
- "tw:data-[state=open]:fade-in-0",
2518
- "tw:data-[state=open]:zoom-in-95",
2519
- "tw:data-[state=closed]:animate-out",
2520
- "tw:data-[state=closed]:fade-out-0",
2521
- "tw:data-[state=closed]:zoom-out-95",
2522
- "tw:data-[side=bottom]:slide-in-from-top-2",
2523
- "tw:data-[side=left]:slide-in-from-right-2",
2524
- "tw:data-[side=right]:slide-in-from-left-2",
2525
- "tw:data-[side=top]:slide-in-from-bottom-2"
2526
- );
2527
- var DropdownMenuCheckboxItem = ({
2528
- className,
2529
- children,
2530
- checked,
2531
- closeOnSelect = false,
2532
- onSelect,
2533
- indicatorAlign = "start",
2534
- indicator = "checkbox",
2535
- isLoading = false,
2536
- ...props
2537
- }) => {
2538
- const isAtStart = indicatorAlign === "start";
2539
- const indicatorEle = isLoading ? /* @__PURE__ */ jsxRuntime.jsx(ItemIcon, { className: isAtStart ? "" : "tw:ml-auto", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "tw:animate-spin" }) }) : /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItemIndicator, { variant: indicator, className: isAtStart ? "" : "tw:ml-auto" });
2540
- const handleSelect = (event) => {
2541
- if (!closeOnSelect) event.preventDefault();
2542
- onSelect?.(event);
2543
- };
2544
- return /* @__PURE__ */ jsxRuntime.jsxs(
2545
- DropdownMenuPrimitive3__namespace.CheckboxItem,
2546
- {
2547
- className: cn(itemVariants, className),
2548
- checked,
2549
- onSelect: handleSelect,
2550
- ...props,
2551
- children: [
2552
- isAtStart && indicatorEle,
2553
- children,
2554
- !isAtStart && indicatorEle
2555
- ]
2556
- }
2557
- );
2558
- };
2559
-
2560
- // src/components/DropdownMenu/DropdownMenuContent.tsx
2561
- init_utils2();
2562
-
2563
- // src/components/ScrollArea/ScrollArea.tsx
2564
- init_utils2();
2565
-
2566
- // src/components/ScrollArea/ScrollBar.tsx
2567
- init_utils2();
2568
- var ScrollBar = ({ className, orientation = "vertical", ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
2569
- ScrollAreaPrimitive2__namespace.ScrollAreaScrollbar,
2570
- {
2571
- orientation,
2572
- className: cn(
2573
- "tw:flex tw:touch-none tw:select-none tw:transition-color",
2574
- {
2575
- "tw:h-full tw:w-2.5 tw:p-px": orientation === "vertical",
2576
- "tw:h-2.5 tw:flex-col tw:p-px": orientation === "horizontal"
2577
- },
2578
- className
2579
- ),
2580
- ...props,
2581
- children: /* @__PURE__ */ jsxRuntime.jsx(
2582
- ScrollAreaPrimitive2__namespace.ScrollAreaThumb,
2583
- {
2584
- className: cn(
2585
- "tw:relative",
2586
- "tw:flex-1",
2587
- "tw:rounded-full",
2588
- "tw:bg-border",
2589
- "tw:hover:bg-muted-foreground"
2590
- )
2591
- }
2592
- )
2593
- }
2594
- );
2595
- var ScrollArea = ({
2596
- ref,
2597
- className,
2598
- children,
2599
- viewPortClassName,
2600
- orientation,
2601
- scrollBarClassName,
2602
- ...props
2603
- }) => /* @__PURE__ */ jsxRuntime.jsxs(
2604
- ScrollAreaPrimitive2__namespace.Root,
2605
- {
2606
- "data-slot": "scroll-area",
2607
- className: cn(
2608
- "tw:peer/scroll-area tw:relative tw:overflow-hidden tw:focus-visible:outline-hidden",
2609
- className
2610
- ),
2611
- ...props,
2612
- children: [
2613
- /* @__PURE__ */ jsxRuntime.jsx(
2614
- ScrollAreaPrimitive2__namespace.Viewport,
2615
- {
2616
- ref,
2617
- className: cn(
2618
- "tw:h-full tw:w-full tw:rounded-[inherit] tw:focus-visible:outline-hidden",
2619
- viewPortClassName
2620
- ),
2621
- children
2622
- }
2623
- ),
2624
- orientation ? /* @__PURE__ */ jsxRuntime.jsx(ScrollBar, { className: scrollBarClassName, orientation }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2625
- /* @__PURE__ */ jsxRuntime.jsx(ScrollBar, { className: scrollBarClassName, orientation: "vertical" }),
2626
- /* @__PURE__ */ jsxRuntime.jsx(ScrollBar, { className: scrollBarClassName, orientation: "horizontal" })
2627
- ] }),
2628
- /* @__PURE__ */ jsxRuntime.jsx(ScrollAreaPrimitive2__namespace.Corner, {})
2629
- ]
2630
- }
2631
- );
2632
- var DropdownMenuContext = react.createContext({
2633
- variant: "default"
2634
- });
2635
- var useDropdownMenuContext = () => react.use(DropdownMenuContext);
2636
- var DropdownMenuContent = ({
2637
- className,
2638
- sideOffset = 4,
2639
- forceMount,
2640
- children,
2641
- viewPortClassName,
2642
- container,
2643
- ...props
2644
- }) => {
2645
- const { variant } = useDropdownMenuContext();
2646
- return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive3__namespace.Portal, { forceMount: forceMount || void 0, container, children: /* @__PURE__ */ jsxRuntime.jsx(
2647
- DropdownMenuPrimitive3__namespace.Content,
2648
- {
2649
- ...props,
2650
- "data-variant": variant,
2651
- sideOffset,
2652
- className: contentVariants,
2653
- children: /* @__PURE__ */ jsxRuntime.jsx(
2654
- ScrollArea,
2655
- {
2656
- className,
2657
- viewPortClassName: cn(
2658
- "tw:p-2",
2659
- "tw:max-h-[var(--radix-dropdown-menu-content-available-height)]",
2660
- viewPortClassName
2661
- ),
2662
- scrollBarClassName: "tw:w-1.5",
2663
- children
2664
- }
2665
- )
2666
- }
2667
- ) });
2668
- };
2669
-
2670
- // src/components/DropdownMenu/DropdownMenuItem.tsx
2671
- init_icons();
2672
- init_utils2();
2673
- var DropdownMenuItem = ({
2674
- ref,
2675
- className,
2676
- asModalTrigger = false,
2677
- onSelect,
2678
- onPointerLeave,
2679
- onPointerMove,
2680
- children,
2681
- asChild,
2682
- icon,
2683
- iconClassName,
2684
- isLoading = false,
2685
- ...props
2686
- }) => {
2687
- const Comp = asChild ? reactSlot.Root : "div";
2688
- const adornment = isLoading ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "tw:animate-spin" }) : icon;
2689
- const handleOnSelect = (event) => {
2690
- if (asModalTrigger) event.preventDefault();
2691
- onSelect?.(event);
2692
- };
2693
- const handlePointerLeave = (event) => {
2694
- if (asModalTrigger) event.preventDefault();
2695
- onPointerLeave?.(event);
2696
- };
2697
- const handlePointerMove = (event) => {
2698
- if (asModalTrigger) event.preventDefault();
2699
- onPointerMove?.(event);
2700
- };
2701
- return /* @__PURE__ */ jsxRuntime.jsx(
2702
- DropdownMenuPrimitive3__namespace.Item,
2703
- {
2704
- ...props,
2705
- ref,
2706
- onSelect: handleOnSelect,
2707
- onPointerLeave: handlePointerLeave,
2708
- onPointerMove: handlePointerMove,
2709
- className: cn(itemVariants, asChild && "tw:text-inherit", className),
2710
- asChild: true,
2711
- children: /* @__PURE__ */ jsxRuntime.jsxs(Comp, { children: [
2712
- adornment && /* @__PURE__ */ jsxRuntime.jsx(ItemIcon, { className: iconClassName, children: adornment }),
2713
- /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slottable, { children })
2714
- ] })
2715
- }
2716
- );
2717
- };
2718
-
2719
- // src/components/DropdownMenu/DropdownMenuItemDescription.tsx
2720
- init_utils2();
2721
- var descriptionVariants = classVarianceAuthority.cva(
2722
- [
2723
- "tw:box-border",
2724
- "tw:ml-auto",
2725
- "tw:font-sans",
2726
- "tw:tracking-normal",
2727
- "tw:font-normal",
2728
- "tw:text-xs",
2729
- "tw:text-muted-foreground"
2730
- ],
2731
- {
2732
- variants: {
2733
- hideOnHover: {
2734
- true: ["tw:group-focus-within:hidden", "tw:group-hover:hidden"],
2735
- false: []
2736
- }
2737
- },
2738
- defaultVariants: {}
2739
- }
2740
- );
2741
- var DropdownMenuItemDescription = ({
2742
- className,
2743
- children,
2744
- hideOnHover = false,
2745
- ...props
2746
- }) => {
2747
- return /* @__PURE__ */ jsxRuntime.jsx("span", { ...props, className: cn(descriptionVariants({ hideOnHover }), className), children });
2748
- };
2749
-
2750
- // src/components/DropdownMenu/DropdownMenuLabel.tsx
2751
- init_utils2();
2752
- var DropdownMenuLabel = ({ className, ...props }) => {
2753
- return /* @__PURE__ */ jsxRuntime.jsx(
2754
- DropdownMenuPrimitive3__namespace.Label,
2755
- {
2756
- className: cn(
2757
- "tw:p-2",
2758
- "tw:font-medium",
2759
- "tw:text-xs",
2760
- "tw:text-muted-foreground",
2761
- className
2762
- ),
2763
- ...props
2764
- }
2765
- );
2766
- };
2767
- var DropdownMenuRadioGroup = ({
2768
- value,
2769
- defaultValue,
2770
- onValueChange,
2771
- ...props
2772
- }) => {
2773
- const handleChange = (value2) => {
2774
- onValueChange?.(value2);
2775
- };
2776
- return /* @__PURE__ */ jsxRuntime.jsx(
2777
- DropdownMenuPrimitive3__namespace.RadioGroup,
2778
- {
2779
- ...props,
2780
- value,
2781
- defaultValue,
2782
- onValueChange: handleChange
2783
- }
2784
- );
2785
- };
2786
-
2787
- // src/components/DropdownMenu/DropdownMenuRadioGroup/DropdownMenuRadioItem.tsx
2788
- init_icons();
2789
- init_utils2();
2790
- var DropdownMenuRadioItem = ({
2791
- className,
2792
- children,
2793
- closeOnSelect,
2794
- onSelect,
2795
- indicatorAlign = "start",
2796
- indicator = "radio",
2797
- icon,
2798
- iconClassName,
2799
- isLoading = false,
2800
- ...props
2801
- }) => {
2802
- const isAtStart = indicatorAlign === "start";
2803
- const indicatorEle = isLoading ? /* @__PURE__ */ jsxRuntime.jsx(ItemIcon, { className: iconClassName, children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "tw:animate-spin" }) }) : /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItemIndicator, { variant: indicator });
2804
- const handleSelect = (event) => {
2805
- if (!closeOnSelect) event.preventDefault();
2806
- onSelect?.(event);
2807
- };
2808
- return /* @__PURE__ */ jsxRuntime.jsxs(
2809
- DropdownMenuPrimitive3__namespace.RadioItem,
2810
- {
2811
- className: cn(
2812
- itemVariants,
2813
- "tw:data-[state=checked]:cursor-default",
2814
- {
2815
- "tw:data-[state=checked]:bg-neutral-100": indicator === "none",
2816
- // Semantic brand tint (flips under `[data-theme='dark']`) instead of a
2817
- // hardcoded `tw:bg-sky-100`, which stayed light in dark mode and left the
2818
- // checked item's text near-invisible.
2819
- "tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:bg-primary/10": indicator === "check"
2820
- },
2821
- className
2822
- ),
2823
- onSelect: handleSelect,
2824
- ...props,
2825
- children: [
2826
- isAtStart && indicatorEle,
2827
- icon && /* @__PURE__ */ jsxRuntime.jsx(ItemIcon, { className: iconClassName, children: icon }),
2828
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tw:flex tw:min-w-0 tw:flex-1 tw:items-center tw:gap-2", children }),
2829
- !isAtStart && indicatorEle
2830
- ]
2831
- }
2832
- );
2833
- };
2834
-
2835
- // src/components/DropdownMenu/DropdownMenuSeparator.tsx
2836
- init_utils2();
2837
- var DropdownMenuSeparator = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
2838
- DropdownMenuPrimitive3__namespace.Separator,
2839
- {
2840
- className: cn(
2841
- "tw:relative",
2842
- "tw:z-10",
2843
- // layout
2844
- "tw:flex",
2845
- "tw:items-center",
2846
- "tw:justify-center",
2847
- "tw:w-full",
2848
- // separator line
2849
- 'tw:before:content-[""]',
2850
- "tw:before:w-full",
2851
- "tw:before:h-px",
2852
- "tw:group-data-[variant=default]/dropdown-menu-content:py-2",
2853
- "tw:group-data-[variant=default]/dropdown-menu-content:before:bg-neutral-150",
2854
- "tw:group-data-[variant=argo]/dropdown-menu-content:py-1",
2855
- "tw:group-data-[variant=argo]/dropdown-menu-content:before:bg-border",
2856
- className
2857
- ),
2858
- ...props
2859
- }
2860
- );
2861
- var DropdownMenuSub = DropdownMenuPrimitive3__namespace.Sub;
2862
-
2863
- // src/components/DropdownMenu/DropdownMenuSub/DropdownMenuSubContent.tsx
2864
- init_utils2();
2865
- var DropdownMenuSubContent = ({ className, ...props }) => {
2866
- const { variant } = useDropdownMenuContext();
2867
- return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive3__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
2868
- DropdownMenuPrimitive3__namespace.SubContent,
2869
- {
2870
- "data-variant": variant,
2871
- className: cn(contentVariants, "tw:z-[1041]", "tw:p-2", className),
2872
- ...props
2873
- }
2874
- ) });
2875
- };
2876
-
2877
- // src/components/DropdownMenu/DropdownMenuSub/DropdownMenuSubTrigger.tsx
2878
- init_icons();
2879
- init_utils2();
2880
- var DropdownMenuSubTrigger = ({ className, children, ...props }) => {
2881
- return /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuPrimitive3__namespace.SubTrigger, { className: cn(itemVariants, className), ...props, children: [
2882
- children,
2883
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "tw:ml-auto tw:size-5" })
2884
- ] });
2885
- };
2886
-
2887
- // src/components/DropdownMenu/DropdownMenuTrigger.tsx
2888
- init_utils2();
2889
- var DropdownMenuTrigger = ({ ref, className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
2890
- DropdownMenuPrimitive3.Trigger,
2891
- {
2892
- ...props,
2893
- ref,
2894
- "data-slot": "dropdown-menu-trigger",
2895
- className: cn("tw:group/dropdown-menu-trigger", className)
2896
- }
2897
- );
2898
- var DropdownMenu = ({
2899
- // change a default value to false, for modal property, as it is not used in most cases
2900
- modal = false,
2901
- ...props
2902
- }) => {
2903
- const effectiveVariant = useArgoDesign() ? "argo" : "default";
2904
- const contextValue = react.useMemo(() => ({ variant: effectiveVariant }), [effectiveVariant]);
2905
- return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuContext, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive3.Root, { ...props, modal }) });
2906
- };
2907
- DropdownMenu.Trigger = DropdownMenuTrigger;
2908
- DropdownMenu.Content = DropdownMenuContent;
2909
- DropdownMenu.Group = DropdownMenuPrimitive3.Group;
2910
- DropdownMenu.Sub = DropdownMenuSub;
2911
- DropdownMenu.SubContent = DropdownMenuSubContent;
2912
- DropdownMenu.SubTrigger = DropdownMenuSubTrigger;
2913
- DropdownMenu.Separator = DropdownMenuSeparator;
2914
- DropdownMenu.Label = DropdownMenuLabel;
2915
- DropdownMenu.Item = DropdownMenuItem;
2916
- DropdownMenu.CheckboxItem = DropdownMenuCheckboxItem;
2917
- DropdownMenu.RadioGroup = DropdownMenuRadioGroup;
2918
- DropdownMenu.RadioItem = DropdownMenuRadioItem;
2919
- DropdownMenu.ItemDescription = DropdownMenuItemDescription;
2920
-
2921
- // src/blocks/MarkdownEditor/plugins/toolbar/AlignmentDropdown.tsx
2922
- init_Tooltip2();
2923
- init_icons();
2924
- init_utils2();
2925
- var ALIGNMENT_OPTIONS = [
2926
- { value: "left", label: "Left", icon: lucideReact.AlignLeft },
2927
- { value: "center", label: "Center", icon: lucideReact.AlignCenter },
2928
- { value: "right", label: "Right", icon: lucideReact.AlignRight },
2929
- { value: "justify", label: "Justify", icon: lucideReact.AlignJustify }
2930
- ];
2931
- var ALIGNMENT_ICONS = Object.fromEntries(
2932
- ALIGNMENT_OPTIONS.map(({ value, icon }) => [value, icon])
2933
- );
2934
- var AlignmentDropdown = ({
2935
- editor,
2936
- alignment
2937
- }) => {
2938
- const savedSelectionRef = react.useRef(null);
2939
- const handleOpenChange = (open) => {
2940
- if (open) {
2941
- editor.getEditorState().read(() => {
2942
- const selection = lexical.$getSelection();
2943
- savedSelectionRef.current = selection ? selection.clone() : null;
2944
- });
2945
- }
2946
- };
2947
- const handleSelect = (align) => {
2948
- editor.update(() => {
2949
- if (savedSelectionRef.current) {
2950
- lexical.$setSelection(savedSelectionRef.current);
2951
- }
2952
- editor.dispatchCommand(lexical.FORMAT_ELEMENT_COMMAND, align);
2953
- });
2954
- };
2955
- const CurrentAlignmentIcon = ALIGNMENT_ICONS[alignment] ?? lucideReact.AlignLeft;
2956
- return /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenu, { onOpenChange: handleOpenChange, children: [
2957
- /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { tooltip: "Text alignment", placement: "top", triggerAsChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
2958
- "button",
2959
- {
2960
- type: "button",
2961
- className: cn(
2962
- "tw:flex tw:h-7 tw:cursor-pointer tw:items-center tw:gap-1 tw:rounded tw:border-0 tw:bg-transparent tw:px-1.5 tw:text-xs tw:text-muted-foreground",
2963
- "tw:hover:bg-accent"
2964
- ),
2965
- children: [
2966
- /* @__PURE__ */ jsxRuntime.jsx(CurrentAlignmentIcon, { className: "tw:size-4" }),
2967
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "tw:size-3" })
2968
- ]
2969
- }
2970
- ) }) }),
2971
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu.Content, { align: "start", className: "tw:min-w-32", children: ALIGNMENT_OPTIONS.map(({ value, label, icon: IconComp }) => /* @__PURE__ */ jsxRuntime.jsxs(
2972
- DropdownMenu.Item,
2973
- {
2974
- onSelect: () => handleSelect(value),
2975
- className: cn(
2976
- "tw:flex tw:items-center tw:gap-2",
2977
- alignment === value && "tw:bg-secondary-50 tw:text-secondary-500"
2978
- ),
2979
- children: [
2980
- /* @__PURE__ */ jsxRuntime.jsx(IconComp, { className: "tw:size-4" }),
2981
- label
2982
- ]
2983
- },
2984
- value
2985
- )) })
2986
- ] });
2987
- };
2988
- init_Tooltip2();
2989
- init_icons();
2990
- init_utils2();
2991
- var BLOCK_TYPE_META = {
2992
- paragraph: { label: "Normal", icon: lucideReact.Type, selectable: true },
2993
- h1: { label: "Heading 1", icon: lucideReact.Heading1, selectable: true },
2994
- h2: { label: "Heading 2", icon: lucideReact.Heading2, selectable: true },
2995
- h3: { label: "Heading 3", icon: lucideReact.Heading3, selectable: true },
2996
- bullet: { label: "Bullet List", icon: lucideReact.List, selectable: false },
2997
- number: { label: "Numbered List", icon: lucideReact.ListOrdered, selectable: false },
2998
- quote: { label: "Quote", icon: lucideReact.Quote, selectable: false },
2999
- code: { label: "Code Block", icon: lucideReact.SquareCode, selectable: false }
3000
- };
3001
- var BLOCK_TYPE_OPTIONS = Object.entries(BLOCK_TYPE_META).filter(([, meta]) => meta.selectable).map(([value, { label, icon }]) => ({ value, label, icon }));
3002
- var isBlockType = (value) => Object.prototype.hasOwnProperty.call(BLOCK_TYPE_META, value);
3003
- var BlockTypeDropdown = ({
3004
- editor,
3005
- blockType
3006
- }) => {
3007
- const savedSelectionRef = react.useRef(null);
3008
- const currentMeta = isBlockType(blockType) ? BLOCK_TYPE_META[blockType] : null;
3009
- const CurrentBlockIcon = currentMeta?.icon ?? lucideReact.Type;
3010
- const handleOpenChange = (open) => {
3011
- if (open) {
3012
- editor.getEditorState().read(() => {
3013
- const selection = lexical.$getSelection();
3014
- savedSelectionRef.current = selection ? selection.clone() : null;
3015
- });
3016
- }
3017
- };
3018
- const handleSelect = (type) => {
3019
- editor.update(() => {
3020
- if (savedSelectionRef.current) {
3021
- lexical.$setSelection(savedSelectionRef.current);
3022
- }
3023
- const selection = lexical.$getSelection();
3024
- if (!lexical.$isRangeSelection(selection)) return;
3025
- if (type === "bullet") {
3026
- editor.dispatchCommand(list.INSERT_UNORDERED_LIST_COMMAND, void 0);
3027
- return;
3028
- }
3029
- if (type === "number") {
3030
- editor.dispatchCommand(list.INSERT_ORDERED_LIST_COMMAND, void 0);
3031
- return;
3032
- }
3033
- const anchorNode = selection.anchor.getNode();
3034
- const element = utils.$getNearestBlockElementAncestorOrThrow(anchorNode);
3035
- const newNode = type === "h1" || type === "h2" || type === "h3" ? richText.$createHeadingNode(type) : type === "quote" ? richText.$createQuoteNode() : type === "code" ? code.$createCodeNode() : lexical.$createParagraphNode();
3036
- element.getChildren().forEach((child) => newNode.append(child));
3037
- element.replace(newNode);
3038
- });
3039
- };
3040
- return /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenu, { onOpenChange: handleOpenChange, children: [
3041
- /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { tooltip: "Change block type", placement: "top", triggerAsChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
3042
- "button",
3043
- {
3044
- type: "button",
3045
- className: cn(
3046
- "tw:flex tw:h-7 tw:cursor-pointer tw:items-center tw:gap-1.5 tw:rounded tw:border-0 tw:bg-transparent tw:px-1.5 tw:text-xs tw:text-muted-foreground",
3047
- "tw:hover:bg-accent"
3048
- ),
3049
- children: [
3050
- /* @__PURE__ */ jsxRuntime.jsx(CurrentBlockIcon, { className: "tw:size-4" }),
3051
- currentMeta?.label ?? "Normal",
3052
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "tw:size-3" })
3053
- ]
3054
- }
3055
- ) }) }),
3056
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu.Content, { align: "start", className: "tw:min-w-40", children: BLOCK_TYPE_OPTIONS.map(({ value, label, icon: IconComp }) => /* @__PURE__ */ jsxRuntime.jsxs(
3057
- DropdownMenu.Item,
3058
- {
3059
- onSelect: () => handleSelect(value),
3060
- className: cn(
3061
- "tw:flex tw:items-center tw:gap-2",
3062
- blockType === value && "tw:bg-secondary-50 tw:text-secondary-500"
3063
- ),
3064
- children: [
3065
- /* @__PURE__ */ jsxRuntime.jsx(IconComp, { className: "tw:size-4" }),
3066
- label
3067
- ]
3068
- },
3069
- value
3070
- )) })
3071
- ] });
3072
- };
3073
-
3074
- // src/blocks/FormGroup/FormGroup.tsx
3075
- init_utils2();
3076
- var FormGroupContext = react.createContext({
3077
- state: "default"
3078
- });
3079
- var FormGroupProvider = FormGroupContext;
3080
- var useFormGroupContext = () => react.use(FormGroupContext);
3081
-
3082
- // src/components/InputGroup/InputGroup.tsx
3083
- init_utils2();
3084
- init_context();
3085
-
3086
- // src/components/InputGroup/InputGroupAddon.tsx
3087
- init_utils2();
3088
- var addonVariants = classVarianceAuthority.cva(
3089
- [
3090
- "tw:flex",
3091
- "tw:items-center",
3092
- "tw:gap-1",
3093
- // Default size for nested Lucide icons in prefix/suffix slots; callers can override on the icon.
3094
- "tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4",
3095
- "tw:[&_svg]:shrink-0"
3096
- ],
3097
- {
3098
- defaultVariants: {
3099
- align: "inline-start"
3100
- },
3101
- variants: {
3102
- align: {
3103
- "inline-start": ["tw:order-first", "tw:[&:not(:empty)]:pl-4"],
3104
- "inline-end": ["tw:order-last", "tw:[&:not(:empty)]:pr-4"],
3105
- "block-start": [
3106
- "tw:order-first",
3107
- // `tw:w-full` needs to be empty-conditional too — when the addon
3108
- // has no content the root stays in flex-row, and a 100%-wide
3109
- // empty addon would claim half of the input row beside the input.
3110
- "tw:[&:not(:empty)]:w-full",
3111
- "tw:[&:not(:empty)]:px-4",
3112
- "tw:[&:not(:empty)]:py-1.5"
3113
- ],
3114
- "block-end": [
3115
- "tw:order-last",
3116
- "tw:[&:not(:empty)]:w-full",
3117
- "tw:[&:not(:empty)]:px-4",
3118
- "tw:[&:not(:empty)]:py-1.5"
3119
- ]
3120
- }
3121
- }
3122
- }
3123
- );
3124
- var InputGroupAddon = ({
3125
- children,
3126
- align = "inline-start",
3127
- className,
3128
- ...props
3129
- }) => /* @__PURE__ */ jsxRuntime.jsx("div", { ...props, "data-align": align, className: cn(addonVariants({ align, className })), children });
3130
-
3131
- // src/components/InputGroup/InputGroupButton.tsx
3132
- init_utils2();
3133
- init_Button2();
3134
- var InputGroupButton = ({ ref, className, tabIndex = -1, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
3135
- Button,
3136
- {
3137
- ...props,
3138
- tabIndex,
3139
- ref,
3140
- variant: "invisible",
3141
- size: "icon-sm",
3142
- className: cn("tw:size-5", "tw:[&_svg]:text-muted-foreground", className)
3143
- }
3144
- );
3145
-
3146
- // src/components/InputGroup/InputGroupInput.tsx
3147
- init_utils2();
3148
- var InputGroupInput = ({ ref, className, ...inputProps }) => /* @__PURE__ */ jsxRuntime.jsx(
3149
- "input",
3150
- {
3151
- ...inputProps,
3152
- ref,
3153
- className: cn(
3154
- "tw:w-full",
3155
- "tw:bg-transparent",
3156
- "tw:outline-hidden",
3157
- // font
3158
- "tw:font-sans",
3159
- "tw:text-sm",
3160
- // placeholder
3161
- "tw:placeholder:text-neutral-400",
3162
- "tw:placeholder:font-normal",
3163
- // disabled
3164
- "tw:disabled:cursor-not-allowed",
3165
- className
3166
- )
3167
- }
3168
- );
3169
-
3170
- // src/components/InputGroup/InputGroupText.tsx
3171
- init_utils2();
3172
- var InputGroupText = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
3173
- "span",
3174
- {
3175
- className: cn(
3176
- "tw:flex",
3177
- "tw:items-center",
3178
- "tw:gap-2",
3179
- "tw:text-sm",
3180
- "tw:text-muted-foreground",
3181
- "tw:[&_svg]:pointer-events-none",
3182
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4',
3183
- className
3184
- ),
3185
- ...props
3186
- }
3187
- );
3188
-
3189
- // src/components/InputGroup/InputGroupTextArea.tsx
3190
- init_utils2();
3191
- var InputGroupTextArea = ({
3192
- ref,
3193
- className,
3194
- onChange,
3195
- onValueChange,
3196
- value,
3197
- defaultValue,
3198
- onBlur,
3199
- onValueBlur,
3200
- disableResize = false,
3201
- minRows = 1,
3202
- maxRows = 4,
3203
- ...props
3204
- }) => {
3205
- const handleChange = (event) => {
3206
- onValueChange?.(event.target.value);
3207
- onChange?.(event);
3208
- };
3209
- const handleBlur = (event) => {
3210
- onValueBlur?.(event.target.value);
3211
- onBlur?.(event);
3212
- };
3213
- return /* @__PURE__ */ jsxRuntime.jsx(
3214
- TextareaAutosize__default.default,
3215
- {
3216
- ...props,
3217
- ref,
3218
- value: value ?? void 0,
3219
- defaultValue: defaultValue ?? void 0,
3220
- onChange: handleChange,
3221
- onBlur: handleBlur,
3222
- minRows,
3223
- maxRows: maxRows === "unlimited" ? void 0 : maxRows,
3224
- className: cn(
3225
- "tw:w-full",
3226
- "tw:bg-transparent",
3227
- "tw:outline-hidden",
3228
- "tw:px-4",
3229
- // font
3230
- "tw:font-sans",
3231
- "tw:text-sm",
3232
- // placeholder
3233
- "tw:placeholder:text-neutral-400",
3234
- "tw:placeholder:font-normal",
3235
- // disabled
3236
- "tw:disabled:cursor-not-allowed",
3237
- {
3238
- "tw:resize-none": disableResize
3239
- },
3240
- className
3241
- )
3242
- }
3243
- );
3244
- };
3245
- var inputGroupVariants = classVarianceAuthority.cva(
3246
- [
3247
- "tailwindcss-preflight",
3248
- "tw:group",
3249
- "tw:overflow-hidden",
3250
- "tw:box-border",
3251
- // positioning
3252
- "tw:flex",
3253
- "tw:items-center",
3254
- // base — legacy (non-argo) chrome uses a fixed radius; argo overrides it with
3255
- // the brand radius token in the `argo` variant below.
3256
- "tw:rounded",
3257
- "tw:border",
3258
- "tw:border-solid",
3259
- "tw:border-neutral-200",
3260
- "tw:text-neutral-800",
3261
- "tw:transition",
3262
- // focus
3263
- "tw:has-[:is(input,textarea):focus]:ring-4",
3264
- // readonly
3265
- "tw:has-[:is(input,textarea)[readonly]]:bg-neutral-150",
3266
- "tw:has-[:is(input,textarea)[readonly]]:focus-within:ring-0",
3267
- "tw:has-[:is(input,textarea)[readonly]]:border-neutral-150",
3268
- // disabled cursor (opacity owned by variant)
3269
- "tw:has-[:is(input,textarea):disabled]:cursor-not-allowed",
3270
- // textarea: top-align addons, allow vertical expansion, own its y-padding
3271
- "tw:has-[textarea]:items-start",
3272
- "tw:has-[[data-align=block-start]:not(:empty)]:flex-wrap",
3273
- "tw:has-[[data-align=block-end]:not(:empty)]:flex-wrap",
3274
- "tw:[&>input]:has-[[data-align=block-start]:not(:empty)]:w-auto",
3275
- "tw:[&>input]:has-[[data-align=block-start]:not(:empty)]:flex-1",
3276
- "tw:[&>input]:has-[[data-align=block-end]:not(:empty)]:w-auto",
3277
- "tw:[&>input]:has-[[data-align=block-end]:not(:empty)]:flex-1",
3278
- "tw:[&>input]:px-4",
3279
- "tw:[&>input]:has-[[data-align=inline-start]:not(:empty)]:pl-2",
3280
- "tw:[&>input]:has-[[data-align=inline-end]:not(:empty)]:pr-2"
3281
- ],
3282
- {
3283
- defaultVariants: {
3284
- variant: "primary",
3285
- state: "default",
3286
- sizing: "medium",
3287
- focusVariant: "default"
3288
- },
3289
- compoundVariants: [
3290
- {
3291
- variant: "secondary",
3292
- state: "error",
3293
- className: ["tw:bg-error-100"]
3294
- },
3295
- {
3296
- variant: "secondary",
3297
- state: "warning",
3298
- className: ["tw:bg-warning-100"]
3299
- },
3300
- {
3301
- variant: "primary",
3302
- state: "default",
3303
- focusVariant: "off",
3304
- className: ["tw:has-[:is(input,textarea):focus]:border-neutral-200"]
3305
- },
3306
- {
3307
- variant: "secondary",
3308
- state: "default",
3309
- focusVariant: "off",
3310
- className: ["tw:has-[:is(input,textarea):focus]:border-neutral-100"]
3311
- },
3312
- {
3313
- variant: ["primary", "secondary"],
3314
- state: "error",
3315
- focusVariant: "on",
3316
- className: ["tw:!border-error-500", "tw:!ring-error-200"]
3317
- },
3318
- {
3319
- variant: ["primary", "secondary"],
3320
- state: "warning",
3321
- focusVariant: "on",
3322
- className: ["tw:!border-warning-500", "tw:!ring-warning-200"]
3323
- },
3324
- // --- argo ---
3325
- {
3326
- variant: "argo",
3327
- state: "default",
3328
- className: [
3329
- "tw:has-[:is(input,textarea):focus]:border-primary",
3330
- "tw:has-[:is(input,textarea):focus]:ring-ring/50"
3331
- ]
3332
- },
3333
- {
3334
- variant: "argo",
3335
- state: "error",
3336
- className: [
3337
- "tw:border-destructive",
3338
- "tw:has-[:is(input,textarea):focus]:border-destructive",
3339
- "tw:has-[:is(input,textarea):focus]:ring-destructive/20"
3340
- ]
3341
- },
3342
- {
3343
- variant: "argo",
3344
- focusVariant: "on",
3345
- className: ["tw:!border-primary", "tw:!ring-ring/50"]
3346
- },
3347
- {
3348
- variant: "argo",
3349
- state: "error",
3350
- focusVariant: "on",
3351
- className: ["tw:!border-destructive", "tw:!ring-destructive/20"]
3352
- },
3353
- {
3354
- variant: "argo",
3355
- state: "default",
3356
- focusVariant: "off",
3357
- className: ["tw:has-[:is(input,textarea):focus]:border-input"]
3358
- }
3359
- ],
3360
- variants: {
3361
- focusVariant: {
3362
- default: [],
3363
- on: ["tw:!border-ring", "tw:!ring-ring/30", "tw:!ring-4"],
3364
- off: ["tw:has-[:is(input,textarea):focus]:!ring-0"]
3365
- },
3366
- variant: {
3367
- primary: [
3368
- "tw:bg-white",
3369
- "tw:has-[:is(input,textarea):disabled]:opacity-40",
3370
- // aria-invalid on the control surfaces the error chrome without a `state` prop — the
3371
- // accessible path (mirrors the `state="error"` legacy tokens). Higher specificity than
3372
- // the default focus selector, so it wins without `!important`.
3373
- "tw:has-[:is(input,textarea)[aria-invalid=true]]:border-error-500",
3374
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-error-500",
3375
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-error-200"
3376
- ],
3377
- secondary: [
3378
- "tw:bg-neutral-100",
3379
- "tw:border-neutral-100",
3380
- "tw:has-[:is(input,textarea):disabled]:opacity-40",
3381
- "tw:has-[:is(input,textarea)[aria-invalid=true]]:border-error-500",
3382
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-error-500",
3383
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-error-200"
3384
- ],
3385
- argo: [
3386
- // argo follows the brand radius token (overrides the static base)
3387
- "tw:rounded-[var(--radius-lg,0.25rem)]",
3388
- // muted filled input surface — gray, distinct from white containers; not the app-background token
3389
- "tw:bg-muted",
3390
- "tw:border-input",
3391
- "tw:text-foreground",
3392
- "tw:has-[:is(input,textarea):disabled]:opacity-50",
3393
- // readonly: keep the themed input surface/border. The base layer's fixed
3394
- // `neutral-150` (a light grey) is correct for the legacy light chrome but
3395
- // collides with argo's themed `foreground` text — light-on-light, invisible
3396
- // in dark mode. Re-pin to the same `muted`/`input` tokens the editable argo
3397
- // input uses (validated AA), so readonly stays legible in every scheme.
3398
- "tw:has-[:is(input,textarea)[readonly]]:bg-muted",
3399
- "tw:has-[:is(input,textarea)[readonly]]:border-input",
3400
- // higher specificity than has-[:is(input,textarea):focus] — prevents focus border on readonly
3401
- "tw:has-[:is(input,textarea)[readonly]:focus]:border-input",
3402
- // aria-invalid on the control surfaces the error chrome without a `state` prop — the
3403
- // accessible path (uses the themeable `destructive` status token).
3404
- "tw:has-[:is(input,textarea)[aria-invalid=true]]:border-destructive",
3405
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-destructive",
3406
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-destructive/20"
3407
- ]
3408
- },
3409
- sizing: {
3410
- default: [
3411
- "tw:[&>:is(input,textarea)]:py-2.5",
3412
- "tw:[&>:is(input,textarea)]:leading-[18px]",
3413
- "tw:[&>textarea]:!min-h-[calc(2.5rem-2px)]"
3414
- ],
3415
- small: [
3416
- "tw:[&>:is(input,textarea)]:py-2",
3417
- "tw:[&>:is(input,textarea)]:leading-[16px]",
3418
- "tw:[&>textarea]:!min-h-[calc(2rem-2px)]"
3419
- ],
3420
- medium: [
3421
- "tw:[&>:is(input,textarea)]:py-2",
3422
- "tw:[&>:is(input,textarea)]:leading-[18px]",
3423
- "tw:[&>textarea]:!min-h-[calc(2.25rem-2px)]"
3424
- ]
3425
- },
3426
- state: {
3427
- default: [
3428
- "tw:has-[:is(input,textarea):focus]:border-ring",
3429
- "tw:has-[:is(input,textarea):focus]:ring-ring/30"
3430
- ],
3431
- error: [
3432
- "tw:border-error-500",
3433
- "tw:has-[:is(input,textarea):focus]:border-error-500",
3434
- "tw:has-[:is(input,textarea):focus]:ring-error-200"
3435
- ],
3436
- warning: [
3437
- "tw:border-warning-500",
3438
- "tw:has-[:is(input,textarea):focus]:border-warning-500",
3439
- "tw:has-[:is(input,textarea):focus]:ring-warning-200"
3440
- ]
3441
- }
3442
- }
3443
- }
3444
- );
3445
- var InputGroupRoot = ({
3446
- ref,
3447
- children,
3448
- state,
3449
- variant,
3450
- sizing,
3451
- focusVariant,
3452
- className,
3453
- ...props
3454
- }) => {
3455
- const isArgo = useArgoDesign();
3456
- const effectiveVariant = isArgo ? "argo" : variant;
3457
- const effectiveSizing = effectiveVariant === "argo" ? "medium" : sizing;
3458
- return /* @__PURE__ */ jsxRuntime.jsx(
3459
- "div",
3460
- {
3461
- ...props,
3462
- ref,
3463
- className: cn(
3464
- inputGroupVariants({
3465
- state,
3466
- variant: effectiveVariant,
3467
- sizing: effectiveSizing,
3468
- focusVariant,
3469
- className
3470
- })
3471
- ),
3472
- children
3473
- }
3474
- );
3475
- };
3476
- var InputGroup = InputGroupRoot;
3477
- InputGroup.Input = InputGroupInput;
3478
- InputGroup.Addon = InputGroupAddon;
3479
- InputGroup.Button = InputGroupButton;
3480
- InputGroup.TextArea = InputGroupTextArea;
3481
- InputGroup.Text = InputGroupText;
3482
- var useControllableState = ({
3483
- prop,
3484
- defaultProp,
3485
- onChange
3486
- }) => {
3487
- const [uncontrolled, setUncontrolled] = react.useState(defaultProp);
3488
- const isControlled = prop !== void 0;
3489
- const value = prop !== void 0 ? prop : uncontrolled;
3490
- const valueRef = react.useRef(value);
3491
- valueRef.current = value;
3492
- const onChangeRef = react.useRef(onChange);
3493
- onChangeRef.current = onChange;
3494
- const setValue = react.useCallback(
3495
- (next) => {
3496
- const nextValue = typeof next === "function" ? next(valueRef.current) : next;
3497
- valueRef.current = nextValue;
3498
- if (!isControlled) setUncontrolled(nextValue);
3499
- onChangeRef.current?.(nextValue);
3500
- },
3501
- [isControlled]
3502
- );
3503
- return [value, setValue];
3504
- };
3505
-
3506
- // src/blocks/ColorInput/ColorInput.tsx
3507
- init_icons();
3508
- init_utils2();
3509
- init_icons();
3510
-
3511
- // src/blocks/ColorInput/utils.ts
3512
- var HEX_CHARSET = /^[0-9a-fA-F]+$/;
3513
- var COMPLETE_HEX_PATTERN = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
3514
- var MAX_HEX_BODY_LENGTH = 8;
3515
- var PICKER_FALLBACK = "#000000";
3516
- var extractHexBody = (value) => {
3517
- if (typeof value !== "string") return null;
3518
- const trimmed = value.trim();
3519
- if (trimmed === "") return null;
3520
- return trimmed.startsWith("#") ? trimmed.slice(1) : trimmed;
3521
- };
3522
- var isCompleteHexColor = (value) => COMPLETE_HEX_PATTERN.test(value);
3523
- var showPicker = (input) => {
3524
- const isShowPickerSupported = "showPicker" in HTMLInputElement.prototype;
3525
- isShowPickerSupported ? input.showPicker() : input.click();
3526
- };
3527
- var coerceHexInputValue = (value) => {
3528
- const body = extractHexBody(value);
3529
- if (body === null) return "";
3530
- const [validBody] = body.match(/^[0-9a-fA-F]+/) ?? [];
3531
- if (!validBody) return "";
3532
- return `#${validBody.slice(0, MAX_HEX_BODY_LENGTH)}`;
3533
- };
3534
- var coerceColorPickerValue = (value) => {
3535
- const body = extractHexBody(value);
3536
- if (body === null || !HEX_CHARSET.test(body)) return PICKER_FALLBACK;
3537
- if (body.length === 3 || body.length === 4) {
3538
- const [r, g, b] = body;
3539
- return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();
3540
- }
3541
- if (body.length === 6 || body.length === 8) {
3542
- return `#${body.slice(0, 6).toLowerCase()}`;
3543
- }
3544
- return PICKER_FALLBACK;
3545
- };
3546
- var ColorPicker = ({ value, disabled, readOnly, ...props }) => {
3547
- const pickerRef = react.useRef(null);
3548
- const handleOpenPicker = () => {
3549
- if (!pickerRef.current) return;
3550
- showPicker(pickerRef.current);
3551
- };
3552
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "tw:relative", children: [
3553
- /* @__PURE__ */ jsxRuntime.jsx(
3554
- "input",
3555
- {
3556
- ...props,
3557
- ref: pickerRef,
3558
- type: "color",
3559
- value: coerceColorPickerValue(value),
3560
- tabIndex: -1,
3561
- "aria-hidden": true,
3562
- className: "tw:pointer-events-none tw:absolute tw:left-0 tw:top-full tw:size-0 tw:opacity-0",
3563
- disabled,
3564
- readOnly
3565
- }
3566
- ),
3567
- /* @__PURE__ */ jsxRuntime.jsx(
3568
- InputGroup.Button,
3569
- {
3570
- onMouseDown: (event) => event.preventDefault(),
3571
- disabled: disabled || readOnly,
3572
- onClick: handleOpenPicker,
3573
- "aria-label": "Pick color",
3574
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pipette, { className: "tw:size-4" })
3575
- }
3576
- )
3577
- ] });
3578
- };
3579
- var ColorInput = ({
3580
- ref,
3581
- // group props
3582
- state,
3583
- variant,
3584
- focusVariant,
3585
- sizing,
3586
- className,
3587
- // own props
3588
- value: valueProp,
3589
- onValueChange,
3590
- onValueBlur,
3591
- onChange,
3592
- onBlur,
3593
- defaultValue,
3594
- allowClear = false,
3595
- // input props
3596
- disabled,
3597
- readOnly,
3598
- ...restInputProps
3599
- }) => {
3600
- const inputRef = react.useRef(null);
3601
- const [value, setValue] = useControllableState({
3602
- // A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.
3603
- prop: valueProp === null ? "" : valueProp,
3604
- defaultProp: defaultValue ?? "",
3605
- onChange: onValueChange
3606
- });
3607
- const isControlled = valueProp !== void 0;
3608
- const canClear = allowClear && !!value && !disabled && !readOnly;
3609
- const swatchColor = coerceHexInputValue(value);
3610
- const isValidSwatch = isCompleteHexColor(swatchColor);
3611
- const handleChange = (event) => {
3612
- setValue(event.target.value);
3613
- onChange?.(event);
3614
- };
3615
- const handleBlur = (event) => {
3616
- const newValue = event.target.value;
3617
- const sanitizedNewValue = coerceHexInputValue(newValue);
3618
- if (sanitizedNewValue !== newValue) {
3619
- if (!isControlled) event.target.value = sanitizedNewValue;
3620
- setValue(sanitizedNewValue);
3621
- }
3622
- onValueBlur?.(sanitizedNewValue);
3623
- onBlur?.(event);
3624
- };
3625
- const handlePickerChange = (event) => {
3626
- setValue(coerceHexInputValue(event.target.value));
3627
- onChange?.(event);
3628
- };
3629
- const handleClear = () => {
3630
- if (!inputRef.current) return;
3631
- inputRef.current.value = "";
3632
- setValue("");
3633
- onChange?.(createChangeInputEvent(inputRef.current));
3634
- };
3635
- return /* @__PURE__ */ jsxRuntime.jsxs(
3636
- InputGroup,
3637
- {
3638
- state,
3639
- variant,
3640
- sizing,
3641
- focusVariant,
3642
- className,
3643
- children: [
3644
- /* @__PURE__ */ jsxRuntime.jsx(
3645
- InputGroup.Addon,
3646
- {
3647
- align: "inline-start",
3648
- className: cn(
3649
- { "tw:-ml-7 tw:opacity-0": !value },
3650
- "tw:transition-[opacity,margin]",
3651
- "tw:ease-linear",
3652
- "tw:duration-200"
3653
- ),
3654
- children: /* @__PURE__ */ jsxRuntime.jsx(
3655
- "div",
3656
- {
3657
- style: isValidSwatch ? { background: swatchColor } : void 0,
3658
- className: cn(
3659
- "tw:size-5",
3660
- "tw:shrink-0",
3661
- "tw:rounded-sm",
3662
- "tw:border",
3663
- "tw:border-solid",
3664
- "tw:border-neutral-300",
3665
- {
3666
- "tw:bg-[linear-gradient(to_top_right,transparent_calc(50%_-_1px),theme(colors.red.300)_calc(50%_-_1px),theme(colors.red.300)_calc(50%_+_1px),transparent_calc(50%_+_1px))]": !isValidSwatch
3667
- }
3668
- )
3669
- }
3670
- )
3671
- }
3672
- ),
3673
- /* @__PURE__ */ jsxRuntime.jsx(
3674
- InputGroup.Input,
3675
- {
3676
- ...restInputProps,
3677
- type: "text",
3678
- ref: mergeRefs(ref ?? null, inputRef),
3679
- value,
3680
- onChange: handleChange,
3681
- onBlur: handleBlur,
3682
- disabled,
3683
- readOnly
3684
- }
3685
- ),
3686
- /* @__PURE__ */ jsxRuntime.jsxs(InputGroup.Addon, { align: "inline-end", children: [
3687
- canClear && /* @__PURE__ */ jsxRuntime.jsx(
3688
- InputGroup.Button,
3689
- {
3690
- onMouseDown: (event) => event.preventDefault(),
3691
- onClick: handleClear,
3692
- "aria-label": "Clear color",
3693
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "tw:size-4" })
3694
- }
3695
- ),
3696
- /* @__PURE__ */ jsxRuntime.jsx(
3697
- ColorPicker,
3698
- {
3699
- disabled,
3700
- readOnly,
3701
- value,
3702
- onChange: handlePickerChange
3703
- }
3704
- )
3705
- ] })
3706
- ]
3707
- }
3708
- );
3709
- };
3710
- var FormGroupColorInput = ({ ref, ...props }) => {
3711
- const { state } = useFormGroupContext();
3712
- return /* @__PURE__ */ jsxRuntime.jsx(ColorInput, { state, ...props, ref });
3713
- };
3714
-
3715
- // src/blocks/FormGroup/FormGroupError.tsx
3716
- init_utils2();
3717
- var toMessage = (entry) => typeof entry === "string" ? entry : entry?.message;
3718
- var FormGroupError = ({ children, className, errors, ...rest }) => {
3719
- const content = react.useMemo(() => {
3720
- if (children) return children;
3721
- const messages = (errors ?? []).map(toMessage).filter((message) => !!message);
3722
- if (messages.length === 0) return null;
3723
- if (messages.length === 1) return messages[0];
3724
- return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "tw:m-0 tw:flex tw:list-disc tw:flex-col tw:gap-0 tw:pl-4", children: messages.map((message, index) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: message }, index)) });
3725
- }, [children, errors]);
3726
- if (!content) return null;
3727
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ...rest, role: "alert", className: cn("tw:m-0 tw:text-xs tw:text-destructive", className), children: content });
3728
- };
3729
- var helpVariants = classVarianceAuthority.cva(["tw:m-0", "tw:text-xs"], {
3730
- defaultVariants: {
3731
- state: "default"
3732
- },
3733
- variants: {
3734
- state: {
3735
- default: ["tw:text-muted-foreground"],
3736
- warning: ["tw:text-warning"]
3737
- }
3738
- }
3739
- });
3740
- var HelpBlock = ({ children, className, state = "default", ...rest }) => {
3741
- if (!children) return null;
3742
- return /* @__PURE__ */ jsxRuntime.jsx("p", { ...rest, className: helpVariants({ state, className }), children });
3743
- };
3744
- var FormGroupHelp = ({ children, ...rest }) => {
3745
- const formGroupContext = useFormGroupContext();
3746
- return /* @__PURE__ */ jsxRuntime.jsx(HelpBlock, { state: formGroupContext.state === "warning" ? "warning" : "default", ...rest, children });
3747
- };
3748
- var toNumberOrNull = (event) => Number.isNaN(event.target.valueAsNumber) ? null : event.target.valueAsNumber;
3749
- var NumberInput = ({
3750
- ref,
3751
- state,
3752
- variant,
3753
- focusVariant,
3754
- sizing,
3755
- className,
3756
- value,
3757
- defaultValue,
3758
- onValueChange,
3759
- onValueBlur,
3760
- onChange,
3761
- onBlur,
3762
- prefix,
3763
- suffix,
3764
- ...inputProps
3765
- }) => {
3766
- const handleChange = (event) => {
3767
- onValueChange?.(toNumberOrNull(event));
3768
- onChange?.(event);
3769
- };
3770
- const handleBlur = (event) => {
3771
- onValueBlur?.(toNumberOrNull(event));
3772
- onBlur?.(event);
3773
- };
3774
- const isControlled = value !== void 0;
3775
- const valueProp = isControlled ? { value: value ?? "" } : { defaultValue: defaultValue ?? "" };
3776
- return /* @__PURE__ */ jsxRuntime.jsxs(
3777
- InputGroup,
3778
- {
3779
- state,
3780
- variant,
3781
- sizing,
3782
- focusVariant,
3783
- className,
3784
- children: [
3785
- prefix && /* @__PURE__ */ jsxRuntime.jsx(InputGroup.Addon, { align: "inline-start", children: prefix }),
3786
- /* @__PURE__ */ jsxRuntime.jsx(
3787
- InputGroup.Input,
3788
- {
3789
- ...inputProps,
3790
- ...valueProp,
3791
- ref,
3792
- type: "number",
3793
- onChange: handleChange,
3794
- onBlur: handleBlur
3795
- }
3796
- ),
3797
- suffix && /* @__PURE__ */ jsxRuntime.jsx(InputGroup.Addon, { align: "inline-end", children: suffix })
3798
- ]
3799
- }
3800
- );
3801
- };
3802
- var FormGroupNumberInput = ({ ref, ...props }) => {
3803
- const { state } = useFormGroupContext();
3804
- return /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...props, ref, state });
3805
- };
3806
- var Textarea = ({
3807
- ref,
3808
- containerClassName,
3809
- // group props
3810
- state = "default",
3811
- variant,
3812
- sizing,
3813
- focusVariant,
3814
- // value handling
3815
- value: valueProp,
3816
- defaultValue,
3817
- onValueChange,
3818
- ...rest
3819
- }) => {
3820
- const [value, setValue] = useControllableState({
3821
- // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled, coerced to ''.
3822
- prop: valueProp === void 0 ? void 0 : valueProp ?? "",
3823
- defaultProp: defaultValue ?? "",
3824
- onChange: onValueChange
3825
- });
3826
- return /* @__PURE__ */ jsxRuntime.jsx(
3827
- InputGroup,
3828
- {
3829
- state,
3830
- sizing,
3831
- focusVariant,
3832
- variant,
3833
- className: containerClassName,
3834
- children: /* @__PURE__ */ jsxRuntime.jsx(InputGroup.TextArea, { ...rest, ref, value, onValueChange: setValue })
3835
- }
3836
- );
3837
- };
3838
- var FormGroupTextarea = (props) => {
3839
- const { state } = useFormGroupContext();
3840
- return /* @__PURE__ */ jsxRuntime.jsx(Textarea, { state, ...props });
3841
- };
3842
- init_icons();
3843
- init_utils2();
3844
-
3845
- // src/blocks/TextInput/utils.ts
3846
- init_utils2();
3847
- var genInputTestId = (prefix = "") => {
3848
- const ps = createPrefixedString(prefix);
3849
- return {
3850
- toString: () => prefix,
3851
- inputWrapper: ps`input-wrapper`,
3852
- input: ps`input`,
3853
- clearButton: ps`clear-button`
3854
- };
3855
- };
3856
- var sanitizeTextInputValue = (value) => {
3857
- if (typeof value === "string" && value.trim() === "") return "";
3858
- return value;
3859
- };
3860
- var TextInput = ({
3861
- ref: forwardedRef,
3862
- state = "default",
3863
- sizing = "default",
3864
- className,
3865
- prefix = null,
3866
- rightSuffix = null,
3867
- rightSuffixVariant = "default",
3868
- leftSuffix = null,
3869
- allowClear = false,
3870
- onClear,
3871
- disabled = false,
3872
- testId: prefixTestId = "",
3873
- autoFocus = false,
3874
- id,
3875
- name,
3876
- variant,
3877
- readOnly,
3878
- type = "text",
3879
- focusVariant = "default",
3880
- onChange,
3881
- onBlur,
3882
- onValueChange,
3883
- onValueBlur,
3884
- value: valueProp,
3885
- defaultValue,
3886
- ...inputProps
3887
- }) => {
3888
- const inputRef = react.useRef(null);
3889
- const [value, setValue] = useControllableState({
3890
- // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled and coerced
3891
- // to a string. Whitespace-only input collapses to '' via `sanitizeTextInputValue`.
3892
- prop: valueProp === void 0 ? void 0 : sanitizeTextInputValue(valueProp) ?? "",
3893
- defaultProp: sanitizeTextInputValue(defaultValue) ?? "",
3894
- onChange: onValueChange
3895
- });
3896
- const testId = genInputTestId(prefixTestId);
3897
- const isClearButtonVisible = !!value && !disabled && !readOnly || !!onClear;
3898
- const handleChange = (event) => {
3899
- setValue(event.target.value);
3900
- onChange?.(event);
3901
- };
3902
- const handleBlur = (event) => {
3903
- onValueBlur?.(event.target.value);
3904
- onBlur?.(event);
3905
- };
3906
- const handleClear = () => {
3907
- if (inputRef.current === null) return;
3908
- inputRef.current.value = "";
3909
- inputRef.current.focus();
3910
- onClear?.();
3911
- handleChange(createChangeInputEvent(inputRef.current));
3912
- };
3913
- return /* @__PURE__ */ jsxRuntime.jsxs(
3914
- InputGroup,
3915
- {
3916
- state,
3917
- variant,
3918
- sizing,
3919
- focusVariant,
3920
- className,
3921
- "data-testid": testId.inputWrapper,
3922
- children: [
3923
- prefix && /* @__PURE__ */ jsxRuntime.jsx(InputGroup.Addon, { align: "inline-start", children: prefix }),
3924
- /* @__PURE__ */ jsxRuntime.jsx(
3925
- InputGroup.Input,
3926
- {
3927
- ...inputProps,
3928
- value,
3929
- autoFocus,
3930
- type,
3931
- onChange: handleChange,
3932
- onBlur: handleBlur,
3933
- ref: mergeRefs(forwardedRef ?? null, inputRef),
3934
- disabled,
3935
- id,
3936
- name,
3937
- readOnly,
3938
- "data-testid": testId.input
3939
- }
3940
- ),
3941
- (leftSuffix || allowClear || rightSuffix) && /* @__PURE__ */ jsxRuntime.jsxs(InputGroup.Addon, { align: "inline-end", children: [
3942
- leftSuffix,
3943
- allowClear && isClearButtonVisible && /* @__PURE__ */ jsxRuntime.jsx(
3944
- InputGroup.Button,
3945
- {
3946
- "aria-label": "Clear",
3947
- onMouseDown: (e) => e.preventDefault(),
3948
- onClick: handleClear,
3949
- "data-testid": testId.clearButton,
3950
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "tw:size-4" })
3951
- }
3952
- ),
3953
- rightSuffix && /* @__PURE__ */ jsxRuntime.jsx(
3954
- "div",
3955
- {
3956
- className: cn({
3957
- "tw:whitespace-nowrap tw:bg-muted tw:px-4 tw:-mr-4 tw:py-2.5": rightSuffixVariant === "addon"
3958
- }),
3959
- children: rightSuffix
3960
- }
3961
- )
3962
- ] })
3963
- ]
3964
- }
3965
- );
3966
- };
3967
- var FormGroupTextInput = ({ ref, ...props }) => {
3968
- const { state } = useFormGroupContext();
3969
- return /* @__PURE__ */ jsxRuntime.jsx(TextInput, { state, ...props, ref });
3970
- };
3971
- var FormGroup = ({ className, children, state, ...rest }) => {
3972
- return /* @__PURE__ */ jsxRuntime.jsx(FormGroupProvider, { value: { state }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { ...rest, className: cn("tw:flex tw:flex-col tw:gap-1", className), children }) });
3973
- };
3974
- FormGroup.Help = FormGroupHelp;
3975
- FormGroup.Error = FormGroupError;
3976
- FormGroup.TextInput = FormGroupTextInput;
3977
- FormGroup.NumberInput = FormGroupNumberInput;
3978
- FormGroup.ColorInput = FormGroupColorInput;
3979
- FormGroup.Textarea = FormGroupTextarea;
3980
-
3981
- // src/blocks/MarkdownEditor/plugins/toolbar/LinkPanel.tsx
3982
- init_Button2();
3983
-
3984
- // src/components/ButtonGroup/ButtonGroup.tsx
3985
- init_utils2();
3986
- var buttonGroupVariant = classVarianceAuthority.cva(
3987
- ["tailwindcss-preflight", "tw:inline-flex", "tw:items-center", "tw:group/button-group"],
3988
- {
3989
- defaultVariants: {
3990
- variant: "inline",
3991
- space: "small"
3992
- },
3993
- variants: {
3994
- variant: {
3995
- inline: [],
3996
- block: [
3997
- "tw:w-full",
3998
- "tw:flex-col",
3999
- "tw:sm:flex-row",
4000
- "tw:[&_a]:flex-1",
4001
- "tw:[&>button:not([data-icon-only=true])]:flex-1"
4002
- ]
4003
- },
4004
- space: {
4005
- "extra-small": "tw:gap-1",
4006
- "little-small": "tw:gap-2",
4007
- small: "tw:gap-3",
4008
- medium: "tw:gap-4",
4009
- large: "tw:gap-6",
4010
- compact: [
4011
- "tw:border-collapse",
4012
- "tw:!gap-0",
4013
- // ensure that focus visible outline is at the top
4014
- "tw:[&>*:focus-visible]:!z-10",
4015
- "tw:[&>*:not(:first-child)]:rounded-l-none",
4016
- "tw:[&>*:not(:last-child)]:rounded-r-none",
4017
- "tw:[&>*:not(:last-child)]:border-r-0",
4018
- "tw:[&>*:not(:first-child)]:border-l-0",
4019
- // separator
4020
- "tw:[&>*:not(:first-child)]:before:content",
4021
- "tw:[&>*:not(:first-child)]:before:absolute",
4022
- "tw:[&>*:not(:first-child)]:before:left-0",
4023
- "tw:[&>*:not(:first-child)]:before:h-full",
4024
- "tw:[&>*:not(:first-child)]:before:w-px",
4025
- "tw:[&>*:not(:first-child)]:before:bg-black/10"
4026
- ]
4027
- }
4028
- }
4029
- }
4030
- );
4031
- var ButtonGroup = ({
4032
- ref,
4033
- children,
4034
- space = "small",
4035
- className,
4036
- variant,
4037
- ...rest
4038
- }) => {
4039
- return /* @__PURE__ */ jsxRuntime.jsx(
4040
- "div",
4041
- {
4042
- ref,
4043
- ...rest,
4044
- role: "group",
4045
- "data-variant": variant,
4046
- className: cn(buttonGroupVariant({ variant, space }), className),
4047
- children
4048
- }
4049
- );
4050
- };
4051
-
4052
- // src/components/Label/Label.tsx
4053
- init_utils2();
4054
- var Optional = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("span", { ...props, "aria-hidden": true, className: cn("tw:ml-0.5", "tw:text-muted-foreground", className), children: "(optional)" });
4055
- var Required = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("span", { ...props, "aria-hidden": true, className: cn("tw:ml-0.5", "tw:text-primary", className), children: "*" });
4056
- var Label2 = ({ className, children, id, htmlFor, ...rest }) => /* @__PURE__ */ jsxRuntime.jsx(
4057
- RLabel__namespace.Root,
4058
- {
4059
- ...rest,
4060
- id: id?.toString(),
4061
- htmlFor: htmlFor?.toString(),
4062
- className: cn(
4063
- "tw:m-0 tw:text-foreground tw:font-normal tw:peer-disabled:opacity-50",
4064
- className
4065
- ),
4066
- children
4067
- }
4068
- );
4069
- Label2.Optional = Optional;
4070
- Label2.Required = Required;
4071
-
4072
- // src/blocks/MarkdownEditor/plugins/toolbar/LinkPanel.tsx
4073
- init_icons();
4074
-
4075
- // src/blocks/MarkdownEditor/plugins/toolbar/ToolbarButton.tsx
4076
- init_Tooltip2();
4077
- init_utils2();
4078
- var ToolbarButton = ({
4079
- active,
4080
- disabled,
4081
- onClick,
4082
- tooltip,
4083
- children,
4084
- className: extraClassName
4085
- }) => /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { tooltip, placement: "top", triggerAsChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
4086
- "button",
4087
- {
4088
- type: "button",
4089
- disabled,
4090
- onClick,
4091
- className: cn(
4092
- "tw:flex tw:h-7 tw:min-w-7 tw:cursor-pointer tw:items-center tw:justify-center tw:rounded tw:border-0 tw:bg-transparent tw:px-1 tw:text-xs tw:text-muted-foreground",
4093
- "tw:hover:bg-accent tw:disabled:cursor-not-allowed tw:disabled:opacity-30",
4094
- active && "tw:bg-secondary-100 tw:text-secondary-500",
4095
- extraClassName
4096
- ),
4097
- children
4098
- }
4099
- ) });
4100
- var insertLink = (editor, url, label, savedSelection) => {
4101
- editor.update(() => {
4102
- lexical.$setSelection(savedSelection);
4103
- const selection = lexical.$getSelection();
4104
- if (lexical.$isRangeSelection(selection)) {
4105
- const selectedText = selection.getTextContent();
4106
- if (selectedText && label === selectedText) {
4107
- editor.dispatchCommand(link.TOGGLE_LINK_COMMAND, url);
4108
- return;
4109
- }
4110
- }
4111
- const linkNode = link.$createLinkNode(url);
4112
- const textNode = lexical.$createTextNode(label || url);
4113
- linkNode.append(textNode);
4114
- if (lexical.$isRangeSelection(selection)) {
4115
- selection.insertNodes([linkNode]);
4116
- }
4117
- });
4118
- };
4119
- var LinkPanel = ({ editor, isLink }) => {
4120
- const [open, setOpen] = react.useState(false);
4121
- const [url, setUrl] = react.useState("");
4122
- const [label, setLabel] = react.useState("");
4123
- const savedSelectionRef = react.useRef(null);
4124
- const panelRef = react.useRef(null);
4125
- const handleOpen = () => {
4126
- editor.getEditorState().read(() => {
4127
- const selection = lexical.$getSelection();
4128
- savedSelectionRef.current = selection ? selection.clone() : null;
4129
- if (lexical.$isRangeSelection(selection)) {
4130
- const text = selection.getTextContent();
4131
- if (text) setLabel(text);
4132
- }
4133
- });
4134
- setOpen(true);
4135
- };
4136
- const handleClose = () => {
4137
- setOpen(false);
4138
- setUrl("");
4139
- setLabel("");
4140
- savedSelectionRef.current = null;
4141
- editor.focus();
4142
- };
4143
- const handleSubmit = () => {
4144
- const trimmedUrl = url.trim();
4145
- if (!trimmedUrl) return;
4146
- insertLink(editor, trimmedUrl, label.trim(), savedSelectionRef.current);
4147
- handleClose();
4148
- };
4149
- const handleKeyDown = (e) => {
4150
- if (e.key === "Enter") {
4151
- e.preventDefault();
4152
- handleSubmit();
4153
- }
4154
- if (e.key === "Escape") {
4155
- e.preventDefault();
4156
- handleClose();
4157
- }
4158
- };
4159
- if (isLink) {
4160
- return /* @__PURE__ */ jsxRuntime.jsx(
4161
- ToolbarButton,
4162
- {
4163
- active: true,
4164
- onClick: () => editor.dispatchCommand(link.TOGGLE_LINK_COMMAND, null),
4165
- tooltip: "Remove Link",
4166
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Link, { className: "tw:size-4" })
4167
- }
4168
- );
4169
- }
4170
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "tw:relative", children: [
4171
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { active: open, onClick: handleOpen, tooltip: "Insert Link", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Link, { className: "tw:size-4" }) }),
4172
- open && /* @__PURE__ */ jsxRuntime.jsx(
4173
- "div",
4174
- {
4175
- ref: panelRef,
4176
- className: "tw:absolute tw:left-0 tw:top-full tw:z-50 tw:mt-1 tw:w-80 tw:rounded-md tw:border tw:border-border tw:bg-popover tw:p-3 tw:text-popover-foreground tw:shadow-lg",
4177
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "tw:flex tw:flex-col tw:gap-2", children: [
4178
- /* @__PURE__ */ jsxRuntime.jsxs(FormGroup, { children: [
4179
- /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: "link-label", className: "tw:mb-1 tw:text-xs", children: "Label" }),
4180
- /* @__PURE__ */ jsxRuntime.jsx(
4181
- TextInput,
4182
- {
4183
- id: "link-label",
4184
- autoFocus: true,
4185
- placeholder: "Link text",
4186
- value: label,
4187
- onValueChange: setLabel,
4188
- onKeyDown: handleKeyDown,
4189
- variant: "secondary"
4190
- }
4191
- )
4192
- ] }),
4193
- /* @__PURE__ */ jsxRuntime.jsxs(FormGroup, { children: [
4194
- /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: "link-url", className: "tw:mb-1 tw:text-xs", children: "URL" }),
4195
- /* @__PURE__ */ jsxRuntime.jsx(
4196
- TextInput,
4197
- {
4198
- id: "link-url",
4199
- placeholder: "https://\u2026",
4200
- value: url,
4201
- onValueChange: setUrl,
4202
- onKeyDown: handleKeyDown,
4203
- variant: "secondary"
4204
- }
4205
- )
4206
- ] }),
4207
- /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
4208
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "small", variant: "outline", onClick: handleClose, children: "Cancel" }),
4209
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "small", onClick: handleSubmit, disabled: !url.trim(), children: "Add link" })
4210
- ] })
4211
- ] })
4212
- }
4213
- )
4214
- ] });
4215
- };
4216
- var ToolbarDivider = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "tw:mx-0.5 tw:h-5 tw:w-px tw:bg-border" });
4217
- var ELEMENT_FORMAT_TYPES = ["left", "center", "right", "justify", "start", "end", ""];
4218
- var isElementFormatType = (value) => ELEMENT_FORMAT_TYPES.includes(value);
4219
- var toElementFormatType = (value) => isElementFormatType(value) ? value : "left";
4220
- var ToolbarPlugin = () => {
4221
- const [editor] = LexicalComposerContext.useLexicalComposerContext();
4222
- const [isBold, setIsBold] = react.useState(false);
4223
- const [isItalic, setIsItalic] = react.useState(false);
4224
- const [isUnderline, setIsUnderline] = react.useState(false);
4225
- const [isStrikethrough, setIsStrikethrough] = react.useState(false);
4226
- const [isCode, setIsCode] = react.useState(false);
4227
- const [isLink, setIsLink] = react.useState(false);
4228
- const [blockType, setBlockType] = react.useState("paragraph");
4229
- const [alignment, setAlignment] = react.useState("left");
4230
- const [isVisible, setIsVisible] = react.useState(false);
4231
- const [position, setPosition] = react.useState(null);
4232
- const toolbarRef = react.useRef(null);
4233
- const isMouseDownRef = react.useRef(false);
4234
- const hasSelectionRef = react.useRef(false);
4235
- const updatePosition = react.useCallback(() => {
4236
- const nativeSelection = window.getSelection();
4237
- if (!nativeSelection || nativeSelection.rangeCount === 0) return;
4238
- const range = nativeSelection.getRangeAt(0);
4239
- const rect = range.getBoundingClientRect();
4240
- if (rect.width > 0) {
4241
- const toolbarWidth = toolbarRef.current?.offsetWidth ?? 300;
4242
- setPosition({
4243
- top: rect.top + window.scrollY - 8,
4244
- left: Math.max(8, rect.left + window.scrollX + rect.width / 2 - toolbarWidth / 2)
4245
- });
4246
- }
4247
- }, []);
4248
- react.useEffect(() => {
4249
- const handleMouseDown = () => {
4250
- isMouseDownRef.current = true;
4251
- };
4252
- const handleMouseUp = () => {
4253
- isMouseDownRef.current = false;
4254
- if (hasSelectionRef.current) {
4255
- setIsVisible(true);
4256
- }
4257
- };
4258
- document.addEventListener("mousedown", handleMouseDown);
4259
- document.addEventListener("mouseup", handleMouseUp);
4260
- return () => {
4261
- document.removeEventListener("mousedown", handleMouseDown);
4262
- document.removeEventListener("mouseup", handleMouseUp);
4263
- };
4264
- }, []);
4265
- const updateToolbar = react.useCallback(() => {
4266
- const selection = lexical.$getSelection();
4267
- if (!lexical.$isRangeSelection(selection)) {
4268
- hasSelectionRef.current = false;
4269
- setIsVisible(false);
4270
- return;
4271
- }
4272
- const hasSelection = !selection.isCollapsed() && selection.getTextContent().length > 0;
4273
- hasSelectionRef.current = hasSelection;
4274
- if (!hasSelection) {
4275
- setIsVisible(false);
4276
- } else if (!isMouseDownRef.current) {
4277
- setIsVisible(true);
4278
- }
4279
- if (hasSelection) {
4280
- updatePosition();
4281
- }
4282
- setIsBold(selection.hasFormat("bold"));
4283
- setIsItalic(selection.hasFormat("italic"));
4284
- setIsUnderline(selection.hasFormat("underline"));
4285
- setIsStrikethrough(selection.hasFormat("strikethrough"));
4286
- setIsCode(selection.hasFormat("code"));
4287
- const node = selection.anchor.getNode();
4288
- const parent = node.getParent();
4289
- setIsLink(link.$isLinkNode(parent) || link.$isLinkNode(node));
4290
- const blockElement = utils.$getNearestBlockElementAncestorOrThrow(node);
4291
- if (list.$isListNode(blockElement)) {
4292
- const listType = blockElement.getListType();
4293
- setBlockType(listType === "number" ? "number" : "bullet");
4294
- } else if (richText.$isHeadingNode(blockElement)) {
4295
- setBlockType(blockElement.getTag());
4296
- } else if (code.$isCodeNode(blockElement)) {
4297
- setBlockType("code");
4298
- } else if (richText.$isQuoteNode(blockElement)) {
4299
- setBlockType("quote");
4300
- } else {
4301
- setBlockType("paragraph");
4302
- }
4303
- setAlignment(toElementFormatType(blockElement.getFormatType()));
4304
- }, [updatePosition]);
4305
- react.useEffect(() => {
4306
- const unregisterUpdate = editor.registerUpdateListener(({ editorState }) => {
4307
- editorState.read(() => {
4308
- updateToolbar();
4309
- });
4310
- });
4311
- return () => {
4312
- unregisterUpdate();
4313
- };
4314
- }, [editor, updateToolbar]);
4315
- if (!isVisible || !position) return null;
4316
- return reactDom.createPortal(
4317
- /* @__PURE__ */ jsxRuntime.jsxs(
4318
- "div",
4319
- {
4320
- ref: toolbarRef,
4321
- role: "toolbar",
4322
- "aria-label": "Formatting options",
4323
- onMouseDown: (e) => e.preventDefault(),
4324
- style: { top: position.top, left: position.left },
4325
- className: "tw:absolute tw:z-[1060] tw:flex tw:-translate-y-full tw:items-center tw:gap-0.5 tw:rounded-lg tw:border tw:border-border tw:bg-popover tw:px-1.5 tw:py-1 tw:text-popover-foreground tw:shadow-lg",
4326
- children: [
4327
- /* @__PURE__ */ jsxRuntime.jsx(BlockTypeDropdown, { editor, blockType }),
4328
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarDivider, {}),
4329
- /* @__PURE__ */ jsxRuntime.jsx(
4330
- ToolbarButton,
4331
- {
4332
- active: isBold,
4333
- onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "bold"),
4334
- tooltip: "Bold (Ctrl+B)",
4335
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bold, { className: "tw:size-4" })
4336
- }
4337
- ),
4338
- /* @__PURE__ */ jsxRuntime.jsx(
4339
- ToolbarButton,
4340
- {
4341
- active: isItalic,
4342
- onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "italic"),
4343
- tooltip: "Italic (Ctrl+I)",
4344
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Italic, { className: "tw:size-4" })
4345
- }
4346
- ),
4347
- /* @__PURE__ */ jsxRuntime.jsx(
4348
- ToolbarButton,
4349
- {
4350
- active: isUnderline,
4351
- onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "underline"),
4352
- tooltip: "Underline (Ctrl+U)",
4353
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Underline, { className: "tw:size-4" })
4354
- }
4355
- ),
4356
- /* @__PURE__ */ jsxRuntime.jsx(
4357
- ToolbarButton,
4358
- {
4359
- active: isStrikethrough,
4360
- onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "strikethrough"),
4361
- tooltip: "Strikethrough",
4362
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Strikethrough, { className: "tw:size-4" })
4363
- }
4364
- ),
4365
- /* @__PURE__ */ jsxRuntime.jsx(
4366
- ToolbarButton,
4367
- {
4368
- active: isCode,
4369
- onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "code"),
4370
- tooltip: "Inline Code",
4371
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Code, { className: "tw:size-4" })
4372
- }
4373
- ),
4374
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarDivider, {}),
4375
- /* @__PURE__ */ jsxRuntime.jsx(LinkPanel, { editor, isLink }),
4376
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarDivider, {}),
4377
- /* @__PURE__ */ jsxRuntime.jsx(
4378
- ToolbarButton,
4379
- {
4380
- active: blockType === "bullet",
4381
- onClick: () => {
4382
- if (blockType === "bullet") {
4383
- editor.dispatchCommand(list.REMOVE_LIST_COMMAND, void 0);
4384
- } else {
4385
- editor.dispatchCommand(list.INSERT_UNORDERED_LIST_COMMAND, void 0);
4386
- }
4387
- },
4388
- tooltip: "Bullet List",
4389
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.List, { className: "tw:size-4" })
4390
- }
4391
- ),
4392
- /* @__PURE__ */ jsxRuntime.jsx(
4393
- ToolbarButton,
4394
- {
4395
- active: blockType === "number",
4396
- onClick: () => {
4397
- if (blockType === "number") {
4398
- editor.dispatchCommand(list.REMOVE_LIST_COMMAND, void 0);
4399
- } else {
4400
- editor.dispatchCommand(list.INSERT_ORDERED_LIST_COMMAND, void 0);
4401
- }
4402
- },
4403
- tooltip: "Numbered List",
4404
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ListOrdered, { className: "tw:size-4" })
4405
- }
4406
- ),
4407
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarDivider, {}),
4408
- /* @__PURE__ */ jsxRuntime.jsx(AlignmentDropdown, { editor, alignment }),
4409
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarDivider, {}),
4410
- /* @__PURE__ */ jsxRuntime.jsx(
4411
- ToolbarButton,
4412
- {
4413
- active: blockType === "quote",
4414
- onClick: () => {
4415
- editor.update(() => {
4416
- const selection = lexical.$getSelection();
4417
- if (!lexical.$isRangeSelection(selection)) return;
4418
- const anchorNode = selection.anchor.getNode();
4419
- const element = utils.$getNearestBlockElementAncestorOrThrow(anchorNode);
4420
- const newNode = blockType === "quote" ? lexical.$createParagraphNode() : richText.$createQuoteNode();
4421
- element.getChildren().forEach((child) => newNode.append(child));
4422
- element.replace(newNode);
4423
- });
4424
- },
4425
- tooltip: "Quote",
4426
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Quote, { className: "tw:size-4" })
4427
- }
4428
- ),
4429
- /* @__PURE__ */ jsxRuntime.jsx(
4430
- ToolbarButton,
4431
- {
4432
- active: blockType === "code",
4433
- onClick: () => {
4434
- editor.update(() => {
4435
- const selection = lexical.$getSelection();
4436
- if (!lexical.$isRangeSelection(selection)) return;
4437
- const anchorNode = selection.anchor.getNode();
4438
- const element = utils.$getNearestBlockElementAncestorOrThrow(anchorNode);
4439
- const newNode = blockType === "code" ? lexical.$createParagraphNode() : code.$createCodeNode();
4440
- element.getChildren().forEach((child) => newNode.append(child));
4441
- element.replace(newNode);
4442
- });
4443
- },
4444
- tooltip: "Code Block",
4445
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SquareCode, { className: "tw:size-4" })
4446
- }
4447
- )
4448
- ]
4449
- }
4450
- ),
4451
- document.body
4452
- );
4453
- };
4454
-
4455
- // src/blocks/MarkdownEditor/theme.ts
4456
- var editorTheme = {
4457
- link: "tw:cursor-pointer tw:!text-primary tw:underline",
4458
- text: {
4459
- bold: "tw:font-bold",
4460
- italic: "tw:italic",
4461
- strikethrough: "tw:line-through",
4462
- underline: "tw:underline",
4463
- code: "tw:rounded tw:bg-muted tw:px-1 tw:py-0.5 tw:font-mono tw:text-[0.85em]"
4464
- },
4465
- list: {
4466
- ol: "tw:!list-decimal",
4467
- ul: "tw:!list-disc",
4468
- checklist: "tw:!list-none tw:!pl-0",
4469
- listitemChecked: [
4470
- "tw:relative tw:!pl-6 tw:list-none tw:outline-hidden tw:line-through tw:text-muted-foreground",
4471
- 'tw:before:content-[""] tw:before:absolute tw:before:left-0 tw:before:top-[3px]',
4472
- "tw:before:size-4 tw:before:rounded tw:before:border tw:before:border-solid",
4473
- "tw:before:bg-primary tw:before:border-primary tw:before:cursor-pointer",
4474
- 'tw:after:content-[""] tw:after:absolute tw:after:left-[5.5px] tw:after:top-[5.5px]',
4475
- "tw:after:w-1 tw:after:h-2 tw:after:border-primary-foreground tw:after:border-solid",
4476
- "tw:after:border-r-[1.5px] tw:after:border-b-[1.5px] tw:after:border-t-0 tw:after:border-l-0",
4477
- "tw:after:rotate-45"
4478
- ].join(" "),
4479
- listitemUnchecked: [
4480
- "tw:relative tw:!pl-6 tw:list-none tw:outline-hidden",
4481
- 'tw:before:content-[""] tw:before:absolute tw:before:left-0 tw:before:top-[3px]',
4482
- "tw:before:size-4 tw:before:rounded tw:before:border tw:before:border-solid",
4483
- "tw:before:border-input tw:before:bg-background tw:before:cursor-pointer"
4484
- ].join(" ")
4485
- }
4486
- };
4487
- var EDITOR_NODES = [
4488
- ImageNode,
4489
- MermaidNode,
4490
- richText.HeadingNode,
4491
- richText.QuoteNode,
4492
- list.ListNode,
4493
- list.ListItemNode,
4494
- code.CodeNode,
4495
- link.LinkNode,
4496
- LexicalHorizontalRuleNode.HorizontalRuleNode
4497
- ];
4498
- var MarkdownEditor = ({
4499
- value,
4500
- onChange,
4501
- readOnly = false,
4502
- placeholder,
4503
- autoFocus = false,
4504
- disabled = false,
4505
- onSave,
4506
- onCancel,
4507
- onImageUpload,
4508
- className,
4509
- imageRenderer,
4510
- showToolbar = false,
4511
- compact = false,
4512
- saveOnBlur = false,
4513
- singleLine = false,
4514
- clampDisplay = false,
4515
- minRows
4516
- }) => {
4517
- const editable = !readOnly && !disabled;
4518
- const transformers = singleLine ? SINGLE_LINE_TRANSFORMERS : CUSTOM_TRANSFORMERS;
4519
- const useDefaultMinHeight = !compact && minRows === void 0;
4520
- const customMinHeight = !compact && minRows !== void 0 ? { minHeight: `${minRows * 1.75}em` } : void 0;
4521
- const [initialConfig] = react.useState(() => ({
4522
- namespace: "MarkdownEditor",
4523
- theme: editorTheme,
4524
- nodes: EDITOR_NODES,
4525
- onError: (error) => {
4526
- console.error("[MarkdownEditor] uncaught editor error", error);
4527
- },
4528
- editable,
4529
- editorState: () => {
4530
- markdown.$convertFromMarkdownString(preprocessMarkdown(value), transformers);
4531
- }
4532
- }));
4533
- const skipBlurSaveRef = react.useRef(false);
4534
- const handleBlur = saveOnBlur && onSave ? (event) => {
4535
- if (skipBlurSaveRef.current) {
4536
- skipBlurSaveRef.current = false;
4537
- return;
4538
- }
4539
- if (!event.currentTarget.contains(event.relatedTarget)) {
4540
- onSave();
4541
- }
4542
- } : void 0;
4543
- return /* @__PURE__ */ jsxRuntime.jsx(LexicalComposer.LexicalComposer, { initialConfig, children: /* @__PURE__ */ jsxRuntime.jsx(ImageRendererProvider, { value: imageRenderer ?? null, children: /* @__PURE__ */ jsxRuntime.jsxs(
4544
- "div",
4545
- {
4546
- className: cn(
4547
- !compact && "tw:prose",
4548
- // Compact mode drops `tw:prose`, so Lexical's <p> wrappers fall back to the browser
4549
- // default `margin: 1em 0` — visually huge at heading sizes. Zero them, and use the
4550
- // adjacent-sibling selector for paragraph spacing so single-paragraph blocks (titles,
4551
- // short descriptions) stay tight while multi-paragraph blocks still breathe.
4552
- compact && "tw:[&_p]:m-0 tw:[&_p+p]:mt-2",
4553
- // Display-state clamp: 2 lines, dropped in focus-within so editing expands to full
4554
- // height. line-clamp is self-gating (no effect below 3 lines), so short/empty content
4555
- // renders clean; a CSS fade can't gate on overflow without JS, so it's omitted.
4556
- clampDisplay && "tw:[&:not(:focus-within)]:line-clamp-2",
4557
- className
4558
- ),
4559
- onBlur: handleBlur,
4560
- children: [
4561
- showToolbar && editable && /* @__PURE__ */ jsxRuntime.jsx(ToolbarPlugin, {}),
4562
- /* @__PURE__ */ jsxRuntime.jsx(
4563
- "div",
4564
- {
4565
- className: cn(
4566
- "tw:relative tw:rounded-md tw:transition-colors",
4567
- // In compact mode the padding lets the hover bg / focus ring extend past the text,
4568
- // but a matching negative margin shifts the wrapper outward so the text itself stays
4569
- // aligned with the parent's content edge (i.e. with where static text would render).
4570
- compact ? "tw:px-1.5 tw:py-0.5 tw:-mx-1.5 tw:-my-0.5" : "tw:p-2",
4571
- editable && "tw:cursor-text tw:hover:bg-muted tw:focus-within:ring-2 tw:focus-within:ring-ring/40"
4572
- ),
4573
- children: /* @__PURE__ */ jsxRuntime.jsx(
4574
- LexicalRichTextPlugin.RichTextPlugin,
4575
- {
4576
- contentEditable: /* @__PURE__ */ jsxRuntime.jsx(
4577
- LexicalContentEditable.ContentEditable,
4578
- {
4579
- className: cn("tw:outline-hidden", useDefaultMinHeight && "tw:min-h-[100px]"),
4580
- style: customMinHeight,
4581
- "aria-placeholder": placeholder ?? "",
4582
- placeholder: placeholder ? /* @__PURE__ */ jsxRuntime.jsx(
4583
- "div",
4584
- {
4585
- className: cn(
4586
- "tw:pointer-events-none tw:absolute tw:select-none tw:text-muted-foreground",
4587
- compact ? "tw:left-1.5 tw:top-0.5" : "tw:left-2 tw:top-[calc(0.5rem+0.35em)]"
4588
- ),
4589
- children: placeholder
4590
- }
4591
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", {})
4592
- }
4593
- ),
4594
- ErrorBoundary: LexicalErrorBoundary.LexicalErrorBoundary
4595
- }
4596
- )
4597
- }
4598
- ),
4599
- /* @__PURE__ */ jsxRuntime.jsx(LexicalHistoryPlugin.HistoryPlugin, {}),
4600
- /* @__PURE__ */ jsxRuntime.jsx(LexicalLinkPlugin.LinkPlugin, {}),
4601
- /* @__PURE__ */ jsxRuntime.jsx(LexicalClickableLinkPlugin.ClickableLinkPlugin, { newTab: true }),
4602
- !singleLine && /* @__PURE__ */ jsxRuntime.jsx(LexicalListPlugin.ListPlugin, {}),
4603
- !singleLine && /* @__PURE__ */ jsxRuntime.jsx(LexicalCheckListPlugin.CheckListPlugin, {}),
4604
- !singleLine && /* @__PURE__ */ jsxRuntime.jsx(LexicalHorizontalRulePlugin.HorizontalRulePlugin, {}),
4605
- /* @__PURE__ */ jsxRuntime.jsx(LexicalTabIndentationPlugin.TabIndentationPlugin, {}),
4606
- /* @__PURE__ */ jsxRuntime.jsx(LexicalMarkdownShortcutPlugin.MarkdownShortcutPlugin, { transformers }),
4607
- /* @__PURE__ */ jsxRuntime.jsx(
4608
- MarkdownSyncPlugin,
4609
- {
4610
- value,
4611
- editable,
4612
- onChange,
4613
- transformers,
4614
- singleLine
4615
- }
4616
- ),
4617
- /* @__PURE__ */ jsxRuntime.jsx(ImagePastePlugin, { onImageUpload }),
4618
- /* @__PURE__ */ jsxRuntime.jsx(
4619
- KeyboardPlugin,
4620
- {
4621
- onSave,
4622
- onCancel,
4623
- singleLine,
4624
- blurOnEscape: singleLine || saveOnBlur,
4625
- skipBlurSaveRef
4626
- }
4627
- ),
4628
- autoFocus && /* @__PURE__ */ jsxRuntime.jsx(LexicalAutoFocusPlugin.AutoFocusPlugin, {})
4629
- ]
4630
- }
4631
- ) }) });
4632
- };
4633
-
4634
- exports.MarkdownEditor = MarkdownEditor;
4635
- //# sourceMappingURL=markdown-editor.cjs.map
4636
- //# sourceMappingURL=markdown-editor.cjs.map