@nvidia-elements/core 2.23.5 → 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.
Files changed (209) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/accordion/accordion2.js +4 -4
  3. package/dist/alert/alert-group2.js +1 -1
  4. package/dist/alert/alert2.js +1 -1
  5. package/dist/avatar/avatar-group2.js +1 -1
  6. package/dist/avatar/avatar2.js +1 -1
  7. package/dist/badge/badge2.js +1 -1
  8. package/dist/breadcrumb/breadcrumb2.js +1 -1
  9. package/dist/bundles/index.js +7 -7
  10. package/dist/button/button2.js +1 -1
  11. package/dist/button-group/button-group2.js +1 -1
  12. package/dist/card/card2.js +4 -4
  13. package/dist/chat-message/chat-message2.js +1 -1
  14. package/dist/checkbox/checkbox-group2.js +1 -1
  15. package/dist/checkbox/checkbox2.js +1 -1
  16. package/dist/color/color2.js +1 -1
  17. package/dist/combobox/combobox2.js +1 -1
  18. package/dist/copy-button/copy-button2.js +1 -1
  19. package/dist/custom-elements.json +1000 -229
  20. package/dist/date/date2.js +1 -1
  21. package/dist/datetime/datetime2.js +1 -1
  22. package/dist/dialog/dialog-footer2.js +1 -1
  23. package/dist/dialog/dialog-header2.js +1 -1
  24. package/dist/dialog/dialog2.js +1 -1
  25. package/dist/divider/divider2.js +1 -1
  26. package/dist/dot/dot2.js +1 -1
  27. package/dist/drag-handle/drag-handle2.js +1 -1
  28. package/dist/drawer/drawer-content2.js +1 -1
  29. package/dist/drawer/drawer-footer2.js +1 -1
  30. package/dist/drawer/drawer-header2.js +1 -1
  31. package/dist/drawer/drawer2.js +1 -1
  32. package/dist/dropdown/dropdown-footer2.js +1 -1
  33. package/dist/dropdown/dropdown-header2.js +1 -1
  34. package/dist/dropdown/dropdown2.js +1 -1
  35. package/dist/dropdown-group/dropdown-group.js +1 -1
  36. package/dist/dropzone/dropzone2.js +1 -1
  37. package/dist/file/file2.js +1 -1
  38. package/dist/format-bytes/format-bytes2.js +1 -1
  39. package/dist/format-datetime/format-datetime2.js +1 -1
  40. package/dist/format-number/format-number2.js +1 -1
  41. package/dist/format-relative-time/format-relative-time2.js +1 -1
  42. package/dist/format-truncate/format-truncate2.js +1 -1
  43. package/dist/forms/control/control2.js +1 -1
  44. package/dist/forms/control-group/control-group2.js +1 -1
  45. package/dist/forms/control-message/control-message2.js +1 -1
  46. package/dist/gauge/gauge2.js +1 -1
  47. package/dist/ghost/ghost2.js +1 -1
  48. package/dist/grid/cell/cell2.js +1 -1
  49. package/dist/grid/column/column2.js +1 -1
  50. package/dist/grid/footer/footer2.js +1 -1
  51. package/dist/grid/grid2.js +1 -1
  52. package/dist/grid/header/header2.js +1 -1
  53. package/dist/grid/placeholder/placeholder2.js +1 -1
  54. package/dist/grid/row/row2.js +1 -1
  55. package/dist/icon/icon2.js +1 -1
  56. package/dist/icon-button/icon-button2.js +1 -1
  57. package/dist/iframe/iframe2.js +1 -1
  58. package/dist/index.js +1 -1
  59. package/dist/input/input-group2.js +1 -1
  60. package/dist/input/input2.js +1 -1
  61. package/dist/joystick/joystick2.js +1 -1
  62. package/dist/logo/logo2.js +1 -1
  63. package/dist/menu/menu-group2.js +1 -1
  64. package/dist/menu/menu-item2.js +1 -1
  65. package/dist/menu/menu2.js +1 -1
  66. package/dist/month/month2.js +1 -1
  67. package/dist/notification/notification-group2.js +1 -1
  68. package/dist/notification/notification2.js +1 -1
  69. package/dist/page/page-panel/page-panel-content2.js +1 -1
  70. package/dist/page/page-panel/page-panel-footer2.js +1 -1
  71. package/dist/page/page-panel/page-panel-header2.js +1 -1
  72. package/dist/page/page-panel/page-panel2.js +1 -1
  73. package/dist/page/page2.js +1 -1
  74. package/dist/page-header/page-header2.js +1 -1
  75. package/dist/page-loader/page-loader2.js +1 -1
  76. package/dist/pagination/pagination2.js +1 -1
  77. package/dist/panel/panel2.js +4 -4
  78. package/dist/password/password2.js +1 -1
  79. package/dist/preferences-input/preferences-input2.js +1 -1
  80. package/dist/progress-bar/progress-bar2.js +1 -1
  81. package/dist/progress-dot/progress-dot2.js +1 -1
  82. package/dist/progress-ring/progress-ring2.js +1 -1
  83. package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
  84. package/dist/pulse/pulse2.js +1 -1
  85. package/dist/radio/radio-group2.js +1 -1
  86. package/dist/radio/radio2.js +1 -1
  87. package/dist/range/range2.js +1 -1
  88. package/dist/resize-handle/resize-handle2.js +1 -1
  89. package/dist/search/search2.js +1 -1
  90. package/dist/select/select2.js +1 -1
  91. package/dist/skeleton/skeleton2.js +1 -1
  92. package/dist/sort-button/sort-button2.js +1 -1
  93. package/dist/sparkline/sparkline2.js +1 -1
  94. package/dist/star-rating/star-rating2.js +1 -1
  95. package/dist/steps/steps2.js +2 -2
  96. package/dist/switch/switch-group2.js +1 -1
  97. package/dist/switch/switch2.js +1 -1
  98. package/dist/tabs/tabs-group2.js +1 -1
  99. package/dist/tabs/tabs-item-group2.js +1 -1
  100. package/dist/tabs/tabs2.js +2 -2
  101. package/dist/tag/tag2.js +1 -1
  102. package/dist/textarea/textarea2.js +1 -1
  103. package/dist/time/time2.js +1 -1
  104. package/dist/toast/toast2.js +1 -1
  105. package/dist/toggletip/toggletip-footer2.js +1 -1
  106. package/dist/toggletip/toggletip-header2.js +1 -1
  107. package/dist/toggletip/toggletip2.js +1 -1
  108. package/dist/toolbar/toolbar2.js +1 -1
  109. package/dist/tooltip/tooltip2.js +1 -1
  110. package/dist/tree/tree-node2.js +1 -1
  111. package/dist/tree/tree2.js +1 -1
  112. package/dist/week/week2.js +1 -1
  113. package/dist/workspace/controllers/workspace-composition.controller.d.ts +4 -1
  114. package/dist/workspace/controllers/workspace-composition.controller.js +69 -39
  115. package/dist/workspace/controllers/workspace-composition.controller.js.map +1 -1
  116. package/dist/workspace/controllers/workspace-rearrange.controller.js +27 -27
  117. package/dist/workspace/controllers/workspace-rearrange.controller.js.map +1 -1
  118. package/dist/workspace/controllers/workspace-restoration.controller.js +2 -2
  119. package/dist/workspace/controllers/workspace-restoration.controller.js.map +1 -1
  120. package/dist/workspace/panel/panel2.js +2 -2
  121. package/dist/workspace/panel/panel2.js.map +1 -1
  122. package/dist/workspace/panel-content/panel-content2.js +1 -1
  123. package/dist/workspace/panel-footer/panel-footer2.js +1 -1
  124. package/dist/workspace/panel-header/panel-header2.js +1 -1
  125. package/dist/workspace/utils/comparison.utils.d.ts +3 -0
  126. package/dist/workspace/utils/comparison.utils.js +13 -0
  127. package/dist/workspace/utils/comparison.utils.js.map +1 -0
  128. package/dist/workspace/utils/evaluation.utils.d.ts +65 -6
  129. package/dist/workspace/utils/evaluation.utils.js +334 -99
  130. package/dist/workspace/utils/evaluation.utils.js.map +1 -1
  131. package/dist/workspace/utils/geometry/allocation.utils.js +15 -13
  132. package/dist/workspace/utils/geometry/allocation.utils.js.map +1 -1
  133. package/dist/workspace/utils/geometry/sizing.utils.d.ts +2 -0
  134. package/dist/workspace/utils/geometry/sizing.utils.js +37 -17
  135. package/dist/workspace/utils/geometry/sizing.utils.js.map +1 -1
  136. package/dist/workspace/utils/interaction/boundary.utils.d.ts +2 -2
  137. package/dist/workspace/utils/interaction/boundary.utils.js +2 -2
  138. package/dist/workspace/utils/interaction/boundary.utils.js.map +1 -1
  139. package/dist/workspace/utils/interaction/drag-preview.utils.d.ts +3 -3
  140. package/dist/workspace/utils/interaction/drag-preview.utils.js.map +1 -1
  141. package/dist/workspace/utils/interaction/insertion-offers.utils.d.ts +11 -9
  142. package/dist/workspace/utils/interaction/insertion-offers.utils.js +37 -43
  143. package/dist/workspace/utils/interaction/insertion-offers.utils.js.map +1 -1
  144. package/dist/workspace/utils/interaction/placement-decision.utils.d.ts +6 -1
  145. package/dist/workspace/utils/interaction/placement-decision.utils.js +94 -87
  146. package/dist/workspace/utils/interaction/placement-decision.utils.js.map +1 -1
  147. package/dist/workspace/utils/model/layout.utils.d.ts +2 -1
  148. package/dist/workspace/utils/model/layout.utils.js +12 -10
  149. package/dist/workspace/utils/model/layout.utils.js.map +1 -1
  150. package/dist/workspace/utils/model/membership.utils.d.ts +4 -0
  151. package/dist/workspace/utils/model/membership.utils.js +13 -4
  152. package/dist/workspace/utils/model/membership.utils.js.map +1 -1
  153. package/dist/workspace/utils/model/operations.utils.d.ts +1 -0
  154. package/dist/workspace/utils/model/operations.utils.js +51 -46
  155. package/dist/workspace/utils/model/operations.utils.js.map +1 -1
  156. package/dist/workspace/utils/model/projection.utils.d.ts +4 -2
  157. package/dist/workspace/utils/model/projection.utils.js +49 -40
  158. package/dist/workspace/utils/model/projection.utils.js.map +1 -1
  159. package/dist/workspace/utils/model/value.utils.d.ts +4 -3
  160. package/dist/workspace/utils/model/value.utils.js +15 -50
  161. package/dist/workspace/utils/model/value.utils.js.map +1 -1
  162. package/dist/workspace/utils/placement/acquisition-sizing.utils.d.ts +2 -0
  163. package/dist/workspace/utils/placement/acquisition-sizing.utils.js +30 -22
  164. package/dist/workspace/utils/placement/acquisition-sizing.utils.js.map +1 -1
  165. package/dist/workspace/utils/placement/group-insertion.utils.d.ts +19 -13
  166. package/dist/workspace/utils/placement/group-insertion.utils.js +50 -47
  167. package/dist/workspace/utils/placement/group-insertion.utils.js.map +1 -1
  168. package/dist/workspace/utils/placement/planner.utils.d.ts +13 -2
  169. package/dist/workspace/utils/placement/planner.utils.js +79 -73
  170. package/dist/workspace/utils/placement/planner.utils.js.map +1 -1
  171. package/dist/workspace/utils/placement/preparation.utils.d.ts +5 -2
  172. package/dist/workspace/utils/placement/preparation.utils.js +45 -41
  173. package/dist/workspace/utils/placement/preparation.utils.js.map +1 -1
  174. package/dist/workspace/utils/placement/region.utils.js +32 -32
  175. package/dist/workspace/utils/placement/region.utils.js.map +1 -1
  176. package/dist/workspace/utils/placement/scope.utils.d.ts +34 -0
  177. package/dist/workspace/utils/placement/scope.utils.js +155 -0
  178. package/dist/workspace/utils/placement/scope.utils.js.map +1 -0
  179. package/dist/workspace/utils/placement/session.utils.d.ts +11 -0
  180. package/dist/workspace/utils/placement/session.utils.js +78 -0
  181. package/dist/workspace/utils/placement/session.utils.js.map +1 -0
  182. package/dist/workspace/utils/placement/split-sizing.utils.d.ts +2 -2
  183. package/dist/workspace/utils/placement/split-sizing.utils.js +19 -19
  184. package/dist/workspace/utils/placement/split-sizing.utils.js.map +1 -1
  185. package/dist/workspace/utils/presentation/composition.utils.d.ts +1 -1
  186. package/dist/workspace/utils/presentation/composition.utils.js +4 -2
  187. package/dist/workspace/utils/presentation/composition.utils.js.map +1 -1
  188. package/dist/workspace/utils/presentation/groups.utils.d.ts +3 -3
  189. package/dist/workspace/utils/presentation/groups.utils.js +40 -30
  190. package/dist/workspace/utils/presentation/groups.utils.js.map +1 -1
  191. package/dist/workspace/utils/presentation/measurements.utils.d.ts +1 -0
  192. package/dist/workspace/utils/presentation/measurements.utils.js +6 -14
  193. package/dist/workspace/utils/presentation/measurements.utils.js.map +1 -1
  194. package/dist/workspace/utils/presentation/offers.utils.d.ts +1 -1
  195. package/dist/workspace/utils/presentation/offers.utils.js +3 -3
  196. package/dist/workspace/utils/presentation/offers.utils.js.map +1 -1
  197. package/dist/workspace/utils/presentation/preview.utils.d.ts +6 -0
  198. package/dist/workspace/utils/presentation/preview.utils.js +14 -3
  199. package/dist/workspace/utils/presentation/preview.utils.js.map +1 -1
  200. package/dist/workspace/workspace.examples.js.map +1 -1
  201. package/dist/workspace/workspace.examples.json +4 -4
  202. package/dist/workspace/workspace.js +1 -1
  203. package/dist/workspace/workspace.js.map +1 -1
  204. package/dist/workspace/workspace2.js +206 -212
  205. package/dist/workspace/workspace2.js.map +1 -1
  206. package/package.json +1 -1
  207. package/dist/workspace/utils/placement/context.utils.d.ts +0 -36
  208. package/dist/workspace/utils/placement/context.utils.js +0 -135
  209. package/dist/workspace/utils/placement/context.utils.js.map +0 -1
