@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,89 @@
|
|
|
1
|
+
import { BadgeWithDot } from './chunk-P57HUMAE.js';
|
|
2
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
3
|
+
import { GitCommit } from 'lucide-react';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var statusToVariant = {
|
|
8
|
+
queued: "warning",
|
|
9
|
+
building: "primary",
|
|
10
|
+
deploying: "primary",
|
|
11
|
+
live: "success",
|
|
12
|
+
failed: "destructive",
|
|
13
|
+
cancelled: "default"
|
|
14
|
+
};
|
|
15
|
+
var statusToDotTone = {
|
|
16
|
+
queued: "warning",
|
|
17
|
+
building: "primary",
|
|
18
|
+
deploying: "primary",
|
|
19
|
+
live: "success",
|
|
20
|
+
failed: "destructive",
|
|
21
|
+
cancelled: "muted"
|
|
22
|
+
};
|
|
23
|
+
var statusLabels = {
|
|
24
|
+
queued: "Queued",
|
|
25
|
+
building: "Building",
|
|
26
|
+
deploying: "Deploying",
|
|
27
|
+
live: "Live",
|
|
28
|
+
failed: "Failed",
|
|
29
|
+
cancelled: "Cancelled"
|
|
30
|
+
};
|
|
31
|
+
var isAnimated = (status) => status === "building" || status === "deploying" || status === "queued";
|
|
32
|
+
var DeploymentRow = forwardRef(
|
|
33
|
+
({ className, deployment, actions, ...props }, ref) => {
|
|
34
|
+
const variant = statusToVariant[deployment.status];
|
|
35
|
+
const tone = statusToDotTone[deployment.status];
|
|
36
|
+
return /* @__PURE__ */ jsxs(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
ref,
|
|
40
|
+
className: cn(
|
|
41
|
+
"grid grid-cols-[auto_1fr_auto] items-center gap-4 border-border/40 border-b px-4 py-3",
|
|
42
|
+
"last:border-b-0",
|
|
43
|
+
"transition-colors hover:bg-muted/40",
|
|
44
|
+
className
|
|
45
|
+
),
|
|
46
|
+
...props,
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ jsxs(BadgeWithDot, { variant, className: "min-w-[88px] justify-center", children: [
|
|
49
|
+
/* @__PURE__ */ jsx(BadgeWithDot.Dot, { tone, pulse: isAnimated(deployment.status) }),
|
|
50
|
+
statusLabels[deployment.status]
|
|
51
|
+
] }),
|
|
52
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
53
|
+
/* @__PURE__ */ jsx("p", { className: "truncate font-medium text-body-sm text-foreground", children: deployment.commitMessage }),
|
|
54
|
+
/* @__PURE__ */ jsxs("p", { className: "mt-0.5 flex flex-wrap items-center gap-2 text-body-sm text-muted-foreground", children: [
|
|
55
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-code-sm", children: deployment.environment }),
|
|
56
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
57
|
+
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 font-mono text-code-sm", children: [
|
|
58
|
+
/* @__PURE__ */ jsx(GitCommit, { className: "size-3" }),
|
|
59
|
+
" ",
|
|
60
|
+
deployment.commitSha.slice(0, 7)
|
|
61
|
+
] }),
|
|
62
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
63
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-code-sm", children: deployment.branch }),
|
|
64
|
+
deployment.author ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
65
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
66
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
67
|
+
"by ",
|
|
68
|
+
deployment.author.name
|
|
69
|
+
] })
|
|
70
|
+
] }) : null,
|
|
71
|
+
deployment.duration ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
72
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
73
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-code-sm", children: deployment.duration })
|
|
74
|
+
] }) : null,
|
|
75
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
76
|
+
/* @__PURE__ */ jsx("span", { children: deployment.timeAgo })
|
|
77
|
+
] })
|
|
78
|
+
] }),
|
|
79
|
+
actions ? /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1", children: actions }) : null
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
DeploymentRow.displayName = "DeploymentRow";
|
|
86
|
+
|
|
87
|
+
export { DeploymentRow };
|
|
88
|
+
//# sourceMappingURL=chunk-QDAF3LP7.js.map
|
|
89
|
+
//# sourceMappingURL=chunk-QDAF3LP7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/deployment-row/deployment-row.tsx"],"names":[],"mappings":"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","file":"chunk-QDAF3LP7.js","sourcesContent":["import { GitCommit } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { Badge } from \"../../primitives/badge/index.js\";\n\nexport type DeploymentStatus =\n | \"queued\"\n | \"building\"\n | \"deploying\"\n | \"live\"\n | \"failed\"\n | \"cancelled\";\n\nconst statusToVariant: Record<\n DeploymentStatus,\n \"default\" | \"primary\" | \"success\" | \"warning\" | \"destructive\"\n> = {\n queued: \"warning\",\n building: \"primary\",\n deploying: \"primary\",\n live: \"success\",\n failed: \"destructive\",\n cancelled: \"default\",\n};\n\nconst statusToDotTone: Record<\n DeploymentStatus,\n \"primary\" | \"success\" | \"warning\" | \"destructive\" | \"muted\"\n> = {\n queued: \"warning\",\n building: \"primary\",\n deploying: \"primary\",\n live: \"success\",\n failed: \"destructive\",\n cancelled: \"muted\",\n};\n\nconst statusLabels: Record<DeploymentStatus, string> = {\n queued: \"Queued\",\n building: \"Building\",\n deploying: \"Deploying\",\n live: \"Live\",\n failed: \"Failed\",\n cancelled: \"Cancelled\",\n};\n\nconst isAnimated = (status: DeploymentStatus) =>\n status === \"building\" || status === \"deploying\" || status === \"queued\";\n\nexport interface Deployment {\n id: string;\n status: DeploymentStatus;\n environment: string;\n branch: string;\n commitSha: string;\n commitMessage: string;\n author?: { name: string; avatarUrl?: string };\n duration?: string;\n timeAgo: string;\n}\n\ninterface DeploymentRowProps extends HTMLAttributes<HTMLDivElement> {\n deployment: Deployment;\n actions?: ReactNode;\n}\n\n/**\n * DeploymentRow — one row in a deployment list (table-ish layout).\n *\n * Inspired by Vercel/Railway deployment lists. Composes Badge + Badge.Dot for status,\n * mono font for SHA/branch, muted-foreground for metadata.\n */\nconst DeploymentRow = forwardRef<HTMLDivElement, DeploymentRowProps>(\n ({ className, deployment, actions, ...props }, ref) => {\n const variant = statusToVariant[deployment.status];\n const tone = statusToDotTone[deployment.status];\n return (\n <div\n ref={ref}\n className={cn(\n \"grid grid-cols-[auto_1fr_auto] items-center gap-4 border-border/40 border-b px-4 py-3\",\n \"last:border-b-0\",\n \"transition-colors hover:bg-muted/40\",\n className,\n )}\n {...props}\n >\n <Badge variant={variant} className=\"min-w-[88px] justify-center\">\n <Badge.Dot tone={tone} pulse={isAnimated(deployment.status)} />\n {statusLabels[deployment.status]}\n </Badge>\n\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-body-sm text-foreground\">\n {deployment.commitMessage}\n </p>\n <p className=\"mt-0.5 flex flex-wrap items-center gap-2 text-body-sm text-muted-foreground\">\n <span className=\"font-mono text-code-sm\">{deployment.environment}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"inline-flex items-center gap-1 font-mono text-code-sm\">\n <GitCommit className=\"size-3\" /> {deployment.commitSha.slice(0, 7)}\n </span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"font-mono text-code-sm\">{deployment.branch}</span>\n {deployment.author ? (\n <>\n <span aria-hidden=\"true\">·</span>\n <span>by {deployment.author.name}</span>\n </>\n ) : null}\n {deployment.duration ? (\n <>\n <span aria-hidden=\"true\">·</span>\n <span className=\"font-mono text-code-sm\">{deployment.duration}</span>\n </>\n ) : null}\n <span aria-hidden=\"true\">·</span>\n <span>{deployment.timeAgo}</span>\n </p>\n </div>\n\n {actions ? <div className=\"flex items-center gap-1\">{actions}</div> : null}\n </div>\n );\n },\n);\nDeploymentRow.displayName = \"DeploymentRow\";\n\nexport { DeploymentRow };\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CopyButton } from './chunk-ZEVGXKRU.js';
|
|
2
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var CodeBlock = forwardRef(
|
|
7
|
+
({ className, code, language: _language, terminal, copyable, caption, ...props }, ref) => {
|
|
8
|
+
const lines = code.split(/\r?\n/);
|
|
9
|
+
return /* @__PURE__ */ jsxs(
|
|
10
|
+
"div",
|
|
11
|
+
{
|
|
12
|
+
ref,
|
|
13
|
+
className: cn(
|
|
14
|
+
"relative rounded-lg border border-border/40 bg-muted/40 font-mono text-body-sm",
|
|
15
|
+
className
|
|
16
|
+
),
|
|
17
|
+
...props,
|
|
18
|
+
children: [
|
|
19
|
+
caption !== void 0 ? /* @__PURE__ */ jsx("div", { className: "border-border/40 border-b px-3 py-1.5 font-sans text-label text-muted-foreground", children: caption }) : null,
|
|
20
|
+
copyable ? /* @__PURE__ */ jsx(CopyButton, { value: code, "aria-label": "Copy code", className: "absolute top-2 right-2" }) : null,
|
|
21
|
+
/* @__PURE__ */ jsx("pre", { className: "overflow-x-auto p-3 text-foreground", children: terminal ? /* @__PURE__ */ jsx("code", { children: lines.map((line, i) => (
|
|
22
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: code lines are positional; reorder requires consumer recompute.
|
|
23
|
+
/* @__PURE__ */ jsxs("span", { className: "block whitespace-pre", children: [
|
|
24
|
+
/* @__PURE__ */ jsx("span", { className: "select-none text-muted-foreground", children: "$ " }),
|
|
25
|
+
line
|
|
26
|
+
] }, i)
|
|
27
|
+
)) }) : /* @__PURE__ */ jsx("code", { children: code }) })
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
CodeBlock.displayName = "CodeBlock";
|
|
34
|
+
|
|
35
|
+
export { CodeBlock };
|
|
36
|
+
//# sourceMappingURL=chunk-QGVIGNJ3.js.map
|
|
37
|
+
//# sourceMappingURL=chunk-QGVIGNJ3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/code-block/code-block.tsx"],"names":[],"mappings":";;;;;AAgCA,IAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACxF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEhC,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,gFAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,OAAA,KAAY,yBACX,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAAA,EACZ,mBACH,CAAA,GACE,IAAA;AAAA,UACH,QAAA,uBACE,UAAA,EAAA,EAAW,KAAA,EAAO,MAAM,YAAA,EAAW,WAAA,EAAY,SAAA,EAAU,wBAAA,EAAyB,CAAA,GACjF,IAAA;AAAA,0BACJ,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACZ,QAAA,EAAA,QAAA,uBACE,MAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA;AAAA;AAAA,4BAEhB,IAAA,CAAC,MAAA,EAAA,EAAa,SAAA,EAAU,sBAAA,EACtB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,cACrD;AAAA,aAAA,EAAA,EAFQ,CAGX;AAAA,WACD,CAAA,EACH,CAAA,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAM,gBAAK,CAAA,EAEhB;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-QGVIGNJ3.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { CopyButton } from \"../../primitives/copy-button/index.js\";\n\n/**\n * CodeBlock — terminal command / code snippet surface.\n *\n * Pre-rendered code block with optional terminal \"$ \" prefix per line,\n * optional caption (file name), and optional CopyButton positioned top-right.\n * The CopyButton receives the RAW `code` (without the visual \"$ \" prefix),\n * so consumers paste only the executable command.\n *\n * @example\n * <CodeBlock code=\"theo deploy\" terminal copyable />\n * <CodeBlock code={dotenv} caption=\".env.local\" copyable />\n *\n * `language` is reserved for future syntax highlighting (v1: ignored).\n */\nexport interface CodeBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Code content. Can be multiline. */\n code: string;\n /** Language hint (forward-compat; v1 ignored). */\n language?: string;\n /** When true, prefix each line with \"$ \" for shell commands. */\n terminal?: boolean;\n /** Show inline CopyButton in top-right. */\n copyable?: boolean;\n /** Optional caption above block (e.g. \".env.local\"). */\n caption?: ReactNode;\n}\n\nconst CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(\n ({ className, code, language: _language, terminal, copyable, caption, ...props }, ref) => {\n const lines = code.split(/\\r?\\n/);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"relative rounded-lg border border-border/40 bg-muted/40 font-mono text-body-sm\",\n className,\n )}\n {...props}\n >\n {caption !== undefined ? (\n <div className=\"border-border/40 border-b px-3 py-1.5 font-sans text-label text-muted-foreground\">\n {caption}\n </div>\n ) : null}\n {copyable ? (\n <CopyButton value={code} aria-label=\"Copy code\" className=\"absolute top-2 right-2\" />\n ) : null}\n <pre className=\"overflow-x-auto p-3 text-foreground\">\n {terminal ? (\n <code>\n {lines.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: code lines are positional; reorder requires consumer recompute.\n <span key={i} className=\"block whitespace-pre\">\n <span className=\"select-none text-muted-foreground\">$ </span>\n {line}\n </span>\n ))}\n </code>\n ) : (\n <code>{code}</code>\n )}\n </pre>\n </div>\n );\n },\n);\nCodeBlock.displayName = \"CodeBlock\";\n\nexport { CodeBlock };\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var ScrollAreaRoot = forwardRef(
|
|
7
|
+
({ className, children, orientation = "vertical", size = "thin", type = "hover", ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
8
|
+
ScrollAreaPrimitive.Root,
|
|
9
|
+
{
|
|
10
|
+
ref,
|
|
11
|
+
type,
|
|
12
|
+
className: cn("relative overflow-hidden", className),
|
|
13
|
+
...props,
|
|
14
|
+
children: [
|
|
15
|
+
/* @__PURE__ */ jsx(
|
|
16
|
+
ScrollAreaPrimitive.Viewport,
|
|
17
|
+
{
|
|
18
|
+
className: cn(
|
|
19
|
+
"h-full w-full rounded-[inherit]",
|
|
20
|
+
// Smooth scroll-behavior + masked overflow inheriting any inner radius
|
|
21
|
+
"[&>div]:!block"
|
|
22
|
+
),
|
|
23
|
+
children
|
|
24
|
+
}
|
|
25
|
+
),
|
|
26
|
+
orientation === "vertical" || orientation === "both" ? /* @__PURE__ */ jsx(ScrollBar, { orientation: "vertical", size }) : null,
|
|
27
|
+
orientation === "horizontal" || orientation === "both" ? /* @__PURE__ */ jsx(ScrollBar, { orientation: "horizontal", size }) : null,
|
|
28
|
+
/* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, { className: "bg-transparent" })
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
);
|
|
33
|
+
ScrollAreaRoot.displayName = "ScrollArea";
|
|
34
|
+
var ScrollBar = forwardRef(({ className, orientation = "vertical", size = "thin", ...props }, ref) => /* @__PURE__ */ jsx(
|
|
35
|
+
ScrollAreaPrimitive.ScrollAreaScrollbar,
|
|
36
|
+
{
|
|
37
|
+
ref,
|
|
38
|
+
orientation,
|
|
39
|
+
className: cn(
|
|
40
|
+
"z-10 flex touch-none select-none p-0.5 transition-[width,height,background-color] duration-base ease-out-soft",
|
|
41
|
+
// hover state slightly lifts the track with a near-invisible violet wash
|
|
42
|
+
"hover:bg-primary/5",
|
|
43
|
+
orientation === "vertical" && (size === "thin" ? "h-full w-2.5 border-l border-l-transparent" : "h-full w-3 border-l border-l-transparent"),
|
|
44
|
+
orientation === "horizontal" && (size === "thin" ? "h-2.5 w-full flex-col border-t border-t-transparent" : "h-3 w-full flex-col border-t border-t-transparent"),
|
|
45
|
+
className
|
|
46
|
+
),
|
|
47
|
+
...props,
|
|
48
|
+
children: /* @__PURE__ */ jsx(
|
|
49
|
+
ScrollAreaPrimitive.ScrollAreaThumb,
|
|
50
|
+
{
|
|
51
|
+
className: cn(
|
|
52
|
+
"relative flex-1 rounded-full bg-primary/30",
|
|
53
|
+
"transition-[background-color,box-shadow] duration-fast ease-out-soft",
|
|
54
|
+
// Theme-aware: glow uses --primary (recolors when theme switches)
|
|
55
|
+
"hover:bg-primary/55 hover:shadow-[0_0_8px_hsl(var(--primary)/0.35)]",
|
|
56
|
+
// Drag state uses Radix data-state="visible" + :active
|
|
57
|
+
"active:bg-primary/75 data-[state=visible]:bg-primary/45"
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
));
|
|
63
|
+
ScrollBar.displayName = "ScrollArea.Bar";
|
|
64
|
+
var ScrollArea = /* @__PURE__ */ Object.assign(ScrollAreaRoot, { Bar: ScrollBar });
|
|
65
|
+
|
|
66
|
+
export { ScrollArea };
|
|
67
|
+
//# sourceMappingURL=chunk-QNUITYSY.js.map
|
|
68
|
+
//# sourceMappingURL=chunk-QNUITYSY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/scroll-area/scroll-area.tsx"],"names":[],"mappings":";;;;;AAsCA,IAAM,cAAA,GAAiB,UAAA;AAAA,EACrB,CACE,EAAE,SAAA,EAAW,QAAA,EAAU,WAAA,GAAc,UAAA,EAAY,IAAA,GAAO,MAAA,EAAQ,IAAA,GAAO,OAAA,EAAS,GAAG,KAAA,IACnF,GAAA,qBAEA,IAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,GAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,MAClD,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAqB,mBAAA,CAAA,QAAA;AAAA,UAApB;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,iCAAA;AAAA;AAAA,cAEA;AAAA,aACF;AAAA,YAEC;AAAA;AAAA,SACH;AAAA,QACC,WAAA,KAAgB,cAAc,WAAA,KAAgB,MAAA,uBAC5C,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,IAAA,EAAY,CAAA,GAC5C,IAAA;AAAA,QACH,WAAA,KAAgB,gBAAgB,WAAA,KAAgB,MAAA,uBAC9C,SAAA,EAAA,EAAU,WAAA,EAAY,YAAA,EAAa,IAAA,EAAY,CAAA,GAC9C,IAAA;AAAA,wBACJ,GAAA,CAAqB,mBAAA,CAAA,MAAA,EAApB,EAA2B,SAAA,EAAU,gBAAA,EAAiB;AAAA;AAAA;AAAA;AAG7D,CAAA;AACA,cAAA,CAAe,WAAA,GAAc,YAAA;AAO7B,IAAM,SAAA,GAAY,UAAA,CAGhB,CAAC,EAAE,SAAA,EAAW,WAAA,GAAc,UAAA,EAAY,IAAA,GAAO,MAAA,EAAQ,GAAG,KAAA,EAAM,EAAG,GAAA,qBACnE,GAAA;AAAA,EAAqB,mBAAA,CAAA,mBAAA;AAAA,EAApB;AAAA,IACC,GAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,+GAAA;AAAA;AAAA,MAEA,oBAAA;AAAA,MACA,WAAA,KAAgB,UAAA,KACb,IAAA,KAAS,MAAA,GACN,4CAAA,GACA,0CAAA,CAAA;AAAA,MACN,WAAA,KAAgB,YAAA,KACb,IAAA,KAAS,MAAA,GACN,qDAAA,GACA,mDAAA,CAAA;AAAA,MACN;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAA,GAAA;AAAA,MAAqB,mBAAA,CAAA,eAAA;AAAA,MAApB;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,4CAAA;AAAA,UACA,sEAAA;AAAA;AAAA,UAEA,qEAAA;AAAA;AAAA,UAEA;AAAA;AACF;AAAA;AACF;AACF,CACD,CAAA;AACD,SAAA,CAAU,WAAA,GAAc,gBAAA;AAMxB,IAAM,6BAA2B,MAAA,CAAO,MAAA,CAAO,gBAAgB,EAAE,GAAA,EAAK,WAAW","file":"chunk-QNUITYSY.js","sourcesContent":["import * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ElementRef } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * ScrollArea — custom scroller with Violet Forge styling.\n *\n * Built on Radix ScrollArea so the native scrollbar is always hidden and the\n * custom thumb stays consistent across Chrome/Firefox/Safari/macOS-trackpad.\n *\n * Visual:\n * - track is transparent, only the thumb is visible.\n * - thumb is `--primary` at 25% opacity by default; on hover, 45% with violet glow.\n * - active drag bumps to 60%.\n * - the rounded full pill thumb plays well with the brutalist border language\n * but stays subtle (1.5px wide on rest, 3px on hover).\n *\n * Modes (via `type`):\n * - \"hover\" (default) — scrollbar fades in on hover/focus, otherwise hidden.\n * - \"always\" — scrollbar always visible.\n * - \"auto\" — scrollbar visible only when content overflows.\n * - \"scroll\" — Radix-managed: visible only while scrolling.\n */\n\ninterface ScrollAreaProps extends ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> {\n /**\n * Optional override for which scrollbar(s) to render.\n * Defaults: vertical only. Set to \"both\" for grids/tables with overflow-x.\n */\n orientation?: \"vertical\" | \"horizontal\" | \"both\";\n /**\n * Thickness of the scrollbar. Default \"thin\" (2.5px → 3.5px on hover).\n * Use \"regular\" (8px) for content where the scrollbar should be a more prominent target.\n */\n size?: \"thin\" | \"regular\";\n}\n\nconst ScrollAreaRoot = forwardRef<ElementRef<typeof ScrollAreaPrimitive.Root>, ScrollAreaProps>(\n (\n { className, children, orientation = \"vertical\", size = \"thin\", type = \"hover\", ...props },\n ref,\n ) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n type={type}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n className={cn(\n \"h-full w-full rounded-[inherit]\",\n // Smooth scroll-behavior + masked overflow inheriting any inner radius\n \"[&>div]:!block\",\n )}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {orientation === \"vertical\" || orientation === \"both\" ? (\n <ScrollBar orientation=\"vertical\" size={size} />\n ) : null}\n {orientation === \"horizontal\" || orientation === \"both\" ? (\n <ScrollBar orientation=\"horizontal\" size={size} />\n ) : null}\n <ScrollAreaPrimitive.Corner className=\"bg-transparent\" />\n </ScrollAreaPrimitive.Root>\n ),\n);\nScrollAreaRoot.displayName = \"ScrollArea\";\n\ninterface ScrollBarProps\n extends ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar> {\n size?: \"thin\" | \"regular\";\n}\n\nconst ScrollBar = forwardRef<\n ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n ScrollBarProps\n>(({ className, orientation = \"vertical\", size = \"thin\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"z-10 flex touch-none select-none p-0.5 transition-[width,height,background-color] duration-base ease-out-soft\",\n // hover state slightly lifts the track with a near-invisible violet wash\n \"hover:bg-primary/5\",\n orientation === \"vertical\" &&\n (size === \"thin\"\n ? \"h-full w-2.5 border-l border-l-transparent\"\n : \"h-full w-3 border-l border-l-transparent\"),\n orientation === \"horizontal\" &&\n (size === \"thin\"\n ? \"h-2.5 w-full flex-col border-t border-t-transparent\"\n : \"h-3 w-full flex-col border-t border-t-transparent\"),\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n className={cn(\n \"relative flex-1 rounded-full bg-primary/30\",\n \"transition-[background-color,box-shadow] duration-fast ease-out-soft\",\n // Theme-aware: glow uses --primary (recolors when theme switches)\n \"hover:bg-primary/55 hover:shadow-[0_0_8px_hsl(var(--primary)/0.35)]\",\n // Drag state uses Radix data-state=\"visible\" + :active\n \"active:bg-primary/75 data-[state=visible]:bg-primary/45\",\n )}\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = \"ScrollArea.Bar\";\n\n// Compound assembly. `ScrollArea.Bar` is the only public surface for the\n// scroll bar. The previous standalone `ScrollBar` re-export was deprecated\n// theater in v0.0.0 (no public consumers exist on a pre-published package),\n// so it was removed cleanly in T7.4 (agent-team-audit-fixes plan).\nconst ScrollArea = /*#__PURE__*/ Object.assign(ScrollAreaRoot, { Bar: ScrollBar });\n\nexport { ScrollArea };\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { Clock, Sparkles, Coins, MessageSquare, ChevronRight } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var STATUS_CLASS = {
|
|
7
|
+
active: "border-primary/40 bg-primary/15 text-primary",
|
|
8
|
+
completed: "border-success/40 bg-success/15 text-success",
|
|
9
|
+
failed: "border-destructive/40 bg-destructive/15 text-destructive",
|
|
10
|
+
aborted: "border-border/40 bg-muted text-muted-foreground"
|
|
11
|
+
};
|
|
12
|
+
var STATUS_LABEL = {
|
|
13
|
+
active: "Active",
|
|
14
|
+
completed: "Completed",
|
|
15
|
+
failed: "Failed",
|
|
16
|
+
aborted: "Aborted"
|
|
17
|
+
};
|
|
18
|
+
var SessionTimeline = forwardRef(
|
|
19
|
+
({ className, sessions, title = "Recent sessions", onOpen, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
20
|
+
"section",
|
|
21
|
+
{
|
|
22
|
+
ref,
|
|
23
|
+
className: cn("rounded-xl border bg-card", className),
|
|
24
|
+
"aria-label": "Session history",
|
|
25
|
+
...props,
|
|
26
|
+
children: [
|
|
27
|
+
title ? /* @__PURE__ */ jsxs("header", { className: "flex items-baseline justify-between border-border/40 border-b px-4 py-3", children: [
|
|
28
|
+
/* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }),
|
|
29
|
+
/* @__PURE__ */ jsxs("span", { className: "font-mono text-label text-muted-foreground", children: [
|
|
30
|
+
sessions.length,
|
|
31
|
+
" ",
|
|
32
|
+
sessions.length === 1 ? "session" : "sessions"
|
|
33
|
+
] })
|
|
34
|
+
] }) : null,
|
|
35
|
+
/* @__PURE__ */ jsxs("ul", { className: "divide-y divide-border/30", children: [
|
|
36
|
+
sessions.map((s) => {
|
|
37
|
+
const RowTag = onOpen ? "button" : "div";
|
|
38
|
+
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
39
|
+
RowTag,
|
|
40
|
+
{
|
|
41
|
+
type: onOpen ? "button" : void 0,
|
|
42
|
+
onClick: onOpen ? () => onOpen(s.id) : void 0,
|
|
43
|
+
className: cn(
|
|
44
|
+
"grid w-full grid-cols-[1fr_auto] items-center gap-3 px-4 py-3 text-left",
|
|
45
|
+
onOpen && "hover:bg-muted/40 focus-visible:bg-muted/40 focus-visible:outline-none"
|
|
46
|
+
),
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
49
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
50
|
+
/* @__PURE__ */ jsx("p", { className: "truncate font-medium text-body-sm text-foreground", children: s.title }),
|
|
51
|
+
/* @__PURE__ */ jsx(
|
|
52
|
+
"span",
|
|
53
|
+
{
|
|
54
|
+
className: cn(
|
|
55
|
+
"inline-flex shrink-0 items-center rounded-full border px-2 py-0.5",
|
|
56
|
+
"font-mono text-label uppercase tracking-wider",
|
|
57
|
+
STATUS_CLASS[s.status]
|
|
58
|
+
),
|
|
59
|
+
children: STATUS_LABEL[s.status]
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-3 font-mono text-label text-muted-foreground", children: [
|
|
64
|
+
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
65
|
+
/* @__PURE__ */ jsx(Clock, { className: "size-3", "aria-hidden": "true" }),
|
|
66
|
+
" ",
|
|
67
|
+
s.startedAt,
|
|
68
|
+
s.duration ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
69
|
+
" \xB7 ",
|
|
70
|
+
s.duration
|
|
71
|
+
] }) : null
|
|
72
|
+
] }),
|
|
73
|
+
s.model ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
74
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "size-3", "aria-hidden": "true" }),
|
|
75
|
+
" ",
|
|
76
|
+
s.model
|
|
77
|
+
] }) : null,
|
|
78
|
+
s.tokens ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
79
|
+
/* @__PURE__ */ jsx(Coins, { className: "size-3", "aria-hidden": "true" }),
|
|
80
|
+
" ",
|
|
81
|
+
s.tokens,
|
|
82
|
+
" tok"
|
|
83
|
+
] }) : null,
|
|
84
|
+
s.cost !== void 0 ? /* @__PURE__ */ jsxs("span", { className: "tabular-nums", children: [
|
|
85
|
+
"$",
|
|
86
|
+
s.cost.toFixed(2)
|
|
87
|
+
] }) : null,
|
|
88
|
+
s.messageCount !== void 0 ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
89
|
+
/* @__PURE__ */ jsx(MessageSquare, { className: "size-3", "aria-hidden": "true" }),
|
|
90
|
+
" ",
|
|
91
|
+
s.messageCount
|
|
92
|
+
] }) : null
|
|
93
|
+
] })
|
|
94
|
+
] }),
|
|
95
|
+
onOpen ? /* @__PURE__ */ jsx(
|
|
96
|
+
ChevronRight,
|
|
97
|
+
{
|
|
98
|
+
className: "size-4 shrink-0 text-muted-foreground",
|
|
99
|
+
"aria-hidden": "true"
|
|
100
|
+
}
|
|
101
|
+
) : null
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
) }, s.id);
|
|
105
|
+
}),
|
|
106
|
+
sessions.length === 0 ? /* @__PURE__ */ jsx("li", { className: "px-4 py-8 text-center font-sans text-body-sm text-muted-foreground", children: "No sessions yet." }) : null
|
|
107
|
+
] })
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
);
|
|
112
|
+
SessionTimeline.displayName = "SessionTimeline";
|
|
113
|
+
|
|
114
|
+
export { SessionTimeline };
|
|
115
|
+
//# sourceMappingURL=chunk-QSWVN3RT.js.map
|
|
116
|
+
//# sourceMappingURL=chunk-QSWVN3RT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/session-timeline/session-timeline.tsx"],"names":[],"mappings":"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","file":"chunk-QSWVN3RT.js","sourcesContent":["import { ChevronRight, Clock, Coins, MessageSquare, Sparkles } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type SessionStatus = \"active\" | \"completed\" | \"failed\" | \"aborted\";\n\nexport interface SessionSummary {\n id: string;\n /** Friendly title (often the first user message). */\n title: string;\n /** ISO timestamp / friendly date label. */\n startedAt: string;\n duration?: string;\n status: SessionStatus;\n /** Agent/model that ran the session. */\n model?: string;\n /** Total tokens consumed (formatted, e.g. \"35.7k\"). */\n tokens?: string;\n /** Total cost (USD). */\n cost?: number;\n /** Number of messages in the session. */\n messageCount?: number;\n}\n\ninterface SessionTimelineProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n sessions: SessionSummary[];\n /** Title above the list. */\n title?: ReactNode;\n /** Fires when a row is clicked. */\n onOpen?: (id: string) => void;\n}\n\nconst STATUS_CLASS: Record<SessionStatus, string> = {\n active: \"border-primary/40 bg-primary/15 text-primary\",\n completed: \"border-success/40 bg-success/15 text-success\",\n failed: \"border-destructive/40 bg-destructive/15 text-destructive\",\n aborted: \"border-border/40 bg-muted text-muted-foreground\",\n};\n\nconst STATUS_LABEL: Record<SessionStatus, string> = {\n active: \"Active\",\n completed: \"Completed\",\n failed: \"Failed\",\n aborted: \"Aborted\",\n};\n\n/**\n * SessionTimeline — historical view of past agent sessions with per-row\n * tokens / cost / duration / status. Click a row to open the full session.\n */\nconst SessionTimeline = forwardRef<HTMLDivElement, SessionTimelineProps>(\n ({ className, sessions, title = \"Recent sessions\", onOpen, ...props }, ref) => (\n <section\n ref={ref}\n className={cn(\"rounded-xl border bg-card\", className)}\n aria-label=\"Session history\"\n {...props}\n >\n {title ? (\n <header className=\"flex items-baseline justify-between border-border/40 border-b px-4 py-3\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n <span className=\"font-mono text-label text-muted-foreground\">\n {sessions.length} {sessions.length === 1 ? \"session\" : \"sessions\"}\n </span>\n </header>\n ) : null}\n <ul className=\"divide-y divide-border/30\">\n {sessions.map((s) => {\n const RowTag = onOpen ? \"button\" : \"div\";\n return (\n <li key={s.id}>\n <RowTag\n type={onOpen ? \"button\" : undefined}\n onClick={onOpen ? () => onOpen(s.id) : undefined}\n className={cn(\n \"grid w-full grid-cols-[1fr_auto] items-center gap-3 px-4 py-3 text-left\",\n onOpen &&\n \"hover:bg-muted/40 focus-visible:bg-muted/40 focus-visible:outline-none\",\n )}\n >\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"truncate font-medium text-body-sm text-foreground\">{s.title}</p>\n <span\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full border px-2 py-0.5\",\n \"font-mono text-label uppercase tracking-wider\",\n STATUS_CLASS[s.status],\n )}\n >\n {STATUS_LABEL[s.status]}\n </span>\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-3 font-mono text-label text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"size-3\" aria-hidden=\"true\" /> {s.startedAt}\n {s.duration ? <> · {s.duration}</> : null}\n </span>\n {s.model ? (\n <span className=\"inline-flex items-center gap-1\">\n <Sparkles className=\"size-3\" aria-hidden=\"true\" /> {s.model}\n </span>\n ) : null}\n {s.tokens ? (\n <span className=\"inline-flex items-center gap-1\">\n <Coins className=\"size-3\" aria-hidden=\"true\" /> {s.tokens} tok\n </span>\n ) : null}\n {s.cost !== undefined ? (\n <span className=\"tabular-nums\">${s.cost.toFixed(2)}</span>\n ) : null}\n {s.messageCount !== undefined ? (\n <span className=\"inline-flex items-center gap-1\">\n <MessageSquare className=\"size-3\" aria-hidden=\"true\" /> {s.messageCount}\n </span>\n ) : null}\n </div>\n </div>\n {onOpen ? (\n <ChevronRight\n className=\"size-4 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n ) : null}\n </RowTag>\n </li>\n );\n })}\n {sessions.length === 0 ? (\n <li className=\"px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No sessions yet.\n </li>\n ) : null}\n </ul>\n </section>\n ),\n);\nSessionTimeline.displayName = \"SessionTimeline\";\n\nexport { SessionTimeline };\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { EmptyState } from './chunk-XJ3EG6XY.js';
|
|
2
|
+
import { Card } from './chunk-K45OO62F.js';
|
|
3
|
+
import { ActionBar } from './chunk-7EI7424P.js';
|
|
4
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
5
|
+
import { AlertCircle, Loader2 } from 'lucide-react';
|
|
6
|
+
import { forwardRef, useEffect } from 'react';
|
|
7
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var PageShell = forwardRef(
|
|
10
|
+
({
|
|
11
|
+
title,
|
|
12
|
+
description,
|
|
13
|
+
onTitleChange,
|
|
14
|
+
primaryAction,
|
|
15
|
+
search,
|
|
16
|
+
onFilterClick,
|
|
17
|
+
loading = false,
|
|
18
|
+
loadingNode,
|
|
19
|
+
error,
|
|
20
|
+
empty,
|
|
21
|
+
children,
|
|
22
|
+
className
|
|
23
|
+
}, ref) => {
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
onTitleChange?.(title);
|
|
26
|
+
}, [title, onTitleChange]);
|
|
27
|
+
const hasActionBar = search !== void 0 || primaryAction !== void 0 || onFilterClick !== void 0;
|
|
28
|
+
let content;
|
|
29
|
+
if (loading) {
|
|
30
|
+
content = loadingNode ?? /* @__PURE__ */ jsxs(Card, { className: "flex items-center justify-center gap-3 p-12 text-muted-foreground", children: [
|
|
31
|
+
/* @__PURE__ */ jsx(Loader2, { "aria-hidden": "true", className: "size-5 animate-spin" }),
|
|
32
|
+
/* @__PURE__ */ jsx("span", { className: "font-sans text-body-sm", children: "Loading\u2026" })
|
|
33
|
+
] });
|
|
34
|
+
} else if (error) {
|
|
35
|
+
content = /* @__PURE__ */ jsxs(Card, { className: "flex flex-col items-center gap-3 p-8 text-center", children: [
|
|
36
|
+
/* @__PURE__ */ jsx(AlertCircle, { "aria-hidden": "true", className: "size-8 text-destructive" }),
|
|
37
|
+
/* @__PURE__ */ jsx("p", { className: "font-sans text-body-sm text-foreground", children: error.message }),
|
|
38
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
39
|
+
error.onRetry ? /* @__PURE__ */ jsx(
|
|
40
|
+
"button",
|
|
41
|
+
{
|
|
42
|
+
type: "button",
|
|
43
|
+
onClick: error.onRetry,
|
|
44
|
+
className: cn(
|
|
45
|
+
"inline-flex items-center rounded-md border border-border/40 px-3 py-1.5",
|
|
46
|
+
"font-sans text-body-sm text-foreground",
|
|
47
|
+
"transition-colors hover:bg-muted"
|
|
48
|
+
),
|
|
49
|
+
children: "Retry"
|
|
50
|
+
}
|
|
51
|
+
) : null,
|
|
52
|
+
error.docsHref ? /* @__PURE__ */ jsx(
|
|
53
|
+
"a",
|
|
54
|
+
{
|
|
55
|
+
href: error.docsHref,
|
|
56
|
+
className: "font-sans text-body-sm text-primary hover:underline",
|
|
57
|
+
children: "View docs"
|
|
58
|
+
}
|
|
59
|
+
) : null
|
|
60
|
+
] })
|
|
61
|
+
] });
|
|
62
|
+
} else if (empty) {
|
|
63
|
+
const emptyAction = empty.action;
|
|
64
|
+
content = /* @__PURE__ */ jsx(
|
|
65
|
+
EmptyState,
|
|
66
|
+
{
|
|
67
|
+
icon: empty.icon,
|
|
68
|
+
title: empty.title,
|
|
69
|
+
description: empty.description,
|
|
70
|
+
action: emptyAction ? /* @__PURE__ */ jsx(
|
|
71
|
+
"button",
|
|
72
|
+
{
|
|
73
|
+
type: "button",
|
|
74
|
+
onClick: emptyAction.onClick,
|
|
75
|
+
className: cn(
|
|
76
|
+
"inline-flex items-center rounded-md bg-primary px-3 py-1.5",
|
|
77
|
+
"font-medium font-sans text-body-sm text-primary-foreground",
|
|
78
|
+
"transition-colors hover:bg-primary-deep"
|
|
79
|
+
),
|
|
80
|
+
children: emptyAction.label
|
|
81
|
+
}
|
|
82
|
+
) : void 0
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
} else {
|
|
86
|
+
content = children;
|
|
87
|
+
}
|
|
88
|
+
return /* @__PURE__ */ jsxs(
|
|
89
|
+
"main",
|
|
90
|
+
{
|
|
91
|
+
ref,
|
|
92
|
+
"aria-busy": loading || void 0,
|
|
93
|
+
className: cn("flex flex-col gap-6", className),
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ jsxs("header", { className: "flex flex-col gap-1", children: [
|
|
96
|
+
/* @__PURE__ */ jsx("h1", { className: "font-display font-semibold text-display-sm text-foreground tracking-tight", children: title }),
|
|
97
|
+
description ? /* @__PURE__ */ jsx("p", { className: "font-sans text-body-md text-muted-foreground", children: description }) : null
|
|
98
|
+
] }),
|
|
99
|
+
hasActionBar ? /* @__PURE__ */ jsx(ActionBar, { search, primaryAction, onFilterClick }) : null,
|
|
100
|
+
/* @__PURE__ */ jsx("div", { children: content })
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
PageShell.displayName = "PageShell";
|
|
107
|
+
|
|
108
|
+
export { PageShell };
|
|
109
|
+
//# sourceMappingURL=chunk-QTLQZ7OJ.js.map
|
|
110
|
+
//# sourceMappingURL=chunk-QTLQZ7OJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/page-shell/page-shell.tsx"],"names":[],"mappings":"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","file":"chunk-QTLQZ7OJ.js","sourcesContent":["import { AlertCircle, Loader2 } from \"lucide-react\";\nimport { forwardRef, useEffect } from \"react\";\nimport type { ElementType, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { ActionBar } from \"../../primitives/action-bar/index.js\";\nimport { Card } from \"../../primitives/card/index.js\";\nimport { EmptyState } from \"../../primitives/empty-state/index.js\";\n\n/**\n * PageShell — page-level scaffold composite.\n *\n * Renders title + optional description + optional ActionBar, then\n * one of four mutually-exclusive content states:\n * 1. loading (highest precedence)\n * 2. error\n * 3. empty\n * 4. children (default)\n *\n * Scope-narrowed per Brief #5 D3: PageShell does NOT manage\n * `document.title`. Use the optional `onTitleChange` callback to\n * wire your own hook (e.g. useSetPageTitle, react-helmet,\n * next/head).\n *\n * @example\n * <PageShell\n * title=\"Domains\"\n * description=\"Custom domains and DNS verification.\"\n * search={{ placeholder: \"Search…\", value: q, onChange: setQ }}\n * primaryAction={{ label: \"Add domain\", icon: Plus, onClick: openModal }}\n * loading={isLoading}\n * error={error ? { message: error.message, onRetry: refetch } : undefined}\n * empty={data?.length === 0 ? { title: \"No domains yet\" } : undefined}\n * >\n * <DataTable columns={…} data={data} />\n * </PageShell>\n */\nexport interface PageShellProps {\n title: string;\n description?: ReactNode;\n /** Optional callback invoked when `title` changes — wire to your own document.title hook. */\n onTitleChange?: (title: string) => void;\n primaryAction?: {\n label: ReactNode;\n icon?: ElementType;\n onClick: () => void;\n loading?: boolean;\n };\n search?: {\n placeholder: string;\n value: string;\n onChange: (v: string) => void;\n };\n onFilterClick?: () => void;\n loading?: boolean;\n /** Custom loading UI. Defaults to a centered spinner card. */\n loadingNode?: ReactNode;\n error?: {\n message: string;\n onRetry?: () => void;\n docsHref?: string;\n };\n empty?: {\n icon?: ElementType;\n title: string;\n description?: ReactNode;\n action?: { label: string; onClick: () => void };\n };\n children?: ReactNode;\n className?: string;\n}\n\nconst PageShell = forwardRef<HTMLElement, PageShellProps>(\n (\n {\n title,\n description,\n onTitleChange,\n primaryAction,\n search,\n onFilterClick,\n loading = false,\n loadingNode,\n error,\n empty,\n children,\n className,\n },\n ref,\n ) => {\n useEffect(() => {\n onTitleChange?.(title);\n }, [title, onTitleChange]);\n\n const hasActionBar =\n search !== undefined || primaryAction !== undefined || onFilterClick !== undefined;\n\n // State precedence: loading > error > empty > children\n let content: ReactNode;\n if (loading) {\n content = loadingNode ?? (\n <Card className=\"flex items-center justify-center gap-3 p-12 text-muted-foreground\">\n <Loader2 aria-hidden=\"true\" className=\"size-5 animate-spin\" />\n <span className=\"font-sans text-body-sm\">Loading…</span>\n </Card>\n );\n } else if (error) {\n content = (\n <Card className=\"flex flex-col items-center gap-3 p-8 text-center\">\n <AlertCircle aria-hidden=\"true\" className=\"size-8 text-destructive\" />\n <p className=\"font-sans text-body-sm text-foreground\">{error.message}</p>\n <div className=\"flex items-center gap-3\">\n {error.onRetry ? (\n <button\n type=\"button\"\n onClick={error.onRetry}\n className={cn(\n \"inline-flex items-center rounded-md border border-border/40 px-3 py-1.5\",\n \"font-sans text-body-sm text-foreground\",\n \"transition-colors hover:bg-muted\",\n )}\n >\n Retry\n </button>\n ) : null}\n {error.docsHref ? (\n <a\n href={error.docsHref}\n className=\"font-sans text-body-sm text-primary hover:underline\"\n >\n View docs\n </a>\n ) : null}\n </div>\n </Card>\n );\n } else if (empty) {\n const emptyAction = empty.action;\n content = (\n <EmptyState\n icon={empty.icon as Parameters<typeof EmptyState>[0][\"icon\"]}\n title={empty.title}\n description={empty.description}\n action={\n emptyAction ? (\n <button\n type=\"button\"\n onClick={emptyAction.onClick}\n className={cn(\n \"inline-flex items-center rounded-md bg-primary px-3 py-1.5\",\n \"font-medium font-sans text-body-sm text-primary-foreground\",\n \"transition-colors hover:bg-primary-deep\",\n )}\n >\n {emptyAction.label}\n </button>\n ) : undefined\n }\n />\n );\n } else {\n content = children;\n }\n\n return (\n <main\n ref={ref}\n aria-busy={loading || undefined}\n className={cn(\"flex flex-col gap-6\", className)}\n >\n <header className=\"flex flex-col gap-1\">\n <h1 className=\"font-display font-semibold text-display-sm text-foreground tracking-tight\">\n {title}\n </h1>\n {description ? (\n <p className=\"font-sans text-body-md text-muted-foreground\">{description}</p>\n ) : null}\n </header>\n {hasActionBar ? (\n <ActionBar search={search} primaryAction={primaryAction} onFilterClick={onFilterClick} />\n ) : null}\n <div>{content}</div>\n </main>\n );\n },\n);\nPageShell.displayName = \"PageShell\";\n\nexport { PageShell };\n"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { forwardRef, useEffect } from 'react';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var DOT_COLOR = {
|
|
6
|
+
live: "bg-success",
|
|
7
|
+
building: "bg-warning",
|
|
8
|
+
failed: "bg-destructive",
|
|
9
|
+
idle: "bg-muted-foreground/40",
|
|
10
|
+
warning: "bg-warning"
|
|
11
|
+
};
|
|
12
|
+
var LABEL_COLOR = {
|
|
13
|
+
live: "text-success",
|
|
14
|
+
building: "text-warning",
|
|
15
|
+
failed: "text-destructive",
|
|
16
|
+
idle: "text-muted-foreground",
|
|
17
|
+
warning: "text-warning"
|
|
18
|
+
};
|
|
19
|
+
var SIZE = {
|
|
20
|
+
xs: "size-1.5",
|
|
21
|
+
sm: "size-2",
|
|
22
|
+
md: "size-2.5"
|
|
23
|
+
};
|
|
24
|
+
var StatusDot = forwardRef(
|
|
25
|
+
({ className, status, label, size = "sm", pulse, "aria-label": ariaLabel, ...props }, ref) => {
|
|
26
|
+
const shouldPulse = pulse ?? status === "building";
|
|
27
|
+
const hasVisibleLabel = label !== void 0 && label !== null;
|
|
28
|
+
const effectiveAriaLabel = ariaLabel ?? (hasVisibleLabel ? void 0 : status);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (process.env.NODE_ENV !== "production" && !hasVisibleLabel && ariaLabel === void 0) {
|
|
31
|
+
console.warn(
|
|
32
|
+
`<StatusDot status="${status}" />: no \`label\` or \`aria-label\` provided. Color-only status is invisible to screen readers. Falling back to aria-label="${status}".`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
}, [hasVisibleLabel, ariaLabel, status]);
|
|
36
|
+
const dot = /* @__PURE__ */ jsx(
|
|
37
|
+
"span",
|
|
38
|
+
{
|
|
39
|
+
"aria-hidden": hasVisibleLabel ? "true" : void 0,
|
|
40
|
+
className: cn(
|
|
41
|
+
"inline-block shrink-0 rounded-full",
|
|
42
|
+
SIZE[size],
|
|
43
|
+
DOT_COLOR[status],
|
|
44
|
+
shouldPulse && "animate-pulse"
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
if (!hasVisibleLabel) {
|
|
49
|
+
return /* @__PURE__ */ jsx(
|
|
50
|
+
"span",
|
|
51
|
+
{
|
|
52
|
+
ref,
|
|
53
|
+
role: "status",
|
|
54
|
+
"aria-label": effectiveAriaLabel,
|
|
55
|
+
className: cn("inline-flex items-center", className),
|
|
56
|
+
...props,
|
|
57
|
+
children: dot
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
return /* @__PURE__ */ jsxs(
|
|
62
|
+
"span",
|
|
63
|
+
{
|
|
64
|
+
ref,
|
|
65
|
+
"aria-label": effectiveAriaLabel,
|
|
66
|
+
className: cn(
|
|
67
|
+
"inline-flex items-center gap-1.5 font-mono text-label",
|
|
68
|
+
LABEL_COLOR[status],
|
|
69
|
+
className
|
|
70
|
+
),
|
|
71
|
+
...props,
|
|
72
|
+
children: [
|
|
73
|
+
dot,
|
|
74
|
+
/* @__PURE__ */ jsx("span", { children: label })
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
StatusDot.displayName = "StatusDot";
|
|
81
|
+
|
|
82
|
+
export { StatusDot };
|
|
83
|
+
//# sourceMappingURL=chunk-QYAMLIG2.js.map
|
|
84
|
+
//# sourceMappingURL=chunk-QYAMLIG2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/status-dot/status-dot.tsx"],"names":[],"mappings":";;;;AAkCA,IAAM,SAAA,GAAwC;AAAA,EAC5C,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,YAAA;AAAA,EACV,MAAA,EAAQ,gBAAA;AAAA,EACR,IAAA,EAAM,wBAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,WAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,cAAA;AAAA,EACN,QAAA,EAAU,cAAA;AAAA,EACV,MAAA,EAAQ,kBAAA;AAAA,EACR,IAAA,EAAM,uBAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,IAAA,GAA4D;AAAA,EAChE,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,IAAA,GAAO,IAAA,EAAM,KAAA,EAAO,YAAA,EAAc,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC5F,IAAA,MAAM,WAAA,GAAc,SAAS,MAAA,KAAW,UAAA;AAExC,IAAA,MAAM,eAAA,GAAkB,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA;AACzD,IAAA,MAAM,kBAAA,GAAqB,SAAA,KAAc,eAAA,GAAkB,MAAA,GAAY,MAAA,CAAA;AAGvE,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,QAAQ,GAAA,CAAI,QAAA,KAAa,gBAAgB,CAAC,eAAA,IAAmB,cAAc,MAAA,EAAW;AAExF,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,mBAAA,EAAsB,MAAM,CAAA,6HAAA,EAAgI,MAAM,CAAA,EAAA;AAAA,SACpK;AAAA,MACF;AAAA,IACF,CAAA,EAAG,CAAC,eAAA,EAAiB,SAAA,EAAW,MAAM,CAAC,CAAA;AAEvC,IAAA,MAAM,GAAA,mBACJ,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAa,kBAAkB,MAAA,GAAS,MAAA;AAAA,QACxC,SAAA,EAAW,EAAA;AAAA,UACT,oCAAA;AAAA,UACA,KAAK,IAAI,CAAA;AAAA,UACT,UAAU,MAAM,CAAA;AAAA,UAChB,WAAA,IAAe;AAAA;AACjB;AAAA,KACF;AAGF,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,uBACE,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UAEA,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAY,kBAAA;AAAA,UACZ,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,UAClD,GAAG,KAAA;AAAA,UAEH,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,IAEJ;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,YAAA,EAAY,kBAAA;AAAA,QACZ,SAAA,EAAW,EAAA;AAAA,UACT,uDAAA;AAAA,UACA,YAAY,MAAM,CAAA;AAAA,UAClB;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,0BACD,GAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KACf;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-QYAMLIG2.js","sourcesContent":["import { forwardRef, useEffect } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * StatusDot — semantic status indicator (colored circle + optional label).\n *\n * Five status kinds:\n * - `live` — deployed / verified / healthy (success)\n * - `building` — in-progress / queued (warning, auto-pulses)\n * - `failed` — error / down / rejected (destructive)\n * - `idle` — pending / offline (muted)\n * - `warning` — degraded but functional (warning, static)\n *\n * Three sizes (xs 6px, sm 8px default, md 10px). `pulse` defaults to\n * `true` for `building` and `false` otherwise; passing `pulse` explicitly\n * overrides the auto behavior. When no visible `label` AND no `aria-label`\n * are provided, the component auto-applies `aria-label={status}` and\n * emits a dev-mode warning (a status communicated only by color is\n * invisible to screen readers).\n *\n * @example\n * <StatusDot status=\"live\" label=\"Production\" />\n * <StatusDot status=\"building\" /> // auto-pulses + auto-aria-label\n */\nexport type StatusKind = \"live\" | \"building\" | \"failed\" | \"idle\" | \"warning\";\n\nexport interface StatusDotProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n status: StatusKind;\n label?: ReactNode;\n size?: \"xs\" | \"sm\" | \"md\";\n pulse?: boolean;\n}\n\nconst DOT_COLOR: Record<StatusKind, string> = {\n live: \"bg-success\",\n building: \"bg-warning\",\n failed: \"bg-destructive\",\n idle: \"bg-muted-foreground/40\",\n warning: \"bg-warning\",\n};\n\nconst LABEL_COLOR: Record<StatusKind, string> = {\n live: \"text-success\",\n building: \"text-warning\",\n failed: \"text-destructive\",\n idle: \"text-muted-foreground\",\n warning: \"text-warning\",\n};\n\nconst SIZE: Record<NonNullable<StatusDotProps[\"size\"]>, string> = {\n xs: \"size-1.5\",\n sm: \"size-2\",\n md: \"size-2.5\",\n};\n\nconst StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(\n ({ className, status, label, size = \"sm\", pulse, \"aria-label\": ariaLabel, ...props }, ref) => {\n const shouldPulse = pulse ?? status === \"building\";\n\n const hasVisibleLabel = label !== undefined && label !== null;\n const effectiveAriaLabel = ariaLabel ?? (hasVisibleLabel ? undefined : status);\n\n // EC-6: dev warning when neither label nor aria-label is provided.\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && !hasVisibleLabel && ariaLabel === undefined) {\n // biome-ignore lint/suspicious/noConsole: dev-only diagnostic for a11y misconfiguration.\n console.warn(\n `<StatusDot status=\"${status}\" />: no \\`label\\` or \\`aria-label\\` provided. Color-only status is invisible to screen readers. Falling back to aria-label=\"${status}\".`,\n );\n }\n }, [hasVisibleLabel, ariaLabel, status]);\n\n const dot = (\n <span\n aria-hidden={hasVisibleLabel ? \"true\" : undefined}\n className={cn(\n \"inline-block shrink-0 rounded-full\",\n SIZE[size],\n DOT_COLOR[status],\n shouldPulse && \"animate-pulse\",\n )}\n />\n );\n\n if (!hasVisibleLabel) {\n return (\n <span\n ref={ref}\n // biome-ignore lint/a11y/useSemanticElements: StatusDot is a generic inline indicator; there is no HTML element with implicit role=\"status\" that is an inline span. The native <output> is block-level and form-bound, which doesn't fit this use case.\n role=\"status\"\n aria-label={effectiveAriaLabel}\n className={cn(\"inline-flex items-center\", className)}\n {...props}\n >\n {dot}\n </span>\n );\n }\n\n return (\n <span\n ref={ref}\n aria-label={effectiveAriaLabel}\n className={cn(\n \"inline-flex items-center gap-1.5 font-mono text-label\",\n LABEL_COLOR[status],\n className,\n )}\n {...props}\n >\n {dot}\n <span>{label}</span>\n </span>\n );\n },\n);\nStatusDot.displayName = \"StatusDot\";\n\nexport { StatusDot };\n"]}
|