@shoper/phoenix_design_system 1.18.23-0 → 1.18.23-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 (37) hide show
  1. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown.js +14 -77
  2. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown.js.map +1 -1
  3. package/build/cjs/packages/phoenix/src/components/form/search/search.js +27 -0
  4. package/build/cjs/packages/phoenix/src/components/form/search/search.js.map +1 -1
  5. package/build/cjs/packages/phoenix/src/components/modal/modal.js +13 -59
  6. package/build/cjs/packages/phoenix/src/components/modal/modal.js.map +1 -1
  7. package/build/cjs/packages/phoenix/src/components/modal/modal_constants.js +1 -3
  8. package/build/cjs/packages/phoenix/src/components/modal/modal_constants.js.map +1 -1
  9. package/build/cjs/packages/phoenix/src/components/sheet/sheet.js +9 -55
  10. package/build/cjs/packages/phoenix/src/components/sheet/sheet.js.map +1 -1
  11. package/build/cjs/packages/phoenix/src/components/sheet/sheet_constants.js +1 -3
  12. package/build/cjs/packages/phoenix/src/components/sheet/sheet_constants.js.map +1 -1
  13. package/build/cjs/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.js +200 -0
  14. package/build/cjs/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.js.map +1 -0
  15. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.d.ts +1 -6
  16. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js +14 -77
  17. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js.map +1 -1
  18. package/build/esm/packages/phoenix/src/components/form/search/search.d.ts +4 -0
  19. package/build/esm/packages/phoenix/src/components/form/search/search.js +27 -0
  20. package/build/esm/packages/phoenix/src/components/form/search/search.js.map +1 -1
  21. package/build/esm/packages/phoenix/src/components/modal/modal.d.ts +1 -5
  22. package/build/esm/packages/phoenix/src/components/modal/modal.js +15 -61
  23. package/build/esm/packages/phoenix/src/components/modal/modal.js.map +1 -1
  24. package/build/esm/packages/phoenix/src/components/modal/modal_constants.js +2 -3
  25. package/build/esm/packages/phoenix/src/components/modal/modal_constants.js.map +1 -1
  26. package/build/esm/packages/phoenix/src/components/sheet/sheet.d.ts +1 -5
  27. package/build/esm/packages/phoenix/src/components/sheet/sheet.js +11 -57
  28. package/build/esm/packages/phoenix/src/components/sheet/sheet.js.map +1 -1
  29. package/build/esm/packages/phoenix/src/components/sheet/sheet_constants.js +2 -3
  30. package/build/esm/packages/phoenix/src/components/sheet/sheet_constants.js.map +1 -1
  31. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.d.ts +24 -0
  32. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.js +196 -0
  33. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.js.map +1 -0
  34. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller_types.d.ts +14 -0
  35. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller_types.js +2 -0
  36. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller_types.js.map +1 -0
  37. package/package.json +1 -1
@@ -16,6 +16,7 @@ var v4 = require('../../../../../external/uuid/dist/esm-browser/v4.js');
16
16
  var portal_constants = require('../portal/portal_constants.js');
17
17
  var backdrop_controller = require('../backdrop/controller/backdrop_controller.js');
18
18
  var click_outside_controller = require('../../controllers/click_outside_controller/click_outside_controller.js');
19
+ var focus_trap_controller = require('../../controllers/focus_trap_controller/focus_trap_controller.js');
19
20
  var throttle = require('../../../../../external/lodash/throttle.js');
20
21
  var relative_position_controller = require('../../controllers/relative_position_controller/relative_position_controller.js');
21
22
 
@@ -34,6 +35,11 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
34
35
  this.preventFocusTrap = false;
35
36
  this.noAutoFocus = false;
36
37
  this._backdropController = new backdrop_controller.BackdropController();
38
+ this._focusTrapController = new focus_trap_controller.FocusTrapController({
39
+ host: this,
40
+ getContainer: () => { var _a; return (_a = this.$dropdownContent) !== null && _a !== void 0 ? _a : undefined; },
41
+ getToggler: () => this.$dropdownToggler
42
+ });
37
43
  this._handleClickOutside = async (target) => {
38
44
  var _a, _b;
39
45
  if (!this.opened)
@@ -71,6 +77,8 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
71
77
  this._dispatchShowDropdownEvent();
72
78
  (_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.classList.remove(`${dropdown_constants.DROPDOWN_CONTENT_CSS_CLASSES.show}-${this.transition}-start`, `${dropdown_constants.DROPDOWN_CONTENT_CSS_CLASSES.show}-${this.transition}-end`);
73
79
  this._toggleScroll();
80
+ if (!this.preventFocusTrap)
81
+ this._focusTrapController.activate();
74
82
  resolve();
75
83
  }, transitionDuration);