@@ -1,20 +1,21 @@
1
1
  import { normalizeLayout as e } from "../model/layout.utils.js";
2
- import { findGroup as t, isValidInsertionIndex as n, placePanels as r, projectLayout as i } from "../model/operations.utils.js";
3
- import { createPlacementContext as a } from "./context.utils.js";
4
- import { findDeepestProjectionCarrier as o, getProjectionSignature as s, rebaseProjectedSplit as c } from "../model/projection.utils.js";
5
- import { findWorkspaceRegion as l, placeRegion as u } from "./region.utils.js";
6
- import { planGroupInsertion as d } from "./group-insertion.utils.js";
2
+ import { sameArrayItems as t } from "../comparison.utils.js";
3
+ import { findGroup as n, isValidInsertionIndex as r, placePanels as i, projectLayout as a, sameDestination as o } from "../model/operations.utils.js";
4
+ import { findDeepestProjectionCarrier as s, rebaseProjectedSplit as c, sameProjectionShape as l } from "../model/projection.utils.js";
5
+ import { createPlacementScope as u } from "./scope.utils.js";
6
+ import { findWorkspaceRegion as d, placeRegion as f } from "./region.utils.js";
7
+ import { planGroupInsertion as p } from "./group-insertion.utils.js";
7
8
  // src/workspace/utils/placement/planner.utils.ts
