@haiilo/catalyst 14.5.1 → 14.5.2

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 (52) hide show
  1. package/dist/catalyst/catalyst.esm.js +1 -1
  2. package/dist/catalyst/p-0fec1fc5.entry.js +10 -0
  3. package/dist/catalyst/p-0fec1fc5.entry.js.map +1 -0
  4. package/dist/cjs/cat-alert_32.cjs.entry.js +109 -80
  5. package/dist/cjs/catalyst.cjs.js +1 -1
  6. package/dist/cjs/loader.cjs.js +1 -1
  7. package/dist/collection/collection-manifest.json +1 -1
  8. package/dist/collection/components/cat-alert/cat-alert.js +1 -1
  9. package/dist/collection/components/cat-badge/cat-badge.js +1 -1
  10. package/dist/collection/components/cat-button-group/cat-button-group.js +1 -1
  11. package/dist/collection/components/cat-card/cat-card.js +1 -1
  12. package/dist/collection/components/cat-checkbox/cat-checkbox.js +2 -2
  13. package/dist/collection/components/cat-date/cat-date.js +2 -2
  14. package/dist/collection/components/cat-date-inline/cat-date-inline.js +4 -4
  15. package/dist/collection/components/cat-datepicker/cat-datepicker.js +3 -3
  16. package/dist/collection/components/cat-datepicker-inline/cat-datepicker-inline.js +2 -2
  17. package/dist/collection/components/cat-dropdown/cat-dropdown.js +29 -26
  18. package/dist/collection/components/cat-dropdown/cat-dropdown.js.map +1 -1
  19. package/dist/collection/components/cat-form-group/cat-form-group.js +1 -1
  20. package/dist/collection/components/cat-icon/cat-icon.js +1 -1
  21. package/dist/collection/components/cat-menu/cat-menu.js +5 -4
  22. package/dist/collection/components/cat-menu/cat-menu.js.map +1 -1
  23. package/dist/collection/components/cat-menu-item/cat-menu-item.js +37 -4
  24. package/dist/collection/components/cat-menu-item/cat-menu-item.js.map +1 -1
  25. package/dist/components/cat-alert.js +1 -1
  26. package/dist/components/cat-badge.js +1 -1
  27. package/dist/components/cat-button-group.js +1 -1
  28. package/dist/components/cat-card.js +1 -1
  29. package/dist/components/cat-checkbox2.js +2 -2
  30. package/dist/components/cat-date-inline2.js +4 -4
  31. package/dist/components/cat-date.js +2 -2
  32. package/dist/components/cat-datepicker-inline.js +2 -2
  33. package/dist/components/cat-datepicker.js +3 -3
  34. package/dist/components/cat-dropdown2.js +30 -9
  35. package/dist/components/cat-dropdown2.js.map +1 -1
  36. package/dist/components/cat-form-group.js +1 -1
  37. package/dist/components/cat-icon2.js +1 -1
  38. package/dist/components/cat-menu-item2.js +10 -5
  39. package/dist/components/cat-menu-item2.js.map +1 -1
  40. package/dist/components/cat-menu2.js +5 -5
  41. package/dist/components/cat-menu2.js.map +1 -1
  42. package/dist/components/floating-ui.dom.js +49 -45
  43. package/dist/components/floating-ui.dom.js.map +1 -1
  44. package/dist/esm/cat-alert_32.entry.js +109 -80
  45. package/dist/esm/catalyst.js +1 -1
  46. package/dist/esm/loader.js +1 -1
  47. package/dist/types/components/cat-dropdown/cat-dropdown.d.ts +10 -3
  48. package/dist/types/components/cat-menu-item/cat-menu-item.d.ts +3 -1
  49. package/dist/types/components.d.ts +8 -0
  50. package/package.json +2 -4
  51. package/dist/catalyst/p-c04eb2d3.entry.js +0 -10
  52. package/dist/catalyst/p-c04eb2d3.entry.js.map +0 -1
@@ -33,10 +33,14 @@ const CatMenuItem = /*@__PURE__*/ proxyCustomElement(class CatMenuItem extends H
33
33
  * Specifies that the menu item should be disabled.
34
34
  */
35
35
  this.disabled = false;
36
+ this.subMenu = false;
36
37
  }
37
38
  get id() {
38
39
  return this.identifier || this._id;
39
40
  }
41
+ onClick(event) {
42
+ this.catClick.emit(event);
43
+ }
40
44
  /**
41
45
  * Programmatically move focus to the menu item.
42
46
  */
@@ -50,14 +54,14 @@ const CatMenuItem = /*@__PURE__*/ proxyCustomElement(class CatMenuItem extends H
50
54
  this.button?.doBlur();
51
55
  }
52
56
  render() {
53
- return (h(Host, { key: '69db1c5c6d91ea31103639a5fe3cbb96da32aa40' }, h("li", { key: '88569a9541369cf5dbc7f79b562ef5b68c9905a3' }, h("cat-button", { key: '65b6e6c3ca873a07204f36b3cae69dfffbc51a0b', ref: el => (this.button = el), class: "cat-nav-item", buttonId: this.id, part: "menu-item", variant: this.variant, icon: this.icon, iconOnly: this.iconOnly, iconRight: this.iconRight, url: this.url, disabled: this.disabled, urlTarget: this.urlTarget, loading: this.loading, color: this.color, active: this.active, testId: this.testId, nativeAttributes: {
57
+ return (h(Host, { key: 'ff1abf6c6d74fc9d0bbc7491d64e0ad3373f6899' }, h("li", { key: '45089d058d664822cb67bc7bbf802b06333c351e' }, h("cat-button", { key: '47a83844fe837313f65115d95571f0e9b6f7591b', ref: el => (this.button = el), class: "cat-nav-item", buttonId: this.id, part: "menu-item", variant: this.variant, icon: this.icon, iconOnly: this.iconOnly, iconRight: this.iconRight, url: this.url, disabled: this.disabled, urlTarget: this.urlTarget, loading: this.loading, color: this.color, active: this.active, testId: this.testId, nativeAttributes: {
54
58
  ...this.nativeAttributes,
55
59
  role: 'menuitem',
56
60
  tabindex: '-1'
57
- }, onCatClick: this.onCatClick }, h("slot", { key: 'c8036dabc3f0cb762d96bee7797ac50f871ac44d' })))));
61
+ }, onCatClick: event => this.click(event) }, h("slot", { key: '49bc9f6cc4a5ed1293e261cefb67351342b805fb' })))));
58
62
  }
