@shoper/phoenix_design_system 1.18.23-1 → 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 (42) 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/form/select/select.js +37 -18
  6. package/build/cjs/packages/phoenix/src/components/form/select/select.js.map +1 -1
  7. package/build/cjs/packages/phoenix/src/components/modal/modal.js +13 -59
  8. package/build/cjs/packages/phoenix/src/components/modal/modal.js.map +1 -1
  9. package/build/cjs/packages/phoenix/src/components/modal/modal_constants.js +1 -3
  10. package/build/cjs/packages/phoenix/src/components/modal/modal_constants.js.map +1 -1
  11. package/build/cjs/packages/phoenix/src/components/sheet/sheet.js +9 -55
  12. package/build/cjs/packages/phoenix/src/components/sheet/sheet.js.map +1 -1
  13. package/build/cjs/packages/phoenix/src/components/sheet/sheet_constants.js +1 -3
  14. package/build/cjs/packages/phoenix/src/components/sheet/sheet_constants.js.map +1 -1
  15. package/build/cjs/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.js +200 -0
  16. package/build/cjs/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.js.map +1 -0
  17. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.d.ts +1 -6
  18. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js +14 -77
  19. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js.map +1 -1
  20. package/build/esm/packages/phoenix/src/components/form/search/search.d.ts +4 -0
  21. package/build/esm/packages/phoenix/src/components/form/search/search.js +27 -0
  22. package/build/esm/packages/phoenix/src/components/form/search/search.js.map +1 -1
  23. package/build/esm/packages/phoenix/src/components/form/select/select.d.ts +1 -0
  24. package/build/esm/packages/phoenix/src/components/form/select/select.js +37 -18
  25. package/build/esm/packages/phoenix/src/components/form/select/select.js.map +1 -1
  26. package/build/esm/packages/phoenix/src/components/modal/modal.d.ts +1 -5
  27. package/build/esm/packages/phoenix/src/components/modal/modal.js +15 -61
  28. package/build/esm/packages/phoenix/src/components/modal/modal.js.map +1 -1
  29. package/build/esm/packages/phoenix/src/components/modal/modal_constants.js +2 -3
  30. package/build/esm/packages/phoenix/src/components/modal/modal_constants.js.map +1 -1
  31. package/build/esm/packages/phoenix/src/components/sheet/sheet.d.ts +1 -5
  32. package/build/esm/packages/phoenix/src/components/sheet/sheet.js +11 -57
  33. package/build/esm/packages/phoenix/src/components/sheet/sheet.js.map +1 -1
  34. package/build/esm/packages/phoenix/src/components/sheet/sheet_constants.js +2 -3
  35. package/build/esm/packages/phoenix/src/components/sheet/sheet_constants.js.map +1 -1
  36. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.d.ts +24 -0
  37. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.js +196 -0
  38. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller.js.map +1 -0
  39. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller_types.d.ts +14 -0
  40. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller_types.js +2 -0
  41. package/build/esm/packages/phoenix/src/controllers/focus_trap_controller/focus_trap_controller_types.js.map +1 -0
  42. package/package.json +1 -1
@@ -12,6 +12,7 @@ import { createRef, ref } from 'lit-html/directives/ref.js';
12
12
  import { ContextProviderController } from '../../../core/context/context_provider_controller.js';
13
13
  import { BREAKPOINTS } from '../../../global_constants.js';
14
14
  import v4 from '../../../../../../external/uuid/dist/esm-browser/v4.js';
15
+ import { FocusTrapController } from '../../../controllers/focus_trap_controller/focus_trap_controller.js';
15
16
  import { MODAL_EVENTS } from '../../modal/modal_constants.js';
16
17
  import { SHEET_EVENTS } from '../../sheet/sheet_constants.js';
17
18
  import { when as n } from '../../../../../../external/lit-html/directives/when.js';
