@shoper/phoenix_design_system 0.10.0 → 0.10.1-1

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 (62) hide show
  1. package/build/cjs/packages/phoenix/src/components/backdrop/backdrop.js +91 -0
  2. package/build/cjs/packages/phoenix/src/components/{modal/modal_backdrop.js.map → backdrop/backdrop.js.map} +1 -1
  3. package/build/cjs/packages/phoenix/src/components/backdrop/backdrop_constants.js +17 -0
  4. package/build/cjs/packages/phoenix/src/components/backdrop/backdrop_constants.js.map +1 -0
  5. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown.js +114 -23
  6. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown.js.map +1 -1
  7. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_constants.js +9 -1
  8. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_constants.js.map +1 -1
  9. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_content.js +6 -0
  10. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_content.js.map +1 -1
  11. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_toggler.js +1 -0
  12. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown_toggler.js.map +1 -1
  13. package/build/cjs/packages/phoenix/src/components/modal/modal.js +13 -10
  14. package/build/cjs/packages/phoenix/src/components/modal/modal.js.map +1 -1
  15. package/build/cjs/packages/phoenix/src/controllers/click_outside_controller/click_outside_controller.js +4 -2
  16. package/build/cjs/packages/phoenix/src/controllers/click_outside_controller/click_outside_controller.js.map +1 -1
  17. package/build/cjs/packages/phoenix/src/controllers/relative_position_controller/relative_position_calculator.js +2 -2
  18. package/build/cjs/packages/phoenix/src/controllers/relative_position_controller/relative_position_controller.js +29 -9
  19. package/build/cjs/packages/phoenix/src/controllers/relative_position_controller/relative_position_controller.js.map +1 -1
  20. package/build/cjs/packages/phoenix/src/global_constants.js +15 -0
  21. package/build/cjs/packages/phoenix/src/global_constants.js.map +1 -0
  22. package/build/cjs/packages/phoenix/src/index.js +10 -10
  23. package/build/esm/packages/phoenix/src/components/backdrop/backdrop.d.ts +17 -0
  24. package/build/esm/packages/phoenix/src/components/backdrop/backdrop.js +89 -0
  25. package/build/esm/packages/phoenix/src/components/{modal/modal_backdrop.js.map → backdrop/backdrop.js.map} +1 -1
  26. package/build/esm/packages/phoenix/src/components/backdrop/backdrop_constants.d.ts +7 -0
  27. package/build/esm/packages/phoenix/src/components/backdrop/backdrop_constants.js +11 -0
  28. package/build/esm/packages/phoenix/src/components/backdrop/backdrop_constants.js.map +1 -0
  29. package/build/esm/packages/phoenix/src/components/backdrop/backdrop_types.d.ts +3 -0
  30. package/build/esm/packages/phoenix/src/components/backdrop/backdrop_types.js +2 -0
  31. package/build/esm/packages/phoenix/src/components/backdrop/backdrop_types.js.map +1 -0
  32. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.d.ts +11 -3
  33. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js +115 -24
  34. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js.map +1 -1
  35. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_constants.d.ts +5 -0
  36. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_constants.js +6 -2
  37. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_constants.js.map +1 -1
  38. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_content.d.ts +2 -1
  39. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_content.js +6 -0
  40. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_content.js.map +1 -1
  41. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_toggler.js +2 -1
  42. package/build/esm/packages/phoenix/src/components/dropdown/dropdown_toggler.js.map +1 -1
  43. package/build/esm/packages/phoenix/src/components/modal/modal.d.ts +1 -2
  44. package/build/esm/packages/phoenix/src/components/modal/modal.js +13 -10
  45. package/build/esm/packages/phoenix/src/components/modal/modal.js.map +1 -1
  46. package/build/esm/packages/phoenix/src/controllers/click_outside_controller/click_outside_controller.js +4 -2
  47. package/build/esm/packages/phoenix/src/controllers/click_outside_controller/click_outside_controller.js.map +1 -1
  48. package/build/esm/packages/phoenix/src/controllers/click_outside_controller/click_outside_controller_types.d.ts +4 -0
  49. package/build/esm/packages/phoenix/src/controllers/relative_position_controller/relative_position_calculator.js +2 -2
  50. package/build/esm/packages/phoenix/src/controllers/relative_position_controller/relative_position_controller.d.ts +2 -1
  51. package/build/esm/packages/phoenix/src/controllers/relative_position_controller/relative_position_controller.js +30 -10
  52. package/build/esm/packages/phoenix/src/controllers/relative_position_controller/relative_position_controller.js.map +1 -1
  53. package/build/esm/packages/phoenix/src/controllers/relative_position_controller/relative_position_controller_types.d.ts +2 -0
  54. package/build/esm/packages/phoenix/src/global_constants.d.ts +8 -0
  55. package/build/esm/packages/phoenix/src/global_constants.js +11 -0
  56. package/build/esm/packages/phoenix/src/global_constants.js.map +1 -0
  57. package/build/esm/packages/phoenix/src/index.d.ts +1 -1
  58. package/build/esm/packages/phoenix/src/index.js +2 -2
  59. package/package.json +1 -1
  60. package/build/cjs/packages/phoenix/src/components/modal/modal_backdrop.js +0 -66
  61. package/build/esm/packages/phoenix/src/components/modal/modal_backdrop.d.ts +0 -12
  62. package/build/esm/packages/phoenix/src/components/modal/modal_backdrop.js +0 -64
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const BREAKPOINTS = {
6
+ xs: 576,
7
+ sm: 768,
8
+ md: 1000,
9
+ lg: 1200,
10
+ xl: 1440,
11
+ xxl: 1920
12
+ };
13
+
14
+ exports.BREAKPOINTS = BREAKPOINTS;
15
+ //# sourceMappingURL=global_constants.js.map
@@ -0,0 +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;"}
@@ -10,7 +10,6 @@ var portal_target = require('./components/portal/portal_target.js');
10
10
  var portal = require('./components/portal/portal.js');
