@nvidia-elements/core 2.23.5 → 2.24.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 (298) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/accordion/accordion-group.js.map +1 -1
  3. package/dist/accordion/accordion.js.map +1 -1
  4. package/dist/accordion/accordion2.js +4 -4
  5. package/dist/alert/alert-group2.js +1 -1
  6. package/dist/alert/alert2.js +1 -1
  7. package/dist/avatar/avatar-group2.js +1 -1
  8. package/dist/avatar/avatar2.js +1 -1
  9. package/dist/badge/badge2.js +1 -1
  10. package/dist/breadcrumb/breadcrumb2.js +1 -1
  11. package/dist/bundle.d.ts +2 -0
  12. package/dist/bundles/index.d.ts +323 -56
  13. package/dist/bundles/index.js +9 -9
  14. package/dist/button/button2.js +1 -1
  15. package/dist/button-group/button-group2.js +1 -1
  16. package/dist/card/card2.js +4 -4
  17. package/dist/chat-message/chat-message2.js +1 -1
  18. package/dist/checkbox/checkbox-group2.js +1 -1
  19. package/dist/checkbox/checkbox2.js +1 -1
  20. package/dist/color/color2.js +1 -1
  21. package/dist/combobox/combobox2.js +1 -1
  22. package/dist/copy-button/copy-button2.js +1 -1
  23. package/dist/custom-elements-jsx.d.ts +167 -1
  24. package/dist/custom-elements-vue.d.ts +161 -1
  25. package/dist/custom-elements.json +5017 -268
  26. package/dist/dashboard/controllers/arrangement.controller.d.ts +30 -0
  27. package/dist/dashboard/controllers/arrangement.controller.js +68 -0
  28. package/dist/dashboard/controllers/arrangement.controller.js.map +1 -0
  29. package/dist/dashboard/controllers/command.controller.d.ts +28 -0
  30. package/dist/dashboard/controllers/command.controller.js +69 -0
  31. package/dist/dashboard/controllers/command.controller.js.map +1 -0
  32. package/dist/dashboard/controllers/composition.controller.d.ts +61 -0
  33. package/dist/dashboard/controllers/composition.controller.js +285 -0
  34. package/dist/dashboard/controllers/composition.controller.js.map +1 -0
  35. package/dist/dashboard/controllers/fullscreen.controller.d.ts +23 -0
  36. package/dist/dashboard/controllers/fullscreen.controller.js +46 -0
  37. package/dist/dashboard/controllers/fullscreen.controller.js.map +1 -0
  38. package/dist/dashboard/controllers/interaction.controller.d.ts +53 -0
  39. package/dist/dashboard/controllers/interaction.controller.js +407 -0
  40. package/dist/dashboard/controllers/interaction.controller.js.map +1 -0
  41. package/dist/dashboard/controllers/measurement.controller.d.ts +28 -0
  42. package/dist/dashboard/controllers/measurement.controller.js +77 -0
  43. package/dist/dashboard/controllers/measurement.controller.js.map +1 -0
  44. package/dist/dashboard/dashboard.d.ts +83 -0
  45. package/dist/dashboard/dashboard.examples.js +5 -0
  46. package/dist/dashboard/dashboard.examples.js.map +1 -0
  47. package/dist/dashboard/dashboard.examples.json +138 -0
  48. package/dist/dashboard/dashboard.js +5 -0
  49. package/dist/dashboard/dashboard.js.map +1 -0
  50. package/dist/dashboard/dashboard.types.d.ts +33 -0
  51. package/dist/dashboard/dashboard2.js +352 -0
  52. package/dist/dashboard/dashboard2.js.map +1 -0
  53. package/dist/dashboard/define.d.ts +10 -0
  54. package/dist/dashboard/define.js +9 -0
  55. package/dist/dashboard/define.js.map +1 -0
  56. package/dist/dashboard/index.d.ts +8 -0
  57. package/dist/dashboard/index.js +6 -0
  58. package/dist/dashboard/panel/panel.d.ts +88 -0
  59. package/dist/dashboard/panel/panel.js +5 -0
  60. package/dist/dashboard/panel/panel.js.map +1 -0
  61. package/dist/dashboard/panel/panel2.js +110 -0
  62. package/dist/dashboard/panel/panel2.js.map +1 -0
  63. package/dist/dashboard/panel-content/panel-content.d.ts +20 -0
  64. package/dist/dashboard/panel-content/panel-content.js +5 -0
  65. package/dist/dashboard/panel-content/panel-content.js.map +1 -0
  66. package/dist/dashboard/panel-content/panel-content2.js +22 -0
  67. package/dist/dashboard/panel-content/panel-content2.js.map +1 -0
  68. package/dist/dashboard/panel-footer/panel-footer.d.ts +25 -0
  69. package/dist/dashboard/panel-footer/panel-footer.js +5 -0
  70. package/dist/dashboard/panel-footer/panel-footer.js.map +1 -0
  71. package/dist/dashboard/panel-footer/panel-footer2.js +28 -0
  72. package/dist/dashboard/panel-footer/panel-footer2.js.map +1 -0
  73. package/dist/dashboard/panel-header/panel-header.d.ts +27 -0
  74. package/dist/dashboard/panel-header/panel-header.js +5 -0
  75. package/dist/dashboard/panel-header/panel-header.js.map +1 -0
  76. package/dist/dashboard/panel-header/panel-header2.js +28 -0
  77. package/dist/dashboard/panel-header/panel-header2.js.map +1 -0
  78. package/dist/dashboard/utils/action.utils.d.ts +17 -0
  79. package/dist/dashboard/utils/action.utils.js +144 -0
  80. package/dist/dashboard/utils/action.utils.js.map +1 -0
  81. package/dist/dashboard/utils/geometry.utils.d.ts +110 -0
  82. package/dist/dashboard/utils/geometry.utils.js +208 -0
  83. package/dist/dashboard/utils/geometry.utils.js.map +1 -0
  84. package/dist/dashboard/utils/intent.types.d.ts +67 -0
  85. package/dist/dashboard/utils/layout.utils.d.ts +20 -0
  86. package/dist/dashboard/utils/layout.utils.js +224 -0
  87. package/dist/dashboard/utils/layout.utils.js.map +1 -0
  88. package/dist/dashboard/utils/movement.utils.d.ts +7 -0
  89. package/dist/dashboard/utils/movement.utils.js +15 -0
  90. package/dist/dashboard/utils/movement.utils.js.map +1 -0
  91. package/dist/dashboard/utils/mutation.utils.d.ts +2 -0
  92. package/dist/dashboard/utils/mutation.utils.js +19 -0
  93. package/dist/dashboard/utils/mutation.utils.js.map +1 -0
  94. package/dist/dashboard/utils/packing.utils.d.ts +13 -0
  95. package/dist/dashboard/utils/packing.utils.js +421 -0
  96. package/dist/dashboard/utils/packing.utils.js.map +1 -0
  97. package/dist/data.html.json +141 -1
  98. package/dist/date/date2.js +1 -1
  99. package/dist/datetime/datetime2.js +1 -1
  100. package/dist/dialog/dialog-footer2.js +1 -1
  101. package/dist/dialog/dialog-header2.js +1 -1
  102. package/dist/dialog/dialog2.js +1 -1
  103. package/dist/divider/divider2.js +1 -1
  104. package/dist/dot/dot2.js +1 -1
  105. package/dist/drag-handle/drag-handle2.js +1 -1
  106. package/dist/drawer/drawer-content2.js +1 -1
  107. package/dist/drawer/drawer-footer2.js +1 -1
  108. package/dist/drawer/drawer-header2.js +1 -1
  109. package/dist/drawer/drawer2.js +1 -1
  110. package/dist/dropdown/dropdown-footer2.js +1 -1
  111. package/dist/dropdown/dropdown-header2.js +1 -1
  112. package/dist/dropdown/dropdown.examples.js.map +1 -1
  113. package/dist/dropdown/dropdown2.js +1 -1
  114. package/dist/dropdown-group/dropdown-group.js +1 -1
  115. package/dist/dropzone/dropzone2.js +1 -1
  116. package/dist/file/file2.js +1 -1
  117. package/dist/format-bytes/format-bytes2.js +1 -1
  118. package/dist/format-datetime/format-datetime2.js +1 -1
  119. package/dist/format-number/format-number2.js +1 -1
  120. package/dist/format-relative-time/format-relative-time2.js +1 -1
  121. package/dist/format-truncate/format-truncate2.js +1 -1
  122. package/dist/forms/control/control2.js +1 -1
  123. package/dist/forms/control-group/control-group2.js +1 -1
  124. package/dist/forms/control-message/control-message2.js +1 -1
  125. package/dist/gauge/gauge2.js +1 -1
  126. package/dist/ghost/ghost2.js +1 -1
  127. package/dist/grid/cell/cell2.js +1 -1
  128. package/dist/grid/column/column2.js +1 -1
  129. package/dist/grid/footer/footer2.js +1 -1
  130. package/dist/grid/grid.js.map +1 -1
  131. package/dist/grid/grid2.js +1 -1
  132. package/dist/grid/header/header2.js +1 -1
  133. package/dist/grid/placeholder/placeholder2.js +1 -1
  134. package/dist/grid/row/row2.js +1 -1
  135. package/dist/icon/icon2.js +1 -1
  136. package/dist/icon-button/icon-button2.js +1 -1
  137. package/dist/iframe/iframe2.js +1 -1
  138. package/dist/index.js +1 -1
  139. package/dist/input/input-group2.js +1 -1
  140. package/dist/input/input2.js +1 -1
  141. package/dist/internal/controllers/native-fullscreen.controller.d.ts +13 -0
  142. package/dist/internal/controllers/native-fullscreen.controller.js +73 -0
  143. package/dist/internal/controllers/native-fullscreen.controller.js.map +1 -0
  144. package/dist/internal/index.d.ts +1 -0
  145. package/dist/internal/index.js +59 -57
  146. package/dist/internal/index.js.map +1 -1
  147. package/dist/joystick/joystick2.js +1 -1
  148. package/dist/logo/logo2.js +1 -1
  149. package/dist/menu/menu-group2.js +1 -1
  150. package/dist/menu/menu-item2.js +1 -1
  151. package/dist/menu/menu2.js +1 -1
  152. package/dist/month/month2.js +1 -1
  153. package/dist/notification/notification-group2.js +1 -1
  154. package/dist/notification/notification2.js +1 -1
  155. package/dist/page/page-panel/page-panel-content2.js +1 -1
  156. package/dist/page/page-panel/page-panel-footer2.js +1 -1
  157. package/dist/page/page-panel/page-panel-header2.js +1 -1
  158. package/dist/page/page-panel/page-panel2.js +1 -1
  159. package/dist/page/page2.js +1 -1
  160. package/dist/page-header/page-header2.js +1 -1
  161. package/dist/page-loader/page-loader2.js +1 -1
  162. package/dist/pagination/pagination2.js +1 -1
  163. package/dist/panel/panel2.js +4 -4
  164. package/dist/password/password2.js +1 -1
  165. package/dist/preferences-input/preferences-input2.js +1 -1
  166. package/dist/progress-bar/progress-bar2.js +1 -1
  167. package/dist/progress-dot/progress-dot2.js +1 -1
  168. package/dist/progress-ring/progress-ring2.js +1 -1
  169. package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
  170. package/dist/pulse/pulse2.js +1 -1
  171. package/dist/radio/radio-group2.js +1 -1
  172. package/dist/radio/radio2.js +1 -1
  173. package/dist/range/range2.js +1 -1
  174. package/dist/resize-handle/resize-handle2.js +1 -1
  175. package/dist/search/search2.js +1 -1
  176. package/dist/select/select2.js +1 -1
  177. package/dist/skeleton/skeleton2.js +1 -1
  178. package/dist/sort-button/sort-button2.js +1 -1
  179. package/dist/sparkline/sparkline2.js +1 -1
  180. package/dist/star-rating/star-rating2.js +1 -1
  181. package/dist/steps/steps2.js +2 -2
  182. package/dist/switch/switch-group2.js +1 -1
  183. package/dist/switch/switch2.js +1 -1
  184. package/dist/tabs/tabs-group2.js +1 -1
  185. package/dist/tabs/tabs-item-group2.js +1 -1
  186. package/dist/tabs/tabs2.js +2 -2
  187. package/dist/tag/tag2.js +1 -1
  188. package/dist/textarea/textarea2.js +1 -1
  189. package/dist/time/time2.js +1 -1
  190. package/dist/toast/toast2.js +1 -1
  191. package/dist/toggletip/toggletip-footer2.js +1 -1
  192. package/dist/toggletip/toggletip-header2.js +1 -1
  193. package/dist/toggletip/toggletip2.js +1 -1
  194. package/dist/toolbar/toolbar2.js +1 -1
  195. package/dist/tooltip/tooltip2.js +1 -1
  196. package/dist/tree/tree-node2.js +1 -1
  197. package/dist/tree/tree2.js +1 -1
  198. package/dist/week/week2.js +1 -1
  199. package/dist/workspace/controllers/workspace-composition.controller.d.ts +4 -1
  200. package/dist/workspace/controllers/workspace-composition.controller.js +69 -39
  201. package/dist/workspace/controllers/workspace-composition.controller.js.map +1 -1
  202. package/dist/workspace/controllers/workspace-fullscreen.controller.d.ts +2 -4
  203. package/dist/workspace/controllers/workspace-fullscreen.controller.js +17 -47
  204. package/dist/workspace/controllers/workspace-fullscreen.controller.js.map +1 -1
  205. package/dist/workspace/controllers/workspace-rearrange.controller.js +27 -27
  206. package/dist/workspace/controllers/workspace-rearrange.controller.js.map +1 -1
  207. package/dist/workspace/controllers/workspace-restoration.controller.js +2 -2
  208. package/dist/workspace/controllers/workspace-restoration.controller.js.map +1 -1
  209. package/dist/workspace/panel/panel2.js +2 -2
  210. package/dist/workspace/panel/panel2.js.map +1 -1
  211. package/dist/workspace/panel-content/panel-content2.js +1 -1
  212. package/dist/workspace/panel-footer/panel-footer2.js +1 -1
  213. package/dist/workspace/panel-header/panel-header2.js +1 -1
  214. package/dist/workspace/utils/comparison.utils.d.ts +3 -0
  215. package/dist/workspace/utils/comparison.utils.js +13 -0
  216. package/dist/workspace/utils/comparison.utils.js.map +1 -0
  217. package/dist/workspace/utils/evaluation.utils.d.ts +65 -6
  218. package/dist/workspace/utils/evaluation.utils.js +334 -99
  219. package/dist/workspace/utils/evaluation.utils.js.map +1 -1
  220. package/dist/workspace/utils/geometry/allocation.utils.js +15 -13
  221. package/dist/workspace/utils/geometry/allocation.utils.js.map +1 -1
  222. package/dist/workspace/utils/geometry/sizing.utils.d.ts +2 -0
  223. package/dist/workspace/utils/geometry/sizing.utils.js +37 -17
  224. package/dist/workspace/utils/geometry/sizing.utils.js.map +1 -1
  225. package/dist/workspace/utils/interaction/boundary.utils.d.ts +2 -2
  226. package/dist/workspace/utils/interaction/boundary.utils.js +2 -2
  227. package/dist/workspace/utils/interaction/boundary.utils.js.map +1 -1
  228. package/dist/workspace/utils/interaction/drag-preview.utils.d.ts +3 -3
  229. package/dist/workspace/utils/interaction/drag-preview.utils.js.map +1 -1
  230. package/dist/workspace/utils/interaction/insertion-offers.utils.d.ts +11 -9
  231. package/dist/workspace/utils/interaction/insertion-offers.utils.js +37 -43
  232. package/dist/workspace/utils/interaction/insertion-offers.utils.js.map +1 -1
  233. package/dist/workspace/utils/interaction/placement-decision.utils.d.ts +6 -1
  234. package/dist/workspace/utils/interaction/placement-decision.utils.js +94 -87
  235. package/dist/workspace/utils/interaction/placement-decision.utils.js.map +1 -1
  236. package/dist/workspace/utils/model/layout.utils.d.ts +2 -1
  237. package/dist/workspace/utils/model/layout.utils.js +12 -10
  238. package/dist/workspace/utils/model/layout.utils.js.map +1 -1
  239. package/dist/workspace/utils/model/membership.utils.d.ts +4 -0
  240. package/dist/workspace/utils/model/membership.utils.js +13 -4
  241. package/dist/workspace/utils/model/membership.utils.js.map +1 -1
  242. package/dist/workspace/utils/model/operations.utils.d.ts +1 -0
  243. package/dist/workspace/utils/model/operations.utils.js +51 -46
  244. package/dist/workspace/utils/model/operations.utils.js.map +1 -1
  245. package/dist/workspace/utils/model/projection.utils.d.ts +4 -2
  246. package/dist/workspace/utils/model/projection.utils.js +49 -40
  247. package/dist/workspace/utils/model/projection.utils.js.map +1 -1
  248. package/dist/workspace/utils/model/value.utils.d.ts +4 -3
  249. package/dist/workspace/utils/model/value.utils.js +15 -50
  250. package/dist/workspace/utils/model/value.utils.js.map +1 -1
  251. package/dist/workspace/utils/placement/acquisition-sizing.utils.d.ts +2 -0
  252. package/dist/workspace/utils/placement/acquisition-sizing.utils.js +30 -22
  253. package/dist/workspace/utils/placement/acquisition-sizing.utils.js.map +1 -1
  254. package/dist/workspace/utils/placement/group-insertion.utils.d.ts +19 -13
  255. package/dist/workspace/utils/placement/group-insertion.utils.js +50 -47
  256. package/dist/workspace/utils/placement/group-insertion.utils.js.map +1 -1
  257. package/dist/workspace/utils/placement/planner.utils.d.ts +13 -2
  258. package/dist/workspace/utils/placement/planner.utils.js +79 -73
  259. package/dist/workspace/utils/placement/planner.utils.js.map +1 -1
  260. package/dist/workspace/utils/placement/preparation.utils.d.ts +5 -2
  261. package/dist/workspace/utils/placement/preparation.utils.js +45 -41
  262. package/dist/workspace/utils/placement/preparation.utils.js.map +1 -1
  263. package/dist/workspace/utils/placement/region.utils.js +32 -32
  264. package/dist/workspace/utils/placement/region.utils.js.map +1 -1
  265. package/dist/workspace/utils/placement/scope.utils.d.ts +34 -0
  266. package/dist/workspace/utils/placement/scope.utils.js +155 -0
  267. package/dist/workspace/utils/placement/scope.utils.js.map +1 -0
  268. package/dist/workspace/utils/placement/session.utils.d.ts +11 -0
  269. package/dist/workspace/utils/placement/session.utils.js +78 -0
  270. package/dist/workspace/utils/placement/session.utils.js.map +1 -0
  271. package/dist/workspace/utils/placement/split-sizing.utils.d.ts +2 -2
  272. package/dist/workspace/utils/placement/split-sizing.utils.js +19 -19
  273. package/dist/workspace/utils/placement/split-sizing.utils.js.map +1 -1
  274. package/dist/workspace/utils/presentation/composition.utils.d.ts +1 -1
  275. package/dist/workspace/utils/presentation/composition.utils.js +4 -2
  276. package/dist/workspace/utils/presentation/composition.utils.js.map +1 -1
  277. package/dist/workspace/utils/presentation/groups.utils.d.ts +3 -3
  278. package/dist/workspace/utils/presentation/groups.utils.js +40 -30
  279. package/dist/workspace/utils/presentation/groups.utils.js.map +1 -1
  280. package/dist/workspace/utils/presentation/measurements.utils.d.ts +1 -0
  281. package/dist/workspace/utils/presentation/measurements.utils.js +6 -14
  282. package/dist/workspace/utils/presentation/measurements.utils.js.map +1 -1
  283. package/dist/workspace/utils/presentation/offers.utils.d.ts +1 -1
  284. package/dist/workspace/utils/presentation/offers.utils.js +3 -3
  285. package/dist/workspace/utils/presentation/offers.utils.js.map +1 -1
  286. package/dist/workspace/utils/presentation/preview.utils.d.ts +6 -0
  287. package/dist/workspace/utils/presentation/preview.utils.js +14 -3
  288. package/dist/workspace/utils/presentation/preview.utils.js.map +1 -1
  289. package/dist/workspace/workspace.examples.js.map +1 -1
  290. package/dist/workspace/workspace.examples.json +4 -4
  291. package/dist/workspace/workspace.js +1 -1
  292. package/dist/workspace/workspace.js.map +1 -1
  293. package/dist/workspace/workspace2.js +206 -212
  294. package/dist/workspace/workspace2.js.map +1 -1
  295. package/package.json +16 -4
  296. package/dist/workspace/utils/placement/context.utils.d.ts +0 -36
  297. package/dist/workspace/utils/placement/context.utils.js +0 -135
  298. package/dist/workspace/utils/placement/context.utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"evaluation.utils.js","names":["WorkspaceEvaluation","createWorkspaceLayoutProjector","createContextRectResolver","#scroll","#allocations","#minima","#detached","#host","host","#inputs","inputs","#delegate","delegate","panel","getWorkspaceRequirements","minimum","node","getMinimumWorkspaceDimensions","layout","allocations","geometry","extent","allocateGeometry","source","createDetachedLayout","spatial","preview","projectTabMembership","currentLayout","#currentLayout","workspaceInputCatalog","#currentMeasurements","rect","headerTarget","findTabHeaderTarget","#headerInput","point","catalog","computedReservationHit","#bounds","interactionBounds","origin","#origin","canvasClientRect","group","strip","scroll","fullscreen","getFullscreenWorkspaceLayout","#getArrangementGeometry","isNonOrderPreview","isOverlayDetachedPreview","preserveRecipientSelection","floor","input","width","height","allocated","allocateWorkspace","groups","createPresentedGroups","allocation","createRemainingLayoutSignatureResolver","clientCatalog","region","regions","computedRegionCatalog","computedSourceSlot","computedChromeRects","groupTargets","proxies","allocateContextProxies","regionCatalog","proxy","key","vacant","getPanelIds","id","owners","getContextKey","seen","members","remaining","full","presented","read","clipCue","bounds","identity","visible","projections","signatures","getProjectedNode","candidate","projectLayout","signature","carrier","findDeepestProjectionCarrier","getProjectionSignature","remainingLayout","getTabReservationHit","contains","item","viewport","workspace","canvas"],"sources":["../../../src/workspace/utils/evaluation.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Dimensions, Point, Rect } from '@nvidia-elements/core/internal';\n\nimport { allocateWorkspace } from './geometry/allocation.utils.js';\nimport { getMinimumWorkspaceDimensions, getWorkspaceRequirements } from './geometry/sizing.utils.js';\nimport { clipCue } from './interaction/drag-preview.utils.js';\nimport { getPanelIds } from './model/layout.utils.js';\nimport { createDetachedLayout, getFullscreenWorkspaceLayout, projectLayout } from './model/operations.utils.js';\nimport {\n createWorkspaceLayoutProjector,\n findDeepestProjectionCarrier,\n getProjectionSignature\n} from './model/projection.utils.js';\nimport { allocateContextProxies, createContextRectResolver, getContextKey } from './placement/context.utils.js';\nimport {\n createPresentedGroups,\n findTabHeaderTarget,\n getTabReservationHit,\n preserveRecipientSelection,\n projectTabMembership\n} from './presentation/groups.utils.js';\n\nimport type { WorkspaceBoundary, WorkspacePlacedRegion } from './geometry/allocation.utils.js';\nimport type { WorkspaceDragPreview } from './interaction/drag-preview.utils.js';\nimport type { WorkspaceLayout, WorkspaceNode } from './model/layout.utils.js';\nimport type { WorkspacePresentedGroup, WorkspaceTarget } from './presentation/groups.utils.js';\nimport type { WorkspaceMeasurements } from './presentation/measurements.utils.js';\n\nimport type { WorkspacePanel } from '../panel/panel.js';\n\ninterface WorkspaceEvaluationInputs {\n panels: WorkspacePanel[];\n layout: WorkspaceLayout;\n source: string[];\n measurements: WorkspaceMeasurements;\n policy: 'stop' | 'propagate';\n strip(group: WorkspacePresentedGroup): HTMLElement | null | undefined;\n}\n\nexport interface WorkspaceGeometry {\n groups: WorkspacePresentedGroup[];\n boundaries: WorkspaceBoundary[];\n regions: WorkspacePlacedRegion[];\n width: number;\n height: number;\n minimum: Dimensions;\n}\n\nexport interface WorkspaceEvaluationDelegate {\n readonly getCurrentLayout: () => WorkspaceLayout;\n readonly getCurrentMeasurements: () => WorkspaceMeasurements;\n readonly getCurrentPreview: () => WorkspaceDragPreview | undefined;\n readonly getFullscreenTarget: () => string | undefined;\n readonly getResizePreview: () => WorkspaceLayout | undefined;\n}\n\nexport interface WorkspacePlacementCatalog {\n targets: WorkspaceTarget[];\n regions: WorkspacePlacedRegion[];\n orderingRegions?: WorkspacePlacedRegion[];\n sourceSlot?: Rect;\n headers?: Rect[];\n preview?: WorkspaceDragPreview;\n bounds: Rect;\n headerTarget?: WorkspaceTarget;\n reservationHit?: WorkspaceReservationHit;\n}\n\ntype WorkspaceReservationHit = 'group' | 'tab';\n\ninterface RegionCatalogInput {\n catalog: WorkspacePlacedRegion[];\n allocation: WorkspacePlacedRegion[];\n source: string[];\n bounds: Rect;\n getRemainingLayoutSignature(node: WorkspaceNode): string;\n}\n\ntype DetachedPreview = Extract<WorkspaceDragPreview, { phase: 'detached' }>;\n\n/** Shares layout inputs and browser reads within one synchronous evaluation. */\nexport class WorkspaceEvaluation {\n readonly panels: WorkspacePanel[];\n readonly available: string[];\n readonly requirements;\n readonly projectLayout = createWorkspaceLayoutProjector();\n readonly contextRect = createContextRectResolver();\n\n readonly #host: HTMLElement;\n readonly #inputs: WorkspaceEvaluationInputs;\n readonly #delegate?: WorkspaceEvaluationDelegate;\n readonly #scroll = new WeakMap<HTMLElement, number>();\n readonly #allocations = new Map<WorkspaceNode | null, Map<WorkspaceNode | null, WorkspaceGeometry>>();\n readonly #minima = new Map<WorkspaceNode | null, Dimensions>();\n readonly #detached = new WeakMap<string[], WorkspaceGeometry>();\n\n #origin?: Rect;\n #bounds?: Rect;\n\n constructor(host: HTMLElement, inputs: WorkspaceEvaluationInputs, delegate?: WorkspaceEvaluationDelegate) {\n this.#host = host;\n this.#inputs = inputs;\n this.#delegate = delegate;\n this.panels = inputs.panels;\n this.available = inputs.panels.map(panel => panel.id);\n this.requirements = getWorkspaceRequirements(inputs);\n }\n\n minimum(node: WorkspaceNode | null) {\n let minimum = this.#minima.get(node);\n if (!minimum) {\n minimum = getMinimumWorkspaceDimensions(node, this.requirements);\n this.#minima.set(node, minimum);\n }\n return minimum;\n }\n\n project(layout: WorkspaceLayout) {\n return this.projectLayout(layout, this.available);\n }\n\n geometry(layout: WorkspaceLayout, extent = layout) {\n let allocations = this.#allocations.get(layout.root);\n if (!allocations) {\n allocations = new Map();\n this.#allocations.set(layout.root, allocations);\n }\n let geometry = allocations.get(extent.root);\n if (!geometry) {\n geometry = allocateGeometry({ ...this.#inputs, minimum: node => this.minimum(node) }, layout, extent);\n allocations.set(extent.root, geometry);\n }\n return geometry;\n }\n\n detached(source: string[]) {\n let geometry = this.#detached.get(source);\n if (!geometry) {\n geometry = this.geometry(\n this.project(createDetachedLayout(this.#inputs.layout, source)),\n this.project(this.#inputs.layout)\n );\n this.#detached.set(source, geometry);\n }\n return geometry;\n }\n\n nonOrderGeometry(source: string[]) {\n const spatial = this.detached(source);\n const preview = this.#delegate?.getCurrentPreview();\n if (preview?.phase !== 'detached' || preview.intent.kind !== 'tab' || preview.allocation !== 'reserved') {\n return spatial;\n }\n\n return {\n ...spatial,\n groups: projectTabMembership(spatial.groups, this.geometry(this.project(preview.layout)).groups)\n };\n }\n\n targetCatalog(source: string[], allocation = this.nonOrderGeometry(source)) {\n const currentLayout = this.#currentLayout;\n return workspaceInputCatalog({\n gap: this.#currentMeasurements.gap,\n currentLayout,\n catalog: this.geometry(this.project(currentLayout)).regions,\n allocation,\n reservation: this.presentationGeometry(),\n preview: this.#delegate?.getCurrentPreview(),\n source,\n available: this.available,\n bounds: this.bounds(),\n client: rect => this.client(rect),\n headerHeight: this.#currentMeasurements.headerHeight\n });\n }\n\n getPlacementCatalog(source: string[], point: Point): WorkspacePlacementCatalog {\n const headerTarget = findTabHeaderTarget(this.#headerInput(source, point));\n const catalog: WorkspacePlacementCatalog = this.targetCatalog(source);\n catalog.headerTarget = headerTarget;\n catalog.reservationHit = computedReservationHit({\n ...this.#headerInput(this.#delegate?.getCurrentPreview()?.source ?? [], point),\n groups: this.presentationGeometry().groups\n });\n return catalog;\n }\n\n bounds() {\n return (this.#bounds ??= interactionBounds(this.#host));\n }\n\n client(rect: Rect) {\n const origin = (this.#origin ??= canvasClientRect(this.#host, { x: 0, y: 0, width: 0, height: 0 }));\n return { ...rect, x: rect.x + origin.x, y: rect.y + origin.y };\n }\n\n scroll(group: WorkspacePresentedGroup) {\n if (group.panels.length < 2) return 0;\n const strip = this.#inputs.strip(group);\n if (!strip) return 0;\n let scroll = this.#scroll.get(strip);\n if (scroll === undefined) {\n scroll = strip.scrollLeft;\n this.#scroll.set(strip, scroll);\n }\n return scroll;\n }\n\n presentationGeometry() {\n const fullscreen = getFullscreenWorkspaceLayout(\n this.project(this.#currentLayout),\n this.#delegate?.getFullscreenTarget()\n );\n if (fullscreen) {\n return this.geometry(fullscreen);\n }\n return this.#getArrangementGeometry();\n }\n\n get #currentLayout() {\n return this.#delegate?.getCurrentLayout() ?? this.#inputs.layout;\n }\n\n get #currentMeasurements() {\n return this.#delegate?.getCurrentMeasurements() ?? this.#inputs.measurements;\n }\n\n #getArrangementGeometry() {\n const preview = this.#delegate?.getCurrentPreview();\n if (isNonOrderPreview(preview)) {\n return this.nonOrderGeometry(preview.source);\n }\n if (preview && 'allocation' in preview && preview.allocation === 'reserved') {\n return this.geometry(this.project(preview.layout));\n }\n if (isOverlayDetachedPreview(preview)) {\n return this.detached(preview.source);\n }\n return this.geometry(this.project(this.#delegate?.getResizePreview() ?? this.#currentLayout));\n }\n\n #headerInput(source: string[], point: Point) {\n return {\n groups: preserveRecipientSelection(this.nonOrderGeometry(source).groups, this.#currentLayout.root, source),\n measurements: this.#currentMeasurements,\n source,\n point,\n bounds: this.bounds(),\n client: (rect: Rect) => this.client(rect),\n scroll: (group: WorkspacePresentedGroup) => this.scroll(group)\n };\n }\n}\n\nfunction allocateGeometry(\n input: WorkspaceEvaluationInputs & { minimum(node: WorkspaceNode | null): Dimensions },\n layout: WorkspaceLayout,\n extent: WorkspaceLayout\n): WorkspaceGeometry {\n const floor = input.minimum(extent.root);\n const width = Math.max(input.measurements.width, floor.width);\n const height = Math.max(input.measurements.height, floor.height);\n const allocated = allocateWorkspace({\n root: layout.root,\n rect: { x: 0, y: 0, width, height },\n minimum: input.minimum,\n policy: input.policy,\n gap: input.measurements.gap\n });\n const groups = createPresentedGroups({\n groups: allocated.groups,\n panels: input.panels,\n root: input.layout.root,\n closed: input.layout.closed,\n source: input.source,\n gripWidth: input.measurements.gripWidth\n });\n return { ...allocated, width, height, minimum: floor, groups };\n}\n\nfunction workspaceInputCatalog(input: {\n gap: number;\n currentLayout: WorkspaceLayout;\n catalog: WorkspacePlacedRegion[];\n allocation: { regions: WorkspacePlacedRegion[] };\n reservation?: { regions: WorkspacePlacedRegion[]; groups: WorkspacePresentedGroup[] };\n preview?: WorkspaceDragPreview;\n source: string[];\n available: string[];\n bounds: Rect;\n client(rect: Rect): Rect;\n headerHeight: number;\n}) {\n const { currentLayout, catalog, allocation, source, available, bounds } = input;\n const geometry = {\n catalog,\n allocation: allocation.regions,\n source,\n bounds,\n getRemainingLayoutSignature: createRemainingLayoutSignatureResolver({ currentLayout, source, available })\n };\n const clientCatalog = catalog.map(region => ({ ...region, rect: input.client(region.rect) }));\n const regions = computedRegionCatalog({\n ...geometry,\n catalog: clientCatalog,\n allocation: allocation.regions.map(region => ({ ...region, rect: input.client(region.rect) }))\n });\n\n return {\n gap: input.gap,\n regions,\n orderingRegions: input.reservation\n ? computedRegionCatalog({\n ...geometry,\n catalog: clientCatalog,\n allocation: input.reservation.regions.map(region => ({ ...region, rect: input.client(region.rect) }))\n })\n : regions,\n sourceSlot: input.reservation ? computedSourceSlot({ ...input, groups: input.reservation.groups }) : undefined,\n preview: input.preview,\n headers: computedChromeRects(input),\n targets: groupTargets(regions, source, input.headerHeight),\n bounds\n };\n}\n\n/** Maps region paths onto the computed acquisition allocation without reading animated nodes. */\nfunction computedRegionCatalog(input: RegionCatalogInput): WorkspacePlacedRegion[] {\n const proxies = allocateContextProxies(input);\n return regionCatalog(input, key => proxies.find(proxy => proxy.key === key)?.rect);\n}\n\nfunction regionCatalog(input: RegionCatalogInput, read: (key: string) => Rect | undefined): WorkspacePlacedRegion[] {\n const { catalog, allocation, source, bounds } = input;\n const vacant = allocation.some(\n region => region.node.type === 'group' && getPanelIds(region.node).every(id => source.includes(id))\n );\n const owners = new Set(\n allocation.filter(region => region.node.type === 'split').map(region => getContextKey(getPanelIds(region.node)))\n );\n const seen = new Set<string>();\n return [...catalog]\n .reverse()\n .flatMap(region => {\n const members = getPanelIds(region.node);\n const remaining = members.filter(id => !source.includes(id));\n if (!remaining.length) return [];\n const full = getContextKey(members);\n const key = vacant && region.node.type === 'split' && owners.has(full) ? full : getContextKey(remaining);\n const presented = read(key);\n if (!presented) return [];\n const rect = clipCue(presented, bounds);\n if (rect.width <= 0 || rect.height <= 0) return [];\n const identity = `${key}:${input.getRemainingLayoutSignature(region.node)}`;\n if (seen.has(identity)) return [];\n seen.add(identity);\n return [\n {\n ...region,\n rect: { x: presented.x, y: presented.y, width: presented.width, height: presented.height }\n }\n ];\n })\n .reverse();\n}\n\nfunction createRemainingLayoutSignatureResolver(input: {\n currentLayout: WorkspaceLayout;\n source: string[];\n available: string[];\n}) {\n const visible = input.available.filter(id => !input.currentLayout.closed.includes(id));\n const projections = new Map<WorkspaceNode, WorkspaceNode | null>();\n const signatures = new Map<WorkspaceNode, string>();\n\n const getProjectedNode = (candidate: WorkspaceNode) => {\n if (!projections.has(candidate)) {\n projections.set(candidate, projectLayout({ version: 1, root: candidate, closed: [] }, visible).root);\n }\n return projections.get(candidate) ?? null;\n };\n\n return (node: WorkspaceNode) => {\n let signature = signatures.get(node);\n if (signature === undefined) {\n const carrier = findDeepestProjectionCarrier(\n input.currentLayout.root,\n getProjectionSignature(node),\n getProjectedNode\n );\n const remainingLayout = createDetachedLayout({ version: 1, root: carrier ?? node, closed: [] }, input.source);\n signature = JSON.stringify(remainingLayout.root);\n signatures.set(node, signature);\n }\n return signature;\n };\n}\n\nfunction groupTargets(regions: WorkspacePlacedRegion[], source: string[], headerHeight: number) {\n return regions.flatMap(region =>\n region.node.type === 'group'\n ? [{ panels: region.node.panels.filter(id => !source.includes(id)), rect: region.rect, headerHeight, tabs: [] }]\n : []\n );\n}\n\nfunction computedChromeRects(input: Parameters<typeof workspaceInputCatalog>[0]) {\n const groups = input.reservation?.groups ?? [];\n return groups\n .flatMap(group => {\n if (group.panels.every(panel => input.source.includes(panel.id))) return [];\n const rect = input.client(group.rect);\n return [clipCue({ ...rect, height: Math.min(rect.height, input.headerHeight) }, input.bounds)];\n })\n .filter(rect => rect.width > 0 && rect.height > 0);\n}\n\n/** Source occupancy is an ordinary target in the currently allocated reservation projection. */\nfunction computedReservationHit(input: Parameters<typeof findTabHeaderTarget>[0]) {\n const group = computedSourceSlot(input);\n if (!group) return getTabReservationHit(input);\n if (contains(group, input.point)) return 'group' as const;\n return undefined;\n}\n\n/** Finds only genuine allocated whole-source occupancy, never an overlapping split indicator. */\nfunction computedSourceSlot(\n input: Pick<Parameters<typeof findTabHeaderTarget>[0], 'groups' | 'source' | 'client' | 'bounds'>\n): Rect | undefined {\n const group = input.groups.find(\n item => item.panels.length > 0 && item.panels.every(panel => input.source.includes(panel.id))\n );\n return group ? clipCue(input.client(group.rect), input.bounds) : undefined;\n}\n\nfunction contains(rect: Rect, point: Point) {\n return (\n rect.width > 0 &&\n rect.height > 0 &&\n point.x >= rect.x &&\n point.x < rect.x + rect.width &&\n point.y >= rect.y &&\n point.y < rect.y + rect.height\n );\n}\n\nfunction interactionBounds(workspace: HTMLElement): Rect {\n const viewport = workspace.shadowRoot?.querySelector('.viewport');\n if (!(viewport instanceof HTMLElement)) return workspace.getBoundingClientRect();\n const rect = viewport.getBoundingClientRect();\n return {\n x: rect.x + viewport.clientLeft,\n y: rect.y + viewport.clientTop,\n width: viewport.clientWidth,\n height: viewport.clientHeight\n };\n}\n\nfunction canvasClientRect(workspace: HTMLElement, rect: Rect): Rect {\n const canvas = workspace.shadowRoot?.querySelector('.canvas')?.getBoundingClientRect();\n return { ...rect, x: rect.x + (canvas?.x ?? 0), y: rect.y + (canvas?.y ?? 0) };\n}\n\nfunction isNonOrderPreview(preview: WorkspaceDragPreview | undefined): preview is DetachedPreview {\n return (\n !!preview &&\n preview.phase === 'detached' &&\n preview.intent.kind !== 'order' &&\n preview.intent.kind !== 'insert' &&\n !(preview.intent.kind === 'invalid' && preview.allocation === 'reserved')\n );\n}\n\nfunction isOverlayDetachedPreview(\n preview: WorkspaceDragPreview | undefined\n): preview is Exclude<WorkspaceDragPreview, { phase: 'attached' }> {\n return (\n !!preview &&\n 'allocation' in preview &&\n preview.allocation === 'overlay' &&\n (preview.phase === 'detached' || preview.phase === 'returning-detached')\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"evaluation.utils.js","names":["WorkspaceEvaluationCache","#host","host","#current","work","evaluation","WorkspaceEvaluation","inputs","delegate","createWorkspaceLayoutProjector","createScopeRectResolver","#scroll","#allocations","#minima","#detached","#inputs","#delegate","#cacheOwner","cacheOwner","panel","getWorkspaceRequirements","retained","#retainedMinimum","node","minimum","getMinimumWorkspaceDimensions","layout","entry","#getGeometryCache","extent","allocateGeometry","allocations","geometry","source","createDetachedLayout","spatial","preview","projectTabMembership","currentLayout","#currentLayout","measurements","#currentMeasurements","input","rect","#canReuseCatalog","workspaceInputCatalog","origin","previous","sameCatalogInputs","placementCatalogView","value","structuralPlacementCatalog","snapshotCatalogInputs","headerTarget","findTabHeaderTarget","#headerInput","point","catalog","computedReservationHit","#bounds","interactionBounds","#origin","canvasClientRect","group","strip","scroll","fullscreen","getFullscreenWorkspaceLayout","#getArrangementGeometry","#canReuseCurrentInputs","sameArrayItems","#validatedGeometry","index","sameGeometryInputs","snapshot","sameWorkspaceRequirements","owner","#canReuseGeometry","#invalidateGeometry","#hasCurrentPanelIds","#matchesGeometry","snapshotGeometryInputs","isNonOrderPreview","isOverlayDetachedPreview","preserveRecipientSelection","floor","width","height","allocated","allocateWorkspace","groups","createPresentedGroups","allocation","createRemainingRootKeyResolver","clientCatalog","region","regions","computedRegionCatalog","getSourceReservation","computedChromeRects","groupTargets","scopes","getAllocatedScopes","regionCatalog","scope","key","owners","getPanelIds","id","getPanelMembershipKey","seen","getCatalogMembershipKey","presented","read","clipCue","bounds","identity","members","remaining","full","visible","projections","identities","roots","getProjectedNode","candidate","projectLayout","carrier","findDeepestProjectionCarrier","remainingLayout","sameWorkspaceNode","root","getTabReservationHit","contains","item","viewport","workspace","canvas","snapshotRect","sameRegions","left","right","b","sameRect","sameGroups","a","sameCatalogBinding","sameCatalogMeasurements","sameCatalogRegions","sameWorkspaceMeasurementScalars","generated","nodes","copyNode","copy","copyRegions","snapshotWorkspaceRequirements","requirements","sameGeometryIdentity","sameGeometryMembers","available"],"sources":["../../../src/workspace/utils/evaluation.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Dimensions, Point, Rect } from '@nvidia-elements/core/internal';\n\nimport { allocateWorkspace } from './geometry/allocation.utils.js';\nimport {\n getMinimumWorkspaceDimensions,\n getWorkspaceRequirements,\n sameWorkspaceRequirements,\n snapshotWorkspaceRequirements\n} from './geometry/sizing.utils.js';\nimport { clipCue } from './interaction/drag-preview.utils.js';\nimport { getPanelIds } from './model/layout.utils.js';\nimport { getPanelMembershipKey } from './model/membership.utils.js';\nimport { createDetachedLayout, getFullscreenWorkspaceLayout, projectLayout } from './model/operations.utils.js';\nimport { createWorkspaceLayoutProjector, findDeepestProjectionCarrier } from './model/projection.utils.js';\nimport { sameWorkspaceNode } from './model/value.utils.js';\nimport { createScopeRectResolver, getAllocatedScopes } from './placement/scope.utils.js';\nimport {\n createPresentedGroups,\n findTabHeaderTarget,\n getTabReservationHit,\n preserveRecipientSelection,\n projectTabMembership\n} from './presentation/groups.utils.js';\nimport { sameWorkspaceMeasurementScalars } from './presentation/measurements.utils.js';\nimport { sameArrayItems, sameRect } from './comparison.utils.js';\n\nimport type { WorkspaceBoundary, WorkspacePlacedRegion } from './geometry/allocation.utils.js';\nimport type { WorkspaceRequirements } from './geometry/sizing.utils.js';\nimport type { WorkspaceDragPreview } from './interaction/drag-preview.utils.js';\nimport type { WorkspaceLayout, WorkspaceNode } from './model/layout.utils.js';\nimport type { WorkspaceScopeRectResolver } from './placement/scope.utils.js';\nimport type { WorkspacePresentedGroup, WorkspaceTarget } from './presentation/groups.utils.js';\nimport type { WorkspaceMeasurements } from './presentation/measurements.utils.js';\n\nimport type { WorkspacePanel } from '../panel/panel.js';\n\ninterface WorkspaceEvaluationInputs {\n panels: WorkspacePanel[];\n layout: WorkspaceLayout;\n source: string[];\n measurements: WorkspaceMeasurements;\n policy: 'stop' | 'propagate';\n strip(group: WorkspacePresentedGroup): HTMLElement | null | undefined;\n}\n\nexport interface WorkspaceGeometry {\n groups: WorkspacePresentedGroup[];\n boundaries: WorkspaceBoundary[];\n regions: WorkspacePlacedRegion[];\n width: number;\n height: number;\n minimum: Dimensions;\n}\n\nexport interface WorkspaceEvaluationDelegate {\n readonly getCurrentLayout: () => WorkspaceLayout;\n readonly getCurrentMeasurements: () => WorkspaceMeasurements;\n readonly getCurrentPreview: () => WorkspaceDragPreview | undefined;\n readonly getFullscreenTarget: () => string | undefined;\n readonly getResizePreview: () => WorkspaceLayout | undefined;\n}\n\nexport interface WorkspacePlacementCatalog {\n resolveScopeRect?: WorkspaceScopeRectResolver;\n targets: WorkspaceTarget[];\n regions: WorkspacePlacedRegion[];\n orderingRegions?: WorkspacePlacedRegion[];\n sourceReservation?: Rect;\n headers?: Rect[];\n preview?: WorkspaceDragPreview;\n bounds: Rect;\n headerTarget?: WorkspaceTarget;\n reservationHit?: WorkspaceReservationHit;\n}\n\ntype WorkspaceReservationHit = 'group' | 'tab';\n\ninterface RegionCatalogInput {\n catalog: WorkspacePlacedRegion[];\n allocation: WorkspacePlacedRegion[];\n source: string[];\n bounds: Rect;\n getRemainingRootKey(node: WorkspaceNode): number;\n}\n\ntype DetachedPreview = Extract<WorkspaceDragPreview, { phase: 'detached' }>;\n\ninterface GeometryInputSnapshot {\n layout: WorkspaceLayout;\n closed: string[];\n source: string[];\n available: string[];\n panels: WorkspacePanel[];\n measurementIdentity: WorkspaceMeasurements;\n measurements: WorkspaceMeasurements;\n requirements: WorkspaceRequirements;\n policy: WorkspaceEvaluationInputs['policy'];\n}\ninterface CachedWorkspaceGeometry {\n inputs: GeometryInputSnapshot;\n projected?: WorkspaceLayout;\n base?: WorkspaceGeometry;\n detached?: WorkspaceGeometry;\n}\n\ntype PlacementCatalogInputs = Parameters<typeof workspaceInputCatalog>[0] & {\n measurements: WorkspaceMeasurements;\n requirements: WorkspaceRequirements;\n};\n\ntype StructuralPlacementCatalog = Omit<WorkspacePlacementCatalog, 'preview' | 'headerTarget' | 'reservationHit'> & {\n gap: number;\n};\ninterface PresentedGroupSnapshot {\n rect: Rect;\n panels: string[];\n}\ninterface CatalogInputSnapshot {\n layout: WorkspaceLayout;\n closed: string[];\n source: string[];\n available: string[];\n measurementIdentity: WorkspaceMeasurements;\n measurements: WorkspaceMeasurements;\n requirements: WorkspaceRequirements;\n bounds: Rect;\n origin: Rect;\n catalog: WorkspacePlacedRegion[];\n allocation: WorkspacePlacedRegion[];\n reservation?: WorkspacePlacedRegion[];\n groups?: PresentedGroupSnapshot[];\n}\ninterface CachedPlacementCatalog {\n inputs: CatalogInputSnapshot;\n catalog: StructuralPlacementCatalog;\n}\n\n/** Owns retained geometry and catalog data and the current synchronous evaluation for one Workspace. */\nexport class WorkspaceEvaluationCache {\n readonly #host: HTMLElement;\n #current?: WorkspaceEvaluation;\n geometry?: CachedWorkspaceGeometry;\n catalog?: CachedPlacementCatalog;\n\n constructor(host: HTMLElement) {\n this.#host = host;\n }\n\n get current() {\n return this.#current;\n }\n\n run<T>(\n inputs: WorkspaceEvaluationInputs,\n delegate: WorkspaceEvaluationDelegate | undefined,\n work: (evaluation: WorkspaceEvaluation) => T\n ): T {\n if (this.#current) return work(this.#current);\n const evaluation = new WorkspaceEvaluation(this.#host, inputs, delegate, this);\n this.#current = evaluation;\n try {\n return work(evaluation);\n } finally {\n this.#current = undefined;\n }\n }\n\n clear() {\n this.geometry = undefined;\n this.catalog = undefined;\n }\n}\n\n/** Shares layout inputs and browser reads within one synchronous evaluation. */\nexport class WorkspaceEvaluation {\n readonly panels: WorkspacePanel[];\n readonly available: string[];\n readonly requirements;\n readonly projectLayout = createWorkspaceLayoutProjector();\n readonly resolveScopeRect = createScopeRectResolver();\n\n readonly #host: HTMLElement;\n readonly #inputs: WorkspaceEvaluationInputs;\n readonly #delegate?: WorkspaceEvaluationDelegate;\n readonly #cacheOwner?: WorkspaceEvaluationCache;\n readonly #scroll = new WeakMap<HTMLElement, number>();\n readonly #allocations = new Map<WorkspaceNode | null, Map<WorkspaceNode | null, WorkspaceGeometry>>();\n readonly #minima = new Map<WorkspaceNode | null, Dimensions>();\n readonly #detached = new WeakMap<string[], WorkspaceGeometry>();\n\n #validatedGeometry?: CachedWorkspaceGeometry;\n #origin?: Rect;\n #bounds?: Rect;\n\n // eslint-disable-next-line max-params -- Keep the optional cache owner explicit without allocating constructor options.\n constructor(\n host: HTMLElement,\n inputs: WorkspaceEvaluationInputs,\n delegate?: WorkspaceEvaluationDelegate,\n cacheOwner?: WorkspaceEvaluationCache\n ) {\n this.#host = host;\n this.#inputs = inputs;\n this.#delegate = delegate;\n this.#cacheOwner = cacheOwner;\n this.panels = inputs.panels;\n this.available = inputs.panels.map(panel => panel.id);\n this.requirements = getWorkspaceRequirements(inputs);\n }\n\n minimum(node: WorkspaceNode | null) {\n const retained = this.#retainedMinimum(node);\n if (retained) return retained;\n let minimum = this.#minima.get(node);\n if (!minimum) {\n minimum = getMinimumWorkspaceDimensions(node, this.requirements);\n this.#minima.set(node, minimum);\n }\n return minimum;\n }\n\n project(layout: WorkspaceLayout) {\n if (layout === this.#inputs.layout) {\n const entry = this.#getGeometryCache();\n if (entry) {\n if (entry.projected) {\n return entry.projected;\n }\n\n return (entry.projected = this.projectLayout(layout, this.available));\n }\n }\n return this.projectLayout(layout, this.available);\n }\n\n geometry(layout: WorkspaceLayout, extent = layout) {\n if (extent === layout) {\n const entry = this.#getGeometryCache();\n if (entry && entry.projected === layout) {\n if (entry.base) {\n return entry.base;\n }\n\n return (entry.base = allocateGeometry(\n { ...this.#inputs, minimum: node => this.minimum(node) },\n layout,\n extent\n ));\n }\n }\n let allocations = this.#allocations.get(layout.root);\n if (!allocations) {\n allocations = new Map();\n this.#allocations.set(layout.root, allocations);\n }\n let geometry = allocations.get(extent.root);\n if (!geometry) {\n geometry = allocateGeometry({ ...this.#inputs, minimum: node => this.minimum(node) }, layout, extent);\n allocations.set(extent.root, geometry);\n }\n return geometry;\n }\n\n detached(source: string[]) {\n const entry = this.#getGeometryCache(source);\n if (entry) {\n if (entry.detached) {\n return entry.detached;\n }\n\n return (entry.detached = this.geometry(\n this.project(createDetachedLayout(this.#inputs.layout, source)),\n this.project(this.#inputs.layout)\n ));\n }\n let geometry = this.#detached.get(source);\n if (!geometry) {\n geometry = this.geometry(\n this.project(createDetachedLayout(this.#inputs.layout, source)),\n this.project(this.#inputs.layout)\n );\n this.#detached.set(source, geometry);\n }\n return geometry;\n }\n\n nonOrderGeometry(source: string[]) {\n const spatial = this.detached(source);\n const preview = this.#delegate?.getCurrentPreview();\n if (preview?.phase !== 'detached' || preview.intent.kind !== 'tab' || preview.allocation !== 'reserved') {\n return spatial;\n }\n\n return {\n ...spatial,\n groups: projectTabMembership(spatial.groups, this.geometry(this.project(preview.layout)).groups)\n };\n }\n\n targetCatalog(source: string[], allocation = this.nonOrderGeometry(source)) {\n const currentLayout = this.#currentLayout;\n const measurements = this.#currentMeasurements;\n const preview = this.#delegate?.getCurrentPreview();\n const input = {\n gap: measurements.gap,\n measurements,\n requirements: this.requirements,\n currentLayout,\n catalog: this.geometry(this.project(currentLayout)).regions,\n allocation,\n reservation: this.presentationGeometry(),\n preview,\n source,\n available: this.available,\n bounds: this.bounds(),\n client: (rect: Rect) => this.client(rect),\n headerHeight: measurements.headerHeight\n };\n if (!this.#cacheOwner || !this.#canReuseCatalog(preview)) {\n this.#cacheOwner?.clear();\n return workspaceInputCatalog(input);\n }\n const origin = this.client({ x: 0, y: 0, width: 0, height: 0 });\n const previous = this.#cacheOwner.catalog;\n if (previous && sameCatalogInputs(previous.inputs, input, origin)) {\n return placementCatalogView(previous.catalog, preview);\n }\n\n this.#cacheOwner.catalog = undefined;\n const value = structuralPlacementCatalog(workspaceInputCatalog(input));\n this.#cacheOwner.catalog = {\n inputs: snapshotCatalogInputs(input, origin),\n catalog: value\n };\n return placementCatalogView(value, preview);\n }\n\n getPlacementCatalog(source: string[], point: Point): WorkspacePlacementCatalog {\n const headerTarget = findTabHeaderTarget(this.#headerInput(source, point));\n const catalog: WorkspacePlacementCatalog = this.targetCatalog(source);\n catalog.headerTarget = headerTarget;\n catalog.reservationHit = computedReservationHit({\n ...this.#headerInput(this.#delegate?.getCurrentPreview()?.source ?? [], point),\n groups: this.presentationGeometry().groups\n });\n return catalog;\n }\n\n bounds() {\n return (this.#bounds ??= interactionBounds(this.#host));\n }\n\n client(rect: Rect) {\n const origin = (this.#origin ??= canvasClientRect(this.#host, { x: 0, y: 0, width: 0, height: 0 }));\n return { ...rect, x: rect.x + origin.x, y: rect.y + origin.y };\n }\n\n scroll(group: WorkspacePresentedGroup) {\n if (group.panels.length < 2) return 0;\n const strip = this.#inputs.strip(group);\n if (!strip) return 0;\n let scroll = this.#scroll.get(strip);\n if (scroll === undefined) {\n scroll = strip.scrollLeft;\n this.#scroll.set(strip, scroll);\n }\n return scroll;\n }\n\n presentationGeometry() {\n const fullscreen = getFullscreenWorkspaceLayout(\n this.project(this.#currentLayout),\n this.#delegate?.getFullscreenTarget()\n );\n if (fullscreen) {\n return this.geometry(fullscreen);\n }\n return this.#getArrangementGeometry();\n }\n\n #retainedMinimum(node: WorkspaceNode | null) {\n if (this.#cacheOwner?.geometry?.projected?.root !== node) return undefined;\n const entry = this.#getGeometryCache();\n return entry?.projected?.root === node ? (entry.base ?? entry.detached)?.minimum : undefined;\n }\n\n #canReuseGeometry(source?: string[]) {\n const preview = this.#delegate?.getCurrentPreview();\n return (\n this.#canReuseCurrentInputs() &&\n preview?.phase === 'detached' &&\n sameArrayItems(this.#inputs.source, preview.source) &&\n (!source || sameArrayItems(source, preview.source))\n );\n }\n\n #canReuseCatalog(preview: WorkspaceDragPreview | undefined): preview is DetachedPreview {\n return this.#cacheOwner?.current === this && preview?.phase === 'detached' && this.#host.isConnected;\n }\n\n #canReuseCurrentInputs() {\n return (\n this.#cacheOwner?.current === this &&\n this.#host.isConnected &&\n this.#inputs.layout === this.#currentLayout &&\n this.#inputs.measurements === this.#currentMeasurements &&\n this.#delegate?.getFullscreenTarget() === undefined &&\n this.#delegate?.getResizePreview() === undefined\n );\n }\n\n #invalidateGeometry() {\n this.#validatedGeometry = undefined;\n if (this.#cacheOwner) this.#cacheOwner.geometry = undefined;\n return undefined;\n }\n\n #hasCurrentPanelIds() {\n return (\n this.panels.length === this.available.length &&\n this.panels.every((panel, index) => panel.id === this.available[index])\n );\n }\n\n #matchesGeometry(snapshot: GeometryInputSnapshot) {\n return (\n sameGeometryInputs(snapshot, this.#inputs, this.available) &&\n sameWorkspaceRequirements(snapshot.requirements, this.requirements)\n );\n }\n\n // Check the binding once per synchronous private evaluation; keep native reads in that scope.\n #getGeometryCache(source?: string[]) {\n const owner = this.#cacheOwner;\n if (!owner || !this.#canReuseGeometry(source)) return this.#invalidateGeometry();\n const previous = owner.geometry;\n if (\n previous &&\n previous === this.#validatedGeometry &&\n previous.inputs.policy === this.#inputs.policy &&\n sameArrayItems(previous.inputs.source, this.#inputs.source)\n )\n return previous;\n if (!this.#hasCurrentPanelIds()) return this.#invalidateGeometry();\n if (previous && this.#matchesGeometry(previous.inputs)) return (this.#validatedGeometry = previous);\n const entry: CachedWorkspaceGeometry = { inputs: snapshotGeometryInputs(this.#inputs, this) };\n owner.geometry = entry;\n return (this.#validatedGeometry = entry);\n }\n\n get #currentLayout() {\n return this.#delegate?.getCurrentLayout() ?? this.#inputs.layout;\n }\n\n get #currentMeasurements() {\n return this.#delegate?.getCurrentMeasurements() ?? this.#inputs.measurements;\n }\n\n #getArrangementGeometry() {\n const preview = this.#delegate?.getCurrentPreview();\n if (isNonOrderPreview(preview)) {\n return this.nonOrderGeometry(preview.source);\n }\n if (preview && 'allocation' in preview && preview.allocation === 'reserved') {\n return this.geometry(this.project(preview.layout));\n }\n if (isOverlayDetachedPreview(preview)) {\n return this.detached(preview.source);\n }\n return this.geometry(this.project(this.#delegate?.getResizePreview() ?? this.#currentLayout));\n }\n\n #headerInput(source: string[], point: Point) {\n return {\n groups: preserveRecipientSelection(this.nonOrderGeometry(source).groups, this.#currentLayout.root, source),\n measurements: this.#currentMeasurements,\n source,\n point,\n bounds: this.bounds(),\n client: (rect: Rect) => this.client(rect),\n scroll: (group: WorkspacePresentedGroup) => this.scroll(group)\n };\n }\n}\n\nfunction allocateGeometry(\n input: WorkspaceEvaluationInputs & { minimum(node: WorkspaceNode | null): Dimensions },\n layout: WorkspaceLayout,\n extent: WorkspaceLayout\n): WorkspaceGeometry {\n const floor = input.minimum(extent.root);\n const width = Math.max(input.measurements.width, floor.width);\n const height = Math.max(input.measurements.height, floor.height);\n const allocated = allocateWorkspace({\n root: layout.root,\n rect: { x: 0, y: 0, width, height },\n minimum: input.minimum,\n policy: input.policy,\n gap: input.measurements.gap\n });\n const groups = createPresentedGroups({\n groups: allocated.groups,\n panels: input.panels,\n root: input.layout.root,\n closed: input.layout.closed,\n source: input.source,\n gripWidth: input.measurements.gripWidth\n });\n return { ...allocated, width, height, minimum: floor, groups };\n}\n\nfunction workspaceInputCatalog(input: {\n gap: number;\n currentLayout: WorkspaceLayout;\n catalog: WorkspacePlacedRegion[];\n allocation: { regions: WorkspacePlacedRegion[] };\n reservation?: { regions: WorkspacePlacedRegion[]; groups: WorkspacePresentedGroup[] };\n preview?: WorkspaceDragPreview;\n source: string[];\n available: string[];\n bounds: Rect;\n client(rect: Rect): Rect;\n headerHeight: number;\n}) {\n const { currentLayout, catalog, allocation, source, available, bounds } = input;\n const geometry = {\n catalog,\n allocation: allocation.regions,\n source,\n bounds,\n getRemainingRootKey: createRemainingRootKeyResolver({ currentLayout, source, available })\n };\n const clientCatalog = catalog.map(region => ({ ...region, rect: input.client(region.rect) }));\n const regions = computedRegionCatalog({\n ...geometry,\n catalog: clientCatalog,\n allocation: allocation.regions.map(region => ({ ...region, rect: input.client(region.rect) }))\n });\n\n return {\n gap: input.gap,\n resolveScopeRect: createScopeRectResolver(),\n regions,\n orderingRegions: input.reservation\n ? computedRegionCatalog({\n ...geometry,\n catalog: clientCatalog,\n allocation: input.reservation.regions.map(region => ({ ...region, rect: input.client(region.rect) }))\n })\n : regions,\n sourceReservation: input.reservation\n ? getSourceReservation({ ...input, groups: input.reservation.groups })\n : undefined,\n preview: input.preview,\n headers: computedChromeRects(input),\n targets: groupTargets(regions, source, input.headerHeight),\n bounds\n };\n}\n\n/** Maps region paths onto the computed acquisition allocation without reading animated nodes. */\nfunction computedRegionCatalog(input: RegionCatalogInput): WorkspacePlacedRegion[] {\n const scopes = getAllocatedScopes(input);\n return regionCatalog(input, key => scopes.find(scope => scope.key === key)?.rect);\n}\n\nfunction regionCatalog(input: RegionCatalogInput, read: (key: string) => Rect | undefined): WorkspacePlacedRegion[] {\n const { catalog, allocation, source, bounds } = input;\n const vacant = allocation.some(\n region => region.node.type === 'group' && getPanelIds(region.node).every(id => source.includes(id))\n );\n const owners = vacant\n ? new Set(\n allocation\n .filter(region => region.node.type === 'split')\n .map(region => getPanelMembershipKey(getPanelIds(region.node)))\n )\n : undefined;\n const seen = new Set<string>();\n return [...catalog]\n .reverse()\n .flatMap(region => {\n const key = getCatalogMembershipKey(region, source, owners);\n if (!key) return [];\n const presented = read(key);\n if (!presented) return [];\n const rect = clipCue(presented, bounds);\n if (rect.width <= 0 || rect.height <= 0) return [];\n const identity = `${key}:${input.getRemainingRootKey(region.node)}`;\n if (seen.has(identity)) return [];\n seen.add(identity);\n return [\n {\n ...region,\n rect: { x: presented.x, y: presented.y, width: presented.width, height: presented.height }\n }\n ];\n })\n .reverse();\n}\n\nfunction getCatalogMembershipKey(\n region: WorkspacePlacedRegion,\n source: string[],\n owners: ReadonlySet<string> | undefined\n) {\n const members = getPanelIds(region.node);\n const remaining = members.filter(id => !source.includes(id));\n if (!remaining.length) return undefined;\n if (remaining.length === members.length) return getPanelMembershipKey(members);\n if (owners && region.node.type === 'split') {\n const full = getPanelMembershipKey(members);\n if (owners.has(full)) return full;\n }\n return getPanelMembershipKey(remaining);\n}\n\nfunction createRemainingRootKeyResolver(input: {\n currentLayout: WorkspaceLayout;\n source: string[];\n available: string[];\n}) {\n const visible = input.available.filter(id => !input.currentLayout.closed.includes(id));\n const projections = new Map<WorkspaceNode, WorkspaceNode | null>();\n const identities = new Map<WorkspaceNode, number>();\n const roots: (WorkspaceNode | null)[] = [];\n\n const getProjectedNode = (candidate: WorkspaceNode) => {\n if (!projections.has(candidate)) {\n projections.set(candidate, projectLayout({ version: 1, root: candidate, closed: [] }, visible).root);\n }\n return projections.get(candidate) ?? null;\n };\n\n return (node: WorkspaceNode) => {\n let identity = identities.get(node);\n if (identity === undefined) {\n const carrier = findDeepestProjectionCarrier(input.currentLayout.root, node, getProjectedNode);\n const remainingLayout = createDetachedLayout({ version: 1, root: carrier ?? node, closed: [] }, input.source);\n identity = roots.findIndex(root => sameWorkspaceNode(root, remainingLayout.root));\n if (identity < 0) {\n identity = roots.length;\n roots.push(remainingLayout.root);\n }\n identities.set(node, identity);\n }\n return identity;\n };\n}\n\nfunction groupTargets(regions: WorkspacePlacedRegion[], source: string[], headerHeight: number) {\n return regions.flatMap(region =>\n region.node.type === 'group'\n ? [{ panels: region.node.panels.filter(id => !source.includes(id)), rect: region.rect, headerHeight, tabs: [] }]\n : []\n );\n}\n\nfunction computedChromeRects(input: Parameters<typeof workspaceInputCatalog>[0]) {\n const groups = input.reservation?.groups ?? [];\n return groups\n .flatMap(group => {\n if (group.panels.every(panel => input.source.includes(panel.id))) return [];\n const rect = input.client(group.rect);\n return [clipCue({ ...rect, height: Math.min(rect.height, input.headerHeight) }, input.bounds)];\n })\n .filter(rect => rect.width > 0 && rect.height > 0);\n}\n\n/** Source occupancy is an ordinary target in the currently allocated reservation projection. */\nfunction computedReservationHit(input: Parameters<typeof findTabHeaderTarget>[0]) {\n const group = getSourceReservation(input);\n if (!group) return getTabReservationHit(input);\n if (contains(group, input.point)) return 'group' as const;\n return undefined;\n}\n\n/** Finds only genuine allocated whole-source occupancy, never an overlapping split indicator. */\nfunction getSourceReservation(\n input: Pick<Parameters<typeof findTabHeaderTarget>[0], 'groups' | 'source' | 'client' | 'bounds'>\n): Rect | undefined {\n const group = input.groups.find(\n item => item.panels.length > 0 && item.panels.every(panel => input.source.includes(panel.id))\n );\n return group ? clipCue(input.client(group.rect), input.bounds) : undefined;\n}\n\nfunction contains(rect: Rect, point: Point) {\n return (\n rect.width > 0 &&\n rect.height > 0 &&\n point.x >= rect.x &&\n point.x < rect.x + rect.width &&\n point.y >= rect.y &&\n point.y < rect.y + rect.height\n );\n}\n\nfunction interactionBounds(workspace: HTMLElement): Rect {\n const viewport = workspace.shadowRoot?.querySelector('.viewport');\n if (!(viewport instanceof HTMLElement)) return workspace.getBoundingClientRect();\n const rect = viewport.getBoundingClientRect();\n return {\n x: rect.x + viewport.clientLeft,\n y: rect.y + viewport.clientTop,\n width: viewport.clientWidth,\n height: viewport.clientHeight\n };\n}\n\nfunction canvasClientRect(workspace: HTMLElement, rect: Rect): Rect {\n const canvas = workspace.shadowRoot?.querySelector('.canvas')?.getBoundingClientRect();\n return { ...rect, x: rect.x + (canvas?.x ?? 0), y: rect.y + (canvas?.y ?? 0) };\n}\n\nfunction isNonOrderPreview(preview: WorkspaceDragPreview | undefined): preview is DetachedPreview {\n return (\n !!preview &&\n preview.phase === 'detached' &&\n preview.intent.kind !== 'order' &&\n preview.intent.kind !== 'insert' &&\n !(preview.intent.kind === 'invalid' && preview.allocation === 'reserved')\n );\n}\n\nfunction isOverlayDetachedPreview(\n preview: WorkspaceDragPreview | undefined\n): preview is Exclude<WorkspaceDragPreview, { phase: 'attached' }> {\n return (\n !!preview &&\n 'allocation' in preview &&\n preview.allocation === 'overlay' &&\n (preview.phase === 'detached' || preview.phase === 'returning-detached')\n );\n}\n\nfunction placementCatalogView(\n value: StructuralPlacementCatalog,\n preview: WorkspaceDragPreview\n): WorkspacePlacementCatalog & { gap: number } {\n return {\n gap: value.gap,\n resolveScopeRect: value.resolveScopeRect,\n regions: value.regions,\n orderingRegions: value.orderingRegions,\n sourceReservation: value.sourceReservation,\n preview,\n headers: value.headers,\n targets: value.targets,\n bounds: value.bounds\n };\n}\n\nfunction snapshotRect(rect: Rect): Rect {\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };\n}\n\nfunction sameRegions(left: WorkspacePlacedRegion[], right: WorkspacePlacedRegion[]) {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index++) {\n const a = left[index]!,\n b = right[index]!;\n if (a.key !== b.key || !sameRect(a.rect, b.rect) || !sameWorkspaceNode(a.node, b.node)) return false;\n }\n return true;\n}\n\nfunction sameGroups(left: PresentedGroupSnapshot[] | undefined, right: WorkspacePresentedGroup[] | undefined) {\n if (!left || !right) return left === undefined && right === undefined;\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index++) {\n const a = left[index]!,\n b = right[index]!;\n if (!sameRect(a.rect, b.rect) || a.panels.length !== b.panels.length) return false;\n for (let panel = 0; panel < a.panels.length; panel++) if (a.panels[panel] !== b.panels[panel]!.id) return false;\n }\n return true;\n}\n\nfunction sameCatalogInputs(snapshot: CatalogInputSnapshot, input: PlacementCatalogInputs, origin: Rect) {\n return (\n sameCatalogBinding(snapshot, input) &&\n sameCatalogMeasurements(snapshot, input, origin) &&\n sameCatalogRegions(snapshot, input)\n );\n}\n\nfunction sameCatalogBinding(snapshot: CatalogInputSnapshot, input: PlacementCatalogInputs) {\n return (\n snapshot.layout === input.currentLayout &&\n snapshot.measurementIdentity === input.measurements &&\n sameArrayItems(snapshot.closed, input.currentLayout.closed) &&\n sameArrayItems(snapshot.source, input.source) &&\n sameArrayItems(snapshot.available, input.available)\n );\n}\n\nfunction sameCatalogMeasurements(snapshot: CatalogInputSnapshot, input: PlacementCatalogInputs, origin: Rect) {\n if (!sameWorkspaceMeasurementScalars(snapshot.measurements, input.measurements)) return false;\n return (\n sameRect(snapshot.bounds, input.bounds) &&\n sameRect(snapshot.origin, origin) &&\n sameWorkspaceRequirements(snapshot.requirements, input.requirements)\n );\n}\n\nfunction sameCatalogRegions(snapshot: CatalogInputSnapshot, input: PlacementCatalogInputs) {\n if (!sameRegions(snapshot.catalog, input.catalog) || !sameRegions(snapshot.allocation, input.allocation.regions))\n return false;\n if (!!snapshot.reservation !== !!input.reservation) return false;\n if (snapshot.reservation && input.reservation && !sameRegions(snapshot.reservation, input.reservation.regions))\n return false;\n return sameGroups(snapshot.groups, input.reservation?.groups);\n}\n\nfunction structuralPlacementCatalog(generated: ReturnType<typeof workspaceInputCatalog>): StructuralPlacementCatalog {\n return {\n gap: generated.gap,\n resolveScopeRect: generated.resolveScopeRect,\n regions: generated.regions,\n orderingRegions: generated.orderingRegions,\n sourceReservation: generated.sourceReservation,\n headers: generated.headers,\n targets: generated.targets,\n bounds: generated.bounds\n };\n}\n\nfunction snapshotCatalogInputs(input: PlacementCatalogInputs, origin: Rect): CatalogInputSnapshot {\n const { measurements, requirements } = input;\n const nodes = new Map<WorkspaceNode, WorkspaceNode>();\n function copyNode(node: WorkspaceNode): WorkspaceNode {\n let copy = nodes.get(node);\n if (!copy) {\n copy =\n node.type === 'group'\n ? { type: 'group', panels: [...node.panels], active: node.active }\n : { type: 'split', axis: node.axis, weights: [...node.weights], children: node.children.map(copyNode) };\n nodes.set(node, copy);\n }\n return copy;\n }\n const copyRegions = (regions: WorkspacePlacedRegion[]) =>\n regions.map(region => ({ key: region.key, node: copyNode(region.node), rect: snapshotRect(region.rect) }));\n return {\n layout: input.currentLayout,\n closed: [...input.currentLayout.closed],\n source: [...input.source],\n available: [...input.available],\n measurementIdentity: measurements,\n measurements: { ...measurements, panels: undefined },\n requirements: snapshotWorkspaceRequirements(requirements),\n bounds: snapshotRect(input.bounds),\n origin: snapshotRect(origin),\n catalog: copyRegions(input.catalog),\n allocation: copyRegions(input.allocation.regions),\n reservation: input.reservation ? copyRegions(input.reservation.regions) : undefined,\n groups: input.reservation?.groups.map(group => ({\n rect: snapshotRect(group.rect),\n panels: group.panels.map(panel => panel.id)\n }))\n };\n}\n\nfunction sameGeometryInputs(snapshot: GeometryInputSnapshot, input: WorkspaceEvaluationInputs, available: string[]) {\n return (\n sameGeometryIdentity(snapshot, input) &&\n sameGeometryMembers(snapshot, input, available) &&\n sameWorkspaceMeasurementScalars(snapshot.measurements, input.measurements)\n );\n}\n\nfunction sameGeometryIdentity(snapshot: GeometryInputSnapshot, input: WorkspaceEvaluationInputs) {\n return (\n snapshot.layout === input.layout &&\n snapshot.measurementIdentity === input.measurements &&\n snapshot.policy === input.policy &&\n snapshot.panels.length === input.panels.length\n );\n}\n\nfunction sameGeometryMembers(snapshot: GeometryInputSnapshot, input: WorkspaceEvaluationInputs, available: string[]) {\n return (\n sameArrayItems(snapshot.closed, input.layout.closed) &&\n sameArrayItems(snapshot.source, input.source) &&\n sameArrayItems(snapshot.available, available) &&\n snapshot.panels.every(\n (panel, index) => panel === input.panels[index] && input.panels[index].id === available[index]\n )\n );\n}\n\nfunction snapshotGeometryInputs(\n input: WorkspaceEvaluationInputs,\n evaluation: WorkspaceEvaluation\n): GeometryInputSnapshot {\n const { available, requirements } = evaluation;\n return {\n layout: input.layout,\n closed: [...input.layout.closed],\n source: [...input.source],\n available: [...available],\n panels: [...input.panels],\n measurementIdentity: input.measurements,\n measurements: { ...input.measurements, panels: undefined },\n policy: input.policy,\n requirements: snapshotWorkspaceRequirements(requirements)\n };\n}\n"],"mappings":"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"}
@@ -14,28 +14,30 @@ function t(t) {
14
14
  });
