@nvidia-elements/core 2.8.1 → 2.9.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 (177) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/accordion/accordion2.js +4 -4
  3. package/dist/alert/alert-group2.js +1 -1
  4. package/dist/alert/alert2.js +1 -1
  5. package/dist/avatar/avatar-group2.js +1 -1
  6. package/dist/avatar/avatar2.js +1 -1
  7. package/dist/badge/badge2.js +1 -1
  8. package/dist/breadcrumb/breadcrumb2.js +1 -1
  9. package/dist/bundle.d.ts +2 -0
  10. package/dist/bundles/index.d.ts +205 -0
  11. package/dist/bundles/index.js +6 -6
  12. package/dist/button/button2.js +1 -1
  13. package/dist/button-group/button-group2.js +1 -1
  14. package/dist/card/card2.js +4 -4
  15. package/dist/chat-message/chat-message2.js +1 -1
  16. package/dist/checkbox/checkbox-group2.js +1 -1
  17. package/dist/checkbox/checkbox2.js +1 -1
  18. package/dist/color/color2.js +1 -1
  19. package/dist/combobox/combobox2.js +1 -1
  20. package/dist/copy-button/copy-button2.js +1 -1
  21. package/dist/custom-elements-jsx.d.ts +109 -0
  22. package/dist/custom-elements-vue.d.ts +107 -0
  23. package/dist/custom-elements.json +3321 -66
  24. package/dist/data.html.json +94 -0
  25. package/dist/data.snippets.json +45 -45
  26. package/dist/date/date2.js +1 -1
  27. package/dist/datetime/datetime2.js +1 -1
  28. package/dist/dialog/dialog-footer2.js +1 -1
  29. package/dist/dialog/dialog-header2.js +1 -1
  30. package/dist/dialog/dialog2.js +1 -1
  31. package/dist/divider/divider2.js +1 -1
  32. package/dist/dot/dot2.js +1 -1
  33. package/dist/drawer/drawer-content2.js +1 -1
  34. package/dist/drawer/drawer-footer2.js +1 -1
  35. package/dist/drawer/drawer-header2.js +1 -1
  36. package/dist/drawer/drawer2.js +1 -1
  37. package/dist/dropdown/dropdown-footer2.js +1 -1
  38. package/dist/dropdown/dropdown-header2.js +1 -1
  39. package/dist/dropdown/dropdown2.js +1 -1
  40. package/dist/dropdown-group/dropdown-group.js +1 -1
  41. package/dist/dropzone/dropzone2.js +1 -1
  42. package/dist/file/file2.js +1 -1
  43. package/dist/format-bytes/format-bytes2.js +1 -1
  44. package/dist/format-datetime/format-datetime2.js +1 -1
  45. package/dist/format-number/format-number2.js +1 -1
  46. package/dist/format-relative-time/format-relative-time2.js +1 -1
  47. package/dist/format-truncate/format-truncate2.js +1 -1
  48. package/dist/forms/control/control2.js +1 -1
  49. package/dist/forms/control-group/control-group2.js +1 -1
  50. package/dist/forms/control-message/control-message2.js +1 -1
  51. package/dist/gauge/gauge2.js +1 -1
  52. package/dist/grid/cell/cell2.js +1 -1
  53. package/dist/grid/column/column2.js +1 -1
  54. package/dist/grid/footer/footer2.js +1 -1
  55. package/dist/grid/grid2.js +1 -1
  56. package/dist/grid/header/header2.js +1 -1
  57. package/dist/grid/placeholder/placeholder2.js +1 -1
  58. package/dist/grid/row/row2.js +1 -1
  59. package/dist/icon/icon2.js +2 -2
  60. package/dist/icon-button/icon-button2.js +1 -1
  61. package/dist/index.js +1 -1
  62. package/dist/input/input-group2.js +1 -1
  63. package/dist/input/input2.js +1 -1
  64. package/dist/internal/controllers/gesture.controller.d.ts +122 -42
  65. package/dist/internal/controllers/gesture.controller.examples.js.map +1 -1
  66. package/dist/internal/controllers/gesture.controller.examples.json +2 -2
  67. package/dist/internal/controllers/gesture.controller.js +300 -159
  68. package/dist/internal/controllers/gesture.controller.js.map +1 -1
  69. package/dist/internal/controllers/key-state.controller.d.ts +18 -0
  70. package/dist/internal/controllers/key-state.controller.js +84 -0
  71. package/dist/internal/controllers/key-state.controller.js.map +1 -0
  72. package/dist/internal/controllers/keynav-spatial.controller.d.ts +4 -1
  73. package/dist/internal/controllers/keynav-spatial.controller.js +7 -6
  74. package/dist/internal/controllers/keynav-spatial.controller.js.map +1 -1
  75. package/dist/internal/index.d.ts +2 -0
  76. package/dist/internal/index.js +29 -27
  77. package/dist/internal/services/global.service.js +1 -1
  78. package/dist/internal/utils/dom.d.ts +1 -0
  79. package/dist/internal/utils/dom.js +42 -38
  80. package/dist/internal/utils/dom.js.map +1 -1
  81. package/dist/internal/utils/focus.d.ts +2 -0
  82. package/dist/internal/utils/focus.js +14 -7
  83. package/dist/internal/utils/focus.js.map +1 -1
  84. package/dist/internal/utils/numeric.d.ts +3 -0
  85. package/dist/internal/utils/numeric.js +14 -0
  86. package/dist/internal/utils/numeric.js.map +1 -0
  87. package/dist/logo/logo2.js +1 -1
  88. package/dist/menu/menu-item2.js +1 -1
  89. package/dist/menu/menu2.js +1 -1
  90. package/dist/month/month2.js +1 -1
  91. package/dist/notification/notification-group2.js +1 -1
  92. package/dist/notification/notification2.js +1 -1
  93. package/dist/page/page-panel/page-panel-content2.js +1 -1
  94. package/dist/page/page-panel/page-panel-footer2.js +1 -1
  95. package/dist/page/page-panel/page-panel-header2.js +1 -1
  96. package/dist/page/page-panel/page-panel2.js +1 -1
  97. package/dist/page/page2.js +1 -1
  98. package/dist/page-header/page-header2.js +1 -1
  99. package/dist/page-loader/page-loader2.js +1 -1
  100. package/dist/pagination/pagination2.js +1 -1
  101. package/dist/panel/panel2.js +4 -4
  102. package/dist/password/password2.js +1 -1
  103. package/dist/preferences-input/preferences-input2.js +1 -1
  104. package/dist/progress-bar/progress-bar2.js +1 -1
  105. package/dist/progress-ring/progress-ring2.js +1 -1
  106. package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
  107. package/dist/pulse/pulse2.js +1 -1
  108. package/dist/radio/radio-group2.js +1 -1
  109. package/dist/radio/radio2.js +1 -1
  110. package/dist/range/range2.js +1 -1
  111. package/dist/resize-handle/resize-handle2.js +6 -10
  112. package/dist/resize-handle/resize-handle2.js.map +1 -1
  113. package/dist/search/search2.js +1 -1
  114. package/dist/select/select2.js +1 -1
  115. package/dist/skeleton/skeleton2.js +1 -1
  116. package/dist/sort-button/sort-button2.js +1 -1
  117. package/dist/sparkline/sparkline2.js +1 -1
  118. package/dist/star-rating/star-rating2.js +1 -1
  119. package/dist/steps/steps2.js +2 -2
  120. package/dist/switch/switch-group2.js +1 -1
  121. package/dist/switch/switch2.js +1 -1
  122. package/dist/tabs/tabs-group2.js +1 -1
  123. package/dist/tabs/tabs2.js +2 -2
  124. package/dist/tag/tag2.js +1 -1
  125. package/dist/textarea/textarea2.js +1 -1
  126. package/dist/time/time2.js +1 -1
  127. package/dist/toast/toast2.js +1 -1
  128. package/dist/toggletip/toggletip-footer2.js +1 -1
  129. package/dist/toggletip/toggletip-header2.js +1 -1
  130. package/dist/toggletip/toggletip2.js +1 -1
  131. package/dist/toolbar/toolbar2.js +1 -1
  132. package/dist/tooltip/tooltip2.js +1 -1
  133. package/dist/tree/tree-node2.js +1 -1
  134. package/dist/tree/tree2.js +1 -1
  135. package/dist/viewport/define.d.ts +7 -0
  136. package/dist/viewport/define.js +7 -0
  137. package/dist/viewport/define.js.map +1 -0
  138. package/dist/viewport/index.d.ts +3 -0
  139. package/dist/viewport/index.js +3 -0
  140. package/dist/viewport/viewport-animation.controller.d.ts +21 -0
  141. package/dist/viewport/viewport-animation.controller.js +93 -0
  142. package/dist/viewport/viewport-animation.controller.js.map +1 -0
  143. package/dist/viewport/viewport-autofit.controller.d.ts +18 -0
  144. package/dist/viewport/viewport-autofit.controller.js +105 -0
  145. package/dist/viewport/viewport-autofit.controller.js.map +1 -0
  146. package/dist/viewport/viewport-fitting.utils.d.ts +36 -0
  147. package/dist/viewport/viewport-fitting.utils.js +35 -0
  148. package/dist/viewport/viewport-fitting.utils.js.map +1 -0
  149. package/dist/viewport/viewport-gesture-navigation.controller.d.ts +29 -0
  150. package/dist/viewport/viewport-gesture-navigation.controller.js +311 -0
  151. package/dist/viewport/viewport-gesture-navigation.controller.js.map +1 -0
  152. package/dist/viewport/viewport-gridlines.d.ts +38 -0
  153. package/dist/viewport/viewport-gridlines.js +6 -0
  154. package/dist/viewport/viewport-gridlines.js.map +1 -0
  155. package/dist/viewport/viewport-gridlines.utils.d.ts +11 -0
  156. package/dist/viewport/viewport-gridlines.utils.js +54 -0
  157. package/dist/viewport/viewport-gridlines.utils.js.map +1 -0
  158. package/dist/viewport/viewport-gridlines2.js +154 -0
  159. package/dist/viewport/viewport-gridlines2.js.map +1 -0
  160. package/dist/viewport/viewport-navigation.controller.d.ts +27 -0
  161. package/dist/viewport/viewport-navigation.controller.js +142 -0
  162. package/dist/viewport/viewport-navigation.controller.js.map +1 -0
  163. package/dist/viewport/viewport-navigation.types.d.ts +9 -0
  164. package/dist/viewport/viewport-projection.utils.d.ts +7 -0
  165. package/dist/viewport/viewport-projection.utils.js +25 -0
  166. package/dist/viewport/viewport-projection.utils.js.map +1 -0
  167. package/dist/viewport/viewport.d.ts +92 -0
  168. package/dist/viewport/viewport.examples.js +6 -0
  169. package/dist/viewport/viewport.examples.js.map +1 -0
  170. package/dist/viewport/viewport.examples.json +60 -0
  171. package/dist/viewport/viewport.js +6 -0
  172. package/dist/viewport/viewport.js.map +1 -0
  173. package/dist/viewport/viewport.types.d.ts +66 -0
  174. package/dist/viewport/viewport2.js +375 -0
  175. package/dist/viewport/viewport2.js.map +1 -0
  176. package/dist/week/week2.js +1 -1
  177. package/package.json +13 -1
