@shoper/phoenix_design_system 1.13.0 → 1.14.1-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 (57) hide show
  1. package/build/cjs/packages/phoenix/src/components/color_swatches/color_item/color_item.js +21 -29
  2. package/build/cjs/packages/phoenix/src/components/color_swatches/color_item/color_item.js.map +1 -1
  3. package/build/cjs/packages/phoenix/src/components/color_swatches/color_item/color_item_constants.js +0 -4
  4. package/build/cjs/packages/phoenix/src/components/color_swatches/color_item/color_item_constants.js.map +1 -1
  5. package/build/cjs/packages/phoenix/src/components/color_swatches/color_swatches.js +121 -11
  6. package/build/cjs/packages/phoenix/src/components/color_swatches/color_swatches.js.map +1 -1
  7. package/build/cjs/packages/phoenix/src/components/color_swatches/color_swatches_constants.js +0 -2
  8. package/build/cjs/packages/phoenix/src/components/color_swatches/color_swatches_constants.js.map +1 -1
  9. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown.js +114 -37
  10. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown.js.map +1 -1
  11. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_close.js +4 -4
  12. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_content.js +12 -9
  13. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_content.js.map +1 -1
  14. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_toggler.js +13 -24
  15. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_toggler.js.map +1 -1
  16. package/build/cjs/packages/phoenix/src/components/form/select/select.js +3 -4
  17. package/build/cjs/packages/phoenix/src/components/form/select/select.js.map +1 -1
  18. package/build/cjs/packages/phoenix/src/components/messages/base_message.js +16 -47
  19. package/build/cjs/packages/phoenix/src/components/messages/base_message.js.map +1 -1
  20. package/build/cjs/packages/phoenix/src/components/messages/base_message_constants.js +0 -2
  21. package/build/cjs/packages/phoenix/src/components/messages/base_message_constants.js.map +1 -1
  22. package/build/cjs/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.js +13 -2
  23. package/build/cjs/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.js.map +1 -1
  24. package/build/cjs/packages/phoenix/src/index.js +5 -5
  25. package/build/esm/packages/phoenix/src/components/color_swatches/color_item/color_item.d.ts +3 -6
  26. package/build/esm/packages/phoenix/src/components/color_swatches/color_item/color_item.js +22 -30
  27. package/build/esm/packages/phoenix/src/components/color_swatches/color_item/color_item.js.map +1 -1
  28. package/build/esm/packages/phoenix/src/components/color_swatches/color_item/color_item_constants.js +1 -4
  29. package/build/esm/packages/phoenix/src/components/color_swatches/color_item/color_item_constants.js.map +1 -1
  30. package/build/esm/packages/phoenix/src/components/color_swatches/color_swatches.d.ts +11 -1
  31. package/build/esm/packages/phoenix/src/components/color_swatches/color_swatches.js +124 -14
  32. package/build/esm/packages/phoenix/src/components/color_swatches/color_swatches.js.map +1 -1
  33. package/build/esm/packages/phoenix/src/components/color_swatches/color_swatches_constants.js +1 -2
  34. package/build/esm/packages/phoenix/src/components/color_swatches/color_swatches_constants.js.map +1 -1
  35. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.d.ts +13 -4
  36. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js +115 -38
  37. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js.map +1 -1
  38. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_close.js +4 -4
  39. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_content.d.ts +1 -2
  40. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_content.js +12 -9
  41. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_content.js.map +1 -1
  42. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_toggler.d.ts +1 -2
  43. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_toggler.js +14 -25
  44. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_toggler.js.map +1 -1
  45. package/build/esm/packages/phoenix/src/components/form/select/select.js +3 -4
  46. package/build/esm/packages/phoenix/src/components/form/select/select.js.map +1 -1
  47. package/build/esm/packages/phoenix/src/components/messages/base_message.d.ts +2 -3
  48. package/build/esm/packages/phoenix/src/components/messages/base_message.js +18 -49
  49. package/build/esm/packages/phoenix/src/components/messages/base_message.js.map +1 -1
  50. package/build/esm/packages/phoenix/src/components/messages/base_message_constants.js +3 -4
  51. package/build/esm/packages/phoenix/src/components/messages/base_message_constants.js.map +1 -1
  52. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.d.ts +2 -1
  53. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.js +13 -2
  54. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.js.map +1 -1
  55. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller_types.d.ts +1 -0
  56. package/build/esm/packages/phoenix/src/index.js +1 -1
  57. package/package.json +1 -1
@@ -1,12 +1,13 @@
1
1
  import { __decorate, __metadata } from '../../../../../external/tslib/tslib.es6.js';
2
2
  import { html, nothing } from 'lit';
3
3
  import { property } from 'lit/decorators';