15
15
  return;
16
16
  }
17
- let u = s.axis === "horizontal", d = s.children.map((e) => t.minimum(e)[u ? "width" : "height"]), f = e(s.weights, d, (u ? c.width : c.height) - t.gap * (s.children.length - 1)), p = 0;
17
+ let u = s.axis === "horizontal", d = s.children.map((e) => t.minimum(e)[u ? "width" : "height"]), f = e(s.weights, d, (u ? c.width : c.height) - t.gap * (s.children.length - 1)), p = f.reduce((e, t) => e + t, 0), m = 0, h = 0;
18
18
  s.children.forEach((e, r) => {
19
19
  let i = f[r];
20
20
  o(e, u ? {
21
21
  ...c,
22
- x: c.x + p,
22
+ x: c.x + h,
23
23
  width: i
24
24
  } : {
25
25
  ...c,
26
- y: c.y + p,
26
+ y: c.y + h,
27
27
  height: i
28
- }, `${l}.${r}`), p += i, r < s.children.length - 1 && (a.push(n({
28
+ }, `${l}.${r}`), h += i, r < s.children.length - 1 && (m += i, a.push(n({
29
29
  node: s,
30
30
  rect: c,
31
31
  path: l,
32
32
  index: r,
33
- offset: p,
33
+ offset: h,
34
+ prefix: m,
35
+ total: p,
34
36
  sizes: f,
35
37
  minima: d,
36
38
  policy: t.policy,
37
39
  gap: t.gap
38
- })), p += t.gap);
40
+ })), h += t.gap);
39
41
  });