59
- onCatClick(event) {
60
- this.catClick.emit(event.detail);
63
+ click(event) {
64
+ event.stopPropagation();
61
65
  }
62
66
  }, [257, "cat-menu-item", {
63
67
  "identifier": [1],
@@ -73,9 +77,10 @@ const CatMenuItem = /*@__PURE__*/ proxyCustomElement(class CatMenuItem extends H
73
77
  "disabled": [4],
74
78
  "nativeAttributes": [16],
75
79
  "testId": [1, "test-id"],
80
+ "subMenu": [4, "sub-menu"],
76
81
  "doFocus": [64],
77
82
  "doBlur": [64]
78
- }]);
83
+ }, [[0, "click", "onClick"]]]);
79
84
  function defineCustomElement() {
80
85
  if (typeof customElements === "undefined") {
81
86
  return;
@@ -1 +1 @@
1
- {"file":"cat-menu-item2.js","mappings":";;;;;AAGA,IAAI,YAAY,GAAG,CAAC;MASP,WAAW,iBAAAA,kBAAA,CAAA,MAAA,WAAA,SAAA,WAAA,CAAA;AAJxB,IAAA,WAAA,CAAA,YAAA,EAAA;;;;;;;AAKmB,QAAA,IAAA,CAAA,GAAG,GAAG,iBAAiB,EAAE,YAAY,EAAE;AAoBxD;;AAEG;AACK,QAAA,IAAM,CAAA,MAAA,GAAG,KAAK;AAEtB;;AAEG;AACK,QAAA,IAAO,CAAA,OAAA,GAAmC,MAAM;AAOxD;;AAEG;AACK,QAAA,IAAQ,CAAA,QAAA,GAAyB,KAAK;AAE9C;;AAEG;AACK,QAAA,IAAS,CAAA,SAAA,GAAG,KAAK;AAYzB;;AAEG;AACK,QAAA,IAAQ,CAAA,QAAA,GAAG,KAAK;AAwEzB;AAjIC,IAAA,IAAY,EAAE,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG;;AA2EpC;;AAEG;IAEH,MAAM,OAAO,CAAC,OAAsB,EAAA;AAClC,QAAA,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;;AAG/B;;AAEG;AAEH,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;;IAGvB,MAAM,GAAA;AACJ,QAAA,QACE,EAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EACH,CAAA,CAAA,IAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EACE,CACE,CAAA,YAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,EAC7B,KAAK,EAAC,cAAc,EACpB,QAAQ,EAAE,IAAI,CAAC,EAAE,EACjB,IAAI,EAAC,WAAW,EAChB,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,GAAG,EAAE,IAAI,CAAC,GAAG,EACb,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,gBAAgB,EAAE;gBAChB,GAAG,IAAI,CAAC,gBAAgB;AACxB,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE;aACX,EACD,UAAU,EAAE,IAAI,CAAC,UAAU,EAAA,EAE3B,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAa,CACF,CACV,CACA;;AAIH,IAAA,UAAU,CAAC,KAA8B,EAAA;QAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["__stencil_proxyCustomElement"],"sources":["src/components/cat-menu-item/cat-menu-item.tsx"],"sourcesContent":["import { Component, h, Host, Prop, Method, Event, EventEmitter } from '@stencil/core';\nimport { Breakpoint } from '../../utils/breakpoints';\n\nlet nextUniqueId = 0;\n\n/**\n * A menu item component that renders as a button with proper ARIA semantics.\n */\n@Component({\n tag: 'cat-menu-item',\n shadow: true\n})\nexport class CatMenuItem {\n private readonly _id = `cat-menu-item-${++nextUniqueId}`;\n private get id() {\n return this.identifier || this._id;\n }\n private button?: HTMLCatButtonElement;\n\n /**\n * A unique identifier for the menu item.\n */\n @Prop() identifier?: string;\n /**\n * The name of an icon to be displayed in the menu item.\n */\n @Prop() icon?: string;\n\n /**\n * The color of the menu item.\n */\n @Prop() color?: 'primary' | 'secondary' | 'danger' | 'warning' | 'success' | 'info';\n\n /**\n * Whether the menu item is active.\n */\n @Prop() active = false;\n\n /**\n * The variant of the menu item button.\n */\n @Prop() variant: 'filled' | 'outlined' | 'text' = 'text';\n\n /**\n * The loading state of the menu item.\n */\n @Prop() loading?: boolean;\n\n /**\n * Hide the actual button content and only display the icon.\n */\n @Prop() iconOnly: boolean | Breakpoint = false;\n\n /**\n * Display the icon on the right.\n */\n @Prop() iconRight = false;\n\n /**\n * A destination to link to, rendered in the href attribute of a link.\n */\n @Prop() url?: string;\n\n /**\n * Specifies where to open the linked document.\n */\n @Prop() urlTarget?: '_blank' | '_self';\n\n /**\n * Specifies that the menu item should be disabled.\n */\n @Prop() disabled = false;\n\n /**\n * Attributes that will be added to the native HTML button element\n */\n @Prop() nativeAttributes?: { [key: string]: string };\n\n /**\n * A unique identifier for the underlying native element that is used for\n * testing purposes. The attribute is added as `data-test` attribute and acts\n * as a shorthand for `nativeAttributes={ 'data-test': 'test-Id' }`.\n */\n @Prop() testId?: string;\n\n /**\n * Emitted when the trigger button is clicked.\n */\n @Event() catClick!: EventEmitter<MouseEvent>;\n\n /**\n * Programmatically move focus to the menu item.\n */\n @Method()\n async doFocus(options?: FocusOptions): Promise<void> {\n this.button?.doFocus(options);\n }\n\n /**\n * Programmatically remove focus from the menu item.\n */\n @Method()\n async doBlur(): Promise<void> {\n this.button?.doBlur();\n }\n\n render() {\n return (\n <Host>\n <li>\n <cat-button\n ref={el => (this.button = el)}\n class=\"cat-nav-item\"\n buttonId={this.id}\n part=\"menu-item\"\n variant={this.variant}\n icon={this.icon}\n iconOnly={this.iconOnly}\n iconRight={this.iconRight}\n url={this.url}\n disabled={this.disabled}\n urlTarget={this.urlTarget}\n loading={this.loading}\n color={this.color}\n active={this.active}\n testId={this.testId}\n nativeAttributes={{\n ...this.nativeAttributes,\n role: 'menuitem',\n tabindex: '-1'\n }}\n onCatClick={this.onCatClick}\n >\n <slot></slot>\n </cat-button>\n </li>\n </Host>\n );\n }\n\n private onCatClick(event: CustomEvent<MouseEvent>) {\n this.catClick.emit(event.detail);\n }\n}\n"],"version":3}
1
+ {"file":"cat-menu-item2.js","mappings":";;;;;AAGA,IAAI,YAAY,GAAG,CAAC;MASP,WAAW,iBAAAA,kBAAA,CAAA,MAAA,WAAA,SAAA,WAAA,CAAA;AAJxB,IAAA,WAAA,CAAA,YAAA,EAAA;;;;;;;AAKmB,QAAA,IAAA,CAAA,GAAG,GAAG,iBAAiB,EAAE,YAAY,EAAE;AAoBxD;;AAEG;AACK,QAAA,IAAM,CAAA,MAAA,GAAG,KAAK;AAEtB;;AAEG;AACK,QAAA,IAAO,CAAA,OAAA,GAAmC,MAAM;AAOxD;;AAEG;AACK,QAAA,IAAQ,CAAA,QAAA,GAAyB,KAAK;AAE9C;;AAEG;AACK,QAAA,IAAS,CAAA,SAAA,GAAG,KAAK;AAYzB;;AAEG;AACK,QAAA,IAAQ,CAAA,QAAA,GAAG,KAAK;AAahB,QAAA,IAAO,CAAA,OAAA,GAAG,KAAK;AAiExB;AAvIC,IAAA,IAAY,EAAE,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG;;AA6EpC,IAAA,OAAO,CAAC,KAAiB,EAAA;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;AAG3B;;AAEG;IAEH,MAAM,OAAO,CAAC,OAAsB,EAAA;AAClC,QAAA,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;;AAG/B;;AAEG;AAEH,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;;IAGvB,MAAM,GAAA;AACJ,QAAA,QACE,EAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EACH,CAAA,CAAA,IAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EACE,CACE,CAAA,YAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,EAC7B,KAAK,EAAC,cAAc,EACpB,QAAQ,EAAE,IAAI,CAAC,EAAE,EACjB,IAAI,EAAC,WAAW,EAChB,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,GAAG,EAAE,IAAI,CAAC,GAAG,EACb,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,gBAAgB,EAAE;gBAChB,GAAG,IAAI,CAAC,gBAAgB;AACxB,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE;AACX,aAAA,EACD,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAA,EAEtC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAa,CACF,CACV,CACA;;AAIH,IAAA,KAAK,CAAC,KAA8B,EAAA;QAC1C,KAAK,CAAC,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["__stencil_proxyCustomElement"],"sources":["src/components/cat-menu-item/cat-menu-item.tsx"],"sourcesContent":["import { Component, h, Host, Prop, Method, Event, EventEmitter, Listen } from '@stencil/core';\nimport { Breakpoint } from '../../utils/breakpoints';\n\nlet nextUniqueId = 0;\n\n/**\n * A menu item component that renders as a button with proper ARIA semantics.\n */\n@Component({\n tag: 'cat-menu-item',\n shadow: true\n})\nexport class CatMenuItem {\n private readonly _id = `cat-menu-item-${++nextUniqueId}`;\n private get id() {\n return this.identifier || this._id;\n }\n private button?: HTMLCatButtonElement;\n\n /**\n * A unique identifier for the menu item.\n */\n @Prop() identifier?: string;\n /**\n * The name of an icon to be displayed in the menu item.\n */\n @Prop() icon?: string;\n\n /**\n * The color of the menu item.\n */\n @Prop() color?: 'primary' | 'secondary' | 'danger' | 'warning' | 'success' | 'info';\n\n /**\n * Whether the menu item is active.\n */\n @Prop() active = false;\n\n /**\n * The variant of the menu item button.\n */\n @Prop() variant: 'filled' | 'outlined' | 'text' = 'text';\n\n /**\n * The loading state of the menu item.\n */\n @Prop() loading?: boolean;\n\n /**\n * Hide the actual button content and only display the icon.\n */\n @Prop() iconOnly: boolean | Breakpoint = false;\n\n /**\n * Display the icon on the right.\n */\n @Prop() iconRight = false;\n\n /**\n * A destination to link to, rendered in the href attribute of a link.\n */\n @Prop() url?: string;\n\n /**\n * Specifies where to open the linked document.\n */\n @Prop() urlTarget?: '_blank' | '_self';\n\n /**\n * Specifies that the menu item should be disabled.\n */\n @Prop() disabled = false;\n\n /**\n * Attributes that will be added to the native HTML button element\n */\n @Prop() nativeAttributes?: { [key: string]: string };\n\n /**\n * A unique identifier for the underlying native element that is used for\n * testing purposes. The attribute is added as `data-test` attribute and acts\n * as a shorthand for `nativeAttributes={ 'data-test': 'test-Id' }`.\n */\n @Prop() testId?: string;\n @Prop() subMenu = false;\n\n /**\n * Emitted when the trigger button is clicked.\n */\n @Event() catClick!: EventEmitter<MouseEvent>;\n\n @Listen('click')\n onClick(event: MouseEvent) {\n this.catClick.emit(event);\n }\n\n /**\n * Programmatically move focus to the menu item.\n */\n @Method()\n async doFocus(options?: FocusOptions): Promise<void> {\n this.button?.doFocus(options);\n }\n\n /**\n * Programmatically remove focus from the menu item.\n */\n @Method()\n async doBlur(): Promise<void> {\n this.button?.doBlur();\n }\n\n render() {\n return (\n <Host>\n <li>\n <cat-button\n ref={el => (this.button = el)}\n class=\"cat-nav-item\"\n buttonId={this.id}\n part=\"menu-item\"\n variant={this.variant}\n icon={this.icon}\n iconOnly={this.iconOnly}\n iconRight={this.iconRight}\n url={this.url}\n disabled={this.disabled}\n urlTarget={this.urlTarget}\n loading={this.loading}\n color={this.color}\n active={this.active}\n testId={this.testId}\n nativeAttributes={{\n ...this.nativeAttributes,\n role: 'menuitem',\n tabindex: '-1'\n }}\n onCatClick={event => this.click(event)}\n >\n <slot></slot>\n </cat-button>\n </li>\n </Host>\n );\n }\n\n private click(event: CustomEvent<MouseEvent>) {\n event.stopPropagation();\n }\n}\n"],"version":3}
@@ -1,5 +1,5 @@
1
1
  import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
2
- import { d as defineCustomElement$4 } from './cat-button2.js';
2
+ import { f as findClosest, d as defineCustomElement$4 } from './cat-button2.js';
3
3
  import { d as defineCustomElement$3 } from './cat-dropdown2.js';
4
4
  import { d as defineCustomElement$2 } from './cat-icon2.js';
5
5
  import { d as defineCustomElement$1 } from './cat-spinner2.js';
@@ -87,10 +87,10 @@ const CatMenu = /*@__PURE__*/ proxyCustomElement(class CatMenu extends HTMLEleme
87
87
  }
88
88
  getDeepActiveElement() {
89
89
  let active = document.activeElement;
90
- while (active?.shadowRoot?.activeElement && active.nodeName !== 'CAT-MENU-ITEM') {
90
+ while (active?.shadowRoot?.activeElement) {
91
91
  active = active.shadowRoot.activeElement;
92
92
  }
93
- return active;
93
+ return active ? (findClosest('cat-menu-item', active) ?? active) : null;
94
94
  }
95
95
  onDocumentKeydown(event) {
96
96
  const navigationKeys = this.arrowNavigation === 'horizontal'
@@ -158,10 +158,10 @@ const CatMenu = /*@__PURE__*/ proxyCustomElement(class CatMenu extends HTMLEleme
158
158
  this.catMenuItems = Array.from(this.hostElement.querySelectorAll('cat-menu-item'));
159
159
  }
160
160
  render() {
161
- return (h(Host, { key: '1659f098d4d11e61119cde4f290bb89bf450f9d9' }, h("cat-dropdown", { key: 'a5ca6e28245167c0f208d1846c9f93a75991dee1', ref: el => (this.dropdown = el), focusTrap: false, placement: this.placement, justify: this.justify, arrowNavigation: "none", noResize: this.noResize, overflow: this.overflow, delayedTriggerInit: this.delayedTriggerInit, onCatOpen: this.onMenuOpen, onCatClose: () => this.catClose.emit() }, h("cat-button", { key: '63986a7d31784fdd59de48c79a5b5777cf198b94', slot: "trigger", part: "trigger", variant: this.triggerVariant, size: this.triggerSize, icon: this.triggerIcon ?? (this.triggerLabel === undefined ? 'more-horizontal-filled' : undefined), iconOnly: this.triggerIconOnly ?? this.triggerLabel === undefined, color: this.triggerColor, a11yLabel: this.triggerA11yLabel ?? this.triggerLabel, class: this.triggerClass, testId: this.triggerTestId, nativeAttributes: {
161
+ return (h(Host, { key: '477d279400f05909efb6d3893ad3832383b0b1f1' }, h("cat-dropdown", { key: '39b1b867490e2f7f9a9f45bdf247785102e2fc73', ref: el => (this.dropdown = el), focusTrap: false, placement: this.placement, justify: this.justify, arrowNavigation: "none", noResize: this.noResize, overflow: this.overflow, delayedTriggerInit: this.delayedTriggerInit, onCatOpen: this.onMenuOpen, onCatClose: () => this.catClose.emit() }, h("cat-button", { key: '13c95fc31610cfe5eff4bd6ce9cad055c77ef454', slot: "trigger", part: "trigger", variant: this.triggerVariant, size: this.triggerSize, icon: this.triggerIcon ?? (this.triggerLabel === undefined ? 'more-horizontal-filled' : undefined), iconOnly: this.triggerIconOnly ?? this.triggerLabel === undefined, color: this.triggerColor, a11yLabel: this.triggerA11yLabel ?? this.triggerLabel, class: this.triggerClass, testId: this.triggerTestId, nativeAttributes: {
162
162
  ...this.triggerNativeAttributes,
163
163
  'aria-haspopup': 'menu'
164
- }, disabled: this.disabled, onCatClick: this.onTriggerClick }, !this.triggerIconOnly && h("slot", { key: 'c10341a8bec971b814ec88044a89aa6752f3be23', name: "trigger-label" }, this.triggerLabel)), h("nav", { key: '265da5937ea993d27ccec21f9c0bc84439208d6c', role: "menu", slot: "content", class: "cat-menu-list", "aria-orientation": this.arrowNavigation }, h("ul", { key: '9b8edcb90028b39690be08961f25ea8c7a769752' }, h("slot", { key: 'f30590ff83386f30ba4539e76d621a80b0aefffd' }))))));
164
+ }, disabled: this.disabled, onCatClick: this.onTriggerClick }, !this.triggerIconOnly && h("slot", { key: 'f688c20ef06f986a2fec549e524a9293e40bb362', name: "trigger-label" }, this.triggerLabel)), h("nav", { key: 'f257a0cc30a58b63f6cc073a24fe56018d029ed8', role: "menu", slot: "content", class: "cat-menu-list", "aria-orientation": this.arrowNavigation }, h("ul", { key: '127a61cbf0958eb7bd6f7edcb4bec923e0f9491c' }, h("slot", { key: 'ec19aade8956369dc02f7f7aa08401955ed3b358' }))))));
165
165
  }
166
166
  get hostElement() { return this; }
167
167
  static get style() { return catMenuCss; }
@@ -1 +1 @@
1
- {"file":"cat-menu2.js","mappings":"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","names":["__stencil_proxyCustomElement"],"sources":["src/components/cat-menu/cat-menu.scss?tag=cat-menu&encapsulation=shadow","src/components/cat-menu/cat-menu.tsx"],"sourcesContent":[":host(.cat-time-menu) {\n nav {\n max-height: 16rem;\n }\n}\n\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n","import { Placement } from '@floating-ui/dom';\nimport { Component, Element, Event, EventEmitter, h, Host, Listen, Method, Prop } from '@stencil/core';\nimport { Breakpoint } from '../../utils/breakpoints';\n\n/**\n * A menu component that provides a dropdown with a built-in configurable trigger button\n * and proper ARIA semantics and keyboard navigation for menu items.\n *\n * The trigger is always a cat-button with sensible defaults but fully configurable\n * through trigger-specific props.\n */\n@Component({\n tag: 'cat-menu',\n styleUrl: 'cat-menu.scss',\n shadow: true\n})\nexport class CatMenu {\n private dropdown?: HTMLCatDropdownElement;\n private catMenuItems: HTMLCatMenuItemElement[] = [];\n private mutationObserver?: MutationObserver;\n\n @Element() hostElement!: HTMLElement;\n\n /**\n * The placement of the dropdown.\n */\n @Prop() placement: Placement = 'bottom-start';\n\n /**\n * The arrow key navigation direction for menu items.\n */\n @Prop() arrowNavigation: 'horizontal' | 'vertical' = 'vertical';\n\n /**\n * The trigger button variant.\n */\n @Prop() triggerVariant: 'filled' | 'outlined' | 'text' = 'text';\n\n /**\n * The trigger button size.\n */\n @Prop() triggerSize: 'xs' | 's' | 'm' | 'l' | 'xl' = 'm';\n\n /**\n * The trigger button icon.\n */\n @Prop() triggerIcon?: string;\n\n /**\n * Show only the icon in the trigger button.\n */\n @Prop() triggerIconOnly?: boolean | Breakpoint;\n\n /**\n * The trigger button label.\n */\n @Prop() triggerLabel?: string;\n\n /**\n * The color palette of the trigger button.\n */\n @Prop() triggerColor: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'danger' = 'secondary';\n\n /**\n * The trigger button accessibility label. If not set, falls back to triggerLabel.\n */\n @Prop() triggerA11yLabel?: string;\n\n /**\n * Additional CSS class for the trigger button.\n */\n @Prop() triggerClass?: string;\n\n /**\n * Test ID for the trigger button.\n */\n @Prop() triggerTestId?: string;\n\n /**\n * Native attributes for the trigger button.\n */\n @Prop() triggerNativeAttributes?: { [key: string]: string };\n\n /**\n * Disable the menu.\n */\n @Prop() disabled = false;\n\n /**\n * Make the dropdown match the width of the reference regardless of its\n * contents. Note that this only applies to the minimum width of the\n * dropdown. The maximum width is still limited by the viewport.\n */\n @Prop() justify = false;\n\n /**\n * Do not change the size of the dropdown to ensure it isn’t too big to fit\n * in the viewport (or more specifically, its clipping context).\n */\n @Prop() noResize = false;\n\n /**\n * Allow overflow when dropdown is open.\n */\n @Prop() overflow = false;\n\n /**\n * Whether the dropdown trigger should be initialized only before first opening.\n * Can be useful when trigger is rendered dynamically.\n */\n @Prop() delayedTriggerInit = false;\n\n /**\n * Emitted when the dropdown is opened.\n */\n @Event() catOpen!: EventEmitter<FocusEvent>;\n\n /**\n * Emitted when the dropdown is closed.\n */\n @Event() catClose!: EventEmitter<FocusEvent>;\n\n /**\n * Emitted when the trigger button is clicked.\n */\n @Event() catTriggerClick!: EventEmitter<MouseEvent>;\n\n @Listen('focusout')\n onFocusOut(): void {\n if (!this.dropdown?.isOpen) {\n return;\n }\n\n requestAnimationFrame(() => {\n if (!this.isMenuItemInFocus()) {\n this.dropdown?.close(false);\n }\n });\n }\n\n private getDeepActiveElement(): Element | null {\n let active = document.activeElement;\n while (active?.shadowRoot?.activeElement && active.nodeName !== 'CAT-MENU-ITEM') {\n active = active.shadowRoot.activeElement;\n }\n return active;\n }\n\n @Listen('keydown', { target: 'document' })\n onDocumentKeydown(event: KeyboardEvent): void {\n const navigationKeys =\n this.arrowNavigation === 'horizontal'\n ? ['ArrowRight', 'ArrowLeft', 'Home', 'End']\n : ['ArrowDown', 'ArrowUp', 'Home', 'End'];\n\n if (!this.dropdown?.isOpen || !navigationKeys.includes(event.key)) {\n return;\n }\n\n const targetElements = this.catMenuItems.filter(item => !item.disabled);\n if (!targetElements.length) {\n return;\n }\n const activeIdx = targetElements.findIndex(item => this.getDeepActiveElement() === item);\n\n let targetIdx: number;\n if (event.key === 'Home') {\n targetIdx = 0;\n } else if (event.key === 'End') {\n targetIdx = targetElements.length - 1;\n } else {\n const forwardKey = this.arrowNavigation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n const activeOff = event.key === forwardKey ? 1 : -1;\n targetIdx = activeIdx < 0 ? 0 : (activeIdx + activeOff + targetElements.length) % targetElements.length;\n }\n\n targetElements[targetIdx].doFocus();\n event.preventDefault();\n }\n\n componentDidLoad(): void {\n this.syncMenuItems();\n this.mutationObserver = new MutationObserver(\n mutations => mutations.some(value => value.target.nodeName === 'CAT-MENU-ITEM') && this.syncMenuItems()\n );\n this.mutationObserver?.observe(this.hostElement, {\n childList: true,\n attributes: true,\n subtree: true\n });\n }\n\n disconnectedCallback(): void {\n this.mutationObserver?.disconnect();\n }\n\n /**\n * Opens the menu.\n */\n @Method()\n async open(): Promise<void> {\n await this.dropdown?.open();\n }\n\n /**\n * Closes the menu.\n */\n @Method()\n async close(): Promise<void> {\n await this.dropdown?.close();\n }\n\n /**\n * Toggles the menu.\n */\n @Method()\n async toggle(): Promise<void> {\n await this.dropdown?.toggle();\n }\n\n private onTriggerClick = (event: CustomEvent<MouseEvent>) => {\n this.catTriggerClick.emit(event.detail);\n };\n\n private onMenuOpen = (event: CustomEvent<FocusEvent>) => {\n this.catOpen.emit(event.detail);\n // Set focus to first non-disabled menu item when menu opens\n requestAnimationFrame(() => {\n if (!this.isMenuItemInFocus()) {\n const firstEnabledItem = this.catMenuItems.find(item => !item.disabled);\n firstEnabledItem?.doFocus();\n }\n });\n };\n\n private isMenuItemInFocus(): boolean {\n const activeElement = this.getDeepActiveElement();\n const isInMenu = activeElement && this.catMenuItems.some(item => activeElement === item);\n\n return !!(activeElement && isInMenu);\n }\n\n private syncMenuItems() {\n this.catMenuItems = Array.from(this.hostElement.querySelectorAll('cat-menu-item'));\n }\n\n render() {\n return (\n <Host>\n <cat-dropdown\n ref={el => (this.dropdown = el)}\n focusTrap={false}\n placement={this.placement}\n justify={this.justify}\n arrowNavigation=\"none\"\n noResize={this.noResize}\n overflow={this.overflow}\n delayedTriggerInit={this.delayedTriggerInit}\n onCatOpen={this.onMenuOpen}\n onCatClose={() => this.catClose.emit()}\n >\n <cat-button\n slot=\"trigger\"\n part=\"trigger\"\n variant={this.triggerVariant}\n size={this.triggerSize}\n icon={this.triggerIcon ?? (this.triggerLabel === undefined ? 'more-horizontal-filled' : undefined)}\n iconOnly={this.triggerIconOnly ?? this.triggerLabel === undefined}\n color={this.triggerColor}\n a11yLabel={this.triggerA11yLabel ?? this.triggerLabel}\n class={this.triggerClass}\n testId={this.triggerTestId}\n nativeAttributes={{\n ...this.triggerNativeAttributes,\n 'aria-haspopup': 'menu'\n }}\n disabled={this.disabled}\n onCatClick={this.onTriggerClick}\n >\n {!this.triggerIconOnly && <slot name=\"trigger-label\">{this.triggerLabel}</slot>}\n </cat-button>\n <nav role=\"menu\" slot=\"content\" class=\"cat-menu-list\" aria-orientation={this.arrowNavigation}>\n <ul>\n <slot></slot>\n </ul>\n </nav>\n </cat-dropdown>\n </Host>\n );\n }\n}\n"],"version":3}
1
+ {"file":"cat-menu2.js","mappings":"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","names":["__stencil_proxyCustomElement"],"sources":["src/components/cat-menu/cat-menu.scss?tag=cat-menu&encapsulation=shadow","src/components/cat-menu/cat-menu.tsx"],"sourcesContent":[":host(.cat-time-menu) {\n nav {\n max-height: 16rem;\n }\n}\n\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n","import { Placement } from '@floating-ui/dom';\nimport { Component, Element, Event, EventEmitter, h, Host, Listen, Method, Prop } from '@stencil/core';\nimport { Breakpoint } from '../../utils/breakpoints';\nimport { findClosest } from '../../utils/find-closest';\n\n/**\n * A menu component that provides a dropdown with a built-in configurable trigger button\n * and proper ARIA semantics and keyboard navigation for menu items.\n *\n * The trigger is always a cat-button with sensible defaults but fully configurable\n * through trigger-specific props.\n */\n@Component({\n tag: 'cat-menu',\n styleUrl: 'cat-menu.scss',\n shadow: true\n})\nexport class CatMenu {\n private dropdown?: HTMLCatDropdownElement;\n private catMenuItems: HTMLCatMenuItemElement[] = [];\n private mutationObserver?: MutationObserver;\n\n @Element() hostElement!: HTMLElement;\n\n /**\n * The placement of the dropdown.\n */\n @Prop() placement: Placement = 'bottom-start';\n\n /**\n * The arrow key navigation direction for menu items.\n */\n @Prop() arrowNavigation: 'horizontal' | 'vertical' = 'vertical';\n\n /**\n * The trigger button variant.\n */\n @Prop() triggerVariant: 'filled' | 'outlined' | 'text' = 'text';\n\n /**\n * The trigger button size.\n */\n @Prop() triggerSize: 'xs' | 's' | 'm' | 'l' | 'xl' = 'm';\n\n /**\n * The trigger button icon.\n */\n @Prop() triggerIcon?: string;\n\n /**\n * Show only the icon in the trigger button.\n */\n @Prop() triggerIconOnly?: boolean | Breakpoint;\n\n /**\n * The trigger button label.\n */\n @Prop() triggerLabel?: string;\n\n /**\n * The color palette of the trigger button.\n */\n @Prop() triggerColor: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'danger' = 'secondary';\n\n /**\n * The trigger button accessibility label. If not set, falls back to triggerLabel.\n */\n @Prop() triggerA11yLabel?: string;\n\n /**\n * Additional CSS class for the trigger button.\n */\n @Prop() triggerClass?: string;\n\n /**\n * Test ID for the trigger button.\n */\n @Prop() triggerTestId?: string;\n\n /**\n * Native attributes for the trigger button.\n */\n @Prop() triggerNativeAttributes?: { [key: string]: string };\n\n /**\n * Disable the menu.\n */\n @Prop() disabled = false;\n\n /**\n * Make the dropdown match the width of the reference regardless of its\n * contents. Note that this only applies to the minimum width of the\n * dropdown. The maximum width is still limited by the viewport.\n */\n @Prop() justify = false;\n\n /**\n * Do not change the size of the dropdown to ensure it isn’t too big to fit\n * in the viewport (or more specifically, its clipping context).\n */\n @Prop() noResize = false;\n\n /**\n * Allow overflow when dropdown is open.\n */\n @Prop() overflow = false;\n\n /**\n * Whether the dropdown trigger should be initialized only before first opening.\n * Can be useful when trigger is rendered dynamically.\n */\n @Prop() delayedTriggerInit = false;\n\n /**\n * Emitted when the dropdown is opened.\n */\n @Event() catOpen!: EventEmitter<FocusEvent>;\n\n /**\n * Emitted when the dropdown is closed.\n */\n @Event() catClose!: EventEmitter<FocusEvent>;\n\n /**\n * Emitted when the trigger button is clicked.\n */\n @Event() catTriggerClick!: EventEmitter<MouseEvent>;\n\n @Listen('focusout')\n onFocusOut(): void {\n if (!this.dropdown?.isOpen) {\n return;\n }\n\n requestAnimationFrame(() => {\n if (!this.isMenuItemInFocus()) {\n this.dropdown?.close(false);\n }\n });\n }\n\n private getDeepActiveElement(): Element | null {\n let active: Element | null = document.activeElement;\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement;\n }\n return active ? (findClosest('cat-menu-item', active) ?? active) : null;\n }\n\n @Listen('keydown', { target: 'document' })\n onDocumentKeydown(event: KeyboardEvent): void {\n const navigationKeys =\n this.arrowNavigation === 'horizontal'\n ? ['ArrowRight', 'ArrowLeft', 'Home', 'End']\n : ['ArrowDown', 'ArrowUp', 'Home', 'End'];\n\n if (!this.dropdown?.isOpen || !navigationKeys.includes(event.key)) {\n return;\n }\n\n const targetElements = this.catMenuItems.filter(item => !item.disabled);\n if (!targetElements.length) {\n return;\n }\n const activeIdx = targetElements.findIndex(item => this.getDeepActiveElement() === item);\n\n let targetIdx: number;\n if (event.key === 'Home') {\n targetIdx = 0;\n } else if (event.key === 'End') {\n targetIdx = targetElements.length - 1;\n } else {\n const forwardKey = this.arrowNavigation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n const activeOff = event.key === forwardKey ? 1 : -1;\n targetIdx = activeIdx < 0 ? 0 : (activeIdx + activeOff + targetElements.length) % targetElements.length;\n }\n\n targetElements[targetIdx].doFocus();\n event.preventDefault();\n }\n\n componentDidLoad(): void {\n this.syncMenuItems();\n this.mutationObserver = new MutationObserver(\n mutations => mutations.some(value => value.target.nodeName === 'CAT-MENU-ITEM') && this.syncMenuItems()\n );\n this.mutationObserver?.observe(this.hostElement, {\n childList: true,\n attributes: true,\n subtree: true\n });\n }\n\n disconnectedCallback(): void {\n this.mutationObserver?.disconnect();\n }\n\n /**\n * Opens the menu.\n */\n @Method()\n async open(): Promise<void> {\n await this.dropdown?.open();\n }\n\n /**\n * Closes the menu.\n */\n @Method()\n async close(): Promise<void> {\n await this.dropdown?.close();\n }\n\n /**\n * Toggles the menu.\n */\n @Method()\n async toggle(): Promise<void> {\n await this.dropdown?.toggle();\n }\n\n private onTriggerClick = (event: CustomEvent<MouseEvent>) => {\n this.catTriggerClick.emit(event.detail);\n };\n\n private onMenuOpen = (event: CustomEvent<FocusEvent>) => {\n this.catOpen.emit(event.detail);\n // Set focus to first non-disabled menu item when menu opens\n requestAnimationFrame(() => {\n if (!this.isMenuItemInFocus()) {\n const firstEnabledItem = this.catMenuItems.find(item => !item.disabled);\n firstEnabledItem?.doFocus();\n }\n });\n };\n\n private isMenuItemInFocus(): boolean {\n const activeElement = this.getDeepActiveElement();\n const isInMenu = activeElement && this.catMenuItems.some(item => activeElement === item);\n\n return !!(activeElement && isInMenu);\n }\n\n private syncMenuItems() {\n this.catMenuItems = Array.from(this.hostElement.querySelectorAll('cat-menu-item'));\n }\n\n render() {\n return (\n <Host>\n <cat-dropdown\n ref={el => (this.dropdown = el)}\n focusTrap={false}\n placement={this.placement}\n justify={this.justify}\n arrowNavigation=\"none\"\n noResize={this.noResize}\n overflow={this.overflow}\n delayedTriggerInit={this.delayedTriggerInit}\n onCatOpen={this.onMenuOpen}\n onCatClose={() => this.catClose.emit()}\n >\n <cat-button\n slot=\"trigger\"\n part=\"trigger\"\n variant={this.triggerVariant}\n size={this.triggerSize}\n icon={this.triggerIcon ?? (this.triggerLabel === undefined ? 'more-horizontal-filled' : undefined)}\n iconOnly={this.triggerIconOnly ?? this.triggerLabel === undefined}\n color={this.triggerColor}\n a11yLabel={this.triggerA11yLabel ?? this.triggerLabel}\n class={this.triggerClass}\n testId={this.triggerTestId}\n nativeAttributes={{\n ...this.triggerNativeAttributes,\n 'aria-haspopup': 'menu'\n }}\n disabled={this.disabled}\n onCatClick={this.onTriggerClick}\n >\n {!this.triggerIconOnly && <slot name=\"trigger-label\">{this.triggerLabel}</slot>}\n </cat-button>\n <nav role=\"menu\" slot=\"content\" class=\"cat-menu-list\" aria-orientation={this.arrowNavigation}>\n <ul>\n <slot></slot>\n </ul>\n </nav>\n </cat-dropdown>\n </Host>\n );\n }\n}\n"],"version":3}
@@ -17,10 +17,6 @@ const oppositeSideMap = {
17
17
  bottom: 'top',
18
18
  top: 'bottom'
19
19
  };
20
- const oppositeAlignmentMap = {
21
- start: 'end',
22
- end: 'start'
23
- };
24
20
  function clamp(start, value, end) {
25
21
  return max(start, min(value, end));
26
22
  }
@@ -39,9 +35,9 @@ function getOppositeAxis(axis) {
39
35
  function getAxisLength(axis) {
40
36
  return axis === 'y' ? 'height' : 'width';
41
37
  }
42
- const yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);
43
38
  function getSideAxis(placement) {
44
- return yAxisSides.has(getSide(placement)) ? 'y' : 'x';
39
+ const firstChar = placement[0];
40
+ return firstChar === 't' || firstChar === 'b' ? 'y' : 'x';
45
41
  }
46
42
  function getAlignmentAxis(placement) {
47
43
  return getOppositeAxis(getSideAxis(placement));
@@ -64,7 +60,7 @@ function getExpandedPlacements(placement) {
64
60
  return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];
65
61
  }
66
62
  function getOppositeAlignmentPlacement(placement) {
67
- return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);
63
+ return placement.includes('start') ? placement.replace('start', 'end') : placement.replace('end', 'start');
68
64
  }
69
65
  const lrPlacement = ['left', 'right'];
70
66
  const rlPlacement = ['right', 'left'];
@@ -95,7 +91,8 @@ function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {
95
91
  return list;
96
92
  }
97
93
  function getOppositePlacement(placement) {
98
- return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);
94
+ const side = getSide(placement);
95
+ return oppositeSideMap[side] + placement.slice(side.length);
99
96
  }
100
97
  function expandPaddingObject(padding) {
101
98
  return {
@@ -254,6 +251,9 @@ async function detectOverflow(state, options) {
254
251
  };
255
252
  }
256
253
 
254
+ // Maximum number of resets that can occur before bailing to avoid infinite reset loops.
255
+ const MAX_RESET_COUNT = 50;
256
+
257
257
  /**
258
258
  * Computes the `x` and `y` coordinates that will place the floating element
259
259
  * next to a given reference element.
@@ -268,7 +268,10 @@ const computePosition$1 = async (reference, floating, config) => {
268
268
  middleware = [],
269
269
  platform
270
270
  } = config;
271
- const validMiddleware = middleware.filter(Boolean);
271
+ const platformWithDetectOverflow = platform.detectOverflow ? platform : {
272
+ ...platform,
273
+ detectOverflow
274
+ };
272
275
  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));
273
276
  let rects = await platform.getElementRects({
274
277
  reference,
@@ -280,14 +283,17 @@ const computePosition$1 = async (reference, floating, config) => {
280
283
  y
281
284
  } = computeCoordsFromPlacement(rects, placement, rtl);
282
285
  let statefulPlacement = placement;
283
- let middlewareData = {};
284
286
  let resetCount = 0;
285
- for (let i = 0; i < validMiddleware.length; i++) {
286
- var _platform$detectOverf;
287
+ const middlewareData = {};
288
+ for (let i = 0; i < middleware.length; i++) {
289
+ const currentMiddleware = middleware[i];
290
+ if (!currentMiddleware) {
291
+ continue;
292
+ }
287
293
  const {
288
294
  name,
289
295
  fn
290
- } = validMiddleware[i];
296
+ } = currentMiddleware;
291
297
  const {
292
298
  x: nextX,
293
299
  y: nextY,
@@ -301,10 +307,7 @@ const computePosition$1 = async (reference, floating, config) => {
301
307
  strategy,
302
308
  middlewareData,
303
309
  rects,
304
- platform: {
305
- ...platform,
306
- detectOverflow: (_platform$detectOverf = platform.detectOverflow) != null ? _platform$detectOverf : detectOverflow
307
- },
310
+ platform: platformWithDetectOverflow,
308
311
  elements: {
309
312
  reference,
310
313
  floating
@@ -312,14 +315,11 @@ const computePosition$1 = async (reference, floating, config) => {
312
315
  });
313
316
  x = nextX != null ? nextX : x;
314
317
  y = nextY != null ? nextY : y;
315
- middlewareData = {
316
- ...middlewareData,
317
- [name]: {
318
- ...middlewareData[name],
319
- ...data
320
- }
318
+ middlewareData[name] = {
319
+ ...middlewareData[name],
320
+ ...data
321
321
  };
322
- if (reset && resetCount <= 50) {
322
+ if (reset && resetCount < MAX_RESET_COUNT) {
323
323
  resetCount++;
324
324
  if (typeof reset === 'object') {
325
325
  if (reset.placement) {
@@ -774,7 +774,6 @@ function isShadowRoot(value) {
774
774
  }
775
775
  return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;
776
776
  }
777
- const invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);
778
777
  function isOverflowElement(element) {
779
778
  const {
780
779
  overflow,
@@ -782,32 +781,35 @@ function isOverflowElement(element) {
782
781
  overflowY,
783
782
  display
784
783
  } = getComputedStyle(element);
785
- return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);
784
+ return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== 'inline' && display !== 'contents';
786
785
  }
787
- const tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);
788
786
  function isTableElement(element) {
789
- return tableElements.has(getNodeName(element));
787
+ return /^(table|td|th)$/.test(getNodeName(element));
790
788
  }
791
- const topLayerSelectors = [':popover-open', ':modal'];
792
789
  function isTopLayer(element) {
793
- return topLayerSelectors.some(selector => {
794
- try {
795
- return element.matches(selector);
796
- } catch (_e) {
797
- return false;
790
+ try {
791
+ if (element.matches(':popover-open')) {
792
+ return true;
798
793
  }
799
- });
794
+ } catch (_e) {
795
+ // no-op
796
+ }
797
+ try {
798
+ return element.matches(':modal');
799
+ } catch (_e) {
800
+ return false;
801
+ }
800
802
  }
801
- const transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];
802
- const willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];
803
- const containValues = ['paint', 'layout', 'strict', 'content'];
803
+ const willChangeRe = /transform|translate|scale|rotate|perspective|filter/;
804
+ const containRe = /paint|layout|strict|content/;
805
+ const isNotNone = value => !!value && value !== 'none';
806
+ let isWebKitValue;
804
807
  function isContainingBlock(elementOrCss) {
805
- const webkit = isWebKit();
806
808
  const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;
807
809
 
808
810
  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
809
811
  // https://drafts.csswg.org/css-transforms-2/#individual-transforms
810
- return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));
812
+ return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || '');
811
813
  }
812
814
  function getContainingBlock(element) {
813
815
  let currentNode = getParentNode(element);
@@ -822,12 +824,13 @@ function getContainingBlock(element) {
822
824
  return null;
823
825
  }
824
826
  function isWebKit() {
825
- if (typeof CSS === 'undefined' || !CSS.supports) return false;
826
- return CSS.supports('-webkit-backdrop-filter', 'none');
827
+ if (isWebKitValue == null) {
828
+ isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none');
829
+ }
830
+ return isWebKitValue;
827
831
  }
828
- const lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);
829
832
  function isLastTraversableNode(node) {
830
- return lastTraversableNodeNames.has(getNodeName(node));
833
+ return /^(html|body|#document)$/.test(getNodeName(node));
831
834
  }
832
835
  function getComputedStyle(element) {
833
836
  return getWindow(element).getComputedStyle(element);
@@ -883,8 +886,9 @@ function getOverflowAncestors(node, list, traverseIframes) {
883
886
  if (isBody) {
884
887
  const frameElement = getFrameElement(win);
885
888
  return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);
889
+ } else {
890
+ return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));
886
891
  }
887
- return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));
888
892
  }
889
893
  function getFrameElement(win) {
890
894
  return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;