@theokit/ui 0.13.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 (715) hide show
  1. package/CHANGELOG.md +1325 -0
  2. package/DESIGN.md +456 -0
  3. package/LICENSE +201 -0
  4. package/NOTICE +38 -0
  5. package/README.md +467 -0
  6. package/dist/chunk-27ENTTY7.js +146 -0
  7. package/dist/chunk-27ENTTY7.js.map +1 -0
  8. package/dist/chunk-2H6TQELG.js +33 -0
  9. package/dist/chunk-2H6TQELG.js.map +1 -0
  10. package/dist/chunk-2L6MRJD4.js +120 -0
  11. package/dist/chunk-2L6MRJD4.js.map +1 -0
  12. package/dist/chunk-2Y5V2PAL.js +80 -0
  13. package/dist/chunk-2Y5V2PAL.js.map +1 -0
  14. package/dist/chunk-34NAFDVL.js +46 -0
  15. package/dist/chunk-34NAFDVL.js.map +1 -0
  16. package/dist/chunk-36KJGXEK.js +112 -0
  17. package/dist/chunk-36KJGXEK.js.map +1 -0
  18. package/dist/chunk-3BMYYNN6.js +124 -0
  19. package/dist/chunk-3BMYYNN6.js.map +1 -0
  20. package/dist/chunk-3OHV7EEI.js +34 -0
  21. package/dist/chunk-3OHV7EEI.js.map +1 -0
  22. package/dist/chunk-3QKTS6F5.js +88 -0
  23. package/dist/chunk-3QKTS6F5.js.map +1 -0
  24. package/dist/chunk-3TBXLYNM.js +42 -0
  25. package/dist/chunk-3TBXLYNM.js.map +1 -0
  26. package/dist/chunk-4AM2HSXU.js +67 -0
  27. package/dist/chunk-4AM2HSXU.js.map +1 -0
  28. package/dist/chunk-4BCGKM65.js +44 -0
  29. package/dist/chunk-4BCGKM65.js.map +1 -0
  30. package/dist/chunk-4D3JILQX.js +145 -0
  31. package/dist/chunk-4D3JILQX.js.map +1 -0
  32. package/dist/chunk-4EJU2GBG.js +48 -0
  33. package/dist/chunk-4EJU2GBG.js.map +1 -0
  34. package/dist/chunk-4WKO3G5C.js +110 -0
  35. package/dist/chunk-4WKO3G5C.js.map +1 -0
  36. package/dist/chunk-53XPKI7Q.js +97 -0
  37. package/dist/chunk-53XPKI7Q.js.map +1 -0
  38. package/dist/chunk-55TDVDPG.js +58 -0
  39. package/dist/chunk-55TDVDPG.js.map +1 -0
  40. package/dist/chunk-56BJLFW7.js +26 -0
  41. package/dist/chunk-56BJLFW7.js.map +1 -0
  42. package/dist/chunk-5HOQLE6Y.js +35 -0
  43. package/dist/chunk-5HOQLE6Y.js.map +1 -0
  44. package/dist/chunk-5TY3NYF5.js +144 -0
  45. package/dist/chunk-5TY3NYF5.js.map +1 -0
  46. package/dist/chunk-5VOSCJKQ.js +92 -0
  47. package/dist/chunk-5VOSCJKQ.js.map +1 -0
  48. package/dist/chunk-65NVO6TK.js +171 -0
  49. package/dist/chunk-65NVO6TK.js.map +1 -0
  50. package/dist/chunk-6A5TPCKP.js +64 -0
  51. package/dist/chunk-6A5TPCKP.js.map +1 -0
  52. package/dist/chunk-6CO4LEXZ.js +41 -0
  53. package/dist/chunk-6CO4LEXZ.js.map +1 -0
  54. package/dist/chunk-6FVUPNPG.js +56 -0
  55. package/dist/chunk-6FVUPNPG.js.map +1 -0
  56. package/dist/chunk-76YWTIWK.js +106 -0
  57. package/dist/chunk-76YWTIWK.js.map +1 -0
  58. package/dist/chunk-7EI7424P.js +78 -0
  59. package/dist/chunk-7EI7424P.js.map +1 -0
  60. package/dist/chunk-AHTVYOPQ.js +26 -0
  61. package/dist/chunk-AHTVYOPQ.js.map +1 -0
  62. package/dist/chunk-AJTJNHKK.js +85 -0
  63. package/dist/chunk-AJTJNHKK.js.map +1 -0
  64. package/dist/chunk-AMT3CPMC.js +155 -0
  65. package/dist/chunk-AMT3CPMC.js.map +1 -0
  66. package/dist/chunk-AX5EH73R.js +59 -0
  67. package/dist/chunk-AX5EH73R.js.map +1 -0
  68. package/dist/chunk-B3VAJSZ2.js +35 -0
  69. package/dist/chunk-B3VAJSZ2.js.map +1 -0
  70. package/dist/chunk-B4CQMQ64.js +25 -0
  71. package/dist/chunk-B4CQMQ64.js.map +1 -0
  72. package/dist/chunk-BMRZXT5T.js +115 -0
  73. package/dist/chunk-BMRZXT5T.js.map +1 -0
  74. package/dist/chunk-BYZ6OFH4.js +73 -0
  75. package/dist/chunk-BYZ6OFH4.js.map +1 -0
  76. package/dist/chunk-C55VUQ7N.js +156 -0
  77. package/dist/chunk-C55VUQ7N.js.map +1 -0
  78. package/dist/chunk-D4GEAV4C.js +91 -0
  79. package/dist/chunk-D4GEAV4C.js.map +1 -0
  80. package/dist/chunk-DC43CHAM.js +152 -0
  81. package/dist/chunk-DC43CHAM.js.map +1 -0
  82. package/dist/chunk-DKCRLN35.js +92 -0
  83. package/dist/chunk-DKCRLN35.js.map +1 -0
  84. package/dist/chunk-DN5BUDBI.js +86 -0
  85. package/dist/chunk-DN5BUDBI.js.map +1 -0
  86. package/dist/chunk-DOLKDYMS.js +88 -0
  87. package/dist/chunk-DOLKDYMS.js.map +1 -0
  88. package/dist/chunk-DW34WXCG.js +28 -0
  89. package/dist/chunk-DW34WXCG.js.map +1 -0
  90. package/dist/chunk-DZAAKHGZ.js +135 -0
  91. package/dist/chunk-DZAAKHGZ.js.map +1 -0
  92. package/dist/chunk-E4IRSSHO.js +116 -0
  93. package/dist/chunk-E4IRSSHO.js.map +1 -0
  94. package/dist/chunk-E67WQXBV.js +104 -0
  95. package/dist/chunk-E67WQXBV.js.map +1 -0
  96. package/dist/chunk-EG6IHP3H.js +128 -0
  97. package/dist/chunk-EG6IHP3H.js.map +1 -0
  98. package/dist/chunk-EO7LOXG2.js +82 -0
  99. package/dist/chunk-EO7LOXG2.js.map +1 -0
  100. package/dist/chunk-EWDN56AS.js +24 -0
  101. package/dist/chunk-EWDN56AS.js.map +1 -0
  102. package/dist/chunk-F5P5P2SC.js +141 -0
  103. package/dist/chunk-F5P5P2SC.js.map +1 -0
  104. package/dist/chunk-FAWPRZTM.js +79 -0
  105. package/dist/chunk-FAWPRZTM.js.map +1 -0
  106. package/dist/chunk-FGYJ2WPX.js +36 -0
  107. package/dist/chunk-FGYJ2WPX.js.map +1 -0
  108. package/dist/chunk-GBG3I5I5.js +46 -0
  109. package/dist/chunk-GBG3I5I5.js.map +1 -0
  110. package/dist/chunk-GDMCDW66.js +19 -0
  111. package/dist/chunk-GDMCDW66.js.map +1 -0
  112. package/dist/chunk-H6HSQCOW.js +80 -0
  113. package/dist/chunk-H6HSQCOW.js.map +1 -0
  114. package/dist/chunk-HDM4RCIF.js +111 -0
  115. package/dist/chunk-HDM4RCIF.js.map +1 -0
  116. package/dist/chunk-HNTOGGVD.js +77 -0
  117. package/dist/chunk-HNTOGGVD.js.map +1 -0
  118. package/dist/chunk-HQW2ABO4.js +28 -0
  119. package/dist/chunk-HQW2ABO4.js.map +1 -0
  120. package/dist/chunk-HRDRGZ2Y.js +76 -0
  121. package/dist/chunk-HRDRGZ2Y.js.map +1 -0
  122. package/dist/chunk-HUOVA7SF.js +83 -0
  123. package/dist/chunk-HUOVA7SF.js.map +1 -0
  124. package/dist/chunk-ITA3SNOR.js +133 -0
  125. package/dist/chunk-ITA3SNOR.js.map +1 -0
  126. package/dist/chunk-IYNUPG2G.js +61 -0
  127. package/dist/chunk-IYNUPG2G.js.map +1 -0
  128. package/dist/chunk-JJ65ZI4P.js +199 -0
  129. package/dist/chunk-JJ65ZI4P.js.map +1 -0
  130. package/dist/chunk-JRBGZ6NI.js +106 -0
  131. package/dist/chunk-JRBGZ6NI.js.map +1 -0
  132. package/dist/chunk-K45OO62F.js +108 -0
  133. package/dist/chunk-K45OO62F.js.map +1 -0
  134. package/dist/chunk-KDTKA667.js +67 -0
  135. package/dist/chunk-KDTKA667.js.map +1 -0
  136. package/dist/chunk-KI7KZBSN.js +142 -0
  137. package/dist/chunk-KI7KZBSN.js.map +1 -0
  138. package/dist/chunk-KOJ7XOPZ.js +87 -0
  139. package/dist/chunk-KOJ7XOPZ.js.map +1 -0
  140. package/dist/chunk-KQTHJ22B.js +82 -0
  141. package/dist/chunk-KQTHJ22B.js.map +1 -0
  142. package/dist/chunk-KRC43RZR.js +77 -0
  143. package/dist/chunk-KRC43RZR.js.map +1 -0
  144. package/dist/chunk-LJQOEGQ2.js +116 -0
  145. package/dist/chunk-LJQOEGQ2.js.map +1 -0
  146. package/dist/chunk-LKRNUSKZ.js +149 -0
  147. package/dist/chunk-LKRNUSKZ.js.map +1 -0
  148. package/dist/chunk-LLL7QQ52.js +76 -0
  149. package/dist/chunk-LLL7QQ52.js.map +1 -0
  150. package/dist/chunk-LQ4B5X4Y.js +56 -0
  151. package/dist/chunk-LQ4B5X4Y.js.map +1 -0
  152. package/dist/chunk-M3FSLEHQ.js +76 -0
  153. package/dist/chunk-M3FSLEHQ.js.map +1 -0
  154. package/dist/chunk-M5G3O6H6.js +57 -0
  155. package/dist/chunk-M5G3O6H6.js.map +1 -0
  156. package/dist/chunk-M6JIC5PU.js +81 -0
  157. package/dist/chunk-M6JIC5PU.js.map +1 -0
  158. package/dist/chunk-N2HJ3SLS.js +186 -0
  159. package/dist/chunk-N2HJ3SLS.js.map +1 -0
  160. package/dist/chunk-NGZWBFTP.js +45 -0
  161. package/dist/chunk-NGZWBFTP.js.map +1 -0
  162. package/dist/chunk-OAKCXT35.js +34 -0
  163. package/dist/chunk-OAKCXT35.js.map +1 -0
  164. package/dist/chunk-OSD3U3HT.js +54 -0
  165. package/dist/chunk-OSD3U3HT.js.map +1 -0
  166. package/dist/chunk-OUXESQ2R.js +42 -0
  167. package/dist/chunk-OUXESQ2R.js.map +1 -0
  168. package/dist/chunk-OY2LJHMJ.js +43 -0
  169. package/dist/chunk-OY2LJHMJ.js.map +1 -0
  170. package/dist/chunk-OYEZR4CN.js +221 -0
  171. package/dist/chunk-OYEZR4CN.js.map +1 -0
  172. package/dist/chunk-P57HUMAE.js +66 -0
  173. package/dist/chunk-P57HUMAE.js.map +1 -0
  174. package/dist/chunk-P6Y2PI6L.js +82 -0
  175. package/dist/chunk-P6Y2PI6L.js.map +1 -0
  176. package/dist/chunk-PA7TDXUQ.js +51 -0
  177. package/dist/chunk-PA7TDXUQ.js.map +1 -0
  178. package/dist/chunk-PPBGGNPV.js +112 -0
  179. package/dist/chunk-PPBGGNPV.js.map +1 -0
  180. package/dist/chunk-PRH4HKND.js +48 -0
  181. package/dist/chunk-PRH4HKND.js.map +1 -0
  182. package/dist/chunk-PSPAZJUQ.js +32 -0
  183. package/dist/chunk-PSPAZJUQ.js.map +1 -0
  184. package/dist/chunk-Q5G5CGZ2.js +170 -0
  185. package/dist/chunk-Q5G5CGZ2.js.map +1 -0
  186. package/dist/chunk-QDAF3LP7.js +89 -0
  187. package/dist/chunk-QDAF3LP7.js.map +1 -0
  188. package/dist/chunk-QGVIGNJ3.js +37 -0
  189. package/dist/chunk-QGVIGNJ3.js.map +1 -0
  190. package/dist/chunk-QNUITYSY.js +68 -0
  191. package/dist/chunk-QNUITYSY.js.map +1 -0
  192. package/dist/chunk-QSWVN3RT.js +116 -0
  193. package/dist/chunk-QSWVN3RT.js.map +1 -0
  194. package/dist/chunk-QTLQZ7OJ.js +110 -0
  195. package/dist/chunk-QTLQZ7OJ.js.map +1 -0
  196. package/dist/chunk-QYAMLIG2.js +84 -0
  197. package/dist/chunk-QYAMLIG2.js.map +1 -0
  198. package/dist/chunk-REILH4XF.js +128 -0
  199. package/dist/chunk-REILH4XF.js.map +1 -0
  200. package/dist/chunk-S6SSK6QX.js +80 -0
  201. package/dist/chunk-S6SSK6QX.js.map +1 -0
  202. package/dist/chunk-SA7ED3PN.js +68 -0
  203. package/dist/chunk-SA7ED3PN.js.map +1 -0
  204. package/dist/chunk-SIJOEM4N.js +55 -0
  205. package/dist/chunk-SIJOEM4N.js.map +1 -0
  206. package/dist/chunk-SLOKAAH2.js +70 -0
  207. package/dist/chunk-SLOKAAH2.js.map +1 -0
  208. package/dist/chunk-TR6NPSMX.js +85 -0
  209. package/dist/chunk-TR6NPSMX.js.map +1 -0
  210. package/dist/chunk-TSZ5DEAT.js +106 -0
  211. package/dist/chunk-TSZ5DEAT.js.map +1 -0
  212. package/dist/chunk-TUNVF45W.js +127 -0
  213. package/dist/chunk-TUNVF45W.js.map +1 -0
  214. package/dist/chunk-TXOBNSQ5.js +63 -0
  215. package/dist/chunk-TXOBNSQ5.js.map +1 -0
  216. package/dist/chunk-U44DRLMM.js +88 -0
  217. package/dist/chunk-U44DRLMM.js.map +1 -0
  218. package/dist/chunk-U4THNRV5.js +114 -0
  219. package/dist/chunk-U4THNRV5.js.map +1 -0
  220. package/dist/chunk-UAZOFC4W.js +72 -0
  221. package/dist/chunk-UAZOFC4W.js.map +1 -0
  222. package/dist/chunk-UGKI466V.js +12 -0
  223. package/dist/chunk-UGKI466V.js.map +1 -0
  224. package/dist/chunk-VM4RMQQN.js +11 -0
  225. package/dist/chunk-VM4RMQQN.js.map +1 -0
  226. package/dist/chunk-VQ37VLAS.js +54 -0
  227. package/dist/chunk-VQ37VLAS.js.map +1 -0
  228. package/dist/chunk-VT7VSYH5.js +73 -0
  229. package/dist/chunk-VT7VSYH5.js.map +1 -0
  230. package/dist/chunk-VTIRUCLZ.js +57 -0
  231. package/dist/chunk-VTIRUCLZ.js.map +1 -0
  232. package/dist/chunk-VVBAEYKI.js +202 -0
  233. package/dist/chunk-VVBAEYKI.js.map +1 -0
  234. package/dist/chunk-WHFIQUCC.js +120 -0
  235. package/dist/chunk-WHFIQUCC.js.map +1 -0
  236. package/dist/chunk-WPSESV5Z.js +74 -0
  237. package/dist/chunk-WPSESV5Z.js.map +1 -0
  238. package/dist/chunk-WXEXCHEN.js +51 -0
  239. package/dist/chunk-WXEXCHEN.js.map +1 -0
  240. package/dist/chunk-X2DDPD3D.js +113 -0
  241. package/dist/chunk-X2DDPD3D.js.map +1 -0
  242. package/dist/chunk-X7VIMKLD.js +127 -0
  243. package/dist/chunk-X7VIMKLD.js.map +1 -0
  244. package/dist/chunk-XJ3EG6XY.js +30 -0
  245. package/dist/chunk-XJ3EG6XY.js.map +1 -0
  246. package/dist/chunk-XOT5HWSF.js +23 -0
  247. package/dist/chunk-XOT5HWSF.js.map +1 -0
  248. package/dist/chunk-Y72IP43U.js +117 -0
  249. package/dist/chunk-Y72IP43U.js.map +1 -0
  250. package/dist/chunk-YD6FLXBV.js +61 -0
  251. package/dist/chunk-YD6FLXBV.js.map +1 -0
  252. package/dist/chunk-YEQQGYYO.js +1022 -0
  253. package/dist/chunk-YEQQGYYO.js.map +1 -0
  254. package/dist/chunk-YYW6AEIT.js +46 -0
  255. package/dist/chunk-YYW6AEIT.js.map +1 -0
  256. package/dist/chunk-ZEVGXKRU.js +104 -0
  257. package/dist/chunk-ZEVGXKRU.js.map +1 -0
  258. package/dist/chunk-ZKSMMLDP.js +74 -0
  259. package/dist/chunk-ZKSMMLDP.js.map +1 -0
  260. package/dist/chunk-ZU6IM6PK.js +101 -0
  261. package/dist/chunk-ZU6IM6PK.js.map +1 -0
  262. package/dist/chunk-ZUS5KZGO.js +714 -0
  263. package/dist/chunk-ZUS5KZGO.js.map +1 -0
  264. package/dist/chunk-ZVS2GOT2.js +58 -0
  265. package/dist/chunk-ZVS2GOT2.js.map +1 -0
  266. package/dist/chunk-ZXPDS6DH.js +3 -0
  267. package/dist/chunk-ZXPDS6DH.js.map +1 -0
  268. package/dist/chunk-ZZQQJX5Z.js +173 -0
  269. package/dist/chunk-ZZQQJX5Z.js.map +1 -0
  270. package/dist/components.css +2 -0
  271. package/dist/composites/account-menu/index.js +6 -0
  272. package/dist/composites/account-menu/index.js.map +1 -0
  273. package/dist/composites/agent-composer/index.js +7 -0
  274. package/dist/composites/agent-composer/index.js.map +1 -0
  275. package/dist/composites/agent-editor/index.js +10 -0
  276. package/dist/composites/agent-editor/index.js.map +1 -0
  277. package/dist/composites/agent-stream/index.js +12 -0
  278. package/dist/composites/agent-stream/index.js.map +1 -0
  279. package/dist/composites/agent-timeline/index.js +5 -0
  280. package/dist/composites/agent-timeline/index.js.map +1 -0
  281. package/dist/composites/approval-card/index.js +5 -0
  282. package/dist/composites/approval-card/index.js.map +1 -0
  283. package/dist/composites/chat-composer/index.js +6 -0
  284. package/dist/composites/chat-composer/index.js.map +1 -0
  285. package/dist/composites/chat-message/index.js +6 -0
  286. package/dist/composites/chat-message/index.js.map +1 -0
  287. package/dist/composites/code-block/index.js +5 -0
  288. package/dist/composites/code-block/index.js.map +1 -0
  289. package/dist/composites/command-palette/index.js +5 -0
  290. package/dist/composites/command-palette/index.js.map +1 -0
  291. package/dist/composites/confirm-dialog/index.js +7 -0
  292. package/dist/composites/confirm-dialog/index.js.map +1 -0
  293. package/dist/composites/cron-jobs-list/index.js +5 -0
  294. package/dist/composites/cron-jobs-list/index.js.map +1 -0
  295. package/dist/composites/data-table/index.js +10 -0
  296. package/dist/composites/data-table/index.js.map +1 -0
  297. package/dist/composites/deployment-row/index.js +5 -0
  298. package/dist/composites/deployment-row/index.js.map +1 -0
  299. package/dist/composites/domain-config/index.js +7 -0
  300. package/dist/composites/domain-config/index.js.map +1 -0
  301. package/dist/composites/env-var-editor/index.js +7 -0
  302. package/dist/composites/env-var-editor/index.js.map +1 -0
  303. package/dist/composites/mcp-server-list/index.js +5 -0
  304. package/dist/composites/mcp-server-list/index.js.map +1 -0
  305. package/dist/composites/page-shell/index.js +7 -0
  306. package/dist/composites/page-shell/index.js.map +1 -0
  307. package/dist/composites/permission-modal/index.js +6 -0
  308. package/dist/composites/permission-modal/index.js.map +1 -0
  309. package/dist/composites/preview-env-card/index.js +6 -0
  310. package/dist/composites/preview-env-card/index.js.map +1 -0
  311. package/dist/composites/preview-panel/index.js +5 -0
  312. package/dist/composites/preview-panel/index.js.map +1 -0
  313. package/dist/composites/project-card/index.js +6 -0
  314. package/dist/composites/project-card/index.js.map +1 -0
  315. package/dist/composites/rollback-ui/index.js +6 -0
  316. package/dist/composites/rollback-ui/index.js.map +1 -0
  317. package/dist/composites/rule-editor/index.js +11 -0
  318. package/dist/composites/rule-editor/index.js.map +1 -0
  319. package/dist/composites/skill-editor/index.js +11 -0
  320. package/dist/composites/skill-editor/index.js.map +1 -0
  321. package/dist/composites/skills-list/index.js +5 -0
  322. package/dist/composites/skills-list/index.js.map +1 -0
  323. package/dist/composites/stability-bundle-viewer/index.js +4 -0
  324. package/dist/composites/stability-bundle-viewer/index.js.map +1 -0
  325. package/dist/composites/task-header/index.js +5 -0
  326. package/dist/composites/task-header/index.js.map +1 -0
  327. package/dist/composites/usage-meter/index.js +5 -0
  328. package/dist/composites/usage-meter/index.js.map +1 -0
  329. package/dist/fonts/LICENSE-GEIST.txt +92 -0
  330. package/dist/fonts/geist-400.woff2 +0 -0
  331. package/dist/fonts/geist-500.woff2 +0 -0
  332. package/dist/fonts/geist-600.woff2 +0 -0
  333. package/dist/fonts/geist-mono-400.woff2 +0 -0
  334. package/dist/fonts/geist-mono-500.woff2 +0 -0
  335. package/dist/fonts/geist-mono-600.woff2 +0 -0
  336. package/dist/fonts-cdn.css +28 -0
  337. package/dist/fonts.css +75 -0
  338. package/dist/index.d.ts +4621 -0
  339. package/dist/index.js +1338 -0
  340. package/dist/index.js.map +1 -0
  341. package/dist/plugin-D5xmXqYb.d.ts +172 -0
  342. package/dist/preset-v3-legacy.d.ts +35 -0
  343. package/dist/preset-v3-legacy.js +159 -0
  344. package/dist/preset-v3-legacy.js.map +1 -0
  345. package/dist/preset.css +27 -0
  346. package/dist/primitives/action-bar/index.js +4 -0
  347. package/dist/primitives/action-bar/index.js.map +1 -0
  348. package/dist/primitives/agent-error-card/index.js +5 -0
  349. package/dist/primitives/agent-error-card/index.js.map +1 -0
  350. package/dist/primitives/agent-event/index.js +4 -0
  351. package/dist/primitives/agent-event/index.js.map +1 -0
  352. package/dist/primitives/agent-handoff/index.js +4 -0
  353. package/dist/primitives/agent-handoff/index.js.map +1 -0
  354. package/dist/primitives/agent-profile/index.js +4 -0
  355. package/dist/primitives/agent-profile/index.js.map +1 -0
  356. package/dist/primitives/agent-starting-state/index.js +5 -0
  357. package/dist/primitives/agent-starting-state/index.js.map +1 -0
  358. package/dist/primitives/agent-streaming/index.js +5 -0
  359. package/dist/primitives/agent-streaming/index.js.map +1 -0
  360. package/dist/primitives/alert/index.js +4 -0
  361. package/dist/primitives/alert/index.js.map +1 -0
  362. package/dist/primitives/artifact-preview/index.js +4 -0
  363. package/dist/primitives/artifact-preview/index.js.map +1 -0
  364. package/dist/primitives/attachment-chip/index.js +4 -0
  365. package/dist/primitives/attachment-chip/index.js.map +1 -0
  366. package/dist/primitives/audit-log-entry/index.js +4 -0
  367. package/dist/primitives/audit-log-entry/index.js.map +1 -0
  368. package/dist/primitives/auto-compact-notice/index.js +5 -0
  369. package/dist/primitives/auto-compact-notice/index.js.map +1 -0
  370. package/dist/primitives/avatar/index.js +4 -0
  371. package/dist/primitives/avatar/index.js.map +1 -0
  372. package/dist/primitives/badge/index.js +4 -0
  373. package/dist/primitives/badge/index.js.map +1 -0
  374. package/dist/primitives/branch-indicator/index.js +4 -0
  375. package/dist/primitives/branch-indicator/index.js.map +1 -0
  376. package/dist/primitives/browser-controls/index.js +4 -0
  377. package/dist/primitives/browser-controls/index.js.map +1 -0
  378. package/dist/primitives/build-log-stream/index.js +5 -0
  379. package/dist/primitives/build-log-stream/index.js.map +1 -0
  380. package/dist/primitives/button/index.js +4 -0
  381. package/dist/primitives/button/index.js.map +1 -0
  382. package/dist/primitives/capability-indicator/index.js +4 -0
  383. package/dist/primitives/capability-indicator/index.js.map +1 -0
  384. package/dist/primitives/card/index.js +4 -0
  385. package/dist/primitives/card/index.js.map +1 -0
  386. package/dist/primitives/channel-card/index.js +4 -0
  387. package/dist/primitives/channel-card/index.js.map +1 -0
  388. package/dist/primitives/chat-thread/index.js +5 -0
  389. package/dist/primitives/chat-thread/index.js.map +1 -0
  390. package/dist/primitives/checkbox/index.js +4 -0
  391. package/dist/primitives/checkbox/index.js.map +1 -0
  392. package/dist/primitives/context-card/index.js +4 -0
  393. package/dist/primitives/context-card/index.js.map +1 -0
  394. package/dist/primitives/context-window-bar/index.js +4 -0
  395. package/dist/primitives/context-window-bar/index.js.map +1 -0
  396. package/dist/primitives/copy-button/index.js +4 -0
  397. package/dist/primitives/copy-button/index.js.map +1 -0
  398. package/dist/primitives/cost-meter/index.js +4 -0
  399. package/dist/primitives/cost-meter/index.js.map +1 -0
  400. package/dist/primitives/created-files-card/index.js +4 -0
  401. package/dist/primitives/created-files-card/index.js.map +1 -0
  402. package/dist/primitives/cron-job-card/index.js +4 -0
  403. package/dist/primitives/cron-job-card/index.js.map +1 -0
  404. package/dist/primitives/danger-zone/index.js +4 -0
  405. package/dist/primitives/danger-zone/index.js.map +1 -0
  406. package/dist/primitives/dialog/index.js +4 -0
  407. package/dist/primitives/dialog/index.js.map +1 -0
  408. package/dist/primitives/diff-viewer/index.js +4 -0
  409. package/dist/primitives/diff-viewer/index.js.map +1 -0
  410. package/dist/primitives/dropdown-menu/index.js +4 -0
  411. package/dist/primitives/dropdown-menu/index.js.map +1 -0
  412. package/dist/primitives/empty-state/index.js +4 -0
  413. package/dist/primitives/empty-state/index.js.map +1 -0
  414. package/dist/primitives/export-chat-dialog/index.js +4 -0
  415. package/dist/primitives/export-chat-dialog/index.js.map +1 -0
  416. package/dist/primitives/folder-context-card/index.js +4 -0
  417. package/dist/primitives/folder-context-card/index.js.map +1 -0
  418. package/dist/primitives/folder-selector/index.js +4 -0
  419. package/dist/primitives/folder-selector/index.js.map +1 -0
  420. package/dist/primitives/form-field/index.js +4 -0
  421. package/dist/primitives/form-field/index.js.map +1 -0
  422. package/dist/primitives/gateway-status-indicator/index.js +4 -0
  423. package/dist/primitives/gateway-status-indicator/index.js.map +1 -0
  424. package/dist/primitives/hook-config/index.js +4 -0
  425. package/dist/primitives/hook-config/index.js.map +1 -0
  426. package/dist/primitives/hook-event-log/index.js +4 -0
  427. package/dist/primitives/hook-event-log/index.js.map +1 -0
  428. package/dist/primitives/input/index.js +4 -0
  429. package/dist/primitives/input/index.js.map +1 -0
  430. package/dist/primitives/intent-selector/index.js +4 -0
  431. package/dist/primitives/intent-selector/index.js.map +1 -0
  432. package/dist/primitives/label/index.js +4 -0
  433. package/dist/primitives/label/index.js.map +1 -0
  434. package/dist/primitives/lane-board/index.js +4 -0
  435. package/dist/primitives/lane-board/index.js.map +1 -0
  436. package/dist/primitives/login-split/index.js +4 -0
  437. package/dist/primitives/login-split/index.js.map +1 -0
  438. package/dist/primitives/mcp-server-card/index.js +4 -0
  439. package/dist/primitives/mcp-server-card/index.js.map +1 -0
  440. package/dist/primitives/memory-editor/index.js +4 -0
  441. package/dist/primitives/memory-editor/index.js.map +1 -0
  442. package/dist/primitives/mention-menu/index.js +4 -0
  443. package/dist/primitives/mention-menu/index.js.map +1 -0
  444. package/dist/primitives/metrics-panel/index.js +4 -0
  445. package/dist/primitives/metrics-panel/index.js.map +1 -0
  446. package/dist/primitives/model-card/index.js +4 -0
  447. package/dist/primitives/model-card/index.js.map +1 -0
  448. package/dist/primitives/model-selector/index.js +4 -0
  449. package/dist/primitives/model-selector/index.js.map +1 -0
  450. package/dist/primitives/pagination/index.js +4 -0
  451. package/dist/primitives/pagination/index.js.map +1 -0
  452. package/dist/primitives/permission-matrix/index.js +4 -0
  453. package/dist/primitives/permission-matrix/index.js.map +1 -0
  454. package/dist/primitives/pin-input/index.js +4 -0
  455. package/dist/primitives/pin-input/index.js.map +1 -0
  456. package/dist/primitives/plan-badge/index.js +4 -0
  457. package/dist/primitives/plan-badge/index.js.map +1 -0
  458. package/dist/primitives/progress/index.js +4 -0
  459. package/dist/primitives/progress/index.js.map +1 -0
  460. package/dist/primitives/progress-checklist/index.js +4 -0
  461. package/dist/primitives/progress-checklist/index.js.map +1 -0
  462. package/dist/primitives/project-switcher/index.js +4 -0
  463. package/dist/primitives/project-switcher/index.js.map +1 -0
  464. package/dist/primitives/quick-action-chips/index.js +4 -0
  465. package/dist/primitives/quick-action-chips/index.js.map +1 -0
  466. package/dist/primitives/radio-group/index.js +4 -0
  467. package/dist/primitives/radio-group/index.js.map +1 -0
  468. package/dist/primitives/recent-folders-list/index.js +4 -0
  469. package/dist/primitives/recent-folders-list/index.js.map +1 -0
  470. package/dist/primitives/rule-card/index.js +4 -0
  471. package/dist/primitives/rule-card/index.js.map +1 -0
  472. package/dist/primitives/run-stats/index.js +4 -0
  473. package/dist/primitives/run-stats/index.js.map +1 -0
  474. package/dist/primitives/run-status-pill/index.js +4 -0
  475. package/dist/primitives/run-status-pill/index.js.map +1 -0
  476. package/dist/primitives/running-tasks-panel/index.js +4 -0
  477. package/dist/primitives/running-tasks-panel/index.js.map +1 -0
  478. package/dist/primitives/scroll-area/index.js +4 -0
  479. package/dist/primitives/scroll-area/index.js.map +1 -0
  480. package/dist/primitives/select/index.js +4 -0
  481. package/dist/primitives/select/index.js.map +1 -0
  482. package/dist/primitives/session-list-item/index.js +4 -0
  483. package/dist/primitives/session-list-item/index.js.map +1 -0
  484. package/dist/primitives/session-timeline/index.js +4 -0
  485. package/dist/primitives/session-timeline/index.js.map +1 -0
  486. package/dist/primitives/sheet/index.js +4 -0
  487. package/dist/primitives/sheet/index.js.map +1 -0
  488. package/dist/primitives/sidebar/index.js +4 -0
  489. package/dist/primitives/sidebar/index.js.map +1 -0
  490. package/dist/primitives/skeleton/index.js +5 -0
  491. package/dist/primitives/skeleton/index.js.map +1 -0
  492. package/dist/primitives/skill-card/index.js +4 -0
  493. package/dist/primitives/skill-card/index.js.map +1 -0
  494. package/dist/primitives/social-auth-row/index.js +4 -0
  495. package/dist/primitives/social-auth-row/index.js.map +1 -0
  496. package/dist/primitives/stat-tile/index.js +4 -0
  497. package/dist/primitives/stat-tile/index.js.map +1 -0
  498. package/dist/primitives/status-dot/index.js +4 -0
  499. package/dist/primitives/status-dot/index.js.map +1 -0
  500. package/dist/primitives/steps-rail/index.js +4 -0
  501. package/dist/primitives/steps-rail/index.js.map +1 -0
  502. package/dist/primitives/sub-agent-dispatch/index.js +4 -0
  503. package/dist/primitives/sub-agent-dispatch/index.js.map +1 -0
  504. package/dist/primitives/switch/index.js +4 -0
  505. package/dist/primitives/switch/index.js.map +1 -0
  506. package/dist/primitives/system-prompt-editor/index.js +4 -0
  507. package/dist/primitives/system-prompt-editor/index.js.map +1 -0
  508. package/dist/primitives/table/index.js +4 -0
  509. package/dist/primitives/table/index.js.map +1 -0
  510. package/dist/primitives/tabs/index.js +4 -0
  511. package/dist/primitives/tabs/index.js.map +1 -0
  512. package/dist/primitives/task-plan/index.js +4 -0
  513. package/dist/primitives/task-plan/index.js.map +1 -0
  514. package/dist/primitives/terminal-panel/index.js +5 -0
  515. package/dist/primitives/terminal-panel/index.js.map +1 -0
  516. package/dist/primitives/textarea/index.js +4 -0
  517. package/dist/primitives/textarea/index.js.map +1 -0
  518. package/dist/primitives/thinking-level-selector/index.js +4 -0
  519. package/dist/primitives/thinking-level-selector/index.js.map +1 -0
  520. package/dist/primitives/timestamp/index.js +4 -0
  521. package/dist/primitives/timestamp/index.js.map +1 -0
  522. package/dist/primitives/toast/index.js +4 -0
  523. package/dist/primitives/toast/index.js.map +1 -0
  524. package/dist/primitives/token-usage-chart/index.js +4 -0
  525. package/dist/primitives/token-usage-chart/index.js.map +1 -0
  526. package/dist/primitives/tool-call/index.js +4 -0
  527. package/dist/primitives/tool-call/index.js.map +1 -0
  528. package/dist/primitives/tool-call-card/index.js +4 -0
  529. package/dist/primitives/tool-call-card/index.js.map +1 -0
  530. package/dist/primitives/tool-result/index.js +4 -0
  531. package/dist/primitives/tool-result/index.js.map +1 -0
  532. package/dist/primitives/tools-list/index.js +4 -0
  533. package/dist/primitives/tools-list/index.js.map +1 -0
  534. package/dist/primitives/tooltip/index.js +4 -0
  535. package/dist/primitives/tooltip/index.js.map +1 -0
  536. package/dist/primitives/topnav/index.js +4 -0
  537. package/dist/primitives/topnav/index.js.map +1 -0
  538. package/dist/primitives/update-banner/index.js +4 -0
  539. package/dist/primitives/update-banner/index.js.map +1 -0
  540. package/dist/slide/index.d.ts +212 -0
  541. package/dist/slide/index.js +3 -0
  542. package/dist/slide/index.js.map +1 -0
  543. package/dist/slide/plugins/emoji/index.d.ts +29 -0
  544. package/dist/slide/plugins/emoji/index.js +157 -0
  545. package/dist/slide/plugins/emoji/index.js.map +1 -0
  546. package/dist/slide/plugins/math/index.d.ts +13 -0
  547. package/dist/slide/plugins/math/index.js +145 -0
  548. package/dist/slide/plugins/math/index.js.map +1 -0
  549. package/dist/slide/plugins/mermaid/index.d.ts +55 -0
  550. package/dist/slide/plugins/mermaid/index.js +218 -0
  551. package/dist/slide/plugins/mermaid/index.js.map +1 -0
  552. package/dist/slide/plugins/shiki/index.d.ts +18 -0
  553. package/dist/slide/plugins/shiki/index.js +87 -0
  554. package/dist/slide/plugins/shiki/index.js.map +1 -0
  555. package/dist/slide/themes/default.css +256 -0
  556. package/dist/slide/themes/layouts.css +143 -0
  557. package/dist/slide/themes/violet-forge.css +256 -0
  558. package/dist/slide-deck/index.css +52 -0
  559. package/dist/slide-deck/index.css.map +1 -0
  560. package/dist/slide-deck/index.d.ts +377 -0
  561. package/dist/slide-deck/index.js +1111 -0
  562. package/dist/slide-deck/index.js.map +1 -0
  563. package/dist/styles-v3-legacy.css +88 -0
  564. package/dist/styles.css +137 -0
  565. package/dist/tokens-v4.css +187 -0
  566. package/dist/tokens.css +230 -0
  567. package/dist/vite-plugin.d.ts +29 -0
  568. package/dist/vite-plugin.js +76 -0
  569. package/dist/vite-plugin.js.map +1 -0
  570. package/dist/whiteboard/index.d.ts +258 -0
  571. package/dist/whiteboard/index.js +738 -0
  572. package/dist/whiteboard/index.js.map +1 -0
  573. package/llms.txt +273 -0
  574. package/package.json +800 -0
  575. package/registry/index.json +856 -0
  576. package/registry/r/account-menu.json +24 -0
  577. package/registry/r/action-bar.json +22 -0
  578. package/registry/r/agent-composer.json +22 -0
  579. package/registry/r/agent-editor.json +27 -0
  580. package/registry/r/agent-error-card.json +22 -0
  581. package/registry/r/agent-event.json +24 -0
  582. package/registry/r/agent-handoff.json +22 -0
  583. package/registry/r/agent-profile.json +23 -0
  584. package/registry/r/agent-starting-state.json +22 -0
  585. package/registry/r/agent-stream.json +27 -0
  586. package/registry/r/agent-streaming.json +22 -0
  587. package/registry/r/agent-timeline.json +22 -0
  588. package/registry/r/agent-types.json +15 -0
  589. package/registry/r/alert.json +22 -0
  590. package/registry/r/approval-card.json +25 -0
  591. package/registry/r/artifact-preview.json +22 -0
  592. package/registry/r/attachment-chip.json +24 -0
  593. package/registry/r/audit-log-entry.json +23 -0
  594. package/registry/r/auto-compact-notice.json +22 -0
  595. package/registry/r/avatar.json +23 -0
  596. package/registry/r/badge.json +22 -0
  597. package/registry/r/browser-controls.json +22 -0
  598. package/registry/r/build-log-stream.json +19 -0
  599. package/registry/r/button.json +23 -0
  600. package/registry/r/capability-indicator.json +23 -0
  601. package/registry/r/card.json +22 -0
  602. package/registry/r/chat-composer.json +23 -0
  603. package/registry/r/chat-message.json +129 -0
  604. package/registry/r/chat-thread.json +20 -0
  605. package/registry/r/chat-types.json +15 -0
  606. package/registry/r/checkbox.json +24 -0
  607. package/registry/r/cn.json +19 -0
  608. package/registry/r/code-block.json +21 -0
  609. package/registry/r/command-palette.json +25 -0
  610. package/registry/r/confirm-dialog.json +25 -0
  611. package/registry/r/context-card.json +23 -0
  612. package/registry/r/context-window-bar.json +20 -0
  613. package/registry/r/copy-button.json +22 -0
  614. package/registry/r/cost-meter.json +22 -0
  615. package/registry/r/created-files-card.json +23 -0
  616. package/registry/r/cron-job-card.json +22 -0
  617. package/registry/r/cron-jobs-list.json +23 -0
  618. package/registry/r/danger-zone.json +20 -0
  619. package/registry/r/data-table.json +27 -0
  620. package/registry/r/deployment-row.json +23 -0
  621. package/registry/r/dialog.json +23 -0
  622. package/registry/r/diff-viewer.json +20 -0
  623. package/registry/r/domain-config.json +25 -0
  624. package/registry/r/dropdown-menu.json +23 -0
  625. package/registry/r/empty-state.json +20 -0
  626. package/registry/r/env-var-editor.json +25 -0
  627. package/registry/r/folder-context-card.json +23 -0
  628. package/registry/r/folder-selector.json +22 -0
  629. package/registry/r/form-field.json +23 -0
  630. package/registry/r/hook-config.json +22 -0
  631. package/registry/r/hook-event-log.json +22 -0
  632. package/registry/r/input.json +22 -0
  633. package/registry/r/intent-selector.json +24 -0
  634. package/registry/r/label.json +22 -0
  635. package/registry/r/lane-board.json +20 -0
  636. package/registry/r/live-region-context.json +16 -0
  637. package/registry/r/login-split.json +20 -0
  638. package/registry/r/mcp-server-card.json +22 -0
  639. package/registry/r/mcp-server-list.json +23 -0
  640. package/registry/r/memory-editor.json +23 -0
  641. package/registry/r/mention-menu.json +23 -0
  642. package/registry/r/metrics-panel.json +22 -0
  643. package/registry/r/mode-types.json +15 -0
  644. package/registry/r/model-card.json +23 -0
  645. package/registry/r/model-selector.json +23 -0
  646. package/registry/r/page-shell.json +25 -0
  647. package/registry/r/pagination.json +22 -0
  648. package/registry/r/permission-matrix.json +22 -0
  649. package/registry/r/permission-modal.json +24 -0
  650. package/registry/r/permission-types.json +15 -0
  651. package/registry/r/pin-input.json +20 -0
  652. package/registry/r/plan-badge.json +20 -0
  653. package/registry/r/preview-env-card.json +25 -0
  654. package/registry/r/preview-panel.json +21 -0
  655. package/registry/r/progress-checklist.json +23 -0
  656. package/registry/r/progress.json +20 -0
  657. package/registry/r/project-card.json +25 -0
  658. package/registry/r/project-switcher.json +22 -0
  659. package/registry/r/quick-action-chips.json +21 -0
  660. package/registry/r/radio-group.json +23 -0
  661. package/registry/r/recent-folders-list.json +22 -0
  662. package/registry/r/rollback-ui.json +24 -0
  663. package/registry/r/rule-card.json +23 -0
  664. package/registry/r/rule-editor.json +28 -0
  665. package/registry/r/rule-types.json +18 -0
  666. package/registry/r/run-stats.json +22 -0
  667. package/registry/r/running-tasks-panel.json +22 -0
  668. package/registry/r/safe-href.json +16 -0
  669. package/registry/r/scroll-area.json +22 -0
  670. package/registry/r/select.json +24 -0
  671. package/registry/r/session-list-item.json +20 -0
  672. package/registry/r/session-timeline.json +22 -0
  673. package/registry/r/sheet.json +24 -0
  674. package/registry/r/sidebar.json +19 -0
  675. package/registry/r/skeleton.json +19 -0
  676. package/registry/r/skill-card.json +24 -0
  677. package/registry/r/skill-editor.json +28 -0
  678. package/registry/r/skills-list.json +23 -0
  679. package/registry/r/slide-deck.json +130 -0
  680. package/registry/r/slide-plugin-emoji.json +28 -0
  681. package/registry/r/slide-plugin-math.json +24 -0
  682. package/registry/r/slide-plugin-mermaid.json +23 -0
  683. package/registry/r/slide-plugin-shiki.json +23 -0
  684. package/registry/r/slide.json +123 -0
  685. package/registry/r/social-auth-row.json +21 -0
  686. package/registry/r/stat-tile.json +22 -0
  687. package/registry/r/status-dot.json +20 -0
  688. package/registry/r/steps-rail.json +20 -0
  689. package/registry/r/sub-agent-dispatch.json +22 -0
  690. package/registry/r/switch.json +23 -0
  691. package/registry/r/system-prompt-editor.json +22 -0
  692. package/registry/r/table.json +22 -0
  693. package/registry/r/tabs.json +22 -0
  694. package/registry/r/tailwind-preset.json +19 -0
  695. package/registry/r/task-header.json +24 -0
  696. package/registry/r/task-plan.json +22 -0
  697. package/registry/r/task-types.json +15 -0
  698. package/registry/r/terminal-panel.json +22 -0
  699. package/registry/r/textarea.json +22 -0
  700. package/registry/r/theme-provider.json +59 -0
  701. package/registry/r/theme-script.json +18 -0
  702. package/registry/r/theo-ui-provider.json +20 -0
  703. package/registry/r/timestamp.json +20 -0
  704. package/registry/r/toast.json +30 -0
  705. package/registry/r/token-usage-chart.json +20 -0
  706. package/registry/r/tokens.json +21 -0
  707. package/registry/r/tool-call-card.json +23 -0
  708. package/registry/r/tool-call.json +22 -0
  709. package/registry/r/tool-result.json +20 -0
  710. package/registry/r/tools-list.json +23 -0
  711. package/registry/r/tooltip.json +22 -0
  712. package/registry/r/topnav.json +22 -0
  713. package/registry/r/types.json +15 -0
  714. package/registry/r/usage-meter.json +21 -0
  715. package/registry/r/whiteboard.json +101 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/slide/alerts.ts","../src/components/primitives/slide/marpit-bg.ts","../src/components/primitives/slide/plugin.ts","../src/components/primitives/slide/sanitize.ts","../src/components/primitives/slide/schema.ts","../src/components/primitives/slide/frontmatter.ts","../src/components/primitives/slide/validate.ts","../src/components/primitives/slide/parse.ts","../src/components/primitives/slide/use-slide-fit.ts","../src/components/primitives/slide/slide.tsx","../src/components/primitives/slide/themes/index.ts","../src/components/primitives/slide/json-schema.ts"],"names":["jsx","jsxs","useState","useEffect","z"],"mappings":"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","file":"chunk-ZUS5KZGO.js","sourcesContent":["/**\n * GFM alerts post-processor — converts `> [!NOTE]` blockquotes into\n * `<aside class=\"theo-slide-alert\" data-theo-slide-alert-type=\"...\">` (ADR D3 of\n * the slide-rich-content plan).\n *\n * GitHub Flavored Markdown introduced this convention in 2023 for callouts.\n * `remark-gfm` (already in our dep tree) parses the blockquote but does NOT\n * distinguish alerts from regular blockquotes. We post-process the mdast tree\n * to detect the canonical marker and annotate with `hName` + `hProperties` so\n * `mdast-util-to-hast` emits the desired hast element.\n *\n * Five tag families are supported, mirroring GitHub:\n * - NOTE (info / blue)\n * - TIP (success / green)\n * - IMPORTANT (purple)\n * - WARNING (yellow)\n * - CAUTION (red)\n *\n * Case-insensitive. Marker is stripped from the rendered text. Regular\n * blockquotes (without `[!TYPE]` prefix) are left untouched.\n */\nimport type { Blockquote, Paragraph, Root, Text } from \"mdast\";\n\n/** Canonical alert types — used by CSS via `data-theo-slide-alert-type=\"...\"`. */\nexport const ALERT_TYPES = [\"note\", \"tip\", \"important\", \"warning\", \"caution\"] as const;\nexport type AlertType = (typeof ALERT_TYPES)[number];\n\nconst ALERT_RE = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\][ \\t]*(?:\\r?\\n|$)/i;\n\n/**\n * Walk a mdast tree and mutate any blockquote that opens with `[!TYPE]` into\n * an `<aside>` annotation. Mutation is in-place to keep the pipeline allocation\n * profile flat; the same tree is returned for chainability.\n */\nexport function detectAlerts(tree: Root): Root {\n for (const node of tree.children) {\n if (node.type !== \"blockquote\") continue;\n transformIfAlert(node);\n }\n return tree;\n}\n\nfunction transformIfAlert(node: Blockquote): void {\n const firstChild = node.children[0];\n if (!firstChild || firstChild.type !== \"paragraph\") return;\n const paragraph = firstChild as Paragraph;\n const firstInline = paragraph.children[0];\n if (!firstInline || firstInline.type !== \"text\") return;\n const text = firstInline as Text;\n const match = ALERT_RE.exec(text.value);\n if (!match) return;\n\n const matched = match[1];\n if (!matched) return;\n const type = matched.toLowerCase() as AlertType;\n\n // Strip the marker from the rendered text.\n text.value = text.value.replace(ALERT_RE, \"\");\n // If the first inline became empty, drop it so the paragraph doesn't render\n // an empty leading line.\n if (text.value === \"\" && paragraph.children.length > 1) {\n paragraph.children.shift();\n }\n // Annotate so mdast-util-to-hast emits <aside> with the data attribute.\n node.data = {\n ...node.data,\n hName: \"aside\",\n hProperties: {\n ...((node.data as { hProperties?: Record<string, unknown> })?.hProperties ?? {}),\n className: [\"theo-slide-alert\"],\n \"data-theo-slide-alert-type\": type,\n },\n };\n}\n","/**\n * Marpit-style `![bg](url)` background syntax detector.\n *\n * Marpit popularised the convention of declaring a slide background via a\n * standalone image whose alt-text starts with `bg`:\n *\n * ![bg](https://example.com/photo.jpg)\n * ![bg cover](url) ![bg fit](url) ![bg left](url) ![bg right](url)\n *\n * LLMs trained on Marp output emit this naturally, so the slide primitive\n * adopts the same surface — but in a STRICTLY safe way:\n *\n * 1. Only triggers when the paragraph contains a SINGLE image (avoids\n * collisions with inline images mixed with text).\n * 2. First-bg-wins (multiple `![bg]` directives in one slide → only the first\n * is honoured; the others are also dropped from the tree to prevent\n * duplicate rendering).\n * 3. The extracted result goes into `ParsedSlide.extractedBackground` (D18 /\n * EC-5) and the Slide component prefers an explicit `frontmatter.backgroundImage`\n * over the Marpit extraction.\n * 4. URL sanitization happens at the caller (`parseSlide`) via `sanitizeBgUrl`.\n */\nimport type { Image, Paragraph, Root } from \"mdast\";\n\nconst BG_ALT_RE = /^bg(?:\\s+(\\w+))?/i;\n\nconst VALID_MODIFIERS = new Set([\"cover\", \"fit\", \"left\", \"right\"]);\n\nexport interface ExtractedMarpitBackground {\n url: string;\n modifier?: \"cover\" | \"fit\" | \"left\" | \"right\";\n}\n\n/**\n * Walk the mdast tree, extract the first `![bg](url)` directive, drop ALL\n * matching paragraphs from the tree. Returns a new tree (children array\n * is filtered; node identities are preserved otherwise).\n */\nexport function extractMarpitBackgrounds(tree: Root): {\n tree: Root;\n background?: ExtractedMarpitBackground;\n} {\n let background: ExtractedMarpitBackground | undefined;\n const filteredChildren = tree.children.filter((node) => {\n if (node.type !== \"paragraph\") return true;\n const p = node as Paragraph;\n // Single-child guard: paragraphs with mixed content (text + image) are\n // kept as-is — only \"image-only\" paragraphs are candidates.\n if (p.children.length !== 1) return true;\n const child = p.children[0];\n if (!child || child.type !== \"image\") return true;\n const img = child as Image;\n const match = BG_ALT_RE.exec(img.alt ?? \"\");\n if (!match) return true;\n // Capture once; drop subsequent bg paragraphs to avoid duplicate output.\n if (!background) {\n const modifierRaw = match[1]?.toLowerCase();\n const modifier =\n modifierRaw && VALID_MODIFIERS.has(modifierRaw)\n ? (modifierRaw as \"cover\" | \"fit\" | \"left\" | \"right\")\n : undefined;\n background = {\n url: img.url,\n modifier,\n };\n }\n return false; // drop this paragraph from the tree\n });\n return {\n tree: { ...tree, children: filteredChildren },\n background,\n };\n}\n","/**\n * Slide plugin contract — extension points for rich-content engines.\n *\n * Plugins are composable transformers applied during `parseSlide`. Each plugin\n * may inspect/mutate the mdast tree (before HTML conversion), the hast tree\n * (after HTML conversion, before sanitize), and override React component\n * renderers (after sanitize). They may also declare sanitize-schema extensions\n * so custom tags (e.g. Shiki spans, KaTeX MathML, Mermaid SVG) survive the\n * security barrier.\n *\n * Design rules (ADRs in `.claude/knowledge-base/plans/slide-rich-content-plan.md`):\n * D1 — explicit `plugins` prop (no auto-detect).\n * D2 — plugin shape: { name, mdastTransform?, hastTransform?, components? }.\n * D13 — execution order: mdast → hast → sanitize (with merged extensions) → components.\n * D16 — plugin error isolation: each plugin call is try/catch wrapped; errors\n * are collected, not thrown.\n * D17 — sanitize-schema merge is OBLIGATORY for plugins emitting non-default\n * tags; without it, the sanitize step silently strips the content.\n *\n * Sanitize is the security barrier. Plugins NEVER bypass `hast-util-sanitize`.\n */\nimport type { Root as HastRoot } from \"hast\";\nimport type { Root as MdastRoot } from \"mdast\";\nimport type { FC } from \"react\";\nimport type { SlideValidationError } from \"./schema.js\";\n\n/** Sanitize schema extension declared by a plugin. Merged with `defaultSchema` in `parseSlide`. */\nexport interface SlideSanitizeExtension {\n /** Additional element tag names allowed past the sanitizer. */\n tagNames?: string[];\n /** Additional attribute allow-list keyed by tag name (or `\"*\"` for all tags). */\n attributes?: Record<string, string[]>;\n}\n\n/** A composable transformer + component-override unit. */\nexport interface SlidePlugin {\n /** Stable identifier used in PLUGIN_ERROR messages and dev logs. */\n name: string;\n /** Mutate the mdast tree before HTML conversion. Return value is forwarded. */\n mdastTransform?: (tree: MdastRoot) => Promise<MdastRoot> | MdastRoot;\n /** Mutate the hast tree after HTML conversion, before sanitize. */\n hastTransform?: (tree: HastRoot) => Promise<HastRoot> | HastRoot;\n /** React component overrides merged into the consumer's `components` map. */\n // biome-ignore lint/suspicious/noExplicitAny: third-party component override map\n components?: Record<string, FC<any>>;\n /** Sanitize-schema extension. Required for plugins emitting non-default tags. */\n sanitizeSchemaExtension?: SlideSanitizeExtension;\n}\n\n/** Merged sanitize-schema extensions from all plugins. */\nexport interface MergedSanitizeExtensions {\n tagNames: string[];\n attributes: Record<string, string[]>;\n}\n\n/** Composer over a plugin array. Hooks orchestrate transformation + error isolation. */\nexport interface PluginComposer {\n /** Run all `mdastTransform` hooks in array order. Collects errors. */\n runMdast(tree: MdastRoot, errors: SlideValidationError[]): Promise<MdastRoot>;\n /** Run all `hastTransform` hooks in array order. Collects errors. */\n runHast(tree: HastRoot, errors: SlideValidationError[]): Promise<HastRoot>;\n /** Merge all plugin component overrides; later-plugin-wins on conflict. */\n // biome-ignore lint/suspicious/noExplicitAny: third-party component override map\n mergedComponents(): Record<string, FC<any>>;\n /** Merge sanitize-schema extensions across all plugins (dedupes tag names). */\n mergedSanitizeExtensions(): MergedSanitizeExtensions;\n}\n\n/**\n * Build a composer over an array of plugins.\n *\n * Order semantics:\n * - mdast transforms run sequentially in array order.\n * - hast transforms run sequentially in array order.\n * - components merge: later plugin wins on conflict (Object.assign semantics).\n * - sanitize-schema extensions: union of tag names; union of attributes by tag.\n *\n * Error semantics (D16):\n * - Each plugin call is wrapped in try/catch.\n * - On throw, an error of code `PLUGIN_ERROR` is pushed to `errors[]` and the\n * pipeline continues with the **non-transformed** input from that plugin\n * (i.e. subsequent plugins see the tree that failed plugin received).\n * - The composer NEVER throws; `parseSlide` keeps its \"never throws on input\"\n * contract (RFC 0002 D9).\n */\nexport function composePlugins(plugins: SlidePlugin[]): PluginComposer {\n return {\n async runMdast(tree, errors) {\n let current = tree;\n for (const p of plugins) {\n if (!p.mdastTransform) continue;\n const previous = current;\n try {\n const result = await p.mdastTransform(current);\n if (!result || result.type !== \"root\") {\n // Defensive: a buggy plugin may return a non-Root node. Reject and\n // keep the previous tree so subsequent plugins see a valid input.\n throw new Error(\"mdastTransform returned non-Root node\");\n }\n current = result;\n } catch (e) {\n current = previous;\n errors.push(makePluginError(p.name, \"mdastTransform\", e));\n }\n }\n return current;\n },\n async runHast(tree, errors) {\n let current = tree;\n for (const p of plugins) {\n if (!p.hastTransform) continue;\n const previous = current;\n try {\n const result = await p.hastTransform(current);\n if (!result || result.type !== \"root\") {\n throw new Error(\"hastTransform returned non-Root node\");\n }\n current = result;\n } catch (e) {\n current = previous;\n errors.push(makePluginError(p.name, \"hastTransform\", e));\n }\n }\n return current;\n },\n mergedComponents() {\n // biome-ignore lint/suspicious/noExplicitAny: third-party component override map\n const out: Record<string, FC<any>> = {};\n for (const p of plugins) {\n if (p.components) Object.assign(out, p.components);\n }\n return out;\n },\n mergedSanitizeExtensions() {\n const tagNames = new Set<string>();\n const attributes: Record<string, Set<string>> = {};\n for (const p of plugins) {\n const ext = p.sanitizeSchemaExtension;\n if (!ext) continue;\n if (ext.tagNames) {\n for (const tag of ext.tagNames) tagNames.add(tag);\n }\n if (ext.attributes) {\n for (const [tag, attrs] of Object.entries(ext.attributes)) {\n if (!attributes[tag]) attributes[tag] = new Set();\n for (const a of attrs) attributes[tag].add(a);\n }\n }\n }\n const mergedAttrs: Record<string, string[]> = {};\n for (const [tag, set] of Object.entries(attributes)) {\n mergedAttrs[tag] = Array.from(set);\n }\n return {\n tagNames: Array.from(tagNames),\n attributes: mergedAttrs,\n };\n },\n };\n}\n\nfunction makePluginError(\n name: string,\n hook: \"mdastTransform\" | \"hastTransform\",\n e: unknown,\n): SlideValidationError {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n code: \"PLUGIN_ERROR\",\n path: [],\n message: `Plugin '${name}' failed in ${hook}: ${msg}`,\n got: name,\n };\n}\n","/**\n * Sanitize schema for slide body hast trees.\n *\n * ADR D8: `defaultSchema` from `hast-util-sanitize` is used WITHOUT extensions\n * in v0.1. The default schema:\n * - Strips `<script>`, `<iframe>`, `<object>`, `<embed>`, `<form>`, `<input>`,\n * `<style>`, `<link>` and other dangerous tags.\n * - Keeps `clobberPrefix: \"user-content-\"` so user-supplied IDs cannot\n * clobber DOM lookups.\n * - Allows the standard CommonMark + GFM safe subset (h1-h6, p, ul, ol, li,\n * blockquote, code, pre, a[href], img[src/alt], table family, em, strong,\n * del, br, hr, etc.).\n *\n * A `looseSlideSanitizeSchema` (with `figure`/`figcaption`) is an explicit\n * opt-in for v0.2 — gated by security review.\n */\nimport type { Element, Root } from \"hast\";\nimport type { MergedSanitizeExtensions } from \"./plugin.js\";\n\nlet cachedBuiltSchema: import(\"hast-util-sanitize\").Schema | undefined;\n\n/**\n * Tier 1 built-in extensions to the default sanitize schema. These cover the\n * tags emitted by built-in Slide features (alerts in `aside`, layout / header\n * / footer / paginate metadata attributes on the outer section wrapper). They\n * are NOT plugin-declared because they ship with the Slide primitive.\n *\n * Note: layout / header / footer / paginate are applied at the React component\n * level (outside the hast tree), so their attributes don't need sanitize rules.\n * Only `aside` (alerts) ends up in the hast.\n */\nconst TIER_1_TAG_NAMES: string[] = [\"aside\"];\nconst TIER_1_ATTRIBUTES: Record<string, string[]> = {\n aside: [\"className\", \"data-theo-slide-alert-type\"],\n \"*\": [\"className\"],\n};\n\n/**\n * Lazy accessor for the sanitize schema.\n *\n * Always merges `defaultSchema` with the Tier 1 baseline (aside + className).\n * When `extensions` is provided, plugin-declared tag names + attributes are\n * unioned on top (D17 / EC-3). Plugins NEVER bypass sanitize — they declare\n * what they need via `sanitizeSchemaExtension`.\n *\n * Implementation notes:\n * - The baseline schema (default + Tier 1) is cached.\n * - Plugin-merged schemas are NOT cached (depends on combination).\n */\nexport async function getSlideSanitizeSchema(\n extensions?: MergedSanitizeExtensions,\n): Promise<import(\"hast-util-sanitize\").Schema> {\n const baseline = await getBaselineSchema();\n if (\n !extensions ||\n (extensions.tagNames.length === 0 && Object.keys(extensions.attributes).length === 0)\n ) {\n return baseline;\n }\n return mergeSchema(baseline, extensions);\n}\n\nasync function getBaselineSchema(): Promise<import(\"hast-util-sanitize\").Schema> {\n if (cachedBuiltSchema) return cachedBuiltSchema;\n const { defaultSchema } = await import(\"hast-util-sanitize\");\n cachedBuiltSchema = mergeSchema(defaultSchema, {\n tagNames: TIER_1_TAG_NAMES,\n attributes: TIER_1_ATTRIBUTES,\n });\n return cachedBuiltSchema;\n}\n\nfunction mergeSchema(\n base: import(\"hast-util-sanitize\").Schema,\n extensions: MergedSanitizeExtensions,\n): import(\"hast-util-sanitize\").Schema {\n // Merge tag names (deduplicated set).\n const baseTagNames = (base.tagNames ?? []) as string[];\n const tagSet = new Set<string>(baseTagNames);\n for (const t of extensions.tagNames) tagSet.add(t);\n // Merge attributes per tag.\n const baseAttrs = (base.attributes ?? {}) as Record<string, unknown[]>;\n const mergedAttrs: Record<string, unknown[]> = { ...baseAttrs };\n for (const [tag, attrs] of Object.entries(extensions.attributes)) {\n const baseline = (mergedAttrs[tag] ?? []) as unknown[];\n const seen = new Set<string>();\n const combined: unknown[] = [];\n for (const a of baseline) {\n const key = typeof a === \"string\" ? a : JSON.stringify(a);\n if (!seen.has(key)) {\n seen.add(key);\n combined.push(a);\n }\n }\n for (const a of attrs) {\n if (!seen.has(a)) {\n seen.add(a);\n combined.push(a);\n }\n }\n mergedAttrs[tag] = combined;\n }\n return {\n ...base,\n tagNames: Array.from(tagSet),\n attributes: mergedAttrs,\n } as import(\"hast-util-sanitize\").Schema;\n}\n\n/** Count elements by tagName in a hast tree. Used for BANNED_TAG detection (ADR D13). */\nexport function collectTagCounts(tree: Root | Element): Map<string, number> {\n const counts = new Map<string, number>();\n const walk = (node: Root | Element | { type: string; children?: unknown[] }): void => {\n if (node.type === \"element\") {\n const tag = (node as Element).tagName;\n counts.set(tag, (counts.get(tag) ?? 0) + 1);\n }\n const children = (node as { children?: unknown[] }).children;\n if (Array.isArray(children)) {\n for (const child of children) {\n if (child && typeof child === \"object\" && \"type\" in child) {\n walk(child as Root | Element);\n }\n }\n }\n };\n walk(tree);\n return counts;\n}\n","/**\n * Zod schema for the Slide YAML frontmatter (`SlideFrontmatter`) and the\n * composed `SlideInput` (frontmatter + body).\n *\n * Design (see RFC 0002 and the plan in\n * `.claude/knowledge-base/plans/slide-view-primitive-plan.md` §16.3 and ADRs D4 / D14):\n *\n * - **`.strict()`** on frontmatter — unknown keys produce `INVALID_FRONTMATTER`\n * with a precise path, so an LLM can self-correct.\n * - Numeric values are `.finite()` to reject `NaN` / `Infinity`. (Currently no\n * numeric directives ship; keep the helper for future fields.)\n * - String values capped to defensible sizes to reject DoS-shaped inputs.\n * - `body` capped to 50 KB (≈30 slides' worth of text) per the sanity rule.\n * - `theme` is the canonical enum of built-in themes. Custom themes are not\n * registered via frontmatter in v0.1 — caller wraps `<Slide>` with their\n * own CSS overrides.\n */\nimport { z } from \"zod\";\n\n/** Built-in slide themes. Adding a theme means landing a CSS file in `themes/`. */\nexport const slideTheme = z.enum([\"default\", \"violet-forge\"]);\nexport type SlideTheme = z.infer<typeof slideTheme>;\n\n/** Built-in slide layouts (rich-content plan T2.1). */\nexport const slideLayout = z.enum([\n \"default\",\n \"title\",\n \"two-column\",\n \"image-right\",\n \"image-left\",\n \"code-output\",\n \"section\",\n]);\nexport type SlideLayout = z.infer<typeof slideLayout>;\n\nconst cssColor = z.string().max(64);\n// BCP-47 language tag — loose validation, just sanity to reject obvious junk.\nconst langTag = z\n .string()\n .regex(/^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$/, \"Expected BCP-47 language tag\")\n .max(35);\n\n// EC-7 / rich-content T3.1 helpers.\nconst SAFE_URL_SCHEMES = [\"http://\", \"https://\"];\n\n/**\n * Sanitize a `backgroundImage` URL.\n *\n * Allowed: `http(s)://...` URLs (validated via `URL` constructor).\n * Rejected: `javascript:`, `vbscript:`, all `data:` URLs (EC-7 — perf + DoS).\n * Accepts a bare URL or a `url(...)` wrapper. Returns the unwrapped URL on\n * success, `null` on rejection.\n */\nexport function sanitizeBgUrl(input: string): string | null {\n try {\n const trimmed = input.trim();\n const url = trimmed.startsWith(\"url(\")\n ? trimmed.replace(/^url\\(\\s*['\"]?/, \"\").replace(/['\"]?\\s*\\)$/, \"\")\n : trimmed;\n const lower = url.toLowerCase();\n if (lower.startsWith(\"javascript:\") || lower.startsWith(\"vbscript:\")) return null;\n // EC-7: reject ALL data: URLs (including data:image/*) — slides inflate the\n // markdown payload and shifts loading cost. Consumer should host images.\n if (lower.startsWith(\"data:\")) return null;\n if (!SAFE_URL_SCHEMES.some((s) => lower.startsWith(s))) return null;\n new URL(url); // throws on malformed\n return url;\n } catch {\n return null;\n }\n}\n\n/** YAML frontmatter accepted by `<Slide>`. */\nexport const slideFrontmatter = z\n .object({\n theme: slideTheme.optional(),\n /** Rich-content T2: built-in layout (CSS grid). */\n layout: slideLayout.optional(),\n /** Rich-content T3: background URL (sanitized: http(s) only). */\n backgroundImage: z\n .string()\n .max(500_000)\n .transform((v) => {\n if (!v) return undefined;\n const sanitized = sanitizeBgUrl(v);\n return sanitized ?? undefined;\n })\n .optional(),\n /** Rich-content T3: CSS gradient string (validated by prefix). */\n backgroundGradient: z\n .string()\n .max(500)\n .regex(\n /^(linear|radial|conic)-gradient\\(/i,\n \"Must start with linear-/radial-/conic-gradient(\",\n )\n .optional(),\n /** Rich-content T5: header overlay text (plain, ≤ 200 chars). */\n header: z.string().max(200).optional(),\n /** Rich-content T5: footer overlay text (plain, ≤ 200 chars). */\n footer: z.string().max(200).optional(),\n /** Rich-content T5: pagination — `true` shows page number, `\"skip\"` hides. */\n paginate: z.union([z.boolean(), z.literal(\"skip\"), z.literal(\"hold\")]).optional(),\n lang: langTag.optional(),\n color: cssColor.optional(),\n backgroundColor: cssColor.optional(),\n })\n .strict();\nexport type SlideFrontmatter = z.infer<typeof slideFrontmatter>;\n\n/** Composed input: validated frontmatter object + raw markdown body string. */\nexport const slideInput = z.object({\n frontmatter: slideFrontmatter,\n body: z.string().max(50_000),\n});\nexport type SlideInput = z.infer<typeof slideInput>;\n\n/** Discrete validation-error codes — kept centralized so consumers can pattern-match safely. */\nexport type SlideValidationErrorCode =\n | \"INVALID_FRONTMATTER\"\n | \"FRONTMATTER_TOO_LARGE\"\n | \"MULTIPLE_SLIDES\"\n | \"CONTENT_TOO_LARGE\"\n | \"BANNED_TAG\"\n | \"BANNED_ATTRIBUTE\"\n | \"INVALID_ASPECT_RATIO\"\n // Rich-content plan (Tier 1 + Tier 2 plugins):\n | \"PLUGIN_ERROR\" // D16: a plugin's mdast/hast transform threw — pipeline continued\n | \"PLUGIN_PEER_DEP_MISSING\" // EC-2: dynamic import of a plugin's peer-dep failed\n | \"MARPIT_BG_UNSAFE_URL\"; // D18/EC-5: Marpit ![bg](url) rejected by URL sanitizer\n\nexport interface SlideValidationError {\n /** Path inside the input (frontmatter key, ['body'], or []). */\n path: (string | number)[];\n /** Human-readable explanation. */\n message: string;\n /** Discriminator for consumers. */\n code: SlideValidationErrorCode;\n /** Offending value when extractable from Zod's `received` or by walking the input. */\n got?: unknown;\n}\n","/**\n * Lightweight, dependency-free extractor that separates YAML frontmatter from\n * the markdown body.\n *\n * Strips a leading BOM (``) before matching the regex — common when\n * markdown is pasted from Word/Notion. See plan ADR D14 and edge-case EC-4.\n *\n * Returns `{ rawFrontmatter, body, tooLarge? }`:\n * - `rawFrontmatter`: the YAML string between the two `---` delimiters, or\n * `null` if no frontmatter is present.\n * - `body`: the markdown after the closing `---\\n` (or the full input when\n * no frontmatter).\n * - `tooLarge`: `true` if `rawFrontmatter` exceeds `MAX_RAW_FRONTMATTER`\n * bytes — the caller turns this into `FRONTMATTER_TOO_LARGE`.\n */\n\n/** Maximum size of the raw frontmatter string before YAML parsing. 10 KB cap. */\nexport const MAX_RAW_FRONTMATTER = 10_240;\n\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]*)$/;\nconst BOM = \"\";\n\nexport interface ExtractFrontmatterResult {\n rawFrontmatter: string | null;\n body: string;\n tooLarge?: boolean;\n}\n\nexport function extractFrontmatter(md: string): ExtractFrontmatterResult {\n const normalized = md.startsWith(BOM) ? md.slice(1) : md;\n const match = FRONTMATTER_RE.exec(normalized);\n if (!match) {\n return { rawFrontmatter: null, body: normalized };\n }\n const raw = match[1] ?? \"\";\n const body = match[2] ?? \"\";\n if (raw.length > MAX_RAW_FRONTMATTER) {\n return { rawFrontmatter: raw, body, tooLarge: true };\n }\n return { rawFrontmatter: raw, body };\n}\n","import { extractFrontmatter } from \"./frontmatter.js\";\n/**\n * Async validator for slide markdown input.\n *\n * Returns `Promise<ValidationResult>` (ADR D11 — sync impossible because\n * `yaml` and `mdast-util-from-markdown` are lazy-imported peer-deps).\n *\n * Pipeline:\n * 1. Strip BOM + extract frontmatter (`frontmatter.ts`).\n * 2. Reject `FRONTMATTER_TOO_LARGE` early if raw > 10 KB (ADR D14).\n * 3. Parse YAML in safe mode → validate against `slideFrontmatter` (Zod).\n * 4. Validate body length → emit `CONTENT_TOO_LARGE` if > 50 KB.\n * 5. Detect multi-slide via mdast `thematicBreak` walk (ADR D12) — not\n * a regex, so `---` inside fenced code blocks does not false-positive.\n * 6. Return `{ ok, input, errors[] }`.\n *\n * Errors are structured so an LLM can self-correct from the callback.\n */\nimport {\n type SlideFrontmatter,\n type SlideInput,\n type SlideValidationError,\n slideFrontmatter,\n} from \"./schema.js\";\n\nexport type ValidationResult =\n | { ok: true; input: SlideInput; errors: SlideValidationError[] }\n | { ok: false; errors: SlideValidationError[] };\n\ninterface ZodLikeIssue {\n path: ReadonlyArray<string | number>;\n message: string;\n code: string;\n received?: unknown;\n}\n\nconst MAX_BODY = 50_000;\n\nfunction valueAtPath(input: unknown, path: ReadonlyArray<string | number>): unknown {\n let cursor: unknown = input;\n for (const segment of path) {\n if (cursor === null || typeof cursor !== \"object\") return undefined;\n cursor = (cursor as Record<string | number, unknown>)[segment];\n }\n return cursor;\n}\n\nfunction formatZodIssue(\n issue: ZodLikeIssue,\n input: unknown,\n pathPrefix: (string | number)[],\n): SlideValidationError {\n const error: SlideValidationError = {\n path: [...pathPrefix, ...issue.path],\n message: issue.message,\n code: \"INVALID_FRONTMATTER\",\n };\n if (\"received\" in issue && issue.received !== undefined) {\n error.got = issue.received;\n } else if (issue.path.length > 0) {\n const value = valueAtPath(input, issue.path);\n if (value !== undefined) error.got = value;\n }\n return error;\n}\n\nasync function detectMultiSlide(body: string): Promise<{\n multi: boolean;\n firstSlideBody: string;\n}> {\n // mdast-based — regex would false-positive on `---` inside fenced code blocks.\n // Cost: one extra parse. Cheap; would be parsed again in `parse.ts` anyway.\n const { fromMarkdown } = await import(\"mdast-util-from-markdown\");\n const tree = fromMarkdown(body);\n const hrIdx = tree.children.findIndex((n) => n.type === \"thematicBreak\");\n if (hrIdx === -1) {\n return { multi: false, firstSlideBody: body };\n }\n const firstHr = tree.children[hrIdx];\n const offset = firstHr?.position?.start.offset;\n if (typeof offset !== \"number\") {\n return { multi: true, firstSlideBody: body };\n }\n return { multi: true, firstSlideBody: body.slice(0, offset) };\n}\n\n/**\n * Validate the markdown input. Returns errors structured for LLM self-correction.\n *\n * Async because frontmatter YAML parsing and mdast multi-slide detection both\n * use lazy-imported peer-deps (yaml + mdast-util-from-markdown).\n */\nexport async function validateSlide(markdown: string): Promise<ValidationResult> {\n const errors: SlideValidationError[] = [];\n const extracted = extractFrontmatter(markdown);\n\n if (extracted.tooLarge) {\n errors.push({\n code: \"FRONTMATTER_TOO_LARGE\",\n path: [],\n message: `Raw frontmatter exceeds ${10_240} bytes.`,\n got: extracted.rawFrontmatter?.length,\n });\n return { ok: false, errors };\n }\n\n let frontmatter: SlideFrontmatter = {};\n if (extracted.rawFrontmatter !== null) {\n let parsed: unknown;\n try {\n const yaml = await import(\"yaml\");\n parsed = yaml.parse(extracted.rawFrontmatter);\n } catch (e) {\n errors.push({\n code: \"INVALID_FRONTMATTER\",\n path: [],\n message: e instanceof Error ? e.message : \"YAML parse failed.\",\n got: extracted.rawFrontmatter,\n });\n return { ok: false, errors };\n }\n if (parsed === null || parsed === undefined) {\n // empty frontmatter — treat as {}\n frontmatter = {};\n } else if (typeof parsed !== \"object\" || Array.isArray(parsed)) {\n errors.push({\n code: \"INVALID_FRONTMATTER\",\n path: [],\n message: \"Frontmatter must be a YAML mapping (object).\",\n got: parsed,\n });\n return { ok: false, errors };\n } else {\n const result = slideFrontmatter.safeParse(parsed);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push(formatZodIssue(issue as unknown as ZodLikeIssue, parsed, []));\n }\n return { ok: false, errors };\n }\n frontmatter = result.data;\n }\n }\n\n let body = extracted.body;\n\n if (body.length > MAX_BODY) {\n errors.push({\n code: \"CONTENT_TOO_LARGE\",\n path: [\"body\"],\n message: `Body exceeds ${MAX_BODY} characters.`,\n got: body.length,\n });\n return { ok: false, errors };\n }\n\n const multi = await detectMultiSlide(body);\n if (multi.multi) {\n body = multi.firstSlideBody;\n errors.push({\n code: \"MULTIPLE_SLIDES\",\n path: [\"body\"],\n message:\n \"Input contains a top-level thematic break (---). <Slide> renders single-slide markdown only. Only the first slide was rendered.\",\n });\n }\n\n return { ok: true, input: { frontmatter, body }, errors };\n}\n","import type { Root as HastRoot } from \"hast\";\n/**\n * Markdown → React tree pipeline for the Slide primitive.\n *\n * parseSlide(markdown)\n * ├─ validateSlide(markdown) → { frontmatter, body, errors? }\n * ├─ parseBody(body) → mdast Root (micromark + GFM)\n * ├─ mdastToHast(mdastTree) → hast Root (allowDangerousHtml: false)\n * ├─ sanitizeHast(hastTree) → hast Root + BANNED_TAG diff (ADR D13)\n * └─ hastToReact(hastTree) → React tree (jsx-runtime, no innerHTML)\n *\n * Every transform is composed of lazy-imported peer-deps so the slide bundle\n * stays under budget and never vendors the markdown stack into the barrel\n * (ADR D2 / D3 of the slide plan).\n */\nimport type { Root as MdastRoot } from \"mdast\";\nimport type { ReactElement } from \"react\";\nimport { detectAlerts } from \"./alerts.js\";\nimport { extractMarpitBackgrounds } from \"./marpit-bg.js\";\nimport { type MergedSanitizeExtensions, type SlidePlugin, composePlugins } from \"./plugin.js\";\nimport { collectTagCounts, getSlideSanitizeSchema } from \"./sanitize.js\";\nimport { type SlideFrontmatter, type SlideValidationError, sanitizeBgUrl } from \"./schema.js\";\nimport { validateSlide } from \"./validate.js\";\n\nexport interface ParseSlideOptions {\n /** Override individual element renderers (passed to hast-util-to-jsx-runtime). */\n components?: Record<string, unknown>;\n /** Rich-content plugins (Tier 2). Order matters — D13 / RFC 0004. */\n plugins?: SlidePlugin[];\n}\n\nexport interface ExtractedBackground {\n /** Sanitized URL (http/https only). */\n url: string;\n /** Optional Marpit modifier: `cover` | `fit` | `left` | `right`. */\n modifier?: \"cover\" | \"fit\" | \"left\" | \"right\";\n}\n\nexport interface ParsedSlide {\n frontmatter: SlideFrontmatter;\n /** React element renderable as the body of a slide. Always defined (may be empty Fragment). */\n tree: ReactElement;\n /** Validation + sanitize errors collected during parsing. Empty on success. */\n errors: SlideValidationError[];\n /** True when the input contained a top-level thematic break and only the first slide was rendered. */\n truncated: boolean;\n /**\n * Background image extracted from Marpit `![bg](url)` syntax (D18 / EC-5).\n * Precedence: `frontmatter.backgroundImage` > `extractedBackground.url`.\n */\n extractedBackground?: ExtractedBackground;\n}\n\nexport async function parseBody(body: string): Promise<MdastRoot> {\n const [{ fromMarkdown }, { gfmFromMarkdown }, { gfm }] = await Promise.all([\n import(\"mdast-util-from-markdown\"),\n import(\"mdast-util-gfm\"),\n import(\"micromark-extension-gfm\"),\n ]);\n return fromMarkdown(body, {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n });\n}\n\nexport async function mdastToHast(tree: MdastRoot): Promise<HastRoot> {\n const { toHast } = await import(\"mdast-util-to-hast\");\n const hast = toHast(tree, { allowDangerousHtml: false });\n if (!hast || hast.type !== \"root\") {\n return { type: \"root\", children: hast ? [hast] : [] } as HastRoot;\n }\n return hast as HastRoot;\n}\n\nexport async function sanitizeHast(\n tree: HastRoot,\n extensions?: MergedSanitizeExtensions,\n): Promise<{ tree: HastRoot; bannedTags: string[] }> {\n const schema = await getSlideSanitizeSchema(extensions);\n const { sanitize } = await import(\"hast-util-sanitize\");\n const preCount = collectTagCounts(tree);\n const safe = sanitize(tree, schema);\n const safeRoot: HastRoot =\n safe.type === \"root\" ? (safe as HastRoot) : ({ type: \"root\", children: [safe] } as HastRoot);\n const postCount = collectTagCounts(safeRoot);\n const bannedTags: string[] = [];\n for (const [tag, before] of preCount) {\n const after = postCount.get(tag) ?? 0;\n if (after < before) {\n // Push once per stripped tag name; agents can self-correct from this signal.\n bannedTags.push(tag);\n }\n }\n return { tree: safeRoot, bannedTags };\n}\n\nexport async function hastToReact(\n tree: HastRoot,\n components?: Record<string, unknown>,\n): Promise<ReactElement> {\n const { Fragment, jsx, jsxs } = await import(\"react/jsx-runtime\");\n const { toJsxRuntime } = await import(\"hast-util-to-jsx-runtime\");\n return toJsxRuntime(tree, {\n Fragment,\n jsx,\n jsxs,\n components,\n }) as ReactElement;\n}\n\n/**\n * Public entry point. Validates → parses → sanitizes → returns a React tree.\n *\n * Never throws on input. Errors (validation, BANNED_TAG) are collected into\n * `errors[]` so callers can show them via `onValidationError`.\n */\nexport async function parseSlide(\n markdown: string,\n opts: ParseSlideOptions = {},\n): Promise<ParsedSlide> {\n const errors: SlideValidationError[] = [];\n let frontmatter: SlideFrontmatter = {};\n let body = markdown;\n let truncated = false;\n\n const validation = await validateSlide(markdown);\n if (validation.ok) {\n frontmatter = validation.input.frontmatter;\n body = validation.input.body;\n errors.push(...validation.errors);\n truncated = validation.errors.some((e) => e.code === \"MULTIPLE_SLIDES\");\n } else {\n errors.push(...validation.errors);\n // Best-effort recovery: render the body as if frontmatter was absent.\n // This preserves \"never throw, always render something\" contract.\n body = markdown;\n }\n\n const compose = composePlugins(opts.plugins ?? []);\n\n const rawMdast = await parseBody(body);\n // Tier 1 — GFM alerts (D3): in-tree post-process, no plugin needed.\n // Runs BEFORE plugin mdastTransforms so plugins observing the tree see the\n // normalized aside shape (consistent with how `> [!NOTE]` is treated as\n // native GFM by consumers).\n detectAlerts(rawMdast);\n // Tier 1 — Marpit ![bg](url) (D18 / EC-5): extract before plugins run so the\n // tree handed to plugins is free of bg directives.\n const { tree: mdastNoBg, background: marpitBg } = extractMarpitBackgrounds(rawMdast);\n let extractedBackground: ExtractedBackground | undefined;\n if (marpitBg) {\n const safeUrl = sanitizeBgUrl(marpitBg.url);\n if (safeUrl) {\n extractedBackground = { url: safeUrl, modifier: marpitBg.modifier };\n } else {\n errors.push({\n code: \"MARPIT_BG_UNSAFE_URL\",\n path: [],\n message: \"Marpit ![bg](url) rejected: unsafe scheme or malformed URL.\",\n got: marpitBg.url.slice(0, 80),\n });\n }\n }\n const transformedMdast = await compose.runMdast(mdastNoBg, errors);\n const rawHast = await mdastToHast(transformedMdast);\n const transformedHast = await compose.runHast(rawHast, errors);\n\n // D17 / EC-3: merge plugin sanitize-schema extensions with defaultSchema so\n // plugins emitting non-default tags (Shiki spans, KaTeX MathML, Mermaid SVG)\n // survive the security barrier. Sanitize ALWAYS runs.\n const sanitizeExtensions = compose.mergedSanitizeExtensions();\n const { tree: safeTree, bannedTags } = await sanitizeHast(transformedHast, sanitizeExtensions);\n for (const tag of bannedTags) {\n errors.push({\n code: \"BANNED_TAG\",\n path: [\"body\"],\n message: `Tag <${tag}> was stripped by the slide sanitizer.`,\n got: tag,\n });\n }\n\n // D2 / D13: plugin component overrides merge on top of consumer's components;\n // plugin definitions win on conflict (last-write-wins in mergedComponents).\n const mergedComponents = {\n ...(opts.components ?? {}),\n ...compose.mergedComponents(),\n };\n const tree = await hastToReact(safeTree, mergedComponents);\n\n return { frontmatter, tree, errors, truncated, extractedBackground };\n}\n","/**\n * Container-fit hook for the Slide primitive.\n *\n * Observes the host element via `ResizeObserver` and computes a CSS scale\n * factor that fits the fixed logical canvas (default 1280×720) inside it,\n * preserving aspect ratio. Clamped to `[minScale, maxScale]`.\n *\n * Algorithm: `scale = clamp(min(W / canvasW, H / canvasH), min, max)`.\n *\n * Adapted from Reveal.js `transformSlides` (see reference doc §4.5 / §14.2).\n *\n * Cleanup: disconnects the observer on unmount or when deps change.\n */\nimport { type RefObject, useEffect, useState } from \"react\";\n\nexport interface UseSlideFitOptions {\n /** Lower clamp for scale. Default 0.1. */\n minScale?: number;\n /** Upper clamp for scale. Default 4. */\n maxScale?: number;\n}\n\nexport function useSlideFit(\n ref: RefObject<HTMLElement | null>,\n canvasW: number,\n canvasH: number,\n opts: UseSlideFitOptions = {},\n): number {\n const { minScale = 0.1, maxScale = 4 } = opts;\n const [scale, setScale] = useState(1);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n if (typeof ResizeObserver === \"undefined\") {\n // Test environments without ResizeObserver: do a one-shot measurement.\n const { width, height } = el.getBoundingClientRect();\n if (width > 0 && height > 0) {\n const raw = Math.min(width / canvasW, height / canvasH);\n setScale(Math.max(minScale, Math.min(raw, maxScale)));\n }\n return;\n }\n const update = (): void => {\n const { width, height } = el.getBoundingClientRect();\n if (width <= 0 || height <= 0) return;\n const raw = Math.min(width / canvasW, height / canvasH);\n const clamped = Math.max(minScale, Math.min(raw, maxScale));\n if (Number.isFinite(clamped)) setScale(clamped);\n };\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref, canvasW, canvasH, minScale, maxScale]);\n\n return scale;\n}\n","import {\n type FC,\n type ReactElement,\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n/**\n * `<Slide>` — view-only primitive that renders markdown + YAML frontmatter\n * into a themed, fixed-aspect surface. Lives in the isolated subpath\n * `@theokit/ui/slide`.\n *\n * See RFC 0002 (`docs/rfcs/0002-slide.md`) and the plan in\n * `.claude/knowledge-base/plans/slide-view-primitive-plan.md`.\n *\n * SSR note: initial render returns the section wrapper; the parsed React tree\n * fills in client-side via the useEffect → `parseSlide` chain. Consumers\n * wrapping in Suspense / skeleton can mitigate visible jump.\n *\n * Performance tip: pass a memoized `onValidationError` (via `useCallback`)\n * and a memoized `components` map. Inline arrows recreate on each render\n * and cause re-parses.\n */\nimport { type ParsedSlide, parseSlide } from \"./parse.js\";\nimport type { SlidePlugin } from \"./plugin.js\";\nimport type { SlideValidationError } from \"./schema.js\";\nimport type { SlideTheme } from \"./themes/index.js\";\nimport { useSlideFit } from \"./use-slide-fit.js\";\n\nexport type { SlideTheme } from \"./themes/index.js\";\nexport type {\n SlideValidationError,\n SlideValidationErrorCode,\n} from \"./schema.js\";\nexport type { SlidePlugin } from \"./plugin.js\";\n\nexport interface SlideAspectRatio {\n width: number;\n height: number;\n}\n\nexport interface SlideProps {\n /**\n * Slide markdown. CommonMark + GFM + optional YAML frontmatter delimited\n * by `---`. Top-level horizontal rules (`---` on their own line outside\n * frontmatter) imply a deck split and trigger `MULTIPLE_SLIDES`; only the\n * first slide is rendered.\n *\n * Note: `<figure>`/`<figcaption>` tags are stripped by the default\n * sanitize schema (D8). Use `<img>` directly for captionless images.\n */\n markdown: string;\n /** Theme name. Defaults to `\"default\"`. */\n theme?: SlideTheme;\n /**\n * Aspect ratio of the logical canvas. Default `\"16:9\"` → 1280×720.\n * Custom `{ width, height }` accepted; zero/negative/NaN fallback to 16:9.\n */\n aspectRatio?: \"16:9\" | \"4:3\" | SlideAspectRatio;\n /** Lower clamp for container-fit scale. Default 0.1. */\n minScale?: number;\n /** Upper clamp for container-fit scale. Default 4. */\n maxScale?: number;\n /** Best-effort callback invoked in useEffect when validation/sanitize emits errors. */\n onValidationError?: (errors: SlideValidationError[]) => void;\n /** Override individual element renderers (passed to hast-util-to-jsx-runtime). */\n // biome-ignore lint/suspicious/noExplicitAny: third-party component override map\n components?: Record<string, FC<any>>;\n /**\n * Rich-content plugins (Tier 2). Each plugin transforms the mdast/hast tree\n * or adds React component overrides. Pass MEMOIZED arrays to avoid re-parses\n * on every render (D15).\n *\n * @example\n * const plugins = useMemo(() => [emojiPlugin(), shikiPlugin()], []);\n * <Slide markdown={md} plugins={plugins} />\n */\n plugins?: SlidePlugin[];\n /** Accessible label for the slide. Defaults to `\"Slide\"`. */\n \"aria-label\"?: string;\n /** Optional class applied to the outer host element (sizing/positioning hook). */\n className?: string;\n}\n\nconst ASPECT_PRESETS: Record<\"16:9\" | \"4:3\", SlideAspectRatio> = {\n \"16:9\": { width: 1280, height: 720 },\n \"4:3\": { width: 960, height: 720 },\n};\n\n/**\n * Resolve aspectRatio prop to concrete dimensions. Invalid custom values\n * (zero, negative, non-finite) silently fall back to 16:9 — surfaced via\n * `INVALID_ASPECT_RATIO` error in `onValidationError`. ADR D14.\n */\nfunction resolveCanvas(ar: SlideProps[\"aspectRatio\"]): {\n width: number;\n height: number;\n invalid?: boolean;\n} {\n if (!ar || ar === \"16:9\") return ASPECT_PRESETS[\"16:9\"];\n if (ar === \"4:3\") return ASPECT_PRESETS[\"4:3\"];\n if (\n ar.width <= 0 ||\n ar.height <= 0 ||\n !Number.isFinite(ar.width) ||\n !Number.isFinite(ar.height)\n ) {\n return { ...ASPECT_PRESETS[\"16:9\"], invalid: true };\n }\n return ar;\n}\n\nexport const Slide: FC<SlideProps> = ({\n markdown,\n theme = \"default\",\n aspectRatio = \"16:9\",\n minScale,\n maxScale,\n onValidationError,\n components,\n plugins,\n className,\n \"aria-label\": ariaLabel = \"Slide\",\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvas = useMemo(() => resolveCanvas(aspectRatio), [aspectRatio]);\n const scale = useSlideFit(containerRef, canvas.width, canvas.height, {\n minScale,\n maxScale,\n });\n\n const [parsed, setParsed] = useState<ParsedSlide | null>(null);\n\n // Surface INVALID_ASPECT_RATIO immediately when the prop is invalid.\n // Independent of markdown parsing so consumers see the signal even with\n // an empty markdown payload.\n useEffect(() => {\n if (canvas.invalid && onValidationError) {\n onValidationError([\n {\n code: \"INVALID_ASPECT_RATIO\",\n path: [\"aspectRatio\"],\n message:\n \"aspectRatio width/height must be positive finite numbers; falling back to 16:9.\",\n got: aspectRatio,\n },\n ]);\n }\n }, [canvas.invalid, onValidationError, aspectRatio]);\n\n // EC-7 / version counter — prevents older parses from overwriting newer\n // ones on rapid prop changes.\n const versionRef = useRef(0);\n useEffect(() => {\n const myVersion = ++versionRef.current;\n let cancelled = false;\n parseSlide(markdown, { components, plugins }).then(\n (result) => {\n if (cancelled || myVersion !== versionRef.current) return;\n setParsed(result);\n if (result.errors.length > 0 && onValidationError) {\n onValidationError(result.errors);\n }\n },\n (err: unknown) => {\n // Defensive: parseSlide promises to never throw, but if a runtime\n // failure escapes (e.g. peer-dep missing), surface a synthetic error\n // and keep the slide visible with empty body.\n if (cancelled || myVersion !== versionRef.current) return;\n if (onValidationError) {\n onValidationError([\n {\n code: \"INVALID_FRONTMATTER\",\n path: [],\n message: err instanceof Error ? err.message : \"parseSlide rejected.\",\n },\n ]);\n }\n setParsed({\n frontmatter: {},\n tree: emptyFragment(),\n errors: [],\n truncated: false,\n });\n },\n );\n return () => {\n cancelled = true;\n };\n }, [markdown, components, plugins, onValidationError]);\n\n const treeNode: ReactNode = parsed?.tree ?? null;\n const slideThemeAttr: SlideTheme = theme;\n\n // Tier 1 — frontmatter-driven attributes & overlays.\n const fm = parsed?.frontmatter ?? {};\n const layout = fm.layout;\n // Background precedence: explicit frontmatter > Marpit ![bg](url) (D18 / EC-5).\n const bgUrl = fm.backgroundImage ?? parsed?.extractedBackground?.url;\n const bgModifier = parsed?.extractedBackground?.modifier;\n const bgGradient = fm.backgroundGradient;\n const headerText = fm.header;\n const footerText = fm.footer;\n const paginateValue = fm.paginate;\n const showPaginate = paginateValue === true;\n\n // Background style: gradient > image > inherited.\n const backgroundImageStyle: string | undefined = bgGradient\n ? bgGradient\n : bgUrl\n ? `url(\"${bgUrl}\")`\n : undefined;\n\n return (\n <div\n ref={containerRef}\n className={[\"theo-slide-host\", className].filter(Boolean).join(\" \")}\n data-theo-slide-host\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n width: \"100%\",\n height: \"100%\",\n }}\n >\n {/*\n Section is taken out of normal flow with position:absolute so its\n 1280×720 layout box doesn't inflate the host. `translate(-50%, -50%)`\n anchors the section's center to the host's center; the scale applies\n relative to that same origin. Mirrors Reveal.js transformSlides()\n (see `.claude/knowledge-base/reference/slide.md` §4.5 / §14.2).\n */}\n <section\n aria-roledescription=\"slide\"\n aria-label={ariaLabel}\n className=\"theo-slide\"\n data-theo-slide-theme={slideThemeAttr}\n data-theo-slide-layout={layout ?? \"default\"}\n data-theo-slide-bg-modifier={bgModifier}\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n width: canvas.width,\n height: canvas.height,\n transform: `translate(-50%, -50%) scale(${scale})`,\n transformOrigin: \"center\",\n padding: \"var(--theo-slide-padding, 64px)\",\n color: \"inherit\",\n // Background fills the canvas. When neither image nor gradient is set,\n // the slide inherits the parent surface (same pattern as Whiteboard).\n background: \"transparent\",\n // Only set backgroundImage + ancillary props when one is provided —\n // otherwise the shorthand `background: transparent` is preserved as-is\n // (important for the inherit-from-parent guarantee).\n ...(backgroundImageStyle\n ? {\n backgroundImage: backgroundImageStyle,\n backgroundSize: bgModifier === \"fit\" ? \"contain\" : \"cover\",\n backgroundPosition: \"center\",\n backgroundRepeat: \"no-repeat\",\n }\n : {}),\n fontFamily:\n \"var(--theo-slide-font-family, system-ui, -apple-system, 'Segoe UI', sans-serif)\",\n fontSize: \"var(--theo-slide-font-base, 28px)\",\n lineHeight: 1.5,\n boxSizing: \"border-box\",\n overflow: \"hidden\",\n }}\n >\n {headerText ? (\n <div className=\"theo-slide-header\" aria-hidden=\"true\">\n {headerText}\n </div>\n ) : null}\n {treeNode}\n {footerText ? (\n <div className=\"theo-slide-footer\" aria-hidden=\"true\">\n {footerText}\n </div>\n ) : null}\n {showPaginate ? (\n <div className=\"theo-slide-paginate\" aria-hidden=\"true\">\n 1\n </div>\n ) : null}\n </section>\n </div>\n );\n};\n\n/** Empty React fragment placeholder used when parseSlide fails fatally. */\nfunction emptyFragment(): ReactElement {\n // Cheap fallback that does not require importing Fragment from react/jsx-runtime.\n // Using a real element keeps the type as ReactElement (not ReactNode).\n return { type: \"span\", props: { children: null }, key: null } as unknown as ReactElement;\n}\n","/**\n * Theme registry for the Slide primitive. Built-in themes that ship with the\n * `@theokit/ui/slide` subpath. Custom themes are NOT registered through this\n * module in v0.1 — consumers override CSS variables on `.theo-slide` directly.\n */\n\nexport const slideThemes = [\"default\", \"violet-forge\"] as const;\nexport type SlideTheme = (typeof slideThemes)[number];\n\n/** Returns true if `value` is a recognized built-in theme. */\nexport function isSlideTheme(value: unknown): value is SlideTheme {\n return typeof value === \"string\" && (slideThemes as readonly string[]).includes(value);\n}\n","/**\n * JSON Schema for the Slide YAML frontmatter — derived from the Zod\n * `slideFrontmatter` schema via Zod 4's native `z.toJSONSchema()`.\n *\n * Purpose: enable LLM-driven generation pipelines (OpenAI structured outputs,\n * Anthropic tool use, function calling, JSON-mode constrained generation) to\n * produce frontmatter that is GUARANTEED to pass `validateSlide` without\n * round-tripping through human-written prompt engineering.\n *\n * Usage (Anthropic tool use):\n *\n * import { slideFrontmatterJsonSchema } from \"@theokit/ui/slide\";\n *\n * const tool = {\n * name: \"render_slide\",\n * description: \"Render a presentation slide.\",\n * input_schema: {\n * type: \"object\",\n * properties: {\n * frontmatter: slideFrontmatterJsonSchema,\n * body: { type: \"string\", description: \"CommonMark + GFM markdown body\" },\n * },\n * required: [\"body\"],\n * },\n * };\n *\n * The output matches Zod's behaviour exactly — anything that passes the JSON\n * Schema validator passes Zod, and vice-versa.\n *\n * Companion guide: `docs/slide-llm-guide.md` — copy-paste system prompt that\n * documents every Tier 1 + Tier 2 feature with examples.\n */\nimport { z } from \"zod\";\nimport { slideFrontmatter } from \"./schema.js\";\n\ninterface JsonSchemaProperties {\n [key: string]: Record<string, unknown>;\n}\n\ninterface JsonSchemaWithProperties {\n properties?: JsonSchemaProperties;\n [key: string]: unknown;\n}\n\n/**\n * JSON Schema (Draft 2020-12) describing all accepted frontmatter fields:\n * `theme`, `layout`, `lang`, `color`, `backgroundColor`, `backgroundImage`,\n * `backgroundGradient`, `header`, `footer`, `paginate`.\n *\n * Note: `backgroundImage` uses a Zod `.transform()` (URL sanitization) which\n * cannot be represented in JSON Schema natively. We pass `unrepresentable: \"any\"`\n * to fall back to `{}` for transformed fields, then enrich `backgroundImage`\n * with manual metadata so LLMs still get useful constraints.\n *\n * Generated once at module load. Treat as immutable.\n */\nconst rawSchema = z.toJSONSchema(slideFrontmatter, {\n unrepresentable: \"any\",\n}) as JsonSchemaWithProperties;\n\nif (rawSchema.properties) {\n // Backgrounds carry hard constraints (http(s) only, ≤500_000 chars) that\n // Zod erases through `.transform()`. Inline them here so the LLM tooling\n // sees the same contract `sanitizeBgUrl` enforces at runtime.\n rawSchema.properties.backgroundImage = {\n type: \"string\",\n format: \"uri\",\n maxLength: 500_000,\n pattern: \"^https?://\",\n description:\n \"Slide background image URL. Only http(s) schemes are accepted; data: URLs are rejected at runtime (use a hosted image).\",\n };\n}\n\nexport const slideFrontmatterJsonSchema = rawSchema;\n"]}
