@graupl/core 1.0.0-beta.10
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/dist/css/base/button.css +2 -0
- package/dist/css/base/button.css.map +1 -0
- package/dist/css/base/form.css +2 -0
- package/dist/css/base/form.css.map +1 -0
- package/dist/css/base/link.css +2 -0
- package/dist/css/base/link.css.map +1 -0
- package/dist/css/base/table.css +2 -0
- package/dist/css/base/table.css.map +1 -0
- package/dist/css/base.css +2 -0
- package/dist/css/base.css.map +1 -0
- package/dist/css/component/accordion.css +5 -0
- package/dist/css/component/accordion.css.map +1 -0
- package/dist/css/component/alert.css +2 -0
- package/dist/css/component/alert.css.map +1 -0
- package/dist/css/component/card.css +2 -0
- package/dist/css/component/card.css.map +1 -0
- package/dist/css/component/carousel.css +2 -0
- package/dist/css/component/carousel.css.map +1 -0
- package/dist/css/component/input-group.css +2 -0
- package/dist/css/component/input-group.css.map +1 -0
- package/dist/css/component/list.css +2 -0
- package/dist/css/component/list.css.map +1 -0
- package/dist/css/component/menu.css +2 -0
- package/dist/css/component/menu.css.map +1 -0
- package/dist/css/component/navigation.css +2 -0
- package/dist/css/component/navigation.css.map +1 -0
- package/dist/css/component.css +5 -0
- package/dist/css/component.css.map +1 -0
- package/dist/css/graupl.css +5 -0
- package/dist/css/graupl.css.map +1 -0
- package/dist/css/init.css +2 -0
- package/dist/css/init.css.map +1 -0
- package/dist/css/layout/columns.css +2 -0
- package/dist/css/layout/columns.css.map +1 -0
- package/dist/css/layout/container.css +2 -0
- package/dist/css/layout/container.css.map +1 -0
- package/dist/css/layout/flex-columns.css +2 -0
- package/dist/css/layout/flex-columns.css.map +1 -0
- package/dist/css/layout.css +5 -0
- package/dist/css/layout.css.map +1 -0
- package/dist/css/normalize.css +2 -0
- package/dist/css/normalize.css.map +1 -0
- package/dist/css/state/focus.css +2 -0
- package/dist/css/state/focus.css.map +1 -0
- package/dist/css/state.css +2 -0
- package/dist/css/state.css.map +1 -0
- package/dist/css/theme/color.css +2 -0
- package/dist/css/theme/color.css.map +1 -0
- package/dist/css/theme/typography.css +2 -0
- package/dist/css/theme/typography.css.map +1 -0
- package/dist/css/theme.css +2 -0
- package/dist/css/theme.css.map +1 -0
- package/dist/css/utilities/alignment.css +2 -0
- package/dist/css/utilities/alignment.css.map +1 -0
- package/dist/css/utilities/background.css +2 -0
- package/dist/css/utilities/background.css.map +1 -0
- package/dist/css/utilities/border.css +2 -0
- package/dist/css/utilities/border.css.map +1 -0
- package/dist/css/utilities/color.css +2 -0
- package/dist/css/utilities/color.css.map +1 -0
- package/dist/css/utilities/container.css +2 -0
- package/dist/css/utilities/container.css.map +1 -0
- package/dist/css/utilities/display.css +2 -0
- package/dist/css/utilities/display.css.map +1 -0
- package/dist/css/utilities/flex.css +2 -0
- package/dist/css/utilities/flex.css.map +1 -0
- package/dist/css/utilities/gradient.css +2 -0
- package/dist/css/utilities/gradient.css.map +1 -0
- package/dist/css/utilities/height.css +2 -0
- package/dist/css/utilities/height.css.map +1 -0
- package/dist/css/utilities/inset.css +2 -0
- package/dist/css/utilities/inset.css.map +1 -0
- package/dist/css/utilities/justification.css +2 -0
- package/dist/css/utilities/justification.css.map +1 -0
- package/dist/css/utilities/list.css +2 -0
- package/dist/css/utilities/list.css.map +1 -0
- package/dist/css/utilities/order.css +2 -0
- package/dist/css/utilities/order.css.map +1 -0
- package/dist/css/utilities/position.css +2 -0
- package/dist/css/utilities/position.css.map +1 -0
- package/dist/css/utilities/ratio.css +2 -0
- package/dist/css/utilities/ratio.css.map +1 -0
- package/dist/css/utilities/spacing.css +2 -0
- package/dist/css/utilities/spacing.css.map +1 -0
- package/dist/css/utilities/typography.css +2 -0
- package/dist/css/utilities/typography.css.map +1 -0
- package/dist/css/utilities/visibility.css +2 -0
- package/dist/css/utilities/visibility.css.map +1 -0
- package/dist/css/utilities/visually-hidden.css +2 -0
- package/dist/css/utilities/visually-hidden.css.map +1 -0
- package/dist/css/utilities/width.css +2 -0
- package/dist/css/utilities/width.css.map +1 -0
- package/dist/css/utilities/z-index.css +2 -0
- package/dist/css/utilities/z-index.css.map +1 -0
- package/dist/css/utilities.css +2 -0
- package/dist/css/utilities.css.map +1 -0
- package/package.json +58 -0
- package/scss/base/button.scss +3 -0
- package/scss/base/form.scss +3 -0
- package/scss/base/link.scss +3 -0
- package/scss/base/table.scss +3 -0
- package/scss/base.scss +3 -0
- package/scss/component/accordion.scss +3 -0
- package/scss/component/alert.scss +3 -0
- package/scss/component/card.scss +3 -0
- package/scss/component/carousel.scss +3 -0
- package/scss/component/input-group.scss +3 -0
- package/scss/component/list.scss +3 -0
- package/scss/component/menu.scss +3 -0
- package/scss/component/navigation.scss +3 -0
- package/scss/component.scss +3 -0
- package/scss/graupl.scss +3 -0
- package/scss/init.scss +3 -0
- package/scss/layout/columns.scss +3 -0
- package/scss/layout/container.scss +3 -0
- package/scss/layout/flex-columns.scss +3 -0
- package/scss/layout.scss +3 -0
- package/scss/normalize.scss +3 -0
- package/scss/state/focus.scss +3 -0
- package/scss/state.scss +3 -0
- package/scss/theme/color.scss +3 -0
- package/scss/theme/typography.scss +3 -0
- package/scss/theme.scss +3 -0
- package/scss/utilities/alignment.scss +3 -0
- package/scss/utilities/background.scss +3 -0
- package/scss/utilities/border.scss +3 -0
- package/scss/utilities/color.scss +3 -0
- package/scss/utilities/container.scss +3 -0
- package/scss/utilities/display.scss +3 -0
- package/scss/utilities/flex.scss +3 -0
- package/scss/utilities/gradient.scss +3 -0
- package/scss/utilities/height.scss +3 -0
- package/scss/utilities/inset.scss +3 -0
- package/scss/utilities/justification.scss +3 -0
- package/scss/utilities/list.scss +3 -0
- package/scss/utilities/order.scss +3 -0
- package/scss/utilities/position.scss +3 -0
- package/scss/utilities/ratio.scss +3 -0
- package/scss/utilities/spacing.scss +3 -0
- package/scss/utilities/typography.scss +3 -0
- package/scss/utilities/visibility.scss +3 -0
- package/scss/utilities/visually-hidden.scss +3 -0
- package/scss/utilities/width.scss +3 -0
- package/scss/utilities/z-index.scss +3 -0
- package/scss/utilities.scss +3 -0
- package/src/js/accordion/Accordion.js +1163 -0
- package/src/js/accordion/AccordionItem.js +496 -0
- package/src/js/accordion/index.js +10 -0
- package/src/js/alert/Alert.js +581 -0
- package/src/js/alert/index.js +11 -0
- package/src/js/carousel/Carousel.js +1427 -0
- package/src/js/carousel/index.js +10 -0
- package/src/js/domHelpers.js +37 -0
- package/src/js/eventHandlers.js +39 -0
- package/src/js/navigation/index.js +36 -0
- package/src/js/storage.js +106 -0
- package/src/js/validate.js +225 -0
- package/src/scss/_defaults.scss +184 -0
- package/src/scss/_index.scss +15 -0
- package/src/scss/_init.scss +6 -0
- package/src/scss/_normalize.scss +197 -0
- package/src/scss/_variables.scss +95 -0
- package/src/scss/base/_index.scss +6 -0
- package/src/scss/base/button/_defaults.scss +49 -0
- package/src/scss/base/button/_index.scss +206 -0
- package/src/scss/base/button/_mixins.scss +104 -0
- package/src/scss/base/button/_variables.scss +252 -0
- package/src/scss/base/form/_defaults.scss +24 -0
- package/src/scss/base/form/_index.scss +227 -0
- package/src/scss/base/form/_variables.scss +245 -0
- package/src/scss/base/link/_defaults.scss +35 -0
- package/src/scss/base/link/_index.scss +245 -0
- package/src/scss/base/link/_variables.scss +370 -0
- package/src/scss/base/table/_defaults.scss +68 -0
- package/src/scss/base/table/_index.scss +314 -0
- package/src/scss/base/table/_variables.scss +309 -0
- package/src/scss/component/_index.scss +10 -0
- package/src/scss/component/accordion/_defaults.scss +40 -0
- package/src/scss/component/accordion/_index.scss +198 -0
- package/src/scss/component/accordion/_variables.scss +356 -0
- package/src/scss/component/alert/_defaults.scss +49 -0
- package/src/scss/component/alert/_index.scss +119 -0
- package/src/scss/component/alert/_variables.scss +200 -0
- package/src/scss/component/card/_defaults.scss +32 -0
- package/src/scss/component/card/_index.scss +212 -0
- package/src/scss/component/card/_variables.scss +216 -0
- package/src/scss/component/carousel/_defaults.scss +43 -0
- package/src/scss/component/carousel/_index.scss +192 -0
- package/src/scss/component/carousel/_variables.scss +104 -0
- package/src/scss/component/input-group/_defaults.scss +30 -0
- package/src/scss/component/input-group/_index.scss +47 -0
- package/src/scss/component/input-group/_variables.scss +66 -0
- package/src/scss/component/list/_defaults.scss +15 -0
- package/src/scss/component/list/_index.scss +52 -0
- package/src/scss/component/list/_variables.scss +236 -0
- package/src/scss/component/menu/_defaults.scss +57 -0
- package/src/scss/component/menu/_index.scss +308 -0
- package/src/scss/component/menu/_variables.scss +642 -0
- package/src/scss/component/navigation/_defaults.scss +23 -0
- package/src/scss/component/navigation/_index.scss +190 -0
- package/src/scss/component/navigation/_variables.scss +290 -0
- package/src/scss/functions/_container.scss +38 -0
- package/src/scss/functions/_important.scss +36 -0
- package/src/scss/functions/_screen.scss +38 -0
- package/src/scss/functions/_theme.scss +39 -0
- package/src/scss/functions/_utility.scss +28 -0
- package/src/scss/layout/_index.scss +5 -0
- package/src/scss/layout/columns/_defaults.scss +24 -0
- package/src/scss/layout/columns/_index.scss +137 -0
- package/src/scss/layout/columns/_variables.scss +55 -0
- package/src/scss/layout/container/_defaults.scss +35 -0
- package/src/scss/layout/container/_index.scss +628 -0
- package/src/scss/layout/container/_variables.scss +114 -0
- package/src/scss/layout/flex-columns/_defaults.scss +28 -0
- package/src/scss/layout/flex-columns/_index.scss +184 -0
- package/src/scss/layout/flex-columns/_variables.scss +30 -0
- package/src/scss/mixins/_animation.scss +15 -0
- package/src/scss/mixins/_container.scss +80 -0
- package/src/scss/mixins/_layer.scss +16 -0
- package/src/scss/mixins/_screen.scss +77 -0
- package/src/scss/mixins/_state.scss +18 -0
- package/src/scss/mixins/_theme.scss +15 -0
- package/src/scss/mixins/_utility.scss +185 -0
- package/src/scss/mixins/_visually-hidden.scss +30 -0
- package/src/scss/state/_index.scss +3 -0
- package/src/scss/state/focus/_defaults.scss +9 -0
- package/src/scss/state/focus/_index.scss +42 -0
- package/src/scss/state/focus/_mixins.scss +13 -0
- package/src/scss/state/focus/_variables.scss +50 -0
- package/src/scss/theme/_index.scss +4 -0
- package/src/scss/theme/color/_defaults.scss +143 -0
- package/src/scss/theme/color/_index.scss +42 -0
- package/src/scss/theme/color/_variables.scss +133 -0
- package/src/scss/theme/typography/_defaults.scss +54 -0
- package/src/scss/theme/typography/_index.scss +120 -0
- package/src/scss/theme/typography/_variables.scss +248 -0
- package/src/scss/utilities/_index.scss +23 -0
- package/src/scss/utilities/_template/_defaults.scss +41 -0
- package/src/scss/utilities/_template/_index.scss +171 -0
- package/src/scss/utilities/_template/_variables.scss +6 -0
- package/src/scss/utilities/alignment/_defaults.scss +76 -0
- package/src/scss/utilities/alignment/_index.scss +336 -0
- package/src/scss/utilities/alignment/_variables.scss +6 -0
- package/src/scss/utilities/background/_defaults.scss +122 -0
- package/src/scss/utilities/background/_index.scss +634 -0
- package/src/scss/utilities/background/_variables.scss +6 -0
- package/src/scss/utilities/border/_defaults.scss +73 -0
- package/src/scss/utilities/border/_index.scss +558 -0
- package/src/scss/utilities/border/_variables.scss +6 -0
- package/src/scss/utilities/color/_defaults.scss +49 -0
- package/src/scss/utilities/color/_index.scss +469 -0
- package/src/scss/utilities/color/_variables.scss +6 -0
- package/src/scss/utilities/container/_defaults.scss +40 -0
- package/src/scss/utilities/container/_index.scss +174 -0
- package/src/scss/utilities/container/_variables.scss +6 -0
- package/src/scss/utilities/display/_defaults.scss +47 -0
- package/src/scss/utilities/display/_index.scss +184 -0
- package/src/scss/utilities/display/_variables.scss +6 -0
- package/src/scss/utilities/flex/_defaults.scss +99 -0
- package/src/scss/utilities/flex/_index.scss +486 -0
- package/src/scss/utilities/flex/_variables.scss +6 -0
- package/src/scss/utilities/gradient/_defaults.scss +70 -0
- package/src/scss/utilities/gradient/_index.scss +696 -0
- package/src/scss/utilities/gradient/_variables.scss +29 -0
- package/src/scss/utilities/height/_defaults.scss +54 -0
- package/src/scss/utilities/height/_index.scss +525 -0
- package/src/scss/utilities/height/_variables.scss +6 -0
- package/src/scss/utilities/inset/_defaults.scss +55 -0
- package/src/scss/utilities/inset/_index.scss +258 -0
- package/src/scss/utilities/inset/_variables.scss +6 -0
- package/src/scss/utilities/justification/_defaults.scss +73 -0
- package/src/scss/utilities/justification/_index.scss +333 -0
- package/src/scss/utilities/justification/_variables.scss +6 -0
- package/src/scss/utilities/list/_defaults.scss +53 -0
- package/src/scss/utilities/list/_index.scss +253 -0
- package/src/scss/utilities/list/_variables.scss +6 -0
- package/src/scss/utilities/order/_defaults.scss +36 -0
- package/src/scss/utilities/order/_index.scss +246 -0
- package/src/scss/utilities/order/_variables.scss +6 -0
- package/src/scss/utilities/position/_defaults.scss +41 -0
- package/src/scss/utilities/position/_index.scss +178 -0
- package/src/scss/utilities/position/_variables.scss +6 -0
- package/src/scss/utilities/ratio/_defaults.scss +42 -0
- package/src/scss/utilities/ratio/_index.scss +188 -0
- package/src/scss/utilities/ratio/_variables.scss +9 -0
- package/src/scss/utilities/spacing/_defaults.scss +64 -0
- package/src/scss/utilities/spacing/_index.scss +970 -0
- package/src/scss/utilities/spacing/_variables.scss +6 -0
- package/src/scss/utilities/typography/_defaults.scss +58 -0
- package/src/scss/utilities/typography/_index.scss +1089 -0
- package/src/scss/utilities/typography/_variables.scss +6 -0
- package/src/scss/utilities/visibility/_defaults.scss +39 -0
- package/src/scss/utilities/visibility/_index.scss +173 -0
- package/src/scss/utilities/visibility/_variables.scss +6 -0
- package/src/scss/utilities/visually-hidden/_defaults.scss +29 -0
- package/src/scss/utilities/visually-hidden/_index.scss +189 -0
- package/src/scss/utilities/visually-hidden/_variables.scss +6 -0
- package/src/scss/utilities/width/_defaults.scss +54 -0
- package/src/scss/utilities/width/_index.scss +525 -0
- package/src/scss/utilities/width/_variables.scss +6 -0
- package/src/scss/utilities/z-index/_defaults.scss +40 -0
- package/src/scss/utilities/z-index/_index.scss +173 -0
- package/src/scss/utilities/z-index/_variables.scss +6 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
* The Accordion Item class.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* global Accordion */
|
|
7
|
+
|
|
8
|
+
import { isTag, isValidType } from "../validate.js";
|
|
9
|
+
import { addClass, removeClass } from "../domHelpers.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new accordion item.
|
|
13
|
+
*
|
|
14
|
+
* @class
|
|
15
|
+
*/
|
|
16
|
+
class AccordionItem {
|
|
17
|
+
/**
|
|
18
|
+
* The HTML elements for the accordion item in the DOM.
|
|
19
|
+
*
|
|
20
|
+
* @protected
|
|
21
|
+
*
|
|
22
|
+
* @type {Object<HTMLElement>}
|
|
23
|
+
*
|
|
24
|
+
* @property {HTMLElement} item - The accordion item element.
|
|
25
|
+
* @property {HTMLElement} toggle - The controller element.
|
|
26
|
+
* @property {HTMLElement} header - The header element.
|
|
27
|
+
* @property {HTMLElement} content - The content element.
|
|
28
|
+
*/
|
|
29
|
+
_dom = {
|
|
30
|
+
item: null,
|
|
31
|
+
toggle: null,
|
|
32
|
+
header: null,
|
|
33
|
+
content: null,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The declared graupl accordion elements within the accordion item.
|
|
38
|
+
*
|
|
39
|
+
* @protected
|
|
40
|
+
*
|
|
41
|
+
* @type {Object<Accordion>}
|
|
42
|
+
*
|
|
43
|
+
* @property {Accordion} parentAccordion - The parent accordion containing this item.
|
|
44
|
+
*/
|
|
45
|
+
_elements = {
|
|
46
|
+
parentAccordion: null,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The open state of the accordion.
|
|
51
|
+
*
|
|
52
|
+
* @protected
|
|
53
|
+
*
|
|
54
|
+
* @type {boolean}
|
|
55
|
+
*/
|
|
56
|
+
_open = false;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The locked state of the accordions item.
|
|
60
|
+
*
|
|
61
|
+
* If locked, the accordion item cannot be closed.
|
|
62
|
+
*
|
|
63
|
+
* @protected
|
|
64
|
+
*
|
|
65
|
+
* @type {boolean}
|
|
66
|
+
*/
|
|
67
|
+
_locked = false;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The event that is triggered when the accordion item is shown.
|
|
71
|
+
*
|
|
72
|
+
* @protected
|
|
73
|
+
*
|
|
74
|
+
* @event grauplAccordionItemExpand
|
|
75
|
+
*
|
|
76
|
+
* @type {CustomEvent}
|
|
77
|
+
*
|
|
78
|
+
* @property {boolean} bubbles - A flag to bubble the event.
|
|
79
|
+
* @property {Object<AccordionItem>} detail - The details object containing the Accordion item itself.
|
|
80
|
+
*/
|
|
81
|
+
_expandEvent = new CustomEvent("grauplAccordionItemExpand", {
|
|
82
|
+
bubbles: true,
|
|
83
|
+
detail: { item: this },
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The event that is triggered when the accordion item is hidden.
|
|
88
|
+
*
|
|
89
|
+
* @protected
|
|
90
|
+
*
|
|
91
|
+
* @event grauplAccordionItemCollapse
|
|
92
|
+
*
|
|
93
|
+
* @type {CustomEvent}
|
|
94
|
+
*
|
|
95
|
+
* @property {boolean} bubbles - A flag to bubble the event.
|
|
96
|
+
* @property {Object<AccordionItem>} detail - The details object containing the Accordion item itself.
|
|
97
|
+
*/
|
|
98
|
+
_collapseEvent = new CustomEvent("grauplAccordionItemCollapse", {
|
|
99
|
+
bubbles: true,
|
|
100
|
+
detail: { item: this },
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Constructs a new Accordion item object.
|
|
105
|
+
*
|
|
106
|
+
* @class
|
|
107
|
+
*
|
|
108
|
+
* @param {object} options - The options object.
|
|
109
|
+
* @param {HTMLElement} options.accordionItemElement - The accordion item element.
|
|
110
|
+
* @param {HTMLElement} options.accordionItemToggleElement - The toggle element.
|
|
111
|
+
* @param {HTMLElement} options.accordionItemHeaderElement - The header element.
|
|
112
|
+
* @param {HTMLElement} options.accordionItemContentElement - The content element.
|
|
113
|
+
* @param {Accordion} [options.parentAccordion = null] - The accordion containing this item.
|
|
114
|
+
*/
|
|
115
|
+
constructor({
|
|
116
|
+
accordionItemElement,
|
|
117
|
+
accordionItemToggleElement,
|
|
118
|
+
accordionItemHeaderElement,
|
|
119
|
+
accordionItemContentElement,
|
|
120
|
+
parentAccordion = null,
|
|
121
|
+
}) {
|
|
122
|
+
// Set DOM elements.
|
|
123
|
+
this._dom.item = accordionItemElement;
|
|
124
|
+
this._dom.toggle = accordionItemToggleElement;
|
|
125
|
+
this._dom.header = accordionItemHeaderElement;
|
|
126
|
+
this._dom.content = accordionItemContentElement;
|
|
127
|
+
|
|
128
|
+
// Set the accordion elements.
|
|
129
|
+
this._elements.parentAccordion = parentAccordion;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Initializes the accordion item.
|
|
134
|
+
*/
|
|
135
|
+
initialize() {
|
|
136
|
+
// Set the IDs for the accordion item and it's elements if they don't exist.
|
|
137
|
+
this._setIds();
|
|
138
|
+
|
|
139
|
+
// Set the ARIA attributes for the accordion item and it's elements.
|
|
140
|
+
this._setAriaAttributes();
|
|
141
|
+
|
|
142
|
+
// Set the initial state of the accordion item.
|
|
143
|
+
if (this.dom.toggle.getAttribute("aria-expanded") === "true") {
|
|
144
|
+
this.show(false, false);
|
|
145
|
+
} else {
|
|
146
|
+
this.hide(false, false);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* The HTML elements for the accordion item in the DOM.
|
|
152
|
+
*
|
|
153
|
+
* @readonly
|
|
154
|
+
*
|
|
155
|
+
* @type {object}
|
|
156
|
+
*
|
|
157
|
+
* @see _dom
|
|
158
|
+
*/
|
|
159
|
+
get dom() {
|
|
160
|
+
return this._dom;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The declared graupl accordion elements within the accordion item.
|
|
165
|
+
*
|
|
166
|
+
* @readonly
|
|
167
|
+
*
|
|
168
|
+
* @type {Object<Accordion>}
|
|
169
|
+
*
|
|
170
|
+
* @see _elements
|
|
171
|
+
*/
|
|
172
|
+
get elements() {
|
|
173
|
+
return this._elements;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* The open state of the accordion.
|
|
178
|
+
*
|
|
179
|
+
* @readonly
|
|
180
|
+
*
|
|
181
|
+
* @type {object}
|
|
182
|
+
*
|
|
183
|
+
* @see _open
|
|
184
|
+
*/
|
|
185
|
+
get isOpen() {
|
|
186
|
+
return this._open;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* The locked state of the accordions item.
|
|
191
|
+
*
|
|
192
|
+
* If locked, the accordion item cannot be closed.
|
|
193
|
+
*
|
|
194
|
+
* @readonly
|
|
195
|
+
*
|
|
196
|
+
* @type {boolean}
|
|
197
|
+
*
|
|
198
|
+
* @see _locked
|
|
199
|
+
*/
|
|
200
|
+
get isLocked() {
|
|
201
|
+
return this._locked;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
set isOpen(value) {
|
|
205
|
+
isValidType("boolean", { value });
|
|
206
|
+
|
|
207
|
+
if (this._open !== value) {
|
|
208
|
+
this._open = value;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Sets the IDs for the accordion item and it's elements if they don't exist.
|
|
214
|
+
*
|
|
215
|
+
* The generated IDs use the parent accordion's key and follows the pattern:
|
|
216
|
+
* - Accordion item: `accordion-item-{key}-{index}`
|
|
217
|
+
* - Accordion item toggle: `accordion-item-toggle-{key}-{index}`
|
|
218
|
+
* - Accordion item content: `accordion-item-content-{key}-{index}`
|
|
219
|
+
*/
|
|
220
|
+
_setIds() {
|
|
221
|
+
// Get the required information for IDs.
|
|
222
|
+
const { key } = this.elements.parentAccordion;
|
|
223
|
+
const index = this.elements.parentAccordion.dom.accordionItems.indexOf(
|
|
224
|
+
this.dom.item
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
this.dom.item.id = this.dom.item.id || `accordion-item-${key}-${index}`;
|
|
228
|
+
this.dom.toggle.id =
|
|
229
|
+
this.dom.toggle.id || `accordion-item-toggle-${key}-${index}`;
|
|
230
|
+
this.dom.header.id =
|
|
231
|
+
this.dom.header.id || `accordion-item-header-${key}-${index}`;
|
|
232
|
+
this.dom.content.id =
|
|
233
|
+
this.dom.content.id || `accordion-item-content-${key}-${index}`;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Sets the ARIA attributes for the accordion item and it's elements.
|
|
238
|
+
*/
|
|
239
|
+
_setAriaAttributes() {
|
|
240
|
+
// Set the ARIA attributes for the accordion item toggle.
|
|
241
|
+
// If the toggle is not a button, then set the role to "button".
|
|
242
|
+
if (!isTag("button", { toggle: this.dom.toggle })) {
|
|
243
|
+
this.dom.toggle.setAttribute("role", "button");
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// If aria-expanded is not explicitly set to "true", then set it to "false".
|
|
247
|
+
if (this.dom.toggle.getAttribute("aria-expanded") !== "true") {
|
|
248
|
+
this.dom.toggle.setAttribute("aria-expanded", "false");
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Set the aria-controls attribute for the toggle.
|
|
252
|
+
this.dom.toggle.setAttribute("aria-controls", this.dom.content.id);
|
|
253
|
+
|
|
254
|
+
// Set the ARIA attributes for the accordion item content.
|
|
255
|
+
// If the content is not a section, then set the role to "region".
|
|
256
|
+
if (!isTag("section", { content: this.dom.content })) {
|
|
257
|
+
this.dom.content.setAttribute("role", "region");
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Set the aria-labelledby attribute for the content.
|
|
261
|
+
this.dom.content.setAttribute("aria-labelledby", this.dom.toggle.id);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Shows the accordion item.
|
|
266
|
+
*
|
|
267
|
+
* @public
|
|
268
|
+
*
|
|
269
|
+
* @fires grauplAccordionItemExpand
|
|
270
|
+
*
|
|
271
|
+
* @param {boolean} [emit = true] - Emit the show event once shown.
|
|
272
|
+
* @param {boolean} [transition = true] - Respect the transition class.
|
|
273
|
+
*/
|
|
274
|
+
show(emit = true, transition = true) {
|
|
275
|
+
if (this._open) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const { closeClass, openClass, transitionClass, openDuration } =
|
|
280
|
+
this.elements.parentAccordion;
|
|
281
|
+
|
|
282
|
+
// Set aria-expanded to true when hiding accordion item.
|
|
283
|
+
this.dom.toggle.setAttribute("aria-expanded", "true");
|
|
284
|
+
|
|
285
|
+
// If we're dealing with transition classes, then we need to utilize
|
|
286
|
+
// requestAnimationFrame to add the transition class, remove the hide class,
|
|
287
|
+
// add the show class, and finally remove the transition class.
|
|
288
|
+
//
|
|
289
|
+
// If `transition` is false, then it doesn't matter if the transition class
|
|
290
|
+
// is set. Do not use the transition.
|
|
291
|
+
if (transition && transitionClass !== "") {
|
|
292
|
+
addClass(transitionClass, this.dom.item);
|
|
293
|
+
|
|
294
|
+
requestAnimationFrame(() => {
|
|
295
|
+
removeClass(closeClass, this.dom.item);
|
|
296
|
+
|
|
297
|
+
this.dom.item.style.height = `${this.dom.header.getBoundingClientRect().height}px`;
|
|
298
|
+
|
|
299
|
+
requestAnimationFrame(() => {
|
|
300
|
+
addClass(openClass, this.dom.item);
|
|
301
|
+
|
|
302
|
+
this.dom.item.style.height = `${this.dom.header.getBoundingClientRect().height + this.dom.content.getBoundingClientRect().height}px`;
|
|
303
|
+
|
|
304
|
+
requestAnimationFrame(() => {
|
|
305
|
+
setTimeout(() => {
|
|
306
|
+
removeClass(transitionClass, this.dom.item);
|
|
307
|
+
|
|
308
|
+
this.dom.item.style.height = "";
|
|
309
|
+
}, openDuration);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
} else {
|
|
314
|
+
// Add the show class
|
|
315
|
+
addClass(openClass, this.dom.item);
|
|
316
|
+
|
|
317
|
+
// Remove the hide class.
|
|
318
|
+
removeClass(closeClass, this.dom.item);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
this._open = true;
|
|
322
|
+
|
|
323
|
+
// If the parent accordion only allows a single item to be open at a time,
|
|
324
|
+
// then close all other items.
|
|
325
|
+
if (!this.elements.parentAccordion.allowMultipleExpand) {
|
|
326
|
+
this.unlockSiblings();
|
|
327
|
+
this.closeSiblings();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// If the parent accordion requires at least one item to be open, and this
|
|
331
|
+
// is the only open item, then lock it. Otherwise, unlock all siblings.
|
|
332
|
+
if (!this.elements.parentAccordion.allowNoExpand) {
|
|
333
|
+
if (this.elements.parentAccordion.openAccordionItems.length <= 1) {
|
|
334
|
+
this.lock();
|
|
335
|
+
} else {
|
|
336
|
+
this.unlockSiblings();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
if (emit) {
|
|
341
|
+
this.dom.item.dispatchEvent(this._expandEvent);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Hides the accordion item.
|
|
347
|
+
*
|
|
348
|
+
* @public
|
|
349
|
+
*
|
|
350
|
+
* @fires grauplAccordionItemCollapse
|
|
351
|
+
*
|
|
352
|
+
* @param {boolean} [emit = true] - Emit the show event once shown.
|
|
353
|
+
* @param {boolean} [transition = true] - Respect the transition class.
|
|
354
|
+
*/
|
|
355
|
+
hide(emit = true, transition = true) {
|
|
356
|
+
if (!this._open) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
if (
|
|
361
|
+
!this.elements.parentAccordion.allowNoExpand &&
|
|
362
|
+
this.elements.parentAccordion.openAccordionItems.length <= 1
|
|
363
|
+
) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const { closeClass, openClass, transitionClass, closeDuration } =
|
|
368
|
+
this.elements.parentAccordion;
|
|
369
|
+
|
|
370
|
+
// Set aria-expanded to false when hiding accordion item.
|
|
371
|
+
this.dom.toggle.setAttribute("aria-expanded", "false");
|
|
372
|
+
|
|
373
|
+
// If we're dealing with transition classes, then we need to utilize
|
|
374
|
+
// requestAnimationFrame to add the transition class, remove the show class,
|
|
375
|
+
// add the hide class, and finally remove the transition class.
|
|
376
|
+
//
|
|
377
|
+
// If `transition` is false, then it doesn't matter if the transition class
|
|
378
|
+
// is set. Do not use the transition.
|
|
379
|
+
if (transition && transitionClass !== "") {
|
|
380
|
+
addClass(transitionClass, this.dom.item);
|
|
381
|
+
this.dom.item.style.height = `${this.dom.item.getBoundingClientRect().height}px`;
|
|
382
|
+
|
|
383
|
+
requestAnimationFrame(() => {
|
|
384
|
+
removeClass(openClass, this.dom.item);
|
|
385
|
+
this.dom.item.style.height = `${this.dom.header.getBoundingClientRect().height}px`;
|
|
386
|
+
|
|
387
|
+
requestAnimationFrame(() => {
|
|
388
|
+
addClass(closeClass, this.dom.item);
|
|
389
|
+
|
|
390
|
+
requestAnimationFrame(() => {
|
|
391
|
+
setTimeout(() => {
|
|
392
|
+
removeClass(transitionClass, this.dom.item);
|
|
393
|
+
|
|
394
|
+
this.dom.item.style.height = "";
|
|
395
|
+
}, closeDuration);
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
} else {
|
|
400
|
+
// Add the hide class
|
|
401
|
+
addClass(closeClass, this.dom.item);
|
|
402
|
+
|
|
403
|
+
// Remove the show class.
|
|
404
|
+
removeClass(openClass, this.dom.item);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
this._open = false;
|
|
408
|
+
|
|
409
|
+
// If the parent accordion requires at least one item to be open, and this was
|
|
410
|
+
// the second to last open item, then lock to last open item.
|
|
411
|
+
if (
|
|
412
|
+
!this.elements.parentAccordion.allowNoExpand &&
|
|
413
|
+
this.elements.parentAccordion.openAccordionItems.length === 1
|
|
414
|
+
) {
|
|
415
|
+
this.elements.parentAccordion.openAccordionItems[0].lock();
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
if (emit) {
|
|
419
|
+
this.dom.item.dispatchEvent(this._collapseEvent);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Toggle the accordion item.
|
|
425
|
+
*
|
|
426
|
+
* @public
|
|
427
|
+
*/
|
|
428
|
+
toggle() {
|
|
429
|
+
this.isOpen ? this.hide() : this.show();
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Focuses the accordion item.
|
|
434
|
+
*
|
|
435
|
+
* @public
|
|
436
|
+
*/
|
|
437
|
+
focus() {
|
|
438
|
+
this.dom.toggle.focus();
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Blurs the accordion item.
|
|
443
|
+
*
|
|
444
|
+
* @public
|
|
445
|
+
*/
|
|
446
|
+
blur() {
|
|
447
|
+
this.dom.toggle.blur();
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Locks the accordion item.
|
|
452
|
+
*
|
|
453
|
+
* @public
|
|
454
|
+
*/
|
|
455
|
+
lock() {
|
|
456
|
+
this._locked = true;
|
|
457
|
+
this.dom.toggle.setAttribute("disabled", "true");
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Unlocks the accordion item.
|
|
462
|
+
*
|
|
463
|
+
* @public
|
|
464
|
+
*/
|
|
465
|
+
unlock() {
|
|
466
|
+
this._locked = false;
|
|
467
|
+
this.dom.toggle.removeAttribute("disabled");
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
closeSiblings() {
|
|
471
|
+
if (this.elements.parentAccordion) {
|
|
472
|
+
this.elements.parentAccordion.elements.accordionItems.forEach((item) => {
|
|
473
|
+
if (item !== this) {
|
|
474
|
+
item.hide();
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Unlocks the siblings of the accordion item.
|
|
482
|
+
*
|
|
483
|
+
* @public
|
|
484
|
+
*/
|
|
485
|
+
unlockSiblings() {
|
|
486
|
+
if (this.elements.parentAccordion) {
|
|
487
|
+
this.elements.parentAccordion.elements.accordionItems.forEach((item) => {
|
|
488
|
+
if (item !== this) {
|
|
489
|
+
item.unlock();
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
export default AccordionItem;
|