@theokit/ui 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1325 -0
- package/DESIGN.md +456 -0
- package/LICENSE +201 -0
- package/NOTICE +38 -0
- package/README.md +467 -0
- package/dist/chunk-27ENTTY7.js +146 -0
- package/dist/chunk-27ENTTY7.js.map +1 -0
- package/dist/chunk-2H6TQELG.js +33 -0
- package/dist/chunk-2H6TQELG.js.map +1 -0
- package/dist/chunk-2L6MRJD4.js +120 -0
- package/dist/chunk-2L6MRJD4.js.map +1 -0
- package/dist/chunk-2Y5V2PAL.js +80 -0
- package/dist/chunk-2Y5V2PAL.js.map +1 -0
- package/dist/chunk-34NAFDVL.js +46 -0
- package/dist/chunk-34NAFDVL.js.map +1 -0
- package/dist/chunk-36KJGXEK.js +112 -0
- package/dist/chunk-36KJGXEK.js.map +1 -0
- package/dist/chunk-3BMYYNN6.js +124 -0
- package/dist/chunk-3BMYYNN6.js.map +1 -0
- package/dist/chunk-3OHV7EEI.js +34 -0
- package/dist/chunk-3OHV7EEI.js.map +1 -0
- package/dist/chunk-3QKTS6F5.js +88 -0
- package/dist/chunk-3QKTS6F5.js.map +1 -0
- package/dist/chunk-3TBXLYNM.js +42 -0
- package/dist/chunk-3TBXLYNM.js.map +1 -0
- package/dist/chunk-4AM2HSXU.js +67 -0
- package/dist/chunk-4AM2HSXU.js.map +1 -0
- package/dist/chunk-4BCGKM65.js +44 -0
- package/dist/chunk-4BCGKM65.js.map +1 -0
- package/dist/chunk-4D3JILQX.js +145 -0
- package/dist/chunk-4D3JILQX.js.map +1 -0
- package/dist/chunk-4EJU2GBG.js +48 -0
- package/dist/chunk-4EJU2GBG.js.map +1 -0
- package/dist/chunk-4WKO3G5C.js +110 -0
- package/dist/chunk-4WKO3G5C.js.map +1 -0
- package/dist/chunk-53XPKI7Q.js +97 -0
- package/dist/chunk-53XPKI7Q.js.map +1 -0
- package/dist/chunk-55TDVDPG.js +58 -0
- package/dist/chunk-55TDVDPG.js.map +1 -0
- package/dist/chunk-56BJLFW7.js +26 -0
- package/dist/chunk-56BJLFW7.js.map +1 -0
- package/dist/chunk-5HOQLE6Y.js +35 -0
- package/dist/chunk-5HOQLE6Y.js.map +1 -0
- package/dist/chunk-5TY3NYF5.js +144 -0
- package/dist/chunk-5TY3NYF5.js.map +1 -0
- package/dist/chunk-5VOSCJKQ.js +92 -0
- package/dist/chunk-5VOSCJKQ.js.map +1 -0
- package/dist/chunk-65NVO6TK.js +171 -0
- package/dist/chunk-65NVO6TK.js.map +1 -0
- package/dist/chunk-6A5TPCKP.js +64 -0
- package/dist/chunk-6A5TPCKP.js.map +1 -0
- package/dist/chunk-6CO4LEXZ.js +41 -0
- package/dist/chunk-6CO4LEXZ.js.map +1 -0
- package/dist/chunk-6FVUPNPG.js +56 -0
- package/dist/chunk-6FVUPNPG.js.map +1 -0
- package/dist/chunk-76YWTIWK.js +106 -0
- package/dist/chunk-76YWTIWK.js.map +1 -0
- package/dist/chunk-7EI7424P.js +78 -0
- package/dist/chunk-7EI7424P.js.map +1 -0
- package/dist/chunk-AHTVYOPQ.js +26 -0
- package/dist/chunk-AHTVYOPQ.js.map +1 -0
- package/dist/chunk-AJTJNHKK.js +85 -0
- package/dist/chunk-AJTJNHKK.js.map +1 -0
- package/dist/chunk-AMT3CPMC.js +155 -0
- package/dist/chunk-AMT3CPMC.js.map +1 -0
- package/dist/chunk-AX5EH73R.js +59 -0
- package/dist/chunk-AX5EH73R.js.map +1 -0
- package/dist/chunk-B3VAJSZ2.js +35 -0
- package/dist/chunk-B3VAJSZ2.js.map +1 -0
- package/dist/chunk-B4CQMQ64.js +25 -0
- package/dist/chunk-B4CQMQ64.js.map +1 -0
- package/dist/chunk-BMRZXT5T.js +115 -0
- package/dist/chunk-BMRZXT5T.js.map +1 -0
- package/dist/chunk-BYZ6OFH4.js +73 -0
- package/dist/chunk-BYZ6OFH4.js.map +1 -0
- package/dist/chunk-C55VUQ7N.js +156 -0
- package/dist/chunk-C55VUQ7N.js.map +1 -0
- package/dist/chunk-D4GEAV4C.js +91 -0
- package/dist/chunk-D4GEAV4C.js.map +1 -0
- package/dist/chunk-DC43CHAM.js +152 -0
- package/dist/chunk-DC43CHAM.js.map +1 -0
- package/dist/chunk-DKCRLN35.js +92 -0
- package/dist/chunk-DKCRLN35.js.map +1 -0
- package/dist/chunk-DN5BUDBI.js +86 -0
- package/dist/chunk-DN5BUDBI.js.map +1 -0
- package/dist/chunk-DOLKDYMS.js +88 -0
- package/dist/chunk-DOLKDYMS.js.map +1 -0
- package/dist/chunk-DW34WXCG.js +28 -0
- package/dist/chunk-DW34WXCG.js.map +1 -0
- package/dist/chunk-DZAAKHGZ.js +135 -0
- package/dist/chunk-DZAAKHGZ.js.map +1 -0
- package/dist/chunk-E4IRSSHO.js +116 -0
- package/dist/chunk-E4IRSSHO.js.map +1 -0
- package/dist/chunk-E67WQXBV.js +104 -0
- package/dist/chunk-E67WQXBV.js.map +1 -0
- package/dist/chunk-EG6IHP3H.js +128 -0
- package/dist/chunk-EG6IHP3H.js.map +1 -0
- package/dist/chunk-EO7LOXG2.js +82 -0
- package/dist/chunk-EO7LOXG2.js.map +1 -0
- package/dist/chunk-EWDN56AS.js +24 -0
- package/dist/chunk-EWDN56AS.js.map +1 -0
- package/dist/chunk-F5P5P2SC.js +141 -0
- package/dist/chunk-F5P5P2SC.js.map +1 -0
- package/dist/chunk-FAWPRZTM.js +79 -0
- package/dist/chunk-FAWPRZTM.js.map +1 -0
- package/dist/chunk-FGYJ2WPX.js +36 -0
- package/dist/chunk-FGYJ2WPX.js.map +1 -0
- package/dist/chunk-GBG3I5I5.js +46 -0
- package/dist/chunk-GBG3I5I5.js.map +1 -0
- package/dist/chunk-GDMCDW66.js +19 -0
- package/dist/chunk-GDMCDW66.js.map +1 -0
- package/dist/chunk-H6HSQCOW.js +80 -0
- package/dist/chunk-H6HSQCOW.js.map +1 -0
- package/dist/chunk-HDM4RCIF.js +111 -0
- package/dist/chunk-HDM4RCIF.js.map +1 -0
- package/dist/chunk-HNTOGGVD.js +77 -0
- package/dist/chunk-HNTOGGVD.js.map +1 -0
- package/dist/chunk-HQW2ABO4.js +28 -0
- package/dist/chunk-HQW2ABO4.js.map +1 -0
- package/dist/chunk-HRDRGZ2Y.js +76 -0
- package/dist/chunk-HRDRGZ2Y.js.map +1 -0
- package/dist/chunk-HUOVA7SF.js +83 -0
- package/dist/chunk-HUOVA7SF.js.map +1 -0
- package/dist/chunk-ITA3SNOR.js +133 -0
- package/dist/chunk-ITA3SNOR.js.map +1 -0
- package/dist/chunk-IYNUPG2G.js +61 -0
- package/dist/chunk-IYNUPG2G.js.map +1 -0
- package/dist/chunk-JJ65ZI4P.js +199 -0
- package/dist/chunk-JJ65ZI4P.js.map +1 -0
- package/dist/chunk-JRBGZ6NI.js +106 -0
- package/dist/chunk-JRBGZ6NI.js.map +1 -0
- package/dist/chunk-K45OO62F.js +108 -0
- package/dist/chunk-K45OO62F.js.map +1 -0
- package/dist/chunk-KDTKA667.js +67 -0
- package/dist/chunk-KDTKA667.js.map +1 -0
- package/dist/chunk-KI7KZBSN.js +142 -0
- package/dist/chunk-KI7KZBSN.js.map +1 -0
- package/dist/chunk-KOJ7XOPZ.js +87 -0
- package/dist/chunk-KOJ7XOPZ.js.map +1 -0
- package/dist/chunk-KQTHJ22B.js +82 -0
- package/dist/chunk-KQTHJ22B.js.map +1 -0
- package/dist/chunk-KRC43RZR.js +77 -0
- package/dist/chunk-KRC43RZR.js.map +1 -0
- package/dist/chunk-LJQOEGQ2.js +116 -0
- package/dist/chunk-LJQOEGQ2.js.map +1 -0
- package/dist/chunk-LKRNUSKZ.js +149 -0
- package/dist/chunk-LKRNUSKZ.js.map +1 -0
- package/dist/chunk-LLL7QQ52.js +76 -0
- package/dist/chunk-LLL7QQ52.js.map +1 -0
- package/dist/chunk-LQ4B5X4Y.js +56 -0
- package/dist/chunk-LQ4B5X4Y.js.map +1 -0
- package/dist/chunk-M3FSLEHQ.js +76 -0
- package/dist/chunk-M3FSLEHQ.js.map +1 -0
- package/dist/chunk-M5G3O6H6.js +57 -0
- package/dist/chunk-M5G3O6H6.js.map +1 -0
- package/dist/chunk-M6JIC5PU.js +81 -0
- package/dist/chunk-M6JIC5PU.js.map +1 -0
- package/dist/chunk-N2HJ3SLS.js +186 -0
- package/dist/chunk-N2HJ3SLS.js.map +1 -0
- package/dist/chunk-NGZWBFTP.js +45 -0
- package/dist/chunk-NGZWBFTP.js.map +1 -0
- package/dist/chunk-OAKCXT35.js +34 -0
- package/dist/chunk-OAKCXT35.js.map +1 -0
- package/dist/chunk-OSD3U3HT.js +54 -0
- package/dist/chunk-OSD3U3HT.js.map +1 -0
- package/dist/chunk-OUXESQ2R.js +42 -0
- package/dist/chunk-OUXESQ2R.js.map +1 -0
- package/dist/chunk-OY2LJHMJ.js +43 -0
- package/dist/chunk-OY2LJHMJ.js.map +1 -0
- package/dist/chunk-OYEZR4CN.js +221 -0
- package/dist/chunk-OYEZR4CN.js.map +1 -0
- package/dist/chunk-P57HUMAE.js +66 -0
- package/dist/chunk-P57HUMAE.js.map +1 -0
- package/dist/chunk-P6Y2PI6L.js +82 -0
- package/dist/chunk-P6Y2PI6L.js.map +1 -0
- package/dist/chunk-PA7TDXUQ.js +51 -0
- package/dist/chunk-PA7TDXUQ.js.map +1 -0
- package/dist/chunk-PPBGGNPV.js +112 -0
- package/dist/chunk-PPBGGNPV.js.map +1 -0
- package/dist/chunk-PRH4HKND.js +48 -0
- package/dist/chunk-PRH4HKND.js.map +1 -0
- package/dist/chunk-PSPAZJUQ.js +32 -0
- package/dist/chunk-PSPAZJUQ.js.map +1 -0
- package/dist/chunk-Q5G5CGZ2.js +170 -0
- package/dist/chunk-Q5G5CGZ2.js.map +1 -0
- package/dist/chunk-QDAF3LP7.js +89 -0
- package/dist/chunk-QDAF3LP7.js.map +1 -0
- package/dist/chunk-QGVIGNJ3.js +37 -0
- package/dist/chunk-QGVIGNJ3.js.map +1 -0
- package/dist/chunk-QNUITYSY.js +68 -0
- package/dist/chunk-QNUITYSY.js.map +1 -0
- package/dist/chunk-QSWVN3RT.js +116 -0
- package/dist/chunk-QSWVN3RT.js.map +1 -0
- package/dist/chunk-QTLQZ7OJ.js +110 -0
- package/dist/chunk-QTLQZ7OJ.js.map +1 -0
- package/dist/chunk-QYAMLIG2.js +84 -0
- package/dist/chunk-QYAMLIG2.js.map +1 -0
- package/dist/chunk-REILH4XF.js +128 -0
- package/dist/chunk-REILH4XF.js.map +1 -0
- package/dist/chunk-S6SSK6QX.js +80 -0
- package/dist/chunk-S6SSK6QX.js.map +1 -0
- package/dist/chunk-SA7ED3PN.js +68 -0
- package/dist/chunk-SA7ED3PN.js.map +1 -0
- package/dist/chunk-SIJOEM4N.js +55 -0
- package/dist/chunk-SIJOEM4N.js.map +1 -0
- package/dist/chunk-SLOKAAH2.js +70 -0
- package/dist/chunk-SLOKAAH2.js.map +1 -0
- package/dist/chunk-TR6NPSMX.js +85 -0
- package/dist/chunk-TR6NPSMX.js.map +1 -0
- package/dist/chunk-TSZ5DEAT.js +106 -0
- package/dist/chunk-TSZ5DEAT.js.map +1 -0
- package/dist/chunk-TUNVF45W.js +127 -0
- package/dist/chunk-TUNVF45W.js.map +1 -0
- package/dist/chunk-TXOBNSQ5.js +63 -0
- package/dist/chunk-TXOBNSQ5.js.map +1 -0
- package/dist/chunk-U44DRLMM.js +88 -0
- package/dist/chunk-U44DRLMM.js.map +1 -0
- package/dist/chunk-U4THNRV5.js +114 -0
- package/dist/chunk-U4THNRV5.js.map +1 -0
- package/dist/chunk-UAZOFC4W.js +72 -0
- package/dist/chunk-UAZOFC4W.js.map +1 -0
- package/dist/chunk-UGKI466V.js +12 -0
- package/dist/chunk-UGKI466V.js.map +1 -0
- package/dist/chunk-VM4RMQQN.js +11 -0
- package/dist/chunk-VM4RMQQN.js.map +1 -0
- package/dist/chunk-VQ37VLAS.js +54 -0
- package/dist/chunk-VQ37VLAS.js.map +1 -0
- package/dist/chunk-VT7VSYH5.js +73 -0
- package/dist/chunk-VT7VSYH5.js.map +1 -0
- package/dist/chunk-VTIRUCLZ.js +57 -0
- package/dist/chunk-VTIRUCLZ.js.map +1 -0
- package/dist/chunk-VVBAEYKI.js +202 -0
- package/dist/chunk-VVBAEYKI.js.map +1 -0
- package/dist/chunk-WHFIQUCC.js +120 -0
- package/dist/chunk-WHFIQUCC.js.map +1 -0
- package/dist/chunk-WPSESV5Z.js +74 -0
- package/dist/chunk-WPSESV5Z.js.map +1 -0
- package/dist/chunk-WXEXCHEN.js +51 -0
- package/dist/chunk-WXEXCHEN.js.map +1 -0
- package/dist/chunk-X2DDPD3D.js +113 -0
- package/dist/chunk-X2DDPD3D.js.map +1 -0
- package/dist/chunk-X7VIMKLD.js +127 -0
- package/dist/chunk-X7VIMKLD.js.map +1 -0
- package/dist/chunk-XJ3EG6XY.js +30 -0
- package/dist/chunk-XJ3EG6XY.js.map +1 -0
- package/dist/chunk-XOT5HWSF.js +23 -0
- package/dist/chunk-XOT5HWSF.js.map +1 -0
- package/dist/chunk-Y72IP43U.js +117 -0
- package/dist/chunk-Y72IP43U.js.map +1 -0
- package/dist/chunk-YD6FLXBV.js +61 -0
- package/dist/chunk-YD6FLXBV.js.map +1 -0
- package/dist/chunk-YEQQGYYO.js +1022 -0
- package/dist/chunk-YEQQGYYO.js.map +1 -0
- package/dist/chunk-YYW6AEIT.js +46 -0
- package/dist/chunk-YYW6AEIT.js.map +1 -0
- package/dist/chunk-ZEVGXKRU.js +104 -0
- package/dist/chunk-ZEVGXKRU.js.map +1 -0
- package/dist/chunk-ZKSMMLDP.js +74 -0
- package/dist/chunk-ZKSMMLDP.js.map +1 -0
- package/dist/chunk-ZU6IM6PK.js +101 -0
- package/dist/chunk-ZU6IM6PK.js.map +1 -0
- package/dist/chunk-ZUS5KZGO.js +714 -0
- package/dist/chunk-ZUS5KZGO.js.map +1 -0
- package/dist/chunk-ZVS2GOT2.js +58 -0
- package/dist/chunk-ZVS2GOT2.js.map +1 -0
- package/dist/chunk-ZXPDS6DH.js +3 -0
- package/dist/chunk-ZXPDS6DH.js.map +1 -0
- package/dist/chunk-ZZQQJX5Z.js +173 -0
- package/dist/chunk-ZZQQJX5Z.js.map +1 -0
- package/dist/components.css +2 -0
- package/dist/composites/account-menu/index.js +6 -0
- package/dist/composites/account-menu/index.js.map +1 -0
- package/dist/composites/agent-composer/index.js +7 -0
- package/dist/composites/agent-composer/index.js.map +1 -0
- package/dist/composites/agent-editor/index.js +10 -0
- package/dist/composites/agent-editor/index.js.map +1 -0
- package/dist/composites/agent-stream/index.js +12 -0
- package/dist/composites/agent-stream/index.js.map +1 -0
- package/dist/composites/agent-timeline/index.js +5 -0
- package/dist/composites/agent-timeline/index.js.map +1 -0
- package/dist/composites/approval-card/index.js +5 -0
- package/dist/composites/approval-card/index.js.map +1 -0
- package/dist/composites/chat-composer/index.js +6 -0
- package/dist/composites/chat-composer/index.js.map +1 -0
- package/dist/composites/chat-message/index.js +6 -0
- package/dist/composites/chat-message/index.js.map +1 -0
- package/dist/composites/code-block/index.js +5 -0
- package/dist/composites/code-block/index.js.map +1 -0
- package/dist/composites/command-palette/index.js +5 -0
- package/dist/composites/command-palette/index.js.map +1 -0
- package/dist/composites/confirm-dialog/index.js +7 -0
- package/dist/composites/confirm-dialog/index.js.map +1 -0
- package/dist/composites/cron-jobs-list/index.js +5 -0
- package/dist/composites/cron-jobs-list/index.js.map +1 -0
- package/dist/composites/data-table/index.js +10 -0
- package/dist/composites/data-table/index.js.map +1 -0
- package/dist/composites/deployment-row/index.js +5 -0
- package/dist/composites/deployment-row/index.js.map +1 -0
- package/dist/composites/domain-config/index.js +7 -0
- package/dist/composites/domain-config/index.js.map +1 -0
- package/dist/composites/env-var-editor/index.js +7 -0
- package/dist/composites/env-var-editor/index.js.map +1 -0
- package/dist/composites/mcp-server-list/index.js +5 -0
- package/dist/composites/mcp-server-list/index.js.map +1 -0
- package/dist/composites/page-shell/index.js +7 -0
- package/dist/composites/page-shell/index.js.map +1 -0
- package/dist/composites/permission-modal/index.js +6 -0
- package/dist/composites/permission-modal/index.js.map +1 -0
- package/dist/composites/preview-env-card/index.js +6 -0
- package/dist/composites/preview-env-card/index.js.map +1 -0
- package/dist/composites/preview-panel/index.js +5 -0
- package/dist/composites/preview-panel/index.js.map +1 -0
- package/dist/composites/project-card/index.js +6 -0
- package/dist/composites/project-card/index.js.map +1 -0
- package/dist/composites/rollback-ui/index.js +6 -0
- package/dist/composites/rollback-ui/index.js.map +1 -0
- package/dist/composites/rule-editor/index.js +11 -0
- package/dist/composites/rule-editor/index.js.map +1 -0
- package/dist/composites/skill-editor/index.js +11 -0
- package/dist/composites/skill-editor/index.js.map +1 -0
- package/dist/composites/skills-list/index.js +5 -0
- package/dist/composites/skills-list/index.js.map +1 -0
- package/dist/composites/stability-bundle-viewer/index.js +4 -0
- package/dist/composites/stability-bundle-viewer/index.js.map +1 -0
- package/dist/composites/task-header/index.js +5 -0
- package/dist/composites/task-header/index.js.map +1 -0
- package/dist/composites/usage-meter/index.js +5 -0
- package/dist/composites/usage-meter/index.js.map +1 -0
- package/dist/fonts/LICENSE-GEIST.txt +92 -0
- package/dist/fonts/geist-400.woff2 +0 -0
- package/dist/fonts/geist-500.woff2 +0 -0
- package/dist/fonts/geist-600.woff2 +0 -0
- package/dist/fonts/geist-mono-400.woff2 +0 -0
- package/dist/fonts/geist-mono-500.woff2 +0 -0
- package/dist/fonts/geist-mono-600.woff2 +0 -0
- package/dist/fonts-cdn.css +28 -0
- package/dist/fonts.css +75 -0
- package/dist/index.d.ts +4621 -0
- package/dist/index.js +1338 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin-D5xmXqYb.d.ts +172 -0
- package/dist/preset-v3-legacy.d.ts +35 -0
- package/dist/preset-v3-legacy.js +159 -0
- package/dist/preset-v3-legacy.js.map +1 -0
- package/dist/preset.css +27 -0
- package/dist/primitives/action-bar/index.js +4 -0
- package/dist/primitives/action-bar/index.js.map +1 -0
- package/dist/primitives/agent-error-card/index.js +5 -0
- package/dist/primitives/agent-error-card/index.js.map +1 -0
- package/dist/primitives/agent-event/index.js +4 -0
- package/dist/primitives/agent-event/index.js.map +1 -0
- package/dist/primitives/agent-handoff/index.js +4 -0
- package/dist/primitives/agent-handoff/index.js.map +1 -0
- package/dist/primitives/agent-profile/index.js +4 -0
- package/dist/primitives/agent-profile/index.js.map +1 -0
- package/dist/primitives/agent-starting-state/index.js +5 -0
- package/dist/primitives/agent-starting-state/index.js.map +1 -0
- package/dist/primitives/agent-streaming/index.js +5 -0
- package/dist/primitives/agent-streaming/index.js.map +1 -0
- package/dist/primitives/alert/index.js +4 -0
- package/dist/primitives/alert/index.js.map +1 -0
- package/dist/primitives/artifact-preview/index.js +4 -0
- package/dist/primitives/artifact-preview/index.js.map +1 -0
- package/dist/primitives/attachment-chip/index.js +4 -0
- package/dist/primitives/attachment-chip/index.js.map +1 -0
- package/dist/primitives/audit-log-entry/index.js +4 -0
- package/dist/primitives/audit-log-entry/index.js.map +1 -0
- package/dist/primitives/auto-compact-notice/index.js +5 -0
- package/dist/primitives/auto-compact-notice/index.js.map +1 -0
- package/dist/primitives/avatar/index.js +4 -0
- package/dist/primitives/avatar/index.js.map +1 -0
- package/dist/primitives/badge/index.js +4 -0
- package/dist/primitives/badge/index.js.map +1 -0
- package/dist/primitives/branch-indicator/index.js +4 -0
- package/dist/primitives/branch-indicator/index.js.map +1 -0
- package/dist/primitives/browser-controls/index.js +4 -0
- package/dist/primitives/browser-controls/index.js.map +1 -0
- package/dist/primitives/build-log-stream/index.js +5 -0
- package/dist/primitives/build-log-stream/index.js.map +1 -0
- package/dist/primitives/button/index.js +4 -0
- package/dist/primitives/button/index.js.map +1 -0
- package/dist/primitives/capability-indicator/index.js +4 -0
- package/dist/primitives/capability-indicator/index.js.map +1 -0
- package/dist/primitives/card/index.js +4 -0
- package/dist/primitives/card/index.js.map +1 -0
- package/dist/primitives/channel-card/index.js +4 -0
- package/dist/primitives/channel-card/index.js.map +1 -0
- package/dist/primitives/chat-thread/index.js +5 -0
- package/dist/primitives/chat-thread/index.js.map +1 -0
- package/dist/primitives/checkbox/index.js +4 -0
- package/dist/primitives/checkbox/index.js.map +1 -0
- package/dist/primitives/context-card/index.js +4 -0
- package/dist/primitives/context-card/index.js.map +1 -0
- package/dist/primitives/context-window-bar/index.js +4 -0
- package/dist/primitives/context-window-bar/index.js.map +1 -0
- package/dist/primitives/copy-button/index.js +4 -0
- package/dist/primitives/copy-button/index.js.map +1 -0
- package/dist/primitives/cost-meter/index.js +4 -0
- package/dist/primitives/cost-meter/index.js.map +1 -0
- package/dist/primitives/created-files-card/index.js +4 -0
- package/dist/primitives/created-files-card/index.js.map +1 -0
- package/dist/primitives/cron-job-card/index.js +4 -0
- package/dist/primitives/cron-job-card/index.js.map +1 -0
- package/dist/primitives/danger-zone/index.js +4 -0
- package/dist/primitives/danger-zone/index.js.map +1 -0
- package/dist/primitives/dialog/index.js +4 -0
- package/dist/primitives/dialog/index.js.map +1 -0
- package/dist/primitives/diff-viewer/index.js +4 -0
- package/dist/primitives/diff-viewer/index.js.map +1 -0
- package/dist/primitives/dropdown-menu/index.js +4 -0
- package/dist/primitives/dropdown-menu/index.js.map +1 -0
- package/dist/primitives/empty-state/index.js +4 -0
- package/dist/primitives/empty-state/index.js.map +1 -0
- package/dist/primitives/export-chat-dialog/index.js +4 -0
- package/dist/primitives/export-chat-dialog/index.js.map +1 -0
- package/dist/primitives/folder-context-card/index.js +4 -0
- package/dist/primitives/folder-context-card/index.js.map +1 -0
- package/dist/primitives/folder-selector/index.js +4 -0
- package/dist/primitives/folder-selector/index.js.map +1 -0
- package/dist/primitives/form-field/index.js +4 -0
- package/dist/primitives/form-field/index.js.map +1 -0
- package/dist/primitives/gateway-status-indicator/index.js +4 -0
- package/dist/primitives/gateway-status-indicator/index.js.map +1 -0
- package/dist/primitives/hook-config/index.js +4 -0
- package/dist/primitives/hook-config/index.js.map +1 -0
- package/dist/primitives/hook-event-log/index.js +4 -0
- package/dist/primitives/hook-event-log/index.js.map +1 -0
- package/dist/primitives/input/index.js +4 -0
- package/dist/primitives/input/index.js.map +1 -0
- package/dist/primitives/intent-selector/index.js +4 -0
- package/dist/primitives/intent-selector/index.js.map +1 -0
- package/dist/primitives/label/index.js +4 -0
- package/dist/primitives/label/index.js.map +1 -0
- package/dist/primitives/lane-board/index.js +4 -0
- package/dist/primitives/lane-board/index.js.map +1 -0
- package/dist/primitives/login-split/index.js +4 -0
- package/dist/primitives/login-split/index.js.map +1 -0
- package/dist/primitives/mcp-server-card/index.js +4 -0
- package/dist/primitives/mcp-server-card/index.js.map +1 -0
- package/dist/primitives/memory-editor/index.js +4 -0
- package/dist/primitives/memory-editor/index.js.map +1 -0
- package/dist/primitives/mention-menu/index.js +4 -0
- package/dist/primitives/mention-menu/index.js.map +1 -0
- package/dist/primitives/metrics-panel/index.js +4 -0
- package/dist/primitives/metrics-panel/index.js.map +1 -0
- package/dist/primitives/model-card/index.js +4 -0
- package/dist/primitives/model-card/index.js.map +1 -0
- package/dist/primitives/model-selector/index.js +4 -0
- package/dist/primitives/model-selector/index.js.map +1 -0
- package/dist/primitives/pagination/index.js +4 -0
- package/dist/primitives/pagination/index.js.map +1 -0
- package/dist/primitives/permission-matrix/index.js +4 -0
- package/dist/primitives/permission-matrix/index.js.map +1 -0
- package/dist/primitives/pin-input/index.js +4 -0
- package/dist/primitives/pin-input/index.js.map +1 -0
- package/dist/primitives/plan-badge/index.js +4 -0
- package/dist/primitives/plan-badge/index.js.map +1 -0
- package/dist/primitives/progress/index.js +4 -0
- package/dist/primitives/progress/index.js.map +1 -0
- package/dist/primitives/progress-checklist/index.js +4 -0
- package/dist/primitives/progress-checklist/index.js.map +1 -0
- package/dist/primitives/project-switcher/index.js +4 -0
- package/dist/primitives/project-switcher/index.js.map +1 -0
- package/dist/primitives/quick-action-chips/index.js +4 -0
- package/dist/primitives/quick-action-chips/index.js.map +1 -0
- package/dist/primitives/radio-group/index.js +4 -0
- package/dist/primitives/radio-group/index.js.map +1 -0
- package/dist/primitives/recent-folders-list/index.js +4 -0
- package/dist/primitives/recent-folders-list/index.js.map +1 -0
- package/dist/primitives/rule-card/index.js +4 -0
- package/dist/primitives/rule-card/index.js.map +1 -0
- package/dist/primitives/run-stats/index.js +4 -0
- package/dist/primitives/run-stats/index.js.map +1 -0
- package/dist/primitives/run-status-pill/index.js +4 -0
- package/dist/primitives/run-status-pill/index.js.map +1 -0
- package/dist/primitives/running-tasks-panel/index.js +4 -0
- package/dist/primitives/running-tasks-panel/index.js.map +1 -0
- package/dist/primitives/scroll-area/index.js +4 -0
- package/dist/primitives/scroll-area/index.js.map +1 -0
- package/dist/primitives/select/index.js +4 -0
- package/dist/primitives/select/index.js.map +1 -0
- package/dist/primitives/session-list-item/index.js +4 -0
- package/dist/primitives/session-list-item/index.js.map +1 -0
- package/dist/primitives/session-timeline/index.js +4 -0
- package/dist/primitives/session-timeline/index.js.map +1 -0
- package/dist/primitives/sheet/index.js +4 -0
- package/dist/primitives/sheet/index.js.map +1 -0
- package/dist/primitives/sidebar/index.js +4 -0
- package/dist/primitives/sidebar/index.js.map +1 -0
- package/dist/primitives/skeleton/index.js +5 -0
- package/dist/primitives/skeleton/index.js.map +1 -0
- package/dist/primitives/skill-card/index.js +4 -0
- package/dist/primitives/skill-card/index.js.map +1 -0
- package/dist/primitives/social-auth-row/index.js +4 -0
- package/dist/primitives/social-auth-row/index.js.map +1 -0
- package/dist/primitives/stat-tile/index.js +4 -0
- package/dist/primitives/stat-tile/index.js.map +1 -0
- package/dist/primitives/status-dot/index.js +4 -0
- package/dist/primitives/status-dot/index.js.map +1 -0
- package/dist/primitives/steps-rail/index.js +4 -0
- package/dist/primitives/steps-rail/index.js.map +1 -0
- package/dist/primitives/sub-agent-dispatch/index.js +4 -0
- package/dist/primitives/sub-agent-dispatch/index.js.map +1 -0
- package/dist/primitives/switch/index.js +4 -0
- package/dist/primitives/switch/index.js.map +1 -0
- package/dist/primitives/system-prompt-editor/index.js +4 -0
- package/dist/primitives/system-prompt-editor/index.js.map +1 -0
- package/dist/primitives/table/index.js +4 -0
- package/dist/primitives/table/index.js.map +1 -0
- package/dist/primitives/tabs/index.js +4 -0
- package/dist/primitives/tabs/index.js.map +1 -0
- package/dist/primitives/task-plan/index.js +4 -0
- package/dist/primitives/task-plan/index.js.map +1 -0
- package/dist/primitives/terminal-panel/index.js +5 -0
- package/dist/primitives/terminal-panel/index.js.map +1 -0
- package/dist/primitives/textarea/index.js +4 -0
- package/dist/primitives/textarea/index.js.map +1 -0
- package/dist/primitives/thinking-level-selector/index.js +4 -0
- package/dist/primitives/thinking-level-selector/index.js.map +1 -0
- package/dist/primitives/timestamp/index.js +4 -0
- package/dist/primitives/timestamp/index.js.map +1 -0
- package/dist/primitives/toast/index.js +4 -0
- package/dist/primitives/toast/index.js.map +1 -0
- package/dist/primitives/token-usage-chart/index.js +4 -0
- package/dist/primitives/token-usage-chart/index.js.map +1 -0
- package/dist/primitives/tool-call/index.js +4 -0
- package/dist/primitives/tool-call/index.js.map +1 -0
- package/dist/primitives/tool-call-card/index.js +4 -0
- package/dist/primitives/tool-call-card/index.js.map +1 -0
- package/dist/primitives/tool-result/index.js +4 -0
- package/dist/primitives/tool-result/index.js.map +1 -0
- package/dist/primitives/tools-list/index.js +4 -0
- package/dist/primitives/tools-list/index.js.map +1 -0
- package/dist/primitives/tooltip/index.js +4 -0
- package/dist/primitives/tooltip/index.js.map +1 -0
- package/dist/primitives/topnav/index.js +4 -0
- package/dist/primitives/topnav/index.js.map +1 -0
- package/dist/primitives/update-banner/index.js +4 -0
- package/dist/primitives/update-banner/index.js.map +1 -0
- package/dist/slide/index.d.ts +212 -0
- package/dist/slide/index.js +3 -0
- package/dist/slide/index.js.map +1 -0
- package/dist/slide/plugins/emoji/index.d.ts +29 -0
- package/dist/slide/plugins/emoji/index.js +157 -0
- package/dist/slide/plugins/emoji/index.js.map +1 -0
- package/dist/slide/plugins/math/index.d.ts +13 -0
- package/dist/slide/plugins/math/index.js +145 -0
- package/dist/slide/plugins/math/index.js.map +1 -0
- package/dist/slide/plugins/mermaid/index.d.ts +55 -0
- package/dist/slide/plugins/mermaid/index.js +218 -0
- package/dist/slide/plugins/mermaid/index.js.map +1 -0
- package/dist/slide/plugins/shiki/index.d.ts +18 -0
- package/dist/slide/plugins/shiki/index.js +87 -0
- package/dist/slide/plugins/shiki/index.js.map +1 -0
- package/dist/slide/themes/default.css +256 -0
- package/dist/slide/themes/layouts.css +143 -0
- package/dist/slide/themes/violet-forge.css +256 -0
- package/dist/slide-deck/index.css +52 -0
- package/dist/slide-deck/index.css.map +1 -0
- package/dist/slide-deck/index.d.ts +377 -0
- package/dist/slide-deck/index.js +1111 -0
- package/dist/slide-deck/index.js.map +1 -0
- package/dist/styles-v3-legacy.css +88 -0
- package/dist/styles.css +137 -0
- package/dist/tokens-v4.css +187 -0
- package/dist/tokens.css +230 -0
- package/dist/vite-plugin.d.ts +29 -0
- package/dist/vite-plugin.js +76 -0
- package/dist/vite-plugin.js.map +1 -0
- package/dist/whiteboard/index.d.ts +258 -0
- package/dist/whiteboard/index.js +738 -0
- package/dist/whiteboard/index.js.map +1 -0
- package/llms.txt +273 -0
- package/package.json +800 -0
- package/registry/index.json +856 -0
- package/registry/r/account-menu.json +24 -0
- package/registry/r/action-bar.json +22 -0
- package/registry/r/agent-composer.json +22 -0
- package/registry/r/agent-editor.json +27 -0
- package/registry/r/agent-error-card.json +22 -0
- package/registry/r/agent-event.json +24 -0
- package/registry/r/agent-handoff.json +22 -0
- package/registry/r/agent-profile.json +23 -0
- package/registry/r/agent-starting-state.json +22 -0
- package/registry/r/agent-stream.json +27 -0
- package/registry/r/agent-streaming.json +22 -0
- package/registry/r/agent-timeline.json +22 -0
- package/registry/r/agent-types.json +15 -0
- package/registry/r/alert.json +22 -0
- package/registry/r/approval-card.json +25 -0
- package/registry/r/artifact-preview.json +22 -0
- package/registry/r/attachment-chip.json +24 -0
- package/registry/r/audit-log-entry.json +23 -0
- package/registry/r/auto-compact-notice.json +22 -0
- package/registry/r/avatar.json +23 -0
- package/registry/r/badge.json +22 -0
- package/registry/r/browser-controls.json +22 -0
- package/registry/r/build-log-stream.json +19 -0
- package/registry/r/button.json +23 -0
- package/registry/r/capability-indicator.json +23 -0
- package/registry/r/card.json +22 -0
- package/registry/r/chat-composer.json +23 -0
- package/registry/r/chat-message.json +129 -0
- package/registry/r/chat-thread.json +20 -0
- package/registry/r/chat-types.json +15 -0
- package/registry/r/checkbox.json +24 -0
- package/registry/r/cn.json +19 -0
- package/registry/r/code-block.json +21 -0
- package/registry/r/command-palette.json +25 -0
- package/registry/r/confirm-dialog.json +25 -0
- package/registry/r/context-card.json +23 -0
- package/registry/r/context-window-bar.json +20 -0
- package/registry/r/copy-button.json +22 -0
- package/registry/r/cost-meter.json +22 -0
- package/registry/r/created-files-card.json +23 -0
- package/registry/r/cron-job-card.json +22 -0
- package/registry/r/cron-jobs-list.json +23 -0
- package/registry/r/danger-zone.json +20 -0
- package/registry/r/data-table.json +27 -0
- package/registry/r/deployment-row.json +23 -0
- package/registry/r/dialog.json +23 -0
- package/registry/r/diff-viewer.json +20 -0
- package/registry/r/domain-config.json +25 -0
- package/registry/r/dropdown-menu.json +23 -0
- package/registry/r/empty-state.json +20 -0
- package/registry/r/env-var-editor.json +25 -0
- package/registry/r/folder-context-card.json +23 -0
- package/registry/r/folder-selector.json +22 -0
- package/registry/r/form-field.json +23 -0
- package/registry/r/hook-config.json +22 -0
- package/registry/r/hook-event-log.json +22 -0
- package/registry/r/input.json +22 -0
- package/registry/r/intent-selector.json +24 -0
- package/registry/r/label.json +22 -0
- package/registry/r/lane-board.json +20 -0
- package/registry/r/live-region-context.json +16 -0
- package/registry/r/login-split.json +20 -0
- package/registry/r/mcp-server-card.json +22 -0
- package/registry/r/mcp-server-list.json +23 -0
- package/registry/r/memory-editor.json +23 -0
- package/registry/r/mention-menu.json +23 -0
- package/registry/r/metrics-panel.json +22 -0
- package/registry/r/mode-types.json +15 -0
- package/registry/r/model-card.json +23 -0
- package/registry/r/model-selector.json +23 -0
- package/registry/r/page-shell.json +25 -0
- package/registry/r/pagination.json +22 -0
- package/registry/r/permission-matrix.json +22 -0
- package/registry/r/permission-modal.json +24 -0
- package/registry/r/permission-types.json +15 -0
- package/registry/r/pin-input.json +20 -0
- package/registry/r/plan-badge.json +20 -0
- package/registry/r/preview-env-card.json +25 -0
- package/registry/r/preview-panel.json +21 -0
- package/registry/r/progress-checklist.json +23 -0
- package/registry/r/progress.json +20 -0
- package/registry/r/project-card.json +25 -0
- package/registry/r/project-switcher.json +22 -0
- package/registry/r/quick-action-chips.json +21 -0
- package/registry/r/radio-group.json +23 -0
- package/registry/r/recent-folders-list.json +22 -0
- package/registry/r/rollback-ui.json +24 -0
- package/registry/r/rule-card.json +23 -0
- package/registry/r/rule-editor.json +28 -0
- package/registry/r/rule-types.json +18 -0
- package/registry/r/run-stats.json +22 -0
- package/registry/r/running-tasks-panel.json +22 -0
- package/registry/r/safe-href.json +16 -0
- package/registry/r/scroll-area.json +22 -0
- package/registry/r/select.json +24 -0
- package/registry/r/session-list-item.json +20 -0
- package/registry/r/session-timeline.json +22 -0
- package/registry/r/sheet.json +24 -0
- package/registry/r/sidebar.json +19 -0
- package/registry/r/skeleton.json +19 -0
- package/registry/r/skill-card.json +24 -0
- package/registry/r/skill-editor.json +28 -0
- package/registry/r/skills-list.json +23 -0
- package/registry/r/slide-deck.json +130 -0
- package/registry/r/slide-plugin-emoji.json +28 -0
- package/registry/r/slide-plugin-math.json +24 -0
- package/registry/r/slide-plugin-mermaid.json +23 -0
- package/registry/r/slide-plugin-shiki.json +23 -0
- package/registry/r/slide.json +123 -0
- package/registry/r/social-auth-row.json +21 -0
- package/registry/r/stat-tile.json +22 -0
- package/registry/r/status-dot.json +20 -0
- package/registry/r/steps-rail.json +20 -0
- package/registry/r/sub-agent-dispatch.json +22 -0
- package/registry/r/switch.json +23 -0
- package/registry/r/system-prompt-editor.json +22 -0
- package/registry/r/table.json +22 -0
- package/registry/r/tabs.json +22 -0
- package/registry/r/tailwind-preset.json +19 -0
- package/registry/r/task-header.json +24 -0
- package/registry/r/task-plan.json +22 -0
- package/registry/r/task-types.json +15 -0
- package/registry/r/terminal-panel.json +22 -0
- package/registry/r/textarea.json +22 -0
- package/registry/r/theme-provider.json +59 -0
- package/registry/r/theme-script.json +18 -0
- package/registry/r/theo-ui-provider.json +20 -0
- package/registry/r/timestamp.json +20 -0
- package/registry/r/toast.json +30 -0
- package/registry/r/token-usage-chart.json +20 -0
- package/registry/r/tokens.json +21 -0
- package/registry/r/tool-call-card.json +23 -0
- package/registry/r/tool-call.json +22 -0
- package/registry/r/tool-result.json +20 -0
- package/registry/r/tools-list.json +23 -0
- package/registry/r/tooltip.json +22 -0
- package/registry/r/topnav.json +22 -0
- package/registry/r/types.json +15 -0
- package/registry/r/usage-meter.json +21 -0
- package/registry/r/whiteboard.json +101 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { BadgeWithDot } from './chunk-P57HUMAE.js';
|
|
2
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
3
|
+
import { ChevronDown } from 'lucide-react';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var statusVariant = {
|
|
8
|
+
idle: "default",
|
|
9
|
+
permission_required: "warning",
|
|
10
|
+
starting: "primary",
|
|
11
|
+
running: "primary",
|
|
12
|
+
verifying: "primary",
|
|
13
|
+
completed: "success",
|
|
14
|
+
failed: "destructive"
|
|
15
|
+
};
|
|
16
|
+
var statusDot = {
|
|
17
|
+
idle: "muted",
|
|
18
|
+
permission_required: "warning",
|
|
19
|
+
starting: "primary",
|
|
20
|
+
running: "primary",
|
|
21
|
+
verifying: "primary",
|
|
22
|
+
completed: "success",
|
|
23
|
+
failed: "destructive"
|
|
24
|
+
};
|
|
25
|
+
var statusLabel = {
|
|
26
|
+
idle: "Idle",
|
|
27
|
+
permission_required: "Permission required",
|
|
28
|
+
starting: "Starting up",
|
|
29
|
+
running: "Running",
|
|
30
|
+
verifying: "Verifying",
|
|
31
|
+
completed: "Completed",
|
|
32
|
+
failed: "Failed"
|
|
33
|
+
};
|
|
34
|
+
var TaskHeader = forwardRef(
|
|
35
|
+
({ className, title, status, onToggle, actions, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
36
|
+
"header",
|
|
37
|
+
{
|
|
38
|
+
ref,
|
|
39
|
+
className: cn(
|
|
40
|
+
"flex items-center justify-between gap-3 rounded-xl border border-border/40 bg-card px-4 py-3",
|
|
41
|
+
className
|
|
42
|
+
),
|
|
43
|
+
...props,
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
|
|
46
|
+
/* @__PURE__ */ jsx("h2", { className: "truncate font-display text-title-lg tracking-tight", children: title }),
|
|
47
|
+
onToggle ? /* @__PURE__ */ jsx(
|
|
48
|
+
"button",
|
|
49
|
+
{
|
|
50
|
+
type: "button",
|
|
51
|
+
onClick: onToggle,
|
|
52
|
+
"aria-label": "Toggle task details",
|
|
53
|
+
className: "rounded-md p-1 text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
54
|
+
children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-4" })
|
|
55
|
+
}
|
|
56
|
+
) : null
|
|
57
|
+
] }),
|
|
58
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
59
|
+
status ? /* @__PURE__ */ jsxs(BadgeWithDot, { variant: statusVariant[status], children: [
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
BadgeWithDot.Dot,
|
|
62
|
+
{
|
|
63
|
+
tone: statusDot[status],
|
|
64
|
+
pulse: status === "running" || status === "starting" || status === "verifying"
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
statusLabel[status]
|
|
68
|
+
] }) : null,
|
|
69
|
+
actions
|
|
70
|
+
] })
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
);
|
|
75
|
+
TaskHeader.displayName = "TaskHeader";
|
|
76
|
+
|
|
77
|
+
export { TaskHeader };
|
|
78
|
+
//# sourceMappingURL=chunk-FAWPRZTM.js.map
|
|
79
|
+
//# sourceMappingURL=chunk-FAWPRZTM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/task-header/task-header.tsx"],"names":[],"mappings":";;;;;;AAOA,IAAM,aAAA,GAGF;AAAA,EACF,IAAA,EAAM,SAAA;AAAA,EACN,mBAAA,EAAqB,SAAA;AAAA,EACrB,QAAA,EAAU,SAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,SAAA;AAAA,EACX,SAAA,EAAW,SAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA;AACA,IAAM,SAAA,GAA6F;AAAA,EACjG,IAAA,EAAM,OAAA;AAAA,EACN,mBAAA,EAAqB,SAAA;AAAA,EACrB,QAAA,EAAU,SAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,SAAA;AAAA,EACX,SAAA,EAAW,SAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA;AACA,IAAM,WAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,MAAA;AAAA,EACN,mBAAA,EAAqB,qBAAA;AAAA,EACrB,QAAA,EAAU,aAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA;AAmBA,IAAM,UAAA,GAAa,UAAA;AAAA,EACjB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,UAAU,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1D,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,8FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oDAAA,EAAsD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACzE,QAAA,mBACC,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,QAAA;AAAA,cACT,YAAA,EAAW,qBAAA;AAAA,cACX,SAAA,EAAU,mJAAA;AAAA,cAEV,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,WAClC,GACE;AAAA,SAAA,EACN,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,MAAA,mBACC,IAAA,CAAC,YAAA,EAAA,EAAM,OAAA,EAAS,aAAA,CAAc,MAAM,CAAA,EAClC,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,YAAA,CAAM,GAAA;AAAA,cAAN;AAAA,gBACC,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,gBACtB,KAAA,EAAO,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,cAAc,MAAA,KAAW;AAAA;AAAA,aACrE;AAAA,YACC,YAAY,MAAM;AAAA,WAAA,EACrB,CAAA,GACE,IAAA;AAAA,UACH;AAAA,SAAA,EACH;AAAA;AAAA;AAAA;AAGN;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-FAWPRZTM.js","sourcesContent":["import { ChevronDown } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { TaskStatus } from \"../../../types/task.js\";\nimport { Badge } from \"../../primitives/badge/index.js\";\n\nconst statusVariant: Record<\n TaskStatus,\n \"default\" | \"primary\" | \"warning\" | \"success\" | \"destructive\"\n> = {\n idle: \"default\",\n permission_required: \"warning\",\n starting: \"primary\",\n running: \"primary\",\n verifying: \"primary\",\n completed: \"success\",\n failed: \"destructive\",\n};\nconst statusDot: Record<TaskStatus, \"primary\" | \"success\" | \"warning\" | \"destructive\" | \"muted\"> = {\n idle: \"muted\",\n permission_required: \"warning\",\n starting: \"primary\",\n running: \"primary\",\n verifying: \"primary\",\n completed: \"success\",\n failed: \"destructive\",\n};\nconst statusLabel: Record<TaskStatus, string> = {\n idle: \"Idle\",\n permission_required: \"Permission required\",\n starting: \"Starting up\",\n running: \"Running\",\n verifying: \"Verifying\",\n completed: \"Completed\",\n failed: \"Failed\",\n};\n\ninterface TaskHeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title: ReactNode;\n status?: TaskStatus;\n /**\n * If provided, a chevron is shown next to the title and clicking it fires this callback.\n * Used as the \"expand task metadata\" affordance in the Infra shell.\n */\n onToggle?: () => void;\n /** Right-side actions (e.g. cancel task, close panel). */\n actions?: ReactNode;\n}\n\n/**\n * TaskHeader — title bar for a task pane.\n *\n * Visual: display-md title with chevron + optional status badge with pulse + actions slot.\n */\nconst TaskHeader = forwardRef<HTMLElement, TaskHeaderProps>(\n ({ className, title, status, onToggle, actions, ...props }, ref) => (\n <header\n ref={ref}\n className={cn(\n \"flex items-center justify-between gap-3 rounded-xl border border-border/40 bg-card px-4 py-3\",\n className,\n )}\n {...props}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <h2 className=\"truncate font-display text-title-lg tracking-tight\">{title}</h2>\n {onToggle ? (\n <button\n type=\"button\"\n onClick={onToggle}\n aria-label=\"Toggle task details\"\n className=\"rounded-md p-1 text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronDown className=\"size-4\" />\n </button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {status ? (\n <Badge variant={statusVariant[status]}>\n <Badge.Dot\n tone={statusDot[status]}\n pulse={status === \"running\" || status === \"starting\" || status === \"verifying\"}\n />\n {statusLabel[status]}\n </Badge>\n ) : null}\n {actions}\n </div>\n </header>\n ),\n);\nTaskHeader.displayName = \"TaskHeader\";\n\nexport { TaskHeader };\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var LoginSplit = forwardRef(
|
|
6
|
+
({ className, left, right, footer, reverse, ...props }, ref) => /* @__PURE__ */ jsxs("div", { ref, className: cn("flex min-h-screen flex-col bg-background", className), ...props, children: [
|
|
7
|
+
/* @__PURE__ */ jsxs(
|
|
8
|
+
"div",
|
|
9
|
+
{
|
|
10
|
+
className: cn(
|
|
11
|
+
"grid flex-1 grid-cols-1 lg:grid-cols-2",
|
|
12
|
+
reverse && "lg:[&>*:first-child]:order-2"
|
|
13
|
+
),
|
|
14
|
+
children: [
|
|
15
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-center px-6 py-12 lg:px-12", children: /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: left }) }),
|
|
16
|
+
/* @__PURE__ */ jsx(
|
|
17
|
+
"div",
|
|
18
|
+
{
|
|
19
|
+
className: cn(
|
|
20
|
+
"relative flex items-center justify-center px-6 py-12 lg:px-12",
|
|
21
|
+
"bg-dotted-violet bg-muted/60"
|
|
22
|
+
),
|
|
23
|
+
children: /* @__PURE__ */ jsx("div", { className: "w-full max-w-lg", children: right })
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
),
|
|
29
|
+
footer ? /* @__PURE__ */ jsx("footer", { className: "border-border/40 border-t px-6 py-3 text-center text-body-sm text-muted-foreground", children: footer }) : null
|
|
30
|
+
] })
|
|
31
|
+
);
|
|
32
|
+
LoginSplit.displayName = "LoginSplit";
|
|
33
|
+
|
|
34
|
+
export { LoginSplit };
|
|
35
|
+
//# sourceMappingURL=chunk-FGYJ2WPX.js.map
|
|
36
|
+
//# sourceMappingURL=chunk-FGYJ2WPX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/login-split/login-split.tsx"],"names":[],"mappings":";;;;AA0BA,IAAM,UAAA,GAAa,UAAA;AAAA,EACjB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,OAAO,MAAA,EAAQ,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,wBACtD,IAAA,CAAC,KAAA,EAAA,EAAI,KAAU,SAAA,EAAW,EAAA,CAAG,4CAA4C,SAAS,CAAA,EAAI,GAAG,KAAA,EACvF,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,wCAAA;AAAA,UACA,OAAA,IAAW;AAAA,SACb;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACb,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,iBAAA,EAAmB,gBAAK,CAAA,EACzC,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,+DAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEA,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAC1C;AAAA;AAAA,KACF;AAAA,IACC,yBACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,oFAAA,EACf,kBACH,CAAA,GACE;AAAA,GAAA,EACN;AAEJ;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-FGYJ2WPX.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\ninterface LoginSplitProps extends HTMLAttributes<HTMLDivElement> {\n /** Left pane content — form, brand, etc. */\n left: ReactNode;\n /** Right pane content — illustration, marketing, social proof. */\n right: ReactNode;\n /**\n * Optional footer rendered below both panes.\n */\n footer?: ReactNode;\n /**\n * Reverse the split (form on the right). Default = form left.\n */\n reverse?: boolean;\n}\n\n/**\n * LoginSplit — 50/50 split layout shell.\n *\n * Used for the auth flow. Two slots (`left`, `right`); the right pane has a\n * subtle violet wash so the illustration sits inside Theo identity. Mobile\n * collapses to single column.\n */\nconst LoginSplit = forwardRef<HTMLDivElement, LoginSplitProps>(\n ({ className, left, right, footer, reverse, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex min-h-screen flex-col bg-background\", className)} {...props}>\n <div\n className={cn(\n \"grid flex-1 grid-cols-1 lg:grid-cols-2\",\n reverse && \"lg:[&>*:first-child]:order-2\",\n )}\n >\n <div className=\"flex items-center justify-center px-6 py-12 lg:px-12\">\n <div className=\"w-full max-w-md\">{left}</div>\n </div>\n <div\n className={cn(\n \"relative flex items-center justify-center px-6 py-12 lg:px-12\",\n \"bg-dotted-violet bg-muted/60\",\n )}\n >\n <div className=\"w-full max-w-lg\">{right}</div>\n </div>\n </div>\n {footer ? (\n <footer className=\"border-border/40 border-t px-6 py-3 text-center text-body-sm text-muted-foreground\">\n {footer}\n </footer>\n ) : null}\n </div>\n ),\n);\nLoginSplit.displayName = \"LoginSplit\";\n\nexport { LoginSplit };\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var Provider2 = TooltipPrimitive.Provider;
|
|
7
|
+
var Root2 = TooltipPrimitive.Root;
|
|
8
|
+
var Trigger2 = TooltipPrimitive.Trigger;
|
|
9
|
+
var Content2 = forwardRef(({ className, sideOffset = 6, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
|
|
10
|
+
TooltipPrimitive.Content,
|
|
11
|
+
{
|
|
12
|
+
ref,
|
|
13
|
+
sideOffset,
|
|
14
|
+
className: cn(
|
|
15
|
+
"z-50 overflow-hidden rounded-md border border-border/40 bg-foreground px-2.5 py-1.5",
|
|
16
|
+
"text-background text-body-sm shadow-md",
|
|
17
|
+
"data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-[state=delayed-open]:animate-in",
|
|
18
|
+
"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out",
|
|
19
|
+
"data-[side=top]:slide-in-from-bottom-1 data-[side=bottom]:slide-in-from-top-1",
|
|
20
|
+
"data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1",
|
|
21
|
+
className
|
|
22
|
+
),
|
|
23
|
+
...props
|
|
24
|
+
}
|
|
25
|
+
) }));
|
|
26
|
+
Content2.displayName = "Tooltip.Content";
|
|
27
|
+
var Tooltip = ({
|
|
28
|
+
label,
|
|
29
|
+
side = "top",
|
|
30
|
+
align = "center",
|
|
31
|
+
delayDuration = 200,
|
|
32
|
+
children,
|
|
33
|
+
...rootProps
|
|
34
|
+
}) => /* @__PURE__ */ jsx(Provider2, { delayDuration, children: /* @__PURE__ */ jsxs(Root2, { ...rootProps, children: [
|
|
35
|
+
/* @__PURE__ */ jsx(Trigger2, { asChild: true, children }),
|
|
36
|
+
/* @__PURE__ */ jsx(Content2, { side, align, children: label })
|
|
37
|
+
] }) });
|
|
38
|
+
var TooltipWithStatics = Tooltip;
|
|
39
|
+
TooltipWithStatics.Provider = Provider2;
|
|
40
|
+
TooltipWithStatics.Root = Root2;
|
|
41
|
+
TooltipWithStatics.Trigger = Trigger2;
|
|
42
|
+
TooltipWithStatics.Content = Content2;
|
|
43
|
+
|
|
44
|
+
export { TooltipWithStatics };
|
|
45
|
+
//# sourceMappingURL=chunk-GBG3I5I5.js.map
|
|
46
|
+
//# sourceMappingURL=chunk-GBG3I5I5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/tooltip/tooltip.tsx"],"names":["Provider","Root","Trigger","Content"],"mappings":";;;;;AAcA,IAAMA,SAAAA,GAA4B,gBAAA,CAAA,QAAA;AAClC,IAAMC,KAAAA,GAAwB,gBAAA,CAAA,IAAA;AAC9B,IAAMC,QAAAA,GAA2B,gBAAA,CAAA,OAAA;AAEjC,IAAMC,QAAAA,GAAU,UAAA,CAGd,CAAC,EAAE,SAAA,EAAW,UAAA,GAAa,CAAA,EAAG,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1C,GAAA,CAAkB,yBAAjB,EACC,QAAA,kBAAA,GAAA;AAAA,EAAkB,gBAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,qFAAA;AAAA,MACA,wCAAA;AAAA,MACA,+GAAA;AAAA,MACA,gGAAA;AAAA,MACA,+EAAA;AAAA,MACA,+EAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CAAA,EACF,CACD,CAAA;AACDA,QAAAA,CAAQ,WAAA,GAAc,iBAAA;AActB,IAAM,UAAU,CAAC;AAAA,EACf,KAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,KAAA,GAAQ,QAAA;AAAA,EACR,aAAA,GAAgB,GAAA;AAAA,EAChB,QAAA;AAAA,EACA,GAAG;AACL,CAAA,qBAEI,GAAA,CAACH,WAAA,EAAS,aAAA,EACR,+BAACC,KAAAA,EAAA,EAAM,GAAG,SAAA,EACR,QAAA,EAAA;AAAA,kBAAA,GAAA,CAACC,QAAAA,EAAA,EAAQ,OAAA,EAAO,IAAA,EAAE,QAAA,EAAS,CAAA;AAAA,kBAC3B,GAAA,CAACC,QAAAA,EAAA,EAAQ,IAAA,EAAY,OAClB,QAAA,EAAA,KAAA,EACH;AAAA,CAAA,EACF,CAAA,EACF,CAAA;AAGJ,IAAM,kBAAA,GAAqB;AAM3B,kBAAA,CAAmB,QAAA,GAAWH,SAAAA;AAC9B,kBAAA,CAAmB,IAAA,GAAOC,KAAAA;AAC1B,kBAAA,CAAmB,OAAA,GAAUC,QAAAA;AAC7B,kBAAA,CAAmB,OAAA,GAAUC,QAAAA","file":"chunk-GBG3I5I5.js","sourcesContent":["import * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ElementRef, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * Tooltip — built on Radix Tooltip.\n *\n * Visual: dark surface in light mode (and inverse in dark) with rounded-md,\n * shadow-md, text-body-sm. 8px delay-show default.\n *\n * Wrap your app in <Tooltip.Provider> once (or use the default delayDuration here).\n */\n\nconst Provider = TooltipPrimitive.Provider;\nconst Root = TooltipPrimitive.Root;\nconst Trigger = TooltipPrimitive.Trigger;\n\nconst Content = forwardRef<\n ElementRef<typeof TooltipPrimitive.Content>,\n ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 6, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border border-border/40 bg-foreground px-2.5 py-1.5\",\n \"text-background text-body-sm shadow-md\",\n \"data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-[state=delayed-open]:animate-in\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out\",\n \"data-[side=top]:slide-in-from-bottom-1 data-[side=bottom]:slide-in-from-top-1\",\n \"data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1\",\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n));\nContent.displayName = \"Tooltip.Content\";\n\ninterface TooltipProps extends ComponentPropsWithoutRef<typeof TooltipPrimitive.Root> {\n label: ReactNode;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n children: ReactNode;\n}\n\n/**\n * Shorthand: <Tooltip label=\"…\"><Button>…</Button></Tooltip>\n * Wraps Provider + Root + Trigger asChild + Content for the common case.\n * For advanced usage (controlled state, custom content), use Tooltip.Root etc. directly.\n */\nconst Tooltip = ({\n label,\n side = \"top\",\n align = \"center\",\n delayDuration = 200,\n children,\n ...rootProps\n}: TooltipProps) =>\n (\n <Provider delayDuration={delayDuration}>\n <Root {...rootProps}>\n <Trigger asChild>{children}</Trigger>\n <Content side={side} align={align}>\n {label}\n </Content>\n </Root>\n </Provider>\n ) as ReturnType<typeof Provider>;\n\nconst TooltipWithStatics = Tooltip as typeof Tooltip & {\n Provider: typeof Provider;\n Root: typeof Root;\n Trigger: typeof Trigger;\n Content: typeof Content;\n};\nTooltipWithStatics.Provider = Provider;\nTooltipWithStatics.Root = Root;\nTooltipWithStatics.Trigger = Trigger;\nTooltipWithStatics.Content = Content;\n\nexport { TooltipWithStatics as Tooltip };\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// src/lib/safe-href.ts
|
|
2
|
+
var DANGEROUS_PROTOCOL_PATTERNS = [
|
|
3
|
+
/^javascript:/i,
|
|
4
|
+
/^vbscript:/i,
|
|
5
|
+
/^data:text\/html/i
|
|
6
|
+
];
|
|
7
|
+
function safeHref(url) {
|
|
8
|
+
if (url === null || url === void 0) return void 0;
|
|
9
|
+
const trimmed = url.trim();
|
|
10
|
+
if (trimmed.length === 0) return void 0;
|
|
11
|
+
for (const pattern of DANGEROUS_PROTOCOL_PATTERNS) {
|
|
12
|
+
if (pattern.test(trimmed)) return void 0;
|
|
13
|
+
}
|
|
14
|
+
return url;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { safeHref };
|
|
18
|
+
//# sourceMappingURL=chunk-GDMCDW66.js.map
|
|
19
|
+
//# sourceMappingURL=chunk-GDMCDW66.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/safe-href.ts"],"names":[],"mappings":";AA2BA,IAAM,2BAAA,GAAiD;AAAA,EACrD,eAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,SAAS,GAAA,EAAoD;AAC3E,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW,OAAO,MAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACjC,EAAA,KAAA,MAAW,WAAW,2BAAA,EAA6B;AACjD,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,MAAA;AAAA,EACpC;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-GDMCDW66.js","sourcesContent":["/**\n * safeHref — defang `javascript:`, `vbscript:`, and `data:text/html` URIs.\n *\n * T3.3 (Security SEC-003). When a consumer passes user-controlled data as\n * an href to one of our card composites (`ProjectCard.href`, `PreviewEnvCard.url`,\n * etc.), an attacker who controls that data can craft a `javascript:alert(...)`\n * URI that fires in the application's origin on click. This is a standard\n * component-library hardening (mitigation also documented in `SECURITY.md`).\n *\n * Returns `undefined` for dangerous protocols so the consuming component\n * can short-circuit to a non-link rendering. Returns the URL unchanged for\n * safe protocols (`http`, `https`, `mailto`, `tel`, relative paths).\n *\n * Allowed (returns input unchanged):\n * - \"https://example.com/path?query\"\n * - \"/internal/route\"\n * - \"mailto:dev@theokit.dev\"\n * - \"tel:+15551234567\"\n *\n * Blocked (returns undefined):\n * - \"javascript:alert(1)\" — XSS via JS execution\n * - \" JavaScript:alert(1)\" — case-insensitive, leading whitespace\n * - \"vbscript:msgbox(1)\" — legacy IE XSS surface (still relevant on\n * certain enterprise envs)\n * - \"data:text/html,...\" — inline HTML/script payloads\n */\n\nconst DANGEROUS_PROTOCOL_PATTERNS: readonly RegExp[] = [\n /^javascript:/i,\n /^vbscript:/i,\n /^data:text\\/html/i,\n];\n\nexport function safeHref(url: string | null | undefined): string | undefined {\n if (url === null || url === undefined) return undefined;\n const trimmed = url.trim();\n if (trimmed.length === 0) return undefined;\n for (const pattern of DANGEROUS_PROTOCOL_PATTERNS) {\n if (pattern.test(trimmed)) return undefined;\n }\n return url;\n}\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { CircleX, Circle, CheckCircle2, Loader2, CircleDashed } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var STATUS_ICON = {
|
|
7
|
+
pending: CircleDashed,
|
|
8
|
+
running: Loader2,
|
|
9
|
+
done: CheckCircle2,
|
|
10
|
+
skipped: Circle,
|
|
11
|
+
failed: CircleX
|
|
12
|
+
};
|
|
13
|
+
var STATUS_COLOR = {
|
|
14
|
+
pending: "text-muted-foreground",
|
|
15
|
+
running: "text-primary",
|
|
16
|
+
done: "text-success",
|
|
17
|
+
skipped: "text-muted-foreground/60",
|
|
18
|
+
failed: "text-destructive"
|
|
19
|
+
};
|
|
20
|
+
var LABEL_STYLE = {
|
|
21
|
+
pending: "text-foreground",
|
|
22
|
+
running: "text-foreground",
|
|
23
|
+
done: "text-foreground line-through decoration-muted-foreground/40",
|
|
24
|
+
skipped: "text-muted-foreground line-through",
|
|
25
|
+
failed: "text-destructive"
|
|
26
|
+
};
|
|
27
|
+
var TaskNode = forwardRef(
|
|
28
|
+
({ className, node, depth = 0, ...props }, ref) => {
|
|
29
|
+
const Icon = STATUS_ICON[node.status];
|
|
30
|
+
return /* @__PURE__ */ jsxs(
|
|
31
|
+
"li",
|
|
32
|
+
{
|
|
33
|
+
ref,
|
|
34
|
+
className: cn("grid gap-1", className),
|
|
35
|
+
style: { marginLeft: `${depth * 1.25}rem` },
|
|
36
|
+
...props,
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[auto_1fr] items-baseline gap-2", children: [
|
|
39
|
+
/* @__PURE__ */ jsx(
|
|
40
|
+
Icon,
|
|
41
|
+
{
|
|
42
|
+
"aria-hidden": "true",
|
|
43
|
+
className: cn(
|
|
44
|
+
"mt-0.5 size-3.5 shrink-0",
|
|
45
|
+
STATUS_COLOR[node.status],
|
|
46
|
+
node.status === "running" && "animate-spin"
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
51
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-body-sm", LABEL_STYLE[node.status]), children: node.label }),
|
|
52
|
+
node.detail ? /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: node.detail }) : null
|
|
53
|
+
] })
|
|
54
|
+
] }),
|
|
55
|
+
node.children && node.children.length > 0 ? /* @__PURE__ */ jsx("ul", { className: "grid gap-1 border-border/30 border-l pl-2", children: node.children.map((child) => /* @__PURE__ */ jsx(TaskNode, { node: child, depth: depth + 1 }, child.id)) }) : null
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
TaskNode.displayName = "TaskNode";
|
|
62
|
+
var TaskPlan = forwardRef(
|
|
63
|
+
({ className, nodes, title = "Plan", summary, ...props }, ref) => {
|
|
64
|
+
const auto = nodes.length;
|
|
65
|
+
const done = nodes.filter((n) => n.status === "done").length;
|
|
66
|
+
const computedSummary = summary ?? (auto > 0 ? `${done} of ${auto} done` : "no steps");
|
|
67
|
+
return /* @__PURE__ */ jsxs("section", { ref, className: cn("rounded-xl border bg-card p-4", className), ...props, children: [
|
|
68
|
+
/* @__PURE__ */ jsxs("header", { className: "mb-3 flex items-baseline justify-between gap-3", children: [
|
|
69
|
+
title ? /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) : /* @__PURE__ */ jsx("span", {}),
|
|
70
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-label text-muted-foreground tabular-nums", children: computedSummary })
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsx("ul", { className: "grid gap-1.5", children: nodes.map((node) => /* @__PURE__ */ jsx(TaskNode, { node }, node.id)) })
|
|
73
|
+
] });
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
TaskPlan.displayName = "TaskPlan";
|
|
77
|
+
|
|
78
|
+
export { TaskNode, TaskPlan };
|
|
79
|
+
//# sourceMappingURL=chunk-H6HSQCOW.js.map
|
|
80
|
+
//# sourceMappingURL=chunk-H6HSQCOW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/task-plan/task-plan.tsx"],"names":[],"mappings":"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","file":"chunk-H6HSQCOW.js","sourcesContent":["import { CheckCircle2, Circle, CircleDashed, CircleX, Loader2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type PlanNodeStatus = \"pending\" | \"running\" | \"done\" | \"skipped\" | \"failed\";\n\nexport interface PlanNode {\n id: string;\n label: string;\n status: PlanNodeStatus;\n /** Optional details / sub-explanation. */\n detail?: string;\n /** Sub-nodes (rendered indented). */\n children?: PlanNode[];\n}\n\nconst STATUS_ICON = {\n pending: CircleDashed,\n running: Loader2,\n done: CheckCircle2,\n skipped: Circle,\n failed: CircleX,\n} as const;\n\nconst STATUS_COLOR: Record<PlanNodeStatus, string> = {\n pending: \"text-muted-foreground\",\n running: \"text-primary\",\n done: \"text-success\",\n skipped: \"text-muted-foreground/60\",\n failed: \"text-destructive\",\n};\n\nconst LABEL_STYLE: Record<PlanNodeStatus, string> = {\n pending: \"text-foreground\",\n running: \"text-foreground\",\n done: \"text-foreground line-through decoration-muted-foreground/40\",\n skipped: \"text-muted-foreground line-through\",\n failed: \"text-destructive\",\n};\n\ninterface TaskNodeProps extends HTMLAttributes<HTMLLIElement> {\n node: PlanNode;\n depth?: number;\n}\n\n/**\n * TaskNode — single row in a task plan. Renders its own children recursively\n * with increasing indentation.\n */\nconst TaskNode = forwardRef<HTMLLIElement, TaskNodeProps>(\n ({ className, node, depth = 0, ...props }, ref) => {\n const Icon = STATUS_ICON[node.status];\n return (\n <li\n ref={ref}\n className={cn(\"grid gap-1\", className)}\n style={{ marginLeft: `${depth * 1.25}rem` }}\n {...props}\n >\n <div className=\"grid grid-cols-[auto_1fr] items-baseline gap-2\">\n <Icon\n aria-hidden=\"true\"\n className={cn(\n \"mt-0.5 size-3.5 shrink-0\",\n STATUS_COLOR[node.status],\n node.status === \"running\" && \"animate-spin\",\n )}\n />\n <div className=\"min-w-0\">\n <p className={cn(\"text-body-sm\", LABEL_STYLE[node.status])}>{node.label}</p>\n {node.detail ? (\n <p className=\"text-body-sm text-muted-foreground\">{node.detail}</p>\n ) : null}\n </div>\n </div>\n {node.children && node.children.length > 0 ? (\n <ul className=\"grid gap-1 border-border/30 border-l pl-2\">\n {node.children.map((child) => (\n <TaskNode key={child.id} node={child} depth={depth + 1} />\n ))}\n </ul>\n ) : null}\n </li>\n );\n },\n);\nTaskNode.displayName = \"TaskNode\";\n\ninterface TaskPlanProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n nodes: PlanNode[];\n /** Header title. */\n title?: ReactNode;\n /** Summary line shown next to the title (e.g. \"3 of 7 done\"). */\n summary?: ReactNode;\n}\n\n/**\n * TaskPlan — hierarchical task plan, à la Claude \"plan mode\".\n *\n * The agent emits a structured plan; the user sees each step progress from\n * pending → running → done (or failed/skipped). Children render with one\n * extra indent level and a left border to suggest hierarchy.\n */\nconst TaskPlan = forwardRef<HTMLElement, TaskPlanProps>(\n ({ className, nodes, title = \"Plan\", summary, ...props }, ref) => {\n const auto = nodes.length;\n const done = nodes.filter((n) => n.status === \"done\").length;\n const computedSummary = summary ?? (auto > 0 ? `${done} of ${auto} done` : \"no steps\");\n return (\n <section ref={ref} className={cn(\"rounded-xl border bg-card p-4\", className)} {...props}>\n <header className=\"mb-3 flex items-baseline justify-between gap-3\">\n {title ? (\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n ) : (\n <span />\n )}\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n {computedSummary}\n </span>\n </header>\n <ul className=\"grid gap-1.5\">\n {nodes.map((node) => (\n <TaskNode key={node.id} node={node} />\n ))}\n </ul>\n </section>\n );\n },\n);\nTaskPlan.displayName = \"TaskPlan\";\n\nexport { TaskNode, TaskPlan };\n"]}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
|
3
|
+
import { ChevronDown, Sparkles, Check } from 'lucide-react';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var TONE_CLASS = {
|
|
8
|
+
primary: "bg-primary text-primary-foreground",
|
|
9
|
+
accent: "bg-accent text-accent-foreground",
|
|
10
|
+
success: "bg-success text-success-foreground",
|
|
11
|
+
warning: "bg-warning text-warning-foreground",
|
|
12
|
+
info: "bg-info text-info-foreground",
|
|
13
|
+
muted: "bg-muted text-foreground"
|
|
14
|
+
};
|
|
15
|
+
var AgentProfile = forwardRef(
|
|
16
|
+
({ className, agents, activeId, onChange, ...props }, ref) => {
|
|
17
|
+
const active = agents.find((a) => a.id === activeId) ?? agents[0];
|
|
18
|
+
if (!active) return null;
|
|
19
|
+
const initials = active.initials ?? active.name.slice(0, 2).toUpperCase();
|
|
20
|
+
return /* @__PURE__ */ jsxs(DropdownMenu.Root, { children: [
|
|
21
|
+
/* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
22
|
+
"button",
|
|
23
|
+
{
|
|
24
|
+
ref,
|
|
25
|
+
type: "button",
|
|
26
|
+
className: cn(
|
|
27
|
+
"inline-flex h-9 items-center gap-2 rounded-full border border-border/60 bg-card pr-3 pl-1",
|
|
28
|
+
"transition-colors hover:bg-muted",
|
|
29
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
30
|
+
className
|
|
31
|
+
),
|
|
32
|
+
...props,
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx(
|
|
35
|
+
"span",
|
|
36
|
+
{
|
|
37
|
+
className: cn(
|
|
38
|
+
"grid size-7 place-items-center rounded-full font-bold font-mono text-label",
|
|
39
|
+
TONE_CLASS[active.tone ?? "primary"]
|
|
40
|
+
),
|
|
41
|
+
"aria-hidden": "true",
|
|
42
|
+
children: initials
|
|
43
|
+
}
|
|
44
|
+
),
|
|
45
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium font-sans text-body-sm text-foreground", children: active.name }),
|
|
46
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: "size-3 text-muted-foreground", "aria-hidden": "true" })
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
) }),
|
|
50
|
+
/* @__PURE__ */ jsx(DropdownMenu.Portal, { children: /* @__PURE__ */ jsxs(
|
|
51
|
+
DropdownMenu.Content,
|
|
52
|
+
{
|
|
53
|
+
align: "start",
|
|
54
|
+
sideOffset: 6,
|
|
55
|
+
className: cn(
|
|
56
|
+
"z-50 min-w-[18rem] overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-md",
|
|
57
|
+
"data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in",
|
|
58
|
+
"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out"
|
|
59
|
+
),
|
|
60
|
+
children: [
|
|
61
|
+
/* @__PURE__ */ jsx(DropdownMenu.Label, { className: "px-2 py-1.5 font-mono text-label-caps text-muted-foreground uppercase tracking-wider", children: "Switch agent" }),
|
|
62
|
+
agents.map((agent) => {
|
|
63
|
+
const inits = agent.initials ?? agent.name.slice(0, 2).toUpperCase();
|
|
64
|
+
const isActive = agent.id === activeId;
|
|
65
|
+
return /* @__PURE__ */ jsxs(
|
|
66
|
+
DropdownMenu.Item,
|
|
67
|
+
{
|
|
68
|
+
onSelect: () => onChange?.(agent.id),
|
|
69
|
+
className: cn(
|
|
70
|
+
"flex cursor-pointer items-start gap-3 rounded-md px-2 py-2",
|
|
71
|
+
"focus:bg-muted focus:outline-none data-[highlighted]:bg-muted"
|
|
72
|
+
),
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ jsx(
|
|
75
|
+
"span",
|
|
76
|
+
{
|
|
77
|
+
className: cn(
|
|
78
|
+
"mt-0.5 grid size-8 place-items-center rounded-full font-bold font-mono text-label",
|
|
79
|
+
TONE_CLASS[agent.tone ?? "muted"]
|
|
80
|
+
),
|
|
81
|
+
"aria-hidden": "true",
|
|
82
|
+
children: inits
|
|
83
|
+
}
|
|
84
|
+
),
|
|
85
|
+
/* @__PURE__ */ jsxs("div", { className: "grid min-w-0 flex-1 gap-0.5", children: [
|
|
86
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
|
|
87
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-body-sm", children: agent.name }),
|
|
88
|
+
agent.badge ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-accent/15 px-1.5 py-0 font-mono text-accent text-label uppercase", children: [
|
|
89
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "size-2.5", "aria-hidden": "true" }),
|
|
90
|
+
agent.badge
|
|
91
|
+
] }) : null
|
|
92
|
+
] }),
|
|
93
|
+
agent.description ? /* @__PURE__ */ jsx("span", { className: "text-body-sm text-muted-foreground", children: agent.description }) : null
|
|
94
|
+
] }),
|
|
95
|
+
isActive ? /* @__PURE__ */ jsx(Check, { className: "mt-1 size-4 shrink-0 text-primary", "aria-hidden": "true" }) : null
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
agent.id
|
|
99
|
+
);
|
|
100
|
+
})
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
) })
|
|
104
|
+
] });
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
AgentProfile.displayName = "AgentProfile";
|
|
108
|
+
|
|
109
|
+
export { AgentProfile };
|
|
110
|
+
//# sourceMappingURL=chunk-HDM4RCIF.js.map
|
|
111
|
+
//# sourceMappingURL=chunk-HDM4RCIF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/agent-profile/agent-profile.tsx"],"names":[],"mappings":"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","file":"chunk-HDM4RCIF.js","sourcesContent":["import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronDown, Sparkles } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport interface AgentProfileDescriptor {\n id: string;\n /** Display name, e.g. \"Coder\", \"Planner\", \"Reviewer\". */\n name: string;\n /** Avatar initials (2 chars max). Falls back to first 2 letters of name. */\n initials?: string;\n /** Optional short description for tooltips and the dropdown. */\n description?: ReactNode;\n /**\n * Identity tone — colors the avatar so users tell agents apart at a glance.\n */\n tone?: \"primary\" | \"accent\" | \"success\" | \"warning\" | \"info\" | \"muted\";\n /** Optional badge text (e.g. \"experimental\"). */\n badge?: ReactNode;\n}\n\nconst TONE_CLASS: Record<NonNullable<AgentProfileDescriptor[\"tone\"]>, string> = {\n primary: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n success: \"bg-success text-success-foreground\",\n warning: \"bg-warning text-warning-foreground\",\n info: \"bg-info text-info-foreground\",\n muted: \"bg-muted text-foreground\",\n};\n\ninterface AgentProfileProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n agents: AgentProfileDescriptor[];\n activeId: string;\n onChange?: (id: string) => void;\n}\n\n/**\n * AgentProfile — switcher between multiple agent profiles (coder, planner,\n * reviewer, etc.). Each profile gets its own tone so the user can spot at a\n * glance which \"persona\" is currently driving the session.\n */\nconst AgentProfile = forwardRef<HTMLButtonElement, AgentProfileProps>(\n ({ className, agents, activeId, onChange, ...props }, ref) => {\n const active = agents.find((a) => a.id === activeId) ?? agents[0];\n if (!active) return null;\n const initials = active.initials ?? active.name.slice(0, 2).toUpperCase();\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"inline-flex h-9 items-center gap-2 rounded-full border border-border/60 bg-card pr-3 pl-1\",\n \"transition-colors hover:bg-muted\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n \"grid size-7 place-items-center rounded-full font-bold font-mono text-label\",\n TONE_CLASS[active.tone ?? \"primary\"],\n )}\n aria-hidden=\"true\"\n >\n {initials}\n </span>\n <span className=\"font-medium font-sans text-body-sm text-foreground\">\n {active.name}\n </span>\n <ChevronDown className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={6}\n className={cn(\n \"z-50 min-w-[18rem] overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out\",\n )}\n >\n <DropdownMenu.Label className=\"px-2 py-1.5 font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n Switch agent\n </DropdownMenu.Label>\n {agents.map((agent) => {\n const inits = agent.initials ?? agent.name.slice(0, 2).toUpperCase();\n const isActive = agent.id === activeId;\n return (\n <DropdownMenu.Item\n key={agent.id}\n onSelect={() => onChange?.(agent.id)}\n className={cn(\n \"flex cursor-pointer items-start gap-3 rounded-md px-2 py-2\",\n \"focus:bg-muted focus:outline-none data-[highlighted]:bg-muted\",\n )}\n >\n <span\n className={cn(\n \"mt-0.5 grid size-8 place-items-center rounded-full font-bold font-mono text-label\",\n TONE_CLASS[agent.tone ?? \"muted\"],\n )}\n aria-hidden=\"true\"\n >\n {inits}\n </span>\n <div className=\"grid min-w-0 flex-1 gap-0.5\">\n <span className=\"flex items-center gap-2\">\n <span className=\"font-medium text-body-sm\">{agent.name}</span>\n {agent.badge ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-accent/15 px-1.5 py-0 font-mono text-accent text-label uppercase\">\n <Sparkles className=\"size-2.5\" aria-hidden=\"true\" />\n {agent.badge}\n </span>\n ) : null}\n </span>\n {agent.description ? (\n <span className=\"text-body-sm text-muted-foreground\">\n {agent.description}\n </span>\n ) : null}\n </div>\n {isActive ? (\n <Check className=\"mt-1 size-4 shrink-0 text-primary\" aria-hidden=\"true\" />\n ) : null}\n </DropdownMenu.Item>\n );\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n },\n);\nAgentProfile.displayName = \"AgentProfile\";\n\nexport { AgentProfile };\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
|
3
|
+
import { ChevronDown, Sparkles, Check } from 'lucide-react';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var ModelSelector = forwardRef(
|
|
8
|
+
({ className, value, options, onChange, ...props }, ref) => {
|
|
9
|
+
const current = options.find((o) => o.id === value) ?? options[0];
|
|
10
|
+
return /* @__PURE__ */ jsxs(DropdownMenu.Root, { children: [
|
|
11
|
+
/* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
12
|
+
"button",
|
|
13
|
+
{
|
|
14
|
+
ref,
|
|
15
|
+
type: "button",
|
|
16
|
+
className: cn(
|
|
17
|
+
"inline-flex h-8 items-center gap-2 rounded-full border border-border/60 bg-card px-3",
|
|
18
|
+
"font-medium font-sans text-body-sm text-foreground",
|
|
19
|
+
"transition-colors duration-base ease-out-soft",
|
|
20
|
+
"hover:bg-muted",
|
|
21
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
22
|
+
className
|
|
23
|
+
),
|
|
24
|
+
...props,
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-primary", "aria-hidden": "true" }),
|
|
27
|
+
current?.label ?? "Select model",
|
|
28
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: "size-3 text-muted-foreground", "aria-hidden": "true" })
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
) }),
|
|
32
|
+
/* @__PURE__ */ jsx(DropdownMenu.Portal, { children: /* @__PURE__ */ jsx(
|
|
33
|
+
DropdownMenu.Content,
|
|
34
|
+
{
|
|
35
|
+
sideOffset: 6,
|
|
36
|
+
align: "end",
|
|
37
|
+
className: cn(
|
|
38
|
+
"z-50 min-w-[14rem] overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-md",
|
|
39
|
+
"data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in",
|
|
40
|
+
"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out"
|
|
41
|
+
),
|
|
42
|
+
children: options.map((opt) => /* @__PURE__ */ jsxs(
|
|
43
|
+
DropdownMenu.Item,
|
|
44
|
+
{
|
|
45
|
+
onSelect: () => onChange?.(opt.id),
|
|
46
|
+
className: cn(
|
|
47
|
+
"flex cursor-pointer items-center justify-between gap-3 rounded-md px-2 py-2",
|
|
48
|
+
"text-body-sm",
|
|
49
|
+
"focus:bg-muted focus:outline-none",
|
|
50
|
+
"data-[highlighted]:bg-muted"
|
|
51
|
+
),
|
|
52
|
+
children: [
|
|
53
|
+
/* @__PURE__ */ jsxs("span", { className: "flex flex-col", children: [
|
|
54
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: opt.label }),
|
|
55
|
+
opt.vendor ? /* @__PURE__ */ jsx("span", { className: "font-mono text-label text-muted-foreground", children: opt.vendor }) : null
|
|
56
|
+
] }),
|
|
57
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
|
|
58
|
+
opt.tag ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-accent/15 px-2 py-0.5 font-mono text-accent text-label uppercase", children: [
|
|
59
|
+
opt.tag === "smart" ? /* @__PURE__ */ jsx(Sparkles, { className: "size-3" }) : null,
|
|
60
|
+
opt.tag
|
|
61
|
+
] }) : null,
|
|
62
|
+
opt.id === value ? /* @__PURE__ */ jsx(Check, { className: "size-3.5 text-primary" }) : null
|
|
63
|
+
] })
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
opt.id
|
|
67
|
+
))
|
|
68
|
+
}
|
|
69
|
+
) })
|
|
70
|
+
] });
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
ModelSelector.displayName = "ModelSelector";
|
|
74
|
+
|
|
75
|
+
export { ModelSelector };
|
|
76
|
+
//# sourceMappingURL=chunk-HNTOGGVD.js.map
|
|
77
|
+
//# sourceMappingURL=chunk-HNTOGGVD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/model-selector/model-selector.tsx"],"names":[],"mappings":"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","file":"chunk-HNTOGGVD.js","sourcesContent":["import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronDown, Sparkles } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport interface ModelOption {\n id: string;\n label: string;\n /** Optional vendor hint shown small below the label. */\n vendor?: string;\n /** Optional tag e.g. \"default\", \"fast\", \"smart\". */\n tag?: string;\n}\n\ninterface ModelSelectorProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n value: string;\n options: ModelOption[];\n onChange?: (id: string) => void;\n}\n\n/**\n * ModelSelector — chip dropdown for picking the active LLM.\n *\n * Visual: pill with violet dot + label + chevron. Dropdown uses Radix Menu.\n */\nconst ModelSelector = forwardRef<HTMLButtonElement, ModelSelectorProps>(\n ({ className, value, options, onChange, ...props }, ref) => {\n const current = options.find((o) => o.id === value) ?? options[0];\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"inline-flex h-8 items-center gap-2 rounded-full border border-border/60 bg-card px-3\",\n \"font-medium font-sans text-body-sm text-foreground\",\n \"transition-colors duration-base ease-out-soft\",\n \"hover:bg-muted\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n className,\n )}\n {...props}\n >\n <span className=\"size-1.5 rounded-full bg-primary\" aria-hidden=\"true\" />\n {current?.label ?? \"Select model\"}\n <ChevronDown className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n sideOffset={6}\n align=\"end\"\n className={cn(\n \"z-50 min-w-[14rem] overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out\",\n )}\n >\n {options.map((opt) => (\n <DropdownMenu.Item\n key={opt.id}\n onSelect={() => onChange?.(opt.id)}\n className={cn(\n \"flex cursor-pointer items-center justify-between gap-3 rounded-md px-2 py-2\",\n \"text-body-sm\",\n \"focus:bg-muted focus:outline-none\",\n \"data-[highlighted]:bg-muted\",\n )}\n >\n <span className=\"flex flex-col\">\n <span className=\"font-medium\">{opt.label}</span>\n {opt.vendor ? (\n <span className=\"font-mono text-label text-muted-foreground\">{opt.vendor}</span>\n ) : null}\n </span>\n <span className=\"flex items-center gap-2\">\n {opt.tag ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-accent/15 px-2 py-0.5 font-mono text-accent text-label uppercase\">\n {opt.tag === \"smart\" ? <Sparkles className=\"size-3\" /> : null}\n {opt.tag}\n </span>\n ) : null}\n {opt.id === value ? <Check className=\"size-3.5 text-primary\" /> : null}\n </span>\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n },\n);\nModelSelector.displayName = \"ModelSelector\";\n\nexport { ModelSelector };\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { BookOpen } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var ContextCard = forwardRef(
|
|
7
|
+
({ className, title, description, illustration, icon, ...props }, ref) => {
|
|
8
|
+
const Icon = icon ?? BookOpen;
|
|
9
|
+
return /* @__PURE__ */ jsxs(
|
|
10
|
+
"section",
|
|
11
|
+
{
|
|
12
|
+
ref,
|
|
13
|
+
className: cn("grid gap-3 rounded-xl border border-border/40 bg-muted/30 p-4", className),
|
|
14
|
+
...props,
|
|
15
|
+
children: [
|
|
16
|
+
illustration ? /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: illustration }) : /* @__PURE__ */ jsx(Icon, { className: "size-5 text-primary", "aria-hidden": "true" }),
|
|
17
|
+
title ? /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) : null,
|
|
18
|
+
description ? /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: description }) : null
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
ContextCard.displayName = "ContextCard";
|
|
25
|
+
|
|
26
|
+
export { ContextCard };
|
|
27
|
+
//# sourceMappingURL=chunk-HQW2ABO4.js.map
|
|
28
|
+
//# sourceMappingURL=chunk-HQW2ABO4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/context-card/context-card.tsx"],"names":[],"mappings":";;;;;AAqBA,IAAM,WAAA,GAAc,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,cAAc,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACxE,IAAA,MAAM,OAAO,IAAA,IAAQ,QAAA;AACrB,IAAA,uBACE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,+DAAA,EAAiE,SAAS,CAAA;AAAA,QACvF,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,YAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,YAAA,EAAa,CAAA,mBAEnD,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,UAE1D,wBAAQ,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAAA,EAA6C,iBAAM,CAAA,GAAQ,IAAA;AAAA,UACjF,8BAAc,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,uBAAY,CAAA,GAAO;AAAA;AAAA;AAAA,KACvF;AAAA,EAEJ;AACF;AACA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-HQW2ABO4.js","sourcesContent":["import { BookOpen } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\ninterface ContextCardProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title?: ReactNode;\n description?: ReactNode;\n /** Optional illustration slot (rendered above title). */\n illustration?: ReactNode;\n /** Icon for the title row — used when illustration is omitted. */\n icon?: IconComponent;\n}\n\n/**\n * ContextCard — generic \"informational\" card for the right inspector.\n *\n * Used as the \"Contexto\" card on Files screens: illustration / icon, title,\n * short description. Inert by design — no actions.\n */\nconst ContextCard = forwardRef<HTMLElement, ContextCardProps>(\n ({ className, title, description, illustration, icon, ...props }, ref) => {\n const Icon = icon ?? BookOpen;\n return (\n <section\n ref={ref}\n className={cn(\"grid gap-3 rounded-xl border border-border/40 bg-muted/30 p-4\", className)}\n {...props}\n >\n {illustration ? (\n <div className=\"flex justify-center\">{illustration}</div>\n ) : (\n <Icon className=\"size-5 text-primary\" aria-hidden=\"true\" />\n )}\n {title ? <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3> : null}\n {description ? <p className=\"text-body-sm text-muted-foreground\">{description}</p> : null}\n </section>\n );\n },\n);\nContextCard.displayName = \"ContextCard\";\n\nexport { ContextCard };\n"]}
|