@@ -1,65 +1,145 @@
1
1
  import type { ReactiveController, ReactiveControllerHost } from 'lit';
2
- export interface GestureCapabilities {
3
- readonly drag: boolean;
4
- readonly pan: boolean;
5
- readonly pinch: boolean;
6
- readonly wheel: boolean;
2
+ export interface PointerClaimOptions {
3
+ readonly kind?: 'drag' | 'pan';
4
+ readonly pinchCandidate?: boolean;
7
5
  }
8
- interface PointerMovementGesture {
6
+ export interface PinchStartDecision<TContext> {
7
+ readonly context: TContext;
8
+ }
9
+ /** Coordinates and deltas use CSS pixels; movement is sample-relative and total displacement is start-relative. */
10
+ export interface PointerMovementGesture {
9
11
  readonly event: PointerEvent;
12
+ readonly clientX: number;
13
+ readonly clientY: number;
10
14
  readonly movementX: number;
11
15
  readonly movementY: number;
16
+ readonly startClientX: number;
17
+ readonly startClientY: number;
18
+ readonly totalDisplacementX: number;
19
+ readonly totalDisplacementY: number;
20
+ }
21
+ export interface PinchStart {
22
+ readonly firstPointerId: number;
23
+ readonly firstPointerType: string;
24
+ readonly firstStartClientX: number;
25
+ readonly firstStartClientY: number;
26
+ readonly secondPointerId: number;
27
+ readonly secondPointerType: string;
28
+ readonly secondStartClientX: number;
29
+ readonly secondStartClientY: number;
30
+ readonly startCenterClientX: number;
31
+ readonly startCenterClientY: number;
32
+ }
33
+ export interface PinchGesture<TContext> extends PinchStart {
34
+ readonly kind: 'pinch';
35
+ readonly event: PointerEvent;
36
+ readonly context: TContext;
37
+ /** Current pointer distance divided by the starting pointer distance. */
38
+ readonly scale: number;
39
+ readonly centerClientX: number;
40
+ readonly centerClientY: number;
41
+ }
42
+ /**
43
+ * Per-event wheel input normalized to CSS pixels.
44
+ *
45
+ * Modifier-assisted trackpad pinch remains wheel input: consumers can classify it using the native event's
46
+ * `ctrlKey` or `metaKey` without conflating it with the start-relative lifecycle of a two-pointer pinch.
47
+ */
48
+ export interface WheelGesture {
49
+ readonly kind: 'wheel';
50
+ readonly event: WheelEvent;
51
+ readonly clientX: number;
52
+ readonly clientY: number;
53
+ readonly deltaX: number;
54
+ readonly deltaY: number;
55
+ }
56
+ export type PointerEndReason = 'up' | 'cancel' | 'lost-capture' | 'buttons-released';
57
+ export interface PointerEndGesture extends PointerMovementGesture {
58
+ readonly kind: 'pointerend';
59
+ /** Whether the pointer session ended without an observed physical release. */
60
+ readonly interrupted: boolean;
61
+ readonly reason: PointerEndReason;
12
62
  }
13
63
  export type Gesture<TPinchContext> = (PointerMovementGesture & {
14
64
  readonly kind: 'drag';
15
65
  }) | (PointerMovementGesture & {
16
66
  readonly kind: 'pan';
17
- }) | {
18
- readonly context: TPinchContext;
19
- readonly event: PointerEvent;
20
- readonly kind: 'pinch';
21
- readonly scale: number;
22
- } | {
23
- readonly deltaPixels: number;
24
- readonly event: WheelEvent;
25
- readonly kind: 'wheel';
26
- };
27
- export type UnhandledPointerInput = {
28
- readonly event: PointerEvent;
29
- readonly kind: 'click';
30
- } | {
31
- readonly event: PointerEvent;
32
- readonly kind: 'lostpointercapture';
33
- } | {
34
- readonly event: PointerEvent;
35
- readonly kind: 'pointercancel';
36
- } | {
67
+ }) | PinchGesture<TPinchContext>;
68
+ export interface PointerDownInput {
37
69
  readonly event: PointerEvent;
38
70
  readonly kind: 'pointerdown';
39
- } | {
40
- readonly event: PointerEvent;
41
- readonly kind: 'pointermove';
42
- } | {
43
- readonly event: PointerEvent;
44
- readonly kind: 'pointerup';
45
- };
71
+ /**
72
+ * Claims this pointer sequence once during the synchronous input dispatch and suppresses native text selection for
73
+ * its lifetime; returns `false` after that window.
74
+ */
75
+ readonly claim: (options?: PointerClaimOptions) => boolean;
76
+ }
77
+ export interface WheelGestureInput extends WheelGesture {
78
+ /** Claims and prevents this wheel event during the synchronous input dispatch; returns `false` afterward. */
79
+ readonly claim: () => boolean;
80
+ }
81
+ /** Claimable starts, claimed pointer terminals, and normalized claimable wheel input. */
82
+ export type GestureInput = PointerDownInput | PointerEndGesture | WheelGestureInput;
83
+ /** Precedence policy for claims among nested GestureController targets. */
84
+ export type GestureClaimPriority = 'self-first' | 'descendant-first';
46
85
  export interface GestureControllerOptions<TPinchContext = undefined> {
47
- /** Creates a snapshot of caller state when a pinch begins. Omit this field to disable pinch recognition. */
48
- readonly createPinchContext?: () => TPinchContext;
49
- /** Returns the gesture kinds that the controller can recognize for the current input event. */
50
- readonly getCapabilities: () => GestureCapabilities;
51
- /** Updates caller state before the controller reads capabilities for a nonignored input event. */
52
- readonly prepare?: () => void;
53
- /** Returns whether the controller should skip an input event before preparing or recognizing it. */
54
- readonly shouldIgnore?: (event: Event) => boolean;
86
+ /**
87
+ * Skips admission of a new pointer sequence or a stateless native event.
88
+ * The controller does not consult it again after a pointerdown claim.
89
+ */
90
+ readonly shouldIgnoreEvent?: (event: Event) => boolean;
91
+ /**
92
+ * Consulted once when the controller first observes two claimed pinch candidates.
93
+ * Returning `undefined` declines that pair; otherwise the controller retains the context for its pinch lifetime.
94
+ * The pair remains locked until fewer than two pinch candidates remain.
95
+ */
96
+ readonly beginPinch?: (start: PinchStart) => PinchStartDecision<TPinchContext> | undefined;
97
+ /** Consulted independently for each context-menu event. */
98
+ readonly shouldPreventContextMenu?: (event: MouseEvent) => boolean;
99
+ /**
100
+ * Determines precedence among nested GestureController targets.
101
+ *
102
+ * `self-first` is appropriate for a dedicated interaction surface.
103
+ * `descendant-first` lets nested controllers claim input before this controller.
104
+ *
105
+ * Defaults to `self-first`.
106
+ */
107
+ readonly claimPriority?: GestureClaimPriority;
108
+ /**
109
+ * Consulted during native pointerdown capture before descendant handlers.
110
+ *
111
+ * Returning true calls preventDefault() on the pointerdown, but does not
112
+ * claim the pointer, capture it, stop propagation, create pointer state,
113
+ * suppress selection, or start a gesture.
114
+ *
115
+ * This is meaningful with `claimPriority: 'descendant-first'`. It lets an
116
+ * activated higher-level interaction mode reserve a sequence for ordinary
117
+ * target-phase application code while preserving nested GestureController
118
+ * claim priority.
119
+ */
120
+ readonly shouldReservePointerDown?: (event: PointerEvent) => boolean;
121
+ /** Prevents native HTML drag competition on a dedicated interaction surface. */
122
+ readonly suppressNativeDrag?: boolean;
123
+ /**
124
+ * Inline `touch-action` for a dedicated interaction surface. The controller reevaluates a callback after host updates.
125
+ * Restores the target's prior inline value afterward.
126
+ * Avoid applying it to a general root that contains native interactive content.
127
+ */
128
+ readonly touchAction?: string | (() => string | undefined);
55
129
  }
