@shoper/phoenix_design_system 0.24.2 → 0.24.3

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 (47) hide show
  1. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown.js +45 -29
  2. package/build/cjs/packages/phoenix/src/components/dropdown/dropdown.js.map +1 -1
  3. package/build/cjs/packages/phoenix/src/components/messages/base_message.js +36 -16
  4. package/build/cjs/packages/phoenix/src/components/messages/base_message.js.map +1 -1
  5. package/build/cjs/packages/phoenix/src/components/messages/base_message_constants.js +2 -0
  6. package/build/cjs/packages/phoenix/src/components/messages/base_message_constants.js.map +1 -1
  7. package/build/cjs/packages/phoenix/src/components/messages/hints/hint.js +0 -1
  8. package/build/cjs/packages/phoenix/src/components/messages/hints/hint.js.map +1 -1
  9. package/build/cjs/packages/phoenix/src/components/messages/tooltips/tooltip.js +0 -1
  10. package/build/cjs/packages/phoenix/src/components/messages/tooltips/tooltip.js.map +1 -1
  11. package/build/cjs/packages/phoenix/src/components/tabs/tabs.js +2 -1
  12. package/build/cjs/packages/phoenix/src/components/tabs/tabs.js.map +1 -1
  13. package/build/cjs/packages/phoenix/src/controllers/btn_controller.js +3 -2
  14. package/build/cjs/packages/phoenix/src/controllers/btn_controller.js.map +1 -1
  15. package/build/cjs/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.js +66 -22
  16. package/build/cjs/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.js.map +1 -1
  17. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.d.ts +4 -2
  18. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js +46 -30
  19. package/build/esm/packages/phoenix/src/components/dropdown/dropdown.js.map +1 -1
  20. package/build/esm/packages/phoenix/src/components/messages/base_message.d.ts +6 -3
  21. package/build/esm/packages/phoenix/src/components/messages/base_message.js +37 -17
  22. package/build/esm/packages/phoenix/src/components/messages/base_message.js.map +1 -1
  23. package/build/esm/packages/phoenix/src/components/messages/base_message_constants.d.ts +1 -0
  24. package/build/esm/packages/phoenix/src/components/messages/base_message_constants.js +4 -3
  25. package/build/esm/packages/phoenix/src/components/messages/base_message_constants.js.map +1 -1
  26. package/build/esm/packages/phoenix/src/components/messages/base_message_types.d.ts +4 -0
  27. package/build/esm/packages/phoenix/src/components/messages/base_message_types.js +2 -0
  28. package/build/esm/packages/phoenix/src/components/messages/base_message_types.js.map +1 -0
  29. package/build/esm/packages/phoenix/src/components/messages/hints/hint.js +0 -1
  30. package/build/esm/packages/phoenix/src/components/messages/hints/hint.js.map +1 -1
  31. package/build/esm/packages/phoenix/src/components/messages/tooltips/tooltip.js +0 -1
  32. package/build/esm/packages/phoenix/src/components/messages/tooltips/tooltip.js.map +1 -1
  33. package/build/esm/packages/phoenix/src/components/portal/portal_constants.d.ts +1 -0
  34. package/build/esm/packages/phoenix/src/components/tabs/tabs.js +2 -1
  35. package/build/esm/packages/phoenix/src/components/tabs/tabs.js.map +1 -1
  36. package/build/esm/packages/phoenix/src/controllers/btn_controller.js +3 -2
  37. package/build/esm/packages/phoenix/src/controllers/btn_controller.js.map +1 -1
  38. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.d.ts +11 -4
  39. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.js +66 -22
  40. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller.js.map +1 -1
  41. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller_types.d.ts +2 -1
  42. package/package.json +1 -1
  43. package/build/cjs/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller_constants.js +0 -8
  44. package/build/cjs/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller_constants.js.map +0 -1
  45. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller_constants.d.ts +0 -1
  46. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller_constants.js +0 -4
  47. package/build/esm/packages/phoenix/src/controllers/keystrokes_controller/keystrokes_controller_constants.js.map +0 -1
@@ -11,6 +11,7 @@ var portal_constants = require('../portal/portal_constants.js');
11
11
  var litHtml = require('lit-html');
12
12
  var backdrop_controller = require('../backdrop/controller/backdrop_controller.js');
13
13
  var decorators_js = require('@lit/reactive-element/decorators.js');
14
+ var keystrokes_controller = require('../../controllers/keystrokes_controller/keystrokes_controller.js');
14
15
  var global_constants = require('../../global_constants.js');
15
16
  var dropdown_constants = require('./dropdown_constants.js');
16
17
  var relative_position_controller_constants = require('../../controllers/relative_position_controller/relative_position_controller_constants.js');
@@ -21,7 +22,7 @@ var relative_position_controller = require('../../controllers/relative_position_
21
22
  var HDropdown_1;
22
23
  exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_element.PhoenixLightLitElement {
23
24
  constructor() {
24
- super(...arguments);
25
+ super();
25
26
  this.opened = false;
26
27
  this.direction = relative_position_controller_constants.DIRECTIONS.bottomCenter;
27
28
  this.toggleOnHover = false;
@@ -55,13 +56,13 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
55
56
  }, 0);
56
57
  const transitionDuration = parseFloat(getComputedStyle(this.$dropdownContent || this).transitionDuration) * 1000;
57
58
  setTimeout(() => {
58
- var _a, _b, _c;
59
+ var _a, _b;
59
60
  this._dispatchShowDropdownEvent();
60
61
  (_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.classList.remove(`${dropdown_constants.DROPDOWN_CONTENT_SHOW}-${this.transition}-start`, `${dropdown_constants.DROPDOWN_CONTENT_SHOW}-${this.transition}-end`);
61
62
  this._toggleScroll();
62
63
  if (!this._lastFocusableElement)
63
64
  this._lastFocusableElement = (_b = this.$dropdownContent) === null || _b === void 0 ? void 0 : _b.lastElementChild;
64
- this._focusOnNextSibling((_c = this.$dropdownContent) === null || _c === void 0 ? void 0 : _c.firstElementChild);
65
+ utilities.UiDomUtils.setFocusToFirstFocusableElementInContainer(this.$dropdownContent);
65
66
  resolve();
66
67
  }, transitionDuration);
67
68
  });
@@ -132,20 +133,35 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
132
133
  return;
133
134
  await this.hide();
134
135
  };
