@nvidia-elements/core 2.22.4 → 2.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/CHANGELOG.md +13 -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/bundle.d.ts +4 -0
  10. package/dist/bundles/index.d.ts +336 -0
  11. package/dist/bundles/index.js +14 -14
  12. package/dist/button/button2.js +1 -1
  13. package/dist/button-group/button-group2.js +1 -1
  14. package/dist/card/card2.js +4 -4
  15. package/dist/chat-message/chat-message2.js +1 -1
  16. package/dist/checkbox/checkbox-group2.js +1 -1
  17. package/dist/checkbox/checkbox2.js +1 -1
  18. package/dist/color/color2.js +6 -6
  19. package/dist/combobox/combobox2.js +1 -1
  20. package/dist/copy-button/copy-button2.js +1 -1
  21. package/dist/custom-elements-jsx.d.ts +189 -0
  22. package/dist/custom-elements-vue.d.ts +189 -0
  23. package/dist/custom-elements.json +6555 -0
  24. package/dist/data.html.json +133 -0
  25. package/dist/data.snippets.json +27 -27
  26. package/dist/date/date2.js +6 -6
  27. package/dist/datetime/datetime2.js +6 -6
  28. package/dist/dialog/dialog-footer2.js +1 -1
  29. package/dist/dialog/dialog-header2.js +1 -1
  30. package/dist/dialog/dialog2.js +1 -1
  31. package/dist/divider/divider2.js +1 -1
  32. package/dist/dot/dot2.js +1 -1
  33. package/dist/drag-handle/drag-handle2.js +1 -1
  34. package/dist/drawer/drawer-content2.js +1 -1
  35. package/dist/drawer/drawer-footer2.js +1 -1
  36. package/dist/drawer/drawer-header2.js +1 -1
  37. package/dist/drawer/drawer2.js +1 -1
  38. package/dist/dropdown/dropdown-footer2.js +1 -1
  39. package/dist/dropdown/dropdown-header2.js +1 -1
  40. package/dist/dropdown/dropdown2.js +1 -1
  41. package/dist/dropdown-group/dropdown-group.js +1 -1
  42. package/dist/dropzone/dropzone2.js +1 -1
  43. package/dist/file/file2.js +1 -1
  44. package/dist/format-bytes/format-bytes2.js +1 -1
  45. package/dist/format-datetime/format-datetime2.js +1 -1
  46. package/dist/format-number/format-number2.js +1 -1
  47. package/dist/format-relative-time/format-relative-time2.js +1 -1
  48. package/dist/format-truncate/format-truncate2.js +1 -1
  49. package/dist/forms/control/control2.js +1 -1
  50. package/dist/forms/control-group/control-group2.js +1 -1
  51. package/dist/forms/control-message/control-message2.js +1 -1
  52. package/dist/gauge/gauge2.js +1 -1
  53. package/dist/ghost/define.d.ts +6 -0
  54. package/dist/ghost/define.js +6 -0
  55. package/dist/ghost/define.js.map +1 -0
  56. package/dist/ghost/ghost.d.ts +27 -0
  57. package/dist/ghost/ghost.examples.js +5 -0
  58. package/dist/ghost/ghost.examples.js.map +1 -0
  59. package/dist/ghost/ghost.examples.json +37 -0
  60. package/dist/ghost/ghost.js +5 -0
  61. package/dist/ghost/ghost.js.map +1 -0
  62. package/dist/ghost/ghost2.js +28 -0
  63. package/dist/ghost/ghost2.js.map +1 -0
  64. package/dist/ghost/index.d.ts +1 -0
  65. package/dist/ghost/index.js +1 -0
  66. package/dist/grid/cell/cell2.js +1 -1
  67. package/dist/grid/column/column2.js +1 -1
  68. package/dist/grid/footer/footer2.js +1 -1
  69. package/dist/grid/grid2.js +1 -1
  70. package/dist/grid/header/header2.js +1 -1
  71. package/dist/grid/placeholder/placeholder2.js +1 -1
  72. package/dist/grid/row/row2.js +1 -1
  73. package/dist/icon/icon2.js +2 -2
  74. package/dist/icon-button/icon-button2.js +1 -1
  75. package/dist/iframe/iframe2.js +1 -1
  76. package/dist/index.js +1 -1
  77. package/dist/input/input-group2.js +1 -1
  78. package/dist/input/input2.js +1 -1
  79. package/dist/internal/utils/a11y.js.map +1 -1
  80. package/dist/joystick/joystick2.js +5 -5
  81. package/dist/logo/logo2.js +1 -1
  82. package/dist/menu/menu-group2.js +1 -1
  83. package/dist/menu/menu-item2.js +1 -1
  84. package/dist/menu/menu2.js +1 -1
  85. package/dist/month/month2.js +6 -6
  86. package/dist/notification/notification-group2.js +1 -1
  87. package/dist/notification/notification2.js +1 -1
  88. package/dist/page/page-panel/page-panel-content2.js +1 -1
  89. package/dist/page/page-panel/page-panel-footer2.js +1 -1
  90. package/dist/page/page-panel/page-panel-header2.js +1 -1
  91. package/dist/page/page-panel/page-panel2.js +1 -1
  92. package/dist/page/page2.js +1 -1
  93. package/dist/page-header/page-header2.js +1 -1
  94. package/dist/page-loader/page-loader2.js +1 -1
  95. package/dist/pagination/pagination2.js +1 -1
  96. package/dist/panel/panel2.js +4 -4
  97. package/dist/password/password2.js +6 -6
  98. package/dist/polyfills/index.d.ts +4 -7
  99. package/dist/polyfills/index.js +0 -8
  100. package/dist/preferences-input/preferences-input2.js +5 -5
  101. package/dist/progress-bar/progress-bar2.js +1 -1
  102. package/dist/progress-dot/progress-dot2.js +1 -1
  103. package/dist/progress-ring/progress-ring2.js +1 -1
  104. package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
  105. package/dist/pulse/pulse2.js +1 -1
  106. package/dist/radio/radio-group2.js +1 -1
  107. package/dist/radio/radio2.js +1 -1
  108. package/dist/range/range2.js +1 -1
  109. package/dist/resize-handle/resize-handle2.js +5 -5
  110. package/dist/search/search2.js +6 -6
  111. package/dist/select/select2.js +1 -1
  112. package/dist/select/select2.js.map +1 -1
  113. package/dist/skeleton/skeleton2.js +1 -1
  114. package/dist/sort-button/sort-button2.js +1 -1
  115. package/dist/sparkline/sparkline2.js +1 -1
  116. package/dist/star-rating/star-rating2.js +1 -1
  117. package/dist/steps/steps2.js +6 -6
  118. package/dist/switch/switch-group2.js +1 -1
  119. package/dist/switch/switch2.js +1 -1
  120. package/dist/tabs/tabs-group2.js +1 -1
  121. package/dist/tabs/tabs-item-group2.js +1 -1
  122. package/dist/tabs/tabs2.js +2 -2
  123. package/dist/tag/tag2.js +5 -5
  124. package/dist/textarea/textarea2.js +1 -1
  125. package/dist/time/time2.js +6 -6
  126. package/dist/toast/toast2.js +1 -1
  127. package/dist/toast/toast2.js.map +1 -1
  128. package/dist/toggletip/toggletip-footer2.js +1 -1
  129. package/dist/toggletip/toggletip-header2.js +1 -1
  130. package/dist/toggletip/toggletip2.js +1 -1
  131. package/dist/toolbar/toolbar2.js +1 -1
  132. package/dist/tooltip/tooltip2.js +1 -1
  133. package/dist/tree/tree-node2.js +1 -1
  134. package/dist/tree/tree2.js +1 -1
  135. package/dist/week/week2.js +6 -6
  136. package/dist/workspace/controllers/workspace-command.controller.d.ts +34 -0
  137. package/dist/workspace/controllers/workspace-command.controller.js +87 -0
  138. package/dist/workspace/controllers/workspace-command.controller.js.map +1 -0
  139. package/dist/workspace/controllers/workspace-composition.controller.d.ts +54 -0
  140. package/dist/workspace/controllers/workspace-composition.controller.js +169 -0
  141. package/dist/workspace/controllers/workspace-composition.controller.js.map +1 -0
  142. package/dist/workspace/controllers/workspace-fullscreen.controller.d.ts +25 -0
  143. package/dist/workspace/controllers/workspace-fullscreen.controller.js +84 -0
  144. package/dist/workspace/controllers/workspace-fullscreen.controller.js.map +1 -0
  145. package/dist/workspace/controllers/workspace-measurement.controller.d.ts +19 -0
  146. package/dist/workspace/controllers/workspace-measurement.controller.js +188 -0
  147. package/dist/workspace/controllers/workspace-measurement.controller.js.map +1 -0
  148. package/dist/workspace/controllers/workspace-rearrange.controller.d.ts +40 -0
  149. package/dist/workspace/controllers/workspace-rearrange.controller.js +385 -0
  150. package/dist/workspace/controllers/workspace-rearrange.controller.js.map +1 -0
  151. package/dist/workspace/controllers/workspace-resize.controller.d.ts +43 -0
  152. package/dist/workspace/controllers/workspace-resize.controller.js +168 -0
  153. package/dist/workspace/controllers/workspace-resize.controller.js.map +1 -0
  154. package/dist/workspace/controllers/workspace-restoration.controller.d.ts +24 -0
  155. package/dist/workspace/controllers/workspace-restoration.controller.js +193 -0
  156. package/dist/workspace/controllers/workspace-restoration.controller.js.map +1 -0
  157. package/dist/workspace/define.d.ts +10 -0
  158. package/dist/workspace/define.js +9 -0
  159. package/dist/workspace/define.js.map +1 -0
  160. package/dist/workspace/index.d.ts +8 -0
  161. package/dist/workspace/index.js +6 -0
  162. package/dist/workspace/panel/panel.d.ts +48 -0
  163. package/dist/workspace/panel/panel.js +5 -0
  164. package/dist/workspace/panel/panel.js.map +1 -0
  165. package/dist/workspace/panel/panel2.js +53 -0
  166. package/dist/workspace/panel/panel2.js.map +1 -0
  167. package/dist/workspace/panel-content/panel-content.d.ts +20 -0
  168. package/dist/workspace/panel-content/panel-content.js +5 -0
  169. package/dist/workspace/panel-content/panel-content.js.map +1 -0
  170. package/dist/workspace/panel-content/panel-content2.js +22 -0
  171. package/dist/workspace/panel-content/panel-content2.js.map +1 -0
  172. package/dist/workspace/panel-footer/panel-footer.d.ts +24 -0
  173. package/dist/workspace/panel-footer/panel-footer.js +5 -0
  174. package/dist/workspace/panel-footer/panel-footer.js.map +1 -0
  175. package/dist/workspace/panel-footer/panel-footer2.js +28 -0
  176. package/dist/workspace/panel-footer/panel-footer2.js.map +1 -0
  177. package/dist/workspace/panel-header/panel-header.d.ts +61 -0
  178. package/dist/workspace/panel-header/panel-header.js +5 -0
  179. package/dist/workspace/panel-header/panel-header.js.map +1 -0
  180. package/dist/workspace/panel-header/panel-header2.js +102 -0
  181. package/dist/workspace/panel-header/panel-header2.js.map +1 -0
  182. package/dist/workspace/utils/evaluation.utils.d.ts +83 -0
  183. package/dist/workspace/utils/evaluation.utils.js +294 -0
  184. package/dist/workspace/utils/evaluation.utils.js.map +1 -0
  185. package/dist/workspace/utils/geometry/allocation.utils.d.ts +40 -0
  186. package/dist/workspace/utils/geometry/allocation.utils.js +73 -0
  187. package/dist/workspace/utils/geometry/allocation.utils.js.map +1 -0
  188. package/dist/workspace/utils/geometry/partition.utils.d.ts +10 -0
  189. package/dist/workspace/utils/geometry/partition.utils.js +40 -0
  190. package/dist/workspace/utils/geometry/partition.utils.js.map +1 -0
  191. package/dist/workspace/utils/geometry/sizing.utils.d.ts +35 -0
  192. package/dist/workspace/utils/geometry/sizing.utils.js +42 -0
  193. package/dist/workspace/utils/geometry/sizing.utils.js.map +1 -0
  194. package/dist/workspace/utils/interaction/boundary.utils.d.ts +40 -0
  195. package/dist/workspace/utils/interaction/boundary.utils.js +91 -0
  196. package/dist/workspace/utils/interaction/boundary.utils.js.map +1 -0
  197. package/dist/workspace/utils/interaction/command.utils.d.ts +74 -0
  198. package/dist/workspace/utils/interaction/command.utils.js +189 -0
  199. package/dist/workspace/utils/interaction/command.utils.js.map +1 -0
  200. package/dist/workspace/utils/interaction/drag-preview.utils.d.ts +79 -0
  201. package/dist/workspace/utils/interaction/drag-preview.utils.js +16 -0
  202. package/dist/workspace/utils/interaction/drag-preview.utils.js.map +1 -0
  203. package/dist/workspace/utils/interaction/insertion-offers.utils.d.ts +58 -0
  204. package/dist/workspace/utils/interaction/insertion-offers.utils.js +259 -0
  205. package/dist/workspace/utils/interaction/insertion-offers.utils.js.map +1 -0
  206. package/dist/workspace/utils/interaction/placement-decision.utils.d.ts +55 -0
  207. package/dist/workspace/utils/interaction/placement-decision.utils.js +242 -0
  208. package/dist/workspace/utils/interaction/placement-decision.utils.js.map +1 -0
  209. package/dist/workspace/utils/interaction/resize-input.utils.d.ts +1 -0
  210. package/dist/workspace/utils/interaction/resize-input.utils.js +17 -0
  211. package/dist/workspace/utils/interaction/resize-input.utils.js.map +1 -0
  212. package/dist/workspace/utils/model/layout.utils.d.ts +22 -0
  213. package/dist/workspace/utils/model/layout.utils.js +41 -0
  214. package/dist/workspace/utils/model/layout.utils.js.map +1 -0
  215. package/dist/workspace/utils/model/membership.utils.d.ts +14 -0
  216. package/dist/workspace/utils/model/membership.utils.js +17 -0
  217. package/dist/workspace/utils/model/membership.utils.js.map +1 -0
  218. package/dist/workspace/utils/model/operations.utils.d.ts +31 -0
  219. package/dist/workspace/utils/model/operations.utils.js +178 -0
  220. package/dist/workspace/utils/model/operations.utils.js.map +1 -0
  221. package/dist/workspace/utils/model/projection.utils.d.ts +7 -0
  222. package/dist/workspace/utils/model/projection.utils.js +87 -0
  223. package/dist/workspace/utils/model/projection.utils.js.map +1 -0
  224. package/dist/workspace/utils/model/value.utils.d.ts +5 -0
  225. package/dist/workspace/utils/model/value.utils.js +68 -0
  226. package/dist/workspace/utils/model/value.utils.js.map +1 -0
  227. package/dist/workspace/utils/placement/acquisition-sizing.utils.d.ts +32 -0
  228. package/dist/workspace/utils/placement/acquisition-sizing.utils.js +152 -0
  229. package/dist/workspace/utils/placement/acquisition-sizing.utils.js.map +1 -0
  230. package/dist/workspace/utils/placement/context.utils.d.ts +36 -0
  231. package/dist/workspace/utils/placement/context.utils.js +135 -0
  232. package/dist/workspace/utils/placement/context.utils.js.map +1 -0
  233. package/dist/workspace/utils/placement/group-insertion.utils.d.ts +26 -0
  234. package/dist/workspace/utils/placement/group-insertion.utils.js +171 -0
  235. package/dist/workspace/utils/placement/group-insertion.utils.js.map +1 -0
  236. package/dist/workspace/utils/placement/origin.utils.d.ts +13 -0
  237. package/dist/workspace/utils/placement/origin.utils.js +49 -0
  238. package/dist/workspace/utils/placement/origin.utils.js.map +1 -0
  239. package/dist/workspace/utils/placement/planner.utils.d.ts +22 -0
  240. package/dist/workspace/utils/placement/planner.utils.js +184 -0
  241. package/dist/workspace/utils/placement/planner.utils.js.map +1 -0
  242. package/dist/workspace/utils/placement/preparation.utils.d.ts +28 -0
  243. package/dist/workspace/utils/placement/preparation.utils.js +140 -0
  244. package/dist/workspace/utils/placement/preparation.utils.js.map +1 -0
  245. package/dist/workspace/utils/placement/region.utils.d.ts +15 -0
  246. package/dist/workspace/utils/placement/region.utils.js +111 -0
  247. package/dist/workspace/utils/placement/region.utils.js.map +1 -0
  248. package/dist/workspace/utils/placement/split-sizing.utils.d.ts +18 -0
  249. package/dist/workspace/utils/placement/split-sizing.utils.js +108 -0
  250. package/dist/workspace/utils/placement/split-sizing.utils.js.map +1 -0
  251. package/dist/workspace/utils/presentation/composition.utils.d.ts +17 -0
  252. package/dist/workspace/utils/presentation/composition.utils.js +95 -0
  253. package/dist/workspace/utils/presentation/composition.utils.js.map +1 -0
  254. package/dist/workspace/utils/presentation/groups.utils.d.ts +91 -0
  255. package/dist/workspace/utils/presentation/groups.utils.js +169 -0
  256. package/dist/workspace/utils/presentation/groups.utils.js.map +1 -0
  257. package/dist/workspace/utils/presentation/header-configuration.utils.d.ts +11 -0
  258. package/dist/workspace/utils/presentation/header-configuration.utils.js +7 -0
  259. package/dist/workspace/utils/presentation/header-configuration.utils.js.map +1 -0
  260. package/dist/workspace/utils/presentation/measurements.utils.d.ts +21 -0
  261. package/dist/workspace/utils/presentation/measurements.utils.js +28 -0
  262. package/dist/workspace/utils/presentation/measurements.utils.js.map +1 -0
  263. package/dist/workspace/utils/presentation/offers.utils.d.ts +43 -0
  264. package/dist/workspace/utils/presentation/offers.utils.js +137 -0
  265. package/dist/workspace/utils/presentation/offers.utils.js.map +1 -0
  266. package/dist/workspace/utils/presentation/preview.utils.d.ts +6 -0
  267. package/dist/workspace/utils/presentation/preview.utils.js +36 -0
  268. package/dist/workspace/utils/presentation/preview.utils.js.map +1 -0
  269. package/dist/workspace/workspace.d.ts +103 -0
  270. package/dist/workspace/workspace.examples.js +5 -0
  271. package/dist/workspace/workspace.examples.js.map +1 -0
  272. package/dist/workspace/workspace.examples.json +133 -0
  273. package/dist/workspace/workspace.js +5 -0
  274. package/dist/workspace/workspace.js.map +1 -0
  275. package/dist/workspace/workspace.types.d.ts +3 -0
  276. package/dist/workspace/workspace2.js +518 -0
  277. package/dist/workspace/workspace2.js.map +1 -0
  278. package/package.json +26 -3
  279. package/dist/polyfills/index.js.map +0 -1
