@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,76 @@
|
|
|
1
|
+
import { PlanBadge } from './chunk-NGZWBFTP.js';
|
|
2
|
+
import { Avatar } from './chunk-SLOKAAH2.js';
|
|
3
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
4
|
+
import { ChevronsUpDown } from 'lucide-react';
|
|
5
|
+
import { forwardRef } from 'react';
|
|
6
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var URL_RE = /^(?:https?:\/\/|\/)/;
|
|
9
|
+
function deriveInitials(name, avatar) {
|
|
10
|
+
if (avatar && !URL_RE.test(avatar) && avatar.length <= 2) {
|
|
11
|
+
return avatar.toUpperCase();
|
|
12
|
+
}
|
|
13
|
+
if (typeof name === "string" && name.length > 0) {
|
|
14
|
+
return name.charAt(0).toUpperCase();
|
|
15
|
+
}
|
|
16
|
+
return "?";
|
|
17
|
+
}
|
|
18
|
+
var AccountMenu = forwardRef(
|
|
19
|
+
({ className, name, avatar, plan, secondary, onClick, ...props }, ref) => {
|
|
20
|
+
const interactive = typeof onClick === "function";
|
|
21
|
+
const initials = deriveInitials(name, avatar);
|
|
22
|
+
const isUrlAvatar = avatar !== void 0 && URL_RE.test(avatar);
|
|
23
|
+
const altText = typeof name === "string" ? name : "account";
|
|
24
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
25
|
+
/* @__PURE__ */ jsxs(Avatar, { size: "sm", children: [
|
|
26
|
+
isUrlAvatar ? /* @__PURE__ */ jsx(Avatar.Image, { src: avatar, alt: altText }) : null,
|
|
27
|
+
/* @__PURE__ */ jsx(Avatar.Fallback, { delayMs: 0, children: initials })
|
|
28
|
+
] }),
|
|
29
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
30
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
|
|
31
|
+
/* @__PURE__ */ jsx("span", { className: "truncate font-medium text-body-sm text-foreground", children: name }),
|
|
32
|
+
plan ? /* @__PURE__ */ jsx(PlanBadge, { plan, size: "sm" }) : null
|
|
33
|
+
] }),
|
|
34
|
+
secondary ? /* @__PURE__ */ jsx("span", { className: "truncate text-label text-muted-foreground", children: secondary }) : null
|
|
35
|
+
] }),
|
|
36
|
+
interactive ? /* @__PURE__ */ jsx(ChevronsUpDown, { className: "size-3 shrink-0 text-muted-foreground", "aria-hidden": "true" }) : null
|
|
37
|
+
] });
|
|
38
|
+
const baseClass = cn(
|
|
39
|
+
"flex w-full items-center gap-3 px-3 py-2",
|
|
40
|
+
interactive && cn(
|
|
41
|
+
"rounded-md text-left transition-colors",
|
|
42
|
+
"hover:bg-muted/40",
|
|
43
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card"
|
|
44
|
+
),
|
|
45
|
+
className
|
|
46
|
+
);
|
|
47
|
+
if (interactive) {
|
|
48
|
+
const { ...buttonProps } = props;
|
|
49
|
+
return /* @__PURE__ */ jsx(
|
|
50
|
+
"button",
|
|
51
|
+
{
|
|
52
|
+
ref,
|
|
53
|
+
type: "button",
|
|
54
|
+
className: baseClass,
|
|
55
|
+
onClick,
|
|
56
|
+
...buttonProps,
|
|
57
|
+
children: content
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
return /* @__PURE__ */ jsx(
|
|
62
|
+
"div",
|
|
63
|
+
{
|
|
64
|
+
ref,
|
|
65
|
+
className: baseClass,
|
|
66
|
+
...props,
|
|
67
|
+
children: content
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
AccountMenu.displayName = "AccountMenu";
|
|
73
|
+
|
|
74
|
+
export { AccountMenu };
|
|
75
|
+
//# sourceMappingURL=chunk-HRDRGZ2Y.js.map
|
|
76
|
+
//# sourceMappingURL=chunk-HRDRGZ2Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/account-menu/account-menu.tsx"],"names":[],"mappings":"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","file":"chunk-HRDRGZ2Y.js","sourcesContent":["import { ChevronsUpDown } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { Avatar } from \"../../primitives/avatar/index.js\";\nimport { PlanBadge, type PlanTier } from \"../../primitives/plan-badge/index.js\";\n\n/**\n * AccountMenu — sidebar header for PaaS surfaces.\n *\n * Renders avatar + name + (optional) plan badge + (optional) secondary line.\n * Dual mode: with `onClick`, renders as a `<button>` with a `ChevronsUpDown`\n * trailing icon (account picker affordance); without, renders as a static\n * `<div>` (read-only display, not focusable).\n *\n * Composition:\n *\n * <Sidebar.Header className=\"p-0\">\n * <AccountMenu\n * name=\"paulohenriquevn\"\n * avatar=\"https://avatars.githubusercontent.com/u/12345\"\n * plan=\"hobby\"\n * onClick={openAccountSwitcher}\n * />\n * </Sidebar.Header>\n *\n * Avatar handling:\n * - URL (`http(s)://` or `/`) → `<Avatar.Image>` with `<Avatar.Fallback>` initials\n * - Short string (≤2 chars) → treated as initials directly\n * - Undefined → initials derived from the first character of `name`\n *\n * PaaS-shape sibling of `<ProjectSwitcher>` (workspace + branch + agent-status).\n * Same dual-mode (interactive vs static) pattern; different semantics.\n */\n\nexport interface AccountMenuProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\" | \"children\" | \"name\"> {\n /** Display name (username, email, org name). */\n name: ReactNode;\n /** Avatar URL or 1-2-char initials. If undefined, derives initials from `name`. */\n avatar?: string;\n /** Plan tier — renders inline `<PlanBadge size=\"sm\">`. Omit for none. */\n plan?: PlanTier;\n /** Optional secondary line below name (e.g. email). */\n secondary?: ReactNode;\n /** Make the row interactive (button) with a trailing chevron. */\n onClick?: () => void;\n}\n\nconst URL_RE = /^(?:https?:\\/\\/|\\/)/;\n\nfunction deriveInitials(name: ReactNode, avatar: string | undefined): string {\n if (avatar && !URL_RE.test(avatar) && avatar.length <= 2) {\n return avatar.toUpperCase();\n }\n if (typeof name === \"string\" && name.length > 0) {\n return name.charAt(0).toUpperCase();\n }\n return \"?\";\n}\n\nconst AccountMenu = forwardRef<HTMLElement, AccountMenuProps>(\n ({ className, name, avatar, plan, secondary, onClick, ...props }, ref) => {\n const interactive = typeof onClick === \"function\";\n const initials = deriveInitials(name, avatar);\n const isUrlAvatar = avatar !== undefined && URL_RE.test(avatar);\n const altText = typeof name === \"string\" ? name : \"account\";\n\n const content = (\n <>\n <Avatar size=\"sm\">\n {isUrlAvatar ? <Avatar.Image src={avatar} alt={altText} /> : null}\n <Avatar.Fallback delayMs={0}>{initials}</Avatar.Fallback>\n </Avatar>\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate font-medium text-body-sm text-foreground\">{name}</span>\n {plan ? <PlanBadge plan={plan} size=\"sm\" /> : null}\n </div>\n {secondary ? (\n <span className=\"truncate text-label text-muted-foreground\">{secondary}</span>\n ) : null}\n </div>\n\n {interactive ? (\n <ChevronsUpDown className=\"size-3 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n ) : null}\n </>\n );\n\n const baseClass = cn(\n \"flex w-full items-center gap-3 px-3 py-2\",\n interactive &&\n cn(\n \"rounded-md text-left transition-colors\",\n \"hover:bg-muted/40\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card\",\n ),\n className,\n );\n\n if (interactive) {\n const { ...buttonProps } = props as ButtonHTMLAttributes<HTMLButtonElement>;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n className={baseClass}\n onClick={onClick}\n {...buttonProps}\n >\n {content}\n </button>\n );\n }\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n className={baseClass}\n {...(props as HTMLAttributes<HTMLDivElement>)}\n >\n {content}\n </div>\n );\n },\n);\nAccountMenu.displayName = \"AccountMenu\";\n\nexport { AccountMenu };\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ApprovalCard } from './chunk-53XPKI7Q.js';
|
|
2
|
+
import { ChatMessage } from './chunk-YEQQGYYO.js';
|
|
3
|
+
import { ToolCallCard } from './chunk-EO7LOXG2.js';
|
|
4
|
+
import { AgentStreaming } from './chunk-KDTKA667.js';
|
|
5
|
+
import { AgentErrorCard } from './chunk-WXEXCHEN.js';
|
|
6
|
+
import { LiveRegionProvider } from './chunk-UGKI466V.js';
|
|
7
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
8
|
+
import { forwardRef } from 'react';
|
|
9
|
+
import { jsx } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
var AgentStream = forwardRef(
|
|
12
|
+
({ className, items, ...props }, ref) => (
|
|
13
|
+
// T4.1 (MF-4): AgentStream is the canonical live region for the stream
|
|
14
|
+
// surface. Wrap children in LiveRegionProvider so nested AgentStreaming,
|
|
15
|
+
// AgentErrorCard, AutoCompactNotice, Skeleton, etc. don't declare their
|
|
16
|
+
// own aria-live (which would cause double announcements).
|
|
17
|
+
/* @__PURE__ */ jsx(LiveRegionProvider, { value: true, children: /* @__PURE__ */ jsx(
|
|
18
|
+
"div",
|
|
19
|
+
{
|
|
20
|
+
ref,
|
|
21
|
+
role: "log",
|
|
22
|
+
"aria-live": "polite",
|
|
23
|
+
"aria-relevant": "additions",
|
|
24
|
+
"aria-atomic": "false",
|
|
25
|
+
className: cn("flex flex-col gap-3", className),
|
|
26
|
+
...props,
|
|
27
|
+
children: items.map((item) => {
|
|
28
|
+
if (item.kind === "message") return /* @__PURE__ */ jsx(ChatMessage, { message: item.message }, item.id);
|
|
29
|
+
if (item.kind === "tool-call")
|
|
30
|
+
return /* @__PURE__ */ jsx(
|
|
31
|
+
ToolCallCard,
|
|
32
|
+
{
|
|
33
|
+
tool: item.tool,
|
|
34
|
+
icon: item.icon,
|
|
35
|
+
target: item.target,
|
|
36
|
+
status: item.status,
|
|
37
|
+
output: item.output,
|
|
38
|
+
defaultExpanded: item.defaultExpanded,
|
|
39
|
+
timestamp: item.timestamp
|
|
40
|
+
},
|
|
41
|
+
item.id
|
|
42
|
+
);
|
|
43
|
+
if (item.kind === "approval")
|
|
44
|
+
return /* @__PURE__ */ jsx(
|
|
45
|
+
ApprovalCard,
|
|
46
|
+
{
|
|
47
|
+
severity: item.severity,
|
|
48
|
+
title: item.title,
|
|
49
|
+
request: item.request,
|
|
50
|
+
description: item.description,
|
|
51
|
+
details: item.details,
|
|
52
|
+
onApprove: item.onApprove,
|
|
53
|
+
onDeny: item.onDeny,
|
|
54
|
+
onAlways: item.onAlways
|
|
55
|
+
},
|
|
56
|
+
item.id
|
|
57
|
+
);
|
|
58
|
+
if (item.kind === "error")
|
|
59
|
+
return /* @__PURE__ */ jsx(
|
|
60
|
+
AgentErrorCard,
|
|
61
|
+
{
|
|
62
|
+
kind: item.errorKind,
|
|
63
|
+
title: item.title,
|
|
64
|
+
detail: item.detail,
|
|
65
|
+
actions: item.actions,
|
|
66
|
+
timestamp: item.timestamp
|
|
67
|
+
},
|
|
68
|
+
item.id
|
|
69
|
+
);
|
|
70
|
+
if (item.kind === "streaming")
|
|
71
|
+
return /* @__PURE__ */ jsx(AgentStreaming, { model: item.model, partial: item.partial }, item.id);
|
|
72
|
+
if (item.kind === "custom") return /* @__PURE__ */ jsx("div", { children: item.node }, item.id);
|
|
73
|
+
return null;
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
) })
|
|
77
|
+
)
|
|
78
|
+
);
|
|
79
|
+
AgentStream.displayName = "AgentStream";
|
|
80
|
+
|
|
81
|
+
export { AgentStream };
|
|
82
|
+
//# sourceMappingURL=chunk-HUOVA7SF.js.map
|
|
83
|
+
//# sourceMappingURL=chunk-HUOVA7SF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/agent-stream/agent-stream.tsx"],"names":[],"mappings":";;;;;;;;;;AA2FA,IAAM,WAAA,GAAc,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,GAAG,OAAM,EAAG,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAK/B,GAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAO,IAAA,EACzB,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,KAAA;AAAA,QACL,WAAA,EAAU,QAAA;AAAA,QACV,eAAA,EAAc,WAAA;AAAA,QAGd,aAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA;AAAA,QAC7C,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,UAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW,uBAAO,GAAA,CAAC,eAA0B,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAAvB,IAAA,CAAK,EAA2B,CAAA;AACtF,UAAA,IAAI,KAAK,IAAA,KAAS,WAAA;AAChB,YAAA,uBACE,GAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBAEC,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,QAAQ,IAAA,CAAK,MAAA;AAAA,gBACb,QAAQ,IAAA,CAAK,MAAA;AAAA,gBACb,QAAQ,IAAA,CAAK,MAAA;AAAA,gBACb,iBAAiB,IAAA,CAAK,eAAA;AAAA,gBACtB,WAAW,IAAA,CAAK;AAAA,eAAA;AAAA,cAPX,IAAA,CAAK;AAAA,aAQZ;AAEJ,UAAA,IAAI,KAAK,IAAA,KAAS,UAAA;AAChB,YAAA,uBACE,GAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBAEC,UAAU,IAAA,CAAK,QAAA;AAAA,gBACf,OAAO,IAAA,CAAK,KAAA;AAAA,gBACZ,SAAS,IAAA,CAAK,OAAA;AAAA,gBACd,aAAa,IAAA,CAAK,WAAA;AAAA,gBAClB,SAAS,IAAA,CAAK,OAAA;AAAA,gBACd,WAAW,IAAA,CAAK,SAAA;AAAA,gBAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,gBACb,UAAU,IAAA,CAAK;AAAA,eAAA;AAAA,cARV,IAAA,CAAK;AAAA,aASZ;AAEJ,UAAA,IAAI,KAAK,IAAA,KAAS,OAAA;AAChB,YAAA,uBACE,GAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBAEC,MAAM,IAAA,CAAK,SAAA;AAAA,gBACX,OAAO,IAAA,CAAK,KAAA;AAAA,gBACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,gBACb,SAAS,IAAA,CAAK,OAAA;AAAA,gBACd,WAAW,IAAA,CAAK;AAAA,eAAA;AAAA,cALX,IAAA,CAAK;AAAA,aAMZ;AAEJ,UAAA,IAAI,KAAK,IAAA,KAAS,WAAA;AAChB,YAAA,uBAAO,GAAA,CAAC,kBAA6B,KAAA,EAAO,IAAA,CAAK,OAAO,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA1C,IAAA,CAAK,EAA8C,CAAA;AACjF,UAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU,2BAAQ,KAAA,EAAA,EAAmB,QAAA,EAAA,IAAA,CAAK,IAAA,EAAA,EAAf,IAAA,CAAK,EAAe,CAAA;AACjE,UAAA,OAAO,IAAA;AAAA,QACT,CAAC;AAAA;AAAA,KACH,EACF;AAAA;AAEJ;AACA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-HUOVA7SF.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { LiveRegionProvider } from \"../../../lib/live-region-context.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport type { UIMessage } from \"../../../types/chat.js\";\nimport { AgentErrorCard, type AgentErrorKind } from \"../../primitives/agent-error-card/index.js\";\nimport { AgentStreaming } from \"../../primitives/agent-streaming/index.js\";\nimport { ToolCallCard, type ToolCallStatus } from \"../../primitives/tool-call-card/index.js\";\nimport { ApprovalCard, type ApprovalSeverity } from \"../approval-card/index.js\";\nimport { ChatMessage } from \"../chat-message/index.js\";\n\n/**\n * AgentStream — the canonical conversation surface for a code agent.\n *\n * Interleaves chat messages (user + assistant), tool invocations, approval\n * gates, errors, and the live streaming indicator. Mirrors how Claude Code\n * presents work to the user: conversation-centric, tool calls embedded,\n * approvals pause the flow inline, errors surface where they happen.\n *\n * Items are rendered in array order. The consumer fully controls the data;\n * AgentStream is a pure presentational composite over its child primitives.\n */\n\ninterface ToolCallStreamItem {\n kind: \"tool-call\";\n id: string;\n tool: ReactNode;\n icon?: IconComponent;\n target?: ReactNode;\n status: ToolCallStatus;\n output?: ReactNode;\n defaultExpanded?: boolean;\n timestamp?: ReactNode;\n}\n\ninterface ApprovalStreamItem {\n kind: \"approval\";\n id: string;\n severity?: ApprovalSeverity;\n title: ReactNode;\n request: ReactNode;\n description?: ReactNode;\n details?: ReactNode;\n onApprove?: () => void;\n onDeny?: () => void;\n onAlways?: () => void;\n}\n\ninterface ErrorStreamItem {\n kind: \"error\";\n id: string;\n errorKind?: AgentErrorKind;\n title: ReactNode;\n detail?: ReactNode;\n actions?: ReactNode;\n timestamp?: ReactNode;\n}\n\ninterface StreamingStreamItem {\n kind: \"streaming\";\n id: string;\n model?: ReactNode;\n partial?: ReactNode;\n}\n\ninterface MessageStreamItem {\n kind: \"message\";\n id: string;\n message: UIMessage;\n}\n\ninterface CustomStreamItem {\n kind: \"custom\";\n id: string;\n /** Arbitrary node — escape hatch for inline diff cards, etc. */\n node: ReactNode;\n}\n\nexport type AgentStreamItem =\n | MessageStreamItem\n | ToolCallStreamItem\n | ApprovalStreamItem\n | ErrorStreamItem\n | StreamingStreamItem\n | CustomStreamItem;\n\ninterface AgentStreamProps extends HTMLAttributes<HTMLDivElement> {\n items: AgentStreamItem[];\n}\n\nconst AgentStream = forwardRef<HTMLDivElement, AgentStreamProps>(\n ({ className, items, ...props }, ref) => (\n // T4.1 (MF-4): AgentStream is the canonical live region for the stream\n // surface. Wrap children in LiveRegionProvider so nested AgentStreaming,\n // AgentErrorCard, AutoCompactNotice, Skeleton, etc. don't declare their\n // own aria-live (which would cause double announcements).\n <LiveRegionProvider value={true}>\n <div\n ref={ref}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n // MEDIUM-001: explicit aria-atomic=\"false\" so VoiceOver/macOS doesn't\n // reannounce the entire stream on each new item.\n aria-atomic=\"false\"\n className={cn(\"flex flex-col gap-3\", className)}\n {...props}\n >\n {items.map((item) => {\n if (item.kind === \"message\") return <ChatMessage key={item.id} message={item.message} />;\n if (item.kind === \"tool-call\")\n return (\n <ToolCallCard\n key={item.id}\n tool={item.tool}\n icon={item.icon}\n target={item.target}\n status={item.status}\n output={item.output}\n defaultExpanded={item.defaultExpanded}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"approval\")\n return (\n <ApprovalCard\n key={item.id}\n severity={item.severity}\n title={item.title}\n request={item.request}\n description={item.description}\n details={item.details}\n onApprove={item.onApprove}\n onDeny={item.onDeny}\n onAlways={item.onAlways}\n />\n );\n if (item.kind === \"error\")\n return (\n <AgentErrorCard\n key={item.id}\n kind={item.errorKind}\n title={item.title}\n detail={item.detail}\n actions={item.actions}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"streaming\")\n return <AgentStreaming key={item.id} model={item.model} partial={item.partial} />;\n if (item.kind === \"custom\") return <div key={item.id}>{item.node}</div>;\n return null;\n })}\n </div>\n </LiveRegionProvider>\n ),\n);\nAgentStream.displayName = \"AgentStream\";\n\nexport { AgentStream };\n"]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { useInLiveRegion } from './chunk-UGKI466V.js';
|
|
2
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
3
|
+
import { forwardRef, useState, useRef, useEffect, useMemo } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var levelClasses = {
|
|
7
|
+
info: "text-foreground",
|
|
8
|
+
warn: "text-warning",
|
|
9
|
+
error: "text-destructive",
|
|
10
|
+
success: "text-success",
|
|
11
|
+
debug: "text-muted-foreground"
|
|
12
|
+
};
|
|
13
|
+
var levelLabels = {
|
|
14
|
+
info: "INFO",
|
|
15
|
+
warn: "WARN",
|
|
16
|
+
error: "ERROR",
|
|
17
|
+
success: " OK ",
|
|
18
|
+
debug: "DBG "
|
|
19
|
+
};
|
|
20
|
+
var ALL_LEVELS = ["info", "warn", "error", "success", "debug"];
|
|
21
|
+
var BuildLogStream = forwardRef(
|
|
22
|
+
({
|
|
23
|
+
className,
|
|
24
|
+
lines,
|
|
25
|
+
filterable = true,
|
|
26
|
+
visibleLevels,
|
|
27
|
+
onVisibleLevelsChange,
|
|
28
|
+
height = "320px",
|
|
29
|
+
maxLines = 2e3,
|
|
30
|
+
live = "off",
|
|
31
|
+
...props
|
|
32
|
+
}, ref) => {
|
|
33
|
+
const inLiveRegion = useInLiveRegion();
|
|
34
|
+
const effectiveLive = inLiveRegion ? "off" : live;
|
|
35
|
+
const [internalLevels, setInternalLevels] = useState(/* @__PURE__ */ new Set());
|
|
36
|
+
const levels = visibleLevels ?? internalLevels;
|
|
37
|
+
const updateLevels = onVisibleLevelsChange ?? setInternalLevels;
|
|
38
|
+
const wasControlled = useRef(null);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (typeof process === "undefined" || process.env.NODE_ENV === "production") return;
|
|
41
|
+
const isControlled = visibleLevels !== void 0;
|
|
42
|
+
if (wasControlled.current === null) {
|
|
43
|
+
wasControlled.current = isControlled;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (wasControlled.current !== isControlled) {
|
|
47
|
+
console.warn(
|
|
48
|
+
`[@theokit/ui] BuildLogStream: \`visibleLevels\` prop switched between ${wasControlled.current ? "controlled" : "uncontrolled"} and ${isControlled ? "controlled" : "uncontrolled"} between renders. Pick one mode and keep it consistent.`
|
|
49
|
+
);
|
|
50
|
+
wasControlled.current = isControlled;
|
|
51
|
+
}
|
|
52
|
+
}, [visibleLevels]);
|
|
53
|
+
const filtered = useMemo(() => {
|
|
54
|
+
if (levels.size === 0) return lines;
|
|
55
|
+
return lines.filter((l) => levels.has(l.level));
|
|
56
|
+
}, [lines, levels]);
|
|
57
|
+
const truncated = filtered.length > maxLines;
|
|
58
|
+
const visible = truncated ? filtered.slice(filtered.length - maxLines) : filtered;
|
|
59
|
+
const hiddenCount = truncated ? filtered.length - maxLines : 0;
|
|
60
|
+
const toggle = (level) => {
|
|
61
|
+
const next = new Set(levels);
|
|
62
|
+
if (next.has(level)) next.delete(level);
|
|
63
|
+
else next.add(level);
|
|
64
|
+
updateLevels(next);
|
|
65
|
+
};
|
|
66
|
+
return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex flex-col gap-2", className), ...props, children: [
|
|
67
|
+
filterable ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: ALL_LEVELS.map((level) => {
|
|
68
|
+
const active = levels.size === 0 || levels.has(level);
|
|
69
|
+
return /* @__PURE__ */ jsx(
|
|
70
|
+
"button",
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
onClick: () => toggle(level),
|
|
74
|
+
"aria-pressed": active,
|
|
75
|
+
className: cn(
|
|
76
|
+
"rounded-md border px-2 py-1 font-mono text-label uppercase tracking-wider",
|
|
77
|
+
"transition-colors duration-base ease-out-soft",
|
|
78
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
79
|
+
active ? cn("border-border/60 bg-muted", levelClasses[level]) : "border-border/30 text-muted-foreground/50 hover:text-muted-foreground"
|
|
80
|
+
),
|
|
81
|
+
children: level
|
|
82
|
+
},
|
|
83
|
+
level
|
|
84
|
+
);
|
|
85
|
+
}) }) : null,
|
|
86
|
+
/* @__PURE__ */ jsxs(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
className: cn("overflow-y-auto rounded-lg border bg-card", "font-mono text-code-sm"),
|
|
90
|
+
style: { height },
|
|
91
|
+
children: [
|
|
92
|
+
truncated ? /* @__PURE__ */ jsxs("output", { className: "block border-border/30 border-b bg-muted/40 px-4 py-1.5 text-label text-muted-foreground", children: [
|
|
93
|
+
"Showing last ",
|
|
94
|
+
maxLines.toLocaleString(),
|
|
95
|
+
" of ",
|
|
96
|
+
filtered.length.toLocaleString(),
|
|
97
|
+
" lines (",
|
|
98
|
+
hiddenCount.toLocaleString(),
|
|
99
|
+
" earlier lines hidden)"
|
|
100
|
+
] }) : null,
|
|
101
|
+
visible.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-4 py-3 text-muted-foreground", children: "No log lines." }) : /* @__PURE__ */ jsx("ol", { className: "divide-y divide-border/30", "aria-live": effectiveLive, "aria-atomic": "false", children: visible.map((line) => /* @__PURE__ */ jsxs(
|
|
102
|
+
"li",
|
|
103
|
+
{
|
|
104
|
+
className: "grid grid-cols-[auto_auto_1fr] gap-3 px-4 py-1.5 leading-relaxed hover:bg-muted/30",
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ jsx("span", { className: "select-none text-muted-foreground", children: line.timestamp }),
|
|
107
|
+
/* @__PURE__ */ jsxs("span", { className: cn("select-none font-bold", levelClasses[line.level]), children: [
|
|
108
|
+
"[",
|
|
109
|
+
levelLabels[line.level],
|
|
110
|
+
"]"
|
|
111
|
+
] }),
|
|
112
|
+
/* @__PURE__ */ jsxs("span", { className: levelClasses[line.level], children: [
|
|
113
|
+
line.source ? /* @__PURE__ */ jsxs("span", { className: "mr-2 text-muted-foreground", children: [
|
|
114
|
+
line.source,
|
|
115
|
+
":"
|
|
116
|
+
] }) : null,
|
|
117
|
+
line.message
|
|
118
|
+
] })
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
line.id
|
|
122
|
+
)) })
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
] });
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
BuildLogStream.displayName = "BuildLogStream";
|
|
130
|
+
|
|
131
|
+
export { BuildLogStream };
|
|
132
|
+
//# sourceMappingURL=chunk-ITA3SNOR.js.map
|
|
133
|
+
//# sourceMappingURL=chunk-ITA3SNOR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/build-log-stream/build-log-stream.tsx"],"names":[],"mappings":"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","file":"chunk-ITA3SNOR.js","sourcesContent":["import { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { useInLiveRegion } from \"../../../lib/live-region-context.js\";\n\nexport type LogLevel = \"info\" | \"warn\" | \"error\" | \"success\" | \"debug\";\n\nexport interface LogLine {\n id: string;\n timestamp: string;\n level: LogLevel;\n message: string;\n source?: string;\n}\n\nconst levelClasses: Record<LogLevel, string> = {\n info: \"text-foreground\",\n warn: \"text-warning\",\n error: \"text-destructive\",\n success: \"text-success\",\n debug: \"text-muted-foreground\",\n};\n\nconst levelLabels: Record<LogLevel, string> = {\n info: \"INFO\",\n warn: \"WARN\",\n error: \"ERROR\",\n success: \" OK \",\n debug: \"DBG \",\n};\n\ninterface BuildLogStreamProps extends HTMLAttributes<HTMLDivElement> {\n lines: LogLine[];\n /**\n * If true, shows level filter chips above the stream.\n */\n filterable?: boolean;\n /**\n * Controlled filter — which levels are visible. Empty Set = show all.\n *\n * Pick one mode: either always pass `visibleLevels` + `onVisibleLevelsChange`\n * (controlled), or never (uncontrolled). Mixing the two between renders is\n * not supported and may produce surprising state.\n */\n visibleLevels?: Set<LogLevel>;\n onVisibleLevelsChange?: (levels: Set<LogLevel>) => void;\n /**\n * Height of the scrollable region.\n */\n height?: string | number;\n /**\n * Maximum number of lines rendered. When exceeded, only the tail is shown\n * and a banner indicates truncation. Defaults to 2000 — set higher with\n * caution; React reconciliation cost scales linearly.\n */\n maxLines?: number;\n /**\n * Screen-reader live-region politeness for newly appended lines. Defaults\n * to `\"off\"` because build-log streams can be high-volume; opt into\n * `\"polite\"` only when running the build in the foreground.\n */\n live?: \"off\" | \"polite\";\n}\n\nconst ALL_LEVELS: LogLevel[] = [\"info\", \"warn\", \"error\", \"success\", \"debug\"];\n\n/**\n * BuildLogStream — terminal-like log viewer with timestamps + level coloring.\n *\n * Used in Code workspace and PaaS deployment views. Geist Mono throughout.\n * Lines fade in via animate-fade-in-up on mount; new lines (when prepended/appended)\n * are not animated to avoid feedback noise (consumer's responsibility to render\n * incrementally if needed).\n */\nconst BuildLogStream = forwardRef<HTMLDivElement, BuildLogStreamProps>(\n (\n {\n className,\n lines,\n filterable = true,\n visibleLevels,\n onVisibleLevelsChange,\n height = \"320px\",\n maxLines = 2000,\n live = \"off\",\n ...props\n },\n ref,\n ) => {\n // T4.1 (MF-4): suppress own aria-live when nested in container live region.\n const inLiveRegion = useInLiveRegion();\n const effectiveLive = inLiveRegion ? \"off\" : live;\n const [internalLevels, setInternalLevels] = useState<Set<LogLevel>>(new Set());\n const levels = visibleLevels ?? internalLevels;\n const updateLevels = onVisibleLevelsChange ?? setInternalLevels;\n\n // MEDIUM-002 / T6.5: warn (dev-only) when a consumer flips between\n // controlled and uncontrolled — React's own warning handles `value`/\n // `defaultValue` on form inputs but doesn't see our custom prop pair.\n const wasControlled = useRef<boolean | null>(null);\n useEffect(() => {\n if (typeof process === \"undefined\" || process.env.NODE_ENV === \"production\") return;\n const isControlled = visibleLevels !== undefined;\n if (wasControlled.current === null) {\n wasControlled.current = isControlled;\n return;\n }\n if (wasControlled.current !== isControlled) {\n // biome-ignore lint/suspicious/noConsole: dev-only diagnostic (MEDIUM-002)\n console.warn(\n `[@theokit/ui] BuildLogStream: \\`visibleLevels\\` prop switched between ${\n wasControlled.current ? \"controlled\" : \"uncontrolled\"\n } and ${isControlled ? \"controlled\" : \"uncontrolled\"} between renders. Pick one mode and keep it consistent.`,\n );\n wasControlled.current = isControlled;\n }\n }, [visibleLevels]);\n\n const filtered = useMemo(() => {\n if (levels.size === 0) return lines;\n return lines.filter((l) => levels.has(l.level));\n }, [lines, levels]);\n\n const truncated = filtered.length > maxLines;\n const visible = truncated ? filtered.slice(filtered.length - maxLines) : filtered;\n const hiddenCount = truncated ? filtered.length - maxLines : 0;\n\n const toggle = (level: LogLevel) => {\n const next = new Set(levels);\n if (next.has(level)) next.delete(level);\n else next.add(level);\n updateLevels(next);\n };\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-2\", className)} {...props}>\n {filterable ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_LEVELS.map((level) => {\n const active = levels.size === 0 || levels.has(level);\n return (\n <button\n key={level}\n type=\"button\"\n onClick={() => toggle(level)}\n aria-pressed={active}\n className={cn(\n \"rounded-md border px-2 py-1 font-mono text-label uppercase tracking-wider\",\n \"transition-colors duration-base ease-out-soft\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n active\n ? cn(\"border-border/60 bg-muted\", levelClasses[level])\n : \"border-border/30 text-muted-foreground/50 hover:text-muted-foreground\",\n )}\n >\n {level}\n </button>\n );\n })}\n </div>\n ) : null}\n <div\n className={cn(\"overflow-y-auto rounded-lg border bg-card\", \"font-mono text-code-sm\")}\n style={{ height }}\n >\n {truncated ? (\n <output className=\"block border-border/30 border-b bg-muted/40 px-4 py-1.5 text-label text-muted-foreground\">\n Showing last {maxLines.toLocaleString()} of {filtered.length.toLocaleString()} lines (\n {hiddenCount.toLocaleString()} earlier lines hidden)\n </output>\n ) : null}\n {visible.length === 0 ? (\n <p className=\"px-4 py-3 text-muted-foreground\">No log lines.</p>\n ) : (\n <ol className=\"divide-y divide-border/30\" aria-live={effectiveLive} aria-atomic=\"false\">\n {visible.map((line) => (\n <li\n key={line.id}\n className=\"grid grid-cols-[auto_auto_1fr] gap-3 px-4 py-1.5 leading-relaxed hover:bg-muted/30\"\n >\n <span className=\"select-none text-muted-foreground\">{line.timestamp}</span>\n <span className={cn(\"select-none font-bold\", levelClasses[line.level])}>\n [{levelLabels[line.level]}]\n </span>\n <span className={levelClasses[line.level]}>\n {line.source ? (\n <span className=\"mr-2 text-muted-foreground\">{line.source}:</span>\n ) : null}\n {line.message}\n </span>\n </li>\n ))}\n </ol>\n )}\n </div>\n </div>\n );\n },\n);\nBuildLogStream.displayName = \"BuildLogStream\";\n\nexport { BuildLogStream };\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
2
|
+
import { ShieldAlert, Bot, User } from 'lucide-react';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var ACTOR_ICON = {
|
|
7
|
+
user: User,
|
|
8
|
+
agent: Bot,
|
|
9
|
+
system: ShieldAlert
|
|
10
|
+
};
|
|
11
|
+
var SEVERITY_CLASS = {
|
|
12
|
+
info: "text-muted-foreground",
|
|
13
|
+
warning: "text-warning",
|
|
14
|
+
error: "text-destructive"
|
|
15
|
+
};
|
|
16
|
+
var AuditLogEntry = forwardRef(
|
|
17
|
+
({ className, entry, ...props }, ref) => {
|
|
18
|
+
const Icon = ACTOR_ICON[entry.actor.kind];
|
|
19
|
+
const sev = entry.severity ?? "info";
|
|
20
|
+
return /* @__PURE__ */ jsxs(
|
|
21
|
+
"article",
|
|
22
|
+
{
|
|
23
|
+
ref,
|
|
24
|
+
className: cn(
|
|
25
|
+
"grid grid-cols-[auto_1fr_auto] items-start gap-3 border-border/30 border-b px-3 py-2",
|
|
26
|
+
"last:border-b-0",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props,
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsx(
|
|
32
|
+
"span",
|
|
33
|
+
{
|
|
34
|
+
className: cn(
|
|
35
|
+
"mt-0.5 grid size-7 place-items-center rounded-md bg-muted text-muted-foreground",
|
|
36
|
+
sev === "warning" && "text-warning",
|
|
37
|
+
sev === "error" && "text-destructive"
|
|
38
|
+
),
|
|
39
|
+
"aria-hidden": "true",
|
|
40
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "size-3.5" })
|
|
41
|
+
}
|
|
42
|
+
),
|
|
43
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
44
|
+
/* @__PURE__ */ jsxs("p", { className: "flex flex-wrap items-baseline gap-2 text-body-sm", children: [
|
|
45
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium font-mono text-code-sm text-foreground", children: entry.actor.name }),
|
|
46
|
+
/* @__PURE__ */ jsx("span", { className: cn("font-mono text-code-sm", SEVERITY_CLASS[sev]), children: entry.action }),
|
|
47
|
+
entry.target ? /* @__PURE__ */ jsx("span", { className: "truncate font-mono text-code-sm text-foreground/80", children: entry.target }) : null
|
|
48
|
+
] }),
|
|
49
|
+
entry.detail ? /* @__PURE__ */ jsx("div", { className: "mt-1 rounded-md bg-muted/40 px-2.5 py-1.5 font-mono text-code-sm text-muted-foreground", children: entry.detail }) : null
|
|
50
|
+
] }),
|
|
51
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 font-mono text-label text-muted-foreground tabular-nums", children: entry.timestamp })
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
AuditLogEntry.displayName = "AuditLogEntry";
|
|
58
|
+
|
|
59
|
+
export { AuditLogEntry };
|
|
60
|
+
//# sourceMappingURL=chunk-IYNUPG2G.js.map
|
|
61
|
+
//# sourceMappingURL=chunk-IYNUPG2G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/audit-log-entry/audit-log-entry.tsx"],"names":[],"mappings":";;;;;AA6BA,IAAM,UAAA,GAAoD;AAAA,EACxD,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,cAAA,GAAgD;AAAA,EACpD,IAAA,EAAM,uBAAA;AAAA,EACN,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAMA,IAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,OAAO,GAAG,KAAA,IAAS,GAAA,KAAQ;AACvC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,IAAY,MAAA;AAC9B,IAAA,uBACE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,sFAAA;AAAA,UACA,iBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,iFAAA;AAAA,gBACA,QAAQ,SAAA,IAAa,cAAA;AAAA,gBACrB,QAAQ,OAAA,IAAW;AAAA,eACrB;AAAA,cACA,aAAA,EAAY,MAAA;AAAA,cAEZ,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,WAC7B;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,kDAAA,EACX,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EACb,QAAA,EAAA,KAAA,CAAM,MAAM,IAAA,EACf,CAAA;AAAA,8BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,eAAe,GAAG,CAAC,CAAA,EAC9D,QAAA,EAAA,KAAA,CAAM,MAAA,EACT,CAAA;AAAA,cACC,KAAA,CAAM,yBACL,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oDAAA,EACb,QAAA,EAAA,KAAA,CAAM,QACT,CAAA,GACE;AAAA,aAAA,EACN,CAAA;AAAA,YACC,KAAA,CAAM,yBACL,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wFAAA,EACZ,QAAA,EAAA,KAAA,CAAM,QACT,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEAAA,EACb,gBAAM,SAAA,EACT;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-IYNUPG2G.js","sourcesContent":["import { Bot, ShieldAlert, User } 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 type AuditActorKind = \"user\" | \"agent\" | \"system\";\n\nexport type AuditSeverity = \"info\" | \"warning\" | \"error\";\n\nexport interface AuditEntry {\n id: string;\n /** Who triggered the action. */\n actor: { kind: AuditActorKind; name: string };\n /** Verb / action label, e.g. \"wrote file\", \"ran command\". */\n action: string;\n /** Target of the action (file path, command, etc). */\n target?: ReactNode;\n /** ISO timestamp / friendly label. */\n timestamp: string;\n severity?: AuditSeverity;\n /** Optional detail block (multi-line). */\n detail?: ReactNode;\n}\n\ninterface AuditLogEntryProps extends HTMLAttributes<HTMLElement> {\n entry: AuditEntry;\n}\n\nconst ACTOR_ICON: Record<AuditActorKind, IconComponent> = {\n user: User,\n agent: Bot,\n system: ShieldAlert,\n};\n\nconst SEVERITY_CLASS: Record<AuditSeverity, string> = {\n info: \"text-muted-foreground\",\n warning: \"text-warning\",\n error: \"text-destructive\",\n};\n\n/**\n * AuditLogEntry — one row in the agent audit log. Tells the user exactly\n * who did what and when. Severity colors the timestamp and target.\n */\nconst AuditLogEntry = forwardRef<HTMLElement, AuditLogEntryProps>(\n ({ className, entry, ...props }, ref) => {\n const Icon = ACTOR_ICON[entry.actor.kind];\n const sev = entry.severity ?? \"info\";\n return (\n <article\n ref={ref}\n className={cn(\n \"grid grid-cols-[auto_1fr_auto] items-start gap-3 border-border/30 border-b px-3 py-2\",\n \"last:border-b-0\",\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n \"mt-0.5 grid size-7 place-items-center rounded-md bg-muted text-muted-foreground\",\n sev === \"warning\" && \"text-warning\",\n sev === \"error\" && \"text-destructive\",\n )}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-baseline gap-2 text-body-sm\">\n <span className=\"font-medium font-mono text-code-sm text-foreground\">\n {entry.actor.name}\n </span>\n <span className={cn(\"font-mono text-code-sm\", SEVERITY_CLASS[sev])}>\n {entry.action}\n </span>\n {entry.target ? (\n <span className=\"truncate font-mono text-code-sm text-foreground/80\">\n {entry.target}\n </span>\n ) : null}\n </p>\n {entry.detail ? (\n <div className=\"mt-1 rounded-md bg-muted/40 px-2.5 py-1.5 font-mono text-code-sm text-muted-foreground\">\n {entry.detail}\n </div>\n ) : null}\n </div>\n <span className=\"shrink-0 font-mono text-label text-muted-foreground tabular-nums\">\n {entry.timestamp}\n </span>\n </article>\n );\n },\n);\nAuditLogEntry.displayName = \"AuditLogEntry\";\n\nexport { AuditLogEntry };\n"]}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Table } from './chunk-DZAAKHGZ.js';
|
|
2
|
+
import { Skeleton } from './chunk-AHTVYOPQ.js';
|
|
3
|
+
import { Pagination } from './chunk-VVBAEYKI.js';
|
|
4
|
+
import { DropdownMenu } from './chunk-65NVO6TK.js';
|
|
5
|
+
import { EmptyState } from './chunk-XJ3EG6XY.js';
|
|
6
|
+
import { cn } from './chunk-EWDN56AS.js';
|
|
7
|
+
import { ChevronDown, ChevronRight, MoreHorizontal } from 'lucide-react';
|
|
8
|
+
import { useState, useMemo, Fragment } from 'react';
|
|
9
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
function compareValues(a, b) {
|
|
12
|
+
if (a === b) return 0;
|
|
13
|
+
if (a === null || a === void 0) return -1;
|
|
14
|
+
if (b === null || b === void 0) return 1;
|
|
15
|
+
if (typeof a === "number" && typeof b === "number") return a - b;
|
|
16
|
+
return String(a).localeCompare(String(b));
|
|
17
|
+
}
|
|
18
|
+
function DataTable(props) {
|
|
19
|
+
const {
|
|
20
|
+
data,
|
|
21
|
+
columns,
|
|
22
|
+
rowKey,
|
|
23
|
+
stickyHeader = true,
|
|
24
|
+
expandable,
|
|
25
|
+
expandMode = "multiple",
|
|
26
|
+
rowActions,
|
|
27
|
+
pagination,
|
|
28
|
+
defaultSort,
|
|
29
|
+
sort: controlledSort,
|
|
30
|
+
onSortChange,
|
|
31
|
+
loading = false,
|
|
32
|
+
emptyState,
|
|
33
|
+
className
|
|
34
|
+
} = props;
|
|
35
|
+
const isControlledSort = onSortChange !== void 0;
|
|
36
|
+
const [uncontrolledSort, setUncontrolledSort] = useState(
|
|
37
|
+
defaultSort ?? null
|
|
38
|
+
);
|
|
39
|
+
const sort = isControlledSort ? controlledSort ?? null : uncontrolledSort;
|
|
40
|
+
const isControlledPage = pagination?.controlledPage !== void 0;
|
|
41
|
+
const [uncontrolledPage, setUncontrolledPage] = useState(0);
|
|
42
|
+
const currentPage = isControlledPage ? pagination?.controlledPage ?? 0 : uncontrolledPage;
|
|
43
|
+
const effectivePageSize = Math.max(1, pagination?.pageSize ?? 10);
|
|
44
|
+
const [expanded, setExpanded] = useState(/* @__PURE__ */ new Set());
|
|
45
|
+
function handleSort(columnKey) {
|
|
46
|
+
let nextSort;
|
|
47
|
+
if (sort?.key !== columnKey) {
|
|
48
|
+
nextSort = { key: columnKey, direction: "asc" };
|
|
49
|
+
} else if (sort.direction === "asc") {
|
|
50
|
+
nextSort = { key: columnKey, direction: "desc" };
|
|
51
|
+
} else {
|
|
52
|
+
nextSort = null;
|
|
53
|
+
}
|
|
54
|
+
if (isControlledSort) {
|
|
55
|
+
onSortChange?.(nextSort);
|
|
56
|
+
} else {
|
|
57
|
+
setUncontrolledSort(nextSort);
|
|
58
|
+
if (!isControlledPage) setUncontrolledPage(0);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function handlePageChange(page) {
|
|
62
|
+
const zeroIdx = page - 1;
|
|
63
|
+
if (isControlledPage) {
|
|
64
|
+
pagination?.onPageChange?.(zeroIdx);
|
|
65
|
+
} else {
|
|
66
|
+
setUncontrolledPage(zeroIdx);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function toggleExpand(key) {
|
|
70
|
+
if (expandMode === "single") {
|
|
71
|
+
setExpanded((prev) => prev.has(key) ? /* @__PURE__ */ new Set() : /* @__PURE__ */ new Set([key]));
|
|
72
|
+
} else {
|
|
73
|
+
setExpanded((prev) => {
|
|
74
|
+
const next = new Set(prev);
|
|
75
|
+
if (next.has(key)) {
|
|
76
|
+
next.delete(key);
|
|
77
|
+
} else {
|
|
78
|
+
next.add(key);
|
|
79
|
+
}
|
|
80
|
+
return next;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const sortedData = useMemo(() => {
|
|
85
|
+
if (isControlledSort || sort === null) return data;
|
|
86
|
+
const col = columns.find((c) => c.key === sort.key);
|
|
87
|
+
if (!col) return data;
|
|
88
|
+
const sorted = [...data].sort((a, b) => {
|
|
89
|
+
const aVal = col.render ? null : a[sort.key];
|
|
90
|
+
const bVal = col.render ? null : b[sort.key];
|
|
91
|
+
const cmp = compareValues(aVal, bVal);
|
|
92
|
+
return sort.direction === "asc" ? cmp : -cmp;
|
|
93
|
+
});
|
|
94
|
+
return sorted;
|
|
95
|
+
}, [data, sort, isControlledSort, columns]);
|
|
96
|
+
const visibleData = useMemo(() => {
|
|
97
|
+
if (!pagination) return sortedData;
|
|
98
|
+
if (isControlledPage) return sortedData;
|
|
99
|
+
const start = currentPage * effectivePageSize;
|
|
100
|
+
return sortedData.slice(start, start + effectivePageSize);
|
|
101
|
+
}, [sortedData, pagination, isControlledPage, currentPage, effectivePageSize]);
|
|
102
|
+
const extraCols = (expandable ? 1 : 0) + (rowActions ? 1 : 0);
|
|
103
|
+
const expandedColSpan = columns.length + extraCols;
|
|
104
|
+
const totalCols = columns.length + extraCols;
|
|
105
|
+
if (loading) {
|
|
106
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-full", className), children: /* @__PURE__ */ jsxs(Table, { children: [
|
|
107
|
+
/* @__PURE__ */ jsx(Table.Header, { className: stickyHeader ? "sticky top-0 bg-card" : void 0, children: /* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
108
|
+
expandable ? /* @__PURE__ */ jsx(Table.HeaderCell, { children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Expand" }) }) : null,
|
|
109
|
+
columns.map((col) => /* @__PURE__ */ jsx(Table.HeaderCell, { align: col.align, children: col.label }, col.key)),
|
|
110
|
+
rowActions ? /* @__PURE__ */ jsx(Table.HeaderCell, { children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Actions" }) }) : null
|
|
111
|
+
] }) }),
|
|
112
|
+
/* @__PURE__ */ jsx(Table.Body, { children: Array.from({ length: 5 }, (_, i) => (
|
|
113
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: skeleton rows are positional placeholders
|
|
114
|
+
/* @__PURE__ */ jsx(Table.Row, { children: Array.from({ length: totalCols }, (_2, j) => (
|
|
115
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: skeleton cells are positional placeholders
|
|
116
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }) }, `s-${i}-${j}`)
|
|
117
|
+
)) }, `skeleton-${i}`)
|
|
118
|
+
)) })
|
|
119
|
+
] }) });
|
|
120
|
+
}
|
|
121
|
+
if (sortedData.length === 0) {
|
|
122
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-full", className), children: emptyState ?? /* @__PURE__ */ jsx(EmptyState, { title: "No data", description: "There's nothing here yet." }) });
|
|
123
|
+
}
|
|
124
|
+
const totalPages = pagination ? Math.ceil(sortedData.length / effectivePageSize) : 1;
|
|
125
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("w-full", className), children: [
|
|
126
|
+
/* @__PURE__ */ jsxs(Table, { children: [
|
|
127
|
+
/* @__PURE__ */ jsx(Table.Header, { className: stickyHeader ? "sticky top-0 z-10 bg-card" : void 0, children: /* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
128
|
+
expandable ? /* @__PURE__ */ jsx(Table.HeaderCell, { children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Expand" }) }) : null,
|
|
129
|
+
columns.map((col) => {
|
|
130
|
+
const isSortable = col.sortable === true;
|
|
131
|
+
const isActive = sort?.key === col.key;
|
|
132
|
+
return /* @__PURE__ */ jsx(
|
|
133
|
+
Table.HeaderCell,
|
|
134
|
+
{
|
|
135
|
+
align: col.align,
|
|
136
|
+
onSort: isSortable ? () => handleSort(col.key) : void 0,
|
|
137
|
+
sortDirection: isSortable ? isActive ? sort?.direction : "none" : void 0,
|
|
138
|
+
style: col.width ? { width: col.width } : void 0,
|
|
139
|
+
children: col.label
|
|
140
|
+
},
|
|
141
|
+
col.key
|
|
142
|
+
);
|
|
143
|
+
}),
|
|
144
|
+
rowActions ? /* @__PURE__ */ jsx(Table.HeaderCell, { children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Actions" }) }) : null
|
|
145
|
+
] }) }),
|
|
146
|
+
/* @__PURE__ */ jsx(Table.Body, { children: visibleData.map((row) => {
|
|
147
|
+
const key = rowKey(row);
|
|
148
|
+
const expandedContent = expandable ? expandable(row) : null;
|
|
149
|
+
const isExpandable = expandedContent !== null && expandedContent !== void 0;
|
|
150
|
+
const isExpanded = expanded.has(key);
|
|
151
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
152
|
+
/* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
153
|
+
expandable ? /* @__PURE__ */ jsx(Table.Cell, { children: isExpandable ? /* @__PURE__ */ jsx(
|
|
154
|
+
"button",
|
|
155
|
+
{
|
|
156
|
+
type: "button",
|
|
157
|
+
onClick: () => toggleExpand(key),
|
|
158
|
+
"aria-expanded": isExpanded,
|
|
159
|
+
"aria-controls": `expanded-${key}`,
|
|
160
|
+
"aria-label": isExpanded ? "Collapse row" : "Expand row",
|
|
161
|
+
className: "inline-flex items-center justify-center rounded-md p-0.5 hover:bg-muted",
|
|
162
|
+
children: isExpanded ? /* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": "true", className: "size-4" }) : /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true", className: "size-4" })
|
|
163
|
+
}
|
|
164
|
+
) : null }) : null,
|
|
165
|
+
columns.map((col) => /* @__PURE__ */ jsx(Table.Cell, { align: col.align, className: col.className, children: col.render ? col.render(row) : String(row[col.key] ?? "") }, col.key)),
|
|
166
|
+
rowActions ? /* @__PURE__ */ jsx(Table.Cell, { align: "right", children: /* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
167
|
+
/* @__PURE__ */ jsx(
|
|
168
|
+
DropdownMenu.Trigger,
|
|
169
|
+
{
|
|
170
|
+
"aria-label": "Row actions",
|
|
171
|
+
className: cn(
|
|
172
|
+
"inline-flex size-7 items-center justify-center rounded-md",
|
|
173
|
+
"text-muted-foreground hover:bg-muted hover:text-foreground",
|
|
174
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
175
|
+
),
|
|
176
|
+
children: /* @__PURE__ */ jsx(MoreHorizontal, { "aria-hidden": "true", className: "size-4" })
|
|
177
|
+
}
|
|
178
|
+
),
|
|
179
|
+
/* @__PURE__ */ jsx(DropdownMenu.Content, { align: "end", children: rowActions(row) })
|
|
180
|
+
] }) }) : null
|
|
181
|
+
] }),
|
|
182
|
+
isExpanded && isExpandable ? /* @__PURE__ */ jsx("tr", { id: `expanded-${key}`, children: /* @__PURE__ */ jsx("td", { colSpan: expandedColSpan, className: "bg-muted/30 p-4", children: expandedContent }) }) : null
|
|
183
|
+
] }, key);
|
|
184
|
+
}) })
|
|
185
|
+
] }),
|
|
186
|
+
pagination && totalPages > 1 ? /* @__PURE__ */ jsx("div", { className: "mt-4 flex items-center justify-end", children: /* @__PURE__ */ jsx(
|
|
187
|
+
Pagination,
|
|
188
|
+
{
|
|
189
|
+
currentPage: currentPage + 1,
|
|
190
|
+
totalPages,
|
|
191
|
+
onPageChange: handlePageChange
|
|
192
|
+
}
|
|
193
|
+
) }) : null
|
|
194
|
+
] });
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export { DataTable };
|
|
198
|
+
//# sourceMappingURL=chunk-JJ65ZI4P.js.map
|
|
199
|
+
//# sourceMappingURL=chunk-JJ65ZI4P.js.map
|