@patternfly/elements 2.2.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/custom-elements.json +32 -65
  2. package/package.json +4 -3
  3. package/pf-accordion/BaseAccordion.d.ts +2 -1
  4. package/pf-accordion/BaseAccordion.js +239 -210
  5. package/pf-accordion/BaseAccordion.js.map +1 -1
  6. package/pf-accordion/BaseAccordionHeader.js +71 -69
  7. package/pf-accordion/BaseAccordionHeader.js.map +1 -1
  8. package/pf-accordion/BaseAccordionPanel.js +2 -2
  9. package/pf-accordion/BaseAccordionPanel.js.map +1 -1
  10. package/pf-accordion/pf-accordion-header.js +4 -9
  11. package/pf-accordion/pf-accordion-header.js.map +1 -1
  12. package/pf-accordion/pf-accordion-panel.js +1 -1
  13. package/pf-accordion/pf-accordion-panel.js.map +1 -1
  14. package/pf-accordion/pf-accordion.js +1 -1
  15. package/pf-accordion/pf-accordion.js.map +1 -1
  16. package/pf-avatar/BaseAvatar.js +1 -1
  17. package/pf-avatar/BaseAvatar.js.map +1 -1
  18. package/pf-avatar/pf-avatar.js +1 -1
  19. package/pf-avatar/pf-avatar.js.map +1 -1
  20. package/pf-badge/BaseBadge.js +1 -1
  21. package/pf-badge/BaseBadge.js.map +1 -1
  22. package/pf-badge/pf-badge.js +1 -1
  23. package/pf-badge/pf-badge.js.map +1 -1
  24. package/pf-button/BaseButton.js +16 -17
  25. package/pf-button/BaseButton.js.map +1 -1
  26. package/pf-button/pf-button.js +1 -1
  27. package/pf-button/pf-button.js.map +1 -1
  28. package/pf-card/BaseCard.js +1 -1
  29. package/pf-card/BaseCard.js.map +1 -1
  30. package/pf-card/pf-card.js +1 -1
  31. package/pf-card/pf-card.js.map +1 -1
  32. package/pf-clipboard-copy/BaseClipboardCopy.js +1 -1
  33. package/pf-clipboard-copy/BaseClipboardCopy.js.map +1 -1
  34. package/pf-clipboard-copy/pf-clipboard-copy.js +33 -36
  35. package/pf-clipboard-copy/pf-clipboard-copy.js.map +1 -1
  36. package/pf-code-block/BaseCodeBlock.js +1 -1
  37. package/pf-code-block/BaseCodeBlock.js.map +1 -1
  38. package/pf-code-block/pf-code-block.js +11 -14
  39. package/pf-code-block/pf-code-block.js.map +1 -1
  40. package/pf-icon/BaseIcon.js +41 -39
  41. package/pf-icon/BaseIcon.js.map +1 -1
  42. package/pf-icon/pf-icon.js +2 -2
  43. package/pf-icon/pf-icon.js.map +1 -1
  44. package/pf-jump-links/pf-jump-links-item.js +14 -17
  45. package/pf-jump-links/pf-jump-links-item.js.map +1 -1
  46. package/pf-jump-links/pf-jump-links-list.js +1 -1
  47. package/pf-jump-links/pf-jump-links-list.js.map +1 -1
  48. package/pf-jump-links/pf-jump-links.js +34 -37
  49. package/pf-jump-links/pf-jump-links.js.map +1 -1
  50. package/pf-label/BaseLabel.js +1 -1
  51. package/pf-label/BaseLabel.js.map +1 -1
  52. package/pf-label/pf-label.js +2 -2
  53. package/pf-label/pf-label.js.map +1 -1
  54. package/pf-modal/pf-modal.js +45 -46
  55. package/pf-modal/pf-modal.js.map +1 -1
  56. package/pf-panel/pf-panel.js +6 -7
  57. package/pf-panel/pf-panel.js.map +1 -1
  58. package/pf-popover/pf-popover.js +48 -51
  59. package/pf-popover/pf-popover.js.map +1 -1
  60. package/pf-progress-stepper/pf-progress-step.js +10 -11
  61. package/pf-progress-stepper/pf-progress-step.js.map +1 -1
  62. package/pf-progress-stepper/pf-progress-stepper.js +13 -16
  63. package/pf-progress-stepper/pf-progress-stepper.js.map +1 -1
  64. package/pf-spinner/BaseSpinner.js +1 -1
  65. package/pf-spinner/BaseSpinner.js.map +1 -1
  66. package/pf-spinner/pf-spinner.js +1 -1
  67. package/pf-spinner/pf-spinner.js.map +1 -1
  68. package/pf-switch/BaseSwitch.js +47 -44
  69. package/pf-switch/BaseSwitch.js.map +1 -1
  70. package/pf-switch/pf-switch.js +1 -1
  71. package/pf-switch/pf-switch.js.map +1 -1
  72. package/pf-tabs/BaseTab.js +31 -29
  73. package/pf-tabs/BaseTab.js.map +1 -1
  74. package/pf-tabs/BaseTabPanel.d.ts +0 -1
  75. package/pf-tabs/BaseTabPanel.js +5 -11
  76. package/pf-tabs/BaseTabPanel.js.map +1 -1
  77. package/pf-tabs/BaseTabs.js +135 -116
  78. package/pf-tabs/BaseTabs.js.map +1 -1
  79. package/pf-tabs/pf-tab-panel.js +1 -1
  80. package/pf-tabs/pf-tab-panel.js.map +1 -1
  81. package/pf-tabs/pf-tab.js +1 -1
  82. package/pf-tabs/pf-tab.js.map +1 -1
  83. package/pf-tabs/pf-tabs.js +2 -2
  84. package/pf-tabs/pf-tabs.js.map +1 -1
  85. package/pf-tile/pf-tile.js +1 -1
  86. package/pf-tile/pf-tile.js.map +1 -1
  87. package/pf-timestamp/pf-timestamp.d.ts +8 -5
  88. package/pf-timestamp/pf-timestamp.js +21 -66
  89. package/pf-timestamp/pf-timestamp.js.map +1 -1
  90. package/pf-tooltip/BaseTooltip.js +7 -13
  91. package/pf-tooltip/BaseTooltip.js.map +1 -1
  92. package/pf-tooltip/pf-tooltip.js +1 -1
  93. package/pf-tooltip/pf-tooltip.js.map +1 -1
  94. package/pfe.min.js +121 -121
  95. package/pfe.min.js.map +4 -4
  96. package/react/pf-accordion/pf-accordion-header.js +12 -0
  97. package/react/pf-accordion/pf-accordion-panel.js +10 -0
  98. package/react/pf-accordion/pf-accordion.js +13 -0
  99. package/react/pf-avatar/pf-avatar.js +10 -0
  100. package/react/pf-badge/pf-badge.js +10 -0
  101. package/react/pf-button/pf-button.js +10 -0
  102. package/react/pf-card/pf-card.js +10 -0
  103. package/react/pf-clipboard-copy/pf-clipboard-copy.js +10 -0
  104. package/react/pf-code-block/pf-code-block.js +10 -0
  105. package/react/pf-icon/pf-icon.js +13 -0
  106. package/react/pf-jump-links/pf-jump-links-item.js +13 -0
  107. package/react/pf-jump-links/pf-jump-links-list.js +10 -0
  108. package/react/pf-jump-links/pf-jump-links.js +12 -0
  109. package/react/pf-label/pf-label.js +12 -0
  110. package/react/pf-modal/pf-modal.js +13 -0
  111. package/react/pf-panel/pf-panel.js +10 -0
  112. package/react/pf-popover/pf-popover.js +10 -0
  113. package/react/pf-progress-stepper/pf-progress-step.js +10 -0
  114. package/react/pf-progress-stepper/pf-progress-stepper.js +10 -0
  115. package/react/pf-spinner/pf-spinner.js +10 -0
  116. package/react/pf-switch/pf-switch.js +12 -0
  117. package/react/pf-tabs/pf-tab-panel.js +10 -0
  118. package/react/pf-tabs/pf-tab.js +12 -0
  119. package/react/pf-tabs/pf-tabs.js +10 -0
  120. package/react/pf-tile/pf-tile.js +10 -0
  121. package/react/pf-timestamp/pf-timestamp.js +10 -0
  122. package/react/pf-tooltip/pf-tooltip.js +10 -0
