@vonage/vivid 4.3.0 → 4.4.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 (44) hide show
  1. package/custom-elements.json +392 -41
  2. package/index.cjs +1 -0
  3. package/index.js +1 -1
  4. package/lib/dialog/dialog.d.ts +1 -0
  5. package/lib/empty-state/definition.d.ts +1 -0
  6. package/lib/empty-state/empty-state.d.ts +5 -0
  7. package/lib/enums.d.ts +4 -0
  8. package/lib/popup/popup.d.ts +5 -0
  9. package/lib/range-slider/range-slider.d.ts +2 -0
  10. package/lib/slider/slider.d.ts +5 -0
  11. package/lib/slider/slider.template.d.ts +2 -2
  12. package/package.json +1 -1
  13. package/shared/definition.cjs +1 -1
  14. package/shared/definition.js +1 -1
  15. package/shared/definition21.cjs +67 -30
  16. package/shared/definition21.js +67 -30
  17. package/shared/definition23.cjs +18 -3
  18. package/shared/definition23.js +19 -4
  19. package/shared/definition25.cjs +1 -1
  20. package/shared/definition25.js +1 -1
  21. package/shared/definition30.cjs +1 -1
  22. package/shared/definition30.js +1 -1
  23. package/shared/definition42.cjs +123 -18
  24. package/shared/definition42.js +123 -18
  25. package/shared/definition46.cjs +96 -11
  26. package/shared/definition46.js +97 -12
  27. package/shared/definition56.cjs +1 -1
  28. package/shared/definition56.js +1 -1
  29. package/shared/definition63.cjs +155 -2
  30. package/shared/definition63.js +156 -4
  31. package/shared/enums.cjs +6 -0
  32. package/shared/enums.js +6 -1
  33. package/shared/patterns/anchored.d.ts +4 -4
  34. package/shared/presentationDate.cjs +1 -1
  35. package/shared/presentationDate.js +1 -1
  36. package/shared/slider.template.cjs +27 -4
  37. package/shared/slider.template.js +27 -4
  38. package/styles/core/all.css +1 -1
  39. package/styles/core/theme.css +1 -1
  40. package/styles/core/typography.css +1 -1
  41. package/styles/tokens/theme-dark.css +4 -4
  42. package/styles/tokens/theme-light.css +4 -4
  43. package/styles/tokens/vivid-2-compat.css +1 -1
  44. package/vivid.api.json +211 -0
@@ -1,4 +1,5 @@
1
- import { F as FoundationElement, _ as __decorate, a as attr, o as observable, n as nullableNumberConverter, r as registerFactory } from './index.js';
1
+ import { F as FoundationElement, _ as __decorate, a as attr, o as observable, n as nullableNumberConverter, v as volatile, r as registerFactory } from './index.js';
2
+ import { p as popupRegistries } from './definition63.js';
2
3
  import './affix.js';
3
4
  import './index2.js';
4
5
  import { L as Localized } from './localized.js';
@@ -482,24 +483,70 @@ __decorate([
482
483
  attr
483
484
  ], Slider$1.prototype, "mode", void 0);
484
485
 
