@shepai/cli 1.141.0 → 1.142.0-pr453.4cfded1
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/app/layout.d.ts +1 -1
- package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
- package/dist/src/presentation/web/app/layout.js +6 -13
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.js +12 -10
- 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 +8 -5
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts +2 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +3 -4
- 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 +3 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +5 -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 +25 -8
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts +3 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +4 -4
- package/dist/src/presentation/web/components/ui/sidebar.d.ts +2 -0
- package/dist/src/presentation/web/components/ui/sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/ui/sidebar.js +26 -28
- package/dist/src/presentation/web/components/ui/tooltip.d.ts +2 -0
- package/dist/src/presentation/web/components/ui/tooltip.d.ts.map +1 -1
- package/dist/src/presentation/web/components/ui/tooltip.js +3 -1
- package/dist/src/presentation/web/hooks/use-selected-repository.d.ts +13 -0
- package/dist/src/presentation/web/hooks/use-selected-repository.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-selected-repository.js +19 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +6 -5
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +5 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +6 -4
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +6 -4
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +5 -3
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/create/page.js +5 -3
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +6 -4
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +6 -4
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/page.js +5 -3
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +5 -3
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page.js +2 -2
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- 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/server-reference-manifest.json +3 -3
- package/web/.next/server/app/_not-found/page.js +5 -3
- 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/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/settings/page.js +6 -5
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/skills/page.js +8 -7
- 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/server-reference-manifest.json +8 -8
- package/web/.next/server/app/tools/page.js +5 -3
- 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/server-reference-manifest.json +3 -3
- package/web/.next/server/app/version/page.js +5 -3
- 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/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/{403f9_next_dist_compiled_dc550646._.js → 403f9_next_dist_compiled_@opentelemetry_api_index_5410770c.js} +2 -2
- package/web/.next/server/chunks/ssr/403f9_next_dist_compiled_@opentelemetry_api_index_5410770c.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__42faf5ae._.js → [root-of-the-server]__29580090._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__42faf5ae._.js.map → [root-of-the-server]__29580090._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__685ee565._.js → [root-of-the-server]__c094882b._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__685ee565._.js.map → [root-of-the-server]__c094882b._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d1040bd1._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d1040bd1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__74756aae._.js → [root-of-the-server]__dac5dbf1._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__74756aae._.js.map → [root-of-the-server]__dac5dbf1._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__efeeaed4._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__efeeaed4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__2bdf88a0._.js → [root-of-the-server]__fae8b355._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__2bdf88a0._.js.map → [root-of-the-server]__fae8b355._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
- package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
- package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_28a956b1._.js → _1ac172f4._.js} +2 -2
- package/web/.next/server/chunks/ssr/_1ac172f4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
- package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
- package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_4b432739._.js +3 -0
- package/web/.next/server/chunks/ssr/_4b432739._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
- package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6256a985._.js +21 -0
- package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
- package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6c7faa01._.js +3 -0
- package/web/.next/server/chunks/ssr/_6c7faa01._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
- package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_be6f83dc._.js +3 -0
- package/web/.next/server/chunks/ssr/{_b1979aeb._.js.map → _be6f83dc._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b3f3c105._.js +3 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_d89ef34e._.js.map → src_presentation_web_b3f3c105._.js.map} +1 -1
- 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/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- 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 +44 -44
- package/web/.next/static/chunks/{7e7537ab107a5ed5.js → 08baac5434d9528e.js} +1 -1
- package/web/.next/static/chunks/{93c4d09e761f79fb.js → 280686d2e1ff0649.js} +1 -1
- package/web/.next/static/chunks/473cac64731704c6.js +1 -0
- package/web/.next/static/chunks/66723d84a0b01634.js +1 -0
- package/web/.next/static/chunks/{6df249ae87a1eb01.js → 6bd2935bef50e8c9.js} +1 -1
- package/web/.next/static/chunks/{6fce8e3b5b8a70f0.js → 6e4420930c0fe21c.js} +1 -1
- package/web/.next/static/chunks/{4310eecfa4cbfdc3.js → 73a92c1924e105bd.js} +2 -2
- package/web/.next/static/chunks/74ee98538b63a4b2.css +1 -0
- package/web/.next/static/chunks/{afc41125785be75f.js → 770ba660d1a0d50b.js} +2 -2
- package/web/.next/static/chunks/{17d9b423d445bba0.js → a6e1538e04c9f936.js} +1 -1
- package/web/.next/static/chunks/{61bfd3a083064587.js → cc40bfb418fa8f56.js} +1 -1
- package/web/.next/static/chunks/{1c723fbadbc86104.js → cf622541a1f71988.js} +1 -1
- package/web/.next/static/chunks/{2ab4c62a9ed3203b.js → d65caa2ba3f34f84.js} +1 -1
- package/web/.next/static/chunks/{00684a50a5e10dc6.js → f2c4d78aa6703653.js} +1 -1
- package/web/.next/server/chunks/ssr/403f9_next_dist_31ea46d3._.js +0 -6
- package/web/.next/server/chunks/ssr/403f9_next_dist_31ea46d3._.js.map +0 -1
- package/web/.next/server/chunks/ssr/403f9_next_dist_compiled_dc550646._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bc1434f._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bc1434f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js +0 -21
- package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_28a956b1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a37f5f18._.js +0 -13
- package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_b1979aeb._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_d89ef34e._.js +0 -3
- package/web/.next/static/chunks/2659d28c2abd16f7.js +0 -1
- package/web/.next/static/chunks/64050cca05af6700.css +0 -1
- package/web/.next/static/chunks/6d2b3c320bb7aeaa.js +0 -1
- /package/web/.next/static/{2TgqGh19fr07pbj00i0U7 → tn6fdCmeXEgmEoL57Nt7c}/_buildManifest.js +0 -0
- /package/web/.next/static/{2TgqGh19fr07pbj00i0U7 → tn6fdCmeXEgmEoL57Nt7c}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{2TgqGh19fr07pbj00i0U7 → tn6fdCmeXEgmEoL57Nt7c}/_ssgManifest.js +0 -0
|
@@ -7,5 +7,5 @@ export declare const dynamic = "force-dynamic";
|
|
|
7
7
|
export declare const metadata: Metadata;
|
|
8
8
|
export default function RootLayout({ children, }: Readonly<{
|
|
9
9
|
children: React.ReactNode;
|
|
10
|
-
}>): import("react/jsx-runtime").JSX.Element
|
|
10
|
+
}>): Promise<import("react/jsx-runtime").JSX.Element>;
|
|
11
11
|
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2CAA2C,CAAC;AACnD,OAAO,eAAe,CAAC;AAMvB,sFAAsF;AACtF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,QAkBtB,CAAC;AAEF,wBAA8B,UAAU,CAAC,EACvC,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC,oDAsBD"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cookies } from 'next/headers';
|
|
2
3
|
import '@xyflow/react/dist/base.css';
|
|
3
4
|
import '@cubone/react-file-manager/dist/style.css';
|
|
4
5
|
import './globals.css';
|
|
@@ -26,18 +27,10 @@ export const metadata = {
|
|
|
26
27
|
},
|
|
27
28
|
],
|
|
28
29
|
};
|
|
29
|
-
export default function RootLayout({ children, }) {
|
|
30
|
+
export default async function RootLayout({ children, }) {
|
|
31
|
+
const cookieStore = await cookies();
|
|
32
|
+
const sidebarOpen = cookieStore.get('shep-sidebar-open')?.value === 'true';
|
|
30
33
|
return (_jsxs("html", { lang: "en", suppressHydrationWarning: true, children: [_jsx("head", { children: _jsx("script", { dangerouslySetInnerHTML: {
|
|
31
|
-
__html: `
|
|
32
|
-
|
|
33
|
-
try {
|
|
34
|
-
const theme = localStorage.getItem('shep-theme');
|
|
35
|
-
const systemDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
36
|
-
if (theme === 'dark' || (theme === 'system' && systemDark) || (!theme && systemDark)) {
|
|
37
|
-
document.documentElement.classList.add('dark');
|
|
38
|
-
}
|
|
39
|
-
} catch (e) {}
|
|
40
|
-
})();
|
|
41
|
-
`,
|
|
42
|
-
} }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(FeatureFlagsProvider, { flags: getFeatureFlags(), children: _jsx(AppShell, { children: children }) }), _jsx(Toaster, { position: "bottom-center" })] })] }));
|
|
34
|
+
__html: `(function(){try{var d=document.documentElement,t=localStorage.getItem('shep-theme'),s=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'&&s)||(!t&&s)){d.classList.add('dark')}}catch(e){}})();`,
|
|
35
|
+
} }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(FeatureFlagsProvider, { flags: getFeatureFlags(), children: _jsx(AppShell, { sidebarOpen: sidebarOpen, children: children }) }), _jsx(Toaster, { position: "bottom-center" })] })] }));
|
|
43
36
|
}
|
|
@@ -39,13 +39,16 @@ function LogLineRow({ line }) {
|
|
|
39
39
|
function Timestamp({ value }) {
|
|
40
40
|
if (!value)
|
|
41
41
|
return null;
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
// Show only MM:SS — compact, hours rarely change in a session
|
|
43
|
+
const full = value.replace(/^.*T/, '').replace('Z', '');
|
|
44
|
+
const parts = full.split(':');
|
|
45
|
+
const compact = parts.length >= 3 ? `${parts[1]}:${parts[2].split('.')[0]}` : full;
|
|
46
|
+
return (_jsx("span", { className: "text-muted-foreground/60 w-11 shrink-0 font-mono text-[10px]", children: compact }));
|
|
44
47
|
}
|
|
45
48
|
function PhaseBadge({ phase }) {
|
|
46
49
|
if (!phase)
|
|
47
|
-
return
|
|
48
|
-
return (_jsx("span", { className: "bg-muted text-muted-foreground shrink-0 rounded px-1.5 py-0.5 font-mono text-[10px] font-medium", children: phase }));
|
|
50
|
+
return _jsx("span", { className: "w-20 shrink-0" });
|
|
51
|
+
return (_jsx("span", { className: "bg-muted text-muted-foreground w-20 shrink-0 truncate rounded px-1.5 py-0.5 font-mono text-[10px] font-medium", title: phase, children: phase }));
|
|
49
52
|
}
|
|
50
53
|
/* ---------------------------------------------------------------------------
|
|
51
54
|
* Event-specific rows
|
|
@@ -54,7 +57,7 @@ function ToolCallRow({ line }) {
|
|
|
54
57
|
const { toolName, args } = parseToolCall(line.message);
|
|
55
58
|
// Try to extract a key detail from args for common tools
|
|
56
59
|
const detail = getToolDetail(toolName, args);
|
|
57
|
-
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 border-b border-transparent px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(ToolIcon, { toolName: toolName }), _jsx("span", { className: "text-xs font-semibold text-violet-600 dark:text-violet-400", children: toolName }), detail ? (_jsx("span", { className: "text-muted-foreground min-w-0
|
|
60
|
+
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 border-b border-transparent px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(ToolIcon, { toolName: toolName }), _jsx("span", { className: "text-xs font-semibold text-violet-600 dark:text-violet-400", children: toolName }), detail ? (_jsx("span", { className: "text-muted-foreground min-w-0 font-mono text-xs break-all", children: detail })) : null] })] }));
|
|
58
61
|
}
|
|
59
62
|
function ToolIcon({ toolName }) {
|
|
60
63
|
const lower = toolName.toLowerCase();
|
|
@@ -80,8 +83,7 @@ function getToolDetail(toolName, args) {
|
|
|
80
83
|
if (toolName === 'Grep' && parsed.pattern)
|
|
81
84
|
return parsed.pattern;
|
|
82
85
|
if (toolName === 'Bash' && parsed.command) {
|
|
83
|
-
|
|
84
|
-
return cmd.length > 80 ? `${cmd.slice(0, 80)}...` : cmd;
|
|
86
|
+
return parsed.command;
|
|
85
87
|
}
|
|
86
88
|
if (toolName === 'Task' && parsed.description)
|
|
87
89
|
return parsed.description;
|
|
@@ -89,7 +91,7 @@ function getToolDetail(toolName, args) {
|
|
|
89
91
|
catch {
|
|
90
92
|
// Not JSON — show truncated raw args
|
|
91
93
|
if (args.length > 0)
|
|
92
|
-
return args
|
|
94
|
+
return args;
|
|
93
95
|
}
|
|
94
96
|
return null;
|
|
95
97
|
}
|
|
@@ -105,10 +107,10 @@ function TokensRow({ line }) {
|
|
|
105
107
|
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(Coins, { className: "mt-0.5 h-3 w-3 shrink-0 text-amber-500" }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [_jsx("span", { className: "text-amber-600 dark:text-amber-400", children: inputTokens.toLocaleString() }), ' in / ', _jsx("span", { className: "text-amber-600 dark:text-amber-400", children: outputTokens.toLocaleString() }), ' out'] })] })] }));
|
|
106
108
|
}
|
|
107
109
|
function WorkerRow({ line }) {
|
|
108
|
-
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 bg-zinc-50 px-3 py-1.5 transition-colors dark:bg-zinc-900/50", children: [_jsx(Timestamp, { value: line.timestamp }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(Server, { className: "mt-0.5 h-3 w-3 shrink-0 text-zinc-500" }), _jsx("span", { className: "text-muted-foreground text-xs font-medium", children: line.message })] })] }));
|
|
110
|
+
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 bg-zinc-50 px-3 py-1.5 transition-colors dark:bg-zinc-900/50", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(Server, { className: "mt-0.5 h-3 w-3 shrink-0 text-zinc-500" }), _jsx("span", { className: "text-muted-foreground text-xs font-medium break-all", children: line.message })] })] }));
|
|
109
111
|
}
|
|
110
112
|
function InfoRow({ line }) {
|
|
111
|
-
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsx("span", { className: "text-muted-foreground min-w-0 text-xs", children: line.message })] }));
|
|
113
|
+
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsx("span", { className: "text-muted-foreground min-w-0 text-xs break-all", children: line.message })] }));
|
|
112
114
|
}
|
|
113
115
|
function RawRow({ line }) {
|
|
114
116
|
return (_jsx("div", { className: "px-3 py-0.5", children: _jsx("span", { className: "text-muted-foreground/70 font-mono text-[11px] break-all whitespace-pre-wrap", children: line.raw }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA6CnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAgeA"}
|
|
@@ -10,6 +10,7 @@ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
|
|
|
10
10
|
import { DeleteFeatureDialog } from '../../common/delete-feature-dialog/index.js';
|
|
11
11
|
import { featureNodeStateConfig, lifecycleRunningVerbs, lifecyclePhaseBadge, } from './feature-node-state-config.js';
|
|
12
12
|
import { getAgentTypeIcon } from './agent-type-icons.js';
|
|
13
|
+
import { FeatureSessionsDropdown } from './feature-sessions-dropdown.js';
|
|
13
14
|
import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
14
15
|
function AgentIcon({ agentType, className }) {
|
|
15
16
|
const IconComponent = getAgentTypeIcon(agentType);
|
|
@@ -77,10 +78,12 @@ export function FeatureNode({ data, selected, }) {
|
|
|
77
78
|
data.state !== 'archived' ? (_jsx(AlertDialog, { open: archiveConfirmOpen, onOpenChange: setArchiveConfirmOpen, children: _jsxs(AlertDialogContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Archive feature?" }), _jsxs(AlertDialogDescription, { children: [_jsx("strong", { children: data.name }), " will be hidden from the canvas. You can unarchive it later to restore it."] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { onClick: () => setArchiveConfirmOpen(false), children: "Cancel" }), _jsx(AlertDialogAction, { onClick: () => {
|
|
78
79
|
setArchiveConfirmOpen(false);
|
|
79
80
|
data.onArchive?.(data.featureId);
|
|
80
|
-
}, children: "Archive" })] })] }) })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm dark:bg-neutral-800/80', data.state === 'action-required' &&
|
|
81
|
+
}, children: "Archive" })] })] }) })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm transition-[border-color] duration-200 dark:bg-neutral-800/80', data.state === 'action-required' &&
|
|
81
82
|
'border-l-[3px] border-l-rose-400 dark:border-l-amber-500', data.state === 'action-required' &&
|
|
82
83
|
selected &&
|
|
83
|
-
'border-t-rose-400 border-r-rose-400 border-b-rose-400 dark:border-t-amber-500 dark:border-r-amber-500 dark:border-b-amber-500', selected &&
|
|
84
|
+
'border-t-rose-400 border-r-rose-400 border-b-rose-400 dark:border-t-amber-500 dark:border-r-amber-500 dark:border-b-amber-500', selected &&
|
|
85
|
+
data.state !== 'action-required' &&
|
|
86
|
+
'border-blue-400 dark:border-amber-500/60', data.state === 'deleting' && 'opacity-60', data.state === 'archived' && 'opacity-50'), children: [data.state !== 'creating' ? (_jsx("div", { className: "absolute top-3 right-4", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { "data-testid": "feature-node-phase-badge", className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-[10px]", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("span", { className: cn('h-1.5 w-1.5 -translate-y-px rounded-full', lifecyclePhaseBadge[data.lifecycle].dot) })] }) }), _jsxs(TooltipContent, { side: "right", className: "max-w-56", children: [_jsx("p", { className: "font-semibold", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("p", { className: "mt-1 text-xs leading-relaxed text-neutral-500", children: lifecyclePhaseBadge[data.lifecycle].description })] })] }) }) })) : null, _jsxs("div", { className: "flex items-center gap-1.5 pr-24", children: [data.agentType ? (_jsx(AgentIcon, { agentType: data.agentType, className: "h-4 w-4 shrink-0" })) : null, _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: data.name })] }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: data.description })) : null, _jsxs("div", { className: "mt-auto pt-2", children: [config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : null, !config.showProgressBar &&
|
|
84
87
|
![
|
|
85
88
|
'deleting',
|
|
86
89
|
'creating',
|
|
@@ -97,7 +100,7 @@ export function FeatureNode({ data, selected, }) {
|
|
|
97
100
|
navigator.clipboard.writeText(data.featureId);
|
|
98
101
|
setIdCopied(true);
|
|
99
102
|
setTimeout(() => setIdCopied(false), 1500);
|
|
100
|
-
}, children: [_jsx("span", { className: "text-muted-foreground/50 font-sans text-[10px]", children: "ID" }), idCopied ? (_jsx("span", { className: "text-emerald-500", children: "Copied!" })) : (data.featureId.slice(0, 6))] }) }), _jsxs(TooltipContent, { side: "
|
|
103
|
+
}, children: [_jsx("span", { className: "text-muted-foreground/50 font-sans text-[10px]", children: "ID" }), idCopied ? (_jsx("span", { className: "text-emerald-500", children: "Copied!" })) : (data.featureId.slice(0, 6))] }) }), _jsxs(TooltipContent, { side: "top", children: ["Click to copy: ", data.featureId] })] }) })) : null, data.deployment ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": data.deployment.status === DeploymentState.Booting
|
|
101
104
|
? 'Deploying'
|
|
102
105
|
: 'Open dev server', "data-testid": "feature-node-deployment-indicator", onClick: (e) => {
|
|
103
106
|
e.stopPropagation();
|
|
@@ -107,9 +110,9 @@ export function FeatureNode({ data, selected, }) {
|
|
|
107
110
|
}
|
|
108
111
|
}, className: cn('nodrag', data.deployment.status === DeploymentState.Ready && data.deployment.url
|
|
109
112
|
? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
|
|
110
|
-
: 'cursor-default'), children: data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin text-blue-500" })) : (_jsx(Globe, { className: "h-3 w-3 text-green-600" })) }) }), _jsx(TooltipContent, { side: "
|
|
113
|
+
: 'cursor-default'), children: data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin text-blue-500" })) : (_jsx(Globe, { className: "h-3 w-3 text-green-600" })) }) }), _jsx(TooltipContent, { side: "top", children: data.deployment.status === DeploymentState.Booting
|
|
111
114
|
? 'Deploying...'
|
|
112
|
-
: (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "
|
|
115
|
+
: (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "top", children: "Fast Mode" })] }) })) : null, (data.worktreePath ?? data.repositoryPath) ? (_jsx(FeatureSessionsDropdown, { repositoryPath: data.worktreePath ?? data.repositoryPath })) : null] }), data.state === 'deleting' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] })) : data.state === 'creating' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-teal-600 dark:text-teal-400" }), _jsx("span", { className: "font-medium text-teal-600 dark:text-teal-400", children: getBadgeText(data) })] })) : data.state === 'running' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-teal-600 dark:text-teal-400" }), _jsx("span", { className: "font-medium text-teal-600 dark:text-teal-400", children: getBadgeText(data) })] })) : data.state === 'action-required' ? (_jsxs(Button, { variant: "default", size: "xs", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
|
|
113
116
|
// eslint-disable-next-line @typescript-eslint/no-empty-function -- click bubbles to card's onNodeClick
|
|
114
117
|
onClick: () => { }, className: "nodrag dark:bg-primary dark:text-primary-foreground dark:hover:bg-primary/90 cursor-pointer bg-neutral-900 text-[11px] text-white hover:bg-neutral-800", children: [_jsx(Eye, { className: "h-3 w-3" }), getActionRequiredLabel(data)] })) : data.state === 'error' && data.onRetry ? (_jsxs(Button, { variant: "outline", size: "xs", "aria-label": "Retry", "data-testid": "feature-node-retry-button", onClick: (e) => {
|
|
115
118
|
e.stopPropagation();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { RepositoryNodeData } from './repository-node-config.js';
|
|
2
|
-
export declare function RepositoryNode({ data }: {
|
|
2
|
+
export declare function RepositoryNode({ data, selected, }: {
|
|
3
3
|
data: RepositoryNodeData;
|
|
4
|
+
selected?: boolean;
|
|
4
5
|
[key: string]: unknown;
|
|
5
6
|
}): import("react/jsx-runtime").JSX.Element;
|
|
6
7
|
//# sourceMappingURL=repository-node.d.ts.map
|
package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAyaA"}
|
|
@@ -13,7 +13,7 @@ import { useDeployAction } from '../../../hooks/use-deploy-action.js';
|
|
|
13
13
|
import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
|
|
14
14
|
import { useRepositoryActions } from './use-repository-actions.js';
|
|
15
15
|
import { FeatureSessionsDropdown, } from '../../common/feature-node/feature-sessions-dropdown.js';
|
|
16
|
-
export function RepositoryNode({ data }) {
|
|
16
|
+
export function RepositoryNode({ data, selected, }) {
|
|
17
17
|
const router = useRouter();
|
|
18
18
|
const featureFlags = useFeatureFlags();
|
|
19
19
|
const [confirmOpen, setConfirmOpen] = useState(false);
|
|
@@ -71,11 +71,10 @@ export function RepositoryNode({ data }) {
|
|
|
71
71
|
e.stopPropagation();
|
|
72
72
|
data.onClick?.();
|
|
73
73
|
}
|
|
74
|
-
}, className:
|
|
74
|
+
}, className: cn('nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm transition-[border-color,box-shadow] duration-200 dark:bg-neutral-800/80', selected && 'border-blue-400 dark:border-amber-500/60'), children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? _jsx("div", { className: "ml-1.5" }) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { "aria-label": "New feature", "data-testid": "repository-node-add-button", onClick: (e) => {
|
|
75
75
|
e.stopPropagation();
|
|
76
76
|
data.onAdd?.();
|
|
77
|
-
}, className: cn('text-
|
|
78
|
-
'animate-pulse-cta bg-blue-100 text-blue-500 dark:bg-blue-900/40'), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.branch ? (_jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) }), data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] })) : data.gitInfoStatus === 'not-a-repo' ? (
|
|
77
|
+
}, className: cn('flex h-6 shrink-0 cursor-pointer items-center gap-0.5 rounded bg-blue-500 px-1.5 text-[11px] font-bold text-white transition-colors hover:bg-blue-600 dark:bg-amber-500 dark:hover:bg-amber-400', data.pulseAdd && 'animate-pulse-cta'), children: [_jsx(Plus, { className: "h-3 w-3" }), _jsx("span", { className: "translate-y-px", children: "New" })] }) }), _jsx(TooltipContent, { side: "top", children: "New feature" })] }) })) : null] })] }), data.branch ? (_jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) }), data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] })) : data.gitInfoStatus === 'not-a-repo' ? (
|
|
79
78
|
/* Not a git repo — two rows for consistency with loading/ready states */
|
|
80
79
|
_jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-not-repo", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(FolderOpen, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate opacity-60", children: data.repositoryPath ?? 'Unknown path' })] }) }), _jsx("div", { className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs opacity-40", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: "Not a git repository" })] }) })] })) : data.gitInfoStatus !== 'ready' ? (
|
|
81
80
|
/* Loading — show skeleton placeholders for both rows */
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAKpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAKpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAwB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAsYzF"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -8,6 +8,7 @@ import { cn } from '../../../lib/utils.js';
|
|
|
8
8
|
import { FeaturesCanvas } from '../../features/features-canvas/index.js';
|
|
9
9
|
import { useSidebarFeaturesContext, mapNodeStateToSidebarStatus, } from '../../../hooks/sidebar-features-context.js';
|
|
10
10
|
import { useSelectedFeatureId } from '../../../hooks/use-selected-feature-id.js';
|
|
11
|
+
import { useSelectedRepository } from '../../../hooks/use-selected-repository.js';
|
|
11
12
|
import { useSoundAction } from '../../../hooks/use-sound-action.js';
|
|
12
13
|
import { useDrawerCloseGuard } from '../../../hooks/drawer-close-guard.js';
|
|
13
14
|
import { useViewportPersistence } from '../../../hooks/use-viewport-persistence.js';
|
|
@@ -23,6 +24,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
23
24
|
const router = useRouter();
|
|
24
25
|
const pathname = usePathname();
|
|
25
26
|
const selectedFeatureId = useSelectedFeatureId();
|
|
27
|
+
const selectedRepository = useSelectedRepository();
|
|
26
28
|
const clickSound = useSoundAction('click');
|
|
27
29
|
const { guardedNavigate } = useDrawerCloseGuard();
|
|
28
30
|
const { fitView } = useReactFlow();
|
|
@@ -272,5 +274,5 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
272
274
|
const archiveToggle = (_jsx(Panel, { position: "top-right", children: _jsxs("button", { type: "button", "aria-label": showArchived ? 'Hide archived features' : 'Show archived features', "data-testid": "archive-toggle-button", onClick: () => setShowArchived(!showArchived), className: cn('bg-card flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium shadow-sm transition-colors', showArchived
|
|
273
275
|
? 'border-primary/30 text-primary'
|
|
274
276
|
: 'text-muted-foreground hover:text-foreground'), children: [showArchived ? _jsx(Eye, { className: "h-3.5 w-3.5" }) : _jsx(EyeOff, { className: "h-3.5 w-3.5" }), showArchived ? 'Archived visible' : 'Show archived'] }) }));
|
|
275
|
-
return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, toolbar: archiveToggle, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
|
|
277
|
+
return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, selectedRepository: selectedRepository, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, toolbar: archiveToggle, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
|
|
276
278
|
}
|
|
@@ -6,6 +6,10 @@ export interface FeaturesCanvasProps {
|
|
|
6
6
|
nodes: CanvasNodeType[];
|
|
7
7
|
edges: Edge[];
|
|
8
8
|
selectedFeatureId?: string | null;
|
|
9
|
+
selectedRepository?: {
|
|
10
|
+
id: string | null;
|
|
11
|
+
path: string | null;
|
|
12
|
+
};
|
|
9
13
|
defaultViewport?: Viewport;
|
|
10
14
|
onNodesChange?: (changes: NodeChange<CanvasNodeType>[]) => void;
|
|
11
15
|
onAddFeature?: () => void;
|
|
@@ -18,5 +22,5 @@ export interface FeaturesCanvasProps {
|
|
|
18
22
|
toolbar?: React.ReactNode;
|
|
19
23
|
emptyState?: React.ReactNode;
|
|
20
24
|
}
|
|
21
|
-
export declare function FeaturesCanvas({ nodes, edges, selectedFeatureId, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, onResetViewport, toolbar, emptyState, }: FeaturesCanvasProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export declare function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedRepository, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, onResetViewport, toolbar, emptyState, }: FeaturesCanvasProps): import("react/jsx-runtime").JSX.Element;
|
|
22
26
|
//# sourceMappingURL=features-canvas.d.ts.map
|
package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features-canvas.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAMvF,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,KAAK,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"features-canvas.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAMvF,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,qCAAqC,CAAC;AAGlG,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAChE,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,QAAQ,CAAC;IACjC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AAmBD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,OAAO,EACP,UAAU,GACX,EAAE,mBAAmB,2CA0IrB"}
|
|
@@ -18,7 +18,7 @@ function ResetButton({ onResetViewport }) {
|
|
|
18
18
|
}, [onResetViewport, setViewport]);
|
|
19
19
|
return (_jsx(ControlButton, { onClick: handleReset, title: "Reset view", "aria-label": "Reset view", children: _jsx(RotateCcw, { style: { fill: 'none' } }) }));
|
|
20
20
|
}
|
|
21
|
-
export function FeaturesCanvas({ nodes, edges, selectedFeatureId, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, onResetViewport, toolbar, emptyState, }) {
|
|
21
|
+
export function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedRepository, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, onResetViewport, toolbar, emptyState, }) {
|
|
22
22
|
const nodeTypes = useMemo(() => ({
|
|
23
23
|
featureNode: FeatureNode,
|
|
24
24
|
repositoryNode: RepositoryNode,
|
|
@@ -27,13 +27,30 @@ export function FeaturesCanvas({ nodes, edges, selectedFeatureId, defaultViewpor
|
|
|
27
27
|
dependencyEdge: DependencyEdge,
|
|
28
28
|
}), []);
|
|
29
29
|
// Callbacks and showHandles are already injected into node.data by deriveGraph.
|
|
30
|
-
//
|
|
31
|
-
const enrichedNodes = useMemo(() =>
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
// Apply selectedFeatureId and selectedRepository highlighting here.
|
|
31
|
+
const enrichedNodes = useMemo(() => {
|
|
32
|
+
const hasFeatureSel = selectedFeatureId != null;
|
|
33
|
+
const hasRepoSel = selectedRepository != null &&
|
|
34
|
+
(selectedRepository.id != null || selectedRepository.path != null);
|
|
35
|
+
if (!hasFeatureSel && !hasRepoSel)
|
|
36
|
+
return nodes;
|
|
37
|
+
return nodes.map((node) => {
|
|
38
|
+
if (hasFeatureSel &&
|
|
39
|
+
node.type === 'featureNode' &&
|
|
40
|
+
node.data.featureId === selectedFeatureId) {
|
|
41
|
+
return { ...node, selected: true };
|
|
42
|
+
}
|
|
43
|
+
if (hasRepoSel && node.type === 'repositoryNode') {
|
|
44
|
+
const rd = node.data;
|
|
45
|
+
const matchById = selectedRepository.id != null &&
|
|
46
|
+
(node.id === selectedRepository.id || rd.id === selectedRepository.id);
|
|
47
|
+
const matchByPath = selectedRepository.path != null && rd.repositoryPath === selectedRepository.path;
|
|
48
|
+
if (matchById || matchByPath)
|
|
49
|
+
return { ...node, selected: true };
|
|
50
|
+
}
|
|
51
|
+
return node;
|
|
52
|
+
});
|
|
53
|
+
}, [nodes, selectedFeatureId, selectedRepository]);
|
|
37
54
|
const isEmpty = nodes.length === 0;
|
|
38
55
|
// Track empty→populated transition for exit animation.
|
|
39
56
|
// When isEmpty flips from true to false, keep the overlay mounted
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
2
|
interface AppShellProps {
|
|
3
3
|
children: ReactNode;
|
|
4
|
+
/** Server-read sidebar state from cookie. */
|
|
5
|
+
sidebarOpen?: boolean;
|
|
4
6
|
}
|
|
5
|
-
export declare function AppShell({ children }: AppShellProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function AppShell({ children, sidebarOpen }: AppShellProps): import("react/jsx-runtime").JSX.Element;
|
|
6
8
|
export {};
|
|
7
9
|
//# sourceMappingURL=app-shell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAsBvE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAsBvE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA+JD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,aAAa,2CAUhE"}
|
|
@@ -19,7 +19,7 @@ const CONTROL_CENTER_PREFIXES = ['/', '/create', '/adopt', '/feature', '/reposit
|
|
|
19
19
|
function isControlCenterRoute(pathname) {
|
|
20
20
|
return CONTROL_CENTER_PREFIXES.some((prefix) => pathname === prefix || (prefix !== '/' && pathname.startsWith(`${prefix}/`)));
|
|
21
21
|
}
|
|
22
|
-
function AppShellInner({ children }) {
|
|
22
|
+
function AppShellInner({ children, sidebarOpen }) {
|
|
23
23
|
const router = useRouter();
|
|
24
24
|
const pathname = usePathname();
|
|
25
25
|
const { guardedNavigate } = useDrawerCloseGuard();
|
|
@@ -119,11 +119,11 @@ function AppShellInner({ children }) {
|
|
|
119
119
|
featureFlags.githubImport,
|
|
120
120
|
featureFlags.adoptBranch,
|
|
121
121
|
]);
|
|
122
|
-
return (_jsxs(SidebarProvider, { defaultOpen: false, children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsx("main", { className: "h-full", children: children }), isControlCenterRoute(pathname) && hasRepositories ? (_jsx(FloatingActionButton, { actions: fabActions })) : null, featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleGitHubImportComplete })) : null] }) }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (open) => {
|
|
122
|
+
return (_jsxs(SidebarProvider, { defaultOpen: sidebarOpen ?? false, children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsx("main", { className: "h-full", children: children }), isControlCenterRoute(pathname) && hasRepositories ? (_jsx(FloatingActionButton, { actions: fabActions })) : null, featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleGitHubImportComplete })) : null] }) }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (open) => {
|
|
123
123
|
if (!open)
|
|
124
124
|
setShowReactPicker(false);
|
|
125
125
|
}, onSelect: handleReactPickerSelect })] }));
|
|
126
126
|
}
|
|
127
|
-
export function AppShell({ children }) {
|
|
128
|
-
return (_jsx(AgentEventsProvider, { children: _jsx(DrawerCloseGuardProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(AppShellInner, { children: children }) }) }) }));
|
|
127
|
+
export function AppShell({ children, sidebarOpen }) {
|
|
128
|
+
return (_jsx(AgentEventsProvider, { children: _jsx(DrawerCloseGuardProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(AppShellInner, { sidebarOpen: sidebarOpen, children: children }) }) }) }));
|
|
129
129
|
}
|
|
@@ -13,6 +13,8 @@ interface SidebarContextProps {
|
|
|
13
13
|
setOpenMobile: (open: boolean) => void;
|
|
14
14
|
isMobile: boolean;
|
|
15
15
|
toggleSidebar: () => void;
|
|
16
|
+
/** Whether transitions should be enabled (false until first user toggle). */
|
|
17
|
+
animated: boolean;
|
|
16
18
|
}
|
|
17
19
|
declare function useSidebar(): SidebarContextProps;
|
|
18
20
|
declare function SidebarProvider({ defaultOpen, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }: React.ComponentProps<'div'> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/sidebar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMlE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAStD,OAAO,EAAW,cAAc,EAAmC,MAAM,yBAAyB,CAAC;AAEnG,QAAA,MAAM,mBAAmB,sBAAsB,CAAC;AAMhD,UAAU,mBAAmB;IAC3B,KAAK,EAAE,UAAU,GAAG,WAAW,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/sidebar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMlE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAStD,OAAO,EAAW,cAAc,EAAmC,MAAM,yBAAyB,CAAC;AAEnG,QAAA,MAAM,mBAAmB,sBAAsB,CAAC;AAMhD,UAAU,mBAAmB;IAC3B,KAAK,EAAE,UAAU,GAAG,WAAW,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,iBAAS,UAAU,wBAOlB;AAED,iBAAS,eAAe,CAAC,EACvB,WAAkB,EAClB,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,WAAW,EACzB,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC,2CA2GA;AAED,iBAAS,OAAO,CAAC,EACf,IAAa,EACb,OAAmB,EACnB,WAAyB,EACzB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IAC3C,WAAW,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;CAC7C,2CA2FA;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,2CAoB5F;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,2CAuB3E;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,2CAY1E;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,2CAShF;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAS1E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAS1E;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,2CASxF;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAY3E;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CASzE;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,OAAe,EACf,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,2CAerD;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,OAAe,EACf,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,2CAiBxD;AAED,iBAAS,mBAAmB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAShF;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,2CASvE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,2CAS3E;AAED,QAAA,MAAM,yBAAyB;;;8EAoB9B,CAAC;AAEF,iBAAS,iBAAiB,CAAC,EACzB,OAAe,EACf,QAAgB,EAChB,OAAmB,EACnB,IAAgB,EAChB,OAAO,EACP,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,CAAC;CAChE,GAAG,YAAY,CAAC,OAAO,yBAAyB,CAAC,2CAoCjD;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,OAAe,EACf,WAAmB,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,2CAsBA;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAiB7E;AAED,iBAAS,mBAAmB,CAAC,EAC3B,SAAS,EACT,QAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,2CA2BA;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,2CAa1E;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,2CAS9E;AAED,iBAAS,oBAAoB,CAAC,EAC5B,OAAe,EACf,IAAW,EACX,QAAgB,EAChB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,2CAoBA;AAED,OAAO,EACL,mBAAmB,EACnB,OAAO,EACP,cAAc,EACd,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,UAAU,GACX,CAAC"}
|
|
@@ -25,36 +25,15 @@ function useSidebar() {
|
|
|
25
25
|
}
|
|
26
26
|
return context;
|
|
27
27
|
}
|
|
28
|
-
function readSidebarState(fallback) {
|
|
29
|
-
try {
|
|
30
|
-
const stored = localStorage.getItem(SIDEBAR_STORAGE_KEY);
|
|
31
|
-
if (stored === 'true')
|
|
32
|
-
return true;
|
|
33
|
-
if (stored === 'false')
|
|
34
|
-
return false;
|
|
35
|
-
return fallback;
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return fallback;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
28
|
function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }) {
|
|
42
29
|
const isMobile = useIsMobile();
|
|
43
30
|
const [openMobile, setOpenMobile] = React.useState(false);
|
|
31
|
+
const [animated, setAnimated] = React.useState(false);
|
|
44
32
|
// This is the internal state of the sidebar.
|
|
45
33
|
// We use openProp and setOpenProp for control from outside the component.
|
|
46
|
-
//
|
|
34
|
+
// defaultOpen comes from server-side cookie reading, so SSR and client agree.
|
|
47
35
|
const [_open, _setOpen] = React.useState(defaultOpen);
|
|
48
36
|
const open = openProp ?? _open;
|
|
49
|
-
// After hydration, sync state from localStorage to avoid SSR mismatch.
|
|
50
|
-
React.useEffect(() => {
|
|
51
|
-
if (openProp !== undefined)
|
|
52
|
-
return; // controlled mode — skip
|
|
53
|
-
const stored = readSidebarState(defaultOpen);
|
|
54
|
-
if (stored !== defaultOpen) {
|
|
55
|
-
_setOpen(stored);
|
|
56
|
-
}
|
|
57
|
-
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
58
37
|
const setOpen = React.useCallback((value) => {
|
|
59
38
|
const openState = typeof value === 'function' ? value(open) : value;
|
|
60
39
|
if (setOpenProp) {
|
|
@@ -63,9 +42,11 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
|
|
|
63
42
|
else {
|
|
64
43
|
_setOpen(openState);
|
|
65
44
|
}
|
|
66
|
-
// Persist sidebar state to localStorage
|
|
45
|
+
// Persist sidebar state to localStorage and a cookie (so the server can
|
|
46
|
+
// read it on the next request and render the correct initial state).
|
|
67
47
|
try {
|
|
68
48
|
localStorage.setItem(SIDEBAR_STORAGE_KEY, String(openState));
|
|
49
|
+
document.cookie = `${SIDEBAR_STORAGE_KEY}=${openState}; path=/; max-age=31536000; SameSite=Lax`;
|
|
69
50
|
}
|
|
70
51
|
catch {
|
|
71
52
|
// Silently ignore storage errors (e.g. quota exceeded, private browsing).
|
|
@@ -73,8 +54,24 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
|
|
|
73
54
|
}, [setOpenProp, open]);
|
|
74
55
|
// Helper to toggle the sidebar.
|
|
75
56
|
const toggleSidebar = React.useCallback(() => {
|
|
57
|
+
setAnimated(true);
|
|
76
58
|
return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
|
|
77
59
|
}, [isMobile, setOpen, setOpenMobile]);
|
|
60
|
+
// Seed cookie from localStorage for existing users who have localStorage
|
|
61
|
+
// but no cookie yet (one-time migration).
|
|
62
|
+
React.useEffect(() => {
|
|
63
|
+
try {
|
|
64
|
+
if (!document.cookie.includes(SIDEBAR_STORAGE_KEY)) {
|
|
65
|
+
const stored = localStorage.getItem(SIDEBAR_STORAGE_KEY);
|
|
66
|
+
if (stored != null) {
|
|
67
|
+
document.cookie = `${SIDEBAR_STORAGE_KEY}=${stored}; path=/; max-age=31536000; SameSite=Lax`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Ignore
|
|
73
|
+
}
|
|
74
|
+
}, []);
|
|
78
75
|
// Adds a keyboard shortcut to toggle the sidebar.
|
|
79
76
|
React.useEffect(() => {
|
|
80
77
|
const handleKeyDown = (event) => {
|
|
@@ -97,7 +94,8 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
|
|
|
97
94
|
openMobile,
|
|
98
95
|
setOpenMobile,
|
|
99
96
|
toggleSidebar,
|
|
100
|
-
|
|
97
|
+
animated,
|
|
98
|
+
}), [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar, animated]);
|
|
101
99
|
return (_jsx(SidebarContext.Provider, { value: contextValue, children: _jsx(TooltipProvider, { delayDuration: 0, children: _jsx("div", { "data-slot": "sidebar-wrapper", style: {
|
|
102
100
|
'--sidebar-width': SIDEBAR_WIDTH,
|
|
103
101
|
'--sidebar-width-icon': SIDEBAR_WIDTH_ICON,
|
|
@@ -105,7 +103,7 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
|
|
|
105
103
|
}, className: cn('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', className), ...props, children: children }) }) }));
|
|
106
104
|
}
|
|
107
105
|
function Sidebar({ side = 'left', variant = 'sidebar', collapsible = 'offcanvas', className, children, ...props }) {
|
|
108
|
-
const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
|
|
106
|
+
const { isMobile, state, openMobile, setOpenMobile, animated } = useSidebar();
|
|
109
107
|
if (collapsible === 'none') {
|
|
110
108
|
return (_jsx("div", { "data-slot": "sidebar", className: cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className), ...props, children: children }));
|
|
111
109
|
}
|
|
@@ -114,9 +112,9 @@ function Sidebar({ side = 'left', variant = 'sidebar', collapsible = 'offcanvas'
|
|
|
114
112
|
'--sidebar-width': SIDEBAR_WIDTH_MOBILE,
|
|
115
113
|
}, side: side, children: [_jsxs(SheetHeader, { className: "sr-only", children: [_jsx(SheetTitle, { children: "Sidebar" }), _jsx(SheetDescription, { children: "Displays the mobile sidebar." })] }), _jsx("div", { className: "flex h-full w-full flex-col", children: children })] }) }));
|
|
116
114
|
}
|
|
117
|
-
return (_jsxs("div", { className: "group peer text-sidebar-foreground hidden md:block", "data-state": state, "data-collapsible": state === 'collapsed' ? collapsible : '', "data-variant": variant, "data-side": side, "data-slot": "sidebar", children: [_jsx("div", { "data-slot": "sidebar-gap", className: cn('relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear', 'group-data-[collapsible=offcanvas]:w-0', 'group-data-[side=right]:rotate-180', variant === 'floating' || variant === 'inset'
|
|
115
|
+
return (_jsxs("div", { className: "group peer text-sidebar-foreground hidden md:block", "data-state": state, "data-collapsible": state === 'collapsed' ? collapsible : '', "data-variant": variant, "data-side": side, "data-slot": "sidebar", children: [_jsx("div", { "data-slot": "sidebar-gap", className: cn('relative w-(--sidebar-width) bg-transparent', animated && 'transition-[width] duration-200 ease-linear', 'group-data-[collapsible=offcanvas]:w-0', 'group-data-[side=right]:rotate-180', variant === 'floating' || variant === 'inset'
|
|
118
116
|
? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'
|
|
119
|
-
: 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)') }), _jsx("div", { "data-slot": "sidebar-container", className: cn('fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear
|
|
117
|
+
: 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)') }), _jsx("div", { "data-slot": "sidebar-container", className: cn('fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) md:flex', animated && 'transition-[left,right,width] duration-200 ease-linear', side === 'left'
|
|
120
118
|
? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'
|
|
121
119
|
: 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',
|
|
122
120
|
// Adjust the padding for floating and inset variants.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { Tooltip as TooltipPrimitive } from 'radix-ui';
|
|
3
|
+
/** Default tooltip hover delay (ms) for canvas nodes and UI controls. */
|
|
4
|
+
export declare const TOOLTIP_DELAY_MS = 400;
|
|
3
5
|
declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>): import("react/jsx-runtime").JSX.Element;
|
|
4
6
|
declare function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
|
|
5
7
|
declare function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIvD,iBAAS,eAAe,CAAC,EACvB,
|
|
1
|
+
{"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIvD,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,iBAAS,eAAe,CAAC,EACvB,aAAgC,EAChC,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,2CAQxD;AAED,iBAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,2CAEhF;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,2CAE1F;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,UAAc,EACd,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,2CAiBvD;AAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Tooltip as TooltipPrimitive } from 'radix-ui';
|
|
4
4
|
import { cn } from '../../lib/utils.js';
|
|
5
|
-
|
|
5
|
+
/** Default tooltip hover delay (ms) for canvas nodes and UI controls. */
|
|
6
|
+
export const TOOLTIP_DELAY_MS = 400;
|
|
7
|
+
function TooltipProvider({ delayDuration = TOOLTIP_DELAY_MS, ...props }) {
|
|
6
8
|
return (_jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delayDuration: delayDuration, ...props }));
|
|
7
9
|
}
|
|
8
10
|
function Tooltip({ ...props }) {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the selected repository context from the current URL.
|
|
3
|
+
* Returns `{ id, path }` — either or both may be set depending on the route.
|
|
4
|
+
*
|
|
5
|
+
* Matches:
|
|
6
|
+
* - `/repository/<id>` → id is set
|
|
7
|
+
* - `/create?repo=<path>` → path is set
|
|
8
|
+
*/
|
|
9
|
+
export declare function useSelectedRepository(): {
|
|
10
|
+
id: string | null;
|
|
11
|
+
path: string | null;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=use-selected-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-selected-repository.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-selected-repository.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI;IAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAWlF"}
|