8
- function f() {
9
+ function m() {
9
10
  let e;
10
11
  return (t) => {
11
- e && m(e, t) || (e = {
12
+ e && _(e, t) || (e = {
12
13
  layout: t.layout,
13
14
  source: [...t.source],
14
15
  available: [...t.available],
15
16
  entries: []
16
17
  });
17
- let n = e.entries.find((e) => e.operation === t.operation && g(e.destination, t.destination));
18
+ let n = e.entries.find((e) => e.operation === t.operation && o(e.destination, t.destination));
18
19
  if (!n) {
19
20
  let { target: r, position: i, region: a, index: o } = t.destination;
20
21
  n = {
@@ -25,39 +26,44 @@ function f() {
25
26
  region: a,
26
27
  index: o
27
28
  },
28
- plan: _(t)
29
+ plan: v(t)
29
30
  }, e.entries.push(n);
30
31
  }
31
32
  return n.plan;
32
33
  };
33
34
  }
34
- function p(e) {
35
- return _(e);
36
- }
37
- function m(e, t) {
38
- return e.layout === t.layout && h(e.source, t.source) && h(e.available, t.available);
39
- }
40
- function h(e, t) {
41
- return e.length === t.length && e.every((e, n) => e === t[n]);
35
+ function h(e, t, n) {
36
+ let r = {
37
+ layout: e.currentLayout,
38
+ source: e.source,
39
+ destination: t,
40
+ available: e.available,
41
+ projectLayout: e.projectLayout,
42
+ operation: n
43
+ };
44
+ return e.planPlacement ? e.planPlacement(r) : e.placementSession ? e.placementSession.plan(r) : g(r);
42
45
  }
43
- function g(e, t) {
44
- return e.target === t.target && e.position === t.position && e.region === t.region && e.index === t.index;
46
+ function g(e) {
47
+ return v(e);
45
48
  }
46
- function _(e) {
47
- if (n(e.destination.index)) return v(e);
49
+ function _(e, n) {
50
+ return e.layout === n.layout && t(e.source, n.source) && t(e.available, n.available);
48
51
  }
49
52
  function v(e) {
50
- if (e.operation === "tab") return e.destination.position === "tab" ? A(e) : void 0;
51
- if (e.destination.position !== "tab") return e.operation === "order" ? b(e) : e.operation === "insert" ? b(e) ?? d(e) : e.destination.region ? u(e) : A(e);
53
+ if (r(e.destination.index)) return y(e);
52
54
  }
53
55
  function y(e) {
54
- let { layout: n, source: r, destination: a } = e, o = t(n.root, r[0]);
55
- if (!o || !T(o.panels, r) || a.position === "tab") return;
56
- let s = a.position === "left" || a.position === "right" ? "horizontal" : "vertical", c = e.available.filter((e) => !n.closed.includes(e)), l = r.find((e) => c.includes(e));
56
+ if (e.operation === "tab") return e.destination.position === "tab" ? j(e) : void 0;
57
+ if (e.destination.position !== "tab") return e.operation === "order" ? x(e) : e.operation === "insert" ? x(e) ?? p(e) : e.destination.region ? f(e) : j(e);
58
+ }
59
+ function b(e) {
60
+ let { layout: t, source: r, destination: i } = e, o = n(t.root, r[0]);
61
+ if (!o || !E(o.panels, r) || i.position === "tab") return;
62
+ let s = i.position === "left" || i.position === "right" ? "horizontal" : "vertical", c = e.available.filter((e) => !t.closed.includes(e)), l = r.find((e) => c.includes(e));
57
63
  if (!l) return;
58
- let u = (e.projectLayout ?? i)(n, c).root, d = E(u, a);
64
+ let u = (e.projectLayout ?? a)(t, c).root, d = D(u, i);
59
65
  if (!d) return;
60
- let f = S(u, {
66
+ let f = C(u, {
61
67
  source: l,
62
68
  target: d,
63
69
  axis: s
@@ -69,19 +75,19 @@ function y(e) {
69
75
  target: d
70
76
  } : void 0;
71
77
  }
72
- function b(e) {
73
- let t = y(e);
78
+ function x(e) {
79
+ let t = b(e);
74
80
  if (!t) return;
75
81
  let { branch: n, visible: r, sourceId: i, target: a } = t, { layout: o, destination: s } = e;
76
- if (!s.region && e.source.includes(s.target)) return j(o, e, n);
77
- let l = D({
82
+ if (!s.region && e.source.includes(s.target)) return M(o, e, n);
83
+ let l = O({
78
84
  branch: n,
79
85
  sourceId: i,
80
86
  targetNode: a,
81
87
  destination: s
82
88
  });
83
- if (l.every((e, t) => e.child === n.children[t])) return j(o, e, n);
84
- let u = x({
89
+ if (l.every((e, t) => e.child === n.children[t])) return M(o, e, n);
90
+ let u = S({
85
91
  layout: o,
86
92
  children: n.children,
87
93
  reordered: l.map((e) => e.child),
@@ -93,92 +99,92 @@ function b(e) {
93
99
  ...n,
94
100
  children: l.map((e) => e.child)
95
101
  };
96
- return j(c(u, d, l.map((e) => e.weight), e.available) ?? u, e, n);
102
+ return M(c(u, d, l.map((e) => e.weight), e.available) ?? u, e, n);
97
103
  }
98
- function x(t) {
99
- let { layout: n, children: r, reordered: a, visible: c } = t, l = /* @__PURE__ */ new Map(), u = (e) => (l.has(e) || l.set(e, (t.projectLayout ?? i)({
104
+ function S(t) {
105
+ let { layout: n, children: r, reordered: i, visible: o } = t, c = /* @__PURE__ */ new Map(), l = (e) => (c.has(e) || c.set(e, (t.projectLayout ?? a)({
100
106
  version: 1,
101
107
  root: e,
102
108
  closed: []
103
- }, c).root), l.get(e) ?? null), d = r.map((e) => o(n.root, s(e), u));
104
- if (d.some((e) => !e)) return;
105
- let f = /* @__PURE__ */ new Map();
106
- d.forEach((e, t) => f.set(e, d[r.indexOf(a[t])]));
107
- let p = e(C(n.root, f));
108
- return p ? {
109
+ }, o).root), c.get(e) ?? null), u = r.map((e) => s(n.root, e, l));
110
+ if (u.some((e) => !e)) return;
111
+ let d = /* @__PURE__ */ new Map();
112
+ u.forEach((e, t) => d.set(e, u[r.indexOf(i[t])]));
113
+ let f = e(w(n.root, d));
114
+ return f ? {
109
115
  ...n,
110
- root: p
116
+ root: f
111
117
  } : void 0;
112
118
  }
113
- function S(e, t) {
119
+ function C(e, t) {
114
120
  if (e && e.type !== "group") {
115
- if (O(e, t)) return e;
121
+ if (k(e, t)) return e;
116
122
  for (let n of e.children) {
117
- let e = S(n, t);
123
+ let e = C(n, t);
118
124
  if (e) return e;
119
125
  }
120
126
  }
121
127
  }
122
- function C(e, t) {
128
+ function w(e, t) {
123
129
  return t.get(e) || (e.type === "group" ? e : {
124
130
  ...e,
125
- children: e.children.map((e) => C(e, t))
131
+ children: e.children.map((e) => w(e, t))
126
132
  });
127
133
  }
128
- function w(e, t) {
134
+ function T(e, t) {
129
135
  return e ? {
130
136
  kind: t.position === "tab" ? "tab" : "split",
131
137
  layout: e
132
138
  } : void 0;
133
139
  }
134
- function T(e, t) {
140
+ function E(e, t) {
135
141
  return e.length === t.length && e.every((e, n) => e === t[n]);
136
142
  }
137
- function E(e, n) {
138
- return n.region ? l(e, n.region) : t(e, n.target);
143
+ function D(e, t) {
144
+ return t.region ? d(e, t.region) : n(e, t.target);
139
145
  }
140
- function D(e) {
146
+ function O(e) {
141
147
  let { branch: t, sourceId: n, targetNode: r, destination: i } = e, a = t.children.findIndex((e) => e.type === "group" && e.panels.includes(n)), o = t.children.map((e, n) => ({
142
148
  child: e,
143
149
  weight: t.weights[n]
144
- })), c = o.splice(a, 1)[0], l = i.position === "right" || i.position === "bottom", u = o.findIndex((e) => s(e.child) === s(r)), d;
145
- if (r === t) d = l ? o.length : 0;
150
+ })), s = o.splice(a, 1)[0], c = i.position === "right" || i.position === "bottom", u = o.findIndex((e) => l(e.child, r)), d;
151
+ if (r === t) d = c ? o.length : 0;
146
152
  else {
147
153
  if (u < 0) return t.children.map((e, n) => ({
148
154
  child: e,
149
155
  weight: t.weights[n]
150
156
  }));
151
- d = u + +!!l;
157
+ d = u + +!!c;
152
158
  }
153
- return o.splice(d, 0, c), o;
159
+ return o.splice(d, 0, s), o;
154
160
  }
155
- function O(e, t) {
156
- return e.axis === t.axis && e.children.length > 1 && e.children.some((e) => e.type === "group" && e.panels.includes(t.source ?? "")) && (s(e) === s(t.target) || e.children.some((e) => s(e) === s(t.target)));
161
+ function k(e, t) {
162
+ return e.axis === t.axis && e.children.length > 1 && e.children.some((e) => e.type === "group" && e.panels.includes(t.source ?? "")) && (l(e, t.target) || e.children.some((e) => l(e, t.target)));
157
163
  }
158
- function k(e) {
159
- let { layout: t, source: n, destination: i } = e, a = r({
164
+ function A(e) {
165
+ let { layout: t, source: n, destination: r } = e, a = i({
160
166
  layout: t,
161
167
  source: n,
162
- destination: i
168
+ destination: r
163
169
  });
164
- return a ? w(a, i) : void 0;
170
+ return a ? T(a, r) : void 0;
165
171
  }
166
- function A(e) {
167
- let n = k(e);
168
- if (!n) return n;
169
- let r = t((e.projectLayout ?? i)(e.layout, e.available).root, e.destination.target);
172
+ function j(e) {
173
+ let t = A(e);
174
+ if (!t) return t;
175
+ let r = n((e.projectLayout ?? a)(e.layout, e.available).root, e.destination.target);
170
176
  return {
171
- ...n,
172
- context: a("recipient", r ?? null, e.source)
177
+ ...t,
178
+ scope: u("recipient", r ?? null, e.source)
173
179
  };
174
180
  }
175
- function j(e, t, n) {
181
+ function M(e, t, n) {
176
182
  return {
177
183
  kind: "reorder",
178
184
  layout: e,
179
- context: a("rail", n, t.source)
185
+ scope: u("rail", n, t.source)
180
186
  };
181
187
  }
182
- export { f as createWorkspacePlacementPlanner, p as planWorkspacePlacement };
188
+ export { m as createWorkspacePlacementPlanner, g as planWorkspacePlacement, h as resolvePlacementPlan };
183
189
 
184
190
  //# sourceMappingURL=planner.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.utils.js","names":["createWorkspacePlacementPlanner","binding","samePlanningBinding","input","entry","candidate","sameDestination","planBasePlacement","planWorkspacePlacement","sameIds","left","right","id","index","isValidInsertionIndex","planPeerPlacement","localPlacement","reorderPeers","planGroupInsertion","placeRegion","peerContext","group","findGroup","layout","source","wholeGroup","destination","axis","visible","sourceId","projectedRoot","projectLayout","target","projectedTarget","branch","peerBranch","context","targetNode","peerPlacement","entries","reorderedEntries","permuteCarriers","reordered","rebaseProjectedSplit","projections","project","node","carriers","children","findDeepestProjectionCarrier","getProjectionSignature","child","carrier","replacements","slot","root","normalizeLayout","replaceCarriers","matchesPeers","found","placement","panels","findWorkspaceRegion","from","moving","after","localCandidate","placePanels","plan","recipient","createPlacementContext"],"sources":["../../../../src/workspace/utils/placement/planner.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, isValidInsertionIndex, placePanels, projectLayout } from '../model/operations.utils.js';\nimport {\n findDeepestProjectionCarrier,\n getProjectionSignature,\n rebaseProjectedSplit\n} from '../model/projection.utils.js';\nimport { createPlacementContext } from './context.utils.js';\nimport { planGroupInsertion } from './group-insertion.utils.js';\nimport { findWorkspaceRegion, placeRegion } from './region.utils.js';\n\nimport type { 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 { WorkspacePlacementContext } from './context.utils.js';\n\nexport interface WorkspacePlacementPlan {\n kind: 'reorder' | 'split' | 'tab' | 'insert';\n context?: WorkspacePlacementContext;\n layout: WorkspaceLayout;\n}\n\ninterface PlacementInput {\n layout: WorkspaceLayout;\n source: string[];\n destination: WorkspaceDestination;\n available: string[];\n projectLayout?: WorkspaceLayoutProjector;\n operation: 'split' | 'order' | 'insert' | 'tab';\n}\n\nexport type WorkspacePlacementPlanner = (input: PlacementInput) => WorkspacePlacementPlan | undefined;\n\ninterface PlanningEntry {\n operation: PlacementInput['operation'];\n destination: WorkspaceDestination;\n plan: WorkspacePlacementPlan | undefined;\n}\n\ninterface PlanningBinding {\n layout: WorkspaceLayout;\n source: string[];\n available: string[];\n entries: PlanningEntry[];\n}\n\n/** Requires an immutable current layout; projection callbacks are never retained. */\nexport function createWorkspacePlacementPlanner(): WorkspacePlacementPlanner {\n let binding: PlanningBinding | undefined;\n return input => {\n if (!binding || !samePlanningBinding(binding, input)) {\n binding = { layout: input.layout, source: [...input.source], available: [...input.available], entries: [] };\n }\n let entry = binding.entries.find(\n candidate => candidate.operation === input.operation && sameDestination(candidate.destination, input.destination)\n );\n if (!entry) {\n const { target, position, region, index } = input.destination;\n entry = {\n operation: input.operation,\n destination: { target, position, region, index },\n plan: planBasePlacement(input)\n };\n binding.entries.push(entry);\n }\n return entry.plan;\n };\n}\n\nexport function planWorkspacePlacement(input: PlacementInput): WorkspacePlacementPlan | undefined {\n return planBasePlacement(input);\n}\n\nfunction samePlanningBinding(binding: PlanningBinding, input: PlacementInput) {\n return (\n binding.layout === input.layout &&\n sameIds(binding.source, input.source) &&\n sameIds(binding.available, input.available)\n );\n}\n\nfunction sameIds(left: string[], right: string[]) {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\nfunction sameDestination(left: WorkspaceDestination, right: WorkspaceDestination) {\n return (\n left.target === right.target &&\n left.position === right.position &&\n left.region === right.region &&\n left.index === right.index\n );\n}\n\nfunction planBasePlacement(input: PlacementInput) {\n if (!isValidInsertionIndex(input.destination.index)) return undefined;\n return planPeerPlacement(input);\n}\n\nfunction planPeerPlacement(input: PlacementInput) {\n if (input.operation === 'tab') return input.destination.position === 'tab' ? localPlacement(input) : undefined;\n if (input.destination.position === 'tab') return undefined;\n if (input.operation === 'order') return reorderPeers(input);\n if (input.operation === 'insert') return reorderPeers(input) ?? planGroupInsertion(input);\n return input.destination.region ? placeRegion(input) : localPlacement(input);\n}\n\nfunction peerContext(input: PlacementInput) {\n const { layout, source, destination } = input;\n const group = findGroup(layout.root, source[0]);\n if (!group || !wholeGroup(group.panels, source)) return undefined;\n if (destination.position === 'tab') return undefined;\n const axis = destination.position === 'left' || destination.position === 'right' ? 'horizontal' : 'vertical';\n const visible = input.available.filter(id => !layout.closed.includes(id));\n const sourceId = source.find(id => visible.includes(id));\n if (!sourceId) return undefined;\n const projectedRoot = (input.projectLayout ?? projectLayout)(layout, visible).root;\n const target = projectedTarget(projectedRoot, destination);\n if (!target) return undefined;\n const branch = peerBranch(projectedRoot, { source: sourceId, target, axis });\n return branch ? { branch, visible, sourceId, target } : undefined;\n}\n\nfunction reorderPeers(input: PlacementInput): WorkspacePlacementPlan | undefined {\n const context = peerContext(input);\n if (!context) return undefined;\n const { branch, visible, sourceId, target: targetNode } = context;\n const { layout, destination } = input;\n if (!destination.region && input.source.includes(destination.target)) return peerPlacement(layout, input, branch);\n const entries = reorderedEntries({ branch, sourceId, targetNode, destination });\n if (entries.every((entry, index) => entry.child === branch.children[index]))\n return peerPlacement(layout, input, branch);\n const candidate = permuteCarriers({\n layout,\n children: branch.children,\n reordered: entries.map(entry => entry.child),\n visible,\n projectLayout: input.projectLayout\n });\n if (!candidate) return undefined;\n const reordered = { ...branch, children: entries.map(entry => entry.child) };\n return peerPlacement(\n rebaseProjectedSplit(\n candidate,\n reordered,\n entries.map(entry => entry.weight),\n input.available\n ) ?? candidate,\n input,\n branch\n );\n}\n\nfunction permuteCarriers(input: {\n layout: WorkspaceLayout;\n children: WorkspaceNode[];\n reordered: WorkspaceNode[];\n visible: string[];\n projectLayout?: WorkspaceLayoutProjector;\n}): WorkspaceLayout | undefined {\n const { layout, children, reordered, visible } = input;\n const projections = new Map<WorkspaceNode, WorkspaceNode | null>();\n const project = (node: WorkspaceNode) => {\n if (!projections.has(node)) {\n projections.set(\n node,\n (input.projectLayout ?? projectLayout)({ version: 1, root: node, closed: [] }, visible).root\n );\n }\n return projections.get(node) ?? null;\n };\n const carriers = children.map(child =>\n findDeepestProjectionCarrier(layout.root, getProjectionSignature(child), project)\n );\n if (carriers.some(carrier => !carrier)) return undefined;\n const replacements = new Map<WorkspaceNode, WorkspaceNode>();\n carriers.forEach((slot, index) => replacements.set(slot!, carriers[children.indexOf(reordered[index]!)]!));\n const root = normalizeLayout(replaceCarriers(layout.root!, replacements));\n return root ? { ...layout, root } : undefined;\n}\n\nfunction peerBranch(\n node: WorkspaceNode | null,\n input: { source?: string; target: WorkspaceNode; axis: WorkspaceSplit['axis'] }\n): WorkspaceSplit | undefined {\n if (!node || node.type === 'group') return undefined;\n if (matchesPeers(node, input)) return node;\n for (const child of node.children) {\n const found = peerBranch(child, input);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction replaceCarriers(node: WorkspaceNode, replacements: Map<WorkspaceNode, WorkspaceNode>): WorkspaceNode {\n const payload = replacements.get(node);\n if (payload) return payload;\n if (node.type === 'group') return node;\n return { ...node, children: node.children.map(child => replaceCarriers(child, replacements)) };\n}\n\nfunction placement(\n layout: WorkspaceLayout | undefined,\n destination: WorkspaceDestination\n): WorkspacePlacementPlan | undefined {\n return layout ? { kind: destination.position === 'tab' ? 'tab' : 'split', layout } : undefined;\n}\n\nfunction wholeGroup(panels: string[], source: string[]) {\n return panels.length === source.length && panels.every((id, index) => id === source[index]);\n}\n\nfunction projectedTarget(root: WorkspaceNode | null, destination: WorkspaceDestination) {\n return destination.region ? findWorkspaceRegion(root, destination.region) : findGroup(root, destination.target);\n}\n\nfunction reorderedEntries(input: {\n branch: WorkspaceSplit;\n sourceId: string;\n targetNode: WorkspaceNode;\n destination: WorkspaceDestination;\n}) {\n const { branch, sourceId, targetNode, destination } = input;\n const from = branch.children.findIndex(child => child.type === 'group' && child.panels.includes(sourceId));\n const entries = branch.children.map((child, index) => ({ child, weight: branch.weights[index]! }));\n const moving = entries.splice(from, 1)[0]!;\n const after = destination.position === 'right' || destination.position === 'bottom';\n const target = entries.findIndex(entry => getProjectionSignature(entry.child) === getProjectionSignature(targetNode));\n let index: number;\n if (targetNode === branch) {\n index = after ? entries.length : 0;\n } else {\n if (target < 0) return branch.children.map((child, slot) => ({ child, weight: branch.weights[slot]! }));\n const offset = after ? 1 : 0;\n index = target + offset;\n }\n entries.splice(index, 0, moving);\n return entries;\n}\n\nfunction matchesPeers(\n node: WorkspaceSplit,\n input: { source?: string; target: WorkspaceNode; axis: WorkspaceSplit['axis'] }\n) {\n return (\n node.axis === input.axis &&\n node.children.length > 1 &&\n node.children.some(child => child.type === 'group' && child.panels.includes(input.source ?? '')) &&\n (getProjectionSignature(node) === getProjectionSignature(input.target) ||\n node.children.some(child => getProjectionSignature(child) === getProjectionSignature(input.target)))\n );\n}\n\nfunction localCandidate(input: PlacementInput): WorkspacePlacementPlan | undefined {\n const { layout, source, destination } = input;\n const candidate = placePanels({ layout, source, destination });\n return candidate ? placement(candidate, destination) : undefined;\n}\n\nfunction localPlacement(input: PlacementInput): WorkspacePlacementPlan | undefined {\n const plan = localCandidate(input);\n if (!plan) return plan;\n const recipient = findGroup(\n (input.projectLayout ?? projectLayout)(input.layout, input.available).root,\n input.destination.target\n );\n return { ...plan, context: createPlacementContext('recipient', recipient ?? null, input.source) };\n}\n\nfunction peerPlacement(layout: WorkspaceLayout, input: PlacementInput, branch: WorkspaceSplit): WorkspacePlacementPlan {\n return {\n kind: 'reorder',\n layout,\n context: createPlacementContext('rail', branch, input.source)\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"planner.utils.js","names":["createWorkspacePlacementPlanner","binding","samePlanningBinding","input","entry","candidate","sameDestination","planBasePlacement","resolvePlacementPlan","context","planWorkspacePlacement","sameArrayItems","isValidInsertionIndex","planPeerPlacement","localPlacement","reorderPeers","planGroupInsertion","placeRegion","peerContext","group","findGroup","layout","source","wholeGroup","destination","axis","visible","id","sourceId","projectedRoot","projectLayout","target","projectedTarget","branch","peerBranch","targetNode","peerPlacement","entries","reorderedEntries","index","permuteCarriers","reordered","rebaseProjectedSplit","projections","project","node","carriers","children","findDeepestProjectionCarrier","child","carrier","replacements","root","normalizeLayout","replaceCarriers","matchesPeers","found","placement","panels","findWorkspaceRegion","from","moving","after","sameProjectionShape","childIndex","localCandidate","placePanels","plan","recipient","createPlacementScope"],"sources":["../../../../src/workspace/utils/placement/planner.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 {\n findGroup,\n isValidInsertionIndex,\n placePanels,\n projectLayout,\n sameDestination\n} from '../model/operations.utils.js';\nimport { findDeepestProjectionCarrier, rebaseProjectedSplit, sameProjectionShape } from '../model/projection.utils.js';\nimport { planGroupInsertion } from './group-insertion.utils.js';\nimport { findWorkspaceRegion, placeRegion } from './region.utils.js';\nimport { createPlacementScope } from './scope.utils.js';\nimport { sameArrayItems } from '../comparison.utils.js';\n\nimport type { 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 { WorkspacePlacementScope } from './scope.utils.js';\nimport type { WorkspacePlacementSession } from './session.utils.js';\n\nexport interface WorkspacePlacementPlan {\n kind: 'reorder' | 'split' | 'tab' | 'insert';\n scope?: WorkspacePlacementScope;\n layout: WorkspaceLayout;\n}\n\ninterface PlacementInput {\n layout: WorkspaceLayout;\n source: string[];\n destination: WorkspaceDestination;\n available: string[];\n projectLayout?: WorkspaceLayoutProjector;\n operation: 'split' | 'order' | 'insert' | 'tab';\n}\n\nexport type WorkspacePlacementPlanner = (input: PlacementInput) => WorkspacePlacementPlan | undefined;\n\ninterface PlanningEntry {\n operation: PlacementInput['operation'];\n destination: WorkspaceDestination;\n plan: WorkspacePlacementPlan | undefined;\n}\n\ninterface PlanningBinding {\n layout: WorkspaceLayout;\n source: string[];\n available: string[];\n entries: PlanningEntry[];\n}\n\n/** Requires an immutable current layout; projection callbacks are never retained. */\nexport function createWorkspacePlacementPlanner(): WorkspacePlacementPlanner {\n let binding: PlanningBinding | undefined;\n return input => {\n if (!binding || !samePlanningBinding(binding, input)) {\n binding = { layout: input.layout, source: [...input.source], available: [...input.available], entries: [] };\n }\n let entry = binding.entries.find(\n candidate => candidate.operation === input.operation && sameDestination(candidate.destination, input.destination)\n );\n if (!entry) {\n const { target, position, region, index } = input.destination;\n entry = {\n operation: input.operation,\n destination: { target, position, region, index },\n plan: planBasePlacement(input)\n };\n binding.entries.push(entry);\n }\n return entry.plan;\n };\n}\n\ninterface WorkspacePlanningContext {\n currentLayout: WorkspaceLayout;\n source: string[];\n available: string[];\n projectLayout?: WorkspaceLayoutProjector;\n planPlacement?: WorkspacePlacementPlanner;\n placementSession?: WorkspacePlacementSession;\n}\n\n/** Supplied planners keep their ordinary path; component gestures use their explicit session. */\nexport function resolvePlacementPlan(\n context: WorkspacePlanningContext,\n destination: WorkspaceDestination,\n operation: PlacementInput['operation']\n): WorkspacePlacementPlan | undefined {\n const input = {\n layout: context.currentLayout,\n source: context.source,\n destination,\n available: context.available,\n projectLayout: context.projectLayout,\n operation\n };\n if (context.planPlacement) return context.planPlacement(input);\n return context.placementSession ? context.placementSession.plan(input) : planWorkspacePlacement(input);\n}\n\nexport function planWorkspacePlacement(input: PlacementInput): WorkspacePlacementPlan | undefined {\n return planBasePlacement(input);\n}\n\nfunction samePlanningBinding(binding: PlanningBinding, input: PlacementInput) {\n return (\n binding.layout === input.layout &&\n sameArrayItems(binding.source, input.source) &&\n sameArrayItems(binding.available, input.available)\n );\n}\n\nfunction planBasePlacement(input: PlacementInput) {\n if (!isValidInsertionIndex(input.destination.index)) return undefined;\n return planPeerPlacement(input);\n}\n\nfunction planPeerPlacement(input: PlacementInput) {\n if (input.operation === 'tab') return input.destination.position === 'tab' ? localPlacement(input) : undefined;\n if (input.destination.position === 'tab') return undefined;\n if (input.operation === 'order') return reorderPeers(input);\n if (input.operation === 'insert') return reorderPeers(input) ?? planGroupInsertion(input);\n return input.destination.region ? placeRegion(input) : localPlacement(input);\n}\n\nfunction peerContext(input: PlacementInput) {\n const { layout, source, destination } = input;\n const group = findGroup(layout.root, source[0]);\n if (!group || !wholeGroup(group.panels, source)) return undefined;\n if (destination.position === 'tab') return undefined;\n const axis = destination.position === 'left' || destination.position === 'right' ? 'horizontal' : 'vertical';\n const visible = input.available.filter(id => !layout.closed.includes(id));\n const sourceId = source.find(id => visible.includes(id));\n if (!sourceId) return undefined;\n const projectedRoot = (input.projectLayout ?? projectLayout)(layout, visible).root;\n const target = projectedTarget(projectedRoot, destination);\n if (!target) return undefined;\n const branch = peerBranch(projectedRoot, { source: sourceId, target, axis });\n return branch ? { branch, visible, sourceId, target } : undefined;\n}\n\nfunction reorderPeers(input: PlacementInput): WorkspacePlacementPlan | undefined {\n const context = peerContext(input);\n if (!context) return undefined;\n const { branch, visible, sourceId, target: targetNode } = context;\n const { layout, destination } = input;\n if (!destination.region && input.source.includes(destination.target)) return peerPlacement(layout, input, branch);\n const entries = reorderedEntries({ branch, sourceId, targetNode, destination });\n if (entries.every((entry, index) => entry.child === branch.children[index]))\n return peerPlacement(layout, input, branch);\n const candidate = permuteCarriers({\n layout,\n children: branch.children,\n reordered: entries.map(entry => entry.child),\n visible,\n projectLayout: input.projectLayout\n });\n if (!candidate) return undefined;\n const reordered = { ...branch, children: entries.map(entry => entry.child) };\n return peerPlacement(\n rebaseProjectedSplit(\n candidate,\n reordered,\n entries.map(entry => entry.weight),\n input.available\n ) ?? candidate,\n input,\n branch\n );\n}\n\nfunction permuteCarriers(input: {\n layout: WorkspaceLayout;\n children: WorkspaceNode[];\n reordered: WorkspaceNode[];\n visible: string[];\n projectLayout?: WorkspaceLayoutProjector;\n}): WorkspaceLayout | undefined {\n const { layout, children, reordered, visible } = input;\n const projections = new Map<WorkspaceNode, WorkspaceNode | null>();\n const project = (node: WorkspaceNode) => {\n if (!projections.has(node)) {\n projections.set(\n node,\n (input.projectLayout ?? projectLayout)({ version: 1, root: node, closed: [] }, visible).root\n );\n }\n return projections.get(node) ?? null;\n };\n const carriers = children.map(child => findDeepestProjectionCarrier(layout.root, child, project));\n if (carriers.some(carrier => !carrier)) return undefined;\n const replacements = new Map<WorkspaceNode, WorkspaceNode>();\n carriers.forEach((carrier, index) => replacements.set(carrier!, carriers[children.indexOf(reordered[index]!)]!));\n const root = normalizeLayout(replaceCarriers(layout.root!, replacements));\n return root ? { ...layout, root } : undefined;\n}\n\nfunction peerBranch(\n node: WorkspaceNode | null,\n input: { source?: string; target: WorkspaceNode; axis: WorkspaceSplit['axis'] }\n): WorkspaceSplit | undefined {\n if (!node || node.type === 'group') return undefined;\n if (matchesPeers(node, input)) return node;\n for (const child of node.children) {\n const found = peerBranch(child, input);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction replaceCarriers(node: WorkspaceNode, replacements: Map<WorkspaceNode, WorkspaceNode>): WorkspaceNode {\n const payload = replacements.get(node);\n if (payload) return payload;\n if (node.type === 'group') return node;\n return { ...node, children: node.children.map(child => replaceCarriers(child, replacements)) };\n}\n\nfunction placement(\n layout: WorkspaceLayout | undefined,\n destination: WorkspaceDestination\n): WorkspacePlacementPlan | undefined {\n return layout ? { kind: destination.position === 'tab' ? 'tab' : 'split', layout } : undefined;\n}\n\nfunction wholeGroup(panels: string[], source: string[]) {\n return panels.length === source.length && panels.every((id, index) => id === source[index]);\n}\n\nfunction projectedTarget(root: WorkspaceNode | null, destination: WorkspaceDestination) {\n return destination.region ? findWorkspaceRegion(root, destination.region) : findGroup(root, destination.target);\n}\n\nfunction reorderedEntries(input: {\n branch: WorkspaceSplit;\n sourceId: string;\n targetNode: WorkspaceNode;\n destination: WorkspaceDestination;\n}) {\n const { branch, sourceId, targetNode, destination } = input;\n const from = branch.children.findIndex(child => child.type === 'group' && child.panels.includes(sourceId));\n const entries = branch.children.map((child, index) => ({ child, weight: branch.weights[index]! }));\n const moving = entries.splice(from, 1)[0]!;\n const after = destination.position === 'right' || destination.position === 'bottom';\n const target = entries.findIndex(entry => sameProjectionShape(entry.child, targetNode));\n let index: number;\n if (targetNode === branch) {\n index = after ? entries.length : 0;\n } else {\n if (target < 0) return branch.children.map((child, childIndex) => ({ child, weight: branch.weights[childIndex]! }));\n const offset = after ? 1 : 0;\n index = target + offset;\n }\n entries.splice(index, 0, moving);\n return entries;\n}\n\nfunction matchesPeers(\n node: WorkspaceSplit,\n input: { source?: string; target: WorkspaceNode; axis: WorkspaceSplit['axis'] }\n) {\n return (\n node.axis === input.axis &&\n node.children.length > 1 &&\n node.children.some(child => child.type === 'group' && child.panels.includes(input.source ?? '')) &&\n (sameProjectionShape(node, input.target) || node.children.some(child => sameProjectionShape(child, input.target)))\n );\n}\n\nfunction localCandidate(input: PlacementInput): WorkspacePlacementPlan | undefined {\n const { layout, source, destination } = input;\n const candidate = placePanels({ layout, source, destination });\n return candidate ? placement(candidate, destination) : undefined;\n}\n\nfunction localPlacement(input: PlacementInput): WorkspacePlacementPlan | undefined {\n const plan = localCandidate(input);\n if (!plan) return plan;\n const recipient = findGroup(\n (input.projectLayout ?? projectLayout)(input.layout, input.available).root,\n input.destination.target\n );\n return { ...plan, scope: createPlacementScope('recipient', recipient ?? null, input.source) };\n}\n\nfunction peerPlacement(layout: WorkspaceLayout, input: PlacementInput, branch: WorkspaceSplit): WorkspacePlacementPlan {\n return {\n kind: 'reorder',\n layout,\n scope: createPlacementScope('rail', branch, input.source)\n };\n}\n"],"mappings":"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"}
@@ -3,6 +3,7 @@ import type { WorkspacePlacementIntent } from '../interaction/command.utils.js';
3
3
  import type { WorkspaceDragOffer, WorkspaceOfferContext } from '../interaction/drag-preview.utils.js';
4
4
  import type { WorkspaceLayout } from '../model/layout.utils.js';
5
5
  import type { WorkspacePlacementPlanner } from './planner.utils.js';
6
+ import type { WorkspacePlacementSession } from './session.utils.js';
6
7
  import type { WorkspaceMeasurements } from '../presentation/measurements.utils.js';
7
8
  import type { WorkspaceEvaluation } from '../evaluation.utils.js';
8
9
  interface PreparationInput {
@@ -14,8 +15,9 @@ interface CandidateInput extends PreparationInput {
14
15
  source: string[];
15
16
  intent: WorkspacePlacementIntent;
16
17
  planner?: WorkspacePlacementPlanner;
18
+ placementSession?: WorkspacePlacementSession;
17
19
  }
18
- interface OfferInput extends CandidateInput {
20
+ export interface WorkspacePlacementOfferInputs extends CandidateInput {
19
21
  context?: WorkspaceOfferContext;
20
22
  groupable: boolean;
21
23
  currentRegions(): WorkspacePlacedRegion[];
@@ -24,5 +26,6 @@ export declare function getAdmissiblePlacementLayout(input: CandidateInput & {
24
26
  groupable: boolean;
25
27
  candidate?: WorkspaceLayout;
26
28
  }): WorkspaceLayout | undefined;
27
- export declare function evaluatePlacementOffer(input: OfferInput): WorkspaceDragOffer | undefined;
29
+ export declare function evaluatePlacementOffer(input: WorkspacePlacementOfferInputs): WorkspaceDragOffer | undefined;
30
+ export declare function computePlacementOffer(input: WorkspacePlacementOfferInputs): WorkspaceDragOffer | undefined;
28
31
  export {};
@@ -1,37 +1,40 @@
1
- import { sameSerializedWorkspaceLayout as e } from "../model/value.utils.js";
2
- import { getTabCue as t } from "../presentation/groups.utils.js";
3
- import { planWorkspacePlacement as n } from "./planner.utils.js";
4
- import { preservesGroupMembership as r } from "../model/membership.utils.js";
1
+ import { sameWorkspaceLayout as e } from "../model/value.utils.js";
2
+ import { preservesGroupMembership as t } from "../model/membership.utils.js";
3
+ import { getTabCue as n } from "../presentation/groups.utils.js";
4
+ import { planWorkspacePlacement as r } from "./planner.utils.js";
5
5
  import { admitsWorkspaceMove as i } from "../geometry/sizing.utils.js";
6
6
  import { resolveSelectedPlacementPlan as a } from "./acquisition-sizing.utils.js";
7
7
  import { sizePreferredSplit as o } from "./split-sizing.utils.js";
8
8
  import { getOfferAllocation as s, getOfferPresentation as c } from "../presentation/offers.utils.js";
9
9
  // src/workspace/utils/placement/preparation.utils.ts
10
- function l(t) {
11
- let { evaluation: n, layout: i, source: a, intent: o, groupable: s } = t;
12
- if (!s && !r({
10
+ function l(n) {
11
+ let { evaluation: r, layout: i, source: a, intent: o, groupable: s } = n;
12
+ if (!s && !t({
13
13
  root: i.root,
14
14
  source: a,
15
15
  intent: o
16
16
  })) return;
17
- let c = t.candidate ?? u(t)?.layout;
18
- if (c && !e(c, i) && d({
19
- ...t,
20
- candidate: n.project(c)
17
+ let c = n.candidate ?? d(n)?.layout;
18
+ if (c && !e(c, i) && f({
19
+ ...n,
20
+ candidate: r.project(c)
21
21
  })) return c;
22
22
  }
23
23
  function u(e) {
24
- let { evaluation: t, layout: r, source: i, intent: a, planner: o = n } = e, s = o({
25
- layout: r,
24
+ return e.placementSession && !e.planner ? e.placementSession.prepareOffer(e) : p(e);
25
+ }
26
+ function d(e) {
27
+ let { evaluation: t, layout: n, source: i, intent: a, planner: o = r } = e, s = {
28
+ layout: n,
26
29
  source: i,
27
30
  destination: a.destination,
28
31
  operation: a.kind,
29
32
  available: t.available,
30
33
  projectLayout: t.projectLayout
31
- });
32
- return s ? p(e, s) : void 0;
34
+ }, c = e.placementSession && !e.planner ? e.placementSession.plan(s) : o(s);
35
+ return c ? m(e, c) : void 0;
33
36
  }
34
- function d(e) {
37
+ function f(e) {
35
38
  return i({
36
39
  current: e.evaluation.project(e.layout).root,
37
40
  candidate: e.candidate.root,
@@ -42,10 +45,10 @@ function d(e) {
42
45
  requirements: e.evaluation.requirements
43
46
  });
44
47
  }
45
- function f(e) {
46
- let { evaluation: t, source: n, intent: r, context: i } = e, o = i?.acquisition, s = o ? p(e, o.plan) : u(e);
48
+ function p(e) {
49
+ let { evaluation: t, source: n, intent: r, context: i } = e, o = i?.acquisition, s = o ? m(e, o.plan) : d(e);
47
50
  if (!s) return;
48
- let { width: c, height: l } = t.geometry(t.project(s.layout)), d = a({
51
+ let { width: c, height: l } = t.geometry(t.project(s.layout)), u = a({
49
52
  plan: s,
50
53
  source: n,
51
54
  available: t.available,
@@ -65,11 +68,12 @@ function f(e) {
65
68
  width: 0,
66
69
  height: 0
67
70
  }),
68
- requirements: t.requirements
71
+ requirements: t.requirements,
72
+ placementSession: e.planner ? void 0 : e.placementSession
69
73
  });
70
- return m(e, d ?? s, !!d);
74
+ return h(e, u ?? s, !!u);
71
75
  }
72
- function p(e, t) {
76
+ function m(e, t) {
73
77
  if (t.kind !== "split") return t;
74
78
  let { evaluation: n, source: r } = e;
75
79
  return o({
@@ -80,17 +84,17 @@ function p(e, t) {
80
84
  preference: {
81
85
  allocation: n.detached(r).regions,
82
86
  requirements: n.requirements,
83
- contextRect: n.contextRect
87
+ resolveScopeRect: n.resolveScopeRect
84
88
  }
85
89
  });
86
90
  }
87
- function m(e, n, i) {
88
- let { evaluation: a, layout: o, measurements: l, source: u, intent: f } = e, p = a.project(n.layout), m = a.geometry(p), g = m.groups.find((e) => e.panels.some((e) => u.includes(e.id)));
89
- if (!g) return;
90
- let _ = a.client(g.rect), { cue: v, bounds: y } = f.kind === "tab" ? t({
91
- group: g,
91
+ function h(e, r, i) {
92
+ let { evaluation: a, layout: o, measurements: l, source: u, intent: d } = e, p = a.project(r.layout), m = a.geometry(p), h = m.groups.find((e) => e.panels.some((e) => u.includes(e.id)));
93
+ if (!h) return;
94
+ let _ = a.client(h.rect), { cue: v, bounds: y } = d.kind === "tab" ? n({
95
+ group: h,
92
96
  source: u,
93
- intent: f,
97
+ intent: d,
94
98
  root: o.root,
95
99
  spatial: () => a.detached(u).groups,
96
100
  measurements: l,
@@ -100,41 +104,41 @@ function m(e, n, i) {
100
104
  }) : {
101
105
  cue: _,
102
106
  bounds: a.bounds()
103
- }, b = i && d({
107
+ }, b = i && f({
104
108
  ...e,
105
109
  candidate: p
106
- }) && (e.groupable || r({
110
+ }) && (e.groupable || t({
107
111
  root: o.root,
108
112
  source: u,
109
- intent: f
113
+ intent: d
110
114
  })), x = c({
111
- plan: n,
115
+ plan: r,
112
116
  regions: m.regions,
113
- sourceKey: g.key,
117
+ sourceKey: h.key,
114
118
  sourceRect: _,
115
119
  cue: v,
116
120
  bounds: y,
117
- destination: f.destination,
121
+ destination: d.destination,
118
122
  feasible: b,
119
- split: f.kind === "split" ? {
123
+ split: d.kind === "split" ? {
120
124
  ...a.detached(u),
121
125
  source: u
122
126
  } : void 0,
123
127
  client: (e) => a.client(e)
124
128
  });
125
- if (h(f, x.cue)) return {
129
+ if (g(d, x.cue)) return {
126
130
  ...x,
127
131
  cue: {
128
- kind: f.kind === "tab" ? "tab" : "group",
132
+ kind: d.kind === "tab" ? "tab" : "group",
129
133
  rect: x.cue
130
134
  },
131
135
  feasible: b,
132
- ...s(n, b)
136
+ ...s(r, b)
133
137
  };
134
138
  }
135
- function h(e, t) {
139
+ function g(e, t) {
136
140
  return e.kind === "tab" || t.width !== 0 && t.height !== 0;
137
141
  }
138
- export { f as evaluatePlacementOffer, l as getAdmissiblePlacementLayout };
142
+ export { p as computePlacementOffer, u as evaluatePlacementOffer, l as getAdmissiblePlacementLayout };
139
143
 
140
144
  //# sourceMappingURL=preparation.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"preparation.utils.js","names":["getAdmissiblePlacementLayout","input","groupable","preservesGroupMembership","layout","candidate","placementCandidate","placementFits","evaluation","planWorkspacePlacement","plan","planner","intent","preferredPlacement","admitsWorkspaceMove","evaluatePlacementOffer","acquisition","context","fit","resolveSelectedPlacementPlan","placementOffer","sizePreferredSplit","source","geometry","group","item","panel","rect","getTabCue","target","feasible","fitted","presentation","getOfferPresentation","hasVisiblePlacementCue","getOfferAllocation","cue"],"sources":["../../../../src/workspace/utils/placement/preparation.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 { admitsWorkspaceMove } from '../geometry/sizing.utils.js';\nimport { preservesGroupMembership } from '../model/membership.utils.js';\nimport { sameSerializedWorkspaceLayout } from '../model/value.utils.js';\nimport { resolveSelectedPlacementPlan } from './acquisition-sizing.utils.js';\nimport { planWorkspacePlacement } from './planner.utils.js';\nimport { sizePreferredSplit } from './split-sizing.utils.js';\nimport { getTabCue } from '../presentation/groups.utils.js';\nimport { getOfferAllocation, getOfferPresentation } from '../presentation/offers.utils.js';\n\nimport type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';\nimport type { WorkspacePlacementIntent } from '../interaction/command.utils.js';\nimport type { WorkspaceDragOffer, WorkspaceOfferContext } from '../interaction/drag-preview.utils.js';\nimport type { WorkspaceLayout } from '../model/layout.utils.js';\nimport type { WorkspacePlacementPlan, WorkspacePlacementPlanner } from './planner.utils.js';\nimport type { WorkspaceMeasurements } from '../presentation/measurements.utils.js';\nimport type { WorkspaceEvaluation } from '../evaluation.utils.js';\n\ninterface PreparationInput {\n evaluation: WorkspaceEvaluation;\n layout: WorkspaceLayout;\n measurements: WorkspaceMeasurements;\n}\n\ninterface CandidateInput extends PreparationInput {\n source: string[];\n intent: WorkspacePlacementIntent;\n planner?: WorkspacePlacementPlanner;\n}\n\ninterface OfferInput extends CandidateInput {\n context?: WorkspaceOfferContext;\n groupable: boolean;\n currentRegions(): WorkspacePlacedRegion[];\n}\n\nexport function getAdmissiblePlacementLayout(\n input: CandidateInput & { groupable: boolean; candidate?: WorkspaceLayout }\n): WorkspaceLayout | undefined {\n const { evaluation, layout, source, intent, groupable } = input;\n if (!groupable && !preservesGroupMembership({ root: layout.root, source, intent })) {\n return undefined;\n }\n const candidate = input.candidate ?? placementCandidate(input)?.layout;\n if (!candidate || sameSerializedWorkspaceLayout(candidate, layout)) {\n return undefined;\n }\n if (!placementFits({ ...input, candidate: evaluation.project(candidate) })) {\n return undefined;\n }\n return candidate;\n}\n\nfunction placementCandidate(input: CandidateInput): WorkspacePlacementPlan | undefined {\n const { evaluation, layout, source, intent, planner = planWorkspacePlacement } = input;\n const plan = planner({\n layout,\n source,\n destination: intent.destination,\n operation: intent.kind,\n available: evaluation.available,\n projectLayout: evaluation.projectLayout\n });\n return plan ? preferredPlacement(input, plan) : undefined;\n}\n\nfunction placementFits(input: PreparationInput & { candidate: WorkspaceLayout }): boolean {\n return admitsWorkspaceMove({\n current: input.evaluation.project(input.layout).root,\n candidate: input.candidate.root,\n viewport: { width: input.measurements.width, height: input.measurements.height },\n requirements: input.evaluation.requirements\n });\n}\n\n// Keep discovery structural; fit the acquired candidate before admission and preview.\nexport function evaluatePlacementOffer(input: OfferInput): WorkspaceDragOffer | undefined {\n const { evaluation, source, intent, context } = input;\n const acquisition = context?.acquisition;\n const plan = acquisition ? preferredPlacement(input, acquisition.plan) : placementCandidate(input);\n if (!plan) return undefined;\n const { width, height } = evaluation.geometry(evaluation.project(plan.layout));\n const fit = resolveSelectedPlacementPlan({\n plan,\n source,\n available: evaluation.available,\n previous: context?.selected,\n intent,\n acquisition,\n current: input.currentRegions(),\n rect: { x: 0, y: 0, width, height },\n clientOrigin: evaluation.client({ x: 0, y: 0, width: 0, height: 0 }),\n requirements: evaluation.requirements\n });\n return placementOffer(input, fit ?? plan, !!fit);\n}\n\nfunction preferredPlacement(input: CandidateInput, plan: WorkspacePlacementPlan): WorkspacePlacementPlan {\n if (plan.kind !== 'split') return plan;\n const { evaluation, source } = input;\n return sizePreferredSplit({\n plan,\n source,\n available: evaluation.available,\n projectLayout: evaluation.projectLayout,\n preference: {\n allocation: evaluation.detached(source).regions,\n requirements: evaluation.requirements,\n contextRect: evaluation.contextRect\n }\n });\n}\n\nfunction placementOffer(\n input: OfferInput,\n plan: WorkspacePlacementPlan,\n fitted: boolean\n): WorkspaceDragOffer | undefined {\n const { evaluation, layout, measurements, source, intent } = input;\n const candidate = evaluation.project(plan.layout);\n const geometry = evaluation.geometry(candidate);\n const group = geometry.groups.find(item => item.panels.some(panel => source.includes(panel.id)));\n if (!group) return undefined;\n const rect = evaluation.client(group.rect);\n const { cue, bounds } =\n intent.kind === 'tab'\n ? getTabCue({\n group,\n source,\n intent,\n root: layout.root,\n spatial: () => evaluation.detached(source).groups,\n measurements,\n viewport: evaluation.bounds(),\n client: target => evaluation.client(target),\n scroll: target => evaluation.scroll(target)\n })\n : { cue: rect, bounds: evaluation.bounds() };\n const feasible =\n fitted &&\n placementFits({ ...input, candidate }) &&\n (input.groupable || preservesGroupMembership({ root: layout.root, source, intent }));\n const presentation = getOfferPresentation({\n plan,\n regions: geometry.regions,\n sourceKey: group.key,\n sourceRect: rect,\n cue,\n bounds,\n destination: intent.destination,\n feasible,\n split: intent.kind === 'split' ? { ...evaluation.detached(source), source } : undefined,\n client: target => evaluation.client(target)\n });\n if (!hasVisiblePlacementCue(intent, presentation.cue)) return undefined;\n return {\n ...presentation,\n cue: { kind: intent.kind === 'tab' ? 'tab' : 'group', rect: presentation.cue },\n feasible,\n ...getOfferAllocation(plan, feasible)\n };\n}\n\nfunction hasVisiblePlacementCue(intent: WorkspacePlacementIntent, cue: Rect): boolean {\n return intent.kind === 'tab' || (cue.width !== 0 && cue.height !== 0);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"preparation.utils.js","names":["getAdmissiblePlacementLayout","input","groupable","preservesGroupMembership","layout","candidate","placementCandidate","placementFits","evaluation","evaluatePlacementOffer","computePlacementOffer","planWorkspacePlacement","planning","intent","plan","planner","preferredPlacement","admitsWorkspaceMove","acquisition","context","fit","resolveSelectedPlacementPlan","placementOffer","sizePreferredSplit","source","geometry","group","item","panel","rect","getTabCue","target","feasible","fitted","presentation","getOfferPresentation","hasVisiblePlacementCue","getOfferAllocation","cue"],"sources":["../../../../src/workspace/utils/placement/preparation.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 { admitsWorkspaceMove } from '../geometry/sizing.utils.js';\nimport { preservesGroupMembership } from '../model/membership.utils.js';\nimport { sameWorkspaceLayout } from '../model/value.utils.js';\nimport { resolveSelectedPlacementPlan } from './acquisition-sizing.utils.js';\nimport { planWorkspacePlacement } from './planner.utils.js';\nimport { sizePreferredSplit } from './split-sizing.utils.js';\nimport { getTabCue } from '../presentation/groups.utils.js';\nimport { getOfferAllocation, getOfferPresentation } from '../presentation/offers.utils.js';\n\nimport type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';\nimport type { WorkspacePlacementIntent } from '../interaction/command.utils.js';\nimport type { WorkspaceDragOffer, WorkspaceOfferContext } from '../interaction/drag-preview.utils.js';\nimport type { WorkspaceLayout } from '../model/layout.utils.js';\nimport type { WorkspacePlacementPlan, WorkspacePlacementPlanner } from './planner.utils.js';\nimport type { WorkspacePlacementSession } from './session.utils.js';\nimport type { WorkspaceMeasurements } from '../presentation/measurements.utils.js';\nimport type { WorkspaceEvaluation } from '../evaluation.utils.js';\n\ninterface PreparationInput {\n evaluation: WorkspaceEvaluation;\n layout: WorkspaceLayout;\n measurements: WorkspaceMeasurements;\n}\n\ninterface CandidateInput extends PreparationInput {\n source: string[];\n intent: WorkspacePlacementIntent;\n planner?: WorkspacePlacementPlanner;\n placementSession?: WorkspacePlacementSession;\n}\n\nexport interface WorkspacePlacementOfferInputs extends CandidateInput {\n context?: WorkspaceOfferContext;\n groupable: boolean;\n currentRegions(): WorkspacePlacedRegion[];\n}\n\nexport function getAdmissiblePlacementLayout(\n input: CandidateInput & { groupable: boolean; candidate?: WorkspaceLayout }\n): WorkspaceLayout | undefined {\n const { evaluation, layout, source, intent, groupable } = input;\n if (!groupable && !preservesGroupMembership({ root: layout.root, source, intent })) {\n return undefined;\n }\n const candidate = input.candidate ?? placementCandidate(input)?.layout;\n if (!candidate || sameWorkspaceLayout(candidate, layout)) {\n return undefined;\n }\n if (!placementFits({ ...input, candidate: evaluation.project(candidate) })) {\n return undefined;\n }\n return candidate;\n}\n\nexport function evaluatePlacementOffer(input: WorkspacePlacementOfferInputs): WorkspaceDragOffer | undefined {\n return input.placementSession && !input.planner\n ? input.placementSession.prepareOffer(input)\n : computePlacementOffer(input);\n}\n\nfunction placementCandidate(input: CandidateInput): WorkspacePlacementPlan | undefined {\n const { evaluation, layout, source, intent, planner = planWorkspacePlacement } = input;\n const planning = {\n layout,\n source,\n destination: intent.destination,\n operation: intent.kind,\n available: evaluation.available,\n projectLayout: evaluation.projectLayout\n };\n const plan = input.placementSession && !input.planner ? input.placementSession.plan(planning) : planner(planning);\n return plan ? preferredPlacement(input, plan) : undefined;\n}\n\nfunction placementFits(input: PreparationInput & { candidate: WorkspaceLayout }): boolean {\n return admitsWorkspaceMove({\n current: input.evaluation.project(input.layout).root,\n candidate: input.candidate.root,\n viewport: { width: input.measurements.width, height: input.measurements.height },\n requirements: input.evaluation.requirements\n });\n}\n\n// Keep discovery structural; fit the acquired candidate before admission and preview.\nexport function computePlacementOffer(input: WorkspacePlacementOfferInputs): WorkspaceDragOffer | undefined {\n const { evaluation, source, intent, context } = input;\n const acquisition = context?.acquisition;\n const plan = acquisition ? preferredPlacement(input, acquisition.plan) : placementCandidate(input);\n if (!plan) return undefined;\n const { width, height } = evaluation.geometry(evaluation.project(plan.layout));\n const fit = resolveSelectedPlacementPlan({\n plan,\n source,\n available: evaluation.available,\n previous: context?.selected,\n intent,\n acquisition,\n current: input.currentRegions(),\n rect: { x: 0, y: 0, width, height },\n clientOrigin: evaluation.client({ x: 0, y: 0, width: 0, height: 0 }),\n requirements: evaluation.requirements,\n placementSession: input.planner ? undefined : input.placementSession\n });\n return placementOffer(input, fit ?? plan, !!fit);\n}\n\nfunction preferredPlacement(input: CandidateInput, plan: WorkspacePlacementPlan): WorkspacePlacementPlan {\n if (plan.kind !== 'split') return plan;\n const { evaluation, source } = input;\n return sizePreferredSplit({\n plan,\n source,\n available: evaluation.available,\n projectLayout: evaluation.projectLayout,\n preference: {\n allocation: evaluation.detached(source).regions,\n requirements: evaluation.requirements,\n resolveScopeRect: evaluation.resolveScopeRect\n }\n });\n}\n\nfunction placementOffer(\n input: WorkspacePlacementOfferInputs,\n plan: WorkspacePlacementPlan,\n fitted: boolean\n): WorkspaceDragOffer | undefined {\n const { evaluation, layout, measurements, source, intent } = input;\n const candidate = evaluation.project(plan.layout);\n const geometry = evaluation.geometry(candidate);\n const group = geometry.groups.find(item => item.panels.some(panel => source.includes(panel.id)));\n if (!group) return undefined;\n const rect = evaluation.client(group.rect);\n const { cue, bounds } =\n intent.kind === 'tab'\n ? getTabCue({\n group,\n source,\n intent,\n root: layout.root,\n spatial: () => evaluation.detached(source).groups,\n measurements,\n viewport: evaluation.bounds(),\n client: target => evaluation.client(target),\n scroll: target => evaluation.scroll(target)\n })\n : { cue: rect, bounds: evaluation.bounds() };\n const feasible =\n fitted &&\n placementFits({ ...input, candidate }) &&\n (input.groupable || preservesGroupMembership({ root: layout.root, source, intent }));\n const presentation = getOfferPresentation({\n plan,\n regions: geometry.regions,\n sourceKey: group.key,\n sourceRect: rect,\n cue,\n bounds,\n destination: intent.destination,\n feasible,\n split: intent.kind === 'split' ? { ...evaluation.detached(source), source } : undefined,\n client: target => evaluation.client(target)\n });\n if (!hasVisiblePlacementCue(intent, presentation.cue)) return undefined;\n return {\n ...presentation,\n cue: { kind: intent.kind === 'tab' ? 'tab' : 'group', rect: presentation.cue },\n feasible,\n ...getOfferAllocation(plan, feasible)\n };\n}\n\nfunction hasVisiblePlacementCue(intent: WorkspacePlacementIntent, cue: Rect): boolean {\n return intent.kind === 'tab' || (cue.width !== 0 && cue.height !== 0);\n}\n"],"mappings":"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"}