@shepai/cli 1.141.0-pr451.4a6394d → 1.141.0-pr451.4e8c2b8
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-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 +1 -1
- package/web/.next/required-server-files.json +1 -1
- 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]__2bdf88a0._.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]__42faf5ae._.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/_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/_b71645b4._.js +1 -1
- package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_4ed0097e._.js → _d1000f0f._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_4ed0097e._.js.map → _d1000f0f._.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/{_a06d9ccc._.js → _ec8b9547._.js} +2 -2
- package/web/.next/server/chunks/ssr/_ec8b9547._.js.map +1 -0
- 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_e43b70ee._.js → src_presentation_web_b91e7ad9._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_e43b70ee._.js.map → src_presentation_web_b91e7ad9._.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/{6bb6e4eb62a7f549.js → 1c0d319e7b6b9da4.js} +1 -1
- package/web/.next/static/chunks/413519e7b0c79890.js +1 -0
- package/web/.next/static/chunks/74ee98538b63a4b2.css +1 -0
- package/web/.next/static/chunks/8839f95cf0bf7c47.js +1 -0
- package/web/.next/static/chunks/afc7da15e125a4c5.js +1 -0
- package/web/.next/static/chunks/{bbba7015f02d903c.js → b77cfc163ce74469.js} +1 -1
- package/web/.next/static/chunks/{b49df157363dfe58.js → bd0b30673ac2d2b1.js} +2 -2
- package/web/.next/static/chunks/{79647f021bb186db.js → c4f72fce4d4d08fd.js} +2 -2
- package/web/.next/static/chunks/ce9d764d2b4b237e.js +1 -0
- package/web/.next/static/chunks/{7397ae0ab649be87.js → cf956bbe6f939f21.js} +1 -1
- package/web/.next/static/chunks/{2e3e456f1f0b130f.js → e1f0c5c6da6ce871.js} +1 -1
- package/web/.next/static/chunks/{2f918f5f997c51c0.js → eb26a1a363270c1d.js} +1 -1
- package/web/.next/static/chunks/ee590b04ba31caa5.js +1 -0
- 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/_a06d9ccc._.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/static/chunks/0303c78e39053f1b.js +0 -1
- package/web/.next/static/chunks/1385263232ac9a7c.js +0 -1
- package/web/.next/static/chunks/594ee90754746a9b.js +0 -1
- package/web/.next/static/chunks/7621e0f0aaa7ca78.js +0 -1
- package/web/.next/static/chunks/b1a97b21d18e885e.js +0 -1
- package/web/.next/static/chunks/cb7bab8d1ddc7b1c.css +0 -1
- /package/web/.next/static/{w7sNuk9lpcGwQGHFcsWww → a3EHAucm2zcdyintMJkmG}/_buildManifest.js +0 -0
- /package/web/.next/static/{w7sNuk9lpcGwQGHFcsWww → a3EHAucm2zcdyintMJkmG}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{w7sNuk9lpcGwQGHFcsWww → a3EHAucm2zcdyintMJkmG}/_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
|
}
|
|
@@ -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,2CA8dA"}
|
|
@@ -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.repositoryPath ? (_jsx(FeatureSessionsDropdown, { repositoryPath: 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":"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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { usePathname, useSearchParams } from 'next/navigation';
|
|
3
|
+
/**
|
|
4
|
+
* Extracts the selected repository context from the current URL.
|
|
5
|
+
* Returns `{ id, path }` — either or both may be set depending on the route.
|
|
6
|
+
*
|
|
7
|
+
* Matches:
|
|
8
|
+
* - `/repository/<id>` → id is set
|
|
9
|
+
* - `/create?repo=<path>` → path is set
|
|
10
|
+
*/
|
|
11
|
+
export function useSelectedRepository() {
|
|
12
|
+
const pathname = usePathname();
|
|
13
|
+
const searchParams = useSearchParams();
|
|
14
|
+
const repoIdMatch = pathname.match(/^\/repository\/([^/]+)/);
|
|
15
|
+
const id = repoIdMatch?.[1] ?? null;
|
|
16
|
+
const isCreate = pathname.startsWith('/create');
|
|
17
|
+
const path = isCreate ? searchParams.get('repo') : null;
|
|
18
|
+
return { id, path };
|
|
19
|
+
}
|