@@ -0,0 +1,58 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
3
+ import { forwardRef } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var List2 = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
7
+ TabsPrimitive.List,
8
+ {
9
+ ref,
10
+ className: cn(
11
+ "inline-flex h-10 items-center border-border/40 border-b text-muted-foreground",
12
+ className
13
+ ),
14
+ ...props
15
+ }
16
+ ));
17
+ List2.displayName = "Tabs.List";
18
+ var Trigger2 = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
19
+ TabsPrimitive.Trigger,
20
+ {
21
+ ref,
22
+ className: cn(
23
+ "relative inline-flex h-10 items-center justify-center whitespace-nowrap px-4",
24
+ "font-medium font-sans text-body-sm text-muted-foreground",
25
+ "transition-colors duration-base ease-out-soft",
26
+ "hover:text-foreground",
27
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
28
+ "disabled:pointer-events-none disabled:opacity-50",
29
+ "data-[state=active]:text-foreground",
30
+ // Active underline using a pseudo-element via shadow
31
+ "data-[state=active]:shadow-[inset_0_-2px_0_0_hsl(var(--primary))]",
32
+ className
33
+ ),
34
+ ...props
35
+ }
36
+ ));
37
+ Trigger2.displayName = "Tabs.Trigger";
38
+ var Content2 = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
39
+ TabsPrimitive.Content,
40
+ {
41
+ ref,
42
+ className: cn(
43
+ "mt-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
44
+ className
45
+ ),
46
+ ...props
47
+ }
48
+ ));
49
+ Content2.displayName = "Tabs.Content";
50
+ var Tabs = /* @__PURE__ */ Object.assign(TabsPrimitive.Root, {
51
+ List: List2,
52
+ Trigger: Trigger2,
53
+ Content: Content2
54
+ });
55
+
56
+ export { Tabs };
57
+ //# sourceMappingURL=chunk-ZVS2GOT2.js.map
58
+ //# sourceMappingURL=chunk-ZVS2GOT2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/tabs/tabs.tsx"],"names":["List","Trigger","Content"],"mappings":";;;;;AAYA,IAAMA,KAAAA,GAAO,WAGX,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAe,aAAA,CAAA,IAAA;AAAA,EAAd;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,+EAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD,CAAA;AACDA,KAAAA,CAAK,WAAA,GAAc,WAAA;AAEnB,IAAMC,QAAAA,GAAU,WAGd,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAe,aAAA,CAAA,OAAA;AAAA,EAAd;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,8EAAA;AAAA,MACA,0DAAA;AAAA,MACA,+CAAA;AAAA,MACA,uBAAA;AAAA,MACA,0IAAA;AAAA,MACA,kDAAA;AAAA,MACA,qCAAA;AAAA;AAAA,MAEA,mEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD,CAAA;AACDA,QAAAA,CAAQ,WAAA,GAAc,cAAA;AAEtB,IAAMC,QAAAA,GAAU,WAGd,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAe,aAAA,CAAA,OAAA;AAAA,EAAd;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,8EAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD,CAAA;AACDA,QAAAA,CAAQ,WAAA,GAAc,cAAA;AAEtB,IAAM,IAAA,mBAAqB,MAAA,CAAO,MAAA,CAAqB,aAAA,CAAA,IAAA,EAAM;AAAA,EAC3D,IAAA,EAAAF,KAAAA;AAAA,EACA,OAAA,EAAAC,QAAAA;AAAA,EACA,OAAA,EAAAC;AACF,CAAC","file":"chunk-ZVS2GOT2.js","sourcesContent":["import * as TabsPrimitive from \"@radix-ui/react-tabs\";\nimport { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ElementRef } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * Tabs — built on Radix Tabs.\n *\n * Visual: underlined active tab in primary (violet), inactive in muted-foreground.\n * Used in project views (Overview / Deployments / Logs / Settings).\n */\n\nconst List = forwardRef<\n ElementRef<typeof TabsPrimitive.List>,\n ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center border-border/40 border-b text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nList.displayName = \"Tabs.List\";\n\nconst Trigger = forwardRef<\n ElementRef<typeof TabsPrimitive.Trigger>,\n ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"relative inline-flex h-10 items-center justify-center whitespace-nowrap px-4\",\n \"font-medium font-sans text-body-sm text-muted-foreground\",\n \"transition-colors duration-base ease-out-soft\",\n \"hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"data-[state=active]:text-foreground\",\n // Active underline using a pseudo-element via shadow\n \"data-[state=active]:shadow-[inset_0_-2px_0_0_hsl(var(--primary))]\",\n className,\n )}\n {...props}\n />\n));\nTrigger.displayName = \"Tabs.Trigger\";\n\nconst Content = forwardRef<\n ElementRef<typeof TabsPrimitive.Content>,\n ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n className,\n )}\n {...props}\n />\n));\nContent.displayName = \"Tabs.Content\";\n\nconst Tabs = /*#__PURE__*/ Object.assign(TabsPrimitive.Root, {\n List,\n Trigger,\n Content,\n});\n\nexport { Tabs };\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-ZXPDS6DH.js.map
3
+ //# sourceMappingURL=chunk-ZXPDS6DH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-ZXPDS6DH.js"}
@@ -0,0 +1,173 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import { forwardRef, useMemo } from 'react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ function binPoints(points, maxBars) {
6
+ if (points.length <= maxBars) return points;
7
+ const binSize = Math.ceil(points.length / maxBars);
8
+ const out = [];
9
+ for (let i = 0; i < points.length; i += binSize) {
10
+ const slice = points.slice(i, i + binSize);
11
+ if (slice.length === 0) continue;
12
+ const first = slice[0]?.label ?? "";
13
+ const last = slice[slice.length - 1]?.label ?? first;
14
+ out.push({
15
+ label: slice.length === 1 ? first : `${first}\u2026${last}`,
16
+ input: slice.reduce((a, p) => a + p.input, 0),
17
+ output: slice.reduce((a, p) => a + p.output, 0)
18
+ });
19
+ }
20
+ return out;
21
+ }
22
+ var formatTokens = (n) => {
23
+ if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
24
+ if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;
25
+ return `${n}`;
26
+ };
27
+ var TokenUsageChart = forwardRef(
28
+ ({
29
+ className,
30
+ points,
31
+ title = "Token usage",
32
+ height = 160,
33
+ showLegend = true,
34
+ maxBars = 60,
35
+ ...props
36
+ }, ref) => {
37
+ const series = useMemo(() => binPoints(points, maxBars), [points, maxBars]);
38
+ const max = Math.max(1, ...series.map((p) => p.input + p.output));
39
+ const barCount = series.length;
40
+ const barWidth = 100 / Math.max(1, barCount);
41
+ const gap = Math.min(2, barWidth * 0.2);
42
+ const innerWidth = barWidth - gap;
43
+ const total = series.reduce((acc, p) => acc + p.input + p.output, 0);
44
+ return /* @__PURE__ */ jsxs(
45
+ "section",
46
+ {
47
+ ref,
48
+ className: cn("rounded-xl border bg-card p-4", className),
49
+ "aria-label": "Token usage over time",
50
+ ...props,
51
+ children: [
52
+ /* @__PURE__ */ jsxs("header", { className: "flex items-baseline justify-between gap-3", children: [
53
+ title ? /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) : /* @__PURE__ */ jsx("span", {}),
54
+ /* @__PURE__ */ jsxs("span", { className: "font-mono text-label text-muted-foreground tabular-nums", children: [
55
+ "total \xB7 ",
56
+ formatTokens(total)
57
+ ] })
58
+ ] }),
59
+ /* @__PURE__ */ jsxs("div", { className: "mt-3 grid grid-cols-[auto_1fr] gap-2", children: [
60
+ /* @__PURE__ */ jsxs(
61
+ "div",
62
+ {
63
+ className: "grid font-mono text-label text-muted-foreground",
64
+ style: { height, gridTemplateRows: "1fr 1fr 1fr" },
65
+ "aria-hidden": "true",
66
+ children: [
67
+ /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: formatTokens(max) }),
68
+ /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: formatTokens(max / 2) }),
69
+ /* @__PURE__ */ jsx("span", { className: "self-end tabular-nums", children: "0" })
70
+ ]
71
+ }
72
+ ),
73
+ /* @__PURE__ */ jsxs(
74
+ "svg",
75
+ {
76
+ viewBox: "0 0 100 100",
77
+ preserveAspectRatio: "none",
78
+ className: "w-full",
79
+ style: { height },
80
+ role: "img",
81
+ "aria-label": `Token usage across ${barCount} periods`,
82
+ children: [
83
+ [25, 50, 75].map((y) => /* @__PURE__ */ jsx(
84
+ "line",
85
+ {
86
+ x1: 0,
87
+ y1: y,
88
+ x2: 100,
89
+ y2: y,
90
+ stroke: "hsl(var(--border) / 0.4)",
91
+ strokeWidth: 0.2
92
+ },
93
+ y
94
+ )),
95
+ series.map((p, idx) => {
96
+ const totalH = (p.input + p.output) / max * 100;
97
+ const inputH = p.input / max * 100;
98
+ const outputH = p.output / max * 100;
99
+ const x = idx * barWidth + gap / 2;
100
+ return /* @__PURE__ */ jsxs("g", { children: [
101
+ /* @__PURE__ */ jsx("title", { children: `${p.label} \u2014 input ${formatTokens(p.input)} \xB7 output ${formatTokens(p.output)}` }),
102
+ /* @__PURE__ */ jsx(
103
+ "rect",
104
+ {
105
+ x,
106
+ y: 100 - totalH,
107
+ width: innerWidth,
108
+ height: outputH,
109
+ fill: "hsl(var(--primary))",
110
+ opacity: 0.85
111
+ }
112
+ ),
113
+ /* @__PURE__ */ jsx(
114
+ "rect",
115
+ {
116
+ x,
117
+ y: 100 - inputH,
118
+ width: innerWidth,
119
+ height: inputH,
120
+ fill: "hsl(var(--accent))",
121
+ opacity: 0.85
122
+ }
123
+ )
124
+ ] }, p.label);
125
+ })
126
+ ]
127
+ }
128
+ )
129
+ ] }),
130
+ /* @__PURE__ */ jsxs(
131
+ "div",
132
+ {
133
+ className: "mt-1 grid grid-cols-[auto_1fr] gap-2 font-mono text-label text-muted-foreground",
134
+ "aria-hidden": "true",
135
+ children: [
136
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true" }),
137
+ /* @__PURE__ */ jsx("div", { className: "grid", style: { gridTemplateColumns: `repeat(${barCount}, 1fr)` }, children: series.map((p) => /* @__PURE__ */ jsx("span", { className: "truncate text-center", children: p.label }, p.label)) })
138
+ ]
139
+ }
140
+ ),
141
+ /* @__PURE__ */ jsxs("table", { className: "sr-only", children: [
142
+ /* @__PURE__ */ jsx("caption", { children: "Token usage by period \u2014 input vs output" }),
143
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
144
+ /* @__PURE__ */ jsx("th", { scope: "col", children: "Period" }),
145
+ /* @__PURE__ */ jsx("th", { scope: "col", children: "Input tokens" }),
146
+ /* @__PURE__ */ jsx("th", { scope: "col", children: "Output tokens" })
147
+ ] }) }),
148
+ /* @__PURE__ */ jsx("tbody", { children: series.map((p) => /* @__PURE__ */ jsxs("tr", { children: [
149
+ /* @__PURE__ */ jsx("td", { children: p.label }),
150
+ /* @__PURE__ */ jsx("td", { children: p.input }),
151
+ /* @__PURE__ */ jsx("td", { children: p.output })
152
+ ] }, `a11y-${p.label}`)) })
153
+ ] }),
154
+ showLegend ? /* @__PURE__ */ jsxs("footer", { className: "mt-3 flex items-center gap-4 font-mono text-label text-muted-foreground", children: [
155
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
156
+ /* @__PURE__ */ jsx("span", { className: "size-2 rounded-sm bg-accent", "aria-hidden": "true" }),
157
+ "Input"
158
+ ] }),
159
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
160
+ /* @__PURE__ */ jsx("span", { className: "size-2 rounded-sm bg-primary", "aria-hidden": "true" }),
161
+ "Output"
162
+ ] })
163
+ ] }) : null
164
+ ]
165
+ }
166
+ );
167
+ }
168
+ );
169
+ TokenUsageChart.displayName = "TokenUsageChart";
170
+
171
+ export { TokenUsageChart };
172
+ //# sourceMappingURL=chunk-ZZQQJX5Z.js.map
173
+ //# sourceMappingURL=chunk-ZZQQJX5Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/token-usage-chart/token-usage-chart.tsx"],"names":[],"mappings":"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","file":"chunk-ZZQQJX5Z.js","sourcesContent":["import { forwardRef, useMemo } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport interface TokenUsagePoint {\n /** ISO date or friendly label for the x-axis tooltip. */\n label: string;\n /** Input tokens for this period (e.g. day). */\n input: number;\n /** Output tokens for this period. */\n output: number;\n}\n\ninterface TokenUsageChartProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n points: TokenUsagePoint[];\n /** Title above the chart. */\n title?: ReactNode;\n /** Chart height in px. Default 160. */\n height?: number;\n /** Show legend below the chart. Default true. */\n showLegend?: boolean;\n /**\n * Maximum number of bars to render. When `points.length` exceeds this, the\n * series is binned (summed in equal-width windows) so the chart stays\n * legible and SVG node count stays bounded. Default 60.\n */\n maxBars?: number;\n}\n\nfunction binPoints(points: TokenUsagePoint[], maxBars: number): TokenUsagePoint[] {\n if (points.length <= maxBars) return points;\n const binSize = Math.ceil(points.length / maxBars);\n const out: TokenUsagePoint[] = [];\n for (let i = 0; i < points.length; i += binSize) {\n const slice = points.slice(i, i + binSize);\n if (slice.length === 0) continue;\n const first = slice[0]?.label ?? \"\";\n const last = slice[slice.length - 1]?.label ?? first;\n out.push({\n label: slice.length === 1 ? first : `${first}…${last}`,\n input: slice.reduce((a, p) => a + p.input, 0),\n output: slice.reduce((a, p) => a + p.output, 0),\n });\n }\n return out;\n}\n\nconst formatTokens = (n: number) => {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return `${n}`;\n};\n\n/**\n * TokenUsageChart — stacked-bar chart of input vs output tokens over time.\n *\n * Pure SVG, no chart lib. Width is fluid; bars adjust to viewBox. Hover any\n * bar to see the breakdown in the tooltip slot below.\n */\nconst TokenUsageChart = forwardRef<HTMLDivElement, TokenUsageChartProps>(\n (\n {\n className,\n points,\n title = \"Token usage\",\n height = 160,\n showLegend = true,\n maxBars = 60,\n ...props\n },\n ref,\n ) => {\n const series = useMemo(() => binPoints(points, maxBars), [points, maxBars]);\n const max = Math.max(1, ...series.map((p) => p.input + p.output));\n const barCount = series.length;\n const barWidth = 100 / Math.max(1, barCount);\n const gap = Math.min(2, barWidth * 0.2);\n const innerWidth = barWidth - gap;\n\n const total = series.reduce((acc, p) => acc + p.input + p.output, 0);\n\n return (\n <section\n ref={ref}\n className={cn(\"rounded-xl border bg-card p-4\", className)}\n aria-label=\"Token usage over time\"\n {...props}\n >\n <header className=\"flex items-baseline justify-between gap-3\">\n {title ? (\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n ) : (\n <span />\n )}\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n total · {formatTokens(total)}\n </span>\n </header>\n <div className=\"mt-3 grid grid-cols-[auto_1fr] gap-2\">\n {/* Y-axis ticks */}\n <div\n className=\"grid font-mono text-label text-muted-foreground\"\n style={{ height, gridTemplateRows: \"1fr 1fr 1fr\" }}\n aria-hidden=\"true\"\n >\n <span className=\"tabular-nums\">{formatTokens(max)}</span>\n <span className=\"tabular-nums\">{formatTokens(max / 2)}</span>\n <span className=\"self-end tabular-nums\">0</span>\n </div>\n {/* Chart */}\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n className=\"w-full\"\n style={{ height }}\n role=\"img\"\n aria-label={`Token usage across ${barCount} periods`}\n >\n {/* gridlines */}\n {[25, 50, 75].map((y) => (\n <line\n key={y}\n x1={0}\n y1={y}\n x2={100}\n y2={y}\n stroke=\"hsl(var(--border) / 0.4)\"\n strokeWidth={0.2}\n />\n ))}\n {series.map((p, idx) => {\n const totalH = ((p.input + p.output) / max) * 100;\n const inputH = (p.input / max) * 100;\n const outputH = (p.output / max) * 100;\n const x = idx * barWidth + gap / 2;\n return (\n <g key={p.label}>\n <title>{`${p.label} — input ${formatTokens(p.input)} · output ${formatTokens(p.output)}`}</title>\n {/* output (top, primary tone) */}\n <rect\n x={x}\n y={100 - totalH}\n width={innerWidth}\n height={outputH}\n fill=\"hsl(var(--primary))\"\n opacity={0.85}\n />\n {/* input (bottom, accent tone) */}\n <rect\n x={x}\n y={100 - inputH}\n width={innerWidth}\n height={inputH}\n fill=\"hsl(var(--accent))\"\n opacity={0.85}\n />\n </g>\n );\n })}\n </svg>\n </div>\n {/* x-axis labels — aligned with the chart column of the parent grid */}\n <div\n className=\"mt-1 grid grid-cols-[auto_1fr] gap-2 font-mono text-label text-muted-foreground\"\n aria-hidden=\"true\"\n >\n <span aria-hidden=\"true\" />\n <div className=\"grid\" style={{ gridTemplateColumns: `repeat(${barCount}, 1fr)` }}>\n {series.map((p) => (\n <span key={p.label} className=\"truncate text-center\">\n {p.label}\n </span>\n ))}\n </div>\n </div>\n {/* Screen-reader fallback: the SVG is decorative-ish for AT users.\n * `<title>` per bar is unreliably exposed across NVDA/VoiceOver/JAWS,\n * so we ship an `sr-only` table with the same data. Sighted users\n * never see this; AT users can navigate the values cell-by-cell.\n * Reference: WCAG 1.1.1 (Non-text content). */}\n <table className=\"sr-only\">\n <caption>Token usage by period — input vs output</caption>\n <thead>\n <tr>\n <th scope=\"col\">Period</th>\n <th scope=\"col\">Input tokens</th>\n <th scope=\"col\">Output tokens</th>\n </tr>\n </thead>\n <tbody>\n {series.map((p) => (\n <tr key={`a11y-${p.label}`}>\n <td>{p.label}</td>\n <td>{p.input}</td>\n <td>{p.output}</td>\n </tr>\n ))}\n </tbody>\n </table>\n {showLegend ? (\n <footer className=\"mt-3 flex items-center gap-4 font-mono text-label text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"size-2 rounded-sm bg-accent\" aria-hidden=\"true\" />\n Input\n </span>\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"size-2 rounded-sm bg-primary\" aria-hidden=\"true\" />\n Output\n </span>\n </footer>\n ) : null}\n </section>\n );\n },\n);\nTokenUsageChart.displayName = \"TokenUsageChart\";\n\nexport { TokenUsageChart };\n"]}