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