@@ -1,8 +1,6 @@
1
- var _BaseAccordion_instances, _BaseAccordion_headerIndex, _BaseAccordion_activeHeader_get, _BaseAccordion_logger, _BaseAccordion_styles, _BaseAccordion_transitionDuration, _BaseAccordion_initialized, _BaseAccordion_mo, _BaseAccordion_init, _BaseAccordion_updateActiveHeader, _BaseAccordion_panelForHeader, _BaseAccordion_expandHeader, _BaseAccordion_expandPanel, _BaseAccordion_collapseHeader, _BaseAccordion_collapsePanel, _BaseAccordion_getAnimationDuration, _BaseAccordion_animate, _BaseAccordion_onChange, _BaseAccordion_onKeydown, _BaseAccordion_allHeaders, _BaseAccordion_allPanels, _BaseAccordion_previousHeader, _BaseAccordion_nextHeader, _BaseAccordion_firstHeader, _BaseAccordion_lastHeader, _BaseAccordion_getIndex;
2
- import { __classPrivateFieldGet, __classPrivateFieldSet, __decorate } from "tslib";
1
+ import { __decorate } from "tslib";
3
2
  import { LitElement, html } from 'lit';
4
3
  import { property } from 'lit/decorators/property.js';
5
- import { observed } from '@patternfly/pfe-core/decorators.js';
6
4
  import { NumberListConverter, ComposedEvent } from '@patternfly/pfe-core';
7
5
  import { Logger } from '@patternfly/pfe-core/controllers/logger.js';
8
6
  import { AccordionHeaderChangeEvent, BaseAccordionHeader } from './BaseAccordionHeader.js';
@@ -28,26 +26,17 @@ export class AccordionCollapseEvent extends ComposedEvent {
28
26
  class BaseAccordion extends LitElement {
29
27
  constructor() {
30
28
  super(...arguments);
31
- _BaseAccordion_instances.add(this);
32
- _BaseAccordion_headerIndex.set(this, new RovingTabindexController(this));
33
- /**
34
- * Sets and reflects the currently expanded accordion 0-based indexes.
35
- * Use commas to separate multiple indexes.
36
- * ```html
37
- * <pf-accordion expanded-index="1,2">
38
- * ...
39
- * </pf-accordion>
40
- * ```
41
- */
42
- this.expandedIndex = [];
29
+ this.#headerIndex = new RovingTabindexController(this);
30
+ this.#expandedIndex = [];
43
31
  this.expandedSets = new Set();
44
- _BaseAccordion_logger.set(this, new Logger(this));
45
- _BaseAccordion_styles.set(this, getComputedStyle(this));
46
- _BaseAccordion_transitionDuration.set(this, __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_getAnimationDuration).call(this));
32
+ this.#logger = new Logger(this);
33
+ this.#styles = getComputedStyle(this);
34
+ this.#transitionDuration = this.#getAnimationDuration();
47
35
  // actually is read in #init, by the `||=` operator
48
- _BaseAccordion_initialized.set(this, false);
49
- _BaseAccordion_mo.set(this, new MutationObserver(() => __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_init).call(this)));
36
+ this.#initialized = false;
37
+ this.#mo = new MutationObserver(() => this.#init());
50
38
  }
39
+ static { this.styles = [style]; }
51
40
  static isAccordion(target) {
52
41
  return target instanceof BaseAccordion;
53
42
  }
@@ -57,25 +46,62 @@ class BaseAccordion extends LitElement {
57
46
  static isPanel(target) {
58
47
  return target instanceof BaseAccordionPanel;
59
48
  }
49
+ #headerIndex;
50
+ #expandedIndex;
51
+ /**
52
+ * Sets and reflects the currently expanded accordion 0-based indexes.
53
+ * Use commas to separate multiple indexes.
54
+ * ```html
55
+ * <pf-accordion expanded-index="1,2">
56
+ * ...
57
+ * </pf-accordion>
58
+ * ```
59
+ */
60
+ get expandedIndex() {
61
+ return this.#expandedIndex;
62
+ }
63
+ set expandedIndex(value) {
64
+ const old = this.#expandedIndex;
65
+ this.#expandedIndex = value;
66
+ if (JSON.stringify(old) !== JSON.stringify(value)) {
67
+ this.requestUpdate('expandedIndex', old);
68
+ this.collapseAll().then(async () => {
69
+ for (const i of this.expandedIndex) {
70
+ await this.expand(i, this);
71
+ }
72
+ });
73
+ }
74
+ }
60
75
  get headers() {
61
- return __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_allHeaders).call(this);
76
+ return this.#allHeaders();
62
77
  }
63
78
  get panels() {
64
- return __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_allPanels).call(this);
79
+ return this.#allPanels();
65
80
  }
81
+ get #activeHeader() {
82
+ const { headers } = this;
83
+ const index = headers.findIndex(header => header.matches(':focus,:focus-within'));
84
+ return headers.at(index);
85
+ }
86
+ #logger;
87
+ #styles;
88
+ #transitionDuration;
89
+ // actually is read in #init, by the `||=` operator
90
+ #initialized;
66
91
  async getUpdateComplete() {
67
92
  const c = await super.getUpdateComplete();
68
93
  const results = await Promise.all([
69
- ...__classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_allHeaders).call(this).map(x => x.updateComplete),
70
- ...__classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_allPanels).call(this).map(x => x.updateComplete),
94
+ ...this.#allHeaders().map(x => x.updateComplete),
95
+ ...this.#allPanels().map(x => x.updateComplete),
71
96
  ]);
72
97
  return c && results.every(Boolean);
73
98
  }
99
+ #mo;
74
100
  connectedCallback() {
75
101
  super.connectedCallback();
76
- this.addEventListener('change', __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_onChange));
77
- __classPrivateFieldGet(this, _BaseAccordion_mo, "f").observe(this, { childList: true });
78
- __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_init).call(this);
102
+ this.addEventListener('change', this.#onChange);
103
+ this.#mo.observe(this, { childList: true });
104
+ this.#init();
79
105
  }
