@keboola/design 10.1.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. package/AGENTS.md +2 -0
  2. package/dist/MermaidDiagram-ZU5KAVRT.js +18 -0
  3. package/dist/{MermaidDiagram-EOKJHQQV.js.map → MermaidDiagram-ZU5KAVRT.js.map} +1 -1
  4. package/dist/charts.d.ts +14 -8
  5. package/dist/charts.js +6 -1
  6. package/dist/charts.js.map +1 -1
  7. package/dist/chunk-2YYJDKSP.js +51 -0
  8. package/dist/chunk-2YYJDKSP.js.map +1 -0
  9. package/dist/chunk-3P5UUCFI.js +385 -0
  10. package/dist/chunk-3P5UUCFI.js.map +1 -0
  11. package/dist/chunk-3QDFDDWZ.js +99 -0
  12. package/dist/chunk-3QDFDDWZ.js.map +1 -0
  13. package/dist/chunk-3W27OLK5.js +15 -0
  14. package/dist/chunk-3W27OLK5.js.map +1 -0
  15. package/dist/chunk-4FIZZONW.js +40 -0
  16. package/dist/chunk-4FIZZONW.js.map +1 -0
  17. package/dist/chunk-4GIAXOJG.js +133 -0
  18. package/dist/chunk-4GIAXOJG.js.map +1 -0
  19. package/dist/chunk-52NDNMK7.js +99 -0
  20. package/dist/chunk-52NDNMK7.js.map +1 -0
  21. package/dist/chunk-576G5OES.js +201 -0
  22. package/dist/chunk-576G5OES.js.map +1 -0
  23. package/dist/chunk-5AIE6SET.js +659 -0
  24. package/dist/chunk-5AIE6SET.js.map +1 -0
  25. package/dist/chunk-5FTNAZRW.js +327 -0
  26. package/dist/chunk-5FTNAZRW.js.map +1 -0
  27. package/dist/chunk-5IG2S7ZY.js +70 -0
  28. package/dist/chunk-5IG2S7ZY.js.map +1 -0
  29. package/dist/chunk-5QCXHNCW.js +404 -0
  30. package/dist/chunk-5QCXHNCW.js.map +1 -0
  31. package/dist/chunk-6DUMGC7Y.js +105 -0
  32. package/dist/chunk-6DUMGC7Y.js.map +1 -0
  33. package/dist/chunk-6J25CVST.js +174 -0
  34. package/dist/chunk-6J25CVST.js.map +1 -0
  35. package/dist/chunk-6NN35XOP.js +120 -0
  36. package/dist/chunk-6NN35XOP.js.map +1 -0
  37. package/dist/chunk-6NZBVA4T.js +24 -0
  38. package/dist/chunk-6NZBVA4T.js.map +1 -0
  39. package/dist/chunk-6W5BHRCL.js +295 -0
  40. package/dist/chunk-6W5BHRCL.js.map +1 -0
  41. package/dist/chunk-72BKRCEG.js +409 -0
  42. package/dist/chunk-72BKRCEG.js.map +1 -0
  43. package/dist/{chunk-Q7NWXLCT.js → chunk-7GTI3PPI.js} +53 -48
  44. package/dist/chunk-7GTI3PPI.js.map +1 -0
  45. package/dist/chunk-7P6PLZ4B.js +74 -0
  46. package/dist/chunk-7P6PLZ4B.js.map +1 -0
  47. package/dist/chunk-7WZWY5IA.js +46 -0
  48. package/dist/chunk-7WZWY5IA.js.map +1 -0
  49. package/dist/chunk-AIYO2632.js +489 -0
  50. package/dist/chunk-AIYO2632.js.map +1 -0
  51. package/dist/chunk-ANFZWPNE.js +112 -0
  52. package/dist/chunk-ANFZWPNE.js.map +1 -0
  53. package/dist/chunk-ANZTVAJU.js +73 -0
  54. package/dist/chunk-ANZTVAJU.js.map +1 -0
  55. package/dist/chunk-BD5BTJKX.js +166 -0
  56. package/dist/chunk-BD5BTJKX.js.map +1 -0
  57. package/dist/chunk-BHGIDSRJ.js +140 -0
  58. package/dist/chunk-BHGIDSRJ.js.map +1 -0
  59. package/dist/chunk-BSQWZITZ.js +507 -0
  60. package/dist/chunk-BSQWZITZ.js.map +1 -0
  61. package/dist/chunk-D3LAIK62.js +23 -0
  62. package/dist/chunk-D3LAIK62.js.map +1 -0
  63. package/dist/chunk-DODCR43C.js +155 -0
  64. package/dist/chunk-DODCR43C.js.map +1 -0
  65. package/dist/chunk-EEK5NGZF.js +40 -0
  66. package/dist/chunk-EEK5NGZF.js.map +1 -0
  67. package/dist/chunk-ENRG7TXA.js +11 -0
  68. package/dist/chunk-ENRG7TXA.js.map +1 -0
  69. package/dist/chunk-EQRMGIGY.js +239 -0
  70. package/dist/chunk-EQRMGIGY.js.map +1 -0
  71. package/dist/{chunk-XV3UUOYF.js → chunk-ERAHK5YQ.js} +9 -359
  72. package/dist/chunk-ERAHK5YQ.js.map +1 -0
  73. package/dist/chunk-F3FOFY2P.js +124 -0
  74. package/dist/chunk-F3FOFY2P.js.map +1 -0
  75. package/dist/chunk-F6BTWFOC.js +507 -0
  76. package/dist/chunk-F6BTWFOC.js.map +1 -0
  77. package/dist/chunk-F6J6NNAL.js +34 -0
  78. package/dist/chunk-F6J6NNAL.js.map +1 -0
  79. package/dist/chunk-FCHJ7D5O.js +59 -0
  80. package/dist/chunk-FCHJ7D5O.js.map +1 -0
  81. package/dist/chunk-FFJTEQCC.js +80 -0
  82. package/dist/chunk-FFJTEQCC.js.map +1 -0
  83. package/dist/chunk-FUFMVW7O.js +64 -0
  84. package/dist/chunk-FUFMVW7O.js.map +1 -0
  85. package/dist/chunk-FVPGQ6UE.js +25 -0
  86. package/dist/chunk-FVPGQ6UE.js.map +1 -0
  87. package/dist/{chunk-JP7PNHLH.js → chunk-G3PMV62Z.js} +3 -10
  88. package/dist/chunk-G3PMV62Z.js.map +1 -0
  89. package/dist/chunk-GACFOW3E.js +51 -0
  90. package/dist/chunk-GACFOW3E.js.map +1 -0
  91. package/dist/chunk-GDT6HQMK.js +42 -0
  92. package/dist/chunk-GDT6HQMK.js.map +1 -0
  93. package/dist/chunk-HLGU22C6.js +2589 -0
  94. package/dist/chunk-HLGU22C6.js.map +1 -0
  95. package/dist/chunk-HPMYYGP7.js +134 -0
  96. package/dist/chunk-HPMYYGP7.js.map +1 -0
  97. package/dist/chunk-I2UCOD45.js +197 -0
  98. package/dist/chunk-I2UCOD45.js.map +1 -0
  99. package/dist/chunk-IEGDZUVM.js +75 -0
  100. package/dist/chunk-IEGDZUVM.js.map +1 -0
  101. package/dist/chunk-IIS7INHF.js +47 -0
  102. package/dist/chunk-IIS7INHF.js.map +1 -0
  103. package/dist/chunk-ITELSEFU.js +256 -0
  104. package/dist/chunk-ITELSEFU.js.map +1 -0
  105. package/dist/{chunk-CTCFYWJC.js → chunk-IXAYNBOY.js} +6 -6
  106. package/dist/{chunk-CTCFYWJC.js.map → chunk-IXAYNBOY.js.map} +1 -1
  107. package/dist/chunk-JUW2ETEI.js +191 -0
  108. package/dist/chunk-JUW2ETEI.js.map +1 -0
  109. package/dist/chunk-K65C7CVE.js +127 -0
  110. package/dist/chunk-K65C7CVE.js.map +1 -0
  111. package/dist/chunk-KDI64MCY.js +189 -0
  112. package/dist/chunk-KDI64MCY.js.map +1 -0
  113. package/dist/chunk-KN4ASMH5.js +160 -0
  114. package/dist/chunk-KN4ASMH5.js.map +1 -0
  115. package/dist/chunk-KQW7QNTU.js +1549 -0
  116. package/dist/chunk-KQW7QNTU.js.map +1 -0
  117. package/dist/chunk-KR7NXXHC.js +66 -0
  118. package/dist/chunk-KR7NXXHC.js.map +1 -0
  119. package/dist/chunk-KRZKIVMA.js +142 -0
  120. package/dist/chunk-KRZKIVMA.js.map +1 -0
  121. package/dist/{chunk-C3L3TBBT.js → chunk-KTTLLKGQ.js} +6 -63
  122. package/dist/chunk-KTTLLKGQ.js.map +1 -0
  123. package/dist/chunk-KWKSHPDP.js +234 -0
  124. package/dist/chunk-KWKSHPDP.js.map +1 -0
  125. package/dist/chunk-KZVC7OYG.js +57 -0
  126. package/dist/chunk-KZVC7OYG.js.map +1 -0
  127. package/dist/chunk-L5DHUN2V.js +204 -0
  128. package/dist/chunk-L5DHUN2V.js.map +1 -0
  129. package/dist/chunk-LCTGEH57.js +1376 -0
  130. package/dist/chunk-LCTGEH57.js.map +1 -0
  131. package/dist/chunk-LXLIQ2D6.js +12 -0
  132. package/dist/chunk-LXLIQ2D6.js.map +1 -0
  133. package/dist/chunk-M4CTURKX.js +84 -0
  134. package/dist/chunk-M4CTURKX.js.map +1 -0
  135. package/dist/chunk-M6LTUPVP.js +301 -0
  136. package/dist/chunk-M6LTUPVP.js.map +1 -0
  137. package/dist/chunk-MA6RRHDT.js +291 -0
  138. package/dist/chunk-MA6RRHDT.js.map +1 -0
  139. package/dist/chunk-MODE4QIA.js +6 -0
  140. package/dist/chunk-MODE4QIA.js.map +1 -0
  141. package/dist/chunk-MVILMVGG.js +118 -0
  142. package/dist/chunk-MVILMVGG.js.map +1 -0
  143. package/dist/chunk-MWS4VCLV.js +17 -0
  144. package/dist/chunk-MWS4VCLV.js.map +1 -0
  145. package/dist/chunk-NEUX74SO.js +315 -0
  146. package/dist/chunk-NEUX74SO.js.map +1 -0
  147. package/dist/chunk-NFHKYBRD.js +156 -0
  148. package/dist/chunk-NFHKYBRD.js.map +1 -0
  149. package/dist/chunk-NHJNNXD3.js +89 -0
  150. package/dist/chunk-NHJNNXD3.js.map +1 -0
  151. package/dist/chunk-O2BF3HZL.js +33 -0
  152. package/dist/chunk-O2BF3HZL.js.map +1 -0
  153. package/dist/chunk-OANXCZYD.js +212 -0
  154. package/dist/chunk-OANXCZYD.js.map +1 -0
  155. package/dist/chunk-ODJF7YIP.js +230 -0
  156. package/dist/chunk-ODJF7YIP.js.map +1 -0
  157. package/dist/chunk-ON4BJTHI.js +101 -0
  158. package/dist/chunk-ON4BJTHI.js.map +1 -0
  159. package/dist/{chunk-VMFSRV5H.js → chunk-OTL5WXIJ.js} +2 -2
  160. package/dist/{chunk-VMFSRV5H.js.map → chunk-OTL5WXIJ.js.map} +1 -1
  161. package/dist/{chunk-VPPM7UUQ.js → chunk-PACNBKJV.js} +3 -3
  162. package/dist/{chunk-VPPM7UUQ.js.map → chunk-PACNBKJV.js.map} +1 -1
  163. package/dist/{chunk-ESBL3IPF.js → chunk-PROCA7K7.js} +2 -2
  164. package/dist/{chunk-ESBL3IPF.js.map → chunk-PROCA7K7.js.map} +1 -1
  165. package/dist/chunk-QGMIPA67.js +85 -0
  166. package/dist/chunk-QGMIPA67.js.map +1 -0
  167. package/dist/chunk-QQA37LFB.js +190 -0
  168. package/dist/chunk-QQA37LFB.js.map +1 -0
  169. package/dist/chunk-QZAWRSEB.js +61 -0
  170. package/dist/chunk-QZAWRSEB.js.map +1 -0
  171. package/dist/chunk-R74KGWNS.js +699 -0
  172. package/dist/chunk-R74KGWNS.js.map +1 -0
  173. package/dist/chunk-RFDLHMKL.js +110 -0
  174. package/dist/chunk-RFDLHMKL.js.map +1 -0
  175. package/dist/chunk-RL64HN7S.js +40 -0
  176. package/dist/chunk-RL64HN7S.js.map +1 -0
  177. package/dist/chunk-RMRQKPL7.js +115 -0
  178. package/dist/chunk-RMRQKPL7.js.map +1 -0
  179. package/dist/{chunk-BOHNXTMM.js → chunk-RQVK4IYC.js} +3 -3
  180. package/dist/{chunk-BOHNXTMM.js.map → chunk-RQVK4IYC.js.map} +1 -1
  181. package/dist/chunk-RTW56PWZ.js +59 -0
  182. package/dist/chunk-RTW56PWZ.js.map +1 -0
  183. package/dist/chunk-RUTPQNLR.js +266 -0
  184. package/dist/chunk-RUTPQNLR.js.map +1 -0
  185. package/dist/chunk-S6TAF63G.js +25 -0
  186. package/dist/chunk-S6TAF63G.js.map +1 -0
  187. package/dist/chunk-SBGAUGXY.js +224 -0
  188. package/dist/chunk-SBGAUGXY.js.map +1 -0
  189. package/dist/chunk-SC275NHZ.js +407 -0
  190. package/dist/chunk-SC275NHZ.js.map +1 -0
  191. package/dist/chunk-SCQPU4UE.js +97 -0
  192. package/dist/chunk-SCQPU4UE.js.map +1 -0
  193. package/dist/chunk-SFFF2WQP.js +8 -0
  194. package/dist/chunk-SFFF2WQP.js.map +1 -0
  195. package/dist/chunk-SJYMHZKA.js +36 -0
  196. package/dist/chunk-SJYMHZKA.js.map +1 -0
  197. package/dist/chunk-SLCCUJVN.js +125 -0
  198. package/dist/chunk-SLCCUJVN.js.map +1 -0
  199. package/dist/{chunk-IJTHFNNJ.js → chunk-SVBSNSD4.js} +10 -12
  200. package/dist/chunk-SVBSNSD4.js.map +1 -0
  201. package/dist/chunk-SVPLTL35.js +62 -0
  202. package/dist/chunk-SVPLTL35.js.map +1 -0
  203. package/dist/{chunk-63NSN2VL.js → chunk-SWQFYNYG.js} +115 -51
  204. package/dist/chunk-SWQFYNYG.js.map +1 -0
  205. package/dist/chunk-THHB4EWS.js +72 -0
  206. package/dist/chunk-THHB4EWS.js.map +1 -0
  207. package/dist/chunk-TUCDD33E.js +246 -0
  208. package/dist/chunk-TUCDD33E.js.map +1 -0
  209. package/dist/chunk-TV4WAP2R.js +14 -0
  210. package/dist/chunk-TV4WAP2R.js.map +1 -0
  211. package/dist/chunk-U3A6YBTZ.js +134 -0
  212. package/dist/chunk-U3A6YBTZ.js.map +1 -0
  213. package/dist/chunk-UGT6DKWM.js +95 -0
  214. package/dist/chunk-UGT6DKWM.js.map +1 -0
  215. package/dist/chunk-VSERHUWD.js +212 -0
  216. package/dist/chunk-VSERHUWD.js.map +1 -0
  217. package/dist/chunk-VYG7BDXC.js +49 -0
  218. package/dist/chunk-VYG7BDXC.js.map +1 -0
  219. package/dist/chunk-WETKNYZX.js +52 -0
  220. package/dist/chunk-WETKNYZX.js.map +1 -0
  221. package/dist/chunk-WGG4AML3.js +216 -0
  222. package/dist/chunk-WGG4AML3.js.map +1 -0
  223. package/dist/chunk-WKAUEL6I.js +30 -0
  224. package/dist/chunk-WKAUEL6I.js.map +1 -0
  225. package/dist/chunk-WPOLA5CG.js +81 -0
  226. package/dist/chunk-WPOLA5CG.js.map +1 -0
  227. package/dist/chunk-WPVETCGJ.js +254 -0
  228. package/dist/chunk-WPVETCGJ.js.map +1 -0
  229. package/dist/chunk-WTSM3A7E.js +13 -0
  230. package/dist/chunk-WTSM3A7E.js.map +1 -0
  231. package/dist/chunk-WU3F2K3T.js +148 -0
  232. package/dist/chunk-WU3F2K3T.js.map +1 -0
  233. package/dist/chunk-WZZK2DTZ.js +39 -0
  234. package/dist/chunk-WZZK2DTZ.js.map +1 -0
  235. package/dist/chunk-X4IHLKRD.js +42 -0
  236. package/dist/chunk-X4IHLKRD.js.map +1 -0
  237. package/dist/chunk-XAHEXZJC.js +80 -0
  238. package/dist/chunk-XAHEXZJC.js.map +1 -0
  239. package/dist/chunk-XCYGJDUX.js +31 -0
  240. package/dist/chunk-XCYGJDUX.js.map +1 -0
  241. package/dist/chunk-Y4W3JORC.js +104 -0
  242. package/dist/chunk-Y4W3JORC.js.map +1 -0
  243. package/dist/{chunk-7PUUHEJQ.js → chunk-YFZJ3ZLG.js} +26 -42
  244. package/dist/chunk-YFZJ3ZLG.js.map +1 -0
  245. package/dist/{chunk-6FPEI4EM.js → chunk-YI3WLXEN.js} +27 -2323
  246. package/dist/chunk-YI3WLXEN.js.map +1 -0
  247. package/dist/chunk-ZBKFSPD3.js +29 -0
  248. package/dist/chunk-ZBKFSPD3.js.map +1 -0
  249. package/dist/chunk-ZOERRQ6A.js +79 -0
  250. package/dist/chunk-ZOERRQ6A.js.map +1 -0
  251. package/dist/chunk-ZSTGUKHU.js +10 -0
  252. package/dist/chunk-ZSTGUKHU.js.map +1 -0
  253. package/dist/chunk-ZUEHDL27.js +65 -0
  254. package/dist/chunk-ZUEHDL27.js.map +1 -0
  255. package/dist/editors.js +22 -14
  256. package/dist/editors.js.map +1 -1
  257. package/dist/icons.js +7 -2
  258. package/dist/index.d.ts +8 -18
  259. package/dist/index.js +121 -15800
  260. package/dist/index.js.map +1 -1
  261. package/dist/internal/blocks/AIKit.js +30 -0
  262. package/dist/internal/blocks/AIKit.js.map +1 -0
  263. package/dist/internal/blocks/AppShell.js +11 -0
  264. package/dist/internal/blocks/AppShell.js.map +1 -0
  265. package/dist/internal/blocks/AutoSaveTextarea.js +14 -0
  266. package/dist/internal/blocks/AutoSaveTextarea.js.map +1 -0
  267. package/dist/internal/blocks/BrandEditor.js +23 -0
  268. package/dist/internal/blocks/BrandEditor.js.map +1 -0
  269. package/dist/internal/blocks/ChartPanel.js +10 -0
  270. package/dist/internal/blocks/ChartPanel.js.map +1 -0
  271. package/dist/internal/blocks/ClipboardButton.js +12 -0
  272. package/dist/internal/blocks/ClipboardButton.js.map +1 -0
  273. package/dist/internal/blocks/ColorInput.js +13 -0
  274. package/dist/internal/blocks/ColorInput.js.map +1 -0
  275. package/dist/internal/blocks/ColorModeSwitch.js +13 -0
  276. package/dist/internal/blocks/ColorModeSwitch.js.map +1 -0
  277. package/dist/internal/blocks/Command.js +15 -0
  278. package/dist/internal/blocks/Command.js.map +1 -0
  279. package/dist/internal/blocks/CopyField.js +11 -0
  280. package/dist/internal/blocks/CopyField.js.map +1 -0
  281. package/dist/internal/blocks/DashboardHero.js +9 -0
  282. package/dist/internal/blocks/DashboardHero.js.map +1 -0
  283. package/dist/internal/blocks/DateInput.js +16 -0
  284. package/dist/internal/blocks/DateInput.js.map +1 -0
  285. package/dist/internal/blocks/DateRangeInput.js +16 -0
  286. package/dist/internal/blocks/DateRangeInput.js.map +1 -0
  287. package/dist/internal/blocks/EmptyConfigurationActionCard.js +10 -0
  288. package/dist/internal/blocks/EmptyConfigurationActionCard.js.map +1 -0
  289. package/dist/internal/blocks/EmptyState.js +4 -0
  290. package/dist/internal/blocks/EmptyState.js.map +1 -0
  291. package/dist/internal/blocks/ErrorState.js +5 -0
  292. package/dist/internal/blocks/ErrorState.js.map +1 -0
  293. package/dist/internal/blocks/ExportMenu.js +13 -0
  294. package/dist/internal/blocks/ExportMenu.js.map +1 -0
  295. package/dist/internal/blocks/Form.js +29 -0
  296. package/dist/internal/blocks/Form.js.map +1 -0
  297. package/dist/internal/blocks/FormGroup.js +18 -0
  298. package/dist/internal/blocks/FormGroup.js.map +1 -0
  299. package/dist/internal/blocks/GoogleButton.js +10 -0
  300. package/dist/internal/blocks/GoogleButton.js.map +1 -0
  301. package/dist/internal/blocks/MicrosoftButton.js +10 -0
  302. package/dist/internal/blocks/MicrosoftButton.js.map +1 -0
  303. package/dist/internal/blocks/MultiActionButtonGroup.js +12 -0
  304. package/dist/internal/blocks/MultiActionButtonGroup.js.map +1 -0
  305. package/dist/internal/blocks/MultiCombobox.js +14 -0
  306. package/dist/internal/blocks/MultiCombobox.js.map +1 -0
  307. package/dist/internal/blocks/NumberInput.js +12 -0
  308. package/dist/internal/blocks/NumberInput.js.map +1 -0
  309. package/dist/internal/blocks/OtpInput.js +10 -0
  310. package/dist/internal/blocks/OtpInput.js.map +1 -0
  311. package/dist/internal/blocks/PageHeader.js +9 -0
  312. package/dist/internal/blocks/PageHeader.js.map +1 -0
  313. package/dist/internal/blocks/PageLayout.js +9 -0
  314. package/dist/internal/blocks/PageLayout.js.map +1 -0
  315. package/dist/internal/blocks/PageToolbar.js +13 -0
  316. package/dist/internal/blocks/PageToolbar.js.map +1 -0
  317. package/dist/internal/blocks/PasswordInput.js +13 -0
  318. package/dist/internal/blocks/PasswordInput.js.map +1 -0
  319. package/dist/internal/blocks/SearchInput.js +12 -0
  320. package/dist/internal/blocks/SearchInput.js.map +1 -0
  321. package/dist/internal/blocks/SearchInputWithNavigation.js +16 -0
  322. package/dist/internal/blocks/SearchInputWithNavigation.js.map +1 -0
  323. package/dist/internal/blocks/SectionNav.js +15 -0
  324. package/dist/internal/blocks/SectionNav.js.map +1 -0
  325. package/dist/internal/blocks/SplitButton.js +14 -0
  326. package/dist/internal/blocks/SplitButton.js.map +1 -0
  327. package/dist/internal/blocks/StatCard.js +10 -0
  328. package/dist/internal/blocks/StatCard.js.map +1 -0
  329. package/dist/internal/blocks/TextInput.js +13 -0
  330. package/dist/internal/blocks/TextInput.js.map +1 -0
  331. package/dist/internal/blocks/Textarea.js +13 -0
  332. package/dist/internal/blocks/Textarea.js.map +1 -0
  333. package/dist/internal/blocks/TimeInput.js +17 -0
  334. package/dist/internal/blocks/TimeInput.js.map +1 -0
  335. package/dist/internal/components/Alert.js +11 -0
  336. package/dist/internal/components/Alert.js.map +1 -0
  337. package/dist/internal/components/AlertModal.js +11 -0
  338. package/dist/internal/components/AlertModal.js.map +1 -0
  339. package/dist/internal/components/Avatar.js +9 -0
  340. package/dist/internal/components/Avatar.js.map +1 -0
  341. package/dist/internal/components/Badge.js +9 -0
  342. package/dist/internal/components/Badge.js.map +1 -0
  343. package/dist/internal/components/BrandLogo.js +11 -0
  344. package/dist/internal/components/BrandLogo.js.map +1 -0
  345. package/dist/internal/components/Breadcrumb.js +14 -0
  346. package/dist/internal/components/Breadcrumb.js.map +1 -0
  347. package/dist/internal/components/Button.js +10 -0
  348. package/dist/internal/components/Button.js.map +1 -0
  349. package/dist/internal/components/ButtonGroup.js +9 -0
  350. package/dist/internal/components/ButtonGroup.js.map +1 -0
  351. package/dist/internal/components/Calendar.js +9 -0
  352. package/dist/internal/components/Calendar.js.map +1 -0
  353. package/dist/internal/components/Card.js +9 -0
  354. package/dist/internal/components/Card.js.map +1 -0
  355. package/dist/internal/components/Checkbox.js +11 -0
  356. package/dist/internal/components/Checkbox.js.map +1 -0
  357. package/dist/internal/components/Clipboard.js +9 -0
  358. package/dist/internal/components/Clipboard.js.map +1 -0
  359. package/dist/internal/components/Collapsible.js +9 -0
  360. package/dist/internal/components/Collapsible.js.map +1 -0
  361. package/dist/internal/components/CollapsiblePanel.js +11 -0
  362. package/dist/internal/components/CollapsiblePanel.js.map +1 -0
  363. package/dist/internal/components/Combobox.js +13 -0
  364. package/dist/internal/components/Combobox.js.map +1 -0
  365. package/dist/internal/components/DatePicker.js +11 -0
  366. package/dist/internal/components/DatePicker.js.map +1 -0
  367. package/dist/internal/components/DateRangePicker.js +17 -0
  368. package/dist/internal/components/DateRangePicker.js.map +1 -0
  369. package/dist/internal/components/DiffView.js +9 -0
  370. package/dist/internal/components/DiffView.js.map +1 -0
  371. package/dist/internal/components/DotsLoader.js +5 -0
  372. package/dist/internal/components/DotsLoader.js.map +1 -0
  373. package/dist/internal/components/DropdownMenu.js +11 -0
  374. package/dist/internal/components/DropdownMenu.js.map +1 -0
  375. package/dist/internal/components/EmptySearchContent.js +4 -0
  376. package/dist/internal/components/EmptySearchContent.js.map +1 -0
  377. package/dist/internal/components/FileUpload.js +11 -0
  378. package/dist/internal/components/FileUpload.js.map +1 -0
  379. package/dist/internal/components/FullScreenModal.js +12 -0
  380. package/dist/internal/components/FullScreenModal.js.map +1 -0
  381. package/dist/internal/components/HelpBlock.js +4 -0
  382. package/dist/internal/components/HelpBlock.js.map +1 -0
  383. package/dist/internal/components/HoverCard.js +9 -0
  384. package/dist/internal/components/HoverCard.js.map +1 -0
  385. package/dist/internal/components/InputGroup.js +11 -0
  386. package/dist/internal/components/InputGroup.js.map +1 -0
  387. package/dist/internal/components/Kbd.js +9 -0
  388. package/dist/internal/components/Kbd.js.map +1 -0
  389. package/dist/internal/components/Label.js +9 -0
  390. package/dist/internal/components/Label.js.map +1 -0
  391. package/dist/internal/components/Link.js +9 -0
  392. package/dist/internal/components/Link.js.map +1 -0
  393. package/dist/internal/components/MarkedText.js +5 -0
  394. package/dist/internal/components/MarkedText.js.map +1 -0
  395. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +10 -0
  396. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js.map +1 -0
  397. package/dist/internal/components/MergeEditor/PaneHeader.js +4 -0
  398. package/dist/internal/components/MergeEditor/PaneHeader.js.map +1 -0
  399. package/dist/internal/components/MergeEditor/constants.js +4 -0
  400. package/dist/internal/components/MergeEditor/constants.js.map +1 -0
  401. package/dist/internal/components/MergeEditor/useMergeDiff.js +5 -0
  402. package/dist/internal/components/MergeEditor/useMergeDiff.js.map +1 -0
  403. package/dist/internal/components/Modal.js +13 -0
  404. package/dist/internal/components/Modal.js.map +1 -0
  405. package/dist/internal/components/Navbar.js +14 -0
  406. package/dist/internal/components/Navbar.js.map +1 -0
  407. package/dist/internal/components/Pagination.js +11 -0
  408. package/dist/internal/components/Pagination.js.map +1 -0
  409. package/dist/internal/components/PanelWithDetails.js +11 -0
  410. package/dist/internal/components/PanelWithDetails.js.map +1 -0
  411. package/dist/internal/components/Popconfirm.js +12 -0
  412. package/dist/internal/components/Popconfirm.js.map +1 -0
  413. package/dist/internal/components/Popover.js +9 -0
  414. package/dist/internal/components/Popover.js.map +1 -0
  415. package/dist/internal/components/Progress.js +9 -0
  416. package/dist/internal/components/Progress.js.map +1 -0
  417. package/dist/internal/components/RadioGroup.js +12 -0
  418. package/dist/internal/components/RadioGroup.js.map +1 -0
  419. package/dist/internal/components/Resizable.js +9 -0
  420. package/dist/internal/components/Resizable.js.map +1 -0
  421. package/dist/internal/components/ScrollArea.js +9 -0
  422. package/dist/internal/components/ScrollArea.js.map +1 -0
  423. package/dist/internal/components/Search.js +10 -0
  424. package/dist/internal/components/Search.js.map +1 -0
  425. package/dist/internal/components/Select.js +12 -0
  426. package/dist/internal/components/Select.js.map +1 -0
  427. package/dist/internal/components/Separator.js +9 -0
  428. package/dist/internal/components/Separator.js.map +1 -0
  429. package/dist/internal/components/Sheet.js +12 -0
  430. package/dist/internal/components/Sheet.js.map +1 -0
  431. package/dist/internal/components/Sidebar.js +20 -0
  432. package/dist/internal/components/Sidebar.js.map +1 -0
  433. package/dist/internal/components/Skeleton/Skeleton.js +9 -0
  434. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -0
  435. package/dist/internal/components/Skeleton/SkeletonList.js +10 -0
  436. package/dist/internal/components/Skeleton/SkeletonList.js.map +1 -0
  437. package/dist/internal/components/Slider.js +11 -0
  438. package/dist/internal/components/Slider.js.map +1 -0
  439. package/dist/internal/components/SpotlightBackdrop.js +9 -0
  440. package/dist/internal/components/SpotlightBackdrop.js.map +1 -0
  441. package/dist/internal/components/Stepper.js +10 -0
  442. package/dist/internal/components/Stepper.js.map +1 -0
  443. package/dist/internal/components/Switch.js +10 -0
  444. package/dist/internal/components/Switch.js.map +1 -0
  445. package/dist/internal/components/Table.js +10 -0
  446. package/dist/internal/components/Table.js.map +1 -0
  447. package/dist/internal/components/Tabs.js +12 -0
  448. package/dist/internal/components/Tabs.js.map +1 -0
  449. package/dist/internal/components/ThemeProvider.js +10 -0
  450. package/dist/internal/components/ThemeProvider.js.map +1 -0
  451. package/dist/internal/components/TimePicker.js +12 -0
  452. package/dist/internal/components/TimePicker.js.map +1 -0
  453. package/dist/internal/components/Timeline.js +10 -0
  454. package/dist/internal/components/Timeline.js.map +1 -0
  455. package/dist/internal/components/Toast.js +11 -0
  456. package/dist/internal/components/Toast.js.map +1 -0
  457. package/dist/internal/components/Toggle.js +9 -0
  458. package/dist/internal/components/Toggle.js.map +1 -0
  459. package/dist/internal/components/ToggleGroup.js +9 -0
  460. package/dist/internal/components/ToggleGroup.js.map +1 -0
  461. package/dist/internal/components/Tooltip.js +8 -0
  462. package/dist/internal/components/Tooltip.js.map +1 -0
  463. package/dist/internal/components/Truncated.js +9 -0
  464. package/dist/internal/components/Truncated.js.map +1 -0
  465. package/dist/internal/components/Workbench.js +11 -0
  466. package/dist/internal/components/Workbench.js.map +1 -0
  467. package/dist/internal/components/ZoomableSvg.js +13 -0
  468. package/dist/internal/components/ZoomableSvg.js.map +1 -0
  469. package/dist/internal/hooks/useAutosizeInput.js +4 -0
  470. package/dist/internal/hooks/useAutosizeInput.js.map +1 -0
  471. package/dist/internal/hooks/useScrollbarPosition.js +5 -0
  472. package/dist/internal/hooks/useScrollbarPosition.js.map +1 -0
  473. package/dist/internal/hooks/useStableCallback.js +4 -0
  474. package/dist/internal/hooks/useStableCallback.js.map +1 -0
  475. package/dist/internal/utils/mergeRefs.js +4 -0
  476. package/dist/internal/utils/mergeRefs.js.map +1 -0
  477. package/dist/internal/utils.js +8 -0
  478. package/dist/internal/utils.js.map +1 -0
  479. package/dist/markdown-editor.js +23 -9
  480. package/dist/markdown-editor.js.map +1 -1
  481. package/dist/mermaid.js +16 -8
  482. package/dist/rjsf.js +102 -29
  483. package/dist/rjsf.js.map +1 -1
  484. package/dist/styles.css +1 -1
  485. package/dist/testing.js +8 -3
  486. package/dist/testing.js.map +1 -1
  487. package/package.json +9 -8
  488. package/src/styles.css +35 -7
  489. package/src/theme.css +64 -0
  490. package/dist/MermaidDiagram-EOKJHQQV.js +0 -10
  491. package/dist/chunk-63NSN2VL.js.map +0 -1
  492. package/dist/chunk-6FPEI4EM.js.map +0 -1
  493. package/dist/chunk-7PUUHEJQ.js.map +0 -1
  494. package/dist/chunk-C3L3TBBT.js.map +0 -1
  495. package/dist/chunk-IJTHFNNJ.js.map +0 -1
  496. package/dist/chunk-JP7PNHLH.js.map +0 -1
  497. package/dist/chunk-KPNAW5MU.js +0 -229
  498. package/dist/chunk-KPNAW5MU.js.map +0 -1
  499. package/dist/chunk-L37JJ6MR.js +0 -152
  500. package/dist/chunk-L37JJ6MR.js.map +0 -1
  501. package/dist/chunk-Q7NWXLCT.js.map +0 -1
  502. package/dist/chunk-SYIEF644.js +0 -1016
  503. package/dist/chunk-SYIEF644.js.map +0 -1
  504. package/dist/chunk-XV3UUOYF.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/blocks/MermaidDiagram/mermaidTheme.ts","../src/blocks/MermaidDiagram/svgTransforms.ts","../src/blocks/MermaidDiagram/MermaidDiagram.tsx"],"names":[],"mappings":"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","file":"chunk-MA6RRHDT.js","sourcesContent":["import type { RenderOptions } from 'beautiful-mermaid';\nimport type { MermaidConfig } from 'mermaid';\n\nimport type { ResolvedColorScheme } from '../../components/ThemeProvider/types';\nimport { createTokenResolver } from '../../utils/themeTokens';\n\nconst DIAGRAM_FONT = 'Inter, system-ui, sans-serif';\n\n/**\n * Fallback channels for the tokens the diagram palette reads, mirroring the\n * `:root` / `[data-theme='dark']` blocks of `styles.css`.\n *\n * `resolveToken` only reaches these when the live custom property is missing —\n * SSR, or a unit test that loads no CSS. In the browser the computed value wins,\n * which is what makes a customer brand re-skin the diagram for free.\n */\nconst FALLBACK_CHANNELS = {\n card: { light: '255 255 255', dark: '34 34 40' },\n 'card-foreground': { light: '30 41 59', dark: '229 230 236' },\n foreground: { light: '30 41 59', dark: '229 230 236' },\n muted: { light: '241 245 249', dark: '38 38 45' },\n 'muted-foreground': { light: '100 116 139', dark: '141 144 153' },\n border: { light: '229 231 235', dark: '52 53 62' },\n primary: { light: '37 99 235', dark: '31 143 255' },\n accent: { light: '224 242 254', dark: '30 58 95' },\n 'accent-foreground': { light: '13 65 127', dark: '147 197 253' },\n warning: { light: '138 82 16', dark: '255 190 92' },\n success: { light: '24 122 76', dark: '62 207 127' },\n destructive: { light: '220 38 38', dark: '229 72 77' },\n} as const;\n\ntype TokenName = keyof typeof FALLBACK_CHANNELS;\n\n/**\n * Binds a token lookup to one `getComputedStyle` snapshot for the whole palette.\n * Built per call, never hoisted: the values move with the scheme and the brand.\n */\nconst tokenReader = (scheme: ResolvedColorScheme) => {\n const resolve = createTokenResolver();\n return (name: TokenName, alpha?: number): string =>\n resolve(name, FALLBACK_CHANNELS[name][scheme], alpha);\n};\n\n/**\n * Palette for `beautiful-mermaid`'s synchronous renderer. It sets these as CSS\n * variables on the `<svg>` and derives everything else it needs from `bg` + `fg`\n * with `color-mix()` — which is why leaving them at the library defaults painted\n * a near-white node fill (#f8f8f8, mixed from a white `bg`) on a dark page.\n *\n * `transparent` keeps the page background showing through, so `bg` only feeds\n * those derivations; the node fill is pinned explicitly via `surface`.\n */\nexport const fastRenderOptions = (scheme: ResolvedColorScheme): RenderOptions => {\n const token = tokenReader(scheme);\n\n return {\n bg: token('card'),\n fg: token('foreground'),\n line: token('border'),\n accent: token('primary'),\n muted: token('muted-foreground'),\n surface: token('muted'),\n border: token('border'),\n transparent: true,\n font: DIAGRAM_FONT,\n };\n};\n\n/**\n * Config for the async `mermaid` renderer (the fallback for dialects the fast\n * renderer can't parse, and for icon-pack diagrams).\n *\n * Built on the `base` theme so every colour comes from `themeVariables` rather\n * than mermaid's own light/dark palettes. Node chrome maps to the `accent` pair\n * (a tinted surface with a legible foreground in both schemes), containers to\n * `card`, and the gantt/note states to the status tokens — consumed as a low\n * alpha tint plus a solid mark, per the brand-neutrality contract, since the\n * status tokens themselves are text-legible colours rather than fills.\n */\nexport const mermaidConfig = (scheme: ResolvedColorScheme): MermaidConfig => {\n const token = tokenReader(scheme);\n\n const surface = token('accent');\n const onSurface = token('accent-foreground');\n const container = token('card');\n const onContainer = token('card-foreground');\n const line = token('border');\n const stroke = token('primary');\n const text = token('foreground');\n\n return {\n startOnLoad: false,\n securityLevel: 'strict',\n theme: 'base',\n themeVariables: {\n darkMode: scheme === 'dark',\n background: container,\n primaryColor: surface,\n primaryTextColor: onSurface,\n primaryBorderColor: stroke,\n secondaryColor: container,\n secondaryTextColor: onContainer,\n secondaryBorderColor: line,\n tertiaryColor: token('warning', 0.15),\n tertiaryTextColor: token('warning'),\n tertiaryBorderColor: token('warning'),\n lineColor: line,\n textColor: text,\n mainBkg: surface,\n nodeBorder: stroke,\n clusterBkg: container,\n clusterBorder: line,\n titleColor: text,\n edgeLabelBackground: container,\n nodeTextColor: onSurface,\n actorBorder: stroke,\n actorBkg: surface,\n actorTextColor: onSurface,\n actorLineColor: line,\n signalColor: text,\n signalTextColor: text,\n labelBoxBkgColor: surface,\n labelBoxBorderColor: stroke,\n labelTextColor: onSurface,\n loopTextColor: text,\n noteBorderColor: token('warning'),\n noteBkgColor: token('warning', 0.15),\n noteTextColor: text,\n sectionBkgColor: surface,\n altSectionBkgColor: container,\n sectionBkgColor2: token('muted'),\n taskBorderColor: stroke,\n taskBkgColor: surface,\n taskTextColor: onSurface,\n taskTextDarkColor: text,\n taskTextLightColor: text,\n activeTaskBorderColor: stroke,\n activeTaskBkgColor: token('primary', 0.25),\n doneTaskBorderColor: token('success'),\n doneTaskBkgColor: token('success', 0.15),\n critBorderColor: token('destructive'),\n critBkgColor: token('destructive', 0.15),\n fontFamily: DIAGRAM_FONT,\n fontSize: '14px',\n },\n };\n};\n","// Pure post-processing of mermaid's SVG output, before it reaches ZoomableSvg's\n// DOMPurify pass. Extracted for unit testing.\n\nconst HTML_TAG = /<[^>]+>/g;\nconst FOREIGN_OBJECT = /(<foreignObject\\b[^>]*>)([\\s\\S]*?)(<\\/foreignObject>)/g;\n// The root <svg> open tag, anchored to the start of the string.\nconst ROOT_SVG_TAG = /^(\\s*<svg\\b)([^>]*)(>)/i;\n\n/**\n * Mermaid renders node labels — including icon-shape (`@{ icon: … }`) labels — as\n * HTML (`<div><span><p>…</p></span></div>`) inside an SVG `<foreignObject>`. The\n * ZoomableSvg DOMPurify pass runs the SVG namespace profile, which strips every\n * XHTML-namespaced element under an `<svg>` root, so those wrapped labels vanish\n * (icon rendered, text gone). DOMPurify keeps *bare text* directly inside a\n * `<foreignObject>`, so collapse each label's HTML to its text content. Mermaid\n * has already sanitized that text under `securityLevel: 'strict'`, and dropping\n * the wrapper tags is strictly safer than keeping them.\n *\n * Entities are left encoded (`&amp;`, `&lt;`, …): as text-node content inside the\n * `<foreignObject>` the browser renders them correctly, and decoding them here\n * would risk turning `&lt;`/`&gt;` back into real angle brackets that could form\n * markup in the sanitized SVG.\n */\nexport const flattenForeignObjectLabels = (svg: string): string =>\n svg.replace(FOREIGN_OBJECT, (_match, open: string, inner: string, close: string) => {\n const text = inner.replace(HTML_TAG, ' ').replace(/\\s+/g, ' ').trim();\n return `${open}${text}${close}`;\n });\n\n/**\n * Make the diagram fluid: strip the root `<svg>`'s fixed width/height/style and\n * set `width=\"100%\"` plus a `max-width` from the viewBox width so it never\n * overflows its container.\n *\n * Only the ROOT `<svg>` tag is rewritten (anchored to string start). Icon-shape\n * nodes embed their own inner `<svg>` icons with fixed width/height; an earlier\n * unanchored regex matched the first `<svg …height…>` anywhere, so when the root\n * tag carried no height (mermaid emits `width=\"100%\"` alone) it stripped the\n * FIRST icon's height instead — detaching and mis-sizing that icon.\n *\n * The existing `style` attribute is preserved (only an existing `max-width` is\n * replaced): beautiful-mermaid carries theme CSS vars (`--bg`, `--fg`) there that\n * its inner `<style>` block derives node/text colors from — dropping the whole\n * attribute made every derived color resolve to black.\n */\nconst STYLE_ATTR = /\\s+style=\"([^\"]*)\"/i;\n\nexport const makeResponsive = (svgString: string): string => {\n const viewBoxMatch = svgString.match(/viewBox=\"[^\"]*\\s([\\d.]+)\\s[\\d.]+\"/);\n const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : undefined;\n\n return svgString.replace(ROOT_SVG_TAG, (_match, open: string, attrs: string, close: string) => {\n const existingStyle = attrs.match(STYLE_ATTR)?.[1] ?? '';\n const styleDecls = existingStyle\n .replace(/max-width:\\s*[^;\"]*;?\\s*/gi, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/;$/, '');\n\n let nextAttrs = attrs\n .replace(/\\s+width=\"[^\"]*\"/i, '')\n .replace(/\\s+height=\"[^\"]*\"/i, '')\n .replace(STYLE_ATTR, '');\n\n nextAttrs += ' width=\"100%\"';\n\n const styleParts = [styleDecls, vbWidth ? `max-width: ${vbWidth}px` : '']\n .filter(Boolean)\n .join('; ');\n if (styleParts) nextAttrs += ` style=\"${styleParts}\"`;\n\n return `${open}${nextAttrs}${close}`;\n });\n};\n\n/**\n * Whether an SVG has drawn content, i.e. a non-degenerate viewBox.\n *\n * - beautiful-mermaid does not throw on every syntax it cannot lay out: an\n * `erDiagram` entity whose quoted name contains a space (`\"sample (Copy)\"`)\n * returns a well-formed SVG with `viewBox=\"0 0 0 0\"` and an empty `<defs>`.\n * - Such output is truthy, so it would be cached and rendered as an empty box,\n * and the async mermaid renderer — which parses the same code fine — would\n * never run.\n * - A missing viewBox counts as drawn: mermaid's own output is sized via\n * width/height attributes on some diagram types.\n * - Only the ROOT `<svg>` is inspected. Icon-shape nodes embed their own inner\n * `<svg>` / `<symbol>`, so an unanchored search reads a nested viewBox when the\n * root carries none — discarding a diagram that had in fact been drawn. Same\n * trap `makeResponsive` documents above.\n * - Either quote style is accepted, and whitespace around the `=`. Both current\n * renderers emit `viewBox=\"…\"` exactly, so this is future-proofing rather than a\n * live case: a miss reads as \"no viewBox\", i.e. drawn, silently restoring the\n * empty-diagram bug.\n */\nconst ROOT_VIEWBOX =\n /^\\s*<svg\\b[^>]*\\sviewBox\\s*=\\s*([\"'])\\s*[\\d.eE+-]+\\s+[\\d.eE+-]+\\s+([\\d.eE+-]+)\\s+([\\d.eE+-]+)\\s*\\1/i;\n\nexport const hasDrawnContent = (svg: string): boolean => {\n const viewBox = svg.match(ROOT_VIEWBOX);\n if (!viewBox) return true;\n return Number(viewBox[2]) > 0 && Number(viewBox[3]) > 0;\n};\n","import { useEffect, useId, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { renderMermaidSVG } from 'beautiful-mermaid';\nimport type mermaid from 'mermaid';\n\nimport type { ResolvedColorScheme } from '../../components/ThemeProvider/types';\nimport { useThemeAttributes } from '../../components/ThemeProvider/useThemeAttributes';\nimport { ZoomableSvg } from '../../components/ZoomableSvg';\nimport { cn } from '../../utils';\n\nimport { DiagramSkeleton } from './DiagramSkeleton';\nimport { fastRenderOptions, mermaidConfig } from './mermaidTheme';\nimport { flattenForeignObjectLabels, hasDrawnContent, makeResponsive } from './svgTransforms';\n\ntype MermaidModule = { default: typeof mermaid };\n\nlet mermaidPromise: Promise<MermaidModule> | null = null;\n\n// Iconify icon pack registered with mermaid so `@{ icon: \"lucide:name\" }` node\n// shapes and `architecture-beta service <id>(lucide:name)` render — keeping\n// diagram glyphs consistent with the Lucide icons used across the rest of the UI.\n// The pack JSON resolves from a workspace dependency (no CDN fetch) via a dynamic\n// import, so it lands in its own lazy chunk and icons render offline / under a\n// strict CSP without weighing down the initial bundle.\nconst registerLucideIconPack = (m: typeof mermaid): void => {\n m.registerIconPacks([\n {\n name: 'lucide',\n loader: () => import('@iconify-json/lucide/icons.json').then((mod) => mod.default),\n },\n ]);\n};\n\nconst getMermaid = (): Promise<MermaidModule> => {\n if (!mermaidPromise) {\n mermaidPromise = import('mermaid')\n .then((m) => {\n registerLucideIconPack(m.default);\n return m;\n })\n .catch((err) => {\n mermaidPromise = null;\n throw err;\n });\n }\n return mermaidPromise;\n};\n\nconst stripFontImports = (svg: string): string =>\n svg.replace(/@import\\s+url\\([^)]*fonts\\.googleapis\\.com[^)]*\\);?\\s*/g, '');\n\n// beautiful-mermaid's synchronous renderer has no icon-pack support, so a diagram\n// using icon syntax must skip the fast path and take the async mermaid render\n// (which registers the pack). Matches:\n// - the flowchart / treeView icon shape `@{ icon: \"pack:name\" }`\n// - `architecture-beta` / `treeView` refs `icon|service|group <id>(pack:name)`\n// (the id between keyword and `(` is optional)\n// - legacy FontAwesome refs `fa:fa-*` / `fab:` embedded in node text\nconst hasIconSyntax = (code: string): boolean =>\n /@\\{[^}]*\\bicon\\s*:/.test(code) ||\n /\\b(?:icon|service|group)\\b[^\\n(]*\\(\\s*[\\w-]+:/.test(code) ||\n /\\bfa[bslr]?:fa-/.test(code);\n\nconst tryFastRender = (code: string, scheme: ResolvedColorScheme): string | null => {\n if (hasIconSyntax(code)) return null;\n try {\n const svg = stripFontImports(renderMermaidSVG(code, fastRenderOptions(scheme)));\n // A zero-sized result is a silent layout failure, not a diagram — take the\n // async fallback rather than caching an empty box. See `hasDrawnContent`.\n return hasDrawnContent(svg) ? svg : null;\n } catch (err) {\n // beautiful-mermaid can't parse every mermaid dialect; the async mermaid\n // renderer is the fallback. Log at debug so regressions are diagnosable\n // without noising up the console on the expected unsupported-syntax path.\n console.debug('[MermaidDiagram] fast render unavailable, using async fallback:', err);\n return null;\n }\n};\n\n/**\n * Whether a mermaid parse error means \"ran out of input\" rather than \"bad syntax\".\n *\n * - Mermaid's jison parsers report the end of input as token `1`, so a source\n * truncated mid-diagram — every intermediate frame of a streaming answer —\n * fails with `hash.token === 1`.\n * - Genuinely invalid syntax fails on a real token (`'ONLY_ONE'`, …) instead.\n * - Only a lower bound: some truncations do land on a real token and read as\n * invalid. Those fall through to the `<pre>` fallback for one frame and clear\n * when the next chunk arrives, which is the pre-existing behaviour.\n */\nconst isTruncatedDiagram = (err: unknown): boolean =>\n typeof err === 'object' && err !== null && 'hash' in err\n ? (err as { hash?: { token?: unknown } }).hash?.token === 1\n : false;\n\nconst RENDER_DEBOUNCE_MS = 300;\n\n// How long a truncated diagram is held as \"still arriving\" before it is shown as\n// source. Comfortably longer than the gap between streamed chunks, short enough\n// that an abandoned stream resolves while the reader is still looking at it.\nconst TRUNCATION_GRACE_MS = 2_000;\n\n// Module-level SVG cache — persists across component remounts (e.g. tab switches\n// that cause React to remount the tree). The colours are baked into the markup,\n// so the key is the code *plus* the theme key (scheme + brand): the same diagram\n// is a different SVG under a different colour scheme or brand.\nconst svgCache = new Map<string, string>();\n\nconst diagramCacheKey = (code: string, themeKey: string): string => `${themeKey}\\n${code}`;\n\n// Resolve an SVG synchronously: cache hit first, otherwise a fast synchronous\n// render. Caches the result and returns it, or null when neither is available\n// (the caller then falls back to the async mermaid render).\nconst resolveSyncSvg = (\n code: string,\n cacheKey: string,\n scheme: ResolvedColorScheme,\n): string | null => {\n const cached = svgCache.get(cacheKey);\n if (cached) return cached;\n const fast = tryFastRender(code, scheme);\n if (fast) svgCache.set(cacheKey, fast);\n return fast;\n};\n\ntype Props = {\n /** Mermaid diagram source code. Supports flowchart, sequence, class, state, ER,\n * pie, gantt, and mindmap. Gantt `dateFormat HH:mm` (time-only) is not supported\n * by mermaid's dayjs parser — use `dateFormat YYYY-MM-DD HH:mm` with `axisFormat %H:%M` instead. */\n code: string;\n /** Extra toolbar controls (e.g. an `ExportMenu`), forwarded to `ZoomableSvg`.\n * Receives the sanitized SVG. Omit to keep the default toolbar. */\n renderActions?: (safeSvg: string) => ReactNode;\n};\n\nexport const MermaidDiagram = ({ code, renderActions }: Props) => {\n const id = useId();\n // Re-renders whenever the active colour scheme or brand changes, so the\n // diagram is re-rendered in the new palette instead of staying a light island\n // on a dark page. The scheme comes out of the same read as the key, so the\n // palette can never be resolved under one scheme and cached under the other —\n // see `useThemeAttributes` for why the theme context is a step ahead of the\n // CSS variables it stands for.\n const { scheme, cacheKey: themeKey } = useThemeAttributes();\n const cacheKey = diagramCacheKey(code, themeKey);\n\n const [svg, setSvg] = useState<string | null>(() => resolveSyncSvg(code, cacheKey, scheme));\n const [renderFailed, setRenderFailed] = useState(false);\n const [truncated, setTruncated] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const renderIdRef = useRef(0);\n\n // Synchronously reset stale state when the code or the theme changes, to avoid\n // a one-frame flash of the previous diagram.\n const [prevKey, setPrevKey] = useState(cacheKey);\n if (cacheKey !== prevKey) {\n setPrevKey(cacheKey);\n setSvg(resolveSyncSvg(code, cacheKey, scheme));\n setRenderFailed(false);\n setTruncated(false);\n }\n\n useEffect(() => {\n // Synchronous results (cache hit / fast render) are already applied and\n // cached by the useState initializer (mount) and the render-phase reset\n // (code / theme change). Only the async fallback needs an effect.\n if (svgCache.has(cacheKey)) return;\n\n const currentRenderId = ++renderIdRef.current;\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n debounceRef.current = setTimeout(() => {\n getMermaid()\n .then(async (mermaidModule) => {\n if (renderIdRef.current !== currentRenderId) return;\n const rendererId = `mermaid-${id.replaceAll(':', '')}`;\n const container = document.createElement('div');\n container.style.visibility = 'hidden';\n container.style.position = 'absolute';\n container.style.top = '-9999px';\n container.style.width = '900px';\n document.body.appendChild(container);\n // Re-applied per render rather than once at import: `initialize` is the\n // only way to change mermaid's palette, and the palette follows the\n // active scheme/brand.\n mermaidModule.default.initialize(mermaidConfig(scheme));\n try {\n const result = await mermaidModule.default.render(rendererId, code, container);\n if (renderIdRef.current === currentRenderId && result) {\n const svgOutput = flattenForeignObjectLabels(result.svg);\n svgCache.set(cacheKey, svgOutput);\n setSvg(svgOutput);\n setRenderFailed(false);\n setTruncated(false);\n }\n } finally {\n container.remove();\n }\n })\n .catch((err: unknown) => {\n if (renderIdRef.current !== currentRenderId) return;\n setSvg(null);\n // A diagram arriving a chunk at a time is invalid at almost every\n // intermediate length, so a truncation is treated as \"not ready\" and\n // holds the skeleton instead of the raw-code `<pre>`. It is held for a\n // bounded wait, not indefinitely: a stream that dies mid-entity — or a\n // diagram a user simply left unterminated — never gets a next chunk, and\n // a skeleton that stays forever is worse than showing the source. The\n // timer is cleared by the effect teardown, so any further chunk cancels\n // it and re-renders.\n if (isTruncatedDiagram(err)) {\n console.debug('[MermaidDiagram] incomplete diagram, awaiting more input:', err);\n setTruncated(true);\n return;\n }\n console.error('[MermaidDiagram] fallback failed:', err);\n setRenderFailed(true);\n });\n }, RENDER_DEBOUNCE_MS);\n\n const timer = debounceRef.current;\n const renderId = renderIdRef;\n return () => {\n renderId.current++;\n if (timer) {\n clearTimeout(timer);\n }\n };\n }, [cacheKey, code, id, scheme]);\n\n // A truncated diagram is held as \"still arriving\" for a bounded wait, not\n // indefinitely: a stream that dies mid-entity — or a diagram a user left\n // unterminated — never sends another chunk, and a skeleton that stays forever\n // is worse than showing the source. Any further chunk changes `code`, which\n // resets `truncated` and tears this timer down.\n useEffect(() => {\n if (!truncated) return;\n const timer = setTimeout(() => setRenderFailed(true), TRUNCATION_GRACE_MS);\n return () => clearTimeout(timer);\n }, [truncated, cacheKey]);\n\n const processedSvg = svg ? makeResponsive(svg) : null;\n\n if (renderFailed) {\n return (\n <pre\n className={cn(\n 'tw:my-3 tw:overflow-auto tw:whitespace-pre-wrap tw:break-all',\n 'tw:py-3 tw:px-4',\n 'tw:bg-muted',\n 'tw:rounded-md tw:text-muted-foreground',\n 'tw:text-sm tw:font-mono',\n )}\n >\n <code>{code}</code>\n </pre>\n );\n }\n\n if (processedSvg) {\n return (\n <ZoomableSvg\n key={code}\n html={processedSvg}\n copyText={`\\`\\`\\`mermaid\\n${code}\\n\\`\\`\\``}\n className=\"tw:my-3\"\n allowForeignObject\n renderActions={renderActions}\n />\n );\n }\n\n return <DiagramSkeleton />;\n};\n"]}
