@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,23 @@
1
+ import type { ReactiveControllerHost } from 'lit';
2
+ interface DashboardFullscreenHost extends HTMLElement, ReactiveControllerHost {
3
+ readonly fullscreenable: boolean;
4
+ }
5
+ interface DashboardFullscreenDelegate {
6
+ readonly hasPanel: (id: string) => boolean;
7
+ readonly cancelInteractions: () => void;
8
+ readonly invalidateCommandAvailability: () => void;
9
+ }
10
+ /** Selects one supplied dashboard panel for fullscreen presentation. */
11
+ export declare class DashboardFullscreenController {
12
+ #private;
13
+ constructor(host: DashboardFullscreenHost, delegate: DashboardFullscreenDelegate);
14
+ get active(): boolean;
15
+ get targetPanelId(): string | undefined;
16
+ get canExit(): boolean;
17
+ hostUpdate(): void;
18
+ isSelectedPanel(id: string): boolean;
19
+ canEnter(id: string): boolean;
20
+ enter(id: string): void;
21
+ exit(): void;
22
+ }
23
+ export {};
@@ -0,0 +1,46 @@
1
+ import { NativeFullscreenController as e } from "../../internal/controllers/native-fullscreen.controller.js";
2
+ // src/dashboard/controllers/fullscreen.controller.ts
3
+ var t = class {
4
+ #e;
5
+ #t;
6
+ #n;
7
+ #r;
8
+ constructor(t, n) {
9
+ this.#e = t, this.#t = n, this.#n = new e(t, this.#i), t.addController(this);
10
+ }
11
+ get active() {
12
+ return this.#r !== void 0 && this.#n.active;
13
+ }
14
+ get targetPanelId() {
15
+ return this.active ? this.#r : void 0;
16
+ }
17
+ get canExit() {
18
+ return this.#r !== void 0 && this.#n.canExit;
19
+ }
20
+ hostUpdate() {
21
+ this.#r && !this.#t.hasPanel(this.#r) && this.exit();
22
+ }
23
+ isSelectedPanel(e) {
24
+ return this.#r === e;
25
+ }
26
+ canEnter(e) {
27
+ return this.isSelectedPanel(e) || !this.#e.fullscreenable || !this.#t.hasPanel(e) ? !1 : this.#n.canEnter;
28
+ }
29
+ enter(e) {
30
+ if (!this.canEnter(e)) return;
31
+ let t = this.#r !== void 0;
32
+ this.#t.cancelInteractions(), this.#r = e, t ? this.#a() : this.#n.enter();
33
+ }
34
+ exit() {
35
+ this.#n.exit();
36
+ }
37
+ #i = () => {
38
+ this.#n.canExit || (this.#r = void 0), this.#a();
39
+ };
40
+ #a() {
41
+ this.#t.invalidateCommandAvailability(), this.#e.requestUpdate();
42
+ }
43
+ };
44
+ export { t as DashboardFullscreenController };
45
+
46
+ //# sourceMappingURL=fullscreen.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fullscreen.controller.js","names":["DashboardFullscreenController","#host","host","#delegate","delegate","#native","NativeFullscreenController","#nativeChanged","#targetPanelId","id","switching","#invalidate"],"sources":["../../../src/dashboard/controllers/fullscreen.controller.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactiveControllerHost } from 'lit';\n\nimport { NativeFullscreenController } from '@nvidia-elements/core/internal';\n\ninterface DashboardFullscreenHost extends HTMLElement, ReactiveControllerHost {\n readonly fullscreenable: boolean;\n}\n\ninterface DashboardFullscreenDelegate {\n readonly hasPanel: (id: string) => boolean;\n readonly cancelInteractions: () => void;\n readonly invalidateCommandAvailability: () => void;\n}\n\n/** Selects one supplied dashboard panel for fullscreen presentation. */\nexport class DashboardFullscreenController {\n readonly #host: DashboardFullscreenHost;\n readonly #delegate: DashboardFullscreenDelegate;\n readonly #native: NativeFullscreenController;\n #targetPanelId?: string;\n\n constructor(host: DashboardFullscreenHost, delegate: DashboardFullscreenDelegate) {\n this.#host = host;\n this.#delegate = delegate;\n this.#native = new NativeFullscreenController(host, this.#nativeChanged);\n host.addController(this);\n }\n\n get active() {\n return this.#targetPanelId !== undefined && this.#native.active;\n }\n\n get targetPanelId() {\n return this.active ? this.#targetPanelId : undefined;\n }\n\n get canExit() {\n return this.#targetPanelId !== undefined && this.#native.canExit;\n }\n\n hostUpdate() {\n if (this.#targetPanelId && !this.#delegate.hasPanel(this.#targetPanelId)) {\n this.exit();\n }\n }\n\n isSelectedPanel(id: string) {\n return this.#targetPanelId === id;\n }\n\n canEnter(id: string) {\n if (this.isSelectedPanel(id) || !this.#host.fullscreenable || !this.#delegate.hasPanel(id)) {\n return false;\n }\n\n return this.#native.canEnter;\n }\n\n enter(id: string) {\n if (!this.canEnter(id)) return;\n\n const switching = this.#targetPanelId !== undefined;\n\n this.#delegate.cancelInteractions();\n this.#targetPanelId = id;\n\n if (switching) {\n this.#invalidate();\n } else {\n this.#native.enter();\n }\n }\n\n exit() {\n this.#native.exit();\n }\n\n #nativeChanged = () => {\n if (!this.#native.canExit) {\n this.#targetPanelId = undefined;\n }\n\n this.#invalidate();\n };\n\n #invalidate() {\n this.#delegate.invalidateCommandAvailability();\n this.#host.requestUpdate();\n }\n}\n"],"mappings":";;AAkBA,IAAaA,IAAb,MAA2C;CACzC;CACA;CACA;CACA;CAEA,YAAY,GAA+B,GAAuC;EAIhF,AAHA,KAAKC,KAAQC,GACb,KAAKC,KAAYC,GACjB,KAAKC,KAAU,IAAIC,EAA2BJ,GAAM,KAAKK,EAAc,GACvEL,EAAK,cAAc,IAAI;CACzB;CAEA,IAAI,SAAS;EACX,OAAO,KAAKM,OAAmB,KAAA,KAAa,KAAKH,GAAQ;CAC3D;CAEA,IAAI,gBAAgB;EAClB,OAAO,KAAK,SAAS,KAAKG,KAAiB,KAAA;CAC7C;CAEA,IAAI,UAAU;EACZ,OAAO,KAAKA,OAAmB,KAAA,KAAa,KAAKH,GAAQ;CAC3D;CAEA,aAAa;EACX,AAAI,KAAKG,MAAkB,CAAC,KAAKL,GAAU,SAAS,KAAKK,EAAc,KACrE,KAAK,KAAK;CAEd;CAEA,gBAAgB,GAAY;EAC1B,OAAO,KAAKA,OAAmBC;CACjC;CAEA,SAAS,GAAY;EAKnB,OAJI,KAAK,gBAAgBA,CAAE,KAAK,CAAC,KAAKR,GAAM,kBAAkB,CAAC,KAAKE,GAAU,SAASM,CAAE,IAChF,KAGF,KAAKJ,GAAQ;CACtB;CAEA,MAAM,GAAY;EAChB,IAAI,CAAC,KAAK,SAASI,CAAE,GAAG;EAExB,IAAMC,IAAY,KAAKF,OAAmB,KAAA;EAK1C,AAHA,KAAKL,GAAU,mBAAmB,GAClC,KAAKK,KAAiBC,GAElBC,IACF,KAAKC,GAAY,IAEjB,KAAKN,GAAQ,MAAM;CAEvB;CAEA,OAAO;EACL,KAAKA,GAAQ,KAAK;CACpB;CAEA,WAAuB;EAKrB,AAJK,KAAKA,GAAQ,YAChB,KAAKG,KAAiB,KAAA,IAGxB,KAAKG,GAAY;CACnB;CAEA,KAAc;EAEZ,AADA,KAAKR,GAAU,8BAA8B,GAC7C,KAAKF,GAAM,cAAc;CAC3B;AACF"}
@@ -0,0 +1,53 @@
1
+ import type { ReactiveControllerHost } from 'lit';
2
+ import { DashboardPanel } from '../panel/panel.js';
3
+ import type { DashboardMetrics, DashboardPixelPlacement, DashboardResizeEdge } from '../utils/geometry.utils.js';
4
+ import type { DashboardAction, DashboardPointerIntent } from '../utils/intent.types.js';
5
+ import type { DashboardMovementRequest } from '../utils/movement.utils.js';
6
+ import type { DashboardGridPlacement, DashboardLayout } from '../dashboard.types.js';
7
+ /** Display state for a pointer interaction, including press and placement preview. */
8
+ export interface DashboardPointerPresentation {
9
+ readonly panel: DashboardPanel;
10
+ readonly action: DashboardAction;
11
+ readonly preview: boolean;
12
+ readonly canvasPlacement?: DashboardPixelPlacement;
13
+ readonly rejected?: boolean;
14
+ readonly initialPlacement?: DashboardGridPlacement;
15
+ readonly start?: boolean;
16
+ }
17
+ interface DashboardInteractionControl {
18
+ panel: DashboardPanel;
19
+ action: string;
20
+ element: HTMLElement;
21
+ edge?: DashboardResizeEdge;
22
+ }
23
+ interface DashboardInteractionDelegate {
24
+ getLayout(): DashboardLayout | undefined;
25
+ getArrangementStateKey(): string;
26
+ getMetrics(): DashboardMetrics | undefined;
27
+ getViewport(): HTMLElement | undefined;
28
+ isActionAllowed(panel: DashboardPanel, action: DashboardAction): boolean;
29
+ findPointerProposal(layout: DashboardLayout, request: {
30
+ readonly id: string;
31
+ readonly intent: DashboardPointerIntent;
32
+ }): DashboardLayout | undefined;
33
+ findCommandProposal(layout: DashboardLayout, id: string, request: {
34
+ readonly command: string;
35
+ readonly placement?: DashboardGridPlacement;
36
+ }): DashboardLayout | undefined;
37
+ getMovementTarget(layout: DashboardLayout, request: DashboardMovementRequest): DashboardGridPlacement | undefined;
38
+ present(layout: DashboardLayout | undefined, presentation?: DashboardPointerPresentation): void;
39
+ commit(layout: DashboardLayout): boolean;
40
+ reveal(layout: DashboardLayout, control: DashboardInteractionControl & {
41
+ action: DashboardAction;
42
+ }): void;
43
+ announce(id: string, geometry: DashboardGridPlacement, valid: boolean): void;
44
+ }
45
+ /** Owns pointer arrangement and immediate keyboard placement. */
46
+ export declare class DashboardInteractionController {
47
+ #private;
48
+ constructor(host: HTMLElement & ReactiveControllerHost, delegate: DashboardInteractionDelegate);
49
+ hostConnected(): void;
50
+ hostDisconnected(): void;
51
+ cancel(): void;
52
+ }
53
+ export {};
@@ -0,0 +1,407 @@
1
+ import { GestureController as e } from "../../internal/controllers/gesture.controller.js";
2
+ import { matchesElementName as t } from "../../internal/utils/dom.js";
3
+ import { getAnchoredResizeGeometry as n, getDashboardResizeCorner as r, isDashboardResizeEdge as i } from "../utils/geometry.utils.js";
4
+ import { serializeDashboardValue as a } from "../utils/layout.utils.js";
5
+ import { DashboardPanel as o } from "../panel/panel2.js";
6
+ // src/dashboard/controllers/interaction.controller.ts
7
+ var s = {
8
+ Home: {
9
+ move: "--move-to-start",
10
+ resize: ""
11
+ },
12
+ ArrowLeft: {
13
+ move: "--move-left",
14
+ resize: "--decrease-width"
15
+ },
16
+ ArrowRight: {
17
+ move: "--move-right",
18
+ resize: "--increase-width"
19
+ },
20
+ ArrowUp: {
21
+ move: "--move-up",
22
+ resize: "--decrease-height"
23
+ },
24
+ ArrowDown: {
25
+ move: "--move-down",
26
+ resize: "--increase-height"
27
+ }
28
+ }, c = class {
29
+ #e;
30
+ #t;
31
+ #n;
32
+ #r;
33
+ constructor(t, n) {
34
+ this.#e = t, this.#t = n;
35
+ let r = new e(t, {
36
+ claimPriority: "descendant-first",
37
+ suppressNativeDrag: !0,
38
+ shouldIgnoreEvent: (e) => !this.#i(e)
39
+ });
40
+ r.target = t, t.addController(this);
41
+ }
42
+ hostConnected() {
43
+ this.#e.addEventListener("nve-gesture-input", this.#g), this.#e.addEventListener("nve-gesture", this.#_), this.#e.addEventListener("click", this.#d, !0), this.#e.addEventListener("keydown", this.#f);
44
+ }
45
+ hostDisconnected() {
46
+ this.cancel(), this.#e.removeEventListener("nve-gesture-input", this.#g), this.#e.removeEventListener("nve-gesture", this.#_), this.#e.removeEventListener("click", this.#d, !0), this.#e.removeEventListener("keydown", this.#f);
47
+ }
48
+ cancel() {
49
+ this.#s(!1);
50
+ }
51
+ #i(e) {
52
+ let n = e.composedPath(), r = n.find((e) => e instanceof HTMLElement && t(e, o) && e.parentElement === this.#e);
53
+ if (!r) return;
54
+ let a = n.find((e) => e instanceof HTMLElement && e.getRootNode() === r.shadowRoot && !!e.dataset.dashboardAction);
55
+ if (!a) return;
56
+ let s = a.dataset.dashboardEdge;
57
+ if (!i(s)) return {
58
+ panel: r,
59
+ element: a,
60
+ action: a.dataset.dashboardAction ?? ""
61
+ };
62
+ let c = r.shadowRoot?.querySelector("[data-dashboard-action=\"resize\"]:not([data-dashboard-edge])");
63
+ return c ? {
64
+ panel: r,
65
+ element: c,
66
+ action: "resize",
67
+ edge: s
68
+ } : void 0;
69
+ }
70
+ #a(e, t) {
71
+ if (this.#n || !this.#o(e)) return !1;
72
+ let n = this.#t.getLayout(), r = this.#t.getMetrics(), i = n?.items.find((t) => t.id === e.panel.id);
73
+ return !n || !r || !i || !this.#t.isActionAllowed(e.panel, t) ? !1 : (this.#n = {
74
+ panel: e.panel,
75
+ ...v(e, t),
76
+ initialLayout: n,
77
+ initialMetrics: r,
78
+ control: e.element,
79
+ stateKey: this.#t.getArrangementStateKey(),
80
+ readingDirection: this.#e.matches(":dir(rtl)") ? "rtl" : "ltr",
81
+ proposed: n
82
+ }, !0);
83
+ }
84
+ #o(e) {
85
+ return this.#e.isConnected && e.panel.parentElement === this.#e && !e.panel.hidden && !e.panel.slot && e.element.getRootNode() === e.panel.shadowRoot;
86
+ }
87
+ #s(e) {
88
+ let t = this.#n;
89
+ if (!t) return;
90
+ this.#n = void 0, this.#r !== void 0 && cancelAnimationFrame(this.#r), this.#r = void 0, this.#O(t), this.#t.present(void 0);
91
+ let n = e ? this.#c(t) : void 0;
92
+ n && this.#t.commit(n);
93
+ }
94
+ #c(e) {
95
+ if (e.stateKey !== this.#t.getArrangementStateKey() || !e.proposed || !this.#o({
96
+ panel: e.panel,
97
+ element: e.control,
98
+ action: e.action
99
+ }) || !this.#t.isActionAllowed(e.panel, e.action)) return;
100
+ let t = this.#l(e);
101
+ return t && a(t) === a(e.proposed) ? t : void 0;
102
+ }
103
+ #l(e) {
104
+ return e.intent ? this.#t.findPointerProposal(e.initialLayout, {
105
+ id: e.panel.id,
106
+ intent: e.intent
107
+ }) : e.initialLayout;
108
+ }
109
+ #u(e, t) {
110
+ let n = this.#n;
111
+ if (!n) return;
112
+ let r = e.geometry, i = e.kind === "anchored-resize" ? r : this.#t.getMovementTarget(n.initialLayout, {
113
+ id: n.panel.id,
114
+ geometry: r
115
+ });
116
+ n.intent = {
117
+ ...e,
118
+ geometry: i ?? r
119
+ };
120
+ let a = i && this.#l(n);
121
+ n.proposed = a;
122
+ let o = e.kind === "start";
123
+ this.#t.present(a ?? n.initialLayout, {
124
+ panel: n.panel,
125
+ action: n.action,
126
+ preview: !0,
127
+ rejected: !a,
128
+ start: o,
129
+ initialPlacement: n.initialLayout.items.find((e) => e.id === n.panel.id),
130
+ canvasPlacement: t
131
+ });
132
+ let s = n.proposed?.items.find((e) => e.id === n.panel.id);
133
+ this.#t.announce(n.panel.id, s ?? r, !!a);
134
+ }
135
+ #d = (e) => {
136
+ this.#i(e) && (e.preventDefault(), e.stopImmediatePropagation());
137
+ };
138
+ #f = (e) => {
139
+ let t = this.#i(e);
140
+ if (!t) return;
141
+ if (t.element.removeAttribute("data-pointer-focus"), this.#n?.pointer) {
142
+ this.#m(e);
143
+ return;
144
+ }
145
+ let { action: n } = t;
146
+ if (!b(n)) return;
147
+ let i = y(e.key, n, r(t.panel) === "bottom-left");
148
+ if (!i || !this.#o(t) || !this.#t.isActionAllowed(t.panel, n)) return;
149
+ e.preventDefault(), e.stopPropagation();
150
+ let a = {
151
+ ...t,
152
+ action: n
153
+ };
154
+ this.#p(e, a) || this.#h(a, i);
155
+ };
156
+ #p(e, t) {
157
+ if (t.action !== "move" || !d(e)) return !1;
158
+ let n = this.#t.getLayout();
159
+ if (!n) return !1;
160
+ let r = n.items.find((e) => e.id === t.panel.id);
161
+ if (!r) return !1;
162
+ let i = n.grid.flow === "vertical" ? "column" : "row", a = f(e.key, i, this.#e.matches(":dir(rtl)"));
163
+ if (!a) return !1;
164
+ let o = i === "column" ? "columnSpan" : "rowSpan", s = r[i] + a;
165
+ return s < 0 || s + r[o] > n.grid.tracks ? this.#t.announce(r.id, r, !1) : this.#h(t, "--move-to-start", {
166
+ ...r,
167
+ [i]: s
168
+ }), !0;
169
+ }
170
+ #m(e) {
171
+ (e.key === "Escape" || e.key === "Enter") && (e.preventDefault(), e.stopPropagation(), this.#s(e.key === "Enter"));
172
+ }
173
+ #h(e, t, n) {
174
+ let r = this.#t.getLayout(), i = r?.items.find((t) => t.id === e.panel.id);
175
+ if (!r || !i) return;
176
+ let a = this.#t.findCommandProposal(r, i.id, {
177
+ command: t,
178
+ placement: n
179
+ }), o = a?.items.find((e) => e.id === i.id);
180
+ this.#t.announce(i.id, o ?? i, !!o);
181
+ let s = a && this.#t.commit(a) ? a : r;
182
+ this.#t.reveal(s, e);
183
+ }
184
+ #g = (e) => {
185
+ if (e.target !== this.#e) return;
186
+ let t = e.detail;
187
+ t.kind === "pointerdown" ? this.#v(t) : t.kind === "pointerend" && this.#E(t);
188
+ };
189
+ #_ = (e) => {
190
+ e.target === this.#e && e.detail.kind === "drag" && this.#S(e.detail.event);
191
+ };
192
+ #v(e) {
193
+ let t = e.event;
194
+ if (this.#n?.pointer) return;
195
+ let n = this.#y(t);
196
+ if (!n || !this.#a(n, n.action)) return;
197
+ let r = this.#n, i = this.#t.getViewport();
198
+ !r || !i || !e.claim({ kind: "drag" }) ? this.cancel() : this.#b({
199
+ event: t,
200
+ session: r,
201
+ viewport: i
202
+ });
203
+ }
204
+ #y(e) {
205
+ if (e.button !== 0 || !e.isPrimary) return;
206
+ let t = this.#i(e);
207
+ if (!t || t.edge && e.pointerType !== "mouse" && e.pointerType !== "pen") return;
208
+ let { action: n } = t;
209
+ return b(n) ? {
210
+ ...t,
211
+ action: n
212
+ } : void 0;
213
+ }
214
+ #b(e) {
215
+ let { event: t, session: n, viewport: r } = e, i = r.querySelector(".canvas");
216
+ if (!i) return;
217
+ let a = this.#x(n.panel, i, t);
218
+ if (n.pointer = {
219
+ id: t.pointerId,
220
+ x: t.clientX,
221
+ y: t.clientY,
222
+ currentX: t.clientX,
223
+ currentY: t.clientY,
224
+ moved: !1,
225
+ scrollTargets: u(r),
226
+ ...a
227
+ }, this.#t.present(n.initialLayout, {
228
+ panel: n.panel,
229
+ action: n.action,
230
+ preview: !1,
231
+ canvasPlacement: a.initialPixelPlacement
232
+ }), t.preventDefault(), n.control.setAttribute("data-pointer-focus", ""), n.control.focus({ preventScroll: !0 }), this.#n === n && n.pointer) for (let e of n.pointer.scrollTargets) e.addEventListener("scroll", this.#k, { passive: !0 });
233
+ }
234
+ #x(e, t, n) {
235
+ let r = t.getBoundingClientRect(), i = e.getBoundingClientRect(), a = this.#e.matches(":dir(rtl)") ? "rtl" : "ltr";
236
+ return {
237
+ initialPixelPlacement: {
238
+ inlineStart: p(a === "rtl" ? i.right : i.left, r, a),
239
+ top: i.top - r.top,
240
+ width: i.width,
241
+ height: i.height
242
+ },
243
+ grabX: p(n.clientX, i, a),
244
+ grabY: n.clientY - i.top
245
+ };
246
+ }
247
+ #S = (e) => {
248
+ let t = this.#n?.pointer;
249
+ t && e.pointerId === t.id && (t.currentX = e.clientX, t.currentY = e.clientY, t.moved ||= Math.hypot(e.clientX - t.x, e.clientY - t.y) >= 3, t.moved && (e.preventDefault(), this.#C(), this.#w()));
250
+ };
251
+ #C() {
252
+ let e = this.#n, t = e?.pointer, n = this.#t.getViewport(), r = n?.querySelector(".canvas");
253
+ if (!e || !t || !n || !r) return;
254
+ if (e.stateKey !== this.#t.getArrangementStateKey()) {
255
+ this.cancel();
256
+ return;
257
+ }
258
+ let i = e.initialLayout.items.find((t) => t.id === e.panel.id);
259
+ if (!i) return;
260
+ let a = {
261
+ session: e,
262
+ pointer: t,
263
+ viewport: n,
264
+ source: i,
265
+ canvasClientRect: r.getBoundingClientRect()
266
+ }, o = m(a);
267
+ this.#u(h(a, o.geometry), o.canvasPlacement);
268
+ }
269
+ #w() {
270
+ this.#r === void 0 && (this.#r = requestAnimationFrame(() => this.#T()));
271
+ }
272
+ #T() {
273
+ this.#r = void 0;
274
+ let e = this.#n?.pointer, t = this.#t.getViewport();
275
+ if (!e?.moved || !t) return;
276
+ let n = t.getBoundingClientRect(), r = l(e.currentX, n.left, n.right), i = l(e.currentY, n.top, n.bottom), a = t.scrollLeft, o = t.scrollTop;
277
+ t.scrollBy(r, i), (t.scrollLeft !== a || t.scrollTop !== o) && (this.#C(), this.#w());
278
+ }
279
+ #E(e) {
280
+ let t = e.event, n = this.#n?.pointer;
281
+ n && n.id === t.pointerId && (n.currentX = e.clientX, n.currentY = e.clientY, n.moved ||= Math.hypot(e.clientX - n.x, e.clientY - n.y) >= 3, e.interrupted ? this.cancel() : n.moved ? this.#D() : this.cancel());
282
+ }
283
+ #D() {
284
+ !this.#n || this.#n.stateKey !== this.#t.getArrangementStateKey() || this.#n.proposed && !this.#c(this.#n) ? this.cancel() : (this.#C(), this.#s(!0));
285
+ }
286
+ #O(e) {
287
+ for (let t of e.pointer?.scrollTargets ?? []) t.removeEventListener("scroll", this.#k);
288
+ e.pointer = void 0;
289
+ }
290
+ #k = (e) => {
291
+ e.target === e.currentTarget && this.#n?.pointer?.moved && this.#C();
292
+ };
293
+ };
294
+ function l(e, t, n) {
295
+ return e < t + 24 ? -12 : e > n - 24 ? 12 : 0;
296
+ }
297
+ function u(e) {
298
+ let t = [], n = e;
299
+ for (; n;) t.push(n), n = n instanceof Element && n.assignedSlot || n.parentNode || (n instanceof ShadowRoot ? n.host : null);
300
+ return t;
301
+ }
302
+ function d(e) {
303
+ return e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey;
304
+ }
305
+ function f(e, t, n) {
306
+ return e === (t === "column" ? n ? "ArrowRight" : "ArrowLeft" : "ArrowUp") ? -1 : +(e === (t === "column" ? n ? "ArrowLeft" : "ArrowRight" : "ArrowDown"));
307
+ }
308
+ function p(e, t, n) {
309
+ return n === "rtl" ? t.right - e : e - t.left;
310
+ }
311
+ function m(e) {
312
+ let { session: t, pointer: r, source: i, canvasClientRect: a } = e, o = r.initialPixelPlacement, s = {
313
+ inline: p(r.currentX, a, t.readingDirection) - r.grabX - o.inlineStart,
314
+ vertical: r.currentY - a.top - r.grabY - o.top
315
+ }, c = t.initialMetrics;
316
+ return t.action === "resize" ? n({
317
+ source: i,
318
+ initialPixelPlacement: o,
319
+ delta: s,
320
+ edge: t.edge,
321
+ grid: t.initialLayout.grid,
322
+ limits: t.panel._getSpanConstraints(),
323
+ readingDirection: t.readingDirection
324
+ }, c) : {
325
+ canvasPlacement: {
326
+ ...o,
327
+ inlineStart: o.inlineStart + s.inline,
328
+ top: o.top + s.vertical
329
+ },
330
+ geometry: {
331
+ ...i,
332
+ column: (o.inlineStart + s.inline) / (c.columnSize + c.gap),
333
+ row: (o.top + s.vertical) / (c.rowSize + c.gap)
334
+ }
335
+ };
336
+ }
337
+ function h(e, t) {
338
+ let { session: n, pointer: r, canvasClientRect: i } = e;
339
+ if (n.action === "resize") return {
340
+ kind: "anchored-resize",
341
+ geometry: t,
342
+ edge: n.edge
343
+ };
344
+ if (_(e)) return {
345
+ kind: "start",
346
+ geometry: t
347
+ };
348
+ let { columnSize: a, rowSize: o, gap: s } = n.initialMetrics;
349
+ return {
350
+ kind: "pointer",
351
+ geometry: t,
352
+ position: {
353
+ aimGeometry: t,
354
+ pointerPosition: {
355
+ column: p(r.currentX, i, n.readingDirection) / (a + s),
356
+ row: (r.currentY - i.top) / (o + s)
357
+ },
358
+ spacingFraction: {
359
+ column: s / (a + s),
360
+ row: s / (o + s)
361
+ }
362
+ }
363
+ };
364
+ }
365
+ function g(e) {
366
+ let { session: t, pointer: n, canvasClientRect: r, viewport: i } = e;
367
+ if (t.initialLayout.grid.flow === "vertical") return {
368
+ distance: n.currentY - r.top,
369
+ travel: n.currentY - n.y,
370
+ scroll: i.scrollTop,
371
+ boundedPosition: n.currentX,
372
+ boundedStart: r.left,
373
+ boundedEnd: r.right
374
+ };
375
+ let a = t.readingDirection === "rtl";
376
+ return {
377
+ distance: p(n.currentX, r, t.readingDirection),
378
+ travel: (n.currentX - n.x) * (a ? -1 : 1),
379
+ scroll: i.scrollLeft,
380
+ boundedPosition: n.currentY,
381
+ boundedStart: r.top,
382
+ boundedEnd: r.bottom
383
+ };
384
+ }
385
+ function _(e) {
386
+ let { distance: t, travel: n, scroll: r, boundedPosition: i, boundedStart: a, boundedEnd: o } = g(e);
387
+ return e.session.action === "move" && Math.abs(r) <= 1 && t <= 8 && n <= -3 && i >= a && i <= o;
388
+ }
389
+ function v(e, t) {
390
+ return t === "resize" ? {
391
+ action: t,
392
+ edge: e.edge ?? r(e.panel)
393
+ } : { action: t };
394
+ }
395
+ function y(e, t, n) {
396
+ if (t === "resize" && n) {
397
+ if (e === "ArrowLeft") return "--increase-width";
398
+ if (e === "ArrowRight") return "--decrease-width";
399
+ }
400
+ return s[e]?.[t];
401
+ }
402
+ function b(e) {
403
+ return e === "move" || e === "resize";
404
+ }
405
+ export { c as DashboardInteractionController };
406
+
407
+ //# sourceMappingURL=interaction.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.controller.js","names":["keyCommands","DashboardInteractionController","#host","host","#delegate","delegate","gesture","GestureController","#findControl","event","#input","#movement","#click","#keydown","#finish","path","panel","node","matchesElementName","DashboardPanel","element","edge","isDashboardResizeEdge","grip","#session","#owns","control","layout","metrics","source","item","action","getPointerArrangementAction","session","#frame","#endPointerTracking","admitted","commit","#admit","#propose","serializeDashboardValue","geometry","intent","target","proposed","start","actual","#handlePointerKey","isDashboardAction","command","getKeyboardCommand","getDashboardResizeCorner","#moveAcrossGrowthStart","#applyKeyboardStep","hasOnlyShiftModifier","boundedAxis","step","getBoundedAxisStartStep","size","coordinate","expected","input","#handlePointerDown","#handlePointerEnd","#pointerMove","#findPointerControl","#begin","viewport","#beginPointerTracking","canvas","#measurePointerOrigin","getScrollAncestors","#scroll","canvasClientRect","visual","readingDirection","getInlineOffset","pointer","#updatePointer","#scheduleScroll","sample","getPointerGeometry","#preview","createPointerIntent","#scrollFrame","bounds","dx","getEdgeScrollSpeed","dy","left","top","#finishPointerMove","position","end","targets","key","isRtl","clientX","initialPixelPlacement","delta","getAnchoredResizeGeometry","isAtGrowthStart","columnSize","gap","rowSize","getGrowthStartSample","scroll","distance","travel","boundedPosition","boundedStart","boundedEnd","value"],"sources":["../../../src/dashboard/controllers/interaction.controller.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactiveControllerHost } from 'lit';\n\nimport {\n type Gesture,\n GestureController,\n type GestureInput,\n matchesElementName,\n type PointerDownInput,\n type PointerEndGesture\n} from '@nvidia-elements/core/internal';\n\nimport { getAnchoredResizeGeometry, getDashboardResizeCorner, isDashboardResizeEdge } from '../utils/geometry.utils.js';\nimport { serializeDashboardValue } from '../utils/layout.utils.js';\n\nimport { DashboardPanel } from '../panel/panel.js';\n\nimport type {\n DashboardMetrics,\n DashboardPixelPlacement,\n DashboardReadingDirection,\n DashboardResizeEdge\n} from '../utils/geometry.utils.js';\nimport type { DashboardAction, DashboardGridGeometry, DashboardPointerIntent } from '../utils/intent.types.js';\nimport type { DashboardMovementRequest } from '../utils/movement.utils.js';\n\nimport type { DashboardGridPlacement, DashboardItem, DashboardLayout } from '../dashboard.types.js';\n\n/** Display state for a pointer interaction, including press and placement preview. */\nexport interface DashboardPointerPresentation {\n readonly panel: DashboardPanel;\n readonly action: DashboardAction;\n readonly preview: boolean;\n readonly canvasPlacement?: DashboardPixelPlacement;\n readonly rejected?: boolean;\n readonly initialPlacement?: DashboardGridPlacement;\n readonly start?: boolean;\n}\n\ninterface DashboardInteractionControl {\n panel: DashboardPanel;\n action: string;\n element: HTMLElement;\n edge?: DashboardResizeEdge;\n}\n\n/** Immutable starting geometry and the latest proposal for one pointer interaction. */\ninterface PointerArrangementState {\n readonly panel: DashboardPanel;\n readonly initialLayout: DashboardLayout;\n readonly initialMetrics: DashboardMetrics;\n readonly control: HTMLElement;\n readonly stateKey: string;\n readonly readingDirection: DashboardReadingDirection;\n intent?: DashboardPointerIntent;\n proposed?: DashboardLayout;\n pointer?: {\n id: number;\n x: number;\n y: number;\n grabX: number;\n grabY: number;\n currentX: number;\n currentY: number;\n moved: boolean;\n initialPixelPlacement: DashboardPixelPlacement;\n scrollTargets: readonly Node[];\n };\n}\n\ntype PointerArrangementAction =\n | { readonly action: 'move' }\n | { readonly action: 'resize'; readonly edge: DashboardResizeEdge };\n\ntype PointerArrangementSession = PointerArrangementState & PointerArrangementAction;\n\ninterface DashboardInteractionDelegate {\n getLayout(): DashboardLayout | undefined;\n getArrangementStateKey(): string;\n getMetrics(): DashboardMetrics | undefined;\n getViewport(): HTMLElement | undefined;\n isActionAllowed(panel: DashboardPanel, action: DashboardAction): boolean;\n findPointerProposal(\n layout: DashboardLayout,\n request: {\n readonly id: string;\n readonly intent: DashboardPointerIntent;\n }\n ): DashboardLayout | undefined;\n findCommandProposal(\n layout: DashboardLayout,\n id: string,\n request: { readonly command: string; readonly placement?: DashboardGridPlacement }\n ): DashboardLayout | undefined;\n getMovementTarget(layout: DashboardLayout, request: DashboardMovementRequest): DashboardGridPlacement | undefined;\n present(layout: DashboardLayout | undefined, presentation?: DashboardPointerPresentation): void;\n commit(layout: DashboardLayout): boolean;\n reveal(layout: DashboardLayout, control: DashboardInteractionControl & { action: DashboardAction }): void;\n announce(id: string, geometry: DashboardGridPlacement, valid: boolean): void;\n}\n\nconst keyCommands: Readonly<Record<string, Record<DashboardAction, string>>> = {\n Home: { move: '--move-to-start', resize: '' },\n ArrowLeft: { move: '--move-left', resize: '--decrease-width' },\n ArrowRight: { move: '--move-right', resize: '--increase-width' },\n ArrowUp: { move: '--move-up', resize: '--decrease-height' },\n ArrowDown: { move: '--move-down', resize: '--increase-height' }\n};\n\n/** Owns pointer arrangement and immediate keyboard placement. */\nexport class DashboardInteractionController {\n readonly #host: HTMLElement & ReactiveControllerHost;\n readonly #delegate: DashboardInteractionDelegate;\n #session?: PointerArrangementSession;\n #frame?: number;\n\n constructor(host: HTMLElement & ReactiveControllerHost, delegate: DashboardInteractionDelegate) {\n this.#host = host;\n this.#delegate = delegate;\n\n const gesture = new GestureController(host, {\n claimPriority: 'descendant-first',\n suppressNativeDrag: true,\n shouldIgnoreEvent: event => !this.#findControl(event)\n });\n\n gesture.target = host;\n host.addController(this);\n }\n\n hostConnected() {\n this.#host.addEventListener('nve-gesture-input', this.#input as EventListener);\n this.#host.addEventListener('nve-gesture', this.#movement as EventListener);\n this.#host.addEventListener('click', this.#click, true);\n this.#host.addEventListener('keydown', this.#keydown);\n }\n\n hostDisconnected() {\n this.cancel();\n this.#host.removeEventListener('nve-gesture-input', this.#input as EventListener);\n this.#host.removeEventListener('nve-gesture', this.#movement as EventListener);\n this.#host.removeEventListener('click', this.#click, true);\n this.#host.removeEventListener('keydown', this.#keydown);\n }\n\n cancel() {\n this.#finish(false);\n }\n\n #findControl(event: Event) {\n const path = event.composedPath();\n const panel = path.find(\n (node): node is DashboardPanel =>\n node instanceof HTMLElement && matchesElementName(node, DashboardPanel) && node.parentElement === this.#host\n );\n if (!panel) return undefined;\n\n const element = path.find(\n (node): node is HTMLElement =>\n node instanceof HTMLElement && node.getRootNode() === panel.shadowRoot && !!node.dataset.dashboardAction\n );\n if (!element) return undefined;\n\n const edge = element.dataset.dashboardEdge;\n if (!isDashboardResizeEdge(edge)) return { panel, element, action: element.dataset.dashboardAction ?? '' };\n\n const grip = panel.shadowRoot?.querySelector<HTMLElement>(\n '[data-dashboard-action=\"resize\"]:not([data-dashboard-edge])'\n );\n\n return grip ? { panel, element: grip, action: 'resize', edge } : undefined;\n }\n\n #begin(control: DashboardInteractionControl, action: DashboardAction): boolean {\n if (this.#session || !this.#owns(control)) return false;\n\n const layout = this.#delegate.getLayout();\n const metrics = this.#delegate.getMetrics();\n const source = layout?.items.find(item => item.id === control.panel.id);\n if (!layout || !metrics || !source || !this.#delegate.isActionAllowed(control.panel, action)) {\n return false;\n }\n\n this.#session = {\n panel: control.panel,\n ...getPointerArrangementAction(control, action),\n initialLayout: layout,\n initialMetrics: metrics,\n control: control.element,\n stateKey: this.#delegate.getArrangementStateKey(),\n readingDirection: this.#host.matches(':dir(rtl)') ? 'rtl' : 'ltr',\n proposed: layout\n };\n\n return true;\n }\n\n #owns(control: DashboardInteractionControl) {\n return (\n this.#host.isConnected &&\n control.panel.parentElement === this.#host &&\n !control.panel.hidden &&\n !control.panel.slot &&\n control.element.getRootNode() === control.panel.shadowRoot\n );\n }\n\n #finish(commit: boolean) {\n const session = this.#session;\n if (!session) return;\n\n this.#session = undefined;\n\n if (this.#frame !== undefined) {\n cancelAnimationFrame(this.#frame);\n }\n\n this.#frame = undefined;\n this.#endPointerTracking(session);\n this.#delegate.present(undefined);\n\n const admitted = commit ? this.#admit(session) : undefined;\n\n if (admitted) {\n this.#delegate.commit(admitted);\n }\n }\n\n #admit(session: PointerArrangementSession): DashboardLayout | undefined {\n if (\n session.stateKey !== this.#delegate.getArrangementStateKey() ||\n !session.proposed ||\n !this.#owns({\n panel: session.panel,\n element: session.control,\n action: session.action\n }) ||\n !this.#delegate.isActionAllowed(session.panel, session.action)\n ) {\n return undefined;\n }\n\n const admitted = this.#propose(session);\n\n return admitted && serializeDashboardValue(admitted) === serializeDashboardValue(session.proposed)\n ? admitted\n : undefined;\n }\n\n #propose(session: PointerArrangementSession) {\n return session.intent\n ? this.#delegate.findPointerProposal(session.initialLayout, {\n id: session.panel.id,\n intent: session.intent\n })\n : session.initialLayout;\n }\n\n #preview(intent: DashboardPointerIntent, canvasPlacement?: DashboardPixelPlacement) {\n const session = this.#session;\n if (!session) return;\n\n const geometry = intent.geometry;\n const target =\n intent.kind === 'anchored-resize'\n ? geometry\n : this.#delegate.getMovementTarget(session.initialLayout, {\n id: session.panel.id,\n geometry\n });\n\n session.intent = { ...intent, geometry: target ?? geometry };\n\n const proposed = target && this.#propose(session);\n\n session.proposed = proposed;\n\n const start = intent.kind === 'start';\n\n this.#delegate.present(proposed ?? session.initialLayout, {\n panel: session.panel,\n action: session.action,\n preview: true,\n rejected: !proposed,\n start,\n initialPlacement: session.initialLayout.items.find(item => item.id === session.panel.id),\n canvasPlacement\n });\n\n const actual = session.proposed?.items.find(item => item.id === session.panel.id);\n\n this.#delegate.announce(session.panel.id, actual ?? geometry, !!proposed);\n }\n\n #click = (event: MouseEvent) => {\n const control = this.#findControl(event);\n if (!control) return;\n\n event.preventDefault();\n event.stopImmediatePropagation();\n };\n\n #keydown = (event: KeyboardEvent) => {\n const control = this.#findControl(event);\n if (!control) return;\n\n control.element.removeAttribute('data-pointer-focus');\n\n if (this.#session?.pointer) {\n this.#handlePointerKey(event);\n return;\n }\n\n const { action } = control;\n if (!isDashboardAction(action)) return;\n\n const command = getKeyboardCommand(event.key, action, getDashboardResizeCorner(control.panel) === 'bottom-left');\n if (!command || !this.#owns(control) || !this.#delegate.isActionAllowed(control.panel, action)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const admitted: DashboardInteractionControl & { action: DashboardAction } = { ...control, action };\n\n if (!this.#moveAcrossGrowthStart(event, admitted)) this.#applyKeyboardStep(admitted, command);\n };\n\n #moveAcrossGrowthStart(\n event: KeyboardEvent,\n control: DashboardInteractionControl & { action: DashboardAction }\n ): boolean {\n if (control.action !== 'move' || !hasOnlyShiftModifier(event)) return false;\n\n const layout = this.#delegate.getLayout();\n if (!layout) return false;\n\n const source = layout.items.find(item => item.id === control.panel.id);\n if (!source) return false;\n\n const boundedAxis = layout.grid.flow === 'vertical' ? 'column' : 'row';\n const step = getBoundedAxisStartStep(event.key, boundedAxis, this.#host.matches(':dir(rtl)'));\n if (!step) return false;\n\n const size = boundedAxis === 'column' ? 'columnSpan' : 'rowSpan';\n const coordinate = source[boundedAxis] + step;\n\n if (coordinate < 0 || coordinate + source[size] > layout.grid.tracks) {\n this.#delegate.announce(source.id, source, false);\n } else {\n this.#applyKeyboardStep(control, '--move-to-start', { ...source, [boundedAxis]: coordinate });\n }\n\n return true;\n }\n\n #handlePointerKey(event: KeyboardEvent) {\n if (event.key !== 'Escape' && event.key !== 'Enter') return;\n\n event.preventDefault();\n event.stopPropagation();\n this.#finish(event.key === 'Enter');\n }\n\n #applyKeyboardStep(\n control: DashboardInteractionControl & { action: DashboardAction },\n command: string,\n placement?: DashboardGridPlacement\n ) {\n const layout = this.#delegate.getLayout();\n const source = layout?.items.find(item => item.id === control.panel.id);\n if (!layout || !source) return;\n\n const proposed = this.#delegate.findCommandProposal(layout, source.id, { command, placement });\n const actual = proposed?.items.find(item => item.id === source.id);\n\n this.#delegate.announce(source.id, actual ?? source, !!actual);\n\n const expected = proposed && this.#delegate.commit(proposed) ? proposed : layout;\n\n this.#delegate.reveal(expected, control);\n }\n\n #input = (event: CustomEvent<GestureInput>) => {\n if (event.target !== this.#host) return;\n\n const input = event.detail;\n\n if (input.kind === 'pointerdown') {\n this.#handlePointerDown(input);\n } else if (input.kind === 'pointerend') {\n this.#handlePointerEnd(input);\n }\n };\n\n #movement = (event: CustomEvent<Gesture<undefined>>) => {\n if (event.target !== this.#host || event.detail.kind !== 'drag') return;\n\n this.#pointerMove(event.detail.event);\n };\n\n #handlePointerDown(input: PointerDownInput) {\n const event = input.event;\n if (this.#session?.pointer) return;\n\n const control = this.#findPointerControl(event);\n if (!control) return;\n if (!this.#begin(control, control.action)) return;\n\n const session = this.#session;\n const viewport = this.#delegate.getViewport();\n\n if (!session || !viewport || !input.claim({ kind: 'drag' })) {\n this.cancel();\n return;\n }\n\n this.#beginPointerTracking({ event, session, viewport });\n }\n\n #findPointerControl(event: PointerEvent): (DashboardInteractionControl & { action: DashboardAction }) | undefined {\n if (event.button !== 0 || !event.isPrimary) return undefined;\n\n const control = this.#findControl(event);\n if (!control) return undefined;\n if (control.edge && event.pointerType !== 'mouse' && event.pointerType !== 'pen') {\n return undefined;\n }\n\n const { action } = control;\n\n return isDashboardAction(action) ? { ...control, action } : undefined;\n }\n\n #beginPointerTracking(input: { event: PointerEvent; session: PointerArrangementSession; viewport: HTMLElement }) {\n const { event, session, viewport } = input;\n const canvas = viewport.querySelector<HTMLElement>('.canvas');\n if (!canvas) return;\n\n const geometry = this.#measurePointerOrigin(session.panel, canvas, event);\n\n session.pointer = {\n id: event.pointerId,\n x: event.clientX,\n y: event.clientY,\n currentX: event.clientX,\n currentY: event.clientY,\n moved: false,\n scrollTargets: getScrollAncestors(viewport),\n ...geometry\n };\n this.#delegate.present(session.initialLayout, {\n panel: session.panel,\n action: session.action,\n preview: false,\n canvasPlacement: geometry.initialPixelPlacement\n });\n event.preventDefault();\n session.control.setAttribute('data-pointer-focus', '');\n session.control.focus({ preventScroll: true });\n if (this.#session !== session || !session.pointer) return;\n\n for (const target of session.pointer.scrollTargets) {\n target.addEventListener('scroll', this.#scroll, { passive: true });\n }\n }\n\n #measurePointerOrigin(panel: DashboardPanel, canvas: HTMLElement, event: PointerEvent) {\n const canvasClientRect = canvas.getBoundingClientRect();\n const visual = panel.getBoundingClientRect();\n const readingDirection = this.#host.matches(':dir(rtl)') ? 'rtl' : 'ltr';\n\n return {\n initialPixelPlacement: {\n inlineStart: getInlineOffset(\n readingDirection === 'rtl' ? visual.right : visual.left,\n canvasClientRect,\n readingDirection\n ),\n top: visual.top - canvasClientRect.top,\n width: visual.width,\n height: visual.height\n },\n grabX: getInlineOffset(event.clientX, visual, readingDirection),\n grabY: event.clientY - visual.top\n };\n }\n\n #pointerMove = (event: PointerEvent) => {\n const pointer = this.#session?.pointer;\n if (!pointer || event.pointerId !== pointer.id) return;\n\n pointer.currentX = event.clientX;\n pointer.currentY = event.clientY;\n pointer.moved ||= Math.hypot(event.clientX - pointer.x, event.clientY - pointer.y) >= 3;\n if (!pointer.moved) return;\n\n event.preventDefault();\n this.#updatePointer();\n this.#scheduleScroll();\n };\n\n #updatePointer() {\n const session = this.#session;\n const pointer = session?.pointer;\n const viewport = this.#delegate.getViewport();\n const canvas = viewport?.querySelector<HTMLElement>('.canvas');\n if (!session || !pointer || !viewport || !canvas) {\n return;\n }\n\n if (session.stateKey !== this.#delegate.getArrangementStateKey()) {\n this.cancel();\n return;\n }\n\n const source = session.initialLayout.items.find(item => item.id === session.panel.id);\n if (!source) return;\n\n const sample = { session, pointer, viewport, source, canvasClientRect: canvas.getBoundingClientRect() };\n const geometry = getPointerGeometry(sample);\n\n this.#preview(createPointerIntent(sample, geometry.geometry), geometry.canvasPlacement);\n }\n\n #scheduleScroll() {\n if (this.#frame !== undefined) return;\n\n this.#frame = requestAnimationFrame(() => this.#scrollFrame());\n }\n\n #scrollFrame() {\n this.#frame = undefined;\n\n const pointer = this.#session?.pointer;\n const viewport = this.#delegate.getViewport();\n if (!pointer?.moved || !viewport) return;\n\n const bounds = viewport.getBoundingClientRect();\n const dx = getEdgeScrollSpeed(pointer.currentX, bounds.left, bounds.right);\n const dy = getEdgeScrollSpeed(pointer.currentY, bounds.top, bounds.bottom);\n const left = viewport.scrollLeft;\n const top = viewport.scrollTop;\n\n viewport.scrollBy(dx, dy);\n\n if (viewport.scrollLeft !== left || viewport.scrollTop !== top) {\n this.#updatePointer();\n this.#scheduleScroll();\n }\n }\n\n #handlePointerEnd(input: PointerEndGesture) {\n const event = input.event;\n const pointer = this.#session?.pointer;\n if (!pointer || pointer.id !== event.pointerId) return;\n\n pointer.currentX = input.clientX;\n pointer.currentY = input.clientY;\n pointer.moved ||= Math.hypot(input.clientX - pointer.x, input.clientY - pointer.y) >= 3;\n\n if (input.interrupted) {\n this.cancel();\n } else if (pointer.moved) {\n this.#finishPointerMove();\n } else {\n this.cancel();\n }\n }\n\n #finishPointerMove() {\n if (\n !this.#session ||\n this.#session.stateKey !== this.#delegate.getArrangementStateKey() ||\n (this.#session.proposed && !this.#admit(this.#session))\n ) {\n this.cancel();\n return;\n }\n\n this.#updatePointer();\n this.#finish(true);\n }\n\n #endPointerTracking(session: PointerArrangementSession) {\n for (const target of session.pointer?.scrollTargets ?? []) {\n target.removeEventListener('scroll', this.#scroll);\n }\n\n session.pointer = undefined;\n }\n\n #scroll = (event: Event) => {\n if (event.target === event.currentTarget && this.#session?.pointer?.moved) {\n this.#updatePointer();\n }\n };\n}\n\nfunction getEdgeScrollSpeed(position: number, start: number, end: number): number {\n if (position < start + 24) return -12;\n\n return position > end - 24 ? 12 : 0;\n}\n\nfunction getScrollAncestors(viewport: HTMLElement): readonly Node[] {\n const targets: Node[] = [];\n let node: Node | null = viewport;\n\n while (node) {\n targets.push(node);\n node =\n (node instanceof Element && node.assignedSlot) ||\n node.parentNode ||\n (node instanceof ShadowRoot ? node.host : null);\n }\n\n return targets;\n}\n\ninterface PointerSample {\n readonly session: PointerArrangementSession;\n readonly pointer: NonNullable<PointerArrangementSession['pointer']>;\n readonly source: DashboardItem;\n readonly viewport: HTMLElement;\n readonly canvasClientRect: DOMRectReadOnly;\n}\n\nfunction hasOnlyShiftModifier(event: KeyboardEvent): boolean {\n return event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n}\n\nfunction getBoundedAxisStartStep(key: string, boundedAxis: 'column' | 'row', isRtl: boolean): number {\n const negative = boundedAxis === 'column' ? (isRtl ? 'ArrowRight' : 'ArrowLeft') : 'ArrowUp';\n const positive = boundedAxis === 'column' ? (isRtl ? 'ArrowLeft' : 'ArrowRight') : 'ArrowDown';\n if (key === negative) return -1;\n\n return key === positive ? 1 : 0;\n}\n\nfunction getInlineOffset(\n clientX: number,\n bounds: Pick<DOMRectReadOnly, 'left' | 'right'>,\n readingDirection: DashboardReadingDirection\n): number {\n return readingDirection === 'rtl' ? bounds.right - clientX : clientX - bounds.left;\n}\n\nfunction getPointerGeometry(sample: PointerSample) {\n const { session, pointer, source, canvasClientRect } = sample;\n const initialPixelPlacement = pointer.initialPixelPlacement;\n const delta = {\n inline:\n getInlineOffset(pointer.currentX, canvasClientRect, session.readingDirection) -\n pointer.grabX -\n initialPixelPlacement.inlineStart,\n vertical: pointer.currentY - canvasClientRect.top - pointer.grabY - initialPixelPlacement.top\n };\n const metrics = session.initialMetrics;\n if (session.action === 'resize') {\n return getAnchoredResizeGeometry(\n {\n source,\n initialPixelPlacement,\n delta,\n edge: session.edge,\n grid: session.initialLayout.grid,\n limits: session.panel._getSpanConstraints(),\n readingDirection: session.readingDirection\n },\n metrics\n );\n }\n\n return {\n canvasPlacement: {\n ...initialPixelPlacement,\n inlineStart: initialPixelPlacement.inlineStart + delta.inline,\n top: initialPixelPlacement.top + delta.vertical\n },\n geometry: {\n ...source,\n column: (initialPixelPlacement.inlineStart + delta.inline) / (metrics.columnSize + metrics.gap),\n row: (initialPixelPlacement.top + delta.vertical) / (metrics.rowSize + metrics.gap)\n }\n };\n}\n\nfunction createPointerIntent(sample: PointerSample, geometry: DashboardGridGeometry): DashboardPointerIntent {\n const { session, pointer, canvasClientRect } = sample;\n if (session.action === 'resize') {\n return {\n kind: 'anchored-resize',\n geometry,\n edge: session.edge\n };\n }\n if (isAtGrowthStart(sample)) return { kind: 'start', geometry };\n\n const { columnSize, rowSize, gap } = session.initialMetrics;\n\n return {\n kind: 'pointer',\n geometry,\n position: {\n aimGeometry: geometry,\n pointerPosition: {\n column: getInlineOffset(pointer.currentX, canvasClientRect, session.readingDirection) / (columnSize + gap),\n row: (pointer.currentY - canvasClientRect.top) / (rowSize + gap)\n },\n spacingFraction: { column: gap / (columnSize + gap), row: gap / (rowSize + gap) }\n }\n };\n}\n\nfunction getGrowthStartSample(sample: PointerSample) {\n const { session, pointer, canvasClientRect, viewport } = sample;\n if (session.initialLayout.grid.flow === 'vertical') {\n return {\n distance: pointer.currentY - canvasClientRect.top,\n travel: pointer.currentY - pointer.y,\n scroll: viewport.scrollTop,\n boundedPosition: pointer.currentX,\n boundedStart: canvasClientRect.left,\n boundedEnd: canvasClientRect.right\n };\n }\n\n const isRtl = session.readingDirection === 'rtl';\n\n return {\n distance: getInlineOffset(pointer.currentX, canvasClientRect, session.readingDirection),\n travel: (pointer.currentX - pointer.x) * (isRtl ? -1 : 1),\n scroll: viewport.scrollLeft,\n boundedPosition: pointer.currentY,\n boundedStart: canvasClientRect.top,\n boundedEnd: canvasClientRect.bottom\n };\n}\n\nfunction isAtGrowthStart(sample: PointerSample): boolean {\n const { distance, travel, scroll, boundedPosition, boundedStart, boundedEnd } = getGrowthStartSample(sample);\n return (\n sample.session.action === 'move' &&\n Math.abs(scroll) <= 1 &&\n distance <= 8 &&\n travel <= -3 &&\n boundedPosition >= boundedStart &&\n boundedPosition <= boundedEnd\n );\n}\n\nfunction getPointerArrangementAction(\n control: DashboardInteractionControl,\n action: DashboardAction\n): PointerArrangementAction {\n return action === 'resize' ? { action, edge: control.edge ?? getDashboardResizeCorner(control.panel) } : { action };\n}\n\nfunction getKeyboardCommand(key: string, action: DashboardAction, isRtl: boolean): string | undefined {\n if (action === 'resize' && isRtl) {\n if (key === 'ArrowLeft') return '--increase-width';\n if (key === 'ArrowRight') return '--decrease-width';\n }\n\n return keyCommands[key]?.[action];\n}\n\nfunction isDashboardAction(value: string): value is DashboardAction {\n return value === 'move' || value === 'resize';\n}\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type ReactiveControllerHost } from 'lit';
2
+ import type { DashboardMetrics } from '../utils/geometry.utils.js';
3
+ import type { DashboardPanel } from '../panel/panel.js';
4
+ interface DashboardMeasurementHost extends HTMLElement, ReactiveControllerHost {
5
+ readonly hasUpdated: boolean;
6
+ }
7
+ interface DashboardMeasurementDelegate {
8
+ getPanels(): DashboardPanel[];
9
+ getViewport(): HTMLElement | undefined;
10
+ getGrid(): {
11
+ flow: 'vertical' | 'horizontal';
12
+ tracks: number;
13
+ };
14
+ getSizing(): 'fit' | 'fixed';
15
+ pitchChanged(): void;
16
+ }
17
+ /** Measures viewport and cell geometry without owning arrangement policy. */
18
+ export declare class DashboardMeasurementController {
19
+ #private;
20
+ constructor(host: DashboardMeasurementHost, delegate: DashboardMeasurementDelegate);
21
+ get metrics(): DashboardMetrics | undefined;
22
+ hostConnected(): void;
23
+ hostDisconnected(): void;
24
+ observe(): void;
25
+ observePanels(): void;
26
+ measure(): void;
27
+ }
28
+ export {};