@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.
- package/custom-elements.json +32 -65
- package/package.json +4 -3
- package/pf-accordion/BaseAccordion.d.ts +2 -1
- package/pf-accordion/BaseAccordion.js +239 -210
- package/pf-accordion/BaseAccordion.js.map +1 -1
- package/pf-accordion/BaseAccordionHeader.js +71 -69
- package/pf-accordion/BaseAccordionHeader.js.map +1 -1
- package/pf-accordion/BaseAccordionPanel.js +2 -2
- package/pf-accordion/BaseAccordionPanel.js.map +1 -1
- package/pf-accordion/pf-accordion-header.js +4 -9
- package/pf-accordion/pf-accordion-header.js.map +1 -1
- package/pf-accordion/pf-accordion-panel.js +1 -1
- package/pf-accordion/pf-accordion-panel.js.map +1 -1
- package/pf-accordion/pf-accordion.js +1 -1
- package/pf-accordion/pf-accordion.js.map +1 -1
- package/pf-avatar/BaseAvatar.js +1 -1
- package/pf-avatar/BaseAvatar.js.map +1 -1
- package/pf-avatar/pf-avatar.js +1 -1
- package/pf-avatar/pf-avatar.js.map +1 -1
- package/pf-badge/BaseBadge.js +1 -1
- package/pf-badge/BaseBadge.js.map +1 -1
- package/pf-badge/pf-badge.js +1 -1
- package/pf-badge/pf-badge.js.map +1 -1
- package/pf-button/BaseButton.js +16 -17
- package/pf-button/BaseButton.js.map +1 -1
- package/pf-button/pf-button.js +1 -1
- package/pf-button/pf-button.js.map +1 -1
- package/pf-card/BaseCard.js +1 -1
- package/pf-card/BaseCard.js.map +1 -1
- package/pf-card/pf-card.js +1 -1
- package/pf-card/pf-card.js.map +1 -1
- package/pf-clipboard-copy/BaseClipboardCopy.js +1 -1
- package/pf-clipboard-copy/BaseClipboardCopy.js.map +1 -1
- package/pf-clipboard-copy/pf-clipboard-copy.js +33 -36
- package/pf-clipboard-copy/pf-clipboard-copy.js.map +1 -1
- package/pf-code-block/BaseCodeBlock.js +1 -1
- package/pf-code-block/BaseCodeBlock.js.map +1 -1
- package/pf-code-block/pf-code-block.js +11 -14
- package/pf-code-block/pf-code-block.js.map +1 -1
- package/pf-icon/BaseIcon.js +41 -39
- package/pf-icon/BaseIcon.js.map +1 -1
- package/pf-icon/pf-icon.js +2 -2
- package/pf-icon/pf-icon.js.map +1 -1
- package/pf-jump-links/pf-jump-links-item.js +14 -17
- package/pf-jump-links/pf-jump-links-item.js.map +1 -1
- package/pf-jump-links/pf-jump-links-list.js +1 -1
- package/pf-jump-links/pf-jump-links-list.js.map +1 -1
- package/pf-jump-links/pf-jump-links.js +34 -37
- package/pf-jump-links/pf-jump-links.js.map +1 -1
- package/pf-label/BaseLabel.js +1 -1
- package/pf-label/BaseLabel.js.map +1 -1
- package/pf-label/pf-label.js +2 -2
- package/pf-label/pf-label.js.map +1 -1
- package/pf-modal/pf-modal.js +45 -46
- package/pf-modal/pf-modal.js.map +1 -1
- package/pf-panel/pf-panel.js +6 -7
- package/pf-panel/pf-panel.js.map +1 -1
- package/pf-popover/pf-popover.js +48 -51
- package/pf-popover/pf-popover.js.map +1 -1
- package/pf-progress-stepper/pf-progress-step.js +10 -11
- package/pf-progress-stepper/pf-progress-step.js.map +1 -1
- package/pf-progress-stepper/pf-progress-stepper.js +13 -16
- package/pf-progress-stepper/pf-progress-stepper.js.map +1 -1
- package/pf-spinner/BaseSpinner.js +1 -1
- package/pf-spinner/BaseSpinner.js.map +1 -1
- package/pf-spinner/pf-spinner.js +1 -1
- package/pf-spinner/pf-spinner.js.map +1 -1
- package/pf-switch/BaseSwitch.js +47 -44
- package/pf-switch/BaseSwitch.js.map +1 -1
- package/pf-switch/pf-switch.js +1 -1
- package/pf-switch/pf-switch.js.map +1 -1
- package/pf-tabs/BaseTab.js +31 -29
- package/pf-tabs/BaseTab.js.map +1 -1
- package/pf-tabs/BaseTabPanel.d.ts +0 -1
- package/pf-tabs/BaseTabPanel.js +5 -11
- package/pf-tabs/BaseTabPanel.js.map +1 -1
- package/pf-tabs/BaseTabs.js +135 -116
- package/pf-tabs/BaseTabs.js.map +1 -1
- package/pf-tabs/pf-tab-panel.js +1 -1
- package/pf-tabs/pf-tab-panel.js.map +1 -1
- package/pf-tabs/pf-tab.js +1 -1
- package/pf-tabs/pf-tab.js.map +1 -1
- package/pf-tabs/pf-tabs.js +2 -2
- package/pf-tabs/pf-tabs.js.map +1 -1
- package/pf-tile/pf-tile.js +1 -1
- package/pf-tile/pf-tile.js.map +1 -1
- package/pf-timestamp/pf-timestamp.d.ts +8 -5
- package/pf-timestamp/pf-timestamp.js +21 -66
- package/pf-timestamp/pf-timestamp.js.map +1 -1
- package/pf-tooltip/BaseTooltip.js +7 -13
- package/pf-tooltip/BaseTooltip.js.map +1 -1
- package/pf-tooltip/pf-tooltip.js +1 -1
- package/pf-tooltip/pf-tooltip.js.map +1 -1
- package/pfe.min.js +121 -121
- package/pfe.min.js.map +4 -4
- package/react/pf-accordion/pf-accordion-header.js +12 -0
- package/react/pf-accordion/pf-accordion-panel.js +10 -0
- package/react/pf-accordion/pf-accordion.js +13 -0
- package/react/pf-avatar/pf-avatar.js +10 -0
- package/react/pf-badge/pf-badge.js +10 -0
- package/react/pf-button/pf-button.js +10 -0
- package/react/pf-card/pf-card.js +10 -0
- package/react/pf-clipboard-copy/pf-clipboard-copy.js +10 -0
- package/react/pf-code-block/pf-code-block.js +10 -0
- package/react/pf-icon/pf-icon.js +13 -0
- package/react/pf-jump-links/pf-jump-links-item.js +13 -0
- package/react/pf-jump-links/pf-jump-links-list.js +10 -0
- package/react/pf-jump-links/pf-jump-links.js +12 -0
- package/react/pf-label/pf-label.js +12 -0
- package/react/pf-modal/pf-modal.js +13 -0
- package/react/pf-panel/pf-panel.js +10 -0
- package/react/pf-popover/pf-popover.js +10 -0
- package/react/pf-progress-stepper/pf-progress-step.js +10 -0
- package/react/pf-progress-stepper/pf-progress-stepper.js +10 -0
- package/react/pf-spinner/pf-spinner.js +10 -0
- package/react/pf-switch/pf-switch.js +12 -0
- package/react/pf-tabs/pf-tab-panel.js +10 -0
- package/react/pf-tabs/pf-tab.js +12 -0
- package/react/pf-tabs/pf-tabs.js +10 -0
- package/react/pf-tile/pf-tile.js +10 -0
- package/react/pf-timestamp/pf-timestamp.js +10 -0
- package/react/pf-tooltip/pf-tooltip.js +10 -0
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
32
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
49
|
-
|
|
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
|
|
76
|
+
return this.#allHeaders();
|
|
62
77
|
}
|
|
63
78
|
get panels() {
|
|
64
|
-
return
|
|
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
|
-
...
|
|
70
|
-
...
|
|
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',
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
90
|
-
const panel =
|
|
115
|
+
this.#expandHeader(header, index);
|
|
116
|
+
const panel = this.#panelForHeader(header);
|
|
91
117
|
if (panel) {
|
|
92
|
-
|
|
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 =
|
|
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 =
|
|
327
|
+
const allHeaders = this.#allHeaders(parentAccordion);
|
|
131
328
|
const header = allHeaders[index];
|
|
132
329
|
if (!header) {
|
|
133
330
|
return;
|
|
134
331
|
}
|
|
135
|
-
const panel =
|
|
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
|
-
|
|
141
|
-
|
|
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 =>
|
|
151
|
-
this.panels.forEach(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
|
-
|
|
164
|
-
|
|
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 =>
|
|
173
|
-
this.panels.forEach(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",
|
|
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":";AAEA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,4CAA4C,CAAC;AAEpE,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gEAAgE,CAAC;;;AAI1G,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;AAE1D,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IACrD,YACS,MAA2B,EAC3B,KAAyB;QAEhC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAHT,WAAM,GAAN,MAAM,CAAqB;QAC3B,UAAK,GAAL,KAAK,CAAoB;IAGlC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD,YACS,MAA2B,EAC3B,KAAyB;QAEhC,KAAK,CAAC,UAAU,CAAC,CAAC;QAHX,WAAM,GAAN,MAAM,CAAqB;QAC3B,UAAK,GAAL,KAAK,CAAoB;IAGlC,CAAC;CACF;AAED,MAAsB,aAAc,SAAQ,UAAU;IAAtD;;QAeE,iBAAY,GAAG,IAAI,wBAAwB,CAAsB,IAAI,CAAC,CAAC;QAEvE,mBAAc,GAAa,EAAE,CAAC;QA8CpB,iBAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QAE3C,YAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;QAE3B,YAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEjC,wBAAmB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEnD,mDAAmD;QACnD,iBAAY,GAAG,KAAK,CAAC;QAWrB,QAAG,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IA4UjD,CAAC;aA9ZiB,WAAM,GAAG,CAAC,KAAK,CAAC,AAAV,CAAW;IAEjC,MAAM,CAAC,WAAW,CAAC,MAA0B;QAC3C,OAAO,MAAM,YAAY,aAAa,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,MAA0B;QACxC,OAAO,MAAM,YAAY,mBAAmB,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,MAA0B;QACvC,OAAO,MAAM,YAAY,kBAAkB,CAAC;IAC9C,CAAC;IAED,YAAY,CAA2D;IAEvE,cAAc,CAAgB;IAE9B;;;;;;;;OAQG;IAKH,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAI,aAAa,CAAC,KAAK;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACjD,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBACjC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;oBAClC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;iBAC5B;YACH,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,aAAa;QACf,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAClF,OAAO,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAID,OAAO,CAAoB;IAE3B,OAAO,CAA0B;IAEjC,mBAAmB,CAAgC;IAEnD,mDAAmD;IACnD,YAAY,CAAS;IAEF,KAAK,CAAC,iBAAiB;QACxC,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAChC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;YAChD,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;SAChD,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,GAAG,CAA4C;IAE/C,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAA0B,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;KAEV,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAChC,IAAI,MAAM,CAAC,QAAQ,EAAE;gBACnB,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,KAAK,EAAE;oBACT,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;iBAC1B;aACF;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC;QAClD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,6GAA6G;QAC7G,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAoC,CAAC,CAAC;QAC5E,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED,mBAAmB;QACjB,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SACxD;IACH,CAAC;IAED,eAAe,CAAC,MAA2B;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,kBAAkB,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAChC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACnF;aAAM;YACL,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,aAAa,CAAC,MAA2B,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACvE,wEAAwE;QACxE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,YAA2B,CAAC,CAAC;QAC5D,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAyB;QAC1C,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QAErB,MAAM,KAAK,CAAC,cAAc,CAAC;QAE3B,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAE3C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAA2B,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,MAAM,IAAI,CAAC,cAAc,CAAC;SAC3B;QACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,MAAM,MAAM,CAAC,cAAc,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAyB;QAC5C,MAAM,KAAK,CAAC,cAAc,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACnB,OAAO;SACR;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAE3C,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QACvB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,qBAAqB;QACnB,IAAI,kBAAkB,IAAI,IAAI,EAAE;YAC9B,iEAAiE;YACjE,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;SAC3E;aAAM;YACL,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAE5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;YAEpE,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO,CAAC,CAAC;aACV;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;YAE9C,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE;gBACvB,OAAO,MAAM,GAAG,IAAI,CAAC;aACtB;iBAAM;gBACL,OAAO,MAAM,CAAC;aACf;SACF;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAyB,EAAE,KAAa,EAAE,GAAW;QAClE,IAAI,KAAK,EAAE;YACT,MAAM,MAAM,GAAG,KAAK,CAAC,sBAAsB,CAAC;YAE5C,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACxD,IAAI,kBAAkB,EAAE;gBACtB,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;aAC/C;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;YAE/C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACnC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAEjC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtF,SAAS,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,SAAS,CAAC,QAAQ,CAAC;YAEzB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACtC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAEpC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACrC,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;SAChC;IACH,CAAC;IAED,SAAS,CAAC,KAAiC;QACzC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YACxC,OAAO;SACR;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAiB,CAAC,CAAC;QAEtD,IAAI,KAAK,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACrC;aAAM;YACL,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACtB;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,GAAkB;QACjC,MAAM,aAAa,GAAG,GAAG,CAAC,MAAiB,CAAC;QAE5C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YAC1C,OAAO;SACR;QAED,IAAI,SAA0C,CAAC;QAE/C,QAAQ,GAAG,CAAC,GAAG,EAAE;YACf,KAAK,WAAW;gBACd,GAAG,CAAC,cAAc,EAAE,CAAC;gBACrB,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC/B,MAAM;YACR,KAAK,SAAS;gBACZ,GAAG,CAAC,cAAc,EAAE,CAAC;gBACrB,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnC,MAAM;YACR,KAAK,MAAM;gBACT,GAAG,CAAC,cAAc,EAAE,CAAC;gBACrB,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChC,MAAM;YACR,KAAK,KAAK;gBACR,GAAG,CAAC,cAAc,EAAE,CAAC;gBACrB,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC/B,MAAM;SACT;QAED,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,WAAW,CAAC,YAA2B,IAAI;QACzC,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvE,CAAC;IAED,UAAU,CAAC,YAA2B,IAAI;QACxC,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IAED,eAAe;QACb,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC;QACzF,OAAO,OAAO,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,WAAW;QACT,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC;QACzF,OAAO,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,EAAkB;QAC1B,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;SAC9D;QAED,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;SAC3D;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACxF,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAEM,mBAAmB;QACxB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEzB,gEAAgE;QAChE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,KAAK,EAAE;gBACT,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC/C,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBACjD,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;aAChC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,MAAM,CAAC,KAAa;QAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAE9B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YACpB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC1B;aAAM;YACL,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC5B;IACH,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,eAA+B;QAChE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,OAAO;SACR;QAED,MAAM,UAAU,GAA+B,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAEjF,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE;YACX,OAAO;SACR;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QAED,2CAA2C;QAC3C,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;YACjC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAExB,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,IAAI,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAE5D,MAAM,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,SAAS;QACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ,CAAC,KAAa;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAEpC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;YACrB,OAAO;SACR;QAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,IAAI,CAAC,aAAa,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,MAAM,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW;QACtB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;;AA9XD;IAJC,QAAQ,CAAC;QACR,SAAS,EAAE,gBAAgB;QAC3B,SAAS,EAAE,mBAAmB;KAC/B,CAAC;kDAGD;SAlCmB,aAAa","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"]}
|