@@ -0,0 +1,6 @@
1
+ // src/utils/escapeStringRegexp.ts
2
+ var escapeStringRegexp = (string) => string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
3
+
4
+ export { escapeStringRegexp };
5
+ //# sourceMappingURL=chunk-MODE4QIA.js.map
6
+ //# sourceMappingURL=chunk-MODE4QIA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/escapeStringRegexp.ts"],"names":[],"mappings":";AAEO,IAAM,kBAAA,GAAqB,CAAC,MAAA,KACjC,MAAA,CAAO,OAAA,CAAQ,uBAAuB,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO","file":"chunk-MODE4QIA.js","sourcesContent":["// Escape characters with special meaning either inside or outside character sets.\n// Use a simple backslash escape when it's always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns' stricter grammar.\nexport const escapeStringRegexp = (string: string) =>\n string.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n"]}
@@ -0,0 +1,118 @@
1
+ import { Collapsible } from './chunk-FVPGQ6UE.js';
2
+ import { ChevronDown } from './chunk-RQVK4IYC.js';
3
+ import { keyCodes } from './chunk-SWQFYNYG.js';
4
+ import { cn } from './chunk-LXLIQ2D6.js';
5
+ import { useState } from 'react';
6
+ import { cva } from 'class-variance-authority';
7
+ import { jsxs, jsx } from 'react/jsx-runtime';
8
+
9
+ var headerVariants = cva(
10
+ "tw:flex tw:flex-1 tw:items-center tw:gap-2 tw:rounded tw:px-4 tw:py-2.5 tw:text-sm tw:text-muted-foreground",
11
+ {
12
+ variants: {
13
+ variant: {
14
+ default: "tw:bg-muted",
15
+ white: "tw:bg-card"
16
+ },
17
+ isDisabled: {
18
+ true: "tw:cursor-not-allowed tw:opacity-50",
19
+ false: ""
20
+ },
21
+ hasEnforcedState: {
22
+ true: "",
23
+ false: ""
24
+ }
25
+ },
26
+ compoundVariants: [
27
+ {
28
+ isDisabled: false,
29
+ hasEnforcedState: false,
30
+ class: "tw:cursor-pointer tw:hover:text-primary"
31
+ }
32
+ ],
33
+ defaultVariants: {
34
+ variant: "default",
35
+ isDisabled: false,
36
+ hasEnforcedState: false
37
+ }
38
+ }
39
+ );
40
+ var CollapsiblePanel = ({
41
+ header,
42
+ className,
43
+ bodyClassName,
44
+ headerClassName,
45
+ defaultExpanded = false,
46
+ isDisabled = false,
47
+ children,
48
+ isOpen,
49
+ onToggle,
50
+ variant = "default"
51
+ }) => {
52
+ const [isUncontrolledOpen, setIsUncontrolledOpen] = useState(defaultExpanded);
53
+ const open = isOpen ?? isUncontrolledOpen;
54
+ const hasEnforcedState = isOpen !== void 0 && onToggle === void 0;
55
+ const handleCollapse = (event) => {
56
+ if (event) {
57
+ event.stopPropagation();
58
+ }
59
+ if (!isDisabled) {
60
+ setIsUncontrolledOpen(!isUncontrolledOpen);
61
+ }
62
+ };
63
+ const handleClick = (e) => {
64
+ if (onToggle) {
65
+ onToggle(e);
66
+ return;
67
+ }
68
+ handleCollapse(e);
69
+ };
70
+ const handleKeyUp = (e) => {
71
+ if ([keyCodes.ENTER, keyCodes.SPACE].includes(e.key)) {
72
+ handleClick(e);
73
+ }
74
+ };
75
+ return (
76
+ // `header` is caller-supplied and routinely contains its own buttons, so the toggle stays on
77
+ // this wrapper — `Collapsible.Trigger` renders a `<button>` and would nest them.
78
+ /* @__PURE__ */ jsxs(
79
+ Collapsible,
80
+ {
81
+ open,
82
+ className: cn(
83
+ "tw:group tw:flex tw:flex-col tw:rounded tw:!border tw:!border-solid tw:!border-border tw:bg-card",
84
+ className
85
+ ),
86
+ children: [
87
+ /* @__PURE__ */ jsxs(
88
+ "div",
89
+ {
90
+ className: cn(headerVariants({ variant, isDisabled, hasEnforcedState }), headerClassName),
91
+ ...!hasEnforcedState && !isDisabled && {
92
+ role: "button",
93
+ tabIndex: 0,
94
+ onClick: handleClick,
95
+ onKeyUp: handleKeyUp
96
+ },
97
+ children: [
98
+ /* @__PURE__ */ jsx("div", { className: "tw:flex tw:flex-1 tw:items-center tw:gap-2 tw:py-px tw:text-sm tw:font-medium tw:text-foreground", children: header }),
99
+ !isDisabled && /* @__PURE__ */ jsx("div", { className: "tw:ml-auto tw:shrink-0", children: /* @__PURE__ */ jsx(
100
+ ChevronDown,
101
+ {
102
+ "data-state": open ? "open" : "closed",
103
+ className: "tw:size-5 tw:data-[state=open]:rotate-180"
104
+ }
105
+ ) })
106
+ ]
107
+ }
108
+ ),
109
+ /* @__PURE__ */ jsx(Collapsible.Content, { children: /* @__PURE__ */ jsx("div", { className: cn("tw:px-4 tw:py-3", bodyClassName), children }) })
110
+ ]
111
+ }
112
+ )
113
+ );
114
+ };
115
+
116
+ export { CollapsiblePanel };
117
+ //# sourceMappingURL=chunk-MVILMVGG.js.map
118
+ //# sourceMappingURL=chunk-MVILMVGG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/CollapsiblePanel.tsx"],"names":[],"mappings":"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","file":"chunk-MVILMVGG.js","sourcesContent":["import { useState } from 'react';\nimport type { KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\n\nimport { keyCodes } from '../constants/keyCodes';\nimport { ChevronDown } from '../icons';\nimport { cn } from '../utils';\n\nimport { Collapsible } from './Collapsible';\n\nconst headerVariants = cva(\n 'tw:flex tw:flex-1 tw:items-center tw:gap-2 tw:rounded tw:px-4 tw:py-2.5 tw:text-sm tw:text-muted-foreground',\n {\n variants: {\n variant: {\n default: 'tw:bg-muted',\n white: 'tw:bg-card',\n },\n isDisabled: {\n true: 'tw:cursor-not-allowed tw:opacity-50',\n false: '',\n },\n hasEnforcedState: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n isDisabled: false,\n hasEnforcedState: false,\n class: 'tw:cursor-pointer tw:hover:text-primary',\n },\n ],\n defaultVariants: {\n variant: 'default',\n isDisabled: false,\n hasEnforcedState: false,\n },\n },\n);\n\ntype Props = {\n header: ReactNode;\n isDisabled?: boolean;\n defaultExpanded?: boolean;\n className?: string;\n bodyClassName?: string;\n headerClassName?: string;\n isOpen?: boolean;\n onToggle?: (event?: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>) => void;\n variant?: 'default' | 'white';\n children: ReactNode;\n};\n\nexport const CollapsiblePanel = ({\n header,\n className,\n bodyClassName,\n headerClassName,\n defaultExpanded = false,\n isDisabled = false,\n children,\n isOpen,\n onToggle,\n variant = 'default',\n}: Props) => {\n const [isUncontrolledOpen, setIsUncontrolledOpen] = useState(defaultExpanded);\n const open = isOpen ?? isUncontrolledOpen;\n const hasEnforcedState = isOpen !== undefined && onToggle === undefined;\n\n const handleCollapse = (event: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>) => {\n if (event) {\n event.stopPropagation();\n }\n if (!isDisabled) {\n setIsUncontrolledOpen(!isUncontrolledOpen);\n }\n };\n\n const handleClick = (e: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>) => {\n if (onToggle) {\n onToggle(e);\n return;\n }\n handleCollapse(e);\n };\n\n const handleKeyUp = (e: KeyboardEvent<HTMLDivElement>) => {\n if ([keyCodes.ENTER, keyCodes.SPACE].includes(e.key)) {\n handleClick(e);\n }\n };\n\n return (\n // `header` is caller-supplied and routinely contains its own buttons, so the toggle stays on\n // this wrapper — `Collapsible.Trigger` renders a `<button>` and would nest them.\n <Collapsible\n open={open}\n className={cn(\n 'tw:group tw:flex tw:flex-col tw:rounded tw:!border tw:!border-solid tw:!border-border tw:bg-card',\n className,\n )}\n >\n <div\n className={cn(headerVariants({ variant, isDisabled, hasEnforcedState }), headerClassName)}\n {...(!hasEnforcedState &&\n !isDisabled && {\n role: 'button',\n tabIndex: 0,\n onClick: handleClick,\n onKeyUp: handleKeyUp,\n })}\n >\n <div className=\"tw:flex tw:flex-1 tw:items-center tw:gap-2 tw:py-px tw:text-sm tw:font-medium tw:text-foreground\">\n {header}\n </div>\n {!isDisabled && (\n <div className=\"tw:ml-auto tw:shrink-0\">\n {/* `group-*` matches *any* ancestor `.group`, so a nested panel's chevron would\n follow the outer panel's state. */}\n <ChevronDown\n data-state={open ? 'open' : 'closed'}\n className=\"tw:size-5 tw:data-[state=open]:rotate-180\"\n />\n </div>\n )}\n </div>\n <Collapsible.Content>\n <div className={cn('tw:px-4 tw:py-3', bodyClassName)}>{children}</div>\n </Collapsible.Content>\n </Collapsible>\n );\n};\n"]}
@@ -0,0 +1,17 @@
1
+ import { useState, useCallback } from 'react';
2
+
3
+ // src/hooks/useElement.ts
4
+ var useElement = () => {
5
+ const [element, _setElement] = useState(null);
6
+ const setElement = useCallback((node) => {
7
+ _setElement((prev) => {
8
+ if (prev !== null) return prev;
9
+ return node;
10
+ });
11
+ }, []);
12
+ return [element, setElement];
13
+ };
14
+
15
+ export { useElement };
16
+ //# sourceMappingURL=chunk-MWS4VCLV.js.map
17
+ //# sourceMappingURL=chunk-MWS4VCLV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useElement.ts"],"names":[],"mappings":";;;AAGO,IAAM,aAAa,MAAM;AAC9B,EAAA,MAAM,CAAC,OAAA,EAAS,WAAW,CAAA,GAAI,SAA6B,IAAI,CAAA;AAEhE,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,IAAA,KAA6B;AAC3D,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AAEpB,MAAA,IAAI,IAAA,KAAS,MAAM,OAAO,IAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,CAAC,SAAS,UAAU,CAAA;AAC7B","file":"chunk-MWS4VCLV.js","sourcesContent":["import { useCallback, useState } from 'react';\n\n// This hook is used to set an element reference and ensure that it only updates once, when element is first set.\nexport const useElement = () => {\n const [element, _setElement] = useState<HTMLElement | null>(null);\n\n const setElement = useCallback((node: HTMLElement | null) => {\n _setElement((prev) => {\n // Only update if not already set\n if (prev !== null) return prev;\n return node;\n });\n }, []);\n\n return [element, setElement] as const;\n};\n"]}
@@ -0,0 +1,315 @@
1
+ import { ModalOverlay, ModalTitle, ModalDescription } from './chunk-KZVC7OYG.js';
2
+ import { Separator } from './chunk-6DUMGC7Y.js';
3
+ import { Button } from './chunk-IXAYNBOY.js';
4
+ import { X } from './chunk-RQVK4IYC.js';
5
+ import { useArgoDesign } from './chunk-WETKNYZX.js';
6
+ import { cn } from './chunk-LXLIQ2D6.js';
7
+ import { Root, Close, Trigger, Portal, Content } from '@radix-ui/react-dialog';
8
+ import { jsx, jsxs } from 'react/jsx-runtime';
9
+ import { useState, useEffect } from 'react';
10
+
11
+ var ModalBody = ({ className, ...props }) => /* @__PURE__ */ jsx(
12
+ "div",
13
+ {
14
+ "data-slot": "modal-body",
15
+ className: cn(
16
+ // scrollable body - takes available space and scrolls when content overflows
17
+ "tw:flex-1",
18
+ "tw:overflow-y-auto",
19
+ // argo: soft top/bottom edge fade in place of header/footer separators (pure-CSS utility)
20
+ "tw:group-data-[argo=true]/modal:scroll-fade-y",
21
+ // Own horizontal padding, matching Header/Footer so content edges align (ModalContent adds none)
22
+ "tw:group-data-[argo=false]/modal:px-7",
23
+ "tw:group-data-[argo=true]/modal:px-4",
24
+ "tw:py-1",
25
+ // normalize nested Lucide icon sizing, matching Popover/HoverCard/Alert content surfaces
26
+ "tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4",
27
+ "tw:[&_svg]:shrink-0",
28
+ className
29
+ ),
30
+ ...props
31
+ }
32
+ );
33
+ var ModalContent = ({
34
+ size = "medium",
35
+ className,
36
+ children,
37
+ onEscapeKeyDown,
38
+ ...props
39
+ }) => {
40
+ const renderArgo = useArgoDesign();
41
+ const handleEscapeKeyDown = (event) => {
42
+ event.stopPropagation();
43
+ onEscapeKeyDown?.(event);
44
+ };
45
+ return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(ModalOverlay, { children: /* @__PURE__ */ jsx(
46
+ Content,
47
+ {
48
+ ...props,
49
+ "data-argo": renderArgo,
50
+ "data-size": size,
51
+ className: cn(
52
+ "tailwindcss-preflight",
53
+ "tw:group/modal",
54
+ // positioning - horizontally centered; vertical anchor depends on the design language
55
+ "tw:fixed",
56
+ "tw:left-1/2",
57
+ "tw:-translate-x-1/2",
58
+ "tw:z-[1051]",
59
+ // legacy: anchored near the top; argo: centered in the viewport (like AlertModal)
60
+ "tw:data-[argo=false]:top-20",
61
+ "tw:data-[argo=true]:top-1/2",
62
+ "tw:data-[argo=true]:-translate-y-1/2",
63
+ // sizing - responsive max dimensions
64
+ "tw:w-full",
65
+ "tw:max-w-2xl",
66
+ "tw:max-h-[calc(100vh-2*theme(spacing.20))]",
67
+ // layout
68
+ "tw:flex",
69
+ "tw:flex-col",
70
+ "tw:gap-4",
71
+ "tw:data-[argo=false]:rounded-lg",
72
+ "tw:data-[argo=true]:rounded-3xl",
73
+ "tw:bg-card",
74
+ "tw:text-card-foreground",
75
+ // Vertical (edge) padding lives here so it survives an omitted Header or Footer.
76
+ // Horizontal padding is owned by Header / Body / Footer, so the Body runs full-bleed and
77
+ // its scrollbar sits at the modal edge (see ModalBody).
78
+ "tw:data-[argo=false]:py-8",
79
+ "tw:data-[argo=true]:py-4",
80
+ // animation — shared
81
+ "tw:duration-200",
82
+ "tw:data-[state=open]:animate-in",
83
+ "tw:data-[state=open]:fade-in-0",
84
+ "tw:data-[state=closed]:animate-out",
85
+ "tw:data-[state=closed]:fade-out-0",
86
+ // NOTE: no `slide-*-left-1/2` (both) or argo `slide-*-top-1/2`. Those re-pinned the
87
+ // -50%/-50% centring during the animation under v3, where centring and the animation
88
+ // shared the `transform` property (the animation overrode it). Under v4 the centring
89
+ // uses the `translate` PROPERTY while tw-animate-css animates `transform` — they compose
90
+ // instead of overriding, so a -50% enter-translate stacks on the -50% centring (= -100%)
91
+ // and the modal flies in from the top-left. Centring now persists on its own, so we
92
+ // animate transform-only (zoom + fade) and the modal stays put.
93
+ // legacy: slide-down + zoom (top-anchored via `top-20`, so no `translate-y` to double)
94
+ "tw:data-[argo=false]:data-[state=open]:zoom-in-80",
95
+ "tw:data-[argo=false]:data-[state=open]:slide-in-from-top-[48%]",
96
+ "tw:data-[argo=false]:data-[state=closed]:zoom-out-80",
97
+ "tw:data-[argo=false]:data-[state=closed]:slide-out-to-top-[48%]",
98
+ // argo: pop from the centre — zoom only
99
+ "tw:data-[argo=true]:data-[state=open]:zoom-in-95",
100
+ "tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
101
+ {
102
+ "tw:max-w-[480px]": size === "small",
103
+ "tw:max-w-4xl": size === "large"
104
+ },
105
+ className
106
+ ),
107
+ onEscapeKeyDown: handleEscapeKeyDown,
108
+ children
109
+ }
110
+ ) }) });
111
+ };
112
+ var ModalFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
113
+ "div",
114
+ {
115
+ ...props,
116
+ className: cn(
117
+ // Own horizontal padding (ModalContent owns the vertical edge padding)
118
+ "tw:group-data-[argo=false]/modal:px-7",
119
+ "tw:group-data-[argo=true]/modal:px-4",
120
+ className
121
+ )
122
+ }
123
+ );
124
+ var ModalActions = ({ className, ...props }) => /* @__PURE__ */ jsx(
125
+ "div",
126
+ {
127
+ className: cn(
128
+ "tw:col-start-3",
129
+ "tw:row-start-1",
130
+ "tw:self-start",
131
+ "tw:flex",
132
+ "tw:items-center",
133
+ "tw:gap-1",
134
+ // argo: gutter separating the actions/close from the title (carried here so the grid needs no
135
+ // column gap — see ModalHeader)
136
+ "tw:group-data-[argo=true]/modal:ml-3",
137
+ className
138
+ ),
139
+ ...props
140
+ }
141
+ );
142
+ var ModalHeader = ({
143
+ className,
144
+ icon,
145
+ description,
146
+ "aria-description": ariaDescription,
147
+ actions,
148
+ hideCloseIcon = false,
149
+ children,
150
+ ...props
151
+ }) => /* @__PURE__ */ jsxs(
152
+ "div",
153
+ {
154
+ ...props,
155
+ "data-slot": "modal-header",
156
+ className: cn(
157
+ "tw:grid",
158
+ "tw:grid-cols-[auto_1fr_auto]",
159
+ "tw:items-center",
160
+ "tw:group-data-[argo=false]/modal:px-7",
161
+ "tw:group-data-[argo=true]/modal:px-4",
162
+ className
163
+ ),
164
+ children: [
165
+ icon,
166
+ children && /* @__PURE__ */ jsx(ModalTitle, { className: "tw:col-start-2 tw:row-start-1", children }),
167
+ (actions || !hideCloseIcon) && /* @__PURE__ */ jsxs(ModalActions, { children: [
168
+ actions,
169
+ !hideCloseIcon && /* @__PURE__ */ jsx(Close, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "invisible", size: "icon-sm", children: [
170
+ /* @__PURE__ */ jsx(X, {}),
171
+ /* @__PURE__ */ jsx("span", { className: "tw:sr-only", children: "Close" })
172
+ ] }) })
173
+ ] }),
174
+ (description || ariaDescription) && /* @__PURE__ */ jsx(
175
+ ModalDescription,
176
+ {
177
+ className: cn(
178
+ "tw:col-start-1",
179
+ "tw:col-end-4",
180
+ "tw:row-start-2",
181
+ description ? "tw:mt-1" : "tw:sr-only"
182
+ ),
183
+ children: description ?? ariaDescription
184
+ }
185
+ ),
186
+ /* @__PURE__ */ jsx(
187
+ "div",
188
+ {
189
+ className: cn(
190
+ "tw:col-start-1",
191
+ "tw:col-end-4",
192
+ "tw:mt-5",
193
+ "tw:hidden",
194
+ "tw:group-data-[argo=false]/modal:[[data-slot=modal-header]:has(~[data-slot=modal-body])_&]:block",
195
+ "tw:group-data-[argo=false]/modal:[[data-slot=modal-header]:has(~[data-slot=modal-body]_[data-slot=tabs-root])_&]:!hidden"
196
+ ),
197
+ children: /* @__PURE__ */ jsx(Separator, { orientation: "horizontal" })
198
+ }
199
+ )
200
+ ]
201
+ }
202
+ );
203
+ var NAMED_COLORS = /* @__PURE__ */ new Set(["orange", "blue", "red", "green", "gray", "violet"]);
204
+ var ModalIcon = ({ color, icon }) => {
205
+ const customColor = color && !NAMED_COLORS.has(color) ? color : void 0;
206
+ return /* @__PURE__ */ jsx(
207
+ "span",
208
+ {
209
+ "data-slot": "modal-icon",
210
+ className: cn(
211
+ "tw:flex",
212
+ "tw:shrink-0",
213
+ "tw:items-center",
214
+ "tw:justify-center",
215
+ "tw:[&_svg]:aspect-square",
216
+ // legacy: solid-filled circular badge floating at the modal's top-left
217
+ "tw:group-data-[argo=false]/modal:absolute",
218
+ "tw:group-data-[argo=false]/modal:top-0",
219
+ "tw:group-data-[argo=false]/modal:left-8",
220
+ "tw:group-data-[argo=false]/modal:-translate-y-1/2",
221
+ "tw:group-data-[argo=false]/modal:size-12",
222
+ "tw:group-data-[argo=false]/modal:rounded-full",
223
+ 'tw:group-data-[argo=false]/modal:[&_svg:not([class*="tw:size-"])]:size-6',
224
+ // argo: soft-tinted inline badge in the header grid's first column
225
+ "tw:group-data-[argo=true]/modal:col-start-1",
226
+ "tw:group-data-[argo=true]/modal:row-start-1",
227
+ "tw:group-data-[argo=true]/modal:self-start",
228
+ "tw:group-data-[argo=true]/modal:mr-3",
229
+ "tw:group-data-[argo=true]/modal:size-8",
230
+ "tw:group-data-[argo=true]/modal:rounded",
231
+ "tw:group-data-[argo=true]/modal:overflow-hidden",
232
+ 'tw:group-data-[argo=true]/modal:[&_svg:not([class*="tw:size-"])]:size-5',
233
+ // legacy palette: solid fill + white glyph (violet is the exception — tinted)
234
+ {
235
+ "tw:group-data-[argo=false]/modal:bg-warning-500": color === "orange",
236
+ "tw:group-data-[argo=false]/modal:bg-blue-500": color === "blue",
237
+ "tw:group-data-[argo=false]/modal:bg-green-500": color === "green",
238
+ "tw:group-data-[argo=false]/modal:bg-error-500": color === "red",
239
+ "tw:group-data-[argo=false]/modal:bg-neutral-150": color === "gray",
240
+ "tw:group-data-[argo=false]/modal:bg-purple-100": color === "violet",
241
+ "tw:group-data-[argo=false]/modal:text-white": color !== "violet",
242
+ "tw:group-data-[argo=false]/modal:text-purple-500": color === "violet"
243
+ },
244
+ // argo palette: soft tint + matching glyph colour
245
+ {
246
+ "tw:group-data-[argo=true]/modal:bg-warning-100 tw:group-data-[argo=true]/modal:text-warning-500": color === "orange",
247
+ "tw:group-data-[argo=true]/modal:bg-blue-100 tw:group-data-[argo=true]/modal:text-blue-600": color === "blue",
248
+ "tw:group-data-[argo=true]/modal:bg-green-100 tw:group-data-[argo=true]/modal:text-green-900": color === "green",
249
+ "tw:group-data-[argo=true]/modal:bg-error-100 tw:group-data-[argo=true]/modal:text-error-500": color === "red",
250
+ "tw:group-data-[argo=true]/modal:bg-neutral-100 tw:group-data-[argo=true]/modal:text-neutral-500": color === "gray",
251
+ "tw:group-data-[argo=true]/modal:bg-purple-100 tw:group-data-[argo=true]/modal:text-purple-500": color === "violet"
252
+ },
253
+ // custom (non-named) colour: caller-provided fill + white glyph
254
+ { "tw:text-white": !!customColor }
255
+ ),
256
+ style: customColor ? { backgroundColor: customColor } : void 0,
257
+ children: icon
258
+ }
259
+ );
260
+ };
261
+ var ModalImage = ({ src, alt = "" }) => {
262
+ const [hasImageError, setHasImageError] = useState(false);
263
+ useEffect(() => setHasImageError(false), [src]);
264
+ if (hasImageError) return null;
265
+ return /* @__PURE__ */ jsx(
266
+ "span",
267
+ {
268
+ "data-slot": "modal-image",
269
+ className: cn(
270
+ "tw:shrink-0",
271
+ "tw:overflow-hidden",
272
+ // legacy: circular badge floating at the top-left of the modal
273
+ "tw:group-data-[argo=false]/modal:absolute",
274
+ "tw:group-data-[argo=false]/modal:top-0",
275
+ "tw:group-data-[argo=false]/modal:left-8",
276
+ "tw:group-data-[argo=false]/modal:-translate-y-1/2",
277
+ "tw:group-data-[argo=false]/modal:size-12",
278
+ "tw:group-data-[argo=false]/modal:rounded-full",
279
+ // argo: inline badge in the header grid's first column
280
+ "tw:group-data-[argo=true]/modal:flex",
281
+ "tw:group-data-[argo=true]/modal:col-start-1",
282
+ "tw:group-data-[argo=true]/modal:row-start-1",
283
+ "tw:group-data-[argo=true]/modal:self-start",
284
+ "tw:group-data-[argo=true]/modal:mr-3",
285
+ "tw:group-data-[argo=true]/modal:items-center",
286
+ "tw:group-data-[argo=true]/modal:justify-center",
287
+ "tw:group-data-[argo=true]/modal:rounded",
288
+ "tw:group-data-[argo=true]/modal:size-8"
289
+ ),
290
+ children: /* @__PURE__ */ jsx(
291
+ "img",
292
+ {
293
+ src,
294
+ alt,
295
+ className: "tw:size-full tw:object-contain",
296
+ onError: () => setHasImageError(true)
297
+ }
298
+ )
299
+ }
300
+ );
301
+ };
302
+ var Modal = (props) => /* @__PURE__ */ jsx(Root, { ...props });
303
+ Modal.Close = Close;
304
+ Modal.Trigger = Trigger;
305
+ Modal.Content = ModalContent;
306
+ Modal.Body = ModalBody;
307
+ Modal.Icon = ModalIcon;
308
+ Modal.Image = ModalImage;
309
+ Modal.Footer = ModalFooter;
310
+ Modal.Header = ModalHeader;
311
+ Modal.Overlay = ModalOverlay;
312
+
313
+ export { Modal };
314
+ //# sourceMappingURL=chunk-NEUX74SO.js.map
315
+ //# sourceMappingURL=chunk-NEUX74SO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Modal/ModalBody.tsx","../src/components/Modal/ModalContent.tsx","../src/components/Modal/ModalFooter.tsx","../src/components/Modal/ModalActions.tsx","../src/components/Modal/ModalHeader.tsx","../src/components/Modal/ModalIcon.tsx","../src/components/Modal/ModalImage.tsx","../src/components/Modal/Modal.tsx"],"names":["jsx","Close"],"mappings":"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","file":"chunk-NEUX74SO.js","sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\n/** Props for `Modal.Body`. Accepts all `<div>` attributes; `as=\"form\"` is reserved for future use. */\ntype Props = ComponentProps<'div'> & {\n as?: 'form';\n};\n\n/**\n * Scrollable body slot for `Modal`. Place form fields, content blocks, or detail panels here.\n * Takes available height inside `Modal.Content` and scrolls when content overflows.\n */\nexport const ModalBody = ({ className, ...props }: Props) => (\n <div\n data-slot=\"modal-body\"\n className={cn(\n // scrollable body - takes available space and scrolls when content overflows\n 'tw:flex-1',\n 'tw:overflow-y-auto',\n\n // argo: soft top/bottom edge fade in place of header/footer separators (pure-CSS utility)\n 'tw:group-data-[argo=true]/modal:scroll-fade-y',\n\n // Own horizontal padding, matching Header/Footer so content edges align (ModalContent adds none)\n 'tw:group-data-[argo=false]/modal:px-7',\n 'tw:group-data-[argo=true]/modal:px-4',\n 'tw:py-1',\n\n // normalize nested Lucide icon sizing, matching Popover/HoverCard/Alert content surfaces\n \"tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4\",\n 'tw:[&_svg]:shrink-0',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\nimport { Content, Portal } from '@radix-ui/react-dialog';\n\nimport { cn } from '../../utils';\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nimport { ModalOverlay } from './ModalOverlay';\n\ntype Props = ComponentProps<typeof Content> & {\n size?: 'small' | 'medium' | 'large';\n};\n\nexport const ModalContent = ({\n size = 'medium',\n className,\n children,\n onEscapeKeyDown,\n ...props\n}: Props) => {\n const renderArgo = useArgoDesign();\n\n const handleEscapeKeyDown: typeof onEscapeKeyDown = (event) => {\n // Stop propagation to prevent parent modals (like FullScreenModal) from closing\n event.stopPropagation();\n onEscapeKeyDown?.(event);\n };\n\n return (\n <Portal>\n <ModalOverlay>\n <Content\n // props first so callers can't override the computed data-argo / data-size\n {...props}\n data-argo={renderArgo}\n data-size={size}\n className={cn(\n 'tailwindcss-preflight',\n 'tw:group/modal',\n\n // positioning - horizontally centered; vertical anchor depends on the design language\n 'tw:fixed',\n 'tw:left-1/2',\n 'tw:-translate-x-1/2',\n 'tw:z-[1051]',\n\n // legacy: anchored near the top; argo: centered in the viewport (like AlertModal)\n 'tw:data-[argo=false]:top-20',\n 'tw:data-[argo=true]:top-1/2',\n 'tw:data-[argo=true]:-translate-y-1/2',\n\n // sizing - responsive max dimensions\n 'tw:w-full',\n 'tw:max-w-2xl',\n 'tw:max-h-[calc(100vh-2*theme(spacing.20))]',\n\n // layout\n 'tw:flex',\n 'tw:flex-col',\n 'tw:gap-4',\n 'tw:data-[argo=false]:rounded-lg',\n 'tw:data-[argo=true]:rounded-3xl',\n 'tw:bg-card',\n 'tw:text-card-foreground',\n\n // Vertical (edge) padding lives here so it survives an omitted Header or Footer.\n // Horizontal padding is owned by Header / Body / Footer, so the Body runs full-bleed and\n // its scrollbar sits at the modal edge (see ModalBody).\n 'tw:data-[argo=false]:py-8',\n 'tw:data-[argo=true]:py-4',\n\n // animation — shared\n 'tw:duration-200',\n 'tw:data-[state=open]:animate-in',\n 'tw:data-[state=open]:fade-in-0',\n 'tw:data-[state=closed]:animate-out',\n 'tw:data-[state=closed]:fade-out-0',\n\n // NOTE: no `slide-*-left-1/2` (both) or argo `slide-*-top-1/2`. Those re-pinned the\n // -50%/-50% centring during the animation under v3, where centring and the animation\n // shared the `transform` property (the animation overrode it). Under v4 the centring\n // uses the `translate` PROPERTY while tw-animate-css animates `transform` — they compose\n // instead of overriding, so a -50% enter-translate stacks on the -50% centring (= -100%)\n // and the modal flies in from the top-left. Centring now persists on its own, so we\n // animate transform-only (zoom + fade) and the modal stays put.\n\n // legacy: slide-down + zoom (top-anchored via `top-20`, so no `translate-y` to double)\n 'tw:data-[argo=false]:data-[state=open]:zoom-in-80',\n 'tw:data-[argo=false]:data-[state=open]:slide-in-from-top-[48%]',\n 'tw:data-[argo=false]:data-[state=closed]:zoom-out-80',\n 'tw:data-[argo=false]:data-[state=closed]:slide-out-to-top-[48%]',\n\n // argo: pop from the centre — zoom only\n 'tw:data-[argo=true]:data-[state=open]:zoom-in-95',\n 'tw:data-[argo=true]:data-[state=closed]:zoom-out-95',\n\n {\n 'tw:max-w-[480px]': size === 'small',\n 'tw:max-w-4xl': size === 'large',\n },\n\n className,\n )}\n onEscapeKeyDown={handleEscapeKeyDown}\n >\n {children}\n </Content>\n </ModalOverlay>\n </Portal>\n );\n};\n","import type { ComponentPropsWithRef } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentPropsWithRef<'div'>;\n\nexport const ModalFooter = ({ className, ...props }: Props) => (\n <div\n {...props}\n className={cn(\n // Own horizontal padding (ModalContent owns the vertical edge padding)\n 'tw:group-data-[argo=false]/modal:px-7',\n 'tw:group-data-[argo=true]/modal:px-4',\n className,\n )}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'div'>;\n\n/**\n * Container for the header's top-right controls — any `actions` passed to `Modal.Header` plus the\n * close icon. Sits in the header grid's last column, top-aligned. Mirrors `Alert`'s action slot.\n */\nexport const ModalActions = ({ className, ...props }: Props) => (\n <div\n className={cn(\n 'tw:col-start-3',\n 'tw:row-start-1',\n 'tw:self-start',\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-1',\n // argo: gutter separating the actions/close from the title (carried here so the grid needs no\n // column gap — see ModalHeader)\n 'tw:group-data-[argo=true]/modal:ml-3',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps, ReactNode } from 'react';\nimport { Close } from '@radix-ui/react-dialog';\n\nimport { X } from '../../icons';\nimport { cn } from '../../utils';\nimport { Button } from '../Button';\nimport { Separator } from '../Separator';\n\nimport { ModalActions } from './ModalActions';\nimport { ModalDescription } from './ModalDescription';\nimport { ModalTitle } from './ModalTitle';\n\ntype Props = {\n /** Status icon slot — `<Modal.Icon />` or `<Modal.Image />`. */\n icon?: ReactNode;\n /** Visible subtitle below the title (also fills `aria-describedby`). */\n description?: ReactNode;\n /** Screen-reader-only description; fills `aria-describedby` without rendering visibly. */\n 'aria-description'?: string;\n /** Controls rendered top-right, before the close icon. */\n actions?: ReactNode;\n /** Hide the top-right close icon. */\n hideCloseIcon?: boolean;\n} & ComponentProps<'div'>;\n\n/** Modal header: `[icon] | title (children) | actions + close` on row 1, `description` on row 2. */\nexport const ModalHeader = ({\n className,\n icon,\n description,\n 'aria-description': ariaDescription,\n actions,\n hideCloseIcon = false,\n children,\n ...props\n}: Props) => (\n <div\n {...props}\n data-slot=\"modal-header\"\n className={cn(\n 'tw:grid',\n 'tw:grid-cols-[auto_1fr_auto]',\n 'tw:items-center',\n 'tw:group-data-[argo=false]/modal:px-7',\n 'tw:group-data-[argo=true]/modal:px-4',\n className,\n )}\n >\n {icon}\n\n {children && <ModalTitle className=\"tw:col-start-2 tw:row-start-1\">{children}</ModalTitle>}\n {(actions || !hideCloseIcon) && (\n <ModalActions>\n {actions}\n {!hideCloseIcon && (\n <Close asChild>\n <Button variant=\"invisible\" size=\"icon-sm\">\n <X />\n <span className=\"tw:sr-only\">Close</span>\n </Button>\n </Close>\n )}\n </ModalActions>\n )}\n {(description || ariaDescription) && (\n <ModalDescription\n className={cn(\n 'tw:col-start-1',\n 'tw:col-end-4',\n 'tw:row-start-2',\n description ? 'tw:mt-1' : 'tw:sr-only',\n )}\n >\n {description ?? ariaDescription}\n </ModalDescription>\n )}\n\n {/* Legacy-only separator; shown when a Body follows, hidden when that body hosts Tabs. */}\n <div\n className={cn(\n 'tw:col-start-1',\n 'tw:col-end-4',\n 'tw:mt-5',\n 'tw:hidden',\n 'tw:group-data-[argo=false]/modal:[[data-slot=modal-header]:has(~[data-slot=modal-body])_&]:block',\n 'tw:group-data-[argo=false]/modal:[[data-slot=modal-header]:has(~[data-slot=modal-body]_[data-slot=tabs-root])_&]:!hidden',\n )}\n >\n <Separator orientation=\"horizontal\" />\n </div>\n </div>\n);\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\ntype NamedColor = 'orange' | 'blue' | 'red' | 'green' | 'gray' | 'violet';\n\ntype Props = {\n color: NamedColor | (string & {});\n icon: ReactNode;\n};\n\nconst NAMED_COLORS = new Set<string>(['orange', 'blue', 'red', 'green', 'gray', 'violet']);\n\n/**\n * Status-coloured icon for `Modal`. Authored inside `Modal.Header`. For a remote image badge (a\n * component or backend logo fetched by URL) use `Modal.Image` instead.\n *\n * - **Legacy anatomy:** a solid-filled circular badge docked to the top-left of `Modal.Content`\n * (absolutely positioned, so it renders identically wherever it is authored).\n * - **Argo anatomy** (`data-argo` on `Modal.Content`): a small soft-tinted inline badge in the\n * header grid, next to the title.\n *\n * Both variants are rendered and toggled purely via CSS (`group-data-[argo=true]/modal:`) — no\n * context. Use the categorical `color` (`red` destructive, `orange` warning, `green` success,\n * `blue` info, `gray` neutral, `violet` agent) to encode meaning; the palette stays fixed across\n * brand themes.\n */\nexport const ModalIcon = ({ color, icon }: Props) => {\n const customColor = color && !NAMED_COLORS.has(color) ? color : undefined;\n\n return (\n <span\n data-slot=\"modal-icon\"\n className={cn(\n 'tw:flex',\n 'tw:shrink-0',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:[&_svg]:aspect-square',\n\n // legacy: solid-filled circular badge floating at the modal's top-left\n 'tw:group-data-[argo=false]/modal:absolute',\n 'tw:group-data-[argo=false]/modal:top-0',\n 'tw:group-data-[argo=false]/modal:left-8',\n 'tw:group-data-[argo=false]/modal:-translate-y-1/2',\n 'tw:group-data-[argo=false]/modal:size-12',\n 'tw:group-data-[argo=false]/modal:rounded-full',\n 'tw:group-data-[argo=false]/modal:[&_svg:not([class*=\"tw:size-\"])]:size-6',\n\n // argo: soft-tinted inline badge in the header grid's first column\n 'tw:group-data-[argo=true]/modal:col-start-1',\n 'tw:group-data-[argo=true]/modal:row-start-1',\n 'tw:group-data-[argo=true]/modal:self-start',\n 'tw:group-data-[argo=true]/modal:mr-3',\n 'tw:group-data-[argo=true]/modal:size-8',\n 'tw:group-data-[argo=true]/modal:rounded',\n 'tw:group-data-[argo=true]/modal:overflow-hidden',\n 'tw:group-data-[argo=true]/modal:[&_svg:not([class*=\"tw:size-\"])]:size-5',\n\n // legacy palette: solid fill + white glyph (violet is the exception — tinted)\n {\n 'tw:group-data-[argo=false]/modal:bg-warning-500': color === 'orange',\n 'tw:group-data-[argo=false]/modal:bg-blue-500': color === 'blue',\n 'tw:group-data-[argo=false]/modal:bg-green-500': color === 'green',\n 'tw:group-data-[argo=false]/modal:bg-error-500': color === 'red',\n 'tw:group-data-[argo=false]/modal:bg-neutral-150': color === 'gray',\n 'tw:group-data-[argo=false]/modal:bg-purple-100': color === 'violet',\n 'tw:group-data-[argo=false]/modal:text-white': color !== 'violet',\n 'tw:group-data-[argo=false]/modal:text-purple-500': color === 'violet',\n },\n\n // argo palette: soft tint + matching glyph colour\n {\n 'tw:group-data-[argo=true]/modal:bg-warning-100 tw:group-data-[argo=true]/modal:text-warning-500':\n color === 'orange',\n 'tw:group-data-[argo=true]/modal:bg-blue-100 tw:group-data-[argo=true]/modal:text-blue-600':\n color === 'blue',\n 'tw:group-data-[argo=true]/modal:bg-green-100 tw:group-data-[argo=true]/modal:text-green-900':\n color === 'green',\n 'tw:group-data-[argo=true]/modal:bg-error-100 tw:group-data-[argo=true]/modal:text-error-500':\n color === 'red',\n 'tw:group-data-[argo=true]/modal:bg-neutral-100 tw:group-data-[argo=true]/modal:text-neutral-500':\n color === 'gray',\n 'tw:group-data-[argo=true]/modal:bg-purple-100 tw:group-data-[argo=true]/modal:text-purple-500':\n color === 'violet',\n },\n\n // custom (non-named) colour: caller-provided fill + white glyph\n { 'tw:text-white': !!customColor },\n )}\n style={customColor ? { backgroundColor: customColor } : undefined}\n >\n {icon}\n </span>\n );\n};\n","import { useEffect, useState } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = {\n src: string;\n /** Accessible alt text. Defaults to `\"\"` (decorative) — provide it when the image carries meaning. */\n alt?: string;\n};\n\nexport const ModalImage = ({ src, alt = '' }: Props) => {\n const [hasImageError, setHasImageError] = useState(false);\n\n // Reset the error state when the source changes, so a reused badge (new logo, or a retry after a\n // transient failure) isn't permanently hidden by an earlier onError.\n useEffect(() => setHasImageError(false), [src]);\n\n if (hasImageError) return null;\n\n return (\n <span\n data-slot=\"modal-image\"\n className={cn(\n 'tw:shrink-0',\n 'tw:overflow-hidden',\n\n // legacy: circular badge floating at the top-left of the modal\n 'tw:group-data-[argo=false]/modal:absolute',\n 'tw:group-data-[argo=false]/modal:top-0',\n 'tw:group-data-[argo=false]/modal:left-8',\n 'tw:group-data-[argo=false]/modal:-translate-y-1/2',\n 'tw:group-data-[argo=false]/modal:size-12',\n 'tw:group-data-[argo=false]/modal:rounded-full',\n\n // argo: inline badge in the header grid's first column\n 'tw:group-data-[argo=true]/modal:flex',\n 'tw:group-data-[argo=true]/modal:col-start-1',\n 'tw:group-data-[argo=true]/modal:row-start-1',\n 'tw:group-data-[argo=true]/modal:self-start',\n 'tw:group-data-[argo=true]/modal:mr-3',\n 'tw:group-data-[argo=true]/modal:items-center',\n 'tw:group-data-[argo=true]/modal:justify-center',\n 'tw:group-data-[argo=true]/modal:rounded',\n 'tw:group-data-[argo=true]/modal:size-8',\n )}\n >\n <img\n src={src}\n alt={alt}\n className=\"tw:size-full tw:object-contain\"\n onError={() => setHasImageError(true)}\n />\n </span>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Close, Root, Trigger } from '@radix-ui/react-dialog';\n\nimport { ModalBody } from './ModalBody';\nimport { ModalContent } from './ModalContent';\nimport { ModalFooter } from './ModalFooter';\nimport { ModalHeader } from './ModalHeader';\nimport { ModalIcon } from './ModalIcon';\nimport { ModalImage } from './ModalImage';\nimport { ModalOverlay } from './ModalOverlay';\n\ntype Props = ComponentProps<typeof Root>;\n\n/**\n * Blocking dialog for confirmations, forms, and detail views. Built on Radix Dialog.\n *\n * **When to use:** the user must act before continuing (confirm a destructive action, fill a short form,\n * view a focused detail panel). Use the compound parts `Modal.Trigger`, `Modal.Content`, `Modal.Header`,\n * `Modal.Body`, `Modal.Footer`, and optionally `Modal.Icon` for a status-coloured header glyph.\n * **When NOT to use:** for slide-in side editing use `Sheet`; for an inline destructive confirmation anchored\n * to its trigger use `Popconfirm`; for hover previews use `HoverCard`.\n * **Composition:** wrap `Modal.Content` around `Modal.Header` + `Modal.Body` + `Modal.Footer`. Put `useAppForm`\n * `FormBody` inside `Modal.Body` and the submit / cancel buttons inside `Modal.Footer`.\n *\n * @see RECIPES.md#modal-form — for the canonical form-in-modal composition\n * @see RECIPES.md#confirm-dialog — for destructive-confirm dialogs\n */\nexport const Modal = (props: Props) => <Root {...props} />;\n\nModal.Close = Close;\nModal.Trigger = Trigger;\n\nModal.Content = ModalContent;\nModal.Body = ModalBody;\nModal.Icon = ModalIcon;\nModal.Image = ModalImage;\nModal.Footer = ModalFooter;\nModal.Header = ModalHeader;\nModal.Overlay = ModalOverlay;\n"]}