80
106
  render() {
81
107
  return html `
@@ -86,19 +112,190 @@ class BaseAccordion extends LitElement {
86
112
  const { headers } = this;
87
113
  headers.forEach((header, index) => {
88
114
  if (header.expanded) {
89
- __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_expandHeader).call(this, header, index);
90
- const panel = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_panelForHeader).call(this, header);
115
+ this.#expandHeader(header, index);
116
+ const panel = this.#panelForHeader(header);
91
117
  if (panel) {
92
- __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_expandPanel).call(this, panel);
118
+ this.#expandPanel(panel);
93
119
  }
94
120
  }
95
121
  });
96
122
  }
123
+ /**
124
+ * Initialize the accordion by connecting headers and panels
125
+ * with aria controls and labels; set up the default disclosure
126
+ * state if not set by the author; and check the URL for default
127
+ * open
128
+ */
129
+ async #init() {
130
+ this.#initialized ||= !!await this.updateComplete;
131
+ this.#headerIndex.initItems(this.headers);
132
+ // Event listener to the accordion header after the accordion has been initialized to add the roving tabindex
133
+ this.addEventListener('focusin', this.#updateActiveHeader);
134
+ this.updateAccessibility();
135
+ }
136
+ #updateActiveHeader() {
137
+ if (this.#activeHeader) {
138
+ this.#headerIndex.updateActiveItem(this.#activeHeader);
139
+ }
140
+ }
141
+ #panelForHeader(header) {
142
+ const next = header.nextElementSibling;
143
+ if (!BaseAccordion.isPanel(next)) {
144
+ return void this.#logger.error('Sibling element to a header needs to be a panel');
145
+ }
146
+ else {
147
+ return next;
148
+ }
149
+ }
150
+ #expandHeader(header, index = this.#getIndex(header)) {
151
+ // If this index is not already listed in the expandedSets array, add it
152
+ this.expandedSets.add(index);
153
+ this.#expandedIndex = [...this.expandedSets];
154
+ header.expanded = true;
155
+ }
156
+ async #expandPanel(panel) {
157
+ panel.expanded = true;
158
+ panel.hidden = false;
159
+ await panel.updateComplete;
160
+ const rect = panel.getBoundingClientRect();
161
+ this.#animate(panel, 0, rect.height);
162
+ }
163
+ async #collapseHeader(header, index = this.#getIndex(header)) {
164
+ if (!this.expandedSets) {
165
+ await this.updateComplete;
166
+ }
167
+ this.expandedSets.delete(index);
168
+ header.expanded = false;
169
+ await header.updateComplete;
170
+ }
171
+ async #collapsePanel(panel) {
172
+ await panel.updateComplete;
173
+ if (!panel.expanded) {
174
+ return;
175
+ }
176
+ const rect = panel.getBoundingClientRect();
177
+ panel.expanded = false;
178
+ panel.hidden = true;
179
+ this.#animate(panel, rect.height, 0);
180
+ await panel.updateComplete;
181
+ }
182
+ #getAnimationDuration() {
183
+ if ('computedStyleMap' in this) {
184
+ // @ts-expect-error: https://caniuse.com/?search=computedStyleMap
185
+ return this.computedStyleMap().get('transition-duration')?.to('ms').value;
186
+ }
187
+ else {
188
+ const { transitionDuration } = this.#styles;
189
+ const groups = CSS_TIMING_UNITS_RE.exec(transitionDuration)?.groups;
190
+ if (!groups) {
191
+ return 0;
192
+ }
193
+ const parsed = parseFloat(transitionDuration);
194
+ if (groups.unit === 's') {
195
+ return parsed * 1000;
196
+ }
197
+ else {
198
+ return parsed;
199
+ }
200
+ }
201
+ }
202
+ async #animate(panel, start, end) {
203
+ if (panel) {
204
+ const header = panel.previousElementSibling;
205
+ const transitionDuration = this.#getAnimationDuration();
206
+ if (transitionDuration) {
207
+ this.#transitionDuration = transitionDuration;
208
+ }
209
+ const duration = this.#transitionDuration ?? 0;
210
+ header?.classList.add('animating');
211
+ panel.classList.add('animating');
212
+ const animation = panel.animate({ height: [`${start}px`, `${end}px`] }, { duration });
213
+ animation.play();
214
+ await animation.finished;
215
+ header?.classList.remove('animating');
216
+ panel.classList.remove('animating');
217
+ panel.style.removeProperty('height');
218
+ panel.hidden = !panel.expanded;
219
+ }
220
+ }
221
+ #onChange(event) {
222
+ if (this.classList.contains('animating')) {
223
+ return;
224
+ }
225
+ const index = this.#getIndex(event.target);
226
+ if (event.expanded) {
227
+ this.expand(index, event.accordion);
228
+ }
229
+ else {
230
+ this.collapse(index);
231
+ }
232
+ }
233
+ /**
234
+ * @see https://www.w3.org/TR/wai-aria-practices/#accordion
235
+ */
236
+ async #onKeydown(evt) {
237
+ const currentHeader = evt.target;
238
+ if (!BaseAccordion.isHeader(currentHeader)) {
239
+ return;
240
+ }
241
+ let newHeader;
242
+ switch (evt.key) {
243
+ case 'ArrowDown':
244
+ evt.preventDefault();
245
+ newHeader = this.#nextHeader();
246
+ break;
247
+ case 'ArrowUp':
248
+ evt.preventDefault();
249
+ newHeader = this.#previousHeader();
250
+ break;
251
+ case 'Home':
252
+ evt.preventDefault();
253
+ newHeader = this.#firstHeader();
254
+ break;
255
+ case 'End':
256
+ evt.preventDefault();
257
+ newHeader = this.#lastHeader();
258
+ break;
259
+ }
260
+ newHeader?.focus?.();
261
+ }
262
+ #allHeaders(accordion = this) {
263
+ return Array.from(accordion.children).filter(BaseAccordion.isHeader);
264
+ }
265
+ #allPanels(accordion = this) {
266
+ return Array.from(accordion.children).filter(BaseAccordion.isPanel);
267
+ }
268
+ #previousHeader() {
269
+ const { headers } = this;
270
+ const newIndex = headers.findIndex(header => header.matches(':focus,:focus-within')) - 1;
271
+ return headers[(newIndex + headers.length) % headers.length];
272
+ }
273
+ #nextHeader() {
274
+ const { headers } = this;
275
+ const newIndex = headers.findIndex(header => header.matches(':focus,:focus-within')) + 1;
276
+ return headers[newIndex % headers.length];
277
+ }
278
+ #firstHeader() {
279
+ return this.headers.at(0);
280
+ }
281
+ #lastHeader() {
282
+ return this.headers.at(-1);
283
+ }
284
+ #getIndex(el) {
285
+ if (BaseAccordion.isHeader(el)) {
286
+ return this.headers.findIndex(header => header.id === el.id);
287
+ }
288
+ if (BaseAccordion.isPanel(el)) {
289
+ return this.panels.findIndex(panel => panel.id === el.id);
290
+ }
291
+ this.#logger.warn('The #getIndex method expects to receive a header or panel element.');
292
+ return -1;
293
+ }
97
294
  updateAccessibility() {
98
295
  const { headers } = this;
99
296
  // For each header in the accordion, attach the aria connections
100
297
  headers.forEach(header => {
101
- const panel = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_panelForHeader).call(this, header);
298
+ const panel = this.#panelForHeader(header);
102
299
  if (panel) {
103
300
  header.setAttribute('aria-controls', panel.id);
104
301
  panel.setAttribute('aria-labelledby', header.id);
@@ -127,18 +324,18 @@ class BaseAccordion extends LitElement {
127
324
  if (index === -1) {
128
325
  return;
129
326
  }
130
- const allHeaders = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_allHeaders).call(this, parentAccordion);
327
+ const allHeaders = this.#allHeaders(parentAccordion);
131
328
  const header = allHeaders[index];
132
329
  if (!header) {
133
330
  return;
134
331
  }
135
- const panel = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_panelForHeader).call(this, header);
332
+ const panel = this.#panelForHeader(header);
136
333
  if (!panel) {
137
334
  return;
138
335
  }
139
336
  // If the header and panel exist, open both
140
- __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_expandHeader).call(this, header, index),
141
- __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_expandPanel).call(this, panel),
337
+ this.#expandHeader(header, index),
338
+ this.#expandPanel(panel),
142
339
  header.focus();
143
340
  this.dispatchEvent(new AccordionExpandEvent(header, panel));
144
341
  await this.updateComplete;
@@ -147,8 +344,8 @@ class BaseAccordion extends LitElement {
147
344
  * Expands all accordion items.
148
345
  */
149
346
  async expandAll() {
150
- this.headers.forEach(header => __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_expandHeader).call(this, header));
151
- this.panels.forEach(panel => __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_expandPanel).call(this, panel));
347
+ this.headers.forEach(header => this.#expandHeader(header));
348
+ this.panels.forEach(panel => this.#expandPanel(panel));
152
349
  await this.updateComplete;
153
350
  }
154
351
  /**
@@ -160,8 +357,8 @@ class BaseAccordion extends LitElement {
160
357
  if (!header || !panel) {
161
358
  return;
162
359
  }
163
- __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_collapseHeader).call(this, header);
164
- __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_collapsePanel).call(this, panel);
360
+ this.#collapseHeader(header);
361
+ this.#collapsePanel(panel);
165
362
  this.dispatchEvent(new AccordionCollapseEvent(header, panel));
166
363
  await this.updateComplete;
167
364
  }
@@ -169,184 +366,16 @@ class BaseAccordion extends LitElement {
169
366
  * Collapses all accordion items.
170
367
  */
171
368
  async collapseAll() {
172
- this.headers.forEach(header => __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_collapseHeader).call(this, header));
173
- this.panels.forEach(panel => __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_collapsePanel).call(this, panel));
369
+ this.headers.forEach(header => this.#collapseHeader(header));
370
+ this.panels.forEach(panel => this.#collapsePanel(panel));
174
371
  await this.updateComplete;
175
372
  }
176
373
  }
177
- _BaseAccordion_headerIndex = new WeakMap(), _BaseAccordion_logger = new WeakMap(), _BaseAccordion_styles = new WeakMap(), _BaseAccordion_transitionDuration = new WeakMap(), _BaseAccordion_initialized = new WeakMap(), _BaseAccordion_mo = new WeakMap(), _BaseAccordion_instances = new WeakSet(), _BaseAccordion_activeHeader_get = function _BaseAccordion_activeHeader_get() {
178
- const { headers } = this;
179
- const index = headers.findIndex(header => header.matches(':focus,:focus-within'));
180
- return headers.at(index);
181
- }, _BaseAccordion_init =
182
- /**
183
- * Initialize the accordion by connecting headers and panels
184
- * with aria controls and labels; set up the default disclosure
185
- * state if not set by the author; and check the URL for default
186
- * open
187
- */
188
- async function _BaseAccordion_init() {
189
- __classPrivateFieldSet(this, _BaseAccordion_initialized, __classPrivateFieldGet(this, _BaseAccordion_initialized, "f") || !!await this.updateComplete, "f");
190
- __classPrivateFieldGet(this, _BaseAccordion_headerIndex, "f").initItems(this.headers);
191
- // Event listener to the accordion header after the accordion has been initialized to add the roving tabindex
192
- this.addEventListener('focusin', __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_updateActiveHeader));
193
- this.updateAccessibility();
194
- }, _BaseAccordion_updateActiveHeader = function _BaseAccordion_updateActiveHeader() {
195
- if (__classPrivateFieldGet(this, _BaseAccordion_instances, "a", _BaseAccordion_activeHeader_get)) {
196
- __classPrivateFieldGet(this, _BaseAccordion_headerIndex, "f").updateActiveItem(__classPrivateFieldGet(this, _BaseAccordion_instances, "a", _BaseAccordion_activeHeader_get));
197
- }
198
- }, _BaseAccordion_panelForHeader = function _BaseAccordion_panelForHeader(header) {
199
- const next = header.nextElementSibling;
200
- if (!BaseAccordion.isPanel(next)) {
201
- return void __classPrivateFieldGet(this, _BaseAccordion_logger, "f").error('Sibling element to a header needs to be a panel');
202
- }
203
- else {
204
- return next;
205
- }
206
- }, _BaseAccordion_expandHeader = function _BaseAccordion_expandHeader(header, index = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_getIndex).call(this, header)) {
207
- // If this index is not already listed in the expandedSets array, add it
208
- this.expandedSets.add(index);
209
- header.expanded = true;
210
- }, _BaseAccordion_expandPanel = async function _BaseAccordion_expandPanel(panel) {
211
- panel.expanded = true;
212
- panel.hidden = false;
213
- await panel.updateComplete;
214
- const rect = panel.getBoundingClientRect();
215
- __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_animate).call(this, panel, 0, rect.height);
216
- }, _BaseAccordion_collapseHeader = async function _BaseAccordion_collapseHeader(header, index = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_getIndex).call(this, header)) {
217
- if (!this.expandedSets) {
218
- await this.updateComplete;
219
- }
220
- this.expandedSets.delete(index);
221
- header.expanded = false;
222
- await header.updateComplete;
223
- }, _BaseAccordion_collapsePanel = async function _BaseAccordion_collapsePanel(panel) {
224
- await panel.updateComplete;
225
- if (!panel.expanded) {
226
- return;
227
- }
228
- const rect = panel.getBoundingClientRect();
229
- panel.expanded = false;
230
- panel.hidden = true;
231
- __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_animate).call(this, panel, rect.height, 0);
232
- await panel.updateComplete;
233
- }, _BaseAccordion_getAnimationDuration = function _BaseAccordion_getAnimationDuration() {
234
- if ('computedStyleMap' in this) {
235
- // @ts-expect-error: https://caniuse.com/?search=computedStyleMap
236
- return this.computedStyleMap().get('transition-duration')?.to('ms').value;
237
- }
238
- else {
239
- const { transitionDuration } = __classPrivateFieldGet(this, _BaseAccordion_styles, "f");
240
- const groups = CSS_TIMING_UNITS_RE.exec(transitionDuration)?.groups;
241
- if (!groups) {
242
- return 0;
243
- }
244
- const parsed = parseFloat(transitionDuration);
245
- if (groups.unit === 's') {
246
- return parsed * 1000;
247
- }
248
- else {
249
- return parsed;
250
- }
251
- }
252
- }, _BaseAccordion_animate = async function _BaseAccordion_animate(panel, start, end) {
253
- if (panel) {
254
- const header = panel.previousElementSibling;
255
- const transitionDuration = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_getAnimationDuration).call(this);
256
- if (transitionDuration) {
257
- __classPrivateFieldSet(this, _BaseAccordion_transitionDuration, transitionDuration, "f");
258
- }
259
- const duration = __classPrivateFieldGet(this, _BaseAccordion_transitionDuration, "f") ?? 0;
260
- header?.classList.add('animating');
261
- panel.classList.add('animating');
262
- const animation = panel.animate({ height: [`${start}px`, `${end}px`] }, { duration });
263
- animation.play();
264
- await animation.finished;
265
- header?.classList.remove('animating');
266
- panel.classList.remove('animating');
267
- panel.style.removeProperty('height');
268
- panel.hidden = !panel.expanded;
269
- }
270
- }, _BaseAccordion_onChange = function _BaseAccordion_onChange(event) {
271
- if (this.classList.contains('animating')) {
272
- return;
273
- }
274
- const index = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_getIndex).call(this, event.target);
275
- if (event.expanded) {
276
- this.expand(index, event.accordion);
277
- }
278
- else {
279
- this.collapse(index);
280
- }
281
- }, _BaseAccordion_onKeydown =
282
- /**
283
- * @see https://www.w3.org/TR/wai-aria-practices/#accordion
284
- */
285
- async function _BaseAccordion_onKeydown(evt) {
286
- const currentHeader = evt.target;
287
- if (!BaseAccordion.isHeader(currentHeader)) {
288
- return;
289
- }
290
- let newHeader;
291
- switch (evt.key) {
292
- case 'ArrowDown':
293
- evt.preventDefault();
294
- newHeader = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_nextHeader).call(this);
295
- break;
296
- case 'ArrowUp':
297
- evt.preventDefault();
298
- newHeader = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_previousHeader).call(this);
299
- break;
300
- case 'Home':
301
- evt.preventDefault();
302
- newHeader = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_firstHeader).call(this);
303
- break;
304
- case 'End':
305
- evt.preventDefault();
306
- newHeader = __classPrivateFieldGet(this, _BaseAccordion_instances, "m", _BaseAccordion_lastHeader).call(this);
307
- break;
308
- }
309
- newHeader?.focus?.();
310
- }, _BaseAccordion_allHeaders = function _BaseAccordion_allHeaders(accordion = this) {
311
- return Array.from(accordion.children).filter(BaseAccordion.isHeader);
312
- }, _BaseAccordion_allPanels = function _BaseAccordion_allPanels(accordion = this) {
313
- return Array.from(accordion.children).filter(BaseAccordion.isPanel);
314
- }, _BaseAccordion_previousHeader = function _BaseAccordion_previousHeader() {
315
- const { headers } = this;
316
- const newIndex = headers.findIndex(header => header.matches(':focus,:focus-within')) - 1;
317
- return headers[(newIndex + headers.length) % headers.length];
318
- }, _BaseAccordion_nextHeader = function _BaseAccordion_nextHeader() {
319
- const { headers } = this;
320
- const newIndex = headers.findIndex(header => header.matches(':focus,:focus-within')) + 1;
321
- return headers[newIndex % headers.length];
322
- }, _BaseAccordion_firstHeader = function _BaseAccordion_firstHeader() {
323
- return this.headers.at(0);
324
- }, _BaseAccordion_lastHeader = function _BaseAccordion_lastHeader() {
325
- return this.headers.at(-1);
326
- }, _BaseAccordion_getIndex = function _BaseAccordion_getIndex(el) {
327
- if (BaseAccordion.isHeader(el)) {
328
- return this.headers.findIndex(header => header.id === el.id);
329
- }
330
- if (BaseAccordion.isPanel(el)) {
331
- return this.panels.findIndex(panel => panel.id === el.id);
332
- }
333
- __classPrivateFieldGet(this, _BaseAccordion_logger, "f").warn('The #getIndex method expects to receive a header or panel element.');
334
- return -1;
335
- };
336
- BaseAccordion.styles = [style];
337
374
  __decorate([
338
- observed(async function expandedIndexChanged(oldVal, newVal) {
339
- if (oldVal && oldVal !== newVal) {
340
- await this.collapseAll();
341
- for (const i of this.expandedIndex) {
342
- await this.expand(i, this);
343
- }
344
- }
345
- }),
346
375
  property({
347
376
  attribute: 'expanded-index',
348
377
  converter: NumberListConverter
349
378
  })
350
- ], BaseAccordion.prototype, "expandedIndex", void 0);
379
+ ], BaseAccordion.prototype, "expandedIndex", null);
351
380
  export { BaseAccordion };
352
381
  //# sourceMappingURL=BaseAccordion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseAccordion.js","sourceRoot":"","sources":["BaseAccordion.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TemplateResult } from 'lit';\n\nimport { LitElement, html } from 'lit';\nimport { property } from 'lit/decorators/property.js';\n\nimport { observed } from '@patternfly/pfe-core/decorators.js';\n\nimport { NumberListConverter, ComposedEvent } from '@patternfly/pfe-core';\nimport { Logger } from '@patternfly/pfe-core/controllers/logger.js';\n\nimport { AccordionHeaderChangeEvent, BaseAccordionHeader } from './BaseAccordionHeader.js';\nimport { BaseAccordionPanel } from './BaseAccordionPanel.js';\n\nimport { RovingTabindexController } from '@patternfly/pfe-core/controllers/roving-tabindex-controller.js';\n\nimport style from './BaseAccordion.css';\n\nconst CSS_TIMING_UNITS_RE = /^[0-9.]+(?<unit>[a-zA-Z]+)/g;\n\nexport class AccordionExpandEvent extends ComposedEvent {\n constructor(\n public toggle: BaseAccordionHeader,\n public panel: BaseAccordionPanel,\n ) {\n super('expand');\n }\n}\n\nexport class AccordionCollapseEvent extends ComposedEvent {\n constructor(\n public toggle: BaseAccordionHeader,\n public panel: BaseAccordionPanel,\n ) {\n super('collapse');\n }\n}\n\nexport abstract class BaseAccordion extends LitElement {\n static readonly styles = [style];\n\n static isAccordion(target: EventTarget | null): target is BaseAccordion {\n return target instanceof BaseAccordion;\n }\n\n static isHeader(target: EventTarget | null): target is BaseAccordionHeader {\n return target instanceof BaseAccordionHeader;\n }\n\n static isPanel(target: EventTarget | null): target is BaseAccordionPanel {\n return target instanceof BaseAccordionPanel;\n }\n\n #headerIndex = new RovingTabindexController<BaseAccordionHeader>(this);\n\n /**\n * Sets and reflects the currently expanded accordion 0-based indexes.\n * Use commas to separate multiple indexes.\n * ```html\n * <pf-accordion expanded-index=\"1,2\">\n * ...\n * </pf-accordion>\n * ```\n */\n @observed(async function expandedIndexChanged(this: BaseAccordion, oldVal: unknown, newVal: unknown) {\n if (oldVal && oldVal !== newVal) {\n await this.collapseAll();\n for (const i of this.expandedIndex) {\n await this.expand(i, this);\n }\n }\n })\n @property({\n attribute: 'expanded-index',\n converter: NumberListConverter\n }) expandedIndex: number[] = [];\n\n get headers() {\n return this.#allHeaders();\n }\n\n get panels() {\n return this.#allPanels();\n }\n\n get #activeHeader() {\n const { headers } = this;\n const index = headers.findIndex(header => header.matches(':focus,:focus-within'));\n return headers.at(index);\n }\n\n protected expandedSets = new Set<number>();\n\n #logger = new Logger(this);\n\n #styles = getComputedStyle(this);\n\n #transitionDuration = this.#getAnimationDuration();\n\n // actually is read in #init, by the `||=` operator\n #initialized = false;\n\n protected override async getUpdateComplete(): Promise<boolean> {\n const c = await super.getUpdateComplete();\n const results = await Promise.all([\n ...this.#allHeaders().map(x => x.updateComplete),\n ...this.#allPanels().map(x => x.updateComplete),\n ]);\n return c && results.every(Boolean);\n }\n\n #mo = new MutationObserver(() => this.#init());\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('change', this.#onChange as EventListener);\n this.#mo.observe(this, { childList: true });\n this.#init();\n }\n\n render(): TemplateResult {\n return html`\n <slot></slot>\n `;\n }\n\n async firstUpdated() {\n const { headers } = this;\n headers.forEach((header, index) => {\n if (header.expanded) {\n this.#expandHeader(header, index);\n const panel = this.#panelForHeader(header);\n if (panel) {\n this.#expandPanel(panel);\n }\n }\n });\n }\n\n /**\n * Initialize the accordion by connecting headers and panels\n * with aria controls and labels; set up the default disclosure\n * state if not set by the author; and check the URL for default\n * open\n */\n async #init() {\n this.#initialized ||= !!await this.updateComplete;\n this.#headerIndex.initItems(this.headers);\n // Event listener to the accordion header after the accordion has been initialized to add the roving tabindex\n this.addEventListener('focusin', this.#updateActiveHeader as EventListener);\n this.updateAccessibility();\n }\n\n #updateActiveHeader() {\n if (this.#activeHeader) {\n this.#headerIndex.updateActiveItem(this.#activeHeader);\n }\n }\n\n #panelForHeader(header: BaseAccordionHeader) {\n const next = header.nextElementSibling;\n if (!BaseAccordion.isPanel(next)) {\n return void this.#logger.error('Sibling element to a header needs to be a panel');\n } else {\n return next;\n }\n }\n\n #expandHeader(header: BaseAccordionHeader, index = this.#getIndex(header)) {\n // If this index is not already listed in the expandedSets array, add it\n this.expandedSets.add(index);\n header.expanded = true;\n }\n\n async #expandPanel(panel: BaseAccordionPanel) {\n panel.expanded = true;\n panel.hidden = false;\n\n await panel.updateComplete;\n\n const rect = panel.getBoundingClientRect();\n\n this.#animate(panel, 0, rect.height);\n }\n\n async #collapseHeader(header: BaseAccordionHeader, index = this.#getIndex(header)) {\n if (!this.expandedSets) {\n await this.updateComplete;\n }\n this.expandedSets.delete(index);\n header.expanded = false;\n await header.updateComplete;\n }\n\n async #collapsePanel(panel: BaseAccordionPanel) {\n await panel.updateComplete;\n if (!panel.expanded) {\n return;\n }\n\n const rect = panel.getBoundingClientRect();\n\n panel.expanded = false;\n panel.hidden = true;\n\n this.#animate(panel, rect.height, 0);\n await panel.updateComplete;\n }\n\n #getAnimationDuration(): number {\n if ('computedStyleMap' in this) {\n // @ts-expect-error: https://caniuse.com/?search=computedStyleMap\n return this.computedStyleMap().get('transition-duration')?.to('ms').value;\n } else {\n const { transitionDuration } = this.#styles;\n\n const groups = CSS_TIMING_UNITS_RE.exec(transitionDuration)?.groups;\n\n if (!groups) {\n return 0;\n }\n\n const parsed = parseFloat(transitionDuration);\n\n if (groups.unit === 's') {\n return parsed * 1000;\n } else {\n return parsed;\n }\n }\n }\n\n async #animate(panel: BaseAccordionPanel, start: number, end: number) {\n if (panel) {\n const header = panel.previousElementSibling;\n\n const transitionDuration = this.#getAnimationDuration();\n if (transitionDuration) {\n this.#transitionDuration = transitionDuration;\n }\n\n const duration = this.#transitionDuration ?? 0;\n\n header?.classList.add('animating');\n panel.classList.add('animating');\n\n const animation = panel.animate({ height: [`${start}px`, `${end}px`] }, { duration });\n animation.play();\n await animation.finished;\n\n header?.classList.remove('animating');\n panel.classList.remove('animating');\n\n panel.style.removeProperty('height');\n panel.hidden = !panel.expanded;\n }\n }\n\n #onChange(event: AccordionHeaderChangeEvent) {\n if (this.classList.contains('animating')) {\n return;\n }\n\n const index = this.#getIndex(event.target as Element);\n\n if (event.expanded) {\n this.expand(index, event.accordion);\n } else {\n this.collapse(index);\n }\n }\n\n /**\n * @see https://www.w3.org/TR/wai-aria-practices/#accordion\n */\n async #onKeydown(evt: KeyboardEvent) {\n const currentHeader = evt.target as Element;\n\n if (!BaseAccordion.isHeader(currentHeader)) {\n return;\n }\n\n let newHeader: BaseAccordionHeader | undefined;\n\n switch (evt.key) {\n case 'ArrowDown':\n evt.preventDefault();\n newHeader = this.#nextHeader();\n break;\n case 'ArrowUp':\n evt.preventDefault();\n newHeader = this.#previousHeader();\n break;\n case 'Home':\n evt.preventDefault();\n newHeader = this.#firstHeader();\n break;\n case 'End':\n evt.preventDefault();\n newHeader = this.#lastHeader();\n break;\n }\n\n newHeader?.focus?.();\n }\n\n #allHeaders(accordion: BaseAccordion = this): BaseAccordionHeader[] {\n return Array.from(accordion.children).filter(BaseAccordion.isHeader);\n }\n\n #allPanels(accordion: BaseAccordion = this): BaseAccordionPanel[] {\n return Array.from(accordion.children).filter(BaseAccordion.isPanel);\n }\n\n #previousHeader() {\n const { headers } = this;\n const newIndex = headers.findIndex(header => header.matches(':focus,:focus-within')) - 1;\n return headers[(newIndex + headers.length) % headers.length];\n }\n\n #nextHeader() {\n const { headers } = this;\n const newIndex = headers.findIndex(header => header.matches(':focus,:focus-within')) + 1;\n return headers[newIndex % headers.length];\n }\n\n #firstHeader() {\n return this.headers.at(0);\n }\n\n #lastHeader() {\n return this.headers.at(-1);\n }\n\n #getIndex(el: Element | null) {\n if (BaseAccordion.isHeader(el)) {\n return this.headers.findIndex(header => header.id === el.id);\n }\n\n if (BaseAccordion.isPanel(el)) {\n return this.panels.findIndex(panel => panel.id === el.id);\n }\n\n this.#logger.warn('The #getIndex method expects to receive a header or panel element.');\n return -1;\n }\n\n public updateAccessibility() {\n const { headers } = this;\n\n // For each header in the accordion, attach the aria connections\n headers.forEach(header => {\n const panel = this.#panelForHeader(header);\n if (panel) {\n header.setAttribute('aria-controls', panel.id);\n panel.setAttribute('aria-labelledby', header.id);\n panel.hidden = !panel.expanded;\n }\n });\n }\n\n /**\n * Accepts a 0-based index value (integer) for the set of accordion items to expand or collapse.\n */\n public async toggle(index: number) {\n const { headers } = this;\n const header = headers[index];\n\n if (!header.expanded) {\n await this.expand(index);\n } else {\n await this.collapse(index);\n }\n }\n\n /**\n * Accepts a 0-based index value (integer) for the set of accordion items to expand.\n * Accepts an optional parent accordion to search for headers and panels.\n */\n public async expand(index: number, parentAccordion?: BaseAccordion) {\n if (index === -1) {\n return;\n }\n\n const allHeaders: Array<BaseAccordionHeader> = this.#allHeaders(parentAccordion);\n\n const header = allHeaders[index];\n if (!header) {\n return;\n }\n\n const panel = this.#panelForHeader(header);\n if (!panel) {\n return;\n }\n\n // If the header and panel exist, open both\n this.#expandHeader(header, index),\n this.#expandPanel(panel),\n\n header.focus();\n\n this.dispatchEvent(new AccordionExpandEvent(header, panel));\n\n await this.updateComplete;\n }\n\n /**\n * Expands all accordion items.\n */\n public async expandAll() {\n this.headers.forEach(header => this.#expandHeader(header));\n this.panels.forEach(panel => this.#expandPanel(panel));\n await this.updateComplete;\n }\n\n /**\n * Accepts a 0-based index value (integer) for the set of accordion items to collapse.\n */\n public async collapse(index: number) {\n const header = this.headers.at(index);\n const panel = this.panels.at(index);\n\n if (!header || !panel) {\n return;\n }\n\n this.#collapseHeader(header);\n this.#collapsePanel(panel);\n\n this.dispatchEvent(new AccordionCollapseEvent(header, panel));\n await this.updateComplete;\n }\n\n /**\n * Collapses all accordion items.\n */\n public async collapseAll() {\n this.headers.forEach(header => this.#collapseHeader(header));\n this.panels.forEach(panel => this.#collapsePanel(panel));\n await this.updateComplete;\n }\n}\n"]}