485
- const styles = ":host{display:inline-block}:host(:not([orientation=vertical])){inline-size:100%}:host([orientation=vertical]){block-size:100%;min-block-size:calc(var(--_thumb-interaction-indicator-size) * 5)}:host([disabled]){cursor:not-allowed}.control{--_thumb-size: 12px;--_thumb-interaction-indicator-size: 36px;--_track-start-inset-inline-start: 0;--_track-start-inset-block-start: 0;cursor:pointer;outline:none;user-select:none}.control.connotation-cta{--_connotation-color-primary: var(--vvd-slider-cta-primary, var(--vvd-color-cta-500))}.control:not(.connotation-cta){--_connotation-color-primary: var(--vvd-slider-accent-primary, var(--vvd-color-canvas-text))}.control{--_appearance-color-text: var(--_connotation-color-primary-text);--_appearance-color-fill: var(--_connotation-color-primary);--_appearance-color-outline: transparent}.control .positioning-region{position:relative}.control .track{position:absolute;border-radius:4px;background:var(--_track-background-color)}.control .track-start{position:absolute;border-radius:inherit;background:var(--_track-start-background-color);block-size:100%;inset-inline-start:var(--_track-start-inset-inline-start)}.control.horizontal{block-size:var(--_thumb-interaction-indicator-size);inline-size:calc(100% - var(--_thumb-size));margin-inline-start:calc(var(--_thumb-size) / 2);min-inline-size:var(--_thumb-size)}.control.horizontal .track{top:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);right:0;left:0;block-size:2px}:host([markers]) .control.horizontal .track-start{--_track-start-inset-inline-start: 1px;border-bottom-left-radius:0;border-top-left-radius:0}.control.horizontal .track .mark{position:absolute;block-size:6px;inline-size:100%;inset-block-start:-2px;inset-inline-start:0}.control.vertical{margin-top:calc(var(--_thumb-interaction-indicator-size) / 2);block-size:calc(100% - var(--_thumb-interaction-indicator-size));inline-size:var(--_thumb-interaction-indicator-size);min-block-size:var(--_thumb-interaction-indicator-size)}.control.vertical .positioning-region{block-size:100%}.control.vertical .track{left:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);block-size:100%;inline-size:2px}.control.vertical .track .mark{position:absolute;block-size:100%;inline-size:6px;inset-block-start:0;inset-inline-start:-2px}.control.vertical .track-start{block-size:auto;inline-size:100%;inset-block-start:var(--_track-start-inset-block-start)}:host([markers]) .control.vertical .track-start{--_track-start-inset-block-start: 1px;border-radius:0}.control.disabled{--_track-background-color: var(--vvd-color-neutral-100);--_track-start-background-color: var(--vvd-color-neutral-300);pointer-events:none}.control:not(.disabled){--_track-background-color: var(--vvd-color-neutral-300);--_track-start-background-color: var(--_appearance-color-fill)}.control:not(.disabled) .mark{color:var(--vvd-color-neutral-950)}.control.disabled .mark{color:var(--_track-start-background-color)}.thumb-container{position:absolute;border-radius:50%;block-size:var(--_thumb-interaction-indicator-size);cursor:inherit;inline-size:var(--_thumb-interaction-indicator-size);outline-color:transparent;touch-action:none}:focus-visible .thumb-container,.thumb-container:focus-visible{box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent;--_thumb-interaction-indicator-alpha: .05;border-radius:50%}.control.horizontal .thumb-container{transform:translate(calc(var(--_thumb-interaction-indicator-size) / 2))}.control.vertical .thumb-container{transform:translateY(calc(var(--_thumb-interaction-indicator-size) / 2))}.control:not(.disabled) .thumb-container:hover{--_thumb-interaction-indicator-alpha: .12}.control:not(.disabled) .thumb-container:active{--_thumb-interaction-indicator-alpha: .25}.thumb-container:before{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-interaction-indicator-size);content:\"\";inline-size:var(--_thumb-interaction-indicator-size);opacity:var(--_thumb-interaction-indicator-alpha, 0);transition:opacity .2s ease-out 0s}.thumb-container:after{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-size);content:\"\";inline-size:var(--_thumb-size);inset:calc((var(--_thumb-interaction-indicator-size) - var(--_thumb-size)) / 2)}";
486
+ const styles = ":host{display:inline-block}:host(:not([orientation=vertical])){inline-size:100%}:host([orientation=vertical]){block-size:100%;min-block-size:calc(var(--_thumb-interaction-indicator-size) * 5)}:host([disabled]){cursor:not-allowed}.control{--_thumb-size: 12px;--_thumb-interaction-indicator-size: 36px;--_track-start-inset-inline-start: 0;--_track-start-inset-block-start: 0;cursor:pointer;outline:none;user-select:none}.control.connotation-cta{--_connotation-color-primary: var(--vvd-slider-cta-primary, var(--vvd-color-cta-500))}.control:not(.connotation-cta){--_connotation-color-primary: var(--vvd-slider-accent-primary, var(--vvd-color-canvas-text))}.control{--_appearance-color-text: var(--_connotation-color-primary-text);--_appearance-color-fill: var(--_connotation-color-primary);--_appearance-color-outline: transparent}.control .positioning-region{position:relative}.control .track{position:absolute;border-radius:4px;background:var(--_track-background-color)}.control .track-start{position:absolute;border-radius:inherit;background:var(--_track-start-background-color);block-size:100%;inset-inline-start:var(--_track-start-inset-inline-start)}.control.horizontal{block-size:var(--_thumb-interaction-indicator-size);inline-size:calc(100% - var(--_thumb-size));margin-inline-start:calc(var(--_thumb-size) / 2);min-inline-size:var(--_thumb-size)}.control.horizontal .track{top:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);right:0;left:0;block-size:2px}:host([markers]) .control.horizontal .track-start{--_track-start-inset-inline-start: 1px;border-bottom-left-radius:0;border-top-left-radius:0}.control.horizontal .track .mark{position:absolute;block-size:6px;inline-size:100%;inset-block-start:-2px;inset-inline-start:0}.control.vertical{margin-top:calc(var(--_thumb-interaction-indicator-size) / 2);block-size:calc(100% - var(--_thumb-interaction-indicator-size));inline-size:var(--_thumb-interaction-indicator-size);min-block-size:var(--_thumb-interaction-indicator-size)}.control.vertical .positioning-region{block-size:100%}.control.vertical .track{left:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);block-size:100%;inline-size:2px}.control.vertical .track .mark{position:absolute;block-size:100%;inline-size:6px;inset-block-start:0;inset-inline-start:-2px}.control.vertical .track-start{block-size:auto;inline-size:100%;inset-block-start:var(--_track-start-inset-block-start)}:host([markers]) .control.vertical .track-start{--_track-start-inset-block-start: 1px;border-radius:0}.control.disabled{--_track-background-color: var(--vvd-color-neutral-100);--_track-start-background-color: var(--vvd-color-neutral-300);pointer-events:none}.control:not(.disabled){--_track-background-color: var(--vvd-color-neutral-300);--_track-start-background-color: var(--_appearance-color-fill)}.control:not(.disabled) .mark{color:var(--vvd-color-neutral-950)}.control.disabled .mark{color:var(--_track-start-background-color)}.thumb-container{position:absolute;border-radius:50%;block-size:var(--_thumb-interaction-indicator-size);cursor:inherit;inline-size:var(--_thumb-interaction-indicator-size);outline:none;touch-action:none}.thumb-container.focus-visible{box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent;--_thumb-interaction-indicator-alpha: .05;border-radius:50%}.control.horizontal .thumb-container{transform:translate(calc(var(--_thumb-interaction-indicator-size) / 2))}.control.vertical .thumb-container{transform:translateY(calc(var(--_thumb-interaction-indicator-size) / 2))}.control:not(.disabled) .thumb-container:hover{--_thumb-interaction-indicator-alpha: .12}.control:not(.disabled) .thumb-container:active{--_thumb-interaction-indicator-alpha: .25}.thumb-container:before{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-interaction-indicator-size);content:\"\";inline-size:var(--_thumb-interaction-indicator-size);opacity:var(--_thumb-interaction-indicator-alpha, 0);transition:opacity .2s ease-out 0s}.thumb-container:after{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-size);content:\"\";inline-size:var(--_thumb-size);inset:calc((var(--_thumb-interaction-indicator-size) - var(--_thumb-size)) / 2)}.popup{pointer-events:none}.tooltip{width:auto;padding:8px 12px;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base-bold)}";
486
487
 
