@nvidia-elements/core 2.23.6 → 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 (208) hide show
  1. package/CHANGELOG.md +13 -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 +4211 -233
  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-fullscreen.controller.d.ts +2 -4
  200. package/dist/workspace/controllers/workspace-fullscreen.controller.js +17 -47
  201. package/dist/workspace/controllers/workspace-fullscreen.controller.js.map +1 -1
  202. package/dist/workspace/panel/panel2.js +1 -1
  203. package/dist/workspace/panel-content/panel-content2.js +1 -1
  204. package/dist/workspace/panel-footer/panel-footer2.js +1 -1
  205. package/dist/workspace/panel-header/panel-header2.js +1 -1
  206. package/dist/workspace/workspace.js.map +1 -1
  207. package/dist/workspace/workspace2.js +1 -1
  208. package/package.json +16 -4
@@ -0,0 +1,30 @@
1
+ import type { DashboardAction, DashboardArrangementRequest } from '../utils/intent.types.js';
2
+ import type { DashboardPanel } from '../panel/panel.js';
3
+ import type { DashboardGridPlacement, DashboardLayout } from '../dashboard.types.js';
4
+ interface DashboardArrangementHost {
5
+ readonly value: string;
6
+ readonly rearrangeable: boolean;
7
+ readonly autoSettle: boolean;
8
+ matches(selectors: string): boolean;
9
+ }
10
+ interface DashboardArrangementDelegate {
11
+ getPanels(): DashboardPanel[];
12
+ getOwnedPanels(): DashboardPanel[];
13
+ isReady(): boolean;
14
+ getKnown(): ReadonlySet<string>;
15
+ getLayout(): DashboardLayout | undefined;
16
+ isFullscreenActive(): boolean;
17
+ cancel(): void;
18
+ commit(layout: DashboardLayout): boolean;
19
+ }
20
+ /** Applies arrangement permissions and operations to the current supplied panels. */
21
+ export declare class DashboardArrangementController {
22
+ #private;
23
+ constructor(host: DashboardArrangementHost, delegate: DashboardArrangementDelegate);
24
+ place(id: string, placement: DashboardGridPlacement): boolean;
25
+ getArrangementStateKey(): string;
26
+ findLayoutProposal(layout: DashboardLayout, id: string, request: DashboardArrangementRequest): DashboardLayout | undefined;
27
+ isActionAllowed(panel: DashboardPanel, action: DashboardAction): boolean;
28
+ canCommit(layout: DashboardLayout): boolean;
29
+ }
30
+ export {};
@@ -0,0 +1,68 @@
1
+ import { getDashboardResizeCorner as e } from "../utils/geometry.utils.js";
2
+ import { reconcileDashboard as t, serializeDashboardValue as n } from "../utils/layout.utils.js";
3
+ import { planDashboardAction as r } from "../utils/action.utils.js";
4
+ // src/dashboard/controllers/arrangement.controller.ts
5
+ var i = class {
6
+ #e;
7
+ #t;
8
+ constructor(e, t) {
9
+ this.#e = e, this.#t = t;
10
+ }
11
+ place(e, t) {
12
+ this.#t.cancel();
13
+ let n = this.#t.getLayout();
14
+ if (!n) return !1;
15
+ let r = this.findLayoutProposal(n, e, {
16
+ kind: "command",
17
+ command: "--place",
18
+ placement: t
19
+ });
20
+ return r ? this.#t.commit(r) : !1;
21
+ }
22
+ getArrangementStateKey() {
23
+ return JSON.stringify({
24
+ value: this.#e.value,
25
+ settle: this.#e.autoSettle,
26
+ rearrangeable: this.#e.rearrangeable,
27
+ readingDirection: this.#e.matches(":dir(rtl)") ? "rtl" : "ltr",
28
+ panels: this.#t.getPanels().map((t) => ({
29
+ ...t._getSpanConstraints(),
30
+ moveDisabled: t.moveDisabled,
31
+ resizeDisabled: t.resizeDisabled,
32
+ resizeCorner: e(t)
33
+ }))
34
+ });
35
+ }
36
+ findLayoutProposal(t, n, i) {
37
+ let a = this.#t.getPanels().find((e) => e.id === n);
38
+ if (a && this.#t.isReady()) return r({
39
+ layout: t,
40
+ id: n,
41
+ request: i,
42
+ panels: this.#t.getPanels().map((e) => e._getSpanConstraints()),
43
+ movable: this.isActionAllowed(a, "move"),
44
+ resizable: this.isActionAllowed(a, "resize"),
45
+ autoSettle: this.#e.autoSettle,
46
+ readingDirection: this.#e.matches(":dir(rtl)") ? "rtl" : "ltr",
47
+ resizeEdge: e(a)
48
+ });
49
+ }
50
+ isActionAllowed(e, t) {
51
+ return this.#t.isReady() && this.#t.getPanels().includes(e) && !this.#t.isFullscreenActive() && this.#e.rearrangeable && (t === "move" ? !e.moveDisabled : !e.resizeDisabled);
52
+ }
53
+ canCommit(e) {
54
+ return this.#n(e) && n(e) !== this.#e.value;
55
+ }
56
+ #n(e) {
57
+ if (!this.#t.isReady()) return !1;
58
+ let r = this.#t.getOwnedPanels(), i = t(e, r.map((e) => e._getSpanConstraints()), {
59
+ priority: this.#t.getKnown(),
60
+ autoSettle: this.#e.autoSettle,
61
+ hidden: new Set(r.filter((e) => e.hidden).map((e) => e.id))
62
+ });
63
+ return !!i && n(i) === n(e);
64
+ }
65
+ };
66
+ export { i as DashboardArrangementController };
67
+
68
+ //# sourceMappingURL=arrangement.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrangement.controller.js","names":["DashboardArrangementController","#host","host","#delegate","delegate","layout","next","id","panel","getDashboardResizeCorner","candidate","planDashboardAction","action","#isProposalValid","serializeDashboardValue","panels","reconciled","reconcileDashboard"],"sources":["../../../src/dashboard/controllers/arrangement.controller.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { planDashboardAction } from '../utils/action.utils.js';\nimport { getDashboardResizeCorner } from '../utils/geometry.utils.js';\nimport { reconcileDashboard, serializeDashboardValue } from '../utils/layout.utils.js';\n\nimport type { DashboardAction, DashboardArrangementRequest } from '../utils/intent.types.js';\n\nimport type { DashboardPanel } from '../panel/panel.js';\n\nimport type { DashboardGridPlacement, DashboardLayout } from '../dashboard.types.js';\n\ninterface DashboardArrangementHost {\n readonly value: string;\n readonly rearrangeable: boolean;\n readonly autoSettle: boolean;\n matches(selectors: string): boolean;\n}\n\ninterface DashboardArrangementDelegate {\n getPanels(): DashboardPanel[];\n getOwnedPanels(): DashboardPanel[];\n isReady(): boolean;\n getKnown(): ReadonlySet<string>;\n getLayout(): DashboardLayout | undefined;\n isFullscreenActive(): boolean;\n cancel(): void;\n commit(layout: DashboardLayout): boolean;\n}\n\n/** Applies arrangement permissions and operations to the current supplied panels. */\nexport class DashboardArrangementController {\n readonly #host: DashboardArrangementHost;\n readonly #delegate: DashboardArrangementDelegate;\n\n constructor(host: DashboardArrangementHost, delegate: DashboardArrangementDelegate) {\n this.#host = host;\n this.#delegate = delegate;\n }\n\n place(id: string, placement: DashboardGridPlacement): boolean {\n this.#delegate.cancel();\n\n const layout = this.#delegate.getLayout();\n if (!layout) return false;\n\n const next = this.findLayoutProposal(layout, id, { kind: 'command', command: '--place', placement });\n\n return next ? this.#delegate.commit(next) : false;\n }\n\n getArrangementStateKey(): string {\n return JSON.stringify({\n value: this.#host.value,\n settle: this.#host.autoSettle,\n rearrangeable: this.#host.rearrangeable,\n readingDirection: this.#host.matches(':dir(rtl)') ? 'rtl' : 'ltr',\n panels: this.#delegate.getPanels().map(panel => ({\n ...panel._getSpanConstraints(),\n moveDisabled: panel.moveDisabled,\n resizeDisabled: panel.resizeDisabled,\n resizeCorner: getDashboardResizeCorner(panel)\n }))\n });\n }\n\n findLayoutProposal(layout: DashboardLayout, id: string, request: DashboardArrangementRequest) {\n const panel = this.#delegate.getPanels().find(candidate => candidate.id === id);\n if (!panel || !this.#delegate.isReady()) return undefined;\n\n return planDashboardAction({\n layout,\n id,\n request,\n panels: this.#delegate.getPanels().map(candidate => candidate._getSpanConstraints()),\n movable: this.isActionAllowed(panel, 'move'),\n resizable: this.isActionAllowed(panel, 'resize'),\n autoSettle: this.#host.autoSettle,\n readingDirection: this.#host.matches(':dir(rtl)') ? 'rtl' : 'ltr',\n resizeEdge: getDashboardResizeCorner(panel)\n });\n }\n\n isActionAllowed(panel: DashboardPanel, action: DashboardAction) {\n return (\n this.#delegate.isReady() &&\n this.#delegate.getPanels().includes(panel) &&\n !this.#delegate.isFullscreenActive() &&\n this.#host.rearrangeable &&\n (action === 'move' ? !panel.moveDisabled : !panel.resizeDisabled)\n );\n }\n\n canCommit(layout: DashboardLayout): boolean {\n return this.#isProposalValid(layout) && serializeDashboardValue(layout) !== this.#host.value;\n }\n\n #isProposalValid(layout: DashboardLayout): boolean {\n if (!this.#delegate.isReady()) return false;\n\n const panels = this.#delegate.getOwnedPanels();\n const reconciled = reconcileDashboard(\n layout,\n panels.map(panel => panel._getSpanConstraints()),\n {\n priority: this.#delegate.getKnown(),\n autoSettle: this.#host.autoSettle,\n hidden: new Set(panels.filter(panel => panel.hidden).map(panel => panel.id))\n }\n );\n\n return !!reconciled && serializeDashboardValue(reconciled) === serializeDashboardValue(layout);\n }\n}\n"],"mappings":";;;;AAgCA,IAAaA,IAAb,MAA4C;CAC1C;CACA;CAEA,YAAY,GAAgC,GAAwC;EAElF,AADA,KAAKC,KAAQC,GACb,KAAKC,KAAYC;CACnB;CAEA,MAAM,GAAY,GAA4C;EAC5D,KAAKD,GAAU,OAAO;EAEtB,IAAME,IAAS,KAAKF,GAAU,UAAU;EACxC,IAAI,CAACE,GAAQ,OAAO;EAEpB,IAAMC,IAAO,KAAK,mBAAmBD,GAAQE,GAAI;GAAE,MAAM;GAAW,SAAS;GAAW;EAAU,CAAC;EAEnG,OAAOD,IAAO,KAAKH,GAAU,OAAOG,CAAI,IAAI;CAC9C;CAEA,yBAAiC;EAC/B,OAAO,KAAK,UAAU;GACpB,OAAO,KAAKL,GAAM;GAClB,QAAQ,KAAKA,GAAM;GACnB,eAAe,KAAKA,GAAM;GAC1B,kBAAkB,KAAKA,GAAM,QAAQ,WAAW,IAAI,QAAQ;GAC5D,QAAQ,KAAKE,GAAU,UAAU,CAAC,CAAC,KAAI,OAAU;IAC/C,GAAGK,EAAM,oBAAoB;IAC7B,cAAcA,EAAM;IACpB,gBAAgBA,EAAM;IACtB,cAAcC,EAAyBD,CAAK;GAC9C,EAAE;EACJ,CAAC;CACH;CAEA,mBAAmB,GAAyB,GAAY,GAAsC;EAC5F,IAAMA,IAAQ,KAAKL,GAAU,UAAU,CAAC,CAAC,MAAK,MAAaO,EAAU,OAAOH,CAAE;EAC9E,IAAKC,KAAU,KAAKL,GAAU,QAAQ,GAEtC,OAAOQ,EAAoB;GACzB;GACA;GACA;GACA,QAAQ,KAAKR,GAAU,UAAU,CAAC,CAAC,KAAI,MAAaO,EAAU,oBAAoB,CAAC;GACnF,SAAS,KAAK,gBAAgBF,GAAO,MAAM;GAC3C,WAAW,KAAK,gBAAgBA,GAAO,QAAQ;GAC/C,YAAY,KAAKP,GAAM;GACvB,kBAAkB,KAAKA,GAAM,QAAQ,WAAW,IAAI,QAAQ;GAC5D,YAAYQ,EAAyBD,CAAK;EAC5C,CAAC;CACH;CAEA,gBAAgB,GAAuB,GAAyB;EAC9D,OACE,KAAKL,GAAU,QAAQ,KACvB,KAAKA,GAAU,UAAU,CAAC,CAAC,SAASK,CAAK,KACzC,CAAC,KAAKL,GAAU,mBAAmB,KACnC,KAAKF,GAAM,kBACVW,MAAW,SAAS,CAACJ,EAAM,eAAe,CAACA,EAAM;CAEtD;CAEA,UAAU,GAAkC;EAC1C,OAAO,KAAKK,GAAiBR,CAAM,KAAKS,EAAwBT,CAAM,MAAM,KAAKJ,GAAM;CACzF;CAEA,GAAiB,GAAkC;EACjD,IAAI,CAAC,KAAKE,GAAU,QAAQ,GAAG,OAAO;EAEtC,IAAMY,IAAS,KAAKZ,GAAU,eAAe,GACvCa,IAAaC,EACjBZ,GACAU,EAAO,KAAI,MAASP,EAAM,oBAAoB,CAAC,GAC/C;GACE,UAAU,KAAKL,GAAU,SAAS;GAClC,YAAY,KAAKF,GAAM;GACvB,QAAQ,IAAI,IAAIc,EAAO,QAAO,MAASP,EAAM,MAAM,CAAC,CAAC,KAAI,MAASA,EAAM,EAAE,CAAC;EAC7E,CACF;EAEA,OAAO,CAAC,CAACQ,KAAcF,EAAwBE,CAAU,MAAMF,EAAwBT,CAAM;CAC/F;AACF"}
@@ -0,0 +1,28 @@
1
+ import { type ReactiveControllerHost } from 'lit';
2
+ import type { DashboardFullscreenController } from './fullscreen.controller.js';
3
+ import type { DashboardArrangementRequest } from '../utils/intent.types.js';
4
+ import type { DashboardPanel } from '../panel/panel.js';
5
+ import type { DashboardCommandContext, DashboardLayout } from '../dashboard.types.js';
6
+ interface DashboardCommandHost extends HTMLElement, ReactiveControllerHost {
7
+ readonly value: string;
8
+ }
9
+ interface DashboardCommandDelegate {
10
+ getPanels(): DashboardPanel[];
11
+ getLayout(): DashboardLayout | undefined;
12
+ findLayoutProposal(layout: DashboardLayout, id: string, request: DashboardArrangementRequest): DashboardLayout | undefined;
13
+ canCommit(layout: DashboardLayout): boolean;
14
+ cancel(): void;
15
+ commit(layout: DashboardLayout): boolean;
16
+ readonly fullscreen: Pick<DashboardFullscreenController, 'canEnter' | 'canExit' | 'isSelectedPanel' | 'enter' | 'exit'>;
17
+ }
18
+ /** Routes Invoker commands and publishes command availability. */
19
+ export declare class DashboardCommandController {
20
+ #private;
21
+ constructor(host: DashboardCommandHost, delegate: DashboardCommandDelegate);
22
+ hostConnected(): void;
23
+ hostDisconnected(): void;
24
+ invalidate(): void;
25
+ flush(): void;
26
+ isCommandAvailable(command: string, context?: DashboardCommandContext): boolean;
27
+ }
28
+ export {};
@@ -0,0 +1,69 @@
1
+ import { isServer as e } from "lit";
2
+ // src/dashboard/controllers/command.controller.ts
3
+ var t = class {
4
+ #e;
5
+ #t;
6
+ #n = !0;
7
+ constructor(e, t) {
8
+ this.#e = e, this.#t = t, e.addController(this);
9
+ }
10
+ hostConnected() {
11
+ e || this.#e.addEventListener("command", this.#i, !0);
12
+ }
13
+ hostDisconnected() {
14
+ this.#e.removeEventListener("command", this.#i, !0);
15
+ }
16
+ invalidate() {
17
+ this.#n = !0;
18
+ }
19
+ flush() {
20
+ this.#n && this.#e.isConnected && (this.#n = !1, this.#e.dispatchEvent(new Event("commandavailabilitychange", {
21
+ bubbles: !0,
22
+ composed: !0
23
+ })));
24
+ }
25
+ isCommandAvailable(e, t = {}) {
26
+ if (!t.value) return !1;
27
+ let n = this.#a(e, t.value);
28
+ if (n !== void 0) return n;
29
+ let r = this.#t.getLayout();
30
+ if (!r) return !1;
31
+ let i = this.#t.findLayoutProposal(r, t.value, {
32
+ kind: "command",
33
+ command: e,
34
+ placement: t.placement
35
+ });
36
+ return !!i && this.#t.canCommit(i);
37
+ }
38
+ #r(e) {
39
+ if (!(e.defaultPrevented || e.source?.disabled || e.source?.readOnly)) return e.target === this.#e ? this.#t.getPanels().find((t) => t.id === e.source?.value) : this.#t.getPanels().find((t) => t === e.target);
40
+ }
41
+ #i = (e) => {
42
+ if (!e.command) return;
43
+ let t = this.#r(e);
44
+ if (!t || this.#o(e.command, t.id)) return;
45
+ let n = this.#t.getLayout();
46
+ if (!n) return;
47
+ let r = e.source?.placement, i = this.#t.findLayoutProposal(n, t.id, {
48
+ kind: "command",
49
+ command: e.command,
50
+ placement: r
51
+ });
52
+ i && (this.#t.cancel(), this.#t.commit(i));
53
+ };
54
+ #a(e, t) {
55
+ if (this.#t.getPanels().some((e) => e.id === t)) switch (e) {
56
+ case "--enter-fullscreen": return this.#t.fullscreen.canEnter(t);
57
+ case "--exit-fullscreen": return this.#t.fullscreen.canExit;
58
+ case "--toggle-fullscreen": return this.#t.fullscreen.isSelectedPanel(t) ? this.#t.fullscreen.canExit : this.#t.fullscreen.canEnter(t);
59
+ default: return;
60
+ }
61
+ }
62
+ #o(e, t) {
63
+ let n = this.#a(e, t);
64
+ return n !== void 0 && (n && (e === "--exit-fullscreen" || e === "--toggle-fullscreen" && this.#t.fullscreen.isSelectedPanel(t) ? this.#t.fullscreen.exit() : this.#t.fullscreen.enter(t)), !0);
65
+ }
66
+ };
67
+ export { t as DashboardCommandController };
68
+
69
+ //# sourceMappingURL=command.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.controller.js","names":["DashboardCommandController","#host","host","#delegate","delegate","isServer","#handleCommand","#dirty","context","fullscreen","#getFullscreenCommandAvailability","command","layout","next","event","panel","#findCommandPanel","#handleFullscreenCommand","placement","id","available"],"sources":["../../../src/dashboard/controllers/command.controller.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isServer, type ReactiveControllerHost } from 'lit';\n\nimport type { DashboardFullscreenController } from './fullscreen.controller.js';\nimport type { DashboardArrangementRequest, DashboardCommandEvent } from '../utils/intent.types.js';\n\nimport type { DashboardPanel } from '../panel/panel.js';\n\nimport type { DashboardCommandContext, DashboardLayout } from '../dashboard.types.js';\n\ninterface DashboardCommandHost extends HTMLElement, ReactiveControllerHost {\n readonly value: string;\n}\n\ninterface DashboardCommandDelegate {\n getPanels(): DashboardPanel[];\n getLayout(): DashboardLayout | undefined;\n findLayoutProposal(\n layout: DashboardLayout,\n id: string,\n request: DashboardArrangementRequest\n ): DashboardLayout | undefined;\n canCommit(layout: DashboardLayout): boolean;\n cancel(): void;\n commit(layout: DashboardLayout): boolean;\n readonly fullscreen: Pick<\n DashboardFullscreenController,\n 'canEnter' | 'canExit' | 'isSelectedPanel' | 'enter' | 'exit'\n >;\n}\n\n/** Routes Invoker commands and publishes command availability. */\nexport class DashboardCommandController {\n readonly #host: DashboardCommandHost;\n readonly #delegate: DashboardCommandDelegate;\n #dirty = true;\n\n constructor(host: DashboardCommandHost, delegate: DashboardCommandDelegate) {\n this.#host = host;\n this.#delegate = delegate;\n host.addController(this);\n }\n\n hostConnected() {\n if (!isServer) {\n this.#host.addEventListener('command', this.#handleCommand, true);\n }\n }\n\n hostDisconnected() {\n this.#host.removeEventListener('command', this.#handleCommand, true);\n }\n\n invalidate() {\n this.#dirty = true;\n }\n\n flush() {\n if (!this.#dirty || !this.#host.isConnected) return;\n\n this.#dirty = false;\n this.#host.dispatchEvent(new Event('commandavailabilitychange', { bubbles: true, composed: true }));\n }\n\n isCommandAvailable(command: string, context: DashboardCommandContext = {}): boolean {\n if (!context.value) return false;\n\n const fullscreen = this.#getFullscreenCommandAvailability(command, context.value);\n if (fullscreen !== undefined) return fullscreen;\n\n const layout = this.#delegate.getLayout();\n if (!layout) return false;\n\n const next = this.#delegate.findLayoutProposal(layout, context.value, {\n kind: 'command',\n command,\n placement: context.placement\n });\n\n return !!next && this.#delegate.canCommit(next);\n }\n\n #findCommandPanel(event: DashboardCommandEvent) {\n if (event.defaultPrevented || event.source?.disabled || event.source?.readOnly) {\n return undefined;\n }\n if (event.target === this.#host) return this.#delegate.getPanels().find(panel => panel.id === event.source?.value);\n\n return this.#delegate.getPanels().find(panel => panel === event.target);\n }\n\n #handleCommand = (event: DashboardCommandEvent) => {\n if (!event.command) return;\n\n const panel = this.#findCommandPanel(event);\n if (!panel || this.#handleFullscreenCommand(event.command, panel.id)) return;\n\n const layout = this.#delegate.getLayout();\n if (!layout) return;\n\n const placement = event.source?.placement;\n const next = this.#delegate.findLayoutProposal(layout, panel.id, {\n kind: 'command',\n command: event.command,\n placement\n });\n\n if (next) {\n this.#delegate.cancel();\n this.#delegate.commit(next);\n }\n };\n\n #getFullscreenCommandAvailability(command: string, id: string): boolean | undefined {\n if (!this.#delegate.getPanels().some(panel => panel.id === id)) return undefined;\n\n switch (command) {\n case '--enter-fullscreen':\n return this.#delegate.fullscreen.canEnter(id);\n case '--exit-fullscreen':\n return this.#delegate.fullscreen.canExit;\n case '--toggle-fullscreen':\n return this.#delegate.fullscreen.isSelectedPanel(id)\n ? this.#delegate.fullscreen.canExit\n : this.#delegate.fullscreen.canEnter(id);\n default:\n return undefined;\n }\n }\n\n #handleFullscreenCommand(command: string, id: string): boolean {\n const available = this.#getFullscreenCommandAvailability(command, id);\n if (available === undefined) return false;\n\n if (available) {\n if (\n command === '--exit-fullscreen' ||\n (command === '--toggle-fullscreen' && this.#delegate.fullscreen.isSelectedPanel(id))\n ) {\n this.#delegate.fullscreen.exit();\n } else {\n this.#delegate.fullscreen.enter(id);\n }\n }\n\n return true;\n }\n}\n"],"mappings":";;AAkCA,IAAaA,IAAb,MAAwC;CACtC;CACA;CACA,KAAS;CAET,YAAY,GAA4B,GAAoC;EAG1E,AAFA,KAAKC,KAAQC,GACb,KAAKC,KAAYC,GACjBF,EAAK,cAAc,IAAI;CACzB;CAEA,gBAAgB;EACd,AAAKG,KACH,KAAKJ,GAAM,iBAAiB,WAAW,KAAKK,IAAgB,EAAI;CAEpE;CAEA,mBAAmB;EACjB,KAAKL,GAAM,oBAAoB,WAAW,KAAKK,IAAgB,EAAI;CACrE;CAEA,aAAa;EACX,KAAKC,KAAS;CAChB;CAEA,QAAQ;EACN,AAAK,KAAKA,MAAW,KAAKN,GAAM,gBAEhC,KAAKM,KAAS,IACd,KAAKN,GAAM,cAAc,IAAI,MAAM,6BAA6B;GAAE,SAAS;GAAM,UAAU;EAAK,CAAC,CAAC;CACpG;CAEA,mBAAmB,GAAiB,IAAmC,CAAC,GAAY;EAClF,IAAI,CAACO,EAAQ,OAAO,OAAO;EAE3B,IAAMC,IAAa,KAAKC,GAAkCC,GAASH,EAAQ,KAAK;EAChF,IAAIC,MAAe,KAAA,GAAW,OAAOA;EAErC,IAAMG,IAAS,KAAKT,GAAU,UAAU;EACxC,IAAI,CAACS,GAAQ,OAAO;EAEpB,IAAMC,IAAO,KAAKV,GAAU,mBAAmBS,GAAQJ,EAAQ,OAAO;GACpE,MAAM;GACN;GACA,WAAWA,EAAQ;EACrB,CAAC;EAED,OAAO,CAAC,CAACK,KAAQ,KAAKV,GAAU,UAAUU,CAAI;CAChD;CAEA,GAAkB,GAA8B;EAC9C,IAAI,IAAM,oBAAoBC,EAAM,QAAQ,YAAYA,EAAM,QAAQ,WAKtE,OAFIA,EAAM,WAAW,KAAKb,KAAc,KAAKE,GAAU,UAAU,CAAC,CAAC,MAAK,MAASY,EAAM,OAAOD,EAAM,QAAQ,KAAK,IAE1G,KAAKX,GAAU,UAAU,CAAC,CAAC,MAAK,MAASY,MAAUD,EAAM,MAAM;CACxE;CAEA,MAAkB,MAAiC;EACjD,IAAI,CAACA,EAAM,SAAS;EAEpB,IAAMC,IAAQ,KAAKC,GAAkBF,CAAK;EAC1C,IAAI,CAACC,KAAS,KAAKE,GAAyBH,EAAM,SAASC,EAAM,EAAE,GAAG;EAEtE,IAAMH,IAAS,KAAKT,GAAU,UAAU;EACxC,IAAI,CAACS,GAAQ;EAEb,IAAMM,IAAYJ,EAAM,QAAQ,WAC1BD,IAAO,KAAKV,GAAU,mBAAmBS,GAAQG,EAAM,IAAI;GAC/D,MAAM;GACN,SAASD,EAAM;GACf;EACF,CAAC;EAED,AAAID,MACF,KAAKV,GAAU,OAAO,GACtB,KAAKA,GAAU,OAAOU,CAAI;CAE9B;CAEA,GAAkC,GAAiB,GAAiC;EAClF,IAAK,KAAKV,GAAU,UAAU,CAAC,CAAC,MAAK,MAASY,EAAM,OAAOI,CAAE,GAE7D,QAAQR,GAAR;GACE,KAAK,sBACH,OAAO,KAAKR,GAAU,WAAW,SAASgB,CAAE;GAC9C,KAAK,qBACH,OAAO,KAAKhB,GAAU,WAAW;GACnC,KAAK,uBACH,OAAO,KAAKA,GAAU,WAAW,gBAAgBgB,CAAE,IAC/C,KAAKhB,GAAU,WAAW,UAC1B,KAAKA,GAAU,WAAW,SAASgB,CAAE;GAC3C,SACE;EACJ;CACF;CAEA,GAAyB,GAAiB,GAAqB;EAC7D,IAAMC,IAAY,KAAKV,GAAkCC,GAASQ,CAAE;EAcpE,OAbIC,MAAc,KAAA,MAEdA,MAEAT,MAAY,uBACXA,MAAY,yBAAyB,KAAKR,GAAU,WAAW,gBAAgBgB,CAAE,IAElF,KAAKhB,GAAU,WAAW,KAAK,IAE/B,KAAKA,GAAU,WAAW,MAAMgB,CAAE,IAI/B;CACT;AACF"}
@@ -0,0 +1,61 @@
1
+ import { type ReactiveControllerHost } from 'lit';
2
+ import { DashboardPanel } from '../panel/panel.js';
3
+ import type { DashboardFullscreenController } from './fullscreen.controller.js';
4
+ import type { DashboardPointerPresentation } from './interaction.controller.js';
5
+ import type { DashboardMetrics } from '../utils/geometry.utils.js';
6
+ import type { DashboardAction } from '../utils/intent.types.js';
7
+ import type { DashboardItem, DashboardLayout } from '../dashboard.types.js';
8
+ interface DashboardCompositionHost extends HTMLElement, ReactiveControllerHost {
9
+ readonly value: string;
10
+ readonly sizing: 'fit' | 'fixed';
11
+ readonly container?: 'inset' | 'flat' | 'full';
12
+ readonly fullscreenable: boolean;
13
+ readonly updateComplete: Promise<boolean>;
14
+ }
15
+ interface DashboardCompositionDelegate {
16
+ getLayout(): DashboardLayout | undefined;
17
+ getCanonicalLayout(): DashboardLayout | undefined;
18
+ getPreview(): DashboardLayout | undefined;
19
+ getPointerPresentation(): DashboardPointerPresentation | undefined;
20
+ getMetrics(): DashboardMetrics | undefined;
21
+ getLabels(): Readonly<Record<string, string>>;
22
+ isActionAllowed(panel: DashboardPanel, action: DashboardAction): boolean;
23
+ readonly fullscreen: DashboardFullscreenController;
24
+ measure(): void;
25
+ changed(catalogue: boolean): void;
26
+ }
27
+ interface DashboardPresentationSnapshot {
28
+ layout?: DashboardLayout;
29
+ panels: WeakMap<DashboardPanel, DashboardItem>;
30
+ fullscreenTargetId?: string;
31
+ metrics?: DashboardMetrics;
32
+ value: string;
33
+ sizing: 'fit' | 'fixed';
34
+ width: number;
35
+ height: number;
36
+ }
37
+ /** Presents stable panels and observes their supplied composition. */
38
+ export declare class DashboardCompositionController {
39
+ #private;
40
+ constructor(host: DashboardCompositionHost, delegate: DashboardCompositionDelegate);
41
+ get ghostCorners(): Record<string, string>;
42
+ captureCorners(panel?: DashboardPanel): void;
43
+ hostConnected(): void;
44
+ hostDisconnected(): void;
45
+ get ready(): boolean;
46
+ get catalogueReady(): boolean;
47
+ get pendingPresentation(): DashboardPresentationSnapshot | undefined;
48
+ get panels(): DashboardPanel[];
49
+ get hiddenPanelIds(): ReadonlySet<string>;
50
+ get ownedPanels(): DashboardPanel[];
51
+ hasPresentablePanel(id: string): boolean;
52
+ get viewport(): HTMLElement | undefined;
53
+ present(): void;
54
+ getPanelLabel(id: string): string;
55
+ revealKeyboardControl(layout: DashboardLayout, control: {
56
+ panel: DashboardPanel;
57
+ element: HTMLElement;
58
+ action: DashboardAction;
59
+ }): Promise<void>;
60
+ }
61
+ export {};
@@ -0,0 +1,285 @@
1
+ import { getActiveElement as e } from "../../internal/utils/focus.js";
2
+ import { getCustomElementRegistry as t, matchesElementName as n } from "../../internal/utils/dom.js";
3
+ import { getDashboardClientRect as r, getDashboardPixelPlacement as i, getDashboardPlacementClientRect as a, getProjectedControlRect as o, getRevealScrollDelta as s, haveSameGridPitch as c } from "../utils/geometry.utils.js";
4
+ import { serializeDashboardValue as l } from "../utils/layout.utils.js";
5
+ import { DashboardPanel as u } from "../panel/panel2.js";
6
+ import { isDashboardCatalogueMutation as d, isDashboardTitleMutation as f } from "../utils/mutation.utils.js";
7
+ import { isServer as p } from "lit";
8
+ // src/dashboard/controllers/composition.controller.ts
9
+ var m = class {
10
+ #e;
11
+ #t;
12
+ #n;
13
+ #r;
14
+ #i;
15
+ #a = {};
16
+ constructor(e, t) {
17
+ this.#e = e, this.#t = t, e.addController(this);
18
+ }
19
+ get ghostCorners() {
20
+ return this.#a;
21
+ }
22
+ captureCorners(e) {
23
+ if (!e || this.#t.getPointerPresentation()?.panel === e) return;
24
+ let t = e.shadowRoot?.querySelector("[internal-host]"), n = getComputedStyle(t ?? e);
25
+ this.#a = {
26
+ borderTopLeftRadius: n.borderTopLeftRadius,
27
+ borderTopRightRadius: n.borderTopRightRadius,
28
+ borderBottomRightRadius: n.borderBottomRightRadius,
29
+ borderBottomLeftRadius: n.borderBottomLeftRadius
30
+ };
31
+ }
32
+ hostConnected() {
33
+ p || (t(this.#e)?.whenDefined(u.metadata.tag).then(() => {
34
+ this.#e.isConnected && this.#e.requestUpdate();
35
+ }), this.#n = new MutationObserver((e) => {
36
+ let t = e.some((e) => d(this.#e, e)), n = e.some((e) => f(this.#e, e));
37
+ (t || n) && this.#t.changed(t);
38
+ }), this.#n.observe(this.#e, {
39
+ childList: !0,
40
+ characterData: !0,
41
+ subtree: !0,
42
+ attributes: !0,
43
+ attributeFilter: [
44
+ "id",
45
+ "slot",
46
+ "hidden",
47
+ "min-column-span",
48
+ "max-column-span",
49
+ "min-row-span",
50
+ "max-row-span",
51
+ "move-disabled",
52
+ "resize-disabled"
53
+ ]
54
+ }), this.#e.addEventListener("focusin", this.#C));
55
+ }
56
+ hostDisconnected() {
57
+ this.#n?.disconnect(), this.#e.removeEventListener("focusin", this.#C), this.#r = void 0, this.#i = void 0;
58
+ }
59
+ get #o() {
60
+ return [...this.#e.children].filter((e) => n(e, u) && !e.getAttribute("slot"));
61
+ }
62
+ get ready() {
63
+ return this.#o.length === this.ownedPanels.length;
64
+ }
65
+ get catalogueReady() {
66
+ if (!this.ready) return !1;
67
+ let e = this.ownedPanels, t = new Set(e.map((e) => e.id));
68
+ return !t.has("") && t.size === e.length;
69
+ }
70
+ get pendingPresentation() {
71
+ if (!p) return this.catalogueReady && this.#t.getLayout() ? void 0 : this.#i;
72
+ }
73
+ get panels() {
74
+ return this.ownedPanels.filter((e) => !e.hidden);
75
+ }
76
+ get hiddenPanelIds() {
77
+ return new Set(this.ownedPanels.filter((e) => e.hidden).map((e) => e.id));
78
+ }
79
+ get ownedPanels() {
80
+ return this.#o.filter((e) => "_getSpanConstraints" in e && typeof e._getSpanConstraints == "function" && "_configure" in e && typeof e._configure == "function" && "_getLabel" in e && typeof e._getLabel == "function");
81
+ }
82
+ hasPresentablePanel(e) {
83
+ let t = this.panels.filter((t) => t.id === e), n = this.#i;
84
+ return t.some((e) => n?.panels.has(e)) ? !0 : t.length > 0 && this.catalogueReady && !!this.#t.getCanonicalLayout();
85
+ }
86
+ get viewport() {
87
+ return this.#e.shadowRoot?.querySelector(".viewport") ?? void 0;
88
+ }
89
+ present() {
90
+ if (this.catalogueReady && this.#t.getLayout()) this.#h(this.panels), this.#s(this.#l());
91
+ else if (this.#r = void 0, this.#i) this.#s(this.#c(this.#i));
92
+ else for (let e of this.panels) this.#g(e, { placed: !1 });
93
+ }
94
+ #s(e) {
95
+ let t = this.#i?.fullscreenTargetId, n = this.panels, r = this.#u(e);
96
+ r && this.#d(n, "0ms");
97
+ try {
98
+ this.#f(n, e), r && this.#e.shadowRoot?.querySelector(".canvas")?.getBoundingClientRect(), this.#i = e;
99
+ } finally {
100
+ r && this.#d(n);
101
+ }
102
+ this.#x(t, e.fullscreenTargetId);
103
+ }
104
+ #c(e) {
105
+ let { width: t, height: n } = this.#e.getBoundingClientRect();
106
+ return {
107
+ ...e,
108
+ width: t,
109
+ height: n,
110
+ metrics: this.#t.getMetrics() ?? e.metrics,
111
+ fullscreenTargetId: this.#t.fullscreen.targetPanelId
112
+ };
113
+ }
114
+ #l() {
115
+ let { width: e, height: t } = this.#e.getBoundingClientRect(), n = this.#t.getLayout(), r = this.#t.getMetrics(), i = /* @__PURE__ */ new WeakMap();
116
+ for (let e of this.panels) {
117
+ let t = n?.items.find((t) => t.id === e.id);
118
+ t && r && i.set(e, t);
119
+ }
120
+ return {
121
+ layout: n,
122
+ panels: i,
123
+ metrics: r,
124
+ value: this.#e.value,
125
+ sizing: this.#e.sizing,
126
+ width: e,
127
+ height: t,
128
+ fullscreenTargetId: this.#t.fullscreen.targetPanelId
129
+ };
130
+ }
131
+ #u(e) {
132
+ let t = this.#i;
133
+ return e.fullscreenTargetId !== t?.fullscreenTargetId || !!t && (e.width !== t.width || e.height !== t.height) && !c(e.metrics, t.metrics) && e.value === t.value && e.sizing === t.sizing;
134
+ }
135
+ #d(e, t) {
136
+ for (let n of e) t === void 0 ? n.style.removeProperty("--_geometry-animation-duration") : n.style.setProperty("--_geometry-animation-duration", t);
137
+ }
138
+ #f(e, t) {
139
+ let n = this.#t.getPreview() ?? this.#t.getLayout(), r = t.metrics;
140
+ for (let i of e) {
141
+ let e = this.#t.getPointerPresentation()?.panel === i ? this.#t.getPointerPresentation() : void 0, a = n ? n.items.find((e) => e.id === i.id) : t.panels.get(i), o = !!a && !!r;
142
+ a && r && this.#p({
143
+ panel: i,
144
+ item: a,
145
+ metrics: r,
146
+ active: e
147
+ }), this.#g(i, {
148
+ placed: o,
149
+ active: e
150
+ });
151
+ }
152
+ }
153
+ #p(e) {
154
+ let { panel: t, item: n, metrics: r, active: i } = e, a = this.#m(n, r, i);
155
+ t.style.setProperty("--_dashboard-inline-start", `${a.inlineStart}px`), Object.assign(t.style, {
156
+ top: `${a.top}px`,
157
+ width: `${a.width}px`,
158
+ height: `${a.height}px`
159
+ });
160
+ }
161
+ #m(e, t, n) {
162
+ let r = this.viewport;
163
+ return e.id === this.#t.fullscreen.targetPanelId && r ? {
164
+ inlineStart: 0,
165
+ top: 0,
166
+ width: r.clientWidth,
167
+ height: r.clientHeight
168
+ } : n?.canvasPlacement ?? i(e, t);
169
+ }
170
+ #h(e) {
171
+ let t = this.#r;
172
+ if (t?.value === this.#e.value && t.panels.length === e.length && e.every((e, n) => e === t.panels[n])) return;
173
+ this.#r = {
174
+ value: this.#e.value,
175
+ panels: e
176
+ };
177
+ let n = this.#t.getLayout();
178
+ if (!n) return;
179
+ let r = e.flatMap((e, t) => {
180
+ let r = n.items.find((t) => t.id === e.id);
181
+ return r ? [{
182
+ panel: e,
183
+ index: t,
184
+ item: r
185
+ }] : [];
186
+ });
187
+ r.sort((e, t) => {
188
+ let r = e.item.column - t.item.column, i = e.item.row - t.item.row;
189
+ return (n.grid.flow === "vertical" ? i || r : r || i) || e.index - t.index;
190
+ }), r.forEach(({ panel: e }, t) => e.style.setProperty("--_reading-order", `${t}`));
191
+ }
192
+ #g(e, t) {
193
+ let { placed: n, active: r } = t;
194
+ this.#e.container && e.getAttribute("container") !== this.#e.container ? e.setAttribute("container", this.#e.container) : this.#e.container || e.removeAttribute("container");
195
+ let i = n ? {
196
+ fullscreenControl: this.#y(e.id),
197
+ fullscreen: this.#v(e.id)
198
+ } : {};
199
+ e._configure({
200
+ placed: n,
201
+ ...this.#_(e, n),
202
+ mode: r?.preview ? r.action : void 0,
203
+ carried: !!r?.canvasPlacement,
204
+ lifted: !!r?.canvasPlacement && r.preview,
205
+ ...i,
206
+ labels: this.#t.getLabels()
207
+ });
208
+ }
209
+ #_(e, t) {
210
+ return !t || !this.#t.getLayout() ? {
211
+ movable: !1,
212
+ resizable: !1
213
+ } : {
214
+ movable: this.#t.isActionAllowed(e, "move"),
215
+ resizable: this.#t.isActionAllowed(e, "resize")
216
+ };
217
+ }
218
+ #v(e) {
219
+ if (this.#t.fullscreen.active) return this.#t.fullscreen.targetPanelId === e ? "selected" : "excluded";
220
+ }
221
+ #y(e) {
222
+ if (this.#t.fullscreen.isSelectedPanel(e)) return "exit";
223
+ if (this.#e.fullscreenable) return this.#t.fullscreen.canEnter(e) ? "enter" : "unavailable";
224
+ }
225
+ getPanelLabel(e) {
226
+ return this.panels.find((t) => t.id === e)?._getLabel() || e;
227
+ }
228
+ async revealKeyboardControl(e, t) {
229
+ await this.#e.updateComplete;
230
+ let { panel: n, element: r, action: i } = t;
231
+ if (!this.#e.isConnected || this.#t.getPointerPresentation()?.canvasPlacement || !this.panels.includes(n) || n.shadowRoot?.activeElement !== r || !this.#t.isActionAllowed(n, i)) return;
232
+ let a = this.#t.getCanonicalLayout();
233
+ a && l(a) === l(e) && (this.#t.measure(), this.#b({
234
+ panel: n,
235
+ control: r,
236
+ action: i,
237
+ layout: a
238
+ }));
239
+ }
240
+ #b(e) {
241
+ let { panel: t, control: n, action: s, layout: c } = e, l = this.viewport, u = this.#e.shadowRoot?.querySelector(".canvas"), d = c.items.find((e) => e.id === t.id), f = this.#t.getMetrics();
242
+ if (!l || !u || !d || !f) return;
243
+ let p = u.getBoundingClientRect(), m = i(d, f), h = o({
244
+ control: r(n),
245
+ current: r(t),
246
+ target: a(m, {
247
+ x: p.left,
248
+ y: p.top,
249
+ width: p.width,
250
+ height: p.height
251
+ }, this.#e.matches(":dir(rtl)") ? "rtl" : "ltr")
252
+ }, {
253
+ right: s === "resize" ? !t.matches(":dir(rtl)") : t.matches(":dir(rtl)"),
254
+ bottom: s === "resize"
255
+ });
256
+ this.#S(h);
257
+ }
258
+ #x(t, n) {
259
+ if (!t || n) return;
260
+ let i = e(this.#e.ownerDocument);
261
+ i instanceof HTMLElement && i.isConnected && this.panels.some((e) => e.matches(":focus-within")) && this.#S(r(i));
262
+ }
263
+ #S(e) {
264
+ let t = this.viewport;
265
+ if (!t) return;
266
+ let n = t.getBoundingClientRect(), r = s(e, {
267
+ x: n.left,
268
+ y: n.top,
269
+ width: t.clientWidth,
270
+ height: t.clientHeight
271
+ });
272
+ t.scrollBy(r.x, r.y);
273
+ }
274
+ #C = (e) => {
275
+ if (this.#t.getPointerPresentation()?.canvasPlacement) return;
276
+ let t = e.composedPath();
277
+ t.some((e) => e instanceof HTMLElement && this.panels.some((t) => t === e)) && t.find((e) => e instanceof HTMLElement)?.scrollIntoView({
278
+ block: "nearest",
279
+ inline: "nearest"
280
+ });
281
+ };
282
+ };
283
+ export { m as DashboardCompositionController };
284
+
285
+ //# sourceMappingURL=composition.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition.controller.js","names":["DashboardCompositionController","#host","host","#delegate","delegate","#ghostCorners","panel","surface","style","isServer","getCustomElementRegistry","DashboardPanel","#observer","catalogue","records","isDashboardCatalogueMutation","record","titles","isDashboardTitleMutation","#focus","#readingOrderSource","#presentedGeometry","#panelElements","matchesElementName","panels","ids","matching","id","previous","#updateReadingOrder","#presentSnapshot","#getPresentationSnapshot","#getRetainedSnapshot","#configurePanel","previousFullscreen","recalibrating","#requiresImmediateGeometry","context","#setGeometryDuration","#presentPanels","#revealFocusedContent","layout","metrics","item","candidate","haveSameGridPitch","duration","active","placed","#presentPanelGeometry","input","box","#getPanelPixelPlacement","viewport","getDashboardPixelPlacement","index","entries","columnOrder","a","b","rowOrder","rank","presentation","fullscreen","#getFullscreenControl","#getFullscreenView","#getPanelCapabilities","control","element","action","current","serializeDashboardValue","#revealControl","canvas","origin","target","rect","getProjectedControlRect","getDashboardClientRect","getDashboardPlacementClientRect","#scrollViewportTo","previousTargetId","targetId","getActiveElement","bounds","delta","getRevealScrollDelta","path","event","node"],"sources":["../../../src/dashboard/controllers/composition.controller.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isServer, type ReactiveControllerHost } from 'lit';\n\nimport {\n getActiveElement,\n getCustomElementRegistry,\n matchesElementName,\n type Rect\n} from '@nvidia-elements/core/internal';\n\nimport {\n getDashboardClientRect,\n getDashboardPixelPlacement,\n getDashboardPlacementClientRect,\n getProjectedControlRect,\n getRevealScrollDelta,\n haveSameGridPitch\n} from '../utils/geometry.utils.js';\nimport { serializeDashboardValue } from '../utils/layout.utils.js';\nimport { isDashboardCatalogueMutation, isDashboardTitleMutation } from '../utils/mutation.utils.js';\n\nimport { DashboardPanel } from '../panel/panel.js';\n\nimport type { DashboardFullscreenController } from './fullscreen.controller.js';\nimport type { DashboardPointerPresentation } from './interaction.controller.js';\nimport type { DashboardMetrics, DashboardPixelPlacement } from '../utils/geometry.utils.js';\nimport type { DashboardAction } from '../utils/intent.types.js';\n\nimport type { DashboardItem, DashboardLayout } from '../dashboard.types.js';\n\ninterface DashboardCompositionHost extends HTMLElement, ReactiveControllerHost {\n readonly value: string;\n readonly sizing: 'fit' | 'fixed';\n readonly container?: 'inset' | 'flat' | 'full';\n readonly fullscreenable: boolean;\n readonly updateComplete: Promise<boolean>;\n}\n\ninterface DashboardCompositionDelegate {\n getLayout(): DashboardLayout | undefined;\n getCanonicalLayout(): DashboardLayout | undefined;\n getPreview(): DashboardLayout | undefined;\n getPointerPresentation(): DashboardPointerPresentation | undefined;\n getMetrics(): DashboardMetrics | undefined;\n getLabels(): Readonly<Record<string, string>>;\n isActionAllowed(panel: DashboardPanel, action: DashboardAction): boolean;\n readonly fullscreen: DashboardFullscreenController;\n measure(): void;\n changed(catalogue: boolean): void;\n}\n\ninterface DashboardPresentationSnapshot {\n layout?: DashboardLayout;\n panels: WeakMap<DashboardPanel, DashboardItem>;\n fullscreenTargetId?: string;\n metrics?: DashboardMetrics;\n value: string;\n sizing: 'fit' | 'fixed';\n width: number;\n height: number;\n}\n\n/** Presents stable panels and observes their supplied composition. */\nexport class DashboardCompositionController {\n readonly #host: DashboardCompositionHost;\n readonly #delegate: DashboardCompositionDelegate;\n #observer?: MutationObserver;\n #readingOrderSource?: { value: string; panels: readonly DashboardPanel[] };\n #presentedGeometry?: DashboardPresentationSnapshot;\n #ghostCorners: Record<string, string> = {};\n\n constructor(host: DashboardCompositionHost, delegate: DashboardCompositionDelegate) {\n this.#host = host;\n this.#delegate = delegate;\n host.addController(this);\n }\n\n get ghostCorners() {\n return this.#ghostCorners;\n }\n\n captureCorners(panel?: DashboardPanel) {\n if (!panel || this.#delegate.getPointerPresentation()?.panel === panel) return;\n\n const surface = panel.shadowRoot?.querySelector('[internal-host]');\n const style = getComputedStyle(surface ?? panel);\n\n this.#ghostCorners = {\n borderTopLeftRadius: style.borderTopLeftRadius,\n borderTopRightRadius: style.borderTopRightRadius,\n borderBottomRightRadius: style.borderBottomRightRadius,\n borderBottomLeftRadius: style.borderBottomLeftRadius\n };\n }\n\n hostConnected() {\n if (isServer) return;\n\n void getCustomElementRegistry(this.#host)\n ?.whenDefined(DashboardPanel.metadata.tag)\n .then(() => {\n if (this.#host.isConnected) {\n this.#host.requestUpdate();\n }\n });\n this.#observer = new MutationObserver(records => {\n const catalogue = records.some(record => isDashboardCatalogueMutation(this.#host, record));\n const titles = records.some(record => isDashboardTitleMutation(this.#host, record));\n\n if (catalogue || titles) {\n this.#delegate.changed(catalogue);\n }\n });\n this.#observer.observe(this.#host, {\n childList: true,\n characterData: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\n 'id',\n 'slot',\n 'hidden',\n 'min-column-span',\n 'max-column-span',\n 'min-row-span',\n 'max-row-span',\n 'move-disabled',\n 'resize-disabled'\n ]\n });\n this.#host.addEventListener('focusin', this.#focus);\n }\n\n hostDisconnected() {\n this.#observer?.disconnect();\n this.#host.removeEventListener('focusin', this.#focus);\n this.#readingOrderSource = undefined;\n this.#presentedGeometry = undefined;\n }\n\n get #panelElements() {\n return [...this.#host.children].filter(\n panel => matchesElementName(panel, DashboardPanel) && !panel.getAttribute('slot')\n );\n }\n\n get ready() {\n return this.#panelElements.length === this.ownedPanels.length;\n }\n\n get catalogueReady(): boolean {\n if (!this.ready) return false;\n\n const panels = this.ownedPanels;\n const ids = new Set(panels.map(panel => panel.id));\n\n return !ids.has('') && ids.size === panels.length;\n }\n\n get pendingPresentation() {\n if (isServer) return undefined;\n\n return this.catalogueReady && this.#delegate.getLayout() ? undefined : this.#presentedGeometry;\n }\n\n get panels(): DashboardPanel[] {\n return this.ownedPanels.filter(panel => !panel.hidden);\n }\n\n get hiddenPanelIds(): ReadonlySet<string> {\n return new Set(this.ownedPanels.filter(panel => panel.hidden).map(panel => panel.id));\n }\n\n get ownedPanels(): DashboardPanel[] {\n return this.#panelElements.filter(\n (panel): panel is DashboardPanel =>\n '_getSpanConstraints' in panel &&\n typeof panel._getSpanConstraints === 'function' &&\n '_configure' in panel &&\n typeof panel._configure === 'function' &&\n '_getLabel' in panel &&\n typeof panel._getLabel === 'function'\n );\n }\n\n hasPresentablePanel(id: string): boolean {\n const panels = this.panels;\n const matching = panels.filter(panel => panel.id === id);\n const previous = this.#presentedGeometry;\n\n if (matching.some(panel => previous?.panels.has(panel))) return true;\n\n return matching.length > 0 && this.catalogueReady && !!this.#delegate.getCanonicalLayout();\n }\n\n get viewport(): HTMLElement | undefined {\n return this.#host.shadowRoot?.querySelector<HTMLElement>('.viewport') ?? undefined;\n }\n\n present() {\n if (this.catalogueReady && this.#delegate.getLayout()) {\n this.#updateReadingOrder(this.panels);\n this.#presentSnapshot(this.#getPresentationSnapshot());\n return;\n }\n\n this.#readingOrderSource = undefined;\n\n if (this.#presentedGeometry) {\n this.#presentSnapshot(this.#getRetainedSnapshot(this.#presentedGeometry));\n return;\n }\n\n for (const panel of this.panels) {\n this.#configurePanel(panel, { placed: false });\n }\n }\n\n #presentSnapshot(context: DashboardPresentationSnapshot) {\n const previousFullscreen = this.#presentedGeometry?.fullscreenTargetId;\n const panels = this.panels;\n const recalibrating = this.#requiresImmediateGeometry(context);\n\n if (recalibrating) {\n this.#setGeometryDuration(panels, '0ms');\n }\n\n try {\n this.#presentPanels(panels, context);\n\n if (recalibrating) {\n this.#host.shadowRoot?.querySelector<HTMLElement>('.canvas')?.getBoundingClientRect();\n }\n\n this.#presentedGeometry = context;\n } finally {\n if (recalibrating) {\n this.#setGeometryDuration(panels);\n }\n }\n\n this.#revealFocusedContent(previousFullscreen, context.fullscreenTargetId);\n }\n\n #getRetainedSnapshot(previous: DashboardPresentationSnapshot): DashboardPresentationSnapshot {\n const { width, height } = this.#host.getBoundingClientRect();\n\n return {\n ...previous,\n width,\n height,\n metrics: this.#delegate.getMetrics() ?? previous.metrics,\n fullscreenTargetId: this.#delegate.fullscreen.targetPanelId\n };\n }\n\n #getPresentationSnapshot(): DashboardPresentationSnapshot {\n const { width, height } = this.#host.getBoundingClientRect();\n const layout = this.#delegate.getLayout();\n const metrics = this.#delegate.getMetrics();\n const panels = new WeakMap<DashboardPanel, DashboardItem>();\n\n for (const panel of this.panels) {\n const item = layout?.items.find(candidate => candidate.id === panel.id);\n if (item && metrics) panels.set(panel, item);\n }\n\n return {\n layout,\n panels,\n metrics,\n value: this.#host.value,\n sizing: this.#host.sizing,\n width,\n height,\n fullscreenTargetId: this.#delegate.fullscreen.targetPanelId\n };\n }\n\n #requiresImmediateGeometry(context: DashboardPresentationSnapshot): boolean {\n const previous = this.#presentedGeometry;\n if (context.fullscreenTargetId !== previous?.fullscreenTargetId) return true;\n\n return (\n !!previous &&\n (context.width !== previous.width || context.height !== previous.height) &&\n !haveSameGridPitch(context.metrics, previous.metrics) &&\n context.value === previous.value &&\n context.sizing === previous.sizing\n );\n }\n\n #setGeometryDuration(panels: readonly DashboardPanel[], duration?: string) {\n for (const panel of panels) {\n if (duration === undefined) {\n panel.style.removeProperty('--_geometry-animation-duration');\n } else {\n panel.style.setProperty('--_geometry-animation-duration', duration);\n }\n }\n }\n\n #presentPanels(panels: readonly DashboardPanel[], context: DashboardPresentationSnapshot) {\n const layout = this.#delegate.getPreview() ?? this.#delegate.getLayout();\n const metrics = context.metrics;\n\n for (const panel of panels) {\n const active =\n this.#delegate.getPointerPresentation()?.panel === panel ? this.#delegate.getPointerPresentation() : undefined;\n const item = layout ? layout.items.find(candidate => candidate.id === panel.id) : context.panels.get(panel);\n const placed = !!item && !!metrics;\n\n if (item && metrics) {\n this.#presentPanelGeometry({ panel, item, metrics, active });\n }\n\n this.#configurePanel(panel, { placed, active });\n }\n }\n\n #presentPanelGeometry(input: {\n panel: DashboardPanel;\n item: DashboardItem;\n metrics: DashboardMetrics;\n active?: DashboardPointerPresentation;\n }) {\n const { panel, item, metrics, active } = input;\n const box = this.#getPanelPixelPlacement(item, metrics, active);\n\n panel.style.setProperty('--_dashboard-inline-start', `${box.inlineStart}px`);\n Object.assign(panel.style, {\n top: `${box.top}px`,\n width: `${box.width}px`,\n height: `${box.height}px`\n });\n }\n\n #getPanelPixelPlacement(\n item: DashboardLayout['items'][number],\n metrics: DashboardMetrics,\n active?: DashboardPointerPresentation\n ): DashboardPixelPlacement {\n const viewport = this.viewport;\n if (item.id === this.#delegate.fullscreen.targetPanelId && viewport) {\n return { inlineStart: 0, top: 0, width: viewport.clientWidth, height: viewport.clientHeight };\n }\n\n return active?.canvasPlacement ?? getDashboardPixelPlacement(item, metrics);\n }\n\n #updateReadingOrder(panels: readonly DashboardPanel[]) {\n const previous = this.#readingOrderSource;\n if (\n previous?.value === this.#host.value &&\n previous.panels.length === panels.length &&\n panels.every((panel, index) => panel === previous.panels[index])\n ) {\n return;\n }\n\n this.#readingOrderSource = { value: this.#host.value, panels };\n\n const layout = this.#delegate.getLayout();\n if (!layout) return;\n\n const entries = panels.flatMap((panel, index) => {\n const item = layout.items.find(candidate => candidate.id === panel.id);\n return item ? [{ panel, index, item }] : [];\n });\n\n entries.sort((a, b) => {\n const columnOrder = a.item.column - b.item.column;\n const rowOrder = a.item.row - b.item.row;\n\n return (layout.grid.flow === 'vertical' ? rowOrder || columnOrder : columnOrder || rowOrder) || a.index - b.index;\n });\n\n entries.forEach(({ panel }, rank) => panel.style.setProperty('--_reading-order', `${rank}`));\n }\n\n #configurePanel(panel: DashboardPanel, presentation: { placed: boolean; active?: DashboardPointerPresentation }) {\n const { placed, active } = presentation;\n\n if (this.#host.container && panel.getAttribute('container') !== this.#host.container) {\n panel.setAttribute('container', this.#host.container);\n } else if (!this.#host.container) {\n panel.removeAttribute('container');\n }\n\n const fullscreen = placed\n ? { fullscreenControl: this.#getFullscreenControl(panel.id), fullscreen: this.#getFullscreenView(panel.id) }\n : {};\n\n panel._configure({\n placed,\n ...this.#getPanelCapabilities(panel, placed),\n mode: active?.preview ? active.action : undefined,\n carried: !!active?.canvasPlacement,\n lifted: !!active?.canvasPlacement && active.preview,\n ...fullscreen,\n labels: this.#delegate.getLabels()\n });\n }\n\n #getPanelCapabilities(panel: DashboardPanel, placed: boolean) {\n if (!placed || !this.#delegate.getLayout()) return { movable: false, resizable: false };\n\n return {\n movable: this.#delegate.isActionAllowed(panel, 'move'),\n resizable: this.#delegate.isActionAllowed(panel, 'resize')\n };\n }\n\n #getFullscreenView(id: string): 'selected' | 'excluded' | undefined {\n if (!this.#delegate.fullscreen.active) return undefined;\n\n return this.#delegate.fullscreen.targetPanelId === id ? 'selected' : 'excluded';\n }\n\n #getFullscreenControl(id: string): 'enter' | 'exit' | 'unavailable' | undefined {\n if (this.#delegate.fullscreen.isSelectedPanel(id)) return 'exit';\n if (!this.#host.fullscreenable) return undefined;\n\n return this.#delegate.fullscreen.canEnter(id) ? 'enter' : 'unavailable';\n }\n\n getPanelLabel(id: string) {\n return this.panels.find(panel => panel.id === id)?._getLabel() || id;\n }\n\n async revealKeyboardControl(\n layout: DashboardLayout,\n control: {\n panel: DashboardPanel;\n element: HTMLElement;\n action: DashboardAction;\n }\n ) {\n await this.#host.updateComplete;\n\n const { panel, element, action } = control;\n if (!this.#host.isConnected || this.#delegate.getPointerPresentation()?.canvasPlacement) return;\n if (!this.panels.includes(panel) || panel.shadowRoot?.activeElement !== element) return;\n if (!this.#delegate.isActionAllowed(panel, action)) return;\n\n const current = this.#delegate.getCanonicalLayout();\n if (!current || serializeDashboardValue(current) !== serializeDashboardValue(layout)) return;\n\n this.#delegate.measure();\n this.#revealControl({ panel, control: element, action, layout: current });\n }\n\n #revealControl(input: {\n panel: DashboardPanel;\n control: HTMLElement;\n action: DashboardAction;\n layout: DashboardLayout;\n }) {\n const { panel, control, action, layout } = input;\n const viewport = this.viewport;\n const canvas = this.#host.shadowRoot?.querySelector<HTMLElement>('.canvas');\n const item = layout.items.find(candidate => candidate.id === panel.id);\n const metrics = this.#delegate.getMetrics();\n if (!viewport || !canvas || !item || !metrics) {\n return;\n }\n\n const origin = canvas.getBoundingClientRect();\n const target = getDashboardPixelPlacement(item, metrics);\n const rect = getProjectedControlRect(\n {\n control: getDashboardClientRect(control),\n current: getDashboardClientRect(panel),\n target: getDashboardPlacementClientRect(\n target,\n { x: origin.left, y: origin.top, width: origin.width, height: origin.height },\n this.#host.matches(':dir(rtl)') ? 'rtl' : 'ltr'\n )\n },\n {\n right: action === 'resize' ? !panel.matches(':dir(rtl)') : panel.matches(':dir(rtl)'),\n bottom: action === 'resize'\n }\n );\n\n this.#scrollViewportTo(rect);\n }\n\n #revealFocusedContent(previousTargetId: string | undefined, targetId: string | undefined) {\n if (!previousTargetId || targetId) return;\n\n const active = getActiveElement(this.#host.ownerDocument);\n if (\n !(active instanceof HTMLElement) ||\n !active.isConnected ||\n !this.panels.some(panel => panel.matches(':focus-within'))\n ) {\n return;\n }\n\n this.#scrollViewportTo(getDashboardClientRect(active));\n }\n\n #scrollViewportTo(rect: Rect) {\n const viewport = this.viewport;\n if (!viewport) return;\n\n const bounds = viewport.getBoundingClientRect();\n const delta = getRevealScrollDelta(rect, {\n x: bounds.left,\n y: bounds.top,\n width: viewport.clientWidth,\n height: viewport.clientHeight\n });\n\n viewport.scrollBy(delta.x, delta.y);\n }\n\n #focus = (event: FocusEvent) => {\n if (this.#delegate.getPointerPresentation()?.canvasPlacement) return;\n\n const path = event.composedPath();\n if (!path.some(node => node instanceof HTMLElement && this.panels.some(panel => panel === node))) {\n return;\n }\n\n path\n .find((node): node is HTMLElement => node instanceof HTMLElement)\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n };\n}\n"],"mappings":"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"}