11
11
  var modal = require('./components/modal/modal.js');
12
12
  var modal_opener = require('./components/modal/modal_opener.js');
13
- var modal_backdrop = require('./components/modal/modal_backdrop.js');
14
13
  var modal_body = require('./components/modal/modal_body.js');
15
14
  var modal_footer = require('./components/modal/modal_footer.js');
16
15
  var modal_header = require('./components/modal/modal_header.js');
@@ -28,11 +27,12 @@ var btn_controller = require('./controllers/btn_controller.js');
28
27
  var accordion_toggler = require('./components/accordion/accordion_toggler.js');
29
28
  var accordion = require('./components/accordion/accordion.js');
30
29
  var click_outside_controller = require('./controllers/click_outside_controller/click_outside_controller.js');
30
+ var dropdown_content = require('./components/dropdown/dropdown_content.js');
31
31
  var relative_position_controller = require('./controllers/relative_position_controller/relative_position_controller.js');
32
32
  var dropdown = require('./components/dropdown/dropdown.js');
33
33
  var toggle_element_aria_controller = require('./controllers/toggle_element_aria_controller/toggle_element_aria_controller.js');
34
34
  var dropdown_toggler = require('./components/dropdown/dropdown_toggler.js');
35
- var dropdown_content = require('./components/dropdown/dropdown_content.js');
35
+ var backdrop = require('./components/backdrop/backdrop.js');
36
36
 
37
37
 
38
38
 
@@ -69,12 +69,6 @@ Object.defineProperty(exports, 'HModalOpener', {
69
69
  return modal_opener.HModalOpener;
70
70
  }
71
71
  });
