@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.
- package/CHANGELOG.md +13 -0
- package/dist/accordion/accordion-group.js.map +1 -1
- package/dist/accordion/accordion.js.map +1 -1
- package/dist/accordion/accordion2.js +4 -4
- package/dist/alert/alert-group2.js +1 -1
- package/dist/alert/alert2.js +1 -1
- package/dist/avatar/avatar-group2.js +1 -1
- package/dist/avatar/avatar2.js +1 -1
- package/dist/badge/badge2.js +1 -1
- package/dist/breadcrumb/breadcrumb2.js +1 -1
- package/dist/bundle.d.ts +2 -0
- package/dist/bundles/index.d.ts +323 -56
- package/dist/bundles/index.js +9 -9
- package/dist/button/button2.js +1 -1
- package/dist/button-group/button-group2.js +1 -1
- package/dist/card/card2.js +4 -4
- package/dist/chat-message/chat-message2.js +1 -1
- package/dist/checkbox/checkbox-group2.js +1 -1
- package/dist/checkbox/checkbox2.js +1 -1
- package/dist/color/color2.js +1 -1
- package/dist/combobox/combobox2.js +1 -1
- package/dist/copy-button/copy-button2.js +1 -1
- package/dist/custom-elements-jsx.d.ts +167 -1
- package/dist/custom-elements-vue.d.ts +161 -1
- package/dist/custom-elements.json +4211 -233
- package/dist/dashboard/controllers/arrangement.controller.d.ts +30 -0
- package/dist/dashboard/controllers/arrangement.controller.js +68 -0
- package/dist/dashboard/controllers/arrangement.controller.js.map +1 -0
- package/dist/dashboard/controllers/command.controller.d.ts +28 -0
- package/dist/dashboard/controllers/command.controller.js +69 -0
- package/dist/dashboard/controllers/command.controller.js.map +1 -0
- package/dist/dashboard/controllers/composition.controller.d.ts +61 -0
- package/dist/dashboard/controllers/composition.controller.js +285 -0
- package/dist/dashboard/controllers/composition.controller.js.map +1 -0
- package/dist/dashboard/controllers/fullscreen.controller.d.ts +23 -0
- package/dist/dashboard/controllers/fullscreen.controller.js +46 -0
- package/dist/dashboard/controllers/fullscreen.controller.js.map +1 -0
- package/dist/dashboard/controllers/interaction.controller.d.ts +53 -0
- package/dist/dashboard/controllers/interaction.controller.js +407 -0
- package/dist/dashboard/controllers/interaction.controller.js.map +1 -0
- package/dist/dashboard/controllers/measurement.controller.d.ts +28 -0
- package/dist/dashboard/controllers/measurement.controller.js +77 -0
- package/dist/dashboard/controllers/measurement.controller.js.map +1 -0
- package/dist/dashboard/dashboard.d.ts +83 -0
- package/dist/dashboard/dashboard.examples.js +5 -0
- package/dist/dashboard/dashboard.examples.js.map +1 -0
- package/dist/dashboard/dashboard.examples.json +138 -0
- package/dist/dashboard/dashboard.js +5 -0
- package/dist/dashboard/dashboard.js.map +1 -0
- package/dist/dashboard/dashboard.types.d.ts +33 -0
- package/dist/dashboard/dashboard2.js +352 -0
- package/dist/dashboard/dashboard2.js.map +1 -0
- package/dist/dashboard/define.d.ts +10 -0
- package/dist/dashboard/define.js +9 -0
- package/dist/dashboard/define.js.map +1 -0
- package/dist/dashboard/index.d.ts +8 -0
- package/dist/dashboard/index.js +6 -0
- package/dist/dashboard/panel/panel.d.ts +88 -0
- package/dist/dashboard/panel/panel.js +5 -0
- package/dist/dashboard/panel/panel.js.map +1 -0
- package/dist/dashboard/panel/panel2.js +110 -0
- package/dist/dashboard/panel/panel2.js.map +1 -0
- package/dist/dashboard/panel-content/panel-content.d.ts +20 -0
- package/dist/dashboard/panel-content/panel-content.js +5 -0
- package/dist/dashboard/panel-content/panel-content.js.map +1 -0
- package/dist/dashboard/panel-content/panel-content2.js +22 -0
- package/dist/dashboard/panel-content/panel-content2.js.map +1 -0
- package/dist/dashboard/panel-footer/panel-footer.d.ts +25 -0
- package/dist/dashboard/panel-footer/panel-footer.js +5 -0
- package/dist/dashboard/panel-footer/panel-footer.js.map +1 -0
- package/dist/dashboard/panel-footer/panel-footer2.js +28 -0
- package/dist/dashboard/panel-footer/panel-footer2.js.map +1 -0
- package/dist/dashboard/panel-header/panel-header.d.ts +27 -0
- package/dist/dashboard/panel-header/panel-header.js +5 -0
- package/dist/dashboard/panel-header/panel-header.js.map +1 -0
- package/dist/dashboard/panel-header/panel-header2.js +28 -0
- package/dist/dashboard/panel-header/panel-header2.js.map +1 -0
- package/dist/dashboard/utils/action.utils.d.ts +17 -0
- package/dist/dashboard/utils/action.utils.js +144 -0
- package/dist/dashboard/utils/action.utils.js.map +1 -0
- package/dist/dashboard/utils/geometry.utils.d.ts +110 -0
- package/dist/dashboard/utils/geometry.utils.js +208 -0
- package/dist/dashboard/utils/geometry.utils.js.map +1 -0
- package/dist/dashboard/utils/intent.types.d.ts +67 -0
- package/dist/dashboard/utils/layout.utils.d.ts +20 -0
- package/dist/dashboard/utils/layout.utils.js +224 -0
- package/dist/dashboard/utils/layout.utils.js.map +1 -0
- package/dist/dashboard/utils/movement.utils.d.ts +7 -0
- package/dist/dashboard/utils/movement.utils.js +15 -0
- package/dist/dashboard/utils/movement.utils.js.map +1 -0
- package/dist/dashboard/utils/mutation.utils.d.ts +2 -0
- package/dist/dashboard/utils/mutation.utils.js +19 -0
- package/dist/dashboard/utils/mutation.utils.js.map +1 -0
- package/dist/dashboard/utils/packing.utils.d.ts +13 -0
- package/dist/dashboard/utils/packing.utils.js +421 -0
- package/dist/dashboard/utils/packing.utils.js.map +1 -0
- package/dist/data.html.json +141 -1
- package/dist/date/date2.js +1 -1
- package/dist/datetime/datetime2.js +1 -1
- package/dist/dialog/dialog-footer2.js +1 -1
- package/dist/dialog/dialog-header2.js +1 -1
- package/dist/dialog/dialog2.js +1 -1
- package/dist/divider/divider2.js +1 -1
- package/dist/dot/dot2.js +1 -1
- package/dist/drag-handle/drag-handle2.js +1 -1
- package/dist/drawer/drawer-content2.js +1 -1
- package/dist/drawer/drawer-footer2.js +1 -1
- package/dist/drawer/drawer-header2.js +1 -1
- package/dist/drawer/drawer2.js +1 -1
- package/dist/dropdown/dropdown-footer2.js +1 -1
- package/dist/dropdown/dropdown-header2.js +1 -1
- package/dist/dropdown/dropdown.examples.js.map +1 -1
- package/dist/dropdown/dropdown2.js +1 -1
- package/dist/dropdown-group/dropdown-group.js +1 -1
- package/dist/dropzone/dropzone2.js +1 -1
- package/dist/file/file2.js +1 -1
- package/dist/format-bytes/format-bytes2.js +1 -1
- package/dist/format-datetime/format-datetime2.js +1 -1
- package/dist/format-number/format-number2.js +1 -1
- package/dist/format-relative-time/format-relative-time2.js +1 -1
- package/dist/format-truncate/format-truncate2.js +1 -1
- package/dist/forms/control/control2.js +1 -1
- package/dist/forms/control-group/control-group2.js +1 -1
- package/dist/forms/control-message/control-message2.js +1 -1
- package/dist/gauge/gauge2.js +1 -1
- package/dist/ghost/ghost2.js +1 -1
- package/dist/grid/cell/cell2.js +1 -1
- package/dist/grid/column/column2.js +1 -1
- package/dist/grid/footer/footer2.js +1 -1
- package/dist/grid/grid.js.map +1 -1
- package/dist/grid/grid2.js +1 -1
- package/dist/grid/header/header2.js +1 -1
- package/dist/grid/placeholder/placeholder2.js +1 -1
- package/dist/grid/row/row2.js +1 -1
- package/dist/icon/icon2.js +1 -1
- package/dist/icon-button/icon-button2.js +1 -1
- package/dist/iframe/iframe2.js +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group2.js +1 -1
- package/dist/input/input2.js +1 -1
- package/dist/internal/controllers/native-fullscreen.controller.d.ts +13 -0
- package/dist/internal/controllers/native-fullscreen.controller.js +73 -0
- package/dist/internal/controllers/native-fullscreen.controller.js.map +1 -0
- package/dist/internal/index.d.ts +1 -0
- package/dist/internal/index.js +59 -57
- package/dist/internal/index.js.map +1 -1
- package/dist/joystick/joystick2.js +1 -1
- package/dist/logo/logo2.js +1 -1
- package/dist/menu/menu-group2.js +1 -1
- package/dist/menu/menu-item2.js +1 -1
- package/dist/menu/menu2.js +1 -1
- package/dist/month/month2.js +1 -1
- package/dist/notification/notification-group2.js +1 -1
- package/dist/notification/notification2.js +1 -1
- package/dist/page/page-panel/page-panel-content2.js +1 -1
- package/dist/page/page-panel/page-panel-footer2.js +1 -1
- package/dist/page/page-panel/page-panel-header2.js +1 -1
- package/dist/page/page-panel/page-panel2.js +1 -1
- package/dist/page/page2.js +1 -1
- package/dist/page-header/page-header2.js +1 -1
- package/dist/page-loader/page-loader2.js +1 -1
- package/dist/pagination/pagination2.js +1 -1
- package/dist/panel/panel2.js +4 -4
- package/dist/password/password2.js +1 -1
- package/dist/preferences-input/preferences-input2.js +1 -1
- package/dist/progress-bar/progress-bar2.js +1 -1
- package/dist/progress-dot/progress-dot2.js +1 -1
- package/dist/progress-ring/progress-ring2.js +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
- package/dist/pulse/pulse2.js +1 -1
- package/dist/radio/radio-group2.js +1 -1
- package/dist/radio/radio2.js +1 -1
- package/dist/range/range2.js +1 -1
- package/dist/resize-handle/resize-handle2.js +1 -1
- package/dist/search/search2.js +1 -1
- package/dist/select/select2.js +1 -1
- package/dist/skeleton/skeleton2.js +1 -1
- package/dist/sort-button/sort-button2.js +1 -1
- package/dist/sparkline/sparkline2.js +1 -1
- package/dist/star-rating/star-rating2.js +1 -1
- package/dist/steps/steps2.js +2 -2
- package/dist/switch/switch-group2.js +1 -1
- package/dist/switch/switch2.js +1 -1
- package/dist/tabs/tabs-group2.js +1 -1
- package/dist/tabs/tabs-item-group2.js +1 -1
- package/dist/tabs/tabs2.js +2 -2
- package/dist/tag/tag2.js +1 -1
- package/dist/textarea/textarea2.js +1 -1
- package/dist/time/time2.js +1 -1
- package/dist/toast/toast2.js +1 -1
- package/dist/toggletip/toggletip-footer2.js +1 -1
- package/dist/toggletip/toggletip-header2.js +1 -1
- package/dist/toggletip/toggletip2.js +1 -1
- package/dist/toolbar/toolbar2.js +1 -1
- package/dist/tooltip/tooltip2.js +1 -1
- package/dist/tree/tree-node2.js +1 -1
- package/dist/tree/tree2.js +1 -1
- package/dist/week/week2.js +1 -1
- package/dist/workspace/controllers/workspace-fullscreen.controller.d.ts +2 -4
- package/dist/workspace/controllers/workspace-fullscreen.controller.js +17 -47
- package/dist/workspace/controllers/workspace-fullscreen.controller.js.map +1 -1
- package/dist/workspace/panel/panel2.js +1 -1
- package/dist/workspace/panel-content/panel-content2.js +1 -1
- package/dist/workspace/panel-footer/panel-footer2.js +1 -1
- package/dist/workspace/panel-header/panel-header2.js +1 -1
- package/dist/workspace/workspace.js.map +1 -1
- package/dist/workspace/workspace2.js +1 -1
- 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 {};
|