135
- this._handleFocusWithinDropdown = async (ev) => {
136
+ this._handleForwardFocus = async (ev) => {
137
+ const $focusableElementsWithinDropdownContent = utilities.UiDomUtils.getFocusableElements(this.$dropdownContent);
138
+ const doesNotHaveFocusableElementsInsideContent = $focusableElementsWithinDropdownContent.length <= 0 && this.opened;
139
+ const isActiveElementLastFocusableElement = document.activeElement === this._lastFocusableElement;
140
+ if (doesNotHaveFocusableElementsInsideContent || isActiveElementLastFocusableElement)
141
+ this._focusOnNextElementAfterToggler(ev);
142
+ };
143
+ this._focusOnNextElementAfterToggler = async (ev) => {
144
+ ev.preventDefault();
145
+ const $focusableElements = utilities.UiDomUtils.getFocusableElements(document.body);
146
+ const indexOfDropdownToggler = $focusableElements.indexOf(this.$dropdownToggler);
147
+ const $nextElementToFocus = $focusableElements.find((currentElement, index) => {
148
+ if (index > indexOfDropdownToggler && !currentElement.closest(`${dropdown_constants.DROPDOWN_TOGGLER_NAME}[name="${this.name}"]`))
149
+ return currentElement;
150
+ return null;
151
+ });
152
+ if ($nextElementToFocus)
153
+ $nextElementToFocus.focus();
154
+ await this._hideDropdownsSequentially();
155
+ await this.hide();
156
+ };
157
+ this._handleBackwardFocus = async (ev) => {
136
158
  var _a;
137
- const hasTabBeenPressed = ev.key.toLowerCase() === 'tab';
138
- if (hasTabBeenPressed && document.activeElement === this._lastFocusableElement) {
139
- ev.preventDefault();
140
- this._focusOnNextSibling(this.nextElementSibling || this);
141
- await this._hideDropdownsSequentially();
142
- }
143
159
  const $firstFocusableElement = this.$dropdownContent && utilities.UiDomUtils.getFocusableElement(this.$dropdownContent);
144
- if (hasTabBeenPressed && ev.shiftKey && document.activeElement === $firstFocusableElement) {
145
- ev.preventDefault();
146
- (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
147
- await this._hideDropdownsSequentially();
148
- }
160
+ if (document.activeElement !== $firstFocusableElement)
161
+ return;
162
+ ev.preventDefault();
163
+ (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
164
+ await this._hideDropdownsSequentially();
149
165
  };
150
166
  this._hoverToggle = async (ev) => {
151
167
  if (window.innerWidth < global_constants.BREAKPOINTS.xs)
@@ -169,6 +185,18 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
169
185
  : this._positionController.position();
170
186
  });
171
187
  };
188
+ new keystrokes_controller.KeystrokesController({
189
+ host: this,
190
+ target: document.body,
191
+ keys: ['tab'],
192
+ callback: this._handleForwardFocus
193
+ });
194
+ new keystrokes_controller.KeystrokesController({
195
+ host: this,
196
+ target: document.body,
197
+ keys: [['shift', 'tab']],
198
+ callback: this._handleBackwardFocus
199
+ });
172
200
  }
173
201
  connectedCallback() {
174
202
  var _a;
@@ -225,7 +253,6 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
225
253
  document.addEventListener(dropdown_constants.DROPDOWN_EVENTS.hide, this.hide);
226
254
  window.addEventListener('resize', this._observeScrollToggling);
227
255
  document.addEventListener('keydown', this._closeDropdownOnEscape);
228
- document.addEventListener('keydown', this._handleFocusWithinDropdown);
229
256
  if (this.toggleOnHover)
230
257
  document.addEventListener('mouseover', this._hoverToggle);
231
258
  }
@@ -245,17 +272,6 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
245
272
  (_b = this.$dropdownContent) === null || _b === void 0 ? void 0 : _b.classList.add(global_constants.SCROLLABLE_CLASS_NAME);
246
273
  }
247
274
  }
