@nvidia-elements/core 2.23.4 → 2.23.6
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 +16 -0
- package/dist/accordion/accordion2.js +49 -49
- package/dist/accordion/accordion2.js.map +1 -1
- package/dist/alert/alert-group2.js +22 -21
- package/dist/alert/alert-group2.js.map +1 -1
- package/dist/alert/alert2.js +29 -28
- package/dist/alert/alert2.js.map +1 -1
- package/dist/avatar/avatar-group2.js +9 -9
- package/dist/avatar/avatar-group2.js.map +1 -1
- package/dist/avatar/avatar2.js +12 -11
- package/dist/avatar/avatar2.js.map +1 -1
- package/dist/badge/badge2.js +27 -26
- package/dist/badge/badge2.js.map +1 -1
- package/dist/breadcrumb/breadcrumb2.js +17 -17
- package/dist/breadcrumb/breadcrumb2.js.map +1 -1
- package/dist/bundles/index.js +10 -10
- package/dist/button/button2.js +12 -12
- package/dist/button/button2.js.map +1 -1
- package/dist/button-group/button-group2.js +18 -18
- package/dist/button-group/button-group2.js.map +1 -1
- package/dist/card/card2.js +28 -28
- package/dist/card/card2.js.map +1 -1
- package/dist/chat-message/chat-message2.js +15 -14
- package/dist/chat-message/chat-message2.js.map +1 -1
- package/dist/checkbox/checkbox-group2.js +8 -8
- package/dist/checkbox/checkbox-group2.js.map +1 -1
- package/dist/checkbox/checkbox2.js +8 -8
- package/dist/checkbox/checkbox2.js.map +1 -1
- package/dist/color/color2.js +21 -21
- package/dist/color/color2.js.map +1 -1
- package/dist/combobox/combobox2.js +37 -37
- package/dist/combobox/combobox2.js.map +1 -1
- package/dist/copy-button/copy-button.d.ts +1 -1
- package/dist/copy-button/copy-button2.js +21 -21
- package/dist/copy-button/copy-button2.js.map +1 -1
- package/dist/custom-elements.json +1032 -337
- package/dist/date/date2.js +19 -19
- package/dist/date/date2.js.map +1 -1
- package/dist/datetime/datetime2.js +19 -19
- package/dist/datetime/datetime2.js.map +1 -1
- package/dist/dialog/dialog-footer2.js +7 -7
- package/dist/dialog/dialog-footer2.js.map +1 -1
- package/dist/dialog/dialog-header2.js +7 -7
- package/dist/dialog/dialog-header2.js.map +1 -1
- package/dist/dialog/dialog2.js +25 -25
- package/dist/dialog/dialog2.js.map +1 -1
- package/dist/divider/divider2.js +12 -12
- package/dist/divider/divider2.js.map +1 -1
- package/dist/dot/dot2.js +17 -16
- package/dist/dot/dot2.js.map +1 -1
- package/dist/drag-handle/drag-handle2.js +12 -12
- package/dist/drag-handle/drag-handle2.js.map +1 -1
- package/dist/drawer/drawer-content2.js +7 -7
- package/dist/drawer/drawer-content2.js.map +1 -1
- package/dist/drawer/drawer-footer2.js +7 -7
- package/dist/drawer/drawer-footer2.js.map +1 -1
- package/dist/drawer/drawer-header2.js +7 -7
- package/dist/drawer/drawer-header2.js.map +1 -1
- package/dist/drawer/drawer2.js +21 -21
- package/dist/drawer/drawer2.js.map +1 -1
- package/dist/dropdown/dropdown-footer2.js +7 -7
- package/dist/dropdown/dropdown-footer2.js.map +1 -1
- package/dist/dropdown/dropdown-header2.js +7 -7
- package/dist/dropdown/dropdown-header2.js.map +1 -1
- package/dist/dropdown/dropdown2.js +21 -21
- package/dist/dropdown/dropdown2.js.map +1 -1
- package/dist/dropdown-group/dropdown-group.js +10 -10
- package/dist/dropdown-group/dropdown-group.js.map +1 -1
- package/dist/dropzone/dropzone2.js +19 -19
- package/dist/dropzone/dropzone2.js.map +1 -1
- package/dist/file/file2.js +8 -8
- package/dist/file/file2.js.map +1 -1
- package/dist/format-bytes/format-bytes2.js +13 -13
- package/dist/format-bytes/format-bytes2.js.map +1 -1
- package/dist/format-datetime/format-datetime2.js +14 -14
- package/dist/format-datetime/format-datetime2.js.map +1 -1
- package/dist/format-number/format-number2.js +20 -20
- package/dist/format-number/format-number2.js.map +1 -1
- package/dist/format-relative-time/format-relative-time2.js +11 -11
- package/dist/format-relative-time/format-relative-time2.js.map +1 -1
- package/dist/format-truncate/format-truncate2.js +21 -21
- package/dist/format-truncate/format-truncate2.js.map +1 -1
- package/dist/forms/control/control2.js +30 -29
- package/dist/forms/control/control2.js.map +1 -1
- package/dist/forms/control-group/control-group2.js +19 -18
- package/dist/forms/control-group/control-group2.js.map +1 -1
- package/dist/forms/control-message/control-message2.js +15 -15
- package/dist/forms/control-message/control-message2.js.map +1 -1
- package/dist/gauge/gauge2.js +20 -20
- package/dist/gauge/gauge2.js.map +1 -1
- package/dist/ghost/ghost2.js +10 -10
- package/dist/ghost/ghost2.js.map +1 -1
- package/dist/grid/cell/cell2.js +9 -9
- package/dist/grid/cell/cell2.js.map +1 -1
- package/dist/grid/column/column2.js +16 -16
- package/dist/grid/column/column2.js.map +1 -1
- package/dist/grid/footer/footer2.js +12 -12
- package/dist/grid/footer/footer2.js.map +1 -1
- package/dist/grid/grid2.js +30 -30
- package/dist/grid/grid2.js.map +1 -1
- package/dist/grid/header/header2.js +20 -20
- package/dist/grid/header/header2.js.map +1 -1
- package/dist/grid/placeholder/placeholder2.js +9 -9
- package/dist/grid/placeholder/placeholder2.js.map +1 -1
- package/dist/grid/row/row2.js +15 -15
- package/dist/grid/row/row2.js.map +1 -1
- package/dist/icon/icon2.js +40 -40
- package/dist/icon/icon2.js.map +1 -1
- package/dist/icon-button/icon-button2.js +17 -17
- package/dist/icon-button/icon-button2.js.map +1 -1
- package/dist/iframe/iframe2.js +7 -7
- package/dist/iframe/iframe2.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group2.js +8 -8
- package/dist/input/input-group2.js.map +1 -1
- package/dist/input/input2.js +10 -10
- package/dist/input/input2.js.map +1 -1
- package/dist/internal/controllers/state-expanded.controller.js +1 -1
- package/dist/internal/controllers/state-expanded.controller.js.map +1 -1
- package/dist/internal/controllers/state-highlighted.controller.js +1 -1
- package/dist/internal/controllers/state-highlighted.controller.js.map +1 -1
- package/dist/internal/controllers/state-scroll.controller.js +1 -1
- package/dist/internal/controllers/state-scroll.controller.js.map +1 -1
- package/dist/internal/controllers/state-selected.controller.js +1 -1
- package/dist/internal/controllers/state-selected.controller.js.map +1 -1
- package/dist/internal/controllers/type-anchor.controller.js +1 -1
- package/dist/internal/controllers/type-anchor.controller.js.map +1 -1
- package/dist/internal/controllers/type-closable.controller.js +1 -1
- package/dist/internal/controllers/type-closable.controller.js.map +1 -1
- package/dist/internal/controllers/type-expandable.controller.js +1 -1
- package/dist/internal/controllers/type-expandable.controller.js.map +1 -1
- package/dist/internal/controllers/type-native-popover.controller.js +6 -6
- package/dist/internal/controllers/type-native-popover.controller.js.map +1 -1
- package/dist/internal/controllers/type-popover.controller.examples.js.map +1 -1
- package/dist/internal/controllers/type-selectable.controller.js +1 -1
- package/dist/internal/controllers/type-selectable.controller.js.map +1 -1
- package/dist/internal/index.d.ts +0 -1
- package/dist/internal/index.js +57 -61
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/styles/index.d.ts +0 -1
- package/dist/internal/styles/index.js +5 -15
- package/dist/internal/styles/index.js.map +1 -1
- package/dist/internal/utils/a11y.d.ts +0 -3
- package/dist/internal/utils/a11y.js +6 -9
- package/dist/internal/utils/a11y.js.map +1 -1
- package/dist/joystick/joystick2.js +19 -19
- package/dist/joystick/joystick2.js.map +1 -1
- package/dist/logo/logo2.js +14 -13
- package/dist/logo/logo2.js.map +1 -1
- package/dist/menu/menu-group2.js +20 -20
- package/dist/menu/menu-group2.js.map +1 -1
- package/dist/menu/menu-item2.js +11 -11
- package/dist/menu/menu-item2.js.map +1 -1
- package/dist/menu/menu2.js +14 -14
- package/dist/menu/menu2.js.map +1 -1
- package/dist/month/month2.js +19 -19
- package/dist/month/month2.js.map +1 -1
- package/dist/notification/notification-group2.js +13 -13
- package/dist/notification/notification-group2.js.map +1 -1
- package/dist/notification/notification2.js +31 -31
- package/dist/notification/notification2.js.map +1 -1
- package/dist/page/page-panel/page-panel-content2.js +7 -7
- package/dist/page/page-panel/page-panel-content2.js.map +1 -1
- package/dist/page/page-panel/page-panel-footer2.js +9 -9
- package/dist/page/page-panel/page-panel-footer2.js.map +1 -1
- package/dist/page/page-panel/page-panel-header2.js +9 -9
- package/dist/page/page-panel/page-panel-header2.js.map +1 -1
- package/dist/page/page-panel/page-panel2.js +15 -15
- package/dist/page/page-panel/page-panel2.js.map +1 -1
- package/dist/page/page2.js +13 -13
- package/dist/page/page2.js.map +1 -1
- package/dist/page-header/page-header2.js +10 -10
- package/dist/page-header/page-header2.js.map +1 -1
- package/dist/page-loader/page-loader2.js +13 -13
- package/dist/page-loader/page-loader2.js.map +1 -1
- package/dist/pagination/pagination2.js +34 -34
- package/dist/pagination/pagination2.js.map +1 -1
- package/dist/panel/panel2.js +36 -36
- package/dist/panel/panel2.js.map +1 -1
- package/dist/password/password2.js +19 -19
- package/dist/password/password2.js.map +1 -1
- package/dist/preferences-input/preferences-input.d.ts +1 -1
- package/dist/preferences-input/preferences-input2.js +25 -25
- package/dist/preferences-input/preferences-input2.js.map +1 -1
- package/dist/progress-bar/progress-bar2.js +13 -13
- package/dist/progress-bar/progress-bar2.js.map +1 -1
- package/dist/progress-dot/progress-dot2.js +15 -15
- package/dist/progress-dot/progress-dot2.js.map +1 -1
- package/dist/progress-ring/progress-ring2.js +20 -20
- package/dist/progress-ring/progress-ring2.js.map +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip2.js +28 -28
- package/dist/progressive-filter-chip/progressive-filter-chip2.js.map +1 -1
- package/dist/pulse/pulse2.js +15 -15
- package/dist/pulse/pulse2.js.map +1 -1
- package/dist/radio/radio-group2.js +8 -8
- package/dist/radio/radio-group2.js.map +1 -1
- package/dist/radio/radio2.js +8 -8
- package/dist/radio/radio2.js.map +1 -1
- package/dist/range/range2.js +16 -16
- package/dist/range/range2.js.map +1 -1
- package/dist/resize-handle/resize-handle2.js +17 -17
- package/dist/resize-handle/resize-handle2.js.map +1 -1
- package/dist/search/search2.js +20 -20
- package/dist/search/search2.js.map +1 -1
- package/dist/select/select2.js +32 -32
- package/dist/select/select2.js.map +1 -1
- package/dist/skeleton/skeleton2.js +14 -14
- package/dist/skeleton/skeleton2.js.map +1 -1
- package/dist/sort-button/sort-button.d.ts +1 -1
- package/dist/sort-button/sort-button2.js +16 -16
- package/dist/sort-button/sort-button2.js.map +1 -1
- package/dist/sparkline/sparkline2.js +45 -44
- package/dist/sparkline/sparkline2.js.map +1 -1
- package/dist/star-rating/star-rating2.js +14 -14
- package/dist/star-rating/star-rating2.js.map +1 -1
- package/dist/steps/steps2.js +32 -32
- package/dist/steps/steps2.js.map +1 -1
- package/dist/switch/switch-group2.js +8 -8
- package/dist/switch/switch-group2.js.map +1 -1
- package/dist/switch/switch2.js +8 -8
- package/dist/switch/switch2.js.map +1 -1
- package/dist/tabs/tabs-group2.js +18 -18
- package/dist/tabs/tabs-group2.js.map +1 -1
- package/dist/tabs/tabs-item-group2.js +9 -9
- package/dist/tabs/tabs-item-group2.js.map +1 -1
- package/dist/tabs/tabs2.js +28 -28
- package/dist/tabs/tabs2.js.map +1 -1
- package/dist/tag/tag2.js +19 -18
- package/dist/tag/tag2.js.map +1 -1
- package/dist/textarea/textarea2.js +9 -9
- package/dist/textarea/textarea2.js.map +1 -1
- package/dist/time/time2.js +19 -19
- package/dist/time/time2.js.map +1 -1
- package/dist/toast/toast2.js +28 -28
- package/dist/toast/toast2.js.map +1 -1
- package/dist/toggletip/toggletip-footer2.js +7 -7
- package/dist/toggletip/toggletip-footer2.js.map +1 -1
- package/dist/toggletip/toggletip-header2.js +7 -7
- package/dist/toggletip/toggletip-header2.js.map +1 -1
- package/dist/toggletip/toggletip2.js +23 -23
- package/dist/toggletip/toggletip2.js.map +1 -1
- package/dist/toolbar/toolbar2.js +20 -19
- package/dist/toolbar/toolbar2.js.map +1 -1
- package/dist/tooltip/tooltip2.js +20 -20
- package/dist/tooltip/tooltip2.js.map +1 -1
- package/dist/tree/tree-node2.js +39 -39
- package/dist/tree/tree-node2.js.map +1 -1
- package/dist/tree/tree2.js +20 -20
- package/dist/tree/tree2.js.map +1 -1
- package/dist/week/week2.js +19 -19
- package/dist/week/week2.js.map +1 -1
- package/dist/workspace/controllers/workspace-composition.controller.d.ts +4 -1
- package/dist/workspace/controllers/workspace-composition.controller.js +69 -39
- package/dist/workspace/controllers/workspace-composition.controller.js.map +1 -1
- package/dist/workspace/controllers/workspace-rearrange.controller.js +27 -27
- package/dist/workspace/controllers/workspace-rearrange.controller.js.map +1 -1
- package/dist/workspace/controllers/workspace-restoration.controller.js +2 -2
- package/dist/workspace/controllers/workspace-restoration.controller.js.map +1 -1
- package/dist/workspace/panel/panel2.js +15 -15
- package/dist/workspace/panel/panel2.js.map +1 -1
- package/dist/workspace/panel-content/panel-content2.js +7 -7
- package/dist/workspace/panel-content/panel-content2.js.map +1 -1
- package/dist/workspace/panel-footer/panel-footer2.js +9 -9
- package/dist/workspace/panel-footer/panel-footer2.js.map +1 -1
- package/dist/workspace/panel-header/panel-header2.js +16 -16
- package/dist/workspace/panel-header/panel-header2.js.map +1 -1
- package/dist/workspace/utils/comparison.utils.d.ts +3 -0
- package/dist/workspace/utils/comparison.utils.js +13 -0
- package/dist/workspace/utils/comparison.utils.js.map +1 -0
- package/dist/workspace/utils/evaluation.utils.d.ts +65 -6
- package/dist/workspace/utils/evaluation.utils.js +334 -99
- package/dist/workspace/utils/evaluation.utils.js.map +1 -1
- package/dist/workspace/utils/geometry/allocation.utils.js +15 -13
- package/dist/workspace/utils/geometry/allocation.utils.js.map +1 -1
- package/dist/workspace/utils/geometry/sizing.utils.d.ts +2 -0
- package/dist/workspace/utils/geometry/sizing.utils.js +37 -17
- package/dist/workspace/utils/geometry/sizing.utils.js.map +1 -1
- package/dist/workspace/utils/interaction/boundary.utils.d.ts +2 -2
- package/dist/workspace/utils/interaction/boundary.utils.js +2 -2
- package/dist/workspace/utils/interaction/boundary.utils.js.map +1 -1
- package/dist/workspace/utils/interaction/drag-preview.utils.d.ts +3 -3
- package/dist/workspace/utils/interaction/drag-preview.utils.js.map +1 -1
- package/dist/workspace/utils/interaction/insertion-offers.utils.d.ts +11 -9
- package/dist/workspace/utils/interaction/insertion-offers.utils.js +37 -43
- package/dist/workspace/utils/interaction/insertion-offers.utils.js.map +1 -1
- package/dist/workspace/utils/interaction/placement-decision.utils.d.ts +6 -1
- package/dist/workspace/utils/interaction/placement-decision.utils.js +94 -87
- package/dist/workspace/utils/interaction/placement-decision.utils.js.map +1 -1
- package/dist/workspace/utils/model/layout.utils.d.ts +2 -1
- package/dist/workspace/utils/model/layout.utils.js +12 -10
- package/dist/workspace/utils/model/layout.utils.js.map +1 -1
- package/dist/workspace/utils/model/membership.utils.d.ts +4 -0
- package/dist/workspace/utils/model/membership.utils.js +13 -4
- package/dist/workspace/utils/model/membership.utils.js.map +1 -1
- package/dist/workspace/utils/model/operations.utils.d.ts +1 -0
- package/dist/workspace/utils/model/operations.utils.js +51 -46
- package/dist/workspace/utils/model/operations.utils.js.map +1 -1
- package/dist/workspace/utils/model/projection.utils.d.ts +4 -2
- package/dist/workspace/utils/model/projection.utils.js +49 -40
- package/dist/workspace/utils/model/projection.utils.js.map +1 -1
- package/dist/workspace/utils/model/value.utils.d.ts +4 -3
- package/dist/workspace/utils/model/value.utils.js +15 -50
- package/dist/workspace/utils/model/value.utils.js.map +1 -1
- package/dist/workspace/utils/placement/acquisition-sizing.utils.d.ts +2 -0
- package/dist/workspace/utils/placement/acquisition-sizing.utils.js +30 -22
- package/dist/workspace/utils/placement/acquisition-sizing.utils.js.map +1 -1
- package/dist/workspace/utils/placement/group-insertion.utils.d.ts +19 -13
- package/dist/workspace/utils/placement/group-insertion.utils.js +50 -47
- package/dist/workspace/utils/placement/group-insertion.utils.js.map +1 -1
- package/dist/workspace/utils/placement/planner.utils.d.ts +13 -2
- package/dist/workspace/utils/placement/planner.utils.js +79 -73
- package/dist/workspace/utils/placement/planner.utils.js.map +1 -1
- package/dist/workspace/utils/placement/preparation.utils.d.ts +5 -2
- package/dist/workspace/utils/placement/preparation.utils.js +45 -41
- package/dist/workspace/utils/placement/preparation.utils.js.map +1 -1
- package/dist/workspace/utils/placement/region.utils.js +32 -32
- package/dist/workspace/utils/placement/region.utils.js.map +1 -1
- package/dist/workspace/utils/placement/scope.utils.d.ts +34 -0
- package/dist/workspace/utils/placement/scope.utils.js +155 -0
- package/dist/workspace/utils/placement/scope.utils.js.map +1 -0
- package/dist/workspace/utils/placement/session.utils.d.ts +11 -0
- package/dist/workspace/utils/placement/session.utils.js +78 -0
- package/dist/workspace/utils/placement/session.utils.js.map +1 -0
- package/dist/workspace/utils/placement/split-sizing.utils.d.ts +2 -2
- package/dist/workspace/utils/placement/split-sizing.utils.js +19 -19
- package/dist/workspace/utils/placement/split-sizing.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/composition.utils.d.ts +1 -1
- package/dist/workspace/utils/presentation/composition.utils.js +4 -2
- package/dist/workspace/utils/presentation/composition.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/groups.utils.d.ts +3 -3
- package/dist/workspace/utils/presentation/groups.utils.js +40 -30
- package/dist/workspace/utils/presentation/groups.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/measurements.utils.d.ts +1 -0
- package/dist/workspace/utils/presentation/measurements.utils.js +6 -14
- package/dist/workspace/utils/presentation/measurements.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/offers.utils.d.ts +1 -1
- package/dist/workspace/utils/presentation/offers.utils.js +3 -3
- package/dist/workspace/utils/presentation/offers.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/preview.utils.d.ts +6 -0
- package/dist/workspace/utils/presentation/preview.utils.js +14 -3
- package/dist/workspace/utils/presentation/preview.utils.js.map +1 -1
- package/dist/workspace/workspace.examples.js.map +1 -1
- package/dist/workspace/workspace.examples.json +4 -4
- package/dist/workspace/workspace.js +1 -1
- package/dist/workspace/workspace.js.map +1 -1
- package/dist/workspace/workspace2.js +233 -239
- package/dist/workspace/workspace2.js.map +1 -1
- package/package.json +2 -2
- package/dist/internal/decorators/scoped-registry.d.ts +0 -2
- package/dist/internal/decorators/scoped-registry.js +0 -36
- package/dist/internal/decorators/scoped-registry.js.map +0 -1
- package/dist/internal/styles/base.js +0 -5
- package/dist/internal/styles/base.js.map +0 -1
- package/dist/internal/styles/interaction-state.js +0 -5
- package/dist/internal/styles/interaction-state.js.map +0 -1
- package/dist/workspace/utils/placement/context.utils.d.ts +0 -36
- package/dist/workspace/utils/placement/context.utils.js +0 -135
- package/dist/workspace/utils/placement/context.utils.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { normalizeLayout as e } from "../model/layout.utils.js";
|
|
2
2
|
import { findGroup as t, projectLayout as n } from "../model/operations.utils.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { findDeepestProjectionCarrier as r } from "../model/projection.utils.js";
|
|
4
|
+
import { createPlacementScope as i } from "./scope.utils.js";
|
|
5
5
|
// src/workspace/utils/placement/region.utils.ts
|
|
6
|
-
function
|
|
6
|
+
function a(e, t) {
|
|
7
7
|
let n = t.split(".");
|
|
8
8
|
if (n.shift() !== "root") return;
|
|
9
9
|
let r = e;
|
|
@@ -13,24 +13,24 @@ function o(e, t) {
|
|
|
13
13
|
}
|
|
14
14
|
return r ?? void 0;
|
|
15
15
|
}
|
|
16
|
-
function
|
|
17
|
-
let n =
|
|
16
|
+
function o(t) {
|
|
17
|
+
let n = p(t);
|
|
18
18
|
if (!n) return;
|
|
19
|
-
let { layout:
|
|
19
|
+
let { layout: r, source: a, sourceGroup: o, visible: s, carrier: c, region: l, position: u, projectLayout: m, root: h } = n, g = i("recipient", l, a), _ = new Set(a), v = {
|
|
20
20
|
type: "group",
|
|
21
21
|
panels: [...a],
|
|
22
22
|
active: a.includes(o.active) ? o.active : a[0]
|
|
23
|
-
}, y =
|
|
24
|
-
if (!y || !
|
|
23
|
+
}, y = d(c, _);
|
|
24
|
+
if (!y || !m({
|
|
25
25
|
version: 1,
|
|
26
26
|
root: y,
|
|
27
27
|
closed: []
|
|
28
28
|
}, s).root) return {
|
|
29
29
|
kind: "reorder",
|
|
30
|
-
layout:
|
|
31
|
-
|
|
30
|
+
layout: r,
|
|
31
|
+
scope: g
|
|
32
32
|
};
|
|
33
|
-
let b =
|
|
33
|
+
let b = f(h, {
|
|
34
34
|
carrier: c,
|
|
35
35
|
replacement: {
|
|
36
36
|
type: "split",
|
|
@@ -43,13 +43,13 @@ function s(t) {
|
|
|
43
43
|
return b ? {
|
|
44
44
|
kind: "split",
|
|
45
45
|
layout: {
|
|
46
|
-
...
|
|
46
|
+
...r,
|
|
47
47
|
root: e(b)
|
|
48
48
|
},
|
|
49
|
-
|
|
49
|
+
scope: g
|
|
50
50
|
} : void 0;
|
|
51
51
|
}
|
|
52
|
-
function
|
|
52
|
+
function s(e, t) {
|
|
53
53
|
let n = t.flatMap((e) => e ? [e] : []);
|
|
54
54
|
return n.length ? n.length === 1 ? n[0] : {
|
|
55
55
|
...e,
|
|
@@ -57,28 +57,28 @@ function c(e, t) {
|
|
|
57
57
|
weights: e.weights.filter((e, n) => t[n])
|
|
58
58
|
} : null;
|
|
59
59
|
}
|
|
60
|
-
function
|
|
60
|
+
function c(e, n) {
|
|
61
61
|
let r = t(e.root, n[0]);
|
|
62
|
-
if (r && new Set(n).size === n.length && n.every((e) => r.panels.includes(e))) return n.length === 1 ||
|
|
62
|
+
if (r && new Set(n).size === n.length && n.every((e) => r.panels.includes(e))) return n.length === 1 || l(r, n) ? r : void 0;
|
|
63
63
|
}
|
|
64
|
-
function
|
|
64
|
+
function l(e, t) {
|
|
65
65
|
return e.panels.length === t.length && e.panels.every((e, n) => e === t[n]);
|
|
66
66
|
}
|
|
67
|
-
function
|
|
68
|
-
let { layout:
|
|
69
|
-
if (!
|
|
70
|
-
let
|
|
67
|
+
function u(e, t) {
|
|
68
|
+
let { layout: i, destination: o } = e, s = a((e.projectLayout ?? n)(i, t).root, o.region);
|
|
69
|
+
if (!s) return;
|
|
70
|
+
let c = r(i.root, s, (r) => (e.projectLayout ?? n)({
|
|
71
71
|
version: 1,
|
|
72
72
|
root: r,
|
|
73
73
|
closed: []
|
|
74
74
|
}, t).root);
|
|
75
|
-
return
|
|
76
|
-
carrier:
|
|
77
|
-
region:
|
|
75
|
+
return c ? {
|
|
76
|
+
carrier: c,
|
|
77
|
+
region: s
|
|
78
78
|
} : void 0;
|
|
79
79
|
}
|
|
80
|
-
function
|
|
81
|
-
if (e.type === "split") return
|
|
80
|
+
function d(e, t) {
|
|
81
|
+
if (e.type === "split") return s(e, e.children.map((e) => d(e, t)));
|
|
82
82
|
let n = e.panels.filter((e) => !t.has(e));
|
|
83
83
|
return n.length ? {
|
|
84
84
|
...e,
|
|
@@ -86,15 +86,15 @@ function f(e, t) {
|
|
|
86
86
|
active: n.includes(e.active) ? e.active : n[0]
|
|
87
87
|
} : null;
|
|
88
88
|
}
|
|
89
|
-
function
|
|
90
|
-
return e === t.carrier ? t.replacement : e.type === "group" ?
|
|
89
|
+
function f(e, t) {
|
|
90
|
+
return e === t.carrier ? t.replacement : e.type === "group" ? d(e, t.removed) : s(e, e.children.map((e) => f(e, t)));
|
|
91
91
|
}
|
|
92
|
-
function
|
|
92
|
+
function p(e) {
|
|
93
93
|
let { layout: t, source: r, destination: i } = e;
|
|
94
94
|
if (!t.root || !i.region || i.position === "tab" || !r.length) return;
|
|
95
|
-
let a =
|
|
95
|
+
let a = c(t, r);
|
|
96
96
|
if (!a) return;
|
|
97
|
-
let o = e.available.filter((e) => !t.closed.includes(e)), s =
|
|
97
|
+
let o = e.available.filter((e) => !t.closed.includes(e)), s = u(e, o);
|
|
98
98
|
if (s) return {
|
|
99
99
|
layout: t,
|
|
100
100
|
source: r,
|
|
@@ -106,6 +106,6 @@ function m(e) {
|
|
|
106
106
|
root: t.root
|
|
107
107
|
};
|
|
108
108
|
}
|
|
109
|
-
export {
|
|
109
|
+
export { a as findWorkspaceRegion, o as placeRegion };
|
|
110
110
|
|
|
111
111
|
//# sourceMappingURL=region.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"region.utils.js","names":["findWorkspaceRegion","parts","key","node","root","part","placeRegion","context","regionContext","input","project","canonicalRoot","
|
|
1
|
+
{"version":3,"file":"region.utils.js","names":["findWorkspaceRegion","parts","key","node","root","part","placeRegion","context","regionContext","input","project","canonicalRoot","scope","createPlacementScope","region","source","removed","moving","sourceGroup","residual","stripRegion","carrier","visible","editRegion","position","layout","normalizeLayout","rebuild","children","mapped","child","index","regionSource","group","findGroup","id","wholeGroup","regionCarrier","projectLayout","destination","findDeepestProjectionCarrier","panels","recipient"],"sources":["../../../../src/workspace/utils/placement/region.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 '../model/layout.utils.js';\nimport { findGroup, projectLayout } from '../model/operations.utils.js';\nimport { findDeepestProjectionCarrier } from '../model/projection.utils.js';\nimport { createPlacementScope } from './scope.utils.js';\n\nimport type { WorkspaceGroup, WorkspaceLayout, WorkspaceNode, WorkspaceSplit } from '../model/layout.utils.js';\nimport type { WorkspaceDestination } from '../model/operations.utils.js';\nimport type { WorkspaceLayoutProjector } from '../model/projection.utils.js';\nimport type { WorkspacePlacementPlan } from './planner.utils.js';\n\ninterface WorkspaceRegionPlacementInput {\n layout: WorkspaceLayout;\n source: string[];\n destination: WorkspaceDestination;\n available: string[];\n projectLayout?: WorkspaceLayoutProjector;\n}\n\n/** Resolves an ephemeral path in a visible arrangement, before source removal. */\nexport function findWorkspaceRegion(root: WorkspaceNode | null, key: string): WorkspaceNode | undefined {\n const parts = key.split('.');\n if (parts.shift() !== 'root') return undefined;\n let node = root;\n for (const part of parts) {\n if (!node || node.type !== 'split' || !/^\\d+$/.test(part)) return undefined;\n node = node.children[Number(part)] ?? null;\n }\n return node ?? undefined;\n}\n\nexport function placeRegion(input: WorkspaceRegionPlacementInput): WorkspacePlacementPlan | undefined {\n const context = regionContext(input);\n if (!context) return undefined;\n const {\n layout,\n source,\n sourceGroup,\n visible,\n carrier,\n region,\n position,\n projectLayout: project,\n root: canonicalRoot\n } = context;\n const scope = createPlacementScope('recipient', region, source);\n const removed = new Set(source);\n const moving: WorkspaceGroup = {\n type: 'group',\n panels: [...source],\n active: source.includes(sourceGroup.active) ? sourceGroup.active : source[0]!\n };\n const residual = stripRegion(carrier, removed);\n if (!residual || !project({ version: 1, root: residual, closed: [] }, visible).root)\n return { kind: 'reorder', layout, scope };\n const before = position === 'left' || position === 'top';\n const replacement: WorkspaceSplit = {\n type: 'split',\n axis: position === 'left' || position === 'right' ? 'horizontal' : 'vertical',\n children: before ? [moving, residual] : [residual, moving],\n weights: [0.5, 0.5]\n };\n const root = editRegion(canonicalRoot, { carrier, replacement, removed });\n return root ? { kind: 'split', layout: { ...layout, root: normalizeLayout(root) }, scope } : undefined;\n}\n\nfunction rebuild(node: WorkspaceSplit, mapped: (WorkspaceNode | null)[]): WorkspaceNode | null {\n const children = mapped.flatMap(child => (child ? [child] : []));\n if (!children.length) return null;\n if (children.length === 1) return children[0]!;\n return { ...node, children, weights: node.weights.filter((_, index) => mapped[index]) };\n}\n\nfunction regionSource(layout: WorkspaceLayout, source: string[]): WorkspaceGroup | undefined {\n const group = findGroup(layout.root, source[0]);\n if (!group || new Set(source).size !== source.length || !source.every(id => group.panels.includes(id)))\n return undefined;\n if (source.length === 1) return group;\n return wholeGroup(group, source) ? group : undefined;\n}\n\nfunction wholeGroup(group: WorkspaceGroup, source: string[]): boolean {\n return group.panels.length === source.length && group.panels.every((id, index) => id === source[index]);\n}\n\nfunction regionCarrier(input: WorkspaceRegionPlacementInput, visible: string[]) {\n const { layout, destination } = input;\n const region = findWorkspaceRegion((input.projectLayout ?? projectLayout)(layout, visible).root, destination.region!);\n if (!region) return undefined;\n const carrier = findDeepestProjectionCarrier(\n layout.root,\n region,\n node => (input.projectLayout ?? projectLayout)({ version: 1, root: node, closed: [] }, visible).root\n );\n return carrier ? { carrier, region } : undefined;\n}\n\nfunction stripRegion(node: WorkspaceNode, removed: Set<string>): WorkspaceNode | null {\n if (node.type === 'split')\n return rebuild(\n node,\n node.children.map(child => stripRegion(child, removed))\n );\n const panels = node.panels.filter(id => !removed.has(id));\n if (!panels.length) return null;\n return { ...node, panels, active: panels.includes(node.active) ? node.active : panels[0]! };\n}\n\nfunction editRegion(\n node: WorkspaceNode,\n input: { carrier: WorkspaceNode; replacement: WorkspaceNode; removed: Set<string> }\n): WorkspaceNode | null {\n if (node === input.carrier) return input.replacement;\n if (node.type === 'group') return stripRegion(node, input.removed);\n return rebuild(\n node,\n node.children.map(child => editRegion(child, input))\n );\n}\n\nfunction regionContext(input: WorkspaceRegionPlacementInput) {\n const { layout, source, destination } = input;\n if (!layout.root || !destination.region || destination.position === 'tab' || !source.length) return undefined;\n const sourceGroup = regionSource(layout, source);\n if (!sourceGroup) return undefined;\n const visible = input.available.filter(id => !layout.closed.includes(id));\n const recipient = regionCarrier(input, visible);\n if (!recipient) return undefined;\n return {\n layout,\n source,\n sourceGroup,\n visible,\n ...recipient,\n position: destination.position,\n projectLayout: input.projectLayout ?? projectLayout,\n root: layout.root\n };\n}\n"],"mappings":";;;;;AAsBA,SAAgBA,EAAoB,GAA4B,GAAwC;CACtG,IAAMC,IAAQC,EAAI,MAAM,GAAG;CAC3B,IAAID,EAAM,MAAM,MAAM,QAAQ;CAC9B,IAAIE,IAAOC;CACX,KAAK,IAAMC,KAAQJ,GAAO;EACxB,IAAI,CAACE,KAAQA,EAAK,SAAS,WAAW,CAAC,QAAQ,KAAKE,CAAI,GAAG;EAC3D,IAAOF,EAAK,SAAS,OAAOE,CAAI,MAAM;CACxC;CACA,OAAOF,KAAQ,KAAA;AACjB;AAEA,SAAgBG,EAAY,GAA0E;CACpG,IAAMC,IAAUC,EAAcC,CAAK;CACnC,IAAI,CAACF,GAAS;CACd,IAAM,EACJ,WACA,WACA,gBACA,YACA,YACA,WACA,aACA,eAAeG,GACf,MAAMC,MACJJ,GACEK,IAAQC,EAAqB,aAAaC,GAAQC,CAAM,GACxDC,IAAU,IAAI,IAAID,CAAM,GACxBE,IAAyB;EAC7B,MAAM;EACN,QAAQ,CAAC,GAAGF,CAAM;EAClB,QAAQA,EAAO,SAASG,EAAY,MAAM,IAAIA,EAAY,SAASH,EAAO;CAC5E,GACMI,IAAWC,EAAYC,GAASL,CAAO;CAC7C,IAAI,CAACG,KAAY,CAACT,EAAQ;EAAE,SAAS;EAAG,MAAMS;EAAU,QAAQ,CAAC;CAAE,GAAGG,CAAO,CAAC,CAAC,MAC7E,OAAO;EAAE,MAAM;EAAW;EAAQ;CAAM;CAQ1C,IAAMlB,IAAOmB,EAAWZ,GAAe;EAAE;EAAS,aAAA;GALhD,MAAM;GACN,MAAMa,MAAa,UAAUA,MAAa,UAAU,eAAe;GACnE,UAJaA,MAAa,UAAUA,MAAa,QAI9B,CAACP,GAAQE,CAAQ,IAAI,CAACA,GAAUF,CAAM;GACzD,SAAS,CAAC,IAAK,EAAG;EAE8B;EAAa;CAAQ,CAAC;CACxE,OAAOb,IAAO;EAAE,MAAM;EAAS,QAAQ;GAAE,GAAGqB;GAAQ,MAAMC,EAAgBtB,CAAI;EAAE;EAAG;CAAM,IAAI,KAAA;AAC/F;AAEA,SAASuB,EAAQ,GAAsB,GAAwD;CAC7F,IAAMC,IAAWC,EAAO,SAAQ,MAAUC,IAAQ,CAACA,CAAK,IAAI,CAAC,CAAE;CAG/D,OAFKF,EAAS,SACVA,EAAS,WAAW,IAAUA,EAAS,KACpC;EAAE,GAAGzB;EAAM;EAAU,SAASA,EAAK,QAAQ,QAAQ,GAAG,MAAU0B,EAAOE,EAAM;CAAE,IAFzD;AAG/B;AAEA,SAASC,EAAa,GAAyB,GAA8C;CAC3F,IAAMC,IAAQC,EAAUT,EAAO,MAAMV,EAAO,EAAE;CAC9C,IAAKkB,KAAS,IAAI,IAAIlB,CAAM,CAAC,CAAC,SAASA,EAAO,UAAWA,EAAO,OAAM,MAAMkB,EAAM,OAAO,SAASE,CAAE,CAAC,GAGrG,OADIpB,EAAO,WAAW,KACfqB,EAAWH,GAAOlB,CAAM,IADCkB,IACW,KAAA;AAC7C;AAEA,SAASG,EAAW,GAAuB,GAA2B;CACpE,OAAOH,EAAM,OAAO,WAAWlB,EAAO,UAAUkB,EAAM,OAAO,OAAO,GAAI,MAAUE,MAAOpB,EAAOgB,EAAM;AACxG;AAEA,SAASM,EAAc,GAAsC,GAAmB;CAC9E,IAAM,EAAE,WAAQ,mBAAgB5B,GAC1BK,IAASd,GAAqBS,EAAM,iBAAiB6B,EAAA,CAAeb,GAAQH,CAAO,CAAC,CAAC,MAAMiB,EAAY,MAAO;CACpH,IAAI,CAACzB,GAAQ;CACb,IAAMO,IAAUmB,EACdf,EAAO,MACPX,IACA,OAASL,EAAM,iBAAiB6B,EAAA,CAAe;EAAE,SAAS;EAAG,MAAMnC;EAAM,QAAQ,CAAC;CAAE,GAAGmB,CAAO,CAAC,CAAC,IAClG;CACA,OAAOD,IAAU;EAAE;EAAS;CAAO,IAAI,KAAA;AACzC;AAEA,SAASD,EAAY,GAAqB,GAA4C;CACpF,IAAIjB,EAAK,SAAS,SAChB,OAAOwB,EACLxB,GACAA,EAAK,SAAS,KAAI,MAASiB,EAAYU,GAAOd,CAAO,CAAC,CACxD;CACF,IAAMyB,IAAStC,EAAK,OAAO,QAAO,MAAM,CAACa,EAAQ,IAAImB,CAAE,CAAC;CAExD,OADKM,EAAO,SACL;EAAE,GAAGtC;EAAM;EAAQ,QAAQsC,EAAO,SAAStC,EAAK,MAAM,IAAIA,EAAK,SAASsC,EAAO;CAAI,IAD/D;AAE7B;AAEA,SAASlB,EACP,GACA,GACsB;CAGtB,OAFIpB,MAASM,EAAM,UAAgBA,EAAM,cACrCN,EAAK,SAAS,UAAgBiB,EAAYjB,GAAMM,EAAM,OAAO,IAC1DkB,EACLxB,GACAA,EAAK,SAAS,KAAI,MAASoB,EAAWO,GAAOrB,CAAK,CAAC,CACrD;AACF;AAEA,SAASD,EAAc,GAAsC;CAC3D,IAAM,EAAE,WAAQ,WAAQ,mBAAgBC;CACxC,IAAI,CAACgB,EAAO,QAAQ,CAACc,EAAY,UAAUA,EAAY,aAAa,SAAS,CAACxB,EAAO,QAAQ;CAC7F,IAAMG,IAAcc,EAAaP,GAAQV,CAAM;CAC/C,IAAI,CAACG,GAAa;CAClB,IAAMI,IAAUb,EAAM,UAAU,QAAO,MAAM,CAACgB,EAAO,OAAO,SAASU,CAAE,CAAC,GAClEO,IAAYL,EAAc5B,GAAOa,CAAO;CAC9C,IAAKoB,GACL,OAAO;EACL;EACA;EACA;EACA;EACA,GAAGA;EACH,UAAUH,EAAY;EACtB,eAAe9B,EAAM,iBAAiB6B;EACtC,MAAMb,EAAO;CACf;AACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Rect } from '@nvidia-elements/core/internal';
|
|
2
|
+
import type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';
|
|
3
|
+
import type { WorkspaceNode } from '../model/layout.utils.js';
|
|
4
|
+
export interface WorkspacePlacementScope {
|
|
5
|
+
kind: 'rail' | 'recipient';
|
|
6
|
+
members: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface WorkspaceScopeBounds {
|
|
9
|
+
key: string;
|
|
10
|
+
rect: Rect;
|
|
11
|
+
}
|
|
12
|
+
interface ScopeRectInput {
|
|
13
|
+
members: string[];
|
|
14
|
+
allocation: WorkspacePlacedRegion[];
|
|
15
|
+
source: string[];
|
|
16
|
+
}
|
|
17
|
+
export type WorkspaceScopeRectResolver = (input: ScopeRectInput) => Rect | undefined;
|
|
18
|
+
export declare function createPlacementScope(kind: WorkspacePlacementScope['kind'], node: WorkspaceNode | null, source: string[]): WorkspacePlacementScope;
|
|
19
|
+
/** Includes surviving peers whose computed allocation changes under split constraints. */
|
|
20
|
+
export declare function getAffectedSplitScope(input: {
|
|
21
|
+
baseline: WorkspacePlacedRegion[];
|
|
22
|
+
achieved: WorkspacePlacedRegion[];
|
|
23
|
+
source: string[];
|
|
24
|
+
recipient: string[];
|
|
25
|
+
}): WorkspacePlacementScope;
|
|
26
|
+
/** Seeds scope bounds before animation can change selection. */
|
|
27
|
+
export declare function getAllocatedScopes(input: {
|
|
28
|
+
catalog: WorkspacePlacedRegion[];
|
|
29
|
+
allocation: WorkspacePlacedRegion[];
|
|
30
|
+
source: string[];
|
|
31
|
+
}): WorkspaceScopeBounds[];
|
|
32
|
+
export declare function getAllocatedScopeRect(input: ScopeRectInput): Rect | undefined;
|
|
33
|
+
export declare function createScopeRectResolver(): WorkspaceScopeRectResolver;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { getPanelIds as e } from "../model/layout.utils.js";
|
|
2
|
+
import { getPanelMembershipKey as t } from "../model/membership.utils.js";
|
|
3
|
+
// src/workspace/utils/placement/scope.utils.ts
|
|
4
|
+
function n(t, n, r) {
|
|
5
|
+
let i = new Set(r);
|
|
6
|
+
return {
|
|
7
|
+
kind: t,
|
|
8
|
+
members: e(n).filter((e) => t === "rail" || !i.has(e))
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function r(t) {
|
|
12
|
+
let n = new Map(t.achieved.flatMap((e) => e.node.type === "group" ? e.node.panels.map((t) => [t, e.rect]) : [])), r = new Set(t.recipient);
|
|
13
|
+
for (let e of t.baseline) if (e.node.type === "group") for (let a of e.node.panels) {
|
|
14
|
+
if (t.source.includes(a)) continue;
|
|
15
|
+
let o = n.get(a);
|
|
16
|
+
o && i(e.rect, o) && r.add(a);
|
|
17
|
+
}
|
|
18
|
+
let a = t.baseline.filter((t) => {
|
|
19
|
+
let n = e(t.node);
|
|
20
|
+
return [...r].every((e) => n.includes(e));
|
|
21
|
+
}).at(-1);
|
|
22
|
+
return a ? {
|
|
23
|
+
kind: a.node.type === "group" ? "recipient" : "rail",
|
|
24
|
+
members: e(a.node)
|
|
25
|
+
} : {
|
|
26
|
+
kind: "recipient",
|
|
27
|
+
members: t.recipient
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function i(e, t) {
|
|
31
|
+
return [
|
|
32
|
+
"x",
|
|
33
|
+
"y",
|
|
34
|
+
"width",
|
|
35
|
+
"height"
|
|
36
|
+
].some((n) => Math.abs(e[n] - t[n]) > 1e-6);
|
|
37
|
+
}
|
|
38
|
+
function a(n) {
|
|
39
|
+
let r = new Set(n.source), i = /* @__PURE__ */ new Map();
|
|
40
|
+
for (let a of n.catalog) {
|
|
41
|
+
let n = e(a.node), o = n.filter((e) => !r.has(e));
|
|
42
|
+
o.length && (i.set(t(n), n), o.length !== n.length && i.set(t(o), o));
|
|
43
|
+
}
|
|
44
|
+
let a = c(n.allocation);
|
|
45
|
+
return [...i].flatMap(([e, t]) => {
|
|
46
|
+
let n = u({
|
|
47
|
+
members: t,
|
|
48
|
+
geometry: a,
|
|
49
|
+
carried: r
|
|
50
|
+
});
|
|
51
|
+
return n ? [{
|
|
52
|
+
key: e,
|
|
53
|
+
rect: n
|
|
54
|
+
}] : [];
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function o(e) {
|
|
58
|
+
return u({
|
|
59
|
+
members: e.members,
|
|
60
|
+
geometry: c(e.allocation),
|
|
61
|
+
carried: new Set(e.source)
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function s() {
|
|
65
|
+
let e = /* @__PURE__ */ new WeakMap();
|
|
66
|
+
return (t) => {
|
|
67
|
+
let n = e.get(t.allocation);
|
|
68
|
+
return n || (n = c(t.allocation), e.set(t.allocation, n)), u({
|
|
69
|
+
members: t.members,
|
|
70
|
+
geometry: n,
|
|
71
|
+
carried: new Set(t.source)
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function c(t) {
|
|
76
|
+
let n = t.filter((e) => e.node.type === "group"), r = new Map(t.map((e, t) => [e.key, {
|
|
77
|
+
...e,
|
|
78
|
+
order: t,
|
|
79
|
+
leafCount: 0
|
|
80
|
+
}])), i = /* @__PURE__ */ new Map();
|
|
81
|
+
for (let t of n) e(t.node).forEach((e) => i.set(e, t.key));
|
|
82
|
+
for (let e of n) for (let t = e.key; t; t = f(t)) {
|
|
83
|
+
let e = r.get(t);
|
|
84
|
+
e && e.leafCount++;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
leaves: n,
|
|
88
|
+
byKey: r,
|
|
89
|
+
groupByMember: i
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function l(e, t) {
|
|
93
|
+
let n = /* @__PURE__ */ new Set();
|
|
94
|
+
for (let r of e) {
|
|
95
|
+
let e = t.get(r);
|
|
96
|
+
e !== void 0 && n.add(e);
|
|
97
|
+
}
|
|
98
|
+
return n;
|
|
99
|
+
}
|
|
100
|
+
function u(t) {
|
|
101
|
+
let { members: n, geometry: r, carried: i } = t, a = l(n, r.groupByMember);
|
|
102
|
+
if (!a.size) return;
|
|
103
|
+
let o = [...a], s = p(o), c = d(r, s, a.size);
|
|
104
|
+
if (c) return c;
|
|
105
|
+
let u = r.byKey.get(s);
|
|
106
|
+
if (u?.node.type !== "split") return;
|
|
107
|
+
let { depth: f, first: g, last: _ } = h(o, s);
|
|
108
|
+
if (r.leaves.filter((e) => {
|
|
109
|
+
let t = Number(e.key.split(".")[f]);
|
|
110
|
+
return m(e.key, s) && t >= g && t <= _;
|
|
111
|
+
}).some((t) => !a.has(t.key) && !e(t.node).every((e) => i.has(e)))) return;
|
|
112
|
+
let v = r.byKey.get(`${s}.${g}`), y = r.byKey.get(`${s}.${_}`);
|
|
113
|
+
if (v && y) return u.node.axis === "horizontal" ? {
|
|
114
|
+
x: v.rect.x,
|
|
115
|
+
y: u.rect.y,
|
|
116
|
+
width: y.rect.x + y.rect.width - v.rect.x,
|
|
117
|
+
height: u.rect.height
|
|
118
|
+
} : {
|
|
119
|
+
x: u.rect.x,
|
|
120
|
+
y: v.rect.y,
|
|
121
|
+
width: u.rect.width,
|
|
122
|
+
height: y.rect.y + y.rect.height - v.rect.y
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function d(e, t, n) {
|
|
126
|
+
let r, i = -1;
|
|
127
|
+
for (let a = t; a; a = f(a)) {
|
|
128
|
+
let t = e.byKey.get(a);
|
|
129
|
+
t?.leafCount === n && t.order > i && (r = t.rect, i = t.order);
|
|
130
|
+
}
|
|
131
|
+
return r;
|
|
132
|
+
}
|
|
133
|
+
function f(e) {
|
|
134
|
+
let t = e.lastIndexOf(".");
|
|
135
|
+
return t < 0 ? "" : e.slice(0, t);
|
|
136
|
+
}
|
|
137
|
+
function p(e) {
|
|
138
|
+
let t = e[0];
|
|
139
|
+
for (let n of e) for (; !m(n, t);) t = f(t);
|
|
140
|
+
return t;
|
|
141
|
+
}
|
|
142
|
+
function m(e, t) {
|
|
143
|
+
return e === t || e.startsWith(`${t}.`);
|
|
144
|
+
}
|
|
145
|
+
function h(e, t) {
|
|
146
|
+
let n = t.split(".").length, r = e.map((e) => Number(e.split(".")[n]));
|
|
147
|
+
return {
|
|
148
|
+
depth: n,
|
|
149
|
+
first: Math.min(...r),
|
|
150
|
+
last: Math.max(...r)
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export { n as createPlacementScope, s as createScopeRectResolver, r as getAffectedSplitScope, o as getAllocatedScopeRect, a as getAllocatedScopes };
|
|
154
|
+
|
|
155
|
+
//# sourceMappingURL=scope.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.utils.js","names":["createPlacementScope","carried","source","getPanelIds","node","kind","id","getAffectedSplitScope","achieved","input","region","affected","after","hasRectChanged","members","candidate","before","key","getAllocatedScopes","memberships","full","remaining","getPanelMembershipKey","geometry","createAllocationIndex","rect","getScopeRect","getAllocatedScopeRect","createScopeRectResolver","indices","leaves","regions","byKey","groupByMember","leaf","getParentRegionKey","scope","getSelectedRegionKeys","selected","keys","prefix","getCommonRegionKey","exact","findExactScopeRect","parent","getChildRange","index","depth","isWithinRegion","first","last","order","leafCount","separator"],"sources":["../../../../src/workspace/utils/placement/scope.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Rect } from '@nvidia-elements/core/internal';\n\nimport { getPanelIds } from '../model/layout.utils.js';\nimport { getPanelMembershipKey } from '../model/membership.utils.js';\n\nimport type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';\nimport type { WorkspaceNode } from '../model/layout.utils.js';\n\nexport interface WorkspacePlacementScope {\n kind: 'rail' | 'recipient';\n members: string[];\n}\n\nexport interface WorkspaceScopeBounds {\n key: string;\n rect: Rect;\n}\n\ninterface ScopeRectInput {\n members: string[];\n allocation: WorkspacePlacedRegion[];\n source: string[];\n}\n\nexport type WorkspaceScopeRectResolver = (input: ScopeRectInput) => Rect | undefined;\n\nexport function createPlacementScope(\n kind: WorkspacePlacementScope['kind'],\n node: WorkspaceNode | null,\n source: string[]\n): WorkspacePlacementScope {\n const carried = new Set(source);\n return { kind, members: getPanelIds(node).filter(id => kind === 'rail' || !carried.has(id)) };\n}\n\n/** Includes surviving peers whose computed allocation changes under split constraints. */\nexport function getAffectedSplitScope(input: {\n baseline: WorkspacePlacedRegion[];\n achieved: WorkspacePlacedRegion[];\n source: string[];\n recipient: string[];\n}): WorkspacePlacementScope {\n const achieved = new Map(\n input.achieved.flatMap(region =>\n region.node.type === 'group' ? region.node.panels.map(id => [id, region.rect] as const) : []\n )\n );\n const affected = new Set(input.recipient);\n for (const region of input.baseline) {\n if (region.node.type !== 'group') continue;\n for (const id of region.node.panels) {\n if (input.source.includes(id)) continue;\n const after = achieved.get(id);\n if (after && hasRectChanged(region.rect, after)) {\n affected.add(id);\n }\n }\n }\n const region = input.baseline\n .filter(candidate => {\n const members = getPanelIds(candidate.node);\n return [...affected].every(id => members.includes(id));\n })\n .at(-1);\n return region\n ? { kind: region.node.type === 'group' ? 'recipient' : 'rail', members: getPanelIds(region.node) }\n : { kind: 'recipient', members: input.recipient };\n}\n\nfunction hasRectChanged(before: Rect, after: Rect) {\n return (['x', 'y', 'width', 'height'] as const).some(key => Math.abs(before[key] - after[key]) > 0.000001);\n}\n\n/** Seeds scope bounds before animation can change selection. */\nexport function getAllocatedScopes(input: {\n catalog: WorkspacePlacedRegion[];\n allocation: WorkspacePlacedRegion[];\n source: string[];\n}): WorkspaceScopeBounds[] {\n const carried = new Set(input.source);\n const memberships = new Map<string, string[]>();\n for (const region of input.catalog) {\n const full = getPanelIds(region.node);\n const remaining = full.filter(id => !carried.has(id));\n if (!remaining.length) continue;\n memberships.set(getPanelMembershipKey(full), full);\n if (remaining.length !== full.length) memberships.set(getPanelMembershipKey(remaining), remaining);\n }\n const geometry = createAllocationIndex(input.allocation);\n return [...memberships].flatMap(([key, members]) => {\n const rect = getScopeRect({ members, geometry, carried });\n return rect ? [{ key, rect }] : [];\n });\n}\n\nexport function getAllocatedScopeRect(input: ScopeRectInput): Rect | undefined {\n return getScopeRect({\n members: input.members,\n geometry: createAllocationIndex(input.allocation),\n carried: new Set(input.source)\n });\n}\n\nexport function createScopeRectResolver(): WorkspaceScopeRectResolver {\n const indices = new WeakMap<WorkspacePlacedRegion[], ReturnType<typeof createAllocationIndex>>();\n return input => {\n let geometry = indices.get(input.allocation);\n if (!geometry) {\n geometry = createAllocationIndex(input.allocation);\n indices.set(input.allocation, geometry);\n }\n return getScopeRect({ members: input.members, geometry, carried: new Set(input.source) });\n };\n}\n\nfunction createAllocationIndex(regions: WorkspacePlacedRegion[]) {\n const leaves = regions.filter(region => region.node.type === 'group');\n const byKey = new Map(regions.map((region, order) => [region.key, { ...region, order, leafCount: 0 }]));\n const groupByMember = new Map<string, string>();\n for (const leaf of leaves) {\n getPanelIds(leaf.node).forEach(id => groupByMember.set(id, leaf.key));\n }\n for (const leaf of leaves) {\n for (let key = leaf.key; key; key = getParentRegionKey(key)) {\n const scope = byKey.get(key);\n if (scope) scope.leafCount++;\n }\n }\n return { leaves, byKey, groupByMember };\n}\n\nfunction getSelectedRegionKeys(members: string[], groupByMember: ReadonlyMap<string, string>) {\n const selected = new Set<string>();\n for (const id of members) {\n const key = groupByMember.get(id);\n if (key !== undefined) selected.add(key);\n }\n return selected;\n}\n\n// eslint-disable-next-line max-statements -- Resolve exact scopes before the contiguous-range fallback.\nfunction getScopeRect(input: {\n members: string[];\n geometry: ReturnType<typeof createAllocationIndex>;\n carried: Set<string>;\n}): Rect | undefined {\n const { members, geometry, carried } = input;\n const selected = getSelectedRegionKeys(members, geometry.groupByMember);\n if (!selected.size) return undefined;\n const keys = [...selected];\n const prefix = getCommonRegionKey(keys);\n const exact = findExactScopeRect(geometry, prefix, selected.size);\n if (exact) return exact;\n const parent = geometry.byKey.get(prefix);\n if (parent?.node.type !== 'split') return undefined;\n const { depth, first, last } = getChildRange(keys, prefix);\n const covered = geometry.leaves.filter(leaf => {\n const index = Number(leaf.key.split('.')[depth]);\n return isWithinRegion(leaf.key, prefix) && index >= first && index <= last;\n });\n if (covered.some(leaf => !selected.has(leaf.key) && !getPanelIds(leaf.node).every(id => carried.has(id))))\n return undefined;\n const before = geometry.byKey.get(`${prefix}.${first}`);\n const after = geometry.byKey.get(`${prefix}.${last}`);\n if (!before || !after) return undefined;\n return parent.node.axis === 'horizontal'\n ? {\n x: before.rect.x,\n y: parent.rect.y,\n width: after.rect.x + after.rect.width - before.rect.x,\n height: parent.rect.height\n }\n : {\n x: parent.rect.x,\n y: before.rect.y,\n width: parent.rect.width,\n height: after.rect.y + after.rect.height - before.rect.y\n };\n}\n\nfunction findExactScopeRect(geometry: ReturnType<typeof createAllocationIndex>, prefix: string, leafCount: number) {\n let rect: Rect | undefined;\n let order = -1;\n for (let key = prefix; key; key = getParentRegionKey(key)) {\n const scope = geometry.byKey.get(key);\n // Scopes with the same leaves use the last supplied region, including filtered catalogs.\n if (scope?.leafCount === leafCount && scope.order > order) {\n rect = scope.rect;\n order = scope.order;\n }\n }\n return rect;\n}\n\nfunction getParentRegionKey(key: string) {\n const separator = key.lastIndexOf('.');\n return separator < 0 ? '' : key.slice(0, separator);\n}\n\nfunction getCommonRegionKey(keys: string[]): string {\n let prefix = keys[0]!;\n for (const key of keys) {\n while (!isWithinRegion(key, prefix)) prefix = getParentRegionKey(prefix);\n }\n return prefix;\n}\n\nfunction isWithinRegion(key: string, parent: string): boolean {\n return key === parent || key.startsWith(`${parent}.`);\n}\n\nfunction getChildRange(keys: string[], parent: string) {\n const depth = parent.split('.').length;\n const indices = keys.map(key => Number(key.split('.')[depth]));\n return { depth, first: Math.min(...indices), last: Math.max(...indices) };\n}\n"],"mappings":";;;AA6BA,SAAgBA,EACd,GACA,GACA,GACyB;CACzB,IAAMC,IAAU,IAAI,IAAIC,CAAM;CAC9B,OAAO;EAAE;EAAM,SAASC,EAAYC,CAAI,CAAC,CAAC,QAAO,MAAMC,MAAS,UAAU,CAACJ,EAAQ,IAAIK,CAAE,CAAC;CAAE;AAC9F;AAGA,SAAgBC,EAAsB,GAKV;CAC1B,IAAMC,IAAW,IAAI,IACnBC,EAAM,SAAS,SAAQ,MACrBC,EAAO,KAAK,SAAS,UAAUA,EAAO,KAAK,OAAO,KAAI,MAAM,CAACJ,GAAII,EAAO,IAAI,CAAU,IAAI,CAAC,CAC7F,CACF,GACMC,IAAW,IAAI,IAAIF,EAAM,SAAS;CACxC,KAAK,IAAMC,KAAUD,EAAM,UACzB,IAAIC,EAAO,KAAK,SAAS,SACzB,KAAK,IAAMJ,KAAMI,EAAO,KAAK,QAAQ;EACnC,IAAID,EAAM,OAAO,SAASH,CAAE,GAAG;EAC/B,IAAMM,IAAQJ,EAAS,IAAIF,CAAE;EAC7B,AAAIM,KAASC,EAAeH,EAAO,MAAME,CAAK,KAC5CD,EAAS,IAAIL,CAAE;CAEnB;CAEF,IAAMI,IAASD,EAAM,SAClB,QAAO,MAAa;EACnB,IAAMK,IAAUX,EAAYY,EAAU,IAAI;EAC1C,OAAO,CAAC,GAAGJ,CAAQ,CAAC,CAAC,OAAM,MAAMG,EAAQ,SAASR,CAAE,CAAC;CACvD,CAAC,CAAC,CACD,GAAG,EAAE;CACR,OAAOI,IACH;EAAE,MAAMA,EAAO,KAAK,SAAS,UAAU,cAAc;EAAQ,SAASP,EAAYO,EAAO,IAAI;CAAE,IAC/F;EAAE,MAAM;EAAa,SAASD,EAAM;CAAU;AACpD;AAEA,SAASI,EAAe,GAAc,GAAa;CACjD,OAAQ;EAAC;EAAK;EAAK;EAAS;CAAQ,CAAC,CAAW,MAAK,MAAO,KAAK,IAAIG,EAAOC,KAAOL,EAAMK,EAAI,IAAI,IAAQ;AAC3G;AAGA,SAAgBC,EAAmB,GAIR;CACzB,IAAMjB,IAAU,IAAI,IAAIQ,EAAM,MAAM,GAC9BU,oBAAc,IAAI,IAAsB;CAC9C,KAAK,IAAMT,KAAUD,EAAM,SAAS;EAClC,IAAMW,IAAOjB,EAAYO,EAAO,IAAI,GAC9BW,IAAYD,EAAK,QAAO,MAAM,CAACnB,EAAQ,IAAIK,CAAE,CAAC;EACpD,AAAKe,EAAU,WACfF,EAAY,IAAIG,EAAsBF,CAAI,GAAGA,CAAI,GAC7CC,EAAU,WAAWD,EAAK,UAAQD,EAAY,IAAIG,EAAsBD,CAAS,GAAGA,CAAS;CACnG;CACA,IAAME,IAAWC,EAAsBf,EAAM,UAAU;CACvD,OAAO,CAAC,GAAGU,CAAW,CAAC,CAAC,SAAS,CAACF,GAAKH,OAAa;EAClD,IAAMW,IAAOC,EAAa;GAAE;GAAS;GAAU;EAAQ,CAAC;EACxD,OAAOD,IAAO,CAAC;GAAE;GAAK;EAAK,CAAC,IAAI,CAAC;CACnC,CAAC;AACH;AAEA,SAAgBE,EAAsB,GAAyC;CAC7E,OAAOD,EAAa;EAClB,SAASjB,EAAM;EACf,UAAUe,EAAsBf,EAAM,UAAU;EAChD,SAAS,IAAI,IAAIA,EAAM,MAAM;CAC/B,CAAC;AACH;AAEA,SAAgBmB,IAAsD;CACpE,IAAMC,oBAAU,IAAI,QAA2E;CAC/F,QAAO,MAAS;EACd,IAAIN,IAAWM,EAAQ,IAAIpB,EAAM,UAAU;EAK3C,OAJKc,MACH,IAAWC,EAAsBf,EAAM,UAAU,GACjDoB,EAAQ,IAAIpB,EAAM,YAAYc,CAAQ,IAEjCG,EAAa;GAAE,SAASjB,EAAM;GAAS;GAAU,SAAS,IAAI,IAAIA,EAAM,MAAM;EAAE,CAAC;CAC1F;AACF;AAEA,SAASe,EAAsB,GAAkC;CAC/D,IAAMM,IAASC,EAAQ,QAAO,MAAUrB,EAAO,KAAK,SAAS,OAAO,GAC9DsB,IAAQ,IAAI,IAAID,EAAQ,KAAK,GAAQ,MAAU,CAACrB,EAAO,KAAK;EAAE,GAAGA;EAAQ;EAAO,WAAW;CAAE,CAAC,CAAC,CAAC,GAChGuB,oBAAgB,IAAI,IAAoB;CAC9C,KAAK,IAAMC,KAAQJ,GACjB,EAAYI,EAAK,IAAI,CAAC,CAAC,SAAQ,MAAMD,EAAc,IAAI3B,GAAI4B,EAAK,GAAG,CAAC;CAEtE,KAAK,IAAMA,KAAQJ,GACjB,KAAK,IAAIb,IAAMiB,EAAK,KAAKjB,GAAK,IAAMkB,EAAmBlB,CAAG,GAAG;EAC3D,IAAMmB,IAAQJ,EAAM,IAAIf,CAAG;EAC3B,AAAImB,KAAO,EAAM;CACnB;CAEF,OAAO;EAAE;EAAQ;EAAO;CAAc;AACxC;AAEA,SAASC,EAAsB,GAAmB,GAA4C;CAC5F,IAAMC,oBAAW,IAAI,IAAY;CACjC,KAAK,IAAMhC,KAAMQ,GAAS;EACxB,IAAMG,IAAMgB,EAAc,IAAI3B,CAAE;EAChC,AAAIW,MAAQ,KAAA,KAAWqB,EAAS,IAAIrB,CAAG;CACzC;CACA,OAAOqB;AACT;AAGA,SAASZ,EAAa,GAID;CACnB,IAAM,EAAE,YAAS,aAAU,eAAYjB,GACjC6B,IAAWD,EAAsBvB,GAASS,EAAS,aAAa;CACtE,IAAI,CAACe,EAAS,MAAM;CACpB,IAAMC,IAAO,CAAC,GAAGD,CAAQ,GACnBE,IAASC,EAAmBF,CAAI,GAChCG,IAAQC,EAAmBpB,GAAUiB,GAAQF,EAAS,IAAI;CAChE,IAAII,GAAO,OAAOA;CAClB,IAAME,IAASrB,EAAS,MAAM,IAAIiB,CAAM;CACxC,IAAII,GAAQ,KAAK,SAAS,SAAS;CACnC,IAAM,EAAE,UAAO,UAAO,YAASC,EAAcN,GAAMC,CAAM;CAKzD,IAJgBjB,EAAS,OAAO,QAAO,MAAQ;EAC7C,IAAMuB,IAAQ,OAAOZ,EAAK,IAAI,MAAM,GAAG,CAAC,CAACa,EAAM;EAC/C,OAAOC,EAAed,EAAK,KAAKM,CAAM,KAAKM,KAASG,KAASH,KAASI;CACxE,CACI,CAAA,CAAQ,MAAK,MAAQ,CAACZ,EAAS,IAAIJ,EAAK,GAAG,KAAK,CAAC/B,EAAY+B,EAAK,IAAI,CAAC,CAAC,OAAM,MAAMjC,EAAQ,IAAIK,CAAE,CAAC,CAAC,GACtG;CACF,IAAMU,IAASO,EAAS,MAAM,IAAI,GAAGiB,EAAO,GAAGS,GAAO,GAChDrC,IAAQW,EAAS,MAAM,IAAI,GAAGiB,EAAO,GAAGU,GAAM;CACpD,IAAKlC,KAAWJ,GAChB,OAAOgC,EAAO,KAAK,SAAS,eACxB;EACE,GAAG5B,EAAO,KAAK;EACf,GAAG4B,EAAO,KAAK;EACf,OAAOhC,EAAM,KAAK,IAAIA,EAAM,KAAK,QAAQI,EAAO,KAAK;EACrD,QAAQ4B,EAAO,KAAK;CACtB,IACA;EACE,GAAGA,EAAO,KAAK;EACf,GAAG5B,EAAO,KAAK;EACf,OAAO4B,EAAO,KAAK;EACnB,QAAQhC,EAAM,KAAK,IAAIA,EAAM,KAAK,SAASI,EAAO,KAAK;CACzD;AACN;AAEA,SAAS2B,EAAmB,GAAoD,GAAgB,GAAmB;CACjH,IAAIlB,GACA0B,IAAQ;CACZ,KAAK,IAAIlC,IAAMuB,GAAQvB,GAAK,IAAMkB,EAAmBlB,CAAG,GAAG;EACzD,IAAMmB,IAAQb,EAAS,MAAM,IAAIN,CAAG;EAEpC,AAAImB,GAAO,cAAcgB,KAAahB,EAAM,QAAQe,MAClD,IAAOf,EAAM,MACb,IAAQA,EAAM;CAElB;CACA,OAAOX;AACT;AAEA,SAASU,EAAmB,GAAa;CACvC,IAAMkB,IAAYpC,EAAI,YAAY,GAAG;CACrC,OAAOoC,IAAY,IAAI,KAAKpC,EAAI,MAAM,GAAGoC,CAAS;AACpD;AAEA,SAASZ,EAAmB,GAAwB;CAClD,IAAID,IAASD,EAAK;CAClB,KAAK,IAAMtB,KAAOsB,GAChB,OAAO,CAACS,EAAe/B,GAAKuB,CAAM,IAAG,IAASL,EAAmBK,CAAM;CAEzE,OAAOA;AACT;AAEA,SAASQ,EAAe,GAAa,GAAyB;CAC5D,OAAO/B,MAAQ2B,KAAU3B,EAAI,WAAW,GAAG2B,EAAO,EAAE;AACtD;AAEA,SAASC,EAAc,GAAgB,GAAgB;CACrD,IAAME,IAAQH,EAAO,MAAM,GAAG,CAAC,CAAC,QAC1Bf,IAAUU,EAAK,KAAI,MAAO,OAAOtB,EAAI,MAAM,GAAG,CAAC,CAAC8B,EAAM,CAAC;CAC7D,OAAO;EAAE;EAAO,OAAO,KAAK,IAAI,GAAGlB,CAAO;EAAG,MAAM,KAAK,IAAI,GAAGA,CAAO;CAAE;AAC1E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { WorkspaceDragOffer } from '../interaction/drag-preview.utils.js';
|
|
2
|
+
import type { GroupInsertion, GroupInsertionInputs } from './group-insertion.utils.js';
|
|
3
|
+
import type { WorkspacePlacementPlanner } from './planner.utils.js';
|
|
4
|
+
import type { WorkspacePlacementOfferInputs } from './preparation.utils.js';
|
|
5
|
+
/** Owns reusable planning work until the component finishes its current drag. */
|
|
6
|
+
export declare class WorkspacePlacementSession {
|
|
7
|
+
#private;
|
|
8
|
+
plan(input: Parameters<WorkspacePlacementPlanner>[0]): import("./planner.utils.js").WorkspacePlacementPlan | undefined;
|
|
9
|
+
getInsertion(input: GroupInsertionInputs): GroupInsertion | undefined;
|
|
10
|
+
prepareOffer(input: WorkspacePlacementOfferInputs): WorkspaceDragOffer | undefined;
|
|
11
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { sameArrayItems as e, sameRect as t } from "../comparison.utils.js";
|
|
2
|
+
import { sameDestination as n } from "../model/operations.utils.js";
|
|
3
|
+
import { canReuseLayoutProjection as r } from "../model/projection.utils.js";
|
|
4
|
+
import { computeGroupInsertion as i } from "./group-insertion.utils.js";
|
|
5
|
+
import { createWorkspacePlacementPlanner as a, planWorkspacePlacement as o } from "./planner.utils.js";
|
|
6
|
+
import { sameWorkspaceRequirements as s } from "../geometry/sizing.utils.js";
|
|
7
|
+
import { computePlacementOffer as c } from "./preparation.utils.js";
|
|
8
|
+
// src/workspace/utils/placement/session.utils.ts
|
|
9
|
+
var l = class {
|
|
10
|
+
#e = a();
|
|
11
|
+
#t = /* @__PURE__ */ new WeakSet();
|
|
12
|
+
#n = /* @__PURE__ */ new WeakMap();
|
|
13
|
+
#r;
|
|
14
|
+
plan(e) {
|
|
15
|
+
if (!r(e.projectLayout)) return o(e);
|
|
16
|
+
let t = this.#e(e);
|
|
17
|
+
return t && this.#t.add(t.layout), t;
|
|
18
|
+
}
|
|
19
|
+
getInsertion(t) {
|
|
20
|
+
let n = t.plan.layout;
|
|
21
|
+
if (t.planPlacement || !this.#t.has(n) || !r(t.projectLayout)) return this.#n.delete(n), i(t);
|
|
22
|
+
let a = this.#n.get(n);
|
|
23
|
+
if (a && e(a.source, t.source) && e(a.available, t.available) && e(a.closed, n.closed)) return a.insertion;
|
|
24
|
+
this.#n.delete(n);
|
|
25
|
+
let o = i(t);
|
|
26
|
+
return this.#n.set(n, {
|
|
27
|
+
source: [...t.source],
|
|
28
|
+
available: [...t.available],
|
|
29
|
+
closed: [...n.closed],
|
|
30
|
+
insertion: o
|
|
31
|
+
}), o;
|
|
32
|
+
}
|
|
33
|
+
prepareOffer(e) {
|
|
34
|
+
if (!u(e)) return this.#r = void 0, this.#i(e);
|
|
35
|
+
let n = e.evaluation.bounds(), r = e.evaluation.client({
|
|
36
|
+
x: 0,
|
|
37
|
+
y: 0,
|
|
38
|
+
width: 0,
|
|
39
|
+
height: 0
|
|
40
|
+
}), i = this.#r;
|
|
41
|
+
if (i && d(i, e) && t(i.bounds, n) && t(i.origin, r)) return i.offer;
|
|
42
|
+
this.#r = void 0;
|
|
43
|
+
let a = this.#i(e), { target: o, position: s, region: c, index: l } = e.intent.destination;
|
|
44
|
+
return this.#r = {
|
|
45
|
+
layout: e.layout,
|
|
46
|
+
measurements: e.measurements,
|
|
47
|
+
groupable: e.groupable,
|
|
48
|
+
source: [...e.source],
|
|
49
|
+
available: e.evaluation.available,
|
|
50
|
+
requirements: e.evaluation.requirements,
|
|
51
|
+
destination: {
|
|
52
|
+
target: o,
|
|
53
|
+
position: s,
|
|
54
|
+
region: c,
|
|
55
|
+
index: l
|
|
56
|
+
},
|
|
57
|
+
bounds: n,
|
|
58
|
+
origin: r,
|
|
59
|
+
offer: a
|
|
60
|
+
}, a;
|
|
61
|
+
}
|
|
62
|
+
#i(e) {
|
|
63
|
+
let t = e.planner || e.placementSession === this ? e : {
|
|
64
|
+
...e,
|
|
65
|
+
placementSession: this
|
|
66
|
+
};
|
|
67
|
+
return c(t);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
function u(e) {
|
|
71
|
+
return !e.planner && r(e.evaluation.projectLayout) && e.intent.kind === "split" && !e.context?.acquisition && !e.context?.selected?.blocked;
|
|
72
|
+
}
|
|
73
|
+
function d(t, r) {
|
|
74
|
+
return t.layout === r.layout && t.measurements === r.measurements && t.groupable === r.groupable && e(t.source, r.source) && e(t.available, r.evaluation.available) && n(t.destination, r.intent.destination) && s(t.requirements, r.evaluation.requirements);
|
|
75
|
+
}
|
|
76
|
+
export { l as WorkspacePlacementSession };
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=session.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.utils.js","names":["WorkspacePlacementSession","createWorkspacePlacementPlanner","canReuseLayoutProjection","input","planWorkspacePlacement","plan","#planner","#producedLayouts","layout","#insertions","computeGroupInsertion","previous","sameArrayItems","insertion","canReuseSplitOffer","#splitOffer","#computeOffer","bounds","origin","sameOfferInputs","sameRect","offer","sessionInput","computePlacementOffer","sameDestination","sameWorkspaceRequirements"],"sources":["../../../../src/workspace/utils/placement/session.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Rect } from '@nvidia-elements/core/internal';\n\nimport { sameWorkspaceRequirements } from '../geometry/sizing.utils.js';\nimport { sameDestination } from '../model/operations.utils.js';\nimport { canReuseLayoutProjection } from '../model/projection.utils.js';\nimport { computeGroupInsertion } from './group-insertion.utils.js';\nimport { createWorkspacePlacementPlanner, planWorkspacePlacement } from './planner.utils.js';\nimport { computePlacementOffer } from './preparation.utils.js';\nimport { sameArrayItems, sameRect } from '../comparison.utils.js';\n\nimport type { WorkspaceRequirements } from '../geometry/sizing.utils.js';\nimport type { WorkspaceDragOffer } from '../interaction/drag-preview.utils.js';\nimport type { WorkspaceLayout } from '../model/layout.utils.js';\nimport type { WorkspaceDestination } from '../model/operations.utils.js';\nimport type { GroupInsertion, GroupInsertionInputs } from './group-insertion.utils.js';\nimport type { WorkspacePlacementPlanner } from './planner.utils.js';\nimport type { WorkspacePlacementOfferInputs } from './preparation.utils.js';\nimport type { WorkspaceMeasurements } from '../presentation/measurements.utils.js';\n\ninterface CachedInsertion {\n source: string[];\n available: string[];\n closed: string[];\n insertion: GroupInsertion | undefined;\n}\n\ninterface CachedSplitOffer {\n layout: WorkspaceLayout;\n measurements: WorkspaceMeasurements;\n groupable: boolean;\n source: string[];\n available: string[];\n requirements: WorkspaceRequirements;\n destination: WorkspaceDestination;\n bounds: Rect;\n origin: Rect;\n offer: WorkspaceDragOffer | undefined;\n}\n\n/** Owns reusable planning work until the component finishes its current drag. */\nexport class WorkspacePlacementSession {\n readonly #planner = createWorkspacePlacementPlanner();\n readonly #producedLayouts = new WeakSet<WorkspaceLayout>();\n readonly #insertions = new WeakMap<WorkspaceLayout, CachedInsertion>();\n #splitOffer?: CachedSplitOffer;\n\n plan(input: Parameters<WorkspacePlacementPlanner>[0]) {\n if (!canReuseLayoutProjection(input.projectLayout)) return planWorkspacePlacement(input);\n const plan = this.#planner(input);\n if (plan) this.#producedLayouts.add(plan.layout);\n return plan;\n }\n\n getInsertion(input: GroupInsertionInputs): GroupInsertion | undefined {\n const layout = input.plan.layout;\n if (input.planPlacement || !this.#producedLayouts.has(layout) || !canReuseLayoutProjection(input.projectLayout)) {\n this.#insertions.delete(layout);\n return computeGroupInsertion(input);\n }\n const previous = this.#insertions.get(layout);\n if (\n previous &&\n sameArrayItems(previous.source, input.source) &&\n sameArrayItems(previous.available, input.available) &&\n sameArrayItems(previous.closed, layout.closed)\n )\n return previous.insertion;\n this.#insertions.delete(layout);\n const insertion = computeGroupInsertion(input);\n this.#insertions.set(layout, {\n source: [...input.source],\n available: [...input.available],\n closed: [...layout.closed],\n insertion\n });\n return insertion;\n }\n\n prepareOffer(input: WorkspacePlacementOfferInputs): WorkspaceDragOffer | undefined {\n if (!canReuseSplitOffer(input)) {\n this.#splitOffer = undefined;\n return this.#computeOffer(input);\n }\n const bounds = input.evaluation.bounds();\n const origin = input.evaluation.client({ x: 0, y: 0, width: 0, height: 0 });\n const previous = this.#splitOffer;\n if (\n previous &&\n sameOfferInputs(previous, input) &&\n sameRect(previous.bounds, bounds) &&\n sameRect(previous.origin, origin)\n ) {\n return previous.offer;\n }\n this.#splitOffer = undefined;\n const offer = this.#computeOffer(input);\n const { target, position, region, index } = input.intent.destination;\n this.#splitOffer = {\n layout: input.layout,\n measurements: input.measurements,\n groupable: input.groupable,\n source: [...input.source],\n available: input.evaluation.available,\n requirements: input.evaluation.requirements,\n destination: { target, position, region, index },\n bounds,\n origin,\n offer\n };\n return offer;\n }\n\n #computeOffer(input: WorkspacePlacementOfferInputs) {\n const sessionInput =\n input.planner || input.placementSession === this ? input : { ...input, placementSession: this };\n return computePlacementOffer(sessionInput);\n }\n}\n\nfunction canReuseSplitOffer(input: WorkspacePlacementOfferInputs) {\n return (\n !input.planner &&\n canReuseLayoutProjection(input.evaluation.projectLayout) &&\n input.intent.kind === 'split' &&\n !input.context?.acquisition &&\n !input.context?.selected?.blocked\n );\n}\n\nfunction sameOfferInputs(previous: CachedSplitOffer, input: WorkspacePlacementOfferInputs) {\n return (\n previous.layout === input.layout &&\n previous.measurements === input.measurements &&\n previous.groupable === input.groupable &&\n sameArrayItems(previous.source, input.source) &&\n sameArrayItems(previous.available, input.evaluation.available) &&\n sameDestination(previous.destination, input.intent.destination) &&\n sameWorkspaceRequirements(previous.requirements, input.evaluation.requirements)\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';
|
|
2
2
|
import type { WorkspaceRequirements } from '../geometry/sizing.utils.js';
|
|
3
3
|
import type { WorkspaceLayoutProjector } from '../model/projection.utils.js';
|
|
4
|
-
import type { WorkspaceContextRectResolver } from './context.utils.js';
|
|
5
4
|
import type { WorkspacePlacementPlan } from './planner.utils.js';
|
|
5
|
+
import type { WorkspaceScopeRectResolver } from './scope.utils.js';
|
|
6
6
|
export interface WorkspaceSplitPreference {
|
|
7
7
|
allocation: WorkspacePlacedRegion[];
|
|
8
8
|
requirements: WorkspaceRequirements;
|
|
9
|
-
|
|
9
|
+
resolveScopeRect?: WorkspaceScopeRectResolver;
|
|
10
10
|
}
|
|
11
11
|
/** Fits placements to the final normalized branch budget, including every separator. */
|
|
12
12
|
export declare function sizePreferredSplit(input: {
|
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
import { getPanelIds as e } from "../model/layout.utils.js";
|
|
2
2
|
import { projectLayout as t } from "../model/operations.utils.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { rebaseProjectedSplit as n } from "../model/projection.utils.js";
|
|
4
|
+
import { getAllocatedScopeRect as r } from "./scope.utils.js";
|
|
5
5
|
import { getMinimumWorkspaceDimensions as i } from "../geometry/sizing.utils.js";
|
|
6
6
|
import { fitSizes as a } from "../geometry/partition.utils.js";
|
|
7
7
|
// src/workspace/utils/placement/split-sizing.utils.ts
|
|
8
8
|
function o(e) {
|
|
9
|
-
let { plan:
|
|
10
|
-
if (!i || !
|
|
11
|
-
let c = (e.projectLayout ?? t)(
|
|
12
|
-
if (!l) return
|
|
9
|
+
let { plan: r, preference: i, source: a, available: o } = e;
|
|
10
|
+
if (!i || !r.scope || r.kind !== "split") return r;
|
|
11
|
+
let c = (e.projectLayout ?? t)(r.layout, o).root, l = p(c, a);
|
|
12
|
+
if (!l) return r;
|
|
13
13
|
let d = s({
|
|
14
14
|
branch: l,
|
|
15
15
|
preference: i,
|
|
16
16
|
source: a,
|
|
17
|
-
recipients:
|
|
17
|
+
recipients: r.scope.members
|
|
18
18
|
});
|
|
19
|
-
if (!d) return
|
|
19
|
+
if (!d) return r;
|
|
20
20
|
let f = u(d);
|
|
21
|
-
if (!f) return
|
|
22
|
-
let m = r
|
|
21
|
+
if (!f) return r;
|
|
22
|
+
let m = n(r.layout, l, f, o, e.projectLayout);
|
|
23
23
|
return m ? {
|
|
24
|
-
...
|
|
24
|
+
...r,
|
|
25
25
|
layout: m
|
|
26
|
-
} :
|
|
26
|
+
} : r;
|
|
27
27
|
}
|
|
28
28
|
function s(t) {
|
|
29
|
-
let { branch:
|
|
30
|
-
members: e(
|
|
29
|
+
let { branch: n, preference: i, source: a, recipients: o } = t, s = n.axis === "horizontal" ? "width" : "height", u = (i.resolveScopeRect ?? r)({
|
|
30
|
+
members: e(n).filter((e) => !a.includes(e)),
|
|
31
31
|
allocation: i.allocation,
|
|
32
32
|
source: a
|
|
33
33
|
});
|
|
34
34
|
if (!u) return;
|
|
35
35
|
let d = l({
|
|
36
|
-
branch:
|
|
36
|
+
branch: n,
|
|
37
37
|
preference: i,
|
|
38
38
|
source: a,
|
|
39
39
|
recipients: o
|
|
@@ -50,7 +50,7 @@ function s(t) {
|
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
function c(e) {
|
|
53
|
-
let t = (e.preference.
|
|
53
|
+
let t = (e.preference.resolveScopeRect ?? r)({
|
|
54
54
|
members: e.members,
|
|
55
55
|
allocation: e.preference.allocation,
|
|
56
56
|
source: e.source
|
|
@@ -58,9 +58,9 @@ function c(e) {
|
|
|
58
58
|
return t ? Math.max(0, (t[e.axis] - e.preference.requirements.gap) / 2) : NaN;
|
|
59
59
|
}
|
|
60
60
|
function l(t) {
|
|
61
|
-
let { branch:
|
|
62
|
-
let
|
|
63
|
-
members:
|
|
61
|
+
let { branch: n, preference: a, source: o, recipients: s } = t, c = n.axis === "horizontal" ? "width" : "height", l = n.children.map((t) => {
|
|
62
|
+
let n = e(t), l = n.every((e) => o.includes(e)), u = n.every((e) => s.includes(e)), d = !u && n.some((e) => s.includes(e)), f = l ? void 0 : (a.resolveScopeRect ?? r)({
|
|
63
|
+
members: n,
|
|
64
64
|
allocation: a.allocation,
|
|
65
65
|
source: o
|
|
66
66
|
});
|