1
+ {"version":3,"file":"BaseAccordion.js","sourceRoot":"","sources":["BaseAccordion.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TemplateResult } from 'lit';\n\nimport { LitElement, html } from 'lit';\nimport { property } from 'lit/decorators/property.js';\n\nimport { NumberListConverter, ComposedEvent } from '@patternfly/pfe-core';\nimport { Logger } from '@patternfly/pfe-core/controllers/logger.js';\n\nimport { AccordionHeaderChangeEvent, BaseAccordionHeader } from './BaseAccordionHeader.js';\nimport { BaseAccordionPanel } from './BaseAccordionPanel.js';\n\nimport { RovingTabindexController } from '@patternfly/pfe-core/controllers/roving-tabindex-controller.js';\n\nimport style from './BaseAccordion.css';\n\nconst CSS_TIMING_UNITS_RE = /^[0-9.]+(?<unit>[a-zA-Z]+)/g;\n\nexport class AccordionExpandEvent extends ComposedEvent {\n constructor(\n public toggle: BaseAccordionHeader,\n public panel: BaseAccordionPanel,\n ) {\n super('expand');\n }\n}\n\nexport class AccordionCollapseEvent extends ComposedEvent {\n constructor(\n public toggle: BaseAccordionHeader,\n public panel: BaseAccordionPanel,\n ) {\n super('collapse');\n }\n}\n\nexport abstract class BaseAccordion extends LitElement {\n static readonly styles = [style];\n\n static isAccordion(target: EventTarget | null): target is BaseAccordion {\n return target instanceof BaseAccordion;\n }\n\n static isHeader(target: EventTarget | null): target is BaseAccordionHeader {\n return target instanceof BaseAccordionHeader;\n }\n\n static isPanel(target: EventTarget | null): target is BaseAccordionPanel {\n return target instanceof BaseAccordionPanel;\n }\n\n #headerIndex = new RovingTabindexController<BaseAccordionHeader>(this);\n\n #expandedIndex: number[] = [];\n\n /**\n * Sets and reflects the currently expanded accordion 0-based indexes.\n * Use commas to separate multiple indexes.\n * ```html\n * <pf-accordion expanded-index=\"1,2\">\n * ...\n * </pf-accordion>\n * ```\n */\n @property({\n attribute: 'expanded-index',\n converter: NumberListConverter\n })\n get expandedIndex() {\n return this.#expandedIndex;\n }\n\n set expandedIndex(value) {\n const old = this.#expandedIndex;\n this.#expandedIndex = value;\n if (JSON.stringify(old) !== JSON.stringify(value)) {\n this.requestUpdate('expandedIndex', old);\n this.collapseAll().then(async () => {\n for (const i of this.expandedIndex) {\n await this.expand(i, this);\n }\n });\n }\n }\n\n get headers() {\n return this.#allHeaders();\n }\n\n get panels() {\n return this.#allPanels();\n }\n\n get #activeHeader() {\n const { headers } = this;\n const index = headers.findIndex(header => header.matches(':focus,:focus-within'));\n return headers.at(index);\n }\n\n protected expandedSets = new Set<number>();\n\n #logger = new Logger(this);\n\n #styles = getComputedStyle(this);\n\n #transitionDuration = this.#getAnimationDuration();\n\n // actually is read in #init, by the `||=` operator\n #initialized = false;\n\n protected override async getUpdateComplete(): Promise<boolean> {\n const c = await super.getUpdateComplete();\n const results = await Promise.all([\n ...this.#allHeaders().map(x => x.updateComplete),\n ...this.#allPanels().map(x => x.updateComplete),\n ]);\n return c && results.every(Boolean);\n }\n\n #mo = new MutationObserver(() => this.#init());\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('change', this.#onChange as EventListener);\n this.#mo.observe(this, { childList: true });\n this.#init();\n }\n\n render(): TemplateResult {\n return html`\n <slot></slot>\n `;\n }\n\n async firstUpdated() {\n const { headers } = this;\n headers.forEach((header, index) => {\n if (header.expanded) {\n this.#expandHeader(header, index);\n const panel = this.#panelForHeader(header);\n if (panel) {\n this.#expandPanel(panel);\n }\n }\n });\n }\n\n /**\n * Initialize the accordion by connecting headers and panels\n * with aria controls and labels; set up the default disclosure\n * state if not set by the author; and check the URL for default\n * open\n */\n async #init() {\n this.#initialized ||= !!await this.updateComplete;\n this.#headerIndex.initItems(this.headers);\n // Event listener to the accordion header after the accordion has been initialized to add the roving tabindex\n this.addEventListener('focusin', this.#updateActiveHeader as EventListener);\n this.updateAccessibility();\n }\n\n #updateActiveHeader() {\n if (this.#activeHeader) {\n this.#headerIndex.updateActiveItem(this.#activeHeader);\n }\n }\n\n #panelForHeader(header: BaseAccordionHeader) {\n const next = header.nextElementSibling;\n if (!BaseAccordion.isPanel(next)) {\n return void this.#logger.error('Sibling element to a header needs to be a panel');\n } else {\n return next;\n }\n }\n\n #expandHeader(header: BaseAccordionHeader, index = this.#getIndex(header)) {\n // If this index is not already listed in the expandedSets array, add it\n this.expandedSets.add(index);\n this.#expandedIndex = [...this.expandedSets as Set<number>];\n header.expanded = true;\n }\n\n async #expandPanel(panel: BaseAccordionPanel) {\n panel.expanded = true;\n panel.hidden = false;\n\n await panel.updateComplete;\n\n const rect = panel.getBoundingClientRect();\n\n this.#animate(panel, 0, rect.height);\n }\n\n async #collapseHeader(header: BaseAccordionHeader, index = this.#getIndex(header)) {\n if (!this.expandedSets) {\n await this.updateComplete;\n }\n this.expandedSets.delete(index);\n header.expanded = false;\n await header.updateComplete;\n }\n\n async #collapsePanel(panel: BaseAccordionPanel) {\n await panel.updateComplete;\n if (!panel.expanded) {\n return;\n }\n\n const rect = panel.getBoundingClientRect();\n\n panel.expanded = false;\n panel.hidden = true;\n\n this.#animate(panel, rect.height, 0);\n await panel.updateComplete;\n }\n\n #getAnimationDuration(): number {\n if ('computedStyleMap' in this) {\n // @ts-expect-error: https://caniuse.com/?search=computedStyleMap\n return this.computedStyleMap().get('transition-duration')?.to('ms').value;\n } else {\n const { transitionDuration } = this.#styles;\n\n const groups = CSS_TIMING_UNITS_RE.exec(transitionDuration)?.groups;\n\n if (!groups) {\n return 0;\n }\n\n const parsed = parseFloat(transitionDuration);\n\n if (groups.unit === 's') {\n return parsed * 1000;\n } else {\n return parsed;\n }\n }\n }\n\n async #animate(panel: BaseAccordionPanel, start: number, end: number) {\n if (panel) {\n const header = panel.previousElementSibling;\n\n const transitionDuration = this.#getAnimationDuration();\n if (transitionDuration) {\n this.#transitionDuration = transitionDuration;\n }\n\n const duration = this.#transitionDuration ?? 0;\n\n header?.classList.add('animating');\n panel.classList.add('animating');\n\n const animation = panel.animate({ height: [`${start}px`, `${end}px`] }, { duration });\n animation.play();\n await animation.finished;\n\n header?.classList.remove('animating');\n panel.classList.remove('animating');\n\n panel.style.removeProperty('height');\n panel.hidden = !panel.expanded;\n }\n }\n\n #onChange(event: AccordionHeaderChangeEvent) {\n if (this.classList.contains('animating')) {\n return;\n }\n\n const index = this.#getIndex(event.target as Element);\n\n if (event.expanded) {\n this.expand(index, event.accordion);\n } else {\n this.collapse(index);\n }\n }\n\n /**\n * @see https://www.w3.org/TR/wai-aria-practices/#accordion\n */\n async #onKeydown(evt: KeyboardEvent) {\n const currentHeader = evt.target as Element;\n\n if (!BaseAccordion.isHeader(currentHeader)) {\n return;\n }\n\n let newHeader: BaseAccordionHeader | undefined;\n\n switch (evt.key) {\n case 'ArrowDown':\n evt.preventDefault();\n newHeader = this.#nextHeader();\n break;\n case 'ArrowUp':\n evt.preventDefault();\n newHeader = this.#previousHeader();\n break;\n case 'Home':\n evt.preventDefault();\n newHeader = this.#firstHeader();\n break;\n case 'End':\n evt.preventDefault();\n newHeader = this.#lastHeader();\n break;\n }\n\n newHeader?.focus?.();\n }\n\n #allHeaders(accordion: BaseAccordion = this): BaseAccordionHeader[] {\n return Array.from(accordion.children).filter(BaseAccordion.isHeader);\n }\n\n #allPanels(accordion: BaseAccordion = this): BaseAccordionPanel[] {\n return Array.from(accordion.children).filter(BaseAccordion.isPanel);\n }\n\n #previousHeader() {\n const { headers } = this;\n const newIndex = headers.findIndex(header => header.matches(':focus,:focus-within')) - 1;\n return headers[(newIndex + headers.length) % headers.length];\n }\n\n #nextHeader() {\n const { headers } = this;\n const newIndex = headers.findIndex(header => header.matches(':focus,:focus-within')) + 1;\n return headers[newIndex % headers.length];\n }\n\n #firstHeader() {\n return this.headers.at(0);\n }\n\n #lastHeader() {\n return this.headers.at(-1);\n }\n\n #getIndex(el: Element | null) {\n if (BaseAccordion.isHeader(el)) {\n return this.headers.findIndex(header => header.id === el.id);\n }\n\n if (BaseAccordion.isPanel(el)) {\n return this.panels.findIndex(panel => panel.id === el.id);\n }\n\n this.#logger.warn('The #getIndex method expects to receive a header or panel element.');\n return -1;\n }\n\n public updateAccessibility() {\n const { headers } = this;\n\n // For each header in the accordion, attach the aria connections\n headers.forEach(header => {\n const panel = this.#panelForHeader(header);\n if (panel) {\n header.setAttribute('aria-controls', panel.id);\n panel.setAttribute('aria-labelledby', header.id);\n panel.hidden = !panel.expanded;\n }\n });\n }\n\n /**\n * Accepts a 0-based index value (integer) for the set of accordion items to expand or collapse.\n */\n public async toggle(index: number) {\n const { headers } = this;\n const header = headers[index];\n\n if (!header.expanded) {\n await this.expand(index);\n } else {\n await this.collapse(index);\n }\n }\n\n /**\n * Accepts a 0-based index value (integer) for the set of accordion items to expand.\n * Accepts an optional parent accordion to search for headers and panels.\n */\n public async expand(index: number, parentAccordion?: BaseAccordion) {\n if (index === -1) {\n return;\n }\n\n const allHeaders: Array<BaseAccordionHeader> = this.#allHeaders(parentAccordion);\n\n const header = allHeaders[index];\n if (!header) {\n return;\n }\n\n const panel = this.#panelForHeader(header);\n if (!panel) {\n return;\n }\n\n // If the header and panel exist, open both\n this.#expandHeader(header, index),\n this.#expandPanel(panel),\n\n header.focus();\n\n this.dispatchEvent(new AccordionExpandEvent(header, panel));\n\n await this.updateComplete;\n }\n\n /**\n * Expands all accordion items.\n */\n public async expandAll() {\n this.headers.forEach(header => this.#expandHeader(header));\n this.panels.forEach(panel => this.#expandPanel(panel));\n await this.updateComplete;\n }\n\n /**\n * Accepts a 0-based index value (integer) for the set of accordion items to collapse.\n */\n public async collapse(index: number) {\n const header = this.headers.at(index);\n const panel = this.panels.at(index);\n\n if (!header || !panel) {\n return;\n }\n\n this.#collapseHeader(header);\n this.#collapsePanel(panel);\n\n this.dispatchEvent(new AccordionCollapseEvent(header, panel));\n await this.updateComplete;\n }\n\n /**\n * Collapses all accordion items.\n */\n public async collapseAll() {\n this.headers.forEach(header => this.#collapseHeader(header));\n this.panels.forEach(panel => this.#collapsePanel(panel));\n await this.updateComplete;\n }\n}\n"]}