@shepai/cli 1.66.4 → 1.68.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/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +21 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts +15 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +16 -2
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts +12 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.js +284 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts +33 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.js +210 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +56 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +32 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/index.js +2 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts +0 -4
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts +1 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +18 -12
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts +4 -6
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.js +5 -13
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +2 -13
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +2 -10
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +21 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +14 -20
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +7 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +37 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +9 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +13 -1
- package/dist/src/presentation/web/components/common/index.d.ts +1 -0
- package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/index.js +1 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.js +2 -2
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +1 -2
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -2
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +5 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +13 -2
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +5 -2
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -2
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +20 -215
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +2 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +4 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +5 -5
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/build-manifest.json +3 -3
- package/web/.next/server/app/page/server-reference-manifest.json +88 -88
- package/web/.next/server/app/page.js +1 -1
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/build-manifest.json +3 -3
- package/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/build-manifest.json +3 -3
- package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/build-manifest.json +3 -3
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js +3 -0
- package/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__f5830fa9._.js → [root-of-the-server]__2ffb27f1._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__f5830fa9._.js.map → [root-of-the-server]__2ffb27f1._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +9 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__f648005b._.js.map → [root-of-the-server]__e41b5eec._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_23c92688._.js +6 -0
- package/web/.next/server/chunks/ssr/_23c92688._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_28993370._.js +1 -1
- package/web/.next/server/chunks/ssr/_28993370._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_49bf495c._.js +3 -0
- package/web/.next/server/chunks/ssr/_49bf495c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_690ea95f._.js +3 -0
- package/web/.next/server/chunks/ssr/{_2900ed94._.js.map → _690ea95f._.js.map} +1 -1
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_c52cace8._.js → server/chunks/ssr/_725584e5._.js} +2 -2
- package/web/.next/server/chunks/ssr/_725584e5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +115 -115
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +5 -5
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +88 -88
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__f5830fa9._.js → [root-of-the-server]__2ffb27f1._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +9 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_23c92688._.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_28993370._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_49bf495c._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_690ea95f._.js +3 -0
- package/web/.next/{server/chunks/ssr/_c52cace8._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_725584e5._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +115 -115
- package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx +16 -2
- package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +35 -6
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.tsx +285 -0
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.tsx +650 -0
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/drawer-view.ts +82 -0
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/index.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.ts +0 -4
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx +5 -14
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +58 -51
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +42 -1
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +2 -16
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/index.ts +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.tsx +55 -2
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +97 -106
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.stories.tsx +14 -1
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +61 -1
- package/web/.next/standalone/src/presentation/web/components/common/index.ts +6 -0
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.stories.tsx +1 -2
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.tsx +1 -2
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -2
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx +28 -2
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.tsx +7 -2
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +7 -6
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +1 -2
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +1 -2
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +31 -348
- package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +2 -1
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +9 -1
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/0751efba75563e6a.js +1 -0
- package/web/.next/static/chunks/33b4e5444019ab64.js +1 -0
- package/web/.next/static/chunks/{35f41ba0a6d626d7.js → 491ae2bbae40857c.js} +1 -1
- package/web/.next/static/chunks/49feba0d1a871e2b.js +10 -0
- package/web/.next/static/chunks/4b6cc9f65260f2bd.js +2 -0
- package/web/.next/static/chunks/{e0073669b6bc24df.js → 7f6db87dc1fe9c3b.js} +1 -1
- package/web/.next/static/chunks/a186bbb822ccb655.css +2 -0
- package/web/.next/static/chunks/a5c59952485e875e.js +1 -0
- package/web/.next/static/chunks/{8c60d1bd87239066.js → a9626385607910b3.js} +1 -1
- package/web/.next/static/chunks/c1c15470a7b058c8.js +1 -0
- package/web/.next/static/chunks/caa2e7e1618e2179.js +1 -0
- package/web/.next/static/chunks/fb703cf73aba2eb8.js +1 -0
- package/web/.next/static/chunks/{turbopack-b6b5b4f015327a9a.js → turbopack-958ac34b879d0dce.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +0 -3
- package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +0 -9
- package/web/.next/server/chunks/ssr/_2900ed94._.js +0 -3
- package/web/.next/server/chunks/ssr/_6978d868._.js +0 -3
- package/web/.next/server/chunks/ssr/_6978d868._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_85965278._.js +0 -6
- package/web/.next/server/chunks/ssr/_85965278._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_c52cace8._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +0 -9
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_2900ed94._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6978d868._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_85965278._.js +0 -6
- package/web/.next/static/chunks/41a2adc09edfffaf.js +0 -1
- package/web/.next/static/chunks/5054c72b1c8f5912.js +0 -1
- package/web/.next/static/chunks/5f6d9f4647fc3093.js +0 -10
- package/web/.next/static/chunks/96f49affaceab206.css +0 -2
- package/web/.next/static/chunks/a6d1d774260fc927.js +0 -2
- package/web/.next/static/chunks/c0fdd832fc4ee8eb.js +0 -1
- package/web/.next/static/chunks/de70ba984363673f.js +0 -1
- package/web/.next/static/chunks/f5fb2f182ae9b015.js +0 -1
- /package/web/.next/static/{XGbKxw26cOCJQ-711YxBw → ntu60tngTU2e9MZgpdlz0}/_buildManifest.js +0 -0
- /package/web/.next/static/{XGbKxw26cOCJQ-711YxBw → ntu60tngTU2e9MZgpdlz0}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{XGbKxw26cOCJQ-711YxBw → ntu60tngTU2e9MZgpdlz0}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/presentation/web/hooks/use-notifications.ts","../../../../../../../node_modules/.pnpm/%40radix-ui%2Bnumber%401.1.1/node_modules/%40radix-ui/number/dist/index.mjs","../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-scroll-area%401.2.10_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types_ba0b3d60c668755d5c2d6349c8477ebb/node_modules/%40radix-ui/react-scroll-area/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/scroll-area.tsx","../../../../../../../src/presentation/web/hooks/use-deferred-mount.ts","../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx","../../../../../../../src/presentation/web/components/common/sound-toggle/sound-toggle.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/volume-off.ts","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-scroll-area%401.2.10_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types_ba0b3d60c668755d5c2d6349c8477ebb/node_modules/%40radix-ui/react-scroll-area/src/scroll-area.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/house.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/volume-2.ts","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-scroll-area%401.2.10_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types_ba0b3d60c668755d5c2d6349c8477ebb/node_modules/%40radix-ui/react-scroll-area/src/use-state-machine.ts","../../../../../../../src/presentation/web/components/ui/sonner.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { toast } from 'sonner';\nimport type { NotificationEvent } from '@shepai/core/domain/generated/output';\nimport { NotificationEventType, NotificationSeverity } from '@shepai/core/domain/generated/output';\nimport { useAgentEventsContext } from './agent-events-provider';\nimport { useSoundAction } from './use-sound-action';\nimport type { SoundAction } from './use-sound-action';\n\nexport interface UseNotificationsResult {\n requestBrowserPermission: () => Promise<void>;\n browserPermissionState: NotificationPermission;\n}\n\nconst SEVERITY_TO_TOAST: Record<NotificationSeverity, 'success' | 'error' | 'warning' | 'info'> = {\n [NotificationSeverity.Success]: 'success',\n [NotificationSeverity.Error]: 'error',\n [NotificationSeverity.Warning]: 'warning',\n [NotificationSeverity.Info]: 'info',\n};\n\nfunction dispatchToast(event: NotificationEvent): void {\n const method = SEVERITY_TO_TOAST[event.severity] ?? 'info';\n const isActionable = event.eventType === NotificationEventType.WaitingApproval;\n toast[method](event.featureName, {\n description: event.message,\n ...(isActionable && {\n action: {\n label: 'Review',\n onClick: () => {\n window.dispatchEvent(\n new CustomEvent('shep:select-feature', { detail: { featureId: event.featureId } })\n );\n },\n },\n }),\n });\n}\n\nfunction dispatchBrowserNotification(event: NotificationEvent): void {\n if (globalThis.Notification?.permission !== 'granted') {\n return;\n }\n new Notification(`Shep: ${event.featureName}`, {\n body: event.message,\n icon: '/favicon-light.svg',\n });\n}\n\nconst SEVERITY_TO_ACTION: Record<NotificationSeverity, SoundAction> = {\n [NotificationSeverity.Success]: 'notification-success',\n [NotificationSeverity.Error]: 'notification-error',\n [NotificationSeverity.Warning]: 'notification-warning',\n [NotificationSeverity.Info]: 'notification-info',\n};\n\nexport function useNotifications(): UseNotificationsResult {\n const { events } = useAgentEventsContext();\n\n const successSound = useSoundAction('notification-success');\n const errorSound = useSoundAction('notification-error');\n const warningSound = useSoundAction('notification-warning');\n const infoSound = useSoundAction('notification-info');\n\n const soundsByAction = useMemo<Record<string, { play: () => void }>>(\n () => ({\n 'notification-success': successSound,\n 'notification-error': errorSound,\n 'notification-warning': warningSound,\n 'notification-info': infoSound,\n }),\n [successSound, errorSound, warningSound, infoSound]\n );\n\n const [browserPermissionState, setBrowserPermissionState] = useState<NotificationPermission>(\n () => {\n if (typeof globalThis.Notification === 'undefined') return 'default';\n return globalThis.Notification.permission;\n }\n );\n\n // Track how many events from the array we've already processed.\n // Using the array index (instead of lastEvent) prevents React batching\n // from silently dropping events when multiple SSE messages arrive together.\n const processedCountRef = useRef(0);\n\n useEffect(() => {\n if (events.length <= processedCountRef.current) return;\n\n const newEvents = events.slice(processedCountRef.current);\n processedCountRef.current = events.length;\n\n for (const event of newEvents) {\n // Only notify for actionable events and completion celebrations\n if (\n event.severity !== NotificationSeverity.Error &&\n event.severity !== NotificationSeverity.Warning &&\n event.severity !== NotificationSeverity.Success\n ) {\n continue;\n }\n\n dispatchToast(event);\n dispatchBrowserNotification(event);\n\n const actionName = SEVERITY_TO_ACTION[event.severity];\n soundsByAction[actionName]?.play();\n }\n }, [events, soundsByAction]);\n\n const requestBrowserPermission = useCallback(async () => {\n if (typeof globalThis.Notification === 'undefined') return;\n const result = await globalThis.Notification.requestPermission();\n setBrowserPermissionState(result);\n }, []);\n\n return {\n requestBrowserPermission,\n browserPermissionState,\n };\n}\n","// packages/core/number/src/number.ts\nfunction clamp(value, [min, max]) {\n return Math.min(max, Math.max(min, value));\n}\nexport {\n clamp\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport { useCallback, type ReactNode } from 'react';\nimport { SidebarProvider, SidebarInset } from '@/components/ui/sidebar';\nimport { AppSidebar } from '@/components/layouts/app-sidebar';\nimport { AddRepositoryButton } from '@/components/common/add-repository-node';\nimport { ThemeToggle } from '@/components/common/theme-toggle';\nimport { SoundToggle } from '@/components/common/sound-toggle';\nimport { AgentEventsProvider } from '@/hooks/agent-events-provider';\nimport { useNotifications } from '@/hooks/use-notifications';\n\ninterface AppShellProps {\n children: ReactNode;\n}\n\n/** Inner shell that consumes the agent-events context for notifications. */\nfunction AppShellInner({ children }: AppShellProps) {\n // Subscribe to agent lifecycle events and dispatch toast/browser notifications\n useNotifications();\n\n const handleNewFeature = useCallback(() => {\n window.dispatchEvent(new CustomEvent('shep:open-create-drawer'));\n }, []);\n\n const handleRepositorySelect = useCallback((path: string) => {\n window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));\n }, []);\n\n return (\n <SidebarProvider>\n <AppSidebar features={[]} onNewFeature={handleNewFeature} />\n <SidebarInset>\n <div className=\"relative h-full\">\n <div className=\"absolute top-3 right-3 z-50 flex gap-1\">\n <AddRepositoryButton onSelect={handleRepositorySelect} />\n <SoundToggle />\n <ThemeToggle />\n </div>\n <main className=\"h-full\">{children}</main>\n </div>\n </SidebarInset>\n </SidebarProvider>\n );\n}\n\nexport function AppShell({ children }: AppShellProps) {\n return (\n <AgentEventsProvider>\n <AppShellInner>{children}</AppShellInner>\n </AgentEventsProvider>\n );\n}\n","\"use client\";\n\n// src/scroll-area.tsx\nimport * as React2 from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { clamp } from \"@radix-ui/number\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// src/use-state-machine.ts\nimport * as React from \"react\";\nfunction useStateMachine(initialState, machine) {\n return React.useReducer((state, event) => {\n const nextState = machine[state][event];\n return nextState ?? state;\n }, initialState);\n}\n\n// src/scroll-area.tsx\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar SCROLL_AREA_NAME = \"ScrollArea\";\nvar [createScrollAreaContext, createScrollAreaScope] = createContextScope(SCROLL_AREA_NAME);\nvar [ScrollAreaProvider, useScrollAreaContext] = createScrollAreaContext(SCROLL_AREA_NAME);\nvar ScrollArea = React2.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeScrollArea,\n type = \"hover\",\n dir,\n scrollHideDelay = 600,\n ...scrollAreaProps\n } = props;\n const [scrollArea, setScrollArea] = React2.useState(null);\n const [viewport, setViewport] = React2.useState(null);\n const [content, setContent] = React2.useState(null);\n const [scrollbarX, setScrollbarX] = React2.useState(null);\n const [scrollbarY, setScrollbarY] = React2.useState(null);\n const [cornerWidth, setCornerWidth] = React2.useState(0);\n const [cornerHeight, setCornerHeight] = React2.useState(0);\n const [scrollbarXEnabled, setScrollbarXEnabled] = React2.useState(false);\n const [scrollbarYEnabled, setScrollbarYEnabled] = React2.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setScrollArea(node));\n const direction = useDirection(dir);\n return /* @__PURE__ */ jsx(\n ScrollAreaProvider,\n {\n scope: __scopeScrollArea,\n type,\n dir: direction,\n scrollHideDelay,\n scrollArea,\n viewport,\n onViewportChange: setViewport,\n content,\n onContentChange: setContent,\n scrollbarX,\n onScrollbarXChange: setScrollbarX,\n scrollbarXEnabled,\n onScrollbarXEnabledChange: setScrollbarXEnabled,\n scrollbarY,\n onScrollbarYChange: setScrollbarY,\n scrollbarYEnabled,\n onScrollbarYEnabledChange: setScrollbarYEnabled,\n onCornerWidthChange: setCornerWidth,\n onCornerHeightChange: setCornerHeight,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n ...scrollAreaProps,\n ref: composedRefs,\n style: {\n position: \"relative\",\n // Pass corner sizes as CSS vars to reduce re-renders of context consumers\n [\"--radix-scroll-area-corner-width\"]: cornerWidth + \"px\",\n [\"--radix-scroll-area-corner-height\"]: cornerHeight + \"px\",\n ...props.style\n }\n }\n )\n }\n );\n }\n);\nScrollArea.displayName = SCROLL_AREA_NAME;\nvar VIEWPORT_NAME = \"ScrollAreaViewport\";\nvar ScrollAreaViewport = React2.forwardRef(\n (props, forwardedRef) => {\n const { __scopeScrollArea, children, nonce, ...viewportProps } = props;\n const context = useScrollAreaContext(VIEWPORT_NAME, __scopeScrollArea);\n const ref = React2.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onViewportChange);\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n \"style\",\n {\n dangerouslySetInnerHTML: {\n __html: `[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}`\n },\n nonce\n }\n ),\n /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-radix-scroll-area-viewport\": \"\",\n ...viewportProps,\n ref: composedRefs,\n style: {\n /**\n * We don't support `visible` because the intention is to have at least one scrollbar\n * if this component is used and `visible` will behave like `auto` in that case\n * https://developer.mozilla.org/en-US/docs/Web/CSS/overflow#description\n *\n * We don't handle `auto` because the intention is for the native implementation\n * to be hidden if using this component. We just want to ensure the node is scrollable\n * so could have used either `scroll` or `auto` here. We picked `scroll` to prevent\n * the browser from having to work out whether to render native scrollbars or not,\n * we tell it to with the intention of hiding them in CSS.\n */\n overflowX: context.scrollbarXEnabled ? \"scroll\" : \"hidden\",\n overflowY: context.scrollbarYEnabled ? \"scroll\" : \"hidden\",\n ...props.style\n },\n children: /* @__PURE__ */ jsx(\"div\", { ref: context.onContentChange, style: { minWidth: \"100%\", display: \"table\" }, children })\n }\n )\n ] });\n }\n);\nScrollAreaViewport.displayName = VIEWPORT_NAME;\nvar SCROLLBAR_NAME = \"ScrollAreaScrollbar\";\nvar ScrollAreaScrollbar = React2.forwardRef(\n (props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { onScrollbarXEnabledChange, onScrollbarYEnabledChange } = context;\n const isHorizontal = props.orientation === \"horizontal\";\n React2.useEffect(() => {\n isHorizontal ? onScrollbarXEnabledChange(true) : onScrollbarYEnabledChange(true);\n return () => {\n isHorizontal ? onScrollbarXEnabledChange(false) : onScrollbarYEnabledChange(false);\n };\n }, [isHorizontal, onScrollbarXEnabledChange, onScrollbarYEnabledChange]);\n return context.type === \"hover\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarHover, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"scroll\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarScroll, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"auto\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarAuto, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"always\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarVisible, { ...scrollbarProps, ref: forwardedRef }) : null;\n }\n);\nScrollAreaScrollbar.displayName = SCROLLBAR_NAME;\nvar ScrollAreaScrollbarHover = React2.forwardRef((props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [visible, setVisible] = React2.useState(false);\n React2.useEffect(() => {\n const scrollArea = context.scrollArea;\n let hideTimer = 0;\n if (scrollArea) {\n const handlePointerEnter = () => {\n window.clearTimeout(hideTimer);\n setVisible(true);\n };\n const handlePointerLeave = () => {\n hideTimer = window.setTimeout(() => setVisible(false), context.scrollHideDelay);\n };\n scrollArea.addEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.addEventListener(\"pointerleave\", handlePointerLeave);\n return () => {\n window.clearTimeout(hideTimer);\n scrollArea.removeEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.removeEventListener(\"pointerleave\", handlePointerLeave);\n };\n }\n }, [context.scrollArea, context.scrollHideDelay]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarAuto,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n});\nvar ScrollAreaScrollbarScroll = React2.forwardRef((props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const isHorizontal = props.orientation === \"horizontal\";\n const debounceScrollEnd = useDebounceCallback(() => send(\"SCROLL_END\"), 100);\n const [state, send] = useStateMachine(\"hidden\", {\n hidden: {\n SCROLL: \"scrolling\"\n },\n scrolling: {\n SCROLL_END: \"idle\",\n POINTER_ENTER: \"interacting\"\n },\n interacting: {\n SCROLL: \"interacting\",\n POINTER_LEAVE: \"idle\"\n },\n idle: {\n HIDE: \"hidden\",\n SCROLL: \"scrolling\",\n POINTER_ENTER: \"interacting\"\n }\n });\n React2.useEffect(() => {\n if (state === \"idle\") {\n const hideTimer = window.setTimeout(() => send(\"HIDE\"), context.scrollHideDelay);\n return () => window.clearTimeout(hideTimer);\n }\n }, [state, context.scrollHideDelay, send]);\n React2.useEffect(() => {\n const viewport = context.viewport;\n const scrollDirection = isHorizontal ? \"scrollLeft\" : \"scrollTop\";\n if (viewport) {\n let prevScrollPos = viewport[scrollDirection];\n const handleScroll = () => {\n const scrollPos = viewport[scrollDirection];\n const hasScrollInDirectionChanged = prevScrollPos !== scrollPos;\n if (hasScrollInDirectionChanged) {\n send(\"SCROLL\");\n debounceScrollEnd();\n }\n prevScrollPos = scrollPos;\n };\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [context.viewport, isHorizontal, send, debounceScrollEnd]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || state !== \"hidden\", children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": state === \"hidden\" ? \"hidden\" : \"visible\",\n ...scrollbarProps,\n ref: forwardedRef,\n onPointerEnter: composeEventHandlers(props.onPointerEnter, () => send(\"POINTER_ENTER\")),\n onPointerLeave: composeEventHandlers(props.onPointerLeave, () => send(\"POINTER_LEAVE\"))\n }\n ) });\n});\nvar ScrollAreaScrollbarAuto = React2.forwardRef((props, forwardedRef) => {\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { forceMount, ...scrollbarProps } = props;\n const [visible, setVisible] = React2.useState(false);\n const isHorizontal = props.orientation === \"horizontal\";\n const handleResize = useDebounceCallback(() => {\n if (context.viewport) {\n const isOverflowX = context.viewport.offsetWidth < context.viewport.scrollWidth;\n const isOverflowY = context.viewport.offsetHeight < context.viewport.scrollHeight;\n setVisible(isHorizontal ? isOverflowX : isOverflowY);\n }\n }, 10);\n useResizeObserver(context.viewport, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n});\nvar ScrollAreaScrollbarVisible = React2.forwardRef((props, forwardedRef) => {\n const { orientation = \"vertical\", ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const thumbRef = React2.useRef(null);\n const pointerOffsetRef = React2.useRef(0);\n const [sizes, setSizes] = React2.useState({\n content: 0,\n viewport: 0,\n scrollbar: { size: 0, paddingStart: 0, paddingEnd: 0 }\n });\n const thumbRatio = getThumbRatio(sizes.viewport, sizes.content);\n const commonProps = {\n ...scrollbarProps,\n sizes,\n onSizesChange: setSizes,\n hasThumb: Boolean(thumbRatio > 0 && thumbRatio < 1),\n onThumbChange: (thumb) => thumbRef.current = thumb,\n onThumbPointerUp: () => pointerOffsetRef.current = 0,\n onThumbPointerDown: (pointerPos) => pointerOffsetRef.current = pointerPos\n };\n function getScrollPosition(pointerPos, dir) {\n return getScrollPositionFromPointer(pointerPos, pointerOffsetRef.current, sizes, dir);\n }\n if (orientation === \"horizontal\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarX,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollLeft;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes, context.dir);\n thumbRef.current.style.transform = `translate3d(${offset}px, 0, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollLeft = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) {\n context.viewport.scrollLeft = getScrollPosition(pointerPos, context.dir);\n }\n }\n }\n );\n }\n if (orientation === \"vertical\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarY,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollTop;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes);\n thumbRef.current.style.transform = `translate3d(0, ${offset}px, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollTop = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) context.viewport.scrollTop = getScrollPosition(pointerPos);\n }\n }\n );\n }\n return null;\n});\nvar ScrollAreaScrollbarX = React2.forwardRef((props, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarXChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"horizontal\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n bottom: 0,\n left: context.dir === \"rtl\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n right: context.dir === \"ltr\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n [\"--radix-scroll-area-thumb-width\"]: getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.x),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.x),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollLeft + event.deltaX;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollWidth,\n viewport: context.viewport.offsetWidth,\n scrollbar: {\n size: ref.current.clientWidth,\n paddingStart: toInt(computedStyle.paddingLeft),\n paddingEnd: toInt(computedStyle.paddingRight)\n }\n });\n }\n }\n }\n );\n});\nvar ScrollAreaScrollbarY = React2.forwardRef((props, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarYChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"vertical\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n top: 0,\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: \"var(--radix-scroll-area-corner-height)\",\n [\"--radix-scroll-area-thumb-height\"]: getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.y),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.y),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollTop + event.deltaY;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollHeight,\n viewport: context.viewport.offsetHeight,\n scrollbar: {\n size: ref.current.clientHeight,\n paddingStart: toInt(computedStyle.paddingTop),\n paddingEnd: toInt(computedStyle.paddingBottom)\n }\n });\n }\n }\n }\n );\n});\nvar [ScrollbarProvider, useScrollbarContext] = createScrollAreaContext(SCROLLBAR_NAME);\nvar ScrollAreaScrollbarImpl = React2.forwardRef((props, forwardedRef) => {\n const {\n __scopeScrollArea,\n sizes,\n hasThumb,\n onThumbChange,\n onThumbPointerUp,\n onThumbPointerDown,\n onThumbPositionChange,\n onDragScroll,\n onWheelScroll,\n onResize,\n ...scrollbarProps\n } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, __scopeScrollArea);\n const [scrollbar, setScrollbar] = React2.useState(null);\n const composeRefs = useComposedRefs(forwardedRef, (node) => setScrollbar(node));\n const rectRef = React2.useRef(null);\n const prevWebkitUserSelectRef = React2.useRef(\"\");\n const viewport = context.viewport;\n const maxScrollPos = sizes.content - sizes.viewport;\n const handleWheelScroll = useCallbackRef(onWheelScroll);\n const handleThumbPositionChange = useCallbackRef(onThumbPositionChange);\n const handleResize = useDebounceCallback(onResize, 10);\n function handleDragScroll(event) {\n if (rectRef.current) {\n const x = event.clientX - rectRef.current.left;\n const y = event.clientY - rectRef.current.top;\n onDragScroll({ x, y });\n }\n }\n React2.useEffect(() => {\n const handleWheel = (event) => {\n const element = event.target;\n const isScrollbarWheel = scrollbar?.contains(element);\n if (isScrollbarWheel) handleWheelScroll(event, maxScrollPos);\n };\n document.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => document.removeEventListener(\"wheel\", handleWheel, { passive: false });\n }, [viewport, scrollbar, maxScrollPos, handleWheelScroll]);\n React2.useEffect(handleThumbPositionChange, [sizes, handleThumbPositionChange]);\n useResizeObserver(scrollbar, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(\n ScrollbarProvider,\n {\n scope: __scopeScrollArea,\n scrollbar,\n hasThumb,\n onThumbChange: useCallbackRef(onThumbChange),\n onThumbPointerUp: useCallbackRef(onThumbPointerUp),\n onThumbPositionChange: handleThumbPositionChange,\n onThumbPointerDown: useCallbackRef(onThumbPointerDown),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...scrollbarProps,\n ref: composeRefs,\n style: { position: \"absolute\", ...scrollbarProps.style },\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n const mainPointer = 0;\n if (event.button === mainPointer) {\n const element = event.target;\n element.setPointerCapture(event.pointerId);\n rectRef.current = scrollbar.getBoundingClientRect();\n prevWebkitUserSelectRef.current = document.body.style.webkitUserSelect;\n document.body.style.webkitUserSelect = \"none\";\n if (context.viewport) context.viewport.style.scrollBehavior = \"auto\";\n handleDragScroll(event);\n }\n }),\n onPointerMove: composeEventHandlers(props.onPointerMove, handleDragScroll),\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n const element = event.target;\n if (element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n document.body.style.webkitUserSelect = prevWebkitUserSelectRef.current;\n if (context.viewport) context.viewport.style.scrollBehavior = \"\";\n rectRef.current = null;\n })\n }\n )\n }\n );\n});\nvar THUMB_NAME = \"ScrollAreaThumb\";\nvar ScrollAreaThumb = React2.forwardRef(\n (props, forwardedRef) => {\n const { forceMount, ...thumbProps } = props;\n const scrollbarContext = useScrollbarContext(THUMB_NAME, props.__scopeScrollArea);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || scrollbarContext.hasThumb, children: /* @__PURE__ */ jsx(ScrollAreaThumbImpl, { ref: forwardedRef, ...thumbProps }) });\n }\n);\nvar ScrollAreaThumbImpl = React2.forwardRef(\n (props, forwardedRef) => {\n const { __scopeScrollArea, style, ...thumbProps } = props;\n const scrollAreaContext = useScrollAreaContext(THUMB_NAME, __scopeScrollArea);\n const scrollbarContext = useScrollbarContext(THUMB_NAME, __scopeScrollArea);\n const { onThumbPositionChange } = scrollbarContext;\n const composedRef = useComposedRefs(\n forwardedRef,\n (node) => scrollbarContext.onThumbChange(node)\n );\n const removeUnlinkedScrollListenerRef = React2.useRef(void 0);\n const debounceScrollEnd = useDebounceCallback(() => {\n if (removeUnlinkedScrollListenerRef.current) {\n removeUnlinkedScrollListenerRef.current();\n removeUnlinkedScrollListenerRef.current = void 0;\n }\n }, 100);\n React2.useEffect(() => {\n const viewport = scrollAreaContext.viewport;\n if (viewport) {\n const handleScroll = () => {\n debounceScrollEnd();\n if (!removeUnlinkedScrollListenerRef.current) {\n const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange);\n removeUnlinkedScrollListenerRef.current = listener;\n onThumbPositionChange();\n }\n };\n onThumbPositionChange();\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": scrollbarContext.hasThumb ? \"visible\" : \"hidden\",\n ...thumbProps,\n ref: composedRef,\n style: {\n width: \"var(--radix-scroll-area-thumb-width)\",\n height: \"var(--radix-scroll-area-thumb-height)\",\n ...style\n },\n onPointerDownCapture: composeEventHandlers(props.onPointerDownCapture, (event) => {\n const thumb = event.target;\n const thumbRect = thumb.getBoundingClientRect();\n const x = event.clientX - thumbRect.left;\n const y = event.clientY - thumbRect.top;\n scrollbarContext.onThumbPointerDown({ x, y });\n }),\n onPointerUp: composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)\n }\n );\n }\n);\nScrollAreaThumb.displayName = THUMB_NAME;\nvar CORNER_NAME = \"ScrollAreaCorner\";\nvar ScrollAreaCorner = React2.forwardRef(\n (props, forwardedRef) => {\n const context = useScrollAreaContext(CORNER_NAME, props.__scopeScrollArea);\n const hasBothScrollbarsVisible = Boolean(context.scrollbarX && context.scrollbarY);\n const hasCorner = context.type !== \"scroll\" && hasBothScrollbarsVisible;\n return hasCorner ? /* @__PURE__ */ jsx(ScrollAreaCornerImpl, { ...props, ref: forwardedRef }) : null;\n }\n);\nScrollAreaCorner.displayName = CORNER_NAME;\nvar ScrollAreaCornerImpl = React2.forwardRef((props, forwardedRef) => {\n const { __scopeScrollArea, ...cornerProps } = props;\n const context = useScrollAreaContext(CORNER_NAME, __scopeScrollArea);\n const [width, setWidth] = React2.useState(0);\n const [height, setHeight] = React2.useState(0);\n const hasSize = Boolean(width && height);\n useResizeObserver(context.scrollbarX, () => {\n const height2 = context.scrollbarX?.offsetHeight || 0;\n context.onCornerHeightChange(height2);\n setHeight(height2);\n });\n useResizeObserver(context.scrollbarY, () => {\n const width2 = context.scrollbarY?.offsetWidth || 0;\n context.onCornerWidthChange(width2);\n setWidth(width2);\n });\n return hasSize ? /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...cornerProps,\n ref: forwardedRef,\n style: {\n width,\n height,\n position: \"absolute\",\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: 0,\n ...props.style\n }\n }\n ) : null;\n});\nfunction toInt(value) {\n return value ? parseInt(value, 10) : 0;\n}\nfunction getThumbRatio(viewportSize, contentSize) {\n const ratio = viewportSize / contentSize;\n return isNaN(ratio) ? 0 : ratio;\n}\nfunction getThumbSize(sizes) {\n const ratio = getThumbRatio(sizes.viewport, sizes.content);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio;\n return Math.max(thumbSize, 18);\n}\nfunction getScrollPositionFromPointer(pointerPos, pointerOffset, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const thumbCenter = thumbSizePx / 2;\n const offset = pointerOffset || thumbCenter;\n const thumbOffsetFromEnd = thumbSizePx - offset;\n const minPointerPos = sizes.scrollbar.paddingStart + offset;\n const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;\n const maxScrollPos = sizes.content - sizes.viewport;\n const scrollRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const interpolate = linearScale([minPointerPos, maxPointerPos], scrollRange);\n return interpolate(pointerPos);\n}\nfunction getThumbOffsetFromScroll(scrollPos, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const scrollbar = sizes.scrollbar.size - scrollbarPadding;\n const maxScrollPos = sizes.content - sizes.viewport;\n const maxThumbPos = scrollbar - thumbSizePx;\n const scrollClampRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const scrollWithoutMomentum = clamp(scrollPos, scrollClampRange);\n const interpolate = linearScale([0, maxScrollPos], [0, maxThumbPos]);\n return interpolate(scrollWithoutMomentum);\n}\nfunction linearScale(input, output) {\n return (value) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\nfunction isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos) {\n return scrollPos > 0 && scrollPos < maxScrollPos;\n}\nvar addUnlinkedScrollListener = (node, handler = () => {\n}) => {\n let prevPosition = { left: node.scrollLeft, top: node.scrollTop };\n let rAF = 0;\n (function loop() {\n const position = { left: node.scrollLeft, top: node.scrollTop };\n const isHorizontalScroll = prevPosition.left !== position.left;\n const isVerticalScroll = prevPosition.top !== position.top;\n if (isHorizontalScroll || isVerticalScroll) handler();\n prevPosition = position;\n rAF = window.requestAnimationFrame(loop);\n })();\n return () => window.cancelAnimationFrame(rAF);\n};\nfunction useDebounceCallback(callback, delay) {\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = React2.useRef(0);\n React2.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), []);\n return React2.useCallback(() => {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = window.setTimeout(handleCallback, delay);\n }, [handleCallback, delay]);\n}\nfunction useResizeObserver(element, onResize) {\n const handleResize = useCallbackRef(onResize);\n useLayoutEffect(() => {\n let rAF = 0;\n if (element) {\n const resizeObserver = new ResizeObserver(() => {\n cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(handleResize);\n });\n resizeObserver.observe(element);\n return () => {\n window.cancelAnimationFrame(rAF);\n resizeObserver.unobserve(element);\n };\n }\n }, [element, handleResize]);\n}\nvar Root = ScrollArea;\nvar Viewport = ScrollAreaViewport;\nvar Scrollbar = ScrollAreaScrollbar;\nvar Thumb = ScrollAreaThumb;\nvar Corner = ScrollAreaCorner;\nexport {\n Corner,\n Root,\n ScrollArea,\n ScrollAreaCorner,\n ScrollAreaScrollbar,\n ScrollAreaThumb,\n ScrollAreaViewport,\n Scrollbar,\n Thumb,\n Viewport,\n createScrollAreaScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as React from 'react';\nimport { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn('relative', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none p-px transition-colors select-none',\n orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent',\n orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent',\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","'use client';\n\nimport { useState, useEffect } from 'react';\n\n/**\n * Defers mount/unmount of content to allow opacity transitions.\n * When expanding: mounts immediately, then sets visible on next frame.\n * When collapsing: hides immediately, then unmounts after `ms` delay.\n */\nexport function useDeferredMount(isCollapsed: boolean, ms: number) {\n const [mounted, setMounted] = useState(!isCollapsed);\n const [visible, setVisible] = useState(!isCollapsed);\n\n useEffect(() => {\n if (!isCollapsed) {\n setMounted(true);\n // delay visibility by one frame so the element mounts at opacity-0 first\n const raf = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(raf);\n }\n setVisible(false);\n const t = window.setTimeout(() => setMounted(false), ms);\n return () => window.clearTimeout(t);\n }, [isCollapsed, ms]);\n\n return { mounted, visible };\n}\n","'use client';\n\nimport { usePathname } from 'next/navigation';\nimport { Home, Wrench, Puzzle, Plus } from 'lucide-react';\nimport {\n Sidebar,\n SidebarHeader,\n SidebarContent,\n SidebarFooter,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n SidebarRail,\n useSidebar,\n} from '@/components/ui/sidebar';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { SidebarNavItem } from '@/components/common/sidebar-nav-item';\nimport { SidebarCollapseToggle } from '@/components/common/sidebar-collapse-toggle';\nimport { ShepLogo } from '@/components/common/shep-logo';\nimport { FeatureListItem } from '@/components/common/feature-list-item';\nimport { FeatureStatusGroup } from '@/components/common/feature-status-group';\nimport { SidebarSectionHeader } from '@/components/common/sidebar-section-header';\nimport { featureStatusConfig, featureStatusOrder } from '@/components/common/feature-status-config';\nimport type { FeatureStatus } from '@/components/common/feature-status-config';\nimport { useDeferredMount } from '@/hooks/use-deferred-mount';\nimport { featureFlags } from '@/lib/feature-flags';\n\ninterface FeatureItem {\n name: string;\n status: FeatureStatus;\n startedAt?: number;\n duration?: string;\n}\n\nexport interface AppSidebarProps {\n features: FeatureItem[];\n onNewFeature?: () => void;\n onFeatureClick?: (name: string) => void;\n onFeaturesFolderClick?: () => void;\n onFeaturesMenuClick?: () => void;\n}\n\nexport function AppSidebar({\n features,\n onNewFeature,\n onFeatureClick,\n onFeaturesFolderClick,\n onFeaturesMenuClick,\n}: AppSidebarProps) {\n const pathname = usePathname();\n const { state } = useSidebar();\n const collapsed = state === 'collapsed';\n const { mounted: showExpanded, visible: expandedVisible } = useDeferredMount(collapsed, 200);\n\n const grouped = featureStatusOrder.map((key) => {\n const { label } = featureStatusConfig[key];\n const items = features.filter((f) => f.status === key);\n return { key, label, items };\n });\n\n return (\n <Sidebar data-testid=\"app-sidebar\" collapsible=\"icon\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <div className=\"flex h-8 items-center group-data-[collapsible=icon]:justify-center\">\n {showExpanded ? (\n <div\n className={[\n 'flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2',\n 'transition-opacity duration-200 ease-out',\n expandedVisible ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n aria-hidden={!expandedVisible}\n >\n <ShepLogo className=\"shrink-0\" size={20} />\n <span className=\"truncate text-sm font-semibold tracking-tight\">Shep</span>\n </div>\n ) : null}\n <SidebarCollapseToggle className=\"shrink-0 transition-all duration-200\" />\n </div>\n </SidebarMenuItem>\n\n <SidebarNavItem icon={Home} label=\"Control Center\" href=\"/\" active={pathname === '/'} />\n <SidebarNavItem\n icon={Wrench}\n label=\"Tools\"\n href=\"/tools\"\n active={pathname === '/tools'}\n />\n {featureFlags.skills ? (\n <SidebarNavItem\n icon={Puzzle}\n label=\"Skills\"\n href=\"/skills\"\n active={pathname === '/skills'}\n />\n ) : null}\n </SidebarMenu>\n </SidebarHeader>\n\n <SidebarContent>\n {showExpanded ? (\n <div\n className={[\n 'min-w-0 overflow-hidden transition-opacity duration-200 ease-out',\n '[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',\n expandedVisible ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n >\n <SidebarSectionHeader\n label=\"Features\"\n onFolderClick={onFeaturesFolderClick}\n onMenuClick={onFeaturesMenuClick}\n />\n <ScrollArea>\n {grouped.map(({ key, label, items }) =>\n items.length > 0 ? (\n <FeatureStatusGroup key={key} label={label} count={items.length}>\n {items.map((feature) => (\n <FeatureListItem\n key={feature.name}\n name={feature.name}\n status={feature.status}\n startedAt={feature.startedAt}\n duration={feature.duration}\n onClick={onFeatureClick ? () => onFeatureClick(feature.name) : undefined}\n />\n ))}\n </FeatureStatusGroup>\n ) : null\n )}\n </ScrollArea>\n </div>\n ) : null}\n </SidebarContent>\n\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton onClick={onNewFeature} tooltip=\"New feature\">\n <Plus />\n <span>New feature</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n\n <SidebarRail />\n </Sidebar>\n );\n}\n","'use client';\n\nimport { Volume2, VolumeOff } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { useSoundEnabled } from '@/hooks/use-sound-enabled';\n\nexport function SoundToggle() {\n const { enabled, toggle } = useSoundEnabled();\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={toggle}\n aria-label={enabled ? 'Mute sounds' : 'Unmute sounds'}\n >\n {enabled ? <Volume2 className=\"h-5 w-5\" /> : <VolumeOff className=\"h-5 w-5\" />}\n <span className=\"sr-only\">Toggle sound</span>\n </Button>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M16 9a5 5 0 0 1 .95 2.293', key: '1fgyg8' }],\n ['path', { d: 'M19.364 5.636a9 9 0 0 1 1.889 9.96', key: 'l3zxae' }],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n [\n 'path',\n {\n d: 'm7 7-.587.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298V11',\n key: '1gbwow',\n },\n ],\n ['path', { d: 'M9.828 4.172A.686.686 0 0 1 11 4.657v.686', key: 's2je0y' }],\n];\n\n/**\n * @component @name VolumeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/volume-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst VolumeOff = createLucideIcon('volume-off', __iconNode);\n\nexport default VolumeOff;\n","import * as React from 'react';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Presence } from '@radix-ui/react-presence';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { useCallbackRef } from '@radix-ui/react-use-callback-ref';\nimport { useDirection } from '@radix-ui/react-direction';\nimport { useLayoutEffect } from '@radix-ui/react-use-layout-effect';\nimport { clamp } from '@radix-ui/number';\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { useStateMachine } from './use-state-machine';\n\nimport type { Scope } from '@radix-ui/react-context';\n\ntype Direction = 'ltr' | 'rtl';\ntype Sizes = {\n content: number;\n viewport: number;\n scrollbar: {\n size: number;\n paddingStart: number;\n paddingEnd: number;\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ScrollArea\n * -----------------------------------------------------------------------------------------------*/\n\nconst SCROLL_AREA_NAME = 'ScrollArea';\n\ntype ScopedProps<P> = P & { __scopeScrollArea?: Scope };\nconst [createScrollAreaContext, createScrollAreaScope] = createContextScope(SCROLL_AREA_NAME);\n\ntype ScrollAreaContextValue = {\n type: 'auto' | 'always' | 'scroll' | 'hover';\n dir: Direction;\n scrollHideDelay: number;\n scrollArea: ScrollAreaElement | null;\n viewport: ScrollAreaViewportElement | null;\n onViewportChange(viewport: ScrollAreaViewportElement | null): void;\n content: HTMLDivElement | null;\n onContentChange(content: HTMLDivElement): void;\n scrollbarX: ScrollAreaScrollbarElement | null;\n onScrollbarXChange(scrollbar: ScrollAreaScrollbarElement | null): void;\n scrollbarXEnabled: boolean;\n onScrollbarXEnabledChange(rendered: boolean): void;\n scrollbarY: ScrollAreaScrollbarElement | null;\n onScrollbarYChange(scrollbar: ScrollAreaScrollbarElement | null): void;\n scrollbarYEnabled: boolean;\n onScrollbarYEnabledChange(rendered: boolean): void;\n onCornerWidthChange(width: number): void;\n onCornerHeightChange(height: number): void;\n};\n\nconst [ScrollAreaProvider, useScrollAreaContext] =\n createScrollAreaContext<ScrollAreaContextValue>(SCROLL_AREA_NAME);\n\ntype ScrollAreaElement = React.ComponentRef<typeof Primitive.div>;\ntype PrimitiveDivProps = React.ComponentPropsWithoutRef<typeof Primitive.div>;\ninterface ScrollAreaProps extends PrimitiveDivProps {\n type?: ScrollAreaContextValue['type'];\n dir?: ScrollAreaContextValue['dir'];\n scrollHideDelay?: number;\n}\n\nconst ScrollArea = React.forwardRef<ScrollAreaElement, ScrollAreaProps>(\n (props: ScopedProps<ScrollAreaProps>, forwardedRef) => {\n const {\n __scopeScrollArea,\n type = 'hover',\n dir,\n scrollHideDelay = 600,\n ...scrollAreaProps\n } = props;\n const [scrollArea, setScrollArea] = React.useState<ScrollAreaElement | null>(null);\n const [viewport, setViewport] = React.useState<ScrollAreaViewportElement | null>(null);\n const [content, setContent] = React.useState<HTMLDivElement | null>(null);\n const [scrollbarX, setScrollbarX] = React.useState<ScrollAreaScrollbarElement | null>(null);\n const [scrollbarY, setScrollbarY] = React.useState<ScrollAreaScrollbarElement | null>(null);\n const [cornerWidth, setCornerWidth] = React.useState(0);\n const [cornerHeight, setCornerHeight] = React.useState(0);\n const [scrollbarXEnabled, setScrollbarXEnabled] = React.useState(false);\n const [scrollbarYEnabled, setScrollbarYEnabled] = React.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setScrollArea(node));\n const direction = useDirection(dir);\n\n return (\n <ScrollAreaProvider\n scope={__scopeScrollArea}\n type={type}\n dir={direction}\n scrollHideDelay={scrollHideDelay}\n scrollArea={scrollArea}\n viewport={viewport}\n onViewportChange={setViewport}\n content={content}\n onContentChange={setContent}\n scrollbarX={scrollbarX}\n onScrollbarXChange={setScrollbarX}\n scrollbarXEnabled={scrollbarXEnabled}\n onScrollbarXEnabledChange={setScrollbarXEnabled}\n scrollbarY={scrollbarY}\n onScrollbarYChange={setScrollbarY}\n scrollbarYEnabled={scrollbarYEnabled}\n onScrollbarYEnabledChange={setScrollbarYEnabled}\n onCornerWidthChange={setCornerWidth}\n onCornerHeightChange={setCornerHeight}\n >\n <Primitive.div\n dir={direction}\n {...scrollAreaProps}\n ref={composedRefs}\n style={{\n position: 'relative',\n // Pass corner sizes as CSS vars to reduce re-renders of context consumers\n ['--radix-scroll-area-corner-width' as any]: cornerWidth + 'px',\n ['--radix-scroll-area-corner-height' as any]: cornerHeight + 'px',\n ...props.style,\n }}\n />\n </ScrollAreaProvider>\n );\n }\n);\n\nScrollArea.displayName = SCROLL_AREA_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * ScrollAreaViewport\n * -----------------------------------------------------------------------------------------------*/\n\nconst VIEWPORT_NAME = 'ScrollAreaViewport';\n\ntype ScrollAreaViewportElement = React.ComponentRef<typeof Primitive.div>;\ninterface ScrollAreaViewportProps extends PrimitiveDivProps {\n nonce?: string;\n}\n\nconst ScrollAreaViewport = React.forwardRef<ScrollAreaViewportElement, ScrollAreaViewportProps>(\n (props: ScopedProps<ScrollAreaViewportProps>, forwardedRef) => {\n const { __scopeScrollArea, children, nonce, ...viewportProps } = props;\n const context = useScrollAreaContext(VIEWPORT_NAME, __scopeScrollArea);\n const ref = React.useRef<ScrollAreaViewportElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onViewportChange);\n return (\n <>\n {/* Hide scrollbars cross-browser and enable momentum scroll for touch devices */}\n <style\n dangerouslySetInnerHTML={{\n __html: `[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}`,\n }}\n nonce={nonce}\n />\n <Primitive.div\n data-radix-scroll-area-viewport=\"\"\n {...viewportProps}\n ref={composedRefs}\n style={{\n /**\n * We don't support `visible` because the intention is to have at least one scrollbar\n * if this component is used and `visible` will behave like `auto` in that case\n * https://developer.mozilla.org/en-US/docs/Web/CSS/overflow#description\n *\n * We don't handle `auto` because the intention is for the native implementation\n * to be hidden if using this component. We just want to ensure the node is scrollable\n * so could have used either `scroll` or `auto` here. We picked `scroll` to prevent\n * the browser from having to work out whether to render native scrollbars or not,\n * we tell it to with the intention of hiding them in CSS.\n */\n overflowX: context.scrollbarXEnabled ? 'scroll' : 'hidden',\n overflowY: context.scrollbarYEnabled ? 'scroll' : 'hidden',\n ...props.style,\n }}\n >\n {/**\n * `display: table` ensures our content div will match the size of its children in both\n * horizontal and vertical axis so we can determine if scroll width/height changed and\n * recalculate thumb sizes. This doesn't account for children with *percentage*\n * widths that change. We'll wait to see what use-cases consumers come up with there\n * before trying to resolve it.\n */}\n <div ref={context.onContentChange} style={{ minWidth: '100%', display: 'table' }}>\n {children}\n </div>\n </Primitive.div>\n </>\n );\n }\n);\n\nScrollAreaViewport.displayName = VIEWPORT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * ScrollAreaScrollbar\n * -----------------------------------------------------------------------------------------------*/\n\nconst SCROLLBAR_NAME = 'ScrollAreaScrollbar';\n\ntype ScrollAreaScrollbarElement = ScrollAreaScrollbarVisibleElement;\ninterface ScrollAreaScrollbarProps extends ScrollAreaScrollbarVisibleProps {\n forceMount?: true;\n}\n\nconst ScrollAreaScrollbar = React.forwardRef<ScrollAreaScrollbarElement, ScrollAreaScrollbarProps>(\n (props: ScopedProps<ScrollAreaScrollbarProps>, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { onScrollbarXEnabledChange, onScrollbarYEnabledChange } = context;\n const isHorizontal = props.orientation === 'horizontal';\n\n React.useEffect(() => {\n isHorizontal ? onScrollbarXEnabledChange(true) : onScrollbarYEnabledChange(true);\n return () => {\n isHorizontal ? onScrollbarXEnabledChange(false) : onScrollbarYEnabledChange(false);\n };\n }, [isHorizontal, onScrollbarXEnabledChange, onScrollbarYEnabledChange]);\n\n return context.type === 'hover' ? (\n <ScrollAreaScrollbarHover {...scrollbarProps} ref={forwardedRef} forceMount={forceMount} />\n ) : context.type === 'scroll' ? (\n <ScrollAreaScrollbarScroll {...scrollbarProps} ref={forwardedRef} forceMount={forceMount} />\n ) : context.type === 'auto' ? (\n <ScrollAreaScrollbarAuto {...scrollbarProps} ref={forwardedRef} forceMount={forceMount} />\n ) : context.type === 'always' ? (\n <ScrollAreaScrollbarVisible {...scrollbarProps} ref={forwardedRef} />\n ) : null;\n }\n);\n\nScrollAreaScrollbar.displayName = SCROLLBAR_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\ntype ScrollAreaScrollbarHoverElement = ScrollAreaScrollbarAutoElement;\ninterface ScrollAreaScrollbarHoverProps extends ScrollAreaScrollbarAutoProps {\n forceMount?: true;\n}\n\nconst ScrollAreaScrollbarHover = React.forwardRef<\n ScrollAreaScrollbarHoverElement,\n ScrollAreaScrollbarHoverProps\n>((props: ScopedProps<ScrollAreaScrollbarHoverProps>, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [visible, setVisible] = React.useState(false);\n\n React.useEffect(() => {\n const scrollArea = context.scrollArea;\n let hideTimer = 0;\n if (scrollArea) {\n const handlePointerEnter = () => {\n window.clearTimeout(hideTimer);\n setVisible(true);\n };\n const handlePointerLeave = () => {\n hideTimer = window.setTimeout(() => setVisible(false), context.scrollHideDelay);\n };\n scrollArea.addEventListener('pointerenter', handlePointerEnter);\n scrollArea.addEventListener('pointerleave', handlePointerLeave);\n return () => {\n window.clearTimeout(hideTimer);\n scrollArea.removeEventListener('pointerenter', handlePointerEnter);\n scrollArea.removeEventListener('pointerleave', handlePointerLeave);\n };\n }\n }, [context.scrollArea, context.scrollHideDelay]);\n\n return (\n <Presence present={forceMount || visible}>\n <ScrollAreaScrollbarAuto\n data-state={visible ? 'visible' : 'hidden'}\n {...scrollbarProps}\n ref={forwardedRef}\n />\n </Presence>\n );\n});\n\ntype ScrollAreaScrollbarScrollElement = ScrollAreaScrollbarVisibleElement;\ninterface ScrollAreaScrollbarScrollProps extends ScrollAreaScrollbarVisibleProps {\n forceMount?: true;\n}\n\nconst ScrollAreaScrollbarScroll = React.forwardRef<\n ScrollAreaScrollbarScrollElement,\n ScrollAreaScrollbarScrollProps\n>((props: ScopedProps<ScrollAreaScrollbarScrollProps>, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const isHorizontal = props.orientation === 'horizontal';\n const debounceScrollEnd = useDebounceCallback(() => send('SCROLL_END'), 100);\n const [state, send] = useStateMachine('hidden', {\n hidden: {\n SCROLL: 'scrolling',\n },\n scrolling: {\n SCROLL_END: 'idle',\n POINTER_ENTER: 'interacting',\n },\n interacting: {\n SCROLL: 'interacting',\n POINTER_LEAVE: 'idle',\n },\n idle: {\n HIDE: 'hidden',\n SCROLL: 'scrolling',\n POINTER_ENTER: 'interacting',\n },\n });\n\n React.useEffect(() => {\n if (state === 'idle') {\n const hideTimer = window.setTimeout(() => send('HIDE'), context.scrollHideDelay);\n return () => window.clearTimeout(hideTimer);\n }\n }, [state, context.scrollHideDelay, send]);\n\n React.useEffect(() => {\n const viewport = context.viewport;\n const scrollDirection = isHorizontal ? 'scrollLeft' : 'scrollTop';\n\n if (viewport) {\n let prevScrollPos = viewport[scrollDirection];\n const handleScroll = () => {\n const scrollPos = viewport[scrollDirection];\n const hasScrollInDirectionChanged = prevScrollPos !== scrollPos;\n if (hasScrollInDirectionChanged) {\n send('SCROLL');\n debounceScrollEnd();\n }\n prevScrollPos = scrollPos;\n };\n viewport.addEventListener('scroll', handleScroll);\n return () => viewport.removeEventListener('scroll', handleScroll);\n }\n }, [context.viewport, isHorizontal, send, debounceScrollEnd]);\n\n return (\n <Presence present={forceMount || state !== 'hidden'}>\n <ScrollAreaScrollbarVisible\n data-state={state === 'hidden' ? 'hidden' : 'visible'}\n {...scrollbarProps}\n ref={forwardedRef}\n onPointerEnter={composeEventHandlers(props.onPointerEnter, () => send('POINTER_ENTER'))}\n onPointerLeave={composeEventHandlers(props.onPointerLeave, () => send('POINTER_LEAVE'))}\n />\n </Presence>\n );\n});\n\ntype ScrollAreaScrollbarAutoElement = ScrollAreaScrollbarVisibleElement;\ninterface ScrollAreaScrollbarAutoProps extends ScrollAreaScrollbarVisibleProps {\n forceMount?: true;\n}\n\nconst ScrollAreaScrollbarAuto = React.forwardRef<\n ScrollAreaScrollbarAutoElement,\n ScrollAreaScrollbarAutoProps\n>((props: ScopedProps<ScrollAreaScrollbarAutoProps>, forwardedRef) => {\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { forceMount, ...scrollbarProps } = props;\n const [visible, setVisible] = React.useState(false);\n const isHorizontal = props.orientation === 'horizontal';\n const handleResize = useDebounceCallback(() => {\n if (context.viewport) {\n const isOverflowX = context.viewport.offsetWidth < context.viewport.scrollWidth;\n const isOverflowY = context.viewport.offsetHeight < context.viewport.scrollHeight;\n setVisible(isHorizontal ? isOverflowX : isOverflowY);\n }\n }, 10);\n\n useResizeObserver(context.viewport, handleResize);\n useResizeObserver(context.content, handleResize);\n\n return (\n <Presence present={forceMount || visible}>\n <ScrollAreaScrollbarVisible\n data-state={visible ? 'visible' : 'hidden'}\n {...scrollbarProps}\n ref={forwardedRef}\n />\n </Presence>\n );\n});\n\n/* -----------------------------------------------------------------------------------------------*/\n\ntype ScrollAreaScrollbarVisibleElement = ScrollAreaScrollbarAxisElement;\ninterface ScrollAreaScrollbarVisibleProps\n extends Omit<ScrollAreaScrollbarAxisProps, keyof ScrollAreaScrollbarAxisPrivateProps> {\n orientation?: 'horizontal' | 'vertical';\n}\n\nconst ScrollAreaScrollbarVisible = React.forwardRef<\n ScrollAreaScrollbarVisibleElement,\n ScrollAreaScrollbarVisibleProps\n>((props: ScopedProps<ScrollAreaScrollbarVisibleProps>, forwardedRef) => {\n const { orientation = 'vertical', ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const thumbRef = React.useRef<ScrollAreaThumbElement | null>(null);\n const pointerOffsetRef = React.useRef(0);\n const [sizes, setSizes] = React.useState<Sizes>({\n content: 0,\n viewport: 0,\n scrollbar: { size: 0, paddingStart: 0, paddingEnd: 0 },\n });\n const thumbRatio = getThumbRatio(sizes.viewport, sizes.content);\n\n type UncommonProps = 'onThumbPositionChange' | 'onDragScroll' | 'onWheelScroll';\n const commonProps: Omit<ScrollAreaScrollbarAxisPrivateProps, UncommonProps> = {\n ...scrollbarProps,\n sizes,\n onSizesChange: setSizes,\n hasThumb: Boolean(thumbRatio > 0 && thumbRatio < 1),\n onThumbChange: (thumb) => (thumbRef.current = thumb),\n onThumbPointerUp: () => (pointerOffsetRef.current = 0),\n onThumbPointerDown: (pointerPos) => (pointerOffsetRef.current = pointerPos),\n };\n\n function getScrollPosition(pointerPos: number, dir?: Direction) {\n return getScrollPositionFromPointer(pointerPos, pointerOffsetRef.current, sizes, dir);\n }\n\n if (orientation === 'horizontal') {\n return (\n <ScrollAreaScrollbarX\n {...commonProps}\n ref={forwardedRef}\n onThumbPositionChange={() => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollLeft;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes, context.dir);\n thumbRef.current.style.transform = `translate3d(${offset}px, 0, 0)`;\n }\n }}\n onWheelScroll={(scrollPos) => {\n if (context.viewport) context.viewport.scrollLeft = scrollPos;\n }}\n onDragScroll={(pointerPos) => {\n if (context.viewport) {\n context.viewport.scrollLeft = getScrollPosition(pointerPos, context.dir);\n }\n }}\n />\n );\n }\n\n if (orientation === 'vertical') {\n return (\n <ScrollAreaScrollbarY\n {...commonProps}\n ref={forwardedRef}\n onThumbPositionChange={() => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollTop;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes);\n thumbRef.current.style.transform = `translate3d(0, ${offset}px, 0)`;\n }\n }}\n onWheelScroll={(scrollPos) => {\n if (context.viewport) context.viewport.scrollTop = scrollPos;\n }}\n onDragScroll={(pointerPos) => {\n if (context.viewport) context.viewport.scrollTop = getScrollPosition(pointerPos);\n }}\n />\n );\n }\n\n return null;\n});\n\n/* -----------------------------------------------------------------------------------------------*/\n\ntype ScrollAreaScrollbarAxisPrivateProps = {\n hasThumb: boolean;\n sizes: Sizes;\n onSizesChange(sizes: Sizes): void;\n onThumbChange(thumb: ScrollAreaThumbElement | null): void;\n onThumbPointerDown(pointerPos: number): void;\n onThumbPointerUp(): void;\n onThumbPositionChange(): void;\n onWheelScroll(scrollPos: number): void;\n onDragScroll(pointerPos: number): void;\n};\n\ntype ScrollAreaScrollbarAxisElement = ScrollAreaScrollbarImplElement;\ninterface ScrollAreaScrollbarAxisProps\n extends Omit<ScrollAreaScrollbarImplProps, keyof ScrollAreaScrollbarImplPrivateProps>,\n ScrollAreaScrollbarAxisPrivateProps {}\n\nconst ScrollAreaScrollbarX = React.forwardRef<\n ScrollAreaScrollbarAxisElement,\n ScrollAreaScrollbarAxisProps\n>((props: ScopedProps<ScrollAreaScrollbarAxisProps>, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React.useState<CSSStyleDeclaration>();\n const ref = React.useRef<ScrollAreaScrollbarAxisElement>(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarXChange);\n\n React.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n\n return (\n <ScrollAreaScrollbarImpl\n data-orientation=\"horizontal\"\n {...scrollbarProps}\n ref={composeRefs}\n sizes={sizes}\n style={{\n bottom: 0,\n left: context.dir === 'rtl' ? 'var(--radix-scroll-area-corner-width)' : 0,\n right: context.dir === 'ltr' ? 'var(--radix-scroll-area-corner-width)' : 0,\n ['--radix-scroll-area-thumb-width' as any]: getThumbSize(sizes) + 'px',\n ...props.style,\n }}\n onThumbPointerDown={(pointerPos) => props.onThumbPointerDown(pointerPos.x)}\n onDragScroll={(pointerPos) => props.onDragScroll(pointerPos.x)}\n onWheelScroll={(event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollLeft + event.deltaX;\n props.onWheelScroll(scrollPos);\n // prevent window scroll when wheeling on scrollbar\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n }}\n onResize={() => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollWidth,\n viewport: context.viewport.offsetWidth,\n scrollbar: {\n size: ref.current.clientWidth,\n paddingStart: toInt(computedStyle.paddingLeft),\n paddingEnd: toInt(computedStyle.paddingRight),\n },\n });\n }\n }}\n />\n );\n});\n\nconst ScrollAreaScrollbarY = React.forwardRef<\n ScrollAreaScrollbarAxisElement,\n ScrollAreaScrollbarAxisProps\n>((props: ScopedProps<ScrollAreaScrollbarAxisProps>, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React.useState<CSSStyleDeclaration>();\n const ref = React.useRef<ScrollAreaScrollbarAxisElement>(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarYChange);\n\n React.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n\n return (\n <ScrollAreaScrollbarImpl\n data-orientation=\"vertical\"\n {...scrollbarProps}\n ref={composeRefs}\n sizes={sizes}\n style={{\n top: 0,\n right: context.dir === 'ltr' ? 0 : undefined,\n left: context.dir === 'rtl' ? 0 : undefined,\n bottom: 'var(--radix-scroll-area-corner-height)',\n ['--radix-scroll-area-thumb-height' as any]: getThumbSize(sizes) + 'px',\n ...props.style,\n }}\n onThumbPointerDown={(pointerPos) => props.onThumbPointerDown(pointerPos.y)}\n onDragScroll={(pointerPos) => props.onDragScroll(pointerPos.y)}\n onWheelScroll={(event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollTop + event.deltaY;\n props.onWheelScroll(scrollPos);\n // prevent window scroll when wheeling on scrollbar\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n }}\n onResize={() => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollHeight,\n viewport: context.viewport.offsetHeight,\n scrollbar: {\n size: ref.current.clientHeight,\n paddingStart: toInt(computedStyle.paddingTop),\n paddingEnd: toInt(computedStyle.paddingBottom),\n },\n });\n }\n }}\n />\n );\n});\n\n/* -----------------------------------------------------------------------------------------------*/\n\ntype ScrollbarContext = {\n hasThumb: boolean;\n scrollbar: ScrollAreaScrollbarElement | null;\n onThumbChange(thumb: ScrollAreaThumbElement | null): void;\n onThumbPointerUp(): void;\n onThumbPointerDown(pointerPos: { x: number; y: number }): void;\n onThumbPositionChange(): void;\n};\n\nconst [ScrollbarProvider, useScrollbarContext] =\n createScrollAreaContext<ScrollbarContext>(SCROLLBAR_NAME);\n\ntype ScrollAreaScrollbarImplElement = React.ComponentRef<typeof Primitive.div>;\ntype ScrollAreaScrollbarImplPrivateProps = {\n sizes: Sizes;\n hasThumb: boolean;\n onThumbChange: ScrollbarContext['onThumbChange'];\n onThumbPointerUp: ScrollbarContext['onThumbPointerUp'];\n onThumbPointerDown: ScrollbarContext['onThumbPointerDown'];\n onThumbPositionChange: ScrollbarContext['onThumbPositionChange'];\n onWheelScroll(event: WheelEvent, maxScrollPos: number): void;\n onDragScroll(pointerPos: { x: number; y: number }): void;\n onResize(): void;\n};\ninterface ScrollAreaScrollbarImplProps\n extends Omit<PrimitiveDivProps, keyof ScrollAreaScrollbarImplPrivateProps>,\n ScrollAreaScrollbarImplPrivateProps {}\n\nconst ScrollAreaScrollbarImpl = React.forwardRef<\n ScrollAreaScrollbarImplElement,\n ScrollAreaScrollbarImplProps\n>((props: ScopedProps<ScrollAreaScrollbarImplProps>, forwardedRef) => {\n const {\n __scopeScrollArea,\n sizes,\n hasThumb,\n onThumbChange,\n onThumbPointerUp,\n onThumbPointerDown,\n onThumbPositionChange,\n onDragScroll,\n onWheelScroll,\n onResize,\n ...scrollbarProps\n } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, __scopeScrollArea);\n const [scrollbar, setScrollbar] = React.useState<ScrollAreaScrollbarElement | null>(null);\n const composeRefs = useComposedRefs(forwardedRef, (node) => setScrollbar(node));\n const rectRef = React.useRef<DOMRect | null>(null);\n const prevWebkitUserSelectRef = React.useRef<string>('');\n const viewport = context.viewport;\n const maxScrollPos = sizes.content - sizes.viewport;\n const handleWheelScroll = useCallbackRef(onWheelScroll);\n const handleThumbPositionChange = useCallbackRef(onThumbPositionChange);\n const handleResize = useDebounceCallback(onResize, 10);\n\n function handleDragScroll(event: React.PointerEvent<HTMLElement>) {\n if (rectRef.current) {\n const x = event.clientX - rectRef.current.left;\n const y = event.clientY - rectRef.current.top;\n onDragScroll({ x, y });\n }\n }\n\n /**\n * We bind wheel event imperatively so we can switch off passive\n * mode for document wheel event to allow it to be prevented\n */\n React.useEffect(() => {\n const handleWheel = (event: WheelEvent) => {\n const element = event.target as HTMLElement;\n const isScrollbarWheel = scrollbar?.contains(element);\n if (isScrollbarWheel) handleWheelScroll(event, maxScrollPos);\n };\n document.addEventListener('wheel', handleWheel, { passive: false });\n return () => document.removeEventListener('wheel', handleWheel, { passive: false } as any);\n }, [viewport, scrollbar, maxScrollPos, handleWheelScroll]);\n\n /**\n * Update thumb position on sizes change\n */\n React.useEffect(handleThumbPositionChange, [sizes, handleThumbPositionChange]);\n\n useResizeObserver(scrollbar, handleResize);\n useResizeObserver(context.content, handleResize);\n\n return (\n <ScrollbarProvider\n scope={__scopeScrollArea}\n scrollbar={scrollbar}\n hasThumb={hasThumb}\n onThumbChange={useCallbackRef(onThumbChange)}\n onThumbPointerUp={useCallbackRef(onThumbPointerUp)}\n onThumbPositionChange={handleThumbPositionChange}\n onThumbPointerDown={useCallbackRef(onThumbPointerDown)}\n >\n <Primitive.div\n {...scrollbarProps}\n ref={composeRefs}\n style={{ position: 'absolute', ...scrollbarProps.style }}\n onPointerDown={composeEventHandlers(props.onPointerDown, (event) => {\n const mainPointer = 0;\n if (event.button === mainPointer) {\n const element = event.target as HTMLElement;\n element.setPointerCapture(event.pointerId);\n rectRef.current = scrollbar!.getBoundingClientRect();\n // pointer capture doesn't prevent text selection in Safari\n // so we remove text selection manually when scrolling\n prevWebkitUserSelectRef.current = document.body.style.webkitUserSelect;\n document.body.style.webkitUserSelect = 'none';\n if (context.viewport) context.viewport.style.scrollBehavior = 'auto';\n handleDragScroll(event);\n }\n })}\n onPointerMove={composeEventHandlers(props.onPointerMove, handleDragScroll)}\n onPointerUp={composeEventHandlers(props.onPointerUp, (event) => {\n const element = event.target as HTMLElement;\n if (element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n document.body.style.webkitUserSelect = prevWebkitUserSelectRef.current;\n if (context.viewport) context.viewport.style.scrollBehavior = '';\n rectRef.current = null;\n })}\n />\n </ScrollbarProvider>\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * ScrollAreaThumb\n * -----------------------------------------------------------------------------------------------*/\n\nconst THUMB_NAME = 'ScrollAreaThumb';\n\ntype ScrollAreaThumbElement = ScrollAreaThumbImplElement;\ninterface ScrollAreaThumbProps extends ScrollAreaThumbImplProps {\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with React animation libraries.\n */\n forceMount?: true;\n}\n\nconst ScrollAreaThumb = React.forwardRef<ScrollAreaThumbElement, ScrollAreaThumbProps>(\n (props: ScopedProps<ScrollAreaThumbProps>, forwardedRef) => {\n const { forceMount, ...thumbProps } = props;\n const scrollbarContext = useScrollbarContext(THUMB_NAME, props.__scopeScrollArea);\n return (\n <Presence present={forceMount || scrollbarContext.hasThumb}>\n <ScrollAreaThumbImpl ref={forwardedRef} {...thumbProps} />\n </Presence>\n );\n }\n);\n\ntype ScrollAreaThumbImplElement = React.ComponentRef<typeof Primitive.div>;\ninterface ScrollAreaThumbImplProps extends PrimitiveDivProps {}\n\nconst ScrollAreaThumbImpl = React.forwardRef<ScrollAreaThumbImplElement, ScrollAreaThumbImplProps>(\n (props: ScopedProps<ScrollAreaThumbImplProps>, forwardedRef) => {\n const { __scopeScrollArea, style, ...thumbProps } = props;\n const scrollAreaContext = useScrollAreaContext(THUMB_NAME, __scopeScrollArea);\n const scrollbarContext = useScrollbarContext(THUMB_NAME, __scopeScrollArea);\n const { onThumbPositionChange } = scrollbarContext;\n const composedRef = useComposedRefs(forwardedRef, (node) =>\n scrollbarContext.onThumbChange(node)\n );\n const removeUnlinkedScrollListenerRef = React.useRef<() => void>(undefined);\n const debounceScrollEnd = useDebounceCallback(() => {\n if (removeUnlinkedScrollListenerRef.current) {\n removeUnlinkedScrollListenerRef.current();\n removeUnlinkedScrollListenerRef.current = undefined;\n }\n }, 100);\n\n React.useEffect(() => {\n const viewport = scrollAreaContext.viewport;\n if (viewport) {\n /**\n * We only bind to native scroll event so we know when scroll starts and ends.\n * When scroll starts we start a requestAnimationFrame loop that checks for\n * changes to scroll position. That rAF loop triggers our thumb position change\n * when relevant to avoid scroll-linked effects. We cancel the loop when scroll ends.\n * https://developer.mozilla.org/en-US/docs/Mozilla/Performance/Scroll-linked_effects\n */\n const handleScroll = () => {\n debounceScrollEnd();\n if (!removeUnlinkedScrollListenerRef.current) {\n const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange);\n removeUnlinkedScrollListenerRef.current = listener;\n onThumbPositionChange();\n }\n };\n onThumbPositionChange();\n viewport.addEventListener('scroll', handleScroll);\n return () => viewport.removeEventListener('scroll', handleScroll);\n }\n }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]);\n\n return (\n <Primitive.div\n data-state={scrollbarContext.hasThumb ? 'visible' : 'hidden'}\n {...thumbProps}\n ref={composedRef}\n style={{\n width: 'var(--radix-scroll-area-thumb-width)',\n height: 'var(--radix-scroll-area-thumb-height)',\n ...style,\n }}\n onPointerDownCapture={composeEventHandlers(props.onPointerDownCapture, (event) => {\n const thumb = event.target as HTMLElement;\n const thumbRect = thumb.getBoundingClientRect();\n const x = event.clientX - thumbRect.left;\n const y = event.clientY - thumbRect.top;\n scrollbarContext.onThumbPointerDown({ x, y });\n })}\n onPointerUp={composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)}\n />\n );\n }\n);\n\nScrollAreaThumb.displayName = THUMB_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * ScrollAreaCorner\n * -----------------------------------------------------------------------------------------------*/\n\nconst CORNER_NAME = 'ScrollAreaCorner';\n\ntype ScrollAreaCornerElement = ScrollAreaCornerImplElement;\ninterface ScrollAreaCornerProps extends ScrollAreaCornerImplProps {}\n\nconst ScrollAreaCorner = React.forwardRef<ScrollAreaCornerElement, ScrollAreaCornerProps>(\n (props: ScopedProps<ScrollAreaCornerProps>, forwardedRef) => {\n const context = useScrollAreaContext(CORNER_NAME, props.__scopeScrollArea);\n const hasBothScrollbarsVisible = Boolean(context.scrollbarX && context.scrollbarY);\n const hasCorner = context.type !== 'scroll' && hasBothScrollbarsVisible;\n return hasCorner ? <ScrollAreaCornerImpl {...props} ref={forwardedRef} /> : null;\n }\n);\n\nScrollAreaCorner.displayName = CORNER_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\ntype ScrollAreaCornerImplElement = React.ComponentRef<typeof Primitive.div>;\ninterface ScrollAreaCornerImplProps extends PrimitiveDivProps {}\n\nconst ScrollAreaCornerImpl = React.forwardRef<\n ScrollAreaCornerImplElement,\n ScrollAreaCornerImplProps\n>((props: ScopedProps<ScrollAreaCornerImplProps>, forwardedRef) => {\n const { __scopeScrollArea, ...cornerProps } = props;\n const context = useScrollAreaContext(CORNER_NAME, __scopeScrollArea);\n const [width, setWidth] = React.useState(0);\n const [height, setHeight] = React.useState(0);\n const hasSize = Boolean(width && height);\n\n useResizeObserver(context.scrollbarX, () => {\n const height = context.scrollbarX?.offsetHeight || 0;\n context.onCornerHeightChange(height);\n setHeight(height);\n });\n\n useResizeObserver(context.scrollbarY, () => {\n const width = context.scrollbarY?.offsetWidth || 0;\n context.onCornerWidthChange(width);\n setWidth(width);\n });\n\n return hasSize ? (\n <Primitive.div\n {...cornerProps}\n ref={forwardedRef}\n style={{\n width,\n height,\n position: 'absolute',\n right: context.dir === 'ltr' ? 0 : undefined,\n left: context.dir === 'rtl' ? 0 : undefined,\n bottom: 0,\n ...props.style,\n }}\n />\n ) : null;\n});\n\n/* -----------------------------------------------------------------------------------------------*/\n\nfunction toInt(value?: string) {\n return value ? parseInt(value, 10) : 0;\n}\n\nfunction getThumbRatio(viewportSize: number, contentSize: number) {\n const ratio = viewportSize / contentSize;\n return isNaN(ratio) ? 0 : ratio;\n}\n\nfunction getThumbSize(sizes: Sizes) {\n const ratio = getThumbRatio(sizes.viewport, sizes.content);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio;\n // minimum of 18 matches macOS minimum\n return Math.max(thumbSize, 18);\n}\n\nfunction getScrollPositionFromPointer(\n pointerPos: number,\n pointerOffset: number,\n sizes: Sizes,\n dir: Direction = 'ltr'\n) {\n const thumbSizePx = getThumbSize(sizes);\n const thumbCenter = thumbSizePx / 2;\n const offset = pointerOffset || thumbCenter;\n const thumbOffsetFromEnd = thumbSizePx - offset;\n const minPointerPos = sizes.scrollbar.paddingStart + offset;\n const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;\n const maxScrollPos = sizes.content - sizes.viewport;\n const scrollRange = dir === 'ltr' ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const interpolate = linearScale([minPointerPos, maxPointerPos], scrollRange as [number, number]);\n return interpolate(pointerPos);\n}\n\nfunction getThumbOffsetFromScroll(scrollPos: number, sizes: Sizes, dir: Direction = 'ltr') {\n const thumbSizePx = getThumbSize(sizes);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const scrollbar = sizes.scrollbar.size - scrollbarPadding;\n const maxScrollPos = sizes.content - sizes.viewport;\n const maxThumbPos = scrollbar - thumbSizePx;\n const scrollClampRange = dir === 'ltr' ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const scrollWithoutMomentum = clamp(scrollPos, scrollClampRange as [number, number]);\n const interpolate = linearScale([0, maxScrollPos], [0, maxThumbPos]);\n return interpolate(scrollWithoutMomentum);\n}\n\n// https://github.com/tmcw-up-for-adoption/simple-linear-scale/blob/master/index.js\nfunction linearScale(input: readonly [number, number], output: readonly [number, number]) {\n return (value: number) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\n\nfunction isScrollingWithinScrollbarBounds(scrollPos: number, maxScrollPos: number) {\n return scrollPos > 0 && scrollPos < maxScrollPos;\n}\n\n// Custom scroll handler to avoid scroll-linked effects\n// https://developer.mozilla.org/en-US/docs/Mozilla/Performance/Scroll-linked_effects\nconst addUnlinkedScrollListener = (node: HTMLElement, handler = () => {}) => {\n let prevPosition = { left: node.scrollLeft, top: node.scrollTop };\n let rAF = 0;\n (function loop() {\n const position = { left: node.scrollLeft, top: node.scrollTop };\n const isHorizontalScroll = prevPosition.left !== position.left;\n const isVerticalScroll = prevPosition.top !== position.top;\n if (isHorizontalScroll || isVerticalScroll) handler();\n prevPosition = position;\n rAF = window.requestAnimationFrame(loop);\n })();\n return () => window.cancelAnimationFrame(rAF);\n};\n\nfunction useDebounceCallback(callback: () => void, delay: number) {\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = React.useRef(0);\n React.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), []);\n return React.useCallback(() => {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = window.setTimeout(handleCallback, delay);\n }, [handleCallback, delay]);\n}\n\nfunction useResizeObserver(element: HTMLElement | null, onResize: () => void) {\n const handleResize = useCallbackRef(onResize);\n useLayoutEffect(() => {\n let rAF = 0;\n if (element) {\n /**\n * Resize Observer will throw an often benign error that says `ResizeObserver loop\n * completed with undelivered notifications`. This means that ResizeObserver was not\n * able to deliver all observations within a single animation frame, so we use\n * `requestAnimationFrame` to ensure we don't deliver unnecessary observations.\n * Further reading: https://github.com/WICG/resize-observer/issues/38\n */\n const resizeObserver = new ResizeObserver(() => {\n cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(handleResize);\n });\n resizeObserver.observe(element);\n return () => {\n window.cancelAnimationFrame(rAF);\n resizeObserver.unobserve(element);\n };\n }\n }, [element, handleResize]);\n}\n\n/* -----------------------------------------------------------------------------------------------*/\n\nconst Root = ScrollArea;\nconst Viewport = ScrollAreaViewport;\nconst Scrollbar = ScrollAreaScrollbar;\nconst Thumb = ScrollAreaThumb;\nconst Corner = ScrollAreaCorner;\n\nexport {\n createScrollAreaScope,\n //\n ScrollArea,\n ScrollAreaViewport,\n ScrollAreaScrollbar,\n ScrollAreaThumb,\n ScrollAreaCorner,\n //\n Root,\n Viewport,\n Scrollbar,\n Thumb,\n Corner,\n};\nexport type {\n ScrollAreaProps,\n ScrollAreaViewportProps,\n ScrollAreaScrollbarProps,\n ScrollAreaThumbProps,\n ScrollAreaCornerProps,\n};\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8', key: '5wwlr5' }],\n [\n 'path',\n {\n d: 'M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z',\n key: 'r6nss1',\n },\n ],\n];\n\n/**\n * @component @name House\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/house\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst House = createLucideIcon('house', __iconNode);\n\nexport default House;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z',\n key: 'uqj9uw',\n },\n ],\n ['path', { d: 'M16 9a5 5 0 0 1 0 6', key: '1q6k2b' }],\n ['path', { d: 'M19.364 18.364a9 9 0 0 0 0-12.728', key: 'ijwkga' }],\n];\n\n/**\n * @component @name Volume2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/volume-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Volume2 = createLucideIcon('volume-2', __iconNode);\n\nexport default Volume2;\n","import * as React from 'react';\n\ntype Machine<S> = { [k: string]: { [k: string]: S } };\ntype MachineState<T> = keyof T;\ntype MachineEvent<T> = keyof UnionToIntersection<T[keyof T]>;\n\n// 🤯 https://fettblog.eu/typescript-union-to-intersection/\ntype UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any\n ? R\n : never;\n\nexport function useStateMachine<M>(\n initialState: MachineState<M>,\n machine: M & Machine<MachineState<M>>\n) {\n return React.useReducer((state: MachineState<M>, event: MachineEvent<M>): MachineState<M> => {\n const nextState = (machine[state] as any)[event];\n return nextState ?? state;\n }, initialState);\n}\n","'use client';\n\nimport { Toaster as Sonner } from 'sonner';\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>;\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n return (\n <Sonner\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n 'group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg',\n description: 'group-[.toast]:text-muted-foreground',\n actionButton: 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground',\n cancelButton: 'group-[.toast]:bg-muted group-[.toast]:text-muted-foreground',\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n"],"names":[],"mappings":"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","ignoreList":[1,3,8,9,10,11,12]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx","../../../../../../../src/presentation/web/hooks/use-notifications.ts","../../../../../../../src/presentation/web/components/ui/sheet.tsx","../../../../../../../src/presentation/web/components/ui/sidebar.tsx","../../../../../../../node_modules/.pnpm/%40radix-ui%2Bnumber%401.1.1/node_modules/%40radix-ui/number/dist/index.mjs","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-scroll-area%401.2.10_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types_ba0b3d60c668755d5c2d6349c8477ebb/node_modules/%40radix-ui/react-scroll-area/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/scroll-area.tsx","../../../../../../../src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.tsx","../../../../../../../src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx","../../../../../../../src/presentation/web/components/common/elapsed-time/elapsed-time.tsx","../../../../../../../src/presentation/web/components/common/feature-status-config.ts","../../../../../../../src/presentation/web/components/common/feature-list-item/feature-list-item.tsx","../../../../../../../src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.tsx","../../../../../../../src/presentation/web/hooks/use-deferred-mount.ts","../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx","../../../../../../../src/presentation/web/hooks/useTheme.ts","../../../../../../../src/presentation/web/components/common/theme-toggle/theme-toggle.tsx","../../../../../../../src/presentation/web/components/common/sound-toggle/sound-toggle.tsx","../../../../../../../src/presentation/web/components/ui/skeleton.tsx","../../../../../../../src/presentation/web/hooks/use-mobile.ts","../../../../../../../src/presentation/web/components/common/shep-logo/shep-logo.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/sun.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/volume-off.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/house.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/grip-horizontal.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/panel-left.ts","../../../../../../../src/presentation/web/types/theme.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/moon.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/folder.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/volume-2.ts","../../../../../../../src/presentation/web/components/common/feature-status-group/feature-status-group.tsx","../../../../../../../src/presentation/web/components/ui/sonner.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, type ReactNode } from 'react';\nimport { SidebarProvider, SidebarInset } from '@/components/ui/sidebar';\nimport { AppSidebar } from '@/components/layouts/app-sidebar';\nimport { AddRepositoryButton } from '@/components/common/add-repository-node';\nimport { ThemeToggle } from '@/components/common/theme-toggle';\nimport { SoundToggle } from '@/components/common/sound-toggle';\nimport { AgentEventsProvider } from '@/hooks/agent-events-provider';\nimport { useNotifications } from '@/hooks/use-notifications';\n\ninterface AppShellProps {\n children: ReactNode;\n}\n\n/** Inner shell that consumes the agent-events context for notifications. */\nfunction AppShellInner({ children }: AppShellProps) {\n // Subscribe to agent lifecycle events and dispatch toast/browser notifications\n useNotifications();\n\n const handleNewFeature = useCallback(() => {\n window.dispatchEvent(new CustomEvent('shep:open-create-drawer'));\n }, []);\n\n const handleRepositorySelect = useCallback((path: string) => {\n window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));\n }, []);\n\n return (\n <SidebarProvider>\n <AppSidebar features={[]} onNewFeature={handleNewFeature} />\n <SidebarInset>\n <div className=\"relative h-full\">\n <div className=\"absolute top-3 right-3 z-50 flex gap-1\">\n <AddRepositoryButton onSelect={handleRepositorySelect} />\n <SoundToggle />\n <ThemeToggle />\n </div>\n <main className=\"h-full\">{children}</main>\n </div>\n </SidebarInset>\n </SidebarProvider>\n );\n}\n\nexport function AppShell({ children }: AppShellProps) {\n return (\n <AgentEventsProvider>\n <AppShellInner>{children}</AppShellInner>\n </AgentEventsProvider>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { toast } from 'sonner';\nimport type { NotificationEvent } from '@shepai/core/domain/generated/output';\nimport { NotificationEventType, NotificationSeverity } from '@shepai/core/domain/generated/output';\nimport { useAgentEventsContext } from './agent-events-provider';\nimport { useSoundAction } from './use-sound-action';\nimport type { SoundAction } from './use-sound-action';\n\nexport interface UseNotificationsResult {\n requestBrowserPermission: () => Promise<void>;\n browserPermissionState: NotificationPermission;\n}\n\nconst SEVERITY_TO_TOAST: Record<NotificationSeverity, 'success' | 'error' | 'warning' | 'info'> = {\n [NotificationSeverity.Success]: 'success',\n [NotificationSeverity.Error]: 'error',\n [NotificationSeverity.Warning]: 'warning',\n [NotificationSeverity.Info]: 'info',\n};\n\nfunction dispatchToast(event: NotificationEvent): void {\n const method = SEVERITY_TO_TOAST[event.severity] ?? 'info';\n const isActionable = event.eventType === NotificationEventType.WaitingApproval;\n toast[method](event.featureName, {\n description: event.message,\n ...(isActionable && {\n action: {\n label: 'Review',\n onClick: () => {\n window.dispatchEvent(\n new CustomEvent('shep:select-feature', { detail: { featureId: event.featureId } })\n );\n },\n },\n }),\n });\n}\n\nfunction dispatchBrowserNotification(event: NotificationEvent): void {\n if (globalThis.Notification?.permission !== 'granted') {\n return;\n }\n new Notification(`Shep: ${event.featureName}`, {\n body: event.message,\n icon: '/favicon-light.svg',\n });\n}\n\nconst SEVERITY_TO_ACTION: Record<NotificationSeverity, SoundAction> = {\n [NotificationSeverity.Success]: 'notification-success',\n [NotificationSeverity.Error]: 'notification-error',\n [NotificationSeverity.Warning]: 'notification-warning',\n [NotificationSeverity.Info]: 'notification-info',\n};\n\nexport function useNotifications(): UseNotificationsResult {\n const { events } = useAgentEventsContext();\n\n const successSound = useSoundAction('notification-success');\n const errorSound = useSoundAction('notification-error');\n const warningSound = useSoundAction('notification-warning');\n const infoSound = useSoundAction('notification-info');\n\n const soundsByAction = useMemo<Record<string, { play: () => void }>>(\n () => ({\n 'notification-success': successSound,\n 'notification-error': errorSound,\n 'notification-warning': warningSound,\n 'notification-info': infoSound,\n }),\n [successSound, errorSound, warningSound, infoSound]\n );\n\n const [browserPermissionState, setBrowserPermissionState] = useState<NotificationPermission>(\n () => {\n if (typeof globalThis.Notification === 'undefined') return 'default';\n return globalThis.Notification.permission;\n }\n );\n\n // Track how many events from the array we've already processed.\n // Using the array index (instead of lastEvent) prevents React batching\n // from silently dropping events when multiple SSE messages arrive together.\n const processedCountRef = useRef(0);\n\n useEffect(() => {\n if (events.length <= processedCountRef.current) return;\n\n const newEvents = events.slice(processedCountRef.current);\n processedCountRef.current = events.length;\n\n for (const event of newEvents) {\n // Only notify for actionable events and completion celebrations\n if (\n event.severity !== NotificationSeverity.Error &&\n event.severity !== NotificationSeverity.Warning &&\n event.severity !== NotificationSeverity.Success\n ) {\n continue;\n }\n\n dispatchToast(event);\n dispatchBrowserNotification(event);\n\n const actionName = SEVERITY_TO_ACTION[event.severity];\n soundsByAction[actionName]?.play();\n }\n }, [events, soundsByAction]);\n\n const requestBrowserPermission = useCallback(async () => {\n if (typeof globalThis.Notification === 'undefined') return;\n const result = await globalThis.Notification.requestPermission();\n setBrowserPermissionState(result);\n }, []);\n\n return {\n requestBrowserPermission,\n browserPermissionState,\n };\n}\n","'use client';\n\nimport * as React from 'react';\nimport { XIcon } from 'lucide-react';\nimport { Dialog as SheetPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left';\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500',\n side === 'right' &&\n 'data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',\n side === 'left' &&\n 'data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',\n side === 'top' &&\n 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b',\n side === 'bottom' &&\n 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t',\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n ) : null}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn('flex flex-col gap-1.5 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn('mt-auto flex flex-col gap-2 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('text-foreground font-semibold', className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\nimport { Slot } from 'radix-ui';\n\nimport { useIsMobile } from '@/hooks/use-mobile';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Separator } from '@/components/ui/separator';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ninterface SidebarContextProps {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open]\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)'\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'bg-background relative flex w-full flex-1 flex-col',\n 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn('bg-background h-8 w-full shadow-none', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn('bg-sidebar-border mx-2 w-auto', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn('w-full text-sm', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn('flex w-full min-w-0 flex-col gap-1', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : 'button';\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== 'collapsed' || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon ? (\n <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />\n ) : null}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn('group/menu-sub-item relative', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","// packages/core/number/src/number.ts\nfunction clamp(value, [min, max]) {\n return Math.min(max, Math.max(min, value));\n}\nexport {\n clamp\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/scroll-area.tsx\nimport * as React2 from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { clamp } from \"@radix-ui/number\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// src/use-state-machine.ts\nimport * as React from \"react\";\nfunction useStateMachine(initialState, machine) {\n return React.useReducer((state, event) => {\n const nextState = machine[state][event];\n return nextState ?? state;\n }, initialState);\n}\n\n// src/scroll-area.tsx\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar SCROLL_AREA_NAME = \"ScrollArea\";\nvar [createScrollAreaContext, createScrollAreaScope] = createContextScope(SCROLL_AREA_NAME);\nvar [ScrollAreaProvider, useScrollAreaContext] = createScrollAreaContext(SCROLL_AREA_NAME);\nvar ScrollArea = React2.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeScrollArea,\n type = \"hover\",\n dir,\n scrollHideDelay = 600,\n ...scrollAreaProps\n } = props;\n const [scrollArea, setScrollArea] = React2.useState(null);\n const [viewport, setViewport] = React2.useState(null);\n const [content, setContent] = React2.useState(null);\n const [scrollbarX, setScrollbarX] = React2.useState(null);\n const [scrollbarY, setScrollbarY] = React2.useState(null);\n const [cornerWidth, setCornerWidth] = React2.useState(0);\n const [cornerHeight, setCornerHeight] = React2.useState(0);\n const [scrollbarXEnabled, setScrollbarXEnabled] = React2.useState(false);\n const [scrollbarYEnabled, setScrollbarYEnabled] = React2.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setScrollArea(node));\n const direction = useDirection(dir);\n return /* @__PURE__ */ jsx(\n ScrollAreaProvider,\n {\n scope: __scopeScrollArea,\n type,\n dir: direction,\n scrollHideDelay,\n scrollArea,\n viewport,\n onViewportChange: setViewport,\n content,\n onContentChange: setContent,\n scrollbarX,\n onScrollbarXChange: setScrollbarX,\n scrollbarXEnabled,\n onScrollbarXEnabledChange: setScrollbarXEnabled,\n scrollbarY,\n onScrollbarYChange: setScrollbarY,\n scrollbarYEnabled,\n onScrollbarYEnabledChange: setScrollbarYEnabled,\n onCornerWidthChange: setCornerWidth,\n onCornerHeightChange: setCornerHeight,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n ...scrollAreaProps,\n ref: composedRefs,\n style: {\n position: \"relative\",\n // Pass corner sizes as CSS vars to reduce re-renders of context consumers\n [\"--radix-scroll-area-corner-width\"]: cornerWidth + \"px\",\n [\"--radix-scroll-area-corner-height\"]: cornerHeight + \"px\",\n ...props.style\n }\n }\n )\n }\n );\n }\n);\nScrollArea.displayName = SCROLL_AREA_NAME;\nvar VIEWPORT_NAME = \"ScrollAreaViewport\";\nvar ScrollAreaViewport = React2.forwardRef(\n (props, forwardedRef) => {\n const { __scopeScrollArea, children, nonce, ...viewportProps } = props;\n const context = useScrollAreaContext(VIEWPORT_NAME, __scopeScrollArea);\n const ref = React2.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onViewportChange);\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n \"style\",\n {\n dangerouslySetInnerHTML: {\n __html: `[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}`\n },\n nonce\n }\n ),\n /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-radix-scroll-area-viewport\": \"\",\n ...viewportProps,\n ref: composedRefs,\n style: {\n /**\n * We don't support `visible` because the intention is to have at least one scrollbar\n * if this component is used and `visible` will behave like `auto` in that case\n * https://developer.mozilla.org/en-US/docs/Web/CSS/overflow#description\n *\n * We don't handle `auto` because the intention is for the native implementation\n * to be hidden if using this component. We just want to ensure the node is scrollable\n * so could have used either `scroll` or `auto` here. We picked `scroll` to prevent\n * the browser from having to work out whether to render native scrollbars or not,\n * we tell it to with the intention of hiding them in CSS.\n */\n overflowX: context.scrollbarXEnabled ? \"scroll\" : \"hidden\",\n overflowY: context.scrollbarYEnabled ? \"scroll\" : \"hidden\",\n ...props.style\n },\n children: /* @__PURE__ */ jsx(\"div\", { ref: context.onContentChange, style: { minWidth: \"100%\", display: \"table\" }, children })\n }\n )\n ] });\n }\n);\nScrollAreaViewport.displayName = VIEWPORT_NAME;\nvar SCROLLBAR_NAME = \"ScrollAreaScrollbar\";\nvar ScrollAreaScrollbar = React2.forwardRef(\n (props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { onScrollbarXEnabledChange, onScrollbarYEnabledChange } = context;\n const isHorizontal = props.orientation === \"horizontal\";\n React2.useEffect(() => {\n isHorizontal ? onScrollbarXEnabledChange(true) : onScrollbarYEnabledChange(true);\n return () => {\n isHorizontal ? onScrollbarXEnabledChange(false) : onScrollbarYEnabledChange(false);\n };\n }, [isHorizontal, onScrollbarXEnabledChange, onScrollbarYEnabledChange]);\n return context.type === \"hover\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarHover, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"scroll\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarScroll, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"auto\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarAuto, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"always\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarVisible, { ...scrollbarProps, ref: forwardedRef }) : null;\n }\n);\nScrollAreaScrollbar.displayName = SCROLLBAR_NAME;\nvar ScrollAreaScrollbarHover = React2.forwardRef((props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [visible, setVisible] = React2.useState(false);\n React2.useEffect(() => {\n const scrollArea = context.scrollArea;\n let hideTimer = 0;\n if (scrollArea) {\n const handlePointerEnter = () => {\n window.clearTimeout(hideTimer);\n setVisible(true);\n };\n const handlePointerLeave = () => {\n hideTimer = window.setTimeout(() => setVisible(false), context.scrollHideDelay);\n };\n scrollArea.addEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.addEventListener(\"pointerleave\", handlePointerLeave);\n return () => {\n window.clearTimeout(hideTimer);\n scrollArea.removeEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.removeEventListener(\"pointerleave\", handlePointerLeave);\n };\n }\n }, [context.scrollArea, context.scrollHideDelay]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarAuto,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n});\nvar ScrollAreaScrollbarScroll = React2.forwardRef((props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const isHorizontal = props.orientation === \"horizontal\";\n const debounceScrollEnd = useDebounceCallback(() => send(\"SCROLL_END\"), 100);\n const [state, send] = useStateMachine(\"hidden\", {\n hidden: {\n SCROLL: \"scrolling\"\n },\n scrolling: {\n SCROLL_END: \"idle\",\n POINTER_ENTER: \"interacting\"\n },\n interacting: {\n SCROLL: \"interacting\",\n POINTER_LEAVE: \"idle\"\n },\n idle: {\n HIDE: \"hidden\",\n SCROLL: \"scrolling\",\n POINTER_ENTER: \"interacting\"\n }\n });\n React2.useEffect(() => {\n if (state === \"idle\") {\n const hideTimer = window.setTimeout(() => send(\"HIDE\"), context.scrollHideDelay);\n return () => window.clearTimeout(hideTimer);\n }\n }, [state, context.scrollHideDelay, send]);\n React2.useEffect(() => {\n const viewport = context.viewport;\n const scrollDirection = isHorizontal ? \"scrollLeft\" : \"scrollTop\";\n if (viewport) {\n let prevScrollPos = viewport[scrollDirection];\n const handleScroll = () => {\n const scrollPos = viewport[scrollDirection];\n const hasScrollInDirectionChanged = prevScrollPos !== scrollPos;\n if (hasScrollInDirectionChanged) {\n send(\"SCROLL\");\n debounceScrollEnd();\n }\n prevScrollPos = scrollPos;\n };\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [context.viewport, isHorizontal, send, debounceScrollEnd]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || state !== \"hidden\", children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": state === \"hidden\" ? \"hidden\" : \"visible\",\n ...scrollbarProps,\n ref: forwardedRef,\n onPointerEnter: composeEventHandlers(props.onPointerEnter, () => send(\"POINTER_ENTER\")),\n onPointerLeave: composeEventHandlers(props.onPointerLeave, () => send(\"POINTER_LEAVE\"))\n }\n ) });\n});\nvar ScrollAreaScrollbarAuto = React2.forwardRef((props, forwardedRef) => {\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { forceMount, ...scrollbarProps } = props;\n const [visible, setVisible] = React2.useState(false);\n const isHorizontal = props.orientation === \"horizontal\";\n const handleResize = useDebounceCallback(() => {\n if (context.viewport) {\n const isOverflowX = context.viewport.offsetWidth < context.viewport.scrollWidth;\n const isOverflowY = context.viewport.offsetHeight < context.viewport.scrollHeight;\n setVisible(isHorizontal ? isOverflowX : isOverflowY);\n }\n }, 10);\n useResizeObserver(context.viewport, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n});\nvar ScrollAreaScrollbarVisible = React2.forwardRef((props, forwardedRef) => {\n const { orientation = \"vertical\", ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const thumbRef = React2.useRef(null);\n const pointerOffsetRef = React2.useRef(0);\n const [sizes, setSizes] = React2.useState({\n content: 0,\n viewport: 0,\n scrollbar: { size: 0, paddingStart: 0, paddingEnd: 0 }\n });\n const thumbRatio = getThumbRatio(sizes.viewport, sizes.content);\n const commonProps = {\n ...scrollbarProps,\n sizes,\n onSizesChange: setSizes,\n hasThumb: Boolean(thumbRatio > 0 && thumbRatio < 1),\n onThumbChange: (thumb) => thumbRef.current = thumb,\n onThumbPointerUp: () => pointerOffsetRef.current = 0,\n onThumbPointerDown: (pointerPos) => pointerOffsetRef.current = pointerPos\n };\n function getScrollPosition(pointerPos, dir) {\n return getScrollPositionFromPointer(pointerPos, pointerOffsetRef.current, sizes, dir);\n }\n if (orientation === \"horizontal\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarX,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollLeft;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes, context.dir);\n thumbRef.current.style.transform = `translate3d(${offset}px, 0, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollLeft = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) {\n context.viewport.scrollLeft = getScrollPosition(pointerPos, context.dir);\n }\n }\n }\n );\n }\n if (orientation === \"vertical\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarY,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollTop;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes);\n thumbRef.current.style.transform = `translate3d(0, ${offset}px, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollTop = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) context.viewport.scrollTop = getScrollPosition(pointerPos);\n }\n }\n );\n }\n return null;\n});\nvar ScrollAreaScrollbarX = React2.forwardRef((props, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarXChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"horizontal\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n bottom: 0,\n left: context.dir === \"rtl\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n right: context.dir === \"ltr\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n [\"--radix-scroll-area-thumb-width\"]: getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.x),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.x),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollLeft + event.deltaX;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollWidth,\n viewport: context.viewport.offsetWidth,\n scrollbar: {\n size: ref.current.clientWidth,\n paddingStart: toInt(computedStyle.paddingLeft),\n paddingEnd: toInt(computedStyle.paddingRight)\n }\n });\n }\n }\n }\n );\n});\nvar ScrollAreaScrollbarY = React2.forwardRef((props, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarYChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"vertical\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n top: 0,\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: \"var(--radix-scroll-area-corner-height)\",\n [\"--radix-scroll-area-thumb-height\"]: getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.y),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.y),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollTop + event.deltaY;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollHeight,\n viewport: context.viewport.offsetHeight,\n scrollbar: {\n size: ref.current.clientHeight,\n paddingStart: toInt(computedStyle.paddingTop),\n paddingEnd: toInt(computedStyle.paddingBottom)\n }\n });\n }\n }\n }\n );\n});\nvar [ScrollbarProvider, useScrollbarContext] = createScrollAreaContext(SCROLLBAR_NAME);\nvar ScrollAreaScrollbarImpl = React2.forwardRef((props, forwardedRef) => {\n const {\n __scopeScrollArea,\n sizes,\n hasThumb,\n onThumbChange,\n onThumbPointerUp,\n onThumbPointerDown,\n onThumbPositionChange,\n onDragScroll,\n onWheelScroll,\n onResize,\n ...scrollbarProps\n } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, __scopeScrollArea);\n const [scrollbar, setScrollbar] = React2.useState(null);\n const composeRefs = useComposedRefs(forwardedRef, (node) => setScrollbar(node));\n const rectRef = React2.useRef(null);\n const prevWebkitUserSelectRef = React2.useRef(\"\");\n const viewport = context.viewport;\n const maxScrollPos = sizes.content - sizes.viewport;\n const handleWheelScroll = useCallbackRef(onWheelScroll);\n const handleThumbPositionChange = useCallbackRef(onThumbPositionChange);\n const handleResize = useDebounceCallback(onResize, 10);\n function handleDragScroll(event) {\n if (rectRef.current) {\n const x = event.clientX - rectRef.current.left;\n const y = event.clientY - rectRef.current.top;\n onDragScroll({ x, y });\n }\n }\n React2.useEffect(() => {\n const handleWheel = (event) => {\n const element = event.target;\n const isScrollbarWheel = scrollbar?.contains(element);\n if (isScrollbarWheel) handleWheelScroll(event, maxScrollPos);\n };\n document.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => document.removeEventListener(\"wheel\", handleWheel, { passive: false });\n }, [viewport, scrollbar, maxScrollPos, handleWheelScroll]);\n React2.useEffect(handleThumbPositionChange, [sizes, handleThumbPositionChange]);\n useResizeObserver(scrollbar, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(\n ScrollbarProvider,\n {\n scope: __scopeScrollArea,\n scrollbar,\n hasThumb,\n onThumbChange: useCallbackRef(onThumbChange),\n onThumbPointerUp: useCallbackRef(onThumbPointerUp),\n onThumbPositionChange: handleThumbPositionChange,\n onThumbPointerDown: useCallbackRef(onThumbPointerDown),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...scrollbarProps,\n ref: composeRefs,\n style: { position: \"absolute\", ...scrollbarProps.style },\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n const mainPointer = 0;\n if (event.button === mainPointer) {\n const element = event.target;\n element.setPointerCapture(event.pointerId);\n rectRef.current = scrollbar.getBoundingClientRect();\n prevWebkitUserSelectRef.current = document.body.style.webkitUserSelect;\n document.body.style.webkitUserSelect = \"none\";\n if (context.viewport) context.viewport.style.scrollBehavior = \"auto\";\n handleDragScroll(event);\n }\n }),\n onPointerMove: composeEventHandlers(props.onPointerMove, handleDragScroll),\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n const element = event.target;\n if (element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n document.body.style.webkitUserSelect = prevWebkitUserSelectRef.current;\n if (context.viewport) context.viewport.style.scrollBehavior = \"\";\n rectRef.current = null;\n })\n }\n )\n }\n );\n});\nvar THUMB_NAME = \"ScrollAreaThumb\";\nvar ScrollAreaThumb = React2.forwardRef(\n (props, forwardedRef) => {\n const { forceMount, ...thumbProps } = props;\n const scrollbarContext = useScrollbarContext(THUMB_NAME, props.__scopeScrollArea);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || scrollbarContext.hasThumb, children: /* @__PURE__ */ jsx(ScrollAreaThumbImpl, { ref: forwardedRef, ...thumbProps }) });\n }\n);\nvar ScrollAreaThumbImpl = React2.forwardRef(\n (props, forwardedRef) => {\n const { __scopeScrollArea, style, ...thumbProps } = props;\n const scrollAreaContext = useScrollAreaContext(THUMB_NAME, __scopeScrollArea);\n const scrollbarContext = useScrollbarContext(THUMB_NAME, __scopeScrollArea);\n const { onThumbPositionChange } = scrollbarContext;\n const composedRef = useComposedRefs(\n forwardedRef,\n (node) => scrollbarContext.onThumbChange(node)\n );\n const removeUnlinkedScrollListenerRef = React2.useRef(void 0);\n const debounceScrollEnd = useDebounceCallback(() => {\n if (removeUnlinkedScrollListenerRef.current) {\n removeUnlinkedScrollListenerRef.current();\n removeUnlinkedScrollListenerRef.current = void 0;\n }\n }, 100);\n React2.useEffect(() => {\n const viewport = scrollAreaContext.viewport;\n if (viewport) {\n const handleScroll = () => {\n debounceScrollEnd();\n if (!removeUnlinkedScrollListenerRef.current) {\n const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange);\n removeUnlinkedScrollListenerRef.current = listener;\n onThumbPositionChange();\n }\n };\n onThumbPositionChange();\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": scrollbarContext.hasThumb ? \"visible\" : \"hidden\",\n ...thumbProps,\n ref: composedRef,\n style: {\n width: \"var(--radix-scroll-area-thumb-width)\",\n height: \"var(--radix-scroll-area-thumb-height)\",\n ...style\n },\n onPointerDownCapture: composeEventHandlers(props.onPointerDownCapture, (event) => {\n const thumb = event.target;\n const thumbRect = thumb.getBoundingClientRect();\n const x = event.clientX - thumbRect.left;\n const y = event.clientY - thumbRect.top;\n scrollbarContext.onThumbPointerDown({ x, y });\n }),\n onPointerUp: composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)\n }\n );\n }\n);\nScrollAreaThumb.displayName = THUMB_NAME;\nvar CORNER_NAME = \"ScrollAreaCorner\";\nvar ScrollAreaCorner = React2.forwardRef(\n (props, forwardedRef) => {\n const context = useScrollAreaContext(CORNER_NAME, props.__scopeScrollArea);\n const hasBothScrollbarsVisible = Boolean(context.scrollbarX && context.scrollbarY);\n const hasCorner = context.type !== \"scroll\" && hasBothScrollbarsVisible;\n return hasCorner ? /* @__PURE__ */ jsx(ScrollAreaCornerImpl, { ...props, ref: forwardedRef }) : null;\n }\n);\nScrollAreaCorner.displayName = CORNER_NAME;\nvar ScrollAreaCornerImpl = React2.forwardRef((props, forwardedRef) => {\n const { __scopeScrollArea, ...cornerProps } = props;\n const context = useScrollAreaContext(CORNER_NAME, __scopeScrollArea);\n const [width, setWidth] = React2.useState(0);\n const [height, setHeight] = React2.useState(0);\n const hasSize = Boolean(width && height);\n useResizeObserver(context.scrollbarX, () => {\n const height2 = context.scrollbarX?.offsetHeight || 0;\n context.onCornerHeightChange(height2);\n setHeight(height2);\n });\n useResizeObserver(context.scrollbarY, () => {\n const width2 = context.scrollbarY?.offsetWidth || 0;\n context.onCornerWidthChange(width2);\n setWidth(width2);\n });\n return hasSize ? /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...cornerProps,\n ref: forwardedRef,\n style: {\n width,\n height,\n position: \"absolute\",\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: 0,\n ...props.style\n }\n }\n ) : null;\n});\nfunction toInt(value) {\n return value ? parseInt(value, 10) : 0;\n}\nfunction getThumbRatio(viewportSize, contentSize) {\n const ratio = viewportSize / contentSize;\n return isNaN(ratio) ? 0 : ratio;\n}\nfunction getThumbSize(sizes) {\n const ratio = getThumbRatio(sizes.viewport, sizes.content);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio;\n return Math.max(thumbSize, 18);\n}\nfunction getScrollPositionFromPointer(pointerPos, pointerOffset, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const thumbCenter = thumbSizePx / 2;\n const offset = pointerOffset || thumbCenter;\n const thumbOffsetFromEnd = thumbSizePx - offset;\n const minPointerPos = sizes.scrollbar.paddingStart + offset;\n const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;\n const maxScrollPos = sizes.content - sizes.viewport;\n const scrollRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const interpolate = linearScale([minPointerPos, maxPointerPos], scrollRange);\n return interpolate(pointerPos);\n}\nfunction getThumbOffsetFromScroll(scrollPos, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const scrollbar = sizes.scrollbar.size - scrollbarPadding;\n const maxScrollPos = sizes.content - sizes.viewport;\n const maxThumbPos = scrollbar - thumbSizePx;\n const scrollClampRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const scrollWithoutMomentum = clamp(scrollPos, scrollClampRange);\n const interpolate = linearScale([0, maxScrollPos], [0, maxThumbPos]);\n return interpolate(scrollWithoutMomentum);\n}\nfunction linearScale(input, output) {\n return (value) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\nfunction isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos) {\n return scrollPos > 0 && scrollPos < maxScrollPos;\n}\nvar addUnlinkedScrollListener = (node, handler = () => {\n}) => {\n let prevPosition = { left: node.scrollLeft, top: node.scrollTop };\n let rAF = 0;\n (function loop() {\n const position = { left: node.scrollLeft, top: node.scrollTop };\n const isHorizontalScroll = prevPosition.left !== position.left;\n const isVerticalScroll = prevPosition.top !== position.top;\n if (isHorizontalScroll || isVerticalScroll) handler();\n prevPosition = position;\n rAF = window.requestAnimationFrame(loop);\n })();\n return () => window.cancelAnimationFrame(rAF);\n};\nfunction useDebounceCallback(callback, delay) {\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = React2.useRef(0);\n React2.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), []);\n return React2.useCallback(() => {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = window.setTimeout(handleCallback, delay);\n }, [handleCallback, delay]);\n}\nfunction useResizeObserver(element, onResize) {\n const handleResize = useCallbackRef(onResize);\n useLayoutEffect(() => {\n let rAF = 0;\n if (element) {\n const resizeObserver = new ResizeObserver(() => {\n cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(handleResize);\n });\n resizeObserver.observe(element);\n return () => {\n window.cancelAnimationFrame(rAF);\n resizeObserver.unobserve(element);\n };\n }\n }, [element, handleResize]);\n}\nvar Root = ScrollArea;\nvar Viewport = ScrollAreaViewport;\nvar Scrollbar = ScrollAreaScrollbar;\nvar Thumb = ScrollAreaThumb;\nvar Corner = ScrollAreaCorner;\nexport {\n Corner,\n Root,\n ScrollArea,\n ScrollAreaCorner,\n ScrollAreaScrollbar,\n ScrollAreaThumb,\n ScrollAreaViewport,\n Scrollbar,\n Thumb,\n Viewport,\n createScrollAreaScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as React from 'react';\nimport { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn('relative', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none p-px transition-colors select-none',\n orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent',\n orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent',\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","'use client';\n\nimport Link from 'next/link';\nimport type { Route } from 'next';\nimport type { LucideIcon } from 'lucide-react';\nimport { SidebarMenuItem, SidebarMenuButton } from '@/components/ui/sidebar';\nimport { useSoundAction } from '@/hooks/use-sound-action';\n\nexport interface SidebarNavItemProps {\n icon: LucideIcon;\n label: string;\n href: string;\n active?: boolean;\n}\n\nexport function SidebarNavItem({ icon: Icon, label, href, active = false }: SidebarNavItemProps) {\n const navigateSound = useSoundAction('navigate');\n\n return (\n <SidebarMenuItem data-testid=\"sidebar-nav-item\">\n <SidebarMenuButton asChild isActive={active} tooltip={label}>\n <Link href={href as Route} onClick={() => navigateSound.play()}>\n <Icon />\n <span>{label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n}\n","'use client';\n\nimport { PanelLeft } from 'lucide-react';\nimport { useSidebar } from '@/components/ui/sidebar';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport { useSoundAction } from '@/hooks/use-sound-action';\n\nexport interface SidebarCollapseToggleProps {\n className?: string;\n}\n\nexport function SidebarCollapseToggle({ className }: SidebarCollapseToggleProps) {\n const { toggleSidebar, open } = useSidebar();\n const expandSound = useSoundAction('expand');\n const collapseSound = useSoundAction('collapse');\n const label = open ? 'Collapse sidebar' : 'Expand sidebar';\n\n const handleClick = () => {\n // Play sound based on current state (before toggle)\n if (open) {\n collapseSound.play();\n } else {\n expandSound.play();\n }\n toggleSidebar();\n };\n\n return (\n <div className={cn('flex', className)}>\n <Button\n data-testid=\"sidebar-collapse-toggle\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 cursor-pointer group-data-[collapsible=icon]:size-8!\"\n onClick={handleClick}\n aria-label={label}\n >\n <PanelLeft className=\"size-4\" />\n </Button>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useEffect, startTransition } from 'react';\n\ninterface ElapsedTimeProps {\n startedAt: number;\n}\n\nexport function formatElapsed(elapsedMs: number): string {\n const totalSeconds = Math.floor(elapsedMs / 1000);\n\n if (totalSeconds >= 3600) {\n const hours = Math.floor(totalSeconds / 3600);\n return `${hours}h`;\n }\n\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n}\n\nexport function ElapsedTime({ startedAt }: ElapsedTimeProps) {\n const [elapsed, setElapsed] = useState(() => Date.now() - startedAt);\n\n useEffect(() => {\n const id = setInterval(() => {\n startTransition(() => setElapsed(Date.now() - startedAt));\n }, 1000);\n\n return () => clearInterval(id);\n }, [startedAt]);\n\n return (\n <span data-testid=\"elapsed-time\" className=\"tabular-nums\">\n {formatElapsed(elapsed)}\n </span>\n );\n}\n","import { CircleAlert, Loader2, CircleCheck } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type FeatureStatus = 'action-needed' | 'in-progress' | 'done';\n\nexport interface FeatureStatusConfig {\n icon: LucideIcon;\n iconClass: string;\n bgClass: string;\n label: string;\n}\n\nexport const featureStatusConfig: Record<FeatureStatus, FeatureStatusConfig> = {\n 'action-needed': {\n icon: CircleAlert,\n iconClass: 'text-amber-500',\n bgClass: 'bg-amber-500/10',\n label: 'Action Needed',\n },\n 'in-progress': {\n icon: Loader2,\n iconClass: 'text-blue-500 animate-spin',\n bgClass: 'bg-blue-500/10',\n label: 'In Progress',\n },\n done: {\n icon: CircleCheck,\n iconClass: 'text-emerald-500',\n bgClass: 'bg-emerald-500/10',\n label: 'Done',\n },\n};\n\nexport const featureStatusOrder: FeatureStatus[] = ['action-needed', 'in-progress', 'done'];\n","'use client';\n\nimport { SidebarMenuItem, SidebarMenuButton } from '@/components/ui/sidebar';\nimport { ElapsedTime } from '@/components/common/elapsed-time';\nimport { featureStatusConfig } from '@/components/common/feature-status-config';\nimport type { FeatureStatus } from '@/components/common/feature-status-config';\n\nexport interface FeatureListItemProps {\n name: string;\n status: FeatureStatus;\n startedAt?: number;\n duration?: string;\n onClick?: () => void;\n}\n\nexport function FeatureListItem({\n name,\n status,\n startedAt,\n duration,\n onClick,\n}: FeatureListItemProps) {\n const { icon: StatusIcon, iconClass } = featureStatusConfig[status];\n\n return (\n <SidebarMenuItem data-testid=\"feature-list-item\">\n <SidebarMenuButton size=\"sm\" onClick={onClick} tooltip={name} className=\"cursor-pointer\">\n <StatusIcon className={iconClass} />\n <span className=\"flex-1 truncate font-medium\">{name}</span>\n {status === 'in-progress' && startedAt != null ? (\n <span\n data-testid=\"feature-list-item-meta\"\n className=\"text-muted-foreground ml-auto text-xs tabular-nums\"\n >\n <ElapsedTime startedAt={startedAt} />\n </span>\n ) : null}\n {status === 'done' && duration ? (\n <span\n data-testid=\"feature-list-item-meta\"\n className=\"text-muted-foreground ml-auto text-xs tabular-nums\"\n >\n {duration}\n </span>\n ) : null}\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n}\n","'use client';\n\nimport { Folder, GripHorizontal } from 'lucide-react';\nimport { SidebarGroup } from '@/components/ui/sidebar';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useSidebar } from '@/components/ui/sidebar';\nimport { cn } from '@/lib/utils';\n\nexport interface SidebarSectionHeaderProps {\n label: string;\n onFolderClick?: () => void;\n onMenuClick?: () => void;\n className?: string;\n}\n\nexport function SidebarSectionHeader({\n label,\n onFolderClick,\n onMenuClick,\n className,\n}: SidebarSectionHeaderProps) {\n const { state, isMobile } = useSidebar();\n\n return (\n <SidebarGroup data-testid=\"sidebar-section-header\" className={cn('px-2 py-1', className)}>\n <div className=\"text-sidebar-foreground flex h-7 w-full shrink-0 items-center px-2 text-sm font-medium\">\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <span className=\"text-sidebar-foreground/70 flex shrink-0 items-center gap-0.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onFolderClick}\n className=\"ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground flex size-7 items-center justify-center rounded-md p-0 outline-hidden transition-colors focus-visible:ring-2 [&>svg]:size-4\"\n aria-label=\"Open features folder\"\n >\n <Folder className=\"size-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile}>\n Open features folder\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onMenuClick}\n className=\"ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground flex size-7 items-center justify-center rounded-md p-0 outline-hidden transition-colors focus-visible:ring-2 [&>svg]:size-4\"\n aria-label=\"Features options\"\n >\n <GripHorizontal className=\"size-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile}>\n Features options\n </TooltipContent>\n </Tooltip>\n </span>\n </div>\n </SidebarGroup>\n );\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\n\n/**\n * Defers mount/unmount of content to allow opacity transitions.\n * When expanding: mounts immediately, then sets visible on next frame.\n * When collapsing: hides immediately, then unmounts after `ms` delay.\n */\nexport function useDeferredMount(isCollapsed: boolean, ms: number) {\n const [mounted, setMounted] = useState(!isCollapsed);\n const [visible, setVisible] = useState(!isCollapsed);\n\n useEffect(() => {\n if (!isCollapsed) {\n setMounted(true);\n // delay visibility by one frame so the element mounts at opacity-0 first\n const raf = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(raf);\n }\n setVisible(false);\n const t = window.setTimeout(() => setMounted(false), ms);\n return () => window.clearTimeout(t);\n }, [isCollapsed, ms]);\n\n return { mounted, visible };\n}\n","'use client';\n\nimport { usePathname } from 'next/navigation';\nimport { Home, Wrench, Puzzle, Plus } from 'lucide-react';\nimport {\n Sidebar,\n SidebarHeader,\n SidebarContent,\n SidebarFooter,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n SidebarRail,\n useSidebar,\n} from '@/components/ui/sidebar';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { SidebarNavItem } from '@/components/common/sidebar-nav-item';\nimport { SidebarCollapseToggle } from '@/components/common/sidebar-collapse-toggle';\nimport { ShepLogo } from '@/components/common/shep-logo';\nimport { FeatureListItem } from '@/components/common/feature-list-item';\nimport { FeatureStatusGroup } from '@/components/common/feature-status-group';\nimport { SidebarSectionHeader } from '@/components/common/sidebar-section-header';\nimport { featureStatusConfig, featureStatusOrder } from '@/components/common/feature-status-config';\nimport type { FeatureStatus } from '@/components/common/feature-status-config';\nimport { useDeferredMount } from '@/hooks/use-deferred-mount';\nimport { featureFlags } from '@/lib/feature-flags';\n\ninterface FeatureItem {\n name: string;\n status: FeatureStatus;\n startedAt?: number;\n duration?: string;\n}\n\nexport interface AppSidebarProps {\n features: FeatureItem[];\n onNewFeature?: () => void;\n onFeatureClick?: (name: string) => void;\n onFeaturesFolderClick?: () => void;\n onFeaturesMenuClick?: () => void;\n}\n\nexport function AppSidebar({\n features,\n onNewFeature,\n onFeatureClick,\n onFeaturesFolderClick,\n onFeaturesMenuClick,\n}: AppSidebarProps) {\n const pathname = usePathname();\n const { state } = useSidebar();\n const collapsed = state === 'collapsed';\n const { mounted: showExpanded, visible: expandedVisible } = useDeferredMount(collapsed, 200);\n\n const grouped = featureStatusOrder.map((key) => {\n const { label } = featureStatusConfig[key];\n const items = features.filter((f) => f.status === key);\n return { key, label, items };\n });\n\n return (\n <Sidebar data-testid=\"app-sidebar\" collapsible=\"icon\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <div className=\"flex h-8 items-center group-data-[collapsible=icon]:justify-center\">\n {showExpanded ? (\n <div\n className={[\n 'flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2',\n 'transition-opacity duration-200 ease-out',\n expandedVisible ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n aria-hidden={!expandedVisible}\n >\n <ShepLogo className=\"shrink-0\" size={20} />\n <span className=\"truncate text-sm font-semibold tracking-tight\">Shep</span>\n </div>\n ) : null}\n <SidebarCollapseToggle className=\"shrink-0 transition-all duration-200\" />\n </div>\n </SidebarMenuItem>\n\n <SidebarNavItem icon={Home} label=\"Control Center\" href=\"/\" active={pathname === '/'} />\n <SidebarNavItem\n icon={Wrench}\n label=\"Tools\"\n href=\"/tools\"\n active={pathname === '/tools'}\n />\n {featureFlags.skills ? (\n <SidebarNavItem\n icon={Puzzle}\n label=\"Skills\"\n href=\"/skills\"\n active={pathname === '/skills'}\n />\n ) : null}\n </SidebarMenu>\n </SidebarHeader>\n\n <SidebarContent>\n {showExpanded ? (\n <div\n className={[\n 'min-w-0 overflow-hidden transition-opacity duration-200 ease-out',\n '[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',\n expandedVisible ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n >\n <SidebarSectionHeader\n label=\"Features\"\n onFolderClick={onFeaturesFolderClick}\n onMenuClick={onFeaturesMenuClick}\n />\n <ScrollArea>\n {grouped.map(({ key, label, items }) =>\n items.length > 0 ? (\n <FeatureStatusGroup key={key} label={label} count={items.length}>\n {items.map((feature) => (\n <FeatureListItem\n key={feature.name}\n name={feature.name}\n status={feature.status}\n startedAt={feature.startedAt}\n duration={feature.duration}\n onClick={onFeatureClick ? () => onFeatureClick(feature.name) : undefined}\n />\n ))}\n </FeatureStatusGroup>\n ) : null\n )}\n </ScrollArea>\n </div>\n ) : null}\n </SidebarContent>\n\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton onClick={onNewFeature} tooltip=\"New feature\">\n <Plus />\n <span>New feature</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n\n <SidebarRail />\n </Sidebar>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { type Theme, THEME_STORAGE_KEY } from '@/types/theme';\n\n/**\n * Hook to manage theme state with localStorage persistence\n * and system preference detection.\n */\nexport function useTheme() {\n const [theme, setTheme] = useState<Theme>('system');\n const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>('light');\n\n // Get the system preference\n const getSystemTheme = useCallback((): 'light' | 'dark' => {\n if (typeof window === 'undefined') {\n return 'light';\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }, []);\n\n // Resolve the actual theme based on current setting\n const resolveTheme = useCallback(\n (currentTheme: Theme): 'light' | 'dark' => {\n if (currentTheme === 'system') {\n return getSystemTheme();\n }\n return currentTheme;\n },\n [getSystemTheme]\n );\n\n // Apply theme to document\n const applyTheme = useCallback((resolved: 'light' | 'dark') => {\n if (typeof document === 'undefined') {\n return;\n }\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n root.classList.add(resolved);\n setResolvedTheme(resolved);\n }, []);\n\n // Set theme and persist to localStorage\n const setThemeAndPersist = useCallback(\n (newTheme: Theme) => {\n setTheme(newTheme);\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(THEME_STORAGE_KEY, newTheme);\n }\n const resolved = resolveTheme(newTheme);\n applyTheme(resolved);\n },\n [resolveTheme, applyTheme]\n );\n\n // Initialize theme from localStorage or system preference\n useEffect(() => {\n const stored = localStorage.getItem(THEME_STORAGE_KEY) as Theme | null;\n const initialTheme = stored ?? 'system';\n setTheme(initialTheme);\n const resolved = resolveTheme(initialTheme);\n applyTheme(resolved);\n }, [resolveTheme, applyTheme]);\n\n // Listen for system preference changes\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const handleChange = () => {\n if (theme === 'system') {\n const resolved = resolveTheme('system');\n applyTheme(resolved);\n }\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [theme, resolveTheme, applyTheme]);\n\n return {\n theme,\n resolvedTheme,\n setTheme: setThemeAndPersist,\n };\n}\n","'use client';\n\nimport { Moon, Sun } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { useTheme } from '@/hooks/useTheme';\nimport { useSoundAction } from '@/hooks/use-sound-action';\n\nexport function ThemeToggle() {\n const { theme, resolvedTheme, setTheme } = useTheme();\n const toggleOnSound = useSoundAction('toggle-on');\n const toggleOffSound = useSoundAction('toggle-off');\n\n const toggleTheme = () => {\n // Determine target theme before switching\n const currentResolved = theme === 'system' ? resolvedTheme : theme;\n const goingToDark = currentResolved !== 'dark';\n\n // Play sound before setTheme for immediate feedback\n if (goingToDark) {\n toggleOnSound.play();\n } else {\n toggleOffSound.play();\n }\n\n // If system theme, switch to explicit light/dark\n // If explicit, toggle between light and dark\n if (theme === 'system') {\n setTheme(resolvedTheme === 'dark' ? 'light' : 'dark');\n } else {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }\n };\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={toggleTheme}\n aria-label={`Switch to ${resolvedTheme === 'dark' ? 'light' : 'dark'} mode`}\n >\n <Sun className=\"h-5 w-5 scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <Moon className=\"absolute h-5 w-5 scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n );\n}\n","'use client';\n\nimport { Volume2, VolumeOff } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { useSoundEnabled } from '@/hooks/use-sound-enabled';\n\nexport function SoundToggle() {\n const { enabled, toggle } = useSoundEnabled();\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={toggle}\n aria-label={enabled ? 'Mute sounds' : 'Unmute sounds'}\n >\n {enabled ? <Volume2 className=\"h-5 w-5\" /> : <VolumeOff className=\"h-5 w-5\" />}\n <span className=\"sr-only\">Toggle sound</span>\n </Button>\n );\n}\n","import { cn } from '@/lib/utils';\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn('bg-accent animate-pulse rounded-md', className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","import { cn } from '@/lib/utils';\n\nexport interface ShepLogoProps {\n className?: string;\n size?: number;\n}\n\nexport function ShepLogo({ className, size = 24 }: ShepLogoProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 194 200\"\n width={size}\n height={size}\n className={cn('shrink-0', className)}\n aria-hidden=\"true\"\n >\n <g transform=\"matrix(1, 0, 0, 1, -111, -208)\">\n <path\n d=\"M 198 406 C196,405 194,403 193,401 C192,399 191,398 186,398 C178,397 174,394 170,387 L 168 381 L 163 381 C156,381 150,377 147,370 C144,364 143,359 146,353 C148,348 148,347 147,347 C145,347 140,343 138,339 C133,329 139,314 149,311 L 152 311 L 149 307 C145,302 145,294 149,290 C151,288 152,287 151,286 C150,283 152,278 155,276 C156,275 159,274 162,273 C165,273 166,273 168,276 C171,278 171,280 172,287 C173,294 174,297 177,304 C180,309 182,314 183,316 C186,327 193,336 199,339 C204,342 211,342 216,340 C222,336 231,324 234,314 C235,312 237,307 239,302 C240,298 242,292 242,289 C243,281 245,278 247,275 C250,273 251,273 255,273 C261,274 264,278 264,282 C264,284 264,286 263,287 C262,287 263,288 265,290 C272,295 272,303 267,309 L 265 312 L 269 314 C276,317 279,323 279,332 C279,339 277,343 272,347 C268,351 268,351 269,354 C272,358 271,366 269,371 C266,376 259,381 254,381 C252,381 251,382 248,386 C242,395 234,400 227,399 C224,398 223,398 221,401 C220,403 217,405 216,406 C211,409 203,409 198,406 ZM 136 271 C123,267 115,262 113,256 C111,251 111,251 113,251 C118,254 124,254 132,252 C136,252 141,251 144,251 C149,251 157,253 162,256 C166,258 166,258 166,264 L 166 269 L 160 270 C149,272 142,272 136,271 ZM 264 271 C263,271 259,270 256,270 L 250 270 L 250 265 C249,259 250,257 259,254 C265,251 272,251 289,252 C297,253 299,253 302,252 C305,250 305,250 305,252 C305,255 301,262 297,264 C289,270 272,273 264,271 ZM 162 249 C160,247 159,245 159,242 C159,236 164,230 169,230 C170,230 171,228 171,225 C171,216 176,210 184,209 C189,209 195,211 195,213 C195,214 196,213 197,212 C201,209 204,208 208,208 C212,208 217,210 219,212 C220,214 220,213 223,211 C226,208 234,208 239,211 C243,214 246,221 246,226 C245,230 245,230 247,230 C253,230 258,238 257,244 C256,249 251,252 245,252 C241,252 237,251 234,248 C232,247 232,247 228,249 C225,251 222,252 220,252 C216,252 212,250 210,247 C209,246 209,246 206,248 C201,252 192,253 185,248 C183,247 183,247 178,249 C172,253 166,253 162,249 ZM 116 249 C112,248 114,247 119,247 C122,247 127,246 130,245 C138,242 146,242 152,245 L 158 248 L 148 247 C142,247 138,247 133,248 C128,250 120,250 116,249 ZM 284 248 C281,247 277,247 270,247 L 260 248 L 263 246 C269,243 276,242 284,245 C289,246 295,247 298,247 C303,247 304,247 303,248 C301,250 289,250 284,248 Z\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/sun\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M16 9a5 5 0 0 1 .95 2.293', key: '1fgyg8' }],\n ['path', { d: 'M19.364 5.636a9 9 0 0 1 1.889 9.96', key: 'l3zxae' }],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n [\n 'path',\n {\n d: 'm7 7-.587.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298V11',\n key: '1gbwow',\n },\n ],\n ['path', { d: 'M9.828 4.172A.686.686 0 0 1 11 4.657v.686', key: 's2je0y' }],\n];\n\n/**\n * @component @name VolumeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/volume-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst VolumeOff = createLucideIcon('volume-off', __iconNode);\n\nexport default VolumeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8', key: '5wwlr5' }],\n [\n 'path',\n {\n d: 'M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z',\n key: 'r6nss1',\n },\n ],\n];\n\n/**\n * @component @name House\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/house\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst House = createLucideIcon('house', __iconNode);\n\nexport default House;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '9', r: '1', key: '124mty' }],\n ['circle', { cx: '19', cy: '9', r: '1', key: '1ruzo2' }],\n ['circle', { cx: '5', cy: '9', r: '1', key: '1a8b28' }],\n ['circle', { cx: '12', cy: '15', r: '1', key: '1e56xg' }],\n ['circle', { cx: '19', cy: '15', r: '1', key: '1a92ep' }],\n ['circle', { cx: '5', cy: '15', r: '1', key: '5r1jwy' }],\n];\n\n/**\n * @component @name GripHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/grip-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GripHorizontal = createLucideIcon('grip-horizontal', __iconNode);\n\nexport default GripHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M9 3v18', key: 'fh3hqa' }],\n];\n\n/**\n * @component @name PanelLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/panel-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst PanelLeft = createLucideIcon('panel-left', __iconNode);\n\nexport default PanelLeft;\n","/**\n * Theme type definitions for the Shep AI Web UI\n */\n\nexport type Theme = 'light' | 'dark' | 'system';\n\nexport interface ThemeContextValue {\n theme: Theme;\n resolvedTheme: 'light' | 'dark';\n setTheme: (theme: Theme) => void;\n}\n\nexport const THEME_STORAGE_KEY = 'shep-theme';\n\nexport const themes: Theme[] = ['light', 'dark', 'system'];\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/moon\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z',\n key: '1kt360',\n },\n ],\n];\n\n/**\n * @component @name Folder\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/folder\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Folder = createLucideIcon('folder', __iconNode);\n\nexport default Folder;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z',\n key: 'uqj9uw',\n },\n ],\n ['path', { d: 'M16 9a5 5 0 0 1 0 6', key: '1q6k2b' }],\n ['path', { d: 'M19.364 18.364a9 9 0 0 0 0-12.728', key: 'ijwkga' }],\n];\n\n/**\n * @component @name Volume2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/volume-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Volume2 = createLucideIcon('volume-2', __iconNode);\n\nexport default Volume2;\n","import type { ReactNode } from 'react';\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarGroupContent,\n SidebarMenu,\n} from '@/components/ui/sidebar';\n\nexport interface FeatureStatusGroupProps {\n label: string;\n count: number;\n children: ReactNode;\n}\n\nexport function FeatureStatusGroup({ label, count, children }: FeatureStatusGroupProps) {\n return (\n <SidebarGroup data-testid=\"feature-status-group\" className=\"px-2 py-1\">\n <SidebarGroupLabel className=\"text-muted-foreground h-6 px-2 text-[0.65rem] font-semibold tracking-wider uppercase\">\n {label}\n <span\n aria-label={`${count} items`}\n className=\"bg-sidebar-accent text-sidebar-accent-foreground ml-1.5 inline-flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[0.6rem] font-medium tabular-nums\"\n role=\"img\"\n >\n {count}\n </span>\n </SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu className=\"gap-0.5\">{children}</SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n","'use client';\n\nimport { Toaster as Sonner } from 'sonner';\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>;\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n return (\n <Sonner\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n 'group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg',\n description: 'group-[.toast]:text-muted-foreground',\n actionButton: 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground',\n cancelButton: 'group-[.toast]:bg-muted group-[.toast]:text-muted-foreground',\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n"],"names":[],"mappings":"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","ignoreList":[4,5,21,22,23,24,25,27,28,29]}
|