@tldiagram/core-ui 1.95.0 → 2.0.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.
Files changed (102) hide show
  1. package/dist/api/client.d.ts +184 -3
  2. package/dist/components/ConnectorPanel.d.ts +5 -1
  3. package/dist/components/CrossBranchControls.d.ts +4 -3
  4. package/dist/components/ElementNode.d.ts +5 -0
  5. package/dist/components/ElementPanel.d.ts +6 -1
  6. package/dist/components/LayoutSection.d.ts +2 -1
  7. package/dist/components/MergeDialog.d.ts +16 -0
  8. package/dist/components/MiniZoomOnboarding.d.ts +2 -1
  9. package/dist/components/NodeContainer.d.ts +2 -0
  10. package/dist/components/ProxyConnectorPanel.d.ts +4 -1
  11. package/dist/components/ViewExplorer/index.d.ts +1 -1
  12. package/dist/components/ViewFloatingMenu-vscode.d.ts +5 -0
  13. package/dist/components/ViewFloatingMenu.d.ts +8 -1
  14. package/dist/components/ViewGridNode.d.ts +3 -0
  15. package/dist/components/ViewPanel.d.ts +2 -1
  16. package/dist/components/WorkspacePanel.d.ts +2 -0
  17. package/dist/components/ZUI/ZUICanvas.d.ts +5 -0
  18. package/dist/components/ZUI/focus.d.ts +32 -0
  19. package/dist/components/ZUI/focus.test.d.ts +1 -0
  20. package/dist/components/ZUI/layout.d.ts +2 -2
  21. package/dist/components/ZUI/proxy.d.ts +20 -4
  22. package/dist/components/ZUI/renderer.d.ts +35 -1
  23. package/dist/components/ZUI/types.d.ts +6 -0
  24. package/dist/components/ZUI/useZUIInteraction.d.ts +1 -0
  25. package/dist/context/WorkspaceVersionContext.d.ts +49 -0
  26. package/dist/crossBranch/resolve.d.ts +39 -2
  27. package/dist/crossBranch/resolve.test.d.ts +1 -0
  28. package/dist/crossBranch/settings.d.ts +6 -1
  29. package/dist/crossBranch/types.d.ts +8 -0
  30. package/dist/hooks/useElementSearch.d.ts +8 -0
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.js +14597 -12083
  33. package/dist/pages/InfiniteZoom.d.ts +1 -0
  34. package/dist/pages/ViewEditor/hooks/useCanvasInteractions.d.ts +6 -1
  35. package/dist/pages/ViewEditor/hooks/useViewContextNeighbours.d.ts +2 -0
  36. package/dist/pages/ViewEditor/hooks/useViewData.d.ts +4 -2
  37. package/dist/pages/ViewEditor/hooks/useViewEditHistory.d.ts +13 -0
  38. package/dist/pages/viewsJumpSearch.d.ts +22 -0
  39. package/dist/pages/viewsJumpSearch.test.d.ts +1 -0
  40. package/dist/store/useStore.d.ts +3 -0
  41. package/dist/types/index.d.ts +9 -0
  42. package/dist/utils/elementIcon.d.ts +2 -0
  43. package/dist/utils/elementIcon.test.d.ts +1 -0
  44. package/dist/utils/sourceEditor.d.ts +7 -0
  45. package/dist/utils/watchDiffSummary.d.ts +34 -0
  46. package/package.json +2 -2
  47. package/src/App.tsx +12 -8
  48. package/src/api/client.ts +488 -26
  49. package/src/components/CodePreviewPanel.tsx +90 -16
  50. package/src/components/ConnectorPanel.tsx +34 -3
  51. package/src/components/ContextNeighborElement.tsx +2 -5
  52. package/src/components/CrossBranchControls.tsx +46 -17
  53. package/src/components/ElementNode.tsx +98 -47
  54. package/src/components/ElementPanel.tsx +62 -25
  55. package/src/components/InlineElementAdder.tsx +8 -3
  56. package/src/components/LayoutSection.tsx +4 -1
  57. package/src/components/MergeDialog.tsx +269 -0
  58. package/src/components/MiniZoomOnboarding.tsx +29 -22
  59. package/src/components/NodeContainer.tsx +55 -17
  60. package/src/components/ProxyConnectorPanel.tsx +58 -16
  61. package/src/components/ViewBezierConnector.tsx +116 -21
  62. package/src/components/ViewExplorer/index.tsx +1 -1
  63. package/src/components/ViewFloatingMenu-vscode.tsx +5 -0
  64. package/src/components/ViewFloatingMenu.tsx +110 -1
  65. package/src/components/ViewGridNode.tsx +59 -8
  66. package/src/components/ViewPanel.tsx +3 -2
  67. package/src/components/WorkspacePanel.tsx +938 -0
  68. package/src/components/ZUI/ZUICanvas.tsx +226 -127
  69. package/src/components/ZUI/focus.test.ts +534 -0
  70. package/src/components/ZUI/focus.ts +293 -0
  71. package/src/components/ZUI/layout.ts +7 -11
  72. package/src/components/ZUI/proxy.ts +470 -114
  73. package/src/components/ZUI/renderer.ts +510 -134
  74. package/src/components/ZUI/types.ts +6 -0
  75. package/src/components/ZUI/useZUIInteraction.ts +66 -29
  76. package/src/context/WorkspaceVersionContext.tsx +126 -0
  77. package/src/crossBranch/resolve.test.ts +342 -0
  78. package/src/crossBranch/resolve.ts +368 -68
  79. package/src/crossBranch/settings.ts +49 -3
  80. package/src/crossBranch/types.ts +9 -0
  81. package/src/hooks/useElementSearch.ts +45 -0
  82. package/src/index.css +11 -0
  83. package/src/index.ts +7 -0
  84. package/src/pages/AppearanceSettings.tsx +24 -1
  85. package/src/pages/Dependencies.tsx +231 -65
  86. package/src/pages/InfiniteZoom.tsx +76 -27
  87. package/src/pages/Settings.tsx +1 -1
  88. package/src/pages/ViewEditor/hooks/useCanvasInteractions.ts +103 -24
  89. package/src/pages/ViewEditor/hooks/useViewContextNeighbours.ts +102 -6
  90. package/src/pages/ViewEditor/hooks/useViewData.ts +42 -26
  91. package/src/pages/ViewEditor/hooks/useViewEditHistory.ts +62 -0
  92. package/src/pages/ViewEditor/index.tsx +549 -59
  93. package/src/pages/Views.tsx +112 -41
  94. package/src/pages/ViewsGrid.tsx +332 -113
  95. package/src/pages/viewsJumpSearch.test.ts +193 -0
  96. package/src/pages/viewsJumpSearch.ts +111 -0
  97. package/src/store/useStore.ts +58 -0
  98. package/src/types/index.ts +10 -0
  99. package/src/utils/elementIcon.test.ts +28 -0
  100. package/src/utils/elementIcon.ts +20 -0
  101. package/src/utils/sourceEditor.ts +46 -0
  102. package/src/utils/watchDiffSummary.ts +159 -0