487
488
  var __defProp = Object.defineProperty;
489
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
488
490
  var __decorateClass = (decorators, target, key, kind) => {
489
- var result = void 0 ;
491
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
490
492
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
491
493
  if (decorator = decorators[i])
492
- result = (decorator(target, key, result) ) || result;
493
- if (result) __defProp(target, key, result);
494
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
495
+ if (kind && result) __defProp(target, key, result);
494
496
  return result;
495
497
  };
496
498
  class Slider extends Slider$1 {
497
499
  constructor() {
498
- super(...arguments);
500
+ super();
499
501
  this.ariaLabel = null;
500
502
  this.ariaValuetext = null;
501
503
  this.markers = false;
504
+ this.pin = false;
502
505
  this.valueTextFormatter = (value) => parseFloat(value).toLocaleString(this.locale.lang);
506
+ this._focusVisible = false;
507
+ this._hoveringOnThumb = false;
508
+ this.#isNonVisibleFocus = false;
509
+ /**
510
+ * @internal
511
+ */
512
+ this._onFocusIn = () => {
513
+ if (!this.#isNonVisibleFocus) {
514
+ this._focusVisible = true;
515
+ }
516
+ };
517
+ /**
518
+ * @internal
519
+ */
520
+ this._onFocusOut = () => {
521
+ this._focusVisible = false;
522
+ };
523
+ this.#onMouseOver = () => {
524
+ this._hoveringOnThumb = true;
525
+ };
526
+ this.#onMouseOut = () => {
527
+ this._hoveringOnThumb = false;
528
+ };
529
+ const fastSliderInternals = this;
530
+ const originalHandleMouseDown = fastSliderInternals.handleMouseDown;
531
+ fastSliderInternals.handleMouseDown = (e) => {
532
+ this.#isNonVisibleFocus = true;
533
+ originalHandleMouseDown(e);
534
+ this.#isNonVisibleFocus = false;
535
+ if (e && !this.disabled && !this.readOnly) {
536
+ this.isDragging = true;
537
+ }
538
+ };
539
+ const originalHandleThumbMouseDown = fastSliderInternals.handleThumbMouseDown;
540
+ fastSliderInternals.handleThumbMouseDown = (e) => {
541
+ this.#isNonVisibleFocus = true;
542
+ originalHandleThumbMouseDown(e);
543
+ this.#isNonVisibleFocus = false;
544
+ };
545
+ const originalKeypressHandler = fastSliderInternals.keypressHandler;
546
+ fastSliderInternals.keypressHandler = (e) => {
547
+ this._focusVisible = true;
548
+ originalKeypressHandler(e);
549
+ };
503
550
  }
