@nvidia-elements/core 2.12.2 → 2.14.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 (135) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/accordion/accordion.js +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/bundles/index.d.ts +11 -1
  12. package/dist/bundles/index.js +2 -2
  13. package/dist/button/button2.js +1 -1
  14. package/dist/button-group/button-group2.js +1 -1
  15. package/dist/card/card2.js +4 -4
  16. package/dist/chat-message/chat-message2.js +1 -1
  17. package/dist/checkbox/checkbox-group2.js +1 -1
  18. package/dist/checkbox/checkbox2.js +1 -1
  19. package/dist/color/color2.js +1 -1
  20. package/dist/combobox/combobox2.js +1 -1
  21. package/dist/copy-button/copy-button2.js +1 -1
  22. package/dist/custom-elements-jsx.d.ts +8 -0
  23. package/dist/custom-elements-vue.d.ts +8 -0
  24. package/dist/custom-elements.json +45 -2
  25. package/dist/data.html.json +6 -1
  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/grid.global.js +1 -1
  56. package/dist/grid/grid.global.js.map +1 -1
  57. package/dist/grid/grid2.js +1 -1
  58. package/dist/grid/header/header2.js +1 -1
  59. package/dist/grid/placeholder/placeholder2.js +1 -1
  60. package/dist/grid/row/row2.js +1 -1
  61. package/dist/icon/icon2.js +2 -2
  62. package/dist/icon-button/icon-button2.js +1 -1
  63. package/dist/index.js +1 -1
  64. package/dist/input/input-group2.js +1 -1
  65. package/dist/input/input2.js +1 -1
  66. package/dist/internal/services/global.service.js +1 -1
  67. package/dist/logo/logo2.js +1 -1
  68. package/dist/menu/menu-group2.js +1 -1
  69. package/dist/menu/menu-item2.js +1 -1
  70. package/dist/menu/menu.examples.js.map +1 -1
  71. package/dist/menu/menu.examples.json +4 -2
  72. package/dist/menu/menu2.js +1 -1
  73. package/dist/month/month2.js +1 -1
  74. package/dist/notification/notification-group2.js +1 -1
  75. package/dist/notification/notification2.js +1 -1
  76. package/dist/page/page-panel/page-panel-content2.js +1 -1
  77. package/dist/page/page-panel/page-panel-footer2.js +1 -1
  78. package/dist/page/page-panel/page-panel-header2.js +1 -1
  79. package/dist/page/page-panel/page-panel2.js +1 -1
  80. package/dist/page/page2.js +1 -1
  81. package/dist/page-header/page-header2.js +1 -1
  82. package/dist/page-loader/page-loader2.js +1 -1
  83. package/dist/pagination/pagination2.js +1 -1
  84. package/dist/panel/panel2.js +4 -4
  85. package/dist/password/password2.js +1 -1
  86. package/dist/preferences-input/preferences-input2.js +1 -1
  87. package/dist/progress-bar/progress-bar2.js +1 -1
  88. package/dist/progress-ring/progress-ring2.js +1 -1
  89. package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
  90. package/dist/pulse/pulse2.js +1 -1
  91. package/dist/radio/radio-group2.js +1 -1
  92. package/dist/radio/radio2.js +1 -1
  93. package/dist/range/range2.js +1 -1
  94. package/dist/resize-handle/resize-handle2.js +1 -1
  95. package/dist/search/search2.js +1 -1
  96. package/dist/select/select2.js +1 -1
  97. package/dist/skeleton/skeleton2.js +1 -1
  98. package/dist/sort-button/sort-button2.js +1 -1
  99. package/dist/sparkline/sparkline2.js +1 -1
  100. package/dist/star-rating/star-rating2.js +1 -1
  101. package/dist/steps/steps2.js +2 -2
  102. package/dist/switch/switch-group2.js +1 -1
  103. package/dist/switch/switch2.js +1 -1
  104. package/dist/tabs/tabs-group2.js +1 -1
  105. package/dist/tabs/tabs2.js +2 -2
  106. package/dist/tag/tag2.js +1 -1
  107. package/dist/textarea/textarea2.js +1 -1
  108. package/dist/time/time2.js +1 -1
  109. package/dist/toast/toast2.js +1 -1
  110. package/dist/toggletip/toggletip-footer.js +1 -1
  111. package/dist/toggletip/toggletip-footer.js.map +1 -1
  112. package/dist/toggletip/toggletip-footer2.js +1 -1
  113. package/dist/toggletip/toggletip-header.js +1 -1
  114. package/dist/toggletip/toggletip-header.js.map +1 -1
  115. package/dist/toggletip/toggletip-header2.js +1 -1
  116. package/dist/toggletip/toggletip2.js +1 -1
  117. package/dist/toolbar/toolbar2.js +1 -1
  118. package/dist/tooltip/tooltip2.js +1 -1
  119. package/dist/tree/tree-node.d.ts +2 -0
  120. package/dist/tree/tree-node.js +1 -1
  121. package/dist/tree/tree-node.js.map +1 -1
  122. package/dist/tree/tree-node2.js +2 -2
  123. package/dist/tree/tree-node2.js.map +1 -1
  124. package/dist/tree/tree.examples.js.map +1 -1
  125. package/dist/tree/tree.examples.json +12 -1
  126. package/dist/tree/tree.global.js +1 -1
  127. package/dist/tree/tree.global.js.map +1 -1
  128. package/dist/tree/tree2.js +1 -1
  129. package/dist/viewport/viewport-gridlines2.js +1 -1
  130. package/dist/viewport/viewport-minimap2.js +1 -1
  131. package/dist/viewport/viewport.d.ts +5 -0
  132. package/dist/viewport/viewport2.js +55 -45
  133. package/dist/viewport/viewport2.js.map +1 -1
  134. package/dist/week/week2.js +1 -1
  135. package/package.json +4 -3
@@ -40,7 +40,7 @@ var x = .05, S = 20, C = 5, w = [
40
40
  static {
41
41
  this.metadata = {
42
42
  tag: "nve-viewport",
43
- version: "2.12.2"
43
+ version: "2.14.0"
44
44
  };
45
45
  }
46
46
  #e;
@@ -59,9 +59,9 @@ var x = .05, S = 20, C = 5, w = [
59
59
  constructor() {
60
60
  super(), this.#r = new l(this, (e) => this.#_(e)), this.#i = !1, this.#a = 0, this.#o = 0, this.#s = 1, this.#c = x, this.#l = S, this.#u = C, this.#d = 0, this.#f = !1, this.behaviorZoom = !1, this.autoFit = !1, this.#n = new c(this, {
61
61
  commitTransform: (e) => {
62
- this.#j(e);
62
+ this.#M(e);
63
63
  },
64
- clampScale: (e) => this.#P(e),
64
+ clampScale: (e) => this.#F(e),
65
65
  getTransform: () => this.getTransform(),
66
66
  getViewportSize: () => ({
67
67
  height: this.clientHeight,
@@ -71,8 +71,8 @@ var x = .05, S = 20, C = 5, w = [
71
71
  getTransform: () => this.getTransform(),
72
72
  getZoomTarget: (e) => this.#b(e, this.#n.destinationScale ?? this.#s)
73
73
  }), this.#t = new m(this, {
74
- clampScale: (e) => this.#P(e),
75
- clientToViewport: (e, t) => this.#D(e, t),
74
+ clampScale: (e) => this.#F(e),
75
+ clientToViewport: (e, t) => this.#O(e, t),
76
76
  getTransform: () => this.getTransform(),
77
77
  requestAdmittedPinchZoom: (e) => this.#p(e)
78
78
  });
@@ -81,7 +81,7 @@ var x = .05, S = 20, C = 5, w = [
81
81
  return this.#a;
82
82
  }
83
83
  set x(e) {
84
- this.#k({
84
+ this.#A({
85
85
  ...this.getTransform(),
86
86
  x: r(e, 0)
87
87
  });
@@ -90,7 +90,7 @@ var x = .05, S = 20, C = 5, w = [
90
90
  return this.#o;
91
91
  }
92
92
  set y(e) {
93
- this.#k({
93
+ this.#A({
94
94
  ...this.getTransform(),
95
95
  y: r(e, 0)
96
96
  });
@@ -99,7 +99,7 @@ var x = .05, S = 20, C = 5, w = [
99
99
  return this.#s;
100
100
  }
101
101
  set scale(e) {
102
- this.#k({
102
+ this.#A({
103
103
  ...this.getTransform(),
104
104
  scale: e
105
105
  });