76
84
  });
@@ -111,6 +119,7 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
111
119
  var _a;
112
120
  (_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.classList.remove(`${dropdown_constants.DROPDOWN_CONTENT_CSS_CLASSES.hide}-${this.transition}-start`, `${dropdown_constants.DROPDOWN_CONTENT_CSS_CLASSES.hide}-${this.transition}-end`);
113
121
  this.opened = false;
122
+ this._focusTrapController.deactivate();
114
123
  this._dispatchHideDropdownEvent();
115
124
  resolve();
116
125
  }, transitionDuration);
@@ -142,31 +151,16 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
142
151
  await this.hide();
143
152
  };
144
153
  this._keepFocusWithinDropdownForwards = (ev) => {
145
- var _a, _b;
146
- if (ev.shiftKey === true || !this.$dropdownContent || !this.opened)
154
+ if (ev.shiftKey || !this.$dropdownContent || !this.opened || !this.preventFocusTrap)
147
155
  return;
148
- const $target = ev.target;
149
- if (((_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.contains($target)) && this.preventFocusTrap) {
156
+ if (this.$dropdownContent.contains(ev.target)) {
150
157
  this._handleFocusOnNextElementAfterDropdown(ev);
151
- return;
152
158
  }
153
- if ((_b = this.$dropdownToggler) === null || _b === void 0 ? void 0 : _b.contains($target)) {
154
- this._handleFocusFromTogglerForwards(ev);
155
- return;
156
- }
157
- this._handleFocusFromSentinelEndForwards(ev, $target);
158
159
  };
159
160
  this._keepFocusWithinDropdownBackwards = (ev) => {
160
- if (!this.opened || !this.$dropdownContent)
161
+ if (!this.opened || !this.$dropdownContent || !this.preventFocusTrap)
161
162
  return;
162
- const $target = ev.target;
163
- if (this.preventFocusTrap) {
164
- this._handleDefaultFocusFromDropdownBackwards(ev);
165
- }
166
- else {
167
- this._handleFocusFromTogglerBackwards(ev, $target);
168
- this._handleFocusFromSentinelStartBackwards(ev, $target);
169
- }
163
+ this._handleDefaultFocusFromDropdownBackwards(ev);
170
164
  };
171
165
  this._hoverToggle = async (ev) => {
172
166
  if (window.innerWidth < global_constants.BREAKPOINTS.xs)
@@ -188,7 +182,7 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
188
182
  this._focusOnFirstContentElement = () => {
189
183
  if (!this.$dropdownContent)
190
184
  return;
191
- const $firstFocusableElement = this._getTrulyFocusableElements(this.$dropdownContent)[0];
185
+ const $firstFocusableElement = this._focusTrapController.getFocusableElements(this.$dropdownContent)[0];
192
186
  if ($firstFocusableElement)
193
187
  $firstFocusableElement.focus();
194
188
  };
@@ -306,68 +300,11 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
306
300
  utilities.UiDomUtils.getNextFocusableElement(this.$dropdownToggler || this).focus();
307
301
  return;
308
302
  }
309
- _handleFocusFromTogglerForwards(ev) {
310
- if (!this.$dropdownContent)
311
- return;
312
- const trulyFocusableElements = this._getTrulyFocusableElements(this.$dropdownContent);
313
- if (trulyFocusableElements.length === 0)
314
- return;
315
- ev.preventDefault();
316
- trulyFocusableElements[0].focus();
317
- }
318
- _handleFocusFromSentinelEndForwards(ev, $target) {
319
- var _a;
320
- if (!this.$dropdownContent)
321
- return;
322
- const trulyFocusableElements = this._getTrulyFocusableElements(this.$dropdownContent);
323
- const $lastFocusableElement = trulyFocusableElements.slice(-1)[0];
324
- if ($target !== $lastFocusableElement)
325
- return;
326
- ev.preventDefault();
327
- (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
328
- }
329
303
  _handleDefaultFocusFromDropdownBackwards(ev) {
330
304
  ev.preventDefault();
331
305
  this.hide();
332
306
  utilities.UiDomUtils.getPreviousFocusableElement(this.$dropdownToggler || this).focus();
333
307
  }
334
- _handleFocusFromTogglerBackwards(ev, $target) {
335
- var _a;
336
- if ($target !== this.$dropdownToggler && !((_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.contains($target)) || !this.$dropdownContent)
337
- return;
338
- ev.preventDefault();
339
- const trulyFocusableElements = this._getTrulyFocusableElements(this.$dropdownContent);
340
- if (trulyFocusableElements.length === 0)
341
- return;
342
- const $lastFocusableElement = trulyFocusableElements.slice(-1)[0];
343
- $lastFocusableElement.focus();
344
- }
345
- _handleFocusFromSentinelStartBackwards(ev, $target) {
346
- var _a;
347
- if (!this.$dropdownContent)
348
- return;
349
- const $firstFocusableElement = this._getTrulyFocusableElements(this.$dropdownContent)[0];
350
- if ($target !== $firstFocusableElement)
351
- return;
352
- ev.preventDefault();
353
- (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
354
- }
355
- _getTrulyFocusableElements($container) {
356
- const focusableElements = utilities.UiDomUtils.getFocusableElements($container);
357
- return focusableElements.filter(($el) => this._isElementTrulyFocusable($el));
358
- }
359
- _isElementTrulyFocusable($el) {
360
- const style = window.getComputedStyle($el);
361
- if (style.display === 'none' || style.visibility === 'hidden') {
362
- return false;
363
- }
364
- if ($el.nodeName === 'H-PORTAL')
365
- return true;
366
- const $parent = $el.parentElement;
367
- if (!$parent)
368
- return true;
369
- return this._isElementTrulyFocusable($parent);
370
- }
371
308
  _isHoveredWithinDropdown(element) {
372
309
  var _a;
373
310
  if (element === this)
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA,wBAAwB,4CAAgD;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,qDAAyD;AAC1E;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;AACA;AACA;AACA;AACA;AACA;"}
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA,wBAAwB,4CAAgD;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,qDAAyD;AAC1E;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -16,6 +16,7 @@ var ref_js = require('lit-html/directives/ref.js');
16
16
  var context_provider_controller = require('../../../core/context/context_provider_controller.js');
17
17
  var global_constants = require('../../../global_constants.js');
18
18
  var v4 = require('../../../../../../external/uuid/dist/esm-browser/v4.js');
19
+ var focus_trap_controller = require('../../../controllers/focus_trap_controller/focus_trap_controller.js');
19
20
  var modal_constants = require('../../modal/modal_constants.js');
20
21
  var sheet_constants = require('../../sheet/sheet_constants.js');
21
22
  var when = require('../../../../../../external/lit-html/directives/when.js');
@@ -31,7 +32,14 @@ exports.HSearch = class HSearch extends phoenix_light_lit_element.PhoenixLightLi
31
32
  this._togglerElement = null;
32
33
  this._id = v4['default']();
33
34
  this._openSearchButtonAriaLabelId = `${this._id}-open-search-button-aria-label`;
35
+ this._searchIconId = `${this._id}-search-icon`;
34
36
  this._searchContentContainerId = v4['default']();
37
+ this._mobileFocusTrapController = new focus_trap_controller.FocusTrapController({
38
+ host: this,
39
+ getContainer: () => this,
40
+ noAutofocus: true,
41
+ cyclicKeydown: true
42
+ });
35
43
  this._searchResultsRef = ref_js.createRef();
36
44
  this._searchHistoryRef = ref_js.createRef();
37
45
  this._searchMessageRef = ref_js.createRef();
@@ -327,6 +335,7 @@ exports.HSearch = class HSearch extends phoenix_light_lit_element.PhoenixLightLi
327
335
  if (window.innerWidth > global_constants.BREAKPOINTS.sm) {
328
336
  const hasBeenOpened = this.classList.contains(search_constants.SEARCH_CLASS_NAMES.mobileOpened);
329
337
  this.classList.remove(search_constants.SEARCH_CLASS_NAMES.mobileOpened);
338
+ this._deactivateMobileDialog();
330
339
  if (hasBeenOpened && this.displayMode !== 'dropdown') {
331
340
  const $storefrontSearch = document.querySelector(`h-storefront-search[module-instance-id="${this.moduleInstanceId}"]`);
332
341
  const searchOverlayTriggerName = (_a = $storefrontSearch === null || $storefrontSearch === void 0 ? void 0 : $storefrontSearch.querySelector('[aria-haspopup="dialog"]')) === null || _a === void 0 ? void 0 : _a.getAttribute('name');
@@ -342,6 +351,7 @@ exports.HSearch = class HSearch extends phoenix_light_lit_element.PhoenixLightLi
342
351
  };
343
352
  this._openMobileView = () => {
344
353
  this.classList.add(search_constants.SEARCH_CLASS_NAMES.mobileOpened);
354
+ this._activateMobileDialog();
345
355
  };
346
356
  this._isSuggesterLayerVisible = () => {
347
357
  var _a;
@@ -362,6 +372,20 @@ exports.HSearch = class HSearch extends phoenix_light_lit_element.PhoenixLightLi
362
372
  document.removeEventListener('focusin', this._resetSearchOnFocusOutside);
363
373
  }
364
374
  };
375
+ this._activateMobileDialog = () => {
376
+ if (this.displayMode !== 'dropdown')
377
+ return;
378
+ this.setAttribute('role', 'dialog');
379
+ this.setAttribute('aria-modal', 'true');
380
+ this.setAttribute('aria-labelledby', this._searchIconId);
381
+ this._mobileFocusTrapController.activate();
382
+ };
383
+ this._deactivateMobileDialog = () => {
384
+ this.removeAttribute('role');
385
+ this.removeAttribute('aria-modal');
386
+ this.removeAttribute('aria-labelledby');
387
+ this._mobileFocusTrapController.deactivate();
388
+ };
365
389
  this._setupAriaAttributes = () => {
366
390
  var _a;
367
391
  if (this._translations.openSearchButtonAriaLabel) {
@@ -370,6 +394,7 @@ exports.HSearch = class HSearch extends phoenix_light_lit_element.PhoenixLightLi
370
394
  };
371
395
  this._handleOpenSearch = () => {
372
396
  this.classList.add(search_constants.SEARCH_CLASS_NAMES.mobileOpened);
397
+ this._activateMobileDialog();
373
398
  const shouldShowMessage = this._searchPhrase !== '';
374
399
  this._updateSearchView(this._searchPhrase, shouldShowMessage, false);
375
400
  const $searchInput = this.querySelector(`
@@ -490,6 +515,7 @@ exports.HSearch = class HSearch extends phoenix_light_lit_element.PhoenixLightLi
490
515
  this.addEventListener(search_constants.SEARCH_CUSTOM_EVENT_NAMES.submit, this._handleSubmitForm);
491
516
  this.addEventListener(search_constants.SEARCH_CUSTOM_EVENT_NAMES.close, () => {
492
517
  this.classList.remove(search_constants.SEARCH_CLASS_NAMES.mobileOpened);
518
+ this._deactivateMobileDialog();
493
519
  this._resetSearchView();
494
520
  this.isSearchUxFixesFlagEnabled && this._removeSearchKeyboardNavigation();
495
521
  });
@@ -622,6 +648,7 @@ exports.HSearch = class HSearch extends phoenix_light_lit_element.PhoenixLightLi
622
648
  super.render();
623
649
  return lit.html `
624
650
  ${when.when(!this.isSearchIconFixEnabled, () => lit.html ` <div
651
+ id="${this._searchIconId}"
625
652
  class="${search_constants.SEARCH_CLASS_NAMES.icon} labeled-icon hidden-md-only hidden-lg-only hidden-xl-only hidden-xxl-only hidden-xxxl-only"
626
653
  tabindex="0"
627
654
  aria-haspopup="dialog"
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA,wBAAwB,+CAAmD;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,wDAA4D;AAC7E;AACA;AACA,mBAAmB,wDAA4D;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA,wBAAwB,+CAAmD;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,wDAA4D;AAC7E;AACA;AACA;AACA,mBAAmB,wDAA4D;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -3,7 +3,6 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var tslib_es6 = require('../../../../../external/tslib/tslib.es6.js');
6
- var utilities = require('@dreamcommerce/utilities');
7
6
  var phoenix_light_lit_element = require('../../core/phoenix_light_lit_element/phoenix_light_lit_element.js');
8
7
  var phoenix_custom_element = require('../../core/decorators/phoenix_custom_element.js');
9
8
  var decorators_js = require('@lit/reactive-element/decorators.js');
@@ -13,6 +12,7 @@ var ref_js = require('lit-html/directives/ref.js');
13
12
  var portal_constants = require('../portal/portal_constants.js');
14
13
  var backdrop_constants = require('../backdrop/backdrop_constants.js');
15
14
  var backdrop_controller = require('../backdrop/controller/backdrop_controller.js');
15
+ var focus_trap_controller = require('../../controllers/focus_trap_controller/focus_trap_controller.js');
16
16
  var modal_constants = require('./modal_constants.js');
17
17
  var modal_close = require('./modal_close.js');
18
18
 
@@ -25,9 +25,6 @@ exports.HModal = HModal_1 = class HModal extends phoenix_light_lit_element.Phoen
25
25
  this.transition = 'scale';
26
26
  this.modalLabel = '';
27
27
  this.noAutofocus = false;
28
- this._firstFocusableElement = undefined;
29
- this._focusableElements = null;
30
- this._lastFocusableElement = undefined;
31
28
  this._focusedToggler = null;
32
29
  this._contentRef = ref_js.createRef();
33
30
  this._focusSentinelStart = ref_js.createRef();
@@ -35,44 +32,26 @@ exports.HModal = HModal_1 = class HModal extends phoenix_light_lit_element.Phoen
35
32
  this._propsChangeStrategies = {
36
33
  [modal_constants.MODAL_OPENED_PROP]: {
37
34
  true: () => {
38
- const scrollY = window.scrollY;
39
35
  HModal_1.openModals = [...HModal_1.openModals, this];
40
36
  document.addEventListener('keydown', this._bindCloseOnEsc);
41
37
  document.addEventListener(backdrop_constants.BACKDROP_EVENTS.clicked, this.close);
42
38
  this._dispatchModalOpenedEvent();
43
- if (!this.noAutofocus) {
44
- setTimeout(() => {
45
- var _a;
46
- (_a = this._firstFocusableElement) === null || _a === void 0 ? void 0 : _a.focus();
47
- window.scrollTo(0, scrollY);
48
- }, 0);
49
- }
39
+ this._focusTrapController.activate();
50
40
  },
51
41
  false: () => {
52
42
  HModal_1.openModals = HModal_1.openModals.filter((modal) => modal !== this);
53
43
  document.removeEventListener('keydown', this._bindCloseOnEsc);
54
44
  document.removeEventListener(backdrop_constants.BACKDROP_EVENTS.clicked, this.close);
45
+ this._focusTrapController.deactivate();
55
46
  }
56
47
  }
57
48
  };
58
49
  this._backdropController = new backdrop_controller.BackdropController();
59
- this._keepFocusWithinModal = (ev) => {
60
- var _a;
61
- const isTabPressed = ev.code === 'Tab';
62
- if (isTabPressed && this._contentRef.value) {
63
- if (ev.shiftKey) {
64
- if (document.activeElement === this._firstFocusableElement) {
65
- const focusableElements = utilities.UiDomUtils.getFocusableElements(this._contentRef.value);
66
- (_a = focusableElements[focusableElements.length - 1]) === null || _a === void 0 ? void 0 : _a.focus();
67
- ev.preventDefault();
68
- }
69
- }
70
- else if (document.activeElement === this._lastFocusableElement) {
71
- utilities.UiDomUtils.setFocusToFirstFocusableElementInContainer(this._contentRef.value);
72
- ev.preventDefault();
73
- }
74
- }
75
- };
50
+ this._focusTrapController = new focus_trap_controller.FocusTrapController({
51
+ host: this,
52
+ getContainer: () => this._contentRef.value,
53
+ noAutofocus: this.noAutofocus
54
+ });
76
55
  this._handleCloseFromCloseComponent = async (ev) => {
77
56
  var _a;
78
57
  ev.stopPropagation();
@@ -133,7 +112,6 @@ exports.HModal = HModal_1 = class HModal extends phoenix_light_lit_element.Phoen
133
112
  });
134
113
  };
135
114
  this.hidden = true;
136
- this._focusableElements = [...this.querySelectorAll(modal_constants.FOCUSABLE_ELEMENTS_WITHIN_MODAL)];
137
115
  }
138
116
  static _appendModalsPortal() {
139
117
  const $modalsPortalTarget = document.querySelector(`h-portal-target[name="${modal_constants.MODALS_PORTAL_NAME}"]`);
@@ -149,7 +127,6 @@ exports.HModal = HModal_1 = class HModal extends phoenix_light_lit_element.Phoen
149
127
  connectedCallback() {
150
128
  super.connectedCallback();
151
129
  HModal_1._appendModalsPortal();
152
- document.addEventListener('keyup', this._keepFocusWithinModal);
153
130
  document.addEventListener(modal_constants.MODAL_EVENTS.close, this._handleCloseFromCloseComponent);
154
131
  }
155
132
  disconnectedCallback() {
@@ -158,29 +135,18 @@ exports.HModal = HModal_1 = class HModal extends phoenix_light_lit_element.Phoen
158
135
  this.close();
159
136
  document.removeEventListener(modal_constants.MODAL_EVENTS.close, this._handleCloseFromCloseComponent);
160
137
  document.removeEventListener('keydown', this._bindCloseOnEsc);
161
- document.removeEventListener('keyup', this._keepFocusWithinModal);
162
138
  }
163
139
  firstUpdated(props) {
164
140
  super.firstUpdated(props);
165
- this._firstFocusableElement = this._focusSentinelStart.value;
166
- this._lastFocusableElement = this._focusSentinelEnd.value;
141
+ this._focusTrapController.setSentinels(this._focusSentinelStart.value, this._focusSentinelEnd.value);
167
142
  }
168
143
  updated(changedProps) {
169
144
  if (changedProps.has(modal_constants.MODAL_OPENED_PROP)) {
170
145
  this._propsChangeStrategies[modal_constants.MODAL_OPENED_PROP][String(this[modal_constants.MODAL_OPENED_PROP])]();
171
146
  }
172
- }
173
- _setFocusToFirstFocusableElementInModalOrCloseBtn() {
174
- if (this.noAutofocus)
175
- return;
176
- requestAnimationFrame(() => {
177
- if (this._contentRef.value) {
178
- const focusableElements = utilities.UiDomUtils.getFocusableElements(this._contentRef.value);
179
- if (focusableElements.length > 0) {
180
- focusableElements.length > 1 ? focusableElements[1].focus() : focusableElements[0].focus();
181
- }
182
- }
183
- });
147
+ if (changedProps.has('noAutofocus')) {
148
+ this._focusTrapController.noAutofocus = this.noAutofocus;
149
+ }
184
150
  }
185
151
  async open() {
186
152
  this._focusedToggler = document.activeElement;
@@ -197,7 +163,7 @@ exports.HModal = HModal_1 = class HModal extends phoenix_light_lit_element.Phoen
197
163
  setTimeout(() => {
198
164
  var _a;
199
165
  (_a = this._contentRef.value) === null || _a === void 0 ? void 0 : _a.classList.remove(`modal_show-${this.transition}-start`, `modal_show-${this.transition}-end`);
200
- this._setFocusToFirstFocusableElementInModalOrCloseBtn();
166
+ this._focusTrapController.focusFirst();
201
167
  resolve();
202
168
  }, transitionDuration);
203
169
  });
@@ -256,18 +222,6 @@ tslib_es6.__decorate([
256
222
  decorators_js.property({ type: Boolean, attribute: 'no-autofocus' }),
257
223
  tslib_es6.__metadata("design:type", Object)
258
224
  ], exports.HModal.prototype, "noAutofocus", void 0);
259
- tslib_es6.__decorate([
260
- decorators_js.state(),
261
- tslib_es6.__metadata("design:type", Object)
262
- ], exports.HModal.prototype, "_firstFocusableElement", void 0);
263
- tslib_es6.__decorate([
264
- decorators_js.state(),
265
- tslib_es6.__metadata("design:type", Object)
266
- ], exports.HModal.prototype, "_focusableElements", void 0);
267
- tslib_es6.__decorate([
268
- decorators_js.state(),
269
- tslib_es6.__metadata("design:type", Object)
270
- ], exports.HModal.prototype, "_lastFocusableElement", void 0);
271
225
  exports.HModal = HModal_1 = tslib_es6.__decorate([
272
226
  phoenix_custom_element.phoenixCustomElement('h-modal'),
273
227
  tslib_es6.__metadata("design:paramtypes", [])
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA,wBAAwB,4CAAgD;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA,wBAAwB,4CAAgD;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,10 +9,8 @@ const MODAL_EVENTS = {
9
9
  opened: 'opened',
10
10
  closed: 'closed'
11
11
  };
12
- const MODAL_OPENED_PROP = 'opened';
13
- const FOCUSABLE_ELEMENTS_WITHIN_MODAL = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';
12
+ const MODAL_OPENED_PROP = 'opened';
14
13
 
15
- exports.FOCUSABLE_ELEMENTS_WITHIN_MODAL = FOCUSABLE_ELEMENTS_WITHIN_MODAL;
16
14
  exports.MODALS_PORTAL_NAME = MODALS_PORTAL_NAME;
17
15
  exports.MODAL_EVENTS = MODAL_EVENTS;
18
16
  exports.MODAL_OPENED_PROP = MODAL_OPENED_PROP;
@@ -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;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;AACA;AACA;"}
@@ -3,7 +3,6 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var tslib_es6 = require('../../../../../external/tslib/tslib.es6.js');
6
- var utilities = require('@dreamcommerce/utilities');
7
6
  var phoenix_light_lit_element = require('../../core/phoenix_light_lit_element/phoenix_light_lit_element.js');
8
7
  var phoenix_custom_element = require('../../core/decorators/phoenix_custom_element.js');
9
8
  var decorators_js = require('@lit/reactive-element/decorators.js');
@@ -13,6 +12,7 @@ var ref_js = require('lit-html/directives/ref.js');
13
12
  var portal_constants = require('../portal/portal_constants.js');
14
13
  var backdrop_constants = require('../backdrop/backdrop_constants.js');
15
14
  var backdrop_controller = require('../backdrop/controller/backdrop_controller.js');
15
+ var focus_trap_controller = require('../../controllers/focus_trap_controller/focus_trap_controller.js');
16
16
  var sheet_constants = require('./sheet_constants.js');
17
17
  var sheet_close = require('./sheet_close.js');
18
18
 
@@ -24,9 +24,6 @@ exports.HSheet = HSheet_1 = class HSheet extends phoenix_light_lit_element.Phoen
24
24
  this.class = '';
25
25
  this.transition = 'scale';
26
26
  this.sheetLabel = '';
27
- this._firstFocusableElement = undefined;
28
- this._focusableElements = null;
29
- this._lastFocusableElement = undefined;
30
27
  this._focusedToggler = null;
31
28
  this._contentRef = ref_js.createRef();
32
29
  this._focusSentinelStart = ref_js.createRef();
@@ -34,42 +31,25 @@ exports.HSheet = HSheet_1 = class HSheet extends phoenix_light_lit_element.Phoen
34
31
  this._propsChangeStrategies = {
35
32
  [sheet_constants.SHEET_OPENED_PROP]: {
36
33
  true: () => {
37
- const scrollY = window.scrollY;
38
34
  HSheet_1.openSheets = [...HSheet_1.openSheets, this];
39
35
  document.addEventListener('keydown', this._bindCloseOnEsc);
40
36
  document.addEventListener(backdrop_constants.BACKDROP_EVENTS.clicked, this.close);
41
37
  this._dispatchSheetOpenedEvent();
42
- setTimeout(() => {
43
- var _a;
44
- (_a = this._firstFocusableElement) === null || _a === void 0 ? void 0 : _a.focus();
45
- window.scrollTo(0, scrollY);
46
- }, 0);
38
+ this._focusTrapController.activate();
47
39
  },
48
40
  false: () => {
49
41
  HSheet_1.openSheets = HSheet_1.openSheets.filter((sheet) => sheet !== this);
50
42
  document.removeEventListener('keydown', this._bindCloseOnEsc);
51
43
  document.removeEventListener(backdrop_constants.BACKDROP_EVENTS.clicked, this.close);
44
+ this._focusTrapController.deactivate();
52
45
  }
53
46
  }
54
47
  };
55
48
  this._backdropController = new backdrop_controller.BackdropController();
56
- this._keepFocusWithinSheet = (ev) => {
57
- var _a;
58
- const isTabPressed = ev.code === 'Tab';
59
- if (isTabPressed && this._contentRef.value) {
60
- if (ev.shiftKey) {
61
- if (document.activeElement === this._firstFocusableElement) {
62
- const focusableElements = utilities.UiDomUtils.getFocusableElements(this._contentRef.value);
63
- (_a = focusableElements[focusableElements.length - 1]) === null || _a === void 0 ? void 0 : _a.focus();
64
- ev.preventDefault();
65
- }
66
- }
67
- else if (document.activeElement === this._lastFocusableElement) {
68
- utilities.UiDomUtils.setFocusToFirstFocusableElementInContainer(this._contentRef.value);
69
- ev.preventDefault();
70
- }
71
- }
72
- };
49
+ this._focusTrapController = new focus_trap_controller.FocusTrapController({
50
+ host: this,
51
+ getContainer: () => this._contentRef.value
52
+ });
73
53
  this._handleCloseFromCloseComponent = async (ev) => {
74
54
  var _a;
75
55
  ev.stopPropagation();
@@ -130,7 +110,6 @@ exports.HSheet = HSheet_1 = class HSheet extends phoenix_light_lit_element.Phoen
130
110
  });
131
111
  };
132
112
  this.hidden = true;
133
- this._focusableElements = [...this.querySelectorAll(sheet_constants.FOCUSABLE_ELEMENTS_WITHIN_SHEET)];
134
113
  }
135
114
  static _appendSheetPortal() {
136
115
  const $modalsPortalTarget = document.querySelector(`h-portal-target[name="${sheet_constants.SHEETS_PORTAL_NAME}"]`);
@@ -146,7 +125,6 @@ exports.HSheet = HSheet_1 = class HSheet extends phoenix_light_lit_element.Phoen
146
125
  connectedCallback() {
147
126
  super.connectedCallback();
148
127
  HSheet_1._appendSheetPortal();
149
- document.addEventListener('keyup', this._keepFocusWithinSheet);
150
128
  document.addEventListener(sheet_constants.SHEET_EVENTS.close, this._handleCloseFromCloseComponent);
151
129
  }
152
130
  disconnectedCallback() {
@@ -155,28 +133,16 @@ exports.HSheet = HSheet_1 = class HSheet extends phoenix_light_lit_element.Phoen
155
133
  this.close();
156
134
  document.removeEventListener(sheet_constants.SHEET_EVENTS.close, this._handleCloseFromCloseComponent);
157
135
  document.removeEventListener('keydown', this._bindCloseOnEsc);
158
- document.removeEventListener('keyup', this._keepFocusWithinSheet);
159
136
  }
160
137
  firstUpdated(props) {
161
138
  super.firstUpdated(props);
162
- this._firstFocusableElement = this._focusSentinelStart.value;
163
- this._lastFocusableElement = this._focusSentinelEnd.value;
139
+ this._focusTrapController.setSentinels(this._focusSentinelStart.value, this._focusSentinelEnd.value);
164
140
  }
165
141
  updated(changedProps) {
166
142
  if (changedProps.has(sheet_constants.SHEET_OPENED_PROP)) {
167
143
  this._propsChangeStrategies[sheet_constants.SHEET_OPENED_PROP][String(this[sheet_constants.SHEET_OPENED_PROP])]();
168
144
  }
169
145
  }
170
- _setFocusToFirstFocusableElementInSheetOrCloseBtn() {
171
- requestAnimationFrame(() => {
172
- if (this._contentRef.value) {
173
- const focusableElements = utilities.UiDomUtils.getFocusableElements(this._contentRef.value);
174
- if (focusableElements.length > 0) {
175
- focusableElements.length > 1 ? focusableElements[1].focus() : focusableElements[0].focus();
176
- }
177
- }
178
- });
179
- }
180
146
  async open() {
181
147
  this._focusedToggler = document.activeElement;
182
148
  return new Promise((resolve) => {
@@ -192,7 +158,7 @@ exports.HSheet = HSheet_1 = class HSheet extends phoenix_light_lit_element.Phoen
192
158
  setTimeout(() => {
193
159
  var _a;
194
160
  (_a = this._contentRef.value) === null || _a === void 0 ? void 0 : _a.classList.remove(`sheet_show-${this.transition}-start`, `sheet_show-${this.transition}-end`);
195
- this._setFocusToFirstFocusableElementInSheetOrCloseBtn();
161
+ this._focusTrapController.focusFirst();
196
162
  resolve();
197
163
  }, transitionDuration);
198
164
  });
@@ -245,18 +211,6 @@ tslib_es6.__decorate([
245
211
  decorators_js.property({ type: String, attribute: 'sheet-label' }),
246
212
  tslib_es6.__metadata("design:type", Object)
247
213
  ], exports.HSheet.prototype, "sheetLabel", void 0);
248
- tslib_es6.__decorate([
249
- decorators_js.state(),
250
- tslib_es6.__metadata("design:type", Object)
251
- ], exports.HSheet.prototype, "_firstFocusableElement", void 0);
252
- tslib_es6.__decorate([
253
- decorators_js.state(),
254
- tslib_es6.__metadata("design:type", Object)
255
- ], exports.HSheet.prototype, "_focusableElements", void 0);
256
- tslib_es6.__decorate([
257
- decorators_js.state(),
258
- tslib_es6.__metadata("design:type", Object)
259
- ], exports.HSheet.prototype, "_lastFocusableElement", void 0);
260
214
  exports.HSheet = HSheet_1 = tslib_es6.__decorate([
261
215
  phoenix_custom_element.phoenixCustomElement('h-sheet'),
262
216
  tslib_es6.__metadata("design:paramtypes", [])
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA,wBAAwB,4CAAgD;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA,wBAAwB,4CAAgD;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,10 +9,8 @@ const SHEET_EVENTS = {
9
9
  opened: 'opened',
10
10
  closed: 'closed'
11
11
  };
12
- const SHEET_OPENED_PROP = 'opened';
13
- const FOCUSABLE_ELEMENTS_WITHIN_SHEET = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';
12
+ const SHEET_OPENED_PROP = 'opened';
14
13
 
15
- exports.FOCUSABLE_ELEMENTS_WITHIN_SHEET = FOCUSABLE_ELEMENTS_WITHIN_SHEET;
16
14
  exports.SHEETS_PORTAL_NAME = SHEETS_PORTAL_NAME;
17
15
  exports.SHEET_EVENTS = SHEET_EVENTS;
18
16
  exports.SHEET_OPENED_PROP = SHEET_OPENED_PROP;
@@ -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;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;AACA;AACA;"}