504
551
  /**
505
552
  * TO BE REMOVED WHEN UPGRADING TO FAST-FOUNDATION 3
@@ -521,24 +568,62 @@ class Slider extends Slider$1 {
521
568
  super.valueChanged(previous, value);
522
569
  }
523
570
  }
571
+ get _isThumbPopupOpen() {
572
+ return this._focusVisible || this._hoveringOnThumb || this.isDragging;
573
+ }
574
+ #isNonVisibleFocus;
575
+ connectedCallback() {
576
+ super.connectedCallback();
577
+ this.#registerThumbListeners();
578
+ }
579
+ disconnectedCallback() {
580
+ super.disconnectedCallback();
581
+ this.#unregisterThumbListeners();
582
+ }
583
+ #registerThumbListeners() {
584
+ this.thumb.addEventListener("mouseover", this.#onMouseOver, {
585
+ passive: true
586
+ });
587
+ this.thumb.addEventListener("mouseout", this.#onMouseOut, {
588
+ passive: true
589
+ });
590
+ }
591
+ #unregisterThumbListeners() {
592
+ this.thumb.removeEventListener("mouseover", this.#onMouseOver);
593
+ this.thumb.removeEventListener("mouseout", this.#onMouseOut);
594
+ }
595
+ #onMouseOver;
596
+ #onMouseOut;
524
597
  }
525
598
  __decorateClass([
526
599
  attr({ attribute: "aria-label" })
527
- ], Slider.prototype, "ariaLabel");
600
+ ], Slider.prototype, "ariaLabel", 2);
528
601
  __decorateClass([
529
602
  attr({ attribute: "aria-valuetext" })
530
- ], Slider.prototype, "ariaValuetext");
603
+ ], Slider.prototype, "ariaValuetext", 2);
531
604
  __decorateClass([
532
605
  attr({
533
606
  mode: "boolean"
534
607
  })
535
- ], Slider.prototype, "markers");
608
+ ], Slider.prototype, "markers", 2);
609
+ __decorateClass([
610
+ attr({ mode: "boolean" })
611
+ ], Slider.prototype, "pin", 2);
536
612
  __decorateClass([
537
613
  attr
538
- ], Slider.prototype, "connotation");
614
+ ], Slider.prototype, "connotation", 2);
539
615
  __decorateClass([
540
616
  observable
541
- ], Slider.prototype, "valueTextFormatter");
617
+ ], Slider.prototype, "valueTextFormatter", 2);
618
+ __decorateClass([
619
+ observable
620
+ ], Slider.prototype, "_focusVisible", 2);
621
+ __decorateClass([
622
+ observable
623
+ ], Slider.prototype, "_hoveringOnThumb", 2);
624
+ __decorateClass([
625
+ volatile
626
+ ], Slider.prototype, "_isThumbPopupOpen", 1);
542
627
  applyMixins(Slider, Localized);
543
628
 
544
629
  const sliderDefinition = Slider.compose({
@@ -549,7 +634,7 @@ const sliderDefinition = Slider.compose({
549
634
  delegatesFocus: true
550
635
  }
551
636
  });
552
- const sliderRegistries = [sliderDefinition()];
637
+ const sliderRegistries = [...popupRegistries, sliderDefinition()];
553
638
  const registerSlider = registerFactory(sliderRegistries);
554
639
 
555
640
  export { Slider as S, sliderRegistries as a, registerSlider as r, sliderDefinition as s };
@@ -16,7 +16,7 @@ const when = require('./when.cjs');
16
16
  const repeat = require('./repeat.cjs');
17
17
  const classNames = require('./class-names.cjs');
18
18
 
19
- const styles = ":host{display:inline-block}.base,.control{inline-size:100%}.dialog{display:inline-flex;flex-direction:column}.dialog .footer{display:flex;align-items:center;justify-content:flex-end;padding:8px;border-top:1px solid var(--vvd-color-neutral-200);gap:8px}.time-pickers{display:flex;overflow:hidden;padding:4px;block-size:188px;gap:4px}.time-pickers .picker{position:relative;display:flex;overflow:hidden;flex-direction:column;padding:0;border-radius:4px;margin:0;gap:4px;inline-size:50px;list-style:none;scrollbar-width:thin}.time-pickers .picker:hover{overflow-y:auto}.time-pickers .picker:after{display:block;flex-shrink:0;block-size:156px;content:\"\"}.time-pickers .picker:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: -2px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.time-pickers .item{display:flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:4px;background-color:var(--_appearance-color-fill);block-size:28px;color:var(--_appearance-color-text);cursor:pointer;font:var(--vvd-typography-base);inline-size:50px}.time-pickers .item{--_connotation-color-primary: var(--vvd-time-picker-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-firm: var(--vvd-time-picker-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-time-picker-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-time-picker-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-dim: var(--vvd-time-picker-accent-dim, var(--vvd-color-neutral-200));--_connotation-color-pale: var(--vvd-time-picker-accent-pale, var(--vvd-color-neutral-300))}.time-pickers .item{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.time-pickers .item:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.time-pickers .item:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: var(--vvd-color-neutral-200);--_appearance-color-outline: transparent}";
19
+ const styles = ":host{display:inline-block}.base,.control{inline-size:100%}.dialog{display:inline-flex;flex-direction:column}.dialog .footer{display:flex;align-items:center;justify-content:flex-end;padding:8px;border-top:1px solid var(--vvd-color-neutral-200);gap:8px}.time-pickers{display:flex;overflow:hidden;justify-content:center;padding:4px;block-size:188px;gap:4px}.time-pickers .picker{position:relative;display:flex;overflow:hidden;flex-direction:column;padding:0;border-radius:4px;margin:0;gap:4px;inline-size:50px;list-style:none;scrollbar-width:thin}.time-pickers .picker:hover{overflow-y:auto}.time-pickers .picker:after{display:block;flex-shrink:0;block-size:156px;content:\"\"}.time-pickers .picker:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: -2px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.time-pickers .item{display:flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:4px;background-color:var(--_appearance-color-fill);block-size:28px;color:var(--_appearance-color-text);cursor:pointer;font:var(--vvd-typography-base);inline-size:50px}.time-pickers .item{--_connotation-color-primary: var(--vvd-time-picker-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-firm: var(--vvd-time-picker-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-time-picker-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-time-picker-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-dim: var(--vvd-time-picker-accent-dim, var(--vvd-color-neutral-200));--_connotation-color-pale: var(--vvd-time-picker-accent-pale, var(--vvd-color-neutral-300))}.time-pickers .item{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.time-pickers .item:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.time-pickers .item:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: var(--vvd-color-neutral-200);--_appearance-color-outline: transparent}";
20
20
 
21
21
  class _TimePicker extends index.FoundationElement {
22
22
  }
@@ -14,7 +14,7 @@ import { w as when } from './when.js';
14
14
  import { r as repeat } from './repeat.js';
15
15
  import { c as classNames } from './class-names.js';
16
16
 
17
- const styles = ":host{display:inline-block}.base,.control{inline-size:100%}.dialog{display:inline-flex;flex-direction:column}.dialog .footer{display:flex;align-items:center;justify-content:flex-end;padding:8px;border-top:1px solid var(--vvd-color-neutral-200);gap:8px}.time-pickers{display:flex;overflow:hidden;padding:4px;block-size:188px;gap:4px}.time-pickers .picker{position:relative;display:flex;overflow:hidden;flex-direction:column;padding:0;border-radius:4px;margin:0;gap:4px;inline-size:50px;list-style:none;scrollbar-width:thin}.time-pickers .picker:hover{overflow-y:auto}.time-pickers .picker:after{display:block;flex-shrink:0;block-size:156px;content:\"\"}.time-pickers .picker:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: -2px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.time-pickers .item{display:flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:4px;background-color:var(--_appearance-color-fill);block-size:28px;color:var(--_appearance-color-text);cursor:pointer;font:var(--vvd-typography-base);inline-size:50px}.time-pickers .item{--_connotation-color-primary: var(--vvd-time-picker-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-firm: var(--vvd-time-picker-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-time-picker-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-time-picker-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-dim: var(--vvd-time-picker-accent-dim, var(--vvd-color-neutral-200));--_connotation-color-pale: var(--vvd-time-picker-accent-pale, var(--vvd-color-neutral-300))}.time-pickers .item{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.time-pickers .item:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.time-pickers .item:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: var(--vvd-color-neutral-200);--_appearance-color-outline: transparent}";
17
+ const styles = ":host{display:inline-block}.base,.control{inline-size:100%}.dialog{display:inline-flex;flex-direction:column}.dialog .footer{display:flex;align-items:center;justify-content:flex-end;padding:8px;border-top:1px solid var(--vvd-color-neutral-200);gap:8px}.time-pickers{display:flex;overflow:hidden;justify-content:center;padding:4px;block-size:188px;gap:4px}.time-pickers .picker{position:relative;display:flex;overflow:hidden;flex-direction:column;padding:0;border-radius:4px;margin:0;gap:4px;inline-size:50px;list-style:none;scrollbar-width:thin}.time-pickers .picker:hover{overflow-y:auto}.time-pickers .picker:after{display:block;flex-shrink:0;block-size:156px;content:\"\"}.time-pickers .picker:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: -2px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.time-pickers .item{display:flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:4px;background-color:var(--_appearance-color-fill);block-size:28px;color:var(--_appearance-color-text);cursor:pointer;font:var(--vvd-typography-base);inline-size:50px}.time-pickers .item{--_connotation-color-primary: var(--vvd-time-picker-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-firm: var(--vvd-time-picker-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-time-picker-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-time-picker-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-dim: var(--vvd-time-picker-accent-dim, var(--vvd-color-neutral-200));--_connotation-color-pale: var(--vvd-time-picker-accent-pale, var(--vvd-color-neutral-300))}.time-pickers .item{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.time-pickers .item:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.time-pickers .item:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: var(--vvd-color-neutral-200);--_appearance-color-outline: transparent}";
18
18
 
19
19
  class _TimePicker extends FoundationElement {
20
20
  }
@@ -8,6 +8,8 @@ const when = require('./when.cjs');
8
8
  const classNames = require('./class-names.cjs');
9
9
 
10
10
  const sides = ['top', 'right', 'bottom', 'left'];
11
+ const alignments = ['start', 'end'];
12
+ const placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + "-" + alignments[0], side + "-" + alignments[1]), []);
11
13
  const min = Math.min;
12
14
  const max = Math.max;
13
15
  const round = Math.round;
@@ -421,6 +423,109 @@ const arrow = options => ({
421
423
  }
422
424
  });
423
425
 
426
+ function getPlacementList(alignment, autoAlignment, allowedPlacements) {
427
+ const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);
428
+ return allowedPlacementsSortedByAlignment.filter(placement => {
429
+ if (alignment) {
430
+ return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);
431
+ }
432
+ return true;
433
+ });
434
+ }
435
+ /**
436
+ * Optimizes the visibility of the floating element by choosing the placement
437
+ * that has the most space available automatically, without needing to specify a
438
+ * preferred placement. Alternative to `flip`.
439
+ * @see https://floating-ui.com/docs/autoPlacement
440
+ */
441
+ const autoPlacement = function (options) {
442
+ if (options === void 0) {
443
+ options = {};
444
+ }
445
+ return {
446
+ name: 'autoPlacement',
447
+ options,
448
+ async fn(state) {
449
+ var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;
450
+ const {
451
+ rects,
452
+ middlewareData,
453
+ placement,
454
+ platform,
455
+ elements
456
+ } = state;
457
+ const {
458
+ crossAxis = false,
459
+ alignment,
460
+ allowedPlacements = placements,
461
+ autoAlignment = true,
462
+ ...detectOverflowOptions
463
+ } = evaluate(options, state);
464
+ const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;
465
+ const overflow = await detectOverflow(state, detectOverflowOptions);
466
+ const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;
467
+ const currentPlacement = placements$1[currentIndex];
468
+ if (currentPlacement == null) {
469
+ return {};
470
+ }
471
+ const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));
472
+
473
+ // Make `computeCoords` start from the right place.
474
+ if (placement !== currentPlacement) {
475
+ return {
476
+ reset: {
477
+ placement: placements$1[0]
478
+ }
479
+ };
480
+ }
481
+ const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];
482
+ const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {
483
+ placement: currentPlacement,
484
+ overflows: currentOverflows
485
+ }];
486
+ const nextPlacement = placements$1[currentIndex + 1];
487
+
488
+ // There are more placements to check.
489
+ if (nextPlacement) {
490
+ return {
491
+ data: {
492
+ index: currentIndex + 1,
493
+ overflows: allOverflows
494
+ },
495
+ reset: {
496
+ placement: nextPlacement
497
+ }
498
+ };
499
+ }
500
+ const placementsSortedByMostSpace = allOverflows.map(d => {
501
+ const alignment = getAlignment(d.placement);
502
+ return [d.placement, alignment && crossAxis ?
503
+ // Check along the mainAxis and main crossAxis side.
504
+ d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :
505
+ // Check only the mainAxis.
506
+ d.overflows[0], d.overflows];
507
+ }).sort((a, b) => a[1] - b[1]);
508
+ const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,
509
+ // Aligned placements should not check their opposite crossAxis
510
+ // side.
511
+ getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));
512
+ const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];
513
+ if (resetPlacement !== placement) {
514
+ return {
515
+ data: {
516
+ index: currentIndex + 1,
517
+ overflows: allOverflows
518
+ },
519
+ reset: {
520
+ placement: resetPlacement
521
+ }
522
+ };
523
+ }
524
+ return {};
525
+ }
526
+ };
527
+ };
528
+
424
529
  /**
425
530
  * Optimizes the visibility of the floating element by flipping the `placement`
426
531
  * in order to keep it in view when the preferred placement(s) will overflow the
@@ -1628,6 +1733,34 @@ var __decorateClass = (decorators, target, key, kind) => {
1628
1733
  if (result) __defProp(target, key, result);
1629
1734
  return result;
1630
1735
  };
1736
+ const PlacementStrategy = {
1737
+ Flip: "flip",
1738
+ AutoPlacementHorizontal: "auto-placement-horizontal",
1739
+ AutoPlacementVertical: "auto-placement-vertical"
1740
+ };
1741
+ const placementStrategyMiddlewares = {
1742
+ [PlacementStrategy.Flip]: flip(),
1743
+ [PlacementStrategy.AutoPlacementHorizontal]: autoPlacement({
1744
+ allowedPlacements: [
1745
+ "bottom",
1746
+ "top",
1747
+ "bottom-start",
1748
+ "bottom-end",
1749
+ "top-start",
1750
+ "top-end"
1751
+ ]
1752
+ }),
1753
+ [PlacementStrategy.AutoPlacementVertical]: autoPlacement({
1754
+ allowedPlacements: [
1755
+ "left",
1756
+ "right",
1757
+ "left-start",
1758
+ "left-end",
1759
+ "right-start",
1760
+ "right-end"
1761
+ ]
1762
+ })
1763
+ };
1631
1764
  class Popup extends index.FoundationElement {
1632
1765
  constructor() {
1633
1766
  super(...arguments);
@@ -1635,12 +1768,19 @@ class Popup extends index.FoundationElement {
1635
1768
  this.dismissible = false;
1636
1769
  this.arrow = false;
1637
1770
  this.alternate = false;
1771
+ /**
1772
+ * The placement strategy of the popup.
1773
+ *
1774
+ * @public
1775
+ */
1776
+ this.placementStrategy = PlacementStrategy.Flip;
1777
+ this.animationFrame = false;
1638
1778
  this.strategy = "fixed";
