@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,120 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { Globe, Pencil, Trash2 } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var SCOPE_LABEL = {
|
|
7
|
+
global: "Global",
|
|
8
|
+
project: "Project"
|
|
9
|
+
};
|
|
10
|
+
var SCOPE_CLASS = {
|
|
11
|
+
global: "bg-primary/15 text-primary",
|
|
12
|
+
project: "bg-accent/15 text-accent"
|
|
13
|
+
};
|
|
14
|
+
var RuleCard = forwardRef(
|
|
15
|
+
({ className, rule, onSelect, onEdit, onDelete, onToggle, ...props }, ref) => {
|
|
16
|
+
const handleEdit = (e) => {
|
|
17
|
+
e.stopPropagation();
|
|
18
|
+
(onEdit ?? onSelect)?.(rule.id);
|
|
19
|
+
};
|
|
20
|
+
const handleDelete = (e) => {
|
|
21
|
+
e.stopPropagation();
|
|
22
|
+
onDelete?.(rule.id);
|
|
23
|
+
};
|
|
24
|
+
const handleToggle = (e) => {
|
|
25
|
+
e.stopPropagation();
|
|
26
|
+
onToggle?.(rule.id, rule.state === "enabled" ? "disabled" : "enabled");
|
|
27
|
+
};
|
|
28
|
+
return /* @__PURE__ */ jsxs(
|
|
29
|
+
"article",
|
|
30
|
+
{
|
|
31
|
+
ref,
|
|
32
|
+
className: cn(
|
|
33
|
+
"grid gap-2 rounded-lg border border-border/40 bg-card/40 p-3",
|
|
34
|
+
"transition-colors duration-base ease-out-soft",
|
|
35
|
+
onSelect && "cursor-pointer hover:border-border hover:bg-card/70",
|
|
36
|
+
rule.state === "disabled" && "opacity-60",
|
|
37
|
+
className
|
|
38
|
+
),
|
|
39
|
+
onClick: onSelect ? () => onSelect(rule.id) : void 0,
|
|
40
|
+
...props,
|
|
41
|
+
children: [
|
|
42
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-start gap-2", children: [
|
|
43
|
+
/* @__PURE__ */ jsx("h4", { className: "flex-1 truncate font-display text-foreground text-title-md tracking-tight", children: rule.title }),
|
|
44
|
+
/* @__PURE__ */ jsxs(
|
|
45
|
+
"span",
|
|
46
|
+
{
|
|
47
|
+
className: cn(
|
|
48
|
+
"inline-flex h-5 shrink-0 items-center gap-1 rounded-md px-2 font-medium font-mono text-label tracking-tight",
|
|
49
|
+
SCOPE_CLASS[rule.scope]
|
|
50
|
+
),
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ jsx(Globe, { className: "size-3", "aria-hidden": "true" }),
|
|
53
|
+
" ",
|
|
54
|
+
SCOPE_LABEL[rule.scope]
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
] }),
|
|
59
|
+
/* @__PURE__ */ jsx("p", { className: "line-clamp-2 text-body-sm text-muted-foreground", children: rule.body }),
|
|
60
|
+
/* @__PURE__ */ jsxs("footer", { className: "flex items-center justify-between gap-2", children: [
|
|
61
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1", children: [
|
|
62
|
+
rule.tags?.map((t) => /* @__PURE__ */ jsx(
|
|
63
|
+
"span",
|
|
64
|
+
{
|
|
65
|
+
className: "inline-flex h-4 items-center rounded bg-muted px-1.5 font-mono text-label-caps text-muted-foreground uppercase tracking-wider",
|
|
66
|
+
children: t
|
|
67
|
+
},
|
|
68
|
+
t
|
|
69
|
+
)),
|
|
70
|
+
rule.updatedAt ? /* @__PURE__ */ jsxs("span", { className: "font-mono text-label text-muted-foreground tabular-nums", children: [
|
|
71
|
+
"\xB7 ",
|
|
72
|
+
rule.updatedAt
|
|
73
|
+
] }) : null
|
|
74
|
+
] }),
|
|
75
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
76
|
+
onToggle ? /* @__PURE__ */ jsx(
|
|
77
|
+
"button",
|
|
78
|
+
{
|
|
79
|
+
type: "button",
|
|
80
|
+
onClick: handleToggle,
|
|
81
|
+
"aria-label": rule.state === "enabled" ? "Disable rule" : "Enable rule",
|
|
82
|
+
className: cn(
|
|
83
|
+
"inline-flex h-6 items-center rounded-full px-2 font-mono text-label",
|
|
84
|
+
rule.state === "enabled" ? "bg-success/15 text-success" : "bg-muted text-muted-foreground"
|
|
85
|
+
),
|
|
86
|
+
children: rule.state === "enabled" ? "Enabled" : "Disabled"
|
|
87
|
+
}
|
|
88
|
+
) : null,
|
|
89
|
+
/* @__PURE__ */ jsx(
|
|
90
|
+
"button",
|
|
91
|
+
{
|
|
92
|
+
type: "button",
|
|
93
|
+
onClick: handleEdit,
|
|
94
|
+
"aria-label": "Edit rule",
|
|
95
|
+
className: "grid size-6 place-items-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground",
|
|
96
|
+
children: /* @__PURE__ */ jsx(Pencil, { className: "size-3.5" })
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
onDelete ? /* @__PURE__ */ jsx(
|
|
100
|
+
"button",
|
|
101
|
+
{
|
|
102
|
+
type: "button",
|
|
103
|
+
onClick: handleDelete,
|
|
104
|
+
"aria-label": "Delete rule",
|
|
105
|
+
className: "grid size-6 place-items-center rounded-md text-muted-foreground hover:bg-destructive/10 hover:text-destructive",
|
|
106
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "size-3.5" })
|
|
107
|
+
}
|
|
108
|
+
) : null
|
|
109
|
+
] })
|
|
110
|
+
] })
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
RuleCard.displayName = "RuleCard";
|
|
117
|
+
|
|
118
|
+
export { RuleCard };
|
|
119
|
+
//# sourceMappingURL=chunk-WHFIQUCC.js.map
|
|
120
|
+
//# sourceMappingURL=chunk-WHFIQUCC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/rule-card/rule-card.tsx"],"names":[],"mappings":"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","file":"chunk-WHFIQUCC.js","sourcesContent":["import { Globe, Pencil, Trash2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, MouseEvent } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { Rule, RuleScope, RuleState } from \"../../../types/rule.js\";\n\n/**\n * RuleCard — single Rule row in the Rules list. Renders title, scope/state\n * badges, optional tag chips, a truncated body preview, and edit/toggle/delete\n * actions in the corner.\n */\n\nconst SCOPE_LABEL: Record<RuleScope, string> = {\n global: \"Global\",\n project: \"Project\",\n};\n\nconst SCOPE_CLASS: Record<RuleScope, string> = {\n global: \"bg-primary/15 text-primary\",\n project: \"bg-accent/15 text-accent\",\n};\n\ninterface RuleCardProps\n extends Omit<HTMLAttributes<HTMLElement>, \"title\" | \"onSelect\" | \"onToggle\"> {\n rule: Rule;\n /** Click on the card body — typically opens detail/edit view. */\n onSelect?: (id: string) => void;\n /** Click on the edit pencil. Defaults to onSelect if omitted. */\n onEdit?: (id: string) => void;\n /** Click on the trash icon. Renders the icon only when provided. */\n onDelete?: (id: string) => void;\n /** Toggle enabled/disabled. Renders the switch-like dot only when provided. */\n onToggle?: (id: string, next: RuleState) => void;\n}\n\nconst RuleCard = forwardRef<HTMLElement, RuleCardProps>(\n ({ className, rule, onSelect, onEdit, onDelete, onToggle, ...props }, ref) => {\n const handleEdit = (e: MouseEvent) => {\n e.stopPropagation();\n (onEdit ?? onSelect)?.(rule.id);\n };\n const handleDelete = (e: MouseEvent) => {\n e.stopPropagation();\n onDelete?.(rule.id);\n };\n const handleToggle = (e: MouseEvent) => {\n e.stopPropagation();\n onToggle?.(rule.id, rule.state === \"enabled\" ? \"disabled\" : \"enabled\");\n };\n return (\n <article\n ref={ref}\n className={cn(\n \"grid gap-2 rounded-lg border border-border/40 bg-card/40 p-3\",\n \"transition-colors duration-base ease-out-soft\",\n onSelect && \"cursor-pointer hover:border-border hover:bg-card/70\",\n rule.state === \"disabled\" && \"opacity-60\",\n className,\n )}\n onClick={onSelect ? () => onSelect(rule.id) : undefined}\n {...props}\n >\n <header className=\"flex items-start gap-2\">\n <h4 className=\"flex-1 truncate font-display text-foreground text-title-md tracking-tight\">\n {rule.title}\n </h4>\n <span\n className={cn(\n \"inline-flex h-5 shrink-0 items-center gap-1 rounded-md px-2 font-medium font-mono text-label tracking-tight\",\n SCOPE_CLASS[rule.scope],\n )}\n >\n <Globe className=\"size-3\" aria-hidden=\"true\" /> {SCOPE_LABEL[rule.scope]}\n </span>\n </header>\n <p className=\"line-clamp-2 text-body-sm text-muted-foreground\">{rule.body}</p>\n <footer className=\"flex items-center justify-between gap-2\">\n <div className=\"flex flex-wrap items-center gap-1\">\n {rule.tags?.map((t) => (\n <span\n key={t}\n className=\"inline-flex h-4 items-center rounded bg-muted px-1.5 font-mono text-label-caps text-muted-foreground uppercase tracking-wider\"\n >\n {t}\n </span>\n ))}\n {rule.updatedAt ? (\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n · {rule.updatedAt}\n </span>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1\">\n {onToggle ? (\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-label={rule.state === \"enabled\" ? \"Disable rule\" : \"Enable rule\"}\n className={cn(\n \"inline-flex h-6 items-center rounded-full px-2 font-mono text-label\",\n rule.state === \"enabled\"\n ? \"bg-success/15 text-success\"\n : \"bg-muted text-muted-foreground\",\n )}\n >\n {rule.state === \"enabled\" ? \"Enabled\" : \"Disabled\"}\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={handleEdit}\n aria-label=\"Edit rule\"\n className=\"grid size-6 place-items-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Pencil className=\"size-3.5\" />\n </button>\n {onDelete ? (\n <button\n type=\"button\"\n onClick={handleDelete}\n aria-label=\"Delete rule\"\n className=\"grid size-6 place-items-center rounded-md text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n </footer>\n </article>\n );\n },\n);\nRuleCard.displayName = \"RuleCard\";\n\nexport { RuleCard };\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { Folder, File, ChevronRight } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var FolderContextCard = forwardRef(
|
|
7
|
+
({ className, title, entries, onEntryClick, ...props }, ref) => /* @__PURE__ */ jsxs("section", { ref, className: cn("rounded-xl border bg-card p-4", className), ...props, children: [
|
|
8
|
+
title ? /* @__PURE__ */ jsx("header", { className: "mb-3 flex items-center justify-between", children: /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) }) : null,
|
|
9
|
+
/* @__PURE__ */ jsx(Tree, { entries, ...onEntryClick ? { onEntryClick } : {}, depth: 0 })
|
|
10
|
+
] })
|
|
11
|
+
);
|
|
12
|
+
FolderContextCard.displayName = "FolderContextCard";
|
|
13
|
+
function Tree({
|
|
14
|
+
entries,
|
|
15
|
+
onEntryClick,
|
|
16
|
+
depth
|
|
17
|
+
}) {
|
|
18
|
+
return /* @__PURE__ */ jsx("ul", { className: cn("grid", depth === 0 ? "gap-0.5" : "gap-0"), children: entries.map((entry) => {
|
|
19
|
+
const IconComp = entry.icon ?? (entry.kind === "folder" ? Folder : File);
|
|
20
|
+
const hasChildren = entry.kind === "folder" && entry.children && entry.children.length > 0;
|
|
21
|
+
return /* @__PURE__ */ jsxs("li", { children: [
|
|
22
|
+
/* @__PURE__ */ jsxs(
|
|
23
|
+
"button",
|
|
24
|
+
{
|
|
25
|
+
type: "button",
|
|
26
|
+
onClick: () => onEntryClick?.(entry.id),
|
|
27
|
+
className: cn(
|
|
28
|
+
"flex w-full items-center gap-2 rounded-md px-2 py-1.5",
|
|
29
|
+
"font-sans text-body-sm text-foreground",
|
|
30
|
+
"transition-colors hover:bg-muted",
|
|
31
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
32
|
+
),
|
|
33
|
+
style: { paddingLeft: `${0.5 + depth * 0.9}rem` },
|
|
34
|
+
children: [
|
|
35
|
+
hasChildren ? /* @__PURE__ */ jsx(
|
|
36
|
+
ChevronRight,
|
|
37
|
+
{
|
|
38
|
+
className: cn(
|
|
39
|
+
"size-3 shrink-0 text-muted-foreground transition-transform",
|
|
40
|
+
entry.open && "rotate-90"
|
|
41
|
+
),
|
|
42
|
+
"aria-hidden": "true"
|
|
43
|
+
}
|
|
44
|
+
) : /* @__PURE__ */ jsx("span", { className: "w-3", "aria-hidden": "true" }),
|
|
45
|
+
/* @__PURE__ */ jsx(
|
|
46
|
+
IconComp,
|
|
47
|
+
{
|
|
48
|
+
className: cn(
|
|
49
|
+
"size-4 shrink-0",
|
|
50
|
+
entry.kind === "folder" ? "text-primary" : "text-muted-foreground"
|
|
51
|
+
),
|
|
52
|
+
"aria-hidden": "true"
|
|
53
|
+
}
|
|
54
|
+
),
|
|
55
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-left", children: entry.name }),
|
|
56
|
+
entry.trailing
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
hasChildren && entry.open ? /* @__PURE__ */ jsx(
|
|
61
|
+
Tree,
|
|
62
|
+
{
|
|
63
|
+
entries: entry.children,
|
|
64
|
+
...onEntryClick ? { onEntryClick } : {},
|
|
65
|
+
depth: depth + 1
|
|
66
|
+
}
|
|
67
|
+
) : null
|
|
68
|
+
] }, entry.id);
|
|
69
|
+
}) });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { FolderContextCard };
|
|
73
|
+
//# sourceMappingURL=chunk-WPSESV5Z.js.map
|
|
74
|
+
//# sourceMappingURL=chunk-WPSESV5Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/folder-context-card/folder-context-card.tsx"],"names":[],"mappings":"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","file":"chunk-WPSESV5Z.js","sourcesContent":["import { ChevronRight, File, Folder } 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\nexport interface FolderEntry {\n id: string;\n name: string;\n kind: \"folder\" | \"file\";\n /**\n * If true, the entry is expanded (icons + nested children).\n * Pure visual flag; toggling is the caller's job.\n */\n open?: boolean;\n /**\n * Optional nested entries when this is a folder.\n */\n children?: FolderEntry[];\n /** Optional adornment after the name (badge, modified indicator). */\n trailing?: ReactNode;\n /** Override the icon. */\n icon?: IconComponent;\n}\n\ninterface FolderContextCardProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title?: ReactNode;\n /**\n * Root entries shown directly in the card.\n */\n entries: FolderEntry[];\n /**\n * Fires when an entry row is clicked.\n */\n onEntryClick?: (id: string) => void;\n}\n\n/**\n * FolderContextCard — file/folder tree fragment for the right inspector.\n *\n * Visual: 1-level tree with chevron indicating expanded state. Renders nested\n * children recursively, but does not manage open state — caller controls\n * `entry.open` and reacts to `onEntryClick`.\n */\nconst FolderContextCard = forwardRef<HTMLElement, FolderContextCardProps>(\n ({ className, title, entries, onEntryClick, ...props }, ref) => (\n <section ref={ref} className={cn(\"rounded-xl border bg-card p-4\", className)} {...props}>\n {title ? (\n <header className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n </header>\n ) : null}\n <Tree entries={entries} {...(onEntryClick ? { onEntryClick } : {})} depth={0} />\n </section>\n ),\n);\nFolderContextCard.displayName = \"FolderContextCard\";\n\nfunction Tree({\n entries,\n onEntryClick,\n depth,\n}: {\n entries: FolderEntry[];\n onEntryClick?: (id: string) => void;\n depth: number;\n}) {\n return (\n <ul className={cn(\"grid\", depth === 0 ? \"gap-0.5\" : \"gap-0\")}>\n {entries.map((entry) => {\n const IconComp = entry.icon ?? (entry.kind === \"folder\" ? Folder : File);\n const hasChildren = entry.kind === \"folder\" && entry.children && entry.children.length > 0;\n return (\n <li key={entry.id}>\n <button\n type=\"button\"\n onClick={() => onEntryClick?.(entry.id)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5\",\n \"font-sans text-body-sm text-foreground\",\n \"transition-colors hover:bg-muted\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n style={{ paddingLeft: `${0.5 + depth * 0.9}rem` }}\n >\n {hasChildren ? (\n <ChevronRight\n className={cn(\n \"size-3 shrink-0 text-muted-foreground transition-transform\",\n entry.open && \"rotate-90\",\n )}\n aria-hidden=\"true\"\n />\n ) : (\n <span className=\"w-3\" aria-hidden=\"true\" />\n )}\n <IconComp\n className={cn(\n \"size-4 shrink-0\",\n entry.kind === \"folder\" ? \"text-primary\" : \"text-muted-foreground\",\n )}\n aria-hidden=\"true\"\n />\n <span className=\"flex-1 truncate text-left\">{entry.name}</span>\n {entry.trailing}\n </button>\n {hasChildren && entry.open ? (\n <Tree\n entries={entry.children as FolderEntry[]}\n {...(onEntryClick ? { onEntryClick } : {})}\n depth={depth + 1}\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport { FolderContextCard };\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useInLiveRegion } from './chunk-UGKI466V.js';
|
|
2
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
3
|
+
import { AlertOctagon, Network, KeyRound, ShieldOff, Database } from 'lucide-react';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var ICON_FOR_KIND = {
|
|
8
|
+
"rate-limit": Database,
|
|
9
|
+
"context-overflow": ShieldOff,
|
|
10
|
+
auth: KeyRound,
|
|
11
|
+
"tool-failure": AlertOctagon,
|
|
12
|
+
network: Network,
|
|
13
|
+
generic: AlertOctagon
|
|
14
|
+
};
|
|
15
|
+
var AgentErrorCard = forwardRef(
|
|
16
|
+
({ className, kind = "generic", title, detail, actions, timestamp, ...props }, ref) => {
|
|
17
|
+
const Icon = ICON_FOR_KIND[kind];
|
|
18
|
+
const inLiveRegion = useInLiveRegion();
|
|
19
|
+
return /* @__PURE__ */ jsxs(
|
|
20
|
+
"section",
|
|
21
|
+
{
|
|
22
|
+
ref,
|
|
23
|
+
role: "alert",
|
|
24
|
+
"aria-live": inLiveRegion ? void 0 : "assertive",
|
|
25
|
+
className: cn(
|
|
26
|
+
"grid w-full gap-3 rounded-xl border border-destructive/40 bg-destructive/5 p-4",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props,
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-start gap-3", children: [
|
|
32
|
+
/* @__PURE__ */ jsx("span", { className: "mt-0.5 inline-flex shrink-0 text-destructive", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Icon, { className: "size-4" }) }),
|
|
33
|
+
/* @__PURE__ */ jsxs("div", { className: "grid min-w-0 flex-1 gap-1", children: [
|
|
34
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("h4", { className: "font-display text-foreground text-title-md tracking-tight", children: title }),
|
|
36
|
+
timestamp ? /* @__PURE__ */ jsx("span", { className: "shrink-0 font-mono text-label text-muted-foreground tabular-nums", children: timestamp }) : null
|
|
37
|
+
] }),
|
|
38
|
+
detail ? /* @__PURE__ */ jsx("p", { className: "break-words font-mono text-code-sm text-muted-foreground", children: detail }) : null
|
|
39
|
+
] })
|
|
40
|
+
] }),
|
|
41
|
+
actions ? /* @__PURE__ */ jsx("footer", { className: "flex flex-wrap items-center justify-end gap-2", children: actions }) : null
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
AgentErrorCard.displayName = "AgentErrorCard";
|
|
48
|
+
|
|
49
|
+
export { AgentErrorCard };
|
|
50
|
+
//# sourceMappingURL=chunk-WXEXCHEN.js.map
|
|
51
|
+
//# sourceMappingURL=chunk-WXEXCHEN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/agent-error-card/agent-error-card.tsx"],"names":[],"mappings":";;;;;;AA8BA,IAAM,aAAA,GAAoD;AAAA,EACxD,YAAA,EAAc,QAAA;AAAA,EACd,kBAAA,EAAoB,SAAA;AAAA,EACpB,IAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAgB,YAAA;AAAA,EAChB,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAWA,IAAM,cAAA,GAAiB,UAAA;AAAA,EACrB,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACrF,IAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAK/B,IAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,IAAA,uBACE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QACL,WAAA,EAAW,eAAe,MAAA,GAAY,WAAA;AAAA,QACtC,SAAA,EAAW,EAAA;AAAA,UACT,gFAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,wBAAA,EAChB,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8CAAA,EAA+C,aAAA,EAAY,QACzE,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA,EAC3B,CAAA;AAAA,4BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2DAAA,EAA6D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,gBAChF,4BACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEAAA,EACb,qBACH,CAAA,GACE;AAAA,eAAA,EACN,CAAA;AAAA,cACC,yBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0DAAA,EAA4D,kBAAO,CAAA,GAC9E;AAAA,aAAA,EACN;AAAA,WAAA,EACF,CAAA;AAAA,UACC,0BACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,+CAAA,EAAiD,mBAAQ,CAAA,GACzE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"chunk-WXEXCHEN.js","sourcesContent":["import {\n AlertOctagon,\n Database,\n KeyRound,\n type LucideIcon,\n Network,\n ShieldOff,\n} from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { useInLiveRegion } from \"../../../lib/live-region-context.js\";\n\n/**\n * AgentErrorCard — inline error / blocked-state card for an agent stream.\n *\n * Renders when the agent run hits a wall it can't recover from on its own:\n * rate limit, context overflow, auth lost, tool failure, network error.\n * Severity is always destructive; the `kind` drives the icon and helps the\n * consumer wire recovery actions in the footer slot.\n */\n\nexport type AgentErrorKind =\n | \"rate-limit\"\n | \"context-overflow\"\n | \"auth\"\n | \"tool-failure\"\n | \"network\"\n | \"generic\";\n\nconst ICON_FOR_KIND: Record<AgentErrorKind, LucideIcon> = {\n \"rate-limit\": Database,\n \"context-overflow\": ShieldOff,\n auth: KeyRound,\n \"tool-failure\": AlertOctagon,\n network: Network,\n generic: AlertOctagon,\n};\n\ninterface AgentErrorCardProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n kind?: AgentErrorKind;\n title: ReactNode;\n detail?: ReactNode;\n /** Recovery action slot (Retry, Reset, Re-auth, etc.). */\n actions?: ReactNode;\n timestamp?: ReactNode;\n}\n\nconst AgentErrorCard = forwardRef<HTMLElement, AgentErrorCardProps>(\n ({ className, kind = \"generic\", title, detail, actions, timestamp, ...props }, ref) => {\n const Icon = ICON_FOR_KIND[kind];\n // T4.1 (MF-4): omit own aria-live when nested in a container live region.\n // role=\"alert\" stays — alerts should announce even via outer region —\n // but we drop the explicit aria-live=\"assertive\" attribute so AT doesn't\n // see two competing live region declarations.\n const inLiveRegion = useInLiveRegion();\n return (\n <section\n ref={ref}\n role=\"alert\"\n aria-live={inLiveRegion ? undefined : \"assertive\"}\n className={cn(\n \"grid w-full gap-3 rounded-xl border border-destructive/40 bg-destructive/5 p-4\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start gap-3\">\n <span className=\"mt-0.5 inline-flex shrink-0 text-destructive\" aria-hidden=\"true\">\n <Icon className=\"size-4\" />\n </span>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <h4 className=\"font-display text-foreground text-title-md tracking-tight\">{title}</h4>\n {timestamp ? (\n <span className=\"shrink-0 font-mono text-label text-muted-foreground tabular-nums\">\n {timestamp}\n </span>\n ) : null}\n </div>\n {detail ? (\n <p className=\"break-words font-mono text-code-sm text-muted-foreground\">{detail}</p>\n ) : null}\n </div>\n </header>\n {actions ? (\n <footer className=\"flex flex-wrap items-center justify-end gap-2\">{actions}</footer>\n ) : null}\n </section>\n );\n },\n);\nAgentErrorCard.displayName = \"AgentErrorCard\";\n\nexport { AgentErrorCard };\n"]}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { Loader2, Download } from 'lucide-react';
|
|
3
|
+
import { forwardRef, useState } from 'react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var FORMAT_LABELS = {
|
|
7
|
+
markdown: "Markdown (.md)",
|
|
8
|
+
json: "JSON",
|
|
9
|
+
jsonl: "JSONL (one message per line)",
|
|
10
|
+
sharegpt: "ShareGPT trajectory"
|
|
11
|
+
};
|
|
12
|
+
var DEFAULT_FORMATS = ["markdown", "json", "jsonl", "sharegpt"];
|
|
13
|
+
var ExportChatDialog = forwardRef(
|
|
14
|
+
({
|
|
15
|
+
open,
|
|
16
|
+
onOpenChange,
|
|
17
|
+
onExport,
|
|
18
|
+
availableFormats = DEFAULT_FORMATS,
|
|
19
|
+
sessionLabel,
|
|
20
|
+
className,
|
|
21
|
+
"data-testid": dataTestId
|
|
22
|
+
}, ref) => {
|
|
23
|
+
const [format, setFormat] = useState(availableFormats[0] ?? "markdown");
|
|
24
|
+
const [exporting, setExporting] = useState(false);
|
|
25
|
+
if (!open) return null;
|
|
26
|
+
const handleExport = async () => {
|
|
27
|
+
setExporting(true);
|
|
28
|
+
try {
|
|
29
|
+
await Promise.resolve(onExport(format));
|
|
30
|
+
onOpenChange(false);
|
|
31
|
+
} finally {
|
|
32
|
+
setExporting(false);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return /* @__PURE__ */ jsx(
|
|
36
|
+
"div",
|
|
37
|
+
{
|
|
38
|
+
ref,
|
|
39
|
+
role: "dialog",
|
|
40
|
+
"aria-modal": "true",
|
|
41
|
+
"aria-labelledby": "export-chat-dialog-title",
|
|
42
|
+
className: cn(
|
|
43
|
+
"fixed inset-0 z-50 flex items-center justify-center bg-background/80 backdrop-blur",
|
|
44
|
+
className
|
|
45
|
+
),
|
|
46
|
+
"data-testid": dataTestId ?? "export-chat-dialog",
|
|
47
|
+
children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-sm rounded-lg border border-border bg-card p-4 shadow-lg", children: [
|
|
48
|
+
/* @__PURE__ */ jsxs("h2", { id: "export-chat-dialog-title", className: "font-semibold text-base", children: [
|
|
49
|
+
"Export chat",
|
|
50
|
+
sessionLabel !== void 0 && sessionLabel.length > 0 && /* @__PURE__ */ jsx("span", { className: "ml-2 text-muted-foreground text-xs", children: sessionLabel })
|
|
51
|
+
] }),
|
|
52
|
+
/* @__PURE__ */ jsxs("fieldset", { className: "mt-3 space-y-1.5", children: [
|
|
53
|
+
/* @__PURE__ */ jsx("legend", { className: "sr-only", children: "Choose format" }),
|
|
54
|
+
availableFormats.map((f) => /* @__PURE__ */ jsxs(
|
|
55
|
+
"label",
|
|
56
|
+
{
|
|
57
|
+
className: "flex cursor-pointer items-center gap-2 rounded px-2 py-1 hover:bg-muted/30",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsx(
|
|
60
|
+
"input",
|
|
61
|
+
{
|
|
62
|
+
type: "radio",
|
|
63
|
+
name: "export-format",
|
|
64
|
+
value: f,
|
|
65
|
+
checked: format === f,
|
|
66
|
+
onChange: () => setFormat(f),
|
|
67
|
+
disabled: exporting,
|
|
68
|
+
"data-testid": `export-format-${f}`
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm", children: FORMAT_LABELS[f] })
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
f
|
|
75
|
+
))
|
|
76
|
+
] }),
|
|
77
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-4 flex justify-end gap-2", children: [
|
|
78
|
+
/* @__PURE__ */ jsx(
|
|
79
|
+
"button",
|
|
80
|
+
{
|
|
81
|
+
type: "button",
|
|
82
|
+
onClick: () => onOpenChange(false),
|
|
83
|
+
disabled: exporting,
|
|
84
|
+
className: "rounded-md border border-border px-3 py-1.5 text-sm hover:bg-muted/30 disabled:opacity-50",
|
|
85
|
+
"data-testid": "export-chat-cancel",
|
|
86
|
+
children: "Cancel"
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
/* @__PURE__ */ jsxs(
|
|
90
|
+
"button",
|
|
91
|
+
{
|
|
92
|
+
type: "button",
|
|
93
|
+
onClick: handleExport,
|
|
94
|
+
disabled: exporting,
|
|
95
|
+
className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 font-medium text-primary-foreground text-sm hover:bg-primary/90 disabled:opacity-50",
|
|
96
|
+
"data-testid": "export-chat-submit",
|
|
97
|
+
children: [
|
|
98
|
+
exporting ? /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin", "aria-hidden": true }) : /* @__PURE__ */ jsx(Download, { className: "size-4", "aria-hidden": true }),
|
|
99
|
+
"Export"
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
] })
|
|
104
|
+
] })
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
ExportChatDialog.displayName = "ExportChatDialog";
|
|
110
|
+
|
|
111
|
+
export { ExportChatDialog };
|
|
112
|
+
//# sourceMappingURL=chunk-X2DDPD3D.js.map
|
|
113
|
+
//# sourceMappingURL=chunk-X2DDPD3D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/export-chat-dialog/export-chat-dialog.tsx"],"names":[],"mappings":"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","file":"chunk-X2DDPD3D.js","sourcesContent":["import { Download, Loader2 } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\n\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * ExportChatDialog — modal letting users export a chat session in selectable\n * formats. Async-aware: `onExport` returning a Promise disables the button\n * until resolution.\n *\n * Controlled. Consumer renders the trigger and toggles `open`.\n */\n\nexport type ExportFormat = \"markdown\" | \"json\" | \"jsonl\" | \"sharegpt\";\n\nexport interface ExportChatDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onExport: (format: ExportFormat) => void | Promise<void>;\n availableFormats?: ExportFormat[];\n sessionLabel?: string;\n className?: string;\n \"data-testid\"?: string;\n}\n\nconst FORMAT_LABELS: Record<ExportFormat, string> = {\n markdown: \"Markdown (.md)\",\n json: \"JSON\",\n jsonl: \"JSONL (one message per line)\",\n sharegpt: \"ShareGPT trajectory\",\n};\n\nconst DEFAULT_FORMATS: ExportFormat[] = [\"markdown\", \"json\", \"jsonl\", \"sharegpt\"];\n\nexport const ExportChatDialog = forwardRef<HTMLDivElement, ExportChatDialogProps>(\n (\n {\n open,\n onOpenChange,\n onExport,\n availableFormats = DEFAULT_FORMATS,\n sessionLabel,\n className,\n \"data-testid\": dataTestId,\n },\n ref,\n ) => {\n const [format, setFormat] = useState<ExportFormat>(availableFormats[0] ?? \"markdown\");\n const [exporting, setExporting] = useState(false);\n\n if (!open) return null;\n\n const handleExport = async () => {\n setExporting(true);\n try {\n await Promise.resolve(onExport(format));\n onOpenChange(false);\n } finally {\n setExporting(false);\n }\n };\n\n return (\n <div\n ref={ref}\n // biome-ignore lint/a11y/useSemanticElements: custom modal backdrop, not browser <dialog>; aria-modal preserves a11y semantics\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"export-chat-dialog-title\"\n className={cn(\n \"fixed inset-0 z-50 flex items-center justify-center bg-background/80 backdrop-blur\",\n className,\n )}\n data-testid={dataTestId ?? \"export-chat-dialog\"}\n >\n <div className=\"w-full max-w-sm rounded-lg border border-border bg-card p-4 shadow-lg\">\n <h2 id=\"export-chat-dialog-title\" className=\"font-semibold text-base\">\n Export chat\n {sessionLabel !== undefined && sessionLabel.length > 0 && (\n <span className=\"ml-2 text-muted-foreground text-xs\">{sessionLabel}</span>\n )}\n </h2>\n\n <fieldset className=\"mt-3 space-y-1.5\">\n <legend className=\"sr-only\">Choose format</legend>\n {availableFormats.map((f) => (\n <label\n key={f}\n className=\"flex cursor-pointer items-center gap-2 rounded px-2 py-1 hover:bg-muted/30\"\n >\n <input\n type=\"radio\"\n name=\"export-format\"\n value={f}\n checked={format === f}\n onChange={() => setFormat(f)}\n disabled={exporting}\n data-testid={`export-format-${f}`}\n />\n <span className=\"text-sm\">{FORMAT_LABELS[f]}</span>\n </label>\n ))}\n </fieldset>\n\n <div className=\"mt-4 flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n disabled={exporting}\n className=\"rounded-md border border-border px-3 py-1.5 text-sm hover:bg-muted/30 disabled:opacity-50\"\n data-testid=\"export-chat-cancel\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleExport}\n disabled={exporting}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 font-medium text-primary-foreground text-sm hover:bg-primary/90 disabled:opacity-50\"\n data-testid=\"export-chat-submit\"\n >\n {exporting ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Download className=\"size-4\" aria-hidden />\n )}\n Export\n </button>\n </div>\n </div>\n </div>\n );\n },\n);\nExportChatDialog.displayName = \"ExportChatDialog\";\n"]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Input } from './chunk-B3VAJSZ2.js';
|
|
2
|
+
import { Button } from './chunk-5VOSCJKQ.js';
|
|
3
|
+
import { BadgeWithDot } from './chunk-P57HUMAE.js';
|
|
4
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
5
|
+
import { Plus, Globe, ShieldCheck, ShieldX, Check, Trash2 } from 'lucide-react';
|
|
6
|
+
import { forwardRef, useState } from 'react';
|
|
7
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var statusVariant = {
|
|
10
|
+
verified: "success",
|
|
11
|
+
pending: "warning",
|
|
12
|
+
invalid: "destructive"
|
|
13
|
+
};
|
|
14
|
+
var statusDot = {
|
|
15
|
+
verified: "success",
|
|
16
|
+
pending: "warning",
|
|
17
|
+
invalid: "destructive"
|
|
18
|
+
};
|
|
19
|
+
var statusLabel = {
|
|
20
|
+
verified: "Verified",
|
|
21
|
+
pending: "Pending DNS",
|
|
22
|
+
invalid: "Invalid"
|
|
23
|
+
};
|
|
24
|
+
var DomainConfig = forwardRef(
|
|
25
|
+
({ className, domains, onAdd, onRemove, onSetPrimary, ...props }, ref) => {
|
|
26
|
+
const [hostname, setHostname] = useState("");
|
|
27
|
+
return /* @__PURE__ */ jsxs(
|
|
28
|
+
"div",
|
|
29
|
+
{
|
|
30
|
+
ref,
|
|
31
|
+
className: cn("rounded-xl border bg-card p-5 shadow-sm", className),
|
|
32
|
+
...props,
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx("header", { className: "mb-4 flex items-baseline justify-between gap-3", children: /* @__PURE__ */ jsxs("div", { children: [
|
|
35
|
+
/* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: "Domains" }),
|
|
36
|
+
/* @__PURE__ */ jsxs("p", { className: "text-body-sm text-muted-foreground", children: [
|
|
37
|
+
domains.length,
|
|
38
|
+
" configured"
|
|
39
|
+
] })
|
|
40
|
+
] }) }),
|
|
41
|
+
onAdd ? /* @__PURE__ */ jsxs(
|
|
42
|
+
"form",
|
|
43
|
+
{
|
|
44
|
+
className: "mb-4 grid grid-cols-[1fr_auto] gap-2",
|
|
45
|
+
onSubmit: (e) => {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
const v = hostname.trim();
|
|
48
|
+
if (!v) return;
|
|
49
|
+
onAdd(v);
|
|
50
|
+
setHostname("");
|
|
51
|
+
},
|
|
52
|
+
children: [
|
|
53
|
+
/* @__PURE__ */ jsx(
|
|
54
|
+
Input,
|
|
55
|
+
{
|
|
56
|
+
placeholder: "api.acme.com",
|
|
57
|
+
value: hostname,
|
|
58
|
+
onChange: (e) => setHostname(e.target.value),
|
|
59
|
+
"aria-label": "Hostname",
|
|
60
|
+
className: "font-mono"
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
/* @__PURE__ */ jsxs(Button, { type: "submit", children: [
|
|
64
|
+
/* @__PURE__ */ jsx(Plus, {}),
|
|
65
|
+
" Add domain"
|
|
66
|
+
] })
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
) : null,
|
|
70
|
+
/* @__PURE__ */ jsxs("ul", { className: "grid gap-3", children: [
|
|
71
|
+
domains.map((d) => /* @__PURE__ */ jsxs("li", { className: "grid gap-3 rounded-lg border border-border/40 p-4", children: [
|
|
72
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
73
|
+
/* @__PURE__ */ jsx(Globe, { className: "size-4 text-muted-foreground", "aria-hidden": "true" }),
|
|
74
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-code-md text-foreground", children: d.hostname }),
|
|
75
|
+
/* @__PURE__ */ jsxs(BadgeWithDot, { variant: statusVariant[d.status], children: [
|
|
76
|
+
/* @__PURE__ */ jsx(BadgeWithDot.Dot, { tone: statusDot[d.status], pulse: d.status === "pending" }),
|
|
77
|
+
statusLabel[d.status]
|
|
78
|
+
] }),
|
|
79
|
+
d.tls === true ? /* @__PURE__ */ jsxs(BadgeWithDot, { variant: "primary", children: [
|
|
80
|
+
/* @__PURE__ */ jsx(ShieldCheck, { className: "size-3" }),
|
|
81
|
+
" TLS"
|
|
82
|
+
] }) : d.tls === false ? /* @__PURE__ */ jsxs(BadgeWithDot, { variant: "destructive", children: [
|
|
83
|
+
/* @__PURE__ */ jsx(ShieldX, { className: "size-3" }),
|
|
84
|
+
" No TLS"
|
|
85
|
+
] }) : null,
|
|
86
|
+
d.primary ? /* @__PURE__ */ jsxs(BadgeWithDot, { variant: "accent", children: [
|
|
87
|
+
/* @__PURE__ */ jsx(Check, { className: "size-3" }),
|
|
88
|
+
" Primary"
|
|
89
|
+
] }) : null,
|
|
90
|
+
/* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-1", children: [
|
|
91
|
+
!d.primary && onSetPrimary ? /* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", onClick: () => onSetPrimary(d.id), children: "Set primary" }) : null,
|
|
92
|
+
onRemove ? /* @__PURE__ */ jsx(
|
|
93
|
+
Button,
|
|
94
|
+
{
|
|
95
|
+
size: "icon",
|
|
96
|
+
variant: "ghost",
|
|
97
|
+
onClick: () => onRemove(d.id),
|
|
98
|
+
"aria-label": `Remove ${d.hostname}`,
|
|
99
|
+
children: /* @__PURE__ */ jsx(Trash2, {})
|
|
100
|
+
}
|
|
101
|
+
) : null
|
|
102
|
+
] })
|
|
103
|
+
] }),
|
|
104
|
+
d.status === "pending" && d.verificationRecord ? /* @__PURE__ */ jsxs("div", { className: "rounded-md border border-border/60 border-dashed bg-muted/30 p-3 font-mono text-code-sm", children: [
|
|
105
|
+
/* @__PURE__ */ jsx("p", { className: "mb-2 font-sans text-label-caps text-muted-foreground uppercase", children: "Add this DNS record to verify" }),
|
|
106
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[auto_1fr] gap-x-3 gap-y-1", children: [
|
|
107
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "type" }),
|
|
108
|
+
/* @__PURE__ */ jsx("span", { children: d.verificationRecord.type }),
|
|
109
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "name" }),
|
|
110
|
+
/* @__PURE__ */ jsx("span", { children: d.verificationRecord.name }),
|
|
111
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "value" }),
|
|
112
|
+
/* @__PURE__ */ jsx("span", { className: "break-all", children: d.verificationRecord.value })
|
|
113
|
+
] })
|
|
114
|
+
] }) : null
|
|
115
|
+
] }, d.id)),
|
|
116
|
+
domains.length === 0 ? /* @__PURE__ */ jsx("li", { className: "rounded-lg border border-border/40 border-dashed p-8 text-center text-body-sm text-muted-foreground", children: "No domains yet. Add one to route traffic to this project." }) : null
|
|
117
|
+
] })
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
DomainConfig.displayName = "DomainConfig";
|
|
124
|
+
|
|
125
|
+
export { DomainConfig };
|
|
126
|
+
//# sourceMappingURL=chunk-X7VIMKLD.js.map
|
|
127
|
+
//# sourceMappingURL=chunk-X7VIMKLD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/domain-config/domain-config.tsx"],"names":[],"mappings":"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","file":"chunk-X7VIMKLD.js","sourcesContent":["import { Check, Globe, Plus, ShieldCheck, ShieldX, Trash2 } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { Badge } from \"../../primitives/badge/index.js\";\nimport { Button } from \"../../primitives/button/index.js\";\nimport { Input } from \"../../primitives/input/index.js\";\n\nexport type DomainStatus = \"verified\" | \"pending\" | \"invalid\";\n\nexport interface Domain {\n id: string;\n hostname: string;\n status: DomainStatus;\n primary?: boolean;\n /**\n * TLS state. If true, certificate is provisioned & valid.\n */\n tls?: boolean;\n /**\n * DNS record the user must add to verify ownership.\n */\n verificationRecord?: {\n type: \"TXT\" | \"CNAME\" | \"A\";\n name: string;\n value: string;\n };\n}\n\nconst statusVariant: Record<DomainStatus, \"success\" | \"warning\" | \"destructive\"> = {\n verified: \"success\",\n pending: \"warning\",\n invalid: \"destructive\",\n};\nconst statusDot: Record<DomainStatus, \"success\" | \"warning\" | \"destructive\"> = {\n verified: \"success\",\n pending: \"warning\",\n invalid: \"destructive\",\n};\nconst statusLabel: Record<DomainStatus, string> = {\n verified: \"Verified\",\n pending: \"Pending DNS\",\n invalid: \"Invalid\",\n};\n\ninterface DomainConfigProps extends HTMLAttributes<HTMLDivElement> {\n domains: Domain[];\n onAdd?: (hostname: string) => void;\n onRemove?: (id: string) => void;\n onSetPrimary?: (id: string) => void;\n}\n\n/**\n * DomainConfig — manage custom domains for a project.\n *\n * Shows: hostname, status, TLS, primary flag, and verification DNS record when pending.\n * Common in every cloud dashboard (Vercel, Railway, Render).\n */\nconst DomainConfig = forwardRef<HTMLDivElement, DomainConfigProps>(\n ({ className, domains, onAdd, onRemove, onSetPrimary, ...props }, ref) => {\n const [hostname, setHostname] = useState(\"\");\n\n return (\n <div\n ref={ref}\n className={cn(\"rounded-xl border bg-card p-5 shadow-sm\", className)}\n {...props}\n >\n <header className=\"mb-4 flex items-baseline justify-between gap-3\">\n <div>\n <h3 className=\"font-display text-title-md tracking-tight\">Domains</h3>\n <p className=\"text-body-sm text-muted-foreground\">{domains.length} configured</p>\n </div>\n </header>\n\n {onAdd ? (\n <form\n className=\"mb-4 grid grid-cols-[1fr_auto] gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n const v = hostname.trim();\n if (!v) return;\n onAdd(v);\n setHostname(\"\");\n }}\n >\n <Input\n placeholder=\"api.acme.com\"\n value={hostname}\n onChange={(e) => setHostname(e.target.value)}\n aria-label=\"Hostname\"\n className=\"font-mono\"\n />\n <Button type=\"submit\">\n <Plus /> Add domain\n </Button>\n </form>\n ) : null}\n\n <ul className=\"grid gap-3\">\n {domains.map((d) => (\n <li key={d.id} className=\"grid gap-3 rounded-lg border border-border/40 p-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Globe className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"font-mono text-code-md text-foreground\">{d.hostname}</span>\n <Badge variant={statusVariant[d.status]}>\n <Badge.Dot tone={statusDot[d.status]} pulse={d.status === \"pending\"} />\n {statusLabel[d.status]}\n </Badge>\n {d.tls === true ? (\n <Badge variant=\"primary\">\n <ShieldCheck className=\"size-3\" /> TLS\n </Badge>\n ) : d.tls === false ? (\n <Badge variant=\"destructive\">\n <ShieldX className=\"size-3\" /> No TLS\n </Badge>\n ) : null}\n {d.primary ? (\n <Badge variant=\"accent\">\n <Check className=\"size-3\" /> Primary\n </Badge>\n ) : null}\n <div className=\"ml-auto flex items-center gap-1\">\n {!d.primary && onSetPrimary ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => onSetPrimary(d.id)}>\n Set primary\n </Button>\n ) : null}\n {onRemove ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => onRemove(d.id)}\n aria-label={`Remove ${d.hostname}`}\n >\n <Trash2 />\n </Button>\n ) : null}\n </div>\n </div>\n {d.status === \"pending\" && d.verificationRecord ? (\n <div className=\"rounded-md border border-border/60 border-dashed bg-muted/30 p-3 font-mono text-code-sm\">\n <p className=\"mb-2 font-sans text-label-caps text-muted-foreground uppercase\">\n Add this DNS record to verify\n </p>\n <div className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1\">\n <span className=\"text-muted-foreground\">type</span>\n <span>{d.verificationRecord.type}</span>\n <span className=\"text-muted-foreground\">name</span>\n <span>{d.verificationRecord.name}</span>\n <span className=\"text-muted-foreground\">value</span>\n <span className=\"break-all\">{d.verificationRecord.value}</span>\n </div>\n </div>\n ) : null}\n </li>\n ))}\n {domains.length === 0 ? (\n <li className=\"rounded-lg border border-border/40 border-dashed p-8 text-center text-body-sm text-muted-foreground\">\n No domains yet. Add one to route traffic to this project.\n </li>\n ) : null}\n </ul>\n </div>\n );\n },\n);\nDomainConfig.displayName = \"DomainConfig\";\n\nexport { DomainConfig };\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var EmptyState = forwardRef(
|
|
6
|
+
({ className, icon: Icon, title, description, action, eyebrow, dashed = true, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
7
|
+
"div",
|
|
8
|
+
{
|
|
9
|
+
ref,
|
|
10
|
+
className: cn(
|
|
11
|
+
"grid place-items-center gap-3 rounded-2xl border bg-card px-6 py-12 text-center",
|
|
12
|
+
dashed ? "border-border/60 border-dashed" : "border-border/40",
|
|
13
|
+
className
|
|
14
|
+
),
|
|
15
|
+
...props,
|
|
16
|
+
children: [
|
|
17
|
+
Icon ? /* @__PURE__ */ jsx("span", { className: "grid size-12 place-items-center rounded-2xl bg-primary/10 text-primary", children: /* @__PURE__ */ jsx(Icon, { className: "size-6", "aria-hidden": "true" }) }) : null,
|
|
18
|
+
eyebrow ? /* @__PURE__ */ jsx("p", { className: "font-mono text-label-caps text-muted-foreground uppercase", children: eyebrow }) : null,
|
|
19
|
+
/* @__PURE__ */ jsx("h3", { className: "font-display text-foreground text-title-md", children: title }),
|
|
20
|
+
description ? /* @__PURE__ */ jsx("p", { className: "max-w-md text-body-sm text-muted-foreground", children: description }) : null,
|
|
21
|
+
action ? /* @__PURE__ */ jsx("div", { className: "mt-2", children: action }) : null
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
)
|
|
25
|
+
);
|
|
26
|
+
EmptyState.displayName = "EmptyState";
|
|
27
|
+
|
|
28
|
+
export { EmptyState };
|
|
29
|
+
//# sourceMappingURL=chunk-XJ3EG6XY.js.map
|
|
30
|
+
//# sourceMappingURL=chunk-XJ3EG6XY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/empty-state/empty-state.tsx"],"names":[],"mappings":";;;;AAwBA,IAAM,UAAA,GAAa,UAAA;AAAA,EACjB,CACE,EAAE,SAAA,EAAW,IAAA,EAAM,MAAM,KAAA,EAAO,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAS,MAAA,GAAS,IAAA,EAAM,GAAG,KAAA,IAChF,GAAA,qBAEA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,iFAAA;AAAA,QACA,SAAS,gCAAA,GAAmC,kBAAA;AAAA,QAC5C;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wEAAA,EACd,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,CAAA,EAC9C,CAAA,GACE,IAAA;AAAA,QACH,0BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2DAAA,EAA6D,mBAAQ,CAAA,GAChF,IAAA;AAAA,wBACJ,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4CAAA,EAA8C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACjE,8BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA+C,uBAAY,CAAA,GACtE,IAAA;AAAA,QACH,yBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAQ,kBAAO,CAAA,GAAS;AAAA;AAAA;AAAA;AAGvD;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-XJ3EG6XY.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\ninterface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Icon shown above the title. */\n icon?: IconComponent;\n title: ReactNode;\n description?: ReactNode;\n /** Optional action slot (typically <Button>). */\n action?: ReactNode;\n /** Hint shown above the title (e.g. uppercase eyebrow). */\n eyebrow?: ReactNode;\n /** Bordered dashed surface (placeholder vibe). Default true. */\n dashed?: boolean;\n}\n\n/**\n * EmptyState — visual placeholder for empty lists / first-run screens.\n *\n * Composition: icon + eyebrow + title + description + action. All slots are\n * optional except title.\n */\nconst EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n (\n { className, icon: Icon, title, description, action, eyebrow, dashed = true, ...props },\n ref,\n ) => (\n <div\n ref={ref}\n className={cn(\n \"grid place-items-center gap-3 rounded-2xl border bg-card px-6 py-12 text-center\",\n dashed ? \"border-border/60 border-dashed\" : \"border-border/40\",\n className,\n )}\n {...props}\n >\n {Icon ? (\n <span className=\"grid size-12 place-items-center rounded-2xl bg-primary/10 text-primary\">\n <Icon className=\"size-6\" aria-hidden=\"true\" />\n </span>\n ) : null}\n {eyebrow ? (\n <p className=\"font-mono text-label-caps text-muted-foreground uppercase\">{eyebrow}</p>\n ) : null}\n <h3 className=\"font-display text-foreground text-title-md\">{title}</h3>\n {description ? (\n <p className=\"max-w-md text-body-sm text-muted-foreground\">{description}</p>\n ) : null}\n {action ? <div className=\"mt-2\">{action}</div> : null}\n </div>\n ),\n);\nEmptyState.displayName = \"EmptyState\";\n\nexport { EmptyState };\n"]}
|