@nvidia-elements/core 2.22.4 → 2.23.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/CHANGELOG.md +13 -0
- package/dist/accordion/accordion2.js +4 -4
- package/dist/alert/alert-group2.js +1 -1
- package/dist/alert/alert2.js +1 -1
- package/dist/avatar/avatar-group2.js +1 -1
- package/dist/avatar/avatar2.js +1 -1
- package/dist/badge/badge2.js +1 -1
- package/dist/breadcrumb/breadcrumb2.js +1 -1
- package/dist/bundle.d.ts +4 -0
- package/dist/bundles/index.d.ts +336 -0
- package/dist/bundles/index.js +14 -14
- package/dist/button/button2.js +1 -1
- package/dist/button-group/button-group2.js +1 -1
- package/dist/card/card2.js +4 -4
- package/dist/chat-message/chat-message2.js +1 -1
- package/dist/checkbox/checkbox-group2.js +1 -1
- package/dist/checkbox/checkbox2.js +1 -1
- package/dist/color/color2.js +6 -6
- package/dist/combobox/combobox2.js +1 -1
- package/dist/copy-button/copy-button2.js +1 -1
- package/dist/custom-elements-jsx.d.ts +189 -0
- package/dist/custom-elements-vue.d.ts +189 -0
- package/dist/custom-elements.json +6555 -0
- package/dist/data.html.json +133 -0
- package/dist/data.snippets.json +27 -27
- package/dist/date/date2.js +6 -6
- package/dist/datetime/datetime2.js +6 -6
- package/dist/dialog/dialog-footer2.js +1 -1
- package/dist/dialog/dialog-header2.js +1 -1
- package/dist/dialog/dialog2.js +1 -1
- package/dist/divider/divider2.js +1 -1
- package/dist/dot/dot2.js +1 -1
- package/dist/drag-handle/drag-handle2.js +1 -1
- package/dist/drawer/drawer-content2.js +1 -1
- package/dist/drawer/drawer-footer2.js +1 -1
- package/dist/drawer/drawer-header2.js +1 -1
- package/dist/drawer/drawer2.js +1 -1
- package/dist/dropdown/dropdown-footer2.js +1 -1
- package/dist/dropdown/dropdown-header2.js +1 -1
- package/dist/dropdown/dropdown2.js +1 -1
- package/dist/dropdown-group/dropdown-group.js +1 -1
- package/dist/dropzone/dropzone2.js +1 -1
- package/dist/file/file2.js +1 -1
- package/dist/format-bytes/format-bytes2.js +1 -1
- package/dist/format-datetime/format-datetime2.js +1 -1
- package/dist/format-number/format-number2.js +1 -1
- package/dist/format-relative-time/format-relative-time2.js +1 -1
- package/dist/format-truncate/format-truncate2.js +1 -1
- package/dist/forms/control/control2.js +1 -1
- package/dist/forms/control-group/control-group2.js +1 -1
- package/dist/forms/control-message/control-message2.js +1 -1
- package/dist/gauge/gauge2.js +1 -1
- package/dist/ghost/define.d.ts +6 -0
- package/dist/ghost/define.js +6 -0
- package/dist/ghost/define.js.map +1 -0
- package/dist/ghost/ghost.d.ts +27 -0
- package/dist/ghost/ghost.examples.js +5 -0
- package/dist/ghost/ghost.examples.js.map +1 -0
- package/dist/ghost/ghost.examples.json +37 -0
- package/dist/ghost/ghost.js +5 -0
- package/dist/ghost/ghost.js.map +1 -0
- package/dist/ghost/ghost2.js +28 -0
- package/dist/ghost/ghost2.js.map +1 -0
- package/dist/ghost/index.d.ts +1 -0
- package/dist/ghost/index.js +1 -0
- package/dist/grid/cell/cell2.js +1 -1
- package/dist/grid/column/column2.js +1 -1
- package/dist/grid/footer/footer2.js +1 -1
- package/dist/grid/grid2.js +1 -1
- package/dist/grid/header/header2.js +1 -1
- package/dist/grid/placeholder/placeholder2.js +1 -1
- package/dist/grid/row/row2.js +1 -1
- package/dist/icon/icon2.js +2 -2
- package/dist/icon-button/icon-button2.js +1 -1
- package/dist/iframe/iframe2.js +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group2.js +1 -1
- package/dist/input/input2.js +1 -1
- package/dist/internal/utils/a11y.js.map +1 -1
- package/dist/joystick/joystick2.js +5 -5
- package/dist/logo/logo2.js +1 -1
- package/dist/menu/menu-group2.js +1 -1
- package/dist/menu/menu-item2.js +1 -1
- package/dist/menu/menu2.js +1 -1
- package/dist/month/month2.js +6 -6
- package/dist/notification/notification-group2.js +1 -1
- package/dist/notification/notification2.js +1 -1
- package/dist/page/page-panel/page-panel-content2.js +1 -1
- package/dist/page/page-panel/page-panel-footer2.js +1 -1
- package/dist/page/page-panel/page-panel-header2.js +1 -1
- package/dist/page/page-panel/page-panel2.js +1 -1
- package/dist/page/page2.js +1 -1
- package/dist/page-header/page-header2.js +1 -1
- package/dist/page-loader/page-loader2.js +1 -1
- package/dist/pagination/pagination2.js +1 -1
- package/dist/panel/panel2.js +4 -4
- package/dist/password/password2.js +6 -6
- package/dist/polyfills/index.d.ts +4 -7
- package/dist/polyfills/index.js +0 -8
- package/dist/preferences-input/preferences-input2.js +5 -5
- package/dist/progress-bar/progress-bar2.js +1 -1
- package/dist/progress-dot/progress-dot2.js +1 -1
- package/dist/progress-ring/progress-ring2.js +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
- package/dist/pulse/pulse2.js +1 -1
- package/dist/radio/radio-group2.js +1 -1
- package/dist/radio/radio2.js +1 -1
- package/dist/range/range2.js +1 -1
- package/dist/resize-handle/resize-handle2.js +5 -5
- package/dist/search/search2.js +6 -6
- package/dist/select/select2.js +1 -1
- package/dist/select/select2.js.map +1 -1
- package/dist/skeleton/skeleton2.js +1 -1
- package/dist/sort-button/sort-button2.js +1 -1
- package/dist/sparkline/sparkline2.js +1 -1
- package/dist/star-rating/star-rating2.js +1 -1
- package/dist/steps/steps2.js +6 -6
- package/dist/switch/switch-group2.js +1 -1
- package/dist/switch/switch2.js +1 -1
- package/dist/tabs/tabs-group2.js +1 -1
- package/dist/tabs/tabs-item-group2.js +1 -1
- package/dist/tabs/tabs2.js +2 -2
- package/dist/tag/tag2.js +5 -5
- package/dist/textarea/textarea2.js +1 -1
- package/dist/time/time2.js +6 -6
- package/dist/toast/toast2.js +1 -1
- package/dist/toast/toast2.js.map +1 -1
- package/dist/toggletip/toggletip-footer2.js +1 -1
- package/dist/toggletip/toggletip-header2.js +1 -1
- package/dist/toggletip/toggletip2.js +1 -1
- package/dist/toolbar/toolbar2.js +1 -1
- package/dist/tooltip/tooltip2.js +1 -1
- package/dist/tree/tree-node2.js +1 -1
- package/dist/tree/tree2.js +1 -1
- package/dist/week/week2.js +6 -6
- package/dist/workspace/controllers/workspace-command.controller.d.ts +34 -0
- package/dist/workspace/controllers/workspace-command.controller.js +87 -0
- package/dist/workspace/controllers/workspace-command.controller.js.map +1 -0
- package/dist/workspace/controllers/workspace-composition.controller.d.ts +54 -0
- package/dist/workspace/controllers/workspace-composition.controller.js +169 -0
- package/dist/workspace/controllers/workspace-composition.controller.js.map +1 -0
- package/dist/workspace/controllers/workspace-fullscreen.controller.d.ts +25 -0
- package/dist/workspace/controllers/workspace-fullscreen.controller.js +84 -0
- package/dist/workspace/controllers/workspace-fullscreen.controller.js.map +1 -0
- package/dist/workspace/controllers/workspace-measurement.controller.d.ts +19 -0
- package/dist/workspace/controllers/workspace-measurement.controller.js +188 -0
- package/dist/workspace/controllers/workspace-measurement.controller.js.map +1 -0
- package/dist/workspace/controllers/workspace-rearrange.controller.d.ts +40 -0
- package/dist/workspace/controllers/workspace-rearrange.controller.js +385 -0
- package/dist/workspace/controllers/workspace-rearrange.controller.js.map +1 -0
- package/dist/workspace/controllers/workspace-resize.controller.d.ts +43 -0
- package/dist/workspace/controllers/workspace-resize.controller.js +168 -0
- package/dist/workspace/controllers/workspace-resize.controller.js.map +1 -0
- package/dist/workspace/controllers/workspace-restoration.controller.d.ts +24 -0
- package/dist/workspace/controllers/workspace-restoration.controller.js +193 -0
- package/dist/workspace/controllers/workspace-restoration.controller.js.map +1 -0
- package/dist/workspace/define.d.ts +10 -0
- package/dist/workspace/define.js +9 -0
- package/dist/workspace/define.js.map +1 -0
- package/dist/workspace/index.d.ts +8 -0
- package/dist/workspace/index.js +6 -0
- package/dist/workspace/panel/panel.d.ts +48 -0
- package/dist/workspace/panel/panel.js +5 -0
- package/dist/workspace/panel/panel.js.map +1 -0
- package/dist/workspace/panel/panel2.js +53 -0
- package/dist/workspace/panel/panel2.js.map +1 -0
- package/dist/workspace/panel-content/panel-content.d.ts +20 -0
- package/dist/workspace/panel-content/panel-content.js +5 -0
- package/dist/workspace/panel-content/panel-content.js.map +1 -0
- package/dist/workspace/panel-content/panel-content2.js +22 -0
- package/dist/workspace/panel-content/panel-content2.js.map +1 -0
- package/dist/workspace/panel-footer/panel-footer.d.ts +24 -0
- package/dist/workspace/panel-footer/panel-footer.js +5 -0
- package/dist/workspace/panel-footer/panel-footer.js.map +1 -0
- package/dist/workspace/panel-footer/panel-footer2.js +28 -0
- package/dist/workspace/panel-footer/panel-footer2.js.map +1 -0
- package/dist/workspace/panel-header/panel-header.d.ts +61 -0
- package/dist/workspace/panel-header/panel-header.js +5 -0
- package/dist/workspace/panel-header/panel-header.js.map +1 -0
- package/dist/workspace/panel-header/panel-header2.js +102 -0
- package/dist/workspace/panel-header/panel-header2.js.map +1 -0
- package/dist/workspace/utils/evaluation.utils.d.ts +83 -0
- package/dist/workspace/utils/evaluation.utils.js +294 -0
- package/dist/workspace/utils/evaluation.utils.js.map +1 -0
- package/dist/workspace/utils/geometry/allocation.utils.d.ts +40 -0
- package/dist/workspace/utils/geometry/allocation.utils.js +73 -0
- package/dist/workspace/utils/geometry/allocation.utils.js.map +1 -0
- package/dist/workspace/utils/geometry/partition.utils.d.ts +10 -0
- package/dist/workspace/utils/geometry/partition.utils.js +40 -0
- package/dist/workspace/utils/geometry/partition.utils.js.map +1 -0
- package/dist/workspace/utils/geometry/sizing.utils.d.ts +35 -0
- package/dist/workspace/utils/geometry/sizing.utils.js +42 -0
- package/dist/workspace/utils/geometry/sizing.utils.js.map +1 -0
- package/dist/workspace/utils/interaction/boundary.utils.d.ts +40 -0
- package/dist/workspace/utils/interaction/boundary.utils.js +91 -0
- package/dist/workspace/utils/interaction/boundary.utils.js.map +1 -0
- package/dist/workspace/utils/interaction/command.utils.d.ts +74 -0
- package/dist/workspace/utils/interaction/command.utils.js +189 -0
- package/dist/workspace/utils/interaction/command.utils.js.map +1 -0
- package/dist/workspace/utils/interaction/drag-preview.utils.d.ts +79 -0
- package/dist/workspace/utils/interaction/drag-preview.utils.js +16 -0
- package/dist/workspace/utils/interaction/drag-preview.utils.js.map +1 -0
- package/dist/workspace/utils/interaction/insertion-offers.utils.d.ts +58 -0
- package/dist/workspace/utils/interaction/insertion-offers.utils.js +259 -0
- package/dist/workspace/utils/interaction/insertion-offers.utils.js.map +1 -0
- package/dist/workspace/utils/interaction/placement-decision.utils.d.ts +55 -0
- package/dist/workspace/utils/interaction/placement-decision.utils.js +242 -0
- package/dist/workspace/utils/interaction/placement-decision.utils.js.map +1 -0
- package/dist/workspace/utils/interaction/resize-input.utils.d.ts +1 -0
- package/dist/workspace/utils/interaction/resize-input.utils.js +17 -0
- package/dist/workspace/utils/interaction/resize-input.utils.js.map +1 -0
- package/dist/workspace/utils/model/layout.utils.d.ts +22 -0
- package/dist/workspace/utils/model/layout.utils.js +41 -0
- package/dist/workspace/utils/model/layout.utils.js.map +1 -0
- package/dist/workspace/utils/model/membership.utils.d.ts +14 -0
- package/dist/workspace/utils/model/membership.utils.js +17 -0
- package/dist/workspace/utils/model/membership.utils.js.map +1 -0
- package/dist/workspace/utils/model/operations.utils.d.ts +31 -0
- package/dist/workspace/utils/model/operations.utils.js +178 -0
- package/dist/workspace/utils/model/operations.utils.js.map +1 -0
- package/dist/workspace/utils/model/projection.utils.d.ts +7 -0
- package/dist/workspace/utils/model/projection.utils.js +87 -0
- package/dist/workspace/utils/model/projection.utils.js.map +1 -0
- package/dist/workspace/utils/model/value.utils.d.ts +5 -0
- package/dist/workspace/utils/model/value.utils.js +68 -0
- package/dist/workspace/utils/model/value.utils.js.map +1 -0
- package/dist/workspace/utils/placement/acquisition-sizing.utils.d.ts +32 -0
- package/dist/workspace/utils/placement/acquisition-sizing.utils.js +152 -0
- package/dist/workspace/utils/placement/acquisition-sizing.utils.js.map +1 -0
- package/dist/workspace/utils/placement/context.utils.d.ts +36 -0
- package/dist/workspace/utils/placement/context.utils.js +135 -0
- package/dist/workspace/utils/placement/context.utils.js.map +1 -0
- package/dist/workspace/utils/placement/group-insertion.utils.d.ts +26 -0
- package/dist/workspace/utils/placement/group-insertion.utils.js +171 -0
- package/dist/workspace/utils/placement/group-insertion.utils.js.map +1 -0
- package/dist/workspace/utils/placement/origin.utils.d.ts +13 -0
- package/dist/workspace/utils/placement/origin.utils.js +49 -0
- package/dist/workspace/utils/placement/origin.utils.js.map +1 -0
- package/dist/workspace/utils/placement/planner.utils.d.ts +22 -0
- package/dist/workspace/utils/placement/planner.utils.js +184 -0
- package/dist/workspace/utils/placement/planner.utils.js.map +1 -0
- package/dist/workspace/utils/placement/preparation.utils.d.ts +28 -0
- package/dist/workspace/utils/placement/preparation.utils.js +140 -0
- package/dist/workspace/utils/placement/preparation.utils.js.map +1 -0
- package/dist/workspace/utils/placement/region.utils.d.ts +15 -0
- package/dist/workspace/utils/placement/region.utils.js +111 -0
- package/dist/workspace/utils/placement/region.utils.js.map +1 -0
- package/dist/workspace/utils/placement/split-sizing.utils.d.ts +18 -0
- package/dist/workspace/utils/placement/split-sizing.utils.js +108 -0
- package/dist/workspace/utils/placement/split-sizing.utils.js.map +1 -0
- package/dist/workspace/utils/presentation/composition.utils.d.ts +17 -0
- package/dist/workspace/utils/presentation/composition.utils.js +95 -0
- package/dist/workspace/utils/presentation/composition.utils.js.map +1 -0
- package/dist/workspace/utils/presentation/groups.utils.d.ts +91 -0
- package/dist/workspace/utils/presentation/groups.utils.js +169 -0
- package/dist/workspace/utils/presentation/groups.utils.js.map +1 -0
- package/dist/workspace/utils/presentation/header-configuration.utils.d.ts +11 -0
- package/dist/workspace/utils/presentation/header-configuration.utils.js +7 -0
- package/dist/workspace/utils/presentation/header-configuration.utils.js.map +1 -0
- package/dist/workspace/utils/presentation/measurements.utils.d.ts +21 -0
- package/dist/workspace/utils/presentation/measurements.utils.js +28 -0
- package/dist/workspace/utils/presentation/measurements.utils.js.map +1 -0
- package/dist/workspace/utils/presentation/offers.utils.d.ts +43 -0
- package/dist/workspace/utils/presentation/offers.utils.js +137 -0
- package/dist/workspace/utils/presentation/offers.utils.js.map +1 -0
- package/dist/workspace/utils/presentation/preview.utils.d.ts +6 -0
- package/dist/workspace/utils/presentation/preview.utils.js +36 -0
- package/dist/workspace/utils/presentation/preview.utils.js.map +1 -0
- package/dist/workspace/workspace.d.ts +103 -0
- package/dist/workspace/workspace.examples.js +5 -0
- package/dist/workspace/workspace.examples.js.map +1 -0
- package/dist/workspace/workspace.examples.json +133 -0
- package/dist/workspace/workspace.js +5 -0
- package/dist/workspace/workspace.js.map +1 -0
- package/dist/workspace/workspace.types.d.ts +3 -0
- package/dist/workspace/workspace2.js +518 -0
- package/dist/workspace/workspace2.js.map +1 -0
- package/package.json +26 -3
- package/dist/polyfills/index.js.map +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/workspace/utils/interaction/resize-input.utils.ts
|
|
2
|
+
var e = [
|
|
3
|
+
"ArrowLeft",
|
|
4
|
+
"ArrowRight",
|
|
5
|
+
"ArrowUp",
|
|
6
|
+
"ArrowDown",
|
|
7
|
+
"Home",
|
|
8
|
+
"End",
|
|
9
|
+
"PageUp",
|
|
10
|
+
"PageDown"
|
|
11
|
+
];
|
|
12
|
+
function t(t) {
|
|
13
|
+
return e.includes(t);
|
|
14
|
+
}
|
|
15
|
+
export { t as isResizeKey };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=resize-input.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resize-input.utils.js","names":["resizeKeys","isResizeKey","key"],"sources":["../../../../src/workspace/utils/interaction/resize-input.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nconst resizeKeys: readonly string[] = [\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n 'Home',\n 'End',\n 'PageUp',\n 'PageDown'\n];\n\nexport function isResizeKey(key: string): boolean {\n return resizeKeys.includes(key);\n}\n"],"mappings":";AAGA,IAAMA,IAAgC;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgBC,EAAY,GAAsB;CAChD,OAAOD,EAAW,SAASE,CAAG;AAChC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type WorkspaceNode = WorkspaceGroup | WorkspaceSplit;
|
|
2
|
+
export interface WorkspaceGroup {
|
|
3
|
+
type: 'group';
|
|
4
|
+
panels: string[];
|
|
5
|
+
active: string;
|
|
6
|
+
}
|
|
7
|
+
export interface WorkspaceSplit {
|
|
8
|
+
type: 'split';
|
|
9
|
+
axis: 'horizontal' | 'vertical';
|
|
10
|
+
weights: number[];
|
|
11
|
+
children: WorkspaceNode[];
|
|
12
|
+
}
|
|
13
|
+
export interface WorkspaceLayout {
|
|
14
|
+
version: 1;
|
|
15
|
+
root: WorkspaceNode | null;
|
|
16
|
+
closed: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function getPanelIds(node: WorkspaceNode | null): string[];
|
|
19
|
+
export declare function getSplitSide(axis: WorkspaceSplit['axis'], position: 'before' | 'after'): 'left' | 'right' | 'top' | 'bottom';
|
|
20
|
+
/** Converts consecutive splits on the same axis into siblings. */
|
|
21
|
+
export declare function normalizeLayout(node: WorkspaceNode): WorkspaceNode;
|
|
22
|
+
export declare function normalizeOwnedLayout(node: WorkspaceNode): WorkspaceNode;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// src/workspace/utils/model/layout.utils.ts
|
|
2
|
+
function e(t) {
|
|
3
|
+
return t ? t.type === "group" ? t.panels : t.children.flatMap(e) : [];
|
|
4
|
+
}
|
|
5
|
+
function t(e, t) {
|
|
6
|
+
return e === "horizontal" ? t === "before" ? "left" : "right" : t === "before" ? "top" : "bottom";
|
|
7
|
+
}
|
|
8
|
+
function n(e) {
|
|
9
|
+
return i(e, "copy");
|
|
10
|
+
}
|
|
11
|
+
function r(e) {
|
|
12
|
+
return i(e, "owned");
|
|
13
|
+
}
|
|
14
|
+
function i(e, t) {
|
|
15
|
+
if (e.type === "group") return t === "copy" ? {
|
|
16
|
+
...e,
|
|
17
|
+
panels: [...e.panels]
|
|
18
|
+
} : e;
|
|
19
|
+
let n = e.weights.reduce((e, t) => e + t, 0), r = [], a = t === "copy" ? [] : void 0;
|
|
20
|
+
e.children.forEach((o, s) => {
|
|
21
|
+
let c = i(o, t), l = e.weights[s] / n;
|
|
22
|
+
if (!(l > 0)) throw TypeError("Split proportions exceed the supported range");
|
|
23
|
+
if (c.type === "split" && c.axis === e.axis) {
|
|
24
|
+
let t = a ??= e.weights.slice(0, s), n = c.weights.reduce((e, t) => e + t, 0);
|
|
25
|
+
c.children.forEach((e, i) => {
|
|
26
|
+
r.push(e), t.push(l * c.weights[i] / n);
|
|
27
|
+
});
|
|
28
|
+
} else !a && l !== e.weights[s] && (a = e.weights.slice(0, s)), r.push(c), a?.push(l);
|
|
29
|
+
});
|
|
30
|
+
let o = a ?? e.weights;
|
|
31
|
+
if (!o.every((e) => Number.isFinite(e) && e > 0)) throw TypeError("Split proportions exceed the supported range");
|
|
32
|
+
return {
|
|
33
|
+
type: "split",
|
|
34
|
+
axis: e.axis,
|
|
35
|
+
children: r,
|
|
36
|
+
weights: o
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export { e as getPanelIds, t as getSplitSide, n as normalizeLayout, r as normalizeOwnedLayout };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=layout.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.utils.js","names":["getPanelIds","node","getSplitSide","axis","position","normalizeLayout","normalizeNode","normalizeOwnedLayout","ownership","total","a","b","children","weights","normalized","child","share","index","shares","sum","nested","normalizedWeights","weight"],"sources":["../../../../src/workspace/utils/model/layout.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nexport type WorkspaceNode = WorkspaceGroup | WorkspaceSplit;\n\nexport interface WorkspaceGroup {\n type: 'group';\n panels: string[];\n active: string;\n}\n\nexport interface WorkspaceSplit {\n type: 'split';\n axis: 'horizontal' | 'vertical';\n weights: number[];\n children: WorkspaceNode[];\n}\n\nexport interface WorkspaceLayout {\n version: 1;\n root: WorkspaceNode | null;\n closed: string[];\n}\n\nexport function getPanelIds(node: WorkspaceNode | null): string[] {\n if (!node) return [];\n return node.type === 'group' ? node.panels : node.children.flatMap(getPanelIds);\n}\n\nexport function getSplitSide(\n axis: WorkspaceSplit['axis'],\n position: 'before' | 'after'\n): 'left' | 'right' | 'top' | 'bottom' {\n if (axis === 'horizontal') return position === 'before' ? 'left' : 'right';\n return position === 'before' ? 'top' : 'bottom';\n}\n\n/** Converts consecutive splits on the same axis into siblings. */\nexport function normalizeLayout(node: WorkspaceNode): WorkspaceNode {\n return normalizeNode(node, 'copy');\n}\n\nexport function normalizeOwnedLayout(node: WorkspaceNode): WorkspaceNode {\n return normalizeNode(node, 'owned');\n}\n\nfunction normalizeNode(node: WorkspaceNode, ownership: 'copy' | 'owned'): WorkspaceNode {\n if (node.type === 'group') return ownership === 'copy' ? { ...node, panels: [...node.panels] } : node;\n const total = node.weights.reduce((a, b) => a + b, 0);\n const children: WorkspaceNode[] = [];\n let weights: number[] | undefined = ownership === 'copy' ? [] : undefined;\n node.children.forEach((child, index) => {\n const normalized = normalizeNode(child, ownership);\n const share = node.weights[index]! / total;\n if (!(share > 0)) throw new TypeError('Split proportions exceed the supported range');\n if (normalized.type === 'split' && normalized.axis === node.axis) {\n const shares = (weights ??= node.weights.slice(0, index));\n const sum = normalized.weights.reduce((a, b) => a + b, 0);\n normalized.children.forEach((nested, i) => {\n children.push(nested);\n shares.push((share * normalized.weights[i]!) / sum);\n });\n } else {\n if (!weights && share !== node.weights[index]) {\n weights = node.weights.slice(0, index);\n }\n children.push(normalized);\n weights?.push(share);\n }\n });\n const normalizedWeights = weights ?? node.weights;\n if (!normalizedWeights.every(weight => Number.isFinite(weight) && weight > 0))\n throw new TypeError('Split proportions exceed the supported range');\n return { type: 'split', axis: node.axis, children, weights: normalizedWeights };\n}\n"],"mappings":";AAwBA,SAAgBA,EAAY,GAAsC;CAEhE,OADKC,IACEA,EAAK,SAAS,UAAUA,EAAK,SAASA,EAAK,SAAS,QAAQD,CAAW,IAD5D,CAAC;AAErB;AAEA,SAAgBE,EACd,GACA,GACqC;CAErC,OADIC,MAAS,eAAqBC,MAAa,WAAW,SAAS,UAC5DA,MAAa,WAAW,QAAQ;AACzC;AAGA,SAAgBC,EAAgB,GAAoC;CAClE,OAAOC,EAAcL,GAAM,MAAM;AACnC;AAEA,SAAgBM,EAAqB,GAAoC;CACvE,OAAOD,EAAcL,GAAM,OAAO;AACpC;AAEA,SAASK,EAAc,GAAqB,GAA4C;CACtF,IAAIL,EAAK,SAAS,SAAS,OAAOO,MAAc,SAAS;EAAE,GAAGP;EAAM,QAAQ,CAAC,GAAGA,EAAK,MAAM;CAAE,IAAIA;CACjG,IAAMQ,IAAQR,EAAK,QAAQ,QAAQ,GAAG,MAAMS,IAAIC,GAAG,CAAC,GAC9CC,IAA4B,CAAC,GAC/BC,IAAgCL,MAAc,SAAS,CAAC,IAAI,KAAA;CAChE,EAAK,SAAS,SAAS,GAAO,MAAU;EACtC,IAAMM,IAAaR,EAAcS,GAAOP,CAAS,GAC3CQ,IAAQf,EAAK,QAAQgB,KAAUR;EACrC,IAAI,EAAEO,IAAQ,IAAI,MAAU,UAAU,8CAA8C;EACpF,IAAIF,EAAW,SAAS,WAAWA,EAAW,SAASb,EAAK,MAAM;GAChE,IAAMiB,IAAU,MAAYjB,EAAK,QAAQ,MAAM,GAAGgB,CAAK,GACjDE,IAAML,EAAW,QAAQ,QAAQ,GAAG,MAAMJ,IAAIC,GAAG,CAAC;GACxD,EAAW,SAAS,SAAS,GAAQ,MAAM;IAEzC,AADAC,EAAS,KAAKQ,CAAM,GACpBF,EAAO,KAAMF,IAAQF,EAAW,QAAQ,KAAOK,CAAG;GACpD,CAAC;EACH,OAKE,AAJI,CAACN,KAAWG,MAAUf,EAAK,QAAQgB,OACrC,IAAUhB,EAAK,QAAQ,MAAM,GAAGgB,CAAK,IAEvCL,EAAS,KAAKE,CAAU,GACxBD,GAAS,KAAKG,CAAK;CAEvB,CAAC;CACD,IAAMK,IAAoBR,KAAWZ,EAAK;CAC1C,IAAI,CAACoB,EAAkB,OAAM,MAAU,OAAO,SAASC,CAAM,KAAKA,IAAS,CAAC,GAC1E,MAAU,UAAU,8CAA8C;CACpE,OAAO;EAAE,MAAM;EAAS,MAAMrB,EAAK;EAAM;EAAU,SAASoB;CAAkB;AAChF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { WorkspacePlacementIntent } from '../interaction/command.utils.js';
|
|
2
|
+
import type { WorkspaceLayout, WorkspaceNode } from './layout.utils.js';
|
|
3
|
+
export declare function preservesGroupMembership(input: {
|
|
4
|
+
root: WorkspaceNode | null;
|
|
5
|
+
source: string[];
|
|
6
|
+
intent: WorkspacePlacementIntent;
|
|
7
|
+
}): boolean;
|
|
8
|
+
export declare function getWorkspacePanelSource(input: {
|
|
9
|
+
layout?: WorkspaceLayout;
|
|
10
|
+
anchor: string;
|
|
11
|
+
available: string[];
|
|
12
|
+
}): string[];
|
|
13
|
+
/** Maps a visible insertion neighbor to its original order, retaining dormant members. */
|
|
14
|
+
export declare function getTabInsertionIndex(preferred: string[], before: string | undefined): number;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { findGroup as e } from "./operations.utils.js";
|
|
2
|
+
// src/workspace/utils/model/membership.utils.ts
|
|
3
|
+
function t(t) {
|
|
4
|
+
let n = e(t.root, t.source[0]);
|
|
5
|
+
return !n || !t.source.length ? !1 : t.intent.kind === "tab" ? e(t.root, t.intent.destination.target) === n : n.panels.every((e) => t.source.includes(e));
|
|
6
|
+
}
|
|
7
|
+
function n(t) {
|
|
8
|
+
let n = e(t.layout?.root ?? null, t.anchor);
|
|
9
|
+
return n && n.panels.filter((e) => !t.layout?.closed.includes(e) && t.available.includes(e)).length === 1 ? [...n.panels] : [t.anchor];
|
|
10
|
+
}
|
|
11
|
+
function r(e, t) {
|
|
12
|
+
let n = t === void 0 ? e.length : e.indexOf(t);
|
|
13
|
+
return n < 0 ? e.length : n;
|
|
14
|
+
}
|
|
15
|
+
export { r as getTabInsertionIndex, n as getWorkspacePanelSource, t as preservesGroupMembership };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=membership.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.utils.js","names":["preservesGroupMembership","origin","findGroup","input","id","getWorkspacePanelSource","group","getTabInsertionIndex","index","before","preferred"],"sources":["../../../../src/workspace/utils/model/membership.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { findGroup } from './operations.utils.js';\n\nimport type { WorkspacePlacementIntent } from '../interaction/command.utils.js';\nimport type { WorkspaceLayout, WorkspaceNode } from './layout.utils.js';\n\nexport function preservesGroupMembership(input: {\n root: WorkspaceNode | null;\n source: string[];\n intent: WorkspacePlacementIntent;\n}): boolean {\n const origin = findGroup(input.root, input.source[0]);\n if (!origin || !input.source.length) return false;\n if (input.intent.kind === 'tab') return findGroup(input.root, input.intent.destination.target) === origin;\n return origin.panels.every(id => input.source.includes(id));\n}\n\nexport function getWorkspacePanelSource(input: {\n layout?: WorkspaceLayout;\n anchor: string;\n available: string[];\n}): string[] {\n const group = findGroup(input.layout?.root ?? null, input.anchor);\n return group &&\n group.panels.filter(id => !input.layout?.closed.includes(id) && input.available.includes(id)).length === 1\n ? [...group.panels]\n : [input.anchor];\n}\n\n/** Maps a visible insertion neighbor to its original order, retaining dormant members. */\nexport function getTabInsertionIndex(preferred: string[], before: string | undefined): number {\n const index = before === undefined ? preferred.length : preferred.indexOf(before);\n return index < 0 ? preferred.length : index;\n}\n"],"mappings":";;AAQA,SAAgBA,EAAyB,GAI7B;CACV,IAAMC,IAASC,EAAUC,EAAM,MAAMA,EAAM,OAAO,EAAE;CAGpD,OAFI,CAACF,KAAU,CAACE,EAAM,OAAO,SAAe,KACxCA,EAAM,OAAO,SAAS,QAAcD,EAAUC,EAAM,MAAMA,EAAM,OAAO,YAAY,MAAM,MAAMF,IAC5FA,EAAO,OAAO,OAAM,MAAME,EAAM,OAAO,SAASC,CAAE,CAAC;AAC5D;AAEA,SAAgBC,EAAwB,GAI3B;CACX,IAAMC,IAAQJ,EAAUC,EAAM,QAAQ,QAAQ,MAAMA,EAAM,MAAM;CAChE,OAAOG,KACLA,EAAM,OAAO,QAAO,MAAM,CAACH,EAAM,QAAQ,OAAO,SAASC,CAAE,KAAKD,EAAM,UAAU,SAASC,CAAE,CAAC,CAAC,CAAC,WAAW,IACvG,CAAC,GAAGE,EAAM,MAAM,IAChB,CAACH,EAAM,MAAM;AACnB;AAGA,SAAgBI,EAAqB,GAAqB,GAAoC;CAC5F,IAAMC,IAAQC,MAAW,KAAA,IAAYC,EAAU,SAASA,EAAU,QAAQD,CAAM;CAChF,OAAOD,IAAQ,IAAIE,EAAU,SAASF;AACxC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { WorkspaceGroup, WorkspaceLayout, WorkspaceNode } from './layout.utils.js';
|
|
2
|
+
export interface WorkspaceDestination {
|
|
3
|
+
target: string;
|
|
4
|
+
/** Region path in the visible projection of the current layout. */
|
|
5
|
+
region?: string;
|
|
6
|
+
position: 'tab' | 'left' | 'right' | 'top' | 'bottom';
|
|
7
|
+
index?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function findGroup(node: WorkspaceNode | null, id?: string): WorkspaceGroup | undefined;
|
|
10
|
+
export declare function isValidInsertionIndex(index: number | undefined): boolean;
|
|
11
|
+
/** Removes carried panels from the arrangement and closed list without changing the saved layout. */
|
|
12
|
+
export declare function createDetachedLayout(layout: WorkspaceLayout, source: string[]): WorkspaceLayout;
|
|
13
|
+
export declare function placePanels(input: {
|
|
14
|
+
layout: WorkspaceLayout;
|
|
15
|
+
source: string[];
|
|
16
|
+
destination: WorkspaceDestination;
|
|
17
|
+
splitWeights?: [number, number];
|
|
18
|
+
}): WorkspaceLayout | undefined;
|
|
19
|
+
/** Retains panel placement and active preference when closing. */
|
|
20
|
+
export declare function closePanel(layout: WorkspaceLayout, id: string): WorkspaceLayout | undefined;
|
|
21
|
+
export declare function openPanel(layout: WorkspaceLayout, id: string): WorkspaceLayout | undefined;
|
|
22
|
+
/** Retains saved panel positions when supplied panels change. */
|
|
23
|
+
export declare function reconcilePanels(layout: WorkspaceLayout, available: string[]): WorkspaceLayout;
|
|
24
|
+
/** Creates the visible arrangement while retaining the saved snapshot. */
|
|
25
|
+
export declare function projectLayout(layout: WorkspaceLayout, available: string[]): WorkspaceLayout;
|
|
26
|
+
export declare function selectPanel(layout: WorkspaceLayout, id: string): WorkspaceLayout | undefined;
|
|
27
|
+
export declare function getFullscreenWorkspaceLayout(layout: WorkspaceLayout, anchor: string | undefined): {
|
|
28
|
+
version: 1;
|
|
29
|
+
closed: string[];
|
|
30
|
+
root: WorkspaceGroup;
|
|
31
|
+
} | undefined;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { getPanelIds as e, normalizeLayout as t, normalizeOwnedLayout as n } from "./layout.utils.js";
|
|
2
|
+
import { sameSerializedWorkspaceLayout as r } from "./value.utils.js";
|
|
3
|
+
// src/workspace/utils/model/operations.utils.ts
|
|
4
|
+
function i(e, t) {
|
|
5
|
+
if (e) {
|
|
6
|
+
if (e.type === "group") return t === void 0 || e.panels.includes(t) ? e : void 0;
|
|
7
|
+
for (let n of e.children) {
|
|
8
|
+
let e = i(n, t);
|
|
9
|
+
if (e) return e;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function a(e, t) {
|
|
14
|
+
if (!e) return null;
|
|
15
|
+
if (e.type === "group") {
|
|
16
|
+
let n = t(e);
|
|
17
|
+
return n?.type !== "group" || n.panels !== e.panels ? n : {
|
|
18
|
+
...n,
|
|
19
|
+
panels: [...n.panels]
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
let r = [], i = [];
|
|
23
|
+
return e.children.forEach((n, o) => {
|
|
24
|
+
let s = a(n, t), c = e.weights[o];
|
|
25
|
+
s && c !== void 0 && (r.push(s), i.push(c));
|
|
26
|
+
}), r.length ? r.length === 1 ? r[0] ?? null : n({
|
|
27
|
+
type: "split",
|
|
28
|
+
axis: e.axis,
|
|
29
|
+
children: r,
|
|
30
|
+
weights: i
|
|
31
|
+
}) : null;
|
|
32
|
+
}
|
|
33
|
+
function o(e, t) {
|
|
34
|
+
let n = e.panels.filter(t), r = n[0];
|
|
35
|
+
return r === void 0 ? null : {
|
|
36
|
+
type: "group",
|
|
37
|
+
panels: n,
|
|
38
|
+
active: n.includes(e.active) ? e.active : r
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function s(e, t, n) {
|
|
42
|
+
if (!t.length) return e;
|
|
43
|
+
let r = i(e);
|
|
44
|
+
return r ? a(e, (e) => ({
|
|
45
|
+
...e,
|
|
46
|
+
panels: e === r ? [...e.panels, ...t] : [...e.panels],
|
|
47
|
+
active: e === r ? n ?? e.active : e.active
|
|
48
|
+
})) : {
|
|
49
|
+
type: "group",
|
|
50
|
+
panels: [...t],
|
|
51
|
+
active: n ?? t[0] ?? ""
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function c(e, t) {
|
|
55
|
+
return t.length === 1 || t.length === e.panels.length && t.every((t, n) => e.panels[n] === t);
|
|
56
|
+
}
|
|
57
|
+
function l(e) {
|
|
58
|
+
return e === void 0 || Number.isInteger(e) && e >= 0;
|
|
59
|
+
}
|
|
60
|
+
function u(e, t) {
|
|
61
|
+
let n = new Set(t);
|
|
62
|
+
return {
|
|
63
|
+
version: 1,
|
|
64
|
+
root: a(e.root, (e) => o(e, (e) => !n.has(e))),
|
|
65
|
+
closed: e.closed.filter((e) => !n.has(e))
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function d(e) {
|
|
69
|
+
let { layout: t, source: n, destination: r, splitWeights: i = [.5, .5] } = e;
|
|
70
|
+
if (r.region || !i.every((e) => Number.isFinite(e) && e > 0)) return;
|
|
71
|
+
let s = h(t, n, r);
|
|
72
|
+
if (!s) return;
|
|
73
|
+
let { sourceGroup: c, targetGroup: l } = s, u = n[0], d = new Set(n), g = l.panels.find((e) => !d.has(e));
|
|
74
|
+
if (!g) return t;
|
|
75
|
+
let _ = a(t.root, (e) => o(e, (e) => !d.has(e))), v = {
|
|
76
|
+
source: n,
|
|
77
|
+
destination: r,
|
|
78
|
+
sourceGroup: c,
|
|
79
|
+
targetGroup: l,
|
|
80
|
+
moving: {
|
|
81
|
+
type: "group",
|
|
82
|
+
panels: [...n],
|
|
83
|
+
active: n.includes(c.active) ? c.active : u
|
|
84
|
+
},
|
|
85
|
+
removed: d,
|
|
86
|
+
splitWeights: i
|
|
87
|
+
};
|
|
88
|
+
return m(t, a(_, (e) => e.panels.includes(g) ? r.position === "tab" ? f(e, v) : p(e, v) : {
|
|
89
|
+
...e,
|
|
90
|
+
panels: [...e.panels]
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
function f(e, { source: t, sourceGroup: n, targetGroup: r, moving: i, destination: a, removed: o }) {
|
|
94
|
+
let s = Math.min(a.index ?? r.panels.length, r.panels.length), c = s - r.panels.slice(0, s).filter((e) => o.has(e)).length, l = [...e.panels];
|
|
95
|
+
return l.splice(c, 0, ...t), {
|
|
96
|
+
type: "group",
|
|
97
|
+
panels: l,
|
|
98
|
+
active: n === r ? n.active : i.active
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function p(e, { moving: t, destination: n, splitWeights: r }) {
|
|
102
|
+
let i = n.position === "left" || n.position === "top";
|
|
103
|
+
return {
|
|
104
|
+
type: "split",
|
|
105
|
+
axis: n.position === "left" || n.position === "right" ? "horizontal" : "vertical",
|
|
106
|
+
weights: i ? [...r] : [...r].reverse(),
|
|
107
|
+
children: i ? [t, e] : [e, t]
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function m(e, n) {
|
|
111
|
+
let i = {
|
|
112
|
+
version: 1,
|
|
113
|
+
root: n ? t(n) : null,
|
|
114
|
+
closed: [...e.closed]
|
|
115
|
+
}, a = {
|
|
116
|
+
...e,
|
|
117
|
+
root: e.root ? t(e.root) : null
|
|
118
|
+
};
|
|
119
|
+
return r(i, a) ? e : i;
|
|
120
|
+
}
|
|
121
|
+
function h(e, t, n) {
|
|
122
|
+
let r = t[0];
|
|
123
|
+
if (r === void 0 || new Set(t).size !== t.length) return;
|
|
124
|
+
let a = i(e.root, r), o = i(e.root, n.target);
|
|
125
|
+
if (a && o && !(n.position !== "tab" && t.includes(n.target)) && c(a, t) && l(n.index)) return {
|
|
126
|
+
sourceGroup: a,
|
|
127
|
+
targetGroup: o
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function g(e, t) {
|
|
131
|
+
if (i(e.root, t) && !e.closed.includes(t)) return {
|
|
132
|
+
...e,
|
|
133
|
+
closed: [...e.closed, t]
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function _(e, t) {
|
|
137
|
+
if (e.closed.includes(t)) return {
|
|
138
|
+
...e,
|
|
139
|
+
closed: e.closed.filter((e) => e !== t)
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function v(t, n) {
|
|
143
|
+
let r = new Set(e(t.root)), i = n.filter((e) => !r.has(e) && (r.add(e), !0));
|
|
144
|
+
return i.length ? {
|
|
145
|
+
version: 1,
|
|
146
|
+
root: s(t.root, i),
|
|
147
|
+
closed: [...t.closed]
|
|
148
|
+
} : t;
|
|
149
|
+
}
|
|
150
|
+
function y(e, t) {
|
|
151
|
+
let n = new Set(t.filter((t) => !e.closed.includes(t)));
|
|
152
|
+
return {
|
|
153
|
+
version: 1,
|
|
154
|
+
root: a(e.root, (e) => o(e, (e) => n.has(e))),
|
|
155
|
+
closed: []
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function b(e, t) {
|
|
159
|
+
if (e.closed.includes(t) || !i(e.root, t)) return;
|
|
160
|
+
let n = a(e.root, (e) => e.panels.includes(t) ? {
|
|
161
|
+
...e,
|
|
162
|
+
active: t
|
|
163
|
+
} : e), o = {
|
|
164
|
+
...e,
|
|
165
|
+
root: n
|
|
166
|
+
};
|
|
167
|
+
return r(o, e) ? void 0 : o;
|
|
168
|
+
}
|
|
169
|
+
function x(e, t) {
|
|
170
|
+
let n = t ? i(e.root, t) : void 0;
|
|
171
|
+
return n ? {
|
|
172
|
+
...e,
|
|
173
|
+
root: n
|
|
174
|
+
} : void 0;
|
|
175
|
+
}
|
|
176
|
+
export { g as closePanel, u as createDetachedLayout, i as findGroup, x as getFullscreenWorkspaceLayout, l as isValidInsertionIndex, _ as openPanel, d as placePanels, y as projectLayout, v as reconcilePanels, b as selectPanel };
|
|
177
|
+
|
|
178
|
+
//# sourceMappingURL=operations.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.utils.js","names":["findGroup","node","id","child","group","mapGroups","mapped","visit","children","weights","weight","index","normalizeOwnedLayout","filterGroup","panels","keep","first","appendPanels","root","active","validSource","source","isValidInsertionIndex","createDetachedLayout","removed","layout","placePanels","input","destination","splitWeights","match","moveSource","target","targetGroup","stripped","context","sourceGroup","placedLayout","joinTargetGroup","splitTargetGroup","originalIndex","moving","before","result","normalizeLayout","normalized","sameSerializedWorkspaceLayout","closePanel","openPanel","panel","reconcilePanels","saved","getPanelIds","added","available","projectLayout","visible","selectPanel","next","getFullscreenWorkspaceLayout","anchor"],"sources":["../../../../src/workspace/utils/model/operations.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { getPanelIds, normalizeLayout, normalizeOwnedLayout } from './layout.utils.js';\nimport { sameSerializedWorkspaceLayout } from './value.utils.js';\n\nimport type { WorkspaceGroup, WorkspaceLayout, WorkspaceNode } from './layout.utils.js';\n\nexport interface WorkspaceDestination {\n target: string;\n /** Region path in the visible projection of the current layout. */\n region?: string;\n position: 'tab' | 'left' | 'right' | 'top' | 'bottom';\n index?: number;\n}\n\ninterface TargetGroupContext {\n source: string[];\n destination: WorkspaceDestination;\n sourceGroup: WorkspaceGroup;\n targetGroup: WorkspaceGroup;\n moving: WorkspaceGroup;\n removed: Set<string>;\n splitWeights: [number, number];\n}\n\nexport function findGroup(node: WorkspaceNode | null, id?: string): WorkspaceGroup | undefined {\n if (!node) return undefined;\n if (node.type === 'group') return id === undefined || node.panels.includes(id) ? node : undefined;\n for (const child of node.children) {\n const group = findGroup(child, id);\n if (group) return group;\n }\n return undefined;\n}\n\nfunction mapGroups(\n node: WorkspaceNode | null,\n visit: (group: WorkspaceGroup) => WorkspaceNode | null\n): WorkspaceNode | null {\n if (!node) return null;\n if (node.type === 'group') {\n const mapped = visit(node);\n if (mapped?.type !== 'group' || mapped.panels !== node.panels) return mapped;\n return { ...mapped, panels: [...mapped.panels] };\n }\n const children: WorkspaceNode[] = [];\n const weights: number[] = [];\n node.children.forEach((child, index) => {\n const mapped = mapGroups(child, visit);\n const weight = node.weights[index];\n if (mapped && weight !== undefined) {\n children.push(mapped);\n weights.push(weight);\n }\n });\n if (!children.length) return null;\n if (children.length === 1) return children[0] ?? null;\n return normalizeOwnedLayout({ type: 'split', axis: node.axis, children, weights });\n}\n\nfunction filterGroup(group: WorkspaceGroup, keep: (id: string) => boolean): WorkspaceGroup | null {\n const panels = group.panels.filter(keep);\n const first = panels[0];\n if (first === undefined) return null;\n return { type: 'group', panels, active: panels.includes(group.active) ? group.active : first };\n}\n\nfunction appendPanels(root: WorkspaceNode | null, panels: string[], active?: string): WorkspaceNode | null {\n if (!panels.length) return root;\n const first = findGroup(root);\n return first\n ? mapGroups(root, group => ({\n ...group,\n panels: group === first ? [...group.panels, ...panels] : [...group.panels],\n active: group === first ? (active ?? group.active) : group.active\n }))\n : { type: 'group', panels: [...panels], active: active ?? panels[0] ?? '' };\n}\n\nfunction validSource(group: WorkspaceGroup, source: string[]): boolean {\n return (\n source.length === 1 ||\n (source.length === group.panels.length && source.every((id, index) => group.panels[index] === id))\n );\n}\n\nexport function isValidInsertionIndex(index: number | undefined): boolean {\n return index === undefined || (Number.isInteger(index) && index >= 0);\n}\n\n/** Removes carried panels from the arrangement and closed list without changing the saved layout. */\nexport function createDetachedLayout(layout: WorkspaceLayout, source: string[]): WorkspaceLayout {\n const removed = new Set(source);\n return {\n version: 1,\n root: mapGroups(layout.root, group => filterGroup(group, id => !removed.has(id))),\n closed: layout.closed.filter(id => !removed.has(id))\n };\n}\n\nexport function placePanels(input: {\n layout: WorkspaceLayout;\n source: string[];\n destination: WorkspaceDestination;\n splitWeights?: [number, number];\n}): WorkspaceLayout | undefined {\n const { layout, source, destination, splitWeights = [0.5, 0.5] } = input;\n if (destination.region) return undefined;\n if (!splitWeights.every(weight => Number.isFinite(weight) && weight > 0)) return undefined;\n const match = moveSource(layout, source, destination);\n if (!match) return undefined;\n const { sourceGroup, targetGroup } = match;\n const first = source[0]!;\n const removed = new Set(source);\n const target = targetGroup.panels.find(id => !removed.has(id));\n if (!target) return layout;\n const stripped = mapGroups(layout.root, group => filterGroup(group, id => !removed.has(id)));\n const moving: WorkspaceGroup = {\n type: 'group',\n panels: [...source],\n active: source.includes(sourceGroup.active) ? sourceGroup.active : first\n };\n const context: TargetGroupContext = { source, destination, sourceGroup, targetGroup, moving, removed, splitWeights };\n const root = mapGroups(stripped, group => {\n if (!group.panels.includes(target)) return { ...group, panels: [...group.panels] };\n return destination.position === 'tab' ? joinTargetGroup(group, context) : splitTargetGroup(group, context);\n });\n return placedLayout(layout, root);\n}\n\nfunction joinTargetGroup(\n group: WorkspaceGroup,\n { source, sourceGroup, targetGroup, moving, destination, removed }: TargetGroupContext\n): WorkspaceGroup {\n const originalIndex = Math.min(destination.index ?? targetGroup.panels.length, targetGroup.panels.length);\n const index = originalIndex - targetGroup.panels.slice(0, originalIndex).filter(id => removed.has(id)).length;\n const panels = [...group.panels];\n panels.splice(index, 0, ...source);\n return { type: 'group', panels, active: sourceGroup === targetGroup ? sourceGroup.active : moving.active };\n}\n\nfunction splitTargetGroup(\n group: WorkspaceGroup,\n { moving, destination, splitWeights }: TargetGroupContext\n): WorkspaceNode {\n const before = destination.position === 'left' || destination.position === 'top';\n return {\n type: 'split',\n axis: destination.position === 'left' || destination.position === 'right' ? 'horizontal' : 'vertical',\n weights: before ? [...splitWeights] : [...splitWeights].reverse(),\n children: before ? [moving, group] : [group, moving]\n };\n}\n\nfunction placedLayout(layout: WorkspaceLayout, root: WorkspaceNode | null): WorkspaceLayout {\n const result: WorkspaceLayout = { version: 1, root: root ? normalizeLayout(root) : null, closed: [...layout.closed] };\n const normalized = { ...layout, root: layout.root ? normalizeLayout(layout.root) : null };\n return sameSerializedWorkspaceLayout(result, normalized) ? layout : result;\n}\n\nfunction moveSource(layout: WorkspaceLayout, source: string[], destination: WorkspaceDestination) {\n const first = source[0];\n if (first === undefined || new Set(source).size !== source.length) return undefined;\n const sourceGroup = findGroup(layout.root, first);\n const targetGroup = findGroup(layout.root, destination.target);\n if (!sourceGroup || !targetGroup) return undefined;\n if (destination.position !== 'tab' && source.includes(destination.target)) return undefined;\n if (!validSource(sourceGroup, source) || !isValidInsertionIndex(destination.index)) return undefined;\n return { sourceGroup, targetGroup };\n}\n\n/** Retains panel placement and active preference when closing. */\nexport function closePanel(layout: WorkspaceLayout, id: string): WorkspaceLayout | undefined {\n if (!findGroup(layout.root, id) || layout.closed.includes(id)) return undefined;\n return { ...layout, closed: [...layout.closed, id] };\n}\n\nexport function openPanel(layout: WorkspaceLayout, id: string): WorkspaceLayout | undefined {\n if (!layout.closed.includes(id)) return undefined;\n return { ...layout, closed: layout.closed.filter(panel => panel !== id) };\n}\n\n/** Retains saved panel positions when supplied panels change. */\nexport function reconcilePanels(layout: WorkspaceLayout, available: string[]): WorkspaceLayout {\n const saved = new Set(getPanelIds(layout.root));\n const added = available.filter(id => {\n if (saved.has(id)) return false;\n saved.add(id);\n return true;\n });\n return added.length ? { version: 1, root: appendPanels(layout.root, added), closed: [...layout.closed] } : layout;\n}\n\n/** Creates the visible arrangement while retaining the saved snapshot. */\nexport function projectLayout(layout: WorkspaceLayout, available: string[]): WorkspaceLayout {\n const visible = new Set(available.filter(id => !layout.closed.includes(id)));\n return {\n version: 1,\n root: mapGroups(layout.root, group => filterGroup(group, id => visible.has(id))),\n closed: []\n };\n}\n\nexport function selectPanel(layout: WorkspaceLayout, id: string): WorkspaceLayout | undefined {\n if (layout.closed.includes(id) || !findGroup(layout.root, id)) return undefined;\n const root = mapGroups(layout.root, group => (group.panels.includes(id) ? { ...group, active: id } : group));\n const next = { ...layout, root };\n return sameSerializedWorkspaceLayout(next, layout) ? undefined : next;\n}\n\nexport function getFullscreenWorkspaceLayout(layout: WorkspaceLayout, anchor: string | undefined) {\n const group = anchor ? findGroup(layout.root, anchor) : undefined;\n return group ? { ...layout, root: group } : undefined;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { WorkspaceLayout, WorkspaceNode, WorkspaceSplit } from './layout.utils.js';
|
|
2
|
+
export type WorkspaceLayoutProjector = (layout: WorkspaceLayout, available: string[]) => WorkspaceLayout;
|
|
3
|
+
export declare function createWorkspaceLayoutProjector(): WorkspaceLayoutProjector;
|
|
4
|
+
export declare function getProjectionSignature(node: WorkspaceNode | null): string;
|
|
5
|
+
export declare function findDeepestProjectionCarrier(node: WorkspaceNode | null, expected: string, project: (node: WorkspaceNode) => WorkspaceNode | null): WorkspaceNode | undefined;
|
|
6
|
+
/** Saves visible split proportions while preserving the shares of missing panels. */
|
|
7
|
+
export declare function rebaseProjectedSplit(layout: WorkspaceLayout, renderedBranch: WorkspaceSplit, sizes: number[], available: string[], projectLayoutForCandidate?: WorkspaceLayoutProjector): WorkspaceLayout | undefined;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { getPanelIds as e } from "./layout.utils.js";
|
|
2
|
+
import { projectLayout as t } from "./operations.utils.js";
|
|
3
|
+
// src/workspace/utils/model/projection.utils.ts
|
|
4
|
+
function n() {
|
|
5
|
+
let e = [];
|
|
6
|
+
return (n, r) => {
|
|
7
|
+
let i = e.find((e) => o(e.available, r) && o(e.closed, n.closed));
|
|
8
|
+
i || (i = {
|
|
9
|
+
available: r,
|
|
10
|
+
closed: n.closed,
|
|
11
|
+
roots: /* @__PURE__ */ new Map()
|
|
12
|
+
}, e.push(i));
|
|
13
|
+
let a = i.roots.get(n.root);
|
|
14
|
+
return a || (a = t(n, r), i.roots.set(n.root, a)), a;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function r(e) {
|
|
18
|
+
return e ? e.type === "group" ? JSON.stringify(e.panels) : JSON.stringify([e.axis, e.children.map(r)]) : "null";
|
|
19
|
+
}
|
|
20
|
+
function i(e, t, n) {
|
|
21
|
+
if (e) {
|
|
22
|
+
if (e.type === "split") for (let r of e.children) {
|
|
23
|
+
let e = i(r, t, n);
|
|
24
|
+
if (e) return e;
|
|
25
|
+
}
|
|
26
|
+
return r(n(e)) === t ? e : void 0;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function a(n, i, a, o, u) {
|
|
30
|
+
if (!n.root || !c(i, a)) return;
|
|
31
|
+
let d = o.filter((e) => !n.closed.includes(e)), f = /* @__PURE__ */ new Map(), p = (e) => (f.has(e) || f.set(e, (u ?? t)({
|
|
32
|
+
version: 1,
|
|
33
|
+
root: e,
|
|
34
|
+
closed: []
|
|
35
|
+
}, d).root), f.get(e) ?? null), m = r(i), h = new Set(i.children.map(r)), g = /* @__PURE__ */ new Map();
|
|
36
|
+
i.children.forEach((t, n) => {
|
|
37
|
+
e(t).forEach((e) => g.set(e, n));
|
|
38
|
+
});
|
|
39
|
+
let _ = (t) => [...new Set(e(p(t)).flatMap((e) => {
|
|
40
|
+
let t = g.get(e);
|
|
41
|
+
return t === void 0 ? [] : [t];
|
|
42
|
+
}))].reduce((e, t) => e + (a[t] ?? 0), 0), v = (e) => {
|
|
43
|
+
if (e.type === "group" || h.has(r(p(e)))) return e;
|
|
44
|
+
let t = e.children.map((e) => v(e)), n = l(e, _, i.axis);
|
|
45
|
+
return n === e.weights && t.every((t, n) => t === e.children[n]) ? e : {
|
|
46
|
+
...e,
|
|
47
|
+
weights: n,
|
|
48
|
+
children: t
|
|
49
|
+
};
|
|
50
|
+
}, y = s(n.root, (e) => r(p(e)) === m, v);
|
|
51
|
+
return y === n.root ? void 0 : {
|
|
52
|
+
version: 1,
|
|
53
|
+
root: y,
|
|
54
|
+
closed: [...n.closed]
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function o(e, t) {
|
|
58
|
+
return e === t || e.length === t.length && e.every((e, n) => e === t[n]);
|
|
59
|
+
}
|
|
60
|
+
function s(e, t, n) {
|
|
61
|
+
if (t(e)) return n(e);
|
|
62
|
+
if (e.type === "group") return e;
|
|
63
|
+
let r = e.children.map((e) => s(e, t, n));
|
|
64
|
+
return r.some((t, n) => t !== e.children[n]) ? {
|
|
65
|
+
...e,
|
|
66
|
+
children: r
|
|
67
|
+
} : e;
|
|
68
|
+
}
|
|
69
|
+
function c(e, t) {
|
|
70
|
+
return t.length === e.children.length && t.every((e) => Number.isFinite(e) && e > 0) && Number.isFinite(t.reduce((e, t) => e + t, 0));
|
|
71
|
+
}
|
|
72
|
+
function l(e, t, n) {
|
|
73
|
+
if (e.axis !== n) return e.weights;
|
|
74
|
+
let r = e.children.map(t), i = r.reduce((e, t) => e + t, 0);
|
|
75
|
+
if (!i) return e.weights;
|
|
76
|
+
let a = e.weights.reduce((e, t, n) => e + ((r[n] ?? 0) > 0 ? t : 0), 0), o = e.weights.map((e, t) => {
|
|
77
|
+
let n = r[t] ?? 0;
|
|
78
|
+
return n > 0 ? n / i * a : e;
|
|
79
|
+
});
|
|
80
|
+
return o.every((t, n) => {
|
|
81
|
+
let r = e.weights[n] ?? 0;
|
|
82
|
+
return Math.abs(t - r) <= 1e-12 * Math.max(t, r);
|
|
83
|
+
}) ? e.weights : o;
|
|
84
|
+
}
|
|
85
|
+
export { n as createWorkspaceLayoutProjector, i as findDeepestProjectionCarrier, r as getProjectionSignature, a as rebaseProjectedSplit };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=projection.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.utils.js","names":["createWorkspaceLayoutProjector","domains","domain","sameIds","entry","available","layout","projectedLayout","projectLayout","getProjectionSignature","node","findDeepestProjectionCarrier","child","found","expected","project","rebaseProjectedSplit","validSplitSizes","renderedBranch","sizes","visible","id","projections","projectLayoutForCandidate","renderedSignature","childSignatures","allocations","index","mass","getPanelIds","group","sum","rebase","children","weights","rebaseWeights","root","replaceBranch","left","right","matches","branch","size","axis","masses","totalMass","value","visibleShare","weight","childMass","previous"],"sources":["../../../../src/workspace/utils/model/projection.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { getPanelIds } from './layout.utils.js';\nimport { projectLayout } from './operations.utils.js';\n\nimport type { WorkspaceLayout, WorkspaceNode, WorkspaceSplit } from './layout.utils.js';\nexport type WorkspaceLayoutProjector = (layout: WorkspaceLayout, available: string[]) => WorkspaceLayout;\n\nexport function createWorkspaceLayoutProjector(): WorkspaceLayoutProjector {\n const domains: {\n available: string[];\n closed: string[];\n roots: Map<WorkspaceNode | null, WorkspaceLayout>;\n }[] = [];\n return (layout, available) => {\n let domain = domains.find(entry => sameIds(entry.available, available) && sameIds(entry.closed, layout.closed));\n if (!domain) {\n domain = { available, closed: layout.closed, roots: new Map() };\n domains.push(domain);\n }\n let projectedLayout = domain.roots.get(layout.root);\n if (!projectedLayout) {\n projectedLayout = projectLayout(layout, available);\n domain.roots.set(layout.root, projectedLayout);\n }\n return projectedLayout;\n };\n}\n\nexport function getProjectionSignature(node: WorkspaceNode | null): string {\n if (!node) return 'null';\n return node.type === 'group'\n ? JSON.stringify(node.panels)\n : JSON.stringify([node.axis, node.children.map(getProjectionSignature)]);\n}\n\nexport function findDeepestProjectionCarrier(\n node: WorkspaceNode | null,\n expected: string,\n project: (node: WorkspaceNode) => WorkspaceNode | null\n): WorkspaceNode | undefined {\n if (!node) return undefined;\n if (node.type === 'split') {\n for (const child of node.children) {\n const found = findDeepestProjectionCarrier(child, expected, project);\n if (found) return found;\n }\n }\n return getProjectionSignature(project(node)) === expected ? node : undefined;\n}\n\n/** Saves visible split proportions while preserving the shares of missing panels. */\n// eslint-disable-next-line max-params -- The operation accepts saved and rendered arrangements with scoped projection.\nexport function rebaseProjectedSplit(\n layout: WorkspaceLayout,\n renderedBranch: WorkspaceSplit,\n sizes: number[],\n available: string[],\n projectLayoutForCandidate?: WorkspaceLayoutProjector\n): WorkspaceLayout | undefined {\n if (!layout.root || !validSplitSizes(renderedBranch, sizes)) return undefined;\n\n const visible = available.filter(id => !layout.closed.includes(id));\n const projections = new Map<WorkspaceNode, WorkspaceNode | null>();\n const project = (node: WorkspaceNode): WorkspaceNode | null => {\n if (!projections.has(node)) {\n projections.set(\n node,\n (projectLayoutForCandidate ?? projectLayout)({ version: 1, root: node, closed: [] }, visible).root\n );\n }\n return projections.get(node) ?? null;\n };\n const renderedSignature = getProjectionSignature(renderedBranch);\n const childSignatures = new Set(renderedBranch.children.map(getProjectionSignature));\n const allocations = new Map<string, number>();\n renderedBranch.children.forEach((child, index) => {\n getPanelIds(child).forEach(id => allocations.set(id, index));\n });\n const mass = (node: WorkspaceNode): number => {\n const groups = new Set(\n getPanelIds(project(node)).flatMap(id => {\n const group = allocations.get(id);\n return group === undefined ? [] : [group];\n })\n );\n return [...groups].reduce((sum, group) => sum + (sizes[group] ?? 0), 0);\n };\n const rebase = (node: WorkspaceNode): WorkspaceNode => {\n if (node.type === 'group' || childSignatures.has(getProjectionSignature(project(node)))) return node;\n const children = node.children.map(child => rebase(child));\n const weights = rebaseWeights(node, mass, renderedBranch.axis);\n if (weights === node.weights && children.every((child, index) => child === node.children[index])) return node;\n return { ...node, weights, children };\n };\n const root = replaceBranch(layout.root, node => getProjectionSignature(project(node)) === renderedSignature, rebase);\n return root === layout.root ? undefined : { version: 1, root, closed: [...layout.closed] };\n}\n\nfunction sameIds(left: string[], right: string[]) {\n return left === right || (left.length === right.length && left.every((id, index) => id === right[index]));\n}\n\nfunction replaceBranch(\n node: WorkspaceNode,\n matches: (node: WorkspaceNode) => boolean,\n rebase: (node: WorkspaceNode) => WorkspaceNode\n): WorkspaceNode {\n if (matches(node)) return rebase(node);\n if (node.type === 'group') return node;\n const children = node.children.map(child => replaceBranch(child, matches, rebase));\n return children.some((child, index) => child !== node.children[index]) ? { ...node, children } : node;\n}\n\nfunction validSplitSizes(branch: WorkspaceSplit, sizes: number[]) {\n return (\n sizes.length === branch.children.length &&\n sizes.every(size => Number.isFinite(size) && size > 0) &&\n Number.isFinite(sizes.reduce((sum, size) => sum + size, 0))\n );\n}\n\nfunction rebaseWeights(\n node: WorkspaceSplit,\n mass: (node: WorkspaceNode) => number,\n axis: WorkspaceSplit['axis']\n): number[] {\n if (node.axis !== axis) return node.weights;\n const masses = node.children.map(mass);\n const totalMass = masses.reduce((sum, value) => sum + value, 0);\n if (!totalMass) return node.weights;\n const visibleShare = node.weights.reduce((sum, weight, index) => sum + ((masses[index] ?? 0) > 0 ? weight : 0), 0);\n const weights = node.weights.map((weight, index) => {\n const childMass = masses[index] ?? 0;\n return childMass > 0 ? visibleShare * (childMass / totalMass) : weight;\n });\n return weights.every((weight, index) => {\n const previous = node.weights[index] ?? 0;\n return Math.abs(weight - previous) <= 1e-12 * Math.max(weight, previous);\n })\n ? node.weights\n : weights;\n}\n"],"mappings":";;;AASA,SAAgBA,IAA2D;CACzE,IAAMC,IAIA,CAAC;CACP,QAAQ,GAAQ,MAAc;EAC5B,IAAIC,IAASD,EAAQ,MAAK,MAASE,EAAQC,EAAM,WAAWC,CAAS,KAAKF,EAAQC,EAAM,QAAQE,EAAO,MAAM,CAAC;EAC9G,AAAKJ,MACH,IAAS;GAAE;GAAW,QAAQI,EAAO;GAAQ,uBAAO,IAAI,IAAI;EAAE,GAC9DL,EAAQ,KAAKC,CAAM;EAErB,IAAIK,IAAkBL,EAAO,MAAM,IAAII,EAAO,IAAI;EAKlD,OAJKC,MACH,IAAkBC,EAAcF,GAAQD,CAAS,GACjDH,EAAO,MAAM,IAAII,EAAO,MAAMC,CAAe,IAExCA;CACT;AACF;AAEA,SAAgBE,EAAuB,GAAoC;CAEzE,OADKC,IACEA,EAAK,SAAS,UACjB,KAAK,UAAUA,EAAK,MAAM,IAC1B,KAAK,UAAU,CAACA,EAAK,MAAMA,EAAK,SAAS,IAAID,CAAsB,CAAC,CAAC,IAHvD;AAIpB;AAEA,SAAgBE,EACd,GACA,GACA,GAC2B;CAC3B,IAAKD,GACL;MAAIA,EAAK,SAAS,SAChB,KAAK,IAAME,KAASF,EAAK,UAAU;GACjC,IAAMG,IAAQF,EAA6BC,GAAOE,GAAUC,CAAO;GACnE,IAAIF,GAAO,OAAOA;EACpB;EAEF,OAAOJ,EAAuBM,EAAQL,CAAI,CAAC,MAAMI,IAAWJ,IAAO,KAAA;CAFjE;AAGJ;AAIA,SAAgBM,EACd,GACA,GACA,GACA,GACA,GAC6B;CAC7B,IAAI,CAACV,EAAO,QAAQ,CAACW,EAAgBC,GAAgBC,CAAK,GAAG;CAE7D,IAAMC,IAAUf,EAAU,QAAO,MAAM,CAACC,EAAO,OAAO,SAASe,CAAE,CAAC,GAC5DC,oBAAc,IAAI,IAAyC,GAC3DP,KAAW,OACVO,EAAY,IAAIZ,CAAI,KACvBY,EAAY,IACVZ,IACCa,KAA6Bf,EAAA,CAAe;EAAE,SAAS;EAAG,MAAME;EAAM,QAAQ,CAAC;CAAE,GAAGU,CAAO,CAAC,CAAC,IAChG,GAEKE,EAAY,IAAIZ,CAAI,KAAK,OAE5Bc,IAAoBf,EAAuBS,CAAc,GACzDO,IAAkB,IAAI,IAAIP,EAAe,SAAS,IAAIT,CAAsB,CAAC,GAC7EiB,oBAAc,IAAI,IAAoB;CAC5C,EAAe,SAAS,SAAS,GAAO,MAAU;EAChD,EAAYd,CAAK,CAAC,CAAC,SAAQ,MAAMc,EAAY,IAAIL,GAAIM,CAAK,CAAC;CAC7D,CAAC;CACD,IAAMC,KAAQ,MAOL,CAAC,GAAG,IANQ,IACjBC,EAAYd,EAAQL,CAAI,CAAC,CAAC,CAAC,SAAQ,MAAM;EACvC,IAAMoB,IAAQJ,EAAY,IAAIL,CAAE;EAChC,OAAOS,MAAU,KAAA,IAAY,CAAC,IAAI,CAACA,CAAK;CAC1C,CAAC,CAEQ,CAAM,CAAC,CAAC,QAAQ,GAAK,MAAUC,KAAOZ,EAAMW,MAAU,IAAI,CAAC,GAElEE,KAAU,MAAuC;EACrD,IAAItB,EAAK,SAAS,WAAWe,EAAgB,IAAIhB,EAAuBM,EAAQL,CAAI,CAAC,CAAC,GAAG,OAAOA;EAChG,IAAMuB,IAAWvB,EAAK,SAAS,KAAI,MAASsB,EAAOpB,CAAK,CAAC,GACnDsB,IAAUC,EAAczB,GAAMkB,GAAMV,EAAe,IAAI;EAE7D,OADIgB,MAAYxB,EAAK,WAAWuB,EAAS,OAAO,GAAO,MAAUrB,MAAUF,EAAK,SAASiB,EAAM,IAAUjB,IAClG;GAAE,GAAGA;GAAM;GAAS;EAAS;CACtC,GACM0B,IAAOC,EAAc/B,EAAO,OAAM,MAAQG,EAAuBM,EAAQL,CAAI,CAAC,MAAMc,GAAmBQ,CAAM;CACnH,OAAOI,MAAS9B,EAAO,OAAO,KAAA,IAAY;EAAE,SAAS;EAAG;EAAM,QAAQ,CAAC,GAAGA,EAAO,MAAM;CAAE;AAC3F;AAEA,SAASH,EAAQ,GAAgB,GAAiB;CAChD,OAAOmC,MAASC,KAAUD,EAAK,WAAWC,EAAM,UAAUD,EAAK,OAAO,GAAI,MAAUjB,MAAOkB,EAAMZ,EAAM;AACzG;AAEA,SAASU,EACP,GACA,GACA,GACe;CACf,IAAIG,EAAQ9B,CAAI,GAAG,OAAOsB,EAAOtB,CAAI;CACrC,IAAIA,EAAK,SAAS,SAAS,OAAOA;CAClC,IAAMuB,IAAWvB,EAAK,SAAS,KAAI,MAAS2B,EAAczB,GAAO4B,GAASR,CAAM,CAAC;CACjF,OAAOC,EAAS,MAAM,GAAO,MAAUrB,MAAUF,EAAK,SAASiB,EAAM,IAAI;EAAE,GAAGjB;EAAM;CAAS,IAAIA;AACnG;AAEA,SAASO,EAAgB,GAAwB,GAAiB;CAChE,OACEE,EAAM,WAAWsB,EAAO,SAAS,UACjCtB,EAAM,OAAM,MAAQ,OAAO,SAASuB,CAAI,KAAKA,IAAO,CAAC,KACrD,OAAO,SAASvB,EAAM,QAAQ,GAAK,MAASY,IAAMW,GAAM,CAAC,CAAC;AAE9D;AAEA,SAASP,EACP,GACA,GACA,GACU;CACV,IAAIzB,EAAK,SAASiC,GAAM,OAAOjC,EAAK;CACpC,IAAMkC,IAASlC,EAAK,SAAS,IAAIkB,CAAI,GAC/BiB,IAAYD,EAAO,QAAQ,GAAK,MAAUb,IAAMe,GAAO,CAAC;CAC9D,IAAI,CAACD,GAAW,OAAOnC,EAAK;CAC5B,IAAMqC,IAAerC,EAAK,QAAQ,QAAQ,GAAK,GAAQ,MAAUqB,MAAQa,EAAOjB,MAAU,KAAK,IAAIqB,IAAS,IAAI,CAAC,GAC3Gd,IAAUxB,EAAK,QAAQ,KAAK,GAAQ,MAAU;EAClD,IAAMuC,IAAYL,EAAOjB,MAAU;EACnC,OAAOsB,IAAY,IAAoBA,IAAYJ,IAA5BE,IAAyCC;CAClE,CAAC;CACD,OAAOd,EAAQ,OAAO,GAAQ,MAAU;EACtC,IAAMgB,IAAWxC,EAAK,QAAQiB,MAAU;EACxC,OAAO,KAAK,IAAIqB,IAASE,CAAQ,KAAK,QAAQ,KAAK,IAAIF,GAAQE,CAAQ;CACzE,CAAC,IACGxC,EAAK,UACLwB;AACN"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { WorkspaceLayout } from './layout.utils.js';
|
|
2
|
+
export declare function parseWorkspaceValue(value: string): WorkspaceLayout | undefined;
|
|
3
|
+
export declare function serializeWorkspaceValue(layout: WorkspaceLayout | undefined): string;
|
|
4
|
+
/** Compares serialized layout representations, including property order and supplied group fields. */
|
|
5
|
+
export declare function sameSerializedWorkspaceLayout(left: WorkspaceLayout | undefined, right: WorkspaceLayout | undefined): boolean;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { normalizeLayout as e } from "./layout.utils.js";
|
|
2
|
+
// src/workspace/utils/model/value.utils.ts
|
|
3
|
+
var t = [
|
|
4
|
+
"version",
|
|
5
|
+
"root",
|
|
6
|
+
"closed"
|
|
7
|
+
], n = [
|
|
8
|
+
"type",
|
|
9
|
+
"panels",
|
|
10
|
+
"active"
|
|
11
|
+
], r = [
|
|
12
|
+
"type",
|
|
13
|
+
"axis",
|
|
14
|
+
"children",
|
|
15
|
+
"weights"
|
|
16
|
+
];
|
|
17
|
+
function i(t) {
|
|
18
|
+
if (!t) return;
|
|
19
|
+
let n = JSON.parse(t), r = /* @__PURE__ */ new Set(), i = (e) => typeof e == "object" && !!e, a = (e) => i(e) ? e.type === "group" ? !Array.isArray(e.panels) || !e.panels.length || typeof e.active != "string" || !e.panels.includes(e.active) ? !1 : e.panels.every((e) => typeof e != "string" || !e || r.has(e) ? !1 : (r.add(e), !0)) : s(e) ? e.children.every((e) => a(e)) : !1 : !1;
|
|
20
|
+
if (!i(n) || n.version !== 1 || !(n.root === null || a(n.root)) || !Array.isArray(n.closed) || !n.closed.every((e) => typeof e == "string" && r.has(e)) || new Set(n.closed).size !== n.closed.length) throw TypeError("Invalid workspace arrangement");
|
|
21
|
+
return {
|
|
22
|
+
version: 1,
|
|
23
|
+
root: n.root === null ? null : e(n.root),
|
|
24
|
+
closed: [...n.closed]
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function a(e) {
|
|
28
|
+
return e ? JSON.stringify(e) : "";
|
|
29
|
+
}
|
|
30
|
+
function o(e, n) {
|
|
31
|
+
return e === n ? !0 : !e || !n ? !1 : !p(e, t) || !p(n, t) ? a(e) === a(n) : e.version === n.version && f(e.closed, n.closed) && c(e.root, n.root);
|
|
32
|
+
}
|
|
33
|
+
function s(e) {
|
|
34
|
+
return e.type !== "split" || !["horizontal", "vertical"].includes(String(e.axis)) || !Array.isArray(e.children) || e.children.length < 2 || !Array.isArray(e.weights) || e.weights.length !== e.children.length || !e.weights.every((e) => typeof e == "number" && Number.isFinite(e) && e > 0) ? !1 : Number.isFinite(e.weights.reduce((e, t) => e + t, 0));
|
|
35
|
+
}
|
|
36
|
+
function c(e, t) {
|
|
37
|
+
if (e === t) return !0;
|
|
38
|
+
if (!e || !t || e.type !== t.type) return !1;
|
|
39
|
+
let i = e.type === "group" ? n : r;
|
|
40
|
+
return !p(e, i) || !p(t, i) ? JSON.stringify(e) === JSON.stringify(t) : e.type === "group" ? l(e, t) : u(e, t);
|
|
41
|
+
}
|
|
42
|
+
function l(e, t) {
|
|
43
|
+
return t.type === "group" && e.active === t.active && f(e.panels, t.panels);
|
|
44
|
+
}
|
|
45
|
+
function u(e, t) {
|
|
46
|
+
return t.type === "split" && e.axis === t.axis && f(e.weights, t.weights) && d(e.children, t.children);
|
|
47
|
+
}
|
|
48
|
+
function d(e, t) {
|
|
49
|
+
if (e === t) return !0;
|
|
50
|
+
if (e.length !== t.length) return !1;
|
|
51
|
+
for (let n = 0; n < e.length; n++) if (!c(e[n], t[n])) return !1;
|
|
52
|
+
return !0;
|
|
53
|
+
}
|
|
54
|
+
function f(e, t) {
|
|
55
|
+
if (e === t) return !0;
|
|
56
|
+
if (e.length !== t.length) return !1;
|
|
57
|
+
for (let n = 0; n < e.length; n++) if (e[n] !== t[n]) return !1;
|
|
58
|
+
return !0;
|
|
59
|
+
}
|
|
60
|
+
function p(e, t) {
|
|
61
|
+
if ("toJSON" in e) return !1;
|
|
62
|
+
let n = 0;
|
|
63
|
+
for (let r in e) if (Object.hasOwn(e, r) && r !== t[n++]) return !1;
|
|
64
|
+
return n === t.length;
|
|
65
|
+
}
|
|
66
|
+
export { i as parseWorkspaceValue, o as sameSerializedWorkspaceLayout, a as serializeWorkspaceValue };
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=value.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value.utils.js","names":["layoutKeys","groupKeys","splitKeys","parseWorkspaceValue","value","data","ids","record","item","node","id","splitShape","child","normalizeLayout","serializeWorkspaceValue","layout","sameSerializedWorkspaceLayout","left","right","hasOrderedKeys","sameValues","sameNode","weight","sum","keys","sameGroup","sameSplit","sameChildren","index","key","expected"],"sources":["../../../../src/workspace/utils/model/value.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { normalizeLayout } from './layout.utils.js';\n\nimport type { WorkspaceGroup, WorkspaceLayout, WorkspaceNode, WorkspaceSplit } from './layout.utils.js';\n\nconst layoutKeys = ['version', 'root', 'closed'];\nconst groupKeys = ['type', 'panels', 'active'];\nconst splitKeys = ['type', 'axis', 'children', 'weights'];\n\nexport function parseWorkspaceValue(value: string): WorkspaceLayout | undefined {\n if (!value) return undefined;\n\n const data: unknown = JSON.parse(value);\n const ids = new Set<string>();\n const record = (item: unknown): item is Record<string, unknown> => typeof item === 'object' && item !== null;\n const node = (item: unknown): item is WorkspaceNode => {\n if (!record(item)) return false;\n if (item.type === 'group') {\n if (\n !Array.isArray(item.panels) ||\n !item.panels.length ||\n typeof item.active !== 'string' ||\n !item.panels.includes(item.active)\n ) {\n return false;\n }\n return item.panels.every(id => {\n if (typeof id !== 'string' || !id || ids.has(id)) return false;\n ids.add(id);\n return true;\n });\n }\n if (!splitShape(item)) return false;\n return item.children.every(child => node(child));\n };\n if (\n !record(data) ||\n data.version !== 1 ||\n !(data.root === null || node(data.root)) ||\n !Array.isArray(data.closed) ||\n !data.closed.every(id => typeof id === 'string' && ids.has(id)) ||\n new Set(data.closed).size !== data.closed.length\n ) {\n throw new TypeError('Invalid workspace arrangement');\n }\n return { version: 1, root: data.root === null ? null : normalizeLayout(data.root), closed: [...data.closed] };\n}\n\nexport function serializeWorkspaceValue(layout: WorkspaceLayout | undefined): string {\n return layout ? JSON.stringify(layout) : '';\n}\n\n/** Compares serialized layout representations, including property order and supplied group fields. */\nexport function sameSerializedWorkspaceLayout(\n left: WorkspaceLayout | undefined,\n right: WorkspaceLayout | undefined\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n if (!hasOrderedKeys(left, layoutKeys) || !hasOrderedKeys(right, layoutKeys)) {\n return serializeWorkspaceValue(left) === serializeWorkspaceValue(right);\n }\n return left.version === right.version && sameValues(left.closed, right.closed) && sameNode(left.root, right.root);\n}\n\nfunction splitShape(item: Record<string, unknown>): item is Record<string, unknown> & WorkspaceSplit {\n if (item.type !== 'split' || !['horizontal', 'vertical'].includes(String(item.axis))) return false;\n if (!Array.isArray(item.children) || item.children.length < 2) return false;\n if (!Array.isArray(item.weights) || item.weights.length !== item.children.length) return false;\n if (!item.weights.every(weight => typeof weight === 'number' && Number.isFinite(weight) && weight > 0)) return false;\n return Number.isFinite(item.weights.reduce((sum: number, weight: number) => sum + weight, 0));\n}\n\nfunction sameNode(left: WorkspaceNode | null, right: WorkspaceNode | null): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.type !== right.type) {\n return false;\n }\n const keys = left.type === 'group' ? groupKeys : splitKeys;\n if (!hasOrderedKeys(left, keys) || !hasOrderedKeys(right, keys)) {\n return JSON.stringify(left) === JSON.stringify(right);\n }\n return left.type === 'group' ? sameGroup(left, right) : sameSplit(left, right);\n}\n\nfunction sameGroup(left: WorkspaceGroup, right: WorkspaceNode) {\n return right.type === 'group' && left.active === right.active && sameValues(left.panels, right.panels);\n}\n\nfunction sameSplit(left: WorkspaceSplit, right: WorkspaceNode) {\n return (\n right.type === 'split' &&\n left.axis === right.axis &&\n sameValues(left.weights, right.weights) &&\n sameChildren(left.children, right.children)\n );\n}\n\nfunction sameChildren(left: WorkspaceNode[], right: WorkspaceNode[]) {\n if (left === right) {\n return true;\n }\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index++) {\n if (!sameNode(left[index]!, right[index]!)) {\n return false;\n }\n }\n return true;\n}\n\nfunction sameValues<T>(left: T[], right: T[]) {\n if (left === right) {\n return true;\n }\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index++) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasOrderedKeys(value: object, expected: string[]) {\n if ('toJSON' in value) {\n return false;\n }\n let index = 0;\n for (const key in value) {\n if (!Object.hasOwn(value, key)) {\n continue;\n }\n if (key !== expected[index++]) {\n return false;\n }\n }\n return index === expected.length;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Point, Rect } from '@nvidia-elements/core/internal';
|
|
2
|
+
import type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';
|
|
3
|
+
import type { WorkspaceRequirements } from '../geometry/sizing.utils.js';
|
|
4
|
+
import type { WorkspaceDragPreview, WorkspaceDropIntent } from '../interaction/drag-preview.utils.js';
|
|
5
|
+
import type { WorkspaceLayout } from '../model/layout.utils.js';
|
|
6
|
+
import type { WorkspacePlacementPlan } from './planner.utils.js';
|
|
7
|
+
interface AcquisitionInput {
|
|
8
|
+
plan: WorkspacePlacementPlan;
|
|
9
|
+
previous: WorkspaceLayout;
|
|
10
|
+
source: string[];
|
|
11
|
+
available: string[];
|
|
12
|
+
current: WorkspacePlacedRegion[];
|
|
13
|
+
rect: Rect;
|
|
14
|
+
acquisition: {
|
|
15
|
+
rect: Rect;
|
|
16
|
+
point: Point;
|
|
17
|
+
};
|
|
18
|
+
requirements: WorkspaceRequirements;
|
|
19
|
+
}
|
|
20
|
+
/** Fits a cross-scope interior reservation to its acquired allocation without retaining a hidden target. */
|
|
21
|
+
export declare function fitAcquiredPlacement(input: AcquisitionInput): WorkspacePlacementPlan | undefined;
|
|
22
|
+
/** Reuses the actual selected reservation before considering a different spatial offer. */
|
|
23
|
+
export declare function resolveSelectedPlacementPlan(input: Omit<AcquisitionInput, 'previous' | 'acquisition'> & {
|
|
24
|
+
previous?: WorkspaceDragPreview;
|
|
25
|
+
acquisition?: {
|
|
26
|
+
rect: Rect;
|
|
27
|
+
point: Point;
|
|
28
|
+
};
|
|
29
|
+
clientOrigin: Rect;
|
|
30
|
+
intent: WorkspaceDropIntent;
|
|
31
|
+
}): WorkspacePlacementPlan | undefined;
|
|
32
|
+
export {};
|