72
- Object.defineProperty(exports, 'HModalBackdrop', {
73
- enumerable: true,
74
- get: function () {
75
- return modal_backdrop.HModalBackdrop;
76
- }
77
- });
78
72
  Object.defineProperty(exports, 'HModalBody', {
79
73
  enumerable: true,
80
74
  get: function () {
@@ -158,6 +152,12 @@ Object.defineProperty(exports, 'HAccordion', {
158
152
  }
159
153
  });
160
154
  exports.ClickOutsideController = click_outside_controller.ClickOutsideController;
155
+ Object.defineProperty(exports, 'HDropdownContent', {
156
+ enumerable: true,
157
+ get: function () {
158
+ return dropdown_content.HDropdownContent;
159
+ }
160
+ });
161
161
  exports.RelativePositionController = relative_position_controller.RelativePositionController;
162
162
  Object.defineProperty(exports, 'HDropdown', {
163
163
  enumerable: true,
@@ -172,10 +172,10 @@ Object.defineProperty(exports, 'HDropdownToggler', {
172
172
  return dropdown_toggler.HDropdownToggler;
173
173
  }
174
174
  });
175
- Object.defineProperty(exports, 'HDropdownContent', {
175
+ Object.defineProperty(exports, 'HBackdrop', {
176
176
  enumerable: true,
177
177
  get: function () {
178
- return dropdown_content.HDropdownContent;
178
+ return backdrop.HBackdrop;
179
179
  }
180
180
  });
181
181
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,17 @@
1
+ import { TemplateResult } from 'lit';
2
+ import { PhoenixLightLitElement } from "../../core/phoenix_light_lit_element";
3
+ export declare class HBackdrop extends PhoenixLightLitElement {
4
+ visible: boolean;
5
+ onClickArray: (() => void)[];
6
+ private _backdropLayerCounter;
7
+ constructor();
8
+ disconnectedCallback(): void;
9
+ private _appendBackdrop;
10
+ private _show;
11
+ private _hide;
12
+ protected updated(): void;
13
+ private _disableScrolling;
14
+ private _enableScrolling;
15
+ private _dispatchBackdropClickedEvent;
16
+ protected render(): TemplateResult;
17
+ }
@@ -0,0 +1,89 @@
1
+ import { __decorate, __metadata } from '../../../../../external/tslib/tslib.es6.js';
2
+ import { html } from 'lit';
3
+ import { property, state } from 'lit/decorators';
4
+ import { PhoenixLightLitElement } from '../../core/phoenix_light_lit_element.js';
5
+ import { phoenixCustomElement } from '../../core/decorators/phoenix_custom_element.js';
6
+ import { BACKDROP_NAME, BACKDROP_EVENTS, BACKDROP_CLASS } from './backdrop_constants.js';
7
+
8
+ let HBackdrop = class HBackdrop extends PhoenixLightLitElement {
9
+ constructor() {
10
+ super();
11
+ this.visible = false;
12
+ this.onClickArray = [];
13
+ this._backdropLayerCounter = 0;
14
+ this._appendBackdrop = () => {
15
+ const $backdrop = document.querySelector(BACKDROP_NAME);
16
+ if (!$backdrop) {
17
+ const $newBackdrop = document.createElement(BACKDROP_NAME);
18
+ document.body.appendChild($newBackdrop);
19
+ }
20
+ };
21
+ this._show = () => {
22
+ this._backdropLayerCounter += 1;
23
+ this.visible = true;
24
+ };
25
+ this._hide = () => {
26
+ this._backdropLayerCounter -= 1;
27
+ if (this._backdropLayerCounter !== 0)
28
+ return;
29
+ this.visible = false;
30
+ };
31
+ this._dispatchBackdropClickedEvent = () => {
32
+ const backdropClickedEvent = new CustomEvent(BACKDROP_EVENTS.clicked, {
33
+ bubbles: true
34
+ });
35
+ document.dispatchEvent(backdropClickedEvent);
36
+ };
37
+ this._appendBackdrop();
38
+ document.addEventListener(BACKDROP_EVENTS.show, this._show);
39
+ document.addEventListener(BACKDROP_EVENTS.hide, this._hide);
40
+ }
41
+ disconnectedCallback() {
42
+ super.disconnectedCallback();
43
+ document.removeEventListener(BACKDROP_EVENTS.show, this._show);
44
+ document.removeEventListener(BACKDROP_EVENTS.hide, this._hide);
45
+ }
46
+ updated() {
47
+ if (this.visible) {
48
+ this._disableScrolling();
49
+ }
50
+ else {
51
+ this._enableScrolling();
52
+ }
53
+ }
54
+ _disableScrolling() {
55
+ document.body.style.overflow = 'hidden';
56
+ document.body.style.paddingRight = '15px';
57
+ }
58
+ _enableScrolling() {
59
+ document.body.style.removeProperty('overflow');
60
+ document.body.style.removeProperty('padding-right');
61
+ }
62
+ render() {
63
+ return html ` <div
64
+ aria-hidden="true"
65
+ ?hidden="${!this.visible}"
66
+ @click="${this._dispatchBackdropClickedEvent}"
67
+ class="${BACKDROP_CLASS}"
68
+ ></div>`;
69
+ }
70
+ };
71
+ __decorate([
72
+ property({ type: Boolean }),
73
+ __metadata("design:type", Object)
74
+ ], HBackdrop.prototype, "visible", void 0);
75
+ __decorate([
76
+ state(),
77
+ __metadata("design:type", Array)
78
+ ], HBackdrop.prototype, "onClickArray", void 0);
79
+ __decorate([
80
+ state(),
81
+ __metadata("design:type", Object)
82
+ ], HBackdrop.prototype, "_backdropLayerCounter", void 0);
83
+ HBackdrop = __decorate([
84
+ phoenixCustomElement('h-backdrop'),
85
+ __metadata("design:paramtypes", [])
86
+ ], HBackdrop);
87
+
88
+ export { HBackdrop };
89
+ //# sourceMappingURL=backdrop.js.map
@@ -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;"}
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;"}
@@ -0,0 +1,7 @@
1
+ export declare const BACKDROP_NAME = "h-backdrop";
2
+ export declare const BACKDROP_CLASS = "backdrop";
3
+ export declare const BACKDROP_EVENTS: {
4
+ show: string;
5
+ hide: string;
6
+ clicked: string;
7
+ };
@@ -0,0 +1,11 @@
1
+ const BACKDROP_NAME = 'h-backdrop';
2
+ const BACKDROP_CLASS = 'backdrop';
3
+ const BACKDROP_EVENT = 'backdrop';
4
+ const BACKDROP_EVENTS = {
5
+ show: `${BACKDROP_EVENT}.show`,
6
+ hide: `${BACKDROP_EVENT}.hide`,
7
+ clicked: `${BACKDROP_EVENT}.clicked`
8
+ };
9
+
10
+ export { BACKDROP_CLASS, BACKDROP_EVENTS, BACKDROP_NAME };
11
+ //# sourceMappingURL=backdrop_constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -0,0 +1,3 @@
1
+ export declare type TBackdropProps = {
2
+ onClick: () => void;
3
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backdrop_types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backdrop_types.js","sourceRoot":"","sources":["../../../../../../../src/components/backdrop/backdrop_types.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
1
  import { TemplateResult } from 'lit';
2
+ import { HDropdownContent } from './dropdown_content';
2
3
  import { IDropdown } from "./dropdown_types";
3
4
  import { PhoenixLightLitElement } from "../../core/phoenix_light_lit_element";
4
5
  export declare class HDropdown extends PhoenixLightLitElement implements IDropdown {
@@ -6,18 +7,25 @@ export declare class HDropdown extends PhoenixLightLitElement implements IDropdo
6
7
  direction: "bottom-center";
7
8
  toggleOnHover: boolean;
8
9
  name: string;
10
+ transition: string;
9
11
  portalTarget: string;
10
12
  $dropdownToggler: HTMLElement | null;
11
13
  $dropdownContent: HTMLElement | null;
14
+ $nestedDropdownContentElements?: HDropdownContent[];
15
+ $hoverableDropdownContentElements: HDropdownContent[];
12
16
  private _positionController;
13
17
  private _clickOutsideController;
14
18
  connectedCallback(): void;
15
- private _setupListeners;
16
19
  private _appendDropdownPortal;
20
+ private _setupListeners;
17
21
  private _handleClickOutside;
18
22
  toggle: () => void;
19
- show: () => void;
20
- hide: () => void;
23
+ show: () => Promise<void>;
24
+ private _dispatchShowDropdownEvent;
25
+ hide: () => Promise<void>;
26
+ private _dispatchHideDropdownEvent;
27
+ private _hoverToggle;
28
+ private _isHoveredWithinDropdown;
21
29
  private _positionDropdownContent;
22
30
  disconnectedCallback(): void;
23
31
  render(): TemplateResult;
@@ -4,7 +4,9 @@ import { property } from 'lit/decorators';
4
4
  import { PhoenixLightLitElement } from '../../core/phoenix_light_lit_element.js';
5
5
  import { phoenixCustomElement } from '../../core/decorators/phoenix_custom_element.js';
6
6
  import { PORTAL_TARGET_COMPONENT_NAME, PORTAL_TARGET_NAME_PROP } from '../portal/portal_constants.js';
7
- import { DEFAULT_DROPDOWN_PORTAL_NAME, DROPDOWN_EVENTS, DROPDOWN_CONTENT_NAME, DROPDOWN_TOGGLER_NAME } from './dropdown_constants.js';
7
+ import { BACKDROP_EVENTS } from '../backdrop/backdrop_constants.js';
8
+ import { DEFAULT_DROPDOWN_PORTAL_NAME, DROPDOWN_CONTENT_VISIBLE_CLASS, DROPDOWN_CONTENT_SHOW, DROPDOWN_EVENTS, DROPDOWN_CONTENT_HIDE, DROPDOWN_CONTENT_NAME, DROPDOWN_TOGGLER_NAME, DROPDOWN_CONTAINER_NAME } from './dropdown_constants.js';
9
+ import { BREAKPOINTS } from '../../global_constants.js';
8
10
  import { CLICK_OUTSIDE_CONTROLLER_MESSAGES } from '../../controllers/click_outside_controller/click_outside_controller_messages.js';
9
11
  import { ClickOutsideController } from '../../controllers/click_outside_controller/click_outside_controller.js';
10
12
  import { DIRECTIONS } from '../../controllers/relative_position_controller/relative_position_controller_constants.js';
@@ -17,27 +19,92 @@ let HDropdown = class HDropdown extends PhoenixLightLitElement {
17
19
  this.direction = DIRECTIONS.bottomCenter;
18
20
  this.toggleOnHover = false;
19
21
  this.name = '';
22
+ this.transition = 'direction';
20
23
  this.portalTarget = DEFAULT_DROPDOWN_PORTAL_NAME;
21
24
  this.toggle = () => {
22
25
  this.opened ? this.hide() : this.show();
23
26
  };
24
- this.show = () => {
25
- this.opened = true;
27
+ this.show = async () => {
28
+ return new Promise((resolve) => {
29
+ var _a;
30
+ (_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.classList.add(DROPDOWN_CONTENT_VISIBLE_CLASS, `${DROPDOWN_CONTENT_SHOW}-${this.transition}-start`);
31
+ this.opened = true;
32
+ window.requestAnimationFrame(() => {
33
+ setTimeout(() => {
34
+ var _a;
35
+ (_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.classList.add(`${DROPDOWN_CONTENT_SHOW}-${this.transition}-end`);
36
+ }, 0);
37
+ const transitionDuration = parseFloat(getComputedStyle(this.$dropdownContent || this).transitionDuration) * 1000;
38
+ setTimeout(() => {
39
+ var _a;
40
+ this._dispatchShowDropdownEvent();
41
+ (_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.classList.remove(`${DROPDOWN_CONTENT_SHOW}-${this.transition}-start`, `${DROPDOWN_CONTENT_SHOW}-${this.transition}-end`);
42
+ resolve();
43
+ }, transitionDuration);
44
+ });
45
+ });
46
+ };
47
+ this._dispatchShowDropdownEvent = () => {
26
48
  const showDropdownEvent = new Event(DROPDOWN_EVENTS.show, {
27
49
  bubbles: true
28
50
  });
29
51
  this.dispatchEvent(showDropdownEvent);
52
+ if (window.innerWidth >= BREAKPOINTS.xs)
53
+ return;
54
+ const showBackdropEvent = new Event(BACKDROP_EVENTS.show, {
55
+ bubbles: true
56
+ });
57
+ document.dispatchEvent(showBackdropEvent);
30
58
  };
31
- this.hide = () => {
32
- this.opened = false;
59
+ this.hide = async () => new Promise((resolve) => {
60
+ const transitionDuration = parseFloat(getComputedStyle(this.$dropdownContent || this).transitionDuration) * 1000;
61
+ window.requestAnimationFrame(() => {
62
+ var _a, _b;
63
+ (_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.classList.remove(`${DROPDOWN_CONTENT_HIDE}-${this.transition}-start`);
64
+ (_b = this.$dropdownContent) === null || _b === void 0 ? void 0 : _b.classList.add(`${DROPDOWN_CONTENT_HIDE}-${this.transition}-end`);
65
+ setTimeout(() => {
66
+ var _a;
67
+ (_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.classList.remove(`${DROPDOWN_CONTENT_HIDE}-${this.transition}-start`, `${DROPDOWN_CONTENT_HIDE}-${this.transition}-end`);
68
+ this.opened = false;
69
+ this._dispatchHideDropdownEvent();
70
+ resolve();
71
+ }, transitionDuration);
72
+ });
73
+ });
74
+ this._dispatchHideDropdownEvent = () => {
33
75
  const hideDropdownEvent = new Event(DROPDOWN_EVENTS.hide, {
34
76
  bubbles: true
35
77
  });
36
78
  this.dispatchEvent(hideDropdownEvent);
79
+ if (window.innerWidth >= BREAKPOINTS.xs)
80
+ return;
81
+ const hideBackdropEvent = new Event(BACKDROP_EVENTS.hide, {
82
+ bubbles: true
83
+ });
84
+ document.dispatchEvent(hideBackdropEvent);
85
+ };
86
+ this._hoverToggle = async (ev) => {
87
+ if (window.innerWidth < BREAKPOINTS.xs)
88
+ return;
89
+ if (!ev.target) {
90
+ await this.hide();
91
+ return;
92
+ }
93
+ const isHoveredWithinDropdown = this._isHoveredWithinDropdown(ev.target);
94
+ if (isHoveredWithinDropdown && !this.opened) {
95
+ await this.show();
96
+ return;
97
+ }
98
+ if (!isHoveredWithinDropdown && this.opened) {
99
+ await this.hide();
100
+ return;
101
+ }
37
102
  };
38
103
  this._positionDropdownContent = () => {
39
104
  requestAnimationFrame(() => {
40
- this.opened && this._positionController.position();
105
+ this.opened && window.innerWidth < BREAKPOINTS.xs
106
+ ? this._positionController.disableRelativePositioning()
107
+ : this._positionController.position();
41
108
  });
42
109
  };
43
110
  }
@@ -48,12 +115,17 @@ let HDropdown = class HDropdown extends PhoenixLightLitElement {
48
115
  this.$dropdownContent = this.querySelector(DROPDOWN_CONTENT_NAME);
49
116
  if (!this.$dropdownToggler)
50
117
  this.$dropdownToggler = this.querySelector(DROPDOWN_TOGGLER_NAME);
118
+ const $nestedDropdown = this.$dropdownContent.querySelector(DROPDOWN_CONTAINER_NAME);
119
+ if ($nestedDropdown && !this.$nestedDropdownContentElements)
120
+ this.$nestedDropdownContentElements = [...$nestedDropdown.querySelectorAll(DROPDOWN_CONTENT_NAME)];
51
121
  if (!this._positionController)
52
122
  this._positionController = new RelativePositionController({
53
123
  host: this,
54
124
  direction: this.direction,
55
125
  relativeElement: this.$dropdownToggler,
56
- elementToPosition: this.$dropdownContent
126
+ elementToPosition: this.$dropdownContent,
127
+ shouldDisablePositioning: () => window.innerWidth < BREAKPOINTS.xs,
128
+ portalElementsNames: [DROPDOWN_CONTENT_NAME]
57
129
  });
58
130
  if (!this._clickOutsideController)
59
131
  this._clickOutsideController = new ClickOutsideController({
@@ -61,16 +133,10 @@ let HDropdown = class HDropdown extends PhoenixLightLitElement {
61
133
  container: this,
62
134
  name: this.name
63
135
  });
64
- this._setupListeners();
65
- }
66
- _setupListeners() {
67
- var _a, _b, _c;
68
- this.addEventListener(CLICK_OUTSIDE_CONTROLLER_MESSAGES.clickedOutside, this._handleClickOutside);
69
- (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.addEventListener('toggle', this.toggle);
70
- if (this.toggleOnHover) {
71
- (_b = this.$dropdownToggler) === null || _b === void 0 ? void 0 : _b.addEventListener('mouseenter', this.show);
72
- (_c = this.$dropdownToggler) === null || _c === void 0 ? void 0 : _c.addEventListener('mouseleave', this.hide);
136
+ if (this.toggleOnHover && !this.$hoverableDropdownContentElements) {
137
+ this.$hoverableDropdownContentElements = [...this.querySelectorAll(DROPDOWN_CONTENT_NAME)];
73
138
  }
139
+ this._setupListeners();
74
140
  }
75
141
  _appendDropdownPortal() {
76
142
  const $dropdownPortalTarget = document.querySelector(`[name="${DEFAULT_DROPDOWN_PORTAL_NAME}"]`);
@@ -80,22 +146,43 @@ let HDropdown = class HDropdown extends PhoenixLightLitElement {
80
146
  document.body.appendChild($portalTarget);
81
147
  }
82
148
  }
83
- _handleClickOutside() {
149
+ _setupListeners() {
84
150
  var _a;
151
+ this.addEventListener(CLICK_OUTSIDE_CONTROLLER_MESSAGES.clickedOutside, this._handleClickOutside);
152
+ (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.addEventListener('toggle', this.toggle);
153
+ if (this.toggleOnHover)
154
+ document.addEventListener('mouseover', this._hoverToggle);
155
+ }
156
+ _handleClickOutside(ev) {
157
+ var _a, _b, _c;
85
158
  if (!this.opened)
86
159
  return;
87
- this.hide();
88
- (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-expanded', 'false');
160
+ const target = ev.detail.target;
161
+ const clickedWithinNestedDropdown = (_a = this.$nestedDropdownContentElements) === null || _a === void 0 ? void 0 : _a.find((element) => element.contains(target));
162
+ const shouldHideElements = !((_b = this.$dropdownContent) === null || _b === void 0 ? void 0 : _b.contains(target)) && !this.contains(target) && !clickedWithinNestedDropdown;
163
+ if (shouldHideElements) {
164
+ this.hide();
165
+ (_c = this.$dropdownToggler) === null || _c === void 0 ? void 0 : _c.setAttribute('aria-expanded', 'false');
166
+ }
167
+ }
168
+ _isHoveredWithinDropdown(element) {
169
+ const $closestDropdownContent = element.closest(DROPDOWN_CONTENT_NAME);
170
+ const isDescendantOfDropdown = element.closest(`${DROPDOWN_CONTAINER_NAME}[name="${this.name}"]`) !== null;
171
+ const isDescendantOfContent = this.$dropdownContent &&
172
+ $closestDropdownContent !== null &&
173
+ !!this.$hoverableDropdownContentElements.find((content) => content.name === $closestDropdownContent.name);
174
+ return isDescendantOfDropdown || isDescendantOfContent || element === this || element === this.$dropdownContent;
89
175
  }
90
176
  disconnectedCallback() {
91
- var _a, _b, _c;
177
+ var _a;
92
178
  super.disconnectedCallback();
93
179
  (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.removeEventListener('toggle', this.toggle);
94
- if (this.toggleOnHover) {
95
- (_b = this.$dropdownToggler) === null || _b === void 0 ? void 0 : _b.removeEventListener('mouseenter', this.show);
96
- (_c = this.$dropdownToggler) === null || _c === void 0 ? void 0 : _c.removeEventListener('mouseleave', this.hide);
180
+ if (this.toggleOnHover)
181
+ document.removeEventListener('mouseover', this._hoverToggle);
182
+ if (this.opened) {
183
+ this.opened = false;
184
+ this._dispatchHideDropdownEvent();
97
185
  }
98
- this.opened = false;
99
186
  }
100
187
  render() {
101
188
  super.render();
@@ -123,6 +210,10 @@ __decorate([
123
210
  property({ type: String }),
124
211
  __metadata("design:type", Object)
125
212
  ], HDropdown.prototype, "name", void 0);
213
+ __decorate([
214
+ property({ type: String }),
215
+ __metadata("design:type", Object)
216
+ ], HDropdown.prototype, "transition", void 0);
126
217
  __decorate([
127
218
  property({ type: String }),
128
219
  __metadata("design:type", Object)
@@ -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;"}
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;"}
@@ -10,3 +10,8 @@ export declare const DROPDOWN_EVENTS: {
10
10
  export declare const DROPDOWN_OPENED_ATTRIBUTE_NAME = "opened";
11
11
  export declare const DROPDOWN_CLASS = "dropdown";
12
12
  export declare const DROPDOWN_CONTENT_CLASS: string;
13
+ export declare const DROPDOWN_TOGGLER_CLASS: string;
14
+ export declare const DROPDOWN_BACKDROP_CLASS: string;
15
+ export declare const DROPDOWN_CONTENT_VISIBLE_CLASS: string;
16
+ export declare const DROPDOWN_CONTENT_SHOW: string;
17
+ export declare const DROPDOWN_CONTENT_HIDE: string;
@@ -10,7 +10,11 @@ const DROPDOWN_EVENTS = {
10
10
  };
11
11
  const DROPDOWN_OPENED_ATTRIBUTE_NAME = 'opened';
12
12
  const DROPDOWN_CLASS = 'dropdown';
13
- const DROPDOWN_CONTENT_CLASS = `${DROPDOWN_CLASS}__content`;
13
+ const DROPDOWN_CONTENT_CLASS = `${DROPDOWN_CLASS}__content`;
14
+ const DROPDOWN_TOGGLER_CLASS = `${DROPDOWN_CLASS}__toggler`;
15
+ const DROPDOWN_CONTENT_VISIBLE_CLASS = `${DROPDOWN_CONTENT_CLASS}_visible`;
16
+ const DROPDOWN_CONTENT_SHOW = `${DROPDOWN_CONTENT_CLASS}_show`;
17
+ const DROPDOWN_CONTENT_HIDE = `${DROPDOWN_CONTENT_CLASS}_hide`;
14
18
 
15
- export { DEFAULT_DROPDOWN_PORTAL_NAME, DROPDOWN_CLASS, DROPDOWN_CONTAINER_NAME, DROPDOWN_CONTENT_CLASS, DROPDOWN_CONTENT_NAME, DROPDOWN_EVENTS, DROPDOWN_NAME, DROPDOWN_OPENED_ATTRIBUTE_NAME, DROPDOWN_TOGGLER_NAME };
19
+ export { DEFAULT_DROPDOWN_PORTAL_NAME, DROPDOWN_CLASS, DROPDOWN_CONTAINER_NAME, DROPDOWN_CONTENT_CLASS, DROPDOWN_CONTENT_HIDE, DROPDOWN_CONTENT_NAME, DROPDOWN_CONTENT_SHOW, DROPDOWN_CONTENT_VISIBLE_CLASS, DROPDOWN_EVENTS, DROPDOWN_NAME, DROPDOWN_OPENED_ATTRIBUTE_NAME, DROPDOWN_TOGGLER_CLASS, DROPDOWN_TOGGLER_NAME };
16
20
  //# sourceMappingURL=dropdown_constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -1,6 +1,7 @@
1
- import { PhoenixLightLitElement } from "../../core/phoenix_light_lit_element";
2
1
  import { TemplateResult } from 'lit';
2
+ import { PhoenixLightLitElement } from "../../core/phoenix_light_lit_element";
3
3
  export declare class HDropdownContent extends PhoenixLightLitElement {
4
+ name: string;
4
5
  constructor();
5
6
  protected render(): TemplateResult;
6
7
  }
@@ -1,5 +1,6 @@
1
1
  import { __decorate, __metadata } from '../../../../../external/tslib/tslib.es6.js';
2
2
  import { html } from 'lit';
3
+ import { property } from 'lit/decorators';
3
4
  import { PhoenixLightLitElement } from '../../core/phoenix_light_lit_element.js';
4
5
  import { phoenixCustomElement } from '../../core/decorators/phoenix_custom_element.js';
5
6
  import { DROPDOWN_CONTENT_CLASS } from './dropdown_constants.js';
@@ -7,6 +8,7 @@ import { DROPDOWN_CONTENT_CLASS } from './dropdown_constants.js';
7
8
  let HDropdownContent = class HDropdownContent extends PhoenixLightLitElement {
8
9
  constructor() {
9
10
  super();
11
+ this.name = '';
10
12
  this.setAttribute('role', 'menu');
11
13
  this.slot = this.hasAttribute('slot') ? this.slot : 'content';
12
14
  this.className = `${DROPDOWN_CONTENT_CLASS} ${this.className}`;
@@ -19,6 +21,10 @@ let HDropdownContent = class HDropdownContent extends PhoenixLightLitElement {
19
21
  return html ` <div role="dialog">${this.getSlot('content')}</div> `;
20
22
  }
21
23
  };
24
+ __decorate([
25
+ property({ type: String }),
26
+ __metadata("design:type", Object)
27
+ ], HDropdownContent.prototype, "name", void 0);
22
28
  HDropdownContent = __decorate([
23
29
  phoenixCustomElement('h-dropdown-content'),
24
30
  __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;"}
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;"}
@@ -3,7 +3,7 @@ import { property, state } from 'lit/decorators';
3
3
  import { PhoenixLightLitElement } from '../../core/phoenix_light_lit_element.js';
4
4
  import { phoenixCustomElement } from '../../core/decorators/phoenix_custom_element.js';
5
5
  import { BtnController } from '../../controllers/btn_controller.js';
6
- import { DROPDOWN_OPENED_ATTRIBUTE_NAME } from './dropdown_constants.js';
6
+ import { DROPDOWN_TOGGLER_CLASS, DROPDOWN_OPENED_ATTRIBUTE_NAME } from './dropdown_constants.js';
7
7
  import { ToggleElementAriaController } from '../../controllers/toggle_element_aria_controller/toggle_element_aria_controller.js';
8
8
 
9
9
  let HDropdownToggler = class HDropdownToggler extends PhoenixLightLitElement {
@@ -19,6 +19,7 @@ let HDropdownToggler = class HDropdownToggler extends PhoenixLightLitElement {
19
19
  this._toggleElementAriaController.toggleAriaExpandedAttribute();
20
20
  };
21
21
  this.slot = this.hasAttribute('slot') ? this.slot : 'toggler';
22
+ this.className = `${DROPDOWN_TOGGLER_CLASS} ${this.className}`;
22
23
  }
23
24
  connectedCallback() {
24
25
  super.connectedCallback();
@@ -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;"}
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;"}
@@ -1,4 +1,4 @@
1
- import { TemplateResult, PropertyValues } from 'lit';
1
+ import { PropertyValues, TemplateResult } from 'lit';
2
2
  import { PhoenixLightLitElement } from "../../core/phoenix_light_lit_element";
3
3
  export declare class HModal extends PhoenixLightLitElement {
4
4
  opened: boolean;
@@ -13,7 +13,6 @@ export declare class HModal extends PhoenixLightLitElement {
13
13
  private _propsChangeStrategies;
14
14
  private static openModals;
15
15
  private static _appendModalsPortal;
16
- private static _appendModalsBackdrop;
17
16
  static isSomeModalOpen(): boolean;
18
17
  constructor();
19
18
  connectedCallback(): void;