56
130
  type GestureHost = EventTarget & ReactiveControllerHost;
57
- /** Recognizes drag, pan, pinch, and wheel input on a dynamically assigned target. */
131
+ /**
132
+ * Normalizes claimable platform pointer and wheel input on a dynamically assigned target.
133
+ * A pointer claim owns native input competition for its lifetime: the controller prevents claimed movement and text
134
+ * selection, and can suppress native drag when configured.
135
+ */
58
136
  export declare class GestureController<TPinchContext = undefined> implements ReactiveController {
59
137
  #private;
60
138
  constructor(host: GestureHost, options: GestureControllerOptions<TPinchContext>);
139
+ getWheelZoomFactor(input: Pick<WheelGesture, 'deltaY' | 'event'>): number;
61
140
  set target(target: HTMLElement | undefined);
62
141
  hostConnected(): void;
63
142
  hostDisconnected(): void;
143
+ hostUpdated(): void;
64
144
  }
65
145
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"gesture.controller.examples.js","names":[],"sources":["../../../src/internal/controllers/gesture.controller.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { GestureController } from '@nvidia-elements/core/internal';\n\nexport default {\n title: 'Internal/Controllers'\n};\n\nclass GestureDemoElement extends LitElement {\n readonly #gestureController = new GestureController(this, {\n getCapabilities: () => ({ drag: true, pan: false, pinch: false, wheel: false })\n });\n\n static styles = css`\n :host {\n cursor: grab;\n display: grid;\n height: 64px;\n place-items: center;\n width: 64px;\n }\n\n :host([data-active]) {\n cursor: grabbing;\n }\n `;\n\n constructor() {\n super();\n this.#gestureController.target = this;\n }\n\n render() {\n return html`drag`;\n }\n}\n\nif (!customElements.get('gesture-controller-demo-element')) {\n customElements.define('gesture-controller-demo-element', GestureDemoElement);\n}\n\n/**\n * @summary Drag recognition delivered through gesture and unmatched pointer events. Use event details to move content and represent active pointer state.\n * @tags test-case\n */\nexport const Drag = {\n render: () => html`\n<gesture-controller-demo-element></gesture-controller-demo-element>\n<script type=\"module\">\n const element = document.querySelector('gesture-controller-demo-element');\n let x = 0;\n let y = 0;\n\n element.addEventListener('nve-pointer-input', ({ detail }) => {\n if (detail.kind === 'pointerdown') element.dataset.active = '';\n if (detail.kind === 'pointerup' || detail.kind === 'pointercancel') delete element.dataset.active;\n });\n\n element.addEventListener('nve-gesture', ({ detail }) => {\n if (detail.kind !== 'drag') return;\n x += detail.movementX;\n y += detail.movementY;\n element.style.translate = x + 'px ' + y + 'px';\n });\n</script>\n`\n};\n"],"mappings":";AAGA,IAAA,IAAc"}
1
+ {"version":3,"file":"gesture.controller.examples.js","names":[],"sources":["../../../src/internal/controllers/gesture.controller.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { GestureController } from '@nvidia-elements/core/internal';\n\nexport default {\n title: 'Internal/Controllers'\n};\n\nclass GestureDemoElement extends LitElement {\n readonly #gestureController = new GestureController(this, {});\n\n static styles = css`\n :host {\n cursor: grab;\n display: grid;\n height: 64px;\n place-items: center;\n width: 64px;\n }\n\n :host([data-active]) {\n cursor: grabbing;\n }\n `;\n\n constructor() {\n super();\n this.#gestureController.target = this;\n }\n\n render() {\n return html`drag`;\n }\n}\n\nif (!customElements.get('gesture-controller-demo-element')) {\n customElements.define('gesture-controller-demo-element', GestureDemoElement);\n}\n\n/**\n * @summary Synchronously claimed pointer input produces drag gestures while preserving start and end input. Use this pattern when a control owns a pointer sequence.\n * @tags test-case\n */\nexport const Drag = {\n render: () => html`\n<gesture-controller-demo-element></gesture-controller-demo-element>\n<script type=\"module\">\n const element = document.querySelector('gesture-controller-demo-element');\n let x = 0;\n let y = 0;\n\n element.addEventListener('nve-gesture-input', ({ detail }) => {\n if (detail.kind === 'pointerdown' && detail.claim({ kind: 'drag' })) element.dataset.active = '';\n if (detail.kind === 'pointerend') delete element.dataset.active;\n });\n\n element.addEventListener('nve-gesture', ({ detail }) => {\n if (detail.kind !== 'drag') return;\n x += detail.movementX;\n y += detail.movementY;\n element.style.translate = x + 'px ' + y + 'px';\n });\n</script>\n`\n};\n"],"mappings":";AAGA,IAAA,IAAc"}
@@ -4,8 +4,8 @@
4
4
  {
5
5
  "id": "internal-controllers-gesture.controller-drag",
6
6
  "name": "Drag",
7
- "template": "<gesture-controller-demo-element></gesture-controller-demo-element>\n<script type=\"module\">\n const element = document.querySelector(\"gesture-controller-demo-element\");\n let x = 0;\n let y = 0;\n element.addEventListener(\"nve-pointer-input\", ({ detail }) => {\n if (detail.kind === \"pointerdown\") element.dataset.active = \"\";\n if (detail.kind === \"pointerup\" || detail.kind === \"pointercancel\") delete element.dataset.active;\n });\n element.addEventListener(\"nve-gesture\", ({ detail }) => {\n if (detail.kind !== \"drag\") return;\n x += detail.movementX;\n y += detail.movementY;\n element.style.translate = x + \"px \" + y + \"px\";\n });\n</script>\n",
8
- "summary": "Drag recognition delivered through gesture and unmatched pointer events. Use event details to move content and represent active pointer state.",
7
+ "template": "<gesture-controller-demo-element></gesture-controller-demo-element>\n<script type=\"module\">\n const element = document.querySelector(\"gesture-controller-demo-element\");\n let x = 0;\n let y = 0;\n element.addEventListener(\"nve-gesture-input\", ({ detail }) => {\n if (detail.kind === \"pointerdown\" && detail.claim({ kind: \"drag\" })) element.dataset.active = \"\";\n if (detail.kind === \"pointerend\") delete element.dataset.active;\n });\n element.addEventListener(\"nve-gesture\", ({ detail }) => {\n if (detail.kind !== \"drag\") return;\n x += detail.movementX;\n y += detail.movementY;\n element.style.translate = x + \"px \" + y + \"px\";\n });\n</script>\n",
8
+ "summary": "Synchronously claimed pointer input produces drag gestures while preserving start and end input. Use this pattern when a control owns a pointer sequence.",
9
9
  "description": "",
10
10
  "composition": false,
11
11
  "tags": [