@@ -1,9 +1,125 @@
1
- import type { Connector, DependencyConnector, DependencyElement, ElementPlacement, ExploreData, LibraryElement, PlacedElement, Tag, View, ViewConnector, ViewLayer, ViewPlacement, ViewTreeNode } from '../types';
1
+ import type { Connector, DependencyConnector, DependencyElement, ElementPlacement, ExploreData, LibraryElement, PlacedElement, Tag, View, ViewConnector, ViewLayer, ViewPlacement, ViewTreeNode, VisibilityOverride } from '../types';
2
2
  import { PlanElement, PlanConnector } from '@buf/tldiagramcom_diagram.bufbuild_es/diag/v1/workspace_service_pb';
3
3
  export interface DependenciesResponse {
4
4
  elements: DependencyElement[];
5
5
  connectors: DependencyConnector[];
6
+ totalCount?: number;
6
7
  }
8
+ export interface WatchRepository {
9
+ id: number;
10
+ remote_url: string | null;
11
+ repo_root: string;
12
+ display_name: string;
13
+ branch: string | null;
14
+ head_commit: string | null;
15
+ identity_status: string;
16
+ }
17
+ export interface WatchLock {
18
+ id: number;
19
+ repository_id: number;
20
+ pid: number;
21
+ started_at: string;
22
+ heartbeat_at: string;
23
+ status: 'active' | 'paused' | 'stopping' | 'stale' | 'released' | string;
24
+ }
25
+ export interface WatchStatus {
26
+ active: boolean;
27
+ repository?: WatchRepository;
28
+ lock?: WatchLock;
29
+ connected_clients?: number;
30
+ }
31
+ export interface WatchRepresentationSummary {
32
+ repository_id: number;
33
+ raw_graph_hash?: string;
34
+ filter_settings_hash?: string;
35
+ representation_hash?: string;
36
+ last_status?: string;
37
+ last_started_at?: string;
38
+ last_finished_at?: string;
39
+ elements_created: number;
40
+ elements_updated: number;
41
+ connectors_created: number;
42
+ connectors_updated: number;
43
+ views_created: number;
44
+ diffs?: WatchDiff[];
45
+ }
46
+ export interface WatchContextActionResponse {
47
+ repository_id: number;
48
+ action: 'show' | 'hide' | 'clean' | string;
49
+ policies_created: number;
50
+ policies_updated: number;
51
+ policies_deactivated: number;
52
+ owners_affected: number;
53
+ tier_before: number;
54
+ tier_after: number;
55
+ max_tier: number;
56
+ elements_added: number;
57
+ connectors_added: number;
58
+ views_added: number;
59
+ elements_removed: number;
60
+ connectors_removed: number;
61
+ views_removed: number;
62
+ representation: {
63
+ repository_id: number;
64
+ representation_run_id: number;
65
+ filter_run_id: number;
66
+ raw_graph_hash: string;
67
+ filter_settings_hash: string;
68
+ representation_hash: string;
69
+ };
70
+ summary: WatchRepresentationSummary;
71
+ }
72
+ export interface WatchEvent {
73
+ type: string;
74
+ repository_id?: number;
75
+ message?: string;
76
+ at: string;
77
+ data?: unknown;
78
+ phase?: string;
79
+ watcher_mode?: string;
80
+ languages?: string[];
81
+ changed_files?: number;
82
+ warnings?: string[];
83
+ }
84
+ export interface WatchVersion {
85
+ id: number;
86
+ repository_id: number;
87
+ commit_hash: string;
88
+ commit_message?: string;
89
+ parent_commit_hash?: string;
90
+ branch?: string;
91
+ representation_hash: string;
92
+ workspace_version_id?: number;
93
+ created_at: string;
94
+ }
95
+ export interface WatchDiff {
96
+ id: number;
97
+ version_id: number;
98
+ owner_type: string;
99
+ owner_key: string;
100
+ change_type: string;
101
+ before_hash?: string;
102
+ after_hash?: string;
103
+ resource_type?: string;
104
+ resource_id?: number;
105
+ language?: string;
106
+ summary?: string;
107
+ added_lines?: number;
108
+ removed_lines?: number;
109
+ }
110
+ export interface WorkspaceVersion {
111
+ id: string;
112
+ version_id: string;
113
+ source: string;
114
+ parent_version_id?: string;
115
+ view_count: number;
116
+ element_count: number;
117
+ connector_count: number;
118
+ description?: string;
119
+ workspace_hash?: string;
120
+ created_at: string;
121
+ }
122
+ export type SourceEditor = 'zed' | 'vscode';
7
123
  export declare const api: {
8
124
  system: {
9
125
  ready: () => Promise<{
@@ -32,12 +148,24 @@ export declare const api: {
32
148
  create: (data: Partial<LibraryElement>) => Promise<LibraryElement>;
33
149
  update: (id: number, data: Partial<LibraryElement>) => Promise<LibraryElement>;
34
150
  delete: (_orgId: string, id: number) => Promise<void>;
151
+ merge: (sourceId: number, survivorId: number, resolved: Partial<{
152
+ kind: string | null;
153
+ description: string | null;
154
+ repo: string | null;
155
+ branch: string | null;
156
+ file_path: string | null;
157
+ language: string | null;
158
+ }>) => Promise<{
159
+ survivor: LibraryElement;
160
+ deleted_id: number;
161
+ }>;
35
162
  placements: (id: number) => Promise<ViewPlacement[]>;
36
163
  };
37
164
  workspace: {
38
165
  orgs: {
39
166
  tagColors: {
40
- list: () => Promise<Tag[]>;
167
+ list: () => Promise<Record<string, Tag>>;
168
+ update: (name: string, color: string, description?: string | null) => Promise<void>;
41
169
  };
42
170
  };
43
171
  elements: {
@@ -75,6 +203,17 @@ export declare const api: {
75
203
  limit?: number;
76
204
  offset?: number;
77
205
  }) => Promise<ViewTreeNode[]>;
206
+ treeAround: (viewId: number, opts?: {
207
+ ancestorLevels?: number;
208
+ descendantLevels?: number;
209
+ }) => Promise<ViewTreeNode[]>;
210
+ gridData: () => Promise<{
211
+ views: ViewTreeNode[];
212
+ content: Record<number, {
213
+ placements: PlacedElement[];
214
+ connectors: Connector[];
215
+ }>;
216
+ }>;
78
217
  get: (id: number) => Promise<ViewTreeNode>;
79
218
  create: (data: {
80
219
  name: string;
@@ -87,6 +226,17 @@ export declare const api: {
87
226
  }) => Promise<View>;
88
227
  rename: (id: number, name: string) => Promise<View>;
89
228
  setLevel: (id: number, level: number) => Promise<void>;
229
+ density: {
230
+ get: (id: number) => Promise<number>;
231
+ set: (id: number, densityLevel: number) => Promise<number>;
232
+ };
233
+ visibilityOverrides: {
234
+ list: (id: number) => Promise<VisibilityOverride[]>;
235
+ set: (id: number, resourceType: VisibilityOverride["resource_type"], resourceId: number, levelDelta: number) => Promise<VisibilityOverride>;
236
+ promote: (id: number, resourceType: VisibilityOverride["resource_type"], resourceId: number) => Promise<VisibilityOverride>;
237
+ demote: (id: number, resourceType: VisibilityOverride["resource_type"], resourceId: number) => Promise<VisibilityOverride>;
238
+ reset: (id: number, resourceType: VisibilityOverride["resource_type"], resourceId: number) => Promise<void>;
239
+ };
90
240
  delete: (_orgId: string, id: number) => Promise<void>;
91
241
  thumbnail: (id: number) => Promise<string | null>;
92
242
  placements: {
@@ -136,7 +286,11 @@ export declare const api: {
136
286
  };
137
287
  };
138
288
  dependencies: {
139
- list: () => Promise<DependenciesResponse>;
289
+ list: (params?: {
290
+ limit?: number;
291
+ offset?: number;
292
+ search?: string;
293
+ }) => Promise<DependenciesResponse>;
140
294
  };
141
295
  explore: {
142
296
  load: () => Promise<ExploreData & {
@@ -160,4 +314,31 @@ export declare const api: {
160
314
  warnings: string[];
161
315
  }>;
162
316
  };
317
+ versions: {
318
+ list: (limit?: number) => Promise<WorkspaceVersion[]>;
319
+ };
320
+ watch: {
321
+ status: () => Promise<WatchStatus>;
322
+ websocketUrl: () => string;
323
+ repositories: () => Promise<WatchRepository[]>;
324
+ versions: (repositoryId: number) => Promise<WatchVersion[]>;
325
+ diffs: (versionId: number, filters?: {
326
+ owner_type?: string;
327
+ change_type?: string;
328
+ resource_type?: string;
329
+ language?: string;
330
+ }) => Promise<WatchDiff[]>;
331
+ cleanContext: (repositoryId: number, input: {
332
+ resource_type: "element" | "view";
333
+ resource_id: number;
334
+ }) => Promise<WatchContextActionResponse>;
335
+ };
336
+ editor: {
337
+ open: (input: {
338
+ editor: SourceEditor;
339
+ repo?: string | null;
340
+ file_path: string;
341
+ line?: number | null;
342
+ }) => Promise<void>;
343
+ };
163
344
  };
@@ -8,6 +8,10 @@ export interface ConnectorPanelProps extends ConnectorPanelSlots {
8
8
  onSave: (connector: Connector) => void;
9
9
  autoSave?: boolean;
10
10
  onDelete: (edgeId: number) => void;
11
+ visibilityOverrideDelta?: number;
12
+ onPromoteVisibility?: (id: number) => Promise<void> | void;
13
+ onDemoteVisibility?: (id: number) => Promise<void> | void;
14
+ onResetVisibility?: (id: number) => Promise<void> | void;
11
15
  hasBackdrop?: boolean;
12
16
  }
13
17
  /**
@@ -16,6 +20,6 @@ export interface ConnectorPanelProps extends ConnectorPanelSlots {
16
20
  * Location: Right side of the screen on desktop. Overlays screen on mobile.
17
21
  * Aliases: Connector Properties, Connector Details.
18
22
  */
19
- declare function ConnectorPanel({ isOpen, onClose, connector, orgId, onSave, autoSave, onDelete, hasBackdrop, connectorPanelAfterContentSlot }: ConnectorPanelProps): import("react/jsx-runtime").JSX.Element;
23
+ declare function ConnectorPanel({ isOpen, onClose, connector, orgId, onSave, autoSave, onDelete, visibilityOverrideDelta, onPromoteVisibility, onDemoteVisibility, onResetVisibility, hasBackdrop, connectorPanelAfterContentSlot }: ConnectorPanelProps): import("react/jsx-runtime").JSX.Element;
20
24
  declare const _default: import("react").MemoExoticComponent<typeof ConnectorPanel>;
21
25
  export default _default;
@@ -1,9 +1,10 @@
1
- import type { CrossBranchContextSettings } from '../crossBranch/types';
1
+ import type { CrossBranchConnectorPriority, CrossBranchContextSettings } from '../crossBranch/types';
2
2
  interface Props {
3
3
  settings: CrossBranchContextSettings;
4
4
  onEnabledChange: (enabled: boolean) => void;
5
- onDepthChange: (depth: number) => void;
5
+ onBudgetChange: (budget: number) => void;
6
+ onPriorityChange: (priority: CrossBranchConnectorPriority) => void;
6
7
  label?: string;
7
8
  }
8
- export default function CrossBranchControls({ settings, onEnabledChange, onDepthChange, label, }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export default function CrossBranchControls({ settings, onEnabledChange, onBudgetChange, onPriorityChange, label, }: Props): import("react/jsx-runtime").JSX.Element;
9
10
  export {};
@@ -39,6 +39,11 @@ interface NodeData extends PlacedElement {
39
39
  selected: boolean;
40
40
  }[];
41
41
  isConnectorHighlighted?: boolean;
42
+ versionChangeType?: 'added' | 'updated' | 'deleted' | 'initialized';
43
+ versionLineDelta?: {
44
+ added: number;
45
+ removed: number;
46
+ };
42
47
  }
43
48
  interface Props {
44
49
  data: NodeData;
@@ -8,6 +8,11 @@ export interface ElementPanelProps extends ElementPanelSlots {
8
8
  autoSave?: boolean;
9
9
  onDelete?: (id: number) => void;
10
10
  onPermanentDelete?: (id: number) => void;
11
+ onMerge?: (id: number) => void;
12
+ visibilityOverrideDelta?: number;
13
+ onPromoteVisibility?: (id: number) => Promise<void> | void;
14
+ onDemoteVisibility?: (id: number) => Promise<void> | void;
15
+ onResetVisibility?: (id: number) => Promise<void> | void;
11
16
  orgId?: string;
12
17
  links?: ViewConnector[];
13
18
  parentLinks?: ViewConnector[];
@@ -20,6 +25,6 @@ export interface ElementPanelProps extends ElementPanelSlots {
20
25
  * Location: Right side of the screen on desktop. Overlays screen on mobile.
21
26
  * Aliases: Element Properties, Element Details.
22
27
  */
23
- declare function ElementPanel({ isOpen, onClose, element, onSave, autoSave, onDelete, onPermanentDelete, orgId, links, parentLinks, hasBackdrop, availableTags, elementPanelAfterContentSlot }: ElementPanelProps): import("react/jsx-runtime").JSX.Element;
28
+ declare function ElementPanel({ isOpen, onClose, element, onSave, autoSave, onDelete, onPermanentDelete, onMerge, visibilityOverrideDelta, onPromoteVisibility, onDemoteVisibility, onResetVisibility, orgId, links, parentLinks, hasBackdrop, availableTags, elementPanelAfterContentSlot }: ElementPanelProps): import("react/jsx-runtime").JSX.Element;
24
29
  declare const _default: import("react").MemoExoticComponent<typeof ElementPanel>;
25
30
  export default _default;
@@ -2,6 +2,7 @@ import type { ViewTreeNode } from '../types';
2
2
  interface Props {
3
3
  view: ViewTreeNode | null;
4
4
  canEdit: boolean;
5
+ onUnsupportedMutation?: () => void;
5
6
  }
6
- export default function LayoutSection({ view, canEdit }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export default function LayoutSection({ view, canEdit, onUnsupportedMutation }: Props): import("react/jsx-runtime").JSX.Element;
7
8
  export {};
@@ -0,0 +1,16 @@
1
+ import type { LibraryElement } from '../types';
2
+ interface MergeDialogProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ source: LibraryElement | null;
6
+ onMerge: (survivorId: number, resolved: {
7
+ kind: string | null;
8
+ description: string | null;
9
+ repo: string | null;
10
+ branch: string | null;
11
+ file_path: string | null;
12
+ language: string | null;
13
+ }) => Promise<void>;
14
+ }
15
+ export default function MergeDialog({ isOpen, onClose, source, onMerge }: MergeDialogProps): import("react/jsx-runtime").JSX.Element | null;
16
+ export {};
@@ -1,5 +1,6 @@
1
1
  interface Props {
2
2
  isVisible: boolean;
3
+ onClose?: () => void;
3
4
  }
4
- export default function MiniZoomOnboarding({ isVisible }: Props): import("react/jsx-runtime").JSX.Element;
5
+ export default function MiniZoomOnboarding({ isVisible, onClose }: Props): import("react/jsx-runtime").JSX.Element;
5
6
  export {};
@@ -4,5 +4,7 @@ export interface ElementContainerProps extends BoxProps {
4
4
  isSource?: boolean;
5
5
  isTarget?: boolean;
6
6
  isConnectorHighlighted?: boolean;
7
+ hasStack?: boolean;
8
+ kind?: string | null;
7
9
  }
8
10
  export declare const ElementContainer: import("react").MemoExoticComponent<import("@chakra-ui/react").ComponentWithAs<"div", ElementContainerProps>>;
@@ -1,9 +1,12 @@
1
1
  import type { ProxyConnectorDetails } from '../crossBranch/types';
2
+ import type { Connector } from '../types';
2
3
  interface Props {
3
4
  isOpen: boolean;
4
5
  onClose: () => void;
5
6
  details: ProxyConnectorDetails | null;
6
7
  hasBackdrop?: boolean;
8
+ onEdit?: (connector: Connector) => void;
9
+ onDelete?: (connectorId: number, ownerViewId: number) => void;
7
10
  }
8
- export default function ProxyConnectorPanel({ isOpen, onClose, details, hasBackdrop, }: Props): import("react/jsx-runtime").JSX.Element;
11
+ export default function ProxyConnectorPanel({ isOpen, onClose, details, hasBackdrop, onEdit, onDelete, }: Props): import("react/jsx-runtime").JSX.Element;
9
12
  export {};
@@ -19,7 +19,7 @@ interface Props {
19
19
  tagColors: Record<string, Tag>;
20
20
  selectedElement?: LibraryElement | null;
21
21
  onUpdateTags?: (elementId: number, tags: string[]) => Promise<void>;
22
- onCreateTag: (tag: string, color?: string) => Promise<void>;
22
+ onCreateTag: (tag: string, color?: string, description?: string) => Promise<void>;
23
23
  layers: ViewLayer[];
24
24
  onHoverLayer: (tags: string[] | null, color?: string | null) => void;
25
25
  onCreateLayer: (name: string, tags: string[], color: string) => Promise<void>;
@@ -12,6 +12,11 @@ interface ViewFloatingMenuProps {
12
12
  onImport: () => void;
13
13
  onExport: () => void;
14
14
  onShare: () => void;
15
+ canUndo?: boolean;
16
+ canRedo?: boolean;
17
+ undoRedoDisabled?: boolean;
18
+ onUndo?: () => void;
19
+ onRedo?: () => void;
15
20
  isFreePlan: boolean;
16
21
  canUpgrade?: boolean;
17
22
  activeTags?: string[];
@@ -16,6 +16,13 @@ export interface ViewFloatingMenuProps extends ViewFloatingMenuSlots {
16
16
  onShare?: () => void;
17
17
  focusMode: boolean;
18
18
  onFocusModeChange: (enabled: boolean) => void;
19
+ densityLevel?: number;
20
+ onDensityLevelChange?: (level: number) => void;
21
+ canUndo?: boolean;
22
+ canRedo?: boolean;
23
+ undoRedoDisabled?: boolean;
24
+ onUndo?: () => void;
25
+ onRedo?: () => void;
19
26
  allTags: string[];
20
27
  layers: ViewLayer[];
21
28
  tagColors: Record<string, Tag>;
@@ -36,6 +43,6 @@ export interface ViewFloatingMenuProps extends ViewFloatingMenuSlots {
36
43
  * Location: Floating at the bottom center of the editor.
37
44
  * Aliases: Bottom bar, Action bar.
38
45
  */
39
- declare function ViewFloatingMenu({ handleAddElementAtCenter, drawingMode, setDrawingMode, hasDrawingPaths, drawingVisible, setDrawingVisible, extrasOpen, setExtrasOpen, disableImportExport, onImport, onExport, focusMode, onFocusModeChange, allTags, layers, tagColors, hiddenTags, toggleTagVisibility, toggleLayerVisibility, tagCounts, layerElementCounts, setHighlightedTags, setHighlightColor, shareSlot, toolbarSlot, hideFocusView, hideExpandExtras, }: ViewFloatingMenuProps): import("react/jsx-runtime").JSX.Element;
46
+ declare function ViewFloatingMenu({ handleAddElementAtCenter, drawingMode, setDrawingMode, hasDrawingPaths, drawingVisible, setDrawingVisible, extrasOpen, setExtrasOpen, disableImportExport, onImport, onExport, focusMode, onFocusModeChange, densityLevel, onDensityLevelChange, canUndo, canRedo, undoRedoDisabled, onUndo, onRedo, allTags, layers, tagColors, hiddenTags, toggleTagVisibility, toggleLayerVisibility, tagCounts, layerElementCounts, setHighlightedTags, setHighlightColor, shareSlot, toolbarSlot, hideFocusView, hideExpandExtras, }: ViewFloatingMenuProps): import("react/jsx-runtime").JSX.Element;
40
47
  declare const _default: React.MemoExoticComponent<typeof ViewFloatingMenu>;
41
48
  export default _default;
@@ -6,6 +6,9 @@ export interface ViewGridNodeData {
6
6
  nodes: number;
7
7
  edges: number;
8
8
  };
9
+ kind?: 'view' | 'cluster';
10
+ collapsedCount?: number;
11
+ dimmed?: boolean;
9
12
  focused: boolean;
10
13
  canEdit: boolean;
11
14
  isEditing: boolean;
@@ -5,6 +5,7 @@ interface Props {
5
5
  view: ViewTreeNode | null;
6
6
  canEdit?: boolean;
7
7
  onSave: (updated: ViewTreeNode) => void;
8
+ onUnsupportedMutation?: () => void;
8
9
  hasBackdrop?: boolean;
9
10
  }
10
11
  /**
@@ -13,6 +14,6 @@ interface Props {
13
14
  * Location: Right side of the screen on desktop. Overlays screen on mobile.
14
15
  * Aliases: View Properties, View Settings.
15
16
  */
16
- declare function ViewPanel({ isOpen, onClose, view, canEdit: canEditProp, onSave, hasBackdrop }: Props): import("react/jsx-runtime").JSX.Element;
17
+ declare function ViewPanel({ isOpen, onClose, view, canEdit: canEditProp, onSave, onUnsupportedMutation, hasBackdrop }: Props): import("react/jsx-runtime").JSX.Element;
17
18
  declare const _default: import("react").MemoExoticComponent<typeof ViewPanel>;
18
19
  export default _default;
@@ -0,0 +1,2 @@
1
+ export declare const WATCH_REPRESENTATION_UPDATED_EVENT = "tld:watch-representation-updated";
2
+ export default function WorkspacePanel(): import("react/jsx-runtime").JSX.Element;
@@ -1,8 +1,10 @@
1
1
  import type { ExploreData } from '../../types';
2
2
  import type { CrossBranchContextSettings } from '../../crossBranch/types';
3
+ import type { WorkspaceVersionFollowTarget, WorkspaceVersionPreview } from '../../context/WorkspaceVersionContext';
3
4
  export interface ZUICanvasHandle {
4
5
  fitView(): void;
5
6
  focusDiagram(viewId: number): boolean;
7
+ focusElement(viewId: number, elementId: number): boolean;
6
8
  setCameraFrame(frame: ZUICameraFrame): boolean;
7
9
  }
8
10
  export interface ZUICameraFrame {
@@ -14,9 +16,12 @@ interface Props {
14
16
  onReady?: () => void;
15
17
  onZoom?: () => void;
16
18
  onPan?: () => void;
19
+ initialCameraFrame?: ZUICameraFrame;
17
20
  highlightedTags?: string[];
18
21
  highlightColor?: string;
19
22
  hiddenTags?: string[];
23
+ versionPreview?: WorkspaceVersionPreview | null;
24
+ versionFollowTarget?: WorkspaceVersionFollowTarget | null;
20
25
  crossBranchSettings: CrossBranchContextSettings;
21
26
  hoverLocked?: boolean;
22
27
  }
@@ -0,0 +1,32 @@
1
+ import type { DiagramGroupLayout, LayoutNode, ZUIViewState } from './types';
2
+ interface Rect {
3
+ x: number;
4
+ y: number;
5
+ w: number;
6
+ h: number;
7
+ }
8
+ export interface ZUIFocusTarget {
9
+ id: string;
10
+ label: string;
11
+ type: 'group' | 'node';
12
+ isCircular?: boolean;
13
+ absX: number;
14
+ absY: number;
15
+ absW: number;
16
+ absH: number;
17
+ absScale: number;
18
+ node?: LayoutNode;
19
+ contentRect?: Rect;
20
+ }
21
+ export interface ZUIFocusViewportOptions {
22
+ preferContent?: boolean;
23
+ minTargetScreenW?: number;
24
+ minChildScreenW?: number;
25
+ keepParentVisible?: boolean;
26
+ }
27
+ export declare function findDiagramFocusTarget(groups: DiagramGroupLayout[], viewId: number): ZUIFocusTarget | null;
28
+ export declare function findElementFocusTarget(groups: DiagramGroupLayout[], viewId: number, elementId: number): ZUIFocusTarget | null;
29
+ export declare function viewportForFocusTarget(target: ZUIFocusTarget, canvasW: number, canvasH: number, maxZoom: number, padding: number, options?: ZUIFocusViewportOptions): ZUIViewState | null;
30
+ export declare function viewportForDiagramFocusTarget(target: ZUIFocusTarget, canvasW: number, canvasH: number, maxZoom: number, isMobileLayout: boolean): ZUIViewState | null;
31
+ export declare function viewportForElementFocusTarget(target: ZUIFocusTarget, canvasW: number, canvasH: number, maxZoom: number, isMobileLayout: boolean): ZUIViewState | null;
32
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,7 +1,7 @@
1
1
  import type { ZUILayout } from './types';
2
2
  import type { ExploreData } from '../../types';
3
- export declare const NODE_W = 200;
4
- export declare const NODE_H = 100;
3
+ export declare const NODE_W = 180;
4
+ export declare const NODE_H = 85;
5
5
  /**
6
6
  * Compute the full world-space layout for all diagrams in `data`.
7
7
  * Root diagrams are placed side-by-side horizontally.
@@ -1,4 +1,4 @@
1
- import { type ZUIResolvedConnector } from '../../crossBranch/resolve';
1
+ import { type ZUIHiddenProxyBadge, type ZUIViewportBounds, type ZUIProxyResolution, type ZUIResolvedConnector } from '../../crossBranch/resolve';
2
2
  import type { WorkspaceGraphSnapshot } from '../../crossBranch/types';
3
3
  import type { LayoutNode, ZUIViewState, HoveredItem } from './types';
4
4
  import { type ScreenRect } from './renderer';
@@ -20,6 +20,22 @@ export declare function collectVisibleNodeAnchors(groups: Array<{
20
20
  visibleAnchors: Map<number, VisibleNodeAnchor>;
21
21
  byNodeId: Map<string, VisibleNodeAnchor>;
22
22
  };
23
- export declare function buildVisibleProxyConnectors(snapshot: WorkspaceGraphSnapshot | null, visibleAnchors: Map<number, VisibleNodeAnchor>, settings: CrossBranchContextSettings): ZUIResolvedConnector[];
24
- export declare function drawVisibleProxyConnectors(ctx: CanvasRenderingContext2D, connectors: ZUIResolvedConnector[], visibleAnchorsByNodeId: Map<string, VisibleNodeAnchor>, zoom: number, labelBg: string, occupiedLabelRects: ScreenRect[]): void;
25
- export declare function findHoveredProxyConnector(worldX: number, worldY: number, connectors: ZUIResolvedConnector[], visibleAnchorsByNodeId: Map<string, VisibleNodeAnchor>, view: ZUIViewState): HoveredItem | null;
23
+ interface IndexedProxyConnector {
24
+ connector: ZUIResolvedConnector;
25
+ x1: number;
26
+ y1: number;
27
+ x2: number;
28
+ y2: number;
29
+ midX: number;
30
+ midY: number;
31
+ }
32
+ export interface ProxyConnectorSpatialIndex {
33
+ cellSize: number;
34
+ cells: Map<string, IndexedProxyConnector[]>;
35
+ }
36
+ export declare function buildProxyConnectorSpatialIndex(connectors: ZUIResolvedConnector[], visibleAnchorsByNodeId: Map<string, VisibleNodeAnchor>): ProxyConnectorSpatialIndex;
37
+ export declare function buildVisibleProxyConnectors(snapshot: WorkspaceGraphSnapshot | null, visibleAnchors: Map<number, VisibleNodeAnchor>, settings: CrossBranchContextSettings, viewport?: ZUIViewportBounds | null): ZUIProxyResolution;
38
+ export declare function drawVisibleProxyConnectors(ctx: CanvasRenderingContext2D, connectors: ZUIResolvedConnector[], visibleAnchorsByNodeId: Map<string, VisibleNodeAnchor>, zoom: number, labelBg: string, accent: string, occupiedLabelRects: ScreenRect[]): void;
39
+ export declare function drawVisibleDirectProxyBadges(ctx: CanvasRenderingContext2D, badges: ZUIHiddenProxyBadge[], visibleAnchorsByNodeId: Map<string, VisibleNodeAnchor>, zoom: number, labelBg: string, occupiedLabelRects: ScreenRect[]): void;
40
+ export declare function findHoveredProxyConnector(worldX: number, worldY: number, index: ProxyConnectorSpatialIndex, view: ZUIViewState): HoveredItem | null;
41
+ export {};
@@ -1,4 +1,4 @@
1
- import type { DiagramGroupLayout, ZUIViewState } from './types';
1
+ import type { DiagramGroupLayout, LayoutNode, ZUIViewState } from './types';
2
2
  export declare function getExpandThresholds(canvasW: number): {
3
3
  start: number;
4
4
  end: number;
@@ -13,6 +13,25 @@ export declare function setOnImageLoadCallback(cb: (() => void) | null): void;
13
13
  export declare function setHighlightedTags(tags: Set<string>): void;
14
14
  export declare function setHighlightColor(color: string): void;
15
15
  export declare function setHiddenTags(tags: Set<string>): void;
16
+ export declare function setVersionDiff(elementChanges: Map<number, string>, connectorChanges: Map<number, string>, elementLineDeltas?: Map<number, {
17
+ added: number;
18
+ removed: number;
19
+ }>): void;
20
+ export declare function viewOriginX(view: ZUIViewState): number;
21
+ export declare function viewOriginY(view: ZUIViewState): number;
22
+ export declare function worldToScreenX(worldX: number, view: ZUIViewState): number;
23
+ export declare function worldToScreenY(worldY: number, view: ZUIViewState): number;
24
+ export declare function screenToWorldX(screenX: number, view: ZUIViewState): number;
25
+ export declare function screenToWorldY(screenY: number, view: ZUIViewState): number;
26
+ export declare function rawCameraView(view: ZUIViewState): ZUIViewState;
27
+ export interface ZUITransitionRebase {
28
+ preserveChildAlphaNodeIds: Set<string>;
29
+ }
30
+ export declare function transitionT(screenW: number, start: number, end: number): number;
31
+ export declare function buildCameraTransitionRebase(groups: DiagramGroupLayout[], view: ZUIViewState, canvasW: number, canvasH: number, thresholds: {
32
+ start: number;
33
+ end: number;
34
+ }): ZUITransitionRebase;
16
35
  export declare function pickEdgeLabelPosition(matrix: DOMMatrix, midX: number, midY: number, textW: number, textH: number, dx: number, dy: number, occupiedLabelRects: ScreenRect[]): {
17
36
  x: number;
18
37
  y: number;
@@ -21,6 +40,20 @@ export declare function pickEdgeLabelPosition(matrix: DOMMatrix, midX: number, m
21
40
  export declare function isVisible(worldX: number, worldY: number, worldW: number, worldH: number, view: ZUIViewState, canvasW: number, canvasH: number): boolean;
22
41
  /** Is the rect (in world space) FULLY visible on screen? */
23
42
  export declare function isFullyVisible(worldX: number, worldY: number, worldW: number, worldH: number, view: ZUIViewState, canvasW: number, canvasH: number): boolean;
43
+ export interface ZUICameraRebase {
44
+ originX: number;
45
+ originY: number;
46
+ view: ZUIViewState;
47
+ }
48
+ export declare function getCameraRebase(view: ZUIViewState, canvasW: number, canvasH: number): ZUICameraRebase;
49
+ interface FocusedFlattenedLayer {
50
+ nodes: LayoutNode[];
51
+ view: ZUIViewState;
52
+ }
53
+ export declare function findFocusedFlattenedLayerForTest(groups: DiagramGroupLayout[], view: ZUIViewState, canvasW: number, canvasH: number, thresholds: {
54
+ start: number;
55
+ end: number;
56
+ }, rebase: ZUICameraRebase): FocusedFlattenedLayer | null;
24
57
  /**
25
58
  * Render a complete frame onto `ctx`.
26
59
  * Call this from a `requestAnimationFrame` loop.
@@ -28,3 +61,4 @@ export declare function isFullyVisible(worldX: number, worldY: number, worldW: n
28
61
  * `canvasW/canvasH` are CSS-pixel dimensions (the transform handles HiDPI).
29
62
  */
30
63
  export declare function renderFrame(ctx: CanvasRenderingContext2D, groups: DiagramGroupLayout[], view: ZUIViewState, canvasW: number, canvasH: number): ScreenRect[];
64
+ export {};
@@ -7,6 +7,10 @@ export interface ZUIViewState {
7
7
  y: number;
8
8
  /** Current zoom multiplier (1 = 1 world-pixel per screen-pixel). */
9
9
  zoom: number;
10
+ /** World-space X rendered at the local camera origin. Keeps x screen-sized at deep zoom. */
11
+ originX?: number;
12
+ /** World-space Y rendered at the local camera origin. Keeps y screen-sized at deep zoom. */
13
+ originY?: number;
10
14
  }
11
15
  /**
12
16
  * A node in the global world-space layout.
@@ -58,6 +62,7 @@ export interface LayoutNode {
58
62
  /** BBox minY used to align children to top-left of node. */
59
63
  childOffsetY: number;
60
64
  edgesOut: Array<{
65
+ id: number;
61
66
  /** LayoutNode id of the target. */
62
67
  targetId: string;
63
68
  label: string;
@@ -89,6 +94,7 @@ export interface DiagramGroupLayout {
89
94
  nodes: LayoutNode[];
90
95
  /** Edges whose both endpoints are in this diagram. */
91
96
  edges: Array<{
97
+ id: number;
92
98
  sourceId: string;
93
99
  targetId: string;
94
100
  label: string;
@@ -1,4 +1,5 @@
1
1
  import type { BBox, DiagramGroupLayout, ZUIViewState, HoveredItem } from './types';
2
+ export declare function constrainViewState(view: ZUIViewState, canvasW: number, canvasH: number, bbox: BBox): ZUIViewState;
2
3
  export declare function calculateMaxZoom(groups: DiagramGroupLayout[], canvasW: number): number;
3
4
  export interface ZUIInteraction {
4
5
  viewState: ZUIViewState;