1639
1779
  }
1640
1780
  get #middleware() {
1641
1781
  let middleware = [
1642
1782
  inline(),
1643
- flip(),
1783
+ placementStrategyMiddlewares[this.placementStrategy],
1644
1784
  hide(),
1645
1785
  size({
1646
1786
  apply({ availableWidth, availableHeight, elements }) {
@@ -1663,6 +1803,12 @@ class Popup extends index.FoundationElement {
1663
1803
  #cleanup;
1664
1804
  openChanged(_, newValue) {
1665
1805
  newValue ? this.$emit("vwc-popup:open") : this.$emit("vwc-popup:close");
1806
+ index.DOM.queueUpdate(() => this.#updateAutoUpdate());
1807
+ }
1808
+ /**
1809
+ * @internal
1810
+ */
1811
+ animationFrameChanged() {
1666
1812
  this.#updateAutoUpdate();
1667
1813
  }
1668
1814
  /**
@@ -1685,7 +1831,10 @@ class Popup extends index.FoundationElement {
1685
1831
  this.#cleanup = autoUpdate(
1686
1832
  this.anchorEl,
1687
1833
  this.popupEl,
1688
- () => this.updatePosition()
1834
+ () => this.updatePosition(),
1835
+ {
1836
+ animationFrame: this.animationFrame
1837
+ }
1689
1838
  );
1690
1839
  }
1691
1840
  }
@@ -1764,6 +1913,9 @@ __decorateClass([
1764
1913
  __decorateClass([
1765
1914
  index.attr({ mode: "fromView" })
1766
1915
  ], Popup.prototype, "placement");
1916
+ __decorateClass([
1917
+ index.attr({ mode: "boolean", attribute: "animation-frame" })
1918
+ ], Popup.prototype, "animationFrame");
1767
1919
  __decorateClass([
1768
1920
  index.attr({ mode: "fromView" })
1769
1921
  ], Popup.prototype, "strategy");
@@ -1818,6 +1970,7 @@ const popupRegistries = [
1818
1970
  ];
1819
1971
  const registerPopup = index.registerFactory(popupRegistries);
1820
1972
 
1973
+ exports.PlacementStrategy = PlacementStrategy;
1821
1974
  exports.Popup = Popup;
1822
1975
  exports.popupRegistries = popupRegistries;
1823
1976
  exports.registerPopup = registerPopup;
@@ -1,4 +1,4 @@
1
- import { a as attr, F as FoundationElement, o as observable, h as html, r as registerFactory } from './index.js';
1
+ import { a as attr, F as FoundationElement, D as DOM, o as observable, h as html, r as registerFactory } from './index.js';
2
2
  import { B as Button, a as buttonRegistries } from './definition11.js';
3
3
  import { E as Elevation, e as elevationRegistries } from './definition62.js';
4
4
  import { r as ref } from './ref.js';
@@ -6,6 +6,8 @@ import { w as when } from './when.js';
6
6
  import { c as classNames } from './class-names.js';
7
7
 
8
8
  const sides = ['top', 'right', 'bottom', 'left'];
9
+ const alignments = ['start', 'end'];
10
+ const placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + "-" + alignments[0], side + "-" + alignments[1]), []);
9
11
  const min = Math.min;
10
12
  const max = Math.max;
11
13
  const round = Math.round;
@@ -419,6 +421,109 @@ const arrow = options => ({
419
421
  }
420
422
  });
421
423
 
424
+ function getPlacementList(alignment, autoAlignment, allowedPlacements) {
425
+ const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);
426
+ return allowedPlacementsSortedByAlignment.filter(placement => {
427
+ if (alignment) {
428
+ return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);
429
+ }
430
+ return true;
431
+ });
432
+ }
433
+ /**
434
+ * Optimizes the visibility of the floating element by choosing the placement
435
+ * that has the most space available automatically, without needing to specify a
436
+ * preferred placement. Alternative to `flip`.
437
+ * @see https://floating-ui.com/docs/autoPlacement
438
+ */
439
+ const autoPlacement = function (options) {
440
+ if (options === void 0) {
441
+ options = {};
442
+ }
443
+ return {
444
+ name: 'autoPlacement',
445
+ options,
446
+ async fn(state) {
447
+ var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;
448
+ const {
449
+ rects,
450
+ middlewareData,
451
+ placement,
452
+ platform,
453
+ elements
454
+ } = state;
455
+ const {
456
+ crossAxis = false,
457
+ alignment,
458
+ allowedPlacements = placements,
459
+ autoAlignment = true,
460
+ ...detectOverflowOptions
461
+ } = evaluate(options, state);
462
+ const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;
463
+ const overflow = await detectOverflow(state, detectOverflowOptions);
464
+ const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;
465
+ const currentPlacement = placements$1[currentIndex];
466
+ if (currentPlacement == null) {
467
+ return {};
468
+ }
469
+ const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));
470
+
471
+ // Make `computeCoords` start from the right place.
472
+ if (placement !== currentPlacement) {
473
+ return {
474
+ reset: {
475
+ placement: placements$1[0]
476
+ }
477
+ };
478
+ }
479
+ const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];
480
+ const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {
481
+ placement: currentPlacement,
482
+ overflows: currentOverflows
483
+ }];
484
+ const nextPlacement = placements$1[currentIndex + 1];
485
+
486
+ // There are more placements to check.
487
+ if (nextPlacement) {
488
+ return {
489
+ data: {
490
+ index: currentIndex + 1,
491
+ overflows: allOverflows
492
+ },
493
+ reset: {
494
+ placement: nextPlacement
495
+ }
496
+ };
497
+ }
498
+ const placementsSortedByMostSpace = allOverflows.map(d => {
499
+ const alignment = getAlignment(d.placement);
500
+ return [d.placement, alignment && crossAxis ?
501
+ // Check along the mainAxis and main crossAxis side.
502
+ d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :
503
+ // Check only the mainAxis.
504
+ d.overflows[0], d.overflows];
505
+ }).sort((a, b) => a[1] - b[1]);
506
+ const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,
507
+ // Aligned placements should not check their opposite crossAxis
508
+ // side.
509
+ getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));
510
+ const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];
511
+ if (resetPlacement !== placement) {
512
+ return {
513
+ data: {
514
+ index: currentIndex + 1,
515
+ overflows: allOverflows
516
+ },
517
+ reset: {
518
+ placement: resetPlacement
519
+ }
520
+ };
521
+ }
522
+ return {};
523
+ }
524
+ };
525
+ };
526
+
422
527
  /**
423
528
  * Optimizes the visibility of the floating element by flipping the `placement`
424
529
  * in order to keep it in view when the preferred placement(s) will overflow the
@@ -1626,6 +1731,34 @@ var __decorateClass = (decorators, target, key, kind) => {
1626
1731
  if (result) __defProp(target, key, result);
1627
1732
  return result;
1628
1733
  };
1734
+ const PlacementStrategy = {
1735
+ Flip: "flip",
1736
+ AutoPlacementHorizontal: "auto-placement-horizontal",
1737
+ AutoPlacementVertical: "auto-placement-vertical"
1738
+ };
1739
+ const placementStrategyMiddlewares = {
1740
+ [PlacementStrategy.Flip]: flip(),
1741
+ [PlacementStrategy.AutoPlacementHorizontal]: autoPlacement({
1742
+ allowedPlacements: [
1743
+ "bottom",
1744
+ "top",
1745
+ "bottom-start",
1746
+ "bottom-end",
1747
+ "top-start",
1748
+ "top-end"
1749
+ ]
1750
+ }),
1751
+ [PlacementStrategy.AutoPlacementVertical]: autoPlacement({
1752
+ allowedPlacements: [
1753
+ "left",
1754
+ "right",
1755
+ "left-start",
1756
+ "left-end",
1757
+ "right-start",
1758
+ "right-end"
1759
+ ]
1760
+ })
1761
+ };
1629
1762
  class Popup extends FoundationElement {
1630
1763
  constructor() {
1631
1764
  super(...arguments);
@@ -1633,12 +1766,19 @@ class Popup extends FoundationElement {
1633
1766
  this.dismissible = false;
1634
1767
  this.arrow = false;
1635
1768
  this.alternate = false;
1769
+ /**
1770
+ * The placement strategy of the popup.
1771
+ *
1772
+ * @public
1773
+ */
1774
+ this.placementStrategy = PlacementStrategy.Flip;
1775
+ this.animationFrame = false;
1636
1776
  this.strategy = "fixed";