4
- import { ArrayUtils } from '@dreamcommerce/utilities';
4
+ import { UiDomUtils, ArrayUtils } from '@dreamcommerce/utilities';
5
5
  import { PhoenixLightLitElement } from '../../core/phoenix_light_lit_element/phoenix_light_lit_element.js';
6
6
  import { phoenixCustomElement } from '../../core/decorators/phoenix_custom_element.js';
7
+ import { KeystrokesController } from '../../controllers/keystrokes_controller/keystrokes_controller.js';
7
8
  import 'lit-html';
8
- import { COLOR_SWATCHES_EVENT_NAMES, COLOR_ITEM_TAG_NAME, COLOR_SWATCHES_CSS_CLASSES, COLOR_SWATCHES_TAG_NAME, COLOR_SWATCHES_HIDDEN_ATTRIBUTE } from './color_swatches_constants.js';
9
- import { COLOR_ITEM_EVENT_NAMES, COLOR_ITEM_SELECTED_ATTRIBUTE } from './color_item/color_item_constants.js';
9
+ import { COLOR_SWATCHES_EVENT_NAMES, COLOR_ITEM_TAG_NAME, COLOR_SWATCHES_CSS_CLASSES, COLOR_SWATCHES_HIDDEN_ATTRIBUTE } from './color_swatches_constants.js';
10
+ import { COLOR_ITEM_SELECTED_ATTRIBUTE } from './color_item/color_item_constants.js';
10
11
 
