@usetheo/ui 0.13.0 → 0.13.1
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 +541 -69
- package/DESIGN.md +18 -18
- package/NOTICE +2 -2
- package/README.md +54 -52
- package/dist/chunk-23YEYNDS.js +89 -0
- package/dist/chunk-23YEYNDS.js.map +1 -0
- package/dist/chunk-25KBUQEQ.js +95 -0
- package/dist/chunk-25KBUQEQ.js.map +1 -0
- package/dist/chunk-2A3E5Y72.js +165 -0
- package/dist/chunk-2A3E5Y72.js.map +1 -0
- package/dist/chunk-2EUKYGH5.js +98 -0
- package/dist/chunk-2EUKYGH5.js.map +1 -0
- package/dist/chunk-2NZYMQKT.js +56 -0
- package/dist/chunk-2NZYMQKT.js.map +1 -0
- package/dist/chunk-2OVFVPSZ.js +26 -0
- package/dist/chunk-2OVFVPSZ.js.map +1 -0
- package/dist/chunk-2UP7SECE.js +78 -0
- package/dist/chunk-2UP7SECE.js.map +1 -0
- package/dist/chunk-33ETHPT7.js +112 -0
- package/dist/chunk-33ETHPT7.js.map +1 -0
- package/dist/chunk-33IIDFSM.js +43 -0
- package/dist/chunk-33IIDFSM.js.map +1 -0
- package/dist/chunk-345HYADQ.js +88 -0
- package/dist/chunk-345HYADQ.js.map +1 -0
- package/dist/chunk-3ZXZGZOX.js +57 -0
- package/dist/chunk-3ZXZGZOX.js.map +1 -0
- package/dist/chunk-45FWKR23.js +62 -0
- package/dist/chunk-45FWKR23.js.map +1 -0
- package/dist/chunk-4DTLUBRW.js +122 -0
- package/dist/chunk-4DTLUBRW.js.map +1 -0
- package/dist/chunk-4EH6F54D.js +69 -0
- package/dist/chunk-4EH6F54D.js.map +1 -0
- package/dist/chunk-4EKF4EIE.js +140 -0
- package/dist/chunk-4EKF4EIE.js.map +1 -0
- package/dist/chunk-4SMYNLTA.js +83 -0
- package/dist/chunk-4SMYNLTA.js.map +1 -0
- package/dist/chunk-4UBFLXS3.js +35 -0
- package/dist/chunk-4UBFLXS3.js.map +1 -0
- package/dist/chunk-52J7SDYH.js +48 -0
- package/dist/chunk-52J7SDYH.js.map +1 -0
- package/dist/chunk-5XCTTXC3.js +180 -0
- package/dist/chunk-5XCTTXC3.js.map +1 -0
- package/dist/chunk-624AATQZ.js +77 -0
- package/dist/chunk-624AATQZ.js.map +1 -0
- package/dist/chunk-6IODJQWC.js +47 -0
- package/dist/chunk-6IODJQWC.js.map +1 -0
- package/dist/chunk-75IDWFYX.js +134 -0
- package/dist/chunk-75IDWFYX.js.map +1 -0
- package/dist/chunk-7BGCWJQR.js +113 -0
- package/dist/chunk-7BGCWJQR.js.map +1 -0
- package/dist/chunk-7BQXMG2A.js +93 -0
- package/dist/chunk-7BQXMG2A.js.map +1 -0
- package/dist/chunk-7RFWVNQA.js +47 -0
- package/dist/chunk-7RFWVNQA.js.map +1 -0
- package/dist/chunk-7T4NK6W6.js +192 -0
- package/dist/chunk-7T4NK6W6.js.map +1 -0
- package/dist/chunk-A3OU6ICP.js +91 -0
- package/dist/chunk-A3OU6ICP.js.map +1 -0
- package/dist/chunk-ABBXLAJW.js +74 -0
- package/dist/chunk-ABBXLAJW.js.map +1 -0
- package/dist/chunk-AENNHS3S.js +83 -0
- package/dist/chunk-AENNHS3S.js.map +1 -0
- package/dist/chunk-AXNJFBYX.js +136 -0
- package/dist/chunk-AXNJFBYX.js.map +1 -0
- package/dist/chunk-AXUAQM45.js +154 -0
- package/dist/chunk-AXUAQM45.js.map +1 -0
- package/dist/chunk-B2FL7KBJ.js +65 -0
- package/dist/chunk-B2FL7KBJ.js.map +1 -0
- package/dist/chunk-BE232OKN.js +42 -0
- package/dist/chunk-BE232OKN.js.map +1 -0
- package/dist/chunk-BP4RQSX7.js +200 -0
- package/dist/chunk-BP4RQSX7.js.map +1 -0
- package/dist/chunk-BPJ3RN3U.js +112 -0
- package/dist/chunk-BPJ3RN3U.js.map +1 -0
- package/dist/chunk-BSF4Y4UT.js +77 -0
- package/dist/chunk-BSF4Y4UT.js.map +1 -0
- package/dist/chunk-BWIDDAR7.js +86 -0
- package/dist/chunk-BWIDDAR7.js.map +1 -0
- package/dist/chunk-BYUWQ6OP.js +45 -0
- package/dist/chunk-BYUWQ6OP.js.map +1 -0
- package/dist/chunk-C5ULP2P5.js +140 -0
- package/dist/chunk-C5ULP2P5.js.map +1 -0
- package/dist/chunk-CCG7PXLX.js +24 -0
- package/dist/chunk-CCG7PXLX.js.map +1 -0
- package/dist/chunk-CED2LKHI.js +117 -0
- package/dist/chunk-CED2LKHI.js.map +1 -0
- package/dist/chunk-CGWIOIEO.js +27 -0
- package/dist/chunk-CGWIOIEO.js.map +1 -0
- package/dist/chunk-CSEGVTKO.js +110 -0
- package/dist/chunk-CSEGVTKO.js.map +1 -0
- package/dist/chunk-CVFSNA4K.js +716 -0
- package/dist/chunk-CVFSNA4K.js.map +1 -0
- package/dist/chunk-E26M7ATD.js +61 -0
- package/dist/chunk-E26M7ATD.js.map +1 -0
- package/dist/chunk-E63IRXZZ.js +78 -0
- package/dist/chunk-E63IRXZZ.js.map +1 -0
- package/dist/chunk-ESJUISWY.js +45 -0
- package/dist/chunk-ESJUISWY.js.map +1 -0
- package/dist/chunk-ET7A3TQZ.js +158 -0
- package/dist/chunk-ET7A3TQZ.js.map +1 -0
- package/dist/chunk-ETTL6XGU.js +139 -0
- package/dist/chunk-ETTL6XGU.js.map +1 -0
- package/dist/chunk-EWDN56AS.js +24 -0
- package/dist/chunk-EWDN56AS.js.map +1 -0
- package/dist/chunk-FJZKA2LV.js +165 -0
- package/dist/chunk-FJZKA2LV.js.map +1 -0
- package/dist/chunk-G2WCT6PJ.js +69 -0
- package/dist/chunk-G2WCT6PJ.js.map +1 -0
- package/dist/chunk-GC52HWIL.js +41 -0
- package/dist/chunk-GC52HWIL.js.map +1 -0
- package/dist/chunk-GCKFA7X7.js +83 -0
- package/dist/chunk-GCKFA7X7.js.map +1 -0
- package/dist/chunk-GDMCDW66.js +19 -0
- package/dist/chunk-GDMCDW66.js.map +1 -0
- package/dist/chunk-GIXHBTHH.js +59 -0
- package/dist/chunk-GIXHBTHH.js.map +1 -0
- package/dist/chunk-GLEOUWPN.js +108 -0
- package/dist/chunk-GLEOUWPN.js.map +1 -0
- package/dist/chunk-GLRUM43F.js +121 -0
- package/dist/chunk-GLRUM43F.js.map +1 -0
- package/dist/chunk-H3L7WZDZ.js +74 -0
- package/dist/chunk-H3L7WZDZ.js.map +1 -0
- package/dist/chunk-H55WXDME.js +45 -0
- package/dist/chunk-H55WXDME.js.map +1 -0
- package/dist/chunk-H5QPJNVD.js +98 -0
- package/dist/chunk-H5QPJNVD.js.map +1 -0
- package/dist/chunk-HB45JHMM.js +43 -0
- package/dist/chunk-HB45JHMM.js.map +1 -0
- package/dist/chunk-HETHTYEZ.js +80 -0
- package/dist/chunk-HETHTYEZ.js.map +1 -0
- package/dist/chunk-HHSKNB32.js +55 -0
- package/dist/chunk-HHSKNB32.js.map +1 -0
- package/dist/chunk-HILOUYES.js +151 -0
- package/dist/chunk-HILOUYES.js.map +1 -0
- package/dist/chunk-HTJVHFNW.js +178 -0
- package/dist/chunk-HTJVHFNW.js.map +1 -0
- package/dist/chunk-HZ7Z22VW.js +130 -0
- package/dist/chunk-HZ7Z22VW.js.map +1 -0
- package/dist/chunk-JFKBFQA5.js +129 -0
- package/dist/chunk-JFKBFQA5.js.map +1 -0
- package/dist/chunk-JIZKW3WC.js +74 -0
- package/dist/chunk-JIZKW3WC.js.map +1 -0
- package/dist/chunk-JQTCCKZA.js +154 -0
- package/dist/chunk-JQTCCKZA.js.map +1 -0
- package/dist/chunk-JR4H3FJ2.js +74 -0
- package/dist/chunk-JR4H3FJ2.js.map +1 -0
- package/dist/chunk-JRW53TVG.js +53 -0
- package/dist/chunk-JRW53TVG.js.map +1 -0
- package/dist/chunk-JXOCE27Z.js +82 -0
- package/dist/chunk-JXOCE27Z.js.map +1 -0
- package/dist/chunk-JYW5YNF7.js +188 -0
- package/dist/chunk-JYW5YNF7.js.map +1 -0
- package/dist/chunk-K72DJOXR.js +81 -0
- package/dist/chunk-K72DJOXR.js.map +1 -0
- package/dist/chunk-KDE3NYTI.js +144 -0
- package/dist/chunk-KDE3NYTI.js.map +1 -0
- package/dist/chunk-KFUFTZLS.js +111 -0
- package/dist/chunk-KFUFTZLS.js.map +1 -0
- package/dist/chunk-KHBXI6AV.js +149 -0
- package/dist/chunk-KHBXI6AV.js.map +1 -0
- package/dist/chunk-M74ZYBOK.js +93 -0
- package/dist/chunk-M74ZYBOK.js.map +1 -0
- package/dist/chunk-ML7WLNIK.js +11 -0
- package/dist/chunk-ML7WLNIK.js.map +1 -0
- package/dist/chunk-MXB2GVEQ.js +57 -0
- package/dist/chunk-MXB2GVEQ.js.map +1 -0
- package/dist/chunk-NEMXW2LB.js +102 -0
- package/dist/chunk-NEMXW2LB.js.map +1 -0
- package/dist/chunk-OJPPSJMF.js +65 -0
- package/dist/chunk-OJPPSJMF.js.map +1 -0
- package/dist/chunk-OMR6ZGME.js +63 -0
- package/dist/chunk-OMR6ZGME.js.map +1 -0
- package/dist/chunk-ORVYP73T.js +223 -0
- package/dist/chunk-ORVYP73T.js.map +1 -0
- package/dist/chunk-OZFUUO2Q.js +50 -0
- package/dist/chunk-OZFUUO2Q.js.map +1 -0
- package/dist/chunk-P44UAK45.js +115 -0
- package/dist/chunk-P44UAK45.js.map +1 -0
- package/dist/chunk-PJUP4BJD.js +116 -0
- package/dist/chunk-PJUP4BJD.js.map +1 -0
- package/dist/chunk-PJWYIOY4.js +3 -0
- package/dist/chunk-PJWYIOY4.js.map +1 -0
- package/dist/chunk-PVCW4O37.js +147 -0
- package/dist/chunk-PVCW4O37.js.map +1 -0
- package/dist/chunk-PXT47DRZ.js +59 -0
- package/dist/chunk-PXT47DRZ.js.map +1 -0
- package/dist/chunk-PZGUZHI7.js +142 -0
- package/dist/chunk-PZGUZHI7.js.map +1 -0
- package/dist/chunk-Q2BAL2PF.js +965 -0
- package/dist/chunk-Q2BAL2PF.js.map +1 -0
- package/dist/chunk-QBUTRD2M.js +58 -0
- package/dist/chunk-QBUTRD2M.js.map +1 -0
- package/dist/chunk-QCQTTOMD.js +236 -0
- package/dist/chunk-QCQTTOMD.js.map +1 -0
- package/dist/chunk-QNYOIVQ4.js +36 -0
- package/dist/chunk-QNYOIVQ4.js.map +1 -0
- package/dist/chunk-QPURZJJM.js +88 -0
- package/dist/chunk-QPURZJJM.js.map +1 -0
- package/dist/chunk-QRXIYPWP.js +121 -0
- package/dist/chunk-QRXIYPWP.js.map +1 -0
- package/dist/chunk-QV4BQRNH.js +29 -0
- package/dist/chunk-QV4BQRNH.js.map +1 -0
- package/dist/chunk-REFY5MLN.js +212 -0
- package/dist/chunk-REFY5MLN.js.map +1 -0
- package/dist/chunk-RJ6RAMKH.js +89 -0
- package/dist/chunk-RJ6RAMKH.js.map +1 -0
- package/dist/chunk-RJBCTMVW.js +59 -0
- package/dist/chunk-RJBCTMVW.js.map +1 -0
- package/dist/chunk-RLWULF5B.js +113 -0
- package/dist/chunk-RLWULF5B.js.map +1 -0
- package/dist/chunk-RPZMFGYI.js +31 -0
- package/dist/chunk-RPZMFGYI.js.map +1 -0
- package/dist/chunk-RQT5DWGG.js +34 -0
- package/dist/chunk-RQT5DWGG.js.map +1 -0
- package/dist/chunk-SBKVVVYY.js +89 -0
- package/dist/chunk-SBKVVVYY.js.map +1 -0
- package/dist/chunk-SOJW47EZ.js +70 -0
- package/dist/chunk-SOJW47EZ.js.map +1 -0
- package/dist/chunk-SQ66DCXY.js +35 -0
- package/dist/chunk-SQ66DCXY.js.map +1 -0
- package/dist/chunk-SXKGWHAM.js +179 -0
- package/dist/chunk-SXKGWHAM.js.map +1 -0
- package/dist/chunk-T2OKGV6M.js +13 -0
- package/dist/chunk-T2OKGV6M.js.map +1 -0
- package/dist/chunk-TJLULCZW.js +108 -0
- package/dist/chunk-TJLULCZW.js.map +1 -0
- package/dist/chunk-TY6NTWN5.js +29 -0
- package/dist/chunk-TY6NTWN5.js.map +1 -0
- package/dist/chunk-U3AEEFVB.js +152 -0
- package/dist/chunk-U3AEEFVB.js.map +1 -0
- package/dist/chunk-V3HFDVZ3.js +102 -0
- package/dist/chunk-V3HFDVZ3.js.map +1 -0
- package/dist/chunk-V6H2RUVP.js +77 -0
- package/dist/chunk-V6H2RUVP.js.map +1 -0
- package/dist/chunk-VB53UMAL.js +106 -0
- package/dist/chunk-VB53UMAL.js.map +1 -0
- package/dist/chunk-VBEMLZGX.js +86 -0
- package/dist/chunk-VBEMLZGX.js.map +1 -0
- package/dist/chunk-VBQFE5RV.js +92 -0
- package/dist/chunk-VBQFE5RV.js.map +1 -0
- package/dist/chunk-VHK2OUCW.js +38 -0
- package/dist/chunk-VHK2OUCW.js.map +1 -0
- package/dist/chunk-VHTAVROO.js +53 -0
- package/dist/chunk-VHTAVROO.js.map +1 -0
- package/dist/chunk-VZX4HLBM.js +84 -0
- package/dist/chunk-VZX4HLBM.js.map +1 -0
- package/dist/chunk-W47V2F3Q.js +115 -0
- package/dist/chunk-W47V2F3Q.js.map +1 -0
- package/dist/chunk-W7I3ZX66.js +76 -0
- package/dist/chunk-W7I3ZX66.js.map +1 -0
- package/dist/chunk-WD42UBGR.js +64 -0
- package/dist/chunk-WD42UBGR.js.map +1 -0
- package/dist/chunk-XC7SYZYR.js +86 -0
- package/dist/chunk-XC7SYZYR.js.map +1 -0
- package/dist/chunk-XJA4B3F5.js +68 -0
- package/dist/chunk-XJA4B3F5.js.map +1 -0
- package/dist/chunk-XSENM65D.js +128 -0
- package/dist/chunk-XSENM65D.js.map +1 -0
- package/dist/chunk-YD2QEVHO.js +68 -0
- package/dist/chunk-YD2QEVHO.js.map +1 -0
- package/dist/chunk-YDKRUSB5.js +35 -0
- package/dist/chunk-YDKRUSB5.js.map +1 -0
- package/dist/chunk-YES6SPDT.js +55 -0
- package/dist/chunk-YES6SPDT.js.map +1 -0
- package/dist/chunk-YNDHYMPI.js +46 -0
- package/dist/chunk-YNDHYMPI.js.map +1 -0
- package/dist/chunk-YO3WEMOH.js +130 -0
- package/dist/chunk-YO3WEMOH.js.map +1 -0
- package/dist/chunk-YUFFAWNB.js +90 -0
- package/dist/chunk-YUFFAWNB.js.map +1 -0
- package/dist/chunk-YVXMWUWD.js +118 -0
- package/dist/chunk-YVXMWUWD.js.map +1 -0
- package/dist/chunk-Z6HZMGO2.js +106 -0
- package/dist/chunk-Z6HZMGO2.js.map +1 -0
- package/dist/chunk-ZAMPCRFJ.js +121 -0
- package/dist/chunk-ZAMPCRFJ.js.map +1 -0
- package/dist/chunk-ZEFOXF2I.js +87 -0
- package/dist/chunk-ZEFOXF2I.js.map +1 -0
- package/dist/chunk-ZJXOHLQE.js +66 -0
- package/dist/chunk-ZJXOHLQE.js.map +1 -0
- package/dist/chunk-ZPURFK4C.js +203 -0
- package/dist/chunk-ZPURFK4C.js.map +1 -0
- package/dist/chunk-ZZZIOTLC.js +89 -0
- package/dist/chunk-ZZZIOTLC.js.map +1 -0
- package/dist/components/composites/account-menu/account-menu.d.ts +43 -0
- package/dist/components/composites/account-menu/index.d.ts +1 -0
- package/dist/components/composites/agent-composer/agent-composer.d.ts +41 -0
- package/dist/components/composites/agent-composer/index.d.ts +1 -0
- package/dist/components/composites/agent-editor/agent-editor.d.ts +31 -0
- package/dist/components/composites/agent-editor/index.d.ts +1 -0
- package/dist/components/composites/agent-stream/agent-stream.d.ts +72 -0
- package/dist/components/composites/agent-stream/index.d.ts +2 -0
- package/dist/components/composites/agent-stream/to-agent-stream-items.d.ts +32 -0
- package/dist/components/composites/agent-timeline/agent-timeline.d.ts +22 -0
- package/dist/components/composites/agent-timeline/index.d.ts +1 -0
- package/dist/components/composites/agent-tool-renderer/agent-tool-renderer.d.ts +60 -0
- package/dist/components/composites/agent-tool-renderer/index.d.ts +1 -0
- package/dist/components/composites/agent-tool-renderer/tool-call-part.d.ts +5 -0
- package/dist/components/composites/approval-card/approval-card.d.ts +35 -0
- package/dist/components/composites/approval-card/index.d.ts +1 -0
- package/dist/components/composites/chat-composer/chat-composer.d.ts +68 -0
- package/dist/components/composites/chat-composer/index.d.ts +1 -0
- package/dist/components/composites/chat-message/chat-message-actions.d.ts +22 -0
- package/dist/components/composites/chat-message/chat-message-branch.d.ts +17 -0
- package/dist/components/composites/chat-message/chat-message-response.d.ts +15 -0
- package/dist/components/composites/chat-message/chat-message-toolbar.d.ts +7 -0
- package/dist/components/composites/chat-message/chat-message.d.ts +94 -0
- package/dist/components/composites/chat-message/index.d.ts +23 -0
- package/dist/components/composites/chat-message/parts/data-part.d.ts +9 -0
- package/dist/components/composites/chat-message/parts/file-part.d.ts +5 -0
- package/dist/components/composites/chat-message/parts/reasoning-part.d.ts +7 -0
- package/dist/components/composites/chat-message/parts/source-part.d.ts +9 -0
- package/dist/components/composites/chat-message/parts/text-part.d.ts +11 -0
- package/dist/components/composites/choice-prompt/choice-prompt.d.ts +65 -0
- package/dist/components/composites/choice-prompt/index.d.ts +2 -0
- package/dist/components/composites/code-block/code-block.d.ts +29 -0
- package/dist/components/composites/code-block/index.d.ts +1 -0
- package/dist/components/composites/command-palette/command-palette.d.ts +41 -0
- package/dist/components/composites/command-palette/index.d.ts +1 -0
- package/dist/components/composites/confirm-dialog/confirm-dialog.d.ts +41 -0
- package/dist/components/composites/confirm-dialog/index.d.ts +1 -0
- package/dist/components/composites/confirm-prompt/confirm-prompt.d.ts +31 -0
- package/dist/components/composites/confirm-prompt/index.d.ts +1 -0
- package/dist/components/composites/cron-jobs-list/cron-jobs-list.d.ts +15 -0
- package/dist/components/composites/cron-jobs-list/index.d.ts +1 -0
- package/dist/components/composites/data-table/data-table.d.ts +63 -0
- package/dist/components/composites/data-table/index.d.ts +1 -0
- package/dist/components/composites/deployment-row/deployment-row.d.ts +28 -0
- package/dist/components/composites/deployment-row/index.d.ts +1 -0
- package/dist/components/composites/domain-config/domain-config.d.ts +34 -0
- package/dist/components/composites/domain-config/index.d.ts +1 -0
- package/dist/components/composites/env-var-editor/env-var-editor.d.ts +35 -0
- package/dist/components/composites/env-var-editor/index.d.ts +1 -0
- package/dist/components/composites/mcp-server-list/index.d.ts +1 -0
- package/dist/components/composites/mcp-server-list/mcp-server-list.d.ts +15 -0
- package/dist/components/composites/metric-card/index.d.ts +2 -0
- package/dist/components/composites/metric-card/metric-card.d.ts +46 -0
- package/dist/components/composites/multi-select-prompt/index.d.ts +1 -0
- package/dist/components/composites/multi-select-prompt/multi-select-prompt.d.ts +61 -0
- package/dist/components/composites/page-shell/index.d.ts +1 -0
- package/dist/components/composites/page-shell/page-shell.d.ts +68 -0
- package/dist/components/composites/permission-modal/index.d.ts +1 -0
- package/dist/components/composites/permission-modal/permission-modal.d.ts +48 -0
- package/dist/components/composites/preview-env-card/index.d.ts +1 -0
- package/dist/components/composites/preview-env-card/preview-env-card.d.ts +36 -0
- package/dist/components/composites/preview-panel/index.d.ts +1 -0
- package/dist/components/composites/preview-panel/preview-panel.d.ts +24 -0
- package/dist/components/composites/project-card/index.d.ts +1 -0
- package/dist/components/composites/project-card/project-card.d.ts +32 -0
- package/dist/components/composites/rollback-ui/index.d.ts +1 -0
- package/dist/components/composites/rollback-ui/rollback-ui.d.ts +32 -0
- package/dist/components/composites/rule-editor/index.d.ts +1 -0
- package/dist/components/composites/rule-editor/rule-editor.d.ts +18 -0
- package/dist/components/composites/skill-editor/index.d.ts +1 -0
- package/dist/components/composites/skill-editor/skill-editor.d.ts +19 -0
- package/dist/components/composites/skills-list/index.d.ts +1 -0
- package/dist/components/composites/skills-list/skills-list.d.ts +15 -0
- package/dist/components/composites/slide-deck/context.d.ts +23 -0
- package/dist/components/composites/slide-deck/controls.d.ts +8 -0
- package/dist/components/composites/slide-deck/fragments.d.ts +20 -0
- package/dist/components/composites/slide-deck/index.d.ts +21 -0
- package/dist/components/composites/slide-deck/notes.d.ts +14 -0
- package/dist/components/composites/slide-deck/presenter-view.d.ts +15 -0
- package/dist/components/composites/slide-deck/print-styles.d.ts +21 -0
- package/dist/components/composites/slide-deck/progress-bar.d.ts +8 -0
- package/dist/components/composites/slide-deck/schema.d.ts +31 -0
- package/dist/components/composites/slide-deck/slide-deck.d.ts +78 -0
- package/dist/components/composites/slide-deck/slide-number.d.ts +11 -0
- package/dist/components/composites/slide-deck/split-deck.d.ts +2 -0
- package/dist/components/composites/slide-deck/thumbnails.d.ts +19 -0
- package/dist/components/composites/slide-deck/use-deck-hash-routing.d.ts +23 -0
- package/dist/components/composites/slide-deck/use-deck-keyboard.d.ts +25 -0
- package/dist/components/composites/slide-deck/use-deck-state.d.ts +57 -0
- package/dist/components/composites/slide-deck/use-deck-swipe.d.ts +20 -0
- package/dist/components/composites/slide-deck/use-fullscreen.d.ts +18 -0
- package/dist/components/composites/stability-bundle-viewer/index.d.ts +1 -0
- package/dist/components/composites/stability-bundle-viewer/stability-bundle-viewer.d.ts +28 -0
- package/dist/components/composites/status-indicator/index.d.ts +2 -0
- package/dist/components/composites/status-indicator/status-indicator.d.ts +31 -0
- package/dist/components/composites/task-header/index.d.ts +1 -0
- package/dist/components/composites/task-header/task-header.d.ts +20 -0
- package/dist/components/composites/text-prompt/index.d.ts +1 -0
- package/dist/components/composites/text-prompt/text-prompt.d.ts +48 -0
- package/dist/components/composites/usage-meter/index.d.ts +1 -0
- package/dist/components/composites/usage-meter/usage-meter.d.ts +56 -0
- package/dist/components/primitives/action-bar/action-bar.d.ts +34 -0
- package/dist/components/primitives/action-bar/index.d.ts +1 -0
- package/dist/components/primitives/agent-error-card/agent-error-card.d.ts +47 -0
- package/dist/components/primitives/agent-error-card/index.d.ts +1 -0
- package/dist/components/primitives/agent-event/agent-event.d.ts +25 -0
- package/dist/components/primitives/agent-event/index.d.ts +1 -0
- package/dist/components/primitives/agent-handoff/agent-handoff.d.ts +24 -0
- package/dist/components/primitives/agent-handoff/index.d.ts +1 -0
- package/dist/components/primitives/agent-profile/agent-profile.d.ts +28 -0
- package/dist/components/primitives/agent-profile/index.d.ts +1 -0
- package/dist/components/primitives/agent-starting-state/agent-starting-state.d.ts +15 -0
- package/dist/components/primitives/agent-starting-state/index.d.ts +1 -0
- package/dist/components/primitives/agent-streaming/agent-streaming.d.ts +16 -0
- package/dist/components/primitives/agent-streaming/index.d.ts +1 -0
- package/dist/components/primitives/alert/alert.d.ts +31 -0
- package/dist/components/primitives/alert/index.d.ts +1 -0
- package/dist/components/primitives/artifact-preview/artifact-preview.d.ts +25 -0
- package/dist/components/primitives/artifact-preview/index.d.ts +1 -0
- package/dist/components/primitives/attachment-chip/attachment-chip.d.ts +14 -0
- package/dist/components/primitives/attachment-chip/index.d.ts +1 -0
- package/dist/components/primitives/audit-log-entry/audit-log-entry.d.ts +29 -0
- package/dist/components/primitives/audit-log-entry/index.d.ts +1 -0
- package/dist/components/primitives/auto-compact-notice/auto-compact-notice.d.ts +24 -0
- package/dist/components/primitives/auto-compact-notice/index.d.ts +1 -0
- package/dist/components/primitives/avatar/avatar.d.ts +26 -0
- package/dist/components/primitives/avatar/index.d.ts +1 -0
- package/dist/components/primitives/badge/badge.d.ts +33 -0
- package/dist/components/primitives/badge/index.d.ts +1 -0
- package/dist/components/primitives/branch-indicator/branch-indicator.d.ts +13 -0
- package/dist/components/primitives/branch-indicator/index.d.ts +1 -0
- package/dist/components/primitives/browser-controls/browser-controls.d.ts +19 -0
- package/dist/components/primitives/browser-controls/index.d.ts +1 -0
- package/dist/components/primitives/build-log-stream/build-log-stream.d.ts +51 -0
- package/dist/components/primitives/build-log-stream/index.d.ts +1 -0
- package/dist/components/primitives/button/button.d.ts +26 -0
- package/dist/components/primitives/button/index.d.ts +1 -0
- package/dist/components/primitives/capability-indicator/capability-indicator.d.ts +57 -0
- package/dist/components/primitives/capability-indicator/index.d.ts +1 -0
- package/dist/components/primitives/card/card.d.ts +40 -0
- package/dist/components/primitives/card/index.d.ts +1 -0
- package/dist/components/primitives/channel-card/channel-card.d.ts +28 -0
- package/dist/components/primitives/channel-card/index.d.ts +1 -0
- package/dist/components/primitives/chat-thread/chat-thread.d.ts +12 -0
- package/dist/components/primitives/chat-thread/index.d.ts +1 -0
- package/dist/components/primitives/checkbox/checkbox.d.ts +20 -0
- package/dist/components/primitives/checkbox/index.d.ts +1 -0
- package/dist/components/primitives/context-card/context-card.d.ts +18 -0
- package/dist/components/primitives/context-card/index.d.ts +1 -0
- package/dist/components/primitives/context-window-bar/context-window-bar.d.ts +27 -0
- package/dist/components/primitives/context-window-bar/index.d.ts +1 -0
- package/dist/components/primitives/copy-button/copy-button.d.ts +17 -0
- package/dist/components/primitives/copy-button/index.d.ts +1 -0
- package/dist/components/primitives/cost-meter/cost-meter.d.ts +23 -0
- package/dist/components/primitives/cost-meter/index.d.ts +1 -0
- package/dist/components/primitives/created-files-card/created-files-card.d.ts +30 -0
- package/dist/components/primitives/created-files-card/index.d.ts +1 -0
- package/dist/components/primitives/cron-job-card/cron-job-card.d.ts +30 -0
- package/dist/components/primitives/cron-job-card/index.d.ts +1 -0
- package/dist/components/primitives/danger-zone/danger-zone.d.ts +40 -0
- package/dist/components/primitives/danger-zone/index.d.ts +1 -0
- package/dist/components/primitives/dialog/dialog.d.ts +26 -0
- package/dist/components/primitives/dialog/index.d.ts +1 -0
- package/dist/components/primitives/diff-viewer/diff-viewer.d.ts +45 -0
- package/dist/components/primitives/diff-viewer/index.d.ts +1 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu.d.ts +68 -0
- package/dist/components/primitives/dropdown-menu/index.d.ts +1 -0
- package/dist/components/primitives/empty-state/empty-state.d.ts +22 -0
- package/dist/components/primitives/empty-state/index.d.ts +1 -0
- package/dist/components/primitives/export-chat-dialog/export-chat-dialog.d.ts +18 -0
- package/dist/components/primitives/export-chat-dialog/index.d.ts +1 -0
- package/dist/components/primitives/folder-context-card/folder-context-card.d.ts +40 -0
- package/dist/components/primitives/folder-context-card/index.d.ts +1 -0
- package/dist/components/primitives/folder-selector/folder-selector.d.ts +18 -0
- package/dist/components/primitives/folder-selector/index.d.ts +1 -0
- package/dist/components/primitives/form-field/form-field.d.ts +44 -0
- package/dist/components/primitives/form-field/index.d.ts +1 -0
- package/dist/components/primitives/gateway-status-indicator/gateway-status-indicator.d.ts +19 -0
- package/dist/components/primitives/gateway-status-indicator/index.d.ts +1 -0
- package/dist/components/primitives/hook-config/hook-config.d.ts +27 -0
- package/dist/components/primitives/hook-config/index.d.ts +1 -0
- package/dist/components/primitives/hook-event-log/hook-event-log.d.ts +27 -0
- package/dist/components/primitives/hook-event-log/index.d.ts +1 -0
- package/dist/components/primitives/input/index.d.ts +1 -0
- package/dist/components/primitives/input/input.d.ts +24 -0
- package/dist/components/primitives/intent-selector/index.d.ts +1 -0
- package/dist/components/primitives/intent-selector/intent-selector.d.ts +22 -0
- package/dist/components/primitives/label/index.d.ts +1 -0
- package/dist/components/primitives/label/label.d.ts +15 -0
- package/dist/components/primitives/lane-board/index.d.ts +1 -0
- package/dist/components/primitives/lane-board/lane-board.d.ts +26 -0
- package/dist/components/primitives/login-split/index.d.ts +1 -0
- package/dist/components/primitives/login-split/login-split.d.ts +24 -0
- package/dist/components/primitives/mcp-server-card/index.d.ts +1 -0
- package/dist/components/primitives/mcp-server-card/mcp-server-card.d.ts +32 -0
- package/dist/components/primitives/memory-editor/index.d.ts +1 -0
- package/dist/components/primitives/memory-editor/memory-editor.d.ts +29 -0
- package/dist/components/primitives/mention-menu/index.d.ts +1 -0
- package/dist/components/primitives/mention-menu/mention-menu.d.ts +44 -0
- package/dist/components/primitives/metrics-panel/index.d.ts +1 -0
- package/dist/components/primitives/metrics-panel/metrics-panel.d.ts +62 -0
- package/dist/components/primitives/model-card/index.d.ts +1 -0
- package/dist/components/primitives/model-card/model-card.d.ts +72 -0
- package/dist/components/primitives/model-selector/index.d.ts +1 -0
- package/dist/components/primitives/model-selector/model-selector.d.ts +21 -0
- package/dist/components/primitives/pagination/index.d.ts +1 -0
- package/dist/components/primitives/pagination/pagination.d.ts +44 -0
- package/dist/components/primitives/permission-matrix/index.d.ts +1 -0
- package/dist/components/primitives/permission-matrix/permission-matrix.d.ts +43 -0
- package/dist/components/primitives/pin-input/index.d.ts +1 -0
- package/dist/components/primitives/pin-input/pin-input.d.ts +41 -0
- package/dist/components/primitives/plan-badge/index.d.ts +1 -0
- package/dist/components/primitives/plan-badge/plan-badge.d.ts +35 -0
- package/dist/components/primitives/progress/index.d.ts +1 -0
- package/dist/components/primitives/progress/progress.d.ts +44 -0
- package/dist/components/primitives/progress-checklist/index.d.ts +1 -0
- package/dist/components/primitives/progress-checklist/progress-checklist.d.ts +18 -0
- package/dist/components/primitives/project-switcher/index.d.ts +1 -0
- package/dist/components/primitives/project-switcher/project-switcher.d.ts +32 -0
- package/dist/components/primitives/quick-action-chips/index.d.ts +1 -0
- package/dist/components/primitives/quick-action-chips/quick-action-chips.d.ts +22 -0
- package/dist/components/primitives/radio-group/index.d.ts +1 -0
- package/dist/components/primitives/radio-group/radio-group.d.ts +5 -0
- package/dist/components/primitives/recent-folders-list/index.d.ts +1 -0
- package/dist/components/primitives/recent-folders-list/recent-folders-list.d.ts +21 -0
- package/dist/components/primitives/rule-card/index.d.ts +1 -0
- package/dist/components/primitives/rule-card/rule-card.d.ts +15 -0
- package/dist/components/primitives/run-stats/index.d.ts +1 -0
- package/dist/components/primitives/run-stats/run-stats.d.ts +16 -0
- package/dist/components/primitives/run-status-pill/index.d.ts +1 -0
- package/dist/components/primitives/run-status-pill/run-status-pill.d.ts +13 -0
- package/dist/components/primitives/running-tasks-panel/index.d.ts +1 -0
- package/dist/components/primitives/running-tasks-panel/running-tasks-panel.d.ts +20 -0
- package/dist/components/primitives/scroll-area/index.d.ts +2 -0
- package/dist/components/primitives/scroll-area/scroll-area.d.ts +40 -0
- package/dist/components/primitives/scroll-area/use-stick-to-bottom.d.ts +20 -0
- package/dist/components/primitives/select/index.d.ts +1 -0
- package/dist/components/primitives/select/select.d.ts +50 -0
- package/dist/components/primitives/session-list-item/index.d.ts +1 -0
- package/dist/components/primitives/session-list-item/session-list-item.d.ts +35 -0
- package/dist/components/primitives/session-timeline/index.d.ts +1 -0
- package/dist/components/primitives/session-timeline/session-timeline.d.ts +32 -0
- package/dist/components/primitives/sheet/index.d.ts +1 -0
- package/dist/components/primitives/sheet/sheet.d.ts +57 -0
- package/dist/components/primitives/sidebar/index.d.ts +1 -0
- package/dist/components/primitives/sidebar/sidebar.d.ts +18 -0
- package/dist/components/primitives/skeleton/index.d.ts +1 -0
- package/dist/components/primitives/skeleton/skeleton.d.ts +21 -0
- package/dist/components/primitives/skill-card/index.d.ts +1 -0
- package/dist/components/primitives/skill-card/skill-card.d.ts +28 -0
- package/dist/components/primitives/slide/alerts.d.ts +31 -0
- package/dist/components/primitives/slide/frontmatter.d.ts +23 -0
- package/dist/components/primitives/slide/index.d.ts +16 -0
- package/dist/components/primitives/slide/json-schema.d.ts +9 -0
- package/dist/components/primitives/slide/marpit-bg.d.ts +36 -0
- package/dist/components/primitives/slide/parse.d.ts +59 -0
- package/dist/components/primitives/slide/plugin.d.ts +79 -0
- package/dist/components/primitives/slide/plugins/emoji/index.d.ts +8 -0
- package/dist/components/primitives/slide/plugins/emoji/map.d.ts +15 -0
- package/dist/components/primitives/slide/plugins/math/index.d.ts +6 -0
- package/dist/components/primitives/slide/plugins/mermaid/index.d.ts +48 -0
- package/dist/components/primitives/slide/plugins/shiki/index.d.ts +11 -0
- package/dist/components/primitives/slide/sanitize.d.ts +33 -0
- package/dist/components/primitives/slide/schema.d.ts +109 -0
- package/dist/components/primitives/slide/slide.d.ts +53 -0
- package/dist/components/primitives/slide/themes/index.d.ts +9 -0
- package/dist/components/primitives/slide/use-slide-fit.d.ts +21 -0
- package/dist/components/primitives/slide/validate.d.ts +33 -0
- package/dist/components/primitives/social-auth-row/index.d.ts +1 -0
- package/dist/components/primitives/social-auth-row/social-auth-row.d.ts +24 -0
- package/dist/components/primitives/stat-tile/index.d.ts +1 -0
- package/dist/components/primitives/stat-tile/stat-tile.d.ts +28 -0
- package/dist/components/primitives/status-dot/index.d.ts +1 -0
- package/dist/components/primitives/status-dot/status-dot.d.ts +31 -0
- package/dist/components/primitives/steps-rail/index.d.ts +1 -0
- package/dist/components/primitives/steps-rail/steps-rail.d.ts +24 -0
- package/dist/components/primitives/sub-agent-dispatch/index.d.ts +1 -0
- package/dist/components/primitives/sub-agent-dispatch/sub-agent-dispatch.d.ts +30 -0
- package/dist/components/primitives/switch/index.d.ts +1 -0
- package/dist/components/primitives/switch/switch.d.ts +20 -0
- package/dist/components/primitives/system-prompt-editor/index.d.ts +1 -0
- package/dist/components/primitives/system-prompt-editor/system-prompt-editor.d.ts +25 -0
- package/dist/components/primitives/table/index.d.ts +1 -0
- package/dist/components/primitives/table/table.d.ts +61 -0
- package/dist/components/primitives/tabs/index.d.ts +1 -0
- package/dist/components/primitives/tabs/tabs.d.ts +7 -0
- package/dist/components/primitives/task-plan/index.d.ts +1 -0
- package/dist/components/primitives/task-plan/task-plan.d.ts +36 -0
- package/dist/components/primitives/terminal-panel/index.d.ts +1 -0
- package/dist/components/primitives/terminal-panel/terminal-panel.d.ts +32 -0
- package/dist/components/primitives/textarea/index.d.ts +1 -0
- package/dist/components/primitives/textarea/textarea.d.ts +20 -0
- package/dist/components/primitives/thinking-level-selector/index.d.ts +1 -0
- package/dist/components/primitives/thinking-level-selector/thinking-level-selector.d.ts +24 -0
- package/dist/components/primitives/timestamp/index.d.ts +1 -0
- package/dist/components/primitives/timestamp/timestamp.d.ts +34 -0
- package/dist/components/primitives/toast/index.d.ts +2 -0
- package/dist/components/primitives/toast/toast.d.ts +34 -0
- package/dist/components/primitives/toast/toaster.d.ts +38 -0
- package/dist/components/primitives/token-usage-chart/index.d.ts +2 -0
- package/dist/components/primitives/token-usage-chart/token-usage-chart.d.ts +44 -0
- package/dist/components/primitives/token-usage-chart/usage-metrics.d.ts +23 -0
- package/dist/components/primitives/tool-call/index.d.ts +1 -0
- package/dist/components/primitives/tool-call/tool-call.d.ts +30 -0
- package/dist/components/primitives/tool-call-card/index.d.ts +1 -0
- package/dist/components/primitives/tool-call-card/tool-call-card.d.ts +30 -0
- package/dist/components/primitives/tool-result/index.d.ts +1 -0
- package/dist/components/primitives/tool-result/tool-result.d.ts +19 -0
- package/dist/components/primitives/tools-list/index.d.ts +1 -0
- package/dist/components/primitives/tools-list/tools-list.d.ts +32 -0
- package/dist/components/primitives/tooltip/index.d.ts +1 -0
- package/dist/components/primitives/tooltip/tooltip.d.ts +33 -0
- package/dist/components/primitives/topnav/index.d.ts +1 -0
- package/dist/components/primitives/topnav/topnav.d.ts +29 -0
- package/dist/components/primitives/update-banner/index.d.ts +1 -0
- package/dist/components/primitives/update-banner/update-banner.d.ts +16 -0
- package/dist/components/primitives/whiteboard/index.d.ts +2 -0
- package/dist/components/primitives/whiteboard/render/freedraw.d.ts +2 -0
- package/dist/components/primitives/whiteboard/render/line.d.ts +4 -0
- package/dist/components/primitives/whiteboard/render/rough-paths.d.ts +16 -0
- package/dist/components/primitives/whiteboard/render/scene.d.ts +3 -0
- package/dist/components/primitives/whiteboard/render/shape.d.ts +5 -0
- package/dist/components/primitives/whiteboard/render/style.d.ts +24 -0
- package/dist/components/primitives/whiteboard/render/text.d.ts +2 -0
- package/dist/components/primitives/whiteboard/schema.d.ts +596 -0
- package/dist/components/primitives/whiteboard/seed.d.ts +22 -0
- package/dist/components/primitives/whiteboard/validate.d.ts +26 -0
- package/dist/components/primitives/whiteboard/viewport/use-pointer-pan.d.ts +11 -0
- package/dist/components/primitives/whiteboard/viewport/use-viewport.d.ts +33 -0
- package/dist/components/primitives/whiteboard/whiteboard.d.ts +21 -0
- package/dist/components.css +1 -1
- package/dist/composites/account-menu/index.js +4 -4
- package/dist/composites/agent-composer/index.js +6 -5
- package/dist/composites/agent-editor/index.js +8 -7
- package/dist/composites/agent-stream/index.js +21 -9
- package/dist/composites/agent-timeline/index.js +3 -3
- package/dist/composites/agent-tool-renderer/index.js +17 -0
- package/dist/composites/agent-tool-renderer/index.js.map +1 -0
- package/dist/composites/approval-card/index.js +3 -3
- package/dist/composites/chat-composer/index.js +3 -3
- package/dist/composites/chat-message/index.js +18 -4
- package/dist/composites/choice-prompt/index.js +11 -0
- package/dist/composites/choice-prompt/index.js.map +1 -0
- package/dist/composites/code-block/index.js +3 -3
- package/dist/composites/command-palette/index.js +4 -3
- package/dist/composites/confirm-dialog/index.js +6 -5
- package/dist/composites/confirm-prompt/index.js +7 -0
- package/dist/composites/confirm-prompt/index.js.map +1 -0
- package/dist/composites/cron-jobs-list/index.js +3 -3
- package/dist/composites/data-table/index.js +8 -7
- package/dist/composites/deployment-row/index.js +3 -3
- package/dist/composites/domain-config/index.js +6 -5
- package/dist/composites/env-var-editor/index.js +7 -5
- package/dist/composites/mcp-server-list/index.js +4 -3
- package/dist/composites/metric-card/index.js +5 -0
- package/dist/composites/metric-card/index.js.map +1 -0
- package/dist/composites/multi-select-prompt/index.js +11 -0
- package/dist/composites/multi-select-prompt/index.js.map +1 -0
- package/dist/composites/page-shell/index.js +6 -5
- package/dist/composites/permission-modal/index.js +5 -4
- package/dist/composites/preview-env-card/index.js +4 -4
- package/dist/composites/preview-panel/index.js +3 -3
- package/dist/composites/project-card/index.js +4 -4
- package/dist/composites/rollback-ui/index.js +5 -4
- package/dist/composites/rule-editor/index.js +9 -8
- package/dist/composites/skill-editor/index.js +9 -8
- package/dist/composites/skills-list/index.js +4 -3
- package/dist/composites/stability-bundle-viewer/index.js +3 -2
- package/dist/composites/status-indicator/index.js +4 -0
- package/dist/composites/status-indicator/index.js.map +1 -0
- package/dist/composites/task-header/index.js +3 -3
- package/dist/composites/text-prompt/index.js +10 -0
- package/dist/composites/text-prompt/index.js.map +1 -0
- package/dist/composites/usage-meter/index.js +3 -3
- package/dist/fonts-cdn.css +4 -4
- package/dist/fonts.css +2 -2
- package/dist/index.d.ts +144 -4622
- package/dist/index.js +999 -739
- package/dist/index.js.map +1 -1
- package/dist/lib/cn.d.ts +6 -0
- package/dist/lib/env.d.ts +55 -0
- package/dist/lib/live-region-context.d.ts +2 -0
- package/dist/lib/markdown/code-block.d.ts +14 -0
- package/dist/lib/markdown/inline-code.d.ts +10 -0
- package/dist/lib/markdown/math.d.ts +12 -0
- package/dist/lib/markdown/mermaid.d.ts +6 -0
- package/dist/lib/markdown/parser.d.ts +47 -0
- package/dist/lib/markdown/streaming-preprocess.d.ts +39 -0
- package/dist/lib/prompt.d.ts +40 -0
- package/dist/lib/safe-href.d.ts +27 -0
- package/dist/lib/sdk-tools-adapters/index.d.ts +1 -0
- package/dist/lib/sdk-tools-adapters/index.js +3 -0
- package/dist/lib/sdk-tools-adapters/index.js.map +1 -0
- package/dist/lib/sdk-tools-adapters/sdk-tools-adapters.d.ts +60 -0
- package/dist/lib/types.d.ts +10 -0
- package/dist/preset-v3-legacy.d.ts +7 -10
- package/dist/preset-v3-legacy.js +23 -3
- package/dist/preset-v3-legacy.js.map +1 -1
- package/dist/preset.css +2 -2
- package/dist/primitives/action-bar/index.js +2 -2
- package/dist/primitives/agent-error-card/index.js +2 -2
- package/dist/primitives/agent-event/index.js +3 -2
- package/dist/primitives/agent-handoff/index.js +2 -2
- package/dist/primitives/agent-profile/index.js +2 -2
- package/dist/primitives/agent-starting-state/index.js +2 -2
- package/dist/primitives/agent-streaming/index.js +2 -2
- package/dist/primitives/alert/index.js +2 -2
- package/dist/primitives/artifact-preview/index.js +2 -2
- package/dist/primitives/attachment-chip/index.js +2 -2
- package/dist/primitives/audit-log-entry/index.js +2 -2
- package/dist/primitives/auto-compact-notice/index.js +2 -2
- package/dist/primitives/avatar/index.js +2 -2
- package/dist/primitives/badge/index.js +2 -2
- package/dist/primitives/branch-indicator/index.js +2 -2
- package/dist/primitives/browser-controls/index.js +2 -2
- package/dist/primitives/build-log-stream/index.js +4 -2
- package/dist/primitives/button/index.js +2 -2
- package/dist/primitives/capability-indicator/index.js +2 -2
- package/dist/primitives/card/index.js +3 -2
- package/dist/primitives/channel-card/index.js +2 -2
- package/dist/primitives/chat-thread/index.js +2 -2
- package/dist/primitives/checkbox/index.js +2 -2
- package/dist/primitives/context-card/index.js +2 -2
- package/dist/primitives/context-window-bar/index.js +2 -2
- package/dist/primitives/copy-button/index.js +3 -2
- package/dist/primitives/cost-meter/index.js +2 -2
- package/dist/primitives/created-files-card/index.js +2 -2
- package/dist/primitives/cron-job-card/index.js +2 -2
- package/dist/primitives/danger-zone/index.js +2 -2
- package/dist/primitives/dialog/index.js +2 -2
- package/dist/primitives/diff-viewer/index.js +2 -2
- package/dist/primitives/dropdown-menu/index.js +2 -2
- package/dist/primitives/empty-state/index.js +2 -2
- package/dist/primitives/export-chat-dialog/index.js +3 -2
- package/dist/primitives/folder-context-card/index.js +2 -2
- package/dist/primitives/folder-selector/index.js +2 -2
- package/dist/primitives/form-field/index.js +3 -2
- package/dist/primitives/gateway-status-indicator/index.js +2 -2
- package/dist/primitives/hook-config/index.js +3 -2
- package/dist/primitives/hook-event-log/index.js +2 -2
- package/dist/primitives/input/index.js +2 -2
- package/dist/primitives/intent-selector/index.js +2 -2
- package/dist/primitives/label/index.js +2 -2
- package/dist/primitives/lane-board/index.js +2 -2
- package/dist/primitives/login-split/index.js +2 -2
- package/dist/primitives/mcp-server-card/index.js +2 -2
- package/dist/primitives/memory-editor/index.js +2 -2
- package/dist/primitives/mention-menu/index.js +3 -2
- package/dist/primitives/metrics-panel/index.js +2 -2
- package/dist/primitives/model-card/index.js +2 -2
- package/dist/primitives/model-selector/index.js +2 -2
- package/dist/primitives/pagination/index.js +2 -2
- package/dist/primitives/permission-matrix/index.js +3 -2
- package/dist/primitives/pin-input/index.js +3 -2
- package/dist/primitives/plan-badge/index.js +2 -2
- package/dist/primitives/progress/index.js +2 -2
- package/dist/primitives/progress-checklist/index.js +2 -2
- package/dist/primitives/project-switcher/index.js +2 -2
- package/dist/primitives/quick-action-chips/index.js +2 -2
- package/dist/primitives/radio-group/index.js +2 -2
- package/dist/primitives/recent-folders-list/index.js +2 -2
- package/dist/primitives/rule-card/index.js +2 -2
- package/dist/primitives/run-stats/index.js +2 -2
- package/dist/primitives/run-status-pill/index.js +2 -2
- package/dist/primitives/running-tasks-panel/index.js +2 -2
- package/dist/primitives/scroll-area/index.js +3 -2
- package/dist/primitives/select/index.js +2 -2
- package/dist/primitives/session-list-item/index.js +2 -2
- package/dist/primitives/session-timeline/index.js +2 -2
- package/dist/primitives/sheet/index.js +2 -2
- package/dist/primitives/sidebar/index.js +2 -2
- package/dist/primitives/skeleton/index.js +2 -2
- package/dist/primitives/skill-card/index.js +2 -2
- package/dist/primitives/social-auth-row/index.js +2 -2
- package/dist/primitives/stat-tile/index.js +2 -2
- package/dist/primitives/status-dot/index.js +4 -2
- package/dist/primitives/steps-rail/index.js +2 -2
- package/dist/primitives/sub-agent-dispatch/index.js +2 -2
- package/dist/primitives/switch/index.js +2 -2
- package/dist/primitives/system-prompt-editor/index.js +3 -2
- package/dist/primitives/table/index.js +3 -2
- package/dist/primitives/tabs/index.js +2 -2
- package/dist/primitives/task-plan/index.js +2 -2
- package/dist/primitives/terminal-panel/index.js +2 -2
- package/dist/primitives/textarea/index.js +2 -2
- package/dist/primitives/thinking-level-selector/index.js +3 -2
- package/dist/primitives/timestamp/index.js +4 -2
- package/dist/primitives/toast/index.js +3 -2
- package/dist/primitives/token-usage-chart/index.js +2 -2
- package/dist/primitives/tool-call/index.js +3 -2
- package/dist/primitives/tool-call-card/index.js +3 -2
- package/dist/primitives/tool-result/index.js +2 -2
- package/dist/primitives/tools-list/index.js +2 -2
- package/dist/primitives/tooltip/index.js +2 -2
- package/dist/primitives/topnav/index.js +2 -2
- package/dist/primitives/update-banner/index.js +2 -2
- package/dist/screens/theo-code-shell.d.ts +9 -0
- package/dist/screens/theo-code-shell.data.d.ts +147 -0
- package/dist/slide/index.js +2 -1
- package/dist/slide/plugins/mermaid/index.js +1 -1
- package/dist/slide/plugins/mermaid/index.js.map +1 -1
- package/dist/slide/plugins/shiki/index.js.map +1 -1
- package/dist/slide/themes/violet-forge.css +1 -1
- package/dist/slide-deck/index.js +13 -2
- package/dist/slide-deck/index.js.map +1 -1
- package/dist/styles/tailwind-preset.d.ts +29 -0
- package/dist/styles.css +3 -3
- package/dist/test/a11y.d.ts +13 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/themes/anthropic-style.d.ts +11 -0
- package/dist/themes/aurora-terminal.d.ts +9 -0
- package/dist/themes/classic-paper.d.ts +17 -0
- package/dist/themes/color-value-pattern.d.ts +22 -0
- package/dist/themes/color.d.ts +62 -0
- package/dist/themes/define.d.ts +65 -0
- package/dist/themes/density.d.ts +17 -0
- package/dist/themes/dracula.d.ts +14 -0
- package/dist/themes/github-dark.d.ts +11 -0
- package/dist/themes/index.d.ts +26 -0
- package/dist/themes/linear-glass.d.ts +11 -0
- package/dist/themes/one-dark.d.ts +11 -0
- package/dist/themes/openai-style.d.ts +10 -0
- package/dist/themes/schema.d.ts +112 -0
- package/dist/themes/theme-provider.d.ts +82 -0
- package/dist/themes/theme-script.d.ts +48 -0
- package/dist/themes/theme-switcher.d.ts +17 -0
- package/dist/themes/types.d.ts +88 -0
- package/dist/themes/vercel-mono.d.ts +11 -0
- package/dist/themes/violet-forge.d.ts +12 -0
- package/dist/theo-ui-provider.d.ts +50 -0
- package/dist/tokens-v4.css +77 -41
- package/dist/tokens.css +159 -74
- package/dist/types/agent.d.ts +19 -0
- package/dist/types/chat.d.ts +173 -0
- package/dist/types/mode.d.ts +16 -0
- package/dist/types/permission.d.ts +8 -0
- package/dist/types/rule.d.ts +28 -0
- package/dist/types/task.d.ts +9 -0
- package/dist/vite-plugin.d.ts +7 -11
- package/dist/vite-plugin.js +4 -4
- package/dist/vite-plugin.js.map +1 -1
- package/dist/whiteboard/index.js +3 -0
- package/dist/whiteboard/index.js.map +1 -1
- package/llms.txt +39 -39
- package/package.json +236 -188
- package/registry/index.json +58 -4
- package/registry/r/account-menu.json +1 -1
- package/registry/r/action-bar.json +1 -1
- package/registry/r/agent-composer.json +1 -1
- package/registry/r/agent-editor.json +1 -1
- package/registry/r/agent-error-card.json +1 -1
- package/registry/r/agent-event.json +1 -1
- package/registry/r/agent-handoff.json +1 -1
- package/registry/r/agent-profile.json +1 -1
- package/registry/r/agent-starting-state.json +1 -1
- package/registry/r/agent-stream.json +1 -1
- package/registry/r/agent-streaming.json +1 -1
- package/registry/r/agent-timeline.json +1 -1
- package/registry/r/agent-tool-renderer.json +40 -0
- package/registry/r/alert.json +1 -1
- package/registry/r/approval-card.json +1 -1
- package/registry/r/artifact-preview.json +1 -1
- package/registry/r/attachment-chip.json +1 -1
- package/registry/r/audit-log-entry.json +1 -1
- package/registry/r/auto-compact-notice.json +1 -1
- package/registry/r/avatar.json +1 -1
- package/registry/r/badge.json +1 -1
- package/registry/r/browser-controls.json +1 -1
- package/registry/r/build-log-stream.json +2 -1
- package/registry/r/button.json +1 -1
- package/registry/r/capability-indicator.json +1 -1
- package/registry/r/card.json +1 -1
- package/registry/r/chat-composer.json +1 -1
- package/registry/r/chat-message.json +11 -16
- package/registry/r/chat-thread.json +1 -1
- package/registry/r/chat-types.json +1 -1
- package/registry/r/checkbox.json +1 -1
- package/registry/r/choice-prompt.json +25 -0
- package/registry/r/cn.json +1 -1
- package/registry/r/code-block.json +1 -1
- package/registry/r/command-palette.json +1 -1
- package/registry/r/confirm-dialog.json +1 -1
- package/registry/r/confirm-prompt.json +21 -0
- package/registry/r/context-card.json +1 -1
- package/registry/r/context-window-bar.json +1 -1
- package/registry/r/copy-button.json +1 -1
- package/registry/r/cost-meter.json +1 -1
- package/registry/r/created-files-card.json +1 -1
- package/registry/r/cron-job-card.json +1 -1
- package/registry/r/cron-jobs-list.json +1 -1
- package/registry/r/danger-zone.json +1 -1
- package/registry/r/data-table.json +1 -1
- package/registry/r/deployment-row.json +1 -1
- package/registry/r/dialog.json +1 -1
- package/registry/r/diff-viewer.json +1 -1
- package/registry/r/domain-config.json +1 -1
- package/registry/r/dropdown-menu.json +2 -2
- package/registry/r/empty-state.json +1 -1
- package/registry/r/env-var-editor.json +2 -1
- package/registry/r/env.json +15 -0
- package/registry/r/folder-context-card.json +1 -1
- package/registry/r/folder-selector.json +1 -1
- package/registry/r/form-field.json +1 -1
- package/registry/r/hook-config.json +1 -1
- package/registry/r/hook-event-log.json +1 -1
- package/registry/r/input.json +1 -1
- package/registry/r/intent-selector.json +1 -1
- package/registry/r/label.json +1 -1
- package/registry/r/lane-board.json +1 -1
- package/registry/r/login-split.json +1 -1
- package/registry/r/mcp-server-card.json +1 -1
- package/registry/r/mcp-server-list.json +1 -1
- package/registry/r/memory-editor.json +1 -1
- package/registry/r/mention-menu.json +1 -1
- package/registry/r/metric-card.json +23 -0
- package/registry/r/metrics-panel.json +1 -1
- package/registry/r/model-card.json +1 -1
- package/registry/r/model-selector.json +1 -1
- package/registry/r/multi-select-prompt.json +25 -0
- package/registry/r/page-shell.json +1 -1
- package/registry/r/pagination.json +1 -1
- package/registry/r/permission-matrix.json +1 -1
- package/registry/r/permission-modal.json +1 -1
- package/registry/r/pin-input.json +1 -1
- package/registry/r/plan-badge.json +1 -1
- package/registry/r/preview-env-card.json +1 -1
- package/registry/r/preview-panel.json +1 -1
- package/registry/r/progress-checklist.json +1 -1
- package/registry/r/progress.json +1 -1
- package/registry/r/project-card.json +1 -1
- package/registry/r/project-switcher.json +1 -1
- package/registry/r/prompt.json +15 -0
- package/registry/r/quick-action-chips.json +1 -1
- package/registry/r/radio-group.json +1 -1
- package/registry/r/recent-folders-list.json +1 -1
- package/registry/r/rollback-ui.json +1 -1
- package/registry/r/rule-card.json +1 -1
- package/registry/r/rule-editor.json +1 -1
- package/registry/r/run-stats.json +1 -1
- package/registry/r/running-tasks-panel.json +1 -1
- package/registry/r/safe-href.json +1 -1
- package/registry/r/scroll-area.json +1 -1
- package/registry/r/select.json +1 -1
- package/registry/r/session-list-item.json +1 -1
- package/registry/r/session-timeline.json +1 -1
- package/registry/r/sheet.json +1 -1
- package/registry/r/sidebar.json +1 -1
- package/registry/r/skeleton.json +1 -1
- package/registry/r/skill-card.json +1 -1
- package/registry/r/skill-editor.json +1 -1
- package/registry/r/skills-list.json +1 -1
- package/registry/r/slide-deck.json +8 -8
- package/registry/r/slide-plugin-mermaid.json +1 -1
- package/registry/r/slide-plugin-shiki.json +1 -1
- package/registry/r/slide.json +6 -6
- package/registry/r/social-auth-row.json +1 -1
- package/registry/r/stat-tile.json +1 -1
- package/registry/r/status-dot.json +2 -1
- package/registry/r/status-indicator.json +20 -0
- package/registry/r/steps-rail.json +1 -1
- package/registry/r/sub-agent-dispatch.json +1 -1
- package/registry/r/switch.json +1 -1
- package/registry/r/system-prompt-editor.json +1 -1
- package/registry/r/table.json +1 -1
- package/registry/r/tabs.json +1 -1
- package/registry/r/tailwind-preset.json +1 -1
- package/registry/r/task-header.json +1 -1
- package/registry/r/task-plan.json +1 -1
- package/registry/r/terminal-panel.json +1 -1
- package/registry/r/text-prompt.json +24 -0
- package/registry/r/textarea.json +1 -1
- package/registry/r/theme-provider.json +7 -6
- package/registry/r/theo-ui-provider.json +1 -1
- package/registry/r/timestamp.json +2 -1
- package/registry/r/toast.json +2 -2
- package/registry/r/token-usage-chart.json +1 -1
- package/registry/r/tokens.json +2 -2
- package/registry/r/tool-call-card.json +1 -1
- package/registry/r/tool-call.json +1 -1
- package/registry/r/tool-result.json +1 -1
- package/registry/r/tools-list.json +1 -1
- package/registry/r/tooltip.json +1 -1
- package/registry/r/topnav.json +1 -1
- package/registry/r/usage-meter.json +1 -1
- package/registry/r/whiteboard.json +3 -3
- package/dist/chunk-2UJROWAG.js +0 -106
- package/dist/chunk-2UJROWAG.js.map +0 -1
- package/dist/chunk-2XPWOUEH.js +0 -68
- package/dist/chunk-2XPWOUEH.js.map +0 -1
- package/dist/chunk-3GHLNCM3.js +0 -42
- package/dist/chunk-3GHLNCM3.js.map +0 -1
- package/dist/chunk-3HOXC25T.js +0 -48
- package/dist/chunk-3HOXC25T.js.map +0 -1
- package/dist/chunk-3QGO5SB3.js +0 -46
- package/dist/chunk-3QGO5SB3.js.map +0 -1
- package/dist/chunk-47QJVWW2.js +0 -85
- package/dist/chunk-47QJVWW2.js.map +0 -1
- package/dist/chunk-4L63UW3I.js +0 -35
- package/dist/chunk-4L63UW3I.js.map +0 -1
- package/dist/chunk-4UUSJJFZ.js +0 -25
- package/dist/chunk-4UUSJJFZ.js.map +0 -1
- package/dist/chunk-4ZBZBRG5.js +0 -127
- package/dist/chunk-4ZBZBRG5.js.map +0 -1
- package/dist/chunk-57NXT3OX.js +0 -92
- package/dist/chunk-57NXT3OX.js.map +0 -1
- package/dist/chunk-5FF5EUZP.js +0 -44
- package/dist/chunk-5FF5EUZP.js.map +0 -1
- package/dist/chunk-5UGQXB2P.js +0 -714
- package/dist/chunk-5UGQXB2P.js.map +0 -1
- package/dist/chunk-62FT22CI.js +0 -85
- package/dist/chunk-62FT22CI.js.map +0 -1
- package/dist/chunk-673R3GSK.js +0 -19
- package/dist/chunk-673R3GSK.js.map +0 -1
- package/dist/chunk-6VINZJBV.js +0 -128
- package/dist/chunk-6VINZJBV.js.map +0 -1
- package/dist/chunk-6ZQKEY54.js +0 -149
- package/dist/chunk-6ZQKEY54.js.map +0 -1
- package/dist/chunk-74NZ5U3E.js +0 -145
- package/dist/chunk-74NZ5U3E.js.map +0 -1
- package/dist/chunk-755NWSNW.js +0 -36
- package/dist/chunk-755NWSNW.js.map +0 -1
- package/dist/chunk-7GLBWWMW.js +0 -70
- package/dist/chunk-7GLBWWMW.js.map +0 -1
- package/dist/chunk-7RXYW5VM.js +0 -88
- package/dist/chunk-7RXYW5VM.js.map +0 -1
- package/dist/chunk-AC4MGCXI.js +0 -92
- package/dist/chunk-AC4MGCXI.js.map +0 -1
- package/dist/chunk-AEVSVDT6.js +0 -67
- package/dist/chunk-AEVSVDT6.js.map +0 -1
- package/dist/chunk-AODIMN2N.js +0 -68
- package/dist/chunk-AODIMN2N.js.map +0 -1
- package/dist/chunk-ATHOPBCA.js +0 -61
- package/dist/chunk-ATHOPBCA.js.map +0 -1
- package/dist/chunk-AVPHVQZS.js +0 -73
- package/dist/chunk-AVPHVQZS.js.map +0 -1
- package/dist/chunk-AXKBNRZW.js +0 -173
- package/dist/chunk-AXKBNRZW.js.map +0 -1
- package/dist/chunk-B75MEYNR.js +0 -106
- package/dist/chunk-B75MEYNR.js.map +0 -1
- package/dist/chunk-BGKA6DI6.js +0 -34
- package/dist/chunk-BGKA6DI6.js.map +0 -1
- package/dist/chunk-BNQAJGEN.js +0 -88
- package/dist/chunk-BNQAJGEN.js.map +0 -1
- package/dist/chunk-BP2SETUC.js +0 -101
- package/dist/chunk-BP2SETUC.js.map +0 -1
- package/dist/chunk-BPUQWMBD.js +0 -79
- package/dist/chunk-BPUQWMBD.js.map +0 -1
- package/dist/chunk-BVDASR3Y.js +0 -74
- package/dist/chunk-BVDASR3Y.js.map +0 -1
- package/dist/chunk-BX7A5GUV.js +0 -78
- package/dist/chunk-BX7A5GUV.js.map +0 -1
- package/dist/chunk-CDA6RYOX.js +0 -115
- package/dist/chunk-CDA6RYOX.js.map +0 -1
- package/dist/chunk-CG7O3A42.js +0 -80
- package/dist/chunk-CG7O3A42.js.map +0 -1
- package/dist/chunk-CIYGNPKT.js +0 -76
- package/dist/chunk-CIYGNPKT.js.map +0 -1
- package/dist/chunk-CKXY4FTV.js +0 -59
- package/dist/chunk-CKXY4FTV.js.map +0 -1
- package/dist/chunk-CVOKZITR.js +0 -82
- package/dist/chunk-CVOKZITR.js.map +0 -1
- package/dist/chunk-CWFMFKDI.js +0 -82
- package/dist/chunk-CWFMFKDI.js.map +0 -1
- package/dist/chunk-CWVKSV7S.js +0 -124
- package/dist/chunk-CWVKSV7S.js.map +0 -1
- package/dist/chunk-CYOLRWOX.js +0 -63
- package/dist/chunk-CYOLRWOX.js.map +0 -1
- package/dist/chunk-D23LRJT6.js +0 -116
- package/dist/chunk-D23LRJT6.js.map +0 -1
- package/dist/chunk-DFADMEJK.js +0 -127
- package/dist/chunk-DFADMEJK.js.map +0 -1
- package/dist/chunk-DKQAHZG2.js +0 -83
- package/dist/chunk-DKQAHZG2.js.map +0 -1
- package/dist/chunk-DW247T3Q.js +0 -199
- package/dist/chunk-DW247T3Q.js.map +0 -1
- package/dist/chunk-E5A7HN6H.js +0 -32
- package/dist/chunk-E5A7HN6H.js.map +0 -1
- package/dist/chunk-EI63GTN7.js +0 -57
- package/dist/chunk-EI63GTN7.js.map +0 -1
- package/dist/chunk-EP25QJ4N.js +0 -146
- package/dist/chunk-EP25QJ4N.js.map +0 -1
- package/dist/chunk-ET44426Q.js +0 -80
- package/dist/chunk-ET44426Q.js.map +0 -1
- package/dist/chunk-ETEIDY34.js +0 -67
- package/dist/chunk-ETEIDY34.js.map +0 -1
- package/dist/chunk-EU55O4P7.js +0 -76
- package/dist/chunk-EU55O4P7.js.map +0 -1
- package/dist/chunk-F436537E.js +0 -104
- package/dist/chunk-F436537E.js.map +0 -1
- package/dist/chunk-FLBTGNQI.js +0 -86
- package/dist/chunk-FLBTGNQI.js.map +0 -1
- package/dist/chunk-FUT45NFW.js +0 -46
- package/dist/chunk-FUT45NFW.js.map +0 -1
- package/dist/chunk-G3LWNTVZ.js +0 -51
- package/dist/chunk-G3LWNTVZ.js.map +0 -1
- package/dist/chunk-GBJB5WLT.js +0 -58
- package/dist/chunk-GBJB5WLT.js.map +0 -1
- package/dist/chunk-GIEPEFRX.js +0 -110
- package/dist/chunk-GIEPEFRX.js.map +0 -1
- package/dist/chunk-GSO7MISR.js +0 -58
- package/dist/chunk-GSO7MISR.js.map +0 -1
- package/dist/chunk-GUQFYUIC.js +0 -61
- package/dist/chunk-GUQFYUIC.js.map +0 -1
- package/dist/chunk-GXBFGWQN.js +0 -81
- package/dist/chunk-GXBFGWQN.js.map +0 -1
- package/dist/chunk-H3VJMFJQ.js +0 -35
- package/dist/chunk-H3VJMFJQ.js.map +0 -1
- package/dist/chunk-HG4WEERE.js +0 -26
- package/dist/chunk-HG4WEERE.js.map +0 -1
- package/dist/chunk-HGPBGLNP.js +0 -51
- package/dist/chunk-HGPBGLNP.js.map +0 -1
- package/dist/chunk-HQFTW7SF.js +0 -141
- package/dist/chunk-HQFTW7SF.js.map +0 -1
- package/dist/chunk-I32I36LW.js +0 -113
- package/dist/chunk-I32I36LW.js.map +0 -1
- package/dist/chunk-I7WYM63C.js +0 -170
- package/dist/chunk-I7WYM63C.js.map +0 -1
- package/dist/chunk-JPTPIZ5V.js +0 -120
- package/dist/chunk-JPTPIZ5V.js.map +0 -1
- package/dist/chunk-JQXLPVWP.js +0 -74
- package/dist/chunk-JQXLPVWP.js.map +0 -1
- package/dist/chunk-K5ARID4S.js +0 -26
- package/dist/chunk-K5ARID4S.js.map +0 -1
- package/dist/chunk-K6RTLPIJ.js +0 -41
- package/dist/chunk-K6RTLPIJ.js.map +0 -1
- package/dist/chunk-K7PYLTMP.js +0 -221
- package/dist/chunk-K7PYLTMP.js.map +0 -1
- package/dist/chunk-KQNKKV2C.js +0 -56
- package/dist/chunk-KQNKKV2C.js.map +0 -1
- package/dist/chunk-KRN4NE4U.js +0 -155
- package/dist/chunk-KRN4NE4U.js.map +0 -1
- package/dist/chunk-L2BI762I.js +0 -82
- package/dist/chunk-L2BI762I.js.map +0 -1
- package/dist/chunk-LEEH63B2.js +0 -56
- package/dist/chunk-LEEH63B2.js.map +0 -1
- package/dist/chunk-LHRWVM3G.js +0 -42
- package/dist/chunk-LHRWVM3G.js.map +0 -1
- package/dist/chunk-LIGWMGXM.js +0 -117
- package/dist/chunk-LIGWMGXM.js.map +0 -1
- package/dist/chunk-LKYSX3QF.js +0 -104
- package/dist/chunk-LKYSX3QF.js.map +0 -1
- package/dist/chunk-MCIFB6VS.js +0 -54
- package/dist/chunk-MCIFB6VS.js.map +0 -1
- package/dist/chunk-MI5CXMZU.js +0 -171
- package/dist/chunk-MI5CXMZU.js.map +0 -1
- package/dist/chunk-MYEHGDC2.js +0 -152
- package/dist/chunk-MYEHGDC2.js.map +0 -1
- package/dist/chunk-NQZYY4LR.js +0 -84
- package/dist/chunk-NQZYY4LR.js.map +0 -1
- package/dist/chunk-O23LKHUR.js +0 -66
- package/dist/chunk-O23LKHUR.js.map +0 -1
- package/dist/chunk-PASI2U2R.js +0 -23
- package/dist/chunk-PASI2U2R.js.map +0 -1
- package/dist/chunk-PPH5NTHV.js +0 -34
- package/dist/chunk-PPH5NTHV.js.map +0 -1
- package/dist/chunk-PR6OZF6D.js +0 -28
- package/dist/chunk-PR6OZF6D.js.map +0 -1
- package/dist/chunk-PTHRL242.js +0 -186
- package/dist/chunk-PTHRL242.js.map +0 -1
- package/dist/chunk-PWXOXPFT.js +0 -142
- package/dist/chunk-PWXOXPFT.js.map +0 -1
- package/dist/chunk-QB6BNHO3.js +0 -112
- package/dist/chunk-QB6BNHO3.js.map +0 -1
- package/dist/chunk-QJGGTIUN.js +0 -110
- package/dist/chunk-QJGGTIUN.js.map +0 -1
- package/dist/chunk-QSOIJ6J3.js +0 -91
- package/dist/chunk-QSOIJ6J3.js.map +0 -1
- package/dist/chunk-R63ZKLQM.js +0 -45
- package/dist/chunk-R63ZKLQM.js.map +0 -1
- package/dist/chunk-RC5XME4T.js +0 -33
- package/dist/chunk-RC5XME4T.js.map +0 -1
- package/dist/chunk-RTYYJPPE.js +0 -77
- package/dist/chunk-RTYYJPPE.js.map +0 -1
- package/dist/chunk-RVOBP7PO.js +0 -116
- package/dist/chunk-RVOBP7PO.js.map +0 -1
- package/dist/chunk-SF6R5VMQ.js +0 -97
- package/dist/chunk-SF6R5VMQ.js.map +0 -1
- package/dist/chunk-SP4CP5HY.js +0 -57
- package/dist/chunk-SP4CP5HY.js.map +0 -1
- package/dist/chunk-SWJ4EUOI.js +0 -30
- package/dist/chunk-SWJ4EUOI.js.map +0 -1
- package/dist/chunk-TK24HQJJ.js +0 -128
- package/dist/chunk-TK24HQJJ.js.map +0 -1
- package/dist/chunk-UAYOOTRR.js +0 -77
- package/dist/chunk-UAYOOTRR.js.map +0 -1
- package/dist/chunk-UDTAMHXW.js +0 -55
- package/dist/chunk-UDTAMHXW.js.map +0 -1
- package/dist/chunk-UK27KR35.js +0 -73
- package/dist/chunk-UK27KR35.js.map +0 -1
- package/dist/chunk-UOMQPIB4.js +0 -48
- package/dist/chunk-UOMQPIB4.js.map +0 -1
- package/dist/chunk-UOXU7NDY.js +0 -120
- package/dist/chunk-UOXU7NDY.js.map +0 -1
- package/dist/chunk-V7OOTVK3.js +0 -106
- package/dist/chunk-V7OOTVK3.js.map +0 -1
- package/dist/chunk-VI5M7KJ2.js +0 -1022
- package/dist/chunk-VI5M7KJ2.js.map +0 -1
- package/dist/chunk-VMMATOPE.js +0 -64
- package/dist/chunk-VMMATOPE.js.map +0 -1
- package/dist/chunk-W2PVSIW3.js +0 -89
- package/dist/chunk-W2PVSIW3.js.map +0 -1
- package/dist/chunk-W3DUDZDU.js +0 -88
- package/dist/chunk-W3DUDZDU.js.map +0 -1
- package/dist/chunk-WKEUU2FU.js +0 -114
- package/dist/chunk-WKEUU2FU.js.map +0 -1
- package/dist/chunk-WKLW7RC6.js +0 -28
- package/dist/chunk-WKLW7RC6.js.map +0 -1
- package/dist/chunk-WSJGZNUH.js +0 -111
- package/dist/chunk-WSJGZNUH.js.map +0 -1
- package/dist/chunk-WVPDQMC2.js +0 -144
- package/dist/chunk-WVPDQMC2.js.map +0 -1
- package/dist/chunk-WWNH5ENT.js +0 -43
- package/dist/chunk-WWNH5ENT.js.map +0 -1
- package/dist/chunk-X5L62PXY.js +0 -112
- package/dist/chunk-X5L62PXY.js.map +0 -1
- package/dist/chunk-XGCV5E6W.js +0 -133
- package/dist/chunk-XGCV5E6W.js.map +0 -1
- package/dist/chunk-XRKIEL5M.js +0 -72
- package/dist/chunk-XRKIEL5M.js.map +0 -1
- package/dist/chunk-XUJYEADU.js +0 -80
- package/dist/chunk-XUJYEADU.js.map +0 -1
- package/dist/chunk-XVYNSIQC.js +0 -116
- package/dist/chunk-XVYNSIQC.js.map +0 -1
- package/dist/chunk-XWTISHXO.js +0 -54
- package/dist/chunk-XWTISHXO.js.map +0 -1
- package/dist/chunk-XZKEGEPT.js +0 -156
- package/dist/chunk-XZKEGEPT.js.map +0 -1
- package/dist/chunk-YOGHS4UU.js +0 -202
- package/dist/chunk-YOGHS4UU.js.map +0 -1
- package/dist/chunk-YRSKXEOD.js +0 -135
- package/dist/chunk-YRSKXEOD.js.map +0 -1
- package/dist/chunk-ZALLCR7X.js +0 -108
- package/dist/chunk-ZALLCR7X.js.map +0 -1
- package/dist/chunk-ZDAOHMCW.js +0 -46
- package/dist/chunk-ZDAOHMCW.js.map +0 -1
- package/dist/chunk-ZESICCKK.js +0 -37
- package/dist/chunk-ZESICCKK.js.map +0 -1
- package/dist/chunk-ZIKFOD6N.js +0 -87
- package/dist/chunk-ZIKFOD6N.js.map +0 -1
- package/dist/chunk-ZJRWCQEN.js +0 -76
- package/dist/chunk-ZJRWCQEN.js.map +0 -1
- package/dist/chunk-ZSRJCIWF.js +0 -24
- package/dist/chunk-ZSRJCIWF.js.map +0 -1
- package/dist/plugin-Atb0VKtr.d.ts +0 -172
- package/dist/slide/index.d.ts +0 -212
- package/dist/slide/plugins/emoji/index.d.ts +0 -29
- package/dist/slide/plugins/math/index.d.ts +0 -13
- package/dist/slide/plugins/mermaid/index.d.ts +0 -55
- package/dist/slide/plugins/shiki/index.d.ts +0 -18
- package/dist/slide-deck/index.d.ts +0 -377
- package/dist/whiteboard/index.d.ts +0 -258
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
+
"name": "agent-tool-renderer",
|
|
4
|
+
"type": "registry:ui",
|
|
5
|
+
"title": "AgentToolRenderer",
|
|
6
|
+
"description": "Overridable tool-renderer registry for agent chat surfaces — dispatches a UIMessage tool part to a rich renderer (diff, terminal, code, created-files, data-table) by classification kind, falling back to the generic ToolCallPart for anything unmapped.",
|
|
7
|
+
"dependencies": [
|
|
8
|
+
"lucide-react"
|
|
9
|
+
],
|
|
10
|
+
"registryDependencies": [
|
|
11
|
+
"https://usetheodev.github.io/theo-ui/r/chat-types.json",
|
|
12
|
+
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
13
|
+
"https://usetheodev.github.io/theo-ui/r/code-block.json",
|
|
14
|
+
"https://usetheodev.github.io/theo-ui/r/data-table.json",
|
|
15
|
+
"https://usetheodev.github.io/theo-ui/r/created-files-card.json",
|
|
16
|
+
"https://usetheodev.github.io/theo-ui/r/diff-viewer.json",
|
|
17
|
+
"https://usetheodev.github.io/theo-ui/r/terminal-panel.json",
|
|
18
|
+
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
|
|
19
|
+
],
|
|
20
|
+
"files": [
|
|
21
|
+
{
|
|
22
|
+
"path": "components/composites/agent-tool-renderer/agent-tool-renderer.tsx",
|
|
23
|
+
"type": "registry:ui",
|
|
24
|
+
"target": "components/ui/agent-tool-renderer/agent-tool-renderer.tsx",
|
|
25
|
+
"content": "/**\n * `<AgentToolRenderer>` + the tool-renderer **registry** (M5-3).\n *\n * Dispatches a `ToolUIPart` to a rich renderer by classification kind\n * (`diff` / `terminal` / `code` / `created-files` / `data-table`), falling back\n * to `<ToolCallPart>` for anything unmapped. Mirrors the existing\n * `partRenderers` / `dataRenderers` override registries on `<ChatMessage>` — the\n * registry is prop-threaded, no React context (ADR D2).\n *\n * The default renderers are **defensive best-effort** (ADR D3): `code` and\n * `terminal` are generic over any string output; `diff` / `created-files` /\n * `data-table` render their rich primitive only when the output already matches\n * the structured shape, else they degrade to `<ToolCallPart>` (never throw on\n * `unknown`). Faithful sdk-tools `ToolUIPart`→props adapters are the M5-4 slice\n * (`@theokit/ui/sdk-tools-adapters`).\n */\nimport type { JSX, ReactNode } from \"react\";\nimport type { ToolUIPart } from \"@/types/chat\";\nimport { CreatedFilesCard } from \"@/components/ui/created-files-card\";\nimport { type DiffHunk, DiffViewer } from \"@/components/ui/diff-viewer\";\nimport { type TerminalLine, TerminalPanel } from \"@/components/ui/terminal-panel\";\nimport { CodeBlock } from \"@/components/ui/code-block\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { ToolCallPart } from \"@/components/ui/agent-tool-renderer/tool-call-part\";\n\n/** The rich surfaces a tool invocation can be dispatched to. */\nexport type ToolRendererKind = \"diff\" | \"terminal\" | \"code\" | \"created-files\" | \"data-table\";\n\n/** A renderer for one tool invocation. Returns `ReactNode` (never throws). */\nexport type ToolRenderer = (part: ToolUIPart) => ReactNode;\n\n/** Registry of renderers keyed by classification kind. */\nexport type ToolRendererRegistry = Record<ToolRendererKind, ToolRenderer>;\n\n/** Maps a tool part to a kind, or `undefined` to fall back to `<ToolCallPart>`. */\nexport type ClassifyTool = (part: ToolUIPart) => ToolRendererKind | undefined;\n\n/* ─── classify ───────────────────────────────────────────────────────── */\n\nfunction deriveToolName(part: ToolUIPart): string {\n if (part.toolName) return part.toolName;\n if (part.type === \"dynamic-tool\") return \"dynamic-tool\";\n return part.type.slice(\"tool-\".length);\n}\n\n// Substring heuristics over the tool name. Ordered: most specific first.\nconst KIND_HINTS: ReadonlyArray<[ToolRendererKind, readonly string[]]> = [\n [\"diff\", [\"diff\", \"patch\"]],\n [\"created-files\", [\"edit_file\", \"write_file\", \"create_file\", \"created_file\"]],\n [\"terminal\", [\"shell\", \"bash\", \"exec\", \"run_\", \"command\", \"vitest\", \"pytest\"]],\n [\"data-table\", [\"list_dir\", \"glob\", \"list_\", \"search\", \"grep\", \"find\"]],\n [\"code\", [\"read_file\", \"cat_file\", \"code\", \"read\"]],\n];\n\n/**\n * Default classifier — a name-substring heuristic. Only affects the default;\n * fully overridable per call (ADR D1/D2). Never throws; unmapped → `undefined`.\n */\nexport function defaultClassifyTool(part: ToolUIPart): ToolRendererKind | undefined {\n const name = deriveToolName(part).toLowerCase();\n for (const [kind, hints] of KIND_HINTS) {\n if (hints.some((h) => name.includes(h))) return kind;\n }\n return undefined;\n}\n\n/**\n * Resolve the renderer for a part: `classify` → registry lookup. Returns\n * `undefined` when the tool is unmapped (the `<ToolCallPart>` fallback signal).\n */\nexport function resolveToolRenderer(\n registry: ToolRendererRegistry,\n classify: ClassifyTool,\n part: ToolUIPart,\n): ToolRenderer | undefined {\n const kind = classify(part);\n return kind ? registry[kind] : undefined;\n}\n\n/* ─── shape helpers (defensive) ──────────────────────────────────────── */\n\nfunction stringify(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStructuredDiff(\n o: unknown,\n): o is { path: string; stats?: { added: number; removed: number }; hunks: DiffHunk[] } {\n return isRecord(o) && typeof o.path === \"string\" && Array.isArray(o.hunks);\n}\n\nfunction isStructuredFiles(\n o: unknown,\n): o is { title?: ReactNode; files: Array<{ id: string; name: string }> } {\n return (\n isRecord(o) &&\n Array.isArray(o.files) &&\n o.files.every((f) => isRecord(f) && typeof f.id === \"string\" && typeof f.name === \"string\")\n );\n}\n\nfunction isObjectRows(o: unknown): o is Array<Record<string, unknown>> {\n return Array.isArray(o) && o.length > 0 && o.every(isRecord);\n}\n\nfunction toTerminalLines(output: unknown): TerminalLine[] {\n return stringify(output)\n .split(/\\r?\\n/)\n .map((content, i) => ({ id: `line-${i}`, kind: \"stdout\" as const, content }));\n}\n\nfunction renderDataTable(rows: Array<Record<string, unknown>>): JSX.Element {\n const columns = Object.keys(rows[0] ?? {}).map((key) => ({\n key,\n label: key,\n render: (row: Record<string, unknown>) => stringify(row[key]),\n }));\n return <DataTable data={rows} columns={columns} rowKey={(row) => stringify(row)} />;\n}\n\n/* ─── default registry ───────────────────────────────────────────────── */\n\nexport const defaultToolRegistry: ToolRendererRegistry = {\n code: (part) => <CodeBlock code={stringify(part.output)} copyable />,\n terminal: (part) => <TerminalPanel lines={toTerminalLines(part.output)} />,\n diff: (part) =>\n isStructuredDiff(part.output) ? (\n <DiffViewer path={part.output.path} stats={part.output.stats} hunks={part.output.hunks} />\n ) : (\n <ToolCallPart part={part} />\n ),\n \"created-files\": (part) =>\n isStructuredFiles(part.output) ? (\n <CreatedFilesCard files={part.output.files} title={part.output.title} />\n ) : (\n <ToolCallPart part={part} />\n ),\n \"data-table\": (part) =>\n isObjectRows(part.output) ? renderDataTable(part.output) : <ToolCallPart part={part} />,\n};\n\n/* ─── component ──────────────────────────────────────────────────────── */\n\nexport interface AgentToolRendererProps {\n part: ToolUIPart;\n /** Override the default registry (shallow-merge over `defaultToolRegistry`). */\n toolRenderers?: ToolRendererRegistry;\n /** Override the default classifier. */\n classifyTool?: ClassifyTool;\n}\n\n/**\n * Render one `ToolUIPart` through the registry, falling back to `<ToolCallPart>`\n * when the tool is unmapped. Reusable outside `<ChatMessage>`.\n *\n * Rich renderers apply ONLY to the `output-available` state — they render\n * `part.output`. Every other state (`input-streaming` / `input-available` /\n * `approval-*` / `output-error` / `output-denied`) carries no output (and, for\n * errors, only `errorText`), so it routes to `<ToolCallPart>`, which renders the\n * state badge, the input, and the error. This prevents a classified-but-errored\n * tool (e.g. a `shell` that failed) from rendering an empty rich surface and\n * dropping the error message.\n */\nexport function AgentToolRenderer({\n part,\n toolRenderers = defaultToolRegistry,\n classifyTool = defaultClassifyTool,\n}: AgentToolRendererProps): JSX.Element {\n const renderer =\n part.state === \"output-available\"\n ? resolveToolRenderer(toolRenderers, classifyTool, part)\n : undefined;\n // `display: contents` wrapper — carries the data-slot (shadcn v4 convention)\n // without introducing a layout box around the resolved renderer.\n return (\n <div data-slot=\"agent-tool-renderer\" className=\"contents\">\n {renderer ? renderer(part) : <ToolCallPart part={part} />}\n </div>\n );\n}\n\nAgentToolRenderer.displayName = \"AgentToolRenderer\";\n"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"path": "components/composites/agent-tool-renderer/tool-call-part.tsx",
|
|
29
|
+
"type": "registry:ui",
|
|
30
|
+
"target": "components/ui/agent-tool-renderer/tool-call-part.tsx",
|
|
31
|
+
"content": "/**\n * `<ToolCallPart>` — renders a `ToolUIPart` (static `tool-${name}` or\n * `dynamic-tool`) as an inline card with the tool name, the input args, the\n * resolved output / error, and the current invocation state.\n *\n * Uses our `<Card>` primitive (composite-layer dep is allowed).\n */\nimport { AlertCircleIcon, CheckCircleIcon, LoaderIcon, ShieldIcon, WrenchIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { ToolUIPart } from \"@/types/chat\";\n\nexport interface ToolCallPartProps {\n part: ToolUIPart;\n}\n\nfunction deriveToolName(part: ToolUIPart): string {\n if (part.toolName) return part.toolName;\n if (part.type === \"dynamic-tool\") return \"dynamic-tool\";\n // type is `tool-${name}` — strip the prefix\n return part.type.slice(\"tool-\".length);\n}\n\nfunction stateBadge(state: ToolUIPart[\"state\"]): { icon: ReactNode; label: string; tone: string } {\n switch (state) {\n case \"input-streaming\":\n return {\n icon: <LoaderIcon className=\"size-3.5 animate-spin\" aria-hidden=\"true\" />,\n label: \"Streaming input\",\n tone: \"text-muted-foreground\",\n };\n case \"input-available\":\n return {\n icon: <WrenchIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Ready to call\",\n tone: \"text-primary\",\n };\n case \"approval-requested\":\n return {\n icon: <ShieldIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Awaiting approval\",\n tone: \"text-warning\",\n };\n case \"approval-responded\":\n return {\n icon: <ShieldIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Approval responded\",\n tone: \"text-primary\",\n };\n case \"output-available\":\n return {\n icon: <CheckCircleIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Completed\",\n tone: \"text-success\",\n };\n case \"output-error\":\n return {\n icon: <AlertCircleIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Error\",\n tone: \"text-destructive\",\n };\n case \"output-denied\":\n return {\n icon: <ShieldIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Denied\",\n tone: \"text-destructive\",\n };\n default:\n return {\n icon: <WrenchIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Unknown\",\n tone: \"text-muted-foreground\",\n };\n }\n}\n\nfunction safeStringify(value: unknown): string {\n if (value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function ToolCallPart({ part }: ToolCallPartProps): JSX.Element {\n const toolName = deriveToolName(part);\n const badge = stateBadge(part.state);\n const inputStr = safeStringify(part.input);\n const outputStr =\n part.state === \"output-available\" ? safeStringify(part.output) : (part.errorText ?? \"\");\n\n return (\n <div\n data-slot=\"tool-call-part\"\n className={cn(\"my-3 overflow-hidden rounded-lg border border-border bg-card\", \"shadow-sm\")}\n data-theo-tool-call={part.state}\n >\n <header className=\"flex items-center justify-between gap-3 border-border border-b bg-muted/30 px-3 py-1.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <WrenchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"truncate font-mono text-foreground text-label\">{toolName}</span>\n </div>\n <span\n className={cn(\n \"inline-flex items-center gap-1 text-label-caps uppercase tracking-wider\",\n badge.tone,\n )}\n >\n {badge.icon}\n <span>{badge.label}</span>\n </span>\n </header>\n\n {inputStr ? (\n <details className=\"border-border border-b\" open={part.state === \"input-streaming\"}>\n <summary className=\"cursor-pointer px-3 py-1.5 font-mono text-label-caps text-muted-foreground uppercase tracking-wider hover:text-foreground\">\n Input\n </summary>\n <pre className=\"overflow-x-auto bg-muted/20 px-3 py-2 text-code-sm\">\n <code>{inputStr}</code>\n </pre>\n </details>\n ) : null}\n\n {outputStr ? (\n <details open={part.state === \"output-error\" || part.state === \"output-available\"}>\n <summary\n className={cn(\n \"cursor-pointer px-3 py-1.5 font-mono text-label-caps uppercase tracking-wider hover:text-foreground\",\n part.state === \"output-error\" ? \"text-destructive\" : \"text-muted-foreground\",\n )}\n >\n {part.state === \"output-error\" ? \"Error\" : \"Output\"}\n </summary>\n <pre\n className={cn(\n \"overflow-x-auto px-3 py-2 text-code-sm\",\n part.state === \"output-error\" ? \"bg-destructive/5\" : \"bg-muted/20\",\n )}\n >\n <code>{outputStr}</code>\n </pre>\n </details>\n ) : null}\n </div>\n );\n}\n"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"path": "components/composites/agent-tool-renderer/index.ts",
|
|
35
|
+
"type": "registry:ui",
|
|
36
|
+
"target": "components/ui/agent-tool-renderer/index.ts",
|
|
37
|
+
"content": "export {\n AgentToolRenderer,\n type AgentToolRendererProps,\n type ClassifyTool,\n defaultClassifyTool,\n defaultToolRegistry,\n resolveToolRenderer,\n type ToolRenderer,\n type ToolRendererKind,\n type ToolRendererRegistry,\n} from \"@/components/ui/agent-tool-renderer/agent-tool-renderer\";\n"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
package/registry/r/alert.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"path": "components/primitives/alert/alert.tsx",
|
|
17
17
|
"type": "registry:ui",
|
|
18
18
|
"target": "components/ui/alert.tsx",
|
|
19
|
-
"content": "import { AlertCircle, CheckCircle2, Info, TriangleAlert, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ElementType, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Alert — persistent inline notice. Distinct from `Toast` (transient,\n * corner-positioned, multiple stackable) and `EmptyState` (centered card\n * for no-data affordances). Full-width-of-section banner that stays\n * visible until the user acts.\n *\n * `intent` drives icon + color tokens. `destructive` intent renders\n * `role=\"alert\"` for assertive screen-reader announcement; the other\n * three intents render `role=\"status\"` (polite). `onDismiss`, when\n * provided, renders a trailing `X` button. `action` slot accepts any\n * ReactNode (typically a `<Button>` or anchor).\n *\n * @example\n * <Alert\n * intent=\"warning\"\n * title=\"Verify your email\"\n * description=\"We sent a link to your email.\"\n * action={<Button size=\"sm\" onClick={resend}>Resend</Button>}\n * />\n */\nexport type AlertIntent = \"info\" | \"success\" | \"warning\" | \"destructive\";\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\" | \"role\"> {\n intent?: AlertIntent;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n onDismiss?: () => void;\n}\n\nconst INTENT: Record<\n AlertIntent,\n { icon: ElementType; border: string; bg: string; iconColor: string }\n> = {\n info: {\n icon: Info,\n border: \"border-primary/30\",\n bg: \"bg-primary/[0.04]\",\n iconColor: \"text-primary\",\n },\n success: {\n icon: CheckCircle2,\n border: \"border-success/30\",\n bg: \"bg-success/[0.04]\",\n iconColor: \"text-success\",\n },\n warning: {\n icon: TriangleAlert,\n border: \"border-warning/30\",\n bg: \"bg-warning/[0.04]\",\n iconColor: \"text-warning\",\n },\n destructive: {\n icon: AlertCircle,\n border: \"border-destructive/30\",\n bg: \"bg-destructive/[0.04]\",\n iconColor: \"text-destructive\",\n },\n};\n\nconst Alert = forwardRef<HTMLDivElement, AlertProps>(\n ({ className, intent = \"info\", title, description, action, onDismiss, ...props }, ref) => {\n const config = INTENT[intent];\n const Icon = config.icon;\n const hasTitle = title !== undefined && title !== null;\n const hasDescription = description !== undefined && description !== null;\n const role = intent === \"destructive\" ? \"alert\" : \"status\";\n\n return (\n <div\n ref={ref}\n role={role}\n className={cn(\n \"rounded-lg border\",\n config.border,\n config.bg,\n hasTitle && hasDescription ? \"p-4\" : \"p-3\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\">\n <Icon aria-hidden=\"true\" className={cn(\"mt-0.5 size-4 shrink-0\", config.iconColor)} />\n <div className=\"min-w-0 flex-1\">\n {hasTitle ? (\n <div className=\"font-medium font-sans text-body-sm text-foreground\">{title}</div>\n ) : null}\n {hasDescription ? (\n <div\n className={cn(\"font-sans text-body-sm text-muted-foreground\", hasTitle && \"mt-0.5\")}\n >\n {description}\n </div>\n ) : null}\n </div>\n {action !== undefined ? <div className=\"ml-auto shrink-0\">{action}</div> : null}\n {onDismiss !== undefined ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className={cn(\n \"shrink-0 rounded p-0.5 text-muted-foreground transition-colors\",\n \"hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n ) : null}\n </div>\n </div>\n );\n },\n);\nAlert.displayName = \"Alert\";\n\nexport { Alert };\n"
|
|
19
|
+
"content": "import { AlertCircle, CheckCircle2, Info, TriangleAlert, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ElementType, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Alert — persistent inline notice. Distinct from `Toast` (transient,\n * corner-positioned, multiple stackable) and `EmptyState` (centered card\n * for no-data affordances). Full-width-of-section banner that stays\n * visible until the user acts.\n *\n * `intent` drives icon + color tokens. `destructive` intent renders\n * `role=\"alert\"` for assertive screen-reader announcement; the other\n * three intents render `role=\"status\"` (polite). `onDismiss`, when\n * provided, renders a trailing `X` button. `action` slot accepts any\n * ReactNode (typically a `<Button>` or anchor).\n *\n * @example\n * <Alert\n * intent=\"warning\"\n * title=\"Verify your email\"\n * description=\"We sent a link to your email.\"\n * action={<Button size=\"sm\" onClick={resend}>Resend</Button>}\n * />\n */\nexport type AlertIntent = \"info\" | \"success\" | \"warning\" | \"destructive\";\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\" | \"role\"> {\n intent?: AlertIntent;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n onDismiss?: () => void;\n}\n\nconst INTENT: Record<\n AlertIntent,\n { icon: ElementType; border: string; bg: string; iconColor: string }\n> = {\n info: {\n icon: Info,\n border: \"border-primary/30\",\n bg: \"bg-primary/[0.04]\",\n iconColor: \"text-primary\",\n },\n success: {\n icon: CheckCircle2,\n border: \"border-success/30\",\n bg: \"bg-success/[0.04]\",\n iconColor: \"text-success\",\n },\n warning: {\n icon: TriangleAlert,\n border: \"border-warning/30\",\n bg: \"bg-warning/[0.04]\",\n iconColor: \"text-warning\",\n },\n destructive: {\n icon: AlertCircle,\n border: \"border-destructive/30\",\n bg: \"bg-destructive/[0.04]\",\n iconColor: \"text-destructive\",\n },\n};\n\nconst Alert = forwardRef<HTMLDivElement, AlertProps>(\n ({ className, intent = \"info\", title, description, action, onDismiss, ...props }, ref) => {\n const config = INTENT[intent];\n const Icon = config.icon;\n const hasTitle = title !== undefined && title !== null;\n const hasDescription = description !== undefined && description !== null;\n const role = intent === \"destructive\" ? \"alert\" : \"status\";\n\n return (\n <div\n data-slot=\"alert\"\n ref={ref}\n role={role}\n className={cn(\n \"rounded-lg border\",\n config.border,\n config.bg,\n hasTitle && hasDescription ? \"p-4\" : \"p-3\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\">\n <Icon aria-hidden=\"true\" className={cn(\"mt-0.5 size-4 shrink-0\", config.iconColor)} />\n <div className=\"min-w-0 flex-1\">\n {hasTitle ? (\n <div className=\"font-medium font-sans text-body-sm text-foreground\">{title}</div>\n ) : null}\n {hasDescription ? (\n <div\n className={cn(\"font-sans text-body-sm text-muted-foreground\", hasTitle && \"mt-0.5\")}\n >\n {description}\n </div>\n ) : null}\n </div>\n {action !== undefined ? <div className=\"ml-auto shrink-0\">{action}</div> : null}\n {onDismiss !== undefined ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className={cn(\n \"shrink-0 rounded p-0.5 text-muted-foreground transition-colors\",\n \"hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n ) : null}\n </div>\n </div>\n );\n },\n);\nAlert.displayName = \"Alert\";\n\nexport { Alert };\n"
|
|
20
20
|
}
|
|
21
21
|
]
|
|
22
22
|
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"path": "components/composites/approval-card/approval-card.tsx",
|
|
20
20
|
"type": "registry:block",
|
|
21
21
|
"target": "components/blocks/approval-card.tsx",
|
|
22
|
-
"content": "import { type VariantProps, cva } from \"class-variance-authority\";\nimport { AlertTriangle, Lock, ShieldCheck } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\nimport { Button } from \"@/components/ui/button\";\n\n/**\n * ApprovalCard — inline pause-and-ask card for an agent stream.\n *\n * Used when the agent wants to perform an action that requires the user's\n * consent (run a destructive command, use a new tool, edit outside the\n * sandbox, etc.). Renders as a bordered card inside the conversation stream,\n * pauses the visual flow, and exposes Deny / Approve / Always-allow actions.\n */\n\nconst cardVariants = cva(\n \"grid w-full gap-3 rounded-xl border p-4 transition-colors duration-base ease-out-soft\",\n {\n variants: {\n severity: {\n info: \"border-info/40 bg-info/5\",\n warning: \"border-warning/40 bg-warning/5\",\n destructive: \"border-destructive/40 bg-destructive/5\",\n },\n },\n defaultVariants: { severity: \"warning\" },\n },\n);\n\nconst ICON_FOR_SEVERITY: Record<NonNullable<ApprovalSeverity>, IconComponent> = {\n info: ShieldCheck,\n warning: AlertTriangle,\n destructive: Lock,\n};\n\nconst ICON_TONE: Record<NonNullable<ApprovalSeverity>, string> = {\n info: \"text-info\",\n warning: \"text-warning\",\n destructive: \"text-destructive\",\n};\n\ntype ApprovalSeverity = NonNullable<VariantProps<typeof cardVariants>[\"severity\"]>;\n\ninterface ApprovalCardProps\n extends Omit<HTMLAttributes<HTMLElement>, \"title\">,\n VariantProps<typeof cardVariants> {\n /** Short headline (\"Run destructive command?\"). */\n title: ReactNode;\n /** What is being requested (command, file path, tool name…). Renders monospace. */\n request: ReactNode;\n /** Optional explanation line under the request. */\n description?: ReactNode;\n /** Optional expandable details (e.g. full command, file diff). */\n details?: ReactNode;\n /** Pressing the primary \"Approve\" button. */\n onApprove?: () => void;\n /** Pressing \"Deny\". */\n onDeny?: () => void;\n /** Pressing \"Always allow\" — optional tertiary action. */\n onAlways?: () => void;\n /** Customise the icon shown in the corner. */\n icon?: IconComponent;\n}\n\nconst ApprovalCard = forwardRef<HTMLElement, ApprovalCardProps>(\n (\n {\n className,\n severity = \"warning\",\n title,\n request,\n description,\n details,\n onApprove,\n onDeny,\n onAlways,\n icon,\n ...props\n },\n ref,\n ) => {\n const resolvedSeverity: ApprovalSeverity = severity ?? \"warning\";\n const Icon = icon ?? ICON_FOR_SEVERITY[resolvedSeverity];\n return (\n <section\n ref={ref}\n role=\"alertdialog\"\n aria-label={typeof title === \"string\" ? title : \"Approval required\"}\n className={cn(cardVariants({ severity: resolvedSeverity }), className)}\n {...props}\n >\n <header className=\"flex items-start gap-3\">\n <span\n className={cn(\"mt-0.5 inline-flex shrink-0\", ICON_TONE[resolvedSeverity])}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-4\" />\n </span>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n <h4 className=\"font-display text-foreground text-title-md tracking-tight\">{title}</h4>\n <code className=\"overflow-hidden break-words font-mono text-code-md text-muted-foreground\">\n {request}\n </code>\n {description ? (\n <p className=\"text-body-sm text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n </header>\n {details ? (\n <details className=\"rounded-md border border-border/40 bg-background/40 px-3 py-2 text-body-sm\">\n <summary className=\"cursor-pointer select-none font-mono text-label text-muted-foreground\">\n Show details\n </summary>\n <div className=\"mt-2 break-words\">{details}</div>\n </details>\n ) : null}\n <footer className=\"flex flex-wrap items-center justify-end gap-2\">\n {onAlways ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={onAlways}>\n Always allow\n </Button>\n ) : null}\n {onDeny ? (\n <Button size=\"sm\" variant=\"secondary\" onClick={onDeny}>\n Deny\n </Button>\n ) : null}\n {onApprove ? (\n <Button\n size=\"sm\"\n variant={resolvedSeverity === \"destructive\" ? \"destructive\" : \"primary\"}\n onClick={onApprove}\n >\n Approve\n </Button>\n ) : null}\n </footer>\n </section>\n );\n },\n);\nApprovalCard.displayName = \"ApprovalCard\";\n\nexport { ApprovalCard, type ApprovalSeverity };\n"
|
|
22
|
+
"content": "import { type VariantProps, cva } from \"class-variance-authority\";\nimport { AlertTriangle, Lock, ShieldCheck } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\nimport { Button } from \"@/components/ui/button\";\n\n/**\n * ApprovalCard — inline pause-and-ask card for an agent stream.\n *\n * Used when the agent wants to perform an action that requires the user's\n * consent (run a destructive command, use a new tool, edit outside the\n * sandbox, etc.). Renders as a bordered card inside the conversation stream,\n * pauses the visual flow, and exposes Deny / Approve / Always-allow actions.\n */\n\nconst cardVariants = cva(\n \"grid w-full gap-3 rounded-xl border p-4 transition-colors duration-base ease-out-soft\",\n {\n variants: {\n severity: {\n info: \"border-info/40 bg-info/5\",\n warning: \"border-warning/40 bg-warning/5\",\n destructive: \"border-destructive/40 bg-destructive/5\",\n },\n },\n defaultVariants: { severity: \"warning\" },\n },\n);\n\nconst ICON_FOR_SEVERITY: Record<NonNullable<ApprovalSeverity>, IconComponent> = {\n info: ShieldCheck,\n warning: AlertTriangle,\n destructive: Lock,\n};\n\nconst ICON_TONE: Record<NonNullable<ApprovalSeverity>, string> = {\n info: \"text-info\",\n warning: \"text-warning\",\n destructive: \"text-destructive\",\n};\n\ntype ApprovalSeverity = NonNullable<VariantProps<typeof cardVariants>[\"severity\"]>;\n\ninterface ApprovalCardProps\n extends Omit<HTMLAttributes<HTMLElement>, \"title\">,\n VariantProps<typeof cardVariants> {\n /** Short headline (\"Run destructive command?\"). */\n title: ReactNode;\n /** What is being requested (command, file path, tool name…). Renders monospace. */\n request: ReactNode;\n /** Optional explanation line under the request. */\n description?: ReactNode;\n /** Optional expandable details (e.g. full command, file diff). */\n details?: ReactNode;\n /** Pressing the primary \"Approve\" button. */\n onApprove?: () => void;\n /** Pressing \"Deny\". */\n onDeny?: () => void;\n /** Pressing \"Always allow\" — optional tertiary action. */\n onAlways?: () => void;\n /** Customise the icon shown in the corner. */\n icon?: IconComponent;\n}\n\nconst ApprovalCard = forwardRef<HTMLElement, ApprovalCardProps>(\n (\n {\n className,\n severity = \"warning\",\n title,\n request,\n description,\n details,\n onApprove,\n onDeny,\n onAlways,\n icon,\n ...props\n },\n ref,\n ) => {\n const resolvedSeverity: ApprovalSeverity = severity ?? \"warning\";\n const Icon = icon ?? ICON_FOR_SEVERITY[resolvedSeverity];\n return (\n <section\n data-slot=\"approval-card\"\n ref={ref}\n role=\"alertdialog\"\n aria-label={typeof title === \"string\" ? title : \"Approval required\"}\n className={cn(cardVariants({ severity: resolvedSeverity }), className)}\n {...props}\n >\n <header className=\"flex items-start gap-3\">\n <span\n className={cn(\"mt-0.5 inline-flex shrink-0\", ICON_TONE[resolvedSeverity])}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-4\" />\n </span>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n <h4 className=\"font-display text-foreground text-title-md tracking-tight\">{title}</h4>\n <code className=\"overflow-hidden break-words font-mono text-code-md text-muted-foreground\">\n {request}\n </code>\n {description ? (\n <p className=\"text-body-sm text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n </header>\n {details ? (\n <details className=\"rounded-md border border-border/40 bg-background/40 px-3 py-2 text-body-sm\">\n <summary className=\"cursor-pointer select-none font-mono text-label text-muted-foreground\">\n Show details\n </summary>\n <div className=\"mt-2 break-words\">{details}</div>\n </details>\n ) : null}\n <footer className=\"flex flex-wrap items-center justify-end gap-2\">\n {onAlways ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={onAlways}>\n Always allow\n </Button>\n ) : null}\n {onDeny ? (\n <Button size=\"sm\" variant=\"secondary\" onClick={onDeny}>\n Deny\n </Button>\n ) : null}\n {onApprove ? (\n <Button\n size=\"sm\"\n variant={resolvedSeverity === \"destructive\" ? \"destructive\" : \"primary\"}\n onClick={onApprove}\n >\n Approve\n </Button>\n ) : null}\n </footer>\n </section>\n );\n },\n);\nApprovalCard.displayName = \"ApprovalCard\";\n\nexport { ApprovalCard, type ApprovalSeverity };\n"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"path": "components/primitives/artifact-preview/artifact-preview.tsx",
|
|
17
17
|
"type": "registry:ui",
|
|
18
18
|
"target": "components/ui/artifact-preview.tsx",
|
|
19
|
-
"content": "import { Maximize2, RefreshCw, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\ninterface ArtifactPreviewProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title: ReactNode;\n /** Optional source/destination label (e.g. \"Google Drive\", \"Local · ~/reports\"). */\n source?: ReactNode;\n /**\n * Tabs at the bottom of the artifact (e.g. \"Expense Report | Currency Summary\").\n * Caller controls the active state externally.\n */\n tabs?: ReactNode;\n /** Top toolbar actions. Defaults to refresh + maximize + close. */\n toolbar?: ReactNode;\n onMaximize?: () => void;\n onRefresh?: () => void;\n onClose?: () => void;\n}\n\n/**\n * ArtifactPreview — shell for previewing a generated artifact (XLSX, PDF, image…).\n *\n * Renders a toolbar + content slot + optional bottom tabs. The actual preview\n * (spreadsheet, PDF embed, image) is the caller's `children`, so this stays\n * dependency-free.\n */\nconst ArtifactPreview = forwardRef<HTMLElement, ArtifactPreviewProps>(\n (\n { className, title, source, tabs, toolbar, onMaximize, onRefresh, onClose, children, ...props },\n ref,\n ) => (\n <section\n ref={ref}\n className={cn(\"flex h-full flex-col overflow-hidden rounded-xl border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-center gap-3 border-border/40 border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-body-sm text-foreground\">{title}</p>\n {source ? (\n <p className=\"truncate font-mono text-label text-muted-foreground\">{source}</p>\n ) : null}\n </div>\n {toolbar ?? (\n <div className=\"flex items-center gap-1\">\n {onRefresh ? (\n <ToolbarButton onClick={onRefresh} aria-label=\"Refresh\">\n <RefreshCw className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n {onMaximize ? (\n <ToolbarButton onClick={onMaximize} aria-label=\"Maximize\">\n <Maximize2 className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n {onClose ? (\n <ToolbarButton onClick={onClose} aria-label=\"Close preview\">\n <X className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n </div>\n )}\n </header>\n <div className=\"flex-1 overflow-auto\">{children}</div>\n {tabs ? (\n <footer className=\"flex items-center gap-1 border-border/40 border-t px-2 py-1\">\n {tabs}\n </footer>\n ) : null}\n </section>\n ),\n);\nArtifactPreview.displayName = \"ArtifactPreview\";\n\nfunction ToolbarButton({\n onClick,\n children,\n \"aria-label\": ariaLabel,\n}: {\n onClick?: () => void;\n children: ReactNode;\n \"aria-label\": string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n {children}\n </button>\n );\n}\n\nexport { ArtifactPreview };\n"
|
|
19
|
+
"content": "import { Maximize2, RefreshCw, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\ninterface ArtifactPreviewProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title: ReactNode;\n /** Optional source/destination label (e.g. \"Google Drive\", \"Local · ~/reports\"). */\n source?: ReactNode;\n /**\n * Tabs at the bottom of the artifact (e.g. \"Expense Report | Currency Summary\").\n * Caller controls the active state externally.\n */\n tabs?: ReactNode;\n /** Top toolbar actions. Defaults to refresh + maximize + close. */\n toolbar?: ReactNode;\n onMaximize?: () => void;\n onRefresh?: () => void;\n onClose?: () => void;\n}\n\n/**\n * ArtifactPreview — shell for previewing a generated artifact (XLSX, PDF, image…).\n *\n * Renders a toolbar + content slot + optional bottom tabs. The actual preview\n * (spreadsheet, PDF embed, image) is the caller's `children`, so this stays\n * dependency-free.\n */\nconst ArtifactPreview = forwardRef<HTMLElement, ArtifactPreviewProps>(\n (\n { className, title, source, tabs, toolbar, onMaximize, onRefresh, onClose, children, ...props },\n ref,\n ) => (\n <section\n data-slot=\"artifact-preview\"\n ref={ref}\n className={cn(\"flex h-full flex-col overflow-hidden rounded-xl border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-center gap-3 border-border/40 border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-body-sm text-foreground\">{title}</p>\n {source ? (\n <p className=\"truncate font-mono text-label text-muted-foreground\">{source}</p>\n ) : null}\n </div>\n {toolbar ?? (\n <div className=\"flex items-center gap-1\">\n {onRefresh ? (\n <ToolbarButton onClick={onRefresh} aria-label=\"Refresh\">\n <RefreshCw className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n {onMaximize ? (\n <ToolbarButton onClick={onMaximize} aria-label=\"Maximize\">\n <Maximize2 className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n {onClose ? (\n <ToolbarButton onClick={onClose} aria-label=\"Close preview\">\n <X className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n </div>\n )}\n </header>\n <div className=\"flex-1 overflow-auto\">{children}</div>\n {tabs ? (\n <footer className=\"flex items-center gap-1 border-border/40 border-t px-2 py-1\">\n {tabs}\n </footer>\n ) : null}\n </section>\n ),\n);\nArtifactPreview.displayName = \"ArtifactPreview\";\n\nfunction ToolbarButton({\n onClick,\n children,\n \"aria-label\": ariaLabel,\n}: {\n onClick?: () => void;\n children: ReactNode;\n \"aria-label\": string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n {children}\n </button>\n );\n}\n\nexport { ArtifactPreview };\n"
|
|
20
20
|
}
|
|
21
21
|
]
|
|
22
22
|
}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"path": "components/primitives/attachment-chip/attachment-chip.tsx",
|
|
19
19
|
"type": "registry:ui",
|
|
20
20
|
"target": "components/ui/attachment-chip.tsx",
|
|
21
|
-
"content": "import { File, FileCode, FileImage, FileSpreadsheet, FileText, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\nimport type { Attachment } from \"@/types/chat\";\n\nconst typeIcon: Record<string, IconComponent> = {\n image: FileImage,\n spreadsheet: FileSpreadsheet,\n code: FileCode,\n text: FileText,\n};\n\ninterface AttachmentChipProps extends HTMLAttributes<HTMLDivElement> {\n attachment: Attachment;\n onRemove?: (id: string) => void;\n}\n\n/**\n * AttachmentChip — file pill shown in chat composer or message attachments row.\n *\n * Visual: rounded chip with type-icon + name + size + optional remove button.\n * Truncates the name with `text-ellipsis`; full name available via title.\n */\nconst AttachmentChip = forwardRef<HTMLDivElement, AttachmentChipProps>(\n ({ className, attachment, onRemove, ...props }, ref) => {\n const Icon: IconComponent = (attachment.type ? typeIcon[attachment.type] : undefined) ?? File;\n return (\n <div\n ref={ref}\n className={cn(\n \"inline-flex max-w-[18rem] items-center gap-2 rounded-md border border-border/40 bg-muted/60 px-2 py-1\",\n \"font-mono text-code-sm text-muted-foreground\",\n className,\n )}\n {...props}\n >\n <Icon className=\"size-3.5 shrink-0 text-primary\" aria-hidden=\"true\" />\n <span className=\"truncate text-foreground\" title={attachment.name}>\n {attachment.name}\n </span>\n {attachment.size ? <span>· {attachment.size}</span> : null}\n {onRemove ? (\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n aria-label={`Remove ${attachment.name}`}\n className={cn(\n \"ml-1 rounded-sm p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-destructive\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <X className=\"size-3\" />\n </button>\n ) : null}\n </div>\n );\n },\n);\nAttachmentChip.displayName = \"AttachmentChip\";\n\nexport { AttachmentChip };\n"
|
|
21
|
+
"content": "import { File, FileCode, FileImage, FileSpreadsheet, FileText, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\nimport type { Attachment } from \"@/types/chat\";\n\nconst typeIcon: Record<string, IconComponent> = {\n image: FileImage,\n spreadsheet: FileSpreadsheet,\n code: FileCode,\n text: FileText,\n};\n\ninterface AttachmentChipProps extends HTMLAttributes<HTMLDivElement> {\n attachment: Attachment;\n onRemove?: (id: string) => void;\n}\n\n/**\n * AttachmentChip — file pill shown in chat composer or message attachments row.\n *\n * Visual: rounded chip with type-icon + name + size + optional remove button.\n * Truncates the name with `text-ellipsis`; full name available via title.\n */\nconst AttachmentChip = forwardRef<HTMLDivElement, AttachmentChipProps>(\n ({ className, attachment, onRemove, ...props }, ref) => {\n const Icon: IconComponent = (attachment.type ? typeIcon[attachment.type] : undefined) ?? File;\n return (\n <div\n data-slot=\"attachment-chip\"\n ref={ref}\n className={cn(\n \"inline-flex max-w-[18rem] items-center gap-2 rounded-md border border-border/40 bg-muted/60 px-2 py-1\",\n \"font-mono text-code-sm text-muted-foreground\",\n className,\n )}\n {...props}\n >\n <Icon className=\"size-3.5 shrink-0 text-primary\" aria-hidden=\"true\" />\n <span className=\"truncate text-foreground\" title={attachment.name}>\n {attachment.name}\n </span>\n {attachment.size ? <span>· {attachment.size}</span> : null}\n {onRemove ? (\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n aria-label={`Remove ${attachment.name}`}\n className={cn(\n \"ml-1 rounded-sm p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-destructive\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <X className=\"size-3\" />\n </button>\n ) : null}\n </div>\n );\n },\n);\nAttachmentChip.displayName = \"AttachmentChip\";\n\nexport { AttachmentChip };\n"
|
|
22
22
|
}
|
|
23
23
|
]
|
|
24
24
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"path": "components/primitives/audit-log-entry/audit-log-entry.tsx",
|
|
18
18
|
"type": "registry:ui",
|
|
19
19
|
"target": "components/ui/audit-log-entry.tsx",
|
|
20
|
-
"content": "import { Bot, ShieldAlert, User } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\n\nexport type AuditActorKind = \"user\" | \"agent\" | \"system\";\n\nexport type AuditSeverity = \"info\" | \"warning\" | \"error\";\n\nexport interface AuditEntry {\n id: string;\n /** Who triggered the action. */\n actor: { kind: AuditActorKind; name: string };\n /** Verb / action label, e.g. \"wrote file\", \"ran command\". */\n action: string;\n /** Target of the action (file path, command, etc). */\n target?: ReactNode;\n /** ISO timestamp / friendly label. */\n timestamp: string;\n severity?: AuditSeverity;\n /** Optional detail block (multi-line). */\n detail?: ReactNode;\n}\n\ninterface AuditLogEntryProps extends HTMLAttributes<HTMLElement> {\n entry: AuditEntry;\n}\n\nconst ACTOR_ICON: Record<AuditActorKind, IconComponent> = {\n user: User,\n agent: Bot,\n system: ShieldAlert,\n};\n\nconst SEVERITY_CLASS: Record<AuditSeverity, string> = {\n info: \"text-muted-foreground\",\n warning: \"text-warning\",\n error: \"text-destructive\",\n};\n\n/**\n * AuditLogEntry — one row in the agent audit log. Tells the user exactly\n * who did what and when. Severity colors the timestamp and target.\n */\nconst AuditLogEntry = forwardRef<HTMLElement, AuditLogEntryProps>(\n ({ className, entry, ...props }, ref) => {\n const Icon = ACTOR_ICON[entry.actor.kind];\n const sev = entry.severity ?? \"info\";\n return (\n <article\n ref={ref}\n className={cn(\n \"grid grid-cols-[auto_1fr_auto] items-start gap-3 border-border/30 border-b px-3 py-2\",\n \"last:border-b-0\",\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n \"mt-0.5 grid size-7 place-items-center rounded-md bg-muted text-muted-foreground\",\n sev === \"warning\" && \"text-warning\",\n sev === \"error\" && \"text-destructive\",\n )}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-baseline gap-2 text-body-sm\">\n <span className=\"font-medium font-mono text-code-sm text-foreground\">\n {entry.actor.name}\n </span>\n <span className={cn(\"font-mono text-code-sm\", SEVERITY_CLASS[sev])}>\n {entry.action}\n </span>\n {entry.target ? (\n <span className=\"truncate font-mono text-code-sm text-foreground/80\">\n {entry.target}\n </span>\n ) : null}\n </p>\n {entry.detail ? (\n <div className=\"mt-1 rounded-md bg-muted/40 px-2.5 py-1.5 font-mono text-code-sm text-muted-foreground\">\n {entry.detail}\n </div>\n ) : null}\n </div>\n <span className=\"shrink-0 font-mono text-label text-muted-foreground tabular-nums\">\n {entry.timestamp}\n </span>\n </article>\n );\n },\n);\nAuditLogEntry.displayName = \"AuditLogEntry\";\n\nexport { AuditLogEntry };\n"
|
|
20
|
+
"content": "import { Bot, ShieldAlert, User } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\n\nexport type AuditActorKind = \"user\" | \"agent\" | \"system\";\n\nexport type AuditSeverity = \"info\" | \"warning\" | \"error\";\n\nexport interface AuditEntry {\n id: string;\n /** Who triggered the action. */\n actor: { kind: AuditActorKind; name: string };\n /** Verb / action label, e.g. \"wrote file\", \"ran command\". */\n action: string;\n /** Target of the action (file path, command, etc). */\n target?: ReactNode;\n /** ISO timestamp / friendly label. */\n timestamp: string;\n severity?: AuditSeverity;\n /** Optional detail block (multi-line). */\n detail?: ReactNode;\n}\n\ninterface AuditLogEntryProps extends HTMLAttributes<HTMLElement> {\n entry: AuditEntry;\n}\n\nconst ACTOR_ICON: Record<AuditActorKind, IconComponent> = {\n user: User,\n agent: Bot,\n system: ShieldAlert,\n};\n\nconst SEVERITY_CLASS: Record<AuditSeverity, string> = {\n info: \"text-muted-foreground\",\n warning: \"text-warning\",\n error: \"text-destructive\",\n};\n\n/**\n * AuditLogEntry — one row in the agent audit log. Tells the user exactly\n * who did what and when. Severity colors the timestamp and target.\n */\nconst AuditLogEntry = forwardRef<HTMLElement, AuditLogEntryProps>(\n ({ className, entry, ...props }, ref) => {\n const Icon = ACTOR_ICON[entry.actor.kind];\n const sev = entry.severity ?? \"info\";\n return (\n <article\n data-slot=\"audit-log-entry\"\n ref={ref}\n className={cn(\n \"grid grid-cols-[auto_1fr_auto] items-start gap-3 border-border/30 border-b px-3 py-2\",\n \"last:border-b-0\",\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n \"mt-0.5 grid size-7 place-items-center rounded-md bg-muted text-muted-foreground\",\n sev === \"warning\" && \"text-warning\",\n sev === \"error\" && \"text-destructive\",\n )}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-baseline gap-2 text-body-sm\">\n <span className=\"font-medium font-mono text-code-sm text-foreground\">\n {entry.actor.name}\n </span>\n <span className={cn(\"font-mono text-code-sm\", SEVERITY_CLASS[sev])}>\n {entry.action}\n </span>\n {entry.target ? (\n <span className=\"truncate font-mono text-code-sm text-foreground/80\">\n {entry.target}\n </span>\n ) : null}\n </p>\n {entry.detail ? (\n <div className=\"mt-1 rounded-md bg-muted/40 px-2.5 py-1.5 font-mono text-code-sm text-muted-foreground\">\n {entry.detail}\n </div>\n ) : null}\n </div>\n <span className=\"shrink-0 font-mono text-label text-muted-foreground tabular-nums\">\n {entry.timestamp}\n </span>\n </article>\n );\n },\n);\nAuditLogEntry.displayName = \"AuditLogEntry\";\n\nexport { AuditLogEntry };\n"
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
23
|
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"path": "components/primitives/auto-compact-notice/auto-compact-notice.tsx",
|
|
17
17
|
"type": "registry:ui",
|
|
18
18
|
"target": "components/ui/auto-compact-notice.tsx",
|
|
19
|
-
"content": "import { Sparkles, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { useInLiveRegion } from \"@/lib/live-region-context\";\n\ninterface AutoCompactNoticeProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Optional custom title. */\n title?: ReactNode;\n /**\n * How many turns until the next auto-compaction. Used to render an inline\n * countdown chip.\n */\n turnsRemaining?: number;\n /** Approx tokens that will be removed/summarized. */\n tokensToCompact?: number;\n onCompactNow?: () => void;\n onDismiss?: () => void;\n}\n\nconst formatTokens = (n: number) => {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return `${n}`;\n};\n\n/**\n * AutoCompactNotice — inline banner warning the user that the agent is\n * about to summarize / compact older context. Lets them act early (compact\n * now) or dismiss.\n *\n * Critical for transparency: a user must not be surprised by silent context\n * loss. This component announces it before it happens.\n */\nconst AutoCompactNotice = forwardRef<HTMLElement, AutoCompactNoticeProps>(\n (\n {\n className,\n title = \"Auto-compaction soon\",\n turnsRemaining,\n tokensToCompact,\n onCompactNow,\n onDismiss,\n ...props\n },\n ref,\n ) => {\n // T4.1 (MF-4): omit aria-live when nested inside a container live region.\n const inLiveRegion = useInLiveRegion();\n return (\n <aside\n ref={ref}\n aria-live={inLiveRegion ? undefined : \"polite\"}\n className={cn(\n \"grid grid-cols-[auto_1fr_auto] items-start gap-3 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <Sparkles className=\"mt-0.5 size-4 shrink-0 text-warning\" aria-hidden=\"true\" />\n <div className=\"grid gap-1\">\n <p className=\"flex items-baseline gap-2 font-medium text-body-sm text-foreground\">\n {title}\n {turnsRemaining !== undefined ? (\n <span className=\"inline-flex items-center rounded-full bg-warning/20 px-2 py-0.5 font-mono text-label text-warning tabular-nums\">\n {turnsRemaining} {turnsRemaining === 1 ? \"turn\" : \"turns\"} left\n </span>\n ) : null}\n </p>\n <p className=\"text-body-sm text-muted-foreground\">\n Older context will be summarized to make room.\n {tokensToCompact !== undefined ? (\n <>\n {\" \"}\n About{\" \"}\n <span className=\"font-mono tabular-nums\">\n {formatTokens(tokensToCompact)} tokens\n </span>{\" \"}\n will be replaced by a recap.\n </>\n ) : null}\n </p>\n {onCompactNow ? (\n <button\n type=\"button\"\n onClick={onCompactNow}\n className=\"mt-1 inline-flex w-fit items-center rounded-md border border-warning/40 bg-card px-2.5 py-1 font-mono text-label text-warning hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Compact now\n </button>\n ) : null}\n </div>\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className=\"rounded-md p-1 text-warning hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <X className=\"size-3.5\" />\n </button>\n ) : null}\n </aside>\n );\n },\n);\nAutoCompactNotice.displayName = \"AutoCompactNotice\";\n\nexport { AutoCompactNotice };\n"
|
|
19
|
+
"content": "import { Sparkles, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { useInLiveRegion } from \"@/lib/live-region-context\";\n\ninterface AutoCompactNoticeProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Optional custom title. */\n title?: ReactNode;\n /**\n * How many turns until the next auto-compaction. Used to render an inline\n * countdown chip.\n */\n turnsRemaining?: number;\n /** Approx tokens that will be removed/summarized. */\n tokensToCompact?: number;\n onCompactNow?: () => void;\n onDismiss?: () => void;\n}\n\nconst formatTokens = (n: number) => {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return `${n}`;\n};\n\n/**\n * AutoCompactNotice — inline banner warning the user that the agent is\n * about to summarize / compact older context. Lets them act early (compact\n * now) or dismiss.\n *\n * Critical for transparency: a user must not be surprised by silent context\n * loss. This component announces it before it happens.\n */\nconst AutoCompactNotice = forwardRef<HTMLElement, AutoCompactNoticeProps>(\n (\n {\n className,\n title = \"Auto-compaction soon\",\n turnsRemaining,\n tokensToCompact,\n onCompactNow,\n onDismiss,\n ...props\n },\n ref,\n ) => {\n // T4.1 (MF-4): omit aria-live when nested inside a container live region.\n const inLiveRegion = useInLiveRegion();\n return (\n <aside\n data-slot=\"auto-compact-notice\"\n ref={ref}\n aria-live={inLiveRegion ? undefined : \"polite\"}\n className={cn(\n \"grid grid-cols-[auto_1fr_auto] items-start gap-3 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <Sparkles className=\"mt-0.5 size-4 shrink-0 text-warning\" aria-hidden=\"true\" />\n <div className=\"grid gap-1\">\n <p className=\"flex items-baseline gap-2 font-medium text-body-sm text-foreground\">\n {title}\n {turnsRemaining !== undefined ? (\n <span className=\"inline-flex items-center rounded-full bg-warning/20 px-2 py-0.5 font-mono text-label text-warning tabular-nums\">\n {turnsRemaining} {turnsRemaining === 1 ? \"turn\" : \"turns\"} left\n </span>\n ) : null}\n </p>\n <p className=\"text-body-sm text-muted-foreground\">\n Older context will be summarized to make room.\n {tokensToCompact !== undefined ? (\n <>\n {\" \"}\n About{\" \"}\n <span className=\"font-mono tabular-nums\">\n {formatTokens(tokensToCompact)} tokens\n </span>{\" \"}\n will be replaced by a recap.\n </>\n ) : null}\n </p>\n {onCompactNow ? (\n <button\n type=\"button\"\n onClick={onCompactNow}\n className=\"mt-1 inline-flex w-fit items-center rounded-md border border-warning/40 bg-card px-2.5 py-1 font-mono text-label text-warning hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Compact now\n </button>\n ) : null}\n </div>\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className=\"rounded-md p-1 text-warning hover:bg-warning/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <X className=\"size-3.5\" />\n </button>\n ) : null}\n </aside>\n );\n },\n);\nAutoCompactNotice.displayName = \"AutoCompactNotice\";\n\nexport { AutoCompactNotice };\n"
|
|
20
20
|
}
|
|
21
21
|
]
|
|
22
22
|
}
|
package/registry/r/avatar.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"path": "components/primitives/avatar/avatar.tsx",
|
|
18
18
|
"type": "registry:ui",
|
|
19
19
|
"target": "components/ui/avatar.tsx",
|
|
20
|
-
"content": "import * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport { type VariantProps, cva } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ElementRef } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Avatar — user/team avatar with safe fallback to initials.\n *\n * Composition:\n * <Avatar size=\"md\">\n * <Avatar.Image src=\"…\" alt=\"…\" />\n * <Avatar.Fallback>AA</Avatar.Fallback>\n * </Avatar>\n *\n * Built on Radix Avatar (handles image load failures → fallback automatically).\n * Sizes scale on the root; fallback inherits the size's text scale.\n */\n\nconst avatarVariants = cva(\n [\n \"relative inline-flex shrink-0 overflow-hidden rounded-full\",\n \"border border-border/40 bg-muted text-foreground\",\n ],\n {\n variants: {\n size: {\n xs: \"size-6 text-label\",\n sm: \"size-7 text-label\",\n md: \"size-9 text-body-sm\",\n lg: \"size-12 text-body-md\",\n xl: \"size-16 text-title-md\",\n },\n tone: {\n muted: \"bg-muted text-foreground\",\n primary: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n },\n },\n defaultVariants: { size: \"md\", tone: \"muted\" },\n },\n);\n\ninterface AvatarProps\n extends ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n VariantProps<typeof avatarVariants> {}\n\nconst AvatarRoot = forwardRef<ElementRef<typeof AvatarPrimitive.Root>, AvatarProps>(\n ({ className, size, tone, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(avatarVariants({ size, tone }), className)}\n {...props}\n />\n ),\n);\nAvatarRoot.displayName = \"Avatar\";\n\nconst AvatarImage = forwardRef<\n ElementRef<typeof AvatarPrimitive.Image>,\n ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square size-full object-cover\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = \"Avatar.Image\";\n\nconst AvatarFallback = forwardRef<\n ElementRef<typeof AvatarPrimitive.Fallback>,\n ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center font-medium leading-none\",\n className,\n )}\n delayMs={300}\n {...props}\n />\n));\nAvatarFallback.displayName = \"Avatar.Fallback\";\n\nconst Avatar = /*#__PURE__*/ Object.assign(AvatarRoot, {\n Image: AvatarImage,\n Fallback: AvatarFallback,\n});\n\nexport { Avatar, avatarVariants };\n"
|
|
20
|
+
"content": "import * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport { type VariantProps, cva } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ElementRef } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Avatar — user/team avatar with safe fallback to initials.\n *\n * Composition:\n * <Avatar size=\"md\">\n * <Avatar.Image src=\"…\" alt=\"…\" />\n * <Avatar.Fallback>AA</Avatar.Fallback>\n * </Avatar>\n *\n * Built on Radix Avatar (handles image load failures → fallback automatically).\n * Sizes scale on the root; fallback inherits the size's text scale.\n */\n\nconst avatarVariants = cva(\n [\n \"relative inline-flex shrink-0 overflow-hidden rounded-full\",\n \"border border-border/40 bg-muted text-foreground\",\n ],\n {\n variants: {\n size: {\n xs: \"size-6 text-label\",\n sm: \"size-7 text-label\",\n md: \"size-9 text-body-sm\",\n lg: \"size-12 text-body-md\",\n xl: \"size-16 text-title-md\",\n },\n tone: {\n muted: \"bg-muted text-foreground\",\n primary: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n },\n },\n defaultVariants: { size: \"md\", tone: \"muted\" },\n },\n);\n\ninterface AvatarProps\n extends ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n VariantProps<typeof avatarVariants> {}\n\nconst AvatarRoot = forwardRef<ElementRef<typeof AvatarPrimitive.Root>, AvatarProps>(\n ({ className, size, tone, ...props }, ref) => (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n ref={ref}\n className={cn(avatarVariants({ size, tone }), className)}\n {...props}\n />\n ),\n);\nAvatarRoot.displayName = \"Avatar\";\n\nconst AvatarImage = forwardRef<\n ElementRef<typeof AvatarPrimitive.Image>,\n ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n ref={ref}\n className={cn(\"aspect-square size-full object-cover\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = \"Avatar.Image\";\n\nconst AvatarFallback = forwardRef<\n ElementRef<typeof AvatarPrimitive.Fallback>,\n ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center font-medium leading-none\",\n className,\n )}\n delayMs={300}\n {...props}\n />\n));\nAvatarFallback.displayName = \"Avatar.Fallback\";\n\nconst Avatar = /*#__PURE__*/ Object.assign(AvatarRoot, {\n Image: AvatarImage,\n Fallback: AvatarFallback,\n});\n\nexport { Avatar, avatarVariants };\n"
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
23
|
}
|
package/registry/r/badge.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"path": "components/primitives/badge/badge.tsx",
|
|
17
17
|
"type": "registry:ui",
|
|
18
18
|
"target": "components/ui/badge.tsx",
|
|
19
|
-
"content": "import { type VariantProps, cva } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Badge — small status / tag indicator.\n *\n * Variants:\n * - default muted surface, hairline border\n * - primary violet outline + soft violet bg\n * - accent burnt sienna (celebration / pro / beta)\n * - success deploy succeeded\n * - warning attention needed\n * - destructive failed\n * - outline transparent, just border\n *\n * Status dots are inlined via `<Badge.Dot />` for things like \"Building…\",\n * \"Running\", \"Failed\" rows in deployment lists.\n */\nconst badgeVariants = cva(\n [\n \"inline-flex items-center gap-1.5 rounded-full border\",\n \"font-sans uppercase tracking-wider\",\n \"transition-colors\",\n ],\n {\n variants: {\n variant: {\n default: \"border-border/40 bg-muted text-muted-foreground\",\n primary: \"border-primary/30 bg-primary/10 text-primary\",\n accent: \"border-accent/40 bg-accent/15 text-accent\",\n success: \"border-success/40 bg-success/15 text-success\",\n warning: \"border-warning/40 bg-warning/15 text-warning\",\n destructive: \"border-destructive/40 bg-destructive/15 text-destructive\",\n outline: \"border-border bg-transparent text-foreground\",\n },\n size: {\n sm: \"px-2 py-0.5 text-label-caps\",\n md: \"px-2.5 py-0.5 text-label\",\n lg: \"px-3 py-1 text-body-md\",\n },\n },\n defaultVariants: { variant: \"default\", size: \"md\" },\n },\n);\n\nexport interface BadgeProps\n extends HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {}\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant, size, ...props }, ref) => (\n <span
|
|
19
|
+
"content": "import { type VariantProps, cva } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Badge — small status / tag indicator.\n *\n * Variants:\n * - default muted surface, hairline border\n * - primary violet outline + soft violet bg\n * - accent burnt sienna (celebration / pro / beta)\n * - success deploy succeeded\n * - warning attention needed\n * - destructive failed\n * - outline transparent, just border\n *\n * Status dots are inlined via `<Badge.Dot />` for things like \"Building…\",\n * \"Running\", \"Failed\" rows in deployment lists.\n */\nconst badgeVariants = cva(\n [\n \"inline-flex items-center gap-1.5 rounded-full border\",\n \"font-sans uppercase tracking-wider\",\n \"transition-colors\",\n ],\n {\n variants: {\n variant: {\n default: \"border-border/40 bg-muted text-muted-foreground\",\n primary: \"border-primary/30 bg-primary/10 text-primary\",\n accent: \"border-accent/40 bg-accent/15 text-accent\",\n success: \"border-success/40 bg-success/15 text-success\",\n warning: \"border-warning/40 bg-warning/15 text-warning\",\n destructive: \"border-destructive/40 bg-destructive/15 text-destructive\",\n outline: \"border-border bg-transparent text-foreground\",\n },\n size: {\n sm: \"px-2 py-0.5 text-label-caps\",\n md: \"px-2.5 py-0.5 text-label\",\n lg: \"px-3 py-1 text-body-md\",\n },\n },\n defaultVariants: { variant: \"default\", size: \"md\" },\n },\n);\n\nexport interface BadgeProps\n extends HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {}\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant, size, ...props }, ref) => (\n <span\n data-slot=\"badge\"\n data-variant={variant}\n data-size={size}\n ref={ref}\n className={cn(badgeVariants({ variant, size }), className)}\n {...props}\n />\n ),\n);\nBadge.displayName = \"Badge\";\n\ninterface BadgeDotProps extends HTMLAttributes<HTMLSpanElement> {\n pulse?: boolean;\n tone?: \"primary\" | \"accent\" | \"success\" | \"warning\" | \"destructive\" | \"muted\";\n}\n\nconst toneClass: Record<NonNullable<BadgeDotProps[\"tone\"]>, string> = {\n primary: \"bg-primary\",\n accent: \"bg-accent\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n destructive: \"bg-destructive\",\n muted: \"bg-muted-foreground\",\n};\n\nconst Dot = forwardRef<HTMLSpanElement, BadgeDotProps>(\n ({ className, pulse = false, tone = \"success\", ...props }, ref) => (\n <span\n data-slot=\"badge-dot\"\n ref={ref}\n aria-hidden=\"true\"\n className={cn(\n \"inline-block size-1.5 rounded-full\",\n toneClass[tone],\n pulse && \"animate-pulse-glow\",\n className,\n )}\n {...props}\n />\n ),\n);\nDot.displayName = \"Badge.Dot\";\n\nconst BadgeWithDot = Badge as typeof Badge & { Dot: typeof Dot };\nBadgeWithDot.Dot = Dot;\n\nexport { BadgeWithDot as Badge, badgeVariants };\n"
|
|
20
20
|
}
|
|
21
21
|
]
|
|
22
22
|
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"path": "components/primitives/browser-controls/browser-controls.tsx",
|
|
17
17
|
"type": "registry:ui",
|
|
18
18
|
"target": "components/ui/browser-controls.tsx",
|
|
19
|
-
"content": "import { ArrowLeft, ArrowRight, RotateCw } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\ninterface BrowserControlsProps extends HTMLAttributes<HTMLDivElement> {\n url: string;\n onUrlChange?: (next: string) => void;\n onBack?: () => void;\n onForward?: () => void;\n onReload?: () => void;\n /**\n * Disable URL editing (some previews are read-only).\n */\n readOnlyUrl?: boolean;\n}\n\n/**\n * BrowserControls — back/forward/reload + URL bar.\n *\n * Used as the top of PreviewPanel in the Code workspace.\n */\nconst BrowserControls = forwardRef<HTMLDivElement, BrowserControlsProps>(\n ({ className, url, onUrlChange, onBack, onForward, onReload, readOnlyUrl, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex items-center gap-1 border-border/40 border-b bg-card px-3 py-2\",\n className,\n )}\n {...props}\n >\n <NavBtn aria-label=\"Back\" {...(onBack ? { onClick: onBack } : {})}>\n <ArrowLeft className=\"size-3.5\" />\n </NavBtn>\n <NavBtn aria-label=\"Forward\" {...(onForward ? { onClick: onForward } : {})}>\n <ArrowRight className=\"size-3.5\" />\n </NavBtn>\n <NavBtn aria-label=\"Reload\" {...(onReload ? { onClick: onReload } : {})}>\n <RotateCw className=\"size-3.5\" />\n </NavBtn>\n <input\n type=\"url\"\n value={url}\n onChange={(e) => onUrlChange?.(e.target.value)}\n readOnly={readOnlyUrl ?? !onUrlChange}\n aria-label=\"Address\"\n className={cn(\n \"ml-2 h-7 flex-1 rounded-md border border-border/40 bg-muted/40 px-2\",\n \"font-mono text-code-sm text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n />\n </div>\n ),\n);\nBrowserControls.displayName = \"BrowserControls\";\n\nfunction NavBtn({\n onClick,\n children,\n \"aria-label\": ariaLabel,\n}: {\n onClick?: () => void;\n children: ReactNode;\n \"aria-label\": string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n disabled={!onClick}\n className={cn(\n \"rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:opacity-30 disabled:hover:bg-transparent\",\n )}\n >\n {children}\n </button>\n );\n}\n\nexport { BrowserControls };\n"
|
|
19
|
+
"content": "import { ArrowLeft, ArrowRight, RotateCw } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\ninterface BrowserControlsProps extends HTMLAttributes<HTMLDivElement> {\n url: string;\n onUrlChange?: (next: string) => void;\n onBack?: () => void;\n onForward?: () => void;\n onReload?: () => void;\n /**\n * Disable URL editing (some previews are read-only).\n */\n readOnlyUrl?: boolean;\n}\n\n/**\n * BrowserControls — back/forward/reload + URL bar.\n *\n * Used as the top of PreviewPanel in the Code workspace.\n */\nconst BrowserControls = forwardRef<HTMLDivElement, BrowserControlsProps>(\n ({ className, url, onUrlChange, onBack, onForward, onReload, readOnlyUrl, ...props }, ref) => (\n <div\n data-slot=\"browser-controls\"\n ref={ref}\n className={cn(\n \"flex items-center gap-1 border-border/40 border-b bg-card px-3 py-2\",\n className,\n )}\n {...props}\n >\n <NavBtn aria-label=\"Back\" {...(onBack ? { onClick: onBack } : {})}>\n <ArrowLeft className=\"size-3.5\" />\n </NavBtn>\n <NavBtn aria-label=\"Forward\" {...(onForward ? { onClick: onForward } : {})}>\n <ArrowRight className=\"size-3.5\" />\n </NavBtn>\n <NavBtn aria-label=\"Reload\" {...(onReload ? { onClick: onReload } : {})}>\n <RotateCw className=\"size-3.5\" />\n </NavBtn>\n <input\n type=\"url\"\n value={url}\n onChange={(e) => onUrlChange?.(e.target.value)}\n readOnly={readOnlyUrl ?? !onUrlChange}\n aria-label=\"Address\"\n className={cn(\n \"ml-2 h-7 flex-1 rounded-md border border-border/40 bg-muted/40 px-2\",\n \"font-mono text-code-sm text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n />\n </div>\n ),\n);\nBrowserControls.displayName = \"BrowserControls\";\n\nfunction NavBtn({\n onClick,\n children,\n \"aria-label\": ariaLabel,\n}: {\n onClick?: () => void;\n children: ReactNode;\n \"aria-label\": string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n disabled={!onClick}\n className={cn(\n \"rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:opacity-30 disabled:hover:bg-transparent\",\n )}\n >\n {children}\n </button>\n );\n}\n\nexport { BrowserControls };\n"
|
|
20
20
|
}
|
|
21
21
|
]
|
|
22
22
|
}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"description": "Terminal-like log viewer with timestamps + level coloring.",
|
|
7
7
|
"registryDependencies": [
|
|
8
8
|
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
9
|
+
"https://usetheodev.github.io/theo-ui/r/env.json",
|
|
9
10
|
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
|
|
10
11
|
],
|
|
11
12
|
"files": [
|
|
@@ -13,7 +14,7 @@
|
|
|
13
14
|
"path": "components/primitives/build-log-stream/build-log-stream.tsx",
|
|
14
15
|
"type": "registry:block",
|
|
15
16
|
"target": "components/blocks/build-log-stream.tsx",
|
|
16
|
-
"content": "
|
|
17
|
+
"content": "\"use client\";\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { isDev } from \"@/lib/env\";\nimport { useInLiveRegion } from \"@/lib/live-region-context\";\n\nexport type LogLevel = \"info\" | \"warn\" | \"error\" | \"success\" | \"debug\";\n\nexport interface LogLine {\n id: string;\n timestamp: string;\n level: LogLevel;\n message: string;\n source?: string;\n}\n\nconst levelClasses: Record<LogLevel, string> = {\n info: \"text-foreground\",\n warn: \"text-warning\",\n error: \"text-destructive\",\n success: \"text-success\",\n debug: \"text-muted-foreground\",\n};\n\nconst levelLabels: Record<LogLevel, string> = {\n info: \"INFO\",\n warn: \"WARN\",\n error: \"ERROR\",\n success: \" OK \",\n debug: \"DBG \",\n};\n\ninterface BuildLogStreamProps extends HTMLAttributes<HTMLDivElement> {\n lines: LogLine[];\n /**\n * If true, shows level filter chips above the stream.\n */\n filterable?: boolean;\n /**\n * Controlled filter — which levels are visible. Empty Set = show all.\n *\n * Pick one mode: either always pass `visibleLevels` + `onVisibleLevelsChange`\n * (controlled), or never (uncontrolled). Mixing the two between renders is\n * not supported and may produce surprising state.\n */\n visibleLevels?: Set<LogLevel>;\n onVisibleLevelsChange?: (levels: Set<LogLevel>) => void;\n /**\n * Height of the scrollable region.\n */\n height?: string | number;\n /**\n * Maximum number of lines rendered. When exceeded, only the tail is shown\n * and a banner indicates truncation. Defaults to 2000 — set higher with\n * caution; React reconciliation cost scales linearly.\n */\n maxLines?: number;\n /**\n * Screen-reader live-region politeness for newly appended lines. Defaults\n * to `\"off\"` because build-log streams can be high-volume; opt into\n * `\"polite\"` only when running the build in the foreground.\n */\n live?: \"off\" | \"polite\";\n}\n\nconst ALL_LEVELS: LogLevel[] = [\"info\", \"warn\", \"error\", \"success\", \"debug\"];\n\n/**\n * BuildLogStream — terminal-like log viewer with timestamps + level coloring.\n *\n * Used in Code workspace and PaaS deployment views. Geist Mono throughout.\n * Lines fade in via animate-fade-in-up on mount; new lines (when prepended/appended)\n * are not animated to avoid feedback noise (consumer's responsibility to render\n * incrementally if needed).\n */\nconst BuildLogStream = forwardRef<HTMLDivElement, BuildLogStreamProps>(\n (\n {\n className,\n lines,\n filterable = true,\n visibleLevels,\n onVisibleLevelsChange,\n height = \"320px\",\n maxLines = 2000,\n live = \"off\",\n ...props\n },\n ref,\n ) => {\n // T4.1 (MF-4): suppress own aria-live when nested in container live region.\n const inLiveRegion = useInLiveRegion();\n const effectiveLive = inLiveRegion ? \"off\" : live;\n const [internalLevels, setInternalLevels] = useState<Set<LogLevel>>(new Set());\n const levels = visibleLevels ?? internalLevels;\n const updateLevels = onVisibleLevelsChange ?? setInternalLevels;\n\n // MEDIUM-002 / T6.5: warn (dev-only) when a consumer flips between\n // controlled and uncontrolled — React's own warning handles `value`/\n // `defaultValue` on form inputs but doesn't see our custom prop pair.\n const wasControlled = useRef<boolean | null>(null);\n useEffect(() => {\n if (!isDev()) return;\n const isControlled = visibleLevels !== undefined;\n if (wasControlled.current === null) {\n wasControlled.current = isControlled;\n return;\n }\n if (wasControlled.current !== isControlled) {\n // biome-ignore lint/suspicious/noConsole: dev-only diagnostic (MEDIUM-002)\n console.warn(\n `[@theokit/ui] BuildLogStream: \\`visibleLevels\\` prop switched between ${\n wasControlled.current ? \"controlled\" : \"uncontrolled\"\n } and ${isControlled ? \"controlled\" : \"uncontrolled\"} between renders. Pick one mode and keep it consistent.`,\n );\n wasControlled.current = isControlled;\n }\n }, [visibleLevels]);\n\n const filtered = useMemo(() => {\n if (levels.size === 0) return lines;\n return lines.filter((l) => levels.has(l.level));\n }, [lines, levels]);\n\n const truncated = filtered.length > maxLines;\n const visible = truncated ? filtered.slice(filtered.length - maxLines) : filtered;\n const hiddenCount = truncated ? filtered.length - maxLines : 0;\n\n const toggle = (level: LogLevel) => {\n const next = new Set(levels);\n if (next.has(level)) next.delete(level);\n else next.add(level);\n updateLevels(next);\n };\n\n return (\n <div\n data-slot=\"build-log-stream\"\n ref={ref}\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n >\n {filterable ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_LEVELS.map((level) => {\n const active = levels.size === 0 || levels.has(level);\n return (\n <button\n key={level}\n type=\"button\"\n onClick={() => toggle(level)}\n aria-pressed={active}\n className={cn(\n \"rounded-md border px-2 py-1 font-mono text-label uppercase tracking-wider\",\n \"transition-colors duration-base ease-out-soft\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n active\n ? cn(\"border-border/60 bg-muted\", levelClasses[level])\n : \"border-border/30 text-muted-foreground/50 hover:text-muted-foreground\",\n )}\n >\n {level}\n </button>\n );\n })}\n </div>\n ) : null}\n <div\n className={cn(\"overflow-y-auto rounded-lg border bg-card\", \"font-mono text-code-sm\")}\n style={{ height }}\n >\n {truncated ? (\n <output className=\"block border-border/30 border-b bg-muted/40 px-4 py-1.5 text-label text-muted-foreground\">\n Showing last {maxLines.toLocaleString()} of {filtered.length.toLocaleString()} lines (\n {hiddenCount.toLocaleString()} earlier lines hidden)\n </output>\n ) : null}\n {visible.length === 0 ? (\n <p className=\"px-4 py-3 text-muted-foreground\">No log lines.</p>\n ) : (\n <ol className=\"divide-y divide-border/30\" aria-live={effectiveLive} aria-atomic=\"false\">\n {visible.map((line) => (\n <li\n key={line.id}\n className=\"grid grid-cols-[auto_auto_1fr] gap-3 px-4 py-1.5 leading-relaxed hover:bg-muted/30\"\n >\n <span className=\"select-none text-muted-foreground\">{line.timestamp}</span>\n <span className={cn(\"select-none font-bold\", levelClasses[line.level])}>\n [{levelLabels[line.level]}]\n </span>\n <span className={levelClasses[line.level]}>\n {line.source ? (\n <span className=\"mr-2 text-muted-foreground\">{line.source}:</span>\n ) : null}\n {line.message}\n </span>\n </li>\n ))}\n </ol>\n )}\n </div>\n </div>\n );\n },\n);\nBuildLogStream.displayName = \"BuildLogStream\";\n\nexport { BuildLogStream };\n"
|
|
17
18
|
}
|
|
18
19
|
]
|
|
19
20
|
}
|
package/registry/r/button.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"path": "components/primitives/button/button.tsx",
|
|
18
18
|
"type": "registry:ui",
|
|
19
19
|
"target": "components/ui/button.tsx",
|
|
20
|
-
"content": "import { Slot } from \"@radix-ui/react-slot\";\nimport { type VariantProps, cva } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Button — primitive action element in the Violet Forge design system.\n *\n * Variants:\n * - primary Theo violet fill, glow on hover (signature)\n * - secondary surface with hairline border\n * - accent burnt-sienna fill, celebratory actions\n * - ghost transparent, hover lifts surface\n * - link text-only, primary color, underline on hover\n * - destructive for irreversible actions\n *\n * Sizes: sm (32px) · md (40px, default) · lg (48px) · icon (square 40px)\n *\n * `asChild` swaps the root for the consumer's element (Radix Slot pattern).\n */\nconst buttonVariants = cva(\n [\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg\",\n // NIT-004: `font-medium` (500) aligns with the design-system.md UI weight.\n // Previously `font-bold` (700) exceeded the normative 400/500/600 weight\n // range declared for Geist Sans in the Violet Forge identity.\n \"font-medium font-sans tracking-tight\",\n \"transition-[box-shadow,background-color,color,transform] duration-base ease-out-soft\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n // Tailwind v4 dropped the `button { cursor: pointer }` preflight rule\n // (https://tailwindcss.com/docs/upgrade-guide#default-button-cursor) so\n // every <button> now shows the default arrow cursor. Restore the\n // \"clickable hand\" explicitly for the Button primitive; the\n // `disabled:pointer-events-none` rule below short-circuits cursor\n // application for disabled state (no events → cursor is moot).\n // `aria-disabled:cursor-default` is a belt-and-suspenders override\n // for paths where pointer-events still flow.\n \"cursor-pointer disabled:cursor-default aria-disabled:cursor-default\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n primary: [\n \"bg-primary text-primary-foreground\",\n \"hover:bg-primary hover:shadow-glow\",\n \"active:scale-[0.98] active:bg-primary-deep active:shadow-none\",\n ],\n secondary: [\n \"border border-border bg-secondary text-secondary-foreground\",\n \"hover:bg-muted\",\n \"active:scale-[0.98]\",\n ],\n accent: [\"bg-accent text-accent-foreground\", \"hover:bg-accent-deep\", \"active:scale-[0.98]\"],\n ghost: [\n \"bg-transparent text-foreground\",\n \"hover:bg-muted\",\n \"active:scale-[0.98] active:bg-secondary\",\n ],\n link: [\n \"bg-transparent text-primary underline-offset-4\",\n \"hover:text-primary-deep hover:underline\",\n \"h-auto p-0\",\n ],\n destructive: [\n \"bg-destructive text-destructive-foreground\",\n \"hover:bg-destructive/90\",\n \"active:scale-[0.98]\",\n ],\n },\n size: {\n sm: \"h-8 px-3 text-body-sm\",\n // md: tier ajustável via density (CSS var on :root). See D3 ADR of\n // faang-density-tightening plan. Default `comfortable` density makes\n // this 36px (--theo-control-h: 2.25rem). sm and lg stay hardcoded.\n md: \"h-[var(--theo-control-h,2.25rem)] px-[var(--theo-control-px,0.875rem)] text-body-sm\",\n lg: \"h-11 px-4 text-body-md\",\n icon: \"h-[var(--theo-control-h,2.25rem)] w-[var(--theo-control-h,2.25rem)] p-0\",\n },\n },\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n },\n },\n);\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, type, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n ref={ref}\n type={asChild ? undefined : (type ?? \"button\")}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n"
|
|
20
|
+
"content": "import { Slot } from \"@radix-ui/react-slot\";\nimport { type VariantProps, cva } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Button — primitive action element in the Violet Forge design system.\n *\n * Variants:\n * - primary Theo violet fill, glow on hover (signature)\n * - secondary surface with hairline border\n * - accent burnt-sienna fill, celebratory actions\n * - ghost transparent, hover lifts surface\n * - link text-only, primary color, underline on hover\n * - destructive for irreversible actions\n *\n * Sizes: sm (32px) · md (40px, default) · lg (48px) · icon (square 40px)\n *\n * `asChild` swaps the root for the consumer's element (Radix Slot pattern).\n */\nconst buttonVariants = cva(\n [\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg\",\n // NIT-004: `font-medium` (500) aligns with the design-system.md UI weight.\n // Previously `font-bold` (700) exceeded the normative 400/500/600 weight\n // range declared for Geist Sans in the Violet Forge identity.\n \"font-medium font-sans tracking-tight\",\n \"transition-[box-shadow,background-color,color,transform] duration-base ease-out-soft\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n // Tailwind v4 dropped the `button { cursor: pointer }` preflight rule\n // (https://tailwindcss.com/docs/upgrade-guide#default-button-cursor) so\n // every <button> now shows the default arrow cursor. Restore the\n // \"clickable hand\" explicitly for the Button primitive; the\n // `disabled:pointer-events-none` rule below short-circuits cursor\n // application for disabled state (no events → cursor is moot).\n // `aria-disabled:cursor-default` is a belt-and-suspenders override\n // for paths where pointer-events still flow.\n \"cursor-pointer disabled:cursor-default aria-disabled:cursor-default\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n primary: [\n \"bg-primary text-primary-foreground\",\n \"hover:bg-primary hover:shadow-glow\",\n \"active:scale-[0.98] active:bg-primary-deep active:shadow-none\",\n ],\n secondary: [\n \"border border-border bg-secondary text-secondary-foreground\",\n \"hover:bg-muted\",\n \"active:scale-[0.98]\",\n ],\n accent: [\"bg-accent text-accent-foreground\", \"hover:bg-accent-deep\", \"active:scale-[0.98]\"],\n ghost: [\n \"bg-transparent text-foreground\",\n \"hover:bg-muted\",\n \"active:scale-[0.98] active:bg-secondary\",\n ],\n link: [\n \"bg-transparent text-primary underline-offset-4\",\n \"hover:text-primary-deep hover:underline\",\n \"h-auto p-0\",\n ],\n destructive: [\n \"bg-destructive text-destructive-foreground\",\n \"hover:bg-destructive/90\",\n \"active:scale-[0.98]\",\n ],\n },\n size: {\n sm: \"h-8 px-3 text-body-sm\",\n // md: tier ajustável via density (CSS var on :root). See D3 ADR of\n // faang-density-tightening plan. Default `comfortable` density makes\n // this 36px (--theo-control-h: 2.25rem). sm and lg stay hardcoded.\n md: \"h-[var(--theo-control-h,2.25rem)] px-[var(--theo-control-px,0.875rem)] text-body-sm\",\n lg: \"h-11 px-4 text-body-md\",\n icon: \"h-[var(--theo-control-h,2.25rem)] w-[var(--theo-control-h,2.25rem)] p-0\",\n },\n },\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n },\n },\n);\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, type, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n ref={ref}\n type={asChild ? undefined : (type ?? \"button\")}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n"
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
23
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"path": "components/primitives/capability-indicator/capability-indicator.tsx",
|
|
18
18
|
"type": "registry:ui",
|
|
19
19
|
"target": "components/ui/capability-indicator.tsx",
|
|
20
|
-
"content": "import {\n AlertCircle,\n Eye,\n Network,\n Pencil,\n Rocket,\n Sparkles,\n Terminal,\n Trash2,\n} from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\n\nexport type CapabilityState = \"enabled\" | \"disabled\" | \"blocked\" | \"active\";\n\nexport interface Capability {\n id: string;\n /** Visible label. */\n label: ReactNode;\n /** Optional icon override. */\n icon?: IconComponent;\n /** Default state. */\n state?: CapabilityState;\n /** Tooltip / longer description. */\n hint?: ReactNode;\n}\n\ninterface CapabilityIndicatorProps extends HTMLAttributes<HTMLDivElement> {\n capabilities: Capability[];\n}\n\n/**\n * CapabilityIndicator — row of chips showing what the agent can currently do.\n *\n * Critical for transparency: the user should always see (e.g. in a top bar)\n * whether the agent has read/write/exec/network access enabled. The \"active\"\n * state pulses when a capability is in use.\n */\nconst stateClasses: Record<CapabilityState, string> = {\n enabled: \"border-success/40 bg-success/10 text-success\",\n active: \"border-primary/50 bg-primary/15 text-primary\",\n disabled: \"border-border/40 bg-muted text-muted-foreground line-through\",\n blocked: \"border-destructive/40 bg-destructive/10 text-destructive\",\n};\n\nconst CapabilityIndicator = forwardRef<HTMLUListElement, CapabilityIndicatorProps>(\n ({ className, capabilities, ...props }, ref) => (\n <ul\n ref={ref}\n aria-label=\"Agent capabilities\"\n className={cn(\"flex flex-wrap items-center gap-1.5\", className)}\n {...(props as HTMLAttributes<HTMLUListElement>)}\n >\n {capabilities.map((c) => {\n const Icon = c.icon ?? AlertCircle;\n const state = c.state ?? \"enabled\";\n return (\n <li\n key={c.id}\n title={typeof c.hint === \"string\" ? c.hint : undefined}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5\",\n \"font-sans text-label\",\n \"transition-colors\",\n stateClasses[state],\n )}\n >\n <Icon\n aria-hidden=\"true\"\n className={cn(\"size-3 shrink-0\", state === \"active\" && \"animate-pulse\")}\n />\n {c.label}\n </li>\n );\n })}\n </ul>\n ),\n);\nCapabilityIndicator.displayName = \"CapabilityIndicator\";\n\n/** Common capability presets — re-use these so apps don't reinvent labels. */\nexport const capabilityPresets = {\n read: { id: \"read\", label: \"Read files\", icon: Eye } as const,\n write: { id: \"write\", label: \"Write files\", icon: Pencil } as const,\n delete: { id: \"delete\", label: \"Delete files\", icon: Trash2 } as const,\n bash: { id: \"bash\", label: \"Run shell\", icon: Terminal } as const,\n network: { id: \"network\", label: \"Network\", icon: Network } as const,\n deploy: { id: \"deploy\", label: \"Deploy\", icon: Rocket } as const,\n llm: { id: \"llm\", label: \"Sub-agents\", icon: Sparkles } as const,\n};\n\nexport { CapabilityIndicator };\n"
|
|
20
|
+
"content": "import {\n AlertCircle,\n Eye,\n Network,\n Pencil,\n Rocket,\n Sparkles,\n Terminal,\n Trash2,\n} from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\n\nexport type CapabilityState = \"enabled\" | \"disabled\" | \"blocked\" | \"active\";\n\nexport interface Capability {\n id: string;\n /** Visible label. */\n label: ReactNode;\n /** Optional icon override. */\n icon?: IconComponent;\n /** Default state. */\n state?: CapabilityState;\n /** Tooltip / longer description. */\n hint?: ReactNode;\n}\n\ninterface CapabilityIndicatorProps extends HTMLAttributes<HTMLDivElement> {\n capabilities: Capability[];\n}\n\n/**\n * CapabilityIndicator — row of chips showing what the agent can currently do.\n *\n * Critical for transparency: the user should always see (e.g. in a top bar)\n * whether the agent has read/write/exec/network access enabled. The \"active\"\n * state pulses when a capability is in use.\n */\nconst stateClasses: Record<CapabilityState, string> = {\n enabled: \"border-success/40 bg-success/10 text-success\",\n active: \"border-primary/50 bg-primary/15 text-primary\",\n disabled: \"border-border/40 bg-muted text-muted-foreground line-through\",\n blocked: \"border-destructive/40 bg-destructive/10 text-destructive\",\n};\n\nconst CapabilityIndicator = forwardRef<HTMLUListElement, CapabilityIndicatorProps>(\n ({ className, capabilities, ...props }, ref) => (\n <ul\n data-slot=\"capability-indicator\"\n ref={ref}\n aria-label=\"Agent capabilities\"\n className={cn(\"flex flex-wrap items-center gap-1.5\", className)}\n {...(props as HTMLAttributes<HTMLUListElement>)}\n >\n {capabilities.map((c) => {\n const Icon = c.icon ?? AlertCircle;\n const state = c.state ?? \"enabled\";\n return (\n <li\n key={c.id}\n title={typeof c.hint === \"string\" ? c.hint : undefined}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5\",\n \"font-sans text-label\",\n \"transition-colors\",\n stateClasses[state],\n )}\n >\n <Icon\n aria-hidden=\"true\"\n className={cn(\"size-3 shrink-0\", state === \"active\" && \"animate-pulse\")}\n />\n {c.label}\n </li>\n );\n })}\n </ul>\n ),\n);\nCapabilityIndicator.displayName = \"CapabilityIndicator\";\n\n/** Common capability presets — re-use these so apps don't reinvent labels. */\nexport const capabilityPresets = {\n read: { id: \"read\", label: \"Read files\", icon: Eye } as const,\n write: { id: \"write\", label: \"Write files\", icon: Pencil } as const,\n delete: { id: \"delete\", label: \"Delete files\", icon: Trash2 } as const,\n bash: { id: \"bash\", label: \"Run shell\", icon: Terminal } as const,\n network: { id: \"network\", label: \"Network\", icon: Network } as const,\n deploy: { id: \"deploy\", label: \"Deploy\", icon: Rocket } as const,\n llm: { id: \"llm\", label: \"Sub-agents\", icon: Sparkles } as const,\n};\n\nexport { CapabilityIndicator };\n"
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
23
|
}
|
package/registry/r/card.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"path": "components/primitives/card/card.tsx",
|
|
17
17
|
"type": "registry:ui",
|
|
18
18
|
"target": "components/ui/card.tsx",
|
|
19
|
-
"content": "
|
|
19
|
+
"content": "\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { createContext, forwardRef, useContext } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Card — surface container for grouping related content.\n *\n * Composition pattern (shadcn-style):\n * <Card>\n * <Card.Header>\n * <Card.Title>…</Card.Title>\n * <Card.Description>…</Card.Description>\n * </Card.Header>\n * <Card.Body>…</Card.Body>\n * <Card.Footer>…</Card.Footer>\n * </Card>\n *\n * The `size` prop on the root propagates to subparts via Context, so a\n * single declaration controls padding + heading scale across the compound.\n * Subparts used in isolation default to `md`. Subparts do NOT accept a `size`\n * prop of their own — use `className` for granular per-subpart tweaks.\n * (EC-8, edge-case review 2026-05-20.)\n */\n\ntype CardSize = \"sm\" | \"md\" | \"lg\";\n\ninterface CardContextValue {\n size: CardSize;\n}\n\nconst CardContext = createContext<CardContextValue>({ size: \"md\" });\n\nconst useCardSize = (): CardSize => useContext(CardContext).size;\n\ninterface CardRootProps extends HTMLAttributes<HTMLDivElement> {\n size?: CardSize;\n}\n\nconst Root = forwardRef<HTMLDivElement, CardRootProps>(\n ({ className, size = \"md\", ...props }, ref) => (\n <CardContext.Provider value={{ size }}>\n <div\n data-slot=\"card\"\n ref={ref}\n className={cn(\n \"rounded-xl border bg-card text-card-foreground shadow-md\",\n \"transition-shadow duration-base ease-out-soft\",\n className,\n )}\n {...props}\n />\n </CardContext.Provider>\n ),\n);\nRoot.displayName = \"Card\";\n\nconst headerPadBySize: Record<CardSize, string> = {\n sm: \"gap-1 p-3 pb-1.5\",\n md: \"gap-1.5 p-5 pb-2.5\",\n lg: \"gap-2 p-6 pb-3\",\n};\n\nconst Header = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n data-slot=\"card-header\"\n ref={ref}\n className={cn(\"flex flex-col\", headerPadBySize[size], className)}\n {...props}\n />\n );\n },\n);\nHeader.displayName = \"Card.Header\";\n\nconst titleFontBySize: Record<CardSize, string> = {\n sm: \"text-title-md\",\n md: \"text-title-lg\",\n lg: \"text-headline\",\n};\n\ninterface TitleProps extends HTMLAttributes<HTMLHeadingElement> {\n /**\n * When true, renders the child element with the Card.Title styles applied\n * (Radix Slot pattern). Use to swap the default `<h3>` for `<h1>` / `<h2>`\n * when the heading hierarchy requires it.\n */\n asChild?: boolean;\n}\n\nconst Title = forwardRef<HTMLHeadingElement, TitleProps>(\n ({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"h3\";\n const size = useCardSize();\n return (\n <Comp\n data-slot=\"card-title\"\n ref={ref}\n className={cn(\n \"font-display text-foreground tracking-tight\",\n titleFontBySize[size],\n className,\n )}\n {...props}\n />\n );\n },\n);\nTitle.displayName = \"Card.Title\";\n\nconst Description = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p\n data-slot=\"card-description\"\n ref={ref}\n className={cn(\"text-body-sm text-muted-foreground\", className)}\n {...props}\n />\n ),\n);\nDescription.displayName = \"Card.Description\";\n\nconst bodyPadBySize: Record<CardSize, string> = {\n sm: \"p-3 pt-1.5\",\n md: \"p-5 pt-2.5\",\n lg: \"p-6 pt-3\",\n};\n\nconst Body = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n data-slot=\"card-body\"\n ref={ref}\n className={cn(bodyPadBySize[size], className)}\n {...props}\n />\n );\n },\n);\nBody.displayName = \"Card.Body\";\n\nconst footerPadBySize: Record<CardSize, string> = {\n sm: \"gap-2 p-3 pt-2\",\n md: \"gap-3 p-5 pt-3\",\n lg: \"gap-4 p-6 pt-4\",\n};\n\nconst Footer = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n data-slot=\"card-footer\"\n ref={ref}\n className={cn(\n \"flex items-center border-border/40 border-t\",\n footerPadBySize[size],\n className,\n )}\n {...props}\n />\n );\n },\n);\nFooter.displayName = \"Card.Footer\";\n\nconst Card = /*#__PURE__*/ Object.assign(Root, {\n Header,\n Title,\n Description,\n Body,\n Footer,\n});\n\nexport { Card };\n"
|
|
20
20
|
}
|
|
21
21
|
]
|
|
22
22
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"path": "components/composites/chat-composer/chat-composer.tsx",
|
|
18
18
|
"type": "registry:ui",
|
|
19
19
|
"target": "components/ui/chat-composer.tsx",
|
|
20
|
-
"content": "import { Mic, Paperclip, Send, Square } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type {\n FormEvent,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { Button } from \"@/components/ui/button\";\n\nexport type ComposerMode = \"chat\" | \"code\" | \"infra\";\n\ninterface ChatComposerProps extends Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\"> {\n mode?: ComposerMode;\n value: string;\n onValueChange: (next: string) => void;\n onSubmit?: (value: string) => void;\n /**\n * If true, the composer is in \"agent running\" state — Send becomes a Stop button.\n */\n running?: boolean;\n onStop?: () => void;\n /**\n * Slot above the textarea — used for the folder selector in Infra mode.\n */\n contextSlot?: ReactNode;\n /**\n * Slot above the textarea for attachments / chips.\n */\n attachmentsSlot?: ReactNode;\n /**\n * Slot on the bottom-left of the action row (e.g. custom toggles).\n * Overrides the default attach button entirely when provided.\n */\n leadingActions?: ReactNode;\n /**\n * Slot on the bottom-right (e.g. model selector). Send/stop is appended after this.\n */\n trailingActions?: ReactNode;\n /**\n * Optional attach-file callback. If omitted (and `leadingActions` is also\n * omitted), no attach button is rendered. This avoids fake affordances per\n * Quality Gate §7.\n */\n onAttach?: () => void;\n /**\n * Optional voice-input callback. If omitted, no mic button is rendered.\n * Same rationale as `onAttach`.\n */\n onVoiceInput?: () => void;\n /**\n * Accessible label for the textarea. Falls back to a mode-aware default.\n */\n textareaLabel?: string;\n /**\n * Textarea placeholder. Defaults change by mode.\n */\n placeholder?: string;\n /**\n * Extra textarea props (rows, maxLength…).\n */\n textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"value\" | \"onChange\">;\n}\n\nconst defaultPlaceholder: Record<ComposerMode, string> = {\n chat: \"How can I help you today?\",\n code: \"Type / for commands\",\n infra: \"Ask about deploys, metrics, env, or rollback…\",\n};\n\nconst defaultTextareaLabel: Record<ComposerMode, string> = {\n chat: \"Chat message\",\n code: \"Code prompt\",\n infra: \"Infra command\",\n};\n\n/**\n * ChatComposer — message input area, shared by Chat / Code / Infra modes.\n *\n * Visual:\n * - chat / infra → soft card with violet ring on focus, generous padding\n * - code → compact dense form with mono font, slash prefix hint\n *\n * Stateless: caller controls `value` + handles `onSubmit`. Submit fires on Enter\n * (without Shift). Shift+Enter inserts a newline.\n *\n * Optional affordances (mic, attach) are opt-in via `onVoiceInput` / `onAttach`\n * — Quality Gate §7 forbids rendering fake controls without behavior.\n */\nconst ChatComposer = forwardRef<HTMLFormElement, ChatComposerProps>(\n (\n {\n className,\n mode = \"chat\",\n value,\n onValueChange,\n onSubmit,\n running = false,\n onStop,\n contextSlot,\n attachmentsSlot,\n leadingActions,\n trailingActions,\n onAttach,\n onVoiceInput,\n textareaLabel,\n placeholder,\n textareaProps,\n ...props\n },\n ref,\n ) => {\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n }\n };\n\n const isCode = mode === \"code\";\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n className={cn(\n \"rounded-2xl border bg-card text-card-foreground transition-shadow\",\n \"focus-within:border-primary/60 focus-within:shadow-glow\",\n isCode && \"rounded-xl shadow-sm\",\n className,\n )}\n {...props}\n >\n {contextSlot ? (\n <div className=\"border-border/40 border-b px-3 pt-3\">{contextSlot}</div>\n ) : null}\n\n {attachmentsSlot ? (\n <div className=\"flex flex-wrap gap-2 px-4 pt-3\">{attachmentsSlot}</div>\n ) : null}\n\n <textarea\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder ?? defaultPlaceholder[mode]}\n aria-label={textareaLabel ?? defaultTextareaLabel[mode]}\n rows={isCode ? 1 : 2}\n {...textareaProps}\n className={cn(\n \"w-full resize-none bg-transparent px-4 py-3\",\n \"placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n isCode ? \"font-mono text-code-md\" : \"min-h-[3.5rem] font-sans text-body-md\",\n textareaProps?.className,\n )}\n />\n\n <div\n className={cn(\n \"flex items-center justify-between gap-2 border-border/40 border-t px-3 py-2\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n {leadingActions !== undefined ? (\n leadingActions\n ) : onAttach ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onAttach}\n aria-label=\"Attach file\"\n >\n <Paperclip />\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {trailingActions}\n {onVoiceInput ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onVoiceInput}\n aria-label=\"Voice input\"\n >\n <Mic />\n </Button>\n ) : null}\n {running ? (\n <Button\n type=\"button\"\n onClick={onStop}\n size=\"icon\"\n variant=\"destructive\"\n aria-label=\"Stop generation\"\n >\n <Square />\n </Button>\n ) : (\n <Button type=\"submit\" size=\"icon\" disabled={!value.trim()} aria-label=\"Send message\">\n <Send />\n </Button>\n )}\n </div>\n </div>\n </form>\n );\n },\n);\nChatComposer.displayName = \"ChatComposer\";\n\nexport { ChatComposer };\n"
|
|
20
|
+
"content": "import { Mic, Paperclip, Send, Square } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type {\n FormEvent,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { Button } from \"@/components/ui/button\";\n\nexport type ComposerMode = \"chat\" | \"code\" | \"infra\";\n\ninterface ChatComposerProps extends Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\"> {\n mode?: ComposerMode;\n value: string;\n onValueChange: (next: string) => void;\n onSubmit?: (value: string) => void;\n /**\n * If true, the composer is in \"agent running\" state — Send becomes a Stop button.\n */\n running?: boolean;\n onStop?: () => void;\n /**\n * Slot above the textarea — used for the folder selector in Infra mode.\n */\n contextSlot?: ReactNode;\n /**\n * Slot above the textarea for attachments / chips.\n */\n attachmentsSlot?: ReactNode;\n /**\n * Slot on the bottom-left of the action row (e.g. custom toggles).\n * Overrides the default attach button entirely when provided.\n */\n leadingActions?: ReactNode;\n /**\n * Slot on the bottom-right (e.g. model selector). Send/stop is appended after this.\n */\n trailingActions?: ReactNode;\n /**\n * Optional attach-file callback. If omitted (and `leadingActions` is also\n * omitted), no attach button is rendered. This avoids fake affordances per\n * Quality Gate §7.\n */\n onAttach?: () => void;\n /**\n * Optional voice-input callback. If omitted, no mic button is rendered.\n * Same rationale as `onAttach`.\n */\n onVoiceInput?: () => void;\n /**\n * Accessible label for the textarea. Falls back to a mode-aware default.\n */\n textareaLabel?: string;\n /**\n * Textarea placeholder. Defaults change by mode.\n */\n placeholder?: string;\n /**\n * Extra textarea props (rows, maxLength…).\n */\n textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"value\" | \"onChange\">;\n}\n\nconst defaultPlaceholder: Record<ComposerMode, string> = {\n chat: \"How can I help you today?\",\n code: \"Type / for commands\",\n infra: \"Ask about deploys, metrics, env, or rollback…\",\n};\n\nconst defaultTextareaLabel: Record<ComposerMode, string> = {\n chat: \"Chat message\",\n code: \"Code prompt\",\n infra: \"Infra command\",\n};\n\n/**\n * ChatComposer — message input area, shared by Chat / Code / Infra modes.\n *\n * Visual:\n * - chat / infra → soft card with violet ring on focus, generous padding\n * - code → compact dense form with mono font, slash prefix hint\n *\n * Stateless: caller controls `value` + handles `onSubmit`. Submit fires on Enter\n * (without Shift). Shift+Enter inserts a newline.\n *\n * Optional affordances (mic, attach) are opt-in via `onVoiceInput` / `onAttach`\n * — Quality Gate §7 forbids rendering fake controls without behavior.\n */\nconst ChatComposer = forwardRef<HTMLFormElement, ChatComposerProps>(\n (\n {\n className,\n mode = \"chat\",\n value,\n onValueChange,\n onSubmit,\n running = false,\n onStop,\n contextSlot,\n attachmentsSlot,\n leadingActions,\n trailingActions,\n onAttach,\n onVoiceInput,\n textareaLabel,\n placeholder,\n textareaProps,\n ...props\n },\n ref,\n ) => {\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n }\n };\n\n const isCode = mode === \"code\";\n\n return (\n <form\n data-slot=\"chat-composer\"\n ref={ref}\n onSubmit={handleSubmit}\n className={cn(\n \"rounded-2xl border bg-card text-card-foreground transition-shadow\",\n \"focus-within:border-primary/60 focus-within:shadow-glow\",\n isCode && \"rounded-xl shadow-sm\",\n className,\n )}\n {...props}\n >\n {contextSlot ? (\n <div className=\"border-border/40 border-b px-3 pt-3\">{contextSlot}</div>\n ) : null}\n\n {attachmentsSlot ? (\n <div className=\"flex flex-wrap gap-2 px-4 pt-3\">{attachmentsSlot}</div>\n ) : null}\n\n <textarea\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder ?? defaultPlaceholder[mode]}\n aria-label={textareaLabel ?? defaultTextareaLabel[mode]}\n rows={isCode ? 1 : 2}\n {...textareaProps}\n className={cn(\n \"w-full resize-none bg-transparent px-4 py-3\",\n \"placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n isCode ? \"font-mono text-code-md\" : \"min-h-[3.5rem] font-sans text-body-md\",\n textareaProps?.className,\n )}\n />\n\n <div\n className={cn(\n \"flex items-center justify-between gap-2 border-border/40 border-t px-3 py-2\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n {leadingActions !== undefined ? (\n leadingActions\n ) : onAttach ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onAttach}\n aria-label=\"Attach file\"\n >\n <Paperclip />\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {trailingActions}\n {onVoiceInput ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onVoiceInput}\n aria-label=\"Voice input\"\n >\n <Mic />\n </Button>\n ) : null}\n {running ? (\n <Button\n type=\"button\"\n onClick={onStop}\n size=\"icon\"\n variant=\"destructive\"\n aria-label=\"Stop generation\"\n >\n <Square />\n </Button>\n ) : (\n <Button type=\"submit\" size=\"icon\" disabled={!value.trim()} aria-label=\"Send message\">\n <Send />\n </Button>\n )}\n </div>\n </div>\n </form>\n );\n },\n);\nChatComposer.displayName = \"ChatComposer\";\n\nexport { ChatComposer };\n"
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
23
|
}
|