@@ -111,7 +111,7 @@ var x = .05, S = 20, C = 5, w = [
111
111
  let t = Math.min(a(e, x), this.#l);
112
112
  if (t === this.#c) return;
113
113
  let n = this.#c;
114
- this.#n.cancel(), this.#c = t, this.requestUpdate("minScale", n), this.#A({
114
+ this.#n.cancel(), this.#c = t, this.requestUpdate("minScale", n), this.#j({
115
115
  ...this.getTransform(),
116
116
  scale: this.#s
117
117
  });
@@ -123,7 +123,7 @@ var x = .05, S = 20, C = 5, w = [
123
123
  let t = Math.max(a(e, S), this.#c);
124
124
  if (t === this.#l) return;
125
125
  let n = this.#l;
126
- this.#n.cancel(), this.#l = t, this.requestUpdate("maxScale", n), this.#A({
126
+ this.#n.cancel(), this.#l = t, this.requestUpdate("maxScale", n), this.#j({
127
127
  ...this.getTransform(),
128
128
  scale: this.#s
129
129
  });
@@ -215,13 +215,13 @@ var x = .05, S = 20, C = 5, w = [
215
215
  }
216
216
  #p(e, t = {}) {
217
217
  let n = this.#h(e.next), r = this.getTransform();
218
- if (!this.#M("zoom", {
218
+ if (!this.#N("zoom", {
219
219
  ...e,
220
220
  next: { ...n },
221
221
  start: { ...r }
222
222
  }, !0)) return !1;
223
223
  let i = this.getTransform();
224
- return n.x === i.x && n.y === i.y && n.scale === i.scale && (!t.animated || this.#n.destinationScale === void 0) ? !1 : (this.#n.cancel(), this.#r.consume(), t.animated ? (this.animateTo(n), !0) : this.#O(n) ? (this.#t.rebasePointerSessions(), !0) : !1);
224
+ return n.x === i.x && n.y === i.y && n.scale === i.scale && (!t.animated || this.#n.destinationScale === void 0) ? !1 : (this.#n.cancel(), this.#r.consume(), t.animated ? (this.animateTo(n), !0) : this.#k(n) ? (this.#t.rebasePointerSessions(), !0) : !1);
225
225
  }
226
226
  startPan(e) {
227
227
  if (!this.pannable) return;
@@ -229,7 +229,7 @@ var x = .05, S = 20, C = 5, w = [
229
229
  ...e,
230
230
  source: t,
231
231
  next: n
232
- }, i = this.getTransform(), a = this.#M("panstart", {
232
+ }, i = this.getTransform(), a = this.#N("panstart", {
233
233
  ...r,
234
234
  next: { ...n },
235
235
  start: { ...i }
@@ -244,7 +244,7 @@ var x = .05, S = 20, C = 5, w = [
244
244
  isActive: () => !o
245
245
  }),
246
246
  end: (e) => {
247
- o || (o = !0, this.#M("panend", {
247
+ o || (o = !0, this.#N("panend", {
248
248
  ...e,
249
249
  source: t,
250
250
  start: { ...i },
@@ -260,47 +260,47 @@ var x = .05, S = 20, C = 5, w = [
260
260
  }
261
261
  #m(e, t) {
262
262
  let n = this.#h(e.next);
263
- if (!this.#M("pan", {
263
+ if (!this.#N("pan", {
264
264
  ...e,
265
265
  next: { ...n },
266
266
  start: { ...t.start }
267
267
  }, !0) || !t.appliesDefault || t.isActive?.() === !1) return !1;
268
268
  let r = this.getTransform();
269
- return n.x === r.x && n.y === r.y && n.scale === r.scale || (this.#n.cancel(), this.#r.consume(), !this.#O(n)) ? !1 : (this.#t.rebasePointerSessions(), !0);
269
+ return n.x === r.x && n.y === r.y && n.scale === r.scale || (this.#n.cancel(), this.#r.consume(), !this.#k(n)) ? !1 : (this.#t.rebasePointerSessions(), !0);
270
270
  }
271
271
  #h(e) {
272
272
  return {
273
273
  x: r(e.x, this.#a),
274
274
  y: r(e.y, this.#o),
275
- scale: this.#P(e.scale)
275
+ scale: this.#F(e.scale)
276
276
  };
277
277
  }
278
278
  animateTo(e, t = {}) {
279
279
  this.#n.animateTo(e, t);
280
280
  }
281
281
  reveal(e, t = {}) {
282
- this.#v(this.#y(e, this.#S(t)), t);
282
+ this.#v(this.#y(e, this.#C(t)), t);
283
283
  }
284
284
  fitContents(e = {}) {
285
- let t = this.#g(this.#x(Array.from(this.children).filter((e) => !e.slot)), this.#C(e));
285
+ let t = this.#g(this.#S(Array.from(this.children).filter((e) => !e.slot)), this.#w(e));
286
286
  t && this.#v(t, e);
287
287
  }
288
288
  #g(e, t) {
289
289
  if (!this.internalHost) return;
290
- let n = this.getTransform(), r = this.#E(), i = u(e, r, n);
290
+ let n = this.getTransform(), r = this.#D(), i = u(e, r, n);
291
291
  return i ? this.#y(i, t, n) : void 0;
292
292
  }
293
293
  #_(e) {
294
- let t = this.#g(e, this.#C({}));
295
- t && (this.#n.cancel(), this.#O(t) && this.#t.rebasePointerSessions());
294
+ let t = this.#g(e, this.#w({}));
295
+ t && (this.#n.cancel(), this.#k(t) && this.#t.rebasePointerSessions());
296
296
  }
297
297
  #v(e, t) {
298
- t.animated ? t.duration === void 0 ? this.animateTo(e) : this.animateTo(e, { duration: t.duration }) : this.#k(e);
298
+ t.animated ? t.duration === void 0 ? this.animateTo(e) : this.animateTo(e, { duration: t.duration }) : this.#A(e);
299
299
  }
300
300
  #y(e, t, n = this.getTransform()) {
301
301
  return d(e, {
302
302
  options: t,
303
- scaleRange: this.#w(),
303
+ scaleRange: this.#T(),
304
304
  transform: n,
305
305
  viewport: {
306
306
  height: this.clientHeight,
@@ -309,64 +309,71 @@ var x = .05, S = 20, C = 5, w = [
309
309
  });
310
310
  }
311
311
  #b(e, t) {
312
- return e === "in" ? this.#T(D(1, t, this.#w())) : e === "out" ? this.#T(D(-1, t, this.#w())) : e === "reset" ? this.#T(this.#P(1)) : this.#g(this.#x(Array.from(this.children).filter((e) => !e.slot)), this.#C({}));
312
+ return e === "in" ? this.#x(1, t) : e === "out" ? this.#x(-1, t) : e === "reset" ? this.#E(this.#F(1)) : this.#g(this.#S(Array.from(this.children).filter((e) => !e.slot)), this.#w({}));
313
313
  }
314
- #x(e) {
314
+ #x(e, t) {
315
+ let n = Array.isArray(this.zoomStops) ? this.zoomStops : w, r = D(e, t, {
316
+ ...this.#T(),
317
+ stops: n
318
+ });
319
+ return this.#E(r);
320
+ }
321
+ #S(e) {
315
322
  return (function* () {
316
323
  for (let t of e) yield t.getBoundingClientRect();
317
324
  })();
318
325
  }
319
- #S(e) {
326
+ #C(e) {
320
327
  return {
321
328
  inset: e.inset,
322
329
  scale: e.scale
323
330
  };
324
331
  }
325
- #C(e) {
332
+ #w(e) {
326
333
  return {
327
334
  inset: e.inset ?? this.#d,
328
335
  scale: e.scale
329
336
  };
330
337
  }
331
- #w() {
338
+ #T() {
332
339
  return {
333
340
  min: this.#c,
334
341
  max: this.#l
335
342
  };
336
343
  }
337
- #T(e) {
344
+ #E(e) {
338
345
  return f(e, this.getTransform(), {
339
346
  height: this.clientHeight,
340
347
  width: this.clientWidth
341
348
  });
342
349
  }
343
- #E() {
350
+ #D() {
344
351
  return this.internalHost?.getBoundingClientRect() ?? DOMRect.fromRect();
345
352
  }
346
- #D(e, t, n = this.#E()) {
353
+ #O(e, t, n = this.#D()) {
347
354
  return {
348
355
  x: e - n.left,
349
356
  y: t - n.top
350
357
  };
351
358
  }
352
- #O(e) {
353
- let t = r(e.x, this.#a), n = r(e.y, this.#o), i = this.#P(e.scale);
354
- return t === this.#a && n === this.#o && i === this.#s ? !1 : (this.#N({
359
+ #k(e) {
360
+ let t = r(e.x, this.#a), n = r(e.y, this.#o), i = this.#F(e.scale);
361
+ return t === this.#a && n === this.#o && i === this.#s ? !1 : (this.#P({
355
362
  scale: i,
356
363
  x: t,
357
364
  y: n
358
365
  }), !0);
359
366
  }
360
- #k(e) {
361
- this.#n.cancel(), this.#A(e);
362
- }
363
367
  #A(e) {
364
- this.#O(e) && (this.isConnected && this.#r.consume(), this.#t.rebasePointerSessions());
368
+ this.#n.cancel(), this.#j(e);
365
369
  }
366
370
  #j(e) {
367
- this.#O(e) && (this.isConnected && this.#r.consume(), this.#t.rebasePointerSessions());
371
+ this.#k(e) && (this.isConnected && this.#r.consume(), this.#t.rebasePointerSessions());
368
372
  }
369
- #M(e, t, n) {
373
+ #M(e) {
374
+ this.#k(e) && (this.isConnected && this.#r.consume(), this.#t.rebasePointerSessions());
375
+ }
376
+ #N(e, t, n) {
370
377
  return this.dispatchEvent(new CustomEvent(e, {
371
378
  bubbles: !0,
372
379
  cancelable: n,
@@ -374,11 +381,11 @@ var x = .05, S = 20, C = 5, w = [
374
381
  detail: t
375
382
  }));
376
383
  }
377
- #N(e) {
384
+ #P(e) {
378
385
  let t = this.#a, n = this.#o, r = this.#s;
379
386
  this.#a = e.x, this.#o = e.y, this.#s = e.scale, e.x !== t && this.requestUpdate("x", t), e.y !== n && this.requestUpdate("y", n), e.scale !== r && this.requestUpdate("scale", r);
380
387
  }
381
- #P(e) {
388
+ #F(e) {
382
389
  let t = Number.isFinite(e) && e > 0 ? e : this.#c;
383
390
  return Math.min(this.#l, Math.max(this.#c, t));
384
391
  }