11
12
  let HColorSwatches = class HColorSwatches extends PhoenixLightLitElement {
12
13
  constructor() {
@@ -14,8 +15,87 @@ let HColorSwatches = class HColorSwatches extends PhoenixLightLitElement {
14
15
  this.multiple = false;
15
16
  this.selectedColors = [];
16
17
  this.showMoreBtnText = 'Pokaż wszystkie kolory';
17
- this._handleColorClicked = ({ target }) => {
18
- const $colorItem = target;
18
+ this._setupEvents = () => {
19
+ if (this.getAttribute('role') === 'group') {
20
+ this._setupCheckboxGroupEvents();
21
+ }
22
+ else {
23
+ this._setupRadioGroupEvents();
24
+ }
25
+ };
26
+ this._setupCheckboxGroupEvents = () => {
27
+ this._setupColorClickEvents();
28
+ };
29
+ this._setupRadioGroupEvents = () => {
30
+ document.body.addEventListener('keydown', this._focusOnSelectedColor);
31
+ this.addEventListener('keydown', this._handleTabNavigation);
32
+ this.addEventListener('keyup', this._handleRadioNavigation);
33
+ this._setupColorClickEvents();
34
+ };
35
+ this._setupColorClickEvents = () => {
36
+ if (!this._$colorSwatchesChildren)
37
+ return;
38
+ this._$colorSwatchesChildren.forEach(($colorItem) => {
39
+ $colorItem.addEventListener('click', this._handleColorClicked);
40
+ new KeystrokesController({
41
+ host: this,
42
+ keys: [' '],
43
+ callback: this._handleColorClicked,
44
+ target: $colorItem
45
+ });
46
+ });
47
+ };
48
+ this._handleColorClicked = (ev) => {
49
+ ev.preventDefault();
50
+ const $colorItem = ev.target;
51
+ if ($colorItem.unclickable)
52
+ return;
53
+ this._toggleColorItem($colorItem);
54
+ this._dispatchColorChangeEvent($colorItem);
55
+ };
56
+ this._handleTabNavigation = (ev) => {
57
+ if (ev.key !== 'Tab')
58
+ return;
59
+ ev.preventDefault();
60
+ if (ev.shiftKey) {
61
+ const $firstFocusableColor = UiDomUtils.getFocusableElement(this);
62
+ UiDomUtils.getPreviousFocusableElement($firstFocusableColor).focus();
63
+ return;
64
+ }
65
+ const $LastFocusableColor = UiDomUtils.getLastFocusableElement(this);
66
+ UiDomUtils.getNextFocusableElement($LastFocusableColor).focus();
67
+ };
68
+ this._handleRadioNavigation = (ev) => {
69
+ const changeToNextKeys = ['ArrowDown', 'ArrowRight'];
70
+ const changeToPreviousKeys = ['ArrowUp', 'ArrowLeft'];
71
+ if (!changeToNextKeys.includes(ev.key) && !changeToPreviousKeys.includes(ev.key))
72
+ return;
73
+ ev.preventDefault();
74
+ if (changeToNextKeys.includes(ev.key)) {
75
+ this._handleChangeToNextColorItem(ev);
76
+ }
77
+ if (changeToPreviousKeys.includes(ev.key)) {
78
+ this._handleChangeToPreviousColorItem(ev);
79
+ }
80
+ };
81
+ this._focusOnSelectedColor = (ev) => {
82
+ if (ev.key !== 'Tab' || this.multiple)
83
+ return;
84
+ if (ev.shiftKey) {
85
+ const $previousFocusableElement = UiDomUtils.getPreviousFocusableElement(document.activeElement);
86
+ if (this.contains($previousFocusableElement) && this.selectedColors.length > 0) {
87
+ ev.preventDefault();
88
+ this.selectedColors[0].focus();
89
+ }
90
+ return;
91
+ }
92
+ const $nextFocusableElement = UiDomUtils.getNextFocusableElement(document.activeElement);
93
+ if (this.contains($nextFocusableElement) && this.selectedColors.length > 0) {
94
+ ev.preventDefault();
95
+ this.selectedColors[0].focus();
96
+ }
97
+ };
98
+ this._handleColorChange = ($colorItem) => {
19
99
  this._toggleColorItem($colorItem);
20
100
  this._dispatchColorChangeEvent($colorItem);
21
101
  };
@@ -52,6 +132,8 @@ let HColorSwatches = class HColorSwatches extends PhoenixLightLitElement {
52
132
  }
53
133
  connectedCallback() {
54
134
  super.connectedCallback();
135
+ this.setAttribute('role', this.multiple ? 'group' : 'radiogroup');
136
+ this._$colorSwatchesChildren = [...this.children];
55
137
  this._setupEvents();
56
138
  this._addCssClasses();
57
139
  this.numberOfVisibleColors && this._hideItems(this.numberOfVisibleColors);
@@ -64,11 +146,9 @@ let HColorSwatches = class HColorSwatches extends PhoenixLightLitElement {
64
146
  this.classList.add(COLOR_SWATCHES_CSS_CLASSES.colorSwatches);
65
147
  }
66
148
  _hideItems(numberOfVisibleColors) {
67
- var _a;
68
- this._$colorSwatchesChildren = (_a = document.querySelector(COLOR_SWATCHES_TAG_NAME)) === null || _a === void 0 ? void 0 : _a.children;
69
149
  if (!this._$colorSwatchesChildren)
70
150
  return;
71
- Array.from(this._$colorSwatchesChildren).forEach(($colorSwatchesChild, index) => {
151
+ this._$colorSwatchesChildren.forEach(($colorSwatchesChild, index) => {
72
152
  if (index > numberOfVisibleColors - 1) {
73
153
  $colorSwatchesChild.setAttribute(COLOR_SWATCHES_HIDDEN_ATTRIBUTE, '');
74
154
  }
@@ -79,17 +159,40 @@ let HColorSwatches = class HColorSwatches extends PhoenixLightLitElement {
79
159
  var _a;
80
160
  if (!this._$colorSwatchesChildren)
81
161
  return;
82
- Array.from(this._$colorSwatchesChildren).forEach(($colorSwatchesChild) => {
162
+ this._$colorSwatchesChildren.forEach(($colorSwatchesChild) => {
83
163
  $colorSwatchesChild.removeAttribute(COLOR_SWATCHES_HIDDEN_ATTRIBUTE);
84
164
  });
85
165
  (_a = this.querySelector('h-color-swatches-show-more')) === null || _a === void 0 ? void 0 : _a.setAttribute(COLOR_SWATCHES_HIDDEN_ATTRIBUTE, '');
86
166
  });
87
167
  }
88
- _setupEvents() {
89
- this.addEventListener(COLOR_ITEM_EVENT_NAMES.selected, this._handleColorClicked);
168
+ _handleChangeToNextColorItem({ target }) {
169
+ const $colorItem = target;
170
+ const $nextFocusableElement = UiDomUtils.getNextFocusableElement($colorItem);
171
+ let $nextColorItem;
172
+ if (!this.contains($nextFocusableElement)) {
173
+ $nextColorItem = UiDomUtils.getFocusableElement(this);
174
+ }
175
+ else {
176
+ $nextColorItem = $nextFocusableElement;
177
+ }
178
+ $nextColorItem.focus();
179
+ this._handleColorChange($nextColorItem);
180
+ }
181
+ _handleChangeToPreviousColorItem({ target }) {
182
+ const $colorItem = target;
183
+ const $previousFocusableElement = UiDomUtils.getPreviousFocusableElement($colorItem);
184
+ let $previousColorItem;
185
+ if (!this.contains($previousFocusableElement)) {
186
+ $previousColorItem = UiDomUtils.getLastFocusableElement(this);
187
+ }
188
+ else {
189
+ $previousColorItem = $previousFocusableElement;
190
+ }
191
+ $previousColorItem.focus();
192
+ this._handleColorChange($previousColorItem);
90
193
  }
91
194
  _toggleColorItem($colorItem) {
92
- this.multiple ? this._handleColorClickedForMultipleMode($colorItem) : this._handleColorClickedForSingleMode($colorItem);
195
+ this.multiple ? this._handleColorClickedForMultipleMode($colorItem) : this._handleColorChangeForSingleMode($colorItem);
93
196
  }
94
197
  _handleColorClickedForMultipleMode($colorItem) {
95
198
  !this._isColorAlreadyExistInArray($colorItem)
@@ -97,17 +200,20 @@ let HColorSwatches = class HColorSwatches extends PhoenixLightLitElement {
97
200
  : this._removeExistingColorFromArray($colorItem);
98
201
  this._toggleSelectedAttribute($colorItem);
99
202
  }
100
- _handleColorClickedForSingleMode($colorItem) {
203
+ _handleColorChangeForSingleMode($colorItem) {
101
204
  const $previouslySelected = this.selectedColors[0];
102
205
  this._toggleSelectedAttribute($colorItem);
103
- if ($previouslySelected && $previouslySelected !== $colorItem)
206
+ if ($previouslySelected && $previouslySelected !== $colorItem) {
104
207
  $previouslySelected.removeAttribute(COLOR_ITEM_SELECTED_ATTRIBUTE);
208
+ $previouslySelected.setAttribute('aria-checked', 'false');
209
+ }
105
210
  this.selectedColors = $previouslySelected === $colorItem ? [] : [$colorItem];
106
211
  }
107
212
  _toggleSelectedAttribute($colorItem) {
108
213
  $colorItem.hasAttribute(COLOR_ITEM_SELECTED_ATTRIBUTE)
109
214
  ? $colorItem.removeAttribute(COLOR_ITEM_SELECTED_ATTRIBUTE)
110
215
  : $colorItem.setAttribute(COLOR_ITEM_SELECTED_ATTRIBUTE, '');
216
+ $colorItem.setAttribute('aria-checked', 'true');
111
217
  }
112
218
  _isColorAlreadyExistInArray($colorItem) {
113
219
  return this.selectedColors.includes($colorItem);
@@ -116,6 +222,10 @@ let HColorSwatches = class HColorSwatches extends PhoenixLightLitElement {
116
222
  const indexOfAlreadyExistingColor = this.selectedColors.indexOf($colorItem);
117
223
  this.selectedColors.splice(indexOfAlreadyExistingColor, 1);
118
224
  }
225
+ disconnectedCallback() {
226
+ super.disconnectedCallback();
227
+ document.body.removeEventListener('keydown', this._focusOnSelectedColor);
228
+ }
119
229
  render() {
120
230
  return html `
121
231
  ${this.getSlot('default')}
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,uCAAuC,4CAAgD;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,uCAAuC,4CAAgD;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -1,5 +1,4 @@
1
1
  const colorSwatchesBaseCssClass = 'color-swatches';
2
- const COLOR_SWATCHES_TAG_NAME = 'h-color-swatches';
3
2
  const COLOR_ITEM_TAG_NAME = 'h-color-item';
4
3
  const COLOR_SWATCHES_CSS_CLASSES = {
5
4
  colorSwatches: colorSwatchesBaseCssClass,
@@ -12,5 +11,5 @@ const COLOR_SWATCHES_EVENT_NAMES = {
12
11
  };
13
12
  const COLOR_SWATCHES_HIDDEN_ATTRIBUTE = 'hidden';
14
13
 
15
- export { COLOR_ITEM_TAG_NAME, COLOR_SWATCHES_CSS_CLASSES, COLOR_SWATCHES_EVENT_NAMES, COLOR_SWATCHES_HIDDEN_ATTRIBUTE, COLOR_SWATCHES_TAG_NAME };
14
+ export { COLOR_ITEM_TAG_NAME, COLOR_SWATCHES_CSS_CLASSES, COLOR_SWATCHES_EVENT_NAMES, COLOR_SWATCHES_HIDDEN_ATTRIBUTE };
16
15
  //# sourceMappingURL=color_swatches_constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -15,6 +15,8 @@ export declare class HDropdown extends PhoenixLightLitElement implements IDropdo
15
15
  contentWidth: TDropdownContentWidth;
16
16
  portalTarget: string;
17
17
  mobilePosition: TMobileElementPosition;
18
+ id: string;
19
+ preventFocusTrap: boolean;
18
20
  $dropdownToggler: HDropdownToggler | null;
19
21
  $dropdownContent: HDropdownContent | null;
20
22
  $nestedDropdownContentElements?: HDropdownContent[];
@@ -40,12 +42,19 @@ export declare class HDropdown extends PhoenixLightLitElement implements IDropdo
40
42
  private _observeScrollToggling;
41
43
  private _toggleScroll;
42
44
  private _closeDropdownOnEscape;
43
- private _handleForwardFocus;
44
- private _handleFocusOnNextElement;
45
- private _focusOnNextElementAfterToggler;
46
- private _handleBackwardFocus;
45
+ private _keepFocusWithinDropdownForwards;
46
+ private _handleFocusOnNextElementAfterDropdown;
47
+ private _handleFocusFromTogglerForwards;
48
+ private _handleFocusFromSentinelEndForwards;
49
+ private _keepFocusWithinDropdownBackwards;
50
+ private _handleDefaultFocusFromDropdownBackwards;
51
+ private _handleFocusFromTogglerBackwards;
52
+ private _handleFocusFromSentinelStartBackwards;
53
+ private _getTrulyFocusableElements;
54
+ private _isElementTrulyFocusable;
47
55
  private _hoverToggle;
48
56
  private _isHoveredWithinDropdown;
57
+ private _focusOnFirstContentElement;
49
58
  private _setupInitialDropdownProperties;
50
59
  isOpened: () => boolean;
51
60
  private _positionDropdownContent;
@@ -6,8 +6,9 @@ import { property } from '@lit/reactive-element/decorators.js';
6
6
  import { KeystrokesController } from '../../controllers/keystrokes_controller/keystrokes_controller.js';
7
7
  import { html } from 'lit-html';
8
8
  import { BREAKPOINTS, SCROLLABLE_CLASS_NAME } from '../../global_constants.js';
9
- import { DEFAULT_DROPDOWN_PORTAL_NAME, DROPDOWN_CONTENT_CSS_CLASSES, DROPDOWN_EVENTS, DROPDOWN_CONTAINER_NAME, DROPDOWN_CONTENT_NAME, DROPDOWN_CONTENT_WIDTH, DROPDOWN_TOGGLER_NAME } from './dropdown_constants.js';
9
+ import { DEFAULT_DROPDOWN_PORTAL_NAME, DROPDOWN_CONTENT_CSS_CLASSES, DROPDOWN_EVENTS, DROPDOWN_CONTAINER_NAME, DROPDOWN_CONTENT_WIDTH, DROPDOWN_CONTENT_NAME, DROPDOWN_TOGGLER_NAME } from './dropdown_constants.js';
10
10
  import { RELATIVE_POSITION_CONTROLLER_EVENTS, DEFAULT_THROTTLE_WAIT_TIME } from '../../controllers/relative_position_controller/relative_position_controller_constants.js';
11
+ import v4 from '../../../../../external/uuid/dist/esm-browser/v4.js';
11
12
  import { PORTAL_TARGET_COMPONENT_NAME, PORTAL_TARGET_NAME_PROP } from '../portal/portal_constants.js';
12
13
  import { BackdropController } from '../backdrop/controller/backdrop_controller.js';
13
14
  import { ClickOutsideController } from '../../controllers/click_outside_controller/click_outside_controller.js';
@@ -25,6 +26,8 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
25
26
  this.transition = 'direction';
26
27
  this.offset = 0;
27
28
  this.portalTarget = DEFAULT_DROPDOWN_PORTAL_NAME;
29
+ this.id = v4();
30
+ this.preventFocusTrap = false;
28
31
  this._backdropController = new BackdropController();
29
32
  this._handleClickOutside = async (target) => {
30
33
  var _a, _b;
@@ -41,7 +44,7 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
41
44
  return;
42
45
  }
43
46
  await this.show();
44
- UiDomUtils.setFocusToFirstFocusableElementInContainer(this.$dropdownContent);
47
+ this._focusOnFirstContentElement();
45
48
  };
46
49
  this.show = async () => {
47
50
  if (this.opened)
@@ -132,44 +135,32 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
132
135
  return;
133
136
  await this.hide();
134
137
  };
135
- this._handleForwardFocus = async (ev) => {
136
- // if (!this.opened) this._handleFocusOnNextElement(ev);
137
- if (!this.opened || ev.shiftKey)
138
+ this._keepFocusWithinDropdownForwards = (ev) => {
139
+ var _a, _b;
140
+ if (ev.shiftKey === true || !this.$dropdownContent || !this.opened)
138
141
  return;
139
- const $focusableElementsWithinDropdownContent = UiDomUtils.getFocusableElements(this.$dropdownContent).filter((element) => element.closest(DROPDOWN_CONTENT_NAME) === this.$dropdownContent);
140
- const doesNotHaveFocusableElementsInsideContent = $focusableElementsWithinDropdownContent.length <= 0 && this.opened;
141
- const indexOfCurrentlyFocusedElement = $focusableElementsWithinDropdownContent.indexOf(document.activeElement);
142
- const isActiveElementLastFocusableElement = indexOfCurrentlyFocusedElement === $focusableElementsWithinDropdownContent.length - 1;
143
- if (doesNotHaveFocusableElementsInsideContent || isActiveElementLastFocusableElement)
144
- this._handleFocusOnNextElement(ev);
145
- };
146
- this._handleFocusOnNextElement = async (ev) => {
147
- var _a;
148
- ev.preventDefault();
149
- const $focusableElements = UiDomUtils.getFocusableElements(document.body);
150
- const indexOfDropdownToggler = $focusableElements.indexOf(this.$dropdownToggler);
151
- const $nextElementToFocus = (_a = $focusableElements[indexOfDropdownToggler + 1]) !== null && _a !== void 0 ? _a : $focusableElements[0];
152
- await this._hideDropdownsSequentially();
153
- await this.hide();
154
- this._focusOnNextElementAfterToggler($nextElementToFocus);
155
- };
156
- this._focusOnNextElementAfterToggler = ($elementToFocus) => {
157
- var _a;
158
- const isTogglerLastChildOfPreviousDropdown = ($elementToFocus === null || $elementToFocus === void 0 ? void 0 : $elementToFocus.closest(DROPDOWN_CONTENT_NAME)) === this.$dropdownContent;
159
- if (isTogglerLastChildOfPreviousDropdown) {
160
- (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
142
+ const $target = ev.target;
143
+ if (((_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.contains($target)) && this.preventFocusTrap) {
144
+ this._handleFocusOnNextElementAfterDropdown(ev);
145
+ return;
146
+ }
147
+ if ((_b = this.$dropdownToggler) === null || _b === void 0 ? void 0 : _b.contains($target)) {
148
+ this._handleFocusFromTogglerForwards(ev);
161
149
  return;
162
150
  }
163
- $elementToFocus === null || $elementToFocus === void 0 ? void 0 : $elementToFocus.focus();
151
+ this._handleFocusFromSentinelEndForwards(ev, $target);
164
152
  };
165
- this._handleBackwardFocus = async (ev) => {
166
- var _a;
167
- const $firstFocusableElement = this.$dropdownContent && UiDomUtils.getFocusableElement(this.$dropdownContent);
168
- if (document.activeElement !== $firstFocusableElement)
153
+ this._keepFocusWithinDropdownBackwards = (ev) => {
154
+ if (!this.opened || !this.$dropdownContent)
169
155
  return;
170
- ev.preventDefault();
171
- (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
172
- await this._hideDropdownsSequentially();
156
+ const $target = ev.target;
157
+ if (this.preventFocusTrap) {
158
+ this._handleDefaultFocusFromDropdownBackwards(ev);
159
+ }
160
+ else {
161
+ this._handleFocusFromTogglerBackwards(ev, $target);
162
+ this._handleFocusFromSentinelStartBackwards(ev, $target);
163
+ }
173
164
  };
174
165
  this._hoverToggle = async (ev) => {
175
166
  if (window.innerWidth < BREAKPOINTS.xs)
@@ -181,12 +172,19 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
181
172
  const isHoveredWithinDropdown = this._isHoveredWithinDropdown(ev.target);
182
173
  if (isHoveredWithinDropdown && !this.opened) {
183
174
  await this.show();
184
- UiDomUtils.setFocusToFirstFocusableElementInContainer(this.$dropdownContent);
175
+ this._focusOnFirstContentElement();
185
176
  return;
186
177
  }
187
178
  if (!isHoveredWithinDropdown && this.opened)
188
179
  await this._hideDropdownsSequentially();
189
180
  };
181
+ this._focusOnFirstContentElement = () => {
182
+ if (!this.$dropdownContent)
183
+ return;
184
+ const $firstFocusableElement = this._getTrulyFocusableElements(this.$dropdownContent)[0];
185
+ if ($firstFocusableElement)
186
+ $firstFocusableElement.focus();
187
+ };
190
188
  this.isOpened = () => this.opened;
191
189
  this._positionDropdownContent = () => {
192
190
  if (this.contentWidth === DROPDOWN_CONTENT_WIDTH.full)
@@ -212,13 +210,14 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
212
210
  host: this,
213
211
  target: document.body,
214
212
  keys: ['tab'],
215
- callback: this._handleForwardFocus
213
+ callback: this._keepFocusWithinDropdownForwards
216
214
  });
217
215
  new KeystrokesController({
218
216
  host: this,
219
217
  target: document.body,
220
218
  keys: [['shift', 'tab']],
221
- callback: this._handleBackwardFocus
219
+ callback: this._keepFocusWithinDropdownBackwards,
220
+ containerSelectors: ['h-dropdown', 'h-dropdown-content']
222
221
  });
223
222
  }
224
223
  async connectedCallback() {
@@ -294,6 +293,74 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
294
293
  (_b = this.$dropdownContent) === null || _b === void 0 ? void 0 : _b.classList.add(SCROLLABLE_CLASS_NAME);
295
294
  }
296
295
  }
296
+ _handleFocusOnNextElementAfterDropdown(ev) {
297
+ ev.preventDefault();
298
+ this.hide();
299
+ UiDomUtils.getNextFocusableElement(this.$dropdownToggler || this).focus();
300
+ return;
301
+ }
302
+ _handleFocusFromTogglerForwards(ev) {
303
+ if (!this.$dropdownContent)
304
+ return;
305
+ const trulyFocusableElements = this._getTrulyFocusableElements(this.$dropdownContent);
306
+ if (trulyFocusableElements.length === 0)
307
+ return;
308
+ ev.preventDefault();
309
+ trulyFocusableElements[0].focus();
310
+ }
311
+ _handleFocusFromSentinelEndForwards(ev, $target) {
312
+ var _a;
313
+ if (!this.$dropdownContent)
314
+ return;
315
+ const trulyFocusableElements = this._getTrulyFocusableElements(this.$dropdownContent);
316
+ const $lastFocusableElement = trulyFocusableElements.slice(-1)[0];
317
+ if ($target !== $lastFocusableElement)
318
+ return;
319
+ ev.preventDefault();
320
+ (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
321
+ }
322
+ _handleDefaultFocusFromDropdownBackwards(ev) {
323
+ ev.preventDefault();
324
+ this.hide();
325
+ UiDomUtils.getPreviousFocusableElement(this.$dropdownToggler || this).focus();
326
+ }
327
+ _handleFocusFromTogglerBackwards(ev, $target) {
328
+ var _a;
329
+ if ($target !== this.$dropdownToggler && !((_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.contains($target)) || !this.$dropdownContent)
330
+ return;
331
+ ev.preventDefault();
332
+ const trulyFocusableElements = this._getTrulyFocusableElements(this.$dropdownContent);
333
+ if (trulyFocusableElements.length === 0)
334
+ return;
335
+ const $lastFocusableElement = trulyFocusableElements.slice(-1)[0];
336
+ $lastFocusableElement.focus();
337
+ }
338
+ _handleFocusFromSentinelStartBackwards(ev, $target) {
339
+ var _a;
340
+ if (!this.$dropdownContent)
341
+ return;
342
+ const $firstFocusableElement = this._getTrulyFocusableElements(this.$dropdownContent)[0];
343
+ if ($target !== $firstFocusableElement)
344
+ return;
345
+ ev.preventDefault();
346
+ (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
347
+ }
348
+ _getTrulyFocusableElements($container) {
349
+ const focusableElements = UiDomUtils.getFocusableElements($container);
350
+ return focusableElements.filter(($el) => this._isElementTrulyFocusable($el));
351
+ }
352
+ _isElementTrulyFocusable($el) {
353
+ const style = window.getComputedStyle($el);
354
+ if (style.display === 'none' || style.visibility === 'hidden') {
355
+ return false;
356
+ }
357
+ if ($el.nodeName === 'H-PORTAL')
358
+ return true;
359
+ const $parent = $el.parentElement;
360
+ if (!$parent)
361
+ return true;
362
+ return this._isElementTrulyFocusable($parent);
363
+ }
297
364
  _isHoveredWithinDropdown(element) {
298
365
  var _a;
299
366
  if (element === this)
@@ -317,6 +384,8 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
317
384
  return;
318
385
  if (!this._hasScrollableClassInitially)
319
386
  this._hasScrollableClassInitially = this.$dropdownContent.classList.contains(SCROLLABLE_CLASS_NAME);
387
+ if (!this.preventFocusTrap)
388
+ this.$dropdownContent.setAttribute('aria-modal', 'true');
320
389
  }
321
390
  _getDropdownContentWidth() {
322
391
  const isMobileResolution = document.documentElement.clientWidth < BREAKPOINTS.xs;
@@ -385,6 +454,14 @@ __decorate([
385
454
  property({ type: String, attribute: 'mobile-position' }),
386
455
  __metadata("design:type", String)
387
456
  ], HDropdown.prototype, "mobilePosition", void 0);
457
+ __decorate([
458
+ property({ type: String, attribute: 'id', reflect: true }),
459
+ __metadata("design:type", Object)
460
+ ], HDropdown.prototype, "id", void 0);
461
+ __decorate([
462
+ property({ type: Boolean, attribute: 'prevent-focus-trap' }),
463
+ __metadata("design:type", Object)
464
+ ], HDropdown.prototype, "preventFocusTrap", void 0);
388
465
  HDropdown = HDropdown_1 = __decorate([
389
466
  phoenixCustomElement('h-dropdown'),
390
467
  __metadata("design:paramtypes", [])
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,uCAAuC,4CAAgD;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,4CAAgD;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,uCAAuC,4CAAgD;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qDAAyD;AACxE;AACA;AACA;AACA,uBAAuB,4CAAgD;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -9,6 +9,10 @@ let HDropdownClose = class HDropdownClose extends PhoenixLightLitElement {
9
9
  constructor() {
10
10
  super();
11
11
  this.name = '';
12
+ this._closeDropdown = () => {
13
+ const dropdown = document.querySelector(`h-dropdown[name="${this.name}"]`);
14
+ dropdown === null || dropdown === void 0 ? void 0 : dropdown.hide();
15
+ };
12
16
  this.className = `${DROPDOWN_CSS_CLASSES.close} ${this.className}`;
13
17
  }
14
18
  connectedCallback() {
@@ -16,10 +20,6 @@ let HDropdownClose = class HDropdownClose extends PhoenixLightLitElement {
16
20
  this._btnController = new BtnController(this, this._closeDropdown);
17
21
  this.addEventListener('click', this._closeDropdown);
18
22
  }
19
- async _closeDropdown() {
20
- const dropdown = document.querySelector(`h-dropdown[name="${this.name}"]`);
21
- await (dropdown === null || dropdown === void 0 ? void 0 : dropdown.hide());
22
- }
23
23
  };
24
24
  __decorate([
25
25
  property({ type: String }),
@@ -1,8 +1,7 @@
1
- import { TemplateResult } from 'lit';
2
1
  import { PhoenixLightLitElement } from "../../core/phoenix_light_lit_element/phoenix_light_lit_element";
3
2
  export declare class HDropdownContent extends PhoenixLightLitElement {
4
3
  name: string;
5
4
  constructor();
6
5
  connectedCallback(): void;
7
- protected render(): TemplateResult;
6
+ private _setupRole;
8
7
  }
@@ -1,6 +1,6 @@
1
1
  import { __decorate, __metadata } from '../../../../../external/tslib/tslib.es6.js';
2
- import { html } from 'lit';
3
2
  import { property } from 'lit/decorators';
3
+ import { UiDomUtils } from '@dreamcommerce/utilities';
4
4
  import { PhoenixLightLitElement } from '../../core/phoenix_light_lit_element/phoenix_light_lit_element.js';
5
5
  import { phoenixCustomElement } from '../../core/decorators/phoenix_custom_element.js';
6
6
  import { DROPDOWN_CSS_CLASSES } from './dropdown_constants.js';
@@ -9,19 +9,22 @@ let HDropdownContent = class HDropdownContent extends PhoenixLightLitElement {
9
9
  constructor() {
10
10
  super();
11
11
  this.name = '';
12
+ this._setupRole = () => {
13
+ const $focusableElements = UiDomUtils.getFocusableElements(this);
14
+ const role = $focusableElements.length < 2 ? 'dialog' : 'menu';
15
+ this.setAttribute('role', role);
16
+ if (role === 'menu') {
17
+ Array.from(this.children).forEach((element) => {
18
+ element.setAttribute('role', 'menuitem');
19
+ });
20
+ }
21
+ };
12
22
  this.slot = this.hasAttribute('slot') ? this.slot : 'content';
13
23
  }
14
24
  connectedCallback() {
15
25
  super.connectedCallback();
16
26
  this.classList.add(DROPDOWN_CSS_CLASSES.content);
17
- this.setAttribute('role', 'menu');
18
- Array.from(this.children).forEach((element) => {
19
- element.setAttribute('role', 'menuitem');
20
- });
21
- }
22
- render() {
23
- super.render();
24
- return html ` <div role="dialog">${this.getSlot('content')}</div> `;
27
+ this._setupRole();
25
28
  }
26
29
  };
27
30
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,uCAAuC,4CAAgD;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,uCAAuC,4CAAgD;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -6,9 +6,8 @@ export declare class HDropdownToggler extends PhoenixLightLitElement {
6
6
  private _$dropdown;
7
7
  constructor();
8
8
  connectedCallback(): void;
9
+ private _setupTogglerAria;
9
10
  private _dispatchToggleDropdownEventWithKeyboard;
10
11
  private _dispatchToggleDropdownEventOnMobile;
11
12
  private _dispatchToggleDropdownEvent;
12
- private _handleFocusToOpenedDropdown;
13
- disconnectedCallback(): void;
14
13
  }