40
42
  };
41
43
  return t.root && o(t.root, t.rect, "root"), {
@@ -45,12 +47,12 @@ function t(t) {
45
47
  };
46
48
  }
47
49
  function n(e) {
48
- let { node: t, rect: n, path: r, index: i, offset: a, sizes: o, minima: s, policy: c } = e, l = t.axis === "horizontal", u = c === "stop" ? [i + 1] : o.map((e, t) => t).slice(i + 1), d = c === "stop" ? [i] : o.map((e, t) => t).slice(0, i + 1), f = o.slice(0, i + 1).reduce((e, t) => e + t, 0), p = o.reduce((e, t) => e + t, 0), m = d.reduce((e, t) => e + o[t] - s[t], 0), h = u.reduce((e, t) => e + o[t] - s[t], 0);
50
+ let { node: t, rect: n, path: r, index: i, offset: a, prefix: o, total: s, sizes: c, minima: l, policy: u } = e, d = t.axis === "horizontal", f = u === "stop" ? [i + 1] : c.map((e, t) => t).slice(i + 1), p = (u === "stop" ? [i] : c.map((e, t) => t).slice(0, i + 1)).reduce((e, t) => e + c[t] - l[t], 0), m = f.reduce((e, t) => e + c[t] - l[t], 0);
49
51
  return {
50
52
  key: `${r}:${i}`,
51
53
  branch: t,
52
54
  index: i,
53
- rect: l ? {
55
+ rect: d ? {
54
56
  x: n.x + a,
55
57
  y: n.y,
56
58
  width: e.gap,
@@ -61,11 +63,11 @@ function n(e) {
61
63
  width: n.width,
62
64
  height: e.gap
63
65
  },
64
- sizes: o,
65
- minima: s,
66
- value: l ? f : p - f,
67
- min: l ? f - m : p - f - h,
68
- max: l ? f + h : p - f + m
66
+ sizes: c,
67
+ minima: l,
68
+ value: d ? o : s - o,
69
+ min: d ? o - p : s - o - m,
70
+ max: d ? o + m : s - o + p
69
71
  };
70
72
  }
71
73
  export { t as allocateWorkspace };
@@ -1 +1 @@
1
- {"version":3,"file":"allocation.utils.js","names":["allocateWorkspace","groups","regions","boundaries","place","path","node","horizontal","minima","input","child","sizes","fitSizes","rect","offset","size","index","boundary","after","policy","i","before","prefix","a","b","total","negative","sum","positive"],"sources":["../../../../src/workspace/utils/geometry/allocation.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 { fitSizes } from './partition.utils.js';\n\nimport type { WorkspaceGroup, WorkspaceNode, WorkspaceSplit } from '../model/layout.utils.js';\n\nexport interface WorkspacePlacedGroup {\n key: string;\n group: WorkspaceGroup;\n rect: Rect;\n}\n\nexport interface WorkspacePlacedRegion {\n key: string;\n node: WorkspaceNode;\n rect: Rect;\n}\n\nexport interface WorkspaceBoundary {\n key: string;\n branch: WorkspaceSplit;\n index: number;\n rect: Rect;\n sizes: number[];\n minima: number[];\n value: number;\n min: number;\n max: number;\n}\n\ninterface PlacementInput {\n root: WorkspaceNode | null;\n rect: Rect;\n minimum: (node: WorkspaceNode) => { width: number; height: number };\n policy: 'stop' | 'propagate';\n gap: number;\n}\n\n/** Allocates geometry without configuring or moving application panels. */\nexport function allocateWorkspace(input: PlacementInput) {\n const groups: WorkspacePlacedGroup[] = [];\n const regions: WorkspacePlacedRegion[] = [];\n const boundaries: WorkspaceBoundary[] = [];\n const place = (node: WorkspaceNode, rect: Rect, path: string) => {\n regions.push({ key: path, node, rect });\n if (node.type === 'group') {\n groups.push({ key: path, group: node, rect });\n return;\n }\n const horizontal = node.axis === 'horizontal';\n const minima = node.children.map(child => input.minimum(child)[horizontal ? 'width' : 'height']);\n const sizes = fitSizes(\n node.weights,\n minima,\n (horizontal ? rect.width : rect.height) - input.gap * (node.children.length - 1)\n );\n let offset = 0;\n node.children.forEach((child, index) => {\n const size = sizes[index]!;\n place(\n child,\n horizontal ? { ...rect, x: rect.x + offset, width: size } : { ...rect, y: rect.y + offset, height: size },\n `${path}.${index}`\n );\n offset += size;\n if (index < node.children.length - 1) {\n boundaries.push(\n boundary({ node, rect, path, index, offset, sizes, minima, policy: input.policy, gap: input.gap })\n );\n offset += input.gap;\n }\n });\n };\n if (input.root) {\n place(input.root, input.rect, 'root');\n }\n return { groups, boundaries, regions };\n}\n\nfunction boundary(input: {\n node: WorkspaceSplit;\n rect: Rect;\n path: string;\n index: number;\n offset: number;\n sizes: number[];\n minima: number[];\n policy: PlacementInput['policy'];\n gap: number;\n}): WorkspaceBoundary {\n const { node, rect, path, index, offset, sizes, minima, policy } = input;\n const horizontal = node.axis === 'horizontal';\n const after = policy === 'stop' ? [index + 1] : sizes.map((_, i) => i).slice(index + 1);\n const before = policy === 'stop' ? [index] : sizes.map((_, i) => i).slice(0, index + 1);\n const prefix = sizes.slice(0, index + 1).reduce((a, b) => a + b, 0);\n const total = sizes.reduce((a, b) => a + b, 0);\n const negative = before.reduce((sum, i) => sum + sizes[i]! - minima[i]!, 0);\n const positive = after.reduce((sum, i) => sum + sizes[i]! - minima[i]!, 0);\n return {\n key: `${path}:${index}`,\n branch: node,\n index,\n rect: horizontal\n ? { x: rect.x + offset, y: rect.y, width: input.gap, height: rect.height }\n : { x: rect.x, y: rect.y + offset, width: rect.width, height: input.gap },\n sizes,\n minima,\n value: horizontal ? prefix : total - prefix,\n min: horizontal ? prefix - negative : total - prefix - positive,\n max: horizontal ? prefix + positive : total - prefix + negative\n };\n}\n"],"mappings":";;AA0CA,SAAgBA,EAAkB,GAAuB;CACvD,IAAMC,IAAiC,CAAC,GAClCC,IAAmC,CAAC,GACpCC,IAAkC,CAAC,GACnCC,KAAS,GAAqB,GAAY,MAAiB;EAE/D,IADAF,EAAQ,KAAK;GAAE,KAAKG;GAAM;GAAM;EAAK,CAAC,GAClCC,EAAK,SAAS,SAAS;GACzB,EAAO,KAAK;IAAE,KAAKD;IAAM,OAAOC;IAAM;GAAK,CAAC;GAC5C;EACF;EACA,IAAMC,IAAaD,EAAK,SAAS,cAC3BE,IAASF,EAAK,SAAS,KAAI,MAASG,EAAM,QAAQC,CAAK,CAAC,CAACH,IAAa,UAAU,SAAS,GACzFI,IAAQC,EACZN,EAAK,SACLE,IACCD,IAAaM,EAAK,QAAQA,EAAK,UAAUJ,EAAM,OAAOH,EAAK,SAAS,SAAS,EAChF,GACIQ,IAAS;EACb,EAAK,SAAS,SAAS,GAAO,MAAU;GACtC,IAAMC,IAAOJ,EAAMK;GAOnB,AANAZ,EACEM,GACAH,IAAa;IAAE,GAAGM;IAAM,GAAGA,EAAK,IAAIC;IAAQ,OAAOC;GAAK,IAAI;IAAE,GAAGF;IAAM,GAAGA,EAAK,IAAIC;IAAQ,QAAQC;GAAK,GACxG,GAAGV,EAAK,GAAGW,GACb,GACA,KAAUD,GACNC,IAAQV,EAAK,SAAS,SAAS,MACjCH,EAAW,KACTc,EAAS;IAAE;IAAM;IAAM;IAAM;IAAO;IAAQ;IAAO;IAAQ,QAAQR,EAAM;IAAQ,KAAKA,EAAM;GAAI,CAAC,CACnG,GACA,KAAUA,EAAM;EAEpB,CAAC;CACH;CAIA,OAHIA,EAAM,QACRL,EAAMK,EAAM,MAAMA,EAAM,MAAM,MAAM,GAE/B;EAAE;EAAQ;EAAY;CAAQ;AACvC;AAEA,SAASQ,EAAS,GAUI;CACpB,IAAM,EAAE,SAAM,SAAM,SAAM,UAAO,WAAQ,UAAO,WAAQ,cAAWR,GAC7DF,IAAaD,EAAK,SAAS,cAC3BY,IAAQC,MAAW,SAAS,CAACH,IAAQ,CAAC,IAAIL,EAAM,KAAK,GAAG,MAAMS,CAAC,CAAC,CAAC,MAAMJ,IAAQ,CAAC,GAChFK,IAASF,MAAW,SAAS,CAACH,CAAK,IAAIL,EAAM,KAAK,GAAG,MAAMS,CAAC,CAAC,CAAC,MAAM,GAAGJ,IAAQ,CAAC,GAChFM,IAASX,EAAM,MAAM,GAAGK,IAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAMO,IAAIC,GAAG,CAAC,GAC5DC,IAAQd,EAAM,QAAQ,GAAG,MAAMY,IAAIC,GAAG,CAAC,GACvCE,IAAWL,EAAO,QAAQ,GAAK,MAAMM,IAAMhB,EAAMS,KAAMZ,EAAOY,IAAK,CAAC,GACpEQ,IAAWV,EAAM,QAAQ,GAAK,MAAMS,IAAMhB,EAAMS,KAAMZ,EAAOY,IAAK,CAAC;CACzE,OAAO;EACL,KAAK,GAAGf,EAAK,GAAGW;EAChB,QAAQV;EACR;EACA,MAAMC,IACF;GAAE,GAAGM,EAAK,IAAIC;GAAQ,GAAGD,EAAK;GAAG,OAAOJ,EAAM;GAAK,QAAQI,EAAK;EAAO,IACvE;GAAE,GAAGA,EAAK;GAAG,GAAGA,EAAK,IAAIC;GAAQ,OAAOD,EAAK;GAAO,QAAQJ,EAAM;EAAI;EAC1E;EACA;EACA,OAAOF,IAAae,IAASG,IAAQH;EACrC,KAAKf,IAAae,IAASI,IAAWD,IAAQH,IAASM;EACvD,KAAKrB,IAAae,IAASM,IAAWH,IAAQH,IAASI;CACzD;AACF"}
1
+ {"version":3,"file":"allocation.utils.js","names":["allocateWorkspace","groups","regions","boundaries","place","path","node","horizontal","minima","input","child","sizes","fitSizes","rect","total","sum","size","prefix","offset","index","boundary","after","policy","i","negative","positive"],"sources":["../../../../src/workspace/utils/geometry/allocation.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 { fitSizes } from './partition.utils.js';\n\nimport type { WorkspaceGroup, WorkspaceNode, WorkspaceSplit } from '../model/layout.utils.js';\n\nexport interface WorkspacePlacedGroup {\n key: string;\n group: WorkspaceGroup;\n rect: Rect;\n}\n\nexport interface WorkspacePlacedRegion {\n key: string;\n node: WorkspaceNode;\n rect: Rect;\n}\n\nexport interface WorkspaceBoundary {\n key: string;\n branch: WorkspaceSplit;\n index: number;\n rect: Rect;\n sizes: number[];\n minima: number[];\n value: number;\n min: number;\n max: number;\n}\n\ninterface PlacementInput {\n root: WorkspaceNode | null;\n rect: Rect;\n minimum: (node: WorkspaceNode) => { width: number; height: number };\n policy: 'stop' | 'propagate';\n gap: number;\n}\n\n/** Allocates geometry without configuring or moving application panels. */\n// eslint-disable-next-line max-lines-per-function -- Keep recursive placement and its output collections together.\nexport function allocateWorkspace(input: PlacementInput) {\n const groups: WorkspacePlacedGroup[] = [];\n const regions: WorkspacePlacedRegion[] = [];\n const boundaries: WorkspaceBoundary[] = [];\n const place = (node: WorkspaceNode, rect: Rect, path: string) => {\n regions.push({ key: path, node, rect });\n if (node.type === 'group') {\n groups.push({ key: path, group: node, rect });\n return;\n }\n const horizontal = node.axis === 'horizontal';\n const minima = node.children.map(child => input.minimum(child)[horizontal ? 'width' : 'height']);\n const sizes = fitSizes(\n node.weights,\n minima,\n (horizontal ? rect.width : rect.height) - input.gap * (node.children.length - 1)\n );\n const total = sizes.reduce((sum, size) => sum + size, 0);\n let prefix = 0;\n let offset = 0;\n node.children.forEach((child, index) => {\n const size = sizes[index]!;\n place(\n child,\n horizontal ? { ...rect, x: rect.x + offset, width: size } : { ...rect, y: rect.y + offset, height: size },\n `${path}.${index}`\n );\n offset += size;\n if (index < node.children.length - 1) {\n prefix += size;\n boundaries.push(\n boundary({\n node,\n rect,\n path,\n index,\n offset,\n prefix,\n total,\n sizes,\n minima,\n policy: input.policy,\n gap: input.gap\n })\n );\n offset += input.gap;\n }\n });\n };\n if (input.root) {\n place(input.root, input.rect, 'root');\n }\n return { groups, boundaries, regions };\n}\n\nfunction boundary(input: {\n node: WorkspaceSplit;\n rect: Rect;\n path: string;\n index: number;\n offset: number;\n prefix: number;\n total: number;\n sizes: number[];\n minima: number[];\n policy: PlacementInput['policy'];\n gap: number;\n}): WorkspaceBoundary {\n const { node, rect, path, index, offset, prefix, total, sizes, minima, policy } = input;\n const horizontal = node.axis === 'horizontal';\n const after = policy === 'stop' ? [index + 1] : sizes.map((_, i) => i).slice(index + 1);\n const before = policy === 'stop' ? [index] : sizes.map((_, i) => i).slice(0, index + 1);\n const negative = before.reduce((sum, i) => sum + sizes[i]! - minima[i]!, 0);\n const positive = after.reduce((sum, i) => sum + sizes[i]! - minima[i]!, 0);\n return {\n key: `${path}:${index}`,\n branch: node,\n index,\n rect: horizontal\n ? { x: rect.x + offset, y: rect.y, width: input.gap, height: rect.height }\n : { x: rect.x, y: rect.y + offset, width: rect.width, height: input.gap },\n sizes,\n minima,\n value: horizontal ? prefix : total - prefix,\n min: horizontal ? prefix - negative : total - prefix - positive,\n max: horizontal ? prefix + positive : total - prefix + negative\n };\n}\n"],"mappings":";;AA2CA,SAAgBA,EAAkB,GAAuB;CACvD,IAAMC,IAAiC,CAAC,GAClCC,IAAmC,CAAC,GACpCC,IAAkC,CAAC,GACnCC,KAAS,GAAqB,GAAY,MAAiB;EAE/D,IADAF,EAAQ,KAAK;GAAE,KAAKG;GAAM;GAAM;EAAK,CAAC,GAClCC,EAAK,SAAS,SAAS;GACzB,EAAO,KAAK;IAAE,KAAKD;IAAM,OAAOC;IAAM;GAAK,CAAC;GAC5C;EACF;EACA,IAAMC,IAAaD,EAAK,SAAS,cAC3BE,IAASF,EAAK,SAAS,KAAI,MAASG,EAAM,QAAQC,CAAK,CAAC,CAACH,IAAa,UAAU,SAAS,GACzFI,IAAQC,EACZN,EAAK,SACLE,IACCD,IAAaM,EAAK,QAAQA,EAAK,UAAUJ,EAAM,OAAOH,EAAK,SAAS,SAAS,EAChF,GACMQ,IAAQH,EAAM,QAAQ,GAAK,MAASI,IAAMC,GAAM,CAAC,GACnDC,IAAS,GACTC,IAAS;EACb,EAAK,SAAS,SAAS,GAAO,MAAU;GACtC,IAAMF,IAAOL,EAAMQ;GAOnB,AANAf,EACEM,GACAH,IAAa;IAAE,GAAGM;IAAM,GAAGA,EAAK,IAAIK;IAAQ,OAAOF;GAAK,IAAI;IAAE,GAAGH;IAAM,GAAGA,EAAK,IAAIK;IAAQ,QAAQF;GAAK,GACxG,GAAGX,EAAK,GAAGc,GACb,GACA,KAAUH,GACNG,IAAQb,EAAK,SAAS,SAAS,MACjC,KAAUU,GACVb,EAAW,KACTiB,EAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,QAAQX,EAAM;IACd,KAAKA,EAAM;GACb,CAAC,CACH,GACA,KAAUA,EAAM;EAEpB,CAAC;CACH;CAIA,OAHIA,EAAM,QACRL,EAAMK,EAAM,MAAMA,EAAM,MAAM,MAAM,GAE/B;EAAE;EAAQ;EAAY;CAAQ;AACvC;AAEA,SAASW,EAAS,GAYI;CACpB,IAAM,EAAE,SAAM,SAAM,SAAM,UAAO,WAAQ,WAAQ,UAAO,UAAO,WAAQ,cAAWX,GAC5EF,IAAaD,EAAK,SAAS,cAC3Be,IAAQC,MAAW,SAAS,CAACH,IAAQ,CAAC,IAAIR,EAAM,KAAK,GAAG,MAAMY,CAAC,CAAC,CAAC,MAAMJ,IAAQ,CAAC,GAEhFK,KADSF,MAAW,SAAS,CAACH,CAAK,IAAIR,EAAM,KAAK,GAAG,MAAMY,CAAC,CAAC,CAAC,MAAM,GAAGJ,IAAQ,CAAC,EAAA,CAC9D,QAAQ,GAAK,MAAMJ,IAAMJ,EAAMY,KAAMf,EAAOe,IAAK,CAAC,GACpEE,IAAWJ,EAAM,QAAQ,GAAK,MAAMN,IAAMJ,EAAMY,KAAMf,EAAOe,IAAK,CAAC;CACzE,OAAO;EACL,KAAK,GAAGlB,EAAK,GAAGc;EAChB,QAAQb;EACR;EACA,MAAMC,IACF;GAAE,GAAGM,EAAK,IAAIK;GAAQ,GAAGL,EAAK;GAAG,OAAOJ,EAAM;GAAK,QAAQI,EAAK;EAAO,IACvE;GAAE,GAAGA,EAAK;GAAG,GAAGA,EAAK,IAAIK;GAAQ,OAAOL,EAAK;GAAO,QAAQJ,EAAM;EAAI;EAC1E;EACA;EACA,OAAOF,IAAaU,IAASH,IAAQG;EACrC,KAAKV,IAAaU,IAASO,IAAWV,IAAQG,IAASQ;EACvD,KAAKlB,IAAaU,IAASQ,IAAWX,IAAQG,IAASO;CACzD;AACF"}
@@ -5,6 +5,8 @@ export interface WorkspaceRequirements {
5
5
  panels: ReadonlyMap<string, Dimensions>;
6
6
  chrome: Dimensions;
7
7
  }
8
+ export declare function sameWorkspaceRequirements(left: WorkspaceRequirements, right: WorkspaceRequirements): boolean;
9
+ export declare function snapshotWorkspaceRequirements(requirements: WorkspaceRequirements): WorkspaceRequirements;
8
10
  /** Combines explicit panel requirements with one operable header, independent of tab count. */
9
11
  export declare function getMinimumWorkspaceDimensions(node: WorkspaceNode | null, requirements: WorkspaceRequirements): Dimensions;
10
12
  /** Admits a change when it does not increase minimum overflow on either axis. */
@@ -1,30 +1,50 @@
1
1
  // src/workspace/utils/geometry/sizing.utils.ts
2
- function e(t, n) {
3
- if (!t) return {
2
+ function e(e, t) {
3
+ if (e.gap !== t.gap || e.chrome.width !== t.chrome.width || e.chrome.height !== t.chrome.height || e.panels.size !== t.panels.size) return !1;
4
+ for (let [n, r] of e.panels) {
5
+ let e = t.panels.get(n);
6
+ if (!e || r.width !== e.width || r.height !== e.height) return !1;
7
+ }
8
+ return !0;
9
+ }
10
+ function t(e) {
11
+ return {
12
+ gap: e.gap,
13
+ chrome: { ...e.chrome },
14
+ panels: new Map([...e.panels].map(([e, t]) => [e, { ...t }]))
15
+ };
16
+ }
17
+ function n(e, t) {
18
+ if (!e) return {
4
19
  width: 0,
5
20
  height: 0
6
21
  };
7
- if (t.type === "group") {
8
- let e = t.panels.flatMap((e) => {
9
- let t = n.panels.get(e);
10
- return t ? [t] : [];
11
- });
22
+ if (e.type === "group") {
23
+ let n = t.chrome.width, r = t.chrome.height;
24
+ for (let i of e.panels) {
25
+ let e = t.panels.get(i);
26
+ e && (n = Math.max(n, e.width), r = Math.max(r, e.height));
27
+ }
12
28
  return {
13
- width: Math.max(n.chrome.width, ...e.map((e) => e.width)),
14
- height: Math.max(n.chrome.height, ...e.map((e) => e.height))
29
+ width: n,
30
+ height: r
15
31
  };
16
32
  }
17
- let r = t.children.map((t) => e(t, n)), i = n.gap * (r.length - 1);
33
+ let r = e.axis === "horizontal", i = t.gap * (e.children.length - 1), a = r ? i : -Infinity, o = r ? -Infinity : i;
34
+ for (let i of e.children) {
35
+ let e = n(i, t);
36
+ a = r ? a + e.width : Math.max(a, e.width), o = r ? Math.max(o, e.height) : o + e.height;
37
+ }
18
38
  return {
19
- width: t.axis === "horizontal" ? r.reduce((e, t) => e + t.width, i) : Math.max(...r.map((e) => e.width)),
20
- height: t.axis === "vertical" ? r.reduce((e, t) => e + t.height, i) : Math.max(...r.map((e) => e.height))
39
+ width: a,
40
+ height: o
21
41
  };
22
42
  }
23
- function t(t) {
24
- let n = e(t.current, t.requirements), r = e(t.candidate, t.requirements);
25
- return ["width", "height"].every((e) => Math.max(0, r[e] - t.viewport[e]) <= Math.max(0, n[e] - t.viewport[e]));
43
+ function r(e) {
44
+ let t = n(e.current, e.requirements), r = n(e.candidate, e.requirements);
45
+ return ["width", "height"].every((n) => Math.max(0, r[n] - e.viewport[n]) <= Math.max(0, t[n] - e.viewport[n]));
26
46
  }
27
- function n(e) {
47
+ function i(e) {
28
48
  return {
29
49
  gap: e.measurements.gap,
30
50
  chrome: {
@@ -37,6 +57,6 @@ function n(e) {
37
57
  }]))
38
58
  };
39
59
  }
40
- export { t as admitsWorkspaceMove, e as getMinimumWorkspaceDimensions, n as getWorkspaceRequirements };
60
+ export { r as admitsWorkspaceMove, n as getMinimumWorkspaceDimensions, i as getWorkspaceRequirements, e as sameWorkspaceRequirements, t as snapshotWorkspaceRequirements };
41
61
 
42
62
  //# sourceMappingURL=sizing.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sizing.utils.js","names":["getMinimumWorkspaceDimensions","node","panels","panel","requirements","id","children","child","gap","sum","admitsWorkspaceMove","current","input","candidate","axis","getWorkspaceRequirements"],"sources":["../../../../src/workspace/utils/geometry/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 { Dimensions } from '@nvidia-elements/core/internal';\n\nimport type { WorkspaceNode } from '../model/layout.utils.js';\n\nexport interface WorkspaceRequirements {\n gap: number;\n panels: ReadonlyMap<string, Dimensions>;\n chrome: Dimensions;\n}\n\n/** Combines explicit panel requirements with one operable header, independent of tab count. */\nexport function getMinimumWorkspaceDimensions(\n node: WorkspaceNode | null,\n requirements: WorkspaceRequirements\n): Dimensions {\n if (!node) return { width: 0, height: 0 };\n if (node.type === 'group') {\n const panels = node.panels.flatMap(id => {\n const panel = requirements.panels.get(id);\n return panel ? [panel] : [];\n });\n return {\n width: Math.max(requirements.chrome.width, ...panels.map(panel => panel.width)),\n height: Math.max(requirements.chrome.height, ...panels.map(panel => panel.height))\n };\n }\n const children = node.children.map(child => getMinimumWorkspaceDimensions(child, requirements));\n const gap = requirements.gap * (children.length - 1);\n return {\n width:\n node.axis === 'horizontal'\n ? children.reduce((sum, child) => sum + child.width, gap)\n : Math.max(...children.map(child => child.width)),\n height:\n node.axis === 'vertical'\n ? children.reduce((sum, child) => sum + child.height, gap)\n : Math.max(...children.map(child => child.height))\n };\n}\n\n/** Admits a change when it does not increase minimum overflow on either axis. */\nexport function admitsWorkspaceMove(input: {\n current: WorkspaceNode | null;\n candidate: WorkspaceNode | null;\n viewport: Dimensions;\n requirements: WorkspaceRequirements;\n}) {\n const current = getMinimumWorkspaceDimensions(input.current, input.requirements);\n const candidate = getMinimumWorkspaceDimensions(input.candidate, input.requirements);\n return (['width', 'height'] as const).every(\n axis => Math.max(0, candidate[axis] - input.viewport[axis]) <= Math.max(0, current[axis] - input.viewport[axis])\n );\n}\n\n/** Reads supplied panel constraints without changing the conservative operable-header floor. */\nexport function getWorkspaceRequirements(input: {\n measurements: {\n gap: number;\n gripWidth: number;\n tabWidth: number;\n groupActionWidth?: number;\n headerHeight: number;\n panels?: Record<string, { suffixWidth: number; footerHeight: number }>;\n };\n panels: { id: string; minWidth: number; minHeight: number }[];\n}): WorkspaceRequirements {\n return {\n gap: input.measurements.gap,\n chrome: {\n width: input.measurements.gripWidth + input.measurements.tabWidth + (input.measurements.groupActionWidth ?? 0),\n height: input.measurements.headerHeight\n },\n panels: new Map(\n input.panels.map(panel => [\n panel.id,\n {\n width: Math.max(\n Number.isFinite(panel.minWidth) ? Math.max(0, panel.minWidth) : 0,\n input.measurements.gripWidth +\n input.measurements.tabWidth +\n (input.measurements.groupActionWidth ?? 0) +\n (input.measurements.panels?.[panel.id]?.suffixWidth ?? 0)\n ),\n height: Math.max(\n Number.isFinite(panel.minHeight) ? Math.max(0, panel.minHeight) : 0,\n input.measurements.headerHeight + (input.measurements.panels?.[panel.id]?.footerHeight ?? 0)\n )\n }\n ])\n )\n };\n}\n"],"mappings":";AAcA,SAAgBA,EACd,GACA,GACY;CACZ,IAAI,CAACC,GAAM,OAAO;EAAE,OAAO;EAAG,QAAQ;CAAE;CACxC,IAAIA,EAAK,SAAS,SAAS;EACzB,IAAMC,IAASD,EAAK,OAAO,SAAQ,MAAM;GACvC,IAAME,IAAQC,EAAa,OAAO,IAAIC,CAAE;GACxC,OAAOF,IAAQ,CAACA,CAAK,IAAI,CAAC;EAC5B,CAAC;EACD,OAAO;GACL,OAAO,KAAK,IAAIC,EAAa,OAAO,OAAO,GAAGF,EAAO,KAAI,MAASC,EAAM,KAAK,CAAC;GAC9E,QAAQ,KAAK,IAAIC,EAAa,OAAO,QAAQ,GAAGF,EAAO,KAAI,MAASC,EAAM,MAAM,CAAC;EACnF;CACF;CACA,IAAMG,IAAWL,EAAK,SAAS,KAAI,MAASD,EAA8BO,GAAOH,CAAY,CAAC,GACxFI,IAAMJ,EAAa,OAAOE,EAAS,SAAS;CAClD,OAAO;EACL,OACEL,EAAK,SAAS,eACVK,EAAS,QAAQ,GAAK,MAAUG,IAAMF,EAAM,OAAOC,CAAG,IACtD,KAAK,IAAI,GAAGF,EAAS,KAAI,MAASC,EAAM,KAAK,CAAC;EACpD,QACEN,EAAK,SAAS,aACVK,EAAS,QAAQ,GAAK,MAAUG,IAAMF,EAAM,QAAQC,CAAG,IACvD,KAAK,IAAI,GAAGF,EAAS,KAAI,MAASC,EAAM,MAAM,CAAC;CACvD;AACF;AAGA,SAAgBG,EAAoB,GAKjC;CACD,IAAMC,IAAUX,EAA8BY,EAAM,SAASA,EAAM,YAAY,GACzEC,IAAYb,EAA8BY,EAAM,WAAWA,EAAM,YAAY;CACnF,OAAQ,CAAC,SAAS,QAAQ,CAAC,CAAW,OACpC,MAAQ,KAAK,IAAI,GAAGC,EAAUC,KAAQF,EAAM,SAASE,EAAK,KAAK,KAAK,IAAI,GAAGH,EAAQG,KAAQF,EAAM,SAASE,EAAK,CACjH;AACF;AAGA,SAAgBC,EAAyB,GAUf;CACxB,OAAO;EACL,KAAKH,EAAM,aAAa;EACxB,QAAQ;GACN,OAAOA,EAAM,aAAa,YAAYA,EAAM,aAAa,YAAYA,EAAM,aAAa,oBAAoB;GAC5G,QAAQA,EAAM,aAAa;EAC7B;EACA,QAAQ,IAAI,IACVA,EAAM,OAAO,KAAI,MAAS,CACxBT,EAAM,IACN;GACE,OAAO,KAAK,IACV,OAAO,SAASA,EAAM,QAAQ,IAAI,KAAK,IAAI,GAAGA,EAAM,QAAQ,IAAI,GAChES,EAAM,aAAa,YACjBA,EAAM,aAAa,YAClBA,EAAM,aAAa,oBAAoB,MACvCA,EAAM,aAAa,SAAST,EAAM,GAAG,EAAE,eAAe,EAC3D;GACA,QAAQ,KAAK,IACX,OAAO,SAASA,EAAM,SAAS,IAAI,KAAK,IAAI,GAAGA,EAAM,SAAS,IAAI,GAClES,EAAM,aAAa,gBAAgBA,EAAM,aAAa,SAAST,EAAM,GAAG,EAAE,gBAAgB,EAC5F;EACF,CACF,CAAC,CACH;CACF;AACF"}
1
+ {"version":3,"file":"sizing.utils.js","names":["sameWorkspaceRequirements","left","right","id","dimensions","other","snapshotWorkspaceRequirements","requirements","getMinimumWorkspaceDimensions","node","width","height","panel","horizontal","gap","child","minimum","admitsWorkspaceMove","current","input","candidate","axis","getWorkspaceRequirements"],"sources":["../../../../src/workspace/utils/geometry/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 { Dimensions } from '@nvidia-elements/core/internal';\n\nimport type { WorkspaceNode } from '../model/layout.utils.js';\n\nexport interface WorkspaceRequirements {\n gap: number;\n panels: ReadonlyMap<string, Dimensions>;\n chrome: Dimensions;\n}\n\nexport function sameWorkspaceRequirements(left: WorkspaceRequirements, right: WorkspaceRequirements) {\n if (\n left.gap !== right.gap ||\n left.chrome.width !== right.chrome.width ||\n left.chrome.height !== right.chrome.height ||\n left.panels.size !== right.panels.size\n )\n return false;\n for (const [id, dimensions] of left.panels) {\n const other = right.panels.get(id);\n if (!other || dimensions.width !== other.width || dimensions.height !== other.height) return false;\n }\n return true;\n}\n\nexport function snapshotWorkspaceRequirements(requirements: WorkspaceRequirements): WorkspaceRequirements {\n return {\n gap: requirements.gap,\n chrome: { ...requirements.chrome },\n panels: new Map([...requirements.panels].map(([id, dimensions]) => [id, { ...dimensions }]))\n };\n}\n\n/** Combines explicit panel requirements with one operable header, independent of tab count. */\n// eslint-disable-next-line max-statements -- Accumulate dimensions directly without intermediate arrays.\nexport function getMinimumWorkspaceDimensions(\n node: WorkspaceNode | null,\n requirements: WorkspaceRequirements\n): Dimensions {\n if (!node) return { width: 0, height: 0 };\n if (node.type === 'group') {\n let width = requirements.chrome.width;\n let height = requirements.chrome.height;\n for (const id of node.panels) {\n const panel = requirements.panels.get(id);\n if (!panel) continue;\n width = Math.max(width, panel.width);\n height = Math.max(height, panel.height);\n }\n return { width, height };\n }\n const horizontal = node.axis === 'horizontal';\n const gap = requirements.gap * (node.children.length - 1);\n let width = horizontal ? gap : -Infinity;\n let height = horizontal ? -Infinity : gap;\n for (const child of node.children) {\n const minimum = getMinimumWorkspaceDimensions(child, requirements);\n width = horizontal ? width + minimum.width : Math.max(width, minimum.width);\n height = horizontal ? Math.max(height, minimum.height) : height + minimum.height;\n }\n return { width, height };\n}\n\n/** Admits a change when it does not increase minimum overflow on either axis. */\nexport function admitsWorkspaceMove(input: {\n current: WorkspaceNode | null;\n candidate: WorkspaceNode | null;\n viewport: Dimensions;\n requirements: WorkspaceRequirements;\n}) {\n const current = getMinimumWorkspaceDimensions(input.current, input.requirements);\n const candidate = getMinimumWorkspaceDimensions(input.candidate, input.requirements);\n return (['width', 'height'] as const).every(\n axis => Math.max(0, candidate[axis] - input.viewport[axis]) <= Math.max(0, current[axis] - input.viewport[axis])\n );\n}\n\n/** Reads supplied panel constraints without changing the conservative operable-header floor. */\nexport function getWorkspaceRequirements(input: {\n measurements: {\n gap: number;\n gripWidth: number;\n tabWidth: number;\n groupActionWidth?: number;\n headerHeight: number;\n panels?: Record<string, { suffixWidth: number; footerHeight: number }>;\n };\n panels: { id: string; minWidth: number; minHeight: number }[];\n}): WorkspaceRequirements {\n return {\n gap: input.measurements.gap,\n chrome: {\n width: input.measurements.gripWidth + input.measurements.tabWidth + (input.measurements.groupActionWidth ?? 0),\n height: input.measurements.headerHeight\n },\n panels: new Map(\n input.panels.map(panel => [\n panel.id,\n {\n width: Math.max(\n Number.isFinite(panel.minWidth) ? Math.max(0, panel.minWidth) : 0,\n input.measurements.gripWidth +\n input.measurements.tabWidth +\n (input.measurements.groupActionWidth ?? 0) +\n (input.measurements.panels?.[panel.id]?.suffixWidth ?? 0)\n ),\n height: Math.max(\n Number.isFinite(panel.minHeight) ? Math.max(0, panel.minHeight) : 0,\n input.measurements.headerHeight + (input.measurements.panels?.[panel.id]?.footerHeight ?? 0)\n )\n }\n ])\n )\n };\n}\n"],"mappings":"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"}
@@ -17,7 +17,7 @@ export declare function getBoundaryPlacementOffers(input: BoundaryInput): {
17
17
  kind: 'order' | 'insert';
18
18
  owner: string;
19
19
  boundary?: 'start' | 'end';
20
- scope: NonNullable<ReturnType<typeof import("../placement/group-insertion.utils.js").describePlacementSlot>>;
20
+ insertion: import("../placement/group-insertion.utils.js").GroupInsertion;
21
21
  plan: import("../placement/planner.utils.js").WorkspacePlacementPlan;
22
22
  hitRect?: Rect;
23
23
  scopeRect: Rect;
@@ -28,7 +28,7 @@ export declare function getBoundaryPlacementOffers(input: BoundaryInput): {
28
28
  kind: 'order' | 'insert';
29
29
  owner: string;
30
30
  boundary?: 'start' | 'end';
31
- scope: NonNullable<ReturnType<typeof import("../placement/group-insertion.utils.js").describePlacementSlot>>;
31
+ insertion: import("../placement/group-insertion.utils.js").GroupInsertion;
32
32
  plan: import("../placement/planner.utils.js").WorkspacePlacementPlan;
33
33
  hitRect?: Rect;
34
34
  scopeRect: Rect;
@@ -20,7 +20,7 @@ function i(e) {
20
20
  });
21
21
  return {
22
22
  offers: [...h, ...m],
23
- hit: p ? h.find((e) => e.scope.key === p.scope.key) : void 0
23
+ hit: p ? h.find((e) => e.insertion.key === p.insertion.key) : void 0
24
24
  };
25
25
  }
26
26
  function a(e, t) {
@@ -37,7 +37,7 @@ function a(e, t) {
37
37
  };
38
38
  }
39
39
  function o({ input: t, roots: r, offer: i }) {
40
- let a = t.offers.find((e) => e.scope.key === i.scope.key), o = t.geometry ? e(a, t.geometry) ?? a.rect : a.rect, s = i.destination.position, c = s === "left" || s === "right", d = { ...i.rect };
40
+ let a = t.offers.find((e) => e.insertion.key === i.insertion.key), o = t.geometry ? e(a, t.geometry) ?? a.rect : a.rect, s = i.destination.position, c = s === "left" || s === "right", d = { ...i.rect };
41
41
  return r.some((e) => e.destination.position === s) && l(d, t.bounds, s) && (c ? d.x += s === "left" ? 6 : -6 : d.y += s === "top" ? 6 : -6), n(i) ? [{
42
42
  ...i,
43
43
  rect: a.rect,
@@ -1 +1 @@
1
- {"version":3,"file":"boundary.utils.js","names":["sides","getBoundaryPlacementOffers","input","roots","offers","offer","side","getBoundarySide","bounds","point","current","root","hit","edgeDistances","local","partitionPlacementOffers","localGeometry","painted","rect","boundaryPaint","paint","original","paintRect","getCurrentInsertionSeam","position","vertical","touches","placementOwnsChrome","protectChrome","distances","minimum","tied","fragments","header","headers","subtractHeaderFromFragment","fragment","start","extent","before","after"],"sources":["../../../../src/workspace/utils/interaction/boundary.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 { getCurrentInsertionSeam, partitionPlacementOffers, placementOwnsChrome } from './insertion-offers.utils.js';\n\nimport type { WorkspaceDropIntent } from './drag-preview.utils.js';\nimport type { WorkspaceInsertionOffer } from './insertion-offers.utils.js';\n\ntype Side = 'left' | 'right' | 'top' | 'bottom';\n\nconst sides: Side[] = ['left', 'right', 'top', 'bottom'];\n\ninterface BoundaryInput {\n offers: WorkspaceInsertionOffer[];\n bounds: Rect;\n point: Point;\n current?: WorkspaceDropIntent;\n headers: Rect[];\n geometry?: Parameters<typeof getCurrentInsertionSeam>[1];\n}\n\n/** Separates a mathematical boundary selection from its clipped, inward-only cue. */\nexport function getBoundaryPlacementOffers(input: BoundaryInput) {\n const { offers, bounds, point, current } = input;\n const roots = offers.filter(offer => offer.owner === 'root' && offer.boundary);\n const side = getBoundarySide(\n bounds,\n point,\n current && current.kind !== 'invalid' && current.kind !== 'tab' ? current.destination.position : undefined\n );\n const root = roots.find(offer => offer.destination.position === side);\n const hit = root && edgeDistances(bounds, point)[side] <= 6 ? root : undefined;\n const local = partitionPlacementOffers(offers.filter(offer => !roots.includes(offer))).flatMap(offer =>\n localGeometry({ input, roots, offer })\n );\n const painted = roots\n .filter(offer => offer.destination.position === side)\n .flatMap(offer => {\n const rect = boundaryPaint(bounds, side);\n return rect.width && rect.height ? [{ ...offer, rect }] : [];\n });\n return {\n offers: [...painted, ...local],\n hit: hit ? painted.find(offer => offer.scope.key === hit.scope.key) : undefined\n };\n}\n\nfunction boundaryPaint(bounds: Rect, side: Side): Rect {\n if (side === 'left' || side === 'right') {\n const x = side === 'left' ? bounds.x : bounds.x + bounds.width - 6;\n return { x, y: bounds.y, width: 6, height: bounds.height };\n }\n\n const x = bounds.x;\n const y = side === 'top' ? bounds.y : bounds.y + bounds.height - 6;\n return { x, y, width: bounds.width, height: 6 };\n}\n\nfunction localGeometry({\n input,\n roots,\n offer\n}: {\n input: BoundaryInput;\n roots: WorkspaceInsertionOffer[];\n offer: WorkspaceInsertionOffer;\n}) {\n const paint = input.offers.find(original => original.scope.key === offer.scope.key)!;\n const paintRect = input.geometry ? (getCurrentInsertionSeam(paint, input.geometry) ?? paint.rect) : paint.rect;\n const position = offer.destination.position;\n const vertical = position === 'left' || position === 'right';\n const rect = { ...offer.rect };\n if (roots.some(root => root.destination.position === position) && touches(rect, input.bounds, position)) {\n if (vertical) {\n rect.x += position === 'left' ? 6 : -6;\n } else {\n rect.y += position === 'top' ? 6 : -6;\n }\n }\n if (placementOwnsChrome(offer)) return [{ ...offer, rect: paint.rect, hitRect: rect }];\n return protectChrome(rect, input.headers, vertical).map(hitRect => ({\n ...offer,\n rect: paintRect,\n hitRect\n }));\n}\n\nexport function getBoundarySide(bounds: Rect, point: Point, current?: Side): Side {\n const distances = edgeDistances(bounds, point);\n const minimum = Math.min(...Object.values(distances));\n const tied = sides.filter(side => distances[side] === minimum);\n return current && tied.includes(current) ? current : tied[0]!;\n}\n\nfunction edgeDistances(bounds: Rect, point: Point) {\n return {\n left: point.x - bounds.x,\n right: bounds.x + bounds.width - point.x,\n top: point.y - bounds.y,\n bottom: bounds.y + bounds.height - point.y\n };\n}\n\nfunction touches(rect: Rect, bounds: Rect, side: WorkspaceInsertionOffer['destination']['position']) {\n switch (side) {\n case 'left':\n return Math.abs(rect.x - bounds.x) < 1;\n case 'right':\n return Math.abs(rect.x + rect.width - bounds.x - bounds.width) < 1;\n case 'top':\n return Math.abs(rect.y - bounds.y) < 1;\n case 'bottom':\n case 'tab':\n return Math.abs(rect.y + rect.height - bounds.y - bounds.height) < 1;\n }\n}\n\nfunction protectChrome(rect: Rect, headers: Rect[], vertical = rect.width === 12): Rect[] {\n let fragments = [rect];\n for (const header of headers) {\n fragments = fragments.flatMap(fragment => subtractHeaderFromFragment(fragment, header, vertical));\n }\n return fragments;\n}\n\nfunction subtractHeaderFromFragment(fragment: Rect, header: Rect, vertical: boolean): Rect[] {\n if (\n fragment.x >= header.x + header.width ||\n fragment.x + fragment.width <= header.x ||\n fragment.y >= header.y + header.height ||\n fragment.y + fragment.height <= header.y\n ) {\n return [fragment];\n }\n const start = vertical ? 'y' : 'x';\n const extent = vertical ? 'height' : 'width';\n const before = header[start] - fragment[start];\n const after = fragment[start] + fragment[extent] - header[start] - header[extent];\n const fragments: Rect[] = [];\n if (before > 0) {\n fragments.push({ ...fragment, [extent]: before });\n }\n if (after > 0) {\n fragments.push({ ...fragment, [start]: header[start] + header[extent], [extent]: after });\n }\n return fragments;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"boundary.utils.js","names":["sides","getBoundaryPlacementOffers","input","roots","offers","offer","side","getBoundarySide","bounds","point","current","root","hit","edgeDistances","local","partitionPlacementOffers","localGeometry","painted","rect","boundaryPaint","paint","original","paintRect","getCurrentInsertionSeam","position","vertical","touches","placementOwnsChrome","protectChrome","distances","minimum","tied","fragments","header","headers","subtractHeaderFromFragment","fragment","start","extent","before","after"],"sources":["../../../../src/workspace/utils/interaction/boundary.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 { getCurrentInsertionSeam, partitionPlacementOffers, placementOwnsChrome } from './insertion-offers.utils.js';\n\nimport type { WorkspaceDropIntent } from './drag-preview.utils.js';\nimport type { WorkspaceInsertionOffer } from './insertion-offers.utils.js';\n\ntype Side = 'left' | 'right' | 'top' | 'bottom';\n\nconst sides: Side[] = ['left', 'right', 'top', 'bottom'];\n\ninterface BoundaryInput {\n offers: WorkspaceInsertionOffer[];\n bounds: Rect;\n point: Point;\n current?: WorkspaceDropIntent;\n headers: Rect[];\n geometry?: Parameters<typeof getCurrentInsertionSeam>[1];\n}\n\n/** Separates a mathematical boundary selection from its clipped, inward-only cue. */\nexport function getBoundaryPlacementOffers(input: BoundaryInput) {\n const { offers, bounds, point, current } = input;\n const roots = offers.filter(offer => offer.owner === 'root' && offer.boundary);\n const side = getBoundarySide(\n bounds,\n point,\n current && current.kind !== 'invalid' && current.kind !== 'tab' ? current.destination.position : undefined\n );\n const root = roots.find(offer => offer.destination.position === side);\n const hit = root && edgeDistances(bounds, point)[side] <= 6 ? root : undefined;\n const local = partitionPlacementOffers(offers.filter(offer => !roots.includes(offer))).flatMap(offer =>\n localGeometry({ input, roots, offer })\n );\n const painted = roots\n .filter(offer => offer.destination.position === side)\n .flatMap(offer => {\n const rect = boundaryPaint(bounds, side);\n return rect.width && rect.height ? [{ ...offer, rect }] : [];\n });\n return {\n offers: [...painted, ...local],\n hit: hit ? painted.find(offer => offer.insertion.key === hit.insertion.key) : undefined\n };\n}\n\nfunction boundaryPaint(bounds: Rect, side: Side): Rect {\n if (side === 'left' || side === 'right') {\n const x = side === 'left' ? bounds.x : bounds.x + bounds.width - 6;\n return { x, y: bounds.y, width: 6, height: bounds.height };\n }\n\n const x = bounds.x;\n const y = side === 'top' ? bounds.y : bounds.y + bounds.height - 6;\n return { x, y, width: bounds.width, height: 6 };\n}\n\nfunction localGeometry({\n input,\n roots,\n offer\n}: {\n input: BoundaryInput;\n roots: WorkspaceInsertionOffer[];\n offer: WorkspaceInsertionOffer;\n}) {\n const paint = input.offers.find(original => original.insertion.key === offer.insertion.key)!;\n const paintRect = input.geometry ? (getCurrentInsertionSeam(paint, input.geometry) ?? paint.rect) : paint.rect;\n const position = offer.destination.position;\n const vertical = position === 'left' || position === 'right';\n const rect = { ...offer.rect };\n if (roots.some(root => root.destination.position === position) && touches(rect, input.bounds, position)) {\n if (vertical) {\n rect.x += position === 'left' ? 6 : -6;\n } else {\n rect.y += position === 'top' ? 6 : -6;\n }\n }\n if (placementOwnsChrome(offer)) return [{ ...offer, rect: paint.rect, hitRect: rect }];\n return protectChrome(rect, input.headers, vertical).map(hitRect => ({\n ...offer,\n rect: paintRect,\n hitRect\n }));\n}\n\nexport function getBoundarySide(bounds: Rect, point: Point, current?: Side): Side {\n const distances = edgeDistances(bounds, point);\n const minimum = Math.min(...Object.values(distances));\n const tied = sides.filter(side => distances[side] === minimum);\n return current && tied.includes(current) ? current : tied[0]!;\n}\n\nfunction edgeDistances(bounds: Rect, point: Point) {\n return {\n left: point.x - bounds.x,\n right: bounds.x + bounds.width - point.x,\n top: point.y - bounds.y,\n bottom: bounds.y + bounds.height - point.y\n };\n}\n\nfunction touches(rect: Rect, bounds: Rect, side: WorkspaceInsertionOffer['destination']['position']) {\n switch (side) {\n case 'left':\n return Math.abs(rect.x - bounds.x) < 1;\n case 'right':\n return Math.abs(rect.x + rect.width - bounds.x - bounds.width) < 1;\n case 'top':\n return Math.abs(rect.y - bounds.y) < 1;\n case 'bottom':\n case 'tab':\n return Math.abs(rect.y + rect.height - bounds.y - bounds.height) < 1;\n }\n}\n\nfunction protectChrome(rect: Rect, headers: Rect[], vertical = rect.width === 12): Rect[] {\n let fragments = [rect];\n for (const header of headers) {\n fragments = fragments.flatMap(fragment => subtractHeaderFromFragment(fragment, header, vertical));\n }\n return fragments;\n}\n\nfunction subtractHeaderFromFragment(fragment: Rect, header: Rect, vertical: boolean): Rect[] {\n if (\n fragment.x >= header.x + header.width ||\n fragment.x + fragment.width <= header.x ||\n fragment.y >= header.y + header.height ||\n fragment.y + fragment.height <= header.y\n ) {\n return [fragment];\n }\n const start = vertical ? 'y' : 'x';\n const extent = vertical ? 'height' : 'width';\n const before = header[start] - fragment[start];\n const after = fragment[start] + fragment[extent] - header[start] - header[extent];\n const fragments: Rect[] = [];\n if (before > 0) {\n fragments.push({ ...fragment, [extent]: before });\n }\n if (after > 0) {\n fragments.push({ ...fragment, [start]: header[start] + header[extent], [extent]: after });\n }\n return fragments;\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import type { Point, Rect } from '@nvidia-elements/core/internal';
2
2
  import type { WorkspaceLayout } from '../model/layout.utils.js';
3
3
  import type { WorkspaceDestination } from '../model/operations.utils.js';
4
- import type { WorkspacePlacementContext } from '../placement/context.utils.js';
5
4
  import type { WorkspacePlacementPlan } from '../placement/planner.utils.js';
5
+ import type { WorkspacePlacementScope } from '../placement/scope.utils.js';
6
6
  import type { WorkspaceSeamPreview } from '../presentation/offers.utils.js';
7
7
  type TabDestination = Omit<WorkspaceDestination, 'position'> & {
8
8
  position: 'tab';
@@ -28,7 +28,7 @@ export interface WorkspaceDragCue {
28
28
  }
29
29
  interface PreviewPresentation {
30
30
  seams?: WorkspaceSeamPreview;
31
- context?: WorkspacePlacementContext;
31
+ scope?: WorkspacePlacementScope;
32
32
  source: string[];
33
33
  point?: Point;
34
34
  cue: WorkspaceDragCue;
@@ -50,7 +50,7 @@ export type WorkspaceDragOffer = {
50
50
  cue: WorkspaceDragCue;
51
51
  feasible: boolean;
52
52
  seams?: WorkspaceSeamPreview;
53
- context?: WorkspacePlacementContext;
53
+ scope?: WorkspacePlacementScope;
54
54
  } & WorkspaceDragAllocation;
55
55
  type DetachedPreview = PreviewPresentation & WorkspaceDragAllocation & {
56
56
  phase: 'detached';
@@ -1 +1 @@
1
- {"version":3,"file":"drag-preview.utils.js","names":["clipCue","x","bounds","rect","y","matchesPlacementIntent","a","b"],"sources":["../../../../src/workspace/utils/interaction/drag-preview.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 type { WorkspaceLayout } from '../model/layout.utils.js';\nimport type { WorkspaceDestination } from '../model/operations.utils.js';\nimport type { WorkspacePlacementContext } from '../placement/context.utils.js';\nimport type { WorkspacePlacementPlan } from '../placement/planner.utils.js';\nimport type { WorkspaceSeamPreview } from '../presentation/offers.utils.js';\n\ntype TabDestination = Omit<WorkspaceDestination, 'position'> & { position: 'tab' };\n\ntype SplitDestination = Omit<WorkspaceDestination, 'position'> & {\n position: Exclude<WorkspaceDestination['position'], 'tab'>;\n};\n\nexport type WorkspaceDropIntent =\n | { kind: 'tab'; destination: TabDestination }\n | { kind: 'split' | 'order'; destination: SplitDestination }\n | { kind: 'insert'; destination: SplitDestination }\n | { kind: 'invalid' };\n\nexport interface WorkspaceDragCue {\n rect: Rect;\n kind: 'tab' | 'group';\n}\n\ninterface PreviewPresentation {\n seams?: WorkspaceSeamPreview;\n context?: WorkspacePlacementContext;\n source: string[];\n point?: Point;\n cue: WorkspaceDragCue;\n}\n\ninterface AttachedPreview extends PreviewPresentation {\n phase: 'attached';\n intent: { kind: 'invalid' };\n blocked: false;\n}\n\nexport type WorkspaceDragAllocation =\n | { allocation: 'overlay' | 'committed' }\n | { allocation: 'reserved'; layout: WorkspaceLayout };\n\nexport type WorkspaceDragOffer = {\n cue: WorkspaceDragCue;\n feasible: boolean;\n seams?: WorkspaceSeamPreview;\n context?: WorkspacePlacementContext;\n} & WorkspaceDragAllocation;\n\ntype DetachedPreview = PreviewPresentation &\n WorkspaceDragAllocation & {\n phase: 'detached';\n intent: WorkspaceDropIntent;\n blocked: boolean;\n };\n\nexport type WorkspaceDragPreview =\n | AttachedPreview\n | DetachedPreview\n | (PreviewPresentation &\n WorkspaceDragAllocation & {\n phase: 'returning-attached' | 'returning-detached';\n intent: { kind: 'invalid' };\n blocked: false;\n });\n\nexport interface WorkspacePlacementAcquisition {\n plan: WorkspacePlacementPlan;\n rect: Rect;\n}\n\nexport interface WorkspaceOfferContext {\n selected?: WorkspaceDragPreview;\n acquisition?: WorkspacePlacementAcquisition & { point: Point };\n}\n\nexport function clipCue(rect: Rect, bounds: Rect): Rect {\n const x = Math.max(bounds.x, Math.min(rect.x, bounds.x + bounds.width));\n const y = Math.max(bounds.y, Math.min(rect.y, bounds.y + bounds.height));\n return {\n x,\n y,\n width: Math.max(0, Math.min(rect.x + rect.width, bounds.x + bounds.width) - x),\n height: Math.max(0, Math.min(rect.y + rect.height, bounds.y + bounds.height) - y)\n };\n}\n\nexport function matchesPlacementIntent(a: WorkspaceDropIntent, b: WorkspaceDropIntent) {\n if (a.kind === 'invalid' || b.kind === 'invalid' || a.kind !== b.kind) return false;\n return (\n a.destination.target === b.destination.target &&\n a.destination.region === b.destination.region &&\n a.destination.position === b.destination.position &&\n a.destination.index === b.destination.index\n );\n}\n"],"mappings":";AAgFA,SAAgBA,EAAQ,GAAY,GAAoB;CACtD,IAAMC,IAAI,KAAK,IAAIC,EAAO,GAAG,KAAK,IAAIC,EAAK,GAAGD,EAAO,IAAIA,EAAO,KAAK,CAAC,GAChEE,IAAI,KAAK,IAAIF,EAAO,GAAG,KAAK,IAAIC,EAAK,GAAGD,EAAO,IAAIA,EAAO,MAAM,CAAC;CACvE,OAAO;EACL;EACA;EACA,OAAO,KAAK,IAAI,GAAG,KAAK,IAAIC,EAAK,IAAIA,EAAK,OAAOD,EAAO,IAAIA,EAAO,KAAK,IAAID,CAAC;EAC7E,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAIE,EAAK,IAAIA,EAAK,QAAQD,EAAO,IAAIA,EAAO,MAAM,IAAIE,CAAC;CAClF;AACF;AAEA,SAAgBC,EAAuB,GAAwB,GAAwB;CAErF,OADIC,EAAE,SAAS,aAAaC,EAAE,SAAS,aAAaD,EAAE,SAASC,EAAE,OAAa,KAE5ED,EAAE,YAAY,WAAWC,EAAE,YAAY,UACvCD,EAAE,YAAY,WAAWC,EAAE,YAAY,UACvCD,EAAE,YAAY,aAAaC,EAAE,YAAY,YACzCD,EAAE,YAAY,UAAUC,EAAE,YAAY;AAE1C"}
1
+ {"version":3,"file":"drag-preview.utils.js","names":["clipCue","x","bounds","rect","y","matchesPlacementIntent","a","b"],"sources":["../../../../src/workspace/utils/interaction/drag-preview.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 type { WorkspaceLayout } from '../model/layout.utils.js';\nimport type { WorkspaceDestination } from '../model/operations.utils.js';\nimport type { WorkspacePlacementPlan } from '../placement/planner.utils.js';\nimport type { WorkspacePlacementScope } from '../placement/scope.utils.js';\nimport type { WorkspaceSeamPreview } from '../presentation/offers.utils.js';\n\ntype TabDestination = Omit<WorkspaceDestination, 'position'> & { position: 'tab' };\n\ntype SplitDestination = Omit<WorkspaceDestination, 'position'> & {\n position: Exclude<WorkspaceDestination['position'], 'tab'>;\n};\n\nexport type WorkspaceDropIntent =\n | { kind: 'tab'; destination: TabDestination }\n | { kind: 'split' | 'order'; destination: SplitDestination }\n | { kind: 'insert'; destination: SplitDestination }\n | { kind: 'invalid' };\n\nexport interface WorkspaceDragCue {\n rect: Rect;\n kind: 'tab' | 'group';\n}\n\ninterface PreviewPresentation {\n seams?: WorkspaceSeamPreview;\n scope?: WorkspacePlacementScope;\n source: string[];\n point?: Point;\n cue: WorkspaceDragCue;\n}\n\ninterface AttachedPreview extends PreviewPresentation {\n phase: 'attached';\n intent: { kind: 'invalid' };\n blocked: false;\n}\n\nexport type WorkspaceDragAllocation =\n | { allocation: 'overlay' | 'committed' }\n | { allocation: 'reserved'; layout: WorkspaceLayout };\n\nexport type WorkspaceDragOffer = {\n cue: WorkspaceDragCue;\n feasible: boolean;\n seams?: WorkspaceSeamPreview;\n scope?: WorkspacePlacementScope;\n} & WorkspaceDragAllocation;\n\ntype DetachedPreview = PreviewPresentation &\n WorkspaceDragAllocation & {\n phase: 'detached';\n intent: WorkspaceDropIntent;\n blocked: boolean;\n };\n\nexport type WorkspaceDragPreview =\n | AttachedPreview\n | DetachedPreview\n | (PreviewPresentation &\n WorkspaceDragAllocation & {\n phase: 'returning-attached' | 'returning-detached';\n intent: { kind: 'invalid' };\n blocked: false;\n });\n\nexport interface WorkspacePlacementAcquisition {\n plan: WorkspacePlacementPlan;\n rect: Rect;\n}\n\nexport interface WorkspaceOfferContext {\n selected?: WorkspaceDragPreview;\n acquisition?: WorkspacePlacementAcquisition & { point: Point };\n}\n\nexport function clipCue(rect: Rect, bounds: Rect): Rect {\n const x = Math.max(bounds.x, Math.min(rect.x, bounds.x + bounds.width));\n const y = Math.max(bounds.y, Math.min(rect.y, bounds.y + bounds.height));\n return {\n x,\n y,\n width: Math.max(0, Math.min(rect.x + rect.width, bounds.x + bounds.width) - x),\n height: Math.max(0, Math.min(rect.y + rect.height, bounds.y + bounds.height) - y)\n };\n}\n\nexport function matchesPlacementIntent(a: WorkspaceDropIntent, b: WorkspaceDropIntent) {\n if (a.kind === 'invalid' || b.kind === 'invalid' || a.kind !== b.kind) return false;\n return (\n a.destination.target === b.destination.target &&\n a.destination.region === b.destination.region &&\n a.destination.position === b.destination.position &&\n a.destination.index === b.destination.index\n );\n}\n"],"mappings":";AAgFA,SAAgBA,EAAQ,GAAY,GAAoB;CACtD,IAAMC,IAAI,KAAK,IAAIC,EAAO,GAAG,KAAK,IAAIC,EAAK,GAAGD,EAAO,IAAIA,EAAO,KAAK,CAAC,GAChEE,IAAI,KAAK,IAAIF,EAAO,GAAG,KAAK,IAAIC,EAAK,GAAGD,EAAO,IAAIA,EAAO,MAAM,CAAC;CACvE,OAAO;EACL;EACA;EACA,OAAO,KAAK,IAAI,GAAG,KAAK,IAAIC,EAAK,IAAIA,EAAK,OAAOD,EAAO,IAAIA,EAAO,KAAK,IAAID,CAAC;EAC7E,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAIE,EAAK,IAAIA,EAAK,QAAQD,EAAO,IAAIA,EAAO,MAAM,IAAIE,CAAC;CAClF;AACF;AAEA,SAAgBC,EAAuB,GAAwB,GAAwB;CAErF,OADIC,EAAE,SAAS,aAAaC,EAAE,SAAS,aAAaD,EAAE,SAASC,EAAE,OAAa,KAE5ED,EAAE,YAAY,WAAWC,EAAE,YAAY,UACvCD,EAAE,YAAY,WAAWC,EAAE,YAAY,UACvCD,EAAE,YAAY,aAAaC,EAAE,YAAY,YACzCD,EAAE,YAAY,UAAUC,EAAE,YAAY;AAE1C"}