@shepai/cli 1.114.0-pr361.c9914c5 → 1.115.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +7 -28
- package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts +0 -2
- package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-viewport-persistence.js +6 -19
- package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/layout-with-dagre.js +2 -11
- 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 +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
- 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 +26 -26
- 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 +26 -26
- 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 +18 -18
- 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 +20 -20
- 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 +26 -26
- 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 +26 -26
- 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 +18 -18
- 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 +18 -18
- 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.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 +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -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 +6 -6
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- 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/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.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]__cbd8062c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_605157e5._.js → _7d4c400f._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_605157e5._.js.map → _7d4c400f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_174489cc._.js → _d6fedbbf._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_174489cc._.js.map → _d6fedbbf._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_5f564526._.js → _f166a7ed._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_5f564526._.js.map → _f166a7ed._.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_(dashboard)_page_actions_888633e1.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.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/chunks/ssr/src_presentation_web_e2604413._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.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 +31 -31
- package/web/.next/static/chunks/{d36f7fcbbd2bc9e5.js → 08c3f6e304e8d7b4.js} +1 -1
- package/web/.next/static/chunks/{d5a710e0c22e97f7.js → 29a45df76aba845e.js} +1 -1
- package/web/.next/static/chunks/{04de201e125688be.js → 36e2bf6ac6e90282.js} +1 -1
- package/web/.next/static/chunks/{4ec746230535814b.js → 36ff38fd6b9d647d.js} +1 -1
- package/web/.next/static/chunks/{1b9cd00f0260dc94.js → b6d30842eaeb3166.js} +2 -2
- package/web/.next/static/chunks/{9b8df96f693d7509.js → c50772767c14f013.js} +1 -1
- package/web/.next/static/chunks/{4ae58f388ee0a927.js → c62c393c5d0912b7.js} +1 -1
- package/web/.next/static/chunks/{285373584362256a.js → d4350f1fe1625279.js} +1 -1
- package/web/.next/static/chunks/{f4a43c0fecb47dbd.js → d4bebfde2bed6130.js} +1 -1
- package/web/.next/static/chunks/ea784857fcad9e04.js +2 -0
- package/web/.next/static/chunks/ca316d69021e3799.js +0 -2
- /package/web/.next/static/{qW3bkLKlrX8uFT2umfH8C → 8fO4nSkLwXorpa4D0V82M}/_buildManifest.js +0 -0
- /package/web/.next/static/{qW3bkLKlrX8uFT2umfH8C → 8fO4nSkLwXorpa4D0V82M}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{qW3bkLKlrX8uFT2umfH8C → 8fO4nSkLwXorpa4D0V82M}/_ssgManifest.js +0 -0
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;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,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,
|
|
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;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,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,2CAqUzF"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -124,22 +124,16 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
124
124
|
const handler = (e) => {
|
|
125
125
|
const path = e.detail.path;
|
|
126
126
|
const { wasEmpty, repoPath } = handleAddRepository(path);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
// Use a short delay to allow React to flush the state update and
|
|
132
|
-
// the showCanvas latch to transition, ensuring ReactFlow has the
|
|
133
|
-
// new nodes rendered before fitView calculates bounds.
|
|
134
|
-
requestAnimationFrame(() => {
|
|
135
|
-
fitView(AUTO_FOCUS_OPTIONS);
|
|
136
|
-
if (wasEmpty) {
|
|
127
|
+
if (wasEmpty) {
|
|
128
|
+
// Wait for next render so the repo node exists in the DOM, then auto-focus
|
|
129
|
+
setTimeout(() => {
|
|
130
|
+
fitView(AUTO_FOCUS_OPTIONS);
|
|
137
131
|
// Open the create-feature drawer after the fitView animation completes
|
|
138
132
|
drawerTimerRef.current = setTimeout(() => {
|
|
139
133
|
guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repoPath)}`));
|
|
140
134
|
}, AUTO_FOCUS_DRAWER_DELAY_MS);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
135
|
+
}, 0);
|
|
136
|
+
}
|
|
143
137
|
};
|
|
144
138
|
window.addEventListener('shep:add-repository', handler);
|
|
145
139
|
return () => {
|
|
@@ -148,7 +142,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
148
142
|
clearTimeout(drawerTimerRef.current);
|
|
149
143
|
}
|
|
150
144
|
};
|
|
151
|
-
}, [handleAddRepository, fitView, guardedNavigate, router
|
|
145
|
+
}, [handleAddRepository, fitView, guardedNavigate, router]);
|
|
152
146
|
// Listen for create events from the create drawer (with real feature ID from server)
|
|
153
147
|
useEffect(() => {
|
|
154
148
|
const handler = (e) => {
|
|
@@ -210,21 +204,6 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
210
204
|
handleRepositoryClick,
|
|
211
205
|
handleDeleteRepository,
|
|
212
206
|
]);
|
|
213
|
-
// Auto-center whenever the canvas transitions from empty to having nodes.
|
|
214
|
-
// This covers both initial page load AND re-adding repos after deleting
|
|
215
|
-
// everything — the view always centers so the repo is visible, ignoring
|
|
216
|
-
// any previously stored pan/zoom position.
|
|
217
|
-
const hadNodesRef = useRef(nodes.length > 0);
|
|
218
|
-
useEffect(() => {
|
|
219
|
-
const hasNodes = nodes.length > 0;
|
|
220
|
-
if (hasNodes && !hadNodesRef.current) {
|
|
221
|
-
// Went from empty → has nodes — center the view
|
|
222
|
-
resetViewport();
|
|
223
|
-
// Yield to React so nodes are rendered in the DOM before fitView calculates bounds.
|
|
224
|
-
setTimeout(() => fitView(AUTO_FOCUS_OPTIONS), 0);
|
|
225
|
-
}
|
|
226
|
-
hadNodesRef.current = hasNodes;
|
|
227
|
-
}, [nodes.length, fitView, resetViewport]);
|
|
228
207
|
const handleMoveEnd = useCallback((_event, viewport) => {
|
|
229
208
|
handleViewportChange(viewport);
|
|
230
209
|
}, [handleViewportChange]);
|
|
@@ -5,8 +5,6 @@ export declare const DEBOUNCE_MS = 500;
|
|
|
5
5
|
export declare const DEFAULT_VIEWPORT: Viewport;
|
|
6
6
|
export interface UseViewportPersistenceResult {
|
|
7
7
|
defaultViewport: Viewport;
|
|
8
|
-
/** True when a valid viewport was restored from localStorage. */
|
|
9
|
-
hasSavedViewport: boolean;
|
|
10
8
|
onMoveEnd: (viewport: Viewport) => void;
|
|
11
9
|
resetViewport: () => Viewport;
|
|
12
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-viewport-persistence.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-viewport-persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAClD,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B,eAAO,MAAM,gBAAgB,EAAE,QAAuC,CAAC;AAEvE,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,QAAQ,CAAC;IAC1B,
|
|
1
|
+
{"version":3,"file":"use-viewport-persistence.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-viewport-persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAClD,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B,eAAO,MAAM,gBAAgB,EAAE,QAAuC,CAAC;AAEvE,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,QAAQ,CAAC;IAC1B,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,aAAa,EAAE,MAAM,QAAQ,CAAC;CAC/B;AA6BD,wBAAgB,sBAAsB,IAAI,4BAA4B,CAmCrE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { useCallback, useEffect, useRef
|
|
2
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
3
3
|
export const STORAGE_KEY = 'shep-canvas-viewport';
|
|
4
4
|
export const DEBOUNCE_MS = 500;
|
|
5
5
|
export const DEFAULT_VIEWPORT = { x: 30, y: 30, zoom: 0.85 };
|
|
@@ -20,20 +20,16 @@ function readViewport() {
|
|
|
20
20
|
try {
|
|
21
21
|
const raw = localStorage.getItem(STORAGE_KEY);
|
|
22
22
|
if (raw == null)
|
|
23
|
-
return
|
|
23
|
+
return DEFAULT_VIEWPORT;
|
|
24
24
|
const parsed = JSON.parse(raw);
|
|
25
|
-
|
|
26
|
-
return { viewport: parsed, fromStorage: true };
|
|
27
|
-
return { viewport: DEFAULT_VIEWPORT, fromStorage: false };
|
|
25
|
+
return isValidViewport(parsed) ? parsed : DEFAULT_VIEWPORT;
|
|
28
26
|
}
|
|
29
27
|
catch {
|
|
30
|
-
return
|
|
28
|
+
return DEFAULT_VIEWPORT;
|
|
31
29
|
}
|
|
32
30
|
}
|
|
33
31
|
export function useViewportPersistence() {
|
|
34
|
-
const
|
|
35
|
-
const [defaultViewport, setDefaultViewport] = useState(stored.viewport);
|
|
36
|
-
const hasSavedViewport = stored.fromStorage;
|
|
32
|
+
const defaultViewport = useRef(readViewport()).current;
|
|
37
33
|
const timerRef = useRef(null);
|
|
38
34
|
useEffect(() => {
|
|
39
35
|
return () => {
|
|
@@ -56,22 +52,13 @@ export function useViewportPersistence() {
|
|
|
56
52
|
}, DEBOUNCE_MS);
|
|
57
53
|
}, []);
|
|
58
54
|
const resetViewport = useCallback(() => {
|
|
59
|
-
// Cancel any pending debounced save so it cannot overwrite the reset
|
|
60
|
-
if (timerRef.current != null) {
|
|
61
|
-
clearTimeout(timerRef.current);
|
|
62
|
-
timerRef.current = null;
|
|
63
|
-
}
|
|
64
55
|
try {
|
|
65
56
|
localStorage.removeItem(STORAGE_KEY);
|
|
66
57
|
}
|
|
67
58
|
catch {
|
|
68
59
|
// Silently ignore localStorage errors
|
|
69
60
|
}
|
|
70
|
-
// Update the defaultViewport so that if ReactFlow re-mounts (e.g. after
|
|
71
|
-
// showCanvas toggles), it initializes at the default position instead of
|
|
72
|
-
// the stale saved viewport.
|
|
73
|
-
setDefaultViewport(DEFAULT_VIEWPORT);
|
|
74
61
|
return DEFAULT_VIEWPORT;
|
|
75
62
|
}, []);
|
|
76
|
-
return { defaultViewport,
|
|
63
|
+
return { defaultViewport, onMoveEnd, resetViewport };
|
|
77
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-with-dagre.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/layout-with-dagre.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AAkCF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,IAAI,EAC5C,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,GAAE,aAAkB,GACvB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"layout-with-dagre.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/layout-with-dagre.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AAkCF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,IAAI,EAC5C,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,GAAE,aAAkB,GACvB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAqL/B"}
|
|
@@ -78,10 +78,6 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
|
|
|
78
78
|
// Add disconnected nodes to centerMap so they participate in root positioning.
|
|
79
79
|
// Use the same primary-axis position as connected roots (rank 0) so they align
|
|
80
80
|
// visually with repos that have features attached.
|
|
81
|
-
// When there are NO connected nodes (e.g. repos with no features), use half the
|
|
82
|
-
// node's own dimension so the leading edge sits at the canvas origin — preventing
|
|
83
|
-
// nodes from rendering off-screen with the default viewport.
|
|
84
|
-
const hasCenterMap = centerMap.size > 0;
|
|
85
81
|
let rootPrimaryAxis = 0;
|
|
86
82
|
for (const c of centerMap.values()) {
|
|
87
83
|
rootPrimaryAxis = isHorizontal ? c.cx : c.cy;
|
|
@@ -89,14 +85,9 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
|
|
|
89
85
|
}
|
|
90
86
|
for (const node of disconnectedNodes) {
|
|
91
87
|
const size = getNodeSize(node, nodeSize);
|
|
92
|
-
const primaryAxisCenter = hasCenterMap
|
|
93
|
-
? rootPrimaryAxis
|
|
94
|
-
: isHorizontal
|
|
95
|
-
? size.width / 2
|
|
96
|
-
: size.height / 2;
|
|
97
88
|
centerMap.set(node.id, {
|
|
98
|
-
cx: isHorizontal ?
|
|
99
|
-
cy: isHorizontal ? 0 :
|
|
89
|
+
cx: isHorizontal ? rootPrimaryAxis : 0,
|
|
90
|
+
cy: isHorizontal ? 0 : rootPrimaryAxis,
|
|
100
91
|
w: size.width,
|
|
101
92
|
h: size.height,
|
|
102
93
|
});
|