@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,581 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
* The alert class.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { isValidClassList, isValidInstance, isValidType } from "../validate.js";
|
|
7
|
+
import { addClass, removeClass } from "../domHelpers.js";
|
|
8
|
+
import { keyPress, preventEvent } from "../eventHandlers.js";
|
|
9
|
+
import storage from "../storage.js";
|
|
10
|
+
|
|
11
|
+
class Alert {
|
|
12
|
+
/**
|
|
13
|
+
* The HTML elements for the alert in the DOM.
|
|
14
|
+
*
|
|
15
|
+
* @protected
|
|
16
|
+
*
|
|
17
|
+
* @type {Object<HTMLElement>}
|
|
18
|
+
*/
|
|
19
|
+
_dom = {
|
|
20
|
+
alert: null,
|
|
21
|
+
controller: null,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A flag to determine if the alert is hidden.
|
|
26
|
+
*
|
|
27
|
+
* @protected
|
|
28
|
+
*
|
|
29
|
+
* @type {boolean}
|
|
30
|
+
*/
|
|
31
|
+
_hidden = false;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The class to use to show the alert.
|
|
35
|
+
*
|
|
36
|
+
* @protected
|
|
37
|
+
*
|
|
38
|
+
* @type {string|string[]}
|
|
39
|
+
*/
|
|
40
|
+
_showClass = "";
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The class to use to hide the alert.
|
|
44
|
+
*
|
|
45
|
+
* @protected
|
|
46
|
+
*
|
|
47
|
+
* @type {string|string[]}
|
|
48
|
+
*/
|
|
49
|
+
_hideClass = "";
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The class to use when transitioning the alert.
|
|
53
|
+
*
|
|
54
|
+
* @protected
|
|
55
|
+
*
|
|
56
|
+
* @type {string|string[]}
|
|
57
|
+
*/
|
|
58
|
+
_transitionClass = "";
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The time in milliseconds the transition will take.
|
|
62
|
+
*
|
|
63
|
+
* @protected
|
|
64
|
+
*
|
|
65
|
+
* @type {number}
|
|
66
|
+
*/
|
|
67
|
+
_transitionTimer = 150;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The key used to generate IDs throughout the carousel.
|
|
71
|
+
*
|
|
72
|
+
* @protected
|
|
73
|
+
*
|
|
74
|
+
* @type {string}
|
|
75
|
+
*/
|
|
76
|
+
_key = "";
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* An array of error messages generated by the alert.
|
|
80
|
+
*
|
|
81
|
+
* @protected
|
|
82
|
+
*
|
|
83
|
+
* @type {string[]}
|
|
84
|
+
*/
|
|
85
|
+
_errors = [];
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The event that is triggered when the alert is shown.
|
|
89
|
+
*
|
|
90
|
+
* @protected
|
|
91
|
+
*
|
|
92
|
+
* @event grauplAlertShow
|
|
93
|
+
*
|
|
94
|
+
* @type {CustomEvent}
|
|
95
|
+
*
|
|
96
|
+
* @property {boolean} bubbles - A flag to bubble the event.
|
|
97
|
+
* @property {Object<Alert>} detail - The details object container the Alert itself.
|
|
98
|
+
*/
|
|
99
|
+
_showEvent = new CustomEvent("grauplAlertShow", {
|
|
100
|
+
bubbles: true,
|
|
101
|
+
detail: { alert: this },
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The event that is triggered when the alert is hidden.
|
|
106
|
+
*
|
|
107
|
+
* @protected
|
|
108
|
+
*
|
|
109
|
+
* @event grauplAlertHide
|
|
110
|
+
*
|
|
111
|
+
* @type {CustomEvent}
|
|
112
|
+
*
|
|
113
|
+
* @property {boolean} bubbles - A flag to bubble the event.
|
|
114
|
+
* @property {Object<Alert>} detail - The details object containing the Alert itself.
|
|
115
|
+
*/
|
|
116
|
+
_hideEvent = new CustomEvent("grauplAlertHide", {
|
|
117
|
+
bubbles: true,
|
|
118
|
+
detail: { alert: this },
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Constructs a new `Alert`.
|
|
123
|
+
*
|
|
124
|
+
* @param {object} options - The options object.
|
|
125
|
+
* @param {HTMLElement} options.alertElement - The alert element.
|
|
126
|
+
* @param {?HTMLElement} [options.controllerElement = null] - The controller element.
|
|
127
|
+
* @param {string|string[]|null} [options.showClass = show] - The class to add when the alert is shown.
|
|
128
|
+
* @param {string|string[]|null} [options.hideClass = hide] - The class to add when
|
|
129
|
+
* @param {string|string[]|null} [options.transitionClass = transitioning] - The class to add when the alert is transitioning between shown and hidden.
|
|
130
|
+
* @param {number} [options.transitionTimer = 150] - The time in milliseconds the transition will take.
|
|
131
|
+
* @param {boolean} [options.isHidden = false] - A flag to determine the initial state of the alert.
|
|
132
|
+
* @param {?string} [options.key = null] - The key used to generate IDs throughout the alert.
|
|
133
|
+
* @param {boolean} [options.initialize = false] - AA flag to initialize the alert immediately upon creation.
|
|
134
|
+
*/
|
|
135
|
+
constructor({
|
|
136
|
+
alertElement,
|
|
137
|
+
controllerElement = null,
|
|
138
|
+
showClass = "show",
|
|
139
|
+
hideClass = "hide",
|
|
140
|
+
transitionClass = "transitioning",
|
|
141
|
+
transitionTimer = 150,
|
|
142
|
+
isHidden = false,
|
|
143
|
+
key = null,
|
|
144
|
+
initialize = false,
|
|
145
|
+
}) {
|
|
146
|
+
this._dom.alert = alertElement;
|
|
147
|
+
this._dom.controller = controllerElement;
|
|
148
|
+
this._showClass = showClass || "";
|
|
149
|
+
this._hideClass = hideClass || "";
|
|
150
|
+
this._transitionClass = transitionClass || "";
|
|
151
|
+
this._transitionTimer = transitionTimer;
|
|
152
|
+
this._hidden = isHidden;
|
|
153
|
+
|
|
154
|
+
// Set the key.
|
|
155
|
+
this._key = key || "";
|
|
156
|
+
|
|
157
|
+
if (initialize) {
|
|
158
|
+
this.initialize();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Initializes the alert.
|
|
164
|
+
*/
|
|
165
|
+
initialize() {
|
|
166
|
+
try {
|
|
167
|
+
if (!this._validate()) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
`Graupl Alert: cannot initialize alert. The following errors have been found:\n - ${this.errors.join(
|
|
170
|
+
"\n - "
|
|
171
|
+
)}`
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Set up the DOM.
|
|
176
|
+
this._generateKey();
|
|
177
|
+
this._setIds();
|
|
178
|
+
|
|
179
|
+
// Handle events.
|
|
180
|
+
this._handleClick();
|
|
181
|
+
this._handleKeydown();
|
|
182
|
+
this._handleKeyup();
|
|
183
|
+
|
|
184
|
+
// Set up the storage.
|
|
185
|
+
storage.initializeStorage("alerts");
|
|
186
|
+
storage.pushToStorage("alerts", this.dom.alert.id, this);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
console.error(error);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The HTML elements for the alert in the DOM.
|
|
194
|
+
*
|
|
195
|
+
* @readonly
|
|
196
|
+
*
|
|
197
|
+
* @see _dom
|
|
198
|
+
*
|
|
199
|
+
* @type {object}
|
|
200
|
+
*/
|
|
201
|
+
get dom() {
|
|
202
|
+
return this._dom;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* The class to use the show the alert.
|
|
207
|
+
*
|
|
208
|
+
* @type {string|string[]}
|
|
209
|
+
*
|
|
210
|
+
* @see _showClass
|
|
211
|
+
*/
|
|
212
|
+
get showClass() {
|
|
213
|
+
return this._showClass;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* The class to use to hide the alert.
|
|
218
|
+
*
|
|
219
|
+
* @type {string|string[]}
|
|
220
|
+
*
|
|
221
|
+
* @see _hideClass
|
|
222
|
+
*/
|
|
223
|
+
get hideClass() {
|
|
224
|
+
return this._hideClass;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* The class to use when transitioning the alert.
|
|
229
|
+
*
|
|
230
|
+
* @type {string|string[]}
|
|
231
|
+
*
|
|
232
|
+
* @see _transitionClass
|
|
233
|
+
*/
|
|
234
|
+
get transitionClass() {
|
|
235
|
+
return this._transitionClass;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* The time in milliseconds the transition will take.
|
|
240
|
+
*
|
|
241
|
+
* @type {number}
|
|
242
|
+
*
|
|
243
|
+
* @see _transitionTimer
|
|
244
|
+
*/
|
|
245
|
+
get transitionTimer() {
|
|
246
|
+
return this._transitionTimer;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* The key used to generate IDs throughout the accordion.
|
|
251
|
+
*
|
|
252
|
+
* @type {string}
|
|
253
|
+
*
|
|
254
|
+
* @see _key
|
|
255
|
+
*/
|
|
256
|
+
get key() {
|
|
257
|
+
return this._key;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
set showClass(value) {
|
|
261
|
+
isValidClassList({ showClass: value });
|
|
262
|
+
|
|
263
|
+
if (this._showClass !== value) {
|
|
264
|
+
this._showClass = value;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
set hideClass(value) {
|
|
269
|
+
isValidClassList({ hideClass: value });
|
|
270
|
+
|
|
271
|
+
if (this._hideClass !== value) {
|
|
272
|
+
this._hideClass = value;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
set transitionClass(value) {
|
|
277
|
+
isValidClassList({ transitionClass: value });
|
|
278
|
+
|
|
279
|
+
if (this._transitionClass !== value) {
|
|
280
|
+
this._transitionClass = value;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
set transitionTimer(value) {
|
|
285
|
+
isValidType("number", { transitionTimer: value });
|
|
286
|
+
|
|
287
|
+
if (this._transitionTimer !== value) {
|
|
288
|
+
this._transitionTimer = value;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
set key(value) {
|
|
293
|
+
isValidType("string", { value });
|
|
294
|
+
|
|
295
|
+
if (this._key !== value) {
|
|
296
|
+
this._key = value;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Validates all aspects of the alert to ensure proper functionality.
|
|
302
|
+
*
|
|
303
|
+
* @protected
|
|
304
|
+
*
|
|
305
|
+
* @return {boolean} - The result of the validation.
|
|
306
|
+
*/
|
|
307
|
+
_validate() {
|
|
308
|
+
let check = true;
|
|
309
|
+
|
|
310
|
+
// HTML element checks.
|
|
311
|
+
let htmlElementChecks;
|
|
312
|
+
|
|
313
|
+
if (this._dom.controller !== null) {
|
|
314
|
+
htmlElementChecks = isValidInstance(HTMLElement, {
|
|
315
|
+
alertElement: this._dom.alert,
|
|
316
|
+
controllerElement: this._dom.controller,
|
|
317
|
+
});
|
|
318
|
+
} else {
|
|
319
|
+
htmlElementChecks = isValidInstance(HTMLElement, {
|
|
320
|
+
alertElement: this._dom.alert,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (!htmlElementChecks.status) {
|
|
325
|
+
this._errors.push(htmlElementChecks.message);
|
|
326
|
+
check = false;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Class list checks.
|
|
330
|
+
if (this._showClass !== "") {
|
|
331
|
+
const showClassCheck = isValidClassList({ showClass: this._showClass });
|
|
332
|
+
|
|
333
|
+
if (!showClassCheck.status) {
|
|
334
|
+
this._errors.push(showClassCheck.message);
|
|
335
|
+
check = false;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
if (this._hideClass !== "") {
|
|
340
|
+
const hideClassCheck = isValidClassList({ hideClass: this._hideClass });
|
|
341
|
+
|
|
342
|
+
if (!hideClassCheck.status) {
|
|
343
|
+
this._errors.push(hideClassCheck.message);
|
|
344
|
+
check = false;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
if (this._transitionClass !== "") {
|
|
349
|
+
const transitionClassCheck = isValidClassList({
|
|
350
|
+
transitionClass: this._transitionClass,
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
if (!transitionClassCheck.status) {
|
|
354
|
+
this._errors.push(transitionClassCheck.message);
|
|
355
|
+
check = false;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Transition timer check.
|
|
360
|
+
const transitionTimerCheck = isValidType("number", {
|
|
361
|
+
transitionTimer: this._transitionTimer,
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
if (!transitionTimerCheck.status) {
|
|
365
|
+
this._errors.push(transitionTimerCheck.message);
|
|
366
|
+
check = false;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Hidden check.
|
|
370
|
+
const hiddenCheck = isValidType("boolean", { isHidden: this._hidden });
|
|
371
|
+
|
|
372
|
+
if (!hiddenCheck.status) {
|
|
373
|
+
this._errors.push(hiddenCheck.message);
|
|
374
|
+
check = false;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return check;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Generates a key for the alert.
|
|
382
|
+
*
|
|
383
|
+
* @param {boolean} [regenerate = false] - A flag to determine if the key should be regenerated.
|
|
384
|
+
*/
|
|
385
|
+
_generateKey(regenerate = false) {
|
|
386
|
+
if (this.key === "" || regenerate) {
|
|
387
|
+
this.key = Math.random()
|
|
388
|
+
.toString(36)
|
|
389
|
+
.replace(/[^a-z]+/g, "")
|
|
390
|
+
.substring(0, 10);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Sets the IDs of the alert and it's children if they do not already exist.
|
|
396
|
+
*
|
|
397
|
+
* The generated IDs use the key and follow the format:
|
|
398
|
+
* - alert: `alert-${key}`
|
|
399
|
+
* - controller: `alert-controller-${key}`
|
|
400
|
+
*/
|
|
401
|
+
_setIds() {
|
|
402
|
+
this.dom.alert.id = this.dom.alert.id || `alert-${this.key}`;
|
|
403
|
+
this.dom.controller.id =
|
|
404
|
+
this.dom.controller.id || `alert-controller-${this.key}`;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Shows the alert.
|
|
409
|
+
*
|
|
410
|
+
* @fires grauplAlertShow
|
|
411
|
+
*
|
|
412
|
+
* @param {boolean} [emit = true] - A toggle to emit the show event once shown.
|
|
413
|
+
*/
|
|
414
|
+
show(emit = true) {
|
|
415
|
+
if (!this._hidden) {
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// If we're dealing with transition classes, then we need to utilize
|
|
420
|
+
// requestAnimationFrame to add the transition class, remove the hide class,
|
|
421
|
+
// add the show class, and finally remove the transition class.
|
|
422
|
+
if (this.transitionClass !== "") {
|
|
423
|
+
addClass(this.transitionClass, this.dom.alert);
|
|
424
|
+
|
|
425
|
+
requestAnimationFrame(() => {
|
|
426
|
+
if (this.hideClass !== "") {
|
|
427
|
+
removeClass(this.hideClass, this.dom.alert);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
requestAnimationFrame(() => {
|
|
431
|
+
if (this.showClass !== "") {
|
|
432
|
+
addClass(this.showClass, this.dom.alert);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
requestAnimationFrame(() => {
|
|
436
|
+
removeClass(this.transitionClass, this.dom.alert);
|
|
437
|
+
});
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
} else {
|
|
441
|
+
// Add the show class
|
|
442
|
+
if (this.showClass !== "") {
|
|
443
|
+
addClass(this.showClass, this.dom.alert);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Remove the hide class.
|
|
447
|
+
if (this.hideClass !== "") {
|
|
448
|
+
removeClass(this.hideClass, this.dom.alert);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
this._hidden = false;
|
|
453
|
+
|
|
454
|
+
if (emit) {
|
|
455
|
+
this.dom.alert.dispatchEvent(this._hideEvent);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Hides the alert.
|
|
461
|
+
*
|
|
462
|
+
* @fires grauplAlertHide
|
|
463
|
+
*
|
|
464
|
+
* @param {boolean} [emit = true] - A toggle to emit the hide event once shown.
|
|
465
|
+
*/
|
|
466
|
+
hide(emit = true) {
|
|
467
|
+
if (this._hidden) {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
// If we're dealing with transition classes, then we need to utilize
|
|
471
|
+
// requestAnimationFrame to add the transition class, remove the show class,
|
|
472
|
+
// add the hide class, and finally remove the transition class.
|
|
473
|
+
if (this.transitionClass !== "") {
|
|
474
|
+
addClass(this.transitionClass, this.dom.alert);
|
|
475
|
+
|
|
476
|
+
requestAnimationFrame(() => {
|
|
477
|
+
if (this.showClass !== "") {
|
|
478
|
+
removeClass(this.showClass, this.dom.alert);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
requestAnimationFrame(() => {
|
|
482
|
+
if (this.transitionTimer > 0) {
|
|
483
|
+
setTimeout(() => {
|
|
484
|
+
if (this.hideClass !== "") {
|
|
485
|
+
addClass(this.hideClass, this.dom.alert);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
requestAnimationFrame(() => {
|
|
489
|
+
removeClass(this.transitionClass, this.dom.alert);
|
|
490
|
+
});
|
|
491
|
+
}, this.transitionTimer);
|
|
492
|
+
} else {
|
|
493
|
+
if (this.hideClass !== "") {
|
|
494
|
+
addClass(this.hideClass, this.dom.alert);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
requestAnimationFrame(() => {
|
|
498
|
+
removeClass(this.transitionClass, this.dom.alert);
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
});
|
|
502
|
+
});
|
|
503
|
+
} else {
|
|
504
|
+
// Add the hide class
|
|
505
|
+
if (this.hideClass !== "") {
|
|
506
|
+
addClass(this.hideClass, this.dom.alert);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// Remove the show class.
|
|
510
|
+
if (this.showClass !== "") {
|
|
511
|
+
removeClass(this.showClass, this.dom.alert);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
this._hidden = true;
|
|
516
|
+
|
|
517
|
+
if (emit) {
|
|
518
|
+
this.dom.alert.dispatchEvent(this._hideEvent);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* Handles click events throughout the alert for proper use.
|
|
524
|
+
*
|
|
525
|
+
* - Adds a `pointerup` listener to the controller that will hide the alert.
|
|
526
|
+
*
|
|
527
|
+
* @protected
|
|
528
|
+
*/
|
|
529
|
+
_handleClick() {
|
|
530
|
+
if (this.dom.controller === null) {
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
this.dom.controller.addEventListener("pointerup", () => this.hide());
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Handles keydown events throughout the alert for proper use.
|
|
539
|
+
*
|
|
540
|
+
* This method exists to assist the _handleKeyup method.
|
|
541
|
+
*
|
|
542
|
+
* - Adds a `keydown` listener to the controller (if it exists).
|
|
543
|
+
* - Blocks propagation on "Space" and "Enter" keys.
|
|
544
|
+
*/
|
|
545
|
+
_handleKeydown() {
|
|
546
|
+
if (this.dom.controller === null) {
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
this.dom.controller.addEventListener("keydown", (event) => {
|
|
551
|
+
const key = keyPress(event);
|
|
552
|
+
|
|
553
|
+
// Prevent default behavior for space and enter keys.
|
|
554
|
+
if (key === "Space" || key === "Enter") {
|
|
555
|
+
preventEvent(event);
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* Handles keyup events throughout the alert for proper use.
|
|
562
|
+
*
|
|
563
|
+
* - Adds a `keyup` listener to the controller (if it exists).
|
|
564
|
+
* - Hides the alert when the user hits "Space" or "Enter".
|
|
565
|
+
*/
|
|
566
|
+
_handleKeyup() {
|
|
567
|
+
if (this.dom.controller === null) {
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
this.dom.controller.addEventListener("keyup", (event) => {
|
|
572
|
+
const key = keyPress(event);
|
|
573
|
+
|
|
574
|
+
if (key === "Space" || key === "Enter") {
|
|
575
|
+
this.hide();
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
export default Alert;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import Alert from "./Alert.js";
|
|
2
|
+
|
|
3
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
4
|
+
document.querySelectorAll(".alert").forEach((alertElement) => {
|
|
5
|
+
new Alert({
|
|
6
|
+
alertElement,
|
|
7
|
+
controllerElement: alertElement.querySelector(".alert-dismisser") || null,
|
|
8
|
+
initialize: true,
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
});
|