@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/composites/slide-deck/context.tsx","../../src/components/composites/slide-deck/controls.tsx","../../src/components/composites/slide-deck/fragments.ts","../../src/components/composites/slide-deck/presenter-view.tsx","../../src/components/composites/slide-deck/print-styles.ts","../../src/components/composites/slide-deck/progress-bar.tsx","../../src/components/composites/slide-deck/slide-number.tsx","../../src/components/composites/slide-deck/notes.ts","../../src/components/composites/slide-deck/split-deck.ts","../../src/components/composites/slide-deck/thumbnails.tsx","../../src/components/composites/slide-deck/use-deck-hash-routing.ts","../../src/components/composites/slide-deck/use-deck-keyboard.ts","../../src/components/composites/slide-deck/use-deck-state.ts","../../src/components/composites/slide-deck/use-deck-swipe.ts","../../src/components/composites/slide-deck/use-fullscreen.ts","../../src/components/composites/slide-deck/slide-deck.tsx","../../src/components/composites/slide-deck/schema.ts"],"names":["jsxs","jsx","useState","useRef","useEffect","useCallback","useMemo"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * DeckContext — internal Context shared between `<SlideDeck>` and its\n * dot-namespace sub-components (`<SlideDeck.Controls>`, etc.). ADR D14.\n */\nimport { type Dispatch, createContext, useContext } from \"react\";\nimport type { SlidePlugin } from \"../../primitives/slide/index.js\";\nimport type { SlideDeckSlide, SlideDeckTransition } from \"./schema.js\";\nimport type { DeckAction, DeckState } from \"./use-deck-state.js\";\n\nexport interface DeckContextValue {\n state: DeckState;\n dispatch: Dispatch<DeckAction>;\n slides: SlideDeckSlide[];\n transition: SlideDeckTransition;\n deckId: string;\n /** Rich-content plugins relayed to every inner `<Slide>` (D15). */\n plugins?: SlidePlugin[];\n /** Toggle browser fullscreen on the deck root. Safe to call when unsupported. */\n toggleFullscreen: () => void | Promise<void>;\n /** Trigger native print dialog with deck-specific @page CSS. */\n print: () => void;\n}\n\nexport const DeckContext = createContext<DeckContextValue | null>(null);\n\nexport function useDeckContext(): DeckContextValue {\n const ctx = useContext(DeckContext);\n if (!ctx) {\n throw new Error(\n \"SlideDeck sub-components must be used inside <SlideDeck>. \" +\n \"Wrap them in <SlideDeck slides={...}>.\",\n );\n }\n return ctx;\n}\n","/**\n * `<SlideDeck.Controls>` — prev/next buttons + slide indicator (\"3 / 12\").\n */\nimport type { FC } from \"react\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface ControlsProps {\n className?: string;\n}\n\nexport const Controls: FC<ControlsProps> = ({ className }) => {\n const { state, dispatch } = useDeckContext();\n const atStart = state.currentIndex <= 0;\n const atEnd = state.currentIndex >= state.totalSlides - 1;\n return (\n <div\n className={[\"theo-slide-deck-controls\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-controls\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Previous slide\"\n disabled={atStart}\n onClick={() => dispatch({ type: \"PREV_SLIDE\" })}\n className=\"theo-slide-deck-controls-prev\"\n >\n ←\n </button>\n <span\n aria-live=\"polite\"\n className=\"theo-slide-deck-controls-indicator\"\n style={{ fontVariantNumeric: \"tabular-nums\", minWidth: 64, textAlign: \"center\" }}\n >\n {state.totalSlides === 0 ? \"0 / 0\" : `${state.currentIndex + 1} / ${state.totalSlides}`}\n </span>\n <button\n type=\"button\"\n aria-label=\"Next slide\"\n disabled={atEnd}\n onClick={() => dispatch({ type: \"NEXT_SLIDE\" })}\n className=\"theo-slide-deck-controls-next\"\n >\n →\n </button>\n </div>\n );\n};\n","/**\n * Progressive fragments detector (ADR D12).\n *\n * Marpit convention: lists with `*` (asterisco) marker — instead of `-` or `+`\n * — become fragment-revealed lists. Each item is a step.\n *\n * Implementation: regex pre-pass on raw markdown counts top-of-line `* ` markers.\n * Decision (EC-9): mixed `*` and `-` in the same list is rare; we count ONLY\n * `* ` items as fragments. Plain `- item` lists remain non-fragmented.\n *\n * v0.4: counts only. CSS attribute application happens at render time inside\n * `<SlideDeck.Slides>`, post-parse, by walking the rendered DOM.\n */\n\nconst FRAGMENT_MARKER_RE = /^\\s*\\*\\s+\\S/gm;\n\n/**\n * Count fragment markers in raw markdown.\n *\n * Detects only `*` at start of a line followed by space + non-whitespace.\n * Avoids matching `**bold**`, `*italic*`, or `_ * _` patterns.\n */\nexport function countFragmentsInMarkdown(markdown: string): number {\n if (!markdown) return 0;\n // Strip fenced code blocks first to avoid counting * inside code.\n const stripped = markdown.replace(/```[\\s\\S]*?```/g, \"\");\n const matches = stripped.match(FRAGMENT_MARKER_RE);\n return matches ? matches.length : 0;\n}\n","/**\n * `<SlideDeck.PresenterView>` — inline split-screen panel.\n *\n * Pragmatic v0.4 scope: renders an in-page panel (current slide + next slide +\n * speaker notes + timer) when `state.presenterMode === true`. The separate\n * window via `window.open` + `BroadcastChannel` is deferred to v0.5 (consumer\n * demand will trigger the upgrade — D6 of the plan is reduced to inline panel).\n *\n * Toggling presenter mode is dispatched via hotkey (n/N/p/P, see useDeckKeyboard).\n */\nimport { type FC, useEffect, useRef, useState } from \"react\";\nimport { Slide } from \"../../primitives/slide/index.js\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface PresenterViewProps {\n className?: string;\n}\n\nfunction formatElapsed(ms: number): string {\n const s = Math.floor(ms / 1000);\n const mm = Math.floor(s / 60)\n .toString()\n .padStart(2, \"0\");\n const ss = (s % 60).toString().padStart(2, \"0\");\n return `${mm}:${ss}`;\n}\n\nexport const PresenterView: FC<PresenterViewProps> = ({ className }) => {\n const { state, slides } = useDeckContext();\n const startedAt = useRef<number | null>(null);\n const [elapsed, setElapsed] = useState(0);\n\n // Initialize the timer when presenter mode first opens; reset when closed.\n useEffect(() => {\n if (state.presenterMode) {\n if (startedAt.current === null) {\n startedAt.current = Date.now();\n }\n const interval = window.setInterval(() => {\n if (startedAt.current !== null) {\n setElapsed(Date.now() - startedAt.current);\n }\n }, 1000);\n return () => window.clearInterval(interval);\n }\n startedAt.current = null;\n setElapsed(0);\n return undefined;\n }, [state.presenterMode]);\n\n if (!state.presenterMode) return null;\n\n const current = slides[state.currentIndex];\n const next = slides[state.currentIndex + 1];\n const notes = current?.notes;\n\n return (\n <aside\n className={[\"theo-slide-deck-presenter\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-presenter\n aria-label=\"Presenter view\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gridTemplateRows: \"auto 1fr\",\n gap: 16,\n padding: 16,\n background: \"color-mix(in srgb, currentColor 6%, transparent)\",\n borderRadius: 8,\n }}\n >\n <header\n style={{\n gridColumn: \"1 / -1\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <h3 style={{ margin: 0, fontSize: 14, fontWeight: 600 }}>Presenter view</h3>\n <span\n aria-label=\"Elapsed time\"\n style={{ fontVariantNumeric: \"tabular-nums\", fontSize: 14 }}\n >\n {formatElapsed(elapsed)}\n </span>\n </header>\n <section aria-label=\"Current slide preview\">\n <h4 style={{ margin: \"0 0 8px\", fontSize: 12, opacity: 0.7 }}>Current</h4>\n <div\n style={{\n aspectRatio: \"16 / 9\",\n overflow: \"hidden\",\n border: \"1px solid rgba(127,127,127,0.3)\",\n borderRadius: 6,\n }}\n >\n {current ? <Slide markdown={current.markdown} aria-label=\"Current slide\" /> : null}\n </div>\n </section>\n <section aria-label=\"Next slide preview\">\n <h4 style={{ margin: \"0 0 8px\", fontSize: 12, opacity: 0.7 }}>Next</h4>\n <div\n style={{\n aspectRatio: \"16 / 9\",\n overflow: \"hidden\",\n border: \"1px solid rgba(127,127,127,0.3)\",\n borderRadius: 6,\n opacity: next ? 1 : 0.4,\n }}\n >\n {next ? (\n <Slide markdown={next.markdown} aria-label=\"Next slide\" />\n ) : (\n <div style={{ padding: 16, fontSize: 14, opacity: 0.6 }}>End of deck</div>\n )}\n </div>\n </section>\n {notes ? (\n <section\n aria-label=\"Speaker notes\"\n style={{\n gridColumn: \"1 / -1\",\n background: \"color-mix(in srgb, currentColor 8%, transparent)\",\n padding: 12,\n borderRadius: 6,\n fontSize: 14,\n whiteSpace: \"pre-wrap\",\n }}\n >\n <strong>Notes: </strong>\n {notes}\n </section>\n ) : null}\n </aside>\n );\n};\n","/**\n * Print CSS injection (ADR D7).\n *\n * Injects a `<style id=\"theo-slide-deck-print\">` element into the document\n * head with `@page` + `@media print` rules that render `.theo-slide-deck-print-container`\n * with one slide per page. Calls `window.print()`. Removes the style on the\n * `afterprint` event (cleanup runs regardless of print cancel/complete).\n */\n\nconst STYLE_ID = \"theo-slide-deck-print-styles\";\nconst PRINT_CSS = `\n@media print {\n @page {\n size: 1280px 720px;\n margin: 0;\n }\n body > * {\n visibility: hidden;\n }\n .theo-slide-deck-print-container,\n .theo-slide-deck-print-container * {\n visibility: visible;\n }\n .theo-slide-deck-print-container {\n position: absolute;\n inset: 0;\n }\n .theo-slide-deck-print-slide {\n page-break-after: always;\n break-after: page;\n width: 1280px;\n height: 720px;\n overflow: hidden;\n }\n .theo-slide-deck-print-slide:last-child {\n page-break-after: auto;\n break-after: auto;\n }\n}\n`;\n\nexport function injectPrintStyles(): HTMLStyleElement {\n if (typeof document === \"undefined\") {\n throw new Error(\"injectPrintStyles requires a document (browser env)\");\n }\n let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = PRINT_CSS;\n document.head.appendChild(style);\n }\n return style;\n}\n\nexport function removePrintStyles(): void {\n if (typeof document === \"undefined\") return;\n const style = document.getElementById(STYLE_ID);\n if (style) style.remove();\n}\n\nexport interface PrintDeckOptions {\n /** Optional callback fired after print dialog closes (success or cancel). */\n onAfterPrint?: () => void;\n}\n\n/**\n * Trigger native print dialog with deck-specific CSS injected.\n *\n * The `afterprint` event listener is cleaned up automatically. Idempotent —\n * calling twice in quick succession is safe (style is reused).\n */\nexport function printDeck(opts: PrintDeckOptions = {}): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n injectPrintStyles();\n const cleanup = (): void => {\n removePrintStyles();\n window.removeEventListener(\"afterprint\", cleanup);\n opts.onAfterPrint?.();\n };\n window.addEventListener(\"afterprint\", cleanup);\n window.print();\n}\n","/**\n * `<SlideDeck.ProgressBar>` — horizontal HTML5 progress element.\n */\nimport type { FC } from \"react\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface ProgressBarProps {\n className?: string;\n}\n\nexport const ProgressBar: FC<ProgressBarProps> = ({ className }) => {\n const { state } = useDeckContext();\n // Edge case: totalSlides=0 → 0% safely.\n const value = state.totalSlides === 0 ? 0 : state.currentIndex + 1;\n const max = Math.max(1, state.totalSlides);\n return (\n <progress\n className={[\"theo-slide-deck-progress\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-progress\n value={value}\n max={max}\n aria-label=\"Slide progress\"\n />\n );\n};\n","/**\n * `<SlideDeck.SlideNumber>` — decorative \"N / Total\" overlay.\n *\n * aria-hidden because the live indicator in <Controls> already announces the\n * current position; this is purely visual chrome.\n */\nimport type { FC } from \"react\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface SlideNumberProps {\n className?: string;\n}\n\nexport const SlideNumber: FC<SlideNumberProps> = ({ className }) => {\n const { state } = useDeckContext();\n if (state.totalSlides === 0) return null;\n return (\n <div\n className={[\"theo-slide-deck-slide-number\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-slide-number\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n bottom: 12,\n right: 16,\n fontVariantNumeric: \"tabular-nums\",\n fontSize: 14,\n opacity: 0.6,\n }}\n >\n {state.currentIndex + 1} / {state.totalSlides}\n </div>\n );\n};\n","/**\n * Speaker notes extractor (ADR D11).\n *\n * Sintaxe: HTML comments `<!-- notes: ... -->` ou `<!-- note: ... -->`.\n * Aceita ambos singular e plural. Texto interno é plain (sem markdown nesting\n * em v0.4 — pode vir em v0.5).\n *\n * Returns the body with comments removed and the aggregated notes string.\n */\n\nconst NOTES_RE = /<!--\\s*notes?:\\s*([\\s\\S]*?)\\s*-->/gi;\n\nexport interface ExtractNotesResult {\n body: string;\n notes: string | undefined;\n}\n\nexport function extractNotes(md: string): ExtractNotesResult {\n const matches = [...md.matchAll(NOTES_RE)];\n if (matches.length === 0) {\n return { body: md, notes: undefined };\n }\n const notes = matches\n .map((m) => (m[1] ?? \"\").trim())\n .filter((s) => s.length > 0)\n .join(\"\\n\\n\");\n const body = md.replace(NOTES_RE, \"\").trim();\n return { body, notes: notes.length > 0 ? notes : undefined };\n}\n","/**\n * Split a markdown string into individual slides at top-level `thematicBreak`s.\n *\n * Mirrors the Slide primitive's `detectMultiSlide` algorithm (D12 of RFC 0002),\n * but returns ALL slides instead of truncating.\n *\n * ADR D15: strips global frontmatter FIRST so the leading `---\\n...\\n---\\n`\n * delimiter is not parsed as a `thematicBreak` (which would yield a phantom\n * empty slide #0).\n *\n * The first slide may have its own frontmatter (kept attached); subsequent\n * slides do not parse frontmatter again (consumer's `<Slide markdown>` does\n * per-slide validation).\n */\nimport { extractFrontmatter } from \"../../primitives/slide/index.js\";\nimport { extractNotes } from \"./notes.js\";\nimport type { SlideDeckSlide } from \"./schema.js\";\n\nexport async function splitDeck(markdown: string): Promise<SlideDeckSlide[]> {\n // D15: strip leading global frontmatter so its `---` delimiters are not\n // mistaken for slide separators.\n const { body: bodyAfterFM } = extractFrontmatter(markdown);\n\n if (bodyAfterFM.trim().length === 0) {\n return [];\n }\n\n const { fromMarkdown } = await import(\"mdast-util-from-markdown\");\n const tree = fromMarkdown(bodyAfterFM);\n\n const breakOffsets: number[] = [];\n for (const node of tree.children) {\n if (node.type === \"thematicBreak\") {\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n if (typeof start === \"number\" && typeof end === \"number\") {\n breakOffsets.push(start);\n breakOffsets.push(end);\n }\n }\n }\n\n if (breakOffsets.length === 0) {\n // Single-slide deck.\n const { body, notes } = extractNotes(bodyAfterFM);\n if (body.trim().length === 0 && !notes) return [];\n return [{ markdown: body, notes }];\n }\n\n // Build ranges between (or excluding) the `---` tokens.\n const slides: SlideDeckSlide[] = [];\n const positions: number[] = [0];\n // breakOffsets is [start0, end0, start1, end1, ...]. We want to skip the\n // `---` itself but include the content between them.\n for (let i = 0; i < breakOffsets.length; i += 2) {\n const start = breakOffsets[i];\n const end = breakOffsets[i + 1];\n if (typeof start === \"number\") positions.push(start);\n if (typeof end === \"number\") positions.push(end);\n }\n positions.push(bodyAfterFM.length);\n\n // Pair adjacent positions to form slide ranges (skip the `---` segments).\n for (let i = 0; i < positions.length - 1; i += 2) {\n const start = positions[i];\n const end = positions[i + 1];\n if (typeof start !== \"number\" || typeof end !== \"number\") continue;\n const chunk = bodyAfterFM.slice(start, end).trim();\n if (chunk.length === 0) continue;\n const { body, notes } = extractNotes(chunk);\n if (body.trim().length === 0 && !notes) continue;\n slides.push({ markdown: body, notes });\n }\n\n return slides;\n}\n","/**\n * `<SlideDeck.Thumbnails>` — sidebar with mini Slide instances.\n *\n * Performance strategy:\n * - Each thumbnail renders the actual `<Slide>` inside a scaled wrapper (~0.18×).\n * - IntersectionObserver lazy-loads thumbnails — off-screen ones show a\n * placeholder skeleton instead of parsing the markdown.\n * - EC-13: when IntersectionObserver is undefined (legacy env / SSR), falls\n * back to eager render. Acceptable for decks ≤ 50 slides.\n *\n * Click handler dispatches JUMP_TO. Auto-scroll keeps current thumbnail visible.\n */\nimport { type FC, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Slide } from \"../../primitives/slide/index.js\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface ThumbnailsProps {\n className?: string;\n /** Scale of each thumbnail. Default 0.18. */\n scale?: number;\n}\n\nconst CANVAS_W = 1280;\nconst CANVAS_H = 720;\n\ninterface ThumbnailItemProps {\n markdown: string;\n index: number;\n isCurrent: boolean;\n scale: number;\n eager: boolean;\n onSelect: (index: number) => void;\n registerRef: (index: number, el: HTMLElement | null) => void;\n}\n\nconst ThumbnailItem: FC<ThumbnailItemProps> = ({\n markdown,\n index,\n isCurrent,\n scale,\n eager,\n onSelect,\n registerRef,\n}) => {\n const [revealed, setRevealed] = useState(eager);\n\n const setRef = useCallback(\n (el: HTMLElement | null) => {\n registerRef(index, el);\n if (eager) return;\n if (!el) return;\n if (typeof IntersectionObserver === \"undefined\") {\n // EC-13 fallback: no IO, render eagerly.\n setRevealed(true);\n return;\n }\n const io = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setRevealed(true);\n io.disconnect();\n break;\n }\n }\n },\n { rootMargin: \"200px\" },\n );\n io.observe(el);\n },\n [index, eager, registerRef],\n );\n\n const w = Math.round(CANVAS_W * scale);\n const h = Math.round(CANVAS_H * scale);\n return (\n <button\n ref={setRef}\n type=\"button\"\n onClick={() => onSelect(index)}\n data-theo-slide-deck-thumbnail\n data-current={isCurrent || undefined}\n aria-label={`Slide ${index + 1}`}\n aria-current={isCurrent ? \"page\" : undefined}\n className=\"theo-slide-deck-thumbnail\"\n style={{\n width: w,\n height: h,\n padding: 0,\n border: isCurrent ? \"2px solid currentColor\" : \"1px solid rgba(127,127,127,0.3)\",\n borderRadius: 6,\n overflow: \"hidden\",\n position: \"relative\",\n cursor: \"pointer\",\n flexShrink: 0,\n background: \"transparent\",\n }}\n >\n <div\n style={{\n width: CANVAS_W,\n height: CANVAS_H,\n transform: `scale(${scale})`,\n transformOrigin: \"top left\",\n pointerEvents: \"none\",\n }}\n >\n {revealed ? (\n <Slide markdown={markdown} aria-label={`Thumbnail ${index + 1}`} />\n ) : (\n <div\n data-theo-slide-deck-thumbnail-placeholder\n style={{\n width: \"100%\",\n height: \"100%\",\n background: \"rgba(127,127,127,0.08)\",\n }}\n />\n )}\n </div>\n </button>\n );\n};\n\nexport const Thumbnails: FC<ThumbnailsProps> = ({ className, scale = 0.18 }) => {\n const { state, dispatch, slides } = useDeckContext();\n const refs = useRef<Map<number, HTMLElement>>(new Map());\n\n const registerRef = useCallback((index: number, el: HTMLElement | null) => {\n if (el) {\n refs.current.set(index, el);\n } else {\n refs.current.delete(index);\n }\n }, []);\n\n const onSelect = useCallback(\n (index: number) => {\n dispatch({ type: \"JUMP_TO\", index });\n },\n [dispatch],\n );\n\n // Auto-scroll current into view.\n useEffect(() => {\n const el = refs.current.get(state.currentIndex);\n if (el && \"scrollIntoView\" in el) {\n el.scrollIntoView({ behavior: \"smooth\", block: \"nearest\", inline: \"nearest\" });\n }\n }, [state.currentIndex]);\n\n // EC-13: eager mode when IO is absent.\n const eagerAll = useMemo(() => typeof IntersectionObserver === \"undefined\", []);\n\n return (\n <ul\n className={[\"theo-slide-deck-thumbnails\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-thumbnails\n aria-label=\"Slide thumbnails\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n overflowY: \"auto\",\n padding: 8,\n listStyle: \"none\",\n margin: 0,\n }}\n >\n {slides.map((slide, index) => (\n <li key={`${slide.id ?? index}-${index}`}>\n <ThumbnailItem\n markdown={slide.markdown}\n index={index}\n isCurrent={index === state.currentIndex}\n scale={scale}\n eager={eagerAll || index < 3 /* first 3 always eager for snappy first paint */}\n onSelect={onSelect}\n registerRef={registerRef}\n />\n </li>\n ))}\n </ul>\n );\n};\n","/**\n * Hash routing hook (ADR D13).\n *\n * Pattern `#/N` (1-based). Bidirectional sync:\n * - Initial state: read via `useDeckState`'s lazy `initFromHash` (D17 SSR-safe).\n * - hashchange event → JUMP_TO.\n * - currentIndex change → `history.replaceState` (does NOT trigger hashchange,\n * so no infinite loop — verified in test EC-10).\n */\nimport { type Dispatch, useEffect } from \"react\";\nimport type { DeckAction } from \"./use-deck-state.js\";\n\nexport interface UseDeckHashRoutingOptions {\n enabled?: boolean;\n totalSlides: number;\n currentIndex: number;\n}\n\n/** Read hash → return 0-based index, or undefined if not present/invalid. */\nexport function readHashIndex(hash: string): number | undefined {\n if (!hash || hash === \"#\" || hash === \"#/\") return undefined;\n const match = hash.match(/^#\\/(\\d+)/);\n if (!match) return undefined;\n const oneBased = Number.parseInt(match[1] ?? \"\", 10);\n if (!Number.isFinite(oneBased) || oneBased < 1) return undefined;\n return oneBased - 1;\n}\n\n/** SSR-safe wrapper for initial hash read (D17). */\nexport function readInitialHash(): number | undefined {\n if (typeof window === \"undefined\") return undefined;\n return readHashIndex(window.location.hash);\n}\n\n/** Format index → hash string. */\nexport function formatHash(zeroBasedIndex: number): string {\n return `#/${zeroBasedIndex + 1}`;\n}\n\nexport function useDeckHashRouting(\n dispatch: Dispatch<DeckAction>,\n opts: UseDeckHashRoutingOptions,\n): void {\n const { enabled = true, totalSlides, currentIndex } = opts;\n\n // Listen for hashchange (back/forward, manual edit, shared link click).\n useEffect(() => {\n if (!enabled) return;\n if (typeof window === \"undefined\") return;\n const handler = (): void => {\n const idx = readHashIndex(window.location.hash);\n if (typeof idx !== \"number\") return;\n const clamped = Math.max(0, Math.min(idx, Math.max(0, totalSlides - 1)));\n dispatch({ type: \"JUMP_TO\", index: clamped });\n };\n window.addEventListener(\"hashchange\", handler);\n return () => window.removeEventListener(\"hashchange\", handler);\n }, [enabled, totalSlides, dispatch]);\n\n // Sync currentIndex → hash via replaceState (silent, no hashchange fired).\n useEffect(() => {\n if (!enabled) return;\n if (typeof window === \"undefined\") return;\n const targetHash = formatHash(currentIndex);\n if (window.location.hash === targetHash) return;\n // replaceState does NOT trigger hashchange — verified in test EC-10.\n window.history.replaceState(null, \"\", targetHash);\n }, [enabled, currentIndex]);\n}\n","/**\n * Keyboard navigation hook (ADR D9).\n *\n * Hardcoded bindings (no remap in v0.4):\n * ArrowRight, Space, PageDown → NEXT_SLIDE\n * ArrowLeft, PageUp → PREV_SLIDE\n * Home → JUMP_TO 0\n * End → JUMP_TO last\n * Escape → SET_FULLSCREEN false\n * f / F → toggleFullscreen callback\n * n / N / p / P → TOGGLE_PRESENTER\n * Ctrl+P / Meta+P → onPrint callback (preventDefault)\n *\n * Guards: ignora events quando target é INPUT, TEXTAREA, ou contentEditable\n * (consumer pode ter inputs em modais sem conflito).\n */\nimport { type Dispatch, useEffect } from \"react\";\nimport type { DeckAction } from \"./use-deck-state.js\";\n\nexport interface UseDeckKeyboardOptions {\n enabled?: boolean;\n totalSlides: number;\n onToggleFullscreen?: () => void;\n onPrint?: () => void;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return true;\n if (target.isContentEditable) return true;\n return false;\n}\n\nexport function useDeckKeyboard(\n dispatch: Dispatch<DeckAction>,\n opts: UseDeckKeyboardOptions,\n): void {\n const { enabled = true, totalSlides, onToggleFullscreen, onPrint } = opts;\n useEffect(() => {\n if (!enabled) return;\n const handler = (event: KeyboardEvent): void => {\n if (isEditableTarget(event.target)) return;\n\n const key = event.key;\n const isPrintCombo = (event.ctrlKey || event.metaKey) && (key === \"p\" || key === \"P\");\n\n if (isPrintCombo) {\n event.preventDefault();\n onPrint?.();\n return;\n }\n\n switch (key) {\n case \"ArrowRight\":\n case \" \":\n case \"Spacebar\":\n case \"PageDown\":\n dispatch({ type: \"NEXT_SLIDE\" });\n break;\n case \"ArrowLeft\":\n case \"PageUp\":\n dispatch({ type: \"PREV_SLIDE\" });\n break;\n case \"Home\":\n dispatch({ type: \"JUMP_TO\", index: 0 });\n break;\n case \"End\":\n dispatch({ type: \"JUMP_TO\", index: Math.max(0, totalSlides - 1) });\n break;\n case \"Escape\":\n dispatch({ type: \"SET_FULLSCREEN\", value: false });\n break;\n case \"f\":\n case \"F\":\n onToggleFullscreen?.();\n break;\n case \"n\":\n case \"N\":\n case \"p\":\n case \"P\":\n dispatch({ type: \"TOGGLE_PRESENTER\" });\n break;\n default:\n return;\n }\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [enabled, totalSlides, dispatch, onToggleFullscreen, onPrint]);\n}\n","/**\n * Deck state machine (ADR D5).\n *\n * Single useReducer governs all deck-level state transitions: currentIndex,\n * currentFragment, presenterMode, fullscreen, transitionDirection.\n *\n * NEXT_SLIDE advances fragment first if `currentFragment < totalFragmentsInCurrent`,\n * else advances slide. PREV_SLIDE mirrors. JUMP_TO clamps to valid range.\n *\n * ADR D17: lazy init reads hash via `initFromHash` callback when provided —\n * SSR-safe (callback guards `typeof window !== \"undefined\"`).\n */\nimport { type Dispatch, useReducer } from \"react\";\n\nexport interface DeckState {\n currentIndex: number;\n currentFragment: number;\n presenterMode: boolean;\n fullscreen: boolean;\n transitionDirection: \"none\" | \"next\" | \"prev\";\n totalSlides: number;\n totalFragmentsInCurrent: number;\n}\n\nexport type DeckAction =\n | { type: \"NEXT_SLIDE\" }\n | { type: \"PREV_SLIDE\" }\n | { type: \"JUMP_TO\"; index: number }\n | { type: \"NEXT_FRAGMENT\" }\n | { type: \"PREV_FRAGMENT\" }\n | { type: \"RESET_FRAGMENTS\" }\n | { type: \"TOGGLE_PRESENTER\" }\n | { type: \"SET_FULLSCREEN\"; value: boolean }\n | { type: \"UPDATE_TOTAL_SLIDES\"; total: number }\n | { type: \"UPDATE_TOTAL_FRAGMENTS\"; total: number }\n | { type: \"TRANSITION_END\" };\n\nexport function deckReducer(state: DeckState, action: DeckAction): DeckState {\n switch (action.type) {\n case \"NEXT_SLIDE\": {\n // Advance fragment first when there are remaining fragments.\n if (state.currentFragment < state.totalFragmentsInCurrent) {\n return { ...state, currentFragment: state.currentFragment + 1 };\n }\n const next = Math.min(state.currentIndex + 1, Math.max(0, state.totalSlides - 1));\n if (next === state.currentIndex) return state;\n return {\n ...state,\n currentIndex: next,\n currentFragment: 0,\n transitionDirection: \"next\",\n };\n }\n case \"PREV_SLIDE\": {\n if (state.currentFragment > 0) {\n return { ...state, currentFragment: state.currentFragment - 1 };\n }\n const prev = Math.max(state.currentIndex - 1, 0);\n if (prev === state.currentIndex) return state;\n return {\n ...state,\n currentIndex: prev,\n currentFragment: 0,\n transitionDirection: \"prev\",\n };\n }\n case \"JUMP_TO\": {\n const clamped = Math.max(0, Math.min(action.index, Math.max(0, state.totalSlides - 1)));\n if (clamped === state.currentIndex) return state;\n return {\n ...state,\n currentIndex: clamped,\n currentFragment: 0,\n transitionDirection: \"none\",\n };\n }\n case \"NEXT_FRAGMENT\": {\n if (state.currentFragment >= state.totalFragmentsInCurrent) return state;\n return { ...state, currentFragment: state.currentFragment + 1 };\n }\n case \"PREV_FRAGMENT\": {\n if (state.currentFragment <= 0) return state;\n return { ...state, currentFragment: state.currentFragment - 1 };\n }\n case \"RESET_FRAGMENTS\":\n return { ...state, currentFragment: 0 };\n case \"TOGGLE_PRESENTER\":\n return { ...state, presenterMode: !state.presenterMode };\n case \"SET_FULLSCREEN\":\n return state.fullscreen === action.value ? state : { ...state, fullscreen: action.value };\n case \"UPDATE_TOTAL_SLIDES\": {\n const next = Math.max(0, action.total);\n const clampedIdx = Math.max(0, Math.min(state.currentIndex, Math.max(0, next - 1)));\n return { ...state, totalSlides: next, currentIndex: clampedIdx };\n }\n case \"UPDATE_TOTAL_FRAGMENTS\":\n return { ...state, totalFragmentsInCurrent: Math.max(0, action.total) };\n case \"TRANSITION_END\":\n return state.transitionDirection === \"none\"\n ? state\n : { ...state, transitionDirection: \"none\" };\n }\n}\n\nexport interface UseDeckStateOptions {\n initialIndex?: number;\n totalSlides: number;\n /** Lazy initializer hook (D17): returns initial index, e.g. parsing hash. */\n initFromHash?: () => number | undefined;\n}\n\nfunction initDeckState(init: UseDeckStateOptions): DeckState {\n const total = Math.max(0, init.totalSlides);\n let idx = init.initialIndex ?? 0;\n if (init.initFromHash) {\n const fromHash = init.initFromHash();\n if (typeof fromHash === \"number\" && Number.isFinite(fromHash)) {\n idx = fromHash;\n }\n }\n const clamped = Math.max(0, Math.min(idx, Math.max(0, total - 1)));\n return {\n currentIndex: clamped,\n currentFragment: 0,\n presenterMode: false,\n fullscreen: false,\n transitionDirection: \"none\",\n totalSlides: total,\n totalFragmentsInCurrent: 0,\n };\n}\n\nexport function useDeckState(\n opts: UseDeckStateOptions,\n): readonly [DeckState, Dispatch<DeckAction>] {\n const [state, dispatch] = useReducer(deckReducer, opts, initDeckState);\n return [state, dispatch] as const;\n}\n","/**\n * Touch swipe hook (ADR D10).\n *\n * Detecta swipe horizontal via Pointer Events nativos:\n * - threshold: 50px de deslocamento\n * - velocity: > 0.3 px/ms\n * - direction guard: |dx| > 2*|dy| (bloqueia swipe vertical / scroll)\n *\n * Swipe left (dx < 0) → NEXT_SLIDE\n * Swipe right (dx > 0) → PREV_SLIDE\n *\n * EC-6: pointercancel limpa o tracking state (mobile browser pode cancelar mid-swipe).\n * EC-7: tracking limita ao primeiro pointerId (multi-touch é ignorado).\n */\nimport { type Dispatch, type RefObject, useEffect } from \"react\";\nimport type { DeckAction } from \"./use-deck-state.js\";\n\nexport interface UseDeckSwipeOptions {\n enabled?: boolean;\n}\n\ninterface TrackedPointer {\n pointerId: number;\n startX: number;\n startY: number;\n startedAt: number;\n}\n\nconst SWIPE_THRESHOLD_PX = 50;\nconst SWIPE_VELOCITY_PX_PER_MS = 0.3;\n\nexport function useDeckSwipe(\n ref: RefObject<HTMLElement | null>,\n dispatch: Dispatch<DeckAction>,\n opts: UseDeckSwipeOptions = {},\n): void {\n const { enabled = true } = opts;\n useEffect(() => {\n if (!enabled) return;\n const el = ref.current;\n if (!el) return;\n\n let tracked: TrackedPointer | null = null;\n\n const onPointerDown = (e: PointerEvent): void => {\n // EC-7: ignore secondary pointers (multi-touch).\n if (tracked !== null) return;\n tracked = {\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n startedAt: e.timeStamp,\n };\n };\n\n const onPointerUp = (e: PointerEvent): void => {\n if (!tracked || e.pointerId !== tracked.pointerId) return;\n const dx = e.clientX - tracked.startX;\n const dy = e.clientY - tracked.startY;\n const dt = Math.max(1, e.timeStamp - tracked.startedAt);\n tracked = null;\n\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n const velocity = absDx / dt;\n\n // Direction guard: horizontal-dominant swipe only.\n if (absDx < absDy * 2) return;\n // Threshold + velocity guard.\n if (absDx < SWIPE_THRESHOLD_PX) return;\n if (velocity < SWIPE_VELOCITY_PX_PER_MS) return;\n\n if (dx < 0) {\n dispatch({ type: \"NEXT_SLIDE\" });\n } else if (dx > 0) {\n dispatch({ type: \"PREV_SLIDE\" });\n }\n };\n\n const onPointerCancel = (e: PointerEvent): void => {\n // EC-6: clear tracking on cancel (browser back gesture, system interruption).\n if (tracked && e.pointerId === tracked.pointerId) {\n tracked = null;\n }\n };\n\n el.addEventListener(\"pointerdown\", onPointerDown);\n el.addEventListener(\"pointerup\", onPointerUp);\n el.addEventListener(\"pointercancel\", onPointerCancel);\n return () => {\n el.removeEventListener(\"pointerdown\", onPointerDown);\n el.removeEventListener(\"pointerup\", onPointerUp);\n el.removeEventListener(\"pointercancel\", onPointerCancel);\n };\n }, [enabled, ref, dispatch]);\n}\n","/**\n * Cross-browser fullscreen hook (ADR D6 area / EC-8).\n *\n * Wraps `Element.requestFullscreen()` + Safari `webkit*` prefix. Listens\n * `fullscreenchange` (+ webkit) to sync state when user presses Esc via the\n * native UI.\n *\n * EC-8: iOS Safari < 16 doesn't expose fullscreen on arbitrary elements (only\n * `<video>`). Feature-detect — when unavailable, hook is a no-op and `toggle`\n * is safe to call.\n */\nimport { type RefObject, useCallback, useEffect, useState } from \"react\";\n\ninterface VendoredElement extends HTMLElement {\n webkitRequestFullscreen?: () => Promise<void>;\n}\n\ninterface VendoredDocument extends Document {\n webkitFullscreenElement?: Element | null;\n webkitExitFullscreen?: () => Promise<void>;\n}\n\nfunction isFullscreenSupported(): boolean {\n if (typeof document === \"undefined\") return false;\n const doc = document as VendoredDocument;\n const el = document.documentElement as VendoredElement;\n return (\n Boolean(el.requestFullscreen ?? el.webkitRequestFullscreen) &&\n Boolean(doc.exitFullscreen ?? doc.webkitExitFullscreen)\n );\n}\n\nfunction currentFullscreenElement(): Element | null {\n if (typeof document === \"undefined\") return null;\n const doc = document as VendoredDocument;\n return document.fullscreenElement ?? doc.webkitFullscreenElement ?? null;\n}\n\nexport interface UseFullscreenResult {\n isFullscreen: boolean;\n toggle: () => Promise<void>;\n isSupported: boolean;\n}\n\nexport function useFullscreen(ref: RefObject<HTMLElement | null>): UseFullscreenResult {\n const supported = isFullscreenSupported();\n const [isFullscreen, setFullscreen] = useState(false);\n\n useEffect(() => {\n if (!supported) return;\n const handler = (): void => {\n setFullscreen(currentFullscreenElement() !== null);\n };\n document.addEventListener(\"fullscreenchange\", handler);\n document.addEventListener(\"webkitfullscreenchange\", handler);\n return () => {\n document.removeEventListener(\"fullscreenchange\", handler);\n document.removeEventListener(\"webkitfullscreenchange\", handler);\n };\n }, [supported]);\n\n const toggle = useCallback(async (): Promise<void> => {\n if (!supported) return;\n const el = ref.current as VendoredElement | null;\n if (!el) return;\n const doc = document as VendoredDocument;\n try {\n if (currentFullscreenElement()) {\n await (doc.exitFullscreen?.() ?? doc.webkitExitFullscreen?.());\n } else {\n await (el.requestFullscreen?.() ?? el.webkitRequestFullscreen?.());\n }\n } catch {\n // User denied or API unavailable — silent fallback. Defensive: never throw.\n }\n }, [ref, supported]);\n\n return { isFullscreen, toggle, isSupported: supported };\n}\n","import {\n type FC,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n/**\n * `<SlideDeck>` — composite engine orchestrating N `<Slide>` primitives.\n *\n * Subpath-isolated at `@theokit/ui/slide-deck` (ADR D1). Imports `<Slide>` via\n * the public package path so consumer's installed peer-deps are reused.\n *\n * See RFC 0003 and the plan in\n * `.claude/knowledge-base/plans/slide-deck-composite-plan.md`.\n *\n * Two render modes:\n * - DEFAULT layout: no children → renders canonical chrome (Slides + Controls\n * + ProgressBar + SlideNumber + PresenterView + buttons).\n * - HEADLESS: children provided → consumer composes own layout from\n * `<SlideDeck.X>` sub-components and a shared DeckContext.\n *\n * SSR-safe: parses markdown only inside `useEffect`. Hash routing uses lazy\n * `initFromHash` (D17) to avoid hydration mismatch. Reducer clamps\n * `currentIndex` whenever `slides.length` changes (EC-4 reconciliation).\n */\nimport { Slide, type SlidePlugin } from \"../../primitives/slide/index.js\";\nimport { DeckContext, type DeckContextValue, useDeckContext } from \"./context.js\";\nimport { Controls } from \"./controls.js\";\nimport { countFragmentsInMarkdown } from \"./fragments.js\";\nimport { PresenterView } from \"./presenter-view.js\";\nimport { printDeck } from \"./print-styles.js\";\nimport { ProgressBar } from \"./progress-bar.js\";\nimport type { SlideDeckInput, SlideDeckSlide, SlideDeckTransition } from \"./schema.js\";\nimport { SlideNumber } from \"./slide-number.js\";\nimport { splitDeck } from \"./split-deck.js\";\nimport { Thumbnails } from \"./thumbnails.js\";\nimport { readInitialHash, useDeckHashRouting } from \"./use-deck-hash-routing.js\";\nimport { useDeckKeyboard } from \"./use-deck-keyboard.js\";\nimport { useDeckState } from \"./use-deck-state.js\";\nimport { useDeckSwipe } from \"./use-deck-swipe.js\";\nimport { useFullscreen } from \"./use-fullscreen.js\";\n\nimport \"./transitions.css\";\n\nexport interface SlideDeckProps {\n /** Markdown string (auto-split) or pre-parsed slide array. */\n slides: SlideDeckInput;\n /** Initial slide index (0-based). Default 0. */\n initialIndex?: number;\n /** Transition preset. Default \"fade\". */\n transition?: SlideDeckTransition;\n /** Enable keyboard navigation. Default true. */\n enableKeyboard?: boolean;\n /** Enable touch/pointer swipe navigation. Default true. */\n enableTouch?: boolean;\n /** Enable hash routing (#/N). Default true. */\n enableHashRouting?: boolean;\n /** Optional unique deck id (auto-generated UUID if absent). */\n deckId?: string;\n /** Called after each navigation. */\n onIndexChange?: (index: number, slide: SlideDeckSlide | undefined) => void;\n /** Headless mode: render custom chrome using `<SlideDeck.X>` sub-components. */\n children?: ReactNode;\n /** Outer className for the deck root. */\n className?: string;\n /** Accessible label for the deck region. Defaults to \"Slide deck\". */\n \"aria-label\"?: string;\n /**\n * Rich-content plugins relayed to every inner `<Slide>` (D15 / RFC 0004).\n * Pass MEMOIZED arrays to avoid re-parses on every render.\n */\n plugins?: SlidePlugin[];\n}\n\nfunction generateDeckId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return `deck-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nconst SlideDeckBase: FC<SlideDeckProps> = ({\n slides: slidesInput,\n initialIndex = 0,\n transition = \"fade\",\n enableKeyboard = true,\n enableTouch = true,\n enableHashRouting = true,\n deckId: deckIdProp,\n onIndexChange,\n children,\n className,\n \"aria-label\": ariaLabel = \"Slide deck\",\n plugins,\n}) => {\n const generatedId = useId();\n const deckId = deckIdProp ?? generatedId ?? generateDeckId();\n const rootRef = useRef<HTMLDivElement>(null);\n\n const [parsedSlides, setParsedSlides] = useState<SlideDeckSlide[]>(() => {\n return Array.isArray(slidesInput) ? slidesInput : [];\n });\n\n // Async parse when string markdown is passed. Re-run when prop changes.\n useEffect(() => {\n if (Array.isArray(slidesInput)) {\n setParsedSlides(slidesInput);\n return;\n }\n let cancelled = false;\n splitDeck(slidesInput).then(\n (result) => {\n if (!cancelled) setParsedSlides(result);\n },\n () => {\n if (!cancelled) setParsedSlides([]);\n },\n );\n return () => {\n cancelled = true;\n };\n }, [slidesInput]);\n\n const [state, dispatch] = useDeckState({\n initialIndex,\n totalSlides: parsedSlides.length,\n initFromHash: enableHashRouting ? readInitialHash : undefined,\n });\n\n // EC-4: reconcile when slides.length changes.\n const previousLengthRef = useRef(0);\n useEffect(() => {\n const length = parsedSlides.length;\n dispatch({ type: \"UPDATE_TOTAL_SLIDES\", total: length });\n // First non-empty parse → honour `initialIndex` (or hash) which was clamped\n // to 0 during initial mount when totalSlides was still 0.\n if (previousLengthRef.current === 0 && length > 0) {\n let target = initialIndex;\n if (enableHashRouting) {\n const hashIdx = readInitialHash();\n if (typeof hashIdx === \"number\") target = hashIdx;\n }\n if (target > 0) {\n dispatch({ type: \"JUMP_TO\", index: target });\n }\n }\n previousLengthRef.current = length;\n }, [parsedSlides.length, dispatch, initialIndex, enableHashRouting]);\n\n // Update totalFragmentsInCurrent when slide content changes.\n useEffect(() => {\n const current = parsedSlides[state.currentIndex];\n const count = current ? countFragmentsInMarkdown(current.markdown) : 0;\n dispatch({ type: \"UPDATE_TOTAL_FRAGMENTS\", total: count });\n }, [parsedSlides, state.currentIndex, dispatch]);\n\n const fullscreen = useFullscreen(rootRef);\n\n // Sync state.fullscreen with browser API. When user presses Esc on native UI.\n useEffect(() => {\n dispatch({ type: \"SET_FULLSCREEN\", value: fullscreen.isFullscreen });\n }, [fullscreen.isFullscreen, dispatch]);\n\n // EC-3 / D16: transition timeout fallback so rapid nav doesn't leave state stuck.\n useEffect(() => {\n if (state.transitionDirection === \"none\") return;\n const t = setTimeout(() => dispatch({ type: \"TRANSITION_END\" }), 300);\n return () => clearTimeout(t);\n }, [state.transitionDirection, dispatch]);\n\n const onPrint = useCallback(() => {\n printDeck();\n }, []);\n\n useDeckKeyboard(dispatch, {\n enabled: enableKeyboard,\n totalSlides: parsedSlides.length,\n onToggleFullscreen: fullscreen.toggle,\n onPrint,\n });\n\n useDeckSwipe(rootRef, dispatch, { enabled: enableTouch });\n\n useDeckHashRouting(dispatch, {\n enabled: enableHashRouting,\n totalSlides: parsedSlides.length,\n currentIndex: state.currentIndex,\n });\n\n // Fire onIndexChange callback when currentIndex changes.\n const lastIndexRef = useRef(state.currentIndex);\n useEffect(() => {\n if (lastIndexRef.current !== state.currentIndex) {\n lastIndexRef.current = state.currentIndex;\n onIndexChange?.(state.currentIndex, parsedSlides[state.currentIndex]);\n }\n }, [state.currentIndex, parsedSlides, onIndexChange]);\n\n const contextValue: DeckContextValue = useMemo(\n () => ({\n state,\n dispatch,\n slides: parsedSlides,\n transition,\n deckId,\n plugins,\n toggleFullscreen: fullscreen.toggle,\n print: onPrint,\n }),\n [state, dispatch, parsedSlides, transition, deckId, plugins, fullscreen.toggle, onPrint],\n );\n\n return (\n <DeckContext.Provider value={contextValue}>\n <div\n ref={rootRef}\n aria-roledescription=\"slide deck\"\n aria-label={ariaLabel}\n data-theo-slide-deck\n data-theo-slide-deck-fullscreen={state.fullscreen ? \"true\" : undefined}\n className={[\"theo-slide-deck\", className].filter(Boolean).join(\" \")}\n style={{ position: \"relative\", width: \"100%\", height: \"100%\" }}\n >\n {/* Live region for screen readers announcing slide changes. */}\n {/* biome-ignore lint/a11y/useSemanticElements: ARIA live region needs explicit role for screen reader announcement; no native HTML equivalent for status updates from non-form, non-output content. */}\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style={{\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0,0,0,0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n }}\n >\n {parsedSlides.length > 0\n ? `Slide ${state.currentIndex + 1} of ${parsedSlides.length}`\n : \"Empty deck\"}\n </div>\n {children ?? <DefaultDeckLayout />}\n {/* Hidden print container — visible only during @media print. */}\n <PrintContainer slides={parsedSlides} plugins={plugins} />\n </div>\n </DeckContext.Provider>\n );\n};\n\nconst SlidesView: FC<{ className?: string }> = ({ className }) => {\n const { state, slides, transition, plugins } = useDeckContext();\n const current = slides[state.currentIndex];\n return (\n <div\n className={[\"theo-slide-deck-slide-frame\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-transition={transition}\n data-theo-slide-deck-direction={state.transitionDirection}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: 0,\n overflow: \"hidden\",\n }}\n >\n {current ? (\n <div\n key={state.currentIndex}\n data-theo-slide-deck-slide-state=\"incoming\"\n style={{ position: \"absolute\", inset: 0 }}\n >\n <Slide\n markdown={current.markdown}\n plugins={plugins}\n aria-label={`Slide ${state.currentIndex + 1}`}\n />\n </div>\n ) : (\n <div\n data-theo-slide-deck-empty\n style={{\n display: \"grid\",\n placeItems: \"center\",\n height: \"100%\",\n opacity: 0.6,\n fontSize: 14,\n }}\n >\n Empty deck\n </div>\n )}\n </div>\n );\n};\n\nconst PresenterButton: FC<{ className?: string }> = ({ className }) => {\n const { state, dispatch } = useDeckContext();\n return (\n <button\n type=\"button\"\n onClick={() => dispatch({ type: \"TOGGLE_PRESENTER\" })}\n aria-pressed={state.presenterMode}\n aria-label={state.presenterMode ? \"Close presenter view\" : \"Open presenter view\"}\n className={[\"theo-slide-deck-presenter-button\", className].filter(Boolean).join(\" \")}\n >\n {state.presenterMode ? \"Close presenter\" : \"Presenter\"}\n </button>\n );\n};\n\nconst FullscreenButton: FC<{ className?: string }> = ({ className }) => {\n const { state, toggleFullscreen } = useDeckContext();\n return (\n <button\n type=\"button\"\n onClick={() => void toggleFullscreen()}\n aria-pressed={state.fullscreen}\n aria-label={state.fullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n className={[\"theo-slide-deck-fullscreen-button\", className].filter(Boolean).join(\" \")}\n >\n {state.fullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n </button>\n );\n};\n\nconst PrintButton: FC<{ className?: string }> = ({ className }) => {\n const { print } = useDeckContext();\n return (\n <button\n type=\"button\"\n onClick={() => print()}\n aria-label=\"Print or save deck as PDF\"\n className={[\"theo-slide-deck-print-button\", className].filter(Boolean).join(\" \")}\n >\n Print\n </button>\n );\n};\n\nconst PrintContainer: FC<{ slides: SlideDeckSlide[]; plugins?: SlidePlugin[] }> = ({\n slides,\n plugins,\n}) => {\n return (\n <div\n className=\"theo-slide-deck-print-container\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n visibility: \"hidden\",\n }}\n >\n {slides.map((slide, index) => (\n <div\n key={`print-${slide.id ?? index}`}\n className=\"theo-slide-deck-print-slide\"\n style={{ width: 1280, height: 720 }}\n >\n <Slide\n markdown={slide.markdown}\n plugins={plugins}\n aria-label={`Print slide ${index + 1}`}\n />\n </div>\n ))}\n </div>\n );\n};\n\nconst DefaultDeckLayout: FC = () => {\n return (\n <div\n className=\"theo-slide-deck-default-layout\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr\",\n gridTemplateRows: \"1fr auto\",\n gap: 8,\n height: \"100%\",\n }}\n >\n <SlidesView />\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"4px 8px\",\n flexWrap: \"wrap\",\n }}\n >\n <Controls />\n <ProgressBar />\n <div style={{ display: \"flex\", gap: 4 }}>\n <PresenterButton />\n <FullscreenButton />\n <PrintButton />\n </div>\n </div>\n <SlideNumber />\n <PresenterView />\n </div>\n );\n};\n\ntype SlideDeckComponent = FC<SlideDeckProps> & {\n Slides: FC<{ className?: string }>;\n Controls: typeof Controls;\n ProgressBar: typeof ProgressBar;\n SlideNumber: typeof SlideNumber;\n Thumbnails: typeof Thumbnails;\n PresenterView: typeof PresenterView;\n PresenterButton: FC<{ className?: string }>;\n FullscreenButton: FC<{ className?: string }>;\n PrintButton: FC<{ className?: string }>;\n};\n\nconst SlideDeck = SlideDeckBase as SlideDeckComponent;\nSlideDeck.Slides = SlidesView;\nSlideDeck.Controls = Controls;\nSlideDeck.ProgressBar = ProgressBar;\nSlideDeck.SlideNumber = SlideNumber;\nSlideDeck.Thumbnails = Thumbnails;\nSlideDeck.PresenterView = PresenterView;\nSlideDeck.PresenterButton = PresenterButton;\nSlideDeck.FullscreenButton = FullscreenButton;\nSlideDeck.PrintButton = PrintButton;\n\nexport { SlideDeck };\n","/**\n * Zod schema for `<SlideDeck>` input.\n *\n * Two shapes accepted (ADR D4):\n * - `string` — full markdown, split internally by `splitDeck` (top-level\n * `thematicBreak`, see ADR D3 / D12 of Slide).\n * - `SlideDeckSlide[]` — pre-parsed array (CMS/DB consumers).\n *\n * See `.claude/knowledge-base/plans/slide-deck-composite-plan.md` §16.3.\n */\nimport { z } from \"zod\";\n\nexport const slideDeckSlide = z.object({\n /** Markdown content of this slide. Capped at 50 KB (same as Slide body). */\n markdown: z.string().max(50_000),\n /** Optional id for hash routing (defaults to numeric index, 1-based). */\n id: z\n .string()\n .regex(/^[a-z0-9-]+$/, \"id must be lowercase kebab-case\")\n .max(64)\n .optional(),\n /** Speaker notes (plain text extracted from <!-- notes: ... --> comments). */\n notes: z.string().max(5_000).optional(),\n});\n\n/** Composed input — `slides` prop accepts either form. */\nexport const slideDeckInput = z.union([z.string().max(500_000), z.array(slideDeckSlide).max(500)]);\n\nexport type SlideDeckSlide = z.infer<typeof slideDeckSlide>;\nexport type SlideDeckInput = z.infer<typeof slideDeckInput>;\n\n/** Transition presets. ADR D8. */\nexport const slideDeckTransition = z.enum([\"none\", \"fade\", \"slide\"]);\nexport type SlideDeckTransition = z.infer<typeof slideDeckTransition>;\n"]}
@@ -0,0 +1,88 @@
1
+ @import "./fonts.css";
2
+ @import "./tokens.css";
3
+
4
+ @tailwind base;
5
+ @tailwind components;
6
+ @tailwind utilities;
7
+
8
+ @layer base {
9
+ * {
10
+ border-color: hsl(var(--border));
11
+ }
12
+
13
+ html {
14
+ font-family: var(--font-body);
15
+ -webkit-font-smoothing: antialiased;
16
+ -moz-osx-font-smoothing: grayscale;
17
+ text-rendering: optimizeLegibility;
18
+ }
19
+
20
+ body {
21
+ background-color: hsl(var(--background));
22
+ color: hsl(var(--foreground));
23
+ /* OpenType ligatures globally — Geist's "liga" feature is structural
24
+ * and gives the Vercel-tight glyph combinations. */
25
+ font-feature-settings: "liga" 1, "ss01" 1;
26
+ }
27
+
28
+ /* Display headings inherit theme display font (Geist by default).
29
+ * Per-size tracking is set in tailwind.config.ts; this is the safety net. */
30
+ h1,
31
+ h2,
32
+ h3,
33
+ h4 {
34
+ font-family: var(--font-display);
35
+ font-weight: 600;
36
+ }
37
+
38
+ /* Code surfaces: use the mono token + tabular numerals so columns of
39
+ * numbers line up in tables/logs/metrics. */
40
+ code,
41
+ pre,
42
+ kbd,
43
+ samp {
44
+ font-family: var(--font-mono);
45
+ font-feature-settings: "tnum" 1, "liga" 1;
46
+ }
47
+
48
+ /* Focus ring — violet (signature) */
49
+ :focus-visible {
50
+ outline: 2px solid hsl(var(--ring));
51
+ outline-offset: 2px;
52
+ }
53
+
54
+ /* Selection — soft violet */
55
+ ::selection {
56
+ background-color: hsl(var(--primary) / 0.25);
57
+ color: hsl(var(--foreground));
58
+ }
59
+
60
+ /* Native scrollbar fallback (Violet Forge).
61
+ * Used for native browser scroll on elements that don't wrap in <ScrollArea>.
62
+ * Components that DO use <ScrollArea> hide the native scrollbar via Radix.
63
+ */
64
+ *::-webkit-scrollbar {
65
+ width: 10px;
66
+ height: 10px;
67
+ }
68
+ *::-webkit-scrollbar-track {
69
+ background: transparent;
70
+ }
71
+ *::-webkit-scrollbar-thumb {
72
+ background-color: hsl(var(--primary) / 0.25);
73
+ border: 2px solid transparent;
74
+ background-clip: content-box;
75
+ border-radius: 9999px;
76
+ transition: background-color var(--duration-fast) var(--ease-out-soft);
77
+ }
78
+ *::-webkit-scrollbar-thumb:hover {
79
+ background-color: hsl(var(--primary) / 0.5);
80
+ }
81
+ *::-webkit-scrollbar-thumb:active {
82
+ background-color: hsl(var(--primary) / 0.75);
83
+ }
84
+ * {
85
+ scrollbar-width: thin;
86
+ scrollbar-color: hsl(var(--primary) / 0.3) transparent;
87
+ }
88
+ }
@@ -0,0 +1,137 @@
1
+ /* Theo UI — Tailwind v4 prebuilt entry stylesheet.
2
+ *
3
+ * What ships at `@theokit/ui/styles.css` since RFC 0008 follow-up
4
+ * (`0.5.1-next.0`). Consumer imports this once and the framework's
5
+ * Tailwind v4 build picks up:
6
+ * - `@import "tailwindcss"` — Tailwind v4 core (preflight + utilities)
7
+ * - `@import "./fonts.css"` — self-hosted Geist + Geist Mono @font-face
8
+ * - `@import "./tokens.css"` — runtime `--*` vars (theme cascade target)
9
+ * - `@import "./tokens-v4.css"` — `@theme { --color-*, --text-*, … }`
10
+ * namespace Tailwind v4 reads to emit utilities
11
+ * - `@layer base` — `border-color`, body font, focus ring, scrollbar
12
+ * styling that depend on the runtime vars
13
+ *
14
+ * v3-only consumers (Tailwind 3.x + the shadcn registry preset) should
15
+ * load `@theokit/ui/styles-v3-legacy.css` instead — that file is the
16
+ * unchanged `@tailwind base; @tailwind components; @tailwind utilities`
17
+ * variant. See RFC 0008 follow-up.
18
+ */
19
+
20
+ @import "tailwindcss";
21
+ @import "./fonts.css";
22
+ @import "./tokens.css";
23
+ @import "./tokens-v4.css";
24
+
25
+ @layer base {
26
+ * {
27
+ border-color: hsl(var(--border));
28
+ }
29
+
30
+ /* Tailwind v4 preflight regression compensation —
31
+ * v4 intentionally dropped the `button { cursor: pointer }` rule
32
+ * (https://tailwindcss.com/docs/upgrade-guide#default-button-cursor)
33
+ * so every native <button> renders with the default arrow cursor.
34
+ *
35
+ * Library authors are expected to opt in explicitly per button. The
36
+ * Violet Forge `<Button>` primitive does so (see its CVA). For the
37
+ * dozens of native <button> elements composites render directly,
38
+ * we restore the v3 behavior here — scoped to *interactive* buttons:
39
+ *
40
+ * - `:not(:disabled)` skips the HTML `disabled` attribute path
41
+ * (browser already shows `cursor: default` for disabled, but the
42
+ * rule below stays explicit for clarity).
43
+ * - `:not([aria-disabled="true"])` skips the ARIA-disabled path
44
+ * (where the button stays focusable but acts as no-op).
45
+ *
46
+ * This is an EXPLICIT opt-in by the library author for consumers who
47
+ * imported `@theokit/ui/styles.css` — it does NOT alter Tailwind's
48
+ * global preflight, only this stylesheet's @layer base.
49
+ */
50
+ button:not(:disabled):not([aria-disabled="true"]),
51
+ [role="button"]:not([aria-disabled="true"]) {
52
+ cursor: pointer;
53
+ }
54
+
55
+ html {
56
+ font-family: var(--font-body);
57
+ -webkit-font-smoothing: antialiased;
58
+ -moz-osx-font-smoothing: grayscale;
59
+ text-rendering: optimizeLegibility;
60
+ }
61
+
62
+ body {
63
+ background-color: hsl(var(--background));
64
+ color: hsl(var(--foreground));
65
+ /* OpenType ligatures globally — Geist's "liga" feature is structural
66
+ * and gives the Vercel-tight glyph combinations. */
67
+ font-feature-settings: "liga" 1, "ss01" 1;
68
+ }
69
+
70
+ /* Display headings inherit theme display font (Geist by default).
71
+ * Per-size tracking is set in tokens-v4.css; this is the safety net. */
72
+ h1,
73
+ h2,
74
+ h3,
75
+ h4 {
76
+ font-family: var(--font-display);
77
+ font-weight: 600;
78
+ }
79
+
80
+ /* Code surfaces: use the mono token + tabular numerals so columns of
81
+ * numbers line up in tables/logs/metrics. */
82
+ code,
83
+ pre,
84
+ kbd,
85
+ samp {
86
+ font-family: var(--font-mono);
87
+ font-feature-settings: "tnum" 1, "liga" 1;
88
+ }
89
+
90
+ /* Focus ring — violet (signature) */
91
+ :focus-visible {
92
+ outline: 2px solid hsl(var(--ring));
93
+ outline-offset: 2px;
94
+ }
95
+
96
+ /* Selection — soft violet */
97
+ ::selection {
98
+ background-color: hsl(var(--primary) / 0.25);
99
+ color: hsl(var(--foreground));
100
+ }
101
+
102
+ /* Native scrollbar fallback (Violet Forge).
103
+ * Used for native browser scroll on elements that don't wrap in <ScrollArea>.
104
+ * Components that DO use <ScrollArea> hide the native scrollbar via Radix.
105
+ */
106
+ *::-webkit-scrollbar {
107
+ width: 10px;
108
+ height: 10px;
109
+ }
110
+ *::-webkit-scrollbar-track {
111
+ background: transparent;
112
+ }
113
+ *::-webkit-scrollbar-thumb {
114
+ background-color: hsl(var(--primary) / 0.25);
115
+ border: 2px solid transparent;
116
+ background-clip: content-box;
117
+ border-radius: 9999px;
118
+ transition: background-color var(--duration-fast) var(--ease-out-soft);
119
+ }
120
+ *::-webkit-scrollbar-thumb:hover {
121
+ background-color: hsl(var(--primary) / 0.5);
122
+ }
123
+ *::-webkit-scrollbar-thumb:active {
124
+ background-color: hsl(var(--primary) / 0.75);
125
+ }
126
+ * {
127
+ scrollbar-width: thin;
128
+ scrollbar-color: hsl(var(--primary) / 0.3) transparent;
129
+ }
130
+ }
131
+
132
+ /* RFC 0008 follow-up #2 — pre-compiled utility rules. The bytes here
133
+ * are emitted at build time by `scripts/build-precompiled-css.ts` so
134
+ * consumers do not depend on Tailwind v4 `@source` scanning the
135
+ * library's node_modules tree (which breaks under pnpm symlinks).
136
+ */
137
+ @import "./components.css";
@@ -0,0 +1,187 @@
1
+ /* Theo UI — Tailwind v4 theme aliases.
2
+ *
3
+ * Companion to `tokens.css`. The base file declares the v3-style runtime
4
+ * variables (`--primary`, `--background`, …) that `<ThemeProvider>` and
5
+ * `[data-theme]` cascades mutate at runtime. This file declares the
6
+ * Tailwind v4 `@theme` namespace (`--color-primary`, `--color-background`,
7
+ * …) by aliasing back to those runtime vars via `hsl(var(--*))`.
8
+ *
9
+ * Why two layers:
10
+ * - `<ThemeProvider>` (and the 10 built-in themes) sets `--primary`
11
+ * etc. at runtime — that's the theme switch surface.
12
+ * - Tailwind v4 resolves color utilities exclusively through
13
+ * `--color-*` tokens declared in `@theme`. Without these aliases
14
+ * `bg-primary`, `text-muted-foreground`, `border-border`, etc. emit
15
+ * a className with no matching CSS rule.
16
+ *
17
+ * The indirection (`--color-primary: hsl(var(--primary))`) preserves the
18
+ * runtime theme cascade — browsers resolve `var(--color-primary)` →
19
+ * `hsl(var(--primary))` → current `[data-theme]` value at paint time.
20
+ *
21
+ * See RFC 0008 follow-up.
22
+ */
23
+
24
+ @theme {
25
+ /* Color tokens ------------------------------------------------------ */
26
+ --color-background: hsl(var(--background));
27
+ --color-foreground: hsl(var(--foreground));
28
+
29
+ --color-card: hsl(var(--card));
30
+ --color-card-foreground: hsl(var(--card-foreground));
31
+
32
+ --color-popover: hsl(var(--popover));
33
+ --color-popover-foreground: hsl(var(--popover-foreground));
34
+
35
+ --color-primary: hsl(var(--primary));
36
+ --color-primary-deep: hsl(var(--primary-deep));
37
+ --color-primary-glow: hsl(var(--primary-glow));
38
+ --color-primary-foreground: hsl(var(--primary-foreground));
39
+
40
+ --color-secondary: hsl(var(--secondary));
41
+ --color-secondary-foreground: hsl(var(--secondary-foreground));
42
+
43
+ --color-accent: hsl(var(--accent));
44
+ --color-accent-deep: hsl(var(--accent-deep));
45
+ --color-accent-foreground: hsl(var(--accent-foreground));
46
+
47
+ --color-muted: hsl(var(--muted));
48
+ --color-muted-foreground: hsl(var(--muted-foreground));
49
+
50
+ --color-border: hsl(var(--border));
51
+ --color-input: hsl(var(--input));
52
+ --color-ring: hsl(var(--ring));
53
+
54
+ --color-success: hsl(var(--success));
55
+ --color-success-foreground: hsl(var(--success-foreground));
56
+ --color-warning: hsl(var(--warning));
57
+ --color-warning-foreground: hsl(var(--warning-foreground));
58
+ --color-destructive: hsl(var(--destructive));
59
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
60
+ --color-info: hsl(var(--info));
61
+ --color-info-foreground: hsl(var(--info-foreground));
62
+
63
+ /* Fonts ------------------------------------------------------------- */
64
+ --font-display: var(--font-display);
65
+ --font-sans: var(--font-body);
66
+ --font-mono: var(--font-mono);
67
+
68
+ /* Violet Forge typescale -------------------------------------------- *
69
+ * Compound text utilities: each `--text-{name}` declares the size,
70
+ * with companion `--*--line-height`, `--*--letter-spacing`, and
71
+ * `--*--font-weight` properties Tailwind v4 picks up automatically.
72
+ */
73
+ --text-display-2xl: 64px;
74
+ --text-display-2xl--line-height: 1;
75
+ --text-display-2xl--letter-spacing: -0.0464em;
76
+ --text-display-2xl--font-weight: 600;
77
+
78
+ --text-display-xl: 48px;
79
+ --text-display-xl--line-height: 1.05;
80
+ --text-display-xl--letter-spacing: -0.05em;
81
+ --text-display-xl--font-weight: 600;
82
+
83
+ --text-display-lg: 40px;
84
+ --text-display-lg--line-height: 1.1;
85
+ --text-display-lg--letter-spacing: -0.05em;
86
+ --text-display-lg--font-weight: 600;
87
+
88
+ --text-display-md: 32px;
89
+ --text-display-md--line-height: 1.2;
90
+ --text-display-md--letter-spacing: -0.04em;
91
+ --text-display-md--font-weight: 600;
92
+
93
+ --text-headline: 28px;
94
+ --text-headline--line-height: 1.25;
95
+ --text-headline--letter-spacing: -0.035em;
96
+ --text-headline--font-weight: 600;
97
+
98
+ --text-title-lg: 24px;
99
+ --text-title-lg--line-height: 1.33;
100
+ --text-title-lg--letter-spacing: -0.04em;
101
+ --text-title-lg--font-weight: 600;
102
+
103
+ --text-title-md: 20px;
104
+ --text-title-md--line-height: 1.4;
105
+ --text-title-md--letter-spacing: -0.03em;
106
+ --text-title-md--font-weight: 600;
107
+
108
+ --text-body-lg: 18px;
109
+ --text-body-lg--line-height: 1.56;
110
+ --text-body-lg--letter-spacing: -0.01em;
111
+ --text-body-lg--font-weight: 400;
112
+
113
+ --text-body-md: 14px;
114
+ --text-body-md--line-height: 1.43;
115
+ --text-body-md--letter-spacing: 0;
116
+ --text-body-md--font-weight: 400;
117
+
118
+ --text-body-sm: 13px;
119
+ --text-body-sm--line-height: 1.46;
120
+ --text-body-sm--font-weight: 400;
121
+
122
+ --text-label: 14px;
123
+ --text-label--line-height: 1.43;
124
+ --text-label--font-weight: 500;
125
+
126
+ --text-label-caps: 12px;
127
+ --text-label-caps--line-height: 1.33;
128
+ --text-label-caps--letter-spacing: 0.04em;
129
+ --text-label-caps--font-weight: 500;
130
+
131
+ --text-code-md: 14px;
132
+ --text-code-md--line-height: 1.5;
133
+ --text-code-md--font-weight: 400;
134
+
135
+ --text-code-sm: 13px;
136
+ --text-code-sm--line-height: 1.54;
137
+ --text-code-sm--font-weight: 500;
138
+
139
+ /* Radii — Tailwind v4 reads the value directly (no var indirection). */
140
+ --radius-none: 0px;
141
+ --radius-sm: 4px;
142
+ --radius-md: 6px;
143
+ --radius-lg: 10px;
144
+ --radius-xl: 14px;
145
+ --radius-2xl: 20px;
146
+ --radius-full: 9999px;
147
+
148
+ /* Shadows — alias to tokens.css computed values (which already use
149
+ * `hsl(var(--foreground) / …)` so theme-switch keeps them in step). */
150
+ --shadow-sm: var(--shadow-sm);
151
+ --shadow-md: var(--shadow-md);
152
+ --shadow-lg: var(--shadow-lg);
153
+ --shadow-glow: var(--shadow-glow);
154
+ --shadow-glow-strong: var(--shadow-glow-strong);
155
+
156
+ /* Motion ------------------------------------------------------------ */
157
+ --ease-out-soft: var(--ease-out-soft);
158
+ --ease-snap: var(--ease-snap);
159
+
160
+ /* Animations — declare so `animate-fade-in-up` and `animate-pulse-glow`
161
+ * resolve. Keyframes are declared below (outside @theme — Tailwind v4
162
+ * picks them up via the @keyframes namespace).
163
+ */
164
+ --animate-fade-in-up: fade-in-up var(--duration-base) var(--ease-out-soft) both;
165
+ --animate-pulse-glow: pulse-glow 1.5s var(--ease-in-out) infinite;
166
+ }
167
+
168
+ @keyframes fade-in-up {
169
+ 0% {
170
+ opacity: 0;
171
+ transform: translateY(8px);
172
+ }
173
+ 100% {
174
+ opacity: 1;
175
+ transform: translateY(0);
176
+ }
177
+ }
178
+
179
+ @keyframes pulse-glow {
180
+ 0%,
181
+ 100% {
182
+ box-shadow: 0 0 0 0 hsl(var(--primary) / 0.5);
183
+ }
184
+ 50% {
185
+ box-shadow: 0 0 0 8px hsl(var(--primary) / 0);
186
+ }
187
+ }