1637
1777
  }
1638
1778
  get #middleware() {
1639
1779
  let middleware = [
1640
1780
  inline(),
1641
- flip(),
1781
+ placementStrategyMiddlewares[this.placementStrategy],
1642
1782
  hide(),
1643
1783
  size({
1644
1784
  apply({ availableWidth, availableHeight, elements }) {
@@ -1661,6 +1801,12 @@ class Popup extends FoundationElement {
1661
1801
  #cleanup;
1662
1802
  openChanged(_, newValue) {
1663
1803
  newValue ? this.$emit("vwc-popup:open") : this.$emit("vwc-popup:close");
1804
+ DOM.queueUpdate(() => this.#updateAutoUpdate());
1805
+ }
1806
+ /**
1807
+ * @internal
1808
+ */
1809
+ animationFrameChanged() {
1664
1810
  this.#updateAutoUpdate();
1665
1811
  }
1666
1812
  /**
@@ -1683,7 +1829,10 @@ class Popup extends FoundationElement {
1683
1829
  this.#cleanup = autoUpdate(
1684
1830
  this.anchorEl,
1685
1831
  this.popupEl,
1686
- () => this.updatePosition()
1832
+ () => this.updatePosition(),
1833
+ {
1834
+ animationFrame: this.animationFrame
1835
+ }
1687
1836
  );
1688
1837
  }
1689
1838
  }
@@ -1762,6 +1911,9 @@ __decorateClass([
1762
1911
  __decorateClass([
1763
1912
  attr({ mode: "fromView" })
1764
1913
  ], Popup.prototype, "placement");
1914
+ __decorateClass([
1915
+ attr({ mode: "boolean", attribute: "animation-frame" })
1916
+ ], Popup.prototype, "animationFrame");
1765
1917
  __decorateClass([
1766
1918
  attr({ mode: "fromView" })
1767
1919
  ], Popup.prototype, "strategy");
@@ -1816,4 +1968,4 @@ const popupRegistries = [
1816
1968
  ];
1817
1969
  const registerPopup = registerFactory(popupRegistries);
1818
1970
 
1819
- export { Popup as P, popupRegistries as p, registerPopup as r };
1971
+ export { Popup as P, PlacementStrategy as a, popupRegistries as p, registerPopup as r };
package/shared/enums.cjs CHANGED
@@ -34,6 +34,11 @@ var Appearance = /* @__PURE__ */ ((Appearance2) => {
34
34
  Appearance2["Elevated"] = "elevated";
35
35
  return Appearance2;
36
36
  })(Appearance || {});
37
+ var IconDecoration = /* @__PURE__ */ ((IconDecoration2) => {
38
+ IconDecoration2["Filled"] = "filled";
39
+ IconDecoration2["Outlined"] = "outlined";
40
+ return IconDecoration2;
41
+ })(IconDecoration || {});
37
42
  var Size = /* @__PURE__ */ ((Size2) => {
38
43
  Size2["UltraCondensed"] = "ultra-condensed";
39
44
  Size2["SuperCondensed"] = "super-condensed";
@@ -89,6 +94,7 @@ exports.Appearance = Appearance;
89
94
  exports.AriaLive = AriaLive;
90
95
  exports.Connotation = Connotation;
91
96
  exports.ConnotationDecorative = ConnotationDecorative;
97
+ exports.IconDecoration = IconDecoration;
92
98
  exports.LayoutSize = LayoutSize;
93
99
  exports.MediaSkipBy = MediaSkipBy;
94
100
  exports.Position = Position;