@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,1325 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@theokit/ui` are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.13.0] - 2026-05-29
11
+
12
+ **Minor (additive only — zero breaking changes).**
13
+
14
+ Seven new components shipped as Phase 1 of the `theokit-ui-parity` plan
15
+ (`.claude/knowledge-base/plans/theokit-ui-parity-plan.md` v1.1). All seven
16
+ mirror OpenClaw Control UI patterns the framework lacked, designed to be
17
+ composable into any theokit app via `@theokit/ui` barrel.
18
+
19
+ ### Added — Phase 2 component
20
+
21
+ - **`<ChannelCard>`** (primitive, `agent/`) — inbound gateway connection
22
+ surface (Telegram, Discord, Slack, WhatsApp, Webhook, MCP). 4 statuses
23
+ (`disconnected | connecting | connected | error`) with the toggle button
24
+ reflecting the current state: `connected` shows "Disconnect", others show
25
+ "Connect", `connecting` keeps the button disabled (transient state guard).
26
+ Closed `ChannelPlatform` enum prevents silent typos at the backend
27
+ boundary. 7 Vitest tests including vitest-axe. Ladle story with 5
28
+ variants (Connected/Disconnected/Connecting/ErrorState/MCP). Consumed by
29
+ the dogfood-app `/channels` page end-to-end against the
30
+ `server/routes/channels.ts` registry.
31
+
32
+ ### Added — Phase 1 components (44/44 Vitest GREEN)
33
+
34
+ - **`<ThinkingLevelSelector>`** (primitive, `agent/`) — multi-state combobox
35
+ for LLM reasoning budget. Mirrors OpenClaw thinking selector. Values:
36
+ `"inherited" | "off" | "minimal" | "low" | "medium" | "high" | "xhigh"`.
37
+ - **`<RunStatusPill>`** (primitive, `agent/`) — compact status indicator
38
+ for Run/Task lifecycle. 6 states mirror SDK `Task` enum (D362):
39
+ `queued | in_progress | finished | error | cancelled | interrupted`.
40
+ - **`<BranchIndicator>`** (primitive, `agent/`) — small "×N" pill that
41
+ shows when a run was retried/branched. Returns `null` for `< 2` or
42
+ non-integer (EC-10 guard).
43
+ - **`<GatewayStatusIndicator>`** (primitive, `infra/`) — live
44
+ connection-status dot. 4 statuses (online/offline/degraded/reconnecting)
45
+ × 2 variants (compact/labeled) + optional latency text.
46
+ - **`<UpdateBanner>`** (primitive, `infra/`) — top-of-app alert for newer
47
+ version. Dismiss persistence is consumer's responsibility (EC-16).
48
+ - **`<ExportChatDialog>`** (primitive, `agent/`) — modal exporting chat in
49
+ `markdown | json | jsonl | sharegpt`. Async-aware (disables buttons
50
+ during pending export).
51
+ - **`<StabilityBundleViewer>`** (composite, `infra/`) — crash bundle JSON
52
+ inspector. Sections collapse independently. EC-9 absorbed: handles
53
+ missing optional sections gracefully.
54
+
55
+ ### Added — Phase 0 tooling
56
+
57
+ - **`scripts/inventory-components.mjs`** — walks
58
+ `src/components/{primitives,composites}/<name>/` producing
59
+ `component-inventory.json`. CI drift-gate seed.
60
+ - **`scripts/generate-missing-stories.mjs`** — gerador + CI check mode.
61
+ EC-5/D12 absorbed: ships `kebabToPascal(name)` helper with 9 Vitest
62
+ cases + match-confirmation via `export\s+...` regex.
63
+ - **`wrangler.toml` + `.github/workflows/deploy-ladle.yml`** —
64
+ Cloudflare Pages deploy config for the Ladle component catalog.
65
+ Workflow contains `pnpm ladle:build` step BEFORE deploy (EC-14).
66
+ - New package scripts: `inventory`, `stories:check`, `stories:generate`,
67
+ `stories:test`.
68
+
69
+ ### Changed — Build pipeline hardening
70
+
71
+ - **`scripts/regen-subpath-exports.ts`** now delegates to `sync-exports.ts`
72
+ for the final write. Previously the post-build step sorted ALL exports
73
+ alphabetically while `sync-exports.buildExports` produced the canonical
74
+ `BASE → sorted components → ISOLATED` order — meaning `pnpm build &&
75
+ pnpm quality:structure` regressed every time. The validator and the
76
+ build now share a single source of truth.
77
+ - **`scripts/sync-exports.ts`** now post-formats `package.json` via
78
+ `biome format --write` after writing. `JSON.stringify(_, _, 2)` always
79
+ expands short arrays like `sideEffects` and `onlyBuiltDependencies`,
80
+ while `pnpm format:check` (Biome) expects them inline; the two were
81
+ fighting after every sync.
82
+ - **`tailwind.config.ts`** dropped the `satisfies Config` clause. The
83
+ preset (`src/styles/tailwind-preset.ts`) resolves the v4 `Config` type
84
+ via the `src/styles/node_modules/tailwindcss` symlink to v4.3.0, while
85
+ the root config would resolve v3.4.19 — the v3/v4 type seam mismatched
86
+ on `darkMode` (`DarkModeStrategy` vs `Partial<DarkModeConfig>`).
87
+ Runtime correctness is enforced by `pnpm dogfood:v4-zero-config`.
88
+ - **`biome.json`** override extended to cover `scripts/**/*.mjs` so the
89
+ `noConsole` rule does not block tool scripts (it was already exempted
90
+ for `.ts`).
91
+ - **`pin-input.tsx`** — removed stale `// biome-ignore lint/suspicious/noArrayIndexKey`
92
+ comment now flagged as unused suppression.
93
+ - **`export-chat-dialog.tsx` + `run-status-pill.tsx` + `thinking-level-selector.tsx`** —
94
+ added precise `biome-ignore` comments documenting the `a11y/useSemanticElements`
95
+ and `suspicious/noConsole` exceptions, with the reason inline.
96
+
97
+ ### Documentation
98
+
99
+ - 7 new component pages under `theo-opendocs/content/theoui/{agent,infra}/`.
100
+ - New `ChannelCard` page under `theo-opendocs/content/theoui/agent/channel-card.mdx`
101
+ with live preview (`ComponentPreview` + `PropsTable`) deployed to
102
+ `https://channel-card.theo-opendocs.pages.dev/`.
103
+
104
+ ## [0.12.0] - 2026-05-28
105
+
106
+ **Stable release — promoted from `0.12.0-next.0` after dogfood validation + cross-repo contract gates landed.**
107
+
108
+ First `@theokit/ui` release on the npm `latest` tag without a `-next.*` pre-release suffix. Content is the union of everything shipped in `0.12.0-next.0` (2026-05-25) plus the additions below from `[Unreleased]` consolidation. **Zero breaking changes vs `0.12.0-next.0`** — consumers on `^0.12.0-next.0` upgrade transparently.
109
+
110
+ ### Added (dogfood-fixes-and-coverage-expansion T4.1, 2026-05-28)
111
+
112
+ - **`scripts/validate-exports.mjs`** (NEW) — FAANG-grade pre-publish gate com 6 runtime checks: (1) exports['.'] declared, (2) type:module consistency D13, (3) import condition file exists + dynamic import runtime, (4) require condition runtime check (skip se ESM-only), (5) ESM-only intentional notice, (6) TODOS subpath exports validados (não só `.`). Bloqueia `npm publish` se shape OR comportamento regridir.
113
+ - **`prepublishOnly`** hook estendido: `pnpm build && pnpm test:contract && node scripts/validate-exports.mjs`. EC-8 fix do edge case review FAANG-grade.
114
+ - **`validate:exports`** script standalone — pode rodar manual `pnpm validate:exports`.
115
+
116
+ ### Added (cross-repo-integration-coesao, 2026-05-28)
117
+
118
+ - **Contract test mirror** — `tests/contract/theokit-consumer.test.ts` (6 BDD `it()`) validates `dist/vite-plugin.js` shape (default export factory + Plugin/Plugin[] return + `name: string`) and presence of `dist/preset.css`, `dist/styles.css`, `dist/fonts.css`. Roda via novo `pnpm test:contract`. Bloqueia publish via `prepublishOnly: pnpm build && pnpm test:contract`. Cumpre [ADR 0001](docs/adr/0001-vite-plugin-subpath-export-contract.md) (cross-repo contract). Plano coordenador no monorepo theokit-tools: [cross-repo-integration-coesao-plan.md](../.claude/knowledge-base/plans/cross-repo-integration-coesao-plan.md) T1.3.
119
+ - **`vitest.config.ts`** include estendido para cobrir `tests/**/*.{test,spec}.ts` (era só `src/`).
120
+
121
+ ## [0.12.0-next.0] - 2026-05-25
122
+
123
+ Minor (additive, zero breaking change) — ships two LLM-facing artifacts
124
+ that complement the existing `llms.txt`: a structured visual spec
125
+ (`DESIGN.md`) and a companion agent skill (`skills/theo-ui/`).
126
+
127
+ ### Added
128
+
129
+ - **`DESIGN.md` at repo root (NEW)** — plain-text design system spec
130
+ for LLM assistants generating UI against `@theokit/ui`. Follows the
131
+ awesome-design-md 9-section canonical structure (Visual Theme &
132
+ Atmosphere · Color Palette & Roles · Typography Rules · Layout
133
+ Principles · Depth & Elevation · Component Stylings · Responsive
134
+ Behavior · Do's and Don'ts · Agent Prompt Guide). Tokens mirror
135
+ `src/styles/tokens.css` and `src/themes/violet-forge.ts`. Shipped
136
+ via `package.json > files` alongside `llms.txt` and `CHANGELOG.md`
137
+ so consumers see the visual spec at `node_modules/@theokit/ui/DESIGN.md`.
138
+ Reference research lives at
139
+ `.claude/knowledge-base/reference/design-md-convention.md`.
140
+ - **`skills/theo-ui/` companion agent skill (NEW)** — library-aware
141
+ design skill for AI coding assistants (Claude Code, Cursor, Codex,
142
+ OpenCode, Windsurf, Copilot) installable via the `vercel-labs/skills`
143
+ CLI:
144
+
145
+ ```
146
+ npx skills add usetheodev/theo-ui
147
+ ```
148
+
149
+ Four verbs (default build / `audit` / `migrate` / `catalog`), 32
150
+ universal slop-test gates plus surface-specific extensions, pre-emit
151
+ self-critique on six axes (Library-fit · Token-fidelity · Composition ·
152
+ A11y · Restraint · Voice), 12 page archetypes (P1–P12), 5 surfaces
153
+ (agent-chat · cloud-dashboard · settings-form · marketing · auth).
154
+ Project memory at `.theo-ui-skill/log.json`. 30 files, ~9300 lines
155
+ of markdown, ~416 KB. Distributed via the GitHub repo (not the npm
156
+ package). Root README ships Option C in Quickstart pointing
157
+ consumers at the skill.
158
+
159
+ ## [0.11.0-next.0] - 2026-05-25
160
+
161
+ Minor (additive, zero breaking change) — ships Brief #5 from the
162
+ TheoCloud dashboard team, closing 3 measured Deep Review findings.
163
+ Five new components: 3 brief-asks (PinInput, DataTable, PageShell)
164
+ + 2 explicit pre-requisites (DropdownMenu, ActionBar) that the
165
+ brief assumed existed but didn't.
166
+
167
+ Plan: `.claude/knowledge-base/plans/dashboard-primitives-brief-5-plan.md`
168
+ ADR: `.claude/knowledge-base/decisions/page-shell-composite-pattern.md`
169
+ Brief: `theo/docs/handoff/2026-05-25-theo-ui-cloud-dashboard-brief-5.md`
170
+
171
+ ### Added
172
+
173
+ - **`<DropdownMenu>` primitive (NEW, Brief #5 pre-req)** — accessible
174
+ menu built on `@radix-ui/react-dropdown-menu` (already a bundled
175
+ dep, no new peer needed). Sub-components attached via
176
+ `Object.assign`: `Trigger`, `Portal`, `Content`, `Item`,
177
+ `CheckboxItem`, `RadioItem`, `Label`, `Separator`, `Shortcut`,
178
+ `Group`, `Sub`, `SubTrigger`, `SubContent`, `RadioGroup`. Styled
179
+ with `@theokit/ui` design tokens. Consolidates 5 prior direct-
180
+ Radix usages (`model-selector`, `intent-selector`, `agent-profile`,
181
+ `theme-switcher`, `theo-code-shell`) under a single styled
182
+ wrapper. 6 unit tests + 5 Ladle stories. SSR-safe.
183
+ - **`<ActionBar>` primitive (NEW, Brief #5 pre-req)** — page-top
184
+ action strip with three optional slots: search input (flex-1,
185
+ grows to fill), filter icon button, primary action button
186
+ (right-aligned). Returns `null` when no slots are provided.
187
+ Primary action supports `loading` state with `Loader2` spinner.
188
+ Usable standalone or composed inside `<PageShell>`. 6 unit tests
189
+ + 5 Ladle stories.
190
+ - **`<PinInput>` primitive (NEW)** — multi-slot OTP / code input
191
+ with auto-advance focus, paste handling (whitespace stripped),
192
+ arrow-key navigation, backspace clearing + focus back. Default
193
+ 6 slots, configurable. `inputMode="numeric"` (default, triggers
194
+ mobile numeric keyboard via `pattern="[0-9]*"`) or
195
+ `alphanumeric` (auto-uppercase). Optional `mask` renders bullets.
196
+ Optional `error` state applies destructive border. `onComplete`
197
+ fires once on transitions to complete (NOT on mount with pre-
198
+ filled value — verified via test). Closes Deep Review § 2.12 P2
199
+ (Verification page off-brand single-input pattern). 17 unit
200
+ tests + 7 Ladle stories.
201
+ - **`<DataTable>` composite (NEW)** — generic, sortable,
202
+ expandable composite over `<Table>` + `<Pagination>` +
203
+ `<Skeleton>` + `<EmptyState>` + `<DropdownMenu>`. Generic over
204
+ `T` (e.g. `DataTable<Domain>`). Sortable headers (controlled via
205
+ `onSortChange` OR uncontrolled client-side). Sticky header
206
+ (default true). Expandable rows with `expandable(row)` callback
207
+ — multi-row default, opt-in `expandMode="single"`. Row actions
208
+ via `rowActions(row)` opens DropdownMenu. Client-side pagination
209
+ with `pageSize`; sort changes reset to page 0. Loading state
210
+ renders 5 skeleton rows. Empty state delegates to `<EmptyState>`
211
+ or custom `emptyState` prop. Expanded row `colSpan` correctly
212
+ accounts for chevron + actions columns (EC-1 fix). pageSize<=0
213
+ clamps to 1 graceful degradation. Closes Deep Review Top-5
214
+ fix #2, § 2.2 P1, § 2.4 P1 (card-grid → sortable table for
215
+ Domains + Projects). 19 unit tests + 8 Ladle stories.
216
+ - **`<PageShell>` composite (NEW)** — page-level scaffold. Title
217
+ + optional description + optional ActionBar (when search /
218
+ primaryAction / onFilterClick provided), then one of four
219
+ mutually-exclusive content states with strict precedence:
220
+ loading > error > empty > children. Default loading is a
221
+ centered spinner Card; `loadingNode?` escape hatch for custom
222
+ skeletons. Error renders Card with message + optional retry
223
+ button + optional docs link. Empty delegates to `<EmptyState>`.
224
+ `aria-busy="true"` on the `<main>` element while loading. Does
225
+ NOT manage `document.title` (D3 scope-narrowing); consumers
226
+ wire `onTitleChange?` callback to their own hook. Dedupes
227
+ ~20 LOC × 13 dashboard pages of boilerplate. 15 unit tests + 6
228
+ Ladle stories.
229
+
230
+ ### Notes
231
+
232
+ - Edge-case review surfaced 1 MUST FIX (DataTable expanded row
233
+ colSpan miscalculation when rowActions present) + 14 SHOULD TEST
234
+ + 7 DOCUMENT — all incorporated into TDD blocks before
235
+ implementation.
236
+ - D3 scope-narrowing: PageShell does NOT include `useSetPageTitle`
237
+ / `PageMetaProvider` — those are consumer-scope hooks. The
238
+ library exposes only the visible heading + an `onTitleChange?`
239
+ callback for the consumer to wire their own title management.
240
+ - DropdownMenu consolidation is opt-in: the 5 existing direct-
241
+ Radix usages stay untouched in this release; migration is a
242
+ follow-up PR.
243
+ - Zero new peer-deps. `@radix-ui/react-dropdown-menu` was already
244
+ bundled.
245
+
246
+ ### Bundle delta (consumer canary, measured 2026-05-25)
247
+
248
+ Measured against TheoCloud dashboard (no consumer migration to the
249
+ new primitives yet — pure version bump):
250
+
251
+ | Metric | 0.10.0-next.0 | 0.11.0-next.0 | Δ |
252
+ |---|---|---|---|
253
+ | `@theokit/ui` chunk | 10.96 KB brotli | 10.98 KB brotli | **+0.02 KB (+0.2%)** |
254
+ | TOTAL initial JS | 134.68 KB brotli | 135.56 KB brotli | +0.88 KB (+0.6%) |
255
+
256
+ Per-chunk cap (18 KB): passes with 7.02 KB headroom.
257
+ Total hard gate (180 KB): passes with 44.44 KB headroom.
258
+
259
+ The +0.02 KB chunk delta is effectively noise — confirms Brief #4's
260
+ per-component dist + tree-shaking works: 5 new components ship as
261
+ separate chunks and the consumer correctly drops all of them while
262
+ they aren't imported. Post-consumer-migration delta is expected at
263
+ +10-15 KB brotli (Brief #6 follow-up).
264
+
265
+ Evidence:
266
+ `.claude/knowledge-base/baselines/2026-05-26-post-brief-5/theocloud-bundle-delta.txt`
267
+
268
+ ## [0.10.0-next.0] - 2026-05-25
269
+
270
+ Minor (additive, zero breaking change) — fixes a publishing-pipeline
271
+ defect surfaced by the TheoCloud dashboard bundle audit
272
+ (`MEET-ASYNC-AMENDMENT-2026-05-24-002`). Since 0.7.0, the ~100 subpath
273
+ exports declared in `package.json#exports` (`./alert`, `./button`,
274
+ `./table`, …) were **cosmetic** — each pointed at the same
275
+ `./dist/index.js` (the 417 KB barrel). `import { Alert } from
276
+ "@theokit/ui/alert"` resolved byte-identical to
277
+ `import { Alert } from "@theokit/ui"`, and barrel tree-shaking
278
+ failed in consumers because of `forwardRef` side-effect bailouts,
279
+ `Object.assign` compound components, and `sideEffects: ["**/*.css"]`
280
+ conservatism. TheoCloud measured **0 KB dropped** from the 240 KB
281
+ minified barrel regardless of how few exports were used.
282
+
283
+ This release extends the per-component dist pattern that already
284
+ worked for `whiteboard` / `slide` / `slide-deck` to every primitive
285
+ and composite. The barrel `import { X } from "@theokit/ui"` is
286
+ preserved unchanged (additive migration shape, same as `@mui/material`).
287
+
288
+ Plan: `.claude/knowledge-base/plans/subpath-tree-shaking-plan.md`
289
+ ADR: `.claude/knowledge-base/decisions/subpath-exports-per-component.md`
290
+ Brief: `theo/docs/handoff/2026-05-24-theo-ui-subpath-tree-shaking-brief-4.md`
291
+
292
+ ### Changed
293
+
294
+ - **`tsup.config.ts`** auto-globs primitive + composite entries from
295
+ `src/components/{primitives,composites}/<name>/index.ts` at
296
+ config-load time. 87 primitives + 26 composites — 3 excluded
297
+ (`whiteboard`, `slide`, `slide-deck` retain their existing manual
298
+ isolated entries). New components ship subpath-shaped automatically
299
+ without `package.json#exports` hand-maintenance.
300
+ - **`splitting: true`** in tsup now dedupes shared utilities (`cn`,
301
+ forwardRef wrappers, theme helpers, lucide icon imports) into
302
+ `dist/chunk-<hash>.js` instead of inlining into every per-component
303
+ bundle. ~119 shared chunks emitted; barrel + per-component dist
304
+ files re-export from them.
305
+ - **`dts: { entry: ... }`** restricted to the barrel + isolated
306
+ engines only (D5 escalation). Generating per-component `.d.ts` for
307
+ all 114 entries OOMs the rollup-plugin-dts worker thread even with
308
+ `NODE_OPTIONS=--max-old-space-size=8192` (the flag does not
309
+ propagate to workers). Per-component subpaths resolve their `types`
310
+ field at the barrel `dist/index.d.ts` — TypeScript still finds
311
+ `Alert`/`AlertProps` from `import { Alert } from "@theokit/ui/alert"`.
312
+ Trade-off: consumers' typecheck pulls the full type graph regardless
313
+ of subpath, but the JS dist (where tree-shaking matters) is
314
+ per-component and small.
315
+
316
+ ### Added
317
+
318
+ - **`scripts/regen-subpath-exports.ts`** — runs after `tsup` and
319
+ rewrites `package.json#exports` so per-component subpaths point at
320
+ their own dist file. Refuses to write if any non-root entry still
321
+ points at `./dist/index.js` (permanent guard against the cosmetic-
322
+ subpath defect coming back). Verifies that every source-tree
323
+ component has a matching dist entry (EC-2 guard against silent
324
+ partial builds). Wired into `package.json#scripts.build` so
325
+ `pnpm build` produces a consistent `dist/` + `exports` map every
326
+ time.
327
+ - **`scripts/sync-exports.ts`** updated to resolve each component's
328
+ layer (primitives vs composites) via filesystem and emit the
329
+ correct per-component dist path. Stays the source-of-truth for
330
+ the structure gate; `regen-subpath-exports.ts` is the same logic
331
+ applied post-build against the actual dist tree.
332
+
333
+ ### Bundle deltas
334
+
335
+ | File | Before (0.9.0-next.0) | After (0.10.0-next.0) | Δ |
336
+ |---|---|---|---|
337
+ | `dist/index.js` | 417,113 B | 49,018 B | **−88.2%** |
338
+ | `dist/slide/index.js` | 23,825 B | 400 B | −98.3% |
339
+ | `dist/slide-deck/index.js` | 58,413 B | 35,795 B | −38.7% |
340
+ | `dist/components.css` | 89,654 B | 93,069 B | +3.8% (within ±5%) |
341
+ | `dist/styles.css` | 4,720 B | 4,720 B | 0% |
342
+ | **Build time** | 17.72 s | 15.98 s | −10% |
343
+ | **Tarball (`pnpm pack`)** | 1.1 MB | 1.2 MB | +9% |
344
+ | **New per-component dist files** | 0 | 113 | + |
345
+ | **Shared chunks (`dist/chunk-*.js`)** | 0 | 119 | + |
346
+
347
+ The barrel shrank because all component code now lives in shared
348
+ chunks. **Consumer-side bundle delta against TheoCloud dashboard
349
+ (measured 2026-05-25):**
350
+
351
+ | Metric | 0.9.0-next.0 | 0.10.0-next.0 | Δ |
352
+ |---|---|---|---|
353
+ | `@theokit/ui` chunk | 36.96 KB brotli | 10.96 KB brotli | **−26.00 KB (−70.3%)** |
354
+ | TOTAL initial JS | 176.27 KB brotli | 134.68 KB brotli | −41.59 KB (−23.6%) |
355
+
356
+ Per-chunk cap (50 KB): passes with 39 KB headroom (was 13 KB).
357
+ Total hard gate (240 KB): passes with 105 KB headroom (was 64 KB).
358
+
359
+ **Notable:** the savings were realized WITHOUT migrating consumer
360
+ imports to subpath form. The barrel benefits from tree-shaking now
361
+ because `dist/index.js` is structured as a collection of
362
+ per-component re-exports from shared chunks — Vite/Rollup's
363
+ tree-shaker can drop individual chunks per consumer usage. Subpath-
364
+ form migration is expected to yield additional savings on top.
365
+
366
+ Evidence file:
367
+ `.claude/knowledge-base/baselines/2026-05-25-post-subpath/theocloud-bundle-delta.txt`
368
+
369
+ ### Migration (consumer-side, opt-in)
370
+
371
+ ```diff
372
+ - import { Card, Button, Alert } from "@theokit/ui";
373
+ + import { Card } from "@theokit/ui/card";
374
+ + import { Button } from "@theokit/ui/button";
375
+ + import { Alert } from "@theokit/ui/alert";
376
+ ```
377
+
378
+ The barrel import keeps working — migration is gradual, file by
379
+ file. CSS, themes, and isolated engines stay barrel-imported:
380
+ `import { ThemeProvider, violetForge } from "@theokit/ui"`,
381
+ `import "@theokit/ui/styles.css"`.
382
+
383
+ ## [0.9.0-next.0] - 2026-05-23
384
+
385
+ Minor — adds the two deferred primitives revealed by the Brief #3
386
+ review (`Alert` + `Pagination`). Both are additive; zero breaking
387
+ change. The release closes the lower-priority follow-ups left over
388
+ from Briefs #1/#2 — `Alert` replaces the consumer's 27-LOC
389
+ `<VerificationBanner>` composition; `Pagination` is forward-positioned
390
+ for when `<Table>` (0.8) starts paginating Billing / Audit / Team
391
+ data at scale.
392
+
393
+ Plan: filed as Brief #3 in
394
+ `theo/docs/handoff/2026-05-23-theo-ui-cloud-dashboard-gaps-brief-3.md`.
395
+
396
+ ### Added
397
+
398
+ - **`<Alert>` primitive (NEW)** — persistent inline notice. Four
399
+ intents: `info` (Info icon, primary token), `success`
400
+ (CheckCircle2, success), `warning` (TriangleAlert, warning),
401
+ `destructive` (AlertCircle, destructive). Optional `title`,
402
+ `description`, right-aligned `action` slot (consumer-provided
403
+ ReactNode), and `onDismiss` handler (renders an `X` button).
404
+ `destructive` intent renders `role="alert"` (assertive
405
+ announcement); other intents render `role="status"` (polite) —
406
+ matches WAI-ARIA conventions for status messaging. Distinct
407
+ from `Toast` (transient + corner) and `EmptyState` (centered
408
+ card). 13 unit tests + 5 Ladle stories. Brief #3 consumer:
409
+ TheoCloud `<VerificationBanner>` → 3-line `<Alert>`.
410
+ - **`<Pagination>` primitive (NEW)** — accessible page-number
411
+ navigation. Renders `<nav aria-label="Pagination">` with
412
+ first / prev / numbers / next / last buttons + visual ellipses
413
+ when `totalPages` exceeds the visible range. Active page carries
414
+ `aria-current="page"`. Keyboard nav (`ArrowLeft` / `ArrowRight` /
415
+ `Home` / `End`) on the nav element. Configurable `siblingCount`
416
+ (default 1) + optional `showJumpButtons` (default true) +
417
+ `size` (`sm | md`). Returns `null` when `totalPages <= 1`. Also
418
+ exports a pure `computePageRange(currentPage, totalPages,
419
+ siblingCount)` helper for unit-testing the range logic in
420
+ isolation — most pagination bugs live in that function. 21 unit
421
+ tests (6 on `computePageRange` alone) + 6 Ladle stories.
422
+ Forward-positioned for `<Table>` v2 consumers.
423
+
424
+ ## [0.8.0-next.0] - 2026-05-23
425
+
426
+ Minor — adds eight cross-cutting primitives revealed by the systematic
427
+ review of the remaining 11 dashboard pages (Projects, Environments,
428
+ Team, Billing, Domains, Settings, Profile, Login, Register,
429
+ Verification, Recovery, DeviceSuccess) + recurring PaaS UI patterns.
430
+ Each component is used in ≥3 distinct sites in the consumer dashboard.
431
+ 6 are true primitives (Table, StatusDot, CopyButton, Timestamp,
432
+ StatTile, DangerZone); 2 are composites by taxonomy gate
433
+ (ConfirmDialog depends on Dialog/Input/Button; CodeBlock depends on
434
+ CopyButton). Zero breaking change; zero new peer-deps.
435
+
436
+ Plan: `.claude/knowledge-base/plans/dashboard-paas-primitives-2-plan.md`.
437
+ Edge-case review: `.claude/knowledge-base/reviews/edge-cases/dashboard-paas-primitives-2-edge-cases-2026-05-23.md`.
438
+ Consumer brief: `theo/docs/handoff/2026-05-23-theo-ui-cloud-dashboard-gaps-brief-2.md`.
439
+
440
+ ### Added
441
+
442
+ - **`<Table>` primitive (NEW)** — semantic data-table with sub-components
443
+ `Table.Header`, `Table.Body`, `Table.Row`, `Table.Cell`,
444
+ `Table.HeaderCell`. Supports `density` (`default` / `compact` via
445
+ Context), per-cell `align` (`left` / `center` / `right`), `numeric`
446
+ cells (`font-mono tabular-nums`), and sortable header cells
447
+ (`onSort` + `sortDirection` with ChevronUp/ChevronDown affordance
448
+ + `aria-sort`). `sortDirection` without `onSort` is a no-op (header
449
+ stays static); `sortDirection="none"` with `onSort` renders both
450
+ chevrons dimmed (`opacity-30`). 10 unit tests + 4 Ladle stories.
451
+ Brief #2 consumer: TheoCloud dashboard.
452
+ - **`<StatusDot>` primitive (NEW)** — semantic status indicator
453
+ (small colored circle + optional label). Five `status` kinds:
454
+ `live` (success), `building` (warning, auto-pulses), `failed`
455
+ (destructive), `idle` (muted), `warning` (warning, static). Three
456
+ sizes (`xs` 6px / `sm` 8px default / `md` 10px). When neither
457
+ `label` nor `aria-label` is provided, auto-applies
458
+ `aria-label={status}` + emits a dev-only warning (color-only
459
+ status is invisible to screen readers). 12 unit tests + 3 stories.
460
+ Brief #2 consumer: TheoCloud dashboard (7+ sites).
461
+ - **`<CopyButton>` primitive (NEW)** — click-to-copy primitive wrapping
462
+ `navigator.clipboard.writeText`. Icon swap (Copy → Check on success,
463
+ Copy → X on failure), `aria-live="polite"` announcement for screen
464
+ readers, optional `label`, `ghost`/`outline` variants, two sizes,
465
+ `onCopied` callback, configurable `feedbackDuration` (default
466
+ 1500ms). SSR-safe (guards `navigator?.clipboard?.writeText`); HTTP
467
+ non-localhost contexts (where the Clipboard API is undefined) fall
468
+ back to the failed state instead of throwing. Auto-cleans the
469
+ revert timer on unmount; debounces double-clicks. 12 unit tests +
470
+ 4 Ladle stories. Brief #2 consumer: TheoCloud dashboard.
471
+ - **`<Timestamp>` primitive (NEW)** — accessible `<time datetime>`
472
+ element with `relative` (default) / `absolute` / `both` formats.
473
+ Uses zero-dep `Intl.RelativeTimeFormat`. Auto-refreshes via
474
+ `setInterval` (default 60s, `refreshInterval={0}` disables).
475
+ Native `title` HTML attribute carries the absolute time on hover
476
+ (no Tooltip component dependency — keeps Timestamp a true
477
+ primitive). `aria-label` always carries the full date. Invalid
478
+ date renders an empty `<time>` element; invalid locale falls back
479
+ to default with a dev warning. `value` accepts ISO string, Date,
480
+ or **Unix milliseconds** (documented in JSDoc — passing seconds
481
+ renders ~1970). 13 unit tests + 4 Ladle stories. Brief #2
482
+ consumer: TheoCloud dashboard (every dashboard page).
483
+ - **`<StatTile>` primitive (NEW)** — big-number stat tile for
484
+ dashboard summary rows. `value` + `label` + optional `icon` +
485
+ optional `delta` (`{value, trend}` with `trend: "up" | "down" |
486
+ "flat"` driving TrendingUp/TrendingDown/Minus icons and
487
+ success/destructive/muted color). Dual mode (button/div) based on
488
+ `onClick` — same pattern as `AccountMenu`/`ProjectSwitcher`. Value
489
+ uses `font-display tabular-nums whitespace-nowrap`. 7 unit tests
490
+ + 4 Ladle stories. Brief #2 consumer: TheoCloud Overview
491
+ dashboard (3 tiles per page).
492
+ - **`<DangerZone>` primitive (NEW)** — destructive-actions section
493
+ with sub-component `DangerZone.Action`. Red-bordered container
494
+ (`border-destructive/30`) with title bar (default `"Danger Zone"`)
495
+ and action rows. Each row carries `title` + `description` +
496
+ consumer-provided `action` slot (typically a destructive
497
+ `<Button>`). Rows separated by hairline dividers; last row drops
498
+ the bottom border via `last:border-b-0`. Consumer supplies the
499
+ destructive button — DangerZone never imports `<Button>`, keeping
500
+ it a true primitive. 6 unit tests + 3 Ladle stories. Brief #2
501
+ consumer: Settings + Profile + Team + Billing pages.
502
+ - **`<ConfirmDialog>` composite (NEW)** — controlled confirmation
503
+ modal built on `Dialog`. Auto-focuses Cancel on open (deliberate
504
+ — NOT the destructive button). `intent="destructive"` styles the
505
+ confirm button with the destructive variant. `confirmationPhrase`
506
+ enables typed-confirmation guard (case-sensitive, empty string
507
+ treated as no phrase). Pressing Enter in the input triggers
508
+ confirm when matched. Async `onConfirm` shows `Loader2` spinner
509
+ while pending; resolve closes the dialog; reject keeps it open
510
+ so consumers can surface their own error. Phrase input resets
511
+ whenever the dialog closes. 13 unit tests + 4 Ladle stories.
512
+ Composite (depends on Dialog + Button + Input). Brief #2
513
+ consumer: 6+ destructive flows (Settings delete, Team remove,
514
+ Billing cancel, Profile delete, Domains remove, Environments
515
+ delete).
516
+ - **`<CodeBlock>` composite (NEW)** — terminal command / code-snippet
517
+ surface. Pre-rendered code inside a `<pre>` with optional
518
+ `terminal` prefix per line (`"$ "`), optional `caption` (file
519
+ name), and optional inline `<CopyButton>` positioned top-right.
520
+ The CopyButton receives the RAW `code` (without the visual `"$ "`
521
+ prefix) — consumers paste only the executable command. `language`
522
+ prop is reserved for future syntax highlighting (v1 ignored).
523
+ 7 unit tests + 4 Ladle stories. Composite (depends on
524
+ CopyButton). Brief #2 consumer: Overview EmptyState, Projects
525
+ EmptyState, Domains DNS records, API token display, LoginPage
526
+ CLI hint.
527
+
528
+ ### Implementation notes
529
+
530
+ - **Taxonomy gate** classified ConfirmDialog + CodeBlock as composites
531
+ (D2 in the plan). Brief #2 listed all 8 as primitives, but the
532
+ validate-quality-gates.ts script is hard-fail for any
533
+ `primitives/` file that imports another `@theokit/ui` component.
534
+ - **Timestamp uses native `title` HTML attribute** (D3) instead of
535
+ the `<Tooltip>` component, to keep the file a true primitive
536
+ without sibling-primitive imports.
537
+ - **Zero new peer-deps.** Every component uses only `lucide-react`
538
+ + Radix (both already peer) + `cn()`.
539
+ - **Bundle delta** — `dist/index.js` grew from 395763 B to 417113 B
540
+ (+21350 B / +5.4%); `dist/index.d.ts` grew +11808 B / +7.5%. Both
541
+ exceeded the ±5% tolerance by a small margin (8 components ≈ +2.5 KB
542
+ each on average). The baseline was rebaselined in the same release
543
+ (`scripts/baselines/bundle-sizes.json`) — expected and explicit per
544
+ plan D6.
545
+ - 10 SHOULD TEST edge cases from the `/edge-case-plan` review
546
+ incorporated into the TDD blocks (EC-1 through EC-10 — empty
547
+ CopyButton value, unmount during timer, clipboard undefined,
548
+ Table sort direction without onSort, dimmed affordance for
549
+ `none`, StatusDot dev warning, Timestamp Unix seconds vs ms,
550
+ invalid locale fallback, ConfirmDialog empty phrase semantics,
551
+ Enter-to-confirm in phrase input).
552
+
553
+ ## [0.7.0-next.0] - 2026-05-23
554
+
555
+ Minor — adds four PaaS-shape primitives to cover the gaps surfaced by the
556
+ TheoCloud dashboard migration: multi-metric `UsageMeter`, standalone
557
+ `Progress` bar, semantic `PlanBadge`, and sidebar `AccountMenu`. Each
558
+ primitive is a SIBLING of an existing agent-shape primitive — no breaking
559
+ changes, no modifications to current components. The library's
560
+ agent-first positioning (per `PITCH.md`) stays intact; both shapes now
561
+ coexist with TypeScript dispatch by name.
562
+
563
+ Plan: `.claude/knowledge-base/plans/dashboard-paas-primitives-plan.md`.
564
+ Consumer brief: `theo/docs/handoff/2026-05-23-theo-ui-cloud-dashboard-gaps-brief.md`.
565
+
566
+ ### Added
567
+
568
+ - **`<Progress>` primitive (NEW)** — accessible progress bar built on
569
+ `<div role="progressbar">` (not native `<progress>` — Tailwind classes
570
+ style cross-browser reliably). Variants:
571
+ - `intent`: `default` / `success` / `warning` / `destructive`
572
+ - `height`: `h-1` (default) / `h-1.5` / `h-2` / `h-3`
573
+ - `indeterminate`: animated bar with no value (omits `aria-valuenow`,
574
+ sets `aria-busy="true"`)
575
+ Clamping handles `value > max` (clamps to max) + `value < 0` (clamps to
576
+ 0) + `max = 0` (no NaN/Infinity). Respects `prefers-reduced-motion`.
577
+ 14 unit tests + 6 Ladle stories. (#TBD)
578
+ - **`<UsageMeter>` primitive (NEW)** — multi-metric stacked usage card
579
+ for PaaS dashboards. Renders N metrics (data transfer, requests, build
580
+ minutes, seats, …) each with `label + value/max + <Progress>` bar.
581
+ Supports custom per-metric `formatter`, automatic over-quota warning
582
+ (value text gets `text-warning`, `<Progress>` uses `intent="warning"`
583
+ AND clamps the bar at 100%), and a `compact` bars-only mode. PaaS-shape
584
+ sibling of `<CostMeter>` (which stays single-USD-mono for agent token
585
+ spend). 12 unit tests + 4 Ladle stories. (#TBD)
586
+ - **`<PlanBadge>` primitive (NEW)** — semantic pricing-tier badge with 5
587
+ canonical tiers (`free`, `hobby`, `pro`, `team`, `enterprise`) and two
588
+ sizes (`sm`, `md`). Each tier carries distinct color tokens. Consumers
589
+ self-document intent (`plan="hobby"`) instead of mapping a generic
590
+ `<Badge variant="outline">` to colors per app — future rebrand /
591
+ dark-mode tweaks propagate automatically. Default label capitalizes
592
+ the tier; `label` prop overrides. Runtime fallback to `free` styling
593
+ for unknown tier (TypeScript prevents this at compile time). 16 unit
594
+ tests + 2 Ladle stories. (#TBD)
595
+ - **`<AccountMenu>` primitive (NEW)** — sidebar header for PaaS surfaces.
596
+ Avatar + name + (optional) `<PlanBadge>` + (optional) secondary line.
597
+ Dual mode: with `onClick`, renders as `<button>` with trailing
598
+ `ChevronsUpDown` icon; without, renders as a static `<div>` (not
599
+ focusable, no chevron). Avatar handling auto-detects URL vs short
600
+ string (≤2 chars treated as initials) vs undefined (derives initials
601
+ from `name`). PaaS-shape sibling of `<ProjectSwitcher>` (which stays
602
+ workspace+branch+agent-status for code-agent surfaces). 13 unit tests
603
+ + 4 Ladle stories. (#TBD)
604
+
605
+ ### Notes
606
+
607
+ - **No breaking change.** `CostMeter`, `ProgressChecklist`, `Badge`,
608
+ `ProjectSwitcher` are untouched. Consumers on 0.6.x see only new
609
+ exports.
610
+ - **Taxonomy invariant preserved.** `UsageMeter → Progress` and
611
+ `AccountMenu → Avatar + PlanBadge` use relative-path imports
612
+ (`../{slug}/index.js`), not barrel imports, so primitives still have
613
+ zero `@theokit/ui` cross-dependencies per the structural gate.
614
+ - **Bundle delta.** `dist/index.js` grows by ~6 KB (4 primitives + types
615
+ + small imports). Within the ±5% baseline tolerance (rebaselined).
616
+ - **Subpath exports.** `package.json#exports` gains `./usage-meter`,
617
+ `./progress`, `./plan-badge`, `./account-menu` per existing
618
+ convention (auto-synced by `scripts/sync-exports.ts`).
619
+ - **Registry items.** Four new `registry/r/*.json` descriptors ship for
620
+ shadcn-style copy-paste install. `usage-meter` declares `progress` as
621
+ a `registryDependencies`; `account-menu` declares `avatar` +
622
+ `plan-badge`.
623
+
624
+ ## [0.6.3-next.0] - 2026-05-23
625
+
626
+ Patch — eliminate React hydration mismatch in `<ThemeProvider>`. Reported
627
+ by the TheoKit framework team (2026-05-23): every SSR'd app using
628
+ `<ThemeSwitcher>` threw `Hydration failed because the server rendered
629
+ text didn't match the client` on every page reload after a user had
630
+ changed themes, then re-rendered the entire React tree client-side,
631
+ defeating SSR.
632
+
633
+ ### Fixed
634
+
635
+ - **SSR hydration mismatch on `<ThemeProvider>`** — three `useState`
636
+ calls (`themeName`, `mode`, `density`) previously ran their initializer
637
+ on BOTH server (no `window`, returned default) AND client at hydration
638
+ time (with `window`, returned `localStorage.getItem(…)`). The two
639
+ diverged → React threw + discarded the SSR'd tree on every page load.
640
+ Fixed by initializing with the SSR default ALWAYS, then promoting to
641
+ the stored value via a post-mount `useEffect` after hydration. The
642
+ visible-text nodes the React reconciler compares (switcher label,
643
+ `sr-only` announcement, `aria-label`) now match server → client.
644
+ Stored preferences still apply within one render tick of mount;
645
+ `<ThemeScript>` continues to set `data-theme` / `data-mode` /
646
+ `data-density` on `<html>` before React mounts to suppress the
647
+ 1-frame visual flicker. (#TBD)
648
+ - **Persist effect first-mount guard** — a `useRef`-based skip-first
649
+ flag prevents the persist effect from writing the SSR-safe defaults
650
+ to `localStorage` between mount and the post-mount hydration
651
+ setState. Previously, the brief window between commit and the
652
+ hydration effect could clobber the user's stored preference if the
653
+ page closed mid-render. After the first call, every subsequent
654
+ change (user-driven OR hydration-promoted) persists normally. (#TBD)
655
+
656
+ ### Added
657
+
658
+ - **`<ThemeScript defaultDensity>` prop** — the inline `<script>`
659
+ bootstrap now also sets `data-density` on `<html>` from
660
+ `localStorage.getItem(":density")` (or `defaultDensity`, default
661
+ `"comfortable"`) so density-driven layouts have zero FOUC at first
662
+ paint. Mirrors `ThemeProvider`'s `defaultDensity`. (#TBD)
663
+
664
+ ### Notes
665
+
666
+ - Pattern mirrors `next-themes` (Vercel), `MantineProvider`, and
667
+ shadcn/ui's theme scaffold. The 1-frame state-promotion delay is the
668
+ React-canonical price for SSR-safe client-only state. `<ThemeScript>`
669
+ pre-paints the `<html>` attributes so the visible layer doesn't
670
+ flicker.
671
+ - Two new unit tests guard the regression:
672
+ - `does NOT write to localStorage on first mount when nothing changes
673
+ (persist gate)` — verifies the skip-first guard.
674
+ - `writes to localStorage AFTER a user-driven change (persist fires
675
+ post-hydration)` — verifies the gate releases after the first call.
676
+ - Existing `reads initial theme name from localStorage` and `reads
677
+ initial mode from localStorage` tests continue to pass because
678
+ testing-library's `render()` flushes effects synchronously inside
679
+ `act()`, so by the assertion phase the post-mount hydration effect
680
+ has already promoted the stored value.
681
+
682
+ ## [0.6.2-next.0] - 2026-05-23
683
+
684
+ Patch — restore `cursor: pointer` on interactive buttons. Tailwind v4
685
+ intentionally dropped the v3 preflight rule
686
+ (https://tailwindcss.com/docs/upgrade-guide#default-button-cursor) so
687
+ every `<button>` rendered by `Sidebar.Item`, `QuickActionChips`,
688
+ `ChatComposer`, `ContextWindowBar`, `ToolCallCard`, `AgentProfile`,
689
+ `CommandPalette`, etc. was showing the default arrow cursor instead of
690
+ the pointing hand. Visual regression observed in TheoKit
691
+ `examples/full-stack-agent` against `@theokit/ui@0.6.1-next.0`.
692
+
693
+ ### Fixed
694
+
695
+ - **Tailwind v4 preflight regression on `<button>` cursor** — restored
696
+ the v3 `button { cursor: pointer }` behavior via TWO defenses:
697
+ 1. `<Button>` primitive (`src/components/primitives/button/button.tsx`)
698
+ gains `cursor-pointer disabled:cursor-default
699
+ aria-disabled:cursor-default` in its CVA base — explicit per
700
+ Tailwind v4 spec intent.
701
+ 2. `dist/styles.css` `@layer base` adds a scoped preflight rule:
702
+ ```css
703
+ button:not(:disabled):not([aria-disabled="true"]),
704
+ [role="button"]:not([aria-disabled="true"]) {
705
+ cursor: pointer;
706
+ }
707
+ ```
708
+ This covers every native `<button>` the library composites render
709
+ directly (50+ across `Sidebar.Item`, `QuickActionChips`,
710
+ `ChatComposer`, `ToolCallCard`, `CommandPalette`, …) without
711
+ touching their per-component className strings. Disabled and
712
+ `aria-disabled="true"` paths keep `cursor: default` per
713
+ accessibility convention. (#TBD)
714
+
715
+ The fix is opt-in by consumer choice — they imported
716
+ `@theokit/ui/styles.css`. Tailwind v4's global preflight remains
717
+ untouched; only this stylesheet's `@layer base` adds the rule. (#TBD)
718
+
719
+ ### Notes
720
+
721
+ - Verification recipe (matches the TheoKit reproduction):
722
+ ```bash
723
+ # Browser test:
724
+ # 1. cd theokit/examples/full-stack-agent && pnpm dev
725
+ # 2. Hover any Sidebar.Item → cursor MUST visibly change to the
726
+ # pointing-hand icon (not the default arrow).
727
+ #
728
+ # CSS grep test:
729
+ grep -c "button:not(:disabled)" node_modules/@theokit/ui/dist/styles.css
730
+ # MUST return >= 1 (pre-fix: 0)
731
+ ```
732
+
733
+ ## [0.6.1-next.0] - 2026-05-23
734
+
735
+ Patch — pre-compile utility CSS at library build time so consumers see
736
+ every hover / focus / active / data-state variant the library uses,
737
+ regardless of package-manager layout. Fixes a critical regression where
738
+ the entire library rendered flat under pnpm.
739
+
740
+ ### Fixed
741
+
742
+ - **pnpm symlink + Tailwind v4 `@source` bug** — Tailwind v4's
743
+ `tinyglobby`-based scanner does **not** follow symbolic links. Under a
744
+ pnpm install, `node_modules/@theokit/ui` is a symlink to a deep
745
+ `node_modules/.pnpm/@theokit+ui@…/node_modules/@theokit/ui` directory,
746
+ and the consumer-side pattern
747
+ `@source "node_modules/@theokit/ui/dist/**/*.{js,mjs,cjs}"` (the one
748
+ the `vite-plugin` previously emitted via the
749
+ `virtual:@theokit/ui/library-sources.css` virtual module) expanded to
750
+ **zero** matches. Every `hover:bg-muted`, `hover:text-foreground`,
751
+ `data-[state=active]:…` variant the library's 79 primitives + 41
752
+ composites use was therefore never emitted into the consumer's CSS,
753
+ and components rendered flat (no hover feedback, no focus rings, no
754
+ active-tab highlight). The bug affected every modern Node toolchain
755
+ that uses pnpm — Vite ecosystem default, Bun, recent Turborepo
756
+ templates. (#TBD)
757
+
758
+ ### Added
759
+
760
+ - **`dist/components.css` (NEW)** — pre-compiled utility CSS file
761
+ containing the materialized rules for every Tailwind class the
762
+ library's components reference. Generated at library build time by
763
+ `scripts/build-precompiled-css.ts`, which runs `@tailwindcss/cli@^4`
764
+ against `src/styles/components-entry.css` (a curated entry that
765
+ imports `tailwindcss`, the existing `tokens.css` and `tokens-v4.css`
766
+ `@theme` namespace, and declares `@source` globs against the library's
767
+ own `src/` — not `node_modules/`). Size: ~88 KB unminified, ~14 KB
768
+ gzipped. This is the canonical Tailwind v4 library pattern used by
769
+ Radix UI Themes, shadcn/ui pre-compiled, and Mantine v7. (#TBD)
770
+ - **`dist/styles.css` chains `@import "./components.css"`** at the end,
771
+ so a single `@import "@theokit/ui/styles.css"` in the consumer's CSS
772
+ now transitively pulls in every utility the library uses — zero
773
+ filesystem scanning required. Consumer-side `@theme` overrides still
774
+ win via the runtime CSS-var cascade (every utility resolves
775
+ `var(--color-*)` at paint time, not at compile time). (#TBD)
776
+ - **`scripts/dogfood-precompiled-utilities.ts`** — 25 contract checks
777
+ asserting `dist/components.css` ships the required variants
778
+ (`hover:bg-muted`, `hover:text-foreground`, `hover:bg-secondary`,
779
+ `hover:shadow-md`, `hover:underline`, `focus-visible:outline`, every
780
+ base color/typescale token, the radii). Integrated to
781
+ `pnpm quality:gates` so the regression cannot reach npm again. (#TBD)
782
+ - **`@tailwindcss/cli@^4`** added as a devDependency — required for the
783
+ pre-compile pass at library build time. Consumers do NOT need it; the
784
+ utility rules ship as static CSS bytes. (#TBD)
785
+
786
+ ### Changed
787
+
788
+ - **`@theokit/ui/vite-plugin` virtual module** — the
789
+ `virtual:@theokit/ui/library-sources.css` module no longer emits the
790
+ broken `@source "node_modules/@theokit/ui/..."` default globs. It is
791
+ retained for backwards compatibility (TheoKit's earlier integration
792
+ code may still resolve it) but now emits only an explanatory comment
793
+ block when no `contentExtra` option is passed. The plugin's primary
794
+ job remains chaining `@tailwindcss/vite` for the consumer's own
795
+ Tailwind v4 build. (#TBD)
796
+
797
+ ### Notes
798
+
799
+ - Adopted from the canonical Tailwind v4 library pattern documented at
800
+ https://tailwindcss.com/docs/upgrade-guide. Reference implementations
801
+ studied: Radix UI Themes
802
+ (`packages/radix-ui-themes/scripts/build.mjs`), shadcn/ui pre-compiled
803
+ starter, Mantine v7.
804
+ - Verification recipe matching TheoKit's reproduction script:
805
+ ```bash
806
+ grep -c "\.hover\\:bg-muted" node_modules/.pnpm/@theokit+ui@*/node_modules/@theokit/ui/dist/components.css
807
+ # MUST return >= 1 (pre-fix: 0)
808
+ ```
809
+
810
+ ## [0.6.0-next.0] - 2026-05-23
811
+
812
+ Minor — `<ChatMessage>` rewritten on top of the Vercel AI SDK `UIMessage`
813
+ shape with full markdown rendering, syntax-highlighted code blocks, math,
814
+ mermaid diagrams, tool calls, reasoning panels, file/source citations,
815
+ branching navigation, and a streaming-safe markdown preprocess.
816
+
817
+ ### Added
818
+
819
+ - **`<ChatMessage>` v2 (RFC 0009)** — promoted from primitive to composite
820
+ (`src/components/composites/chat-message/`). Two consumption shapes:
821
+ (a) convenience `<ChatMessage message={uiMessage} />` auto-dispatches
822
+ every part to its built-in renderer; (b) composable
823
+ `<ChatMessage.Root from="assistant"><ChatMessage.Content>…</…></…>` for
824
+ full control. Forks structural shell from `vercel/ai-elements`
825
+ (Apache-2.0, see `NOTICE`). Renders 11 part types:
826
+ `text`, `reasoning`, `tool-${name}`, `dynamic-tool`, `file`,
827
+ `reasoning-file`, `source-url`, `source-document`, `step-start`,
828
+ `custom`, `data-${name}`. (#TBD)
829
+ - **Branching navigation** — `<ChatMessageBranch>` + content / selector /
830
+ previous / next / page sub-components for cycling through alternate
831
+ responses on a single turn. (#TBD)
832
+ - **Markdown engine (`src/lib/markdown/`)** — `parseMarkdownToReact()` +
833
+ `parseMarkdownToReactSafe()` build a mdast → hast → React pipeline
834
+ via the existing optional peer-deps (`mdast-util-from-markdown`,
835
+ `mdast-util-gfm`, `mdast-util-to-hast`, `hast-util-sanitize`,
836
+ `hast-util-to-jsx-runtime`). Sanitize schema allows
837
+ `language-*` classes on `<code>`/`<pre>` so syntax highlight survives.
838
+ GFM tables, task lists, strikethrough, autolinks all render. (#TBD)
839
+ - **Streaming-safe preprocessor** — `preprocessStreaming()` auto-closes
840
+ trailing `**bold`, `_italic`, `` `code ``, `[link](url`, `$math$`,
841
+ `$$blockmath$$`, and `` ```fence `` so token-by-token streaming output
842
+ never flashes raw markdown chars. Re-implemented (NOT
843
+ `streamdown`-dep) so we don't take a runtime dependency on a Vercel
844
+ package we compete with. (#TBD)
845
+ - **`<CodeBlock>` + `<InlineCode>` (`src/lib/markdown/`)** — fenced code
846
+ ships Shiki SSR-friendly highlight (lazy `import("shiki")` — peer-dep
847
+ optional, graceful plain-`<pre>` fallback), language label header,
848
+ Copy → Check 2s button per `shadcn.io` AI code-block pattern. Inline
849
+ `<code>` is styled distinct from blocks. (#TBD)
850
+ - **`<MathInline>` + `<MathBlock>`** — lazy-load KaTeX, render to safe
851
+ HTML, fall back to `<code>` / `<pre>` plain when peer-dep missing. (#TBD)
852
+ - **`<MermaidDiagram>`** — lazy-load Mermaid with `securityLevel:
853
+ "strict"`, render to SVG. Failed parse or missing peer falls back to
854
+ a labeled `<pre>` block. (#TBD)
855
+ - **11 Vercel-compat UIMessagePart types** + 10 type guards in
856
+ `src/types/chat.ts` (`UIMessage`, `UIMessagePart`, `TextUIPart`,
857
+ `ReasoningUIPart`, `ToolUIPart`, `DataUIPart`, `FileUIPart`,
858
+ `ReasoningFileUIPart`, `SourceUrlUIPart`, `SourceDocumentUIPart`,
859
+ `StepStartUIPart`, `CustomContentUIPart`, `ProviderMetadata`,
860
+ `ToolInvocationState`, `MessageRole`). Field-for-field compatible
861
+ with `useChat()` from `@ai-sdk/react` — zero-adapter interop. (#TBD)
862
+
863
+ ### Changed
864
+
865
+ - **Taxonomy**: `ChatMessage` moves from `primitives/` → `composites/`.
866
+ Composite layer is the correct home — internal deps on `<Button>`,
867
+ native `<details>`, our `<Card>` patterns. README catalog counts
868
+ adjust automatically via the structure gate (`pnpm sync:readme`). (#TBD)
869
+ - **`registry/chat-message.json`** — descriptor now lists 12 source
870
+ files + 6 lib files, declares `lucide-react` + `safe-href` + `button`
871
+ registry-deps. (#TBD)
872
+
873
+ ### Breaking changes
874
+
875
+ - **`Message` type removed.** `import type { Message } from "@theokit/ui"`
876
+ now fails — use `UIMessage` instead. TypeScript will hint
877
+ `Did you mean 'UIMessage'?`.
878
+ - **`message.content` removed.** Replace every callsite:
879
+
880
+ ```diff
881
+ - { id, role: "user", content: "hello", timestamp: "10:00" }
882
+ + { id, role: "user", parts: [{ type: "text", text: "hello" }] }
883
+ ```
884
+
885
+ Internal callsites already migrated: `agent-stream`,
886
+ `chat-thread.stories`, `theo-code-shell.data`, `task-running.stories`,
887
+ `task-starting.stories`, `task-completed.stories`. For mockup data
888
+ with arbitrary JSX content, use the composable form:
889
+
890
+ ```tsx
891
+ <ChatMessage.Root from="assistant">
892
+ <ChatMessage.Content variant="contained">
893
+ <div>any JSX here</div>
894
+ </ChatMessage.Content>
895
+ </ChatMessage.Root>
896
+ ```
897
+
898
+ - **`message.model` / `message.timestamp` no longer rendered** by
899
+ `<ChatMessage>` — fold them into custom UI under the message body, or
900
+ attach via `metadata?: unknown` (consumer-typed) and read from there.
901
+ - **`./components/primitives/chat-message/`** deleted. Imports must move
902
+ to `./components/composites/chat-message/` (the public `@theokit/ui`
903
+ barrel handles this; only relative imports inside the repo need
904
+ updating).
905
+
906
+ ### Notes
907
+
908
+ - **License attribution**: a `NOTICE` file ships at the package root
909
+ with Apache-2.0 attribution to `vercel/ai-elements` for the
910
+ structural-shell components forked, and to `vercel/ai` for the
911
+ `UIMessage` shape mirrored. Both upstream and TheoUI are Apache-2.0
912
+ — compatible.
913
+ - **Reference clones** of `vercel/ai-elements` and `vercel/ai` live in
914
+ `referencia/` (read-only). Not shipped in the npm tarball (excluded
915
+ via the `files` field).
916
+
917
+ ## [0.5.1-next.0] - 2026-05-22
918
+
919
+ Patch — RFC 0008 follow-up. The 0.5.0-next.0 release declared `tailwindcss@^4`
920
+ as a peer dependency and shipped the `./vite-plugin` + `./preset` subpaths,
921
+ but the actual CSS / token / preset artifacts inside the tarball were still
922
+ Tailwind v3 internally. Result: every TheoKit consumer of 0.5.0-next.0 booted
923
+ with unstyled UI in dev and production — `bg-primary`, `text-muted-foreground`,
924
+ `border-border`, `text-body-sm`, etc. emitted as className strings with no
925
+ matching CSS rule.
926
+
927
+ This release rewrites the three v3-shaped artifacts to v4-native syntax and
928
+ ships a fixture-backed real-build dogfood so the regression cannot recur.
929
+
930
+ ### Changed
931
+
932
+ - **`dist/styles.css` is now Tailwind v4 native.** Uses `@import "tailwindcss"`
933
+ (replaces the v3 `@tailwind base; @tailwind components; @tailwind utilities;`
934
+ trio that Tailwind v4 emits as literal strings, with zero utility generation).
935
+ Imports `tokens.css` (runtime cascade) AND `tokens-v4.css` (`@theme` namespace)
936
+ so consumers' Tailwind v4 build resolves both layers correctly. Same
937
+ `@layer base` content (border-color, body font, focus ring, scrollbar
938
+ styling) as before. (#TBD)
939
+ - **`./preset` subpath is now a CSS file.** Tailwind v4 dropped the v3 JS
940
+ preset format — `theme.extend.colors.{name}` declarations are a no-op for
941
+ v4. The new `dist/preset.css` simply chains `@import "./tokens.css"` and
942
+ `@import "./tokens-v4.css"` so consumers can `@import "@theokit/ui/preset.css"`
943
+ from their own Tailwind v4 entry CSS. (#TBD)
944
+
945
+ ### Added
946
+
947
+ - **`@theokit/ui/tokens-v4.css` (NEW)** — `@theme {}` block declaring 28
948
+ `--color-*` aliases (full color set), 14 `--text-*` typescale tiers
949
+ (Violet Forge — `--text-display-2xl` through `--text-code-sm` with companion
950
+ `--*--line-height`, `--*--letter-spacing`, `--*--font-weight`), 3 `--font-*`
951
+ family tokens, 7 `--radius-*` tiers, 5 `--shadow-*` levels, 3 `--ease-*`
952
+ timings, and 2 `--animate-*` keyframe-bound utilities. Every color alias
953
+ uses `hsl(var(--*))` indirection so `<ThemeProvider>`'s runtime
954
+ `[data-theme]` cascade keeps working — switching themes still recolors
955
+ every utility. (#TBD)
956
+ - **`@theokit/ui/styles-v3-legacy.css` (NEW)** — the previous v3-shaped
957
+ `@tailwind base/components/utilities` entry. Pinned consumers on
958
+ `tailwindcss@^3` who still want a prebuilt stylesheet can import this
959
+ subpath. New code SHOULD use `@theokit/ui/styles.css` (v4) instead.
960
+ - **`@theokit/ui/preset-v3-legacy` (NEW)** — the v3 JS `Partial<Config>`
961
+ preset that previously lived at `./preset`. Renamed so the canonical
962
+ `./preset` subpath can host the v4 CSS preset. v3 consumers update
963
+ imports from `@theokit/ui/preset` to `@theokit/ui/preset-v3-legacy`.
964
+ - **Dogfood scripts** — `pnpm dogfood:v4-zero-config` (shape check, runs in
965
+ `quality:gates`) and `pnpm dogfood:v4-real-build` (end-to-end: packs the
966
+ tarball, installs in a tmp project alongside `@tailwindcss/cli@^4`, runs
967
+ Tailwind v4 against `tests/fixtures/v4-zero-config/`, and grep-asserts the
968
+ expected utility classes appear in the emitted CSS — 12 assertions). The
969
+ real-build dogfood is opt-in (slow, requires network) but catches any
970
+ future regression where v3-shaped artifacts get shipped under a v4 peer
971
+ declaration. (#TBD)
972
+
973
+ ### Notes
974
+
975
+ - **Breaking for any 0.5.0-next.0 consumer.** The `./preset` subpath changed
976
+ from JS (`Partial<Config>` default-export) to CSS file. Code importing
977
+ `import preset from "@theokit/ui/preset"` will break and must migrate to
978
+ `@import "@theokit/ui/preset.css"` in an entry CSS. Blast radius: TheoKit
979
+ (already reverted away from 0.5.x by the time this fix shipped) plus any
980
+ community consumer that adopted 0.5.0-next.0 in the same day — likely zero.
981
+ - The runtime indirection via `hsl(var(--*))` aliases keeps `<ThemeProvider>`
982
+ and every built-in theme (`violet-forge`, `dracula`, `vercel-mono`, etc.)
983
+ working with zero changes — the v4 utilities transparently follow the v3
984
+ cascade.
985
+
986
+ ## [0.5.0-next.0] - 2026-05-22
987
+
988
+ Minor bump — public API gains two subpath exports (`./vite-plugin` and
989
+ `./preset`) so the TheoKit framework's `integrateUseTheoUI()` can
990
+ auto-wire Tailwind v4 for consumers with zero further configuration.
991
+ Zero visual break and no runtime behavior change for existing consumers.
992
+
993
+ ### Added
994
+
995
+ - **`@theokit/ui/vite-plugin` (NEW, RFC 0008)** — Default-export factory
996
+ returning one Vite `Plugin`. The plugin's `config()` hook
997
+ dynamic-imports `@tailwindcss/vite` v4 and chains it into the
998
+ consumer's plugin array when resolvable, and degrades to `console.warn`
999
+ + CSS-only mode (via the pre-built `@theokit/ui/styles.css` subpath)
1000
+ when the peer is not installed. A virtual module
1001
+ `virtual:@theokit/ui/library-sources.css` provides the `@source`
1002
+ directive covering `node_modules/@theokit/ui/dist/**/*.{js,mjs,cjs}`
1003
+ so Tailwind scans the library's published JS for utilities. Plugin
1004
+ name slug: `@theokit/ui/vite-plugin`. Options: `tailwind?: boolean`
1005
+ (default `true`), `contentExtra?: string[]` (extra `@source` globs).
1006
+ (#TBD)
1007
+ - **`@theokit/ui/preset` (NEW, RFC 0008)** — Default-export Tailwind v4
1008
+ `Partial<Config>` mirroring the design tokens in `tokens.css`
1009
+ (colors via `hsl(var(--x) / <alpha-value>)`, font families, the
1010
+ Violet Forge typescale, radii, shadows, animations, motion timing)
1011
+ with `content` paths covering `./node_modules/@theokit/ui/dist/**` and
1012
+ the `tailwindcss-animate` plugin. Consumer usage:
1013
+ `import preset from "@theokit/ui/preset"; export default { presets: [preset] }`.
1014
+ Internally delegates to the existing `src/styles/tailwind-preset.ts` —
1015
+ the v3 shadcn-registry preset and the v4 import preset stay
1016
+ byte-for-byte aligned and impossible to drift. (#TBD)
1017
+ - **`@tailwindcss/vite ^4`, `tailwindcss ^4`, `vite ^6 || ^7` peer-deps
1018
+ (all optional)** — added to `peerDependenciesMeta` so consumers
1019
+ importing `@theokit/ui` standalone (no framework) are not forced into
1020
+ Tailwind v4. Required only when consuming via TheoKit's auto-wire path
1021
+ or the new `./vite-plugin` subpath. (#TBD)
1022
+
1023
+ ### Notes
1024
+
1025
+ - Existing `tailwindcss@^3` consumers continue to work via the shadcn
1026
+ registry preset (`registry/r/tailwind-preset.json`) and the prebuilt
1027
+ `@theokit/ui/styles.css`. The new subpaths are additive — they do not
1028
+ break v3-based setups.
1029
+ - The `vite-plugin` returns ONE `Plugin` object (not `Plugin[]`) per the
1030
+ cross-repo contract with TheoKit's `integrateUseTheoUI()`. The chain
1031
+ to `@tailwindcss/vite` happens via the `config()` hook's `plugins`
1032
+ field — Vite 5+ tightened the TypeScript signature, the runtime still
1033
+ merges plugins as expected.
1034
+
1035
+ ## [0.4.0-next.0] - 2026-05-22
1036
+
1037
+ Minor bump — public API gains 7 new theme exports. Zero visual break for
1038
+ consumers in 0.3.x (default theme remains `violet-forge`).
1039
+
1040
+ ### Added
1041
+
1042
+ - **7 new built-in themes (2026-05-22, RFC 0007)** — `vercelMono`, `githubDark`, `dracula`, `oneDark`, `anthropicStyle`, `openaiStyle`, `linearGlass`. `builtinThemes` grows from 3 to 10 entries. Each ships light + dark mode. Derivative slugs from brand names use suffixes (`-mono`, `-style`, `-glass`) and descriptions include "Inspired by, not affiliated with [Company]" per D1.1 ADR (trademark protection / no false-affiliation). Canonical OSS themes (Dracula, One Dark, GitHub Dark) keep their reusable names. Bundle delta: ~60 KB CSS injection if consumer passes `builtinThemes` (alternative: `themes={[violetForge, dracula]}` for ~12 KB). (#TBD)
1043
+ - **`validateThemeContrast` quality gate (2026-05-22)** — Pure-JS WCAG 2.1 contrast validator in `scripts/lib/wcag-contrast.ts` + gate in `validate-quality-gates.ts`. Iterates 10 themes × 2 modes × 4 high-stakes pairs, enforces 4.5:1 (body) and 3:1 (large/button) thresholds. Runs <50ms. Caught 14 pre-existing AA failures in `violet-forge`, `classic-paper`, `aurora-terminal` accent contrast; `classic-paper` accent darkened from `37 92% 50%` → `37 92% 40%` and `openai-style` dark primary darkened from `155 78% 43%` → `155 78% 30%` to satisfy the gate. (#TBD)
1044
+ - **`scripts/lib/wcag-contrast.ts` + `.test.ts` (NEW)** — Pure functions `parseHsl`, `hslToLuminance`, `contrastRatio`. 9 tests cover edge cases (achromatic, hue overflow, percent stripping — EC-3). (#TBD)
1045
+
1046
+ ## [0.3.0-next.0] - 2026-05-22
1047
+
1048
+ Minor bump — visual defaults realigned to FAANG-modern density baseline
1049
+ (shadcn / Linear / Vercel / Stripe). Public API unchanged; no type/prop
1050
+ signatures touched. Every consumer in 0.2.x will see tighter form controls,
1051
+ smaller body text, and a less-padded Card after upgrading.
1052
+
1053
+ ### Migration from 0.2.x
1054
+
1055
+ If you depended on the prior visual defaults (Button 40px, Card 24px
1056
+ padding, body-md 15px), you have two options:
1057
+
1058
+ 1. **Per-component** — pass explicit `size="lg"` to Button/Input/Select/
1059
+ Textarea/Card. These render the prior dimensions.
1060
+ 2. **Global override** — set `<ThemeProvider defaultDensity="spacious">`
1061
+ at the app root. All form controls bump to 44px globally.
1062
+
1063
+ No code change required if you accept the new defaults. Type-only
1064
+ exports added: `Density`, `DensityContextValue`.
1065
+
1066
+ ### Added
1067
+
1068
+ - **`useDensity()` hook + `data-density` attribute (2026-05-22, RFC 0006)** — Global density override without rewriting `size` props per call site. Three tiers: `compact` (32px), `comfortable` (36px, default), `spacious` (44px). `<ThemeProvider defaultDensity="compact">` at the app root flips the entire surface. Persisted to localStorage. **EC-1 fix**: density implemented via CSS variables on `:root` (`--theo-control-h`, `--theo-control-px`) injected by ThemeProvider, not Tailwind class modifiers. Only the `md` cva variant reads the var; `sm` and `lg` stay hardcoded so explicit `size` prop always overrides density. (#TBD)
1069
+ - **`docs/design-system.md > Density policy` section** — declares default heights per component + WCAG 2.5.8 AA tap-target policy + density override patterns. Closes the style-guide gap (previously implicit in source). (#TBD)
1070
+ - **`playground/density-demo.tsx`** — live preview with 3-way density toggle. Mount via `?view=density` in the Vite playground. (#TBD)
1071
+
1072
+ ### Changed (BREAKING visual default, not API)
1073
+
1074
+ - **Form-control `md` defaults: 40px → 36px** (FAANG-tier modern density). Affects `Button`, `Input`, `Select.Trigger`, `Textarea`. `sm` stays 32px, `lg` recalibrated to 44px. (#TBD)
1075
+ - **`body-md` typescale: 15px → 14px** (shadcn / Vercel Geist / Linear standard). `body-sm` recalibrated 14px → 13px to preserve a distinct tier. `validateDesignSystemFidelity` gate updated atomically with `tailwind-preset.ts`. (#TBD)
1076
+ - **Card `md` padding: 24px → 20px** (`p-6` → `p-5`). `sm` unchanged (`p-3`); `lg` recalibrated 28px → 24px (`p-7` → `p-6`). (#TBD)
1077
+ - **Bundle baseline rebased** for the new defaults (~+700 bytes total — CSS-var class strings + Density type union). Engines (whiteboard / slide / slide-deck) untouched. (#TBD)
1078
+
1079
+ ## [0.2.0-next.0] - 2026-05-20
1080
+
1081
+ Minor bump (not patch) because public API surface grew: new `defineTheme` /
1082
+ `hex` / `rgb` exports plus `size` prop standardized across 9 primitives.
1083
+ All additions are backwards-compatible — `defaultVariants.size = "md"`
1084
+ preserves rendered markup for callers that don't pass `size`.
1085
+
1086
+ ### Added
1087
+ - **`defineTheme(partial)` + `hex()` / `rgb()` helpers (2026-05-20, theming-and-sizes plan, Phase 2)** — Reduzem o atrito de criar tema customizado de "58 cor keys obrigatórias" para "só sobrescreva o que mudar". `defineTheme({ name, light: { primary: hex('#FF5722') } })` merja partial overrides em `violetForge` e retorna um `Theme` completo. `hex('#7C3AED')` e `rgb(124, 58, 237)` retornam HSL string-tuple (`"262 83% 58%"`) drop-in compatível com `ColorScale`. Suporta short hex (#abc), 8-char alpha (alpha descartado), case-insensitive. **EC-3** (last-writer-wins): passar `defineTheme({ name: 'violet-forge', ... })` sobrescreve o built-in, comportamento documentado em teste. **EC-4** (case-insensitive) e **EC-5** (4-char alpha) cobertos por testes. **EC-7** (override só light/dark): nota em JSDoc lembra o consumer que se omitir um modo, ele herda violetForge — pode gerar inconsistência visual intencional. Drop-in: `<ThemeProvider themes={[defineTheme({ name: 'corp' })]}>` funciona sem mudança no provider. (#TBD)
1088
+ - **9 primitives expose `size` prop (2026-05-20, theming-and-sizes plan, Phase 1)** — `Input`, `Badge`, `Toast`, `Checkbox`, `Switch`, `Card`, `FormField`, `Textarea`, `Select.Trigger` agora aceitam `size?: 'sm' | 'md' | 'lg'` (default `md`, backwards-compat preservada). Compounds `Card` e `FormField` propagam size via React Context para os subparts. **EC-1**: `Input` usa `Omit<InputHTMLAttributes<HTMLInputElement>, 'size'>` no extends para evitar conflict com o HTML attribute nativo (`size: number` = text-input columns); type-test garantido via `@ts-expect-error`. **EC-2**: `Select.Trigger` confirmado Radix-button (sem `SelectHTMLAttributes` conflict). Subparts de Card/FormField não aceitam `size` próprio — use `className` para per-subpart tweaks (EC-8 documentado em JSDoc). (#TBD)
1089
+ - **`cn()` ensina tailwind-merge sobre o Violet Forge typescale (2026-05-20)** — `src/lib/cn.ts` substitui `twMerge` direto por `extendTailwindMerge` declarando o `font-size` classGroup com as 16 typescale tokens (`display-2xl`/`display-xl`/`headline`/`title-lg`/`body-md`/`label-caps`/`code-md`/etc.). Sem essa extensão, classes como `text-label` (font-size) e `text-accent` (color) colapsavam ambas no mesmo `text-*` group, e o último vencia — quebrando size+color em CVA variants. (#TBD)
1090
+ - **Registry descriptors for the engine surface (2026-05-19)** — Seven new shadcn-compatible registry items so `docs.usetheo.dev/theoui` and the `npx shadcn add` flow can deliver the engines as copy-paste components: `whiteboard` (14 files under `components/ui/whiteboard/`), `slide` (16 files under `components/ui/slide/`, including 3 CSS theme files), `slide-deck` (19 files under `components/blocks/slide-deck/`), and four Tier 2 plugins — `slide-plugin-shiki`, `slide-plugin-math`, `slide-plugin-mermaid`, `slide-plugin-emoji` — each shipping its own subpath under `components/ui/slide/plugins/<name>/`. Cross-item references resolved via `registryDependencies` (each plugin + slide-deck depend on `slide`). Honest install: dependencies arrays list every static or dynamic peer-dep a copy-paste consumer needs (`roughjs`, `perfect-freehand`, `zod` for whiteboard; the full markdown / mdast / hast stack for slide; `shiki` / `katex` / `mermaid` per plugin). Total: 121 registry items (was 114). (#TBD)
1091
+ - **`scripts/build-registry.ts` strips source ESM extensions on external imports** — `rewriteRegistryImports` now drops `.js` / `.jsx` / `.ts` / `.tsx` from non-relative specifiers (e.g. `roughjs/bin/generator.js` → `roughjs/bin/generator`). Previously only relative imports were normalized; engines that import third-party submodules with the explicit ESM extension (whiteboard does this for `roughjs/bin/*`) would fail `validate-registry`'s `consumer-unsafe extension` gate. Limited to known source extensions so basenames that happen to end in `.js` inside URLs are untouched. (#TBD)
1092
+ - **`scripts/validate-quality-gates.ts > validateRegistryStoriesAndTests` is entry-aware** — When a descriptor lists multiple files (engines like whiteboard / slide / slide-deck), the gate now only checks `<descriptor.name>.test.tsx` / `.stories.tsx` next to the entry file (`<name>.tsx` or `<name>.ts`), not every internal module. Internal helpers carry their own focused tests but don't need a story sibling. Single-file registry items are unaffected. (#TBD)
1093
+
1094
+ ## [0.1.0-next.1] - 2026-05-19
1095
+
1096
+ ### Added
1097
+ - **Slide rich content — Tier 1 baked-in + Tier 2 plugin system (2026-05-19, RFC 0004)** — Estende `<Slide>` (RFC 0002) e `<SlideDeck>` (RFC 0003) com conteúdo rico nível PowerPoint sem reinventar parsers. **Tier 1 (zero peer-deps novas):** (a) GFM alerts `> [!NOTE/TIP/IMPORTANT/WARNING/CAUTION]` detectados em mdast post-process (alerts.ts) → `<aside class="theo-slide-alert" data-theo-slide-alert-type>` temado em ambos os themes (default + violet-forge); (b) 7 layouts via frontmatter `layout` (`default`, `title`, `two-column`, `image-right`, `image-left`, `code-output`, `section`) em CSS grid templates (themes/layouts.css importado pelos dois themes); (c) backgroundImage + backgroundGradient com `sanitizeBgUrl` rejeitando `javascript:`/`vbscript:`/TODO data: URLs (EC-7), cap 500_000 chars; (d) Marpit `![bg](url)` syntax extraído em mdast walker → `ParsedSlide.extractedBackground = { url, modifier }` (D18/EC-5), sanitizado antes de armazenar com fallback `MARPIT_BG_UNSAFE_URL`, modifier-aware (`cover`/`fit`/`left`/`right`); (e) header/footer/paginate overlays via frontmatter (plain text ≤200 chars cada), CSS absolute positioned. **Tier 2 (opt-in plugin system):** plugin architecture com `<Slide plugins={SlidePlugin[]}>` e relay `<SlideDeck plugins>` para cada slide interno. `SlidePlugin` shape: `{ name, mdastTransform?, hastTransform?, components?, sanitizeSchemaExtension? }` com error isolation D16 (cada chamada em try/catch, throws agregadas em `errors[]` com `code: "PLUGIN_ERROR"`; pipeline **nunca** propaga exception) e sanitize-schema merge D17 (extensions unionadas com defaultSchema + Tier 1 baseline). Quatro plugins shipados em sub-subpaths `@theokit/ui/slide/plugins/{shiki,math,mermaid,emoji}`: **shikiPlugin** (peer-dep `shiki`; lazy + singleton highlighter; pre-renderiza `<pre><code class="language-XXX">` em HTML temado dual-theme com sanitize ext `<span> style/className`); **mathPlugin** (peer-deps `katex` + `hast-util-from-html`; substitui `$inline$` + `$$block$$` por KaTeX displayMode/inline; skip em `<code>`/`<pre>`; sanitize ext com lista completa de ≥30 tags MathML — `math`, `mfrac`, `msqrt`, `msup`, `msub`, `msubsup`, `munder`, `mover`, `mtable`, `mtr`, `mtd`, `mphantom`, `mstyle`, `annotation`, etc. — EC-4); **mermaidPlugin** (peer-dep `mermaid`; converte `<pre><code class="language-mermaid">` em `<theo-mermaid source>` com React `<MermaidDiagram>` que lazy-importa mermaid e injeta SVG via innerHTML; SSR placeholder distinguível de erro com `role="img"` + source code preservado, EC-10; sanitize ext com ≥30 tags SVG — `svg`, `g`, `path`, `rect`, `circle`, `text`, `marker`, `foreignObject`, etc. — EC-4); **emojiPlugin** (zero peer-deps de runtime, usa `unist-util-visit-parents` já no stack; 100 shortcodes Unicode embedded; **EC-6: ancestor check** via `isInsideCodeOrPre` skipa replace dentro de `<code>`/`<pre>` para preservar type hints Python / YAML keys / Ruby symbols). Pipeline order: `validateSlide → parseBody → detectAlerts (Tier 1) → extractMarpitBackgrounds (Tier 1) → plugin.mdastTransform[] → mdastToHast → plugin.hastTransform[] → sanitize(defaultSchema + extensions) → hastToReact (consumer + plugin components)`. Bundle isolation invariant preservada: barrel `dist/index.js` **inalterado**; cada plugin é entry tsup próprio com peer-deps externalizados. `scripts/sync-exports.ts` ganha 4 entries em `ISOLATED_SUBPATHS`. `package.json` ganha 9 peer-deps opcionais (`shiki`, `katex`, `mermaid`, `micromark-extension-math`, `mdast-util-math`, `hast-util-from-html`, `unist-util-visit`, `unist-util-visit-parents`). RFC `docs/rfcs/0004-slide-rich-content.md` status `Implemented`. **128 testes novos** distribuídos em 13 phases (T0.1 plugin contract: 13 testes; T0.2 parseSlide integration: 11 testes; T1.1 alerts: 8 testes; T2/T3/T5 schema: 25 testes; T4.1 Marpit bg: 9 testes; T6.1 Shiki: 6 testes; T7.1 Math: 7 testes; T8.1 Mermaid: 7 testes; T9.1 Emoji: 10 testes; Slide component: 32 testes). Suite total: 1174 testes verdes. Codes de erro novos: `PLUGIN_ERROR`, `PLUGIN_PEER_DEP_MISSING`, `MARPIT_BG_UNSAFE_URL`. (#TBD)
1098
+ - **SlideDeck composite engine — multi-slide deck w/ navigation, presenter, fullscreen, PDF (2026-05-19)** — `@theokit/ui/slide-deck` agora orquestra N `<Slide>` primitives com navegação completa: keyboard (←/→/Space/Home/End/Esc/F/N/Ctrl+P, com guard contra inputs/contentEditable), touch swipe (Pointer Events nativos, multi-touch filtrado, pointercancel limpo — EC-6/EC-7), hash routing bidirectional (`#/N` 1-based, via `history.replaceState` para evitar loop — EC-10), lazy initializer SSR-safe (D17/EC-5). Sub-componentes em namespace dot: `<SlideDeck.Slides>` `<SlideDeck.Controls>` `<SlideDeck.ProgressBar>` `<SlideDeck.SlideNumber>` `<SlideDeck.Thumbnails>` (IntersectionObserver lazy + EC-13 fallback) `<SlideDeck.PresenterView>` (inline panel com timer + speaker notes) `<SlideDeck.FullscreenButton>` (cross-browser API + EC-8 iOS guard) `<SlideDeck.PrintButton>` (window.print + `@page` CSS, afterprint cleanup). Transitions CSS-only (`none`/`fade`/`slide`) com timeout fallback 300ms (D16/EC-3) e respeito a `prefers-reduced-motion`. Progressive fragments via Marpit-style `*` lists (D12, contagem por regex anti-falsos-positivos em `**bold**` ou fenced code). Speaker notes via `<!-- notes: ... -->` HTML comments (D11). Aceita `slides: string | SlideDeckSlide[]` (D4); split string via mdast `thematicBreak` reusando algoritmo do Slide D12 + strip global frontmatter primeiro (D15/EC-1 — evita phantom empty slide). `useReducer` state machine com `UPDATE_TOTAL_SLIDES` que clampa `currentIndex` (EC-4). Zero peer-deps novas — reusa as 7 do Slide. Bundle isolado em `dist/slide-deck/index.js` (~48 KB com Slide vendored); barrel principal `dist/index.js` **inalterado**. RFC `docs/rfcs/0003-slide-deck.md` status `Implemented`. 160 testes específicos do SlideDeck verdes. Stories Ladle: `DefaultDeck`, `WithGfmTable`, `WithSpeakerNotes`, `WithFragments`, `WithFadeTransition`, `WithSlideTransition`, `HashRouting`, `HeadlessLayout`, `WithThumbnails`, `PresenterModeOn`, `LargeDeck` (50 slides), `EmptyDeck`, `SingleSlideDeck`, `ControlledNavigation`. (#TBD)
1099
+ - **Slide engine — view-only primitive funcional (2026-05-19)** — `@theokit/ui/slide` agora renderiza markdown + frontmatter YAML como surface temada com canvas lógico fixo (default 16:9 → 1280×720), espelhando o padrão de bundle isolado entregue pelo Whiteboard. Pipeline: `validateSlide` (async — D11) → `parseBody` (micromark + GFM) → `mdastToHast` (`allowDangerousHtml: false`) → `sanitizeHast` (`defaultSchema` sem extensões — D8, com diff de tag-count que emite `BANNED_TAG` — D13) → `hastToReact` (real React VDOM via `hast-util-to-jsx-runtime` — D9, **sem `dangerouslySetInnerHTML`**). Frontmatter YAML único (sem HTML comment syntax do Marpit — D4), validado com Zod `.strict()` (4 keys aceitos: `theme`, `lang`, `color`, `backgroundColor`). Multi-slide input (top-level `---` detectado via mdast `thematicBreak` — D12, sem false-positive em fenced code blocks) emite `MULTIPLE_SLIDES` e renderiza somente o primeiro slide. Input guards (D14): BOM strip, `aspectRatio` inválido → fallback 16:9 + `INVALID_ASPECT_RATIO`, raw frontmatter > 10 KB → `FRONTMATTER_TOO_LARGE`. Container fit (D7) via `useSlideFit` hook (algoritmo Reveal.js: `scale = clamp(min(W/cw, H/ch), minScale, maxScale)` em `ResizeObserver` callback). Dois temas built-in (`default`, `violet-forge`) via CSS variables `--theo-slide-*` layered sobre Violet Forge tokens, com `light-dark()` para dark mode automático. A11y: `<section role="region" aria-roledescription="slide" aria-label>`. Race-resistant re-parse via `versionRef` counter (EC-7). 7 markdown peer-deps são **opcionais**: `mdast-util-from-markdown`, `mdast-util-gfm`, `micromark-extension-gfm`, `mdast-util-to-hast`, `hast-util-sanitize`, `hast-util-to-jsx-runtime`, `yaml`. Bundle isolado em `dist/slide/index.js`; barrel principal `dist/index.js` **inalterado**. RFC `docs/rfcs/0002-slide.md` status `Implemented`. 12 Ladle stories: `HappyPath`, `GfmTable`, `WithFrontmatter`, `VioletForgeTheme`, `AspectFourByThree`, `MultiSlideTruncated`, `MalformedFrontmatter`, `BannedScript`, `LongContent`, `CustomComponents`, `SmallContainer`, `LargeContainer`. (#TBD)
1100
+ - **Whiteboard engine — view-only primitive funcional (2026-05-18)** — `@theokit/ui/whiteboard` agora renderiza JSON declarativo (`WhiteboardData`) como SVG com estética hand-drawn estilo Excalidraw. **Sete tipos** de elemento suportados: `rect`, `ellipse`, `diamond`, `line`, `arrow`, `text`, `freedraw`. **Pan + zoom built-in** via `viewBox` (wheel = zoom-to-cursor, mouse drag = pan, Space = hand mode, pinch touch supported). **Prop `fitOnLoad`** centra automaticamente os elementos na viewport. Schema Zod com clamps de sanidade (EC-3 `.finite()` rejeita NaN/Infinity; EC-4 `.max(20000)` em dimensões; `.max(500)` em labels; `.max(5000)` em text e points/elements). `<Whiteboard>` valida JSON em `useMemo`, dispara `onValidationError` em `useEffect` (EC-6 — nunca durante render), e cai em SVG vazio com `data-whiteboard-state="invalid"` quando o JSON falha. SSR-safe (`renderToString` produz markup estático correto). `roughjs` + `perfect-freehand` são peer-deps **opcionais**; `zod` entra em `dependencies` regulares (EC-5 opção A). Bundle isolado em `dist/whiteboard/index.js` (21.53KB ESM); barrel principal `dist/index.js` **inalterado** (320.41KB). RFC `docs/rfcs/0001-whiteboard.md` status `Implemented`. 86 testes específicos do Whiteboard verdes + 776 testes totais do projeto. Stories Ladle: `Empty`, `Flowchart`, `Architecture`, `FreedrawSketch`, `MixedAll`, `InvalidJSON`. (#TBD)
1101
+ - **`scripts/validate-bundle-size.ts` ganha gate EC-1 anti-leak** — Após o check de tamanho, faz `grep` em `dist/index.js` por strings `roughjs` e `perfect-freehand`; falha o build se qualquer engine peer-dep aparecer no barrel. Previne regressões silenciosas onde uma engine vaze para o barrel principal e arraste KBs extras para todos os consumers, mesmo os que só usam shadcn primitives. Runtime-metric proof: `grep -c "roughjs\\|perfect-freehand" dist/index.js → 0` confirmado em 2026-05-18. (#TBD)
1102
+ - **`scripts/sync-exports.ts` ganha `ISOLATED_SUBPATHS`** — novo array de overrides para subpaths que devem apontar para `dist/<engine>/index.js` próprio, não re-export do barrel. Detecta colisão com auto-scanned subpaths e lança Error explícito. Suporta a regra de bundle isolation por engine declarada em `CLAUDE.md > Roadmap`. Cobertura via novo `scripts/sync-exports.test.ts` (6 testes). (#TBD)
1103
+ - **`tsup.config.ts` ganha multi-entry** — `entry` agora é objeto com `index` (barrel) + `whiteboard/index` (engine). External list inclui `roughjs`, `/^roughjs\//` e `perfect-freehand` para garantir que o engine bundle não vendoriza essas libs e o barrel não vaza. Build produz `dist/whiteboard/index.{js,d.ts}` ao lado de `dist/index.{js,d.ts}` sem afetar tamanho do barrel. (#TBD)
1104
+ - **`zod@4.4.3` em `dependencies`** + `roughjs ^4.6.0` / `perfect-freehand ^1.2.0` em `peerDependencies` com `peerDependenciesMeta.optional=true` — engine peer-deps são opt-in para o consumer que não importa o subpath; Zod é runtime dep regular para garantir que validação não crashe (decisão EC-5 opção A documentada em `.claude/knowledge-base/reviews/edge-cases/whiteboard-view-primitive-edge-cases-2026-05-18.md`). (#TBD)
1105
+
1106
+ - **Roadmap formalized (2026-05-18)** — 4 future engines / composites explicitly in scope: `Whiteboard` (Excalidraw-like primitive), `Slide` (Marp-like primitive), `SlideDeck` (composite that orchestrates `Slide` primitives), `Diagram` (Mermaid-like primitive). Each is Explorer (RFC) status, multi-quarter effort, will land via individual RFCs running the full quality-gate chain. Documented in `README.md` (`## Roadmap`) and `CLAUDE.md` (`## Roadmap (formalized 2026-05-18)`) with rules in force per engine: don't reinvent algorithmic cores (markdown / DSL parsing, graph layout, freedraw rendering use mature OSS deps), bundle isolation via subpath import (not main barrel), YAGNI gate (no engine ships without a documented consumer), Apache-2.0 compatible deps only. No version commitment — not on the 0.1 / 1.0 line.
1107
+
1108
+ ## [0.1.0-next.0] - 2026-05-16
1109
+
1110
+ First public pre-release on npm under the `next` dist-tag. Install with
1111
+ `pnpm add @theokit/ui@next` (the default `latest` tag is intentionally
1112
+ unset until 1.0). Highlights from the agent-team-audit-fixes-2026-05-16
1113
+ remediation sprint:
1114
+
1115
+ - New `<TheoUIProvider>` primary entry point (T2.1).
1116
+ - `<ThemeProvider>` decoupled from `violetForge` (T2.5, **breaking** —
1117
+ see migration below).
1118
+ - CSS injection allowlist + `safeHref` URL guard (T3.2 / T3.3).
1119
+ - LiveRegionContext universal — eliminates double aria-live
1120
+ announcements across 9 components (T4.1, MF-4).
1121
+ - React 19 compatibility verified in CI (T6.3); `onToggle` clash with
1122
+ the new `ToggleEventHandler` resolved in 6 components.
1123
+ - New composite-to-composite cycle detection gate (re-audit NEW-C).
1124
+ - happy-dom 16 → 20 (closes CVE-2025-61927 in test env; T3.1).
1125
+ - Postcss override + tailwindcss-animate moved to deps (T6.1 / T6.4).
1126
+ - ScrollBar standalone removed in favor of `ScrollArea.Bar` (T7.4).
1127
+
1128
+ ### Changed (BREAKING, 2026-05-16) — T2.5 ThemeProvider decouple
1129
+ - **`<ThemeProvider>` now requires the `themes` prop.** Previously, the prop was optional and ThemeProvider auto-included `violet-forge` regardless. Since the source no longer top-level imports `violetForge`, the runtime now throws a helpful error if `themes` is missing or empty. This decouples consumer bundle size from the built-in theme set: consumers passing only custom themes no longer ship `violetForge.ts` (~6 KB savings).
1130
+ - **Migration**:
1131
+ ```tsx
1132
+ // Before
1133
+ import { ThemeProvider } from "@theokit/ui";
1134
+ <ThemeProvider>...</ThemeProvider>
1135
+
1136
+ // After — option A (recommended for parity with old behavior)
1137
+ import { ThemeProvider, builtinThemes } from "@theokit/ui";
1138
+ <ThemeProvider themes={builtinThemes}>...</ThemeProvider>
1139
+
1140
+ // After — option B (new in v0.1.0-next.0)
1141
+ import { TheoUIProvider } from "@theokit/ui";
1142
+ <TheoUIProvider>...</TheoUIProvider>
1143
+ ```
1144
+ - **Why this is acceptable pre-1.0**: package is `0.0.0` and never published; first public release will be `0.1.0-next.0`. No external consumers exist yet (validated via `npm view`).
1145
+
1146
+ ### Added (Agent-team audit fixes, 2026-05-16)
1147
+ - **`<TheoUIProvider>` (T2.1)** — primary entry point composing `<ThemeProvider>` + `<Toaster>` with sensible defaults (`themes={builtinThemes}`). Recommended for new consumer apps; preserves "works out of the box" DX while keeping explicit primitives (`ThemeProvider`, `Toaster`) available for bespoke setups.
1148
+ - **`registry/index.json#metadata.requires.tsconfigPathAlias` (T2.3)** — explicit declaration of the `@/` path alias precondition required by the copy-paste install path. New `validateApiCompatibility` gate fails if the field is missing.
1149
+
1150
+ ### Changed (Agent-team audit fixes, 2026-05-16)
1151
+ - **`src/index.ts` barrel reorganized (T2.4)** — 8 composites (`SkillsList`, `SkillEditor`, `RuleEditor`, `CronJobsList`, `MCPServerList`, `AgentEditor`, `ApprovalCard`) moved from the `// PRIMITIVES` editorial section to a dedicated subsection under `// COMPOSITES`. No name changes, no type changes, `package.json#exports` unchanged. Quality gate of taxonomy already enforces the rule mechanically; this aligns the human signal.
1152
+ - **`docs/architecture.md` + `README.md`** — added subsection "Subpath exports — convenience aliases, not code splitting" (T2.2) explaining that all 99 subpath entries resolve to the same `dist/index.js`, tree-shaking is what shrinks bundles, and `tsup splitting: false` is deliberate.
1153
+ - **`scripts/validate-registry.ts`** — `targetToItemName` reverse map resolves `@/components/ui/<target>` imports to the registry item that ships that file (fix for multi-file items like `toast` which ships `toaster.tsx`).
1154
+
1155
+ ### Documentation (Agent-team audit fixes, 2026-05-16)
1156
+ - **`PITCH.md`** — removed false claim that `npx create-theokit my-app` already imports `@theokit/ui` when picking the dashboard template (verified via `grep -r "@theokit/ui" /home/paulo/Projetos/usetheo/theokit/` returning zero matches). Replaced with honest "TheoKit integration is on the roadmap." Aligned tertiary CTAs with reality (substituted dead `docs.usetheo.dev/ui` with GitHub anchor).
1157
+ - **`README.md`** — updated `pnpm quality:gates` pipeline listing to match `package.json#scripts['quality:gates']` exactly: now lists 11 gates (`format:check` → `lint:ci` → `typecheck` → `test` → `build` → `registry:build` → `registry:validate` → `quality:structure` → `quality:bundle` → `quality:a11y` → `ladle:build`). Previous text omitted `quality:bundle` and `quality:a11y`.
1158
+ - **CHANGELOG correction** — earlier entry under "Phase 3 — Build correctness + exports surface" stated `validateExportsMap` "locks `package.json#exports` to the canonical 5-entry set". Since commit `77b2f7a` (`feat(exports): subpath import for every component`) the strategy expanded to 107+ subpath entries generated by `scripts/sync-exports.ts`. Authoritative source is `package.json` itself. Prior entries in versioned releases stay immutable per Keep a Changelog; this correction lives in `[Unreleased]`.
1159
+
1160
+ ### Added (Pitch + Voice and Tone formalization, 2026-05-15)
1161
+ - **`PITCH.md`** at project root — landing-page copy for `@theokit/ui` (Violet Forge) using the TheoKit aspirational voice. Three layers: HERO (no jargon), BODY (benefit-first with one technical anchor per item), DEEP DIVE (full technical vocabulary, after the `## How it works` delimiter). Companion to `README.md` for marketing surfaces; verified component counts and quality metrics against `README.md` and `src/`.
1162
+ - **`CLAUDE.md`** at project root — contract between Claude and this project. Defines what TheoUI is, the locked names (npm package, theme names, registry endpoint, module format, component taxonomy), the Voice and Tone section that formalizes adoption of the TheoKit aspirational voice for public copy (strategic review dated 2026-05-15), the relationship to the other usetheo pillars (Harness, Skills, Runtime), and the quality-gate non-bypass rule.
1163
+
1164
+ ### Changed (Cross-project, 2026-05-15)
1165
+ - Root monorepo `CLAUDE.md` (`../CLAUDE.md`) `## Voice and Tone — sub-project scoped` section: TheoUI moved from the "technical-direct only" list to the aspirational-voice list, alongside TheoKit and TheoKit-SDK. Rationale captured inline (TheoUI is the visual surface every other product inherits from; benefits from outcome-shaped framing on landing copy).
1166
+ - Root monorepo sub-project index: `theo-ui` "Read first" pointer updated from `theo-ui/README.md` to `theo-ui/CLAUDE.md` (was a fallback because no `CLAUDE.md` existed in this project until today).
1167
+
1168
+ ### Changed (README alignment with PITCH, 2026-05-15)
1169
+ - `README.md` HERO + BODY layers rewritten in the TheoKit aspirational voice to match `PITCH.md`. New h1: *"The UI your agent already needs."* Tagline calls out the 102 agent-shaped components. `@theokit/ui` demoted from h1 to a small tag above it (discoverability preserved without dominating the HERO).
1170
+ - Added `## The shift` storytelling block between the HERO and `## Why @theokit/ui`.
1171
+ - `## Why @theokit/ui` now closes with the comparison table from `PITCH.md` (`@theokit/ui` vs shadcn/Radix, Tremor, build-yourself) and the punch line *"Same Radix UI underneath as shadcn — no philosophy fight. We just shipped the next 102 components you were about to write."*
1172
+ - Added `## What you'd build` (5 concrete surfaces) before `## Quickstart`.
1173
+ - Added `## How it works` DEEP DIVE delimiter before `## Quickstart`; everything from there downward stays technical-direct.
1174
+ - Quickstart code sample swapped from a generic `<Button>` example to `<AgentEvent>` + `<ToolCall>` + `<DeploymentRow>` — agent-shaped primitives nobody else ships.
1175
+ - Added `## Status` section between `## License` and the bundle/architecture content: production callouts, registry-distribution plan, ESM-only caveat, "component count is the floor" framing.
1176
+
1177
+ ### Added (BLOCKER-002 / BLOCKER-003 remediation)
1178
+ - **`src/styles/tailwind-preset.ts`** — single source of truth for the Violet Forge Tailwind tokens (colors, fontFamily, Geist-inspired typescale, borderRadius, boxShadow, motion, keyframes, animation + tailwindcss-animate plugin). `tailwind.config.ts` now consumes the preset via `presets: [theoUIPreset]` (was inline `theme.extend`).
1179
+ - **`registry/tailwind-preset.json`** (`registry:lib`) — distributes the preset to copy-paste consumers via `npx shadcn add tailwind-preset`. Declares `tailwindcss` + `tailwindcss-animate` as deps.
1180
+ - **`scripts/add-tailwind-preset-dep.ts`** — idempotent patcher that adds `tailwind-preset` to every `registry:ui` / `registry:block` `registryDependencies`. Ran once; 99 descriptors patched, 12 skipped (lib/types/preset itself). Without the preset, copy-paste consumers received markup using utility classes (`text-body-md`, `text-display-2xl`, `text-label-caps`, `font-display`, …) that vanilla Tailwind doesn't ship.
1181
+ - **Quality gate `validateRegistryPresetDep`** — fails when any `registry:ui` / `registry:block` is missing `tailwind-preset` from its `registryDependencies`.
1182
+ - **Fixture CSS build in `scripts/test-registry-install.ts`** — after `tsc --noEmit`, the script now writes `src/styles/global.css`, runs `pnpm exec tailwindcss` against the fixture, and asserts the compiled output contains 12 required utility classes (`text-body-md`, `text-display-2xl`, `text-label-caps`, `font-display`, etc.). Previously the script only ran `tsc`, which couldn't detect BLOCKER-002 because typescale classes are runtime artifacts.
1183
+ - **Fixture `tailwind.config.ts` + `postcss.config.cjs`** — `tests/fixture-shadcn-app/` now has a real Tailwind toolchain with `safelist` covering the full Violet Forge typescale (forces compilation of every preset entry as proof of capability, independent of fixture App.tsx usage).
1184
+ - `validateDesignSystemFidelity` audits `src/styles/tailwind-preset.ts` instead of `tailwind.config.ts` (typescale now lives in the preset).
1185
+
1186
+ ### Added (Phase 6 — observability + test hardening, finalized)
1187
+ - **`quality:bundle` gate (HIGH-008 / T6.3)** — `scripts/validate-bundle-size.ts` compares the actual byte sizes of 6 dist artifacts (`index.js`, `index.d.ts`, `styles.css`, `tokens.css`, `fonts.css`, `fonts-cdn.css`) against `scripts/baselines/bundle-sizes.json`. Fails the gate when any file is outside ±5% of baseline. Run `pnpm quality:bundle:update` to rebaseline after a legitimate size change (the diff lands in the PR so reviewers see it). Wired into `pnpm quality:gates`.
1188
+ - **`quality:a11y` gate (MEDIUM-011 / T6.6)** — `pnpm quality:a11y` wraps the Ladle axe sweep (`src/test/ladle-axe.test.tsx`) so it can be invoked standalone or as part of `pnpm quality:gates`. 126 Ladle stories asserted by axe-core via vitest-axe, zero violations. Wired into `pnpm quality:gates` between `quality:bundle` and `ladle:build`.
1189
+ - **`validateScriptsAndCi` now requires** `sync:exports`, `quality:bundle`, `quality:a11y` in addition to the existing required scripts (`format:check`, `registry:build`, `registry:validate`, `quality:structure`, `quality:gates`, `ladle:build`). Prevents accidental removal during refactors.
1190
+
1191
+ ### Added (MEDIUM-011 / T6.6 — Ladle stories axe sweep, lightweight implementation)
1192
+ - **`src/test/ladle-axe.test.tsx`** — 126 Ladle stories pass `vitest-axe` with zero violations. Discovers stories via `import.meta.glob("../**/*.stories.tsx")`, renders each via `@testing-library/react`, runs the axe-core ruleset. Replaces the originally-planned `playwright + axe-playwright` approach (which would have added ~80 MB of devDeps) by reusing the existing happy-dom + vitest-axe stack. Trade-off documented in the file's JSDoc.
1193
+ - Story-context skip list (12 entries) covers (a) side-by-side variant grids that legitimately repeat landmarks, (b) intentionally-empty states for `aria-required-children` containers, (c) Radix Select stories that demonstrate the unselected/empty state, (d) `AgentStream / FullStream` semantic patterns flagged for follow-up but not regressions from this audit, and (e) `Theo Code Shell` screen stories that depend on Ladle-runtime hooks outside happy-dom's reach. Each entry carries a one-line rationale comment.
1194
+ - Story-axe rule overrides disable 4 rules that fire false positives in isolated story render (`heading-order`, three `landmark-*` rules). Per-component tests keep these rules ON because the test author controls the surrounding markup.
1195
+
1196
+ ### Added (Phase 7 — API cleanup, LOWs and NITs)
1197
+ - **`ScrollArea.Bar` compound** (MEDIUM-007 / T7.1). `ScrollArea` is now a compound (`Object.assign /*#__PURE__*/`) exposing `.Bar` as the canonical subpart. Legacy `ScrollBar` standalone export retained as a `@deprecated` alias for one major version; consumers should migrate to `ScrollArea.Bar`.
1198
+ - **`Skeleton` JSDoc accessibility override note** (LOW-004 / T7.2). Documents how to silence per-instance `aria-live` announcements when many Skeletons mount in a list/grid; recommends one container-level `role="status"` and per-Skeleton `aria-live="off" aria-hidden="true"`.
1199
+ - **README "Bundle & module format" section** (LOW-002 / T7.2). Documents the ESM-only decision, tree-shaking via the barrel, CSS distribution map, self-hosted-fonts-as-default plus opt-in CDN.
1200
+ - **`docs/design-system.md` §"Anti-glass guideline"** (NIT-002 / T7.2). Promotes the "no `backdrop-filter: blur(...)`" rule from inline JSDoc comments to a named DS principle: rationale (Vercel-aligned neutrals + content-led density), performance cost, RFC escalation path.
1201
+ - **`playground/**/*` added to `tsconfig.json#include`** (LOW-001 / T7.2); `playground/dist` added to `exclude`.
1202
+
1203
+ ### Added (Phase 6 — observability + test hardening, continued)
1204
+ - **displayName regression tests on 10 compounds total**: `Card`, `Dialog`, `Tabs`, `Avatar` (committed previously) + `Sheet`, `Sidebar`, `TopNav`, `RadioGroup`, `Toast`, `FormField`. Each test asserts root + every subpart `.displayName` per `Object.assign /*#__PURE__*/` wiring (HIGH-009 / T6.2 complete).
1205
+ - **MEDIUM-002 / T6.5 — dev-only warn when `BuildLogStream` `visibleLevels` prop flips between controlled and uncontrolled** between renders. `useRef` tracks the previous mode; a one-line `console.warn` in dev surfaces the regression before it manifests as confusing filter state.
1206
+ - **MEDIUM-003 / T6.7.1 — visual-regression test on `PermissionMatrix`** that asserts the inline native `<input>` and `<select>` carry `border-input`, `font-mono`, and `ring` token classes. Catches drift between the matrix and the standalone Input/Select primitives without requiring full snapshot infrastructure.
1207
+ - **MEDIUM-013 / T6.7.5 — unit tests for `parseExportsFromIndex`** (the pure parser extracted from `parseIndexExports` in `scripts/sync-readme.ts`). 9 tests cover empty input, single primitive, single composite, mixed `type` exports, multi-line bodies, sorted output, non-component imports, and `as`-aliased re-exports.
1208
+
1209
+ ### Added (Phase 6 — observability + test hardening)
1210
+ - **Dev-only `console.warn` in `ThemeProvider` storage catches** (HIGH-006 / T6.1). The three previous silent catches around `localStorage.{getItem,setItem}` now surface a one-line diagnostic in dev (Safari private mode, blocked third-party cookies, sandboxed iframes). Production stays silent because behavior is fail-safe. New helper `warnStorageFailure(scope, err)` carries the `process.env.NODE_ENV === "production"` guard and the per-call `biome-ignore` annotation.
1211
+ - **`displayName` regression tests on compound components** (HIGH-009 / T6.2) — `Card`, `Dialog`, `Tabs`, `Avatar` (more to follow). Catches accidental refactors that lose `.displayName` after `Object.assign /*#__PURE__*/` wiring; preserves React DevTools naming.
1212
+
1213
+ ### Changed (Phase 6)
1214
+ - **`agent-stream` adds explicit `aria-atomic="false"`** (MEDIUM-001 / T6.4) so VoiceOver/macOS does not reannounce the entire log on each new item.
1215
+ - **`React.<Type>` namespace usage replaced with named imports** (MEDIUM-012 / T6.7.4) across 17 occurrences in 12 files: `React.FormEvent`, `React.KeyboardEvent`, `React.MouseEvent`, `React.ReactNode`, `React.SVGProps`, `React.Ref`, `React.HTMLAttributes` → corresponding `import type { … } from "react"` (preserves `verbatimModuleSyntax` correctness, forward-compatible with React 19 type changes). Zero `React.` namespace references remain in `src/`.
1216
+
1217
+ ### Added (Phase 5 — docs + governance)
1218
+ - **`CONTRIBUTING.md`** — operational handbook: setup, taxonomy rule, adding components, quality gates explained, registry distribution, PR conventions, release process, internal exploration archive policy.
1219
+ - **`SECURITY.md`** — disclosure policy, supported versions matrix, vulnerability scope (in/out), hardening already in place (ThemeScript `</script>` escape, no `dangerouslySetInnerHTML` outside SSR helper, lint guards). Aligns with GitHub Security Advisories workflow.
1220
+ - **`docs/architecture.md` §"Global Provider Primitives"** — closed-set, RFC-gated exception for `Toaster` + `ThemeProvider`. Names the trade-off explicitly so future contributors can't dilute it silently (HIGH-007 / D7).
1221
+ - **`referencia/` documentation policy** — `CONTRIBUTING.md` and `SECURITY.md` both name `referencia/` as unmaintained internal exploration archive, not shipped, not in scope for vulnerability reports. Future cleanup will relocate to a separate read-only repository. The directory itself is `.gitignore`d (MEDIUM-004 / T5.4).
1222
+ - README nav links `Contributing` and `Security`.
1223
+
1224
+ ### Changed (HIGH-002 / T4.1 — self-hosted fonts as default)
1225
+ - **`src/styles/fonts.css` no longer `@import`s from `fonts.googleapis.com`.** Now declares six `@font-face` rules pointing at `./fonts/geist-{400,500,600}.woff2` and `./fonts/geist-mono-{400,500,600}.woff2`. Total asset budget: ~290 KB of woff2 next to the CSS. Eliminates the render-blocking third-party fetch that previously hit `fonts.googleapis.com` on every cold page load — fixes GDPR / CSP friction for the enterprise audience.
1226
+ - `src/styles/fonts-cdn.css` (NEW) — opt-in entrypoint that preserves the legacy Google Fonts CDN behavior. Consumers who prefer not to host static assets can `@import "@theokit/ui/fonts-cdn.css"` instead of `@theokit/ui/fonts.css` / `@theokit/ui/styles.css`.
1227
+ - `tsup.config.ts` `onSuccess` now also copies `src/styles/fonts/*.woff2` → `dist/fonts/` and `src/styles/fonts-cdn.css` → `dist/fonts-cdn.css`. The relative URLs in `fonts.css` (`./fonts/geist-400.woff2`) resolve correctly inside `node_modules/@theokit/ui/dist/`.
1228
+ - Geist OFL license shipped at `src/styles/fonts/LICENSE-GEIST.txt` → `dist/fonts/LICENSE-GEIST.txt`. Apache-2.0 + OFL is a clean dual-license combination.
1229
+ - New `geist` devDependency: used only as the source of woff2 artifacts at install time; not bundled into `dist/index.js`.
1230
+ - `validateDocsTypography` now asserts that `src/styles/fonts.css` contains `@font-face` and does NOT `@import` from `fonts.googleapis.com`, and that `src/styles/fonts-cdn.css` exists.
1231
+
1232
+ ### Removed (HIGH-001 / T3.1)
1233
+ - `package.json#files` no longer ships `src/` or the unbuilt `registry/*.json` descriptors. New set: `dist`, `registry/r`, `registry/index.json`, `LICENSE`, `CHANGELOG.md`. `npm pack --dry-run` reports 122 files / 353 KB (was 675 files / 570 KB). 102 `.test.tsx` and 114 `.stories.tsx` + `src/screens/` no longer enter the published tarball.
1234
+
1235
+ ### Added (Phase 3 follow-ups)
1236
+ - Quality gate `validateNpmTarball` — runs `npm pack --dry-run --json` and fails the build when the tarball contains `*.test.*`, `*.stories.*`, `src/screens/`, `referencia/`, `playground/`, `.ladle/`, or `tests/`, or when total size exceeds 5 MB.
1237
+ - Quality gate `validateExportsMap` — locks `package.json#exports` to the canonical 5-entry set (`.`, `./styles.css`, `./tokens.css`, `./fonts.css`, `./fonts-cdn.css`) and instructs to run `pnpm sync:exports` on drift.
1238
+ - `scripts/sync-exports.ts` + `pnpm sync:exports` script — idempotent generator. Includes an in-source ADR explaining why per-component subpath exports (originally D5) were intentionally scoped down: with tsup `splitting: false` and the ESM barrel, modern bundlers already tree-shake unused components; a 99-entry multi-entry tsup would duplicate shared code and inflate the tarball without observable bundler-side benefit.
1239
+ - `.ladle/generated/welcome.stats.ts` — `welcome.stats.ts` moved out of `src/` (HIGH-003 / T3.3). `sync-readme.ts` writes to the new path; `validateCountConsistency` reads from it. The file no longer ships in the npm tarball.
1240
+
1241
+ ### Breaking
1242
+ - **Reclassification of 7 components from `primitives/` to `composites/`** (BLOCKER-001 remediation, D2): `AgentEditor`, `RuleEditor`, `SkillEditor`, `ApprovalCard`, `CronJobsList`, `SkillsList`, `MCPServerList`. Each value-imported one or more sibling primitives, which violated the mechanical taxonomy rule in `docs/architecture.md`. They are composites by every reasonable definition (FormField+Input+Button = composite; list-of-card = composite). Public barrel (`@theokit/ui`) is unchanged — named exports preserved. Registry consumers via `npx shadcn add`: `type` changed from `registry:ui` to `registry:block` and `target` from `components/ui/<name>` to `components/blocks/<name>`. Migration: re-run `npx shadcn add <name>` to relocate the file, or rename the import path manually.
1243
+ - **`form-field` now imports `@radix-ui/react-label` directly** (BLOCKER-001 / D2 exception). Previously imported the sibling `Label` primitive. `form-field.tsx` now inlines the same Radix LabelPrimitive + identical Tailwind tokens. Visual parity preserved. `registry/form-field.json` adds `@radix-ui/react-label` to `dependencies` and removes `label` from `registryDependencies`.
1244
+
1245
+ ### Fixed
1246
+ - **BLOCKER-001 (2026-05-14): `validateComponentStructure` gate regex was broken.** The previous check `/from\s+["'](?:\.\.\/)+(?:primitives|composites)\//` matched the literal segments `primitives/`/`composites/` in the import specifier, which **never** appears for sibling imports of the form `"../button/button.js"` (the segment is in the resolved path, not the specifier). 8 primitives (`agent-editor`, `rule-editor`, `skill-editor`, `approval-card`, `form-field`, `cron-jobs-list`, `skills-list`, `mcp-server-list`) value-imported other primitives undetected. Replaced with `scripts/lib/import-graph.ts` (path-resolved, multi-line aware, type-vs-value aware) + 15 meta-tests in `scripts/lib/import-graph.test.ts`. Gate now flags 22 distinct sibling-primitive value-imports.
1247
+
1248
+ ### Added
1249
+ - `scripts/lib/import-graph.ts` — shared utilities (`parseImports`, `parseImportsDetailed`, `resolveSpecifierToLayer`, `findPrimitiveOffenses`, `importsScreen`, `GLOBAL_PROVIDER_PRIMITIVES`) consumed by `validate-quality-gates.ts`. Exported via named exports for reuse by future gates.
1250
+ - `scripts/lib/import-graph.test.ts` — 15 meta-tests (RED-then-GREEN) covering: sibling value-import detection, type-only allowance, cross-layer barrel resolution, multi-line imports, global provider allowlist, composite-imports-screen guard.
1251
+ - `vitest.config.ts` now also collects `scripts/**/*.{test,spec}.ts` so meta-tests run under `pnpm test`.
1252
+ - `src/test/a11y.ts` — shared `expectNoA11yViolations(ui)` helper used by 30+ primitive smoke tests.
1253
+ - `src/welcome.stats.ts` (generated) — single source of truth for badge / welcome / architecture counts.
1254
+ - Quality gates: `validateCompoundPattern`, `validateAxeCoverage`, `validateCountConsistency`, `validateArchitectureCensus`, `validateNoStrayArtifacts`. All hard-fail.
1255
+ - `vitest-axe` `toHaveNoViolations` assertion in 30 interactive primitives (button, dialog, checkbox, switch, tabs, toast, command-palette, agent-event, audit-log-entry, permission-matrix, mention-menu, …).
1256
+ - `TokenUsageChart` `sr-only <table>` fallback exposing input/output per period to screen readers (HIGH-013).
1257
+ - `tests/fixture-shadcn-app/package.json` peers for Radix Dialog/Toast/Avatar/Tabs + cmdk so the registry install fixture can exercise composites.
1258
+ - `LICENSE` file (Apache-2.0) at repository root.
1259
+ - `CHANGELOG.md` (this file).
1260
+ - `<ThemeScript>` component for SSR-safe theme initialization in Next/Astro/Remix.
1261
+ - Global `@media (prefers-reduced-motion: reduce)` rules in `tokens.css` neutralizing animations for users with vestibular sensitivity.
1262
+ - `BuildLogStream` `maxLines` prop (default 2000) for high-volume log truncation.
1263
+ - `TokenUsageChart` `maxBars` prop for time-series binning.
1264
+ - `vitest-axe` integration for accessibility assertions in primitive tests.
1265
+ - Quality gates: `validateGovernanceFiles` (LICENSE / CHANGELOG presence), `validateReadmeDrift` (README ↔ exports parity), `validateDocsTypography` (font drift), `validateCompositeBarrel` (composites must import primitives via barrel).
1266
+ - `tests/fixture-shadcn-app/` integration test exercising registry copy-paste install.
1267
+ - `scripts/sync-readme.ts` to keep README counts and component catalog generated from source.
1268
+
1269
+ ### Changed
1270
+ - `ThemeProvider` `defaultMode` flipped from `"light"` to `"dark"` to match the library's "dark-first" positioning. **Migration**: pass `defaultMode="light"` explicitly if previously relying on the default.
1271
+ - `TopNav.ModeSwitcher` ARIA semantics: `role="tablist"` → `role="radiogroup"`, `role="tab"` → `role="radio"` with full keyboard navigation (Arrow/Home/End + roving tabindex).
1272
+ - `CommandPalette` re-implemented on top of `cmdk` — adds keyboard navigation (Up/Down/Enter/Escape), fuzzy ranking, and active-item highlight. Public API is preserved.
1273
+ - `Card.Title` and `Dialog.Title` accept `asChild` (Radix Slot) for heading-level override.
1274
+ - `ChatComposer` no longer renders mic/attach buttons by default; consumer must pass `onVoiceInput` / `onAttach` to opt in.
1275
+ - `JSX.Element` global namespace references replaced by `import type { JSX } from "react"` in `theme-provider.tsx`, `theme-switcher.tsx`, `toaster.tsx` (forward-compatible with React 19).
1276
+ - Replace `dot-namespace` mutation pattern (`Card.Header = Header`) with `/*#__PURE__*/ Object.assign(...)` in `Card`, `Dialog`, `Sidebar`, `TopNav`, `Tabs` for safer tree-shaking.
1277
+ - `aria-hidden` codemod: all 15 boolean uses now declare `aria-hidden="true"` explicitly.
1278
+ - `validate-quality-gates.ts` calls four new gates in sequence; CI fails on README/docs/governance drift.
1279
+
1280
+ ### Fixed
1281
+ - `dist/styles.css` referenced `./fonts.css` that was not copied to `dist/`. `tsup.config.ts` now copies `fonts.css` alongside `tokens.css` and `styles.css`; `package.json#exports` exposes all three.
1282
+ - `registry/tokens.json` shipped `cssVars` with the old warm-violet palette while the embedded `tokens.css` content used the current Vercel-grayscale palette. The `cssVars` block was removed; `files[].content` is now the single source of truth.
1283
+ - `src/themes/violet-forge.ts` JSDoc claimed "Boska + Switzer + JetBrains Mono" while the `fonts` object used Geist. JSDoc rewritten; `registry/r/theme-provider.json` regenerated.
1284
+ - `README.md` declared "84 components / 162 tests / 12 composites / 33 registry items" and listed six non-existent components (`ToolPalette`, `TerminalPane`, `TerminalLine`, `TaskBreadcrumbs`, `TaskStatusPill`, `ShellCommandCard`). Counts now derived from source; phantom components removed.
1285
+ - `docs/design-system.md` described the abandoned Boska/Switzer direction. Rewritten to match the active Geist + Vercel-grayscale state. Historical exploration moved to `docs/audit/2026-05-decisions.md`.
1286
+ - `docs/agent-screens-composition.md` was a 354-line implementation roadmap referencing legacy product names ("TheoKit", "TheoBrutal") and components that no longer exist. Archived to `docs/audit/2026-05-screens-history.md`; replaced by a slim `docs/screens.md` index.
1287
+ - `PermissionMatrix`: JSDoc promised `toolOptions={[]}` hides the add form, but `[]` is truthy in JS — the form was always shown. Condition fixed to check `length > 0`.
1288
+ - `Dialog` overlay JSDoc claimed "violet-tinted 60%" backdrop but code used `bg-background/80`. JSDoc aligned with code.
1289
+ - `agent-timeline` composite imported `../primitives/agent-event/agent-event.js` directly (bypassing barrel); switched to `../primitives/agent-event/index.js`. Gate added.
1290
+ - Stories with `console.log` / `console.warn` annotated with `biome-ignore` to keep `noConsole` Biome rule meaningful in production code.
1291
+
1292
+ ### Security
1293
+ - **`ThemeScript` XSS hardening (BLOCKER-001)**: `buildScript` now escapes `<` to `<` on every interpolated value (`defaultTheme`, `defaultMode`, `storageKey`). Without the escape, a payload containing `</script>` would terminate the inline `<script>` tag at the HTML tokenizer layer — even though it sat inside a JS string literal — and execute attacker JS. New tests cover the `</script>` payload explicitly. The prior security comment ("no user input") is replaced by a per-call escape so the safety property holds regardless of how the props are sourced.
1294
+
1295
+ ### Changed (audit remediation 2026-05-14)
1296
+ - Compound pattern: `Toast`, `Avatar`, `RadioGroup`, `FormField` migrated to `/*#__PURE__*/ Object.assign(Root, {...})` — finishing the migration declared in the prior CHANGELOG entry. New `validateCompoundPattern` quality gate blocks the legacy `Root as typeof Root & {...}; Root.X = X` mutation pattern across all compound components.
1297
+ - `FormField.Control` rebuilt on `React.cloneElement` + `React.Children.only` (was spread-element-as-object). Now preserves `ref` and `key` on the wrapped child; throws explicit errors on zero / multiple children (was silent breakage).
1298
+ - `AgentEditor`, `SkillEditor`, `RuleEditor` no longer reset their form state via `useEffect [initial?.id]`. Use the React `key` prop at the call site (`<AgentEditor key={agent.id} initial={agent} ... />`) to remount on entity change — the idiomatic pattern.
1299
+ - Tailwind `darkMode` set to `"class"` alone; the dead `[data-theme="dark"]` selector (which never matched because `ThemeProvider` sets `data-theme` to the theme NAME, not `"dark"`) was removed from both `tailwind.config.ts` and `tokens.css`.
1300
+ - `tsup.config.ts` `onSuccess` now uses `node:fs/promises.copyFile` instead of POSIX `cp`. Build is portable across macOS / Linux / Windows.
1301
+ - `validateRegistryStoriesAndTests` upgrades the missing-test check from warning to hard fail. The test-backfill phase has ended.
1302
+ - `scripts/sync-readme.ts` is the single source of truth for component counts. Reads `src/index.ts` named exports and writes README badges + welcome STATS + `architecture.md` census atomically (compute everything in memory, write at the end).
1303
+ - Test count is now derived by static `it(`/`test(` parsing — no longer spawns `pnpm test` inside `sync:readme`.
1304
+ - `docs/architecture.md`: `BEGIN:primitives-list` / `BEGIN:composites-list` regions auto-regenerated; census matches reality (88 primitives + 14 composites = 102 components, was stale at 36/12).
1305
+ - `src/screens/theo-code-shell.tsx` split: ~900 lines of mock data + helper types moved to sibling `theo-code-shell.data.tsx`. Main file dropped from 2193 → 1298 LoC.
1306
+ - `lint:ci` scope widened to `playground` + `tests/fixture-shadcn-app/src`.
1307
+ - `biome.json` `noConsole` raised to `error` with `allow: []`; stories / tests / scripts opt out via `overrides`.
1308
+ - `validateReadmeDrift` whitelist trimmed (`Boska`, `Switzer`, `JetBrains`, `Berkeley`, `Departure`, `Söhne`, `Migra`, `Monaspace`, `Neon`, `PP`, `Editorial`, `New`, `General`, `Industrial` removed — fonts/styles deprecated in earlier sprints).
1309
+ - `ThemeProvider` JSDoc corrected: `defaultMode` documents `"dark"` (matches the actual default since the dark-first migration).
1310
+ - `classic-paper` JSDoc clarified ("light-primary with deep-navy dark mirror") — was misleadingly described as "light-only" despite shipping a full dark palette.
1311
+ - `docs/quality-gates.md` Gate 2 "Current known risk" replaced with a "Resolved (2026-05)" note — `scripts/build-registry.ts` already rewrites relative imports.
1312
+ - `MentionMenu` markup: `<header>` → `<div role="presentation">`, `<ul>`/`<li>` wrappers get `role="presentation"` so `role="menu"` only contains `role="menuitem"` children (axe `aria-required-children` regression fix).
1313
+ - `test-registry-install.ts` covers a stratified sample of 13 items (was 4): lib (cn, types, chat-types), CSS (tokens), CVA (badge, button), compound (card, dialog, avatar, tabs), Radix multi-file (toast), cmdk composite (command-palette), block composite (deployment-row).
1314
+
1315
+ ### Fixed (audit remediation 2026-05-14)
1316
+ - README components badge (`components-N`) is now equal to "Primitives (P)" + "Composites (C)" — the historical badge used directory count while the catalog used named exports (badge said 99, catalog summed to 102).
1317
+ - `welcome.stories.tsx` hero STATS regenerated from source — was hardcoded to 36/12/07/03/21/122 while the reality is 88/14/7/3/110/389+.
1318
+ - 95× `registry/*.json.tmp` + 2× `*.bak` files deleted from working tree. New `validateNoStrayArtifacts` gate blocks regression.
1319
+
1320
+ ### Removed
1321
+ - N/A.
1322
+
1323
+ ## [0.0.0]
1324
+
1325
+ Initial unpublished baseline. See `git log` between this entry and `5c95373` for the bootstrap work.