@usetheo/ui 0.13.1 → 0.14.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 (1019) hide show
  1. package/README.md +4 -466
  2. package/dist/components/composites/command-palette/command-palette.d.ts +1 -1
  3. package/dist/components/primitives/badge/badge.d.ts +1 -1
  4. package/dist/components/primitives/button/button.d.ts +1 -1
  5. package/dist/components/primitives/danger-zone/danger-zone.d.ts +1 -1
  6. package/dist/components/primitives/dialog/dialog.d.ts +3 -3
  7. package/dist/components/primitives/dropdown-menu/dropdown-menu.d.ts +1 -1
  8. package/dist/components/primitives/sheet/sheet.d.ts +3 -3
  9. package/dist/components/primitives/toast/toast.d.ts +1 -1
  10. package/dist/index.d.ts +0 -89
  11. package/dist/index.js +4657 -1545
  12. package/dist/lib/cn.d.ts +1 -1
  13. package/dist/{preset-v3-legacy.js → tailwind-preset.js} +1 -16
  14. package/package.json +28 -788
  15. package/CHANGELOG.md +0 -1797
  16. package/DESIGN.md +0 -456
  17. package/NOTICE +0 -38
  18. package/dist/chunk-23YEYNDS.js +0 -89
  19. package/dist/chunk-23YEYNDS.js.map +0 -1
  20. package/dist/chunk-25KBUQEQ.js +0 -95
  21. package/dist/chunk-25KBUQEQ.js.map +0 -1
  22. package/dist/chunk-2A3E5Y72.js +0 -165
  23. package/dist/chunk-2A3E5Y72.js.map +0 -1
  24. package/dist/chunk-2EUKYGH5.js +0 -98
  25. package/dist/chunk-2EUKYGH5.js.map +0 -1
  26. package/dist/chunk-2NZYMQKT.js +0 -56
  27. package/dist/chunk-2NZYMQKT.js.map +0 -1
  28. package/dist/chunk-2OVFVPSZ.js +0 -26
  29. package/dist/chunk-2OVFVPSZ.js.map +0 -1
  30. package/dist/chunk-2UP7SECE.js +0 -78
  31. package/dist/chunk-2UP7SECE.js.map +0 -1
  32. package/dist/chunk-33ETHPT7.js +0 -112
  33. package/dist/chunk-33ETHPT7.js.map +0 -1
  34. package/dist/chunk-33IIDFSM.js +0 -43
  35. package/dist/chunk-33IIDFSM.js.map +0 -1
  36. package/dist/chunk-345HYADQ.js +0 -88
  37. package/dist/chunk-345HYADQ.js.map +0 -1
  38. package/dist/chunk-3ZXZGZOX.js +0 -57
  39. package/dist/chunk-3ZXZGZOX.js.map +0 -1
  40. package/dist/chunk-45FWKR23.js +0 -62
  41. package/dist/chunk-45FWKR23.js.map +0 -1
  42. package/dist/chunk-4DTLUBRW.js +0 -122
  43. package/dist/chunk-4DTLUBRW.js.map +0 -1
  44. package/dist/chunk-4EH6F54D.js +0 -69
  45. package/dist/chunk-4EH6F54D.js.map +0 -1
  46. package/dist/chunk-4EKF4EIE.js +0 -140
  47. package/dist/chunk-4EKF4EIE.js.map +0 -1
  48. package/dist/chunk-4SMYNLTA.js +0 -83
  49. package/dist/chunk-4SMYNLTA.js.map +0 -1
  50. package/dist/chunk-4UBFLXS3.js +0 -35
  51. package/dist/chunk-4UBFLXS3.js.map +0 -1
  52. package/dist/chunk-52J7SDYH.js +0 -48
  53. package/dist/chunk-52J7SDYH.js.map +0 -1
  54. package/dist/chunk-5XCTTXC3.js +0 -180
  55. package/dist/chunk-5XCTTXC3.js.map +0 -1
  56. package/dist/chunk-624AATQZ.js +0 -77
  57. package/dist/chunk-624AATQZ.js.map +0 -1
  58. package/dist/chunk-6IODJQWC.js +0 -47
  59. package/dist/chunk-6IODJQWC.js.map +0 -1
  60. package/dist/chunk-75IDWFYX.js +0 -134
  61. package/dist/chunk-75IDWFYX.js.map +0 -1
  62. package/dist/chunk-7BGCWJQR.js +0 -113
  63. package/dist/chunk-7BGCWJQR.js.map +0 -1
  64. package/dist/chunk-7BQXMG2A.js +0 -93
  65. package/dist/chunk-7BQXMG2A.js.map +0 -1
  66. package/dist/chunk-7RFWVNQA.js +0 -47
  67. package/dist/chunk-7RFWVNQA.js.map +0 -1
  68. package/dist/chunk-7T4NK6W6.js +0 -192
  69. package/dist/chunk-7T4NK6W6.js.map +0 -1
  70. package/dist/chunk-A3OU6ICP.js +0 -91
  71. package/dist/chunk-A3OU6ICP.js.map +0 -1
  72. package/dist/chunk-ABBXLAJW.js +0 -74
  73. package/dist/chunk-ABBXLAJW.js.map +0 -1
  74. package/dist/chunk-AENNHS3S.js +0 -83
  75. package/dist/chunk-AENNHS3S.js.map +0 -1
  76. package/dist/chunk-AXNJFBYX.js +0 -136
  77. package/dist/chunk-AXNJFBYX.js.map +0 -1
  78. package/dist/chunk-AXUAQM45.js +0 -154
  79. package/dist/chunk-AXUAQM45.js.map +0 -1
  80. package/dist/chunk-B2FL7KBJ.js +0 -65
  81. package/dist/chunk-B2FL7KBJ.js.map +0 -1
  82. package/dist/chunk-BE232OKN.js +0 -42
  83. package/dist/chunk-BE232OKN.js.map +0 -1
  84. package/dist/chunk-BP4RQSX7.js +0 -200
  85. package/dist/chunk-BP4RQSX7.js.map +0 -1
  86. package/dist/chunk-BPJ3RN3U.js +0 -112
  87. package/dist/chunk-BPJ3RN3U.js.map +0 -1
  88. package/dist/chunk-BSF4Y4UT.js +0 -77
  89. package/dist/chunk-BSF4Y4UT.js.map +0 -1
  90. package/dist/chunk-BWIDDAR7.js +0 -86
  91. package/dist/chunk-BWIDDAR7.js.map +0 -1
  92. package/dist/chunk-BYUWQ6OP.js +0 -45
  93. package/dist/chunk-BYUWQ6OP.js.map +0 -1
  94. package/dist/chunk-C5ULP2P5.js +0 -140
  95. package/dist/chunk-C5ULP2P5.js.map +0 -1
  96. package/dist/chunk-CCG7PXLX.js +0 -24
  97. package/dist/chunk-CCG7PXLX.js.map +0 -1
  98. package/dist/chunk-CED2LKHI.js +0 -117
  99. package/dist/chunk-CED2LKHI.js.map +0 -1
  100. package/dist/chunk-CGWIOIEO.js +0 -27
  101. package/dist/chunk-CGWIOIEO.js.map +0 -1
  102. package/dist/chunk-CSEGVTKO.js +0 -110
  103. package/dist/chunk-CSEGVTKO.js.map +0 -1
  104. package/dist/chunk-CVFSNA4K.js +0 -716
  105. package/dist/chunk-CVFSNA4K.js.map +0 -1
  106. package/dist/chunk-E26M7ATD.js +0 -61
  107. package/dist/chunk-E26M7ATD.js.map +0 -1
  108. package/dist/chunk-E63IRXZZ.js +0 -78
  109. package/dist/chunk-E63IRXZZ.js.map +0 -1
  110. package/dist/chunk-ESJUISWY.js +0 -45
  111. package/dist/chunk-ESJUISWY.js.map +0 -1
  112. package/dist/chunk-ET7A3TQZ.js +0 -158
  113. package/dist/chunk-ET7A3TQZ.js.map +0 -1
  114. package/dist/chunk-ETTL6XGU.js +0 -139
  115. package/dist/chunk-ETTL6XGU.js.map +0 -1
  116. package/dist/chunk-EWDN56AS.js +0 -24
  117. package/dist/chunk-EWDN56AS.js.map +0 -1
  118. package/dist/chunk-FJZKA2LV.js +0 -165
  119. package/dist/chunk-FJZKA2LV.js.map +0 -1
  120. package/dist/chunk-G2WCT6PJ.js +0 -69
  121. package/dist/chunk-G2WCT6PJ.js.map +0 -1
  122. package/dist/chunk-GC52HWIL.js +0 -41
  123. package/dist/chunk-GC52HWIL.js.map +0 -1
  124. package/dist/chunk-GCKFA7X7.js +0 -83
  125. package/dist/chunk-GCKFA7X7.js.map +0 -1
  126. package/dist/chunk-GDMCDW66.js +0 -19
  127. package/dist/chunk-GDMCDW66.js.map +0 -1
  128. package/dist/chunk-GIXHBTHH.js +0 -59
  129. package/dist/chunk-GIXHBTHH.js.map +0 -1
  130. package/dist/chunk-GLEOUWPN.js +0 -108
  131. package/dist/chunk-GLEOUWPN.js.map +0 -1
  132. package/dist/chunk-GLRUM43F.js +0 -121
  133. package/dist/chunk-GLRUM43F.js.map +0 -1
  134. package/dist/chunk-H3L7WZDZ.js +0 -74
  135. package/dist/chunk-H3L7WZDZ.js.map +0 -1
  136. package/dist/chunk-H55WXDME.js +0 -45
  137. package/dist/chunk-H55WXDME.js.map +0 -1
  138. package/dist/chunk-H5QPJNVD.js +0 -98
  139. package/dist/chunk-H5QPJNVD.js.map +0 -1
  140. package/dist/chunk-HB45JHMM.js +0 -43
  141. package/dist/chunk-HB45JHMM.js.map +0 -1
  142. package/dist/chunk-HETHTYEZ.js +0 -80
  143. package/dist/chunk-HETHTYEZ.js.map +0 -1
  144. package/dist/chunk-HHSKNB32.js +0 -55
  145. package/dist/chunk-HHSKNB32.js.map +0 -1
  146. package/dist/chunk-HILOUYES.js +0 -151
  147. package/dist/chunk-HILOUYES.js.map +0 -1
  148. package/dist/chunk-HTJVHFNW.js +0 -178
  149. package/dist/chunk-HTJVHFNW.js.map +0 -1
  150. package/dist/chunk-HZ7Z22VW.js +0 -130
  151. package/dist/chunk-HZ7Z22VW.js.map +0 -1
  152. package/dist/chunk-JFKBFQA5.js +0 -129
  153. package/dist/chunk-JFKBFQA5.js.map +0 -1
  154. package/dist/chunk-JIZKW3WC.js +0 -74
  155. package/dist/chunk-JIZKW3WC.js.map +0 -1
  156. package/dist/chunk-JQTCCKZA.js +0 -154
  157. package/dist/chunk-JQTCCKZA.js.map +0 -1
  158. package/dist/chunk-JR4H3FJ2.js +0 -74
  159. package/dist/chunk-JR4H3FJ2.js.map +0 -1
  160. package/dist/chunk-JRW53TVG.js +0 -53
  161. package/dist/chunk-JRW53TVG.js.map +0 -1
  162. package/dist/chunk-JXOCE27Z.js +0 -82
  163. package/dist/chunk-JXOCE27Z.js.map +0 -1
  164. package/dist/chunk-JYW5YNF7.js +0 -188
  165. package/dist/chunk-JYW5YNF7.js.map +0 -1
  166. package/dist/chunk-K72DJOXR.js +0 -81
  167. package/dist/chunk-K72DJOXR.js.map +0 -1
  168. package/dist/chunk-KDE3NYTI.js +0 -144
  169. package/dist/chunk-KDE3NYTI.js.map +0 -1
  170. package/dist/chunk-KFUFTZLS.js +0 -111
  171. package/dist/chunk-KFUFTZLS.js.map +0 -1
  172. package/dist/chunk-KHBXI6AV.js +0 -149
  173. package/dist/chunk-KHBXI6AV.js.map +0 -1
  174. package/dist/chunk-M74ZYBOK.js +0 -93
  175. package/dist/chunk-M74ZYBOK.js.map +0 -1
  176. package/dist/chunk-ML7WLNIK.js +0 -11
  177. package/dist/chunk-ML7WLNIK.js.map +0 -1
  178. package/dist/chunk-MXB2GVEQ.js +0 -57
  179. package/dist/chunk-MXB2GVEQ.js.map +0 -1
  180. package/dist/chunk-NEMXW2LB.js +0 -102
  181. package/dist/chunk-NEMXW2LB.js.map +0 -1
  182. package/dist/chunk-OJPPSJMF.js +0 -65
  183. package/dist/chunk-OJPPSJMF.js.map +0 -1
  184. package/dist/chunk-OMR6ZGME.js +0 -63
  185. package/dist/chunk-OMR6ZGME.js.map +0 -1
  186. package/dist/chunk-ORVYP73T.js +0 -223
  187. package/dist/chunk-ORVYP73T.js.map +0 -1
  188. package/dist/chunk-OZFUUO2Q.js +0 -50
  189. package/dist/chunk-OZFUUO2Q.js.map +0 -1
  190. package/dist/chunk-P44UAK45.js +0 -115
  191. package/dist/chunk-P44UAK45.js.map +0 -1
  192. package/dist/chunk-PJUP4BJD.js +0 -116
  193. package/dist/chunk-PJUP4BJD.js.map +0 -1
  194. package/dist/chunk-PJWYIOY4.js +0 -3
  195. package/dist/chunk-PJWYIOY4.js.map +0 -1
  196. package/dist/chunk-PVCW4O37.js +0 -147
  197. package/dist/chunk-PVCW4O37.js.map +0 -1
  198. package/dist/chunk-PXT47DRZ.js +0 -59
  199. package/dist/chunk-PXT47DRZ.js.map +0 -1
  200. package/dist/chunk-PZGUZHI7.js +0 -142
  201. package/dist/chunk-PZGUZHI7.js.map +0 -1
  202. package/dist/chunk-Q2BAL2PF.js +0 -965
  203. package/dist/chunk-Q2BAL2PF.js.map +0 -1
  204. package/dist/chunk-QBUTRD2M.js +0 -58
  205. package/dist/chunk-QBUTRD2M.js.map +0 -1
  206. package/dist/chunk-QCQTTOMD.js +0 -236
  207. package/dist/chunk-QCQTTOMD.js.map +0 -1
  208. package/dist/chunk-QNYOIVQ4.js +0 -36
  209. package/dist/chunk-QNYOIVQ4.js.map +0 -1
  210. package/dist/chunk-QPURZJJM.js +0 -88
  211. package/dist/chunk-QPURZJJM.js.map +0 -1
  212. package/dist/chunk-QRXIYPWP.js +0 -121
  213. package/dist/chunk-QRXIYPWP.js.map +0 -1
  214. package/dist/chunk-QV4BQRNH.js +0 -29
  215. package/dist/chunk-QV4BQRNH.js.map +0 -1
  216. package/dist/chunk-REFY5MLN.js +0 -212
  217. package/dist/chunk-REFY5MLN.js.map +0 -1
  218. package/dist/chunk-RJ6RAMKH.js +0 -89
  219. package/dist/chunk-RJ6RAMKH.js.map +0 -1
  220. package/dist/chunk-RJBCTMVW.js +0 -59
  221. package/dist/chunk-RJBCTMVW.js.map +0 -1
  222. package/dist/chunk-RLWULF5B.js +0 -113
  223. package/dist/chunk-RLWULF5B.js.map +0 -1
  224. package/dist/chunk-RPZMFGYI.js +0 -31
  225. package/dist/chunk-RPZMFGYI.js.map +0 -1
  226. package/dist/chunk-RQT5DWGG.js +0 -34
  227. package/dist/chunk-RQT5DWGG.js.map +0 -1
  228. package/dist/chunk-SBKVVVYY.js +0 -89
  229. package/dist/chunk-SBKVVVYY.js.map +0 -1
  230. package/dist/chunk-SOJW47EZ.js +0 -70
  231. package/dist/chunk-SOJW47EZ.js.map +0 -1
  232. package/dist/chunk-SQ66DCXY.js +0 -35
  233. package/dist/chunk-SQ66DCXY.js.map +0 -1
  234. package/dist/chunk-SXKGWHAM.js +0 -179
  235. package/dist/chunk-SXKGWHAM.js.map +0 -1
  236. package/dist/chunk-T2OKGV6M.js +0 -13
  237. package/dist/chunk-T2OKGV6M.js.map +0 -1
  238. package/dist/chunk-TJLULCZW.js +0 -108
  239. package/dist/chunk-TJLULCZW.js.map +0 -1
  240. package/dist/chunk-TY6NTWN5.js +0 -29
  241. package/dist/chunk-TY6NTWN5.js.map +0 -1
  242. package/dist/chunk-U3AEEFVB.js +0 -152
  243. package/dist/chunk-U3AEEFVB.js.map +0 -1
  244. package/dist/chunk-UGKI466V.js +0 -12
  245. package/dist/chunk-UGKI466V.js.map +0 -1
  246. package/dist/chunk-V3HFDVZ3.js +0 -102
  247. package/dist/chunk-V3HFDVZ3.js.map +0 -1
  248. package/dist/chunk-V6H2RUVP.js +0 -77
  249. package/dist/chunk-V6H2RUVP.js.map +0 -1
  250. package/dist/chunk-VB53UMAL.js +0 -106
  251. package/dist/chunk-VB53UMAL.js.map +0 -1
  252. package/dist/chunk-VBEMLZGX.js +0 -86
  253. package/dist/chunk-VBEMLZGX.js.map +0 -1
  254. package/dist/chunk-VBQFE5RV.js +0 -92
  255. package/dist/chunk-VBQFE5RV.js.map +0 -1
  256. package/dist/chunk-VHK2OUCW.js +0 -38
  257. package/dist/chunk-VHK2OUCW.js.map +0 -1
  258. package/dist/chunk-VHTAVROO.js +0 -53
  259. package/dist/chunk-VHTAVROO.js.map +0 -1
  260. package/dist/chunk-VM4RMQQN.js +0 -11
  261. package/dist/chunk-VM4RMQQN.js.map +0 -1
  262. package/dist/chunk-VZX4HLBM.js +0 -84
  263. package/dist/chunk-VZX4HLBM.js.map +0 -1
  264. package/dist/chunk-W47V2F3Q.js +0 -115
  265. package/dist/chunk-W47V2F3Q.js.map +0 -1
  266. package/dist/chunk-W7I3ZX66.js +0 -76
  267. package/dist/chunk-W7I3ZX66.js.map +0 -1
  268. package/dist/chunk-WD42UBGR.js +0 -64
  269. package/dist/chunk-WD42UBGR.js.map +0 -1
  270. package/dist/chunk-XC7SYZYR.js +0 -86
  271. package/dist/chunk-XC7SYZYR.js.map +0 -1
  272. package/dist/chunk-XJA4B3F5.js +0 -68
  273. package/dist/chunk-XJA4B3F5.js.map +0 -1
  274. package/dist/chunk-XSENM65D.js +0 -128
  275. package/dist/chunk-XSENM65D.js.map +0 -1
  276. package/dist/chunk-YD2QEVHO.js +0 -68
  277. package/dist/chunk-YD2QEVHO.js.map +0 -1
  278. package/dist/chunk-YDKRUSB5.js +0 -35
  279. package/dist/chunk-YDKRUSB5.js.map +0 -1
  280. package/dist/chunk-YES6SPDT.js +0 -55
  281. package/dist/chunk-YES6SPDT.js.map +0 -1
  282. package/dist/chunk-YNDHYMPI.js +0 -46
  283. package/dist/chunk-YNDHYMPI.js.map +0 -1
  284. package/dist/chunk-YO3WEMOH.js +0 -130
  285. package/dist/chunk-YO3WEMOH.js.map +0 -1
  286. package/dist/chunk-YUFFAWNB.js +0 -90
  287. package/dist/chunk-YUFFAWNB.js.map +0 -1
  288. package/dist/chunk-YVXMWUWD.js +0 -118
  289. package/dist/chunk-YVXMWUWD.js.map +0 -1
  290. package/dist/chunk-Z6HZMGO2.js +0 -106
  291. package/dist/chunk-Z6HZMGO2.js.map +0 -1
  292. package/dist/chunk-ZAMPCRFJ.js +0 -121
  293. package/dist/chunk-ZAMPCRFJ.js.map +0 -1
  294. package/dist/chunk-ZEFOXF2I.js +0 -87
  295. package/dist/chunk-ZEFOXF2I.js.map +0 -1
  296. package/dist/chunk-ZJXOHLQE.js +0 -66
  297. package/dist/chunk-ZJXOHLQE.js.map +0 -1
  298. package/dist/chunk-ZPURFK4C.js +0 -203
  299. package/dist/chunk-ZPURFK4C.js.map +0 -1
  300. package/dist/chunk-ZXPDS6DH.js +0 -3
  301. package/dist/chunk-ZXPDS6DH.js.map +0 -1
  302. package/dist/chunk-ZZZIOTLC.js +0 -89
  303. package/dist/chunk-ZZZIOTLC.js.map +0 -1
  304. package/dist/components/composites/agent-composer/agent-composer.d.ts +0 -41
  305. package/dist/components/composites/agent-composer/index.d.ts +0 -1
  306. package/dist/components/composites/agent-editor/agent-editor.d.ts +0 -31
  307. package/dist/components/composites/agent-editor/index.d.ts +0 -1
  308. package/dist/components/composites/agent-stream/agent-stream.d.ts +0 -72
  309. package/dist/components/composites/agent-stream/index.d.ts +0 -2
  310. package/dist/components/composites/agent-stream/to-agent-stream-items.d.ts +0 -32
  311. package/dist/components/composites/agent-timeline/agent-timeline.d.ts +0 -22
  312. package/dist/components/composites/agent-timeline/index.d.ts +0 -1
  313. package/dist/components/composites/agent-tool-renderer/agent-tool-renderer.d.ts +0 -60
  314. package/dist/components/composites/agent-tool-renderer/index.d.ts +0 -1
  315. package/dist/components/composites/agent-tool-renderer/tool-call-part.d.ts +0 -5
  316. package/dist/components/composites/approval-card/approval-card.d.ts +0 -35
  317. package/dist/components/composites/approval-card/index.d.ts +0 -1
  318. package/dist/components/composites/chat-composer/chat-composer.d.ts +0 -68
  319. package/dist/components/composites/chat-composer/index.d.ts +0 -1
  320. package/dist/components/composites/chat-message/chat-message-actions.d.ts +0 -22
  321. package/dist/components/composites/chat-message/chat-message-branch.d.ts +0 -17
  322. package/dist/components/composites/chat-message/chat-message-response.d.ts +0 -15
  323. package/dist/components/composites/chat-message/chat-message-toolbar.d.ts +0 -7
  324. package/dist/components/composites/chat-message/chat-message.d.ts +0 -94
  325. package/dist/components/composites/chat-message/index.d.ts +0 -23
  326. package/dist/components/composites/chat-message/parts/data-part.d.ts +0 -9
  327. package/dist/components/composites/chat-message/parts/file-part.d.ts +0 -5
  328. package/dist/components/composites/chat-message/parts/reasoning-part.d.ts +0 -7
  329. package/dist/components/composites/chat-message/parts/source-part.d.ts +0 -9
  330. package/dist/components/composites/chat-message/parts/text-part.d.ts +0 -11
  331. package/dist/components/composites/choice-prompt/choice-prompt.d.ts +0 -65
  332. package/dist/components/composites/choice-prompt/index.d.ts +0 -2
  333. package/dist/components/composites/confirm-prompt/confirm-prompt.d.ts +0 -31
  334. package/dist/components/composites/confirm-prompt/index.d.ts +0 -1
  335. package/dist/components/composites/cron-jobs-list/cron-jobs-list.d.ts +0 -15
  336. package/dist/components/composites/cron-jobs-list/index.d.ts +0 -1
  337. package/dist/components/composites/mcp-server-list/index.d.ts +0 -1
  338. package/dist/components/composites/mcp-server-list/mcp-server-list.d.ts +0 -15
  339. package/dist/components/composites/multi-select-prompt/index.d.ts +0 -1
  340. package/dist/components/composites/multi-select-prompt/multi-select-prompt.d.ts +0 -61
  341. package/dist/components/composites/permission-modal/index.d.ts +0 -1
  342. package/dist/components/composites/permission-modal/permission-modal.d.ts +0 -48
  343. package/dist/components/composites/preview-panel/index.d.ts +0 -1
  344. package/dist/components/composites/preview-panel/preview-panel.d.ts +0 -24
  345. package/dist/components/composites/rule-editor/index.d.ts +0 -1
  346. package/dist/components/composites/rule-editor/rule-editor.d.ts +0 -18
  347. package/dist/components/composites/skill-editor/index.d.ts +0 -1
  348. package/dist/components/composites/skill-editor/skill-editor.d.ts +0 -19
  349. package/dist/components/composites/skills-list/index.d.ts +0 -1
  350. package/dist/components/composites/skills-list/skills-list.d.ts +0 -15
  351. package/dist/components/composites/slide-deck/context.d.ts +0 -23
  352. package/dist/components/composites/slide-deck/controls.d.ts +0 -8
  353. package/dist/components/composites/slide-deck/fragments.d.ts +0 -20
  354. package/dist/components/composites/slide-deck/index.d.ts +0 -21
  355. package/dist/components/composites/slide-deck/notes.d.ts +0 -14
  356. package/dist/components/composites/slide-deck/presenter-view.d.ts +0 -15
  357. package/dist/components/composites/slide-deck/print-styles.d.ts +0 -21
  358. package/dist/components/composites/slide-deck/progress-bar.d.ts +0 -8
  359. package/dist/components/composites/slide-deck/schema.d.ts +0 -31
  360. package/dist/components/composites/slide-deck/slide-deck.d.ts +0 -78
  361. package/dist/components/composites/slide-deck/slide-number.d.ts +0 -11
  362. package/dist/components/composites/slide-deck/split-deck.d.ts +0 -2
  363. package/dist/components/composites/slide-deck/thumbnails.d.ts +0 -19
  364. package/dist/components/composites/slide-deck/use-deck-hash-routing.d.ts +0 -23
  365. package/dist/components/composites/slide-deck/use-deck-keyboard.d.ts +0 -25
  366. package/dist/components/composites/slide-deck/use-deck-state.d.ts +0 -57
  367. package/dist/components/composites/slide-deck/use-deck-swipe.d.ts +0 -20
  368. package/dist/components/composites/slide-deck/use-fullscreen.d.ts +0 -18
  369. package/dist/components/composites/stability-bundle-viewer/index.d.ts +0 -1
  370. package/dist/components/composites/stability-bundle-viewer/stability-bundle-viewer.d.ts +0 -28
  371. package/dist/components/composites/text-prompt/index.d.ts +0 -1
  372. package/dist/components/composites/text-prompt/text-prompt.d.ts +0 -48
  373. package/dist/components/composites/usage-meter/index.d.ts +0 -1
  374. package/dist/components/composites/usage-meter/usage-meter.d.ts +0 -56
  375. package/dist/components/primitives/agent-error-card/agent-error-card.d.ts +0 -47
  376. package/dist/components/primitives/agent-error-card/index.d.ts +0 -1
  377. package/dist/components/primitives/agent-event/agent-event.d.ts +0 -25
  378. package/dist/components/primitives/agent-event/index.d.ts +0 -1
  379. package/dist/components/primitives/agent-handoff/agent-handoff.d.ts +0 -24
  380. package/dist/components/primitives/agent-handoff/index.d.ts +0 -1
  381. package/dist/components/primitives/agent-profile/agent-profile.d.ts +0 -28
  382. package/dist/components/primitives/agent-profile/index.d.ts +0 -1
  383. package/dist/components/primitives/agent-starting-state/agent-starting-state.d.ts +0 -15
  384. package/dist/components/primitives/agent-starting-state/index.d.ts +0 -1
  385. package/dist/components/primitives/agent-streaming/agent-streaming.d.ts +0 -16
  386. package/dist/components/primitives/agent-streaming/index.d.ts +0 -1
  387. package/dist/components/primitives/artifact-preview/artifact-preview.d.ts +0 -25
  388. package/dist/components/primitives/artifact-preview/index.d.ts +0 -1
  389. package/dist/components/primitives/attachment-chip/attachment-chip.d.ts +0 -14
  390. package/dist/components/primitives/attachment-chip/index.d.ts +0 -1
  391. package/dist/components/primitives/audit-log-entry/audit-log-entry.d.ts +0 -29
  392. package/dist/components/primitives/audit-log-entry/index.d.ts +0 -1
  393. package/dist/components/primitives/auto-compact-notice/auto-compact-notice.d.ts +0 -24
  394. package/dist/components/primitives/auto-compact-notice/index.d.ts +0 -1
  395. package/dist/components/primitives/branch-indicator/branch-indicator.d.ts +0 -13
  396. package/dist/components/primitives/branch-indicator/index.d.ts +0 -1
  397. package/dist/components/primitives/browser-controls/browser-controls.d.ts +0 -19
  398. package/dist/components/primitives/browser-controls/index.d.ts +0 -1
  399. package/dist/components/primitives/build-log-stream/build-log-stream.d.ts +0 -51
  400. package/dist/components/primitives/build-log-stream/index.d.ts +0 -1
  401. package/dist/components/primitives/capability-indicator/capability-indicator.d.ts +0 -57
  402. package/dist/components/primitives/capability-indicator/index.d.ts +0 -1
  403. package/dist/components/primitives/channel-card/channel-card.d.ts +0 -28
  404. package/dist/components/primitives/channel-card/index.d.ts +0 -1
  405. package/dist/components/primitives/chat-thread/chat-thread.d.ts +0 -12
  406. package/dist/components/primitives/chat-thread/index.d.ts +0 -1
  407. package/dist/components/primitives/context-card/context-card.d.ts +0 -18
  408. package/dist/components/primitives/context-card/index.d.ts +0 -1
  409. package/dist/components/primitives/context-window-bar/context-window-bar.d.ts +0 -27
  410. package/dist/components/primitives/context-window-bar/index.d.ts +0 -1
  411. package/dist/components/primitives/cost-meter/cost-meter.d.ts +0 -23
  412. package/dist/components/primitives/cost-meter/index.d.ts +0 -1
  413. package/dist/components/primitives/created-files-card/created-files-card.d.ts +0 -30
  414. package/dist/components/primitives/created-files-card/index.d.ts +0 -1
  415. package/dist/components/primitives/cron-job-card/cron-job-card.d.ts +0 -30
  416. package/dist/components/primitives/cron-job-card/index.d.ts +0 -1
  417. package/dist/components/primitives/diff-viewer/diff-viewer.d.ts +0 -45
  418. package/dist/components/primitives/diff-viewer/index.d.ts +0 -1
  419. package/dist/components/primitives/export-chat-dialog/export-chat-dialog.d.ts +0 -18
  420. package/dist/components/primitives/export-chat-dialog/index.d.ts +0 -1
  421. package/dist/components/primitives/folder-context-card/folder-context-card.d.ts +0 -40
  422. package/dist/components/primitives/folder-context-card/index.d.ts +0 -1
  423. package/dist/components/primitives/folder-selector/folder-selector.d.ts +0 -18
  424. package/dist/components/primitives/folder-selector/index.d.ts +0 -1
  425. package/dist/components/primitives/gateway-status-indicator/gateway-status-indicator.d.ts +0 -19
  426. package/dist/components/primitives/gateway-status-indicator/index.d.ts +0 -1
  427. package/dist/components/primitives/hook-config/hook-config.d.ts +0 -27
  428. package/dist/components/primitives/hook-config/index.d.ts +0 -1
  429. package/dist/components/primitives/hook-event-log/hook-event-log.d.ts +0 -27
  430. package/dist/components/primitives/hook-event-log/index.d.ts +0 -1
  431. package/dist/components/primitives/intent-selector/index.d.ts +0 -1
  432. package/dist/components/primitives/intent-selector/intent-selector.d.ts +0 -22
  433. package/dist/components/primitives/lane-board/index.d.ts +0 -1
  434. package/dist/components/primitives/lane-board/lane-board.d.ts +0 -26
  435. package/dist/components/primitives/mcp-server-card/index.d.ts +0 -1
  436. package/dist/components/primitives/mcp-server-card/mcp-server-card.d.ts +0 -32
  437. package/dist/components/primitives/memory-editor/index.d.ts +0 -1
  438. package/dist/components/primitives/memory-editor/memory-editor.d.ts +0 -29
  439. package/dist/components/primitives/mention-menu/index.d.ts +0 -1
  440. package/dist/components/primitives/mention-menu/mention-menu.d.ts +0 -44
  441. package/dist/components/primitives/model-card/index.d.ts +0 -1
  442. package/dist/components/primitives/model-card/model-card.d.ts +0 -72
  443. package/dist/components/primitives/model-selector/index.d.ts +0 -1
  444. package/dist/components/primitives/model-selector/model-selector.d.ts +0 -21
  445. package/dist/components/primitives/permission-matrix/index.d.ts +0 -1
  446. package/dist/components/primitives/permission-matrix/permission-matrix.d.ts +0 -43
  447. package/dist/components/primitives/progress-checklist/index.d.ts +0 -1
  448. package/dist/components/primitives/progress-checklist/progress-checklist.d.ts +0 -18
  449. package/dist/components/primitives/project-switcher/index.d.ts +0 -1
  450. package/dist/components/primitives/project-switcher/project-switcher.d.ts +0 -32
  451. package/dist/components/primitives/quick-action-chips/index.d.ts +0 -1
  452. package/dist/components/primitives/quick-action-chips/quick-action-chips.d.ts +0 -22
  453. package/dist/components/primitives/recent-folders-list/index.d.ts +0 -1
  454. package/dist/components/primitives/recent-folders-list/recent-folders-list.d.ts +0 -21
  455. package/dist/components/primitives/rule-card/index.d.ts +0 -1
  456. package/dist/components/primitives/rule-card/rule-card.d.ts +0 -15
  457. package/dist/components/primitives/run-stats/index.d.ts +0 -1
  458. package/dist/components/primitives/run-stats/run-stats.d.ts +0 -16
  459. package/dist/components/primitives/run-status-pill/index.d.ts +0 -1
  460. package/dist/components/primitives/run-status-pill/run-status-pill.d.ts +0 -13
  461. package/dist/components/primitives/running-tasks-panel/index.d.ts +0 -1
  462. package/dist/components/primitives/running-tasks-panel/running-tasks-panel.d.ts +0 -20
  463. package/dist/components/primitives/session-list-item/index.d.ts +0 -1
  464. package/dist/components/primitives/session-list-item/session-list-item.d.ts +0 -35
  465. package/dist/components/primitives/session-timeline/index.d.ts +0 -1
  466. package/dist/components/primitives/session-timeline/session-timeline.d.ts +0 -32
  467. package/dist/components/primitives/skill-card/index.d.ts +0 -1
  468. package/dist/components/primitives/skill-card/skill-card.d.ts +0 -28
  469. package/dist/components/primitives/slide/alerts.d.ts +0 -31
  470. package/dist/components/primitives/slide/frontmatter.d.ts +0 -23
  471. package/dist/components/primitives/slide/index.d.ts +0 -16
  472. package/dist/components/primitives/slide/json-schema.d.ts +0 -9
  473. package/dist/components/primitives/slide/marpit-bg.d.ts +0 -36
  474. package/dist/components/primitives/slide/parse.d.ts +0 -59
  475. package/dist/components/primitives/slide/plugin.d.ts +0 -79
  476. package/dist/components/primitives/slide/plugins/emoji/index.d.ts +0 -8
  477. package/dist/components/primitives/slide/plugins/emoji/map.d.ts +0 -15
  478. package/dist/components/primitives/slide/plugins/math/index.d.ts +0 -6
  479. package/dist/components/primitives/slide/plugins/mermaid/index.d.ts +0 -48
  480. package/dist/components/primitives/slide/plugins/shiki/index.d.ts +0 -11
  481. package/dist/components/primitives/slide/sanitize.d.ts +0 -33
  482. package/dist/components/primitives/slide/schema.d.ts +0 -109
  483. package/dist/components/primitives/slide/slide.d.ts +0 -53
  484. package/dist/components/primitives/slide/themes/index.d.ts +0 -9
  485. package/dist/components/primitives/slide/use-slide-fit.d.ts +0 -21
  486. package/dist/components/primitives/slide/validate.d.ts +0 -33
  487. package/dist/components/primitives/steps-rail/index.d.ts +0 -1
  488. package/dist/components/primitives/steps-rail/steps-rail.d.ts +0 -24
  489. package/dist/components/primitives/sub-agent-dispatch/index.d.ts +0 -1
  490. package/dist/components/primitives/sub-agent-dispatch/sub-agent-dispatch.d.ts +0 -30
  491. package/dist/components/primitives/system-prompt-editor/index.d.ts +0 -1
  492. package/dist/components/primitives/system-prompt-editor/system-prompt-editor.d.ts +0 -25
  493. package/dist/components/primitives/task-plan/index.d.ts +0 -1
  494. package/dist/components/primitives/task-plan/task-plan.d.ts +0 -36
  495. package/dist/components/primitives/terminal-panel/index.d.ts +0 -1
  496. package/dist/components/primitives/terminal-panel/terminal-panel.d.ts +0 -32
  497. package/dist/components/primitives/thinking-level-selector/index.d.ts +0 -1
  498. package/dist/components/primitives/thinking-level-selector/thinking-level-selector.d.ts +0 -24
  499. package/dist/components/primitives/token-usage-chart/index.d.ts +0 -2
  500. package/dist/components/primitives/token-usage-chart/token-usage-chart.d.ts +0 -44
  501. package/dist/components/primitives/token-usage-chart/usage-metrics.d.ts +0 -23
  502. package/dist/components/primitives/tool-call/index.d.ts +0 -1
  503. package/dist/components/primitives/tool-call/tool-call.d.ts +0 -30
  504. package/dist/components/primitives/tool-call-card/index.d.ts +0 -1
  505. package/dist/components/primitives/tool-call-card/tool-call-card.d.ts +0 -30
  506. package/dist/components/primitives/tool-result/index.d.ts +0 -1
  507. package/dist/components/primitives/tool-result/tool-result.d.ts +0 -19
  508. package/dist/components/primitives/tools-list/index.d.ts +0 -1
  509. package/dist/components/primitives/tools-list/tools-list.d.ts +0 -32
  510. package/dist/components/primitives/whiteboard/index.d.ts +0 -2
  511. package/dist/components/primitives/whiteboard/render/freedraw.d.ts +0 -2
  512. package/dist/components/primitives/whiteboard/render/line.d.ts +0 -4
  513. package/dist/components/primitives/whiteboard/render/rough-paths.d.ts +0 -16
  514. package/dist/components/primitives/whiteboard/render/scene.d.ts +0 -3
  515. package/dist/components/primitives/whiteboard/render/shape.d.ts +0 -5
  516. package/dist/components/primitives/whiteboard/render/style.d.ts +0 -24
  517. package/dist/components/primitives/whiteboard/render/text.d.ts +0 -2
  518. package/dist/components/primitives/whiteboard/schema.d.ts +0 -596
  519. package/dist/components/primitives/whiteboard/seed.d.ts +0 -22
  520. package/dist/components/primitives/whiteboard/validate.d.ts +0 -26
  521. package/dist/components/primitives/whiteboard/viewport/use-pointer-pan.d.ts +0 -11
  522. package/dist/components/primitives/whiteboard/viewport/use-viewport.d.ts +0 -33
  523. package/dist/components/primitives/whiteboard/whiteboard.d.ts +0 -21
  524. package/dist/components.css +0 -2
  525. package/dist/composites/account-menu/index.js +0 -6
  526. package/dist/composites/account-menu/index.js.map +0 -1
  527. package/dist/composites/agent-composer/index.js +0 -8
  528. package/dist/composites/agent-composer/index.js.map +0 -1
  529. package/dist/composites/agent-editor/index.js +0 -11
  530. package/dist/composites/agent-editor/index.js.map +0 -1
  531. package/dist/composites/agent-stream/index.js +0 -24
  532. package/dist/composites/agent-stream/index.js.map +0 -1
  533. package/dist/composites/agent-timeline/index.js +0 -5
  534. package/dist/composites/agent-timeline/index.js.map +0 -1
  535. package/dist/composites/agent-tool-renderer/index.js +0 -17
  536. package/dist/composites/agent-tool-renderer/index.js.map +0 -1
  537. package/dist/composites/approval-card/index.js +0 -5
  538. package/dist/composites/approval-card/index.js.map +0 -1
  539. package/dist/composites/chat-composer/index.js +0 -6
  540. package/dist/composites/chat-composer/index.js.map +0 -1
  541. package/dist/composites/chat-message/index.js +0 -20
  542. package/dist/composites/chat-message/index.js.map +0 -1
  543. package/dist/composites/choice-prompt/index.js +0 -11
  544. package/dist/composites/choice-prompt/index.js.map +0 -1
  545. package/dist/composites/code-block/index.js +0 -5
  546. package/dist/composites/code-block/index.js.map +0 -1
  547. package/dist/composites/command-palette/index.js +0 -6
  548. package/dist/composites/command-palette/index.js.map +0 -1
  549. package/dist/composites/confirm-dialog/index.js +0 -8
  550. package/dist/composites/confirm-dialog/index.js.map +0 -1
  551. package/dist/composites/confirm-prompt/index.js +0 -7
  552. package/dist/composites/confirm-prompt/index.js.map +0 -1
  553. package/dist/composites/cron-jobs-list/index.js +0 -5
  554. package/dist/composites/cron-jobs-list/index.js.map +0 -1
  555. package/dist/composites/data-table/index.js +0 -11
  556. package/dist/composites/data-table/index.js.map +0 -1
  557. package/dist/composites/deployment-row/index.js +0 -5
  558. package/dist/composites/deployment-row/index.js.map +0 -1
  559. package/dist/composites/domain-config/index.js +0 -8
  560. package/dist/composites/domain-config/index.js.map +0 -1
  561. package/dist/composites/env-var-editor/index.js +0 -9
  562. package/dist/composites/env-var-editor/index.js.map +0 -1
  563. package/dist/composites/mcp-server-list/index.js +0 -6
  564. package/dist/composites/mcp-server-list/index.js.map +0 -1
  565. package/dist/composites/metric-card/index.js +0 -5
  566. package/dist/composites/metric-card/index.js.map +0 -1
  567. package/dist/composites/multi-select-prompt/index.js +0 -11
  568. package/dist/composites/multi-select-prompt/index.js.map +0 -1
  569. package/dist/composites/page-shell/index.js +0 -8
  570. package/dist/composites/page-shell/index.js.map +0 -1
  571. package/dist/composites/permission-modal/index.js +0 -7
  572. package/dist/composites/permission-modal/index.js.map +0 -1
  573. package/dist/composites/preview-env-card/index.js +0 -6
  574. package/dist/composites/preview-env-card/index.js.map +0 -1
  575. package/dist/composites/preview-panel/index.js +0 -5
  576. package/dist/composites/preview-panel/index.js.map +0 -1
  577. package/dist/composites/project-card/index.js +0 -6
  578. package/dist/composites/project-card/index.js.map +0 -1
  579. package/dist/composites/rollback-ui/index.js +0 -7
  580. package/dist/composites/rollback-ui/index.js.map +0 -1
  581. package/dist/composites/rule-editor/index.js +0 -12
  582. package/dist/composites/rule-editor/index.js.map +0 -1
  583. package/dist/composites/skill-editor/index.js +0 -12
  584. package/dist/composites/skill-editor/index.js.map +0 -1
  585. package/dist/composites/skills-list/index.js +0 -6
  586. package/dist/composites/skills-list/index.js.map +0 -1
  587. package/dist/composites/stability-bundle-viewer/index.js +0 -5
  588. package/dist/composites/stability-bundle-viewer/index.js.map +0 -1
  589. package/dist/composites/status-indicator/index.js +0 -4
  590. package/dist/composites/status-indicator/index.js.map +0 -1
  591. package/dist/composites/task-header/index.js +0 -5
  592. package/dist/composites/task-header/index.js.map +0 -1
  593. package/dist/composites/text-prompt/index.js +0 -10
  594. package/dist/composites/text-prompt/index.js.map +0 -1
  595. package/dist/composites/usage-meter/index.js +0 -5
  596. package/dist/composites/usage-meter/index.js.map +0 -1
  597. package/dist/fonts/LICENSE-GEIST.txt +0 -92
  598. package/dist/fonts/geist-400.woff2 +0 -0
  599. package/dist/fonts/geist-500.woff2 +0 -0
  600. package/dist/fonts/geist-600.woff2 +0 -0
  601. package/dist/fonts/geist-mono-400.woff2 +0 -0
  602. package/dist/fonts/geist-mono-500.woff2 +0 -0
  603. package/dist/fonts/geist-mono-600.woff2 +0 -0
  604. package/dist/fonts-cdn.css +0 -28
  605. package/dist/fonts.css +0 -75
  606. package/dist/index.js.map +0 -1
  607. package/dist/lib/markdown/code-block.d.ts +0 -14
  608. package/dist/lib/markdown/inline-code.d.ts +0 -10
  609. package/dist/lib/markdown/math.d.ts +0 -12
  610. package/dist/lib/markdown/mermaid.d.ts +0 -6
  611. package/dist/lib/markdown/parser.d.ts +0 -47
  612. package/dist/lib/markdown/streaming-preprocess.d.ts +0 -39
  613. package/dist/lib/prompt.d.ts +0 -40
  614. package/dist/lib/sdk-tools-adapters/index.d.ts +0 -1
  615. package/dist/lib/sdk-tools-adapters/index.js +0 -3
  616. package/dist/lib/sdk-tools-adapters/index.js.map +0 -1
  617. package/dist/lib/sdk-tools-adapters/sdk-tools-adapters.d.ts +0 -60
  618. package/dist/preset-v3-legacy.d.ts +0 -32
  619. package/dist/preset-v3-legacy.js.map +0 -1
  620. package/dist/preset.css +0 -27
  621. package/dist/primitives/action-bar/index.js +0 -4
  622. package/dist/primitives/action-bar/index.js.map +0 -1
  623. package/dist/primitives/agent-error-card/index.js +0 -5
  624. package/dist/primitives/agent-error-card/index.js.map +0 -1
  625. package/dist/primitives/agent-event/index.js +0 -5
  626. package/dist/primitives/agent-event/index.js.map +0 -1
  627. package/dist/primitives/agent-handoff/index.js +0 -4
  628. package/dist/primitives/agent-handoff/index.js.map +0 -1
  629. package/dist/primitives/agent-profile/index.js +0 -4
  630. package/dist/primitives/agent-profile/index.js.map +0 -1
  631. package/dist/primitives/agent-starting-state/index.js +0 -5
  632. package/dist/primitives/agent-starting-state/index.js.map +0 -1
  633. package/dist/primitives/agent-streaming/index.js +0 -5
  634. package/dist/primitives/agent-streaming/index.js.map +0 -1
  635. package/dist/primitives/alert/index.js +0 -4
  636. package/dist/primitives/alert/index.js.map +0 -1
  637. package/dist/primitives/artifact-preview/index.js +0 -4
  638. package/dist/primitives/artifact-preview/index.js.map +0 -1
  639. package/dist/primitives/attachment-chip/index.js +0 -4
  640. package/dist/primitives/attachment-chip/index.js.map +0 -1
  641. package/dist/primitives/audit-log-entry/index.js +0 -4
  642. package/dist/primitives/audit-log-entry/index.js.map +0 -1
  643. package/dist/primitives/auto-compact-notice/index.js +0 -5
  644. package/dist/primitives/auto-compact-notice/index.js.map +0 -1
  645. package/dist/primitives/avatar/index.js +0 -4
  646. package/dist/primitives/avatar/index.js.map +0 -1
  647. package/dist/primitives/badge/index.js +0 -4
  648. package/dist/primitives/badge/index.js.map +0 -1
  649. package/dist/primitives/branch-indicator/index.js +0 -4
  650. package/dist/primitives/branch-indicator/index.js.map +0 -1
  651. package/dist/primitives/browser-controls/index.js +0 -4
  652. package/dist/primitives/browser-controls/index.js.map +0 -1
  653. package/dist/primitives/build-log-stream/index.js +0 -7
  654. package/dist/primitives/build-log-stream/index.js.map +0 -1
  655. package/dist/primitives/button/index.js +0 -4
  656. package/dist/primitives/button/index.js.map +0 -1
  657. package/dist/primitives/capability-indicator/index.js +0 -4
  658. package/dist/primitives/capability-indicator/index.js.map +0 -1
  659. package/dist/primitives/card/index.js +0 -5
  660. package/dist/primitives/card/index.js.map +0 -1
  661. package/dist/primitives/channel-card/index.js +0 -4
  662. package/dist/primitives/channel-card/index.js.map +0 -1
  663. package/dist/primitives/chat-thread/index.js +0 -5
  664. package/dist/primitives/chat-thread/index.js.map +0 -1
  665. package/dist/primitives/checkbox/index.js +0 -4
  666. package/dist/primitives/checkbox/index.js.map +0 -1
  667. package/dist/primitives/context-card/index.js +0 -4
  668. package/dist/primitives/context-card/index.js.map +0 -1
  669. package/dist/primitives/context-window-bar/index.js +0 -4
  670. package/dist/primitives/context-window-bar/index.js.map +0 -1
  671. package/dist/primitives/copy-button/index.js +0 -5
  672. package/dist/primitives/copy-button/index.js.map +0 -1
  673. package/dist/primitives/cost-meter/index.js +0 -4
  674. package/dist/primitives/cost-meter/index.js.map +0 -1
  675. package/dist/primitives/created-files-card/index.js +0 -4
  676. package/dist/primitives/created-files-card/index.js.map +0 -1
  677. package/dist/primitives/cron-job-card/index.js +0 -4
  678. package/dist/primitives/cron-job-card/index.js.map +0 -1
  679. package/dist/primitives/danger-zone/index.js +0 -4
  680. package/dist/primitives/danger-zone/index.js.map +0 -1
  681. package/dist/primitives/dialog/index.js +0 -4
  682. package/dist/primitives/dialog/index.js.map +0 -1
  683. package/dist/primitives/diff-viewer/index.js +0 -4
  684. package/dist/primitives/diff-viewer/index.js.map +0 -1
  685. package/dist/primitives/dropdown-menu/index.js +0 -4
  686. package/dist/primitives/dropdown-menu/index.js.map +0 -1
  687. package/dist/primitives/empty-state/index.js +0 -4
  688. package/dist/primitives/empty-state/index.js.map +0 -1
  689. package/dist/primitives/export-chat-dialog/index.js +0 -5
  690. package/dist/primitives/export-chat-dialog/index.js.map +0 -1
  691. package/dist/primitives/folder-context-card/index.js +0 -4
  692. package/dist/primitives/folder-context-card/index.js.map +0 -1
  693. package/dist/primitives/folder-selector/index.js +0 -4
  694. package/dist/primitives/folder-selector/index.js.map +0 -1
  695. package/dist/primitives/form-field/index.js +0 -5
  696. package/dist/primitives/form-field/index.js.map +0 -1
  697. package/dist/primitives/gateway-status-indicator/index.js +0 -4
  698. package/dist/primitives/gateway-status-indicator/index.js.map +0 -1
  699. package/dist/primitives/hook-config/index.js +0 -5
  700. package/dist/primitives/hook-config/index.js.map +0 -1
  701. package/dist/primitives/hook-event-log/index.js +0 -4
  702. package/dist/primitives/hook-event-log/index.js.map +0 -1
  703. package/dist/primitives/input/index.js +0 -4
  704. package/dist/primitives/input/index.js.map +0 -1
  705. package/dist/primitives/intent-selector/index.js +0 -4
  706. package/dist/primitives/intent-selector/index.js.map +0 -1
  707. package/dist/primitives/label/index.js +0 -4
  708. package/dist/primitives/label/index.js.map +0 -1
  709. package/dist/primitives/lane-board/index.js +0 -4
  710. package/dist/primitives/lane-board/index.js.map +0 -1
  711. package/dist/primitives/login-split/index.js +0 -4
  712. package/dist/primitives/login-split/index.js.map +0 -1
  713. package/dist/primitives/mcp-server-card/index.js +0 -4
  714. package/dist/primitives/mcp-server-card/index.js.map +0 -1
  715. package/dist/primitives/memory-editor/index.js +0 -4
  716. package/dist/primitives/memory-editor/index.js.map +0 -1
  717. package/dist/primitives/mention-menu/index.js +0 -5
  718. package/dist/primitives/mention-menu/index.js.map +0 -1
  719. package/dist/primitives/metrics-panel/index.js +0 -4
  720. package/dist/primitives/metrics-panel/index.js.map +0 -1
  721. package/dist/primitives/model-card/index.js +0 -4
  722. package/dist/primitives/model-card/index.js.map +0 -1
  723. package/dist/primitives/model-selector/index.js +0 -4
  724. package/dist/primitives/model-selector/index.js.map +0 -1
  725. package/dist/primitives/pagination/index.js +0 -4
  726. package/dist/primitives/pagination/index.js.map +0 -1
  727. package/dist/primitives/permission-matrix/index.js +0 -5
  728. package/dist/primitives/permission-matrix/index.js.map +0 -1
  729. package/dist/primitives/pin-input/index.js +0 -5
  730. package/dist/primitives/pin-input/index.js.map +0 -1
  731. package/dist/primitives/plan-badge/index.js +0 -4
  732. package/dist/primitives/plan-badge/index.js.map +0 -1
  733. package/dist/primitives/progress/index.js +0 -4
  734. package/dist/primitives/progress/index.js.map +0 -1
  735. package/dist/primitives/progress-checklist/index.js +0 -4
  736. package/dist/primitives/progress-checklist/index.js.map +0 -1
  737. package/dist/primitives/project-switcher/index.js +0 -4
  738. package/dist/primitives/project-switcher/index.js.map +0 -1
  739. package/dist/primitives/quick-action-chips/index.js +0 -4
  740. package/dist/primitives/quick-action-chips/index.js.map +0 -1
  741. package/dist/primitives/radio-group/index.js +0 -4
  742. package/dist/primitives/radio-group/index.js.map +0 -1
  743. package/dist/primitives/recent-folders-list/index.js +0 -4
  744. package/dist/primitives/recent-folders-list/index.js.map +0 -1
  745. package/dist/primitives/rule-card/index.js +0 -4
  746. package/dist/primitives/rule-card/index.js.map +0 -1
  747. package/dist/primitives/run-stats/index.js +0 -4
  748. package/dist/primitives/run-stats/index.js.map +0 -1
  749. package/dist/primitives/run-status-pill/index.js +0 -4
  750. package/dist/primitives/run-status-pill/index.js.map +0 -1
  751. package/dist/primitives/running-tasks-panel/index.js +0 -4
  752. package/dist/primitives/running-tasks-panel/index.js.map +0 -1
  753. package/dist/primitives/scroll-area/index.js +0 -5
  754. package/dist/primitives/scroll-area/index.js.map +0 -1
  755. package/dist/primitives/select/index.js +0 -4
  756. package/dist/primitives/select/index.js.map +0 -1
  757. package/dist/primitives/session-list-item/index.js +0 -4
  758. package/dist/primitives/session-list-item/index.js.map +0 -1
  759. package/dist/primitives/session-timeline/index.js +0 -4
  760. package/dist/primitives/session-timeline/index.js.map +0 -1
  761. package/dist/primitives/sheet/index.js +0 -4
  762. package/dist/primitives/sheet/index.js.map +0 -1
  763. package/dist/primitives/sidebar/index.js +0 -4
  764. package/dist/primitives/sidebar/index.js.map +0 -1
  765. package/dist/primitives/skeleton/index.js +0 -5
  766. package/dist/primitives/skeleton/index.js.map +0 -1
  767. package/dist/primitives/skill-card/index.js +0 -4
  768. package/dist/primitives/skill-card/index.js.map +0 -1
  769. package/dist/primitives/social-auth-row/index.js +0 -4
  770. package/dist/primitives/social-auth-row/index.js.map +0 -1
  771. package/dist/primitives/stat-tile/index.js +0 -4
  772. package/dist/primitives/stat-tile/index.js.map +0 -1
  773. package/dist/primitives/status-dot/index.js +0 -6
  774. package/dist/primitives/status-dot/index.js.map +0 -1
  775. package/dist/primitives/steps-rail/index.js +0 -4
  776. package/dist/primitives/steps-rail/index.js.map +0 -1
  777. package/dist/primitives/sub-agent-dispatch/index.js +0 -4
  778. package/dist/primitives/sub-agent-dispatch/index.js.map +0 -1
  779. package/dist/primitives/switch/index.js +0 -4
  780. package/dist/primitives/switch/index.js.map +0 -1
  781. package/dist/primitives/system-prompt-editor/index.js +0 -5
  782. package/dist/primitives/system-prompt-editor/index.js.map +0 -1
  783. package/dist/primitives/table/index.js +0 -5
  784. package/dist/primitives/table/index.js.map +0 -1
  785. package/dist/primitives/tabs/index.js +0 -4
  786. package/dist/primitives/tabs/index.js.map +0 -1
  787. package/dist/primitives/task-plan/index.js +0 -4
  788. package/dist/primitives/task-plan/index.js.map +0 -1
  789. package/dist/primitives/terminal-panel/index.js +0 -5
  790. package/dist/primitives/terminal-panel/index.js.map +0 -1
  791. package/dist/primitives/textarea/index.js +0 -4
  792. package/dist/primitives/textarea/index.js.map +0 -1
  793. package/dist/primitives/thinking-level-selector/index.js +0 -5
  794. package/dist/primitives/thinking-level-selector/index.js.map +0 -1
  795. package/dist/primitives/timestamp/index.js +0 -6
  796. package/dist/primitives/timestamp/index.js.map +0 -1
  797. package/dist/primitives/toast/index.js +0 -5
  798. package/dist/primitives/toast/index.js.map +0 -1
  799. package/dist/primitives/token-usage-chart/index.js +0 -4
  800. package/dist/primitives/token-usage-chart/index.js.map +0 -1
  801. package/dist/primitives/tool-call/index.js +0 -5
  802. package/dist/primitives/tool-call/index.js.map +0 -1
  803. package/dist/primitives/tool-call-card/index.js +0 -5
  804. package/dist/primitives/tool-call-card/index.js.map +0 -1
  805. package/dist/primitives/tool-result/index.js +0 -4
  806. package/dist/primitives/tool-result/index.js.map +0 -1
  807. package/dist/primitives/tools-list/index.js +0 -4
  808. package/dist/primitives/tools-list/index.js.map +0 -1
  809. package/dist/primitives/tooltip/index.js +0 -4
  810. package/dist/primitives/tooltip/index.js.map +0 -1
  811. package/dist/primitives/topnav/index.js +0 -4
  812. package/dist/primitives/topnav/index.js.map +0 -1
  813. package/dist/primitives/update-banner/index.js +0 -4
  814. package/dist/primitives/update-banner/index.js.map +0 -1
  815. package/dist/screens/theo-code-shell.d.ts +0 -9
  816. package/dist/screens/theo-code-shell.data.d.ts +0 -147
  817. package/dist/slide/index.js +0 -4
  818. package/dist/slide/index.js.map +0 -1
  819. package/dist/slide/plugins/emoji/index.js +0 -157
  820. package/dist/slide/plugins/emoji/index.js.map +0 -1
  821. package/dist/slide/plugins/math/index.js +0 -145
  822. package/dist/slide/plugins/math/index.js.map +0 -1
  823. package/dist/slide/plugins/mermaid/index.js +0 -218
  824. package/dist/slide/plugins/mermaid/index.js.map +0 -1
  825. package/dist/slide/plugins/shiki/index.js +0 -87
  826. package/dist/slide/plugins/shiki/index.js.map +0 -1
  827. package/dist/slide/themes/default.css +0 -256
  828. package/dist/slide/themes/layouts.css +0 -143
  829. package/dist/slide/themes/violet-forge.css +0 -256
  830. package/dist/slide-deck/index.css +0 -52
  831. package/dist/slide-deck/index.css.map +0 -1
  832. package/dist/slide-deck/index.js +0 -1122
  833. package/dist/slide-deck/index.js.map +0 -1
  834. package/dist/styles-v3-legacy.css +0 -88
  835. package/dist/styles.css +0 -137
  836. package/dist/themes/anthropic-style.d.ts +0 -11
  837. package/dist/themes/aurora-terminal.d.ts +0 -9
  838. package/dist/themes/classic-paper.d.ts +0 -17
  839. package/dist/themes/color-value-pattern.d.ts +0 -22
  840. package/dist/themes/color.d.ts +0 -62
  841. package/dist/themes/define.d.ts +0 -65
  842. package/dist/themes/density.d.ts +0 -17
  843. package/dist/themes/dracula.d.ts +0 -14
  844. package/dist/themes/github-dark.d.ts +0 -11
  845. package/dist/themes/index.d.ts +0 -26
  846. package/dist/themes/linear-glass.d.ts +0 -11
  847. package/dist/themes/one-dark.d.ts +0 -11
  848. package/dist/themes/openai-style.d.ts +0 -10
  849. package/dist/themes/schema.d.ts +0 -112
  850. package/dist/themes/theme-provider.d.ts +0 -82
  851. package/dist/themes/theme-script.d.ts +0 -48
  852. package/dist/themes/theme-switcher.d.ts +0 -17
  853. package/dist/themes/types.d.ts +0 -88
  854. package/dist/themes/vercel-mono.d.ts +0 -11
  855. package/dist/themes/violet-forge.d.ts +0 -12
  856. package/dist/theo-ui-provider.d.ts +0 -50
  857. package/dist/tokens-v4.css +0 -223
  858. package/dist/tokens.css +0 -315
  859. package/dist/types/agent.d.ts +0 -19
  860. package/dist/types/chat.d.ts +0 -173
  861. package/dist/types/mode.d.ts +0 -16
  862. package/dist/types/permission.d.ts +0 -8
  863. package/dist/types/rule.d.ts +0 -28
  864. package/dist/vite-plugin.d.ts +0 -25
  865. package/dist/vite-plugin.js +0 -76
  866. package/dist/vite-plugin.js.map +0 -1
  867. package/dist/whiteboard/index.js +0 -741
  868. package/dist/whiteboard/index.js.map +0 -1
  869. package/llms.txt +0 -273
  870. package/registry/index.json +0 -910
  871. package/registry/r/account-menu.json +0 -24
  872. package/registry/r/action-bar.json +0 -22
  873. package/registry/r/agent-composer.json +0 -22
  874. package/registry/r/agent-editor.json +0 -27
  875. package/registry/r/agent-error-card.json +0 -22
  876. package/registry/r/agent-event.json +0 -24
  877. package/registry/r/agent-handoff.json +0 -22
  878. package/registry/r/agent-profile.json +0 -23
  879. package/registry/r/agent-starting-state.json +0 -22
  880. package/registry/r/agent-stream.json +0 -27
  881. package/registry/r/agent-streaming.json +0 -22
  882. package/registry/r/agent-timeline.json +0 -22
  883. package/registry/r/agent-tool-renderer.json +0 -40
  884. package/registry/r/agent-types.json +0 -15
  885. package/registry/r/alert.json +0 -22
  886. package/registry/r/approval-card.json +0 -25
  887. package/registry/r/artifact-preview.json +0 -22
  888. package/registry/r/attachment-chip.json +0 -24
  889. package/registry/r/audit-log-entry.json +0 -23
  890. package/registry/r/auto-compact-notice.json +0 -22
  891. package/registry/r/avatar.json +0 -23
  892. package/registry/r/badge.json +0 -22
  893. package/registry/r/browser-controls.json +0 -22
  894. package/registry/r/build-log-stream.json +0 -20
  895. package/registry/r/button.json +0 -23
  896. package/registry/r/capability-indicator.json +0 -23
  897. package/registry/r/card.json +0 -22
  898. package/registry/r/chat-composer.json +0 -23
  899. package/registry/r/chat-message.json +0 -124
  900. package/registry/r/chat-thread.json +0 -20
  901. package/registry/r/chat-types.json +0 -15
  902. package/registry/r/checkbox.json +0 -24
  903. package/registry/r/choice-prompt.json +0 -25
  904. package/registry/r/cn.json +0 -19
  905. package/registry/r/code-block.json +0 -21
  906. package/registry/r/command-palette.json +0 -25
  907. package/registry/r/confirm-dialog.json +0 -25
  908. package/registry/r/confirm-prompt.json +0 -21
  909. package/registry/r/context-card.json +0 -23
  910. package/registry/r/context-window-bar.json +0 -20
  911. package/registry/r/copy-button.json +0 -22
  912. package/registry/r/cost-meter.json +0 -22
  913. package/registry/r/created-files-card.json +0 -23
  914. package/registry/r/cron-job-card.json +0 -22
  915. package/registry/r/cron-jobs-list.json +0 -23
  916. package/registry/r/danger-zone.json +0 -20
  917. package/registry/r/data-table.json +0 -27
  918. package/registry/r/deployment-row.json +0 -23
  919. package/registry/r/dialog.json +0 -23
  920. package/registry/r/diff-viewer.json +0 -20
  921. package/registry/r/domain-config.json +0 -25
  922. package/registry/r/dropdown-menu.json +0 -23
  923. package/registry/r/empty-state.json +0 -20
  924. package/registry/r/env-var-editor.json +0 -26
  925. package/registry/r/env.json +0 -15
  926. package/registry/r/folder-context-card.json +0 -23
  927. package/registry/r/folder-selector.json +0 -22
  928. package/registry/r/form-field.json +0 -23
  929. package/registry/r/hook-config.json +0 -22
  930. package/registry/r/hook-event-log.json +0 -22
  931. package/registry/r/input.json +0 -22
  932. package/registry/r/intent-selector.json +0 -24
  933. package/registry/r/label.json +0 -22
  934. package/registry/r/lane-board.json +0 -20
  935. package/registry/r/live-region-context.json +0 -16
  936. package/registry/r/login-split.json +0 -20
  937. package/registry/r/mcp-server-card.json +0 -22
  938. package/registry/r/mcp-server-list.json +0 -23
  939. package/registry/r/memory-editor.json +0 -23
  940. package/registry/r/mention-menu.json +0 -23
  941. package/registry/r/metric-card.json +0 -23
  942. package/registry/r/metrics-panel.json +0 -22
  943. package/registry/r/mode-types.json +0 -15
  944. package/registry/r/model-card.json +0 -23
  945. package/registry/r/model-selector.json +0 -23
  946. package/registry/r/multi-select-prompt.json +0 -25
  947. package/registry/r/page-shell.json +0 -25
  948. package/registry/r/pagination.json +0 -22
  949. package/registry/r/permission-matrix.json +0 -22
  950. package/registry/r/permission-modal.json +0 -24
  951. package/registry/r/permission-types.json +0 -15
  952. package/registry/r/pin-input.json +0 -20
  953. package/registry/r/plan-badge.json +0 -20
  954. package/registry/r/preview-env-card.json +0 -25
  955. package/registry/r/preview-panel.json +0 -21
  956. package/registry/r/progress-checklist.json +0 -23
  957. package/registry/r/progress.json +0 -20
  958. package/registry/r/project-card.json +0 -25
  959. package/registry/r/project-switcher.json +0 -22
  960. package/registry/r/prompt.json +0 -15
  961. package/registry/r/quick-action-chips.json +0 -21
  962. package/registry/r/radio-group.json +0 -23
  963. package/registry/r/recent-folders-list.json +0 -22
  964. package/registry/r/rollback-ui.json +0 -24
  965. package/registry/r/rule-card.json +0 -23
  966. package/registry/r/rule-editor.json +0 -28
  967. package/registry/r/rule-types.json +0 -18
  968. package/registry/r/run-stats.json +0 -22
  969. package/registry/r/running-tasks-panel.json +0 -22
  970. package/registry/r/safe-href.json +0 -16
  971. package/registry/r/scroll-area.json +0 -22
  972. package/registry/r/select.json +0 -24
  973. package/registry/r/session-list-item.json +0 -20
  974. package/registry/r/session-timeline.json +0 -22
  975. package/registry/r/sheet.json +0 -24
  976. package/registry/r/sidebar.json +0 -19
  977. package/registry/r/skeleton.json +0 -19
  978. package/registry/r/skill-card.json +0 -24
  979. package/registry/r/skill-editor.json +0 -28
  980. package/registry/r/skills-list.json +0 -23
  981. package/registry/r/slide-deck.json +0 -130
  982. package/registry/r/slide-plugin-emoji.json +0 -28
  983. package/registry/r/slide-plugin-math.json +0 -24
  984. package/registry/r/slide-plugin-mermaid.json +0 -23
  985. package/registry/r/slide-plugin-shiki.json +0 -23
  986. package/registry/r/slide.json +0 -123
  987. package/registry/r/social-auth-row.json +0 -21
  988. package/registry/r/stat-tile.json +0 -22
  989. package/registry/r/status-dot.json +0 -21
  990. package/registry/r/status-indicator.json +0 -20
  991. package/registry/r/steps-rail.json +0 -20
  992. package/registry/r/sub-agent-dispatch.json +0 -22
  993. package/registry/r/switch.json +0 -23
  994. package/registry/r/system-prompt-editor.json +0 -22
  995. package/registry/r/table.json +0 -22
  996. package/registry/r/tabs.json +0 -22
  997. package/registry/r/tailwind-preset.json +0 -19
  998. package/registry/r/task-header.json +0 -24
  999. package/registry/r/task-plan.json +0 -22
  1000. package/registry/r/task-types.json +0 -15
  1001. package/registry/r/terminal-panel.json +0 -22
  1002. package/registry/r/text-prompt.json +0 -24
  1003. package/registry/r/textarea.json +0 -22
  1004. package/registry/r/theme-provider.json +0 -60
  1005. package/registry/r/theme-script.json +0 -18
  1006. package/registry/r/theo-ui-provider.json +0 -20
  1007. package/registry/r/timestamp.json +0 -21
  1008. package/registry/r/toast.json +0 -30
  1009. package/registry/r/token-usage-chart.json +0 -20
  1010. package/registry/r/tokens.json +0 -21
  1011. package/registry/r/tool-call-card.json +0 -23
  1012. package/registry/r/tool-call.json +0 -22
  1013. package/registry/r/tool-result.json +0 -20
  1014. package/registry/r/tools-list.json +0 -23
  1015. package/registry/r/tooltip.json +0 -22
  1016. package/registry/r/topnav.json +0 -22
  1017. package/registry/r/types.json +0 -15
  1018. package/registry/r/usage-meter.json +0 -21
  1019. package/registry/r/whiteboard.json +0 -101