@@ -0,0 +1,152 @@
1
+ import { getPanelIds as e } from "../model/layout.utils.js";
2
+ import { projectLayout as t } from "../model/operations.utils.js";
3
+ import { matchesPlacementIntent as n } from "../interaction/drag-preview.utils.js";
4
+ import { getAllocatedContextRect as r, getContextKey as i } from "./context.utils.js";
5
+ import { rebaseProjectedSplit as a } from "../model/projection.utils.js";
6
+ import { describePlacementSlot as o } from "./group-insertion.utils.js";
7
+ import { getMinimumWorkspaceDimensions as s } from "../geometry/sizing.utils.js";
8
+ import { fitSizes as c } from "../geometry/partition.utils.js";
9
+ import { allocateWorkspace as l } from "../geometry/allocation.utils.js";
10
+ // src/workspace/utils/placement/acquisition-sizing.utils.ts
11
+ function u(e) {
12
+ let t = o(e);
13
+ if (!d(t, o({
14
+ ...e,
15
+ plan: { layout: e.previous }
16
+ }))) return e.plan;
17
+ let n = p(e, t.axis), r = n.allocate(e.plan.layout).groups.find((t) => t.group.panels.every((t) => e.source.includes(t)));
18
+ if (!r) return;
19
+ if (f(n, r.rect)) return e.plan;
20
+ let i = h(n, r.key), a = i && _(n, i, r.key), s = a && n.allocate(a).groups.find((e) => e.key === r.key);
21
+ return a && f(n, s?.rect) ? {
22
+ ...e.plan,
23
+ layout: a
24
+ } : void 0;
25
+ }
26
+ function d(e, t) {
27
+ return !!e?.previous && !!e.next && !!t && (e.axis !== t.axis || i(e.members) !== i(t.members));
28
+ }
29
+ function f(e, t) {
30
+ return !!t && e.covers(t, "x") && e.covers(t, "y");
31
+ }
32
+ function p(e, n) {
33
+ let r = n === "horizontal" ? "x" : "y", i = r === "x" ? "width" : "height", a = (t) => t === r ? {
34
+ start: e.acquisition.rect[r],
35
+ end: e.acquisition.rect[r] + e.acquisition.rect[i]
36
+ } : {
37
+ start: e.acquisition.point[t],
38
+ end: e.acquisition.point[t]
39
+ };
40
+ return {
41
+ input: e,
42
+ axis: r,
43
+ extent: i,
44
+ range: a,
45
+ covers: (e, t) => m(e, t, a(t)),
46
+ allocate: (n) => l({
47
+ root: t(n, e.available).root,
48
+ rect: e.rect,
49
+ minimum: (t) => s(t, e.requirements),
50
+ policy: "stop",
51
+ gap: e.requirements.gap
52
+ })
53
+ };
54
+ }
55
+ function m(e, t, n) {
56
+ let r = e[t] + e[t === "x" ? "width" : "height"];
57
+ return n.start === n.end ? e[t] <= n.start && n.start < r : e[t] <= n.start + 1e-7 && r >= n.end - 1e-7;
58
+ }
59
+ function h(e, t) {
60
+ let n = t.split("."), r = e.input.plan.layout;
61
+ for (let t = 1; t < n.length - 1; t++) {
62
+ if (!r) return;
63
+ let i = n.slice(0, t).join("."), a = e.allocate(r).regions, o = a.find((e) => e.key === i), s = a.find((e) => e.key === `${i}.${n[t]}`);
64
+ if (o.node.type !== "split") return;
65
+ let c = o.node.axis === "horizontal" ? "x" : "y";
66
+ e.covers(s.rect, c) || (r = g({
67
+ fit: e,
68
+ layout: r,
69
+ parent: o,
70
+ index: Number(n[t])
71
+ }));
72
+ }
73
+ return r;
74
+ }
75
+ function g({ fit: t, layout: n, parent: i, index: o }) {
76
+ if (i.node.type !== "split") return;
77
+ let l = i.node.axis === "horizontal" ? "width" : "height", u = i.node.children.map((e) => s(e, t.input.requirements)[l]), d = i.rect[l] - t.input.requirements.gap * (u.length - 1), f = i.node.children.map((n, i) => i === o ? 0 : r({
78
+ members: e(n),
79
+ allocation: t.input.current,
80
+ source: t.input.source
81
+ })?.[l]);
82
+ if (f.some((e) => e === void 0) || y(u) > d) return;
83
+ let p = f.map((e) => e);
84
+ return p[o] = Math.max(u[o], d - y(p)), a(n, i.node, c(p, u, d), t.input.available) ?? n;
85
+ }
86
+ function _(e, t, n) {
87
+ let r = e.allocate(t), i = r.regions.find((e) => e.key === n.split(".").slice(0, -1).join("."));
88
+ if (i.node.type !== "split") return;
89
+ let o = r.groups.find((e) => e.key === n), s = Number(n.split(".").at(-1)), c = v({
90
+ fit: e,
91
+ owner: {
92
+ ...i,
93
+ node: i.node
94
+ },
95
+ incoming: o.rect,
96
+ index: s
97
+ });
98
+ if (c) return a(t, i.node, c, e.input.available) ?? t;
99
+ }
100
+ function v(e) {
101
+ let { fit: t, owner: n, incoming: r, index: i } = e, { axis: a, extent: o } = t, l = n.node.children.map((e) => s(e, t.input.requirements)[o]), u = l.slice(0, i), d = l.slice(i + 1), f = Math.max(n.rect[a] + y(u) + t.input.requirements.gap * i, t.range(a).end - r[o]), p = Math.min(n.rect[a] + n.rect[o] - y(d) - t.input.requirements.gap * d.length - r[o], t.range(a).start);
102
+ if (f > p) return;
103
+ let m = Math.max(f, Math.min(r[a], p));
104
+ return [
105
+ ...c(n.node.weights.slice(0, i), u, m - n.rect[a] - t.input.requirements.gap * i),
106
+ r[o],
107
+ ...c(n.node.weights.slice(i + 1), d, n.rect[a] + n.rect[o] - m - r[o] - t.input.requirements.gap * d.length)
108
+ ];
109
+ }
110
+ var y = (e) => e.reduce((e, t) => e + t, 0);
111
+ function b(e) {
112
+ let t = e.previous;
113
+ if (C(t, e.intent) && !e.acquisition) return;
114
+ if (!S(t, e.source) || !x(t, e.plan)) return e.plan;
115
+ let n = o({
116
+ ...e,
117
+ plan: t
118
+ }), r = o(e);
119
+ if (n && n.key === r?.key) return {
120
+ ...e.plan,
121
+ layout: t.layout
122
+ };
123
+ if (!e.acquisition) return e.plan;
124
+ let { rect: i, point: a } = e.acquisition;
125
+ return u({
126
+ ...e,
127
+ previous: t.layout,
128
+ acquisition: {
129
+ rect: {
130
+ ...i,
131
+ x: i.x - e.clientOrigin.x,
132
+ y: i.y - e.clientOrigin.y
133
+ },
134
+ point: {
135
+ x: a.x - e.clientOrigin.x,
136
+ y: a.y - e.clientOrigin.y
137
+ }
138
+ }
139
+ });
140
+ }
141
+ function x(e, t) {
142
+ return ["order", "insert"].includes(e.intent.kind) && ["insert", "reorder"].includes(t.kind);
143
+ }
144
+ function S(e, t) {
145
+ return e?.phase === "detached" && !e.blocked && e.allocation === "reserved" && i(e.source) === i(t);
146
+ }
147
+ function C(e, t) {
148
+ return e?.phase === "detached" && e.blocked && n(e.intent, t);
149
+ }
150
+ export { u as fitAcquiredPlacement, b as resolveSelectedPlacementPlan };
151
+
152
+ //# sourceMappingURL=acquisition-sizing.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acquisition-sizing.utils.js","names":["fitAcquiredPlacement","next","describePlacementSlot","input","crossScopeInterior","fit","acquisitionFit","moving","group","id","coversAcquisition","ancestors","fitReceivingPath","layout","fitIncoming","achieved","prior","getContextKey","rect","axis","direction","extent","range","dimension","coversRange","allocateWorkspace","projectLayout","getMinimumWorkspaceDimensions","node","end","path","depth","key","regions","parent","region","receiving","fitAncestor","size","minima","child","budget","extents","slot","index","getAllocatedContextRect","getPanelIds","value","sum","preferred","rebaseProjectedSplit","fitSizes","allocation","owner","incoming","sizes","incomingSizes","before","after","start","position","values","total","resolveSelectedPlacementPlan","blockedSelection","selectedReservation","spatialReservation","current","point","preview","plan","source","matchesPlacementIntent","intent"],"sources":["../../../../src/workspace/utils/placement/acquisition-sizing.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Point, Rect } from '@nvidia-elements/core/internal';\n\nimport { allocateWorkspace } from '../geometry/allocation.utils.js';\nimport { fitSizes } from '../geometry/partition.utils.js';\nimport { getMinimumWorkspaceDimensions } from '../geometry/sizing.utils.js';\nimport { matchesPlacementIntent } from '../interaction/drag-preview.utils.js';\nimport { getPanelIds } from '../model/layout.utils.js';\nimport { projectLayout } from '../model/operations.utils.js';\nimport { rebaseProjectedSplit } from '../model/projection.utils.js';\nimport { getAllocatedContextRect, getContextKey } from './context.utils.js';\nimport { describePlacementSlot } from './group-insertion.utils.js';\n\nimport type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';\nimport type { WorkspaceRequirements } from '../geometry/sizing.utils.js';\nimport type { WorkspaceDragPreview, WorkspaceDropIntent } from '../interaction/drag-preview.utils.js';\nimport type { WorkspaceLayout, WorkspaceSplit } from '../model/layout.utils.js';\nimport type { WorkspacePlacementPlan } from './planner.utils.js';\n\ninterface AcquisitionInput {\n plan: WorkspacePlacementPlan;\n previous: WorkspaceLayout;\n source: string[];\n available: string[];\n current: WorkspacePlacedRegion[];\n rect: Rect;\n acquisition: { rect: Rect; point: Point };\n requirements: WorkspaceRequirements;\n}\n\ninterface Fit {\n input: AcquisitionInput;\n axis: 'x' | 'y';\n extent: 'width' | 'height';\n range: (axis: 'x' | 'y') => { start: number; end: number };\n covers: (rect: Rect, axis: 'x' | 'y') => boolean;\n allocate: (layout: WorkspaceLayout) => ReturnType<typeof allocateWorkspace>;\n}\n\n/** Fits a cross-scope interior reservation to its acquired allocation without retaining a hidden target. */\nexport function fitAcquiredPlacement(input: AcquisitionInput): WorkspacePlacementPlan | undefined {\n const next = describePlacementSlot(input);\n const prior = describePlacementSlot({ ...input, plan: { layout: input.previous } });\n if (!crossScopeInterior(next, prior)) return input.plan;\n const fit = acquisitionFit(input, next.axis);\n const moving = fit\n .allocate(input.plan.layout)\n .groups.find(group => group.group.panels.every(id => input.source.includes(id)));\n if (!moving) return undefined;\n if (coversAcquisition(fit, moving.rect)) return input.plan;\n const ancestors = fitReceivingPath(fit, moving.key);\n const layout = ancestors && fitIncoming(fit, ancestors, moving.key);\n const achieved = layout && fit.allocate(layout).groups.find(group => group.key === moving.key);\n return layout && coversAcquisition(fit, achieved?.rect) ? { ...input.plan, layout } : undefined;\n}\n\nfunction crossScopeInterior(\n next: ReturnType<typeof describePlacementSlot>,\n prior: ReturnType<typeof describePlacementSlot>\n): next is NonNullable<typeof next> {\n return (\n !!next?.previous &&\n !!next.next &&\n !!prior &&\n (next.axis !== prior.axis || getContextKey(next.members) !== getContextKey(prior.members))\n );\n}\n\nfunction coversAcquisition(fit: Fit, rect?: Rect) {\n return !!rect && fit.covers(rect, 'x') && fit.covers(rect, 'y');\n}\n\nfunction acquisitionFit(input: AcquisitionInput, direction: WorkspaceSplit['axis']): Fit {\n const axis = direction === 'horizontal' ? 'x' : 'y';\n const extent = axis === 'x' ? 'width' : 'height';\n const range = (dimension: 'x' | 'y') =>\n dimension === axis\n ? { start: input.acquisition.rect[axis], end: input.acquisition.rect[axis] + input.acquisition.rect[extent] }\n : { start: input.acquisition.point[dimension], end: input.acquisition.point[dimension] };\n return {\n input,\n axis,\n extent,\n range,\n covers: (rect, dimension) => coversRange(rect, dimension, range(dimension)),\n allocate: layout =>\n allocateWorkspace({\n root: projectLayout(layout, input.available).root,\n rect: input.rect,\n minimum: node => getMinimumWorkspaceDimensions(node, input.requirements),\n policy: 'stop',\n gap: input.requirements.gap\n })\n };\n}\n\nfunction coversRange(rect: Rect, axis: 'x' | 'y', range: { start: number; end: number }) {\n const end = rect[axis] + rect[axis === 'x' ? 'width' : 'height'];\n return range.start === range.end\n ? rect[axis] <= range.start && range.start < end\n : rect[axis] <= range.start + 1e-7 && end >= range.end - 1e-7;\n}\n\nfunction fitReceivingPath(fit: Fit, moving: string) {\n const path = moving.split('.');\n let layout: WorkspaceLayout | undefined = fit.input.plan.layout;\n for (let depth = 1; depth < path.length - 1; depth++) {\n if (!layout) return undefined;\n const key = path.slice(0, depth).join('.');\n const regions = fit.allocate(layout).regions;\n const parent = regions.find(region => region.key === key)!;\n const receiving = regions.find(region => region.key === `${key}.${path[depth]}`)!;\n if (parent.node.type !== 'split') return undefined;\n const axis = parent.node.axis === 'horizontal' ? 'x' : 'y';\n if (!fit.covers(receiving.rect, axis)) {\n layout = fitAncestor({ fit, layout, parent, index: Number(path[depth]) });\n }\n }\n return layout;\n}\n\nfunction fitAncestor({\n fit,\n layout,\n parent,\n index\n}: {\n fit: Fit;\n layout: WorkspaceLayout;\n parent: WorkspacePlacedRegion;\n index: number;\n}) {\n if (parent.node.type !== 'split') return undefined;\n const size = parent.node.axis === 'horizontal' ? 'width' : 'height';\n const minima = parent.node.children.map(child => getMinimumWorkspaceDimensions(child, fit.input.requirements)[size]);\n const budget = parent.rect[size] - fit.input.requirements.gap * (minima.length - 1);\n const extents = parent.node.children.map((child, slot) =>\n slot === index\n ? 0\n : getAllocatedContextRect({\n members: getPanelIds(child),\n allocation: fit.input.current,\n source: fit.input.source\n })?.[size]\n );\n if (extents.some(value => value === undefined) || sum(minima) > budget) return undefined;\n const preferred = extents.map(value => value!);\n preferred[index] = Math.max(minima[index]!, budget - sum(preferred));\n return rebaseProjectedSplit(layout, parent.node, fitSizes(preferred, minima, budget), fit.input.available) ?? layout;\n}\n\nfunction fitIncoming(fit: Fit, layout: WorkspaceLayout, key: string) {\n const allocation = fit.allocate(layout);\n const owner = allocation.regions.find(region => region.key === key.split('.').slice(0, -1).join('.'))!;\n if (owner.node.type !== 'split') return undefined;\n const incoming = allocation.groups.find(group => group.key === key)!;\n const index = Number(key.split('.').at(-1));\n const sizes = incomingSizes({ fit, owner: { ...owner, node: owner.node }, incoming: incoming.rect, index });\n if (!sizes) return undefined;\n\n const rebased = rebaseProjectedSplit(layout, owner.node, sizes, fit.input.available);\n return rebased ?? layout;\n}\n\nfunction incomingSizes(input: {\n fit: Fit;\n owner: WorkspacePlacedRegion & { node: WorkspaceSplit };\n incoming: Rect;\n index: number;\n}) {\n const { fit, owner, incoming, index } = input;\n const { axis, extent } = fit;\n const minima = owner.node.children.map(child => getMinimumWorkspaceDimensions(child, fit.input.requirements)[extent]);\n const before = minima.slice(0, index);\n const after = minima.slice(index + 1);\n const start = Math.max(\n owner.rect[axis] + sum(before) + fit.input.requirements.gap * index,\n fit.range(axis).end - incoming[extent]\n );\n const end = Math.min(\n owner.rect[axis] + owner.rect[extent] - sum(after) - fit.input.requirements.gap * after.length - incoming[extent],\n fit.range(axis).start\n );\n if (start > end) return undefined;\n const position = Math.max(start, Math.min(incoming[axis], end));\n return [\n ...fitSizes(\n owner.node.weights.slice(0, index),\n before,\n position - owner.rect[axis] - fit.input.requirements.gap * index\n ),\n incoming[extent],\n ...fitSizes(\n owner.node.weights.slice(index + 1),\n after,\n owner.rect[axis] + owner.rect[extent] - position - incoming[extent] - fit.input.requirements.gap * after.length\n )\n ];\n}\n\nconst sum = (values: number[]) => values.reduce((total, value) => total + value, 0);\n\n/** Reuses the actual selected reservation before considering a different spatial offer. */\nexport function resolveSelectedPlacementPlan(\n input: Omit<AcquisitionInput, 'previous' | 'acquisition'> & {\n previous?: WorkspaceDragPreview;\n acquisition?: { rect: Rect; point: Point };\n clientOrigin: Rect;\n intent: WorkspaceDropIntent;\n }\n): WorkspacePlacementPlan | undefined {\n const prior = input.previous;\n if (blockedSelection(prior, input.intent) && !input.acquisition) return undefined;\n if (!selectedReservation(prior, input.source) || !spatialReservation(prior, input.plan)) return input.plan;\n const current = describePlacementSlot({ ...input, plan: prior });\n const next = describePlacementSlot(input);\n if (current && current.key === next?.key) return { ...input.plan, layout: prior.layout };\n if (!input.acquisition) return input.plan;\n const { rect, point } = input.acquisition;\n return fitAcquiredPlacement({\n ...input,\n previous: prior.layout,\n acquisition: {\n rect: { ...rect, x: rect.x - input.clientOrigin.x, y: rect.y - input.clientOrigin.y },\n point: { x: point.x - input.clientOrigin.x, y: point.y - input.clientOrigin.y }\n }\n });\n}\n\nfunction spatialReservation(preview: WorkspaceDragPreview, plan: WorkspacePlacementPlan) {\n return ['order', 'insert'].includes(preview.intent.kind) && ['insert', 'reorder'].includes(plan.kind);\n}\n\nfunction selectedReservation(\n preview: WorkspaceDragPreview | undefined,\n source: string[]\n): preview is Extract<WorkspaceDragPreview, { phase: 'detached' }> & { allocation: 'reserved' } {\n return (\n preview?.phase === 'detached' &&\n !preview.blocked &&\n preview.allocation === 'reserved' &&\n getContextKey(preview.source) === getContextKey(source)\n );\n}\n\nfunction blockedSelection(preview: WorkspaceDragPreview | undefined, intent: WorkspaceDropIntent) {\n return preview?.phase === 'detached' && preview.blocked && matchesPlacementIntent(preview.intent, intent);\n}\n"],"mappings":"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"}
@@ -0,0 +1,36 @@
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 WorkspacePlacementContext {
5
+ kind: 'rail' | 'recipient';
6
+ members: string[];
7
+ }
8
+ export interface WorkspaceContextProxy {
9
+ key: string;
10
+ rect: Rect;
11
+ }
12
+ interface ContextRectInput {
13
+ members: string[];
14
+ allocation: WorkspacePlacedRegion[];
15
+ source: string[];
16
+ }
17
+ export type WorkspaceContextRectResolver = (input: ContextRectInput) => Rect | undefined;
18
+ /** Identifies an operating region independently of path changes or sibling order. */
19
+ export declare function getContextKey(members: string[]): string;
20
+ export declare function createPlacementContext(kind: WorkspacePlacementContext['kind'], node: WorkspaceNode | null, source: string[]): WorkspacePlacementContext;
21
+ /** Includes surviving peers whose computed allocation changes under split constraints. */
22
+ export declare function getAffectedSplitContext(input: {
23
+ baseline: WorkspacePlacedRegion[];
24
+ achieved: WorkspacePlacedRegion[];
25
+ source: string[];
26
+ recipient: string[];
27
+ }): WorkspacePlacementContext;
28
+ /** Seeds operating-region proxies before their selection can change during animation. */
29
+ export declare function allocateContextProxies(input: {
30
+ catalog: WorkspacePlacedRegion[];
31
+ allocation: WorkspacePlacedRegion[];
32
+ source: string[];
33
+ }): WorkspaceContextProxy[];
34
+ export declare function getAllocatedContextRect(input: ContextRectInput): Rect | undefined;
35
+ export declare function createContextRectResolver(): WorkspaceContextRectResolver;
36
+ export {};
@@ -0,0 +1,135 @@
1
+ import { getPanelIds as e } from "../model/layout.utils.js";
2
+ // src/workspace/utils/placement/context.utils.ts
3
+ function t(e) {
4
+ return JSON.stringify([...e].sort());
5
+ }
6
+ function n(t, n, r) {
7
+ let i = new Set(r);
8
+ return {
9
+ kind: t,
10
+ members: e(n).filter((e) => t === "rail" || !i.has(e))
11
+ };
12
+ }
13
+ function r(t) {
14
+ 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);
15
+ for (let e of t.baseline) if (e.node.type === "group") for (let a of e.node.panels) {
16
+ if (t.source.includes(a)) continue;
17
+ let o = n.get(a);
18
+ o && i(e.rect, o) && r.add(a);
19
+ }
20
+ let a = t.baseline.filter((t) => {
21
+ let n = e(t.node);
22
+ return [...r].every((e) => n.includes(e));
23
+ }).at(-1);
24
+ return a ? {
25
+ kind: a.node.type === "group" ? "recipient" : "rail",
26
+ members: e(a.node)
27
+ } : {
28
+ kind: "recipient",
29
+ members: t.recipient
30
+ };
31
+ }
32
+ function i(e, t) {
33
+ return [
34
+ "x",
35
+ "y",
36
+ "width",
37
+ "height"
38
+ ].some((n) => Math.abs(e[n] - t[n]) > 1e-6);
39
+ }
40
+ function a(n) {
41
+ let r = new Set(n.source), i = /* @__PURE__ */ new Map();
42
+ for (let a of n.catalog) {
43
+ let n = e(a.node), o = n.filter((e) => !r.has(e));
44
+ if (o.length) for (let e of [n, o]) i.set(t(e), e);
45
+ }
46
+ let a = c(n.allocation);
47
+ return [...i].flatMap(([e, t]) => {
48
+ let n = l({
49
+ members: t,
50
+ geometry: a,
51
+ carried: r
52
+ });
53
+ return n ? [{
54
+ key: e,
55
+ rect: n
56
+ }] : [];
57
+ });
58
+ }
59
+ function o(e) {
60
+ return l({
61
+ members: e.members,
62
+ geometry: c(e.allocation),
63
+ carried: new Set(e.source)
64
+ });
65
+ }
66
+ function s() {
67
+ let e = /* @__PURE__ */ new WeakMap();
68
+ return (t) => {
69
+ let n = e.get(t.allocation);
70
+ return n || (n = c(t.allocation), e.set(t.allocation, n)), l({
71
+ members: t.members,
72
+ geometry: n,
73
+ carried: new Set(t.source)
74
+ });
75
+ };
76
+ }
77
+ function c(n) {
78
+ let r = n.filter((e) => e.node.type === "group"), i = new Map(n.map((e) => [e.key, e])), a = /* @__PURE__ */ new Map();
79
+ for (let t of r) e(t.node).forEach((e) => a.set(e, t.key));
80
+ let o = /* @__PURE__ */ new Map();
81
+ for (let e of n) {
82
+ let n = r.filter((t) => d(t.key, e.key)).map((e) => e.key);
83
+ o.set(t(n), e.rect);
84
+ }
85
+ return {
86
+ leaves: r,
87
+ byKey: i,
88
+ groupByMember: a,
89
+ exact: o
90
+ };
91
+ }
92
+ function l(n) {
93
+ let { members: r, geometry: i, carried: a } = n, o = new Set(r.flatMap((e) => i.groupByMember.get(e) ?? []));
94
+ if (!o.size) return;
95
+ let s = i.exact.get(t([...o]));
96
+ if (s) return s;
97
+ let c = u([...o]), l = i.byKey.get(c);
98
+ if (l?.node.type !== "split") return;
99
+ let { depth: p, first: m, last: h } = f([...o], c);
100
+ if (i.leaves.filter((e) => {
101
+ let t = Number(e.key.split(".")[p]);
102
+ return d(e.key, c) && t >= m && t <= h;
103
+ }).some((t) => !o.has(t.key) && !e(t.node).every((e) => a.has(e)))) return;
104
+ let g = i.byKey.get(`${c}.${m}`), _ = i.byKey.get(`${c}.${h}`);
105
+ if (g && _) return l.node.axis === "horizontal" ? {
106
+ x: g.rect.x,
107
+ y: l.rect.y,
108
+ width: _.rect.x + _.rect.width - g.rect.x,
109
+ height: l.rect.height
110
+ } : {
111
+ x: l.rect.x,
112
+ y: g.rect.y,
113
+ width: l.rect.width,
114
+ height: _.rect.y + _.rect.height - g.rect.y
115
+ };
116
+ }
117
+ function u(e) {
118
+ let t = e[0].split(".");
119
+ for (; !e.every((e) => d(e, t.join(".")));) t.pop();
120
+ return t.join(".");
121
+ }
122
+ function d(e, t) {
123
+ return e === t || e.startsWith(`${t}.`);
124
+ }
125
+ function f(e, t) {
126
+ let n = t.split(".").length, r = e.map((e) => Number(e.split(".")[n]));
127
+ return {
128
+ depth: n,
129
+ first: Math.min(...r),
130
+ last: Math.max(...r)
131
+ };
132
+ }
133
+ export { a as allocateContextProxies, s as createContextRectResolver, n as createPlacementContext, r as getAffectedSplitContext, o as getAllocatedContextRect, t as getContextKey };
134
+
135
+ //# sourceMappingURL=context.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.utils.js","names":["getContextKey","members","createPlacementContext","carried","source","getPanelIds","node","kind","id","getAffectedSplitContext","achieved","input","region","affected","after","changedRect","candidate","before","key","allocateContextProxies","memberships","full","remaining","geometry","allocationIndex","rect","resolveContextRegion","getAllocatedContextRect","createContextRectResolver","indices","leaves","regions","byKey","groupByMember","leaf","exact","keys","descendant","selected","prefix","commonRegion","parent","childRange","index","depth","first","last","parts"],"sources":["../../../../src/workspace/utils/placement/context.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';\n\nimport type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';\nimport type { WorkspaceNode } from '../model/layout.utils.js';\n\nexport interface WorkspacePlacementContext {\n kind: 'rail' | 'recipient';\n members: string[];\n}\n\nexport interface WorkspaceContextProxy {\n key: string;\n rect: Rect;\n}\n\ninterface ContextRectInput {\n members: string[];\n allocation: WorkspacePlacedRegion[];\n source: string[];\n}\n\nexport type WorkspaceContextRectResolver = (input: ContextRectInput) => Rect | undefined;\n\n/** Identifies an operating region independently of path changes or sibling order. */\nexport function getContextKey(members: string[]): string {\n return JSON.stringify([...members].sort());\n}\n\nexport function createPlacementContext(\n kind: WorkspacePlacementContext['kind'],\n node: WorkspaceNode | null,\n source: string[]\n): WorkspacePlacementContext {\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 getAffectedSplitContext(input: {\n baseline: WorkspacePlacedRegion[];\n achieved: WorkspacePlacedRegion[];\n source: string[];\n recipient: string[];\n}): WorkspacePlacementContext {\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 && changedRect(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 changedRect(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 operating-region proxies before their selection can change during animation. */\nexport function allocateContextProxies(input: {\n catalog: WorkspacePlacedRegion[];\n allocation: WorkspacePlacedRegion[];\n source: string[];\n}): WorkspaceContextProxy[] {\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 for (const members of [full, remaining]) {\n memberships.set(getContextKey(members), members);\n }\n }\n const geometry = allocationIndex(input.allocation);\n return [...memberships].flatMap(([key, members]) => {\n const rect = resolveContextRegion({ members, geometry, carried });\n return rect ? [{ key, rect }] : [];\n });\n}\n\nexport function getAllocatedContextRect(input: ContextRectInput): Rect | undefined {\n return resolveContextRegion({\n members: input.members,\n geometry: allocationIndex(input.allocation),\n carried: new Set(input.source)\n });\n}\n\nexport function createContextRectResolver(): WorkspaceContextRectResolver {\n const indices = new WeakMap<WorkspacePlacedRegion[], ReturnType<typeof allocationIndex>>();\n return input => {\n let geometry = indices.get(input.allocation);\n if (!geometry) {\n geometry = allocationIndex(input.allocation);\n indices.set(input.allocation, geometry);\n }\n return resolveContextRegion({ members: input.members, geometry, carried: new Set(input.source) });\n };\n}\n\nfunction allocationIndex(regions: WorkspacePlacedRegion[]) {\n const leaves = regions.filter(region => region.node.type === 'group');\n const byKey = new Map(regions.map(region => [region.key, region]));\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 const exact = new Map<string, Rect>();\n for (const region of regions) {\n const keys = leaves.filter(leaf => descendant(leaf.key, region.key)).map(leaf => leaf.key);\n exact.set(getContextKey(keys), region.rect);\n }\n return { leaves, byKey, groupByMember, exact };\n}\n\nfunction resolveContextRegion(input: {\n members: string[];\n geometry: ReturnType<typeof allocationIndex>;\n carried: Set<string>;\n}): Rect | undefined {\n const { members, geometry, carried } = input;\n const selected = new Set(members.flatMap(id => geometry.groupByMember.get(id) ?? []));\n if (!selected.size) return undefined;\n const exact = geometry.exact.get(getContextKey([...selected]));\n if (exact) return exact;\n const prefix = commonRegion([...selected]);\n const parent = geometry.byKey.get(prefix);\n if (parent?.node.type !== 'split') return undefined;\n const { depth, first, last } = childRange([...selected], prefix);\n const covered = geometry.leaves.filter(leaf => {\n const index = Number(leaf.key.split('.')[depth]);\n return descendant(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 commonRegion(keys: string[]): string {\n const parts = keys[0]!.split('.');\n while (!keys.every(key => descendant(key, parts.join('.')))) {\n parts.pop();\n }\n return parts.join('.');\n}\n\nfunction descendant(key: string, parent: string): boolean {\n return key === parent || key.startsWith(`${parent}.`);\n}\n\nfunction childRange(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":"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"}
@@ -0,0 +1,26 @@
1
+ import type { WorkspaceLayout } from '../model/layout.utils.js';
2
+ import type { WorkspaceDestination } from '../model/operations.utils.js';
3
+ import type { WorkspaceLayoutProjector } from '../model/projection.utils.js';
4
+ import type { WorkspacePlacementPlan } from './planner.utils.js';
5
+ interface InsertionInput {
6
+ layout: WorkspaceLayout;
7
+ source: string[];
8
+ destination: WorkspaceDestination;
9
+ available: string[];
10
+ projectLayout?: WorkspaceLayoutProjector;
11
+ }
12
+ export declare function planGroupInsertion(input: InsertionInput): WorkspacePlacementPlan | undefined;
13
+ export declare function describePlacementSlot(input: {
14
+ plan: Pick<WorkspacePlacementPlan, 'layout'>;
15
+ source: string[];
16
+ available: string[];
17
+ projectLayout?: WorkspaceLayoutProjector;
18
+ }): {
19
+ axis: "horizontal" | "vertical";
20
+ index: number;
21
+ members: string[];
22
+ previous: string[] | undefined;
23
+ next: string[] | undefined;
24
+ key: string;
25
+ } | undefined;
26
+ export {};
@@ -0,0 +1,171 @@
1
+ import { getPanelIds as e, getSplitSide as t } from "../model/layout.utils.js";
2
+ import { createDetachedLayout as n, projectLayout as r } from "../model/operations.utils.js";
3
+ import { findDeepestProjectionCarrier as i, getProjectionSignature as a, rebaseProjectedSplit as o } from "../model/projection.utils.js";
4
+ import { findWorkspaceRegion as s, placeRegion as c } from "./region.utils.js";
5
+ // src/workspace/utils/placement/group-insertion.utils.ts
6
+ function l(e) {
7
+ let t = m(e);
8
+ if (!t) return;
9
+ let n = u(e, t);
10
+ return n ? d({
11
+ input: e,
12
+ context: t,
13
+ topology: n
14
+ }) : void 0;
15
+ }
16
+ function u(o, s) {
17
+ let { peers: l, slot: u, visible: d, root: f, axis: p } = s, m = l[Math.min(u, l.length - 1)], h = o.projectLayout ?? r, g = i(f, a(m.node), (e) => {
18
+ let t = n({
19
+ version: 1,
20
+ root: e,
21
+ closed: []
22
+ }, o.source);
23
+ return h(t, d).root;
24
+ }), _ = g && y(f, g);
25
+ if (!_ || !g) return;
26
+ let v = u < l.length, b = {
27
+ target: e(g)[0],
28
+ region: _,
29
+ position: t(p, v ? "before" : "after")
30
+ };
31
+ return c({
32
+ ...o,
33
+ destination: b
34
+ });
35
+ }
36
+ function d({ input: t, context: n, topology: i }) {
37
+ let { owner: a, peers: o, visible: s, axis: c } = n, l = (t.projectLayout ?? r)(i.layout, s).root, u = t.source.filter((e) => s.includes(e)), d = _(l, u);
38
+ if (!d || d.axis !== c || d.children.length !== o.length + 1) return;
39
+ let f = g({
40
+ branch: d,
41
+ peers: o,
42
+ moving: u
43
+ });
44
+ if (!f) return;
45
+ let p = b({
46
+ layout: i.layout,
47
+ branch: d,
48
+ weights: f,
49
+ available: t.available
50
+ });
51
+ if (p) return {
52
+ kind: "insert",
53
+ layout: p,
54
+ context: {
55
+ kind: "rail",
56
+ members: [.../* @__PURE__ */ new Set([...e(a), ...u])]
57
+ }
58
+ };
59
+ }
60
+ function f(e) {
61
+ let { destination: t, layout: n } = e;
62
+ if (!t.region || t.position === "tab") return;
63
+ let i = e.available.filter((e) => !n.closed.includes(e)), a = (e.projectLayout ?? r)(n, i).root, o = s(a, t.region);
64
+ if (!a || !o) return;
65
+ let c = t.position === "left" || t.position === "right" ? "horizontal" : "vertical", l = p({
66
+ root: a,
67
+ target: o,
68
+ key: t.region,
69
+ axis: c
70
+ });
71
+ if (l) return {
72
+ visible: i,
73
+ root: a,
74
+ target: o,
75
+ axis: c,
76
+ owner: l
77
+ };
78
+ }
79
+ function p(e) {
80
+ if (e.target.type === "split" && e.target.axis === e.axis) return e.target;
81
+ let t = s(e.root, e.key.split(".").slice(0, -1).join("."));
82
+ return t?.type === "split" && t.axis === e.axis ? t : e.target.type === "split" ? e.target : void 0;
83
+ }
84
+ function m(t) {
85
+ let r = f(t);
86
+ if (!r) return;
87
+ let { owner: i, target: a, axis: o } = r, s = n({
88
+ version: 1,
89
+ root: i,
90
+ closed: []
91
+ }, t.source).root;
92
+ if (!s) return;
93
+ let c = h(s, o), l = new Set(e(a).filter((e) => !t.source.includes(e))), u = c.flatMap((t, n) => e(t.node).every((e) => l.has(e)) ? [n] : []);
94
+ if (!u.length) return;
95
+ let d = t.destination.position === "left" || t.destination.position === "top";
96
+ return {
97
+ ...r,
98
+ peers: c,
99
+ slot: d ? u[0] : u.at(-1) + 1
100
+ };
101
+ }
102
+ function h(e, t) {
103
+ return e.type !== "split" || e.axis !== t ? [{
104
+ node: e,
105
+ weight: 1
106
+ }] : e.children.map((t, n) => ({
107
+ node: t,
108
+ weight: e.weights[n]
109
+ }));
110
+ }
111
+ function g(e) {
112
+ let t = e.peers.reduce((e, t) => e + t.weight, 0) / e.peers.length, n = e.branch.children.map((n) => {
113
+ if (v(n, e.moving)) return t;
114
+ let r = e.peers.findIndex((e) => a(e.node) === a(n));
115
+ if (!(r < 0)) return e.peers[r].weight;
116
+ });
117
+ return n.every((e) => e !== void 0) ? n : void 0;
118
+ }
119
+ function _(e, t) {
120
+ if (e?.type === "split") {
121
+ if (e.children.some((e) => e.type === "group" && e.panels.length > 0 && v(e, t))) return e;
122
+ for (let n of e.children) {
123
+ let e = _(n, t);
124
+ if (e) return e;
125
+ }
126
+ }
127
+ }
128
+ function v(e, t) {
129
+ return e.type === "group" && e.panels.every((e) => t.includes(e));
130
+ }
131
+ function y(e, t, n = "root") {
132
+ if (e === t) return n;
133
+ if (e.type === "split") for (let [r, i] of e.children.entries()) {
134
+ let e = y(i, t, `${n}.${r}`);
135
+ if (e) return e;
136
+ }
137
+ }
138
+ function b(e) {
139
+ let t = o(e.layout, e.branch, e.weights, e.available);
140
+ if (t) return t;
141
+ let n = e.weights.reduce((e, t) => e + t, 0);
142
+ return e.branch.weights.every((t, r) => Math.abs(t - e.weights[r] / n) < 1e-10) ? e.layout : void 0;
143
+ }
144
+ function x(t) {
145
+ let n = t.available.filter((e) => !t.plan.layout.closed.includes(e)), i = t.source.filter((e) => n.includes(e)), a = _((t.projectLayout ?? r)(t.plan.layout, n).root, i);
146
+ if (!a) return;
147
+ let o = a.children.findIndex((e) => v(e, i));
148
+ if (!(o < 0)) return {
149
+ axis: a.axis,
150
+ index: o,
151
+ members: e(a).filter((e) => !i.includes(e)),
152
+ previous: a.children[o - 1] ? e(a.children[o - 1]) : void 0,
153
+ next: a.children[o + 1] ? e(a.children[o + 1]) : void 0,
154
+ key: JSON.stringify([
155
+ a.axis,
156
+ o,
157
+ S(t.plan.layout.root),
158
+ t.plan.layout.closed
159
+ ])
160
+ };
161
+ }
162
+ function S(e) {
163
+ return e ? e.type === "group" ? [
164
+ "group",
165
+ e.panels,
166
+ e.active
167
+ ] : [e.axis, e.children.map(S)] : null;
168
+ }
169
+ export { x as describePlacementSlot, l as planGroupInsertion };
170
+
171
+ //# sourceMappingURL=group-insertion.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-insertion.utils.js","names":["planGroupInsertion","context","insertionContext","input","topology","insertionTopology","sizeInsertion","donor","peers","slot","projectLayoutForCandidate","projectLayout","carrier","findDeepestProjectionCarrier","root","getProjectionSignature","residualLayout","createDetachedLayout","node","visible","key","nodeKey","before","destination","getPanelIds","getSplitSide","axis","placeRegion","projectedRoot","moving","id","branch","movingOwner","weights","insertedWeights","layout","insertionWeights","owner","insertionBasis","target","findWorkspaceRegion","insertionOwner","parent","basis","residual","insertionPeers","selected","matches","peer","index","incoming","sum","isMovingGroup","child","weight","found","rebased","rebaseProjectedSplit","total","describePlacementSlot","placementShape"],"sources":["../../../../src/workspace/utils/placement/group-insertion.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { getPanelIds, getSplitSide } from '../model/layout.utils.js';\nimport { createDetachedLayout, projectLayout } from '../model/operations.utils.js';\nimport {\n findDeepestProjectionCarrier,\n getProjectionSignature,\n rebaseProjectedSplit\n} from '../model/projection.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 { WorkspacePlacementPlan } from './planner.utils.js';\n\ninterface InsertionInput {\n layout: WorkspaceLayout;\n source: string[];\n destination: WorkspaceDestination;\n available: string[];\n projectLayout?: WorkspaceLayoutProjector;\n}\n\nexport function planGroupInsertion(input: InsertionInput): WorkspacePlacementPlan | undefined {\n const context = insertionContext(input);\n if (!context) return undefined;\n const topology = insertionTopology(input, context);\n return topology ? sizeInsertion({ input, context, topology }) : undefined;\n}\n\nfunction insertionTopology(input: InsertionInput, context: NonNullable<ReturnType<typeof insertionContext>>) {\n const { peers, slot, visible, root, axis } = context;\n const donorIndex = Math.min(slot, peers.length - 1);\n const donor = peers[donorIndex]!;\n const projectLayoutForCandidate = input.projectLayout ?? projectLayout;\n const carrier = findDeepestProjectionCarrier(root, getProjectionSignature(donor.node), node => {\n const residualLayout = createDetachedLayout({ version: 1, root: node, closed: [] }, input.source);\n return projectLayoutForCandidate(residualLayout, visible).root;\n });\n const key = carrier && nodeKey(root, carrier);\n if (!key || !carrier) return undefined;\n const before = slot < peers.length;\n const destination: WorkspaceDestination = {\n target: getPanelIds(carrier)[0]!,\n region: key,\n position: getSplitSide(axis, before ? 'before' : 'after')\n };\n const topology = placeRegion({ ...input, destination });\n return topology;\n}\n\nfunction sizeInsertion({\n input,\n context,\n topology\n}: {\n input: InsertionInput;\n context: NonNullable<ReturnType<typeof insertionContext>>;\n topology: WorkspacePlacementPlan;\n}): WorkspacePlacementPlan | undefined {\n const { owner, peers, visible, axis } = context;\n const projectedRoot = (input.projectLayout ?? projectLayout)(topology.layout, visible).root;\n const moving = input.source.filter(id => visible.includes(id));\n const branch = movingOwner(projectedRoot, moving);\n if (!branch || branch.axis !== axis || branch.children.length !== peers.length + 1) return undefined;\n const weights = insertedWeights({\n branch,\n peers,\n moving\n });\n if (!weights) return undefined;\n const layout = insertionWeights({ layout: topology.layout, branch, weights, available: input.available });\n if (!layout) return undefined;\n return {\n kind: 'insert',\n layout,\n context: { kind: 'rail', members: [...new Set([...getPanelIds(owner), ...moving])] }\n };\n}\n\nfunction insertionBasis(input: InsertionInput) {\n const { destination, layout } = input;\n if (!destination.region || destination.position === 'tab') return undefined;\n const visible = input.available.filter(id => !layout.closed.includes(id));\n const root = (input.projectLayout ?? projectLayout)(layout, visible).root;\n const target = findWorkspaceRegion(root, destination.region);\n if (!root || !target) return undefined;\n const axis: WorkspaceSplit['axis'] =\n destination.position === 'left' || destination.position === 'right' ? 'horizontal' : 'vertical';\n const owner = insertionOwner({ root, target, key: destination.region, axis });\n if (!owner) return undefined;\n return {\n visible,\n root,\n target,\n axis,\n owner\n };\n}\n\nfunction insertionOwner(input: {\n root: WorkspaceNode;\n target: WorkspaceNode;\n key: string;\n axis: WorkspaceSplit['axis'];\n}) {\n if (input.target.type === 'split' && input.target.axis === input.axis) return input.target;\n const parent = findWorkspaceRegion(input.root, input.key.split('.').slice(0, -1).join('.'));\n if (parent?.type === 'split' && parent.axis === input.axis) return parent;\n return input.target.type === 'split' ? input.target : undefined;\n}\n\nfunction insertionContext(input: InsertionInput) {\n const basis = insertionBasis(input);\n if (!basis) return undefined;\n const { owner, target, axis } = basis;\n const residual = createDetachedLayout({ version: 1, root: owner, closed: [] }, input.source).root;\n if (!residual) return undefined;\n const peers = insertionPeers(residual, axis);\n const selected = new Set(getPanelIds(target).filter(id => !input.source.includes(id)));\n const matches = peers.flatMap((peer, index) => (getPanelIds(peer.node).every(id => selected.has(id)) ? [index] : []));\n if (!matches.length) return undefined;\n const before = input.destination.position === 'left' || input.destination.position === 'top';\n return { ...basis, peers, slot: before ? matches[0]! : matches.at(-1)! + 1 };\n}\n\nfunction insertionPeers(residual: WorkspaceNode, axis: WorkspaceSplit['axis']) {\n if (residual.type !== 'split' || residual.axis !== axis) return [{ node: residual, weight: 1 }];\n return residual.children.map((node, index) => ({ node, weight: residual.weights[index]! }));\n}\n\nfunction insertedWeights(input: {\n branch: WorkspaceSplit;\n peers: { node: WorkspaceNode; weight: number }[];\n moving: string[];\n}) {\n const incoming = input.peers.reduce((sum, peer) => sum + peer.weight, 0) / input.peers.length;\n const weights = input.branch.children.map(child => {\n if (isMovingGroup(child, input.moving)) return incoming;\n const index = input.peers.findIndex(peer => getProjectionSignature(peer.node) === getProjectionSignature(child));\n if (index < 0) return undefined;\n const weight = input.peers[index]!.weight;\n return weight;\n });\n return weights.every((weight): weight is number => weight !== undefined) ? weights : undefined;\n}\n\nfunction movingOwner(node: WorkspaceNode | null, moving: string[]): WorkspaceSplit | undefined {\n if (node?.type !== 'split') return undefined;\n if (node.children.some(child => child.type === 'group' && child.panels.length > 0 && isMovingGroup(child, moving)))\n return node;\n for (const child of node.children) {\n const found = movingOwner(child, moving);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction isMovingGroup(node: WorkspaceNode, moving: string[]) {\n return node.type === 'group' && node.panels.every(id => moving.includes(id));\n}\n\nfunction nodeKey(node: WorkspaceNode, target: WorkspaceNode, key = 'root'): string | undefined {\n if (node === target) return key;\n if (node.type !== 'split') return undefined;\n for (const [index, child] of node.children.entries()) {\n const found = nodeKey(child, target, `${key}.${index}`);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction insertionWeights(input: {\n layout: WorkspaceLayout;\n branch: WorkspaceSplit;\n weights: number[];\n available: string[];\n}) {\n const rebased = rebaseProjectedSplit(input.layout, input.branch, input.weights, input.available);\n if (rebased) return rebased;\n const total = input.weights.reduce((sum, weight) => sum + weight, 0);\n return input.branch.weights.every((weight, index) => Math.abs(weight - input.weights[index]! / total) < 1e-10)\n ? input.layout\n : undefined;\n}\n\nexport function describePlacementSlot(input: {\n plan: Pick<WorkspacePlacementPlan, 'layout'>;\n source: string[];\n available: string[];\n projectLayout?: WorkspaceLayoutProjector;\n}) {\n const visible = input.available.filter(id => !input.plan.layout.closed.includes(id));\n const moving = input.source.filter(id => visible.includes(id));\n const owner = movingOwner((input.projectLayout ?? projectLayout)(input.plan.layout, visible).root, moving);\n if (!owner) return undefined;\n const index = owner.children.findIndex(child => isMovingGroup(child, moving));\n if (index < 0) return undefined;\n return {\n axis: owner.axis,\n index,\n members: getPanelIds(owner).filter(id => !moving.includes(id)),\n previous: owner.children[index - 1] ? getPanelIds(owner.children[index - 1]!) : undefined,\n next: owner.children[index + 1] ? getPanelIds(owner.children[index + 1]!) : undefined,\n key: JSON.stringify([owner.axis, index, placementShape(input.plan.layout.root), input.plan.layout.closed])\n };\n}\n\nfunction placementShape(node: WorkspaceNode | null): unknown {\n if (!node) return null;\n return node.type === 'group' ? ['group', node.panels, node.active] : [node.axis, node.children.map(placementShape)];\n}\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { WorkspaceDragCue, WorkspaceDragOffer, WorkspaceDropIntent } from '../interaction/drag-preview.utils.js';
2
+ import type { WorkspaceLayout } from '../model/layout.utils.js';
3
+ /** Reserves the actual unchanged origin, including a source with no neighboring group. */
4
+ export declare function createInitialReservation(input: {
5
+ layout: WorkspaceLayout;
6
+ source: string[];
7
+ available: string[];
8
+ cue: WorkspaceDragCue;
9
+ evaluate(intent: WorkspaceDropIntent): WorkspaceDragOffer | undefined;
10
+ }): {
11
+ intent: WorkspaceDropIntent;
12
+ offer: WorkspaceDragOffer;
13
+ };