248
- _focusOnNextSibling(el) {
249
- el.focus();
250
- if (el === document.activeElement)
251
- return;
252
- if (el.firstElementChild) {
253
- this._focusOnNextSibling(el.firstElementChild);
254
- return;
255
- }
256
- if (el.nextElementSibling)
257
- this._focusOnNextSibling(el.nextElementSibling);
258
- }
259
275
  _isHoveredWithinDropdown(element) {
260
276
  var _a;
261
277
  if (element === this)
@@ -287,7 +303,6 @@ exports.HDropdown = HDropdown_1 = class HDropdown extends phoenix_light_lit_elem
287
303
  window.removeEventListener('resize', this._observeScrollToggling);
288
304
  document.removeEventListener('keydown', this._closeDropdownOnEscape);
289
305
  document.removeEventListener(dropdown_constants.DROPDOWN_EVENTS.hide, this.hide);
290
- document.removeEventListener('keydown', this._handleFocusWithinDropdown);
291
306
  if (this.toggleOnHover)
292
307
  document.removeEventListener('mouseover', this._hoverToggle);
293
308
  if (this.opened) {
@@ -334,6 +349,7 @@ tslib_es6.__decorate([
334
349
  tslib_es6.__metadata("design:type", Object)
335
350
  ], exports.HDropdown.prototype, "_lastFocusableElement", void 0);
336
351
  exports.HDropdown = HDropdown_1 = tslib_es6.__decorate([
337
- phoenix_custom_element.phoenixCustomElement('h-dropdown')
352
+ phoenix_custom_element.phoenixCustomElement('h-dropdown'),
353
+ tslib_es6.__metadata("design:paramtypes", [])
338
354
  ], exports.HDropdown);
339
355
  //# sourceMappingURL=dropdown.js.map
@@ -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,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;"}
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,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;"}
@@ -21,9 +21,9 @@ class BaseMessage extends phoenix_light_lit_element.PhoenixLightLitElement {
21
21
  this.direction = relative_position_controller_constants.DIRECTIONS.topCenter;
22
22
  this.offset = base_message_constants.DEFAULT_MESSAGE_OFFSET;
23
23
  this._setupEventListeners = () => {
24
- this.addEventListener('mouseenter', this._open);
25
- this.addEventListener('mouseleave', this._close);
26
- this.addEventListener('focus', this._open);
24
+ this.addEventListener('mouseenter', this.open);
25
+ this.addEventListener('mouseleave', this.close);
26
+ this.addEventListener('focus', this.open);
27
27
  };
28
28
  this._positionMessage = () => {
29
29
  requestAnimationFrame(() => {
@@ -31,7 +31,7 @@ class BaseMessage extends phoenix_light_lit_element.PhoenixLightLitElement {
31
31
  (_a = this._$messageContent) === null || _a === void 0 ? void 0 : _a.setAttribute('direction', this._positionController.position());
32
32
  });
33
33
  };
34
- this._open = () => {
34
+ this.open = () => {
35
35
  this._tooltipOpenTime = Date.now();
36
36
  clearTimeout(this._closeTimeout);
37
37
  this._openTimeout = setTimeout(() => {
@@ -40,7 +40,7 @@ class BaseMessage extends phoenix_light_lit_element.PhoenixLightLitElement {
40
40
  this.opened = true;
41
41
  }, base_message_constants.MESSAGE_SHOW_DELAY_IN_MS);
42
42
  };
43
- this._close = () => {
43
+ this.close = () => {
44
44
  this._shouldDelayClosing = Date.now() - this._tooltipOpenTime > base_message_constants.MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS;
45
45
  clearTimeout(this._openTimeout);
46
46
  if (!this.opened)
@@ -62,31 +62,46 @@ class BaseMessage extends phoenix_light_lit_element.PhoenixLightLitElement {
62
62
  this._handleFocusWithinMessage = (ev) => {
63
63
  var _a;
64
64
  if (((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(`.${this._messageComponentName}`)) !== this)
65
- this._close();
66
- if (!document.activeElement)
65
+ this.close();
66
+ if (!document.activeElement || ev.shiftKey)
67
67
  return;
68
68
  const $focusableElements = utilities.UiDomUtils.getFocusableElements(this);
69
69
  const activeElementIndex = $focusableElements.indexOf(document.activeElement);
70
- // jeśli jest przedostatni, to następnym elementem jest sentinel
71
- const isPenultimate = activeElementIndex + 1 === $focusableElements.length - 1;
72
- if (!isPenultimate)
70
+ const isLastFocusableChild = activeElementIndex === $focusableElements.length - 1;
71
+ if (!isLastFocusableChild)
73
72
  return;
74
- this._close();
75
- ev.preventDefault();
76
- const $focusableParentElements = utilities.UiDomUtils.getFocusableElements(document.body);
77
- const sentinelIndex = $focusableParentElements.indexOf(document.activeElement) + 1;
78
- $focusableParentElements[sentinelIndex + 1].focus();
73
+ this.close();
74
+ };
75
+ this._handleReverseTab = () => {
76
+ const $focusableElements = utilities.UiDomUtils.getFocusableElements(document.body);
77
+ const activeElement = document.activeElement;
78
+ const indexOfCurrentlyFocusedElement = $focusableElements.indexOf(activeElement);
79
+ const $previousElement = $focusableElements[indexOfCurrentlyFocusedElement - 1];
80
+ const $previousElementMessageParent = $previousElement === null || $previousElement === void 0 ? void 0 : $previousElement.closest(`h-${this._messageComponentName}`);
81
+ if ($previousElementMessageParent === this)
82
+ return;
83
+ if ($previousElementMessageParent)
84
+ $previousElementMessageParent.open();
85
+ if (this._isBaseMessage(activeElement))
86
+ activeElement.close();
79
87
  };
80
88
  this._clickOutsideController = new click_outside_controller.ClickOutsideController({
81
89
  host: this,
82
90
  container: this,
83
- action: this._close
91
+ action: this.close
84
92
  });
85
93
  new keystrokes_controller.KeystrokesController({
86
94
  host: this,
87
95
  keys: ['tab'],
96
+ target: this,
88
97
  callback: this._handleFocusWithinMessage
89
98
  });
99
+ new keystrokes_controller.KeystrokesController({
100
+ host: this,
101
+ keys: [['shift', 'tab']],
102
+ target: document.body,
103
+ callback: this._handleReverseTab
104
+ });
90
105
  }
91
106
  connectedCallback(messageComponentName = '') {
92
107
  super.connectedCallback();
@@ -113,6 +128,11 @@ class BaseMessage extends phoenix_light_lit_element.PhoenixLightLitElement {
113
128
  $portalTarget.setAttribute(portal_constants.PORTAL_TARGET_NAME_PROP, base_message_constants.DEFAULT_MESSAGE_PORTAL_NAME);
114
129
  document.body.appendChild($portalTarget);
115
130
  }
131
+ _isBaseMessage($element) {
132
+ if (base_message_constants.MESSAGE_ELEMENTS.includes($element.localName))
133
+ return true;
134
+ return false;
135
+ }
116
136
  }
117
137
  tslib_es6.__decorate([
118
138
  decorators.property({ type: Boolean, reflect: true }),
@@ -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;"}
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;"}
@@ -9,6 +9,7 @@ const DEFAULT_MESSAGE_PORTAL_NAME = 'message-portal';
9
9
  const MESSAGE_CONTENT_SLOT_NAME = 'message-content';
10
10
  const MESSAGE_REMOVED_CLASS_NAME = `removed`;
11
11
  const DEFAULT_MESSAGE_OFFSET = 10;
12
+ const MESSAGE_ELEMENTS = [tooltip_constants.TOOLTIP_ELEMENT_NAME, hint_constants.HINT_ELEMENT_NAME];
12
13
  const MESSAGE_CONTENT_ELEMENTS = [tooltip_constants.TOOLTIP_CONTENT_ELEMENT_NAME, hint_constants.HINT_CONTENT_ELEMENT_NAME];
13
14
  const MESSAGE_SHOW_DELAY_IN_MS = 100;
14
15
  const MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS = 500;
@@ -19,6 +20,7 @@ exports.DEFAULT_MESSAGE_PORTAL_NAME = DEFAULT_MESSAGE_PORTAL_NAME;
19
20
  exports.MESSAGE_CLOSE_DELAY_IN_MS = MESSAGE_CLOSE_DELAY_IN_MS;
20
21
  exports.MESSAGE_CONTENT_ELEMENTS = MESSAGE_CONTENT_ELEMENTS;
21
22
  exports.MESSAGE_CONTENT_SLOT_NAME = MESSAGE_CONTENT_SLOT_NAME;
23
+ exports.MESSAGE_ELEMENTS = MESSAGE_ELEMENTS;
22
24
  exports.MESSAGE_REMOVED_CLASS_NAME = MESSAGE_REMOVED_CLASS_NAME;
23
25
  exports.MESSAGE_SHOW_DELAY_IN_MS = MESSAGE_SHOW_DELAY_IN_MS;
24
26
  exports.MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS = MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS;
@@ -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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -24,7 +24,6 @@ exports.HHint = class HHint extends base_message.BaseMessage {
24
24
  <h-portal ?disabled="${!this.opened}" @portal.open="${this._positionMessage}" to="${this.portalTarget}" hidden>
25
25
  ${this.getSlot(base_message_constants.MESSAGE_CONTENT_SLOT_NAME)}
26
26
  </h-portal>
27
- <div tabindex="0"></div>
28
27
  `;
29
28
  }
30
29
  };
@@ -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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -20,7 +20,6 @@ exports.HTooltip = class HTooltip extends base_message.BaseMessage {
20
20
  <h-portal ?disabled="${!this.opened}" @portal.open="${this._positionMessage}" to="${this.portalTarget}" hidden>
21
21
  ${this.getSlot(base_message_constants.MESSAGE_CONTENT_SLOT_NAME)}
22
22
  </h-portal>
23
- <div tabindex="0"></div>
24
23
  `;
25
24
  }
26
25
  };
@@ -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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -44,7 +44,8 @@ exports.HTabs = class HTabs extends phoenix_light_lit_element.PhoenixLightLitEle
44
44
  new keystrokes_controller.KeystrokesController({
45
45
  host: this,
46
46
  keys: ['ArrowRight', 'ArrowLeft'],
47
- callback: this._handleArrowNavigation
47
+ callback: this._handleArrowNavigation,
48
+ target: this
48
49
  });
49
50
  }
50
51
  _getFocusedTabIndex() {
@@ -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;"}
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;"}
@@ -12,8 +12,9 @@ class BtnController {
12
12
  this.host.setAttribute('role', 'button');
13
13
  this._keystrokesController = new keystrokes_controller.KeystrokesController({
14
14
  host,
15
- keys: [' ', 'enter'],
16
- callback
15
+ keys: ['enter', ' '],
16
+ callback,
17
+ target: host
17
18
  });
18
19
  }
19
20
  hostConnected() { }
@@ -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;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;AACA;AACA;AACA;AACA;AACA;"}
@@ -4,47 +4,91 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var tslib_es6 = require('../../../../../external/tslib/tslib.es6.js');
6
6
  require('lit');
7
- var keystrokes_controller_constants = require('./keystrokes_controller_constants.js');
8
7
 
9
- var _KeystrokesController_host;
8
+ var _KeystrokesController_host, _KeystrokesController_target;
10
9
  class KeystrokesController {
11
- constructor({ host, keys, callback }) {
10
+ constructor({ host, keys, callback, target }) {
12
11
  _KeystrokesController_host.set(this, void 0);
12
+ _KeystrokesController_target.set(this, void 0);
13
13
  this._buffer = [];
14
- this._lastKeyTime = Date.now();
15
- this._catchKeySequence = (ev) => {
16
- // ev.stopImmediatePropagation();
14
+ this._clearBuffer = () => {
15
+ this._buffer = [];
16
+ };
17
+ this._saveKey = (ev) => {
17
18
  const key = ev.key.toLowerCase();
18
- const currentTime = Date.now();
19
- if (currentTime - this._lastKeyTime > keystrokes_controller_constants.KEYSTROKE_DELAY_IN_MS) {
20
- this._buffer = [];
19
+ if (!this._buffer.includes(key))
20
+ this._buffer = [...this._buffer, key];
21
+ this._bindSavedKeysWithCallback(ev, this._buffer);
22
+ };
23
+ this._bindSavedKeysWithCallback = (ev, savedKeys) => {
24
+ if (typeof this._keys === 'string') {
25
+ this._bindWithOneKey(ev, savedKeys);
26
+ return;
21
27
  }
22
- this._buffer.push(key);
23
- this._lastKeyTime = currentTime;
24
- this._bindKeysWithCallback(ev, this._buffer.join(''));
28
+ const areAllKeysPressed = this._isKeySequenceMultiple(this._keys)
29
+ ? this._areAllKeysPressedInMultipleSequences(this._keys, savedKeys)
30
+ : this._isOneOfTheKeysPressed(this._keys, savedKeys);
31
+ if (areAllKeysPressed)
32
+ this._callback(ev);
25
33
  };
26
- this._bindKeysWithCallback = (ev, keySequence) => {
27
- const isCorrectKeyPressed = !!this._keys.find((key) => {
28
- return key.toLowerCase() === keySequence;
34
+ this._bindWithOneKey = (ev, savedKeys) => {
35
+ if (!savedKeys.includes(this._keys))
36
+ return;
37
+ this._callback(ev);
38
+ };
39
+ this._isKeySequenceMultiple = (keySequence) => {
40
+ const firstSequence = keySequence[0];
41
+ if (typeof firstSequence === 'object')
42
+ return true;
43
+ return false;
44
+ };
45
+ this._areAllKeysPressedInMultipleSequences = (keySequences, savedKeys) => {
46
+ return !!keySequences.find((keySequence) => {
47
+ return this._areAllKeysPressedInSingleSequence(keySequence, savedKeys);
29
48
  });
30
- if (isCorrectKeyPressed) {
31
- this._buffer = [];
32
- this._callback(ev);
33
- }
49
+ };
50
+ this._areAllKeysPressedInSingleSequence = (keySequence, savedKeys) => {
51
+ const indexesInSavedKeys = this._calculateIndexesInSavedKeys(keySequence, savedKeys);
52
+ if (indexesInSavedKeys.includes(-1))
53
+ return false;
54
+ const firstPressedKeyIndex = indexesInSavedKeys[0];
55
+ const lastPressedKeyIndex = indexesInSavedKeys[indexesInSavedKeys.length - 1];
56
+ const areKeysPressedSequentially = lastPressedKeyIndex - firstPressedKeyIndex === indexesInSavedKeys.length - 1;
57
+ return areKeysPressedSequentially;
58
+ };
59
+ this._isOneOfTheKeysPressed = (keys, savedKeys) => {
60
+ const indexesInSavedKeys = this._calculateIndexesInSavedKeys(keys, savedKeys);
61
+ return typeof indexesInSavedKeys.find((index) => index > -1) === 'number';
62
+ };
63
+ this._calculateIndexesInSavedKeys = (keySequence, savedKeys) => {
64
+ return keySequence.reduce((allIndexes, currentKeyInSequence) => {
65
+ return [...allIndexes, savedKeys.indexOf(currentKeyInSequence.toLowerCase())];
66
+ }, []);
67
+ };
68
+ // do ogrania jeszcze string czyli zapięcie się na jeden guzik
69
+ this._removeKey = (ev) => {
70
+ const key = ev.key.toLowerCase();
71
+ if (this._buffer.includes(key))
72
+ this._buffer = this._buffer.filter((currentSavedKey) => currentSavedKey !== key);
34
73
  };
35
74
  tslib_es6.__classPrivateFieldSet(this, _KeystrokesController_host, host, "f");
75
+ tslib_es6.__classPrivateFieldSet(this, _KeystrokesController_target, target, "f");
36
76
  this._keys = keys;
37
77
  this._callback = callback;
38
78
  tslib_es6.__classPrivateFieldGet(this, _KeystrokesController_host, "f").addController(this);
79
+ tslib_es6.__classPrivateFieldGet(this, _KeystrokesController_target, "f").addEventListener('keydown', this._saveKey);
80
+ tslib_es6.__classPrivateFieldGet(this, _KeystrokesController_target, "f").addEventListener('keyup', this._removeKey);
39
81
  }
40
82
  hostConnected() {
41
- tslib_es6.__classPrivateFieldGet(this, _KeystrokesController_host, "f").addEventListener('keydown', this._catchKeySequence);
83
+ tslib_es6.__classPrivateFieldGet(this, _KeystrokesController_host, "f").addEventListener('focusout', this._clearBuffer);
42
84
  }
43
85
  hostDisconnected() {
44
- tslib_es6.__classPrivateFieldGet(this, _KeystrokesController_host, "f").removeEventListener('keydown', this._catchKeySequence);
86
+ tslib_es6.__classPrivateFieldGet(this, _KeystrokesController_host, "f").removeEventListener('focusout', this._clearBuffer);
87
+ tslib_es6.__classPrivateFieldGet(this, _KeystrokesController_target, "f").addEventListener('keydown', this._saveKey);
88
+ tslib_es6.__classPrivateFieldGet(this, _KeystrokesController_target, "f").addEventListener('keyup', this._removeKey);
45
89
  }
46
90
  }
47
- _KeystrokesController_host = new WeakMap();
91
+ _KeystrokesController_host = new WeakMap(), _KeystrokesController_target = new WeakMap();
48
92
 
49
93
  exports.KeystrokesController = KeystrokesController;
50
94
  //# sourceMappingURL=keystrokes_controller.js.map
@@ -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;"}
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;"}
@@ -20,6 +20,7 @@ export declare class HDropdown extends PhoenixLightLitElement implements IDropdo
20
20
  private _backdropController;
21
21
  _lastFocusableElement: HTMLElement | undefined;
22
22
  private _rootDropdown?;
23
+ constructor();
23
24
  connectedCallback(): void;
24
25
  private static _appendDropdownPortal;
25
26
  private _findRootDropdown;
@@ -36,8 +37,9 @@ export declare class HDropdown extends PhoenixLightLitElement implements IDropdo
36
37
  private _observeScrollToggling;
37
38
  private _toggleScroll;
38
39
  private _closeDropdownOnEscape;
39
- private _handleFocusWithinDropdown;
40
- private _focusOnNextSibling;
40
+ private _handleForwardFocus;
41
+ private _focusOnNextElementAfterToggler;
42
+ private _handleBackwardFocus;
41
43
  private _hoverToggle;
42
44
  private _isHoveredWithinDropdown;
43
45
  private _setupInitialDropdownProperties;
@@ -7,8 +7,9 @@ import { PORTAL_TARGET_COMPONENT_NAME, PORTAL_TARGET_NAME_PROP } from '../portal
7
7
  import { html } from 'lit-html';
8
8
  import { BackdropController } from '../backdrop/controller/backdrop_controller.js';
9
9
  import { property } from '@lit/reactive-element/decorators.js';
10
+ import { KeystrokesController } from '../../controllers/keystrokes_controller/keystrokes_controller.js';
10
11
  import { BREAKPOINTS, SCROLLABLE_CLASS_NAME } from '../../global_constants.js';
11
- import { DEFAULT_DROPDOWN_PORTAL_NAME, DROPDOWN_CONTENT_VISIBLE_CLASS, DROPDOWN_CONTENT_SHOW, DROPDOWN_EVENTS, DROPDOWN_CONTAINER_NAME, DROPDOWN_CONTENT_HIDE, DROPDOWN_CONTENT_NAME, DROPDOWN_TOGGLER_NAME } from './dropdown_constants.js';
12
+ import { DEFAULT_DROPDOWN_PORTAL_NAME, DROPDOWN_CONTENT_VISIBLE_CLASS, DROPDOWN_CONTENT_SHOW, DROPDOWN_EVENTS, DROPDOWN_CONTAINER_NAME, DROPDOWN_CONTENT_HIDE, DROPDOWN_TOGGLER_NAME, DROPDOWN_CONTENT_NAME } from './dropdown_constants.js';
12
13
  import { DIRECTIONS, RELATIVE_POSITION_CONTROLLER_EVENTS, DEFAULT_THROTTLE_WAIT_TIME } from '../../controllers/relative_position_controller/relative_position_controller_constants.js';
13
14
  import { ClickOutsideController } from '../../controllers/click_outside_controller/click_outside_controller.js';
14
15
  import throttle_1 from '../../../../../external/lodash/throttle.js';
@@ -17,7 +18,7 @@ import { RelativePositionController } from '../../controllers/relative_position_
17
18
  var HDropdown_1;
18
19
  let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
19
20
  constructor() {
20
- super(...arguments);
21
+ super();
21
22
  this.opened = false;
22
23
  this.direction = DIRECTIONS.bottomCenter;
23
24
  this.toggleOnHover = false;
@@ -51,13 +52,13 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
51
52
  }, 0);
52
53
  const transitionDuration = parseFloat(getComputedStyle(this.$dropdownContent || this).transitionDuration) * 1000;
53
54
  setTimeout(() => {
54
- var _a, _b, _c;
55
+ var _a, _b;
55
56
  this._dispatchShowDropdownEvent();
56
57
  (_a = this.$dropdownContent) === null || _a === void 0 ? void 0 : _a.classList.remove(`${DROPDOWN_CONTENT_SHOW}-${this.transition}-start`, `${DROPDOWN_CONTENT_SHOW}-${this.transition}-end`);
57
58
  this._toggleScroll();
58
59
  if (!this._lastFocusableElement)
59
60
  this._lastFocusableElement = (_b = this.$dropdownContent) === null || _b === void 0 ? void 0 : _b.lastElementChild;
60
- this._focusOnNextSibling((_c = this.$dropdownContent) === null || _c === void 0 ? void 0 : _c.firstElementChild);
61
+ UiDomUtils.setFocusToFirstFocusableElementInContainer(this.$dropdownContent);
61
62
  resolve();
62
63
  }, transitionDuration);
63
64
  });
@@ -128,20 +129,35 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
128
129
  return;
129
130
  await this.hide();
130
131
  };
131
- this._handleFocusWithinDropdown = async (ev) => {
132
+ this._handleForwardFocus = async (ev) => {
133
+ const $focusableElementsWithinDropdownContent = UiDomUtils.getFocusableElements(this.$dropdownContent);
134
+ const doesNotHaveFocusableElementsInsideContent = $focusableElementsWithinDropdownContent.length <= 0 && this.opened;
135
+ const isActiveElementLastFocusableElement = document.activeElement === this._lastFocusableElement;
136
+ if (doesNotHaveFocusableElementsInsideContent || isActiveElementLastFocusableElement)
137
+ this._focusOnNextElementAfterToggler(ev);
138
+ };
139
+ this._focusOnNextElementAfterToggler = async (ev) => {
140
+ ev.preventDefault();
141
+ const $focusableElements = UiDomUtils.getFocusableElements(document.body);
142
+ const indexOfDropdownToggler = $focusableElements.indexOf(this.$dropdownToggler);
143
+ const $nextElementToFocus = $focusableElements.find((currentElement, index) => {
144
+ if (index > indexOfDropdownToggler && !currentElement.closest(`${DROPDOWN_TOGGLER_NAME}[name="${this.name}"]`))
145
+ return currentElement;
146
+ return null;
147
+ });
148
+ if ($nextElementToFocus)
149
+ $nextElementToFocus.focus();
150
+ await this._hideDropdownsSequentially();
151
+ await this.hide();
152
+ };
153
+ this._handleBackwardFocus = async (ev) => {
132
154
  var _a;
133
- const hasTabBeenPressed = ev.key.toLowerCase() === 'tab';
134
- if (hasTabBeenPressed && document.activeElement === this._lastFocusableElement) {
135
- ev.preventDefault();
136
- this._focusOnNextSibling(this.nextElementSibling || this);
137
- await this._hideDropdownsSequentially();
138
- }
139
155
  const $firstFocusableElement = this.$dropdownContent && UiDomUtils.getFocusableElement(this.$dropdownContent);
140
- if (hasTabBeenPressed && ev.shiftKey && document.activeElement === $firstFocusableElement) {
141
- ev.preventDefault();
142
- (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
143
- await this._hideDropdownsSequentially();
144
- }
156
+ if (document.activeElement !== $firstFocusableElement)
157
+ return;
158
+ ev.preventDefault();
159
+ (_a = this.$dropdownToggler) === null || _a === void 0 ? void 0 : _a.focus();
160
+ await this._hideDropdownsSequentially();
145
161
  };
146
162
  this._hoverToggle = async (ev) => {
147
163
  if (window.innerWidth < BREAKPOINTS.xs)
@@ -165,6 +181,18 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
165
181
  : this._positionController.position();
166
182
  });
167
183
  };
184
+ new KeystrokesController({
185
+ host: this,
186
+ target: document.body,
187
+ keys: ['tab'],
188
+ callback: this._handleForwardFocus
189
+ });
190
+ new KeystrokesController({
191
+ host: this,
192
+ target: document.body,
193
+ keys: [['shift', 'tab']],
194
+ callback: this._handleBackwardFocus
195
+ });
168
196
  }
169
197
  connectedCallback() {
170
198
  var _a;
@@ -221,7 +249,6 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
221
249
  document.addEventListener(DROPDOWN_EVENTS.hide, this.hide);
222
250
  window.addEventListener('resize', this._observeScrollToggling);
223
251
  document.addEventListener('keydown', this._closeDropdownOnEscape);
224
- document.addEventListener('keydown', this._handleFocusWithinDropdown);
225
252
  if (this.toggleOnHover)
226
253
  document.addEventListener('mouseover', this._hoverToggle);
227
254
  }
@@ -241,17 +268,6 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
241
268
  (_b = this.$dropdownContent) === null || _b === void 0 ? void 0 : _b.classList.add(SCROLLABLE_CLASS_NAME);
242
269
  }
243
270
  }
244
- _focusOnNextSibling(el) {
245
- el.focus();
246
- if (el === document.activeElement)
247
- return;
248
- if (el.firstElementChild) {
249
- this._focusOnNextSibling(el.firstElementChild);
250
- return;
251
- }
252
- if (el.nextElementSibling)
253
- this._focusOnNextSibling(el.nextElementSibling);
254
- }
255
271
  _isHoveredWithinDropdown(element) {
256
272
  var _a;
257
273
  if (element === this)
@@ -283,7 +299,6 @@ let HDropdown = HDropdown_1 = class HDropdown extends PhoenixLightLitElement {
283
299
  window.removeEventListener('resize', this._observeScrollToggling);
284
300
  document.removeEventListener('keydown', this._closeDropdownOnEscape);
285
301
  document.removeEventListener(DROPDOWN_EVENTS.hide, this.hide);
286
- document.removeEventListener('keydown', this._handleFocusWithinDropdown);
287
302
  if (this.toggleOnHover)
288
303
  document.removeEventListener('mouseover', this._hoverToggle);
289
304
  if (this.opened) {
@@ -330,7 +345,8 @@ __decorate([
330
345
  __metadata("design:type", Object)
331
346
  ], HDropdown.prototype, "_lastFocusableElement", void 0);
332
347
  HDropdown = HDropdown_1 = __decorate([
333
- phoenixCustomElement('h-dropdown')
348
+ phoenixCustomElement('h-dropdown'),
349
+ __metadata("design:paramtypes", [])
334
350
  ], HDropdown);
335
351
 
336
352
  export { HDropdown };
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,uCAAuC,4CAAgD;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,4CAAgD;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
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,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;"}
@@ -1,6 +1,7 @@
1
+ import { IBaseMessage } from './base_message_types';
1
2
  import { PhoenixLightLitElement } from "../../core/phoenix_light_lit_element/phoenix_light_lit_element";
2
3
  import type { TDirection } from "../../controllers/relative_position_controller/relative_position_controller_types";
3
- export declare class BaseMessage extends PhoenixLightLitElement {
4
+ export declare class BaseMessage extends PhoenixLightLitElement implements IBaseMessage {
4
5
  opened: boolean;
5
6
  portalTarget: string;
6
7
  direction: TDirection;
@@ -18,7 +19,9 @@ export declare class BaseMessage extends PhoenixLightLitElement {
18
19
  private static _appendMessagePortal;
19
20
  private _setupEventListeners;
20
21
  protected _positionMessage: () => void;
21
- private _open;
22
- private _close;
22
+ open: () => void;
23
+ close: () => void;
23
24
  private _handleFocusWithinMessage;
25
+ private _handleReverseTab;
26
+ private _isBaseMessage;
24
27
  }
@@ -7,7 +7,7 @@ import { KeystrokesController } from '../../controllers/keystrokes_controller/ke
7
7
  import { DIRECTIONS } from '../../controllers/relative_position_controller/relative_position_controller_constants.js';
8
8
  import { ClickOutsideController } from '../../controllers/click_outside_controller/click_outside_controller.js';
9
9
  import { RelativePositionController } from '../../controllers/relative_position_controller/relative_position_controller.js';
10
- import { DEFAULT_MESSAGE_PORTAL_NAME, DEFAULT_MESSAGE_OFFSET, MESSAGE_SHOW_DELAY_IN_MS, MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS, MESSAGE_REMOVED_CLASS_NAME, MESSAGE_CLOSE_DELAY_IN_MS, MESSAGE_CONTENT_ELEMENTS } from './base_message_constants.js';
10
+ import { DEFAULT_MESSAGE_PORTAL_NAME, DEFAULT_MESSAGE_OFFSET, MESSAGE_SHOW_DELAY_IN_MS, MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS, MESSAGE_REMOVED_CLASS_NAME, MESSAGE_CLOSE_DELAY_IN_MS, MESSAGE_CONTENT_ELEMENTS, MESSAGE_ELEMENTS } from './base_message_constants.js';
11
11
 
12
12
  class BaseMessage extends PhoenixLightLitElement {
13
13
  constructor() {
@@ -17,9 +17,9 @@ class BaseMessage extends PhoenixLightLitElement {
17
17
  this.direction = DIRECTIONS.topCenter;
18
18
  this.offset = DEFAULT_MESSAGE_OFFSET;
19
19
  this._setupEventListeners = () => {
20
- this.addEventListener('mouseenter', this._open);
21
- this.addEventListener('mouseleave', this._close);
22
- this.addEventListener('focus', this._open);
20
+ this.addEventListener('mouseenter', this.open);
21
+ this.addEventListener('mouseleave', this.close);
22
+ this.addEventListener('focus', this.open);
23
23
  };
24
24
  this._positionMessage = () => {
25
25
  requestAnimationFrame(() => {
@@ -27,7 +27,7 @@ class BaseMessage extends PhoenixLightLitElement {
27
27
  (_a = this._$messageContent) === null || _a === void 0 ? void 0 : _a.setAttribute('direction', this._positionController.position());
28
28
  });
29
29
  };
30
- this._open = () => {
30
+ this.open = () => {
31
31
  this._tooltipOpenTime = Date.now();
32
32
  clearTimeout(this._closeTimeout);
33
33
  this._openTimeout = setTimeout(() => {
@@ -36,7 +36,7 @@ class BaseMessage extends PhoenixLightLitElement {
36
36
  this.opened = true;
37
37
  }, MESSAGE_SHOW_DELAY_IN_MS);
38
38
  };
39
- this._close = () => {
39
+ this.close = () => {
40
40
  this._shouldDelayClosing = Date.now() - this._tooltipOpenTime > MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS;
41
41
  clearTimeout(this._openTimeout);
42
42
  if (!this.opened)
@@ -58,31 +58,46 @@ class BaseMessage extends PhoenixLightLitElement {
58
58
  this._handleFocusWithinMessage = (ev) => {
59
59
  var _a;
60
60
  if (((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(`.${this._messageComponentName}`)) !== this)
61
- this._close();
62
- if (!document.activeElement)
61
+ this.close();
62
+ if (!document.activeElement || ev.shiftKey)
63
63
  return;
64
64
  const $focusableElements = UiDomUtils.getFocusableElements(this);
65
65
  const activeElementIndex = $focusableElements.indexOf(document.activeElement);
66
- // jeśli jest przedostatni, to następnym elementem jest sentinel
67
- const isPenultimate = activeElementIndex + 1 === $focusableElements.length - 1;
68
- if (!isPenultimate)
66
+ const isLastFocusableChild = activeElementIndex === $focusableElements.length - 1;
67
+ if (!isLastFocusableChild)
69
68
  return;
70
- this._close();
71
- ev.preventDefault();
72
- const $focusableParentElements = UiDomUtils.getFocusableElements(document.body);
73
- const sentinelIndex = $focusableParentElements.indexOf(document.activeElement) + 1;
74
- $focusableParentElements[sentinelIndex + 1].focus();
69
+ this.close();
70
+ };
71
+ this._handleReverseTab = () => {
72
+ const $focusableElements = UiDomUtils.getFocusableElements(document.body);
73
+ const activeElement = document.activeElement;
74
+ const indexOfCurrentlyFocusedElement = $focusableElements.indexOf(activeElement);
75
+ const $previousElement = $focusableElements[indexOfCurrentlyFocusedElement - 1];
76
+ const $previousElementMessageParent = $previousElement === null || $previousElement === void 0 ? void 0 : $previousElement.closest(`h-${this._messageComponentName}`);
77
+ if ($previousElementMessageParent === this)
78
+ return;
79
+ if ($previousElementMessageParent)
80
+ $previousElementMessageParent.open();
81
+ if (this._isBaseMessage(activeElement))
82
+ activeElement.close();
75
83
  };
76
84
  this._clickOutsideController = new ClickOutsideController({
77
85
  host: this,
78
86
  container: this,
79
- action: this._close
87
+ action: this.close
80
88
  });
81
89
  new KeystrokesController({
82
90
  host: this,
83
91
  keys: ['tab'],
92
+ target: this,
84
93
  callback: this._handleFocusWithinMessage
85
94
  });
95
+ new KeystrokesController({
96
+ host: this,
97
+ keys: [['shift', 'tab']],
98
+ target: document.body,
99
+ callback: this._handleReverseTab
100
+ });
86
101
  }
87
102
  connectedCallback(messageComponentName = '') {
88
103
  super.connectedCallback();
@@ -109,6 +124,11 @@ class BaseMessage extends PhoenixLightLitElement {
109
124
  $portalTarget.setAttribute(PORTAL_TARGET_NAME_PROP, DEFAULT_MESSAGE_PORTAL_NAME);
110
125
  document.body.appendChild($portalTarget);
111
126
  }
127
+ _isBaseMessage($element) {
128
+ if (MESSAGE_ELEMENTS.includes($element.localName))
129
+ return true;
130
+ return false;
131
+ }
112
132
  }
113
133
  __decorate([
114
134
  property({ type: Boolean, reflect: true }),
@@ -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;"}
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;"}
@@ -2,6 +2,7 @@ export declare const DEFAULT_MESSAGE_PORTAL_NAME = "message-portal";
2
2
  export declare const MESSAGE_CONTENT_SLOT_NAME = "message-content";
3
3
  export declare const MESSAGE_REMOVED_CLASS_NAME = "removed";
4
4
  export declare const DEFAULT_MESSAGE_OFFSET = 10;
5
+ export declare const MESSAGE_ELEMENTS: string[];
5
6
  export declare const MESSAGE_CONTENT_ELEMENTS: string[];
6
7
  export declare const MESSAGE_SHOW_DELAY_IN_MS = 100;
7
8
  export declare const MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS = 500;
@@ -1,14 +1,15 @@
1
- import { HINT_CONTENT_ELEMENT_NAME } from './hints/hint_constants.js';
2
- import { TOOLTIP_CONTENT_ELEMENT_NAME } from './tooltips/tooltip_constants.js';
1
+ import { HINT_ELEMENT_NAME, HINT_CONTENT_ELEMENT_NAME } from './hints/hint_constants.js';
2
+ import { TOOLTIP_ELEMENT_NAME, TOOLTIP_CONTENT_ELEMENT_NAME } from './tooltips/tooltip_constants.js';
3
3
 
4
4
  const DEFAULT_MESSAGE_PORTAL_NAME = 'message-portal';
5
5
  const MESSAGE_CONTENT_SLOT_NAME = 'message-content';
6
6
  const MESSAGE_REMOVED_CLASS_NAME = `removed`;
7
7
  const DEFAULT_MESSAGE_OFFSET = 10;
8
+ const MESSAGE_ELEMENTS = [TOOLTIP_ELEMENT_NAME, HINT_ELEMENT_NAME];
8
9
  const MESSAGE_CONTENT_ELEMENTS = [TOOLTIP_CONTENT_ELEMENT_NAME, HINT_CONTENT_ELEMENT_NAME];
9
10
  const MESSAGE_SHOW_DELAY_IN_MS = 100;
10
11
  const MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS = 500;
11
12
  const MESSAGE_CLOSE_DELAY_IN_MS = 500;
12
13
 
13
- export { DEFAULT_MESSAGE_OFFSET, DEFAULT_MESSAGE_PORTAL_NAME, MESSAGE_CLOSE_DELAY_IN_MS, MESSAGE_CONTENT_ELEMENTS, MESSAGE_CONTENT_SLOT_NAME, MESSAGE_REMOVED_CLASS_NAME, MESSAGE_SHOW_DELAY_IN_MS, MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS };
14
+ export { DEFAULT_MESSAGE_OFFSET, DEFAULT_MESSAGE_PORTAL_NAME, MESSAGE_CLOSE_DELAY_IN_MS, MESSAGE_CONTENT_ELEMENTS, MESSAGE_CONTENT_SLOT_NAME, MESSAGE_ELEMENTS, MESSAGE_REMOVED_CLASS_NAME, MESSAGE_SHOW_DELAY_IN_MS, MESSAGE_TIME_TO_DELAY_CLOSING_IN_MS };
14
15
  //# sourceMappingURL=base_message_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;"}
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;"}
@@ -0,0 +1,4 @@
1
+ export interface IBaseMessage {
2
+ open: () => void;
3
+ close: () => void;
4
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base_message_types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base_message_types.js","sourceRoot":"","sources":["../../../../../../../src/components/messages/base_message_types.ts"],"names":[],"mappings":""}
@@ -20,7 +20,6 @@ let HHint = class HHint extends BaseMessage {
20
20
  <h-portal ?disabled="${!this.opened}" @portal.open="${this._positionMessage}" to="${this.portalTarget}" hidden>
21
21
  ${this.getSlot(MESSAGE_CONTENT_SLOT_NAME)}
22
22
  </h-portal>
23
- <div tabindex="0"></div>
24
23
  `;
25
24
  }
26
25
  };
@@ -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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -16,7 +16,6 @@ let HTooltip = class HTooltip extends BaseMessage {
16
16
  <h-portal ?disabled="${!this.opened}" @portal.open="${this._positionMessage}" to="${this.portalTarget}" hidden>
17
17
  ${this.getSlot(MESSAGE_CONTENT_SLOT_NAME)}
18
18
  </h-portal>
19
- <div tabindex="0"></div>
20
19
  `;
21
20
  }
22
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,2BAA2B,+CAAmD;AAC9E;AACA;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,2BAA2B,+CAAmD;AAC9E;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,6 +5,7 @@ export declare const PORTAL_EVENTS: {
5
5
  close: string;
6
6
  };
7
7
  export declare const PORTAL_TARGET_NAME_PROP = "name";
8
+ export declare const PORTAL_COMPONENT_NAME = "h-portal";
8
9
  export declare const PORTAL_TARGET_COMPONENT_NAME = "h-portal-target";
9
10
  export declare const PORTAL_TARGET_ATTRIBUTE_NAME = "portal-target";
10
11
  declare global {
@@ -40,7 +40,8 @@ let HTabs = class HTabs extends PhoenixLightLitElement {
40
40
  new KeystrokesController({
41
41
  host: this,
42
42
  keys: ['ArrowRight', 'ArrowLeft'],
43
- callback: this._handleArrowNavigation
43
+ callback: this._handleArrowNavigation,
44
+ target: this
44
45
  });
45
46
  }
46
47
  _getFocusedTabIndex() {
@@ -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;"}
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;"}
@@ -8,8 +8,9 @@ class BtnController {
8
8
  this.host.setAttribute('role', 'button');
9
9
  this._keystrokesController = new KeystrokesController({
10
10
  host,
11
- keys: [' ', 'enter'],
12
- callback
11
+ keys: ['enter', ' '],
12
+ callback,
13
+ target: host
13
14
  });
14
15
  }
15
16
  hostConnected() { }
@@ -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;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;AACA;"}
@@ -5,10 +5,17 @@ export declare class KeystrokesController implements ReactiveController {
5
5
  private _keys;
6
6
  private _callback;
7
7
  private _buffer;
8
- private _lastKeyTime;
9
- constructor({ host, keys, callback }: TKeystrokesControllerProps);
8
+ constructor({ host, keys, callback, target }: TKeystrokesControllerProps);
10
9
  hostConnected(): void;
11
10
  hostDisconnected(): void;
12
- private _catchKeySequence;
13
- private _bindKeysWithCallback;
11
+ private _clearBuffer;
12
+ private _saveKey;
13
+ private _bindSavedKeysWithCallback;
14
+ private _bindWithOneKey;
15
+ private _isKeySequenceMultiple;
16
+ private _areAllKeysPressedInMultipleSequences;
17
+ private _areAllKeysPressedInSingleSequence;
18
+ private _isOneOfTheKeysPressed;
19
+ private _calculateIndexesInSavedKeys;
20
+ private _removeKey;
14
21
  }
@@ -1,46 +1,90 @@
1
1
  import { __classPrivateFieldSet, __classPrivateFieldGet } from '../../../../../external/tslib/tslib.es6.js';
2
2
  import 'lit';
3
- import { KEYSTROKE_DELAY_IN_MS } from './keystrokes_controller_constants.js';
4
3
 
5
- var _KeystrokesController_host;
4
+ var _KeystrokesController_host, _KeystrokesController_target;
6
5
  class KeystrokesController {
7
- constructor({ host, keys, callback }) {
6
+ constructor({ host, keys, callback, target }) {
8
7
  _KeystrokesController_host.set(this, void 0);
8
+ _KeystrokesController_target.set(this, void 0);
9
9
  this._buffer = [];
10
- this._lastKeyTime = Date.now();
11
- this._catchKeySequence = (ev) => {
12
- // ev.stopImmediatePropagation();
10
+ this._clearBuffer = () => {
11
+ this._buffer = [];
12
+ };
13
+ this._saveKey = (ev) => {
13
14
  const key = ev.key.toLowerCase();
14
- const currentTime = Date.now();
15
- if (currentTime - this._lastKeyTime > KEYSTROKE_DELAY_IN_MS) {
16
- this._buffer = [];
15
+ if (!this._buffer.includes(key))
16
+ this._buffer = [...this._buffer, key];
17
+ this._bindSavedKeysWithCallback(ev, this._buffer);
18
+ };
19
+ this._bindSavedKeysWithCallback = (ev, savedKeys) => {
20
+ if (typeof this._keys === 'string') {
21
+ this._bindWithOneKey(ev, savedKeys);
22
+ return;
17
23
  }
18
- this._buffer.push(key);
19
- this._lastKeyTime = currentTime;
20
- this._bindKeysWithCallback(ev, this._buffer.join(''));
24
+ const areAllKeysPressed = this._isKeySequenceMultiple(this._keys)
25
+ ? this._areAllKeysPressedInMultipleSequences(this._keys, savedKeys)
26
+ : this._isOneOfTheKeysPressed(this._keys, savedKeys);
27
+ if (areAllKeysPressed)
28
+ this._callback(ev);
21
29
  };
22
- this._bindKeysWithCallback = (ev, keySequence) => {
23
- const isCorrectKeyPressed = !!this._keys.find((key) => {
24
- return key.toLowerCase() === keySequence;
30
+ this._bindWithOneKey = (ev, savedKeys) => {
31
+ if (!savedKeys.includes(this._keys))
32
+ return;
33
+ this._callback(ev);
34
+ };
35
+ this._isKeySequenceMultiple = (keySequence) => {
36
+ const firstSequence = keySequence[0];
37
+ if (typeof firstSequence === 'object')
38
+ return true;
39
+ return false;
40
+ };
41
+ this._areAllKeysPressedInMultipleSequences = (keySequences, savedKeys) => {
42
+ return !!keySequences.find((keySequence) => {
43
+ return this._areAllKeysPressedInSingleSequence(keySequence, savedKeys);
25
44
  });
26
- if (isCorrectKeyPressed) {
27
- this._buffer = [];
28
- this._callback(ev);
29
- }
45
+ };
46
+ this._areAllKeysPressedInSingleSequence = (keySequence, savedKeys) => {
47
+ const indexesInSavedKeys = this._calculateIndexesInSavedKeys(keySequence, savedKeys);
48
+ if (indexesInSavedKeys.includes(-1))
49
+ return false;
50
+ const firstPressedKeyIndex = indexesInSavedKeys[0];
51
+ const lastPressedKeyIndex = indexesInSavedKeys[indexesInSavedKeys.length - 1];
52
+ const areKeysPressedSequentially = lastPressedKeyIndex - firstPressedKeyIndex === indexesInSavedKeys.length - 1;
53
+ return areKeysPressedSequentially;
54
+ };
55
+ this._isOneOfTheKeysPressed = (keys, savedKeys) => {
56
+ const indexesInSavedKeys = this._calculateIndexesInSavedKeys(keys, savedKeys);
57
+ return typeof indexesInSavedKeys.find((index) => index > -1) === 'number';
58
+ };
59
+ this._calculateIndexesInSavedKeys = (keySequence, savedKeys) => {
60
+ return keySequence.reduce((allIndexes, currentKeyInSequence) => {
61
+ return [...allIndexes, savedKeys.indexOf(currentKeyInSequence.toLowerCase())];
62
+ }, []);
63
+ };
64
+ // do ogrania jeszcze string czyli zapięcie się na jeden guzik
65
+ this._removeKey = (ev) => {
66
+ const key = ev.key.toLowerCase();
67
+ if (this._buffer.includes(key))
68
+ this._buffer = this._buffer.filter((currentSavedKey) => currentSavedKey !== key);
30
69
  };
31
70
  __classPrivateFieldSet(this, _KeystrokesController_host, host, "f");
71
+ __classPrivateFieldSet(this, _KeystrokesController_target, target, "f");
32
72
  this._keys = keys;
33
73
  this._callback = callback;
34
74
  __classPrivateFieldGet(this, _KeystrokesController_host, "f").addController(this);
75
+ __classPrivateFieldGet(this, _KeystrokesController_target, "f").addEventListener('keydown', this._saveKey);
76
+ __classPrivateFieldGet(this, _KeystrokesController_target, "f").addEventListener('keyup', this._removeKey);
35
77
  }
36
78
  hostConnected() {
37
- __classPrivateFieldGet(this, _KeystrokesController_host, "f").addEventListener('keydown', this._catchKeySequence);
79
+ __classPrivateFieldGet(this, _KeystrokesController_host, "f").addEventListener('focusout', this._clearBuffer);
38
80
  }
39
81
  hostDisconnected() {
40
- __classPrivateFieldGet(this, _KeystrokesController_host, "f").removeEventListener('keydown', this._catchKeySequence);
82
+ __classPrivateFieldGet(this, _KeystrokesController_host, "f").removeEventListener('focusout', this._clearBuffer);
83
+ __classPrivateFieldGet(this, _KeystrokesController_target, "f").addEventListener('keydown', this._saveKey);
84
+ __classPrivateFieldGet(this, _KeystrokesController_target, "f").addEventListener('keyup', this._removeKey);
41
85
  }
42
86
  }
43
- _KeystrokesController_host = new WeakMap();
87
+ _KeystrokesController_host = new WeakMap(), _KeystrokesController_target = new WeakMap();
44
88
 
45
89
  export { KeystrokesController };
46
90
  //# sourceMappingURL=keystrokes_controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA,+DAA+D,4CAAgD;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,+DAA+D,4CAAgD;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,6 +1,7 @@
1
1
  import { TWebComponentsContextControllerHost } from "../../core/context/context_controller_types";
2
2
  export declare type TKeystrokesControllerProps = {
3
3
  host: TWebComponentsContextControllerHost;
4
- keys: string[];
4
+ keys: string[][] | string[] | string;
5
5
  callback: (ev: Event) => void;
6
+ target: Element;
6
7
  };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@shoper/phoenix_design_system",
3
3
  "packageManager": "yarn@3.2.0",
4
4
  "sideEffects": false,
5
- "version": "0.24.2",
5
+ "version": "0.24.3",
6
6
  "description": "phoenix design system",
7
7
  "author": "zefirek",
8
8
  "license": "MIT",
@@ -1,8 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- const KEYSTROKE_DELAY_IN_MS = 500;
6
-
7
- exports.KEYSTROKE_DELAY_IN_MS = KEYSTROKE_DELAY_IN_MS;
8
- //# sourceMappingURL=keystrokes_controller_constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -1 +0,0 @@
1
- export declare const KEYSTROKE_DELAY_IN_MS = 500;
@@ -1,4 +0,0 @@
1
- const KEYSTROKE_DELAY_IN_MS = 500;
2
-
3
- export { KEYSTROKE_DELAY_IN_MS };
4
- //# sourceMappingURL=keystrokes_controller_constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;"}