@@ -392,6 +399,9 @@ o([y("[internal-host]")], E.prototype, "internalHost", void 0), o([v({ type: Num
392
399
  type: Number,
393
400
  reflect: !0
394
401
  })], E.prototype, "maxScale", null), o([v({
402
+ attribute: "zoom-stops",
403
+ type: Array
404
+ })], E.prototype, "zoomStops", void 0), o([v({
395
405
  attribute: "behavior-pan",
396
406
  converter: T,
397
407
  reflect: !0
@@ -413,10 +423,10 @@ o([y("[internal-host]")], E.prototype, "internalHost", void 0), o([v({ type: Num
413
423
  })], E.prototype, "dragThreshold", null), E = o([e()], E);
414
424
  function D(e, t, n) {
415
425
  let r = [
416
- ...w,
426
+ ...n.stops,
417
427
  n.min,
418
428
  n.max
419
- ].map((e) => Math.min(n.max, Math.max(n.min, e))).sort((e, t) => e - t).filter((e, t, n) => t === 0 || e !== n[t - 1]);
429
+ ].filter((e) => Number.isFinite(e) && e > 0).map((e) => Math.min(n.max, Math.max(n.min, e))).sort((e, t) => e - t).filter((e, t, n) => t === 0 || e !== n[t - 1]);
420
430
  if (e > 0) return r.find((e) => e > t) ?? n.max;
421
431
  for (let e = r.length - 1; e >= 0; --e) {
422
432
  let n = r[e];
@@ -1 +1 @@
1
- {"version":3,"file":"viewport2.js","names":[],"sources":["../../src/viewport/viewport.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { query } from 'lit/decorators/query.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport {\n audit,\n attachInternals,\n finiteOr,\n nonnegativeFiniteOr,\n positiveFiniteOr,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport styles from './viewport.css?inline';\nimport { ViewportAnimationController } from './viewport-animation.controller.js';\nimport { ViewportAutoFitController } from './viewport-autofit.controller.js';\nimport {\n contentBoundsFromClientRects,\n revealTarget,\n type ViewportClientRect,\n type ViewportFitOptions\n} from './viewport-fitting.utils.js';\nimport { ViewportGestureNavigationController } from './viewport-gesture-navigation.controller.js';\nimport { ViewportNavigationController } from './viewport-navigation.controller.js';\nimport type { ViewportZoomAction } from './viewport-navigation.types.js';\nimport type {\n ViewportAnimationOptions,\n ViewportPanBehavior,\n ViewportPanProposal,\n ViewportPanSession,\n ViewportPanUpdateProposal,\n ViewportPoint,\n ViewportRect,\n ViewportRevealOptions,\n ViewportTransform,\n ViewportZoomProposal,\n ViewportZoomRequestOptions\n} from './viewport.types.js';\nimport { centeredScaleTransform, contentPointFromViewport } from './viewport-projection.utils.js';\n\nconst DEFAULT_MIN_SCALE = 0.05;\nconst DEFAULT_MAX_SCALE = 20;\nconst DEFAULT_DRAG_THRESHOLD = 5;\nconst ZOOM_SCALE_STEPS = [0.05, 0.1, 0.25, 0.5, 1, 2, 4, 8, 16, 20] as const;\nconst BEHAVIOR_PAN_CONVERTER = {\n fromAttribute(value: string | null): ViewportPanBehavior {\n if (value === null) return false;\n return value === 'space' ? 'space' : true;\n },\n toAttribute(value: ViewportPanBehavior): string | null {\n if (!value) return null;\n return value === 'space' ? 'space' : '';\n }\n};\n\n/**\n * @element nve-viewport\n * @description A viewport provides a spatial surface for arbitrary content, with optional pan and zoom navigation.\n * @documentation https://nvidia.github.io/elements/docs/elements/viewport/\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/viewport\n * @slot - Content positioned in the viewport's infinite content space.\n * @slot background - Custom content rendered behind viewport content and excluded from content fitting\n * @slot overlay - Interactive content fixed above the transformed plane and excluded from content fitting\n * @event panstart - Dispatched when a sustained pointer or control pan begins. Cancel to suppress the default for its session.\n * @event pan - Dispatched for admitted user pan proposals. Cancel to skip the proposed transform mutation.\n * @event panend - Dispatched once when a sustained pan ends, including its terminal reason.\n * @event zoom - Dispatched for admitted user zoom proposals. Cancel to skip the proposed transform mutation.\n * @event viewportchange - Dispatched once after a render that commits one or more viewport transform changes.\n * @event capabilitieschange - Dispatched after effective user-input pan or zoom admission changes.\n * @cssprop --background - Background color of the fixed viewport area.\n * @cssprop --min-height\n * @cssprop --pan-cursor - Cursor shown over a background eligible for primary-pointer panning.\n * @cssprop --panning-cursor - Cursor shown while a pointer pan is active.\n * @command --pan-left - With behavior-pan enabled, pans left by one discrete step.\n * @command --pan-right - With behavior-pan enabled, pans right by one discrete step.\n * @command --pan-up - With behavior-pan enabled, pans up by one discrete step.\n * @command --pan-down - With behavior-pan enabled, pans down by one discrete step.\n * @command --zoom-in - With behavior-zoom enabled, animates to the next permitted scale step.\n * @command --zoom-out - With behavior-zoom enabled, animates to the previous permitted scale step.\n * @command --zoom-reset - With behavior-zoom enabled, animates to 100% scale.\n * @command --zoom-to-fit - With behavior-zoom enabled, animates to fit direct default-slot element boxes.\n * @stable false\n */\n@audit()\nexport class Viewport extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-viewport',\n version: '0.0.0'\n };\n\n /** @private */\n declare _internals: ElementInternals;\n\n @query('[internal-host]') private internalHost: HTMLElement | null;\n readonly #navigationController: ViewportNavigationController;\n readonly #gestureNavigationController: ViewportGestureNavigationController;\n readonly #animationController: ViewportAnimationController;\n readonly #autoFitController = new ViewportAutoFitController(this, clientRects =>\n this.#applyInitialAutoFit(clientRects)\n );\n #publishTransformChanges = false;\n #x = 0;\n #y = 0;\n #scale = 1;\n #minScale = DEFAULT_MIN_SCALE;\n #maxScale = DEFAULT_MAX_SCALE;\n #dragThreshold = DEFAULT_DRAG_THRESHOLD;\n #fitInset = 0;\n #behaviorPan: ViewportPanBehavior = false;\n constructor() {\n super();\n this.#animationController = new ViewportAnimationController(this, {\n commitTransform: next => {\n this.#applyAnimationTransform(next);\n },\n clampScale: value => this.#clampScale(value),\n getTransform: () => this.getTransform(),\n getViewportSize: () => ({ height: this.clientHeight, width: this.clientWidth })\n });\n this.#navigationController = new ViewportNavigationController(this, {\n getTransform: () => this.getTransform(),\n getZoomTarget: action => this.#getZoomTarget(action, this.#animationController.destinationScale ?? this.#scale)\n });\n this.#gestureNavigationController = new ViewportGestureNavigationController(this, {\n clampScale: value => this.#clampScale(value),\n clientToViewport: (clientX, clientY) => this.#clientToViewport(clientX, clientY),\n getTransform: () => this.getTransform(),\n requestAdmittedPinchZoom: proposal => this.#performZoom(proposal)\n });\n }\n\n /** Horizontal content-space coordinate at the viewport origin. */\n @property({ type: Number })\n get x(): number {\n return this.#x;\n }\n\n set x(value: number) {\n this.#applyExternalTransform({ ...this.getTransform(), x: finiteOr(value, 0) });\n }\n\n /** Vertical content-space coordinate at the viewport origin. */\n @property({ type: Number })\n get y(): number {\n return this.#y;\n }\n\n set y(value: number) {\n this.#applyExternalTransform({ ...this.getTransform(), y: finiteOr(value, 0) });\n }\n\n /** Content-to-viewport CSS-pixel scale. */\n @property({ type: Number })\n get scale(): number {\n return this.#scale;\n }\n\n set scale(value: number) {\n this.#applyExternalTransform({ ...this.getTransform(), scale: value });\n }\n\n /** Inclusive lower scale limit. */\n @property({ attribute: 'min-scale', type: Number, reflect: true })\n get minScale(): number {\n return this.#minScale;\n }\n\n set minScale(value: number) {\n const next = Math.min(positiveFiniteOr(value, DEFAULT_MIN_SCALE), this.#maxScale);\n if (next === this.#minScale) return;\n const previous = this.#minScale;\n this.#animationController.cancel();\n this.#minScale = next;\n this.requestUpdate('minScale', previous);\n this.#commitExternalTransform({ ...this.getTransform(), scale: this.#scale });\n }\n\n /** Inclusive upper scale limit. */\n @property({ attribute: 'max-scale', type: Number, reflect: true })\n get maxScale(): number {\n return this.#maxScale;\n }\n\n set maxScale(value: number) {\n const next = Math.max(positiveFiniteOr(value, DEFAULT_MAX_SCALE), this.#minScale);\n if (next === this.#maxScale) return;\n const previous = this.#maxScale;\n this.#animationController.cancel();\n this.#maxScale = next;\n this.requestUpdate('maxScale', previous);\n this.#commitExternalTransform({ ...this.getTransform(), scale: this.#scale });\n }\n\n /** Enables panning by pointer, focused wheel, focused keyboard, and Invoker commands; requires Space for primary-pointer dragging when set to space. */\n @property({ attribute: 'behavior-pan', converter: BEHAVIOR_PAN_CONVERTER, reflect: true })\n get behaviorPan(): ViewportPanBehavior {\n return this.#behaviorPan;\n }\n\n set behaviorPan(value: ViewportPanBehavior | null | undefined) {\n const next = value === 'space' ? 'space' : Boolean(value);\n if (next === this.#behaviorPan) return;\n const previous = this.#behaviorPan;\n this.#behaviorPan = next;\n this.requestUpdate('behaviorPan', previous);\n }\n\n /** Enables zooming by pinch, focused modified wheel, focused keyboard, and Invoker commands. */\n @property({ type: Boolean, attribute: 'behavior-zoom', reflect: true }) behaviorZoom = false;\n\n /** Whether the viewport may admit new user-input panning. */\n get pannable(): boolean {\n return Boolean(this.behaviorPan);\n }\n\n /** Whether the viewport may admit new user-input zooming. */\n get zoomable(): boolean {\n return this.behaviorZoom;\n }\n\n /** Fits measurable direct default-slot content once after initial layout. */\n @property({ type: Boolean, reflect: true }) autoFit = false;\n /** Default uniform CSS-pixel inset reserved around bounds when fitting content. */\n @property({ attribute: 'fit-inset', type: Number, reflect: true })\n get fitInset(): number {\n return this.#fitInset;\n }\n\n set fitInset(value: number) {\n const next = nonnegativeFiniteOr(value, 0);\n if (next === this.#fitInset) return;\n const previous = this.#fitInset;\n this.#fitInset = next;\n this.requestUpdate('fitInset', previous);\n }\n\n /** CSS-pixel pointer movement required before a pointer pan begins. */\n @property({ attribute: 'drag-threshold', type: Number, reflect: true })\n get dragThreshold(): number {\n return this.#dragThreshold;\n }\n\n set dragThreshold(value: number) {\n const next = nonnegativeFiniteOr(value, DEFAULT_DRAG_THRESHOLD);\n if (next === this.#dragThreshold) return;\n const previous = this.#dragThreshold;\n this.#dragThreshold = next;\n this.requestUpdate('dragThreshold', previous);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n attachInternals(this);\n if (this.hasUpdated && !this.isUpdatePending) this.#publishTransformChanges = true;\n }\n\n disconnectedCallback(): void {\n this.#publishTransformChanges = false;\n super.disconnectedCallback();\n }\n\n protected updated(changed: PropertyValues<this>): void {\n super.updated(changed);\n if (\n (changed.has('behaviorPan') && Boolean(changed.get('behaviorPan')) !== this.pannable) ||\n (changed.has('behaviorZoom') && Boolean(changed.get('behaviorZoom')) !== this.zoomable)\n ) {\n this.dispatchEvent(new Event('capabilitieschange', { bubbles: true, composed: true }));\n }\n if (\n this.isConnected &&\n this.#publishTransformChanges &&\n (changed.has('x') || changed.has('y') || changed.has('scale'))\n ) {\n this.dispatchEvent(\n new CustomEvent<ViewportTransform>('viewportchange', {\n bubbles: true,\n composed: true,\n detail: this.getTransform()\n })\n );\n }\n this.#publishTransformChanges = this.isConnected;\n }\n\n render() {\n return html`\n <div internal-host focusable>\n <div\n class=\"plane\"\n style=${styleMap({ transform: `scale(${this.#scale}) translate(${-this.#x}px, ${-this.#y}px)` })}\n >\n <slot name=\"background\"></slot>\n <slot @slotchange=${this.#autoFitController.contentChanged}></slot>\n </div>\n <div class=\"overlay\">\n <slot name=\"overlay\"></slot>\n </div>\n </div>\n `;\n }\n\n /** Converts a content-space point to viewport CSS pixels. */\n toViewportCoords(contentX: number, contentY: number): ViewportPoint {\n return {\n x: (contentX - this.#x) * this.#scale,\n y: (contentY - this.#y) * this.#scale\n };\n }\n\n /** Converts a viewport CSS-pixel point to content space. */\n toContentCoords(viewportX: number, viewportY: number): ViewportPoint {\n return contentPointFromViewport(viewportX, viewportY, this.getTransform());\n }\n\n /** Returns the current content-space origin and CSS-pixel scale. */\n getTransform(): ViewportTransform {\n return { scale: this.#scale, x: this.#x, y: this.#y };\n }\n\n /** Returns the visible content-space rectangle. */\n getVisibleRect(): ViewportRect {\n return {\n x: this.#x,\n y: this.#y,\n width: this.clientWidth / this.#scale,\n height: this.clientHeight / this.#scale\n };\n }\n\n /**\n * Requests one discrete user-originated pan. When pannable, the viewport dispatches\n * a cancelable `pan` and applies the default transform if no listener cancels the event.\n * Returns true only when that default changes the transform.\n */\n requestPan(proposal: ViewportPanProposal): boolean {\n if (!this.pannable) return false;\n return this.#requestPan(proposal, { start: this.getTransform(), appliesDefault: true });\n }\n\n /**\n * Requests one discrete user-originated zoom. When zoomable, the viewport dispatches\n * a cancelable `zoom` and applies the default transform if no listener cancels the event.\n * Set `options.animated` to animate the uncanceled default; the option is absent from the `zoom` detail.\n * Returns true when the default changes or schedules a change to the transform.\n */\n requestZoom(proposal: ViewportZoomProposal, options: ViewportZoomRequestOptions = {}): boolean {\n if (!this.zoomable) return false;\n return this.#performZoom(proposal, options);\n }\n\n #performZoom(proposal: ViewportZoomProposal, options: ViewportZoomRequestOptions = {}): boolean {\n const next = this.#normalizeTransform(proposal.next);\n const start = this.getTransform();\n if (!this.#dispatchNavigationEvent('zoom', { ...proposal, next: { ...next }, start: { ...start } }, true))\n return false;\n const current = this.getTransform();\n const unchanged = next.x === current.x && next.y === current.y && next.scale === current.scale;\n if (unchanged && (!options.animated || this.#animationController.destinationScale === undefined)) return false;\n this.#animationController.cancel();\n this.#autoFitController.consume();\n if (options.animated) {\n this.animateTo(next);\n return true;\n }\n if (!this.#commitTransform(next)) return false;\n this.#gestureNavigationController.rebasePointerSessions();\n return true;\n }\n\n /**\n * Starts a sustained semantic pan after the caller crosses its activation threshold.\n * Dispatches `panstart`, performs the initial `pan` update, and returns a session for later updates\n * and one terminal `panend`. Returns undefined when pannable is false.\n */\n startPan(proposal: ViewportPanProposal): ViewportPanSession | undefined {\n if (!this.pannable) return undefined;\n const source = proposal.source;\n const next = this.#normalizeTransform(proposal.next);\n const initialProposal: ViewportPanProposal = { ...proposal, source, next };\n const sessionStart = this.getTransform();\n const appliesDefault = this.#dispatchNavigationEvent(\n 'panstart',\n { ...initialProposal, next: { ...next }, start: { ...sessionStart } },\n true\n );\n let ended = false;\n const session: ViewportPanSession = {\n start: { ...sessionStart },\n update: (update: ViewportPanUpdateProposal): boolean => {\n if (ended) return false;\n return this.#requestPan({ ...update, source }, { start: sessionStart, appliesDefault, isActive: () => !ended });\n },\n end: request => {\n if (ended) return;\n ended = true;\n this.#dispatchNavigationEvent(\n 'panend',\n { ...request, source, start: { ...sessionStart }, transform: this.getTransform() },\n false\n );\n }\n };\n this.#requestPan(initialProposal, { start: sessionStart, appliesDefault, isActive: () => !ended });\n return session;\n }\n\n #requestPan(\n proposal: ViewportPanProposal,\n disposition: { start: ViewportTransform; appliesDefault: boolean; isActive?: () => boolean }\n ): boolean {\n const next = this.#normalizeTransform(proposal.next);\n if (\n !this.#dispatchNavigationEvent('pan', { ...proposal, next: { ...next }, start: { ...disposition.start } }, true)\n ) {\n return false;\n }\n if (!disposition.appliesDefault || disposition.isActive?.() === false) return false;\n const current = this.getTransform();\n if (next.x === current.x && next.y === current.y && next.scale === current.scale) return false;\n this.#animationController.cancel();\n this.#autoFitController.consume();\n if (!this.#commitTransform(next)) return false;\n this.#gestureNavigationController.rebasePointerSessions();\n return true;\n }\n\n #normalizeTransform(next: ViewportTransform): ViewportTransform {\n return { x: finiteOr(next.x, this.#x), y: finiteOr(next.y, this.#y), scale: this.#clampScale(next.scale) };\n }\n\n /** Animates the viewport to the requested partial transform. */\n animateTo(target: Partial<ViewportTransform>, options: ViewportAnimationOptions = {}): void {\n this.#animationController.animateTo(target, options);\n }\n\n /** Centers or fits a content-space region within the viewport. */\n reveal(region: { x: number; y: number; width?: number; height?: number }, options: ViewportRevealOptions = {}): void {\n this.#applyRevealTarget(this.#getRevealTarget(region, this.#revealFitOptions(options)), options);\n }\n\n /** Fits the union of direct default-slot element boxes within the viewport. */\n fitContents(options: ViewportRevealOptions = {}): void {\n const target = this.#getFitContentsTargetFromClientRects(\n this.#clientRectsFromChildren(Array.from(this.children).filter(child => !child.slot)),\n this.#resolveFitOptions(options)\n );\n if (target) this.#applyRevealTarget(target, options);\n }\n\n #getFitContentsTargetFromClientRects(\n clientRects: Iterable<ViewportClientRect>,\n options: ViewportFitOptions\n ): ViewportTransform | undefined {\n if (!this.internalHost) return undefined;\n const transform = this.getTransform();\n const viewportFrame = this.#viewportFrame();\n const region = contentBoundsFromClientRects(clientRects, viewportFrame, transform);\n return region ? this.#getRevealTarget(region, options, transform) : undefined;\n }\n\n #applyInitialAutoFit(clientRects: readonly ViewportClientRect[]): void {\n const target = this.#getFitContentsTargetFromClientRects(clientRects, this.#resolveFitOptions({}));\n if (!target) return;\n this.#animationController.cancel();\n if (this.#commitTransform(target)) {\n this.#gestureNavigationController.rebasePointerSessions();\n }\n }\n\n #applyRevealTarget(target: ViewportTransform, options: ViewportRevealOptions): void {\n if (options.animated) {\n if (options.duration === undefined) this.animateTo(target);\n else this.animateTo(target, { duration: options.duration });\n } else {\n this.#applyExternalTransform(target);\n }\n }\n\n #getRevealTarget(\n region: { x: number; y: number; width?: number; height?: number },\n options: ViewportFitOptions,\n transform = this.getTransform()\n ): ViewportTransform {\n return revealTarget(region, {\n options,\n scaleRange: this.#getScaleRange(),\n transform,\n viewport: { height: this.clientHeight, width: this.clientWidth }\n });\n }\n\n #getZoomTarget(action: ViewportZoomAction, stepScale: number): ViewportTransform | undefined {\n if (action === 'in') return this.#getCenteredScaleTransform(nextScaleStep(1, stepScale, this.#getScaleRange()));\n if (action === 'out') return this.#getCenteredScaleTransform(nextScaleStep(-1, stepScale, this.#getScaleRange()));\n if (action === 'reset') return this.#getCenteredScaleTransform(this.#clampScale(1));\n return this.#getFitContentsTargetFromClientRects(\n this.#clientRectsFromChildren(Array.from(this.children).filter(child => !child.slot)),\n this.#resolveFitOptions({})\n );\n }\n\n #clientRectsFromChildren(children: Iterable<Element>): Iterable<ViewportClientRect> {\n return (function* (): Generator<ViewportClientRect> {\n for (const child of children) yield child.getBoundingClientRect();\n })();\n }\n\n #revealFitOptions(options: ViewportRevealOptions): ViewportFitOptions {\n return { inset: options.inset, scale: options.scale };\n }\n\n #resolveFitOptions(options: ViewportRevealOptions): ViewportFitOptions {\n return { inset: options.inset ?? this.#fitInset, scale: options.scale };\n }\n #getScaleRange(): { min: number; max: number } {\n return { min: this.#minScale, max: this.#maxScale };\n }\n #getCenteredScaleTransform(scale: number): ViewportTransform {\n return centeredScaleTransform(scale, this.getTransform(), { height: this.clientHeight, width: this.clientWidth });\n }\n\n #viewportFrame(): DOMRect {\n return this.internalHost?.getBoundingClientRect() ?? DOMRect.fromRect();\n }\n #clientToViewport(clientX: number, clientY: number, frame = this.#viewportFrame()): ViewportPoint {\n return { x: clientX - frame.left, y: clientY - frame.top };\n }\n\n #commitTransform(next: ViewportTransform): boolean {\n const x = finiteOr(next.x, this.#x);\n const y = finiteOr(next.y, this.#y);\n const scale = this.#clampScale(next.scale);\n if (x === this.#x && y === this.#y && scale === this.#scale) return false;\n this.#updateTransformFields({ scale, x, y });\n return true;\n }\n\n #applyExternalTransform(next: ViewportTransform): void {\n this.#animationController.cancel();\n this.#commitExternalTransform(next);\n }\n\n #commitExternalTransform(next: ViewportTransform): void {\n if (!this.#commitTransform(next)) return;\n if (this.isConnected) this.#autoFitController.consume();\n this.#gestureNavigationController.rebasePointerSessions();\n }\n\n #applyAnimationTransform(next: ViewportTransform): void {\n const committed = this.#commitTransform(next);\n if (!committed) return;\n if (this.isConnected) this.#autoFitController.consume();\n this.#gestureNavigationController.rebasePointerSessions();\n }\n\n #dispatchNavigationEvent<T>(type: string, detail: T, cancelable: boolean): boolean {\n return this.dispatchEvent(\n new CustomEvent<T>(type, {\n bubbles: true,\n cancelable,\n composed: true,\n detail\n })\n );\n }\n\n #updateTransformFields(next: ViewportTransform): void {\n const previousX = this.#x;\n const previousY = this.#y;\n const previousScale = this.#scale;\n this.#x = next.x;\n this.#y = next.y;\n this.#scale = next.scale;\n if (next.x !== previousX) this.requestUpdate('x', previousX);\n if (next.y !== previousY) this.requestUpdate('y', previousY);\n if (next.scale !== previousScale) this.requestUpdate('scale', previousScale);\n }\n #clampScale(value: number): number {\n const finite = Number.isFinite(value) && value > 0 ? value : this.#minScale;\n return Math.min(this.#maxScale, Math.max(this.#minScale, finite));\n }\n}\n\nfunction nextScaleStep(direction: -1 | 1, current: number, scaleRange: { min: number; max: number }): number {\n const steps = [...ZOOM_SCALE_STEPS, scaleRange.min, scaleRange.max]\n .map(scale => Math.min(scaleRange.max, Math.max(scaleRange.min, scale)))\n .sort((first, second) => first - second)\n .filter((scale, index, all) => index === 0 || scale !== all[index - 1]);\n if (direction > 0) return steps.find(scale => scale > current) ?? scaleRange.max;\n for (let index = steps.length - 1; index >= 0; index -= 1) {\n const scale = steps[index];\n if (scale !== undefined && scale < current) return scale;\n }\n return scaleRange.min;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"viewport2.js","names":[],"sources":["../../src/viewport/viewport.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { query } from 'lit/decorators/query.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport {\n audit,\n attachInternals,\n finiteOr,\n nonnegativeFiniteOr,\n positiveFiniteOr,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport styles from './viewport.css?inline';\nimport { ViewportAnimationController } from './viewport-animation.controller.js';\nimport { ViewportAutoFitController } from './viewport-autofit.controller.js';\nimport {\n contentBoundsFromClientRects,\n revealTarget,\n type ViewportClientRect,\n type ViewportFitOptions\n} from './viewport-fitting.utils.js';\nimport { ViewportGestureNavigationController } from './viewport-gesture-navigation.controller.js';\nimport { ViewportNavigationController } from './viewport-navigation.controller.js';\nimport type { ViewportZoomAction } from './viewport-navigation.types.js';\nimport type {\n ViewportAnimationOptions,\n ViewportPanBehavior,\n ViewportPanProposal,\n ViewportPanSession,\n ViewportPanUpdateProposal,\n ViewportPoint,\n ViewportRect,\n ViewportRevealOptions,\n ViewportTransform,\n ViewportZoomProposal,\n ViewportZoomRequestOptions\n} from './viewport.types.js';\nimport { centeredScaleTransform, contentPointFromViewport } from './viewport-projection.utils.js';\n\nconst DEFAULT_MIN_SCALE = 0.05;\nconst DEFAULT_MAX_SCALE = 20;\nconst DEFAULT_DRAG_THRESHOLD = 5;\nconst ZOOM_SCALE_STEPS = [0.05, 0.1, 0.25, 0.5, 1, 2, 4, 8, 16, 20] as const;\nconst BEHAVIOR_PAN_CONVERTER = {\n fromAttribute(value: string | null): ViewportPanBehavior {\n if (value === null) return false;\n return value === 'space' ? 'space' : true;\n },\n toAttribute(value: ViewportPanBehavior): string | null {\n if (!value) return null;\n return value === 'space' ? 'space' : '';\n }\n};\n\n/**\n * @element nve-viewport\n * @description A viewport provides a spatial surface for arbitrary content, with optional pan and zoom navigation.\n * @documentation https://nvidia.github.io/elements/docs/elements/viewport/\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/viewport\n * @slot - Content positioned in the viewport's infinite content space.\n * @slot background - Custom content rendered behind viewport content and excluded from content fitting\n * @slot overlay - Interactive content fixed above the transformed plane and excluded from content fitting\n * @event panstart - Dispatched when a sustained pointer or control pan begins. Cancel to suppress the default for its session.\n * @event pan - Dispatched for admitted user pan proposals. Cancel to skip the proposed transform mutation.\n * @event panend - Dispatched once when a sustained pan ends, including its terminal reason.\n * @event zoom - Dispatched for admitted user zoom proposals. Cancel to skip the proposed transform mutation.\n * @event viewportchange - Dispatched once after a render that commits one or more viewport transform changes.\n * @event capabilitieschange - Dispatched after effective user-input pan or zoom admission changes.\n * @cssprop --background - Background color of the fixed viewport area.\n * @cssprop --min-height\n * @cssprop --pan-cursor - Cursor shown over a background eligible for primary-pointer panning.\n * @cssprop --panning-cursor - Cursor shown while a pointer pan is active.\n * @command --pan-left - With behavior-pan enabled, pans left by one discrete step.\n * @command --pan-right - With behavior-pan enabled, pans right by one discrete step.\n * @command --pan-up - With behavior-pan enabled, pans up by one discrete step.\n * @command --pan-down - With behavior-pan enabled, pans down by one discrete step.\n * @command --zoom-in - With behavior-zoom enabled, animates to the next permitted scale step.\n * @command --zoom-out - With behavior-zoom enabled, animates to the previous permitted scale step.\n * @command --zoom-reset - With behavior-zoom enabled, animates to 100% scale.\n * @command --zoom-to-fit - With behavior-zoom enabled, animates to fit direct default-slot element boxes.\n * @stable false\n */\n@audit()\nexport class Viewport extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-viewport',\n version: '0.0.0'\n };\n\n /** @private */\n declare _internals: ElementInternals;\n\n @query('[internal-host]') private internalHost: HTMLElement | null;\n readonly #navigationController: ViewportNavigationController;\n readonly #gestureNavigationController: ViewportGestureNavigationController;\n readonly #animationController: ViewportAnimationController;\n readonly #autoFitController = new ViewportAutoFitController(this, clientRects =>\n this.#applyInitialAutoFit(clientRects)\n );\n #publishTransformChanges = false;\n #x = 0;\n #y = 0;\n #scale = 1;\n #minScale = DEFAULT_MIN_SCALE;\n #maxScale = DEFAULT_MAX_SCALE;\n #dragThreshold = DEFAULT_DRAG_THRESHOLD;\n #fitInset = 0;\n #behaviorPan: ViewportPanBehavior = false;\n constructor() {\n super();\n this.#animationController = new ViewportAnimationController(this, {\n commitTransform: next => {\n this.#applyAnimationTransform(next);\n },\n clampScale: value => this.#clampScale(value),\n getTransform: () => this.getTransform(),\n getViewportSize: () => ({ height: this.clientHeight, width: this.clientWidth })\n });\n this.#navigationController = new ViewportNavigationController(this, {\n getTransform: () => this.getTransform(),\n getZoomTarget: action => this.#getZoomTarget(action, this.#animationController.destinationScale ?? this.#scale)\n });\n this.#gestureNavigationController = new ViewportGestureNavigationController(this, {\n clampScale: value => this.#clampScale(value),\n clientToViewport: (clientX, clientY) => this.#clientToViewport(clientX, clientY),\n getTransform: () => this.getTransform(),\n requestAdmittedPinchZoom: proposal => this.#performZoom(proposal)\n });\n }\n\n /** Horizontal content-space coordinate at the viewport origin. */\n @property({ type: Number })\n get x(): number {\n return this.#x;\n }\n\n set x(value: number) {\n this.#applyExternalTransform({ ...this.getTransform(), x: finiteOr(value, 0) });\n }\n\n /** Vertical content-space coordinate at the viewport origin. */\n @property({ type: Number })\n get y(): number {\n return this.#y;\n }\n\n set y(value: number) {\n this.#applyExternalTransform({ ...this.getTransform(), y: finiteOr(value, 0) });\n }\n\n /** Content-to-viewport CSS-pixel scale. */\n @property({ type: Number })\n get scale(): number {\n return this.#scale;\n }\n\n set scale(value: number) {\n this.#applyExternalTransform({ ...this.getTransform(), scale: value });\n }\n\n /** Inclusive lower scale limit. */\n @property({ attribute: 'min-scale', type: Number, reflect: true })\n get minScale(): number {\n return this.#minScale;\n }\n\n set minScale(value: number) {\n const next = Math.min(positiveFiniteOr(value, DEFAULT_MIN_SCALE), this.#maxScale);\n if (next === this.#minScale) return;\n const previous = this.#minScale;\n this.#animationController.cancel();\n this.#minScale = next;\n this.requestUpdate('minScale', previous);\n this.#commitExternalTransform({ ...this.getTransform(), scale: this.#scale });\n }\n\n /** Inclusive upper scale limit. */\n @property({ attribute: 'max-scale', type: Number, reflect: true })\n get maxScale(): number {\n return this.#maxScale;\n }\n\n set maxScale(value: number) {\n const next = Math.max(positiveFiniteOr(value, DEFAULT_MAX_SCALE), this.#minScale);\n if (next === this.#maxScale) return;\n const previous = this.#maxScale;\n this.#animationController.cancel();\n this.#maxScale = next;\n this.requestUpdate('maxScale', previous);\n this.#commitExternalTransform({ ...this.getTransform(), scale: this.#scale });\n }\n\n /**\n * Scale stops for keyboard and command zoom, clamped to the scale bounds.\n * Defaults to built-in stops; an empty array uses only the bounds.\n */\n // eslint-disable-next-line local/primitive-property\n @property({ attribute: 'zoom-stops', type: Array }) zoomStops?: readonly number[];\n\n /** Enables panning by pointer, focused wheel, focused keyboard, and Invoker commands; requires Space for primary-pointer dragging when set to space. */\n @property({ attribute: 'behavior-pan', converter: BEHAVIOR_PAN_CONVERTER, reflect: true })\n get behaviorPan(): ViewportPanBehavior {\n return this.#behaviorPan;\n }\n\n set behaviorPan(value: ViewportPanBehavior | null | undefined) {\n const next = value === 'space' ? 'space' : Boolean(value);\n if (next === this.#behaviorPan) return;\n const previous = this.#behaviorPan;\n this.#behaviorPan = next;\n this.requestUpdate('behaviorPan', previous);\n }\n\n /** Enables zooming by pinch, focused modified wheel, focused keyboard, and Invoker commands. */\n @property({ type: Boolean, attribute: 'behavior-zoom', reflect: true }) behaviorZoom = false;\n\n /** Whether the viewport may admit new user-input panning. */\n get pannable(): boolean {\n return Boolean(this.behaviorPan);\n }\n\n /** Whether the viewport may admit new user-input zooming. */\n get zoomable(): boolean {\n return this.behaviorZoom;\n }\n\n /** Fits measurable direct default-slot content once after initial layout. */\n @property({ type: Boolean, reflect: true }) autoFit = false;\n /** Default uniform CSS-pixel inset reserved around bounds when fitting content. */\n @property({ attribute: 'fit-inset', type: Number, reflect: true })\n get fitInset(): number {\n return this.#fitInset;\n }\n\n set fitInset(value: number) {\n const next = nonnegativeFiniteOr(value, 0);\n if (next === this.#fitInset) return;\n const previous = this.#fitInset;\n this.#fitInset = next;\n this.requestUpdate('fitInset', previous);\n }\n\n /** CSS-pixel pointer movement required before a pointer pan begins. */\n @property({ attribute: 'drag-threshold', type: Number, reflect: true })\n get dragThreshold(): number {\n return this.#dragThreshold;\n }\n\n set dragThreshold(value: number) {\n const next = nonnegativeFiniteOr(value, DEFAULT_DRAG_THRESHOLD);\n if (next === this.#dragThreshold) return;\n const previous = this.#dragThreshold;\n this.#dragThreshold = next;\n this.requestUpdate('dragThreshold', previous);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n attachInternals(this);\n if (this.hasUpdated && !this.isUpdatePending) this.#publishTransformChanges = true;\n }\n\n disconnectedCallback(): void {\n this.#publishTransformChanges = false;\n super.disconnectedCallback();\n }\n\n protected updated(changed: PropertyValues<this>): void {\n super.updated(changed);\n if (\n (changed.has('behaviorPan') && Boolean(changed.get('behaviorPan')) !== this.pannable) ||\n (changed.has('behaviorZoom') && Boolean(changed.get('behaviorZoom')) !== this.zoomable)\n ) {\n this.dispatchEvent(new Event('capabilitieschange', { bubbles: true, composed: true }));\n }\n if (\n this.isConnected &&\n this.#publishTransformChanges &&\n (changed.has('x') || changed.has('y') || changed.has('scale'))\n ) {\n this.dispatchEvent(\n new CustomEvent<ViewportTransform>('viewportchange', {\n bubbles: true,\n composed: true,\n detail: this.getTransform()\n })\n );\n }\n this.#publishTransformChanges = this.isConnected;\n }\n\n render() {\n return html`\n <div internal-host focusable>\n <div\n class=\"plane\"\n style=${styleMap({ transform: `scale(${this.#scale}) translate(${-this.#x}px, ${-this.#y}px)` })}\n >\n <slot name=\"background\"></slot>\n <slot @slotchange=${this.#autoFitController.contentChanged}></slot>\n </div>\n <div class=\"overlay\">\n <slot name=\"overlay\"></slot>\n </div>\n </div>\n `;\n }\n\n /** Converts a content-space point to viewport CSS pixels. */\n toViewportCoords(contentX: number, contentY: number): ViewportPoint {\n return {\n x: (contentX - this.#x) * this.#scale,\n y: (contentY - this.#y) * this.#scale\n };\n }\n\n /** Converts a viewport CSS-pixel point to content space. */\n toContentCoords(viewportX: number, viewportY: number): ViewportPoint {\n return contentPointFromViewport(viewportX, viewportY, this.getTransform());\n }\n\n /** Returns the current content-space origin and CSS-pixel scale. */\n getTransform(): ViewportTransform {\n return { scale: this.#scale, x: this.#x, y: this.#y };\n }\n\n /** Returns the visible content-space rectangle. */\n getVisibleRect(): ViewportRect {\n return {\n x: this.#x,\n y: this.#y,\n width: this.clientWidth / this.#scale,\n height: this.clientHeight / this.#scale\n };\n }\n\n /**\n * Requests one discrete user-originated pan. When pannable, the viewport dispatches\n * a cancelable `pan` and applies the default transform if no listener cancels the event.\n * Returns true only when that default changes the transform.\n */\n requestPan(proposal: ViewportPanProposal): boolean {\n if (!this.pannable) return false;\n return this.#requestPan(proposal, { start: this.getTransform(), appliesDefault: true });\n }\n\n /**\n * Requests one discrete user-originated zoom. When zoomable, the viewport dispatches\n * a cancelable `zoom` and applies the default transform if no listener cancels the event.\n * Set `options.animated` to animate the uncanceled default; the option is absent from the `zoom` detail.\n * Returns true when the default changes or schedules a change to the transform.\n */\n requestZoom(proposal: ViewportZoomProposal, options: ViewportZoomRequestOptions = {}): boolean {\n if (!this.zoomable) return false;\n return this.#performZoom(proposal, options);\n }\n\n #performZoom(proposal: ViewportZoomProposal, options: ViewportZoomRequestOptions = {}): boolean {\n const next = this.#normalizeTransform(proposal.next);\n const start = this.getTransform();\n if (!this.#dispatchNavigationEvent('zoom', { ...proposal, next: { ...next }, start: { ...start } }, true))\n return false;\n const current = this.getTransform();\n const unchanged = next.x === current.x && next.y === current.y && next.scale === current.scale;\n if (unchanged && (!options.animated || this.#animationController.destinationScale === undefined)) return false;\n this.#animationController.cancel();\n this.#autoFitController.consume();\n if (options.animated) {\n this.animateTo(next);\n return true;\n }\n if (!this.#commitTransform(next)) return false;\n this.#gestureNavigationController.rebasePointerSessions();\n return true;\n }\n\n /**\n * Starts a sustained semantic pan after the caller crosses its activation threshold.\n * Dispatches `panstart`, performs the initial `pan` update, and returns a session for later updates\n * and one terminal `panend`. Returns undefined when pannable is false.\n */\n startPan(proposal: ViewportPanProposal): ViewportPanSession | undefined {\n if (!this.pannable) return undefined;\n const source = proposal.source;\n const next = this.#normalizeTransform(proposal.next);\n const initialProposal: ViewportPanProposal = { ...proposal, source, next };\n const sessionStart = this.getTransform();\n const appliesDefault = this.#dispatchNavigationEvent(\n 'panstart',\n { ...initialProposal, next: { ...next }, start: { ...sessionStart } },\n true\n );\n let ended = false;\n const session: ViewportPanSession = {\n start: { ...sessionStart },\n update: (update: ViewportPanUpdateProposal): boolean => {\n if (ended) return false;\n return this.#requestPan({ ...update, source }, { start: sessionStart, appliesDefault, isActive: () => !ended });\n },\n end: request => {\n if (ended) return;\n ended = true;\n this.#dispatchNavigationEvent(\n 'panend',\n { ...request, source, start: { ...sessionStart }, transform: this.getTransform() },\n false\n );\n }\n };\n this.#requestPan(initialProposal, { start: sessionStart, appliesDefault, isActive: () => !ended });\n return session;\n }\n\n #requestPan(\n proposal: ViewportPanProposal,\n disposition: { start: ViewportTransform; appliesDefault: boolean; isActive?: () => boolean }\n ): boolean {\n const next = this.#normalizeTransform(proposal.next);\n if (\n !this.#dispatchNavigationEvent('pan', { ...proposal, next: { ...next }, start: { ...disposition.start } }, true)\n ) {\n return false;\n }\n if (!disposition.appliesDefault || disposition.isActive?.() === false) return false;\n const current = this.getTransform();\n if (next.x === current.x && next.y === current.y && next.scale === current.scale) return false;\n this.#animationController.cancel();\n this.#autoFitController.consume();\n if (!this.#commitTransform(next)) return false;\n this.#gestureNavigationController.rebasePointerSessions();\n return true;\n }\n\n #normalizeTransform(next: ViewportTransform): ViewportTransform {\n return { x: finiteOr(next.x, this.#x), y: finiteOr(next.y, this.#y), scale: this.#clampScale(next.scale) };\n }\n\n /** Animates the viewport to the requested partial transform. */\n animateTo(target: Partial<ViewportTransform>, options: ViewportAnimationOptions = {}): void {\n this.#animationController.animateTo(target, options);\n }\n\n /** Centers or fits a content-space region within the viewport. */\n reveal(region: { x: number; y: number; width?: number; height?: number }, options: ViewportRevealOptions = {}): void {\n this.#applyRevealTarget(this.#getRevealTarget(region, this.#revealFitOptions(options)), options);\n }\n\n /** Fits the union of direct default-slot element boxes within the viewport. */\n fitContents(options: ViewportRevealOptions = {}): void {\n const target = this.#getFitContentsTargetFromClientRects(\n this.#clientRectsFromChildren(Array.from(this.children).filter(child => !child.slot)),\n this.#resolveFitOptions(options)\n );\n if (target) this.#applyRevealTarget(target, options);\n }\n\n #getFitContentsTargetFromClientRects(\n clientRects: Iterable<ViewportClientRect>,\n options: ViewportFitOptions\n ): ViewportTransform | undefined {\n if (!this.internalHost) return undefined;\n const transform = this.getTransform();\n const viewportFrame = this.#viewportFrame();\n const region = contentBoundsFromClientRects(clientRects, viewportFrame, transform);\n return region ? this.#getRevealTarget(region, options, transform) : undefined;\n }\n\n #applyInitialAutoFit(clientRects: readonly ViewportClientRect[]): void {\n const target = this.#getFitContentsTargetFromClientRects(clientRects, this.#resolveFitOptions({}));\n if (!target) return;\n this.#animationController.cancel();\n if (this.#commitTransform(target)) {\n this.#gestureNavigationController.rebasePointerSessions();\n }\n }\n\n #applyRevealTarget(target: ViewportTransform, options: ViewportRevealOptions): void {\n if (options.animated) {\n if (options.duration === undefined) this.animateTo(target);\n else this.animateTo(target, { duration: options.duration });\n } else {\n this.#applyExternalTransform(target);\n }\n }\n\n #getRevealTarget(\n region: { x: number; y: number; width?: number; height?: number },\n options: ViewportFitOptions,\n transform = this.getTransform()\n ): ViewportTransform {\n return revealTarget(region, {\n options,\n scaleRange: this.#getScaleRange(),\n transform,\n viewport: { height: this.clientHeight, width: this.clientWidth }\n });\n }\n\n #getZoomTarget(action: ViewportZoomAction, stepScale: number): ViewportTransform | undefined {\n if (action === 'in') return this.#getZoomStepTarget(1, stepScale);\n if (action === 'out') return this.#getZoomStepTarget(-1, stepScale);\n if (action === 'reset') return this.#getCenteredScaleTransform(this.#clampScale(1));\n return this.#getFitContentsTargetFromClientRects(\n this.#clientRectsFromChildren(Array.from(this.children).filter(child => !child.slot)),\n this.#resolveFitOptions({})\n );\n }\n\n #getZoomStepTarget(direction: -1 | 1, currentScale: number): ViewportTransform {\n const stops = Array.isArray(this.zoomStops) ? this.zoomStops : ZOOM_SCALE_STEPS;\n const scaleRange = { ...this.#getScaleRange(), stops };\n const scale = nextScaleStep(direction, currentScale, scaleRange);\n return this.#getCenteredScaleTransform(scale);\n }\n\n #clientRectsFromChildren(children: Iterable<Element>): Iterable<ViewportClientRect> {\n return (function* (): Generator<ViewportClientRect> {\n for (const child of children) yield child.getBoundingClientRect();\n })();\n }\n\n #revealFitOptions(options: ViewportRevealOptions): ViewportFitOptions {\n return { inset: options.inset, scale: options.scale };\n }\n\n #resolveFitOptions(options: ViewportRevealOptions): ViewportFitOptions {\n return { inset: options.inset ?? this.#fitInset, scale: options.scale };\n }\n #getScaleRange(): { min: number; max: number } {\n return { min: this.#minScale, max: this.#maxScale };\n }\n #getCenteredScaleTransform(scale: number): ViewportTransform {\n return centeredScaleTransform(scale, this.getTransform(), { height: this.clientHeight, width: this.clientWidth });\n }\n\n #viewportFrame(): DOMRect {\n return this.internalHost?.getBoundingClientRect() ?? DOMRect.fromRect();\n }\n #clientToViewport(clientX: number, clientY: number, frame = this.#viewportFrame()): ViewportPoint {\n return { x: clientX - frame.left, y: clientY - frame.top };\n }\n\n #commitTransform(next: ViewportTransform): boolean {\n const x = finiteOr(next.x, this.#x);\n const y = finiteOr(next.y, this.#y);\n const scale = this.#clampScale(next.scale);\n if (x === this.#x && y === this.#y && scale === this.#scale) return false;\n this.#updateTransformFields({ scale, x, y });\n return true;\n }\n\n #applyExternalTransform(next: ViewportTransform): void {\n this.#animationController.cancel();\n this.#commitExternalTransform(next);\n }\n\n #commitExternalTransform(next: ViewportTransform): void {\n if (!this.#commitTransform(next)) return;\n if (this.isConnected) this.#autoFitController.consume();\n this.#gestureNavigationController.rebasePointerSessions();\n }\n\n #applyAnimationTransform(next: ViewportTransform): void {\n const committed = this.#commitTransform(next);\n if (!committed) return;\n if (this.isConnected) this.#autoFitController.consume();\n this.#gestureNavigationController.rebasePointerSessions();\n }\n\n #dispatchNavigationEvent<T>(type: string, detail: T, cancelable: boolean): boolean {\n return this.dispatchEvent(\n new CustomEvent<T>(type, {\n bubbles: true,\n cancelable,\n composed: true,\n detail\n })\n );\n }\n\n #updateTransformFields(next: ViewportTransform): void {\n const previousX = this.#x;\n const previousY = this.#y;\n const previousScale = this.#scale;\n this.#x = next.x;\n this.#y = next.y;\n this.#scale = next.scale;\n if (next.x !== previousX) this.requestUpdate('x', previousX);\n if (next.y !== previousY) this.requestUpdate('y', previousY);\n if (next.scale !== previousScale) this.requestUpdate('scale', previousScale);\n }\n #clampScale(value: number): number {\n const finite = Number.isFinite(value) && value > 0 ? value : this.#minScale;\n return Math.min(this.#maxScale, Math.max(this.#minScale, finite));\n }\n}\n\nfunction nextScaleStep(\n direction: -1 | 1,\n current: number,\n scaleRange: { min: number; max: number; stops: readonly number[] }\n): number {\n const steps = [...scaleRange.stops, scaleRange.min, scaleRange.max]\n .filter(scale => Number.isFinite(scale) && scale > 0)\n .map(scale => Math.min(scaleRange.max, Math.max(scaleRange.min, scale)))\n .sort((first, second) => first - second)\n .filter((scale, index, all) => index === 0 || scale !== all[index - 1]);\n if (direction > 0) return steps.find(scale => scale > current) ?? scaleRange.max;\n for (let index = steps.length - 1; index >= 0; index -= 1) {\n const scale = steps[index];\n if (scale !== undefined && scale < current) return scale;\n }\n return scaleRange.min;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA0CA,IAAM,IAAoB,KACpB,IAAoB,IACpB,IAAyB,GACzB,IAAmB;CAAC;CAAM;CAAK;CAAM;CAAK;CAAG;CAAG;CAAG;CAAG;CAAI;AAAE,GAC5D,IAAyB;CAC7B,cAAc,GAA2C;EAEvD,OADI,MAAU,OAAa,KACpB,MAAU,WAAU;CAC7B;CACA,YAAY,GAA2C;EAErD,OADK,IACE,MAAU,UAAU,UAAU,KADlB;CAErB;AACF,GAgCa,IAAN,cAAuB,EAAW;;EACvB,KAAA,SAAA,EAAU,CAAC,CAAM,CAAC;;;EAEP,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;CAMA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,cAAc;EAcZ,AAbA,MAAM,GAbsB,KAAA,KAAA,IAAI,EAA0B,OAAM,MAChE,KAAK,GAAqB,CAAW,CACvC,GAC2B,KAAA,KAAA,IACtB,KAAA,KAAA,GACA,KAAA,KAAA,GACI,KAAA,KAAA,GACG,KAAA,KAAA,GACA,KAAA,KAAA,GACK,KAAA,KAAA,GACL,KAAA,KAAA,GACwB,KAAA,KAAA,IA2GmD,KAAA,eAAA,IAajC,KAAA,UAAA,IArHpD,KAAK,KAAuB,IAAI,EAA4B,MAAM;GAChE,kBAAiB,MAAQ;IACvB,KAAK,GAAyB,CAAI;GACpC;GACA,aAAY,MAAS,KAAK,GAAY,CAAK;GAC3C,oBAAoB,KAAK,aAAa;GACtC,wBAAwB;IAAE,QAAQ,KAAK;IAAc,OAAO,KAAK;GAAY;EAC/E,CAAC,GACD,KAAK,KAAwB,IAAI,EAA6B,MAAM;GAClE,oBAAoB,KAAK,aAAa;GACtC,gBAAe,MAAU,KAAK,GAAe,GAAQ,KAAK,GAAqB,oBAAoB,KAAK,EAAM;EAChH,CAAC,GACD,KAAK,KAA+B,IAAI,EAAoC,MAAM;GAChF,aAAY,MAAS,KAAK,GAAY,CAAK;GAC3C,mBAAmB,GAAS,MAAY,KAAK,GAAkB,GAAS,CAAO;GAC/E,oBAAoB,KAAK,aAAa;GACtC,2BAA0B,MAAY,KAAK,GAAa,CAAQ;EAClE,CAAC;CACH;CAGA,IACI,IAAY;EACd,OAAO,KAAK;CACd;CAEA,IAAI,EAAE,GAAe;EACnB,KAAK,GAAwB;GAAE,GAAG,KAAK,aAAa;GAAG,GAAG,EAAS,GAAO,CAAC;EAAE,CAAC;CAChF;CAGA,IACI,IAAY;EACd,OAAO,KAAK;CACd;CAEA,IAAI,EAAE,GAAe;EACnB,KAAK,GAAwB;GAAE,GAAG,KAAK,aAAa;GAAG,GAAG,EAAS,GAAO,CAAC;EAAE,CAAC;CAChF;CAGA,IACI,QAAgB;EAClB,OAAO,KAAK;CACd;CAEA,IAAI,MAAM,GAAe;EACvB,KAAK,GAAwB;GAAE,GAAG,KAAK,aAAa;GAAG,OAAO;EAAM,CAAC;CACvE;CAGA,IACI,WAAmB;EACrB,OAAO,KAAK;CACd;CAEA,IAAI,SAAS,GAAe;EAC1B,IAAM,IAAO,KAAK,IAAI,EAAiB,GAAO,CAAiB,GAAG,KAAK,EAAS;EAChF,IAAI,MAAS,KAAK,IAAW;EAC7B,IAAM,IAAW,KAAK;EAItB,AAHA,KAAK,GAAqB,OAAO,GACjC,KAAK,KAAY,GACjB,KAAK,cAAc,YAAY,CAAQ,GACvC,KAAK,GAAyB;GAAE,GAAG,KAAK,aAAa;GAAG,OAAO,KAAK;EAAO,CAAC;CAC9E;CAGA,IACI,WAAmB;EACrB,OAAO,KAAK;CACd;CAEA,IAAI,SAAS,GAAe;EAC1B,IAAM,IAAO,KAAK,IAAI,EAAiB,GAAO,CAAiB,GAAG,KAAK,EAAS;EAChF,IAAI,MAAS,KAAK,IAAW;EAC7B,IAAM,IAAW,KAAK;EAItB,AAHA,KAAK,GAAqB,OAAO,GACjC,KAAK,KAAY,GACjB,KAAK,cAAc,YAAY,CAAQ,GACvC,KAAK,GAAyB;GAAE,GAAG,KAAK,aAAa;GAAG,OAAO,KAAK;EAAO,CAAC;CAC9E;CAUA,IACI,cAAmC;EACrC,OAAO,KAAK;CACd;CAEA,IAAI,YAAY,GAA+C;EAC7D,IAAM,IAAO,MAAU,UAAU,UAAU,EAAQ;EACnD,IAAI,MAAS,KAAK,IAAc;EAChC,IAAM,IAAW,KAAK;EAEtB,AADA,KAAK,KAAe,GACpB,KAAK,cAAc,eAAe,CAAQ;CAC5C;CAMA,IAAI,WAAoB;EACtB,OAAO,EAAQ,KAAK;CACtB;CAGA,IAAI,WAAoB;EACtB,OAAO,KAAK;CACd;CAKA,IACI,WAAmB;EACrB,OAAO,KAAK;CACd;CAEA,IAAI,SAAS,GAAe;EAC1B,IAAM,IAAO,EAAoB,GAAO,CAAC;EACzC,IAAI,MAAS,KAAK,IAAW;EAC7B,IAAM,IAAW,KAAK;EAEtB,AADA,KAAK,KAAY,GACjB,KAAK,cAAc,YAAY,CAAQ;CACzC;CAGA,IACI,gBAAwB;EAC1B,OAAO,KAAK;CACd;CAEA,IAAI,cAAc,GAAe;EAC/B,IAAM,IAAO,EAAoB,GAAO,CAAsB;EAC9D,IAAI,MAAS,KAAK,IAAgB;EAClC,IAAM,IAAW,KAAK;EAEtB,AADA,KAAK,KAAiB,GACtB,KAAK,cAAc,iBAAiB,CAAQ;CAC9C;CAEA,oBAA0B;EAGxB,AAFA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GAChB,KAAK,cAAc,CAAC,KAAK,oBAAiB,KAAK,KAA2B;CAChF;CAEA,uBAA6B;EAE3B,AADA,KAAK,KAA2B,IAChC,MAAM,qBAAqB;CAC7B;CAEA,QAAkB,GAAqC;EAqBrD,AApBA,MAAM,QAAQ,CAAO,IAElB,EAAQ,IAAI,aAAa,KAAK,EAAQ,EAAQ,IAAI,aAAa,MAAO,KAAK,YAC3E,EAAQ,IAAI,cAAc,KAAK,EAAQ,EAAQ,IAAI,cAAc,MAAO,KAAK,aAE9E,KAAK,cAAc,IAAI,MAAM,sBAAsB;GAAE,SAAS;GAAM,UAAU;EAAK,CAAC,CAAC,GAGrF,KAAK,eACL,KAAK,OACJ,EAAQ,IAAI,GAAG,KAAK,EAAQ,IAAI,GAAG,KAAK,EAAQ,IAAI,OAAO,MAE5D,KAAK,cACH,IAAI,YAA+B,kBAAkB;GACnD,SAAS;GACT,UAAU;GACV,QAAQ,KAAK,aAAa;EAC5B,CAAC,CACH,GAEF,KAAK,KAA2B,KAAK;CACvC;CAEA,SAAS;EACP,OAAO,CAAI,0DAIG,EAAS,EAAE,WAAW,SAAS,KAAK,GAAO,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,sDAG7E,KAAK,GAAmB,eAAe;CAOnE;CAGA,iBAAiB,GAAkB,GAAiC;EAClE,OAAO;GACL,IAAI,IAAW,KAAK,MAAM,KAAK;GAC/B,IAAI,IAAW,KAAK,MAAM,KAAK;EACjC;CACF;CAGA,gBAAgB,GAAmB,GAAkC;EACnE,OAAO,EAAyB,GAAW,GAAW,KAAK,aAAa,CAAC;CAC3E;CAGA,eAAkC;EAChC,OAAO;GAAE,OAAO,KAAK;GAAQ,GAAG,KAAK;GAAI,GAAG,KAAK;EAAG;CACtD;CAGA,iBAA+B;EAC7B,OAAO;GACL,GAAG,KAAK;GACR,GAAG,KAAK;GACR,OAAO,KAAK,cAAc,KAAK;GAC/B,QAAQ,KAAK,eAAe,KAAK;EACnC;CACF;CAOA,WAAW,GAAwC;EAEjD,OADK,KAAK,WACH,KAAK,GAAY,GAAU;GAAE,OAAO,KAAK,aAAa;GAAG,gBAAgB;EAAK,CAAC,IAD3D;CAE7B;CAQA,YAAY,GAAgC,IAAsC,CAAC,GAAY;EAE7F,OADK,KAAK,WACH,KAAK,GAAa,GAAU,CAAO,IADf;CAE7B;CAEA,GAAa,GAAgC,IAAsC,CAAC,GAAY;EAC9F,IAAM,IAAO,KAAK,GAAoB,EAAS,IAAI,GAC7C,IAAQ,KAAK,aAAa;EAChC,IAAI,CAAC,KAAK,GAAyB,QAAQ;GAAE,GAAG;GAAU,MAAM,EAAE,GAAG,EAAK;GAAG,OAAO,EAAE,GAAG,EAAM;EAAE,GAAG,EAAI,GACtG,OAAO;EACT,IAAM,IAAU,KAAK,aAAa;EAWlC,OAVkB,EAAK,MAAM,EAAQ,KAAK,EAAK,MAAM,EAAQ,KAAK,EAAK,UAAU,EAAQ,UACvE,CAAC,EAAQ,YAAY,KAAK,GAAqB,qBAAqB,KAAA,KAAmB,MACzG,KAAK,GAAqB,OAAO,GACjC,KAAK,GAAmB,QAAQ,GAC5B,EAAQ,YACV,KAAK,UAAU,CAAI,GACZ,MAEJ,KAAK,GAAiB,CAAI,KAC/B,KAAK,GAA6B,sBAAsB,GACjD,MAFkC;CAG3C;CAOA,SAAS,GAA+D;EACtE,IAAI,CAAC,KAAK,UAAU;EACpB,IAAM,IAAS,EAAS,QAClB,IAAO,KAAK,GAAoB,EAAS,IAAI,GAC7C,IAAuC;GAAE,GAAG;GAAU;GAAQ;EAAK,GACnE,IAAe,KAAK,aAAa,GACjC,IAAiB,KAAK,GAC1B,YACA;GAAE,GAAG;GAAiB,MAAM,EAAE,GAAG,EAAK;GAAG,OAAO,EAAE,GAAG,EAAa;EAAE,GACpE,EACF,GACI,IAAQ,IACN,IAA8B;GAClC,OAAO,EAAE,GAAG,EAAa;GACzB,SAAS,MACP,CAAI,KACG,KAAK,GAAY;IAAE,GAAG;IAAQ;GAAO,GAAG;IAAE,OAAO;IAAc;IAAgB,gBAAgB,CAAC;GAAM,CAAC;GAEhH,MAAK,MAAW;IACV,MACJ,IAAQ,IACR,KAAK,GACH,UACA;KAAE,GAAG;KAAS;KAAQ,OAAO,EAAE,GAAG,EAAa;KAAG,WAAW,KAAK,aAAa;IAAE,GACjF,EACF;GACF;EACF;EAEA,OADA,KAAK,GAAY,GAAiB;GAAE,OAAO;GAAc;GAAgB,gBAAgB,CAAC;EAAM,CAAC,GAC1F;CACT;CAEA,GACE,GACA,GACS;EACT,IAAM,IAAO,KAAK,GAAoB,EAAS,IAAI;EAMnD,IAJE,CAAC,KAAK,GAAyB,OAAO;GAAE,GAAG;GAAU,MAAM,EAAE,GAAG,EAAK;GAAG,OAAO,EAAE,GAAG,EAAY,MAAM;EAAE,GAAG,EAAI,KAI7G,CAAC,EAAY,kBAAkB,EAAY,WAAW,MAAM,IAAO,OAAO;EAC9E,IAAM,IAAU,KAAK,aAAa;EAMlC,OALI,EAAK,MAAM,EAAQ,KAAK,EAAK,MAAM,EAAQ,KAAK,EAAK,UAAU,EAAQ,UAC3E,KAAK,GAAqB,OAAO,GACjC,KAAK,GAAmB,QAAQ,GAC5B,CAAC,KAAK,GAAiB,CAAI,KAAU,MACzC,KAAK,GAA6B,sBAAsB,GACjD;CACT;CAEA,GAAoB,GAA4C;EAC9D,OAAO;GAAE,GAAG,EAAS,EAAK,GAAG,KAAK,EAAE;GAAG,GAAG,EAAS,EAAK,GAAG,KAAK,EAAE;GAAG,OAAO,KAAK,GAAY,EAAK,KAAK;EAAE;CAC3G;CAGA,UAAU,GAAoC,IAAoC,CAAC,GAAS;EAC1F,KAAK,GAAqB,UAAU,GAAQ,CAAO;CACrD;CAGA,OAAO,GAAmE,IAAiC,CAAC,GAAS;EACnH,KAAK,GAAmB,KAAK,GAAiB,GAAQ,KAAK,GAAkB,CAAO,CAAC,GAAG,CAAO;CACjG;CAGA,YAAY,IAAiC,CAAC,GAAS;EACrD,IAAM,IAAS,KAAK,GAClB,KAAK,GAAyB,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,QAAO,MAAS,CAAC,EAAM,IAAI,CAAC,GACpF,KAAK,GAAmB,CAAO,CACjC;EACA,AAAI,KAAQ,KAAK,GAAmB,GAAQ,CAAO;CACrD;CAEA,GACE,GACA,GAC+B;EAC/B,IAAI,CAAC,KAAK,cAAc;EACxB,IAAM,IAAY,KAAK,aAAa,GAC9B,IAAgB,KAAK,GAAe,GACpC,IAAS,EAA6B,GAAa,GAAe,CAAS;EACjF,OAAO,IAAS,KAAK,GAAiB,GAAQ,GAAS,CAAS,IAAI,KAAA;CACtE;CAEA,GAAqB,GAAkD;EACrE,IAAM,IAAS,KAAK,GAAqC,GAAa,KAAK,GAAmB,CAAC,CAAC,CAAC;EAC5F,MACL,KAAK,GAAqB,OAAO,GAC7B,KAAK,GAAiB,CAAM,KAC9B,KAAK,GAA6B,sBAAsB;CAE5D;CAEA,GAAmB,GAA2B,GAAsC;EAClF,AAAI,EAAQ,WACN,EAAQ,aAAa,KAAA,IAAW,KAAK,UAAU,CAAM,IACpD,KAAK,UAAU,GAAQ,EAAE,UAAU,EAAQ,SAAS,CAAC,IAE1D,KAAK,GAAwB,CAAM;CAEvC;CAEA,GACE,GACA,GACA,IAAY,KAAK,aAAa,GACX;EACnB,OAAO,EAAa,GAAQ;GAC1B;GACA,YAAY,KAAK,GAAe;GAChC;GACA,UAAU;IAAE,QAAQ,KAAK;IAAc,OAAO,KAAK;GAAY;EACjE,CAAC;CACH;CAEA,GAAe,GAA4B,GAAkD;EAI3F,OAHI,MAAW,OAAa,KAAK,GAAmB,GAAG,CAAS,IAC5D,MAAW,QAAc,KAAK,GAAmB,IAAI,CAAS,IAC9D,MAAW,UAAgB,KAAK,GAA2B,KAAK,GAAY,CAAC,CAAC,IAC3E,KAAK,GACV,KAAK,GAAyB,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,QAAO,MAAS,CAAC,EAAM,IAAI,CAAC,GACpF,KAAK,GAAmB,CAAC,CAAC,CAC5B;CACF;CAEA,GAAmB,GAAmB,GAAyC;EAC7E,IAAM,IAAQ,MAAM,QAAQ,KAAK,SAAS,IAAI,KAAK,YAAY,GAEzD,IAAQ,EAAc,GAAW,GAAc;GADhC,GAAG,KAAK,GAAe;GAAG;EACM,CAAU;EAC/D,OAAO,KAAK,GAA2B,CAAK;CAC9C;CAEA,GAAyB,GAA2D;EAClF,QAAQ,aAA4C;GAClD,KAAK,IAAM,KAAS,GAAU,MAAM,EAAM,sBAAsB;EAClE,EAAA,CAAG;CACL;CAEA,GAAkB,GAAoD;EACpE,OAAO;GAAE,OAAO,EAAQ;GAAO,OAAO,EAAQ;EAAM;CACtD;CAEA,GAAmB,GAAoD;EACrE,OAAO;GAAE,OAAO,EAAQ,SAAS,KAAK;GAAW,OAAO,EAAQ;EAAM;CACxE;CACA,KAA+C;EAC7C,OAAO;GAAE,KAAK,KAAK;GAAW,KAAK,KAAK;EAAU;CACpD;CACA,GAA2B,GAAkC;EAC3D,OAAO,EAAuB,GAAO,KAAK,aAAa,GAAG;GAAE,QAAQ,KAAK;GAAc,OAAO,KAAK;EAAY,CAAC;CAClH;CAEA,KAA0B;EACxB,OAAO,KAAK,cAAc,sBAAsB,KAAK,QAAQ,SAAS;CACxE;CACA,GAAkB,GAAiB,GAAiB,IAAQ,KAAK,GAAe,GAAkB;EAChG,OAAO;GAAE,GAAG,IAAU,EAAM;GAAM,GAAG,IAAU,EAAM;EAAI;CAC3D;CAEA,GAAiB,GAAkC;EACjD,IAAM,IAAI,EAAS,EAAK,GAAG,KAAK,EAAE,GAC5B,IAAI,EAAS,EAAK,GAAG,KAAK,EAAE,GAC5B,IAAQ,KAAK,GAAY,EAAK,KAAK;EAGzC,OAFI,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAU,KAAK,KAAe,MACpE,KAAK,GAAuB;GAAE;GAAO;GAAG;EAAE,CAAC,GACpC;CACT;CAEA,GAAwB,GAA+B;EAErD,AADA,KAAK,GAAqB,OAAO,GACjC,KAAK,GAAyB,CAAI;CACpC;CAEA,GAAyB,GAA+B;EACjD,KAAK,GAAiB,CAAI,MAC3B,KAAK,eAAa,KAAK,GAAmB,QAAQ,GACtD,KAAK,GAA6B,sBAAsB;CAC1D;CAEA,GAAyB,GAA+B;EACpC,KAAK,GAAiB,CACnC,MACD,KAAK,eAAa,KAAK,GAAmB,QAAQ,GACtD,KAAK,GAA6B,sBAAsB;CAC1D;CAEA,GAA4B,GAAc,GAAW,GAA8B;EACjF,OAAO,KAAK,cACV,IAAI,YAAe,GAAM;GACvB,SAAS;GACT;GACA,UAAU;GACV;EACF,CAAC,CACH;CACF;CAEA,GAAuB,GAA+B;EACpD,IAAM,IAAY,KAAK,IACjB,IAAY,KAAK,IACjB,IAAgB,KAAK;EAM3B,AALA,KAAK,KAAK,EAAK,GACf,KAAK,KAAK,EAAK,GACf,KAAK,KAAS,EAAK,OACf,EAAK,MAAM,KAAW,KAAK,cAAc,KAAK,CAAS,GACvD,EAAK,MAAM,KAAW,KAAK,cAAc,KAAK,CAAS,GACvD,EAAK,UAAU,KAAe,KAAK,cAAc,SAAS,CAAa;CAC7E;CACA,GAAY,GAAuB;EACjC,IAAM,IAAS,OAAO,SAAS,CAAK,KAAK,IAAQ,IAAI,IAAQ,KAAK;EAClE,OAAO,KAAK,IAAI,KAAK,IAAW,KAAK,IAAI,KAAK,IAAW,CAAM,CAAC;CAClE;AACF;AAvfG,EAAA,CAAA,EAAM,iBAAiB,CAAA,GAAA,EAAA,WAAA,gBAAA,KAAA,CAAA,GAuCvB,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,KAAA,IAAA,GAUzB,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,KAAA,IAAA,GAUzB,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,SAAA,IAAA,GAUzB,EAAA,CAAA,EAAS;CAAE,WAAW;CAAa,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,IAAA,GAgBhE,EAAA,CAAA,EAAS;CAAE,WAAW;CAAa,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,IAAA,GAoBhE,EAAA,CAAA,EAAS;CAAE,WAAW;CAAc,MAAM;AAAM,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,GAGjD,EAAA,CAAA,EAAS;CAAE,WAAW;CAAgB,WAAW;CAAwB,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,IAAA,GAcxF,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,WAAW;CAAiB,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,gBAAA,KAAA,CAAA,GAarE,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,WAAA,KAAA,CAAA,GAEzC,EAAA,CAAA,EAAS;CAAE,WAAW;CAAa,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,IAAA,GAchE,EAAA,CAAA,EAAS;CAAE,WAAW;CAAkB,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,iBAAA,IAAA,GAnKvE,IAAA,EAAA,CAAA,EAAM,CAAA,GAAA,CAAA;AAqgBP,SAAS,EACP,GACA,GACA,GACQ;CACR,IAAM,IAAQ;EAAC,GAAG,EAAW;EAAO,EAAW;EAAK,EAAW;CAAG,CAAC,CAChE,QAAO,MAAS,OAAO,SAAS,CAAK,KAAK,IAAQ,CAAC,CAAC,CACpD,KAAI,MAAS,KAAK,IAAI,EAAW,KAAK,KAAK,IAAI,EAAW,KAAK,CAAK,CAAC,CAAC,CAAC,CACvE,MAAM,GAAO,MAAW,IAAQ,CAAM,CAAC,CACvC,QAAQ,GAAO,GAAO,MAAQ,MAAU,KAAK,MAAU,EAAI,IAAQ,EAAE;CACxE,IAAI,IAAY,GAAG,OAAO,EAAM,MAAK,MAAS,IAAQ,CAAO,KAAK,EAAW;CAC7E,KAAK,IAAI,IAAQ,EAAM,SAAS,GAAG,KAAS,GAAG,KAAY;EACzD,IAAM,IAAQ,EAAM;EACpB,IAAI,MAAU,KAAA,KAAa,IAAQ,GAAS,OAAO;CACrD;CACA,OAAO,EAAW;AACpB"}
@@ -19,7 +19,7 @@ var l = class extends r {
19
19
  static {
20
20
  this.metadata = {
21
21
  tag: "nve-week",
22
- version: "2.12.2"
22
+ version: "2.14.0"
23
23
  };
24
24
  }
25
25
  static {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nvidia-elements/core",
3
- "version": "2.12.2",
3
+ "version": "2.14.0",
4
4
  "release": {
5
5
  "extends": "../../release.config.js"
6
6
  },
@@ -975,7 +975,7 @@
975
975
  }
976
976
  },
977
977
  "dependencies": {
978
- "@nvidia-elements/forms": "^2.0.6",
978
+ "@nvidia-elements/forms": "^2.0.7",
979
979
  "lit": "^3.3.3",
980
980
  "lit-html": "^3.3.3"
981
981
  },
@@ -1011,6 +1011,7 @@
1011
1011
  "svgo": "4.1.0",
1012
1012
  "ts-lit-plugin": "2.0.2",
1013
1013
  "typescript": "6.0.3",
1014
+ "typescript-7": "npm:typescript@7.0.2",
1014
1015
  "vite": "8.2.2",
1015
1016
  "vitest": "5.0.0"
1016
1017
  },
@@ -1155,7 +1156,7 @@
1155
1156
  }
1156
1157
  },
1157
1158
  "test:types": {
1158
- "command": "tsc --project tsconfig.types.json",
1159
+ "command": "node ./node_modules/typescript-7/bin/tsc --project tsconfig.types.json",
1159
1160
  "files": [
1160
1161
  ".stub/vue.d.ts",
1161
1162
  "dist/custom-elements-jsx.d.ts",