@@ -27,7 +28,14 @@ let HSearch = class HSearch extends PhoenixLightLitElement {
27
28
  this._togglerElement = null;
28
29
  this._id = v4();
29
30
  this._openSearchButtonAriaLabelId = `${this._id}-open-search-button-aria-label`;
31
+ this._searchIconId = `${this._id}-search-icon`;
30
32
  this._searchContentContainerId = v4();
33
+ this._mobileFocusTrapController = new FocusTrapController({
34
+ host: this,
35
+ getContainer: () => this,
36
+ noAutofocus: true,
37
+ cyclicKeydown: true
38
+ });
31
39
  this._searchResultsRef = createRef();
32
40
  this._searchHistoryRef = createRef();
33
41
  this._searchMessageRef = createRef();
@@ -323,6 +331,7 @@ let HSearch = class HSearch extends PhoenixLightLitElement {
323
331
  if (window.innerWidth > BREAKPOINTS.sm) {
324
332
  const hasBeenOpened = this.classList.contains(SEARCH_CLASS_NAMES.mobileOpened);
325
333
  this.classList.remove(SEARCH_CLASS_NAMES.mobileOpened);
334
+ this._deactivateMobileDialog();
326
335
  if (hasBeenOpened && this.displayMode !== 'dropdown') {
327
336
  const $storefrontSearch = document.querySelector(`h-storefront-search[module-instance-id="${this.moduleInstanceId}"]`);
328
337
  const searchOverlayTriggerName = (_a = $storefrontSearch === null || $storefrontSearch === void 0 ? void 0 : $storefrontSearch.querySelector('[aria-haspopup="dialog"]')) === null || _a === void 0 ? void 0 : _a.getAttribute('name');
@@ -338,6 +347,7 @@ let HSearch = class HSearch extends PhoenixLightLitElement {
338
347
  };
339
348
  this._openMobileView = () => {
340
349
  this.classList.add(SEARCH_CLASS_NAMES.mobileOpened);
350
+ this._activateMobileDialog();
341
351
  };
342
352
  this._isSuggesterLayerVisible = () => {
343
353
  var _a;
@@ -358,6 +368,20 @@ let HSearch = class HSearch extends PhoenixLightLitElement {
358
368
  document.removeEventListener('focusin', this._resetSearchOnFocusOutside);
359
369
  }
360
370
  };
371
+ this._activateMobileDialog = () => {
372
+ if (this.displayMode !== 'dropdown')
373
+ return;
374
+ this.setAttribute('role', 'dialog');
375
+ this.setAttribute('aria-modal', 'true');
376
+ this.setAttribute('aria-labelledby', this._searchIconId);
377
+ this._mobileFocusTrapController.activate();
378
+ };
379
+ this._deactivateMobileDialog = () => {
380
+ this.removeAttribute('role');
381
+ this.removeAttribute('aria-modal');
382
+ this.removeAttribute('aria-labelledby');
383
+ this._mobileFocusTrapController.deactivate();
384
+ };
361
385
  this._setupAriaAttributes = () => {
362
386
  var _a;
363
387
  if (this._translations.openSearchButtonAriaLabel) {
@@ -366,6 +390,7 @@ let HSearch = class HSearch extends PhoenixLightLitElement {
366
390
  };
367
391
  this._handleOpenSearch = () => {
368
392
  this.classList.add(SEARCH_CLASS_NAMES.mobileOpened);
393
+ this._activateMobileDialog();
369
394
  const shouldShowMessage = this._searchPhrase !== '';
370
395
  this._updateSearchView(this._searchPhrase, shouldShowMessage, false);
371
396
  const $searchInput = this.querySelector(`
@@ -486,6 +511,7 @@ let HSearch = class HSearch extends PhoenixLightLitElement {
486
511
  this.addEventListener(SEARCH_CUSTOM_EVENT_NAMES.submit, this._handleSubmitForm);
487
512
  this.addEventListener(SEARCH_CUSTOM_EVENT_NAMES.close, () => {
488
513
  this.classList.remove(SEARCH_CLASS_NAMES.mobileOpened);
514
+ this._deactivateMobileDialog();
489
515
  this._resetSearchView();
490
516
  this.isSearchUxFixesFlagEnabled && this._removeSearchKeyboardNavigation();
491
517
  });
@@ -618,6 +644,7 @@ let HSearch = class HSearch extends PhoenixLightLitElement {
618
644
  super.render();
619
645
  return html `
620
646
  ${n(!this.isSearchIconFixEnabled, () => html ` <div
647
+ id="${this._searchIconId}"
621
648
  class="${SEARCH_CLASS_NAMES.icon} labeled-icon hidden-md-only hidden-lg-only hidden-xl-only hidden-xxl-only hidden-xxxl-only"
622
649
  tabindex="0"
623
650
  aria-haspopup="dialog"
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,uCAAuC,+CAAmD;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAA4D;AAC3E;AACA;AACA,0BAA0B,wDAA4D;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,+CAAmD;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAA4D;AAC3E;AACA;AACA;AACA,0BAA0B,wDAA4D;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -23,6 +23,7 @@ export declare class HSelect extends PhoenixLightLitElement {
23
23
  optionsList?: TSelectOption[];
24
24
  noDeselect: boolean;
25
25
  assistiveTitleId: string;
26
+ isDevSelectPlaceholderFlagEnabled: boolean;
26
27
  isReactiveSelectionFlagEnabled: boolean;
27
28
  translations: Record<string, string>;
28
29
  private _selectOptionsId;
@@ -30,6 +30,7 @@ import { SelectTogglerKeyboardController } from './controllers/select_toggler_ke
30
30
 
31
31
  let HSelect = class HSelect extends PhoenixLightLitElement {
32
32
  constructor() {
33
+ var _a;
33
34
  super();
34
35
  this.multiple = false;
35
36
  this.opened = false;
@@ -38,6 +39,7 @@ let HSelect = class HSelect extends PhoenixLightLitElement {
38
39
  this.type = SELECT_TYPES.select;
39
40
  this.noDeselect = false;
40
41
  this.assistiveTitleId = '';
42
+ this.isDevSelectPlaceholderFlagEnabled = false;
41
43
  this.isReactiveSelectionFlagEnabled = false;
42
44
  this.translations = {};
43
45
  this._selectOptionsId = v4();
@@ -49,7 +51,6 @@ let HSelect = class HSelect extends PhoenixLightLitElement {
49
51
  this._$dropdownContent = createRef();
50
52
  this.$dropdownToggler = createRef();
51
53
  this._selectContext = new ContextProviderController(this);
52
- this.$placeholder = 'Select';
53
54
  this._updateOptions = () => {
54
55
  const $options = this._getOptions();
55
56
  this._$options = $options.reduce((acc, $option) => {
@@ -107,18 +108,28 @@ let HSelect = class HSelect extends PhoenixLightLitElement {
107
108
  });
108
109
  };
109
110
  this._updateLabelAria = (options) => {
110
- var _a;
111
+ var _a, _b;
111
112
  if (!this.$searchLabel)
112
113
  return;
113
114
  (_a = this.$searchLabel.querySelector(`[id="value-label"]`)) === null || _a === void 0 ? void 0 : _a.remove();
114
- const hasValidOptions = options.some((option) => !option.isPlaceholder);
115
- if (!hasValidOptions)
116
- return;
117
- const valueLabelSpan = document.createElement('span');
118
- valueLabelSpan.id = 'value-label';
119
- valueLabelSpan.className = 'sr-only';
120
- valueLabelSpan.textContent = options.reduce((totalSelectedContent, currentOption) => totalSelectedContent + currentOption.content, '');
121
- this.$searchLabel.appendChild(valueLabelSpan);
115
+ if (this.isDevSelectPlaceholderFlagEnabled) {
116
+ const hasValidOptions = options.some((option) => !option.isPlaceholder);
117
+ if (!hasValidOptions)
118
+ return;
119
+ const valueLabelSpan = document.createElement('span');
120
+ valueLabelSpan.id = 'value-label';
121
+ valueLabelSpan.className = 'sr-only';
122
+ valueLabelSpan.textContent = options.reduce((totalSelectedContent, currentOption) => totalSelectedContent + currentOption.content, '');
123
+ this.$searchLabel.appendChild(valueLabelSpan);
124
+ }
125
+ else {
126
+ this.$searchLabel.innerHTML = `
127
+ ${(_b = this.$searchLabel) === null || _b === void 0 ? void 0 : _b.innerHTML}
128
+ <span id="value-label" class="sr-only">
129
+ ${options.reduce((totalSelectedContent, currentOption) => (totalSelectedContent += currentOption.content), '')}
130
+ </span>
131
+ `;
132
+ }
122
133
  };
123
134
  this._handleOptionClicked = ({ detail }) => {
124
135
  if (!(detail === null || detail === void 0 ? void 0 : detail.$option))
@@ -170,6 +181,8 @@ let HSelect = class HSelect extends PhoenixLightLitElement {
170
181
  };
171
182
  const $options = Array.from(this.querySelectorAll(SELECT_RELATED_COMPONENTS_NAMES.option));
172
183
  $options.forEach(($option) => $option.setAttribute('slot', SELECT_SLOT_NAMES.content));
184
+ const $placeholderEl = this.querySelector(`[slot="${SELECT_INPUT_PLACEHOLDER_SLOT_NAME}"]`);
185
+ this.$placeholder = $placeholderEl && ((_a = $placeholderEl.textContent) === null || _a === void 0 ? void 0 : _a.trim()) ? $placeholderEl : 'Select';
173
186
  if (this.multiple)
174
187
  this.type = SELECT_TYPES.multiple;
175
188
  }
@@ -215,7 +228,9 @@ let HSelect = class HSelect extends PhoenixLightLitElement {
215
228
  }
216
229
  if (changedProperties.has('optionsList')) {
217
230
  this._updateOptions();
218
- this._addPlaceholderOptionIfNeeded();
231
+ if (this.isDevSelectPlaceholderFlagEnabled) {
232
+ this._addPlaceholderOptionIfNeeded();
233
+ }
219
234
  }
220
235
  if (this._$optionsList.value) {
221
236
  (_a = this.listBoxController) === null || _a === void 0 ? void 0 : _a.hostDisconnected();
@@ -248,7 +263,7 @@ let HSelect = class HSelect extends PhoenixLightLitElement {
248
263
  $searchInput ? $searchInput.focus() : $optionToFocus === null || $optionToFocus === void 0 ? void 0 : $optionToFocus.focus();
249
264
  }
250
265
  connectedCallback() {
251
- var _a, _b;
266
+ var _a;
252
267
  super.connectedCallback();
253
268
  this.classList.add(SELECT_CSS_CLASSES.select);
254
269
  if (!this.searchDisabled) {
@@ -263,12 +278,10 @@ let HSelect = class HSelect extends PhoenixLightLitElement {
263
278
  this._selectController.options$.subscribe(this._optionsObserver);
264
279
  this._selectedOptionsAriaObserver = new Observer((selectedOptions) => this._updateLabelAria(selectedOptions));
265
280
  this._selectController.selectedOptions$.subscribe(this._selectedOptionsAriaObserver);
266
- const $placeholderEl = this.querySelector(`[slot="${SELECT_INPUT_PLACEHOLDER_SLOT_NAME}"]`);
267
- if ($placeholderEl && ((_b = $placeholderEl.textContent) === null || _b === void 0 ? void 0 : _b.trim())) {
268
- this.$placeholder = $placeholderEl;
269
- }
270
281
  this._updateOptions();
271
- this._addPlaceholderOptionIfNeeded();
282
+ if (this.isDevSelectPlaceholderFlagEnabled) {
283
+ this._addPlaceholderOptionIfNeeded();
284
+ }
272
285
  this._setupEvents();
273
286
  }
274
287
  firstUpdated(changedProperties) {
@@ -498,7 +511,9 @@ let HSelect = class HSelect extends PhoenixLightLitElement {
498
511
  <h-select-close-btn class="${SELECT_CSS_CLASSES.selectCloseMobileButton}" @close=${this._closeSelect}></h-select-close-btn>
499
512
 
500
513
  <div class=${SELECT_CSS_CLASSES.selectLabel}>
501
- ${(_b = this.$searchLabel) === null || _b === void 0 ? void 0 : _b.cloneNode(true)}
514
+ ${this.isDevSelectPlaceholderFlagEnabled
515
+ ? (_b = this.$searchLabel) === null || _b === void 0 ? void 0 : _b.cloneNode(true)
516
+ : html `${this._getClonedPlaceholderElement()}`}
502
517
  </div>
503
518
 
504
519
  ${isSearchEnabled
@@ -614,6 +629,10 @@ __decorate([
614
629
  property({ type: String, attribute: 'assistive-title-id' }),
615
630
  __metadata("design:type", String)
616
631
  ], HSelect.prototype, "assistiveTitleId", void 0);
632
+ __decorate([
633
+ property({ type: Boolean, attribute: 'is-dev-select-placeholder-flag-enabled' }),
634
+ __metadata("design:type", Boolean)
635
+ ], HSelect.prototype, "isDevSelectPlaceholderFlagEnabled", void 0);
617
636
  __decorate([
618
637
  property({ type: Boolean, attribute: 'is-reactive-selection-flag-enabled' }),
619
638
  __metadata("design:type", Boolean)
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,uCAAuC,+CAAmD;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAA4D;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,+CAAmD;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAA4D;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -7,9 +7,6 @@ export declare class HModal extends PhoenixLightLitElement {
7
7
  transition: string;
8
8
  modalLabel: string;
9
9
  noAutofocus: boolean;
10
- _firstFocusableElement: HTMLElement | undefined;
11
- _focusableElements: HTMLElement[] | null;
12
- _lastFocusableElement: HTMLElement | undefined;
13
10
  private _focusedToggler;
14
11
  private _contentRef;
15
12
  private _focusSentinelStart;
@@ -17,6 +14,7 @@ export declare class HModal extends PhoenixLightLitElement {
17
14
  private _propsChangeStrategies;
18
15
  private static openModals;
19
16
  private _backdropController;
17
+ private _focusTrapController;
20
18
  private static _appendModalsPortal;
21
19
  static isSomeModalOpen(): boolean;
22
20
  constructor();
@@ -24,8 +22,6 @@ export declare class HModal extends PhoenixLightLitElement {
24
22
  disconnectedCallback(): void;
25
23
  firstUpdated(props: PropertyValues): void;
26
24
  updated(changedProps: Map<string, any>): void;
27
- private _setFocusToFirstFocusableElementInModalOrCloseBtn;
28
- private _keepFocusWithinModal;
29
25
  private _handleCloseFromCloseComponent;
30
26
  private _bindCloseOnEsc;
31
27
  open(): Promise<void>;
@@ -1,15 +1,15 @@
1
1
  import { __decorate, __metadata } from '../../../../../external/tslib/tslib.es6.js';
2
- import { UiDomUtils } from '@dreamcommerce/utilities';
3
2
  import { PhoenixLightLitElement } from '../../core/phoenix_light_lit_element/phoenix_light_lit_element.js';
4
3
  import { phoenixCustomElement } from '../../core/decorators/phoenix_custom_element.js';
5
- import { property, state } from '@lit/reactive-element/decorators.js';
4
+ import { property } from '@lit/reactive-element/decorators.js';
6
5
  import '@lit/reactive-element';
7
6
  import { html } from 'lit-html';
8
7
  import { createRef, ref } from 'lit-html/directives/ref.js';
9
8
  import { PORTAL_TARGET_COMPONENT_NAME, PORTAL_TARGET_NAME_PROP } from '../portal/portal_constants.js';
10
9
  import { BACKDROP_EVENTS } from '../backdrop/backdrop_constants.js';
11
10
  import { BackdropController } from '../backdrop/controller/backdrop_controller.js';
12
- import { MODAL_OPENED_PROP, FOCUSABLE_ELEMENTS_WITHIN_MODAL, MODALS_PORTAL_NAME, MODAL_EVENTS } from './modal_constants.js';
11
+ import { FocusTrapController } from '../../controllers/focus_trap_controller/focus_trap_controller.js';
12
+ import { MODAL_OPENED_PROP, MODALS_PORTAL_NAME, MODAL_EVENTS } from './modal_constants.js';
13
13
  import { HModalClose } from './modal_close.js';
14
14
 
15
15
  var HModal_1;
@@ -21,9 +21,6 @@ let HModal = HModal_1 = class HModal extends PhoenixLightLitElement {
21
21
  this.transition = 'scale';
22
22
  this.modalLabel = '';
23
23
  this.noAutofocus = false;
24
- this._firstFocusableElement = undefined;
25
- this._focusableElements = null;
26
- this._lastFocusableElement = undefined;
27
24
  this._focusedToggler = null;
28
25
  this._contentRef = createRef();
29
26
  this._focusSentinelStart = createRef();
@@ -31,44 +28,26 @@ let HModal = HModal_1 = class HModal extends PhoenixLightLitElement {
31
28
  this._propsChangeStrategies = {
32
29
  [MODAL_OPENED_PROP]: {
33
30
  true: () => {
34
- const scrollY = window.scrollY;
35
31
  HModal_1.openModals = [...HModal_1.openModals, this];
36
32
  document.addEventListener('keydown', this._bindCloseOnEsc);
37
33
  document.addEventListener(BACKDROP_EVENTS.clicked, this.close);
38
34
  this._dispatchModalOpenedEvent();
39
- if (!this.noAutofocus) {
40
- setTimeout(() => {
41
- var _a;
42
- (_a = this._firstFocusableElement) === null || _a === void 0 ? void 0 : _a.focus();
43
- window.scrollTo(0, scrollY);
44
- }, 0);
45
- }
35
+ this._focusTrapController.activate();
46
36
  },
47
37
  false: () => {
48
38
  HModal_1.openModals = HModal_1.openModals.filter((modal) => modal !== this);
49
39
  document.removeEventListener('keydown', this._bindCloseOnEsc);
50
40
  document.removeEventListener(BACKDROP_EVENTS.clicked, this.close);
41
+ this._focusTrapController.deactivate();
51
42
  }
52
43
  }
53
44
  };
54
45
  this._backdropController = new BackdropController();
55
- this._keepFocusWithinModal = (ev) => {
56
- var _a;
57
- const isTabPressed = ev.code === 'Tab';
58
- if (isTabPressed && this._contentRef.value) {
59
- if (ev.shiftKey) {
60
- if (document.activeElement === this._firstFocusableElement) {
61
- const focusableElements = UiDomUtils.getFocusableElements(this._contentRef.value);
62
- (_a = focusableElements[focusableElements.length - 1]) === null || _a === void 0 ? void 0 : _a.focus();
63
- ev.preventDefault();
64
- }
65
- }
66
- else if (document.activeElement === this._lastFocusableElement) {
67
- UiDomUtils.setFocusToFirstFocusableElementInContainer(this._contentRef.value);
68
- ev.preventDefault();
69
- }
70
- }
71
- };
46
+ this._focusTrapController = new FocusTrapController({
47
+ host: this,
48
+ getContainer: () => this._contentRef.value,
49
+ noAutofocus: this.noAutofocus
50
+ });
72
51
  this._handleCloseFromCloseComponent = async (ev) => {
73
52
  var _a;
74
53
  ev.stopPropagation();
@@ -129,7 +108,6 @@ let HModal = HModal_1 = class HModal extends PhoenixLightLitElement {
129
108
  });
130
109
  };
131
110
  this.hidden = true;
132
- this._focusableElements = [...this.querySelectorAll(FOCUSABLE_ELEMENTS_WITHIN_MODAL)];
133
111
  }
134
112
  static _appendModalsPortal() {
135
113
  const $modalsPortalTarget = document.querySelector(`h-portal-target[name="${MODALS_PORTAL_NAME}"]`);
@@ -145,7 +123,6 @@ let HModal = HModal_1 = class HModal extends PhoenixLightLitElement {
145
123
  connectedCallback() {
146
124
  super.connectedCallback();
147
125
  HModal_1._appendModalsPortal();
148
- document.addEventListener('keyup', this._keepFocusWithinModal);
149
126
  document.addEventListener(MODAL_EVENTS.close, this._handleCloseFromCloseComponent);
150
127
  }
151
128
  disconnectedCallback() {
@@ -154,29 +131,18 @@ let HModal = HModal_1 = class HModal extends PhoenixLightLitElement {
154
131
  this.close();
155
132
  document.removeEventListener(MODAL_EVENTS.close, this._handleCloseFromCloseComponent);
156
133
  document.removeEventListener('keydown', this._bindCloseOnEsc);
157
- document.removeEventListener('keyup', this._keepFocusWithinModal);
158
134
  }
159
135
  firstUpdated(props) {
160
136
  super.firstUpdated(props);
161
- this._firstFocusableElement = this._focusSentinelStart.value;
162
- this._lastFocusableElement = this._focusSentinelEnd.value;
137
+ this._focusTrapController.setSentinels(this._focusSentinelStart.value, this._focusSentinelEnd.value);
163
138
  }
164
139
  updated(changedProps) {
165
140
  if (changedProps.has(MODAL_OPENED_PROP)) {
166
141
  this._propsChangeStrategies[MODAL_OPENED_PROP][String(this[MODAL_OPENED_PROP])]();
167
142
  }
168
- }
169
- _setFocusToFirstFocusableElementInModalOrCloseBtn() {
170
- if (this.noAutofocus)
171
- return;
172
- requestAnimationFrame(() => {
173
- if (this._contentRef.value) {
174
- const focusableElements = UiDomUtils.getFocusableElements(this._contentRef.value);
175
- if (focusableElements.length > 0) {
176
- focusableElements.length > 1 ? focusableElements[1].focus() : focusableElements[0].focus();
177
- }
178
- }
179
- });
143
+ if (changedProps.has('noAutofocus')) {
144
+ this._focusTrapController.noAutofocus = this.noAutofocus;
145
+ }
180
146
  }
181
147
  async open() {
182
148
  this._focusedToggler = document.activeElement;
@@ -193,7 +159,7 @@ let HModal = HModal_1 = class HModal extends PhoenixLightLitElement {
193
159
  setTimeout(() => {
194
160
  var _a;
195
161
  (_a = this._contentRef.value) === null || _a === void 0 ? void 0 : _a.classList.remove(`modal_show-${this.transition}-start`, `modal_show-${this.transition}-end`);
196
- this._setFocusToFirstFocusableElementInModalOrCloseBtn();
162
+ this._focusTrapController.focusFirst();
197
163
  resolve();
198
164
  }, transitionDuration);
199
165
  });
@@ -252,18 +218,6 @@ __decorate([
252
218
  property({ type: Boolean, attribute: 'no-autofocus' }),
253
219
  __metadata("design:type", Object)
254
220
  ], HModal.prototype, "noAutofocus", void 0);
255
- __decorate([
256
- state(),
257
- __metadata("design:type", Object)
258
- ], HModal.prototype, "_firstFocusableElement", void 0);
259
- __decorate([
260
- state(),
261
- __metadata("design:type", Object)
262
- ], HModal.prototype, "_focusableElements", void 0);
263
- __decorate([
264
- state(),
265
- __metadata("design:type", Object)
266
- ], HModal.prototype, "_lastFocusableElement", void 0);
267
221
  HModal = HModal_1 = __decorate([
268
222
  phoenixCustomElement('h-modal'),
269
223
  __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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;"}
@@ -5,8 +5,7 @@ const MODAL_EVENTS = {
5
5
  opened: 'opened',
6
6
  closed: 'closed'
7
7
  };
8
- const MODAL_OPENED_PROP = 'opened';
9
- const FOCUSABLE_ELEMENTS_WITHIN_MODAL = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';
8
+ const MODAL_OPENED_PROP = 'opened';
10
9
 
11
- export { FOCUSABLE_ELEMENTS_WITHIN_MODAL, MODALS_PORTAL_NAME, MODAL_EVENTS, MODAL_OPENED_PROP };
10
+ export { MODALS_PORTAL_NAME, MODAL_EVENTS, MODAL_OPENED_PROP };
12
11
  //# sourceMappingURL=modal_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;"}
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -6,9 +6,6 @@ export declare class HSheet extends PhoenixLightLitElement {
6
6
  class: string;
7
7
  transition: string;
8
8
  sheetLabel: string;
9
- _firstFocusableElement: HTMLElement | undefined;
10
- _focusableElements: HTMLElement[] | null;
11
- _lastFocusableElement: HTMLElement | undefined;
12
9
  private _focusedToggler;
13
10
  private _contentRef;
14
11
  private _focusSentinelStart;
@@ -16,6 +13,7 @@ export declare class HSheet extends PhoenixLightLitElement {
16
13
  private _propsChangeStrategies;
17
14
  private static openSheets;
18
15
  private _backdropController;
16
+ private _focusTrapController;
19
17
  private static _appendSheetPortal;
20
18
  static isSomeSheetOpen(): boolean;
21
19
  constructor();
@@ -23,8 +21,6 @@ export declare class HSheet extends PhoenixLightLitElement {
23
21
  disconnectedCallback(): void;
24
22
  firstUpdated(props: PropertyValues): void;
25
23
  updated(changedProps: Map<string, any>): void;
26
- private _setFocusToFirstFocusableElementInSheetOrCloseBtn;
27
- private _keepFocusWithinSheet;
28
24
  private _handleCloseFromCloseComponent;
29
25
  private _bindCloseOnEsc;
30
26
  open(): Promise<void>;
@@ -1,15 +1,15 @@
1
1
  import { __decorate, __metadata } from '../../../../../external/tslib/tslib.es6.js';
2
- import { UiDomUtils } from '@dreamcommerce/utilities';
3
2
  import { PhoenixLightLitElement } from '../../core/phoenix_light_lit_element/phoenix_light_lit_element.js';
4
3
  import { phoenixCustomElement } from '../../core/decorators/phoenix_custom_element.js';
5
- import { property, state } from '@lit/reactive-element/decorators.js';
4
+ import { property } from '@lit/reactive-element/decorators.js';
6
5
  import '@lit/reactive-element';
7
6
  import { html } from 'lit-html';
8
7
  import { createRef, ref } from 'lit-html/directives/ref.js';
9
8
  import { PORTAL_TARGET_COMPONENT_NAME, PORTAL_TARGET_NAME_PROP } from '../portal/portal_constants.js';
10
9
  import { BACKDROP_EVENTS } from '../backdrop/backdrop_constants.js';
11
10
  import { BackdropController } from '../backdrop/controller/backdrop_controller.js';
12
- import { SHEET_OPENED_PROP, FOCUSABLE_ELEMENTS_WITHIN_SHEET, SHEETS_PORTAL_NAME, SHEET_EVENTS } from './sheet_constants.js';
11
+ import { FocusTrapController } from '../../controllers/focus_trap_controller/focus_trap_controller.js';
12
+ import { SHEET_OPENED_PROP, SHEETS_PORTAL_NAME, SHEET_EVENTS } from './sheet_constants.js';
13
13
  import { HSheetClose } from './sheet_close.js';
14
14
 
15
15
  var HSheet_1;
@@ -20,9 +20,6 @@ let HSheet = HSheet_1 = class HSheet extends PhoenixLightLitElement {
20
20
  this.class = '';
21
21
  this.transition = 'scale';
22
22
  this.sheetLabel = '';
23
- this._firstFocusableElement = undefined;
24
- this._focusableElements = null;
25
- this._lastFocusableElement = undefined;
26
23
  this._focusedToggler = null;
27
24
  this._contentRef = createRef();
28
25
  this._focusSentinelStart = createRef();
@@ -30,42 +27,25 @@ let HSheet = HSheet_1 = class HSheet extends PhoenixLightLitElement {
30
27
  this._propsChangeStrategies = {
31
28
  [SHEET_OPENED_PROP]: {
32
29
  true: () => {
33
- const scrollY = window.scrollY;
34
30
  HSheet_1.openSheets = [...HSheet_1.openSheets, this];
35
31
  document.addEventListener('keydown', this._bindCloseOnEsc);
36
32
  document.addEventListener(BACKDROP_EVENTS.clicked, this.close);
37
33
  this._dispatchSheetOpenedEvent();
38
- setTimeout(() => {
39
- var _a;
40
- (_a = this._firstFocusableElement) === null || _a === void 0 ? void 0 : _a.focus();
41
- window.scrollTo(0, scrollY);
42
- }, 0);
34
+ this._focusTrapController.activate();
43
35
  },
44
36
  false: () => {
45
37
  HSheet_1.openSheets = HSheet_1.openSheets.filter((sheet) => sheet !== this);
46
38
  document.removeEventListener('keydown', this._bindCloseOnEsc);
47
39
  document.removeEventListener(BACKDROP_EVENTS.clicked, this.close);
40
+ this._focusTrapController.deactivate();
48
41
  }
49
42
  }
50
43
  };
51
44
  this._backdropController = new BackdropController();
52
- this._keepFocusWithinSheet = (ev) => {
53
- var _a;
54
- const isTabPressed = ev.code === 'Tab';
55
- if (isTabPressed && this._contentRef.value) {
56
- if (ev.shiftKey) {
57
- if (document.activeElement === this._firstFocusableElement) {
58
- const focusableElements = UiDomUtils.getFocusableElements(this._contentRef.value);
59
- (_a = focusableElements[focusableElements.length - 1]) === null || _a === void 0 ? void 0 : _a.focus();
60
- ev.preventDefault();
61
- }
62
- }
63
- else if (document.activeElement === this._lastFocusableElement) {
64
- UiDomUtils.setFocusToFirstFocusableElementInContainer(this._contentRef.value);
65
- ev.preventDefault();
66
- }
67
- }
68
- };
45
+ this._focusTrapController = new FocusTrapController({
46
+ host: this,
47
+ getContainer: () => this._contentRef.value
48
+ });
69
49
  this._handleCloseFromCloseComponent = async (ev) => {
70
50
  var _a;
71
51
  ev.stopPropagation();
@@ -126,7 +106,6 @@ let HSheet = HSheet_1 = class HSheet extends PhoenixLightLitElement {
126
106
  });
127
107
  };
128
108
  this.hidden = true;
129
- this._focusableElements = [...this.querySelectorAll(FOCUSABLE_ELEMENTS_WITHIN_SHEET)];
130
109
  }
131
110
  static _appendSheetPortal() {
132
111
  const $modalsPortalTarget = document.querySelector(`h-portal-target[name="${SHEETS_PORTAL_NAME}"]`);
@@ -142,7 +121,6 @@ let HSheet = HSheet_1 = class HSheet extends PhoenixLightLitElement {
142
121
  connectedCallback() {
143
122
  super.connectedCallback();
144
123
  HSheet_1._appendSheetPortal();
145
- document.addEventListener('keyup', this._keepFocusWithinSheet);
146
124
  document.addEventListener(SHEET_EVENTS.close, this._handleCloseFromCloseComponent);
147
125
  }
148
126
  disconnectedCallback() {
@@ -151,28 +129,16 @@ let HSheet = HSheet_1 = class HSheet extends PhoenixLightLitElement {
151
129
  this.close();
152
130
  document.removeEventListener(SHEET_EVENTS.close, this._handleCloseFromCloseComponent);
153
131
  document.removeEventListener('keydown', this._bindCloseOnEsc);
154
- document.removeEventListener('keyup', this._keepFocusWithinSheet);
155
132
  }
156
133
  firstUpdated(props) {
157
134
  super.firstUpdated(props);
158
- this._firstFocusableElement = this._focusSentinelStart.value;
159
- this._lastFocusableElement = this._focusSentinelEnd.value;
135
+ this._focusTrapController.setSentinels(this._focusSentinelStart.value, this._focusSentinelEnd.value);
160
136
  }
161
137
  updated(changedProps) {
162
138
  if (changedProps.has(SHEET_OPENED_PROP)) {
163
139
  this._propsChangeStrategies[SHEET_OPENED_PROP][String(this[SHEET_OPENED_PROP])]();
164
140
  }
165
141
  }
166
- _setFocusToFirstFocusableElementInSheetOrCloseBtn() {
167
- requestAnimationFrame(() => {
168
- if (this._contentRef.value) {
169
- const focusableElements = UiDomUtils.getFocusableElements(this._contentRef.value);
170
- if (focusableElements.length > 0) {
171
- focusableElements.length > 1 ? focusableElements[1].focus() : focusableElements[0].focus();
172
- }
173
- }
174
- });
175
- }
176
142
  async open() {
177
143
  this._focusedToggler = document.activeElement;
178
144
  return new Promise((resolve) => {
@@ -188,7 +154,7 @@ let HSheet = HSheet_1 = class HSheet extends PhoenixLightLitElement {
188
154
  setTimeout(() => {
189
155
  var _a;
190
156
  (_a = this._contentRef.value) === null || _a === void 0 ? void 0 : _a.classList.remove(`sheet_show-${this.transition}-start`, `sheet_show-${this.transition}-end`);
191
- this._setFocusToFirstFocusableElementInSheetOrCloseBtn();
157
+ this._focusTrapController.focusFirst();
192
158
  resolve();
193
159
  }, transitionDuration);
194
160
  });
@@ -241,18 +207,6 @@ __decorate([
241
207
  property({ type: String, attribute: 'sheet-label' }),
242
208
  __metadata("design:type", Object)
243
209
  ], HSheet.prototype, "sheetLabel", void 0);
244
- __decorate([
245
- state(),
246
- __metadata("design:type", Object)
247
- ], HSheet.prototype, "_firstFocusableElement", void 0);
248
- __decorate([
249
- state(),
250
- __metadata("design:type", Object)
251
- ], HSheet.prototype, "_focusableElements", void 0);
252
- __decorate([
253
- state(),
254
- __metadata("design:type", Object)
255
- ], HSheet.prototype, "_lastFocusableElement", void 0);
256
210
  HSheet = HSheet_1 = __decorate([
257
211
  phoenixCustomElement('h-sheet'),
258
212
  __metadata("design:paramtypes", [])