package/CHANGELOG.md DELETED
@@ -1,1797 +0,0 @@
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
- ### Added
11
-
12
- ### Changed
13
-
14
- ### Deprecated
15
-
16
- ### Removed
17
-
18
- ### Fixed
19
-
20
- ### Security
21
-
22
- ## [0.17.0] - 2026-06-22
23
-
24
- ### Added
25
- - `TokenUsageChart` gains `maxScale` (fix the y-axis maximum so multiple charts
26
- share a scale — bars exceeding it clamp to 100% while the tooltip + a11y table
27
- keep the true number) and `splitSeries` (render input vs output as adjacent
28
- grouped bars instead of stacked). Plus pure `toUsageMetrics(points)` (totals +
29
- peak per-period total) and `splitUsagePoints(points)` (transpose into parallel
30
- `labels`/`input`/`output` series) helpers, exported from
31
- `@theokit/ui/token-usage-chart` and the root barrel. (M5-7)
32
- - `toAgentStreamItems({ history, live }, { classifyTool? })` — a pure, order-aware
33
- builder that merges completed conversation `UIMessage`s with live `AgentEvent`s
34
- into the `AgentStreamItem[]` that `<AgentStream>` renders: history becomes
35
- `message` items, live activity becomes `tool-call` items (status mapped from
36
- `AgentEventStatus`), history-then-live. `classifyTool` customizes each
37
- tool-call item per event (presentational fields only — `kind`/`id`/`status`
38
- stay authoritative). Ships `mapAgentEventStatus` + the now-exported
39
- `MessageStreamItem`/`ToolCallStreamItem` item types. (M5-6)
40
- - `useStickToBottom` — auto-scrolls a scroll container to the bottom as content
41
- grows, but only while the user is pinned near the bottom (a `threshold` guard),
42
- so it never yanks the view away while they read history. Streamed content is
43
- detected with a `MutationObserver` (a scroll container's box does not resize as
44
- content grows inside it), with a `ResizeObserver` on top for box-size changes
45
- like images finishing load. Encapsulates the Radix
46
- `[data-radix-scroll-area-viewport]` selector: attach `scrollRef` to a
47
- `<ScrollArea>` and the hook resolves the real scrollable node internally.
48
- Ships the pure `isNearBottom` helper too. Exported from `@theokit/ui/scroll-area`
49
- and the root barrel. (M5-5)
50
- - `@theokit/ui/sdk-tools-adapters` — pure converters from `@theokit/sdk-tools`
51
- tool results into theo-ui rich-primitive props: `adaptGitDiffResult`
52
- (parses a unified diff into `DiffViewer` hunks), `adaptReadFileResult`
53
- (`CodeBlock`), `adaptShellResult` (`TerminalPanel` lines), `adaptListDirResult`
54
- (`DataTable` rows), `adaptApplyPatchResult` (`CreatedFilesCard` files), plus the
55
- reusable `parseUnifiedDiff`. Each returns `null` on an error/unparseable result
56
- so a tool card keeps its `ToolCallPart` fallback. The adapters are pure and
57
- import nothing from `@theokit/sdk-tools` at runtime — consumers gain zero new
58
- runtime dependency; a dev-only contract test imports the real factories and
59
- runs their handlers to guard against result-shape drift. (M5-4)
60
- - `AgentToolRenderer` — an overridable tool-renderer registry for the chat
61
- surface. A tool invocation is dispatched to a rich renderer (diff, terminal,
62
- code, created-files, data-table) by a classification function, falling back to
63
- `ToolCallPart` for anything unmapped. `<ChatMessage>` now accepts
64
- `toolRenderers` (shallow-merged over the default) and `classifyTool` props
65
- alongside the existing `partRenderers` / `dataRenderers`; `partRenderers.tool`
66
- still takes priority. Exposed via `@theokit/ui/agent-tool-renderer` and the
67
- root barrel: `AgentToolRenderer`, `defaultToolRegistry`, `defaultClassifyTool`,
68
- `resolveToolRenderer`, and the `ToolRenderer` / `ToolRendererKind` /
69
- `ToolRendererRegistry` / `ClassifyTool` types. `ToolCallPart` now lives in this
70
- module (the fallback tool renderer) and is re-exported unchanged. Behavior
71
- note: with the default registry, a tool whose name matches a known kind (e.g.
72
- `git_diff`, `shell`, `read_file`) and whose state is `output-available` now
73
- renders its rich surface instead of the generic `ToolCallPart`; unmapped tools
74
- and every non-`output-available` state (streaming, awaiting-approval, error,
75
- denied) are unchanged and keep using `ToolCallPart`. Pass `classifyTool` /
76
- `toolRenderers` to override. (M5-3)
77
-
78
- ### Changed
79
- - Public copy aligned to honest, ecosystem-fit framing across `README.md`,
80
- `PITCH.md`, and `CLAUDE.md`: removed the unsubstantiated multi-framework
81
- compatibility claims (Next.js / Vite / Remix / Astro / Tanstack "CI-verified")
82
- and the false "peer-deps on React only" line. Reframed as a standard React +
83
- Tailwind package that pairs with TheoKit or runs standalone, with the RSC
84
- fix described as "Server-Component safe" rather than a marketed Next.js
85
- target. Counts corrected to 153 components / 1,513 tests / 151 stories and the
86
- stale `@theokit/ui@next` install snippets updated to `@theokit/ui` (now
87
- published to `latest`).
88
- - README refreshed: component count corrected to 153, the v0.16.0 shadcn-v4
89
- features documented (`data-slot`, `"use client"`/RSC, per-subpath types), and
90
- the inaccurate "peer-deps on React only" line corrected (React is the only
91
- required peer; Radix/CVA/cmdk/lucide ship as dependencies). (#13)
92
-
93
- ### Deprecated
94
-
95
- ### Removed
96
- - `PITCH.md` (landing-page marketing copy) removed from the repo. Public copy
97
- now lives in `README.md` + the docs site; the Voice/Tone scope in `CLAUDE.md`
98
- and `rules/public-copy.md` and the `public-copy-lint` hook were updated to
99
- drop the `PITCH.md` reference.
100
-
101
- ### Fixed
102
- - **Visual-regression gate tolerates cross-environment antialiasing.** The
103
- Playwright `toHaveScreenshot` config used `threshold: 0.001` + `maxDiffPixels: 0`
104
- (zero tolerance), so the 101 snapshots only ever matched the exact machine that
105
- generated them — they failed in CI with 488-1882 antialiased pixels differing
106
- (ratio ≤0.2%, no real regression). Raised to Playwright's antialiasing-robust
107
- default `threshold: 0.2` with a `maxDiffPixels: 200` safety net that still
108
- fails on a genuine visual regression (thousands+ of pixels). (Internal CI
109
- hygiene.) (#15)
110
- - **Bundle-size gate scoped to deterministic artifacts.** `dist/components.css`
111
- is a Tailwind v4 `@source`-scanned generated file whose exact byte size is
112
- environment-sensitive (~470KB locally vs ~104KB on CI runners — both valid
113
- output, differing by Tailwind's v3/v4 `@import` resolution across pnpm
114
- layouts). It is removed from the byte-exact ±5% bundle gate (which now stays
115
- focused on the deterministic shipped JS/dts bundles) and remains bounded by
116
- the environment-robust `dogfood:precompiled-utilities` gate. (Internal CI
117
- hygiene.) (#15)
118
- - **`shadcn add chat-message` no longer references a moved file.** M5-3 moved
119
- `ToolCallPart` out of `chat-message/parts/` into the new `agent-tool-renderer`
120
- component, but the `chat-message` registry descriptor still listed the old
121
- `parts/tool-call-part.tsx` path — so the shadcn-compatible copy-paste path
122
- was broken. `agent-tool-renderer` is now its own first-class registry item
123
- (with story + test) and `chat-message` declares it as a `registryDependency`.
124
- (#15)
125
- - **Agent-stream barrel-wiring test no longer flakes under suite load.** The
126
- `await import("./index.js")` smoke test occasionally exceeded vitest's 5s
127
- default (observed 5078ms) under worker-pool contention on cold runners. The
128
- global `testTimeout` is raised to 20s — a hard ceiling that still fails a
129
- genuinely hung test. (#15)
130
- - **`quality:gates` typecheck no longer blocks on dev-only playground demos.**
131
- `playground/**` self-imports the package's own built subpaths
132
- (`@theokit/ui/slide`, `/slide-deck`, `/slide/plugins/*`), which resolve to
133
- `dist/*.d.ts` — absent when `pnpm typecheck` runs before `pnpm build`, so the
134
- gate had failed (TS2307) on every release since 0.14.0. Playground is
135
- non-shipped demo code exercised via Ladle, so it is excluded from the gate
136
- typecheck instead of blocking releases. (Internal CI hygiene.) (#15)
137
- - **Release build no longer depends on a pnpm-specific `.bin` shim.**
138
- `scripts/build-precompiled-css.ts` resolved the Tailwind v4 CLI at a nested
139
- `@tailwindcss/cli/node_modules/.bin/tailwindcss` path that pnpm only
140
- materializes in some hoist layouts — absent under CI's `--frozen-lockfile`
141
- install, so `pnpm build` failed and the tagged release never published. Now
142
- resolves the package's own declared `bin` entry from its `package.json` and
143
- runs it via `node`, independent of any `.bin` shim. (#14)
144
- - **`@theokit/sdk-tools` file-link devDependency removed.** The M5-4 contract
145
- test had pulled in `@theokit/sdk-tools: file:../theokit-sdk/...`, which does
146
- not resolve under `pnpm install --frozen-lockfile` in CI (no sibling repo) and
147
- blocked the publish. The 25 adapter unit tests validate against the documented
148
- `{ ok: true, ... }` result shapes; the factory result contract is owned by the
149
- SDK repo. (#14)
150
- - **Status indicators now render their colors under the v3 Tailwind preset.**
151
- `StatusIndicator` uses `bg-status-online` / `-offline` / `-degraded` / `-info`,
152
- but the `status` color palette was never added to `tailwind-preset.ts` (only
153
- the v4 `@theme` declared `--color-status-*`), so those utilities resolved to
154
- transparent in the v3 build path (e.g. the Ladle dev server) — the dots were
155
- invisible. Added the `status` palette to the preset, mapped to the existing
156
- `--status-*` tokens. The npm/v4 build was already correct. Registry
157
- `tailwind-preset.json` regenerated.
158
- - **npm publish CI restored.** The `release.yml` (and `deploy-ladle.yml`) GitHub
159
- Actions workflow failed on every tagged release since v0.14.1 because
160
- `pnpm/action-setup@v4` pinned `version: 9.15.0`, conflicting with
161
- `package.json`'s `packageManager: pnpm@10.32.1`
162
- (`ERR_PNPM_BAD_PM_VERSION`). Removed the hardcoded version so the package
163
- actually publishes to npm again. (#13)
164
-
165
- ### Security
166
-
167
- ## [0.17.0] - 2026-06-22
168
-
169
- ### Added
170
- - `TokenUsageChart` gains `maxScale` (fix the y-axis maximum so multiple charts
171
- share a scale — bars exceeding it clamp to 100% while the tooltip + a11y table
172
- keep the true number) and `splitSeries` (render input vs output as adjacent
173
- grouped bars instead of stacked). Plus pure `toUsageMetrics(points)` (totals +
174
- peak per-period total) and `splitUsagePoints(points)` (transpose into parallel
175
- `labels`/`input`/`output` series) helpers, exported from
176
- `@theokit/ui/token-usage-chart` and the root barrel. (M5-7)
177
- - `toAgentStreamItems({ history, live }, { classifyTool? })` — a pure, order-aware
178
- builder that merges completed conversation `UIMessage`s with live `AgentEvent`s
179
- into the `AgentStreamItem[]` that `<AgentStream>` renders: history becomes
180
- `message` items, live activity becomes `tool-call` items (status mapped from
181
- `AgentEventStatus`), history-then-live. `classifyTool` customizes each
182
- tool-call item per event (presentational fields only — `kind`/`id`/`status`
183
- stay authoritative). Ships `mapAgentEventStatus` + the now-exported
184
- `MessageStreamItem`/`ToolCallStreamItem` item types. (M5-6)
185
- - `useStickToBottom` — auto-scrolls a scroll container to the bottom as content
186
- grows, but only while the user is pinned near the bottom (a `threshold` guard),
187
- so it never yanks the view away while they read history. Streamed content is
188
- detected with a `MutationObserver` (a scroll container's box does not resize as
189
- content grows inside it), with a `ResizeObserver` on top for box-size changes
190
- like images finishing load. Encapsulates the Radix
191
- `[data-radix-scroll-area-viewport]` selector: attach `scrollRef` to a
192
- `<ScrollArea>` and the hook resolves the real scrollable node internally.
193
- Ships the pure `isNearBottom` helper too. Exported from `@theokit/ui/scroll-area`
194
- and the root barrel. (M5-5)
195
- - `@theokit/ui/sdk-tools-adapters` — pure converters from `@theokit/sdk-tools`
196
- tool results into theo-ui rich-primitive props: `adaptGitDiffResult`
197
- (parses a unified diff into `DiffViewer` hunks), `adaptReadFileResult`
198
- (`CodeBlock`), `adaptShellResult` (`TerminalPanel` lines), `adaptListDirResult`
199
- (`DataTable` rows), `adaptApplyPatchResult` (`CreatedFilesCard` files), plus the
200
- reusable `parseUnifiedDiff`. Each returns `null` on an error/unparseable result
201
- so a tool card keeps its `ToolCallPart` fallback. The adapters are pure and
202
- import nothing from `@theokit/sdk-tools` at runtime — consumers gain zero new
203
- runtime dependency; a dev-only contract test imports the real factories and
204
- runs their handlers to guard against result-shape drift. (M5-4)
205
- - `AgentToolRenderer` — an overridable tool-renderer registry for the chat
206
- surface. A tool invocation is dispatched to a rich renderer (diff, terminal,
207
- code, created-files, data-table) by a classification function, falling back to
208
- `ToolCallPart` for anything unmapped. `<ChatMessage>` now accepts
209
- `toolRenderers` (shallow-merged over the default) and `classifyTool` props
210
- alongside the existing `partRenderers` / `dataRenderers`; `partRenderers.tool`
211
- still takes priority. Exposed via `@theokit/ui/agent-tool-renderer` and the
212
- root barrel: `AgentToolRenderer`, `defaultToolRegistry`, `defaultClassifyTool`,
213
- `resolveToolRenderer`, and the `ToolRenderer` / `ToolRendererKind` /
214
- `ToolRendererRegistry` / `ClassifyTool` types. `ToolCallPart` now lives in this
215
- module (the fallback tool renderer) and is re-exported unchanged. Behavior
216
- note: with the default registry, a tool whose name matches a known kind (e.g.
217
- `git_diff`, `shell`, `read_file`) and whose state is `output-available` now
218
- renders its rich surface instead of the generic `ToolCallPart`; unmapped tools
219
- and every non-`output-available` state (streaming, awaiting-approval, error,
220
- denied) are unchanged and keep using `ToolCallPart`. Pass `classifyTool` /
221
- `toolRenderers` to override. (M5-3)
222
-
223
- ### Changed
224
- - Public copy aligned to honest, ecosystem-fit framing across `README.md`,
225
- `PITCH.md`, and `CLAUDE.md`: removed the unsubstantiated multi-framework
226
- compatibility claims (Next.js / Vite / Remix / Astro / Tanstack "CI-verified")
227
- and the false "peer-deps on React only" line. Reframed as a standard React +
228
- Tailwind package that pairs with TheoKit or runs standalone, with the RSC
229
- fix described as "Server-Component safe" rather than a marketed Next.js
230
- target. Counts corrected to 153 components / 1,513 tests / 151 stories and the
231
- stale `@theokit/ui@next` install snippets updated to `@theokit/ui` (now
232
- published to `latest`).
233
- - README refreshed: component count corrected to 153, the v0.16.0 shadcn-v4
234
- features documented (`data-slot`, `"use client"`/RSC, per-subpath types), and
235
- the inaccurate "peer-deps on React only" line corrected (React is the only
236
- required peer; Radix/CVA/cmdk/lucide ship as dependencies). (#13)
237
-
238
- ### Deprecated
239
-
240
- ### Removed
241
- - `PITCH.md` (landing-page marketing copy) removed from the repo. Public copy
242
- now lives in `README.md` + the docs site; the Voice/Tone scope in `CLAUDE.md`
243
- and `rules/public-copy.md` and the `public-copy-lint` hook were updated to
244
- drop the `PITCH.md` reference.
245
-
246
- ### Fixed
247
- - **Status indicators now render their colors under the v3 Tailwind preset.**
248
- `StatusIndicator` uses `bg-status-online` / `-offline` / `-degraded` / `-info`,
249
- but the `status` color palette was never added to `tailwind-preset.ts` (only
250
- the v4 `@theme` declared `--color-status-*`), so those utilities resolved to
251
- transparent in the v3 build path (e.g. the Ladle dev server) — the dots were
252
- invisible. Added the `status` palette to the preset, mapped to the existing
253
- `--status-*` tokens. The npm/v4 build was already correct. Registry
254
- `tailwind-preset.json` regenerated.
255
- - **npm publish CI restored.** The `release.yml` (and `deploy-ladle.yml`) GitHub
256
- Actions workflow failed on every tagged release since v0.14.1 because
257
- `pnpm/action-setup@v4` pinned `version: 9.15.0`, conflicting with
258
- `package.json`'s `packageManager: pnpm@10.32.1`
259
- (`ERR_PNPM_BAD_PM_VERSION`). Removed the hardcoded version so the package
260
- actually publishes to npm again. (#13)
261
-
262
- ### Security
263
-
264
- ## [0.16.0] - 2026-06-18
265
-
266
- ### Added
267
- - **`data-slot` attribute on every component (shadcn v4 convention).** All 135
268
- components now emit `data-slot="<name>"` on their root element (compound
269
- sub-parts carry `data-slot="<name>-<part>"`), so consumers can target and
270
- override styles via stable attribute selectors instead of relying on Tailwind
271
- class order. New quality gate `validateDataSlot` enforces presence on every
272
- component. (community-standard-componentization, T2.1)
273
- - **Per-subpath TypeScript declarations.** Importing `@theokit/ui/button` now
274
- resolves an isolated `Button`-only `.d.ts` instead of the entire barrel's
275
- type surface, so type-checking a single subpath no longer loads all 135
276
- components' types. Declarations are emitted by `tsc -p tsconfig.dts.json`
277
- (tsup's bundler OOMs at 130+ entries). (community-standard-componentization, T3.1)
278
- - **`data-variant` / `data-size` on cva components (shadcn v4).** The 9
279
- variant-driven components (Button, Badge, Avatar, Select, Switch, Input,
280
- Textarea, Checkbox, Toast) now emit `data-variant`/`data-size` alongside
281
- `data-slot`, so consumers can style by attribute (e.g.
282
- `[data-slot=button][data-variant=secondary]`). The `*Variants` helpers remain
283
- exported for class reuse. (community-standard-componentization, T5.1)
284
-
285
- - `"use client"` directive added to the 45 client component source files
286
- (anything using React hooks/context), matching shadcn/ui conventions.
287
- - Post-build step `scripts/inject-use-client.ts` re-injects the directive into
288
- the output entry shims + component chunks (esbuild strips it during
289
- `splitting`). Wired into the `build` script.
290
- - New quality gate `validateUseClientDirective` — fails the build if a client
291
- component ships without the directive in `dist/`. (T1.2)
292
-
293
-
294
- ### Changed
295
- - Tailwind v4 devDep alignment + v3-legacy removal (Phase 4) is deferred to a
296
- dedicated `tailwind-v4-migration` cycle — see ADR 0001. The shipped
297
- `dist/components.css` is already built with Tailwind v4; the deferred work is
298
- the dev/test version label + the v3-legacy compat artifacts.
299
- - Bundle baseline updated for the new per-subpath declaration strategy: the
300
- barrel `dist/index.d.ts` is now a thin re-export (15 KB vs the old 206 KB
301
- inlined monolith) because per-component types live in their own files under
302
- `dist/components/`. Engine `.d.ts` moved from `dist/<engine>/` to
303
- `dist/components/.../`. (community-standard-componentization, T3.1)
304
- - Bundle baseline for `dist/components.css` corrected to the full `@source`
305
- scan size (the prior baseline was set in an environment where Tailwind v4's
306
- `@source` glob under-scanned the library tree — a known pnpm-symlink
307
- fragility documented in `scripts/build-precompiled-css.ts`). The
308
- `data-slot` / `"use client"` work is bundle-neutral — verified empirically
309
- (removing `data-slot` leaves `components.css` byte-identical). `dist/slide`
310
- and `dist/slide-deck` grew by a few bytes from the directive + data-slot.
311
- NOTE: `components.css` size is `@source`-environment-sensitive; CI should
312
- confirm the full-scan value reproduces in its environment.
313
-
314
-
315
- ### Fixed
316
- - **`@theokit/ui` now works in Next.js App Router (React Server Components).**
317
- The `"use client"` directive is preserved in the published build so importing
318
- a client component (anything using hooks) no longer throws *"useState only
319
- works in a Client Component"*. Previously esbuild stripped the directive under
320
- code-splitting, so every npm-installed client component was broken in RSC
321
- projects. Both consumption paths are fixed — subpath (`@theokit/ui/agent-event`)
322
- and barrel (`@theokit/ui`). (community-standard-componentization, T1.1)
323
-
324
- ## [0.15.0] - 2026-06-16
325
-
326
- ### Added
327
- - **Prompt composites — "ask the user" cards for agent surfaces, modeled on
328
- Claude Code's question UX.** Four self-contained composites, each rendering
329
- one question at a time (sequencing across questions is the consumer's
330
- responsibility — there is no built-in flow orchestrator):
331
- - **`ChoicePrompt`** — single-select (radio). Header chip, options with
332
- label + description, `1`..`9` number-key shortcuts (terminal-style
333
- selection), injectable free-text "Other" option, and a side-by-side preview
334
- pane when options carry preview content. Emits `onConfirm` with the chosen
335
- value (plus the typed Other text when relevant).
336
- - **`MultiSelectPrompt`** — multi-select (checkbox). Same surface as
337
- `ChoicePrompt` with number-key toggles, an Other row, a `minSelected` gate,
338
- and a stacked preview pane for every selected option. Emits `onConfirm`
339
- with the value array.
340
- - **`TextPrompt`** — free-text. Single-line `Input` or multi-line `Textarea`
341
- with an optional `required` gate. Emits `onConfirm` with the typed text.
342
- - **`ConfirmPrompt`** — binary yes/no. Optional `destructive` variant that
343
- tones the confirm action red and exposes the card as an `alertdialog`.
344
- Controlled or uncontrolled. Ships a `prompt` registry lib item carrying the
345
- shared `PromptOption` type + helpers consumed by the choice composites.
346
-
347
- ## [0.14.4] - 2026-06-13
348
-
349
- ### Added
350
-
351
- - `pnpm dev:pack` script for local cross-repo consumption — generates tarball at `dist/theokit-ui-{version}.tgz` that installs without dual-React symlink issues. Documented in CONTRIBUTING.md.
352
-
353
- ## [0.14.3] - 2026-06-09
354
-
355
- **Patch — PageShell content spacing standardization.**
356
-
357
- ### Fixed
358
- - **`PageShell` content slot now renders direct children with `flex flex-col gap-6`.**
359
- Previously the content `<div>` had no internal spacing, so pages with 2+
360
- top-level children (e.g. dashboard `/memory` landing with 5 sibling
361
- sections: KPI strip + trend grid + getting-started card + Explore
362
- heading + Explore grid) rendered them flush against each other. The new
363
- wrapper matches the outer `<main className="flex flex-col gap-6">` gap,
364
- so spacing is uniform across the page. Pages that already wrap content
365
- in a single grid or div are unaffected — `gap-6` only applies between
366
- sibling elements. Equivalent to manually wrapping every page's content
367
- in `<div className="flex flex-col gap-6">`, but enforced at the
368
- composite level so every consumer benefits without per-page churn.
369
-
370
- ## [0.14.2] - 2026-06-09
371
-
372
- **Patch — build-pipeline correctness. Bundles the 0.14.1 color migration
373
- plus two FAANG-grade fixes that were required to ship a clean build to
374
- npm. 0.14.1 was tagged in git but never published to the npm registry;
375
- 0.14.2 is the first published artifact carrying the violet unification.**
376
-
377
- ### Added
378
- - **`src/lib/env.ts` — typed environment helpers (`isDev()`, `isProd()`).**
379
- Centralizes `process.env.NODE_ENV` reads through a single typed accessor
380
- that uses `globalThis.process?.env?.NODE_ENV`. Works in browser via
381
- bundler `define` injection (Vite/Webpack/esbuild), in Node (SSR/tests),
382
- and defensively in browser-without-bundler-injection (returns
383
- `isDev() === true` to err on the side of more diagnostics). This is the
384
- same pattern React, Radix, and Stripe Elements use — funnel every
385
- `NODE_ENV` read through a typed helper so consumers' bundlers can
386
- dead-code-eliminate dev-only branches in their production build.
387
-
388
- ### Changed
389
- - **Six components migrated from raw `process.env.NODE_ENV` to `isDev()`.**
390
- `theme-provider`, `status-dot`, `timestamp`, `env-var-editor`,
391
- `thinking-level-selector`, `build-log-stream`. No behavior change in
392
- consumer production builds — only a typecheck-cleanliness and
393
- build-stability improvement. The previous direct `process.env` reads
394
- triggered TypeScript `TS2591` failures unless `@types/node` was listed
395
- in `tsconfig.json#compilerOptions.types`. Adding `"node"` there is the
396
- workaround we explicitly rejected: it pollutes the ambient global
397
- namespace of a UI library with Node-only APIs (`Buffer`, `fs`, `path`,
398
- `Stream`) and surfaces them in author autocomplete inside React
399
- components. The typed helper is the right pattern.
400
-
401
- ### Fixed
402
- - **`src/vite-plugin.test.ts:76` — implicit `any` on `.map` callback parameter.**
403
- Annotated as `(c: unknown[])`. Pre-existing TypeScript strictness
404
- violation unrelated to the violet migration, but the typecheck job in
405
- `prepublishOnly`'s `quality:gates` must be clean for publish to proceed.
406
-
407
- ## [0.14.1] - 2026-06-09 — NOT PUBLISHED
408
-
409
- Tagged in git as `v0.14.1` but never published to the npm registry. The
410
- build pipeline surfaced two pre-existing TypeScript errors (six raw
411
- `process.env.NODE_ENV` reads + one implicit-`any` test assertion) that
412
- needed to be fixed before publish. The color migration carried out by
413
- this commit is bundled into `0.14.2` (see above) along with those fixes.
414
-
415
- **Patch (token value change only — full backward-compat preserved).**
416
-
417
- ### Changed
418
- - **Theo violet primary unified to `#A855F7` electric violet**. The Violet Forge theme's `--primary` (and matching `--ring`) moved from `#7C3AED` (`oklch(0.542 0.245 293)`) to `#A855F7` (`oklch(0.628 0.225 296)`) — same family, higher chroma at higher lightness, calmer execution without cyberpunk halos. Decision based on cross-surface unification (marketing + cloud/dashboard share one cor): the new value reads as production-grade premium and works consistently across light + dark surfaces. Burnt sienna accent `#C96442` is preserved (warmth complement unchanged). `--primary-deep` and `--primary-glow` continue to derive algorithmically via OKLCH relative-color syntax — no manual override needed. Files touched: `src/styles/tokens.css` (light + dark `--primary` and `--ring`), `src/themes/violet-forge.ts` (light + dark `primary` and `ring`), `src/components/primitives/slide/themes/violet-forge.css` (`--theo-slide-accent`), `src/components/primitives/whiteboard/whiteboard.stories.tsx` (stroke demo), `src/themes/color.ts` (JSDoc examples refreshed). Tests in `src/themes/color.test.ts` intentionally left unchanged — they test the `hex()` function with `#7C3AED` as a static example, decoupled from brand color choice. Consumers (theo-website, theo-cloud/dashboard, theokit framework) pick up the new color automatically on next install/rebuild via `@theokit/ui/preset.css`.
419
-
420
- ## [0.14.0] - 2026-06-03
421
-
422
- **Minor (additive — full backward-compat preserved via legacy helpers).**
423
-
424
- Community best practices alignment cohort. Migrates `@theokit/ui` from HSL split to OKLCH as the canonical color format, introduces status semantic tokens, two new composites (StatusIndicator + MetricCard), a lint rule banning literal Tailwind color classes in components, `prefers-color-scheme` auto-detect, forced-colors (Windows High Contrast Mode) support, and a Playwright visual regression baseline. All 6 ADRs (0004-0009), full migration guide, and 5 new test files shipped. WCAG AA preserved across 10 themes × 2 modes. `classic-paper` rebalanced to visibly warm cream (per Vintage Paper + Anthropic Claude UI references) for reduced vision fatigue on long agent sessions.
425
-
426
- See [docs/migration/hsl-to-oklch.md](docs/migration/hsl-to-oklch.md) for the full upgrade guide.
427
-
428
- ### Added — Community Best Practices Alignment (2026-06-03)
429
-
430
- - **Status semantic token group** (ADR-0007). New `ColorScale` keys
431
- `--status-online`, `--status-offline`, `--status-degraded`, `--status-info`
432
- plus foreground companions — 8 keys × 11 themes. Separates operational state
433
- (gateway alive/dead/slow/info) from action-result (success/destructive/warning/info).
434
- - **`StatusIndicator` composite** consuming the status group. API:
435
- `<StatusIndicator status="online" label="Connected" pulse?>`.
436
- - **`MetricCard` composite** for dashboard tiles. API:
437
- `<MetricCard title value delta={{value,trend}} hint? icon? invertTrend? />`.
438
- `invertTrend` flips trend semantics for cost/churn/latency metrics (EC-17).
439
- - **`respectSystemMode` prop** on `<ThemeProvider>` (default `true`, ADR-0009).
440
- Reads `(prefers-color-scheme: dark)` on hydration and subscribes to OS changes.
441
- User-driven `setMode()` overrides the system signal. `matchMedia` listener
442
- cleanup on unmount (EC-12).
443
- - **`forced-colors` media query** in `tokens.css` (ADR-0008). Maps semantic
444
- tokens to system colors (Canvas, CanvasText, Highlight, ...) for Windows
445
- High Contrast Mode. WCAG 2.2 SC 1.4.1/1.4.3.
446
- - **Container query sizes** (`--container-3xs` through `--container-7xl`)
447
- declared in `tokens-v4.css` for Tailwind v4 `@container` variants.
448
- - **Algorithmic tonal derivations** for `--primary-deep`, `--primary-glow`,
449
- `--accent-deep` via OKLCH relative-color syntax with `max()`/`min()`
450
- anti-overflow clamps (ADR-0006, EC-7).
451
- - **Lint rule scanner** `scripts/lib/literal-color-scanner.ts` blocks literal
452
- Tailwind color classes in `src/components/**/*.tsx`. Wired into
453
- `pnpm quality:structure` (ADR-0004). 14 unit tests.
454
- - **Valibot theme schema** `src/themes/schema.ts` (D5 revised — Valibot
455
- ~1.5KB gzipped vs Zod ~12KB).
456
- - **OKLCH `color-value-pattern.ts`** extracted from `theme-provider.tsx`.
457
- Accepts plain OKLCH, relative-color syntax (EC-5), HSL split, hex, var().
458
-
459
- ### Changed — Community Best Practices Alignment (2026-06-03)
460
-
461
- - **All 11 built-in themes migrated from HSL split to OKLCH** (ADR-0005).
462
- 638 values converted via `scripts/migrate-themes-to-oklch.ts`. Round-trip
463
- delta ~0.001 L per value (visually equivalent, < 0.5% pixel diff).
464
- Legacy HSL split format still accepted by the runtime validator.
465
- - **`tokens-v4.css` aliases** drop `hsl()` wrapper —
466
- `--color-primary: var(--primary)` direct.
467
- - **`tokens.css` shadows + texture utilities** use
468
- `color-mix(in oklch, var(--x) N%, transparent)` for alpha composition.
469
- - **`hex()` and `rgb()` helpers** now return `oklch(L C H)` strings (T2.6).
470
- - **`gateway-status-indicator`, `run-status-pill`, `update-banner`,
471
- `stability-bundle-viewer`** swept of 12 literal Tailwind color classes
472
- → semantic tokens. Closes hidden theme-switching bug.
473
- - **`primary-deep` / `primary-glow` / `accent-deep`** are now `optional`
474
- in `ColorScale`. CSS auto-derives via `oklch(from ...)` when omitted.
475
- - **`validateThemeContrast`** accepts both HSL split and OKLCH input.
476
-
477
- ### Deprecated — Community Best Practices Alignment
478
-
479
- - **`hexToHsl(input)`** and **`rgbToHslLegacy(r, g, b)`** — use `hex()` /
480
- `rgb()` (OKLCH output) instead. Removal scheduled for next major.
481
-
482
- ## [0.13.0] - 2026-05-29
483
-
484
- **Minor (additive only — zero breaking changes).**
485
-
486
- Seven new components shipped as Phase 1 of the `theokit-ui-parity` plan
487
- (`.claude/knowledge-base/plans/theokit-ui-parity-plan.md` v1.1). All seven
488
- mirror OpenClaw Control UI patterns the framework lacked, designed to be
489
- composable into any theokit app via `@theokit/ui` barrel.
490
-
491
- ### Added — Phase 2 component
492
-
493
- - **`<ChannelCard>`** (primitive, `agent/`) — inbound gateway connection
494
- surface (Telegram, Discord, Slack, WhatsApp, Webhook, MCP). 4 statuses
495
- (`disconnected | connecting | connected | error`) with the toggle button
496
- reflecting the current state: `connected` shows "Disconnect", others show
497
- "Connect", `connecting` keeps the button disabled (transient state guard).
498
- Closed `ChannelPlatform` enum prevents silent typos at the backend
499
- boundary. 7 Vitest tests including vitest-axe. Ladle story with 5
500
- variants (Connected/Disconnected/Connecting/ErrorState/MCP). Consumed by
501
- the dogfood-app `/channels` page end-to-end against the
502
- `server/routes/channels.ts` registry.
503
-
504
- ### Added — Phase 1 components (44/44 Vitest GREEN)
505
-
506
- - **`<ThinkingLevelSelector>`** (primitive, `agent/`) — multi-state combobox
507
- for LLM reasoning budget. Mirrors OpenClaw thinking selector. Values:
508
- `"inherited" | "off" | "minimal" | "low" | "medium" | "high" | "xhigh"`.
509
- - **`<RunStatusPill>`** (primitive, `agent/`) — compact status indicator
510
- for Run/Task lifecycle. 6 states mirror SDK `Task` enum (D362):
511
- `queued | in_progress | finished | error | cancelled | interrupted`.
512
- - **`<BranchIndicator>`** (primitive, `agent/`) — small "×N" pill that
513
- shows when a run was retried/branched. Returns `null` for `< 2` or
514
- non-integer (EC-10 guard).
515
- - **`<GatewayStatusIndicator>`** (primitive, `infra/`) — live
516
- connection-status dot. 4 statuses (online/offline/degraded/reconnecting)
517
- × 2 variants (compact/labeled) + optional latency text.
518
- - **`<UpdateBanner>`** (primitive, `infra/`) — top-of-app alert for newer
519
- version. Dismiss persistence is consumer's responsibility (EC-16).
520
- - **`<ExportChatDialog>`** (primitive, `agent/`) — modal exporting chat in
521
- `markdown | json | jsonl | sharegpt`. Async-aware (disables buttons
522
- during pending export).
523
- - **`<StabilityBundleViewer>`** (composite, `infra/`) — crash bundle JSON
524
- inspector. Sections collapse independently. EC-9 absorbed: handles
525
- missing optional sections gracefully.
526
-
527
- ### Added — Phase 0 tooling
528
-
529
- - **`scripts/inventory-components.mjs`** — walks
530
- `src/components/{primitives,composites}/<name>/` producing
531
- `component-inventory.json`. CI drift-gate seed.
532
- - **`scripts/generate-missing-stories.mjs`** — gerador + CI check mode.
533
- EC-5/D12 absorbed: ships `kebabToPascal(name)` helper with 9 Vitest
534
- cases + match-confirmation via `export\s+...` regex.
535
- - **`wrangler.toml` + `.github/workflows/deploy-ladle.yml`** —
536
- Cloudflare Pages deploy config for the Ladle component catalog.
537
- Workflow contains `pnpm ladle:build` step BEFORE deploy (EC-14).
538
- - New package scripts: `inventory`, `stories:check`, `stories:generate`,
539
- `stories:test`.
540
-
541
- ### Changed — Build pipeline hardening
542
-
543
- - **`scripts/regen-subpath-exports.ts`** now delegates to `sync-exports.ts`
544
- for the final write. Previously the post-build step sorted ALL exports
545
- alphabetically while `sync-exports.buildExports` produced the canonical
546
- `BASE → sorted components → ISOLATED` order — meaning `pnpm build &&
547
- pnpm quality:structure` regressed every time. The validator and the
548
- build now share a single source of truth.
549
- - **`scripts/sync-exports.ts`** now post-formats `package.json` via
550
- `biome format --write` after writing. `JSON.stringify(_, _, 2)` always
551
- expands short arrays like `sideEffects` and `onlyBuiltDependencies`,
552
- while `pnpm format:check` (Biome) expects them inline; the two were
553
- fighting after every sync.
554
- - **`tailwind.config.ts`** dropped the `satisfies Config` clause. The
555
- preset (`src/styles/tailwind-preset.ts`) resolves the v4 `Config` type
556
- via the `src/styles/node_modules/tailwindcss` symlink to v4.3.0, while
557
- the root config would resolve v3.4.19 — the v3/v4 type seam mismatched
558
- on `darkMode` (`DarkModeStrategy` vs `Partial<DarkModeConfig>`).
559
- Runtime correctness is enforced by `pnpm dogfood:v4-zero-config`.
560
- - **`biome.json`** override extended to cover `scripts/**/*.mjs` so the
561
- `noConsole` rule does not block tool scripts (it was already exempted
562
- for `.ts`).
563
- - **`pin-input.tsx`** — removed stale `// biome-ignore lint/suspicious/noArrayIndexKey`
564
- comment now flagged as unused suppression.
565
- - **`export-chat-dialog.tsx` + `run-status-pill.tsx` + `thinking-level-selector.tsx`** —
566
- added precise `biome-ignore` comments documenting the `a11y/useSemanticElements`
567
- and `suspicious/noConsole` exceptions, with the reason inline.
568
-
569
- ### Documentation
570
-
571
- - 7 new component pages under `theo-opendocs/content/theoui/{agent,infra}/`.
572
- - New `ChannelCard` page under `theo-opendocs/content/theoui/agent/channel-card.mdx`
573
- with live preview (`ComponentPreview` + `PropsTable`) deployed to
574
- `https://channel-card.theo-opendocs.pages.dev/`.
575
-
576
- ## [0.12.0] - 2026-05-28
577
-
578
- **Stable release — promoted from `0.12.0-next.0` after dogfood validation + cross-repo contract gates landed.**
579
-
580
- 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.
581
-
582
- ### Added (dogfood-fixes-and-coverage-expansion T4.1, 2026-05-28)
583
-
584
- - **`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.
585
- - **`prepublishOnly`** hook estendido: `pnpm build && pnpm test:contract && node scripts/validate-exports.mjs`. EC-8 fix do edge case review FAANG-grade.
586
- - **`validate:exports`** script standalone — pode rodar manual `pnpm validate:exports`.
587
-
588
- ### Added (cross-repo-integration-coesao, 2026-05-28)
589
-
590
- - **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.
591
- - **`vitest.config.ts`** include estendido para cobrir `tests/**/*.{test,spec}.ts` (era só `src/`).
592
-
593
- ## [0.12.0-next.0] - 2026-05-25
594
-
595
- Minor (additive, zero breaking change) — ships two LLM-facing artifacts
596
- that complement the existing `llms.txt`: a structured visual spec
597
- (`DESIGN.md`) and a companion agent skill (`skills/theo-ui/`).
598
-
599
- ### Added
600
-
601
- - **`DESIGN.md` at repo root (NEW)** — plain-text design system spec
602
- for LLM assistants generating UI against `@theokit/ui`. Follows the
603
- awesome-design-md 9-section canonical structure (Visual Theme &
604
- Atmosphere · Color Palette & Roles · Typography Rules · Layout
605
- Principles · Depth & Elevation · Component Stylings · Responsive
606
- Behavior · Do's and Don'ts · Agent Prompt Guide). Tokens mirror
607
- `src/styles/tokens.css` and `src/themes/violet-forge.ts`. Shipped
608
- via `package.json > files` alongside `llms.txt` and `CHANGELOG.md`
609
- so consumers see the visual spec at `node_modules/@theokit/ui/DESIGN.md`.
610
- Reference research lives at
611
- `.claude/knowledge-base/reference/design-md-convention.md`.
612
- - **`skills/theo-ui/` companion agent skill (NEW)** — library-aware
613
- design skill for AI coding assistants (Claude Code, Cursor, Codex,
614
- OpenCode, Windsurf, Copilot) installable via the `vercel-labs/skills`
615
- CLI:
616
-
617
- ```
618
- npx skills add usetheodev/theo-ui
619
- ```
620
-
621
- Four verbs (default build / `audit` / `migrate` / `catalog`), 32
622
- universal slop-test gates plus surface-specific extensions, pre-emit
623
- self-critique on six axes (Library-fit · Token-fidelity · Composition ·
624
- A11y · Restraint · Voice), 12 page archetypes (P1–P12), 5 surfaces
625
- (agent-chat · cloud-dashboard · settings-form · marketing · auth).
626
- Project memory at `.theo-ui-skill/log.json`. 30 files, ~9300 lines
627
- of markdown, ~416 KB. Distributed via the GitHub repo (not the npm
628
- package). Root README ships Option C in Quickstart pointing
629
- consumers at the skill.
630
-
631
- ## [0.11.0-next.0] - 2026-05-25
632
-
633
- Minor (additive, zero breaking change) — ships Brief #5 from the
634
- TheoCloud dashboard team, closing 3 measured Deep Review findings.
635
- Five new components: 3 brief-asks (PinInput, DataTable, PageShell)
636
- + 2 explicit pre-requisites (DropdownMenu, ActionBar) that the
637
- brief assumed existed but didn't.
638
-
639
- Plan: `.claude/knowledge-base/plans/dashboard-primitives-brief-5-plan.md`
640
- ADR: `.claude/knowledge-base/decisions/page-shell-composite-pattern.md`
641
- Brief: `theo/docs/handoff/2026-05-25-theo-ui-cloud-dashboard-brief-5.md`
642
-
643
- ### Added
644
-
645
- - **`<DropdownMenu>` primitive (NEW, Brief #5 pre-req)** — accessible
646
- menu built on `@radix-ui/react-dropdown-menu` (already a bundled
647
- dep, no new peer needed). Sub-components attached via
648
- `Object.assign`: `Trigger`, `Portal`, `Content`, `Item`,
649
- `CheckboxItem`, `RadioItem`, `Label`, `Separator`, `Shortcut`,
650
- `Group`, `Sub`, `SubTrigger`, `SubContent`, `RadioGroup`. Styled
651
- with `@theokit/ui` design tokens. Consolidates 5 prior direct-
652
- Radix usages (`model-selector`, `intent-selector`, `agent-profile`,
653
- `theme-switcher`, `theo-code-shell`) under a single styled
654
- wrapper. 6 unit tests + 5 Ladle stories. SSR-safe.
655
- - **`<ActionBar>` primitive (NEW, Brief #5 pre-req)** — page-top
656
- action strip with three optional slots: search input (flex-1,
657
- grows to fill), filter icon button, primary action button
658
- (right-aligned). Returns `null` when no slots are provided.
659
- Primary action supports `loading` state with `Loader2` spinner.
660
- Usable standalone or composed inside `<PageShell>`. 6 unit tests
661
- + 5 Ladle stories.
662
- - **`<PinInput>` primitive (NEW)** — multi-slot OTP / code input
663
- with auto-advance focus, paste handling (whitespace stripped),
664
- arrow-key navigation, backspace clearing + focus back. Default
665
- 6 slots, configurable. `inputMode="numeric"` (default, triggers
666
- mobile numeric keyboard via `pattern="[0-9]*"`) or
667
- `alphanumeric` (auto-uppercase). Optional `mask` renders bullets.
668
- Optional `error` state applies destructive border. `onComplete`
669
- fires once on transitions to complete (NOT on mount with pre-
670
- filled value — verified via test). Closes Deep Review § 2.12 P2
671
- (Verification page off-brand single-input pattern). 17 unit
672
- tests + 7 Ladle stories.
673
- - **`<DataTable>` composite (NEW)** — generic, sortable,
674
- expandable composite over `<Table>` + `<Pagination>` +
675
- `<Skeleton>` + `<EmptyState>` + `<DropdownMenu>`. Generic over
676
- `T` (e.g. `DataTable<Domain>`). Sortable headers (controlled via
677
- `onSortChange` OR uncontrolled client-side). Sticky header
678
- (default true). Expandable rows with `expandable(row)` callback
679
- — multi-row default, opt-in `expandMode="single"`. Row actions
680
- via `rowActions(row)` opens DropdownMenu. Client-side pagination
681
- with `pageSize`; sort changes reset to page 0. Loading state
682
- renders 5 skeleton rows. Empty state delegates to `<EmptyState>`
683
- or custom `emptyState` prop. Expanded row `colSpan` correctly
684
- accounts for chevron + actions columns (EC-1 fix). pageSize<=0
685
- clamps to 1 graceful degradation. Closes Deep Review Top-5
686
- fix #2, § 2.2 P1, § 2.4 P1 (card-grid → sortable table for
687
- Domains + Projects). 19 unit tests + 8 Ladle stories.
688
- - **`<PageShell>` composite (NEW)** — page-level scaffold. Title
689
- + optional description + optional ActionBar (when search /
690
- primaryAction / onFilterClick provided), then one of four
691
- mutually-exclusive content states with strict precedence:
692
- loading > error > empty > children. Default loading is a
693
- centered spinner Card; `loadingNode?` escape hatch for custom
694
- skeletons. Error renders Card with message + optional retry
695
- button + optional docs link. Empty delegates to `<EmptyState>`.
696
- `aria-busy="true"` on the `<main>` element while loading. Does
697
- NOT manage `document.title` (D3 scope-narrowing); consumers
698
- wire `onTitleChange?` callback to their own hook. Dedupes
699
- ~20 LOC × 13 dashboard pages of boilerplate. 15 unit tests + 6
700
- Ladle stories.
701
-
702
- ### Notes
703
-
704
- - Edge-case review surfaced 1 MUST FIX (DataTable expanded row
705
- colSpan miscalculation when rowActions present) + 14 SHOULD TEST
706
- + 7 DOCUMENT — all incorporated into TDD blocks before
707
- implementation.
708
- - D3 scope-narrowing: PageShell does NOT include `useSetPageTitle`
709
- / `PageMetaProvider` — those are consumer-scope hooks. The
710
- library exposes only the visible heading + an `onTitleChange?`
711
- callback for the consumer to wire their own title management.
712
- - DropdownMenu consolidation is opt-in: the 5 existing direct-
713
- Radix usages stay untouched in this release; migration is a
714
- follow-up PR.
715
- - Zero new peer-deps. `@radix-ui/react-dropdown-menu` was already
716
- bundled.
717
-
718
- ### Bundle delta (consumer canary, measured 2026-05-25)
719
-
720
- Measured against TheoCloud dashboard (no consumer migration to the
721
- new primitives yet — pure version bump):
722
-
723
- | Metric | 0.10.0-next.0 | 0.11.0-next.0 | Δ |
724
- |---|---|---|---|
725
- | `@theokit/ui` chunk | 10.96 KB brotli | 10.98 KB brotli | **+0.02 KB (+0.2%)** |
726
- | TOTAL initial JS | 134.68 KB brotli | 135.56 KB brotli | +0.88 KB (+0.6%) |
727
-
728
- Per-chunk cap (18 KB): passes with 7.02 KB headroom.
729
- Total hard gate (180 KB): passes with 44.44 KB headroom.
730
-
731
- The +0.02 KB chunk delta is effectively noise — confirms Brief #4's
732
- per-component dist + tree-shaking works: 5 new components ship as
733
- separate chunks and the consumer correctly drops all of them while
734
- they aren't imported. Post-consumer-migration delta is expected at
735
- +10-15 KB brotli (Brief #6 follow-up).
736
-
737
- Evidence:
738
- `.claude/knowledge-base/baselines/2026-05-26-post-brief-5/theocloud-bundle-delta.txt`
739
-
740
- ## [0.10.0-next.0] - 2026-05-25
741
-
742
- Minor (additive, zero breaking change) — fixes a publishing-pipeline
743
- defect surfaced by the TheoCloud dashboard bundle audit
744
- (`MEET-ASYNC-AMENDMENT-2026-05-24-002`). Since 0.7.0, the ~100 subpath
745
- exports declared in `package.json#exports` (`./alert`, `./button`,
746
- `./table`, …) were **cosmetic** — each pointed at the same
747
- `./dist/index.js` (the 417 KB barrel). `import { Alert } from
748
- "@theokit/ui/alert"` resolved byte-identical to
749
- `import { Alert } from "@theokit/ui"`, and barrel tree-shaking
750
- failed in consumers because of `forwardRef` side-effect bailouts,
751
- `Object.assign` compound components, and `sideEffects: ["**/*.css"]`
752
- conservatism. TheoCloud measured **0 KB dropped** from the 240 KB
753
- minified barrel regardless of how few exports were used.
754
-
755
- This release extends the per-component dist pattern that already
756
- worked for `whiteboard` / `slide` / `slide-deck` to every primitive
757
- and composite. The barrel `import { X } from "@theokit/ui"` is
758
- preserved unchanged (additive migration shape, same as `@mui/material`).
759
-
760
- Plan: `.claude/knowledge-base/plans/subpath-tree-shaking-plan.md`
761
- ADR: `.claude/knowledge-base/decisions/subpath-exports-per-component.md`
762
- Brief: `theo/docs/handoff/2026-05-24-theo-ui-subpath-tree-shaking-brief-4.md`
763
-
764
- ### Changed
765
-
766
- - **`tsup.config.ts`** auto-globs primitive + composite entries from
767
- `src/components/{primitives,composites}/<name>/index.ts` at
768
- config-load time. 87 primitives + 26 composites — 3 excluded
769
- (`whiteboard`, `slide`, `slide-deck` retain their existing manual
770
- isolated entries). New components ship subpath-shaped automatically
771
- without `package.json#exports` hand-maintenance.
772
- - **`splitting: true`** in tsup now dedupes shared utilities (`cn`,
773
- forwardRef wrappers, theme helpers, lucide icon imports) into
774
- `dist/chunk-<hash>.js` instead of inlining into every per-component
775
- bundle. ~119 shared chunks emitted; barrel + per-component dist
776
- files re-export from them.
777
- - **`dts: { entry: ... }`** restricted to the barrel + isolated
778
- engines only (D5 escalation). Generating per-component `.d.ts` for
779
- all 114 entries OOMs the rollup-plugin-dts worker thread even with
780
- `NODE_OPTIONS=--max-old-space-size=8192` (the flag does not
781
- propagate to workers). Per-component subpaths resolve their `types`
782
- field at the barrel `dist/index.d.ts` — TypeScript still finds
783
- `Alert`/`AlertProps` from `import { Alert } from "@theokit/ui/alert"`.
784
- Trade-off: consumers' typecheck pulls the full type graph regardless
785
- of subpath, but the JS dist (where tree-shaking matters) is
786
- per-component and small.
787
-
788
- ### Added
789
-
790
- - **`scripts/regen-subpath-exports.ts`** — runs after `tsup` and
791
- rewrites `package.json#exports` so per-component subpaths point at
792
- their own dist file. Refuses to write if any non-root entry still
793
- points at `./dist/index.js` (permanent guard against the cosmetic-
794
- subpath defect coming back). Verifies that every source-tree
795
- component has a matching dist entry (EC-2 guard against silent
796
- partial builds). Wired into `package.json#scripts.build` so
797
- `pnpm build` produces a consistent `dist/` + `exports` map every
798
- time.
799
- - **`scripts/sync-exports.ts`** updated to resolve each component's
800
- layer (primitives vs composites) via filesystem and emit the
801
- correct per-component dist path. Stays the source-of-truth for
802
- the structure gate; `regen-subpath-exports.ts` is the same logic
803
- applied post-build against the actual dist tree.
804
-
805
- ### Bundle deltas
806
-
807
- | File | Before (0.9.0-next.0) | After (0.10.0-next.0) | Δ |
808
- |---|---|---|---|
809
- | `dist/index.js` | 417,113 B | 49,018 B | **−88.2%** |
810
- | `dist/slide/index.js` | 23,825 B | 400 B | −98.3% |
811
- | `dist/slide-deck/index.js` | 58,413 B | 35,795 B | −38.7% |
812
- | `dist/components.css` | 89,654 B | 93,069 B | +3.8% (within ±5%) |
813
- | `dist/styles.css` | 4,720 B | 4,720 B | 0% |
814
- | **Build time** | 17.72 s | 15.98 s | −10% |
815
- | **Tarball (`pnpm pack`)** | 1.1 MB | 1.2 MB | +9% |
816
- | **New per-component dist files** | 0 | 113 | + |
817
- | **Shared chunks (`dist/chunk-*.js`)** | 0 | 119 | + |
818
-
819
- The barrel shrank because all component code now lives in shared
820
- chunks. **Consumer-side bundle delta against TheoCloud dashboard
821
- (measured 2026-05-25):**
822
-
823
- | Metric | 0.9.0-next.0 | 0.10.0-next.0 | Δ |
824
- |---|---|---|---|
825
- | `@theokit/ui` chunk | 36.96 KB brotli | 10.96 KB brotli | **−26.00 KB (−70.3%)** |
826
- | TOTAL initial JS | 176.27 KB brotli | 134.68 KB brotli | −41.59 KB (−23.6%) |
827
-
828
- Per-chunk cap (50 KB): passes with 39 KB headroom (was 13 KB).
829
- Total hard gate (240 KB): passes with 105 KB headroom (was 64 KB).
830
-
831
- **Notable:** the savings were realized WITHOUT migrating consumer
832
- imports to subpath form. The barrel benefits from tree-shaking now
833
- because `dist/index.js` is structured as a collection of
834
- per-component re-exports from shared chunks — Vite/Rollup's
835
- tree-shaker can drop individual chunks per consumer usage. Subpath-
836
- form migration is expected to yield additional savings on top.
837
-
838
- Evidence file:
839
- `.claude/knowledge-base/baselines/2026-05-25-post-subpath/theocloud-bundle-delta.txt`
840
-
841
- ### Migration (consumer-side, opt-in)
842
-
843
- ```diff
844
- - import { Card, Button, Alert } from "@theokit/ui";
845
- + import { Card } from "@theokit/ui/card";
846
- + import { Button } from "@theokit/ui/button";
847
- + import { Alert } from "@theokit/ui/alert";
848
- ```
849
-
850
- The barrel import keeps working — migration is gradual, file by
851
- file. CSS, themes, and isolated engines stay barrel-imported:
852
- `import { ThemeProvider, violetForge } from "@theokit/ui"`,
853
- `import "@theokit/ui/styles.css"`.
854
-
855
- ## [0.9.0-next.0] - 2026-05-23
856
-
857
- Minor — adds the two deferred primitives revealed by the Brief #3
858
- review (`Alert` + `Pagination`). Both are additive; zero breaking
859
- change. The release closes the lower-priority follow-ups left over
860
- from Briefs #1/#2 — `Alert` replaces the consumer's 27-LOC
861
- `<VerificationBanner>` composition; `Pagination` is forward-positioned
862
- for when `<Table>` (0.8) starts paginating Billing / Audit / Team
863
- data at scale.
864
-
865
- Plan: filed as Brief #3 in
866
- `theo/docs/handoff/2026-05-23-theo-ui-cloud-dashboard-gaps-brief-3.md`.
867
-
868
- ### Added
869
-
870
- - **`<Alert>` primitive (NEW)** — persistent inline notice. Four
871
- intents: `info` (Info icon, primary token), `success`
872
- (CheckCircle2, success), `warning` (TriangleAlert, warning),
873
- `destructive` (AlertCircle, destructive). Optional `title`,
874
- `description`, right-aligned `action` slot (consumer-provided
875
- ReactNode), and `onDismiss` handler (renders an `X` button).
876
- `destructive` intent renders `role="alert"` (assertive
877
- announcement); other intents render `role="status"` (polite) —
878
- matches WAI-ARIA conventions for status messaging. Distinct
879
- from `Toast` (transient + corner) and `EmptyState` (centered
880
- card). 13 unit tests + 5 Ladle stories. Brief #3 consumer:
881
- TheoCloud `<VerificationBanner>` → 3-line `<Alert>`.
882
- - **`<Pagination>` primitive (NEW)** — accessible page-number
883
- navigation. Renders `<nav aria-label="Pagination">` with
884
- first / prev / numbers / next / last buttons + visual ellipses
885
- when `totalPages` exceeds the visible range. Active page carries
886
- `aria-current="page"`. Keyboard nav (`ArrowLeft` / `ArrowRight` /
887
- `Home` / `End`) on the nav element. Configurable `siblingCount`
888
- (default 1) + optional `showJumpButtons` (default true) +
889
- `size` (`sm | md`). Returns `null` when `totalPages <= 1`. Also
890
- exports a pure `computePageRange(currentPage, totalPages,
891
- siblingCount)` helper for unit-testing the range logic in
892
- isolation — most pagination bugs live in that function. 21 unit
893
- tests (6 on `computePageRange` alone) + 6 Ladle stories.
894
- Forward-positioned for `<Table>` v2 consumers.
895
-
896
- ## [0.8.0-next.0] - 2026-05-23
897
-
898
- Minor — adds eight cross-cutting primitives revealed by the systematic
899
- review of the remaining 11 dashboard pages (Projects, Environments,
900
- Team, Billing, Domains, Settings, Profile, Login, Register,
901
- Verification, Recovery, DeviceSuccess) + recurring PaaS UI patterns.
902
- Each component is used in ≥3 distinct sites in the consumer dashboard.
903
- 6 are true primitives (Table, StatusDot, CopyButton, Timestamp,
904
- StatTile, DangerZone); 2 are composites by taxonomy gate
905
- (ConfirmDialog depends on Dialog/Input/Button; CodeBlock depends on
906
- CopyButton). Zero breaking change; zero new peer-deps.
907
-
908
- Plan: `.claude/knowledge-base/plans/dashboard-paas-primitives-2-plan.md`.
909
- Edge-case review: `.claude/knowledge-base/reviews/edge-cases/dashboard-paas-primitives-2-edge-cases-2026-05-23.md`.
910
- Consumer brief: `theo/docs/handoff/2026-05-23-theo-ui-cloud-dashboard-gaps-brief-2.md`.
911
-
912
- ### Added
913
-
914
- - **`<Table>` primitive (NEW)** — semantic data-table with sub-components
915
- `Table.Header`, `Table.Body`, `Table.Row`, `Table.Cell`,
916
- `Table.HeaderCell`. Supports `density` (`default` / `compact` via
917
- Context), per-cell `align` (`left` / `center` / `right`), `numeric`
918
- cells (`font-mono tabular-nums`), and sortable header cells
919
- (`onSort` + `sortDirection` with ChevronUp/ChevronDown affordance
920
- + `aria-sort`). `sortDirection` without `onSort` is a no-op (header
921
- stays static); `sortDirection="none"` with `onSort` renders both
922
- chevrons dimmed (`opacity-30`). 10 unit tests + 4 Ladle stories.
923
- Brief #2 consumer: TheoCloud dashboard.
924
- - **`<StatusDot>` primitive (NEW)** — semantic status indicator
925
- (small colored circle + optional label). Five `status` kinds:
926
- `live` (success), `building` (warning, auto-pulses), `failed`
927
- (destructive), `idle` (muted), `warning` (warning, static). Three
928
- sizes (`xs` 6px / `sm` 8px default / `md` 10px). When neither
929
- `label` nor `aria-label` is provided, auto-applies
930
- `aria-label={status}` + emits a dev-only warning (color-only
931
- status is invisible to screen readers). 12 unit tests + 3 stories.
932
- Brief #2 consumer: TheoCloud dashboard (7+ sites).
933
- - **`<CopyButton>` primitive (NEW)** — click-to-copy primitive wrapping
934
- `navigator.clipboard.writeText`. Icon swap (Copy → Check on success,
935
- Copy → X on failure), `aria-live="polite"` announcement for screen
936
- readers, optional `label`, `ghost`/`outline` variants, two sizes,
937
- `onCopied` callback, configurable `feedbackDuration` (default
938
- 1500ms). SSR-safe (guards `navigator?.clipboard?.writeText`); HTTP
939
- non-localhost contexts (where the Clipboard API is undefined) fall
940
- back to the failed state instead of throwing. Auto-cleans the
941
- revert timer on unmount; debounces double-clicks. 12 unit tests +
942
- 4 Ladle stories. Brief #2 consumer: TheoCloud dashboard.
943
- - **`<Timestamp>` primitive (NEW)** — accessible `<time datetime>`
944
- element with `relative` (default) / `absolute` / `both` formats.
945
- Uses zero-dep `Intl.RelativeTimeFormat`. Auto-refreshes via
946
- `setInterval` (default 60s, `refreshInterval={0}` disables).
947
- Native `title` HTML attribute carries the absolute time on hover
948
- (no Tooltip component dependency — keeps Timestamp a true
949
- primitive). `aria-label` always carries the full date. Invalid
950
- date renders an empty `<time>` element; invalid locale falls back
951
- to default with a dev warning. `value` accepts ISO string, Date,
952
- or **Unix milliseconds** (documented in JSDoc — passing seconds
953
- renders ~1970). 13 unit tests + 4 Ladle stories. Brief #2
954
- consumer: TheoCloud dashboard (every dashboard page).
955
- - **`<StatTile>` primitive (NEW)** — big-number stat tile for
956
- dashboard summary rows. `value` + `label` + optional `icon` +
957
- optional `delta` (`{value, trend}` with `trend: "up" | "down" |
958
- "flat"` driving TrendingUp/TrendingDown/Minus icons and
959
- success/destructive/muted color). Dual mode (button/div) based on
960
- `onClick` — same pattern as `AccountMenu`/`ProjectSwitcher`. Value
961
- uses `font-display tabular-nums whitespace-nowrap`. 7 unit tests
962
- + 4 Ladle stories. Brief #2 consumer: TheoCloud Overview
963
- dashboard (3 tiles per page).
964
- - **`<DangerZone>` primitive (NEW)** — destructive-actions section
965
- with sub-component `DangerZone.Action`. Red-bordered container
966
- (`border-destructive/30`) with title bar (default `"Danger Zone"`)
967
- and action rows. Each row carries `title` + `description` +
968
- consumer-provided `action` slot (typically a destructive
969
- `<Button>`). Rows separated by hairline dividers; last row drops
970
- the bottom border via `last:border-b-0`. Consumer supplies the
971
- destructive button — DangerZone never imports `<Button>`, keeping
972
- it a true primitive. 6 unit tests + 3 Ladle stories. Brief #2
973
- consumer: Settings + Profile + Team + Billing pages.
974
- - **`<ConfirmDialog>` composite (NEW)** — controlled confirmation
975
- modal built on `Dialog`. Auto-focuses Cancel on open (deliberate
976
- — NOT the destructive button). `intent="destructive"` styles the
977
- confirm button with the destructive variant. `confirmationPhrase`
978
- enables typed-confirmation guard (case-sensitive, empty string
979
- treated as no phrase). Pressing Enter in the input triggers
980
- confirm when matched. Async `onConfirm` shows `Loader2` spinner
981
- while pending; resolve closes the dialog; reject keeps it open
982
- so consumers can surface their own error. Phrase input resets
983
- whenever the dialog closes. 13 unit tests + 4 Ladle stories.
984
- Composite (depends on Dialog + Button + Input). Brief #2
985
- consumer: 6+ destructive flows (Settings delete, Team remove,
986
- Billing cancel, Profile delete, Domains remove, Environments
987
- delete).
988
- - **`<CodeBlock>` composite (NEW)** — terminal command / code-snippet
989
- surface. Pre-rendered code inside a `<pre>` with optional
990
- `terminal` prefix per line (`"$ "`), optional `caption` (file
991
- name), and optional inline `<CopyButton>` positioned top-right.
992
- The CopyButton receives the RAW `code` (without the visual `"$ "`
993
- prefix) — consumers paste only the executable command. `language`
994
- prop is reserved for future syntax highlighting (v1 ignored).
995
- 7 unit tests + 4 Ladle stories. Composite (depends on
996
- CopyButton). Brief #2 consumer: Overview EmptyState, Projects
997
- EmptyState, Domains DNS records, API token display, LoginPage
998
- CLI hint.
999
-
1000
- ### Implementation notes
1001
-
1002
- - **Taxonomy gate** classified ConfirmDialog + CodeBlock as composites
1003
- (D2 in the plan). Brief #2 listed all 8 as primitives, but the
1004
- validate-quality-gates.ts script is hard-fail for any
1005
- `primitives/` file that imports another `@theokit/ui` component.
1006
- - **Timestamp uses native `title` HTML attribute** (D3) instead of
1007
- the `<Tooltip>` component, to keep the file a true primitive
1008
- without sibling-primitive imports.
1009
- - **Zero new peer-deps.** Every component uses only `lucide-react`
1010
- + Radix (both already peer) + `cn()`.
1011
- - **Bundle delta** — `dist/index.js` grew from 395763 B to 417113 B
1012
- (+21350 B / +5.4%); `dist/index.d.ts` grew +11808 B / +7.5%. Both
1013
- exceeded the ±5% tolerance by a small margin (8 components ≈ +2.5 KB
1014
- each on average). The baseline was rebaselined in the same release
1015
- (`scripts/baselines/bundle-sizes.json`) — expected and explicit per
1016
- plan D6.
1017
- - 10 SHOULD TEST edge cases from the `/edge-case-plan` review
1018
- incorporated into the TDD blocks (EC-1 through EC-10 — empty
1019
- CopyButton value, unmount during timer, clipboard undefined,
1020
- Table sort direction without onSort, dimmed affordance for
1021
- `none`, StatusDot dev warning, Timestamp Unix seconds vs ms,
1022
- invalid locale fallback, ConfirmDialog empty phrase semantics,
1023
- Enter-to-confirm in phrase input).
1024
-
1025
- ## [0.7.0-next.0] - 2026-05-23
1026
-
1027
- Minor — adds four PaaS-shape primitives to cover the gaps surfaced by the
1028
- TheoCloud dashboard migration: multi-metric `UsageMeter`, standalone
1029
- `Progress` bar, semantic `PlanBadge`, and sidebar `AccountMenu`. Each
1030
- primitive is a SIBLING of an existing agent-shape primitive — no breaking
1031
- changes, no modifications to current components. The library's
1032
- agent-first positioning (per `PITCH.md`) stays intact; both shapes now
1033
- coexist with TypeScript dispatch by name.
1034
-
1035
- Plan: `.claude/knowledge-base/plans/dashboard-paas-primitives-plan.md`.
1036
- Consumer brief: `theo/docs/handoff/2026-05-23-theo-ui-cloud-dashboard-gaps-brief.md`.
1037
-
1038
- ### Added
1039
-
1040
- - **`<Progress>` primitive (NEW)** — accessible progress bar built on
1041
- `<div role="progressbar">` (not native `<progress>` — Tailwind classes
1042
- style cross-browser reliably). Variants:
1043
- - `intent`: `default` / `success` / `warning` / `destructive`
1044
- - `height`: `h-1` (default) / `h-1.5` / `h-2` / `h-3`
1045
- - `indeterminate`: animated bar with no value (omits `aria-valuenow`,
1046
- sets `aria-busy="true"`)
1047
- Clamping handles `value > max` (clamps to max) + `value < 0` (clamps to
1048
- 0) + `max = 0` (no NaN/Infinity). Respects `prefers-reduced-motion`.
1049
- 14 unit tests + 6 Ladle stories. (#TBD)
1050
- - **`<UsageMeter>` primitive (NEW)** — multi-metric stacked usage card
1051
- for PaaS dashboards. Renders N metrics (data transfer, requests, build
1052
- minutes, seats, …) each with `label + value/max + <Progress>` bar.
1053
- Supports custom per-metric `formatter`, automatic over-quota warning
1054
- (value text gets `text-warning`, `<Progress>` uses `intent="warning"`
1055
- AND clamps the bar at 100%), and a `compact` bars-only mode. PaaS-shape
1056
- sibling of `<CostMeter>` (which stays single-USD-mono for agent token
1057
- spend). 12 unit tests + 4 Ladle stories. (#TBD)
1058
- - **`<PlanBadge>` primitive (NEW)** — semantic pricing-tier badge with 5
1059
- canonical tiers (`free`, `hobby`, `pro`, `team`, `enterprise`) and two
1060
- sizes (`sm`, `md`). Each tier carries distinct color tokens. Consumers
1061
- self-document intent (`plan="hobby"`) instead of mapping a generic
1062
- `<Badge variant="outline">` to colors per app — future rebrand /
1063
- dark-mode tweaks propagate automatically. Default label capitalizes
1064
- the tier; `label` prop overrides. Runtime fallback to `free` styling
1065
- for unknown tier (TypeScript prevents this at compile time). 16 unit
1066
- tests + 2 Ladle stories. (#TBD)
1067
- - **`<AccountMenu>` primitive (NEW)** — sidebar header for PaaS surfaces.
1068
- Avatar + name + (optional) `<PlanBadge>` + (optional) secondary line.
1069
- Dual mode: with `onClick`, renders as `<button>` with trailing
1070
- `ChevronsUpDown` icon; without, renders as a static `<div>` (not
1071
- focusable, no chevron). Avatar handling auto-detects URL vs short
1072
- string (≤2 chars treated as initials) vs undefined (derives initials
1073
- from `name`). PaaS-shape sibling of `<ProjectSwitcher>` (which stays
1074
- workspace+branch+agent-status for code-agent surfaces). 13 unit tests
1075
- + 4 Ladle stories. (#TBD)
1076
-
1077
- ### Notes
1078
-
1079
- - **No breaking change.** `CostMeter`, `ProgressChecklist`, `Badge`,
1080
- `ProjectSwitcher` are untouched. Consumers on 0.6.x see only new
1081
- exports.
1082
- - **Taxonomy invariant preserved.** `UsageMeter → Progress` and
1083
- `AccountMenu → Avatar + PlanBadge` use relative-path imports
1084
- (`../{slug}/index.js`), not barrel imports, so primitives still have
1085
- zero `@theokit/ui` cross-dependencies per the structural gate.
1086
- - **Bundle delta.** `dist/index.js` grows by ~6 KB (4 primitives + types
1087
- + small imports). Within the ±5% baseline tolerance (rebaselined).
1088
- - **Subpath exports.** `package.json#exports` gains `./usage-meter`,
1089
- `./progress`, `./plan-badge`, `./account-menu` per existing
1090
- convention (auto-synced by `scripts/sync-exports.ts`).
1091
- - **Registry items.** Four new `registry/r/*.json` descriptors ship for
1092
- shadcn-style copy-paste install. `usage-meter` declares `progress` as
1093
- a `registryDependencies`; `account-menu` declares `avatar` +
1094
- `plan-badge`.
1095
-
1096
- ## [0.6.3-next.0] - 2026-05-23
1097
-
1098
- Patch — eliminate React hydration mismatch in `<ThemeProvider>`. Reported
1099
- by the TheoKit framework team (2026-05-23): every SSR'd app using
1100
- `<ThemeSwitcher>` threw `Hydration failed because the server rendered
1101
- text didn't match the client` on every page reload after a user had
1102
- changed themes, then re-rendered the entire React tree client-side,
1103
- defeating SSR.
1104
-
1105
- ### Fixed
1106
-
1107
- - **SSR hydration mismatch on `<ThemeProvider>`** — three `useState`
1108
- calls (`themeName`, `mode`, `density`) previously ran their initializer
1109
- on BOTH server (no `window`, returned default) AND client at hydration
1110
- time (with `window`, returned `localStorage.getItem(…)`). The two
1111
- diverged → React threw + discarded the SSR'd tree on every page load.
1112
- Fixed by initializing with the SSR default ALWAYS, then promoting to
1113
- the stored value via a post-mount `useEffect` after hydration. The
1114
- visible-text nodes the React reconciler compares (switcher label,
1115
- `sr-only` announcement, `aria-label`) now match server → client.
1116
- Stored preferences still apply within one render tick of mount;
1117
- `<ThemeScript>` continues to set `data-theme` / `data-mode` /
1118
- `data-density` on `<html>` before React mounts to suppress the
1119
- 1-frame visual flicker. (#TBD)
1120
- - **Persist effect first-mount guard** — a `useRef`-based skip-first
1121
- flag prevents the persist effect from writing the SSR-safe defaults
1122
- to `localStorage` between mount and the post-mount hydration
1123
- setState. Previously, the brief window between commit and the
1124
- hydration effect could clobber the user's stored preference if the
1125
- page closed mid-render. After the first call, every subsequent
1126
- change (user-driven OR hydration-promoted) persists normally. (#TBD)
1127
-
1128
- ### Added
1129
-
1130
- - **`<ThemeScript defaultDensity>` prop** — the inline `<script>`
1131
- bootstrap now also sets `data-density` on `<html>` from
1132
- `localStorage.getItem(":density")` (or `defaultDensity`, default
1133
- `"comfortable"`) so density-driven layouts have zero FOUC at first
1134
- paint. Mirrors `ThemeProvider`'s `defaultDensity`. (#TBD)
1135
-
1136
- ### Notes
1137
-
1138
- - Pattern mirrors `next-themes` (Vercel), `MantineProvider`, and
1139
- shadcn/ui's theme scaffold. The 1-frame state-promotion delay is the
1140
- React-canonical price for SSR-safe client-only state. `<ThemeScript>`
1141
- pre-paints the `<html>` attributes so the visible layer doesn't
1142
- flicker.
1143
- - Two new unit tests guard the regression:
1144
- - `does NOT write to localStorage on first mount when nothing changes
1145
- (persist gate)` — verifies the skip-first guard.
1146
- - `writes to localStorage AFTER a user-driven change (persist fires
1147
- post-hydration)` — verifies the gate releases after the first call.
1148
- - Existing `reads initial theme name from localStorage` and `reads
1149
- initial mode from localStorage` tests continue to pass because
1150
- testing-library's `render()` flushes effects synchronously inside
1151
- `act()`, so by the assertion phase the post-mount hydration effect
1152
- has already promoted the stored value.
1153
-
1154
- ## [0.6.2-next.0] - 2026-05-23
1155
-
1156
- Patch — restore `cursor: pointer` on interactive buttons. Tailwind v4
1157
- intentionally dropped the v3 preflight rule
1158
- (https://tailwindcss.com/docs/upgrade-guide#default-button-cursor) so
1159
- every `<button>` rendered by `Sidebar.Item`, `QuickActionChips`,
1160
- `ChatComposer`, `ContextWindowBar`, `ToolCallCard`, `AgentProfile`,
1161
- `CommandPalette`, etc. was showing the default arrow cursor instead of
1162
- the pointing hand. Visual regression observed in TheoKit
1163
- `examples/full-stack-agent` against `@theokit/ui@0.6.1-next.0`.
1164
-
1165
- ### Fixed
1166
-
1167
- - **Tailwind v4 preflight regression on `<button>` cursor** — restored
1168
- the v3 `button { cursor: pointer }` behavior via TWO defenses:
1169
- 1. `<Button>` primitive (`src/components/primitives/button/button.tsx`)
1170
- gains `cursor-pointer disabled:cursor-default
1171
- aria-disabled:cursor-default` in its CVA base — explicit per
1172
- Tailwind v4 spec intent.
1173
- 2. `dist/styles.css` `@layer base` adds a scoped preflight rule:
1174
- ```css
1175
- button:not(:disabled):not([aria-disabled="true"]),
1176
- [role="button"]:not([aria-disabled="true"]) {
1177
- cursor: pointer;
1178
- }
1179
- ```
1180
- This covers every native `<button>` the library composites render
1181
- directly (50+ across `Sidebar.Item`, `QuickActionChips`,
1182
- `ChatComposer`, `ToolCallCard`, `CommandPalette`, …) without
1183
- touching their per-component className strings. Disabled and
1184
- `aria-disabled="true"` paths keep `cursor: default` per
1185
- accessibility convention. (#TBD)
1186
-
1187
- The fix is opt-in by consumer choice — they imported
1188
- `@theokit/ui/styles.css`. Tailwind v4's global preflight remains
1189
- untouched; only this stylesheet's `@layer base` adds the rule. (#TBD)
1190
-
1191
- ### Notes
1192
-
1193
- - Verification recipe (matches the TheoKit reproduction):
1194
- ```bash
1195
- # Browser test:
1196
- # 1. cd theokit/examples/full-stack-agent && pnpm dev
1197
- # 2. Hover any Sidebar.Item → cursor MUST visibly change to the
1198
- # pointing-hand icon (not the default arrow).
1199
- #
1200
- # CSS grep test:
1201
- grep -c "button:not(:disabled)" node_modules/@theokit/ui/dist/styles.css
1202
- # MUST return >= 1 (pre-fix: 0)
1203
- ```
1204
-
1205
- ## [0.6.1-next.0] - 2026-05-23
1206
-
1207
- Patch — pre-compile utility CSS at library build time so consumers see
1208
- every hover / focus / active / data-state variant the library uses,
1209
- regardless of package-manager layout. Fixes a critical regression where
1210
- the entire library rendered flat under pnpm.
1211
-
1212
- ### Fixed
1213
-
1214
- - **pnpm symlink + Tailwind v4 `@source` bug** — Tailwind v4's
1215
- `tinyglobby`-based scanner does **not** follow symbolic links. Under a
1216
- pnpm install, `node_modules/@theokit/ui` is a symlink to a deep
1217
- `node_modules/.pnpm/@theokit+ui@…/node_modules/@theokit/ui` directory,
1218
- and the consumer-side pattern
1219
- `@source "node_modules/@theokit/ui/dist/**/*.{js,mjs,cjs}"` (the one
1220
- the `vite-plugin` previously emitted via the
1221
- `virtual:@theokit/ui/library-sources.css` virtual module) expanded to
1222
- **zero** matches. Every `hover:bg-muted`, `hover:text-foreground`,
1223
- `data-[state=active]:…` variant the library's 79 primitives + 41
1224
- composites use was therefore never emitted into the consumer's CSS,
1225
- and components rendered flat (no hover feedback, no focus rings, no
1226
- active-tab highlight). The bug affected every modern Node toolchain
1227
- that uses pnpm — Vite ecosystem default, Bun, recent Turborepo
1228
- templates. (#TBD)
1229
-
1230
- ### Added
1231
-
1232
- - **`dist/components.css` (NEW)** — pre-compiled utility CSS file
1233
- containing the materialized rules for every Tailwind class the
1234
- library's components reference. Generated at library build time by
1235
- `scripts/build-precompiled-css.ts`, which runs `@tailwindcss/cli@^4`
1236
- against `src/styles/components-entry.css` (a curated entry that
1237
- imports `tailwindcss`, the existing `tokens.css` and `tokens-v4.css`
1238
- `@theme` namespace, and declares `@source` globs against the library's
1239
- own `src/` — not `node_modules/`). Size: ~88 KB unminified, ~14 KB
1240
- gzipped. This is the canonical Tailwind v4 library pattern used by
1241
- Radix UI Themes, shadcn/ui pre-compiled, and Mantine v7. (#TBD)
1242
- - **`dist/styles.css` chains `@import "./components.css"`** at the end,
1243
- so a single `@import "@theokit/ui/styles.css"` in the consumer's CSS
1244
- now transitively pulls in every utility the library uses — zero
1245
- filesystem scanning required. Consumer-side `@theme` overrides still
1246
- win via the runtime CSS-var cascade (every utility resolves
1247
- `var(--color-*)` at paint time, not at compile time). (#TBD)
1248
- - **`scripts/dogfood-precompiled-utilities.ts`** — 25 contract checks
1249
- asserting `dist/components.css` ships the required variants
1250
- (`hover:bg-muted`, `hover:text-foreground`, `hover:bg-secondary`,
1251
- `hover:shadow-md`, `hover:underline`, `focus-visible:outline`, every
1252
- base color/typescale token, the radii). Integrated to
1253
- `pnpm quality:gates` so the regression cannot reach npm again. (#TBD)
1254
- - **`@tailwindcss/cli@^4`** added as a devDependency — required for the
1255
- pre-compile pass at library build time. Consumers do NOT need it; the
1256
- utility rules ship as static CSS bytes. (#TBD)
1257
-
1258
- ### Changed
1259
-
1260
- - **`@theokit/ui/vite-plugin` virtual module** — the
1261
- `virtual:@theokit/ui/library-sources.css` module no longer emits the
1262
- broken `@source "node_modules/@theokit/ui/..."` default globs. It is
1263
- retained for backwards compatibility (TheoKit's earlier integration
1264
- code may still resolve it) but now emits only an explanatory comment
1265
- block when no `contentExtra` option is passed. The plugin's primary
1266
- job remains chaining `@tailwindcss/vite` for the consumer's own
1267
- Tailwind v4 build. (#TBD)
1268
-
1269
- ### Notes
1270
-
1271
- - Adopted from the canonical Tailwind v4 library pattern documented at
1272
- https://tailwindcss.com/docs/upgrade-guide. Reference implementations
1273
- studied: Radix UI Themes
1274
- (`packages/radix-ui-themes/scripts/build.mjs`), shadcn/ui pre-compiled
1275
- starter, Mantine v7.
1276
- - Verification recipe matching TheoKit's reproduction script:
1277
- ```bash
1278
- grep -c "\.hover\\:bg-muted" node_modules/.pnpm/@theokit+ui@*/node_modules/@theokit/ui/dist/components.css
1279
- # MUST return >= 1 (pre-fix: 0)
1280
- ```
1281
-
1282
- ## [0.6.0-next.0] - 2026-05-23
1283
-
1284
- Minor — `<ChatMessage>` rewritten on top of the Vercel AI SDK `UIMessage`
1285
- shape with full markdown rendering, syntax-highlighted code blocks, math,
1286
- mermaid diagrams, tool calls, reasoning panels, file/source citations,
1287
- branching navigation, and a streaming-safe markdown preprocess.
1288
-
1289
- ### Added
1290
-
1291
- - **`<ChatMessage>` v2 (RFC 0009)** — promoted from primitive to composite
1292
- (`src/components/composites/chat-message/`). Two consumption shapes:
1293
- (a) convenience `<ChatMessage message={uiMessage} />` auto-dispatches
1294
- every part to its built-in renderer; (b) composable
1295
- `<ChatMessage.Root from="assistant"><ChatMessage.Content>…</…></…>` for
1296
- full control. Forks structural shell from `vercel/ai-elements`
1297
- (Apache-2.0, see `NOTICE`). Renders 11 part types:
1298
- `text`, `reasoning`, `tool-${name}`, `dynamic-tool`, `file`,
1299
- `reasoning-file`, `source-url`, `source-document`, `step-start`,
1300
- `custom`, `data-${name}`. (#TBD)
1301
- - **Branching navigation** — `<ChatMessageBranch>` + content / selector /
1302
- previous / next / page sub-components for cycling through alternate
1303
- responses on a single turn. (#TBD)
1304
- - **Markdown engine (`src/lib/markdown/`)** — `parseMarkdownToReact()` +
1305
- `parseMarkdownToReactSafe()` build a mdast → hast → React pipeline
1306
- via the existing optional peer-deps (`mdast-util-from-markdown`,
1307
- `mdast-util-gfm`, `mdast-util-to-hast`, `hast-util-sanitize`,
1308
- `hast-util-to-jsx-runtime`). Sanitize schema allows
1309
- `language-*` classes on `<code>`/`<pre>` so syntax highlight survives.
1310
- GFM tables, task lists, strikethrough, autolinks all render. (#TBD)
1311
- - **Streaming-safe preprocessor** — `preprocessStreaming()` auto-closes
1312
- trailing `**bold`, `_italic`, `` `code ``, `[link](url`, `$math$`,
1313
- `$$blockmath$$`, and `` ```fence `` so token-by-token streaming output
1314
- never flashes raw markdown chars. Re-implemented (NOT
1315
- `streamdown`-dep) so we don't take a runtime dependency on a Vercel
1316
- package we compete with. (#TBD)
1317
- - **`<CodeBlock>` + `<InlineCode>` (`src/lib/markdown/`)** — fenced code
1318
- ships Shiki SSR-friendly highlight (lazy `import("shiki")` — peer-dep
1319
- optional, graceful plain-`<pre>` fallback), language label header,
1320
- Copy → Check 2s button per `shadcn.io` AI code-block pattern. Inline
1321
- `<code>` is styled distinct from blocks. (#TBD)
1322
- - **`<MathInline>` + `<MathBlock>`** — lazy-load KaTeX, render to safe
1323
- HTML, fall back to `<code>` / `<pre>` plain when peer-dep missing. (#TBD)
1324
- - **`<MermaidDiagram>`** — lazy-load Mermaid with `securityLevel:
1325
- "strict"`, render to SVG. Failed parse or missing peer falls back to
1326
- a labeled `<pre>` block. (#TBD)
1327
- - **11 Vercel-compat UIMessagePart types** + 10 type guards in
1328
- `src/types/chat.ts` (`UIMessage`, `UIMessagePart`, `TextUIPart`,
1329
- `ReasoningUIPart`, `ToolUIPart`, `DataUIPart`, `FileUIPart`,
1330
- `ReasoningFileUIPart`, `SourceUrlUIPart`, `SourceDocumentUIPart`,
1331
- `StepStartUIPart`, `CustomContentUIPart`, `ProviderMetadata`,
1332
- `ToolInvocationState`, `MessageRole`). Field-for-field compatible
1333
- with `useChat()` from `@ai-sdk/react` — zero-adapter interop. (#TBD)
1334
-
1335
- ### Changed
1336
-
1337
- - **Taxonomy**: `ChatMessage` moves from `primitives/` → `composites/`.
1338
- Composite layer is the correct home — internal deps on `<Button>`,
1339
- native `<details>`, our `<Card>` patterns. README catalog counts
1340
- adjust automatically via the structure gate (`pnpm sync:readme`). (#TBD)
1341
- - **`registry/chat-message.json`** — descriptor now lists 12 source
1342
- files + 6 lib files, declares `lucide-react` + `safe-href` + `button`
1343
- registry-deps. (#TBD)
1344
-
1345
- ### Breaking changes
1346
-
1347
- - **`Message` type removed.** `import type { Message } from "@theokit/ui"`
1348
- now fails — use `UIMessage` instead. TypeScript will hint
1349
- `Did you mean 'UIMessage'?`.
1350
- - **`message.content` removed.** Replace every callsite:
1351
-
1352
- ```diff
1353
- - { id, role: "user", content: "hello", timestamp: "10:00" }
1354
- + { id, role: "user", parts: [{ type: "text", text: "hello" }] }
1355
- ```
1356
-
1357
- Internal callsites already migrated: `agent-stream`,
1358
- `chat-thread.stories`, `theo-code-shell.data`, `task-running.stories`,
1359
- `task-starting.stories`, `task-completed.stories`. For mockup data
1360
- with arbitrary JSX content, use the composable form:
1361
-
1362
- ```tsx
1363
- <ChatMessage.Root from="assistant">
1364
- <ChatMessage.Content variant="contained">
1365
- <div>any JSX here</div>
1366
- </ChatMessage.Content>
1367
- </ChatMessage.Root>
1368
- ```
1369
-
1370
- - **`message.model` / `message.timestamp` no longer rendered** by
1371
- `<ChatMessage>` — fold them into custom UI under the message body, or
1372
- attach via `metadata?: unknown` (consumer-typed) and read from there.
1373
- - **`./components/primitives/chat-message/`** deleted. Imports must move
1374
- to `./components/composites/chat-message/` (the public `@theokit/ui`
1375
- barrel handles this; only relative imports inside the repo need
1376
- updating).
1377
-
1378
- ### Notes
1379
-
1380
- - **License attribution**: a `NOTICE` file ships at the package root
1381
- with Apache-2.0 attribution to `vercel/ai-elements` for the
1382
- structural-shell components forked, and to `vercel/ai` for the
1383
- `UIMessage` shape mirrored. Both upstream and TheoUI are Apache-2.0
1384
- — compatible.
1385
- - **Reference clones** of `vercel/ai-elements` and `vercel/ai` live in
1386
- `referencia/` (read-only). Not shipped in the npm tarball (excluded
1387
- via the `files` field).
1388
-
1389
- ## [0.5.1-next.0] - 2026-05-22
1390
-
1391
- Patch — RFC 0008 follow-up. The 0.5.0-next.0 release declared `tailwindcss@^4`
1392
- as a peer dependency and shipped the `./vite-plugin` + `./preset` subpaths,
1393
- but the actual CSS / token / preset artifacts inside the tarball were still
1394
- Tailwind v3 internally. Result: every TheoKit consumer of 0.5.0-next.0 booted
1395
- with unstyled UI in dev and production — `bg-primary`, `text-muted-foreground`,
1396
- `border-border`, `text-body-sm`, etc. emitted as className strings with no
1397
- matching CSS rule.
1398
-
1399
- This release rewrites the three v3-shaped artifacts to v4-native syntax and
1400
- ships a fixture-backed real-build dogfood so the regression cannot recur.
1401
-
1402
- ### Changed
1403
-
1404
- - **`dist/styles.css` is now Tailwind v4 native.** Uses `@import "tailwindcss"`
1405
- (replaces the v3 `@tailwind base; @tailwind components; @tailwind utilities;`
1406
- trio that Tailwind v4 emits as literal strings, with zero utility generation).
1407
- Imports `tokens.css` (runtime cascade) AND `tokens-v4.css` (`@theme` namespace)
1408
- so consumers' Tailwind v4 build resolves both layers correctly. Same
1409
- `@layer base` content (border-color, body font, focus ring, scrollbar
1410
- styling) as before. (#TBD)
1411
- - **`./preset` subpath is now a CSS file.** Tailwind v4 dropped the v3 JS
1412
- preset format — `theme.extend.colors.{name}` declarations are a no-op for
1413
- v4. The new `dist/preset.css` simply chains `@import "./tokens.css"` and
1414
- `@import "./tokens-v4.css"` so consumers can `@import "@theokit/ui/preset.css"`
1415
- from their own Tailwind v4 entry CSS. (#TBD)
1416
-
1417
- ### Added
1418
-
1419
- - **`@theokit/ui/tokens-v4.css` (NEW)** — `@theme {}` block declaring 28
1420
- `--color-*` aliases (full color set), 14 `--text-*` typescale tiers
1421
- (Violet Forge — `--text-display-2xl` through `--text-code-sm` with companion
1422
- `--*--line-height`, `--*--letter-spacing`, `--*--font-weight`), 3 `--font-*`
1423
- family tokens, 7 `--radius-*` tiers, 5 `--shadow-*` levels, 3 `--ease-*`
1424
- timings, and 2 `--animate-*` keyframe-bound utilities. Every color alias
1425
- uses `hsl(var(--*))` indirection so `<ThemeProvider>`'s runtime
1426
- `[data-theme]` cascade keeps working — switching themes still recolors
1427
- every utility. (#TBD)
1428
- - **`@theokit/ui/styles-v3-legacy.css` (NEW)** — the previous v3-shaped
1429
- `@tailwind base/components/utilities` entry. Pinned consumers on
1430
- `tailwindcss@^3` who still want a prebuilt stylesheet can import this
1431
- subpath. New code SHOULD use `@theokit/ui/styles.css` (v4) instead.
1432
- - **`@theokit/ui/preset-v3-legacy` (NEW)** — the v3 JS `Partial<Config>`
1433
- preset that previously lived at `./preset`. Renamed so the canonical
1434
- `./preset` subpath can host the v4 CSS preset. v3 consumers update
1435
- imports from `@theokit/ui/preset` to `@theokit/ui/preset-v3-legacy`.
1436
- - **Dogfood scripts** — `pnpm dogfood:v4-zero-config` (shape check, runs in
1437
- `quality:gates`) and `pnpm dogfood:v4-real-build` (end-to-end: packs the
1438
- tarball, installs in a tmp project alongside `@tailwindcss/cli@^4`, runs
1439
- Tailwind v4 against `tests/fixtures/v4-zero-config/`, and grep-asserts the
1440
- expected utility classes appear in the emitted CSS — 12 assertions). The
1441
- real-build dogfood is opt-in (slow, requires network) but catches any
1442
- future regression where v3-shaped artifacts get shipped under a v4 peer
1443
- declaration. (#TBD)
1444
-
1445
- ### Notes
1446
-
1447
- - **Breaking for any 0.5.0-next.0 consumer.** The `./preset` subpath changed
1448
- from JS (`Partial<Config>` default-export) to CSS file. Code importing
1449
- `import preset from "@theokit/ui/preset"` will break and must migrate to
1450
- `@import "@theokit/ui/preset.css"` in an entry CSS. Blast radius: TheoKit
1451
- (already reverted away from 0.5.x by the time this fix shipped) plus any
1452
- community consumer that adopted 0.5.0-next.0 in the same day — likely zero.
1453
- - The runtime indirection via `hsl(var(--*))` aliases keeps `<ThemeProvider>`
1454
- and every built-in theme (`violet-forge`, `dracula`, `vercel-mono`, etc.)
1455
- working with zero changes — the v4 utilities transparently follow the v3
1456
- cascade.
1457
-
1458
- ## [0.5.0-next.0] - 2026-05-22
1459
-
1460
- Minor bump — public API gains two subpath exports (`./vite-plugin` and
1461
- `./preset`) so the TheoKit framework's `integrateUseTheoUI()` can
1462
- auto-wire Tailwind v4 for consumers with zero further configuration.
1463
- Zero visual break and no runtime behavior change for existing consumers.
1464
-
1465
- ### Added
1466
-
1467
- - **`@theokit/ui/vite-plugin` (NEW, RFC 0008)** — Default-export factory
1468
- returning one Vite `Plugin`. The plugin's `config()` hook
1469
- dynamic-imports `@tailwindcss/vite` v4 and chains it into the
1470
- consumer's plugin array when resolvable, and degrades to `console.warn`
1471
- + CSS-only mode (via the pre-built `@theokit/ui/styles.css` subpath)
1472
- when the peer is not installed. A virtual module
1473
- `virtual:@theokit/ui/library-sources.css` provides the `@source`
1474
- directive covering `node_modules/@theokit/ui/dist/**/*.{js,mjs,cjs}`
1475
- so Tailwind scans the library's published JS for utilities. Plugin
1476
- name slug: `@theokit/ui/vite-plugin`. Options: `tailwind?: boolean`
1477
- (default `true`), `contentExtra?: string[]` (extra `@source` globs).
1478
- (#TBD)
1479
- - **`@theokit/ui/preset` (NEW, RFC 0008)** — Default-export Tailwind v4
1480
- `Partial<Config>` mirroring the design tokens in `tokens.css`
1481
- (colors via `hsl(var(--x) / <alpha-value>)`, font families, the
1482
- Violet Forge typescale, radii, shadows, animations, motion timing)
1483
- with `content` paths covering `./node_modules/@theokit/ui/dist/**` and
1484
- the `tailwindcss-animate` plugin. Consumer usage:
1485
- `import preset from "@theokit/ui/preset"; export default { presets: [preset] }`.
1486
- Internally delegates to the existing `src/styles/tailwind-preset.ts` —
1487
- the v3 shadcn-registry preset and the v4 import preset stay
1488
- byte-for-byte aligned and impossible to drift. (#TBD)
1489
- - **`@tailwindcss/vite ^4`, `tailwindcss ^4`, `vite ^6 || ^7` peer-deps
1490
- (all optional)** — added to `peerDependenciesMeta` so consumers
1491
- importing `@theokit/ui` standalone (no framework) are not forced into
1492
- Tailwind v4. Required only when consuming via TheoKit's auto-wire path
1493
- or the new `./vite-plugin` subpath. (#TBD)
1494
-
1495
- ### Notes
1496
-
1497
- - Existing `tailwindcss@^3` consumers continue to work via the shadcn
1498
- registry preset (`registry/r/tailwind-preset.json`) and the prebuilt
1499
- `@theokit/ui/styles.css`. The new subpaths are additive — they do not
1500
- break v3-based setups.
1501
- - The `vite-plugin` returns ONE `Plugin` object (not `Plugin[]`) per the
1502
- cross-repo contract with TheoKit's `integrateUseTheoUI()`. The chain
1503
- to `@tailwindcss/vite` happens via the `config()` hook's `plugins`
1504
- field — Vite 5+ tightened the TypeScript signature, the runtime still
1505
- merges plugins as expected.
1506
-
1507
- ## [0.4.0-next.0] - 2026-05-22
1508
-
1509
- Minor bump — public API gains 7 new theme exports. Zero visual break for
1510
- consumers in 0.3.x (default theme remains `violet-forge`).
1511
-
1512
- ### Added
1513
-
1514
- - **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)
1515
- - **`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)
1516
- - **`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)
1517
-
1518
- ## [0.3.0-next.0] - 2026-05-22
1519
-
1520
- Minor bump — visual defaults realigned to FAANG-modern density baseline
1521
- (shadcn / Linear / Vercel / Stripe). Public API unchanged; no type/prop
1522
- signatures touched. Every consumer in 0.2.x will see tighter form controls,
1523
- smaller body text, and a less-padded Card after upgrading.
1524
-
1525
- ### Migration from 0.2.x
1526
-
1527
- If you depended on the prior visual defaults (Button 40px, Card 24px
1528
- padding, body-md 15px), you have two options:
1529
-
1530
- 1. **Per-component** — pass explicit `size="lg"` to Button/Input/Select/
1531
- Textarea/Card. These render the prior dimensions.
1532
- 2. **Global override** — set `<ThemeProvider defaultDensity="spacious">`
1533
- at the app root. All form controls bump to 44px globally.
1534
-
1535
- No code change required if you accept the new defaults. Type-only
1536
- exports added: `Density`, `DensityContextValue`.
1537
-
1538
- ### Added
1539
-
1540
- - **`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)
1541
- - **`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)
1542
- - **`playground/density-demo.tsx`** — live preview with 3-way density toggle. Mount via `?view=density` in the Vite playground. (#TBD)
1543
-
1544
- ### Changed (BREAKING visual default, not API)
1545
-
1546
- - **Form-control `md` defaults: 40px → 36px** (FAANG-tier modern density). Affects `Button`, `Input`, `Select.Trigger`, `Textarea`. `sm` stays 32px, `lg` recalibrated to 44px. (#TBD)
1547
- - **`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)
1548
- - **Card `md` padding: 24px → 20px** (`p-6` → `p-5`). `sm` unchanged (`p-3`); `lg` recalibrated 28px → 24px (`p-7` → `p-6`). (#TBD)
1549
- - **Bundle baseline rebased** for the new defaults (~+700 bytes total — CSS-var class strings + Density type union). Engines (whiteboard / slide / slide-deck) untouched. (#TBD)
1550
-
1551
- ## [0.2.0-next.0] - 2026-05-20
1552
-
1553
- Minor bump (not patch) because public API surface grew: new `defineTheme` /
1554
- `hex` / `rgb` exports plus `size` prop standardized across 9 primitives.
1555
- All additions are backwards-compatible — `defaultVariants.size = "md"`
1556
- preserves rendered markup for callers that don't pass `size`.
1557
-
1558
- ### Added
1559
- - **`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)
1560
- - **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)
1561
- - **`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)
1562
- - **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)
1563
- - **`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)
1564
- - **`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)
1565
-
1566
- ## [0.1.0-next.1] - 2026-05-19
1567
-
1568
- ### Added
1569
- - **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)
1570
- - **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)
1571
- - **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)
1572
- - **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)
1573
- - **`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)
1574
- - **`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)
1575
- - **`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)
1576
- - **`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)
1577
-
1578
- - **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.
1579
-
1580
- ## [0.1.0-next.0] - 2026-05-16
1581
-
1582
- First public pre-release on npm under the `next` dist-tag. Install with
1583
- `pnpm add @theokit/ui@next` (the default `latest` tag is intentionally
1584
- unset until 1.0). Highlights from the agent-team-audit-fixes-2026-05-16
1585
- remediation sprint:
1586
-
1587
- - New `<TheoUIProvider>` primary entry point (T2.1).
1588
- - `<ThemeProvider>` decoupled from `violetForge` (T2.5, **breaking** —
1589
- see migration below).
1590
- - CSS injection allowlist + `safeHref` URL guard (T3.2 / T3.3).
1591
- - LiveRegionContext universal — eliminates double aria-live
1592
- announcements across 9 components (T4.1, MF-4).
1593
- - React 19 compatibility verified in CI (T6.3); `onToggle` clash with
1594
- the new `ToggleEventHandler` resolved in 6 components.
1595
- - New composite-to-composite cycle detection gate (re-audit NEW-C).
1596
- - happy-dom 16 → 20 (closes CVE-2025-61927 in test env; T3.1).
1597
- - Postcss override + tailwindcss-animate moved to deps (T6.1 / T6.4).
1598
- - ScrollBar standalone removed in favor of `ScrollArea.Bar` (T7.4).
1599
-
1600
- ### Changed (BREAKING, 2026-05-16) — T2.5 ThemeProvider decouple
1601
- - **`<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).
1602
- - **Migration**:
1603
- ```tsx
1604
- // Before
1605
- import { ThemeProvider } from "@theokit/ui";
1606
- <ThemeProvider>...</ThemeProvider>
1607
-
1608
- // After — option A (recommended for parity with old behavior)
1609
- import { ThemeProvider, builtinThemes } from "@theokit/ui";
1610
- <ThemeProvider themes={builtinThemes}>...</ThemeProvider>
1611
-
1612
- // After — option B (new in v0.1.0-next.0)
1613
- import { TheoUIProvider } from "@theokit/ui";
1614
- <TheoUIProvider>...</TheoUIProvider>
1615
- ```
1616
- - **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`).
1617
-
1618
- ### Added (Agent-team audit fixes, 2026-05-16)
1619
- - **`<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.
1620
- - **`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.
1621
-
1622
- ### Changed (Agent-team audit fixes, 2026-05-16)
1623
- - **`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.
1624
- - **`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.
1625
- - **`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`).
1626
-
1627
- ### Documentation (Agent-team audit fixes, 2026-05-16)
1628
- - **`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).
1629
- - **`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`.
1630
- - **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]`.
1631
-
1632
- ### Added (Pitch + Voice and Tone formalization, 2026-05-15)
1633
- - **`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/`.
1634
- - **`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 Theo pillars (Harness, Skills, Runtime), and the quality-gate non-bypass rule.
1635
-
1636
- ### Changed (Cross-project, 2026-05-15)
1637
- - 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).
1638
- - 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).
1639
-
1640
- ### Changed (README alignment with PITCH, 2026-05-15)
1641
- - `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).
1642
- - Added `## The shift` storytelling block between the HERO and `## Why @theokit/ui`.
1643
- - `## 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."*
1644
- - Added `## What you'd build` (5 concrete surfaces) before `## Quickstart`.
1645
- - Added `## How it works` DEEP DIVE delimiter before `## Quickstart`; everything from there downward stays technical-direct.
1646
- - Quickstart code sample swapped from a generic `<Button>` example to `<AgentEvent>` + `<ToolCall>` + `<DeploymentRow>` — agent-shaped primitives nobody else ships.
1647
- - Added `## Status` section between `## License` and the bundle/architecture content: production callouts, registry-distribution plan, ESM-only caveat, "component count is the floor" framing.
1648
-
1649
- ### Added (BLOCKER-002 / BLOCKER-003 remediation)
1650
- - **`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`).
1651
- - **`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.
1652
- - **`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.
1653
- - **Quality gate `validateRegistryPresetDep`** — fails when any `registry:ui` / `registry:block` is missing `tailwind-preset` from its `registryDependencies`.
1654
- - **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.
1655
- - **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).
1656
- - `validateDesignSystemFidelity` audits `src/styles/tailwind-preset.ts` instead of `tailwind.config.ts` (typescale now lives in the preset).
1657
-
1658
- ### Added (Phase 6 — observability + test hardening, finalized)
1659
- - **`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`.
1660
- - **`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`.
1661
- - **`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.
1662
-
1663
- ### Added (MEDIUM-011 / T6.6 — Ladle stories axe sweep, lightweight implementation)
1664
- - **`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.
1665
- - 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.
1666
- - 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.
1667
-
1668
- ### Added (Phase 7 — API cleanup, LOWs and NITs)
1669
- - **`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`.
1670
- - **`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"`.
1671
- - **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.
1672
- - **`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.
1673
- - **`playground/**/*` added to `tsconfig.json#include`** (LOW-001 / T7.2); `playground/dist` added to `exclude`.
1674
-
1675
- ### Added (Phase 6 — observability + test hardening, continued)
1676
- - **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).
1677
- - **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.
1678
- - **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.
1679
- - **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.
1680
-
1681
- ### Added (Phase 6 — observability + test hardening)
1682
- - **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.
1683
- - **`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.
1684
-
1685
- ### Changed (Phase 6)
1686
- - **`agent-stream` adds explicit `aria-atomic="false"`** (MEDIUM-001 / T6.4) so VoiceOver/macOS does not reannounce the entire log on each new item.
1687
- - **`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/`.
1688
-
1689
- ### Added (Phase 5 — docs + governance)
1690
- - **`CONTRIBUTING.md`** — operational handbook: setup, taxonomy rule, adding components, quality gates explained, registry distribution, PR conventions, release process, internal exploration archive policy.
1691
- - **`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.
1692
- - **`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).
1693
- - **`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).
1694
- - README nav links `Contributing` and `Security`.
1695
-
1696
- ### Changed (HIGH-002 / T4.1 — self-hosted fonts as default)
1697
- - **`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.
1698
- - `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`.
1699
- - `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/`.
1700
- - 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.
1701
- - New `geist` devDependency: used only as the source of woff2 artifacts at install time; not bundled into `dist/index.js`.
1702
- - `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.
1703
-
1704
- ### Removed (HIGH-001 / T3.1)
1705
- - `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.
1706
-
1707
- ### Added (Phase 3 follow-ups)
1708
- - 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.
1709
- - 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.
1710
- - `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.
1711
- - `.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.
1712
-
1713
- ### Breaking
1714
- - **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.
1715
- - **`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`.
1716
-
1717
- ### Fixed
1718
- - **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.
1719
-
1720
- ### Added
1721
- - `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.
1722
- - `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.
1723
- - `vitest.config.ts` now also collects `scripts/**/*.{test,spec}.ts` so meta-tests run under `pnpm test`.
1724
- - `src/test/a11y.ts` — shared `expectNoA11yViolations(ui)` helper used by 30+ primitive smoke tests.
1725
- - `src/welcome.stats.ts` (generated) — single source of truth for badge / welcome / architecture counts.
1726
- - Quality gates: `validateCompoundPattern`, `validateAxeCoverage`, `validateCountConsistency`, `validateArchitectureCensus`, `validateNoStrayArtifacts`. All hard-fail.
1727
- - `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, …).
1728
- - `TokenUsageChart` `sr-only <table>` fallback exposing input/output per period to screen readers (HIGH-013).
1729
- - `tests/fixture-shadcn-app/package.json` peers for Radix Dialog/Toast/Avatar/Tabs + cmdk so the registry install fixture can exercise composites.
1730
- - `LICENSE` file (Apache-2.0) at repository root.
1731
- - `CHANGELOG.md` (this file).
1732
- - `<ThemeScript>` component for SSR-safe theme initialization in Next/Astro/Remix.
1733
- - Global `@media (prefers-reduced-motion: reduce)` rules in `tokens.css` neutralizing animations for users with vestibular sensitivity.
1734
- - `BuildLogStream` `maxLines` prop (default 2000) for high-volume log truncation.
1735
- - `TokenUsageChart` `maxBars` prop for time-series binning.
1736
- - `vitest-axe` integration for accessibility assertions in primitive tests.
1737
- - Quality gates: `validateGovernanceFiles` (LICENSE / CHANGELOG presence), `validateReadmeDrift` (README ↔ exports parity), `validateDocsTypography` (font drift), `validateCompositeBarrel` (composites must import primitives via barrel).
1738
- - `tests/fixture-shadcn-app/` integration test exercising registry copy-paste install.
1739
- - `scripts/sync-readme.ts` to keep README counts and component catalog generated from source.
1740
-
1741
- ### Changed
1742
- - `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.
1743
- - `TopNav.ModeSwitcher` ARIA semantics: `role="tablist"` → `role="radiogroup"`, `role="tab"` → `role="radio"` with full keyboard navigation (Arrow/Home/End + roving tabindex).
1744
- - `CommandPalette` re-implemented on top of `cmdk` — adds keyboard navigation (Up/Down/Enter/Escape), fuzzy ranking, and active-item highlight. Public API is preserved.
1745
- - `Card.Title` and `Dialog.Title` accept `asChild` (Radix Slot) for heading-level override.
1746
- - `ChatComposer` no longer renders mic/attach buttons by default; consumer must pass `onVoiceInput` / `onAttach` to opt in.
1747
- - `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).
1748
- - Replace `dot-namespace` mutation pattern (`Card.Header = Header`) with `/*#__PURE__*/ Object.assign(...)` in `Card`, `Dialog`, `Sidebar`, `TopNav`, `Tabs` for safer tree-shaking.
1749
- - `aria-hidden` codemod: all 15 boolean uses now declare `aria-hidden="true"` explicitly.
1750
- - `validate-quality-gates.ts` calls four new gates in sequence; CI fails on README/docs/governance drift.
1751
-
1752
- ### Fixed
1753
- - `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.
1754
- - `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.
1755
- - `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.
1756
- - `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.
1757
- - `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`.
1758
- - `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.
1759
- - `PermissionMatrix`: JSDoc promised `toolOptions={[]}` hides the add form, but `[]` is truthy in JS — the form was always shown. Condition fixed to check `length > 0`.
1760
- - `Dialog` overlay JSDoc claimed "violet-tinted 60%" backdrop but code used `bg-background/80`. JSDoc aligned with code.
1761
- - `agent-timeline` composite imported `../primitives/agent-event/agent-event.js` directly (bypassing barrel); switched to `../primitives/agent-event/index.js`. Gate added.
1762
- - Stories with `console.log` / `console.warn` annotated with `biome-ignore` to keep `noConsole` Biome rule meaningful in production code.
1763
-
1764
- ### Security
1765
- - **`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.
1766
-
1767
- ### Changed (audit remediation 2026-05-14)
1768
- - 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.
1769
- - `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).
1770
- - `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.
1771
- - 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`.
1772
- - `tsup.config.ts` `onSuccess` now uses `node:fs/promises.copyFile` instead of POSIX `cp`. Build is portable across macOS / Linux / Windows.
1773
- - `validateRegistryStoriesAndTests` upgrades the missing-test check from warning to hard fail. The test-backfill phase has ended.
1774
- - `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).
1775
- - Test count is now derived by static `it(`/`test(` parsing — no longer spawns `pnpm test` inside `sync:readme`.
1776
- - `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).
1777
- - `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.
1778
- - `lint:ci` scope widened to `playground` + `tests/fixture-shadcn-app/src`.
1779
- - `biome.json` `noConsole` raised to `error` with `allow: []`; stories / tests / scripts opt out via `overrides`.
1780
- - `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).
1781
- - `ThemeProvider` JSDoc corrected: `defaultMode` documents `"dark"` (matches the actual default since the dark-first migration).
1782
- - `classic-paper` JSDoc clarified ("light-primary with deep-navy dark mirror") — was misleadingly described as "light-only" despite shipping a full dark palette.
1783
- - `docs/quality-gates.md` Gate 2 "Current known risk" replaced with a "Resolved (2026-05)" note — `scripts/build-registry.ts` already rewrites relative imports.
1784
- - `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).
1785
- - `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).
1786
-
1787
- ### Fixed (audit remediation 2026-05-14)
1788
- - 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).
1789
- - `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+.
1790
- - 95× `registry/*.json.tmp` + 2× `*.bak` files deleted from working tree. New `validateNoStrayArtifacts` gate blocks regression.
1791
-
1792
- ### Removed
1793
- - N/A.
1794
-
1795
- ## [0.0.0]
1796
-
1797
- Initial unpublished baseline. See `git log` between this entry and `5c95373` for the bootstrap work.