@graupl/core 1.0.0-beta.19 → 1.0.0-beta.20
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/component/badge.css +2 -0
- package/dist/css/component/badge.css.map +1 -0
- package/dist/css/component/disclosure.css +2 -0
- package/dist/css/component/disclosure.css.map +1 -0
- package/dist/css/component.css +1 -1
- package/dist/css/component.css.map +1 -1
- package/dist/css/graupl.css +1 -1
- package/dist/css/graupl.css.map +1 -1
- package/dist/css/layout.css +1 -1
- package/dist/css/layout.css.map +1 -1
- package/dist/js/accordion.js +2 -2
- package/dist/js/accordion.js.map +1 -1
- package/dist/js/alert.js.map +1 -1
- package/dist/js/carousel.js +2 -2
- package/dist/js/carousel.js.map +1 -1
- package/dist/js/component/accordion.cjs.js +2 -2
- package/dist/js/component/accordion.cjs.js.map +1 -1
- package/dist/js/component/accordion.es.js +2 -2
- package/dist/js/component/accordion.es.js.map +1 -1
- package/dist/js/component/accordion.iife.js +2 -2
- package/dist/js/component/accordion.iife.js.map +1 -1
- package/dist/js/component/alert.cjs.js.map +1 -1
- package/dist/js/component/alert.es.js.map +1 -1
- package/dist/js/component/alert.iife.js +2 -2
- package/dist/js/component/alert.iife.js.map +1 -1
- package/dist/js/component/carousel.cjs.js +2 -2
- package/dist/js/component/carousel.cjs.js.map +1 -1
- package/dist/js/component/carousel.es.js +2 -2
- package/dist/js/component/carousel.es.js.map +1 -1
- package/dist/js/component/carousel.iife.js +2 -2
- package/dist/js/component/carousel.iife.js.map +1 -1
- package/dist/js/component/disclosure.cjs.js +5 -0
- package/dist/js/component/disclosure.cjs.js.map +1 -0
- package/dist/js/component/disclosure.es.js +5 -0
- package/dist/js/component/disclosure.es.js.map +1 -0
- package/dist/js/component/disclosure.iife.js +5 -0
- package/dist/js/component/disclosure.iife.js.map +1 -0
- package/dist/js/generator/accordion.cjs.js +2 -2
- package/dist/js/generator/accordion.cjs.js.map +1 -1
- package/dist/js/generator/accordion.es.js +2 -2
- package/dist/js/generator/accordion.es.js.map +1 -1
- package/dist/js/generator/accordion.iife.js +2 -2
- package/dist/js/generator/accordion.iife.js.map +1 -1
- package/dist/js/generator/alert.cjs.js.map +1 -1
- package/dist/js/generator/alert.es.js.map +1 -1
- package/dist/js/generator/alert.iife.js +2 -2
- package/dist/js/generator/alert.iife.js.map +1 -1
- package/dist/js/generator/carousel.cjs.js +2 -2
- package/dist/js/generator/carousel.cjs.js.map +1 -1
- package/dist/js/generator/carousel.es.js +2 -2
- package/dist/js/generator/carousel.es.js.map +1 -1
- package/dist/js/generator/carousel.iife.js +2 -2
- package/dist/js/generator/carousel.iife.js.map +1 -1
- package/dist/js/generator/disclosure.cjs.js +5 -0
- package/dist/js/generator/disclosure.cjs.js.map +1 -0
- package/dist/js/generator/disclosure.es.js +5 -0
- package/dist/js/generator/disclosure.es.js.map +1 -0
- package/dist/js/generator/disclosure.iife.js +5 -0
- package/dist/js/generator/disclosure.iife.js.map +1 -0
- package/dist/js/generator/navigation.cjs.js.map +1 -1
- package/dist/js/generator/navigation.es.js.map +1 -1
- package/dist/js/generator/navigation.iife.js +1 -1
- package/dist/js/generator/navigation.iife.js.map +1 -1
- package/dist/js/graupl.js +6 -4
- package/dist/js/graupl.js.map +1 -1
- package/dist/js/navigation.js.map +1 -1
- package/package.json +1 -1
- package/scss/component/badge.scss +3 -0
- package/scss/component/disclosure.scss +3 -0
- package/src/js/TransactionalValue.js +140 -0
- package/src/js/accordion/Accordion.js +4 -4
- package/src/js/carousel/Carousel.js +1 -1
- package/src/js/disclosure/Disclosure.js +1299 -0
- package/src/js/disclosure/generator.js +47 -0
- package/src/js/disclosure/index.js +5 -0
- package/src/js/main.js +2 -0
- package/src/js/validate.js +7 -7
- package/src/scss/_index.scss +8 -8
- package/src/scss/base/_index.scss +4 -4
- package/src/scss/component/_index.scss +10 -8
- package/src/scss/component/badge/_defaults.scss +47 -0
- package/src/scss/component/badge/_index.scss +201 -0
- package/src/scss/component/badge/_variables.scss +112 -0
- package/src/scss/component/disclosure/_defaults.scss +45 -0
- package/src/scss/component/disclosure/_index.scss +214 -0
- package/src/scss/component/disclosure/_variables.scss +205 -0
- package/src/scss/layout/_index.scss +3 -3
- package/src/scss/theme/_index.scss +2 -2
- package/src/scss/utilities/_index.scss +21 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert.cjs.js","names":["isValidInstance","contructor","elements","elementsType","TypeError","key","elementType","name","status","error","isValidType","type","values","valuesType","valueType","isQuerySelector","Error","document","querySelector","isValidClassList","Array","isArray","forEach","value","obj","isValidHoverType","validTypes","includes","join","isTag","tagName","HTMLElement","tag","toLowerCase","check","isValidState","validStates","isValidEvent","validEvents","addClass","className","element","length","classList","add","removeClass","remove","selectAllFocusableElements","context","document","querySelector","elements","Array","from","querySelectorAll","tabbableElements","filter","check","getAttribute","selectFirstFocusableElement","selectLastFocusableElement","selectNextFocusableElement","index","indexOf","selectPreviousFocusableElement","keyPress","event","key","keyCode","keys","Enter","Space","Escape","ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End","Tab","Object","find","preventEvent","preventDefault","stopPropagation","isValidType","initializeStorage","type","window","Graupl","getStorage","setStorage","data","clearStorage","pushToStorage","key","value","getFromStorage","removeFromStorage","isValidClassList","isValidInstance","isValidType","addClass","removeClass","keyPress","preventEvent","storage","Alert","_dom","alert","controller","_hidden","_showClass","_hideClass","_transitionClass","_transitionTimer","_key","_errors","_showEvent","CustomEvent","bubbles","detail","_hideEvent","constructor","alertElement","controllerElement","showClass","hideClass","transitionClass","transitionTimer","isHidden","key","initialize","_validate","Error","errors","join","_generateKey","_setIds","_handleClick","_handleKeydown","_handleKeyup","initializeStorage","pushToStorage","dom","id","error","console","value","check","htmlElementChecks","HTMLElement","status","push","message","showClassCheck","hideClassCheck","transitionClassCheck","transitionTimerCheck","hiddenCheck","regenerate","Math","random","toString","replace","substring","show","emit","requestAnimationFrame","dispatchEvent","hide","setTimeout","addEventListener","event"],"sources":["../../../src/js/validate.js","../../../src/js/domHelpers.js","../../../src/js/eventHandlers.js","../../../src/js/storage.js","../../../src/js/alert/Alert.js"],"sourcesContent":["/**\n * Check to see if the provided elements have a specific contructor.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * This is essentially just a wrapper function around checking instanceof with\n * more descriptive error message to help debugging.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {object} contructor - The constructor to check for.\n * @param {object} elements - The element(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidInstance(contructor, elements) {\n try {\n if (typeof elements !== \"object\") {\n const elementsType = typeof elements;\n\n throw new TypeError(\n `Elements given to isValidInstance() must be inside of an object. \"${elementsType}\" given.`\n );\n }\n\n for (const key in elements) {\n if (!(elements[key] instanceof contructor)) {\n const elementType = typeof elements[key];\n throw new TypeError(\n `${key} must be an instance of ${contructor.name}. \"${elementType}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are of a specific type.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * This is essentially just a wrapper function around checking typeof with\n * more descriptive error message to help debugging.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {string} type - The type to check for.\n * @param {object} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidType(type, values) {\n try {\n if (typeof values !== \"object\") {\n const valuesType = typeof values;\n\n throw new TypeError(\n `Values given to isValidType() must be inside of an object. \"${valuesType}\" given.`\n );\n }\n\n for (const key in values) {\n const valueType = typeof values[key];\n\n if (valueType !== type) {\n throw new TypeError(`${key} must be a ${type}. \"${valueType}\" given.`);\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided values are valid query selectors.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isQuerySelector(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isQuerySelector() must be inside of an object. \"${type}\" given.`\n );\n }\n\n for (const key in values) {\n try {\n if (values[key] === null) {\n throw new Error();\n }\n\n document.querySelector(values[key]);\n } catch {\n throw new TypeError(\n `${key} must be a valid query selector. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided value is either a string or an array of strings.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string, string[]>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidClassList(values) {\n try {\n if (typeof values !== \"object\" || Array.isArray(values)) {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidClassList() must be inside of an object. \"${type}\" given.`\n );\n }\n\n for (const key in values) {\n const type = typeof values[key];\n\n if (type !== \"string\") {\n if (Array.isArray(values[key])) {\n values[key].forEach((value) => {\n if (typeof value !== \"string\") {\n throw new TypeError(\n `${key} must be a string or an array of strings. An array containing non-strings given.`\n );\n }\n });\n } else {\n throw new TypeError(\n `${key} must be a string or an array of strings. \"${type}\" given.`\n );\n }\n } else {\n const obj = {};\n obj[key] = values[key];\n\n isQuerySelector(obj);\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are valid hover types.\n *\n * Available types are: `\"off\"`, `\"on\"`, and `\"dynamic\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidHoverType(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidHoverType() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validTypes = [\"off\", \"on\", \"dynamic\"];\n\n for (const key in values) {\n if (!validTypes.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validTypes.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided elements are using a specific tag.\n *\n * The elements must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `true` if the check is successful.\n *\n * @param {string} tagName - The name of the tag.\n * @param {Object<HTMLElement>} elements - The element(s) to check.\n * @return {boolean} - The result of the check.\n */\nexport function isTag(tagName, elements) {\n if (\n isValidType(\"string\", { tagName }).status &&\n isValidInstance(HTMLElement, elements).status\n ) {\n const tag = tagName.toLowerCase();\n let check = true;\n\n for (const key in elements) {\n if (elements[key].tagName.toLowerCase() !== tag) check = false;\n }\n\n return check;\n } else {\n return false;\n }\n}\n\n/**\n * Check to see if the provided values are valid focus states for a menu.\n *\n * Available states are: `\"none\"`, `\"self\"`, and `\"child\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidState(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidState() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validStates = [\"none\", \"self\", \"child\"];\n\n for (const key in values) {\n if (!validStates.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validStates.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are valid event types for a menu.\n *\n * Available events are: `\"none\"`, `\"mouse\"`, `\"keyboard\"`, and `\"character\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidEvent(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidEvent() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validEvents = [\"none\", \"mouse\", \"keyboard\", \"character\"];\n\n for (const key in values) {\n if (!validEvents.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validEvents.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n","/**\n * Add a class or array of classes to an element.\n *\n * @param {string|string[]} className - The class or classes to add.\n * @param {HTMLElement} element - The element to add the class to.\n */\nexport function addClass(className, element) {\n // Gracefully handle empty strings or arrays.\n if (className === \"\" || className.length === 0) {\n return;\n }\n\n if (typeof className === \"string\") {\n element.classList.add(className);\n } else {\n element.classList.add(...className);\n }\n}\n\n/**\n * Remove a class or array of classes from an element.\n *\n * @param {string|string[]} className - The class or classes to remove.\n * @param {HTMLElement} element - The element to remove the class from.\n */\nexport function removeClass(className, element) {\n // Gracefully handle empty strings or arrays.\n if (className === \"\" || className.length === 0) {\n return;\n }\n\n if (typeof className === \"string\") {\n element.classList.remove(className);\n } else {\n element.classList.remove(...className);\n }\n}\n\n/**\n * Select all focusable elements within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement[]} - An array of focusable elements.\n */\nexport function selectAllFocusableElements(context = document) {\n const querySelector =\n \"a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),[tabindex]\";\n const elements = Array.from(context.querySelectorAll(querySelector));\n\n const tabbableElements = elements.filter((element) => {\n let check = true;\n\n if (element.getAttribute(\"tabindex\") === \"-1\") check = false;\n\n return check;\n });\n\n return tabbableElements;\n}\n\n/**\n * Select the first focusable element within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The first focusable element or false if none found.\n */\nexport function selectFirstFocusableElement(context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n\n return tabbableElements[0] || false;\n}\n\n/**\n * Select the last focusable element within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The last focusable element or false if none found.\n */\nexport function selectLastFocusableElement(context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n\n return tabbableElements[tabbableElements.length - 1] || false;\n}\n\n/**\n * Select the next focusable element relative to the given element within a context.\n *\n * @param {HTMLElement} element - The reference element.\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The next focusable element or false if none found.\n */\nexport function selectNextFocusableElement(element, context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n const index = tabbableElements.indexOf(element);\n\n return index === tabbableElements.length - 1\n ? false\n : tabbableElements[index + 1];\n}\n\n/**\n * Select the previous focusable element relative to the given element within a context.\n *\n * @param {HTMLElement} element - The reference element.\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The previous focusable element or false if none found.\n */\nexport function selectPreviousFocusableElement(element, context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n const index = tabbableElements.indexOf(element);\n\n return index === 0 ? false : tabbableElements[index - 1];\n}\n","/**\n * Retrieves the pressed key from an event.\n *\n * @param {KeyboardEvent} event - The keyboard event.\n * @return {string} - The name of the key or an empty string.\n */\nexport function keyPress(event) {\n try {\n // Use event.key or event.keyCode to support older browsers.\n const key = event.key || event.keyCode;\n const keys = {\n Enter: key === \"Enter\" || key === 13,\n Space: key === \" \" || key === \"Spacebar\" || key === 32,\n Escape: key === \"Escape\" || key === \"Esc\" || key === 27,\n ArrowUp: key === \"ArrowUp\" || key === \"Up\" || key === 38,\n ArrowRight: key === \"ArrowRight\" || key === \"Right\" || key === 39,\n ArrowDown: key === \"ArrowDown\" || key === \"Down\" || key === 40,\n ArrowLeft: key === \"ArrowLeft\" || key === \"Left\" || key === 37,\n Home: key === \"Home\" || key === 36,\n End: key === \"End\" || key === 35,\n Tab: key === \"Tab\" || key === 9,\n };\n\n return Object.keys(keys).find((key) => keys[key] === true) || \"\";\n } catch {\n // Return an empty string if something goes wrong.\n return \"\";\n }\n}\n\n/**\n * Stops an event from taking action.\n *\n * @param {Event} event - The event.\n */\nexport function preventEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n","/**\n * @file\n * Provides a system to get and store Graupl data in the browser.\n */\n\nimport { isValidType } from \"./validate.js\";\n\n/**\n * Initializes the storage system.\n *\n * @param {?string} [type = null] - The type of storage to initialize.\n */\nexport function initializeStorage(type = null) {\n window.Graupl = window.Graupl || {};\n\n if (isValidType(\"string\", { type })) {\n window.Graupl[type] = window.Graupl[type] || {};\n }\n}\n\n/**\n * Get the storage object.\n *\n * @param {?string} type - The type of storage to get.\n * @return {object} - The storage object.\n */\nexport function getStorage(type = null) {\n if (isValidType(\"string\", { type })) {\n return window.Graupl[type];\n }\n\n return window.Graupl;\n}\n\n/**\n * Set the storage object of a given type.\n *\n * @param {string} type - The type of storage to set.\n * @param {object} data - The data to set.\n */\nexport function setStorage(type, data = {}) {\n if (isValidType(\"string\", { type }) && isValidType(\"object\", { data })) {\n window.Graupl[type] = data;\n }\n}\n\n/**\n * Clear the storage object of a given type.\n *\n * @param {string} type - The type of storage to clear.\n */\nexport function clearStorage(type) {\n if (isValidType(\"string\", { type })) {\n window.Graupl[type] = {};\n }\n}\n\n/**\n * Push a value to the storage object.\n *\n * @param {string} type - The type of storage to push to.\n * @param {string} key - The key to use for the value.\n * @param {*} value - The value to store.\n */\nexport function pushToStorage(type, key, value) {\n if (isValidType(\"string\", { type, key })) {\n window.Graupl[type][key] = value;\n }\n}\n\n/**\n * Get a value from the storage object.\n *\n * @param {string }type - The type of storage to get from.\n * @param {string }key - The key to get the value from.\n * @return {*} - The value from the storage object.\n */\nexport function getFromStorage(type, key) {\n if (isValidType(\"string\", { type, key })) {\n return window.Graupl[type][key];\n }\n\n return null;\n}\n\n/**\n * Remove a value from the storage object.\n *\n * @param {string} type - The type of storage to remove from.\n * @param {string} key - The key to remove the value from.\n */\nexport function removeFromStorage(type, key) {\n if (isValidType(\"string\", { type, key })) {\n delete window.Graupl[type][key];\n }\n}\n\nexport default {\n initializeStorage,\n getStorage,\n setStorage,\n clearStorage,\n pushToStorage,\n getFromStorage,\n removeFromStorage,\n};\n","/**\n * @file\n * The alert class.\n */\n\nimport { isValidClassList, isValidInstance, isValidType } from \"../validate.js\";\nimport { addClass, removeClass } from \"../domHelpers.js\";\nimport { keyPress, preventEvent } from \"../eventHandlers.js\";\nimport storage from \"../storage.js\";\n\nclass Alert {\n /**\n * The HTML elements for the alert in the DOM.\n *\n * @protected\n *\n * @type {Object<HTMLElement>}\n */\n _dom = {\n alert: null,\n controller: null,\n };\n\n /**\n * A flag to determine if the alert is hidden.\n *\n * @protected\n *\n * @type {boolean}\n */\n _hidden = false;\n\n /**\n * The class to use to show the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _showClass = \"\";\n\n /**\n * The class to use to hide the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _hideClass = \"\";\n\n /**\n * The class to use when transitioning the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _transitionClass = \"\";\n\n /**\n * The time in milliseconds the transition will take.\n *\n * @protected\n *\n * @type {number}\n */\n _transitionTimer = 150;\n\n /**\n * The key used to generate IDs throughout the carousel.\n *\n * @protected\n *\n * @type {string}\n */\n _key = \"\";\n\n /**\n * An array of error messages generated by the alert.\n *\n * @protected\n *\n * @type {string[]}\n */\n _errors = [];\n\n /**\n * The event that is triggered when the alert is shown.\n *\n * @protected\n *\n * @event grauplAlertShow\n *\n * @type {CustomEvent}\n *\n * @property {boolean} bubbles - A flag to bubble the event.\n * @property {Object<Alert>} detail - The details object container the Alert itself.\n */\n _showEvent = new CustomEvent(\"grauplAlertShow\", {\n bubbles: true,\n detail: { alert: this },\n });\n\n /**\n * The event that is triggered when the alert is hidden.\n *\n * @protected\n *\n * @event grauplAlertHide\n *\n * @type {CustomEvent}\n *\n * @property {boolean} bubbles - A flag to bubble the event.\n * @property {Object<Alert>} detail - The details object containing the Alert itself.\n */\n _hideEvent = new CustomEvent(\"grauplAlertHide\", {\n bubbles: true,\n detail: { alert: this },\n });\n\n /**\n * Constructs a new `Alert`.\n *\n * @param {object} options - The options object.\n * @param {HTMLElement} options.alertElement - The alert element.\n * @param {?HTMLElement} [options.controllerElement = null] - The controller element.\n * @param {string|string[]|null} [options.showClass = show] - The class to add when the alert is shown.\n * @param {string|string[]|null} [options.hideClass = hide] - The class to add when\n * @param {string|string[]|null} [options.transitionClass = transitioning] - The class to add when the alert is transitioning between shown and hidden.\n * @param {number} [options.transitionTimer = 150] - The time in milliseconds the transition will take.\n * @param {boolean} [options.isHidden = false] - A flag to determine the initial state of the alert.\n * @param {?string} [options.key = null] - The key used to generate IDs throughout the alert.\n * @param {boolean} [options.initialize = false] - AA flag to initialize the alert immediately upon creation.\n */\n constructor({\n alertElement,\n controllerElement = null,\n showClass = \"show\",\n hideClass = \"hide\",\n transitionClass = \"transitioning\",\n transitionTimer = 150,\n isHidden = false,\n key = null,\n initialize = false,\n }) {\n this._dom.alert = alertElement;\n this._dom.controller = controllerElement;\n this._showClass = showClass || \"\";\n this._hideClass = hideClass || \"\";\n this._transitionClass = transitionClass || \"\";\n this._transitionTimer = transitionTimer;\n this._hidden = isHidden;\n\n // Set the key.\n this._key = key || \"\";\n\n if (initialize) {\n this.initialize();\n }\n }\n\n /**\n * Initializes the alert.\n */\n initialize() {\n try {\n if (!this._validate()) {\n throw new Error(\n `Graupl Alert: cannot initialize alert. The following errors have been found:\\n - ${this.errors.join(\n \"\\n - \"\n )}`\n );\n }\n\n // Set up the DOM.\n this._generateKey();\n this._setIds();\n\n // Handle events.\n this._handleClick();\n this._handleKeydown();\n this._handleKeyup();\n\n // Set up the storage.\n storage.initializeStorage(\"alerts\");\n storage.pushToStorage(\"alerts\", this.dom.alert.id, this);\n } catch (error) {\n console.error(error);\n }\n }\n\n /**\n * The HTML elements for the alert in the DOM.\n *\n * @readonly\n *\n * @see _dom\n *\n * @type {object}\n */\n get dom() {\n return this._dom;\n }\n\n /**\n * The class to use the show the alert.\n *\n * @type {string|string[]}\n *\n * @see _showClass\n */\n get showClass() {\n return this._showClass;\n }\n\n /**\n * The class to use to hide the alert.\n *\n * @type {string|string[]}\n *\n * @see _hideClass\n */\n get hideClass() {\n return this._hideClass;\n }\n\n /**\n * The class to use when transitioning the alert.\n *\n * @type {string|string[]}\n *\n * @see _transitionClass\n */\n get transitionClass() {\n return this._transitionClass;\n }\n\n /**\n * The time in milliseconds the transition will take.\n *\n * @type {number}\n *\n * @see _transitionTimer\n */\n get transitionTimer() {\n return this._transitionTimer;\n }\n\n /**\n * The key used to generate IDs throughout the accordion.\n *\n * @type {string}\n *\n * @see _key\n */\n get key() {\n return this._key;\n }\n\n set showClass(value) {\n isValidClassList({ showClass: value });\n\n if (this._showClass !== value) {\n this._showClass = value;\n }\n }\n\n set hideClass(value) {\n isValidClassList({ hideClass: value });\n\n if (this._hideClass !== value) {\n this._hideClass = value;\n }\n }\n\n set transitionClass(value) {\n isValidClassList({ transitionClass: value });\n\n if (this._transitionClass !== value) {\n this._transitionClass = value;\n }\n }\n\n set transitionTimer(value) {\n isValidType(\"number\", { transitionTimer: value });\n\n if (this._transitionTimer !== value) {\n this._transitionTimer = value;\n }\n }\n\n set key(value) {\n isValidType(\"string\", { value });\n\n if (this._key !== value) {\n this._key = value;\n }\n }\n\n /**\n * Validates all aspects of the alert to ensure proper functionality.\n *\n * @protected\n *\n * @return {boolean} - The result of the validation.\n */\n _validate() {\n let check = true;\n\n // HTML element checks.\n let htmlElementChecks;\n\n if (this._dom.controller !== null) {\n htmlElementChecks = isValidInstance(HTMLElement, {\n alertElement: this._dom.alert,\n controllerElement: this._dom.controller,\n });\n } else {\n htmlElementChecks = isValidInstance(HTMLElement, {\n alertElement: this._dom.alert,\n });\n }\n\n if (!htmlElementChecks.status) {\n this._errors.push(htmlElementChecks.message);\n check = false;\n }\n\n // Class list checks.\n if (this._showClass !== \"\") {\n const showClassCheck = isValidClassList({ showClass: this._showClass });\n\n if (!showClassCheck.status) {\n this._errors.push(showClassCheck.message);\n check = false;\n }\n }\n\n if (this._hideClass !== \"\") {\n const hideClassCheck = isValidClassList({ hideClass: this._hideClass });\n\n if (!hideClassCheck.status) {\n this._errors.push(hideClassCheck.message);\n check = false;\n }\n }\n\n if (this._transitionClass !== \"\") {\n const transitionClassCheck = isValidClassList({\n transitionClass: this._transitionClass,\n });\n\n if (!transitionClassCheck.status) {\n this._errors.push(transitionClassCheck.message);\n check = false;\n }\n }\n\n // Transition timer check.\n const transitionTimerCheck = isValidType(\"number\", {\n transitionTimer: this._transitionTimer,\n });\n\n if (!transitionTimerCheck.status) {\n this._errors.push(transitionTimerCheck.message);\n check = false;\n }\n\n // Hidden check.\n const hiddenCheck = isValidType(\"boolean\", { isHidden: this._hidden });\n\n if (!hiddenCheck.status) {\n this._errors.push(hiddenCheck.message);\n check = false;\n }\n\n return check;\n }\n\n /**\n * Generates a key for the alert.\n *\n * @param {boolean} [regenerate = false] - A flag to determine if the key should be regenerated.\n */\n _generateKey(regenerate = false) {\n if (this.key === \"\" || regenerate) {\n this.key = Math.random()\n .toString(36)\n .replace(/[^a-z]+/g, \"\")\n .substring(0, 10);\n }\n }\n\n /**\n * Sets the IDs of the alert and it's children if they do not already exist.\n *\n * The generated IDs use the key and follow the format:\n * - alert: `alert-${key}`\n * - controller: `alert-controller-${key}`\n */\n _setIds() {\n this.dom.alert.id = this.dom.alert.id || `alert-${this.key}`;\n this.dom.controller.id =\n this.dom.controller.id || `alert-controller-${this.key}`;\n }\n\n /**\n * Shows the alert.\n *\n * @fires grauplAlertShow\n *\n * @param {boolean} [emit = true] - A toggle to emit the show event once shown.\n */\n show(emit = true) {\n if (!this._hidden) {\n return;\n }\n\n // If we're dealing with transition classes, then we need to utilize\n // requestAnimationFrame to add the transition class, remove the hide class,\n // add the show class, and finally remove the transition class.\n if (this.transitionClass !== \"\") {\n addClass(this.transitionClass, this.dom.alert);\n\n requestAnimationFrame(() => {\n if (this.hideClass !== \"\") {\n removeClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n if (this.showClass !== \"\") {\n addClass(this.showClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n });\n });\n } else {\n // Add the show class\n if (this.showClass !== \"\") {\n addClass(this.showClass, this.dom.alert);\n }\n\n // Remove the hide class.\n if (this.hideClass !== \"\") {\n removeClass(this.hideClass, this.dom.alert);\n }\n }\n\n this._hidden = false;\n\n if (emit) {\n this.dom.alert.dispatchEvent(this._hideEvent);\n }\n }\n\n /**\n * Hides the alert.\n *\n * @fires grauplAlertHide\n *\n * @param {boolean} [emit = true] - A toggle to emit the hide event once shown.\n */\n hide(emit = true) {\n if (this._hidden) {\n return;\n }\n // If we're dealing with transition classes, then we need to utilize\n // requestAnimationFrame to add the transition class, remove the show class,\n // add the hide class, and finally remove the transition class.\n if (this.transitionClass !== \"\") {\n addClass(this.transitionClass, this.dom.alert);\n\n requestAnimationFrame(() => {\n if (this.showClass !== \"\") {\n removeClass(this.showClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n if (this.transitionTimer > 0) {\n setTimeout(() => {\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n }, this.transitionTimer);\n } else {\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n }\n });\n });\n } else {\n // Add the hide class\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n // Remove the show class.\n if (this.showClass !== \"\") {\n removeClass(this.showClass, this.dom.alert);\n }\n }\n\n this._hidden = true;\n\n if (emit) {\n this.dom.alert.dispatchEvent(this._hideEvent);\n }\n }\n\n /**\n * Handles click events throughout the alert for proper use.\n *\n * - Adds a `pointerup` listener to the controller that will hide the alert.\n *\n * @protected\n */\n _handleClick() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"pointerup\", () => this.hide());\n }\n\n /**\n * Handles keydown events throughout the alert for proper use.\n *\n * This method exists to assist the _handleKeyup method.\n *\n * - Adds a `keydown` listener to the controller (if it exists).\n * - Blocks propagation on \"Space\" and \"Enter\" keys.\n */\n _handleKeydown() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"keydown\", (event) => {\n const key = keyPress(event);\n\n // Prevent default behavior for space and enter keys.\n if (key === \"Space\" || key === \"Enter\") {\n preventEvent(event);\n }\n });\n }\n\n /**\n * Handles keyup events throughout the alert for proper use.\n *\n * - Adds a `keyup` listener to the controller (if it exists).\n * - Hides the alert when the user hits \"Space\" or \"Enter\".\n */\n _handleKeyup() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"keyup\", (event) => {\n const key = keyPress(event);\n\n if (key === \"Space\" || key === \"Enter\") {\n this.hide();\n }\n });\n }\n}\n\nexport default Alert;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"alert.cjs.js","names":["isValidInstance","constructor","elements","elementsType","TypeError","key","elementType","name","status","error","isValidType","type","values","valuesType","valueType","isQuerySelector","Error","document","querySelector","isValidClassList","Array","isArray","forEach","value","obj","isValidHoverType","validTypes","includes","join","isTag","tagName","HTMLElement","tag","toLowerCase","check","isValidState","validStates","isValidEvent","validEvents","addClass","className","element","length","classList","add","removeClass","remove","selectAllFocusableElements","context","document","querySelector","elements","Array","from","querySelectorAll","tabbableElements","filter","check","getAttribute","selectFirstFocusableElement","selectLastFocusableElement","selectNextFocusableElement","index","indexOf","selectPreviousFocusableElement","keyPress","event","key","keyCode","keys","Enter","Space","Escape","ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End","Tab","Object","find","preventEvent","preventDefault","stopPropagation","isValidType","initializeStorage","type","window","Graupl","getStorage","setStorage","data","clearStorage","pushToStorage","key","value","getFromStorage","removeFromStorage","isValidClassList","isValidInstance","isValidType","addClass","removeClass","keyPress","preventEvent","storage","Alert","_dom","alert","controller","_hidden","_showClass","_hideClass","_transitionClass","_transitionTimer","_key","_errors","_showEvent","CustomEvent","bubbles","detail","_hideEvent","constructor","alertElement","controllerElement","showClass","hideClass","transitionClass","transitionTimer","isHidden","key","initialize","_validate","Error","errors","join","_generateKey","_setIds","_handleClick","_handleKeydown","_handleKeyup","initializeStorage","pushToStorage","dom","id","error","console","value","check","htmlElementChecks","HTMLElement","status","push","message","showClassCheck","hideClassCheck","transitionClassCheck","transitionTimerCheck","hiddenCheck","regenerate","Math","random","toString","replace","substring","show","emit","requestAnimationFrame","dispatchEvent","hide","setTimeout","addEventListener","event"],"sources":["../../../src/js/validate.js","../../../src/js/domHelpers.js","../../../src/js/eventHandlers.js","../../../src/js/storage.js","../../../src/js/alert/Alert.js"],"sourcesContent":["/**\n * Check to see if the provided elements have a specific constructor.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * This is essentially just a wrapper function around checking instanceof with\n * more descriptive error message to help debugging.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {object} constructor - The constructor to check for.\n * @param {object} elements - The element(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidInstance(constructor, elements) {\n try {\n if (typeof elements !== \"object\") {\n const elementsType = typeof elements;\n\n throw new TypeError(\n `Elements given to isValidInstance() must be inside of an object. \"${elementsType}\" given.`\n );\n }\n\n for (const key in elements) {\n if (!(elements[key] instanceof constructor)) {\n const elementType = typeof elements[key];\n throw new TypeError(\n `${key} must be an instance of ${constructor.name}. \"${elementType}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are of a specific type.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * This is essentially just a wrapper function around checking typeof with\n * more descriptive error message to help debugging.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {string} type - The type to check for.\n * @param {object} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidType(type, values) {\n try {\n if (typeof values !== \"object\") {\n const valuesType = typeof values;\n\n throw new TypeError(\n `Values given to isValidType() must be inside of an object. \"${valuesType}\" given.`\n );\n }\n\n for (const key in values) {\n const valueType = typeof values[key];\n\n if (valueType !== type) {\n throw new TypeError(`${key} must be a ${type}. \"${valueType}\" given.`);\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided values are valid query selectors.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isQuerySelector(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isQuerySelector() must be inside of an object. \"${type}\" given.`\n );\n }\n\n for (const key in values) {\n try {\n if (values[key] === null) {\n throw new Error();\n }\n\n document.querySelector(values[key]);\n } catch {\n throw new TypeError(\n `${key} must be a valid query selector. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided value is either a string or an array of strings.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string, string[]>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidClassList(values) {\n try {\n if (typeof values !== \"object\" || Array.isArray(values)) {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidClassList() must be inside of an object. \"${type}\" given.`\n );\n }\n\n for (const key in values) {\n const type = typeof values[key];\n\n if (type !== \"string\") {\n if (Array.isArray(values[key])) {\n values[key].forEach((value) => {\n if (typeof value !== \"string\") {\n throw new TypeError(\n `${key} must be a string or an array of strings. An array containing non-strings given.`\n );\n }\n });\n } else {\n throw new TypeError(\n `${key} must be a string or an array of strings. \"${type}\" given.`\n );\n }\n } else {\n const obj = {};\n obj[key] = values[key];\n\n isQuerySelector(obj);\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are valid hover types.\n *\n * Available types are: `\"off\"`, `\"on\"`, and `\"dynamic\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidHoverType(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidHoverType() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validTypes = [\"off\", \"on\", \"dynamic\"];\n\n for (const key in values) {\n if (!validTypes.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validTypes.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided elements are using a specific tag.\n *\n * The elements must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `true` if the check is successful.\n *\n * @param {string} tagName - The name of the tag.\n * @param {Object<HTMLElement>} elements - The element(s) to check.\n * @return {boolean} - The result of the check.\n */\nexport function isTag(tagName, elements) {\n if (\n isValidType(\"string\", { tagName }).status &&\n isValidInstance(HTMLElement, elements).status\n ) {\n const tag = tagName.toLowerCase();\n let check = true;\n\n for (const key in elements) {\n if (elements[key].tagName.toLowerCase() !== tag) check = false;\n }\n\n return check;\n } else {\n return false;\n }\n}\n\n/**\n * Check to see if the provided values are valid focus states for a menu.\n *\n * Available states are: `\"none\"`, `\"self\"`, and `\"child\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidState(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidState() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validStates = [\"none\", \"self\", \"child\"];\n\n for (const key in values) {\n if (!validStates.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validStates.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are valid event types for a menu.\n *\n * Available events are: `\"none\"`, `\"mouse\"`, `\"keyboard\"`, and `\"character\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidEvent(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidEvent() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validEvents = [\"none\", \"mouse\", \"keyboard\", \"character\"];\n\n for (const key in values) {\n if (!validEvents.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validEvents.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n","/**\n * Add a class or array of classes to an element.\n *\n * @param {string|string[]} className - The class or classes to add.\n * @param {HTMLElement} element - The element to add the class to.\n */\nexport function addClass(className, element) {\n // Gracefully handle empty strings or arrays.\n if (className === \"\" || className.length === 0) {\n return;\n }\n\n if (typeof className === \"string\") {\n element.classList.add(className);\n } else {\n element.classList.add(...className);\n }\n}\n\n/**\n * Remove a class or array of classes from an element.\n *\n * @param {string|string[]} className - The class or classes to remove.\n * @param {HTMLElement} element - The element to remove the class from.\n */\nexport function removeClass(className, element) {\n // Gracefully handle empty strings or arrays.\n if (className === \"\" || className.length === 0) {\n return;\n }\n\n if (typeof className === \"string\") {\n element.classList.remove(className);\n } else {\n element.classList.remove(...className);\n }\n}\n\n/**\n * Select all focusable elements within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement[]} - An array of focusable elements.\n */\nexport function selectAllFocusableElements(context = document) {\n const querySelector =\n \"a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),[tabindex]\";\n const elements = Array.from(context.querySelectorAll(querySelector));\n\n const tabbableElements = elements.filter((element) => {\n let check = true;\n\n if (element.getAttribute(\"tabindex\") === \"-1\") check = false;\n\n return check;\n });\n\n return tabbableElements;\n}\n\n/**\n * Select the first focusable element within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The first focusable element or false if none found.\n */\nexport function selectFirstFocusableElement(context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n\n return tabbableElements[0] || false;\n}\n\n/**\n * Select the last focusable element within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The last focusable element or false if none found.\n */\nexport function selectLastFocusableElement(context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n\n return tabbableElements[tabbableElements.length - 1] || false;\n}\n\n/**\n * Select the next focusable element relative to the given element within a context.\n *\n * @param {HTMLElement} element - The reference element.\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The next focusable element or false if none found.\n */\nexport function selectNextFocusableElement(element, context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n const index = tabbableElements.indexOf(element);\n\n return index === tabbableElements.length - 1\n ? false\n : tabbableElements[index + 1];\n}\n\n/**\n * Select the previous focusable element relative to the given element within a context.\n *\n * @param {HTMLElement} element - The reference element.\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The previous focusable element or false if none found.\n */\nexport function selectPreviousFocusableElement(element, context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n const index = tabbableElements.indexOf(element);\n\n return index === 0 ? false : tabbableElements[index - 1];\n}\n","/**\n * Retrieves the pressed key from an event.\n *\n * @param {KeyboardEvent} event - The keyboard event.\n * @return {string} - The name of the key or an empty string.\n */\nexport function keyPress(event) {\n try {\n // Use event.key or event.keyCode to support older browsers.\n const key = event.key || event.keyCode;\n const keys = {\n Enter: key === \"Enter\" || key === 13,\n Space: key === \" \" || key === \"Spacebar\" || key === 32,\n Escape: key === \"Escape\" || key === \"Esc\" || key === 27,\n ArrowUp: key === \"ArrowUp\" || key === \"Up\" || key === 38,\n ArrowRight: key === \"ArrowRight\" || key === \"Right\" || key === 39,\n ArrowDown: key === \"ArrowDown\" || key === \"Down\" || key === 40,\n ArrowLeft: key === \"ArrowLeft\" || key === \"Left\" || key === 37,\n Home: key === \"Home\" || key === 36,\n End: key === \"End\" || key === 35,\n Tab: key === \"Tab\" || key === 9,\n };\n\n return Object.keys(keys).find((key) => keys[key] === true) || \"\";\n } catch {\n // Return an empty string if something goes wrong.\n return \"\";\n }\n}\n\n/**\n * Stops an event from taking action.\n *\n * @param {Event} event - The event.\n */\nexport function preventEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n","/**\n * @file\n * Provides a system to get and store Graupl data in the browser.\n */\n\nimport { isValidType } from \"./validate.js\";\n\n/**\n * Initializes the storage system.\n *\n * @param {?string} [type = null] - The type of storage to initialize.\n */\nexport function initializeStorage(type = null) {\n window.Graupl = window.Graupl || {};\n\n if (isValidType(\"string\", { type })) {\n window.Graupl[type] = window.Graupl[type] || {};\n }\n}\n\n/**\n * Get the storage object.\n *\n * @param {?string} type - The type of storage to get.\n * @return {object} - The storage object.\n */\nexport function getStorage(type = null) {\n if (isValidType(\"string\", { type })) {\n return window.Graupl[type];\n }\n\n return window.Graupl;\n}\n\n/**\n * Set the storage object of a given type.\n *\n * @param {string} type - The type of storage to set.\n * @param {object} data - The data to set.\n */\nexport function setStorage(type, data = {}) {\n if (isValidType(\"string\", { type }) && isValidType(\"object\", { data })) {\n window.Graupl[type] = data;\n }\n}\n\n/**\n * Clear the storage object of a given type.\n *\n * @param {string} type - The type of storage to clear.\n */\nexport function clearStorage(type) {\n if (isValidType(\"string\", { type })) {\n window.Graupl[type] = {};\n }\n}\n\n/**\n * Push a value to the storage object.\n *\n * @param {string} type - The type of storage to push to.\n * @param {string} key - The key to use for the value.\n * @param {*} value - The value to store.\n */\nexport function pushToStorage(type, key, value) {\n if (isValidType(\"string\", { type, key })) {\n window.Graupl[type][key] = value;\n }\n}\n\n/**\n * Get a value from the storage object.\n *\n * @param {string }type - The type of storage to get from.\n * @param {string }key - The key to get the value from.\n * @return {*} - The value from the storage object.\n */\nexport function getFromStorage(type, key) {\n if (isValidType(\"string\", { type, key })) {\n return window.Graupl[type][key];\n }\n\n return null;\n}\n\n/**\n * Remove a value from the storage object.\n *\n * @param {string} type - The type of storage to remove from.\n * @param {string} key - The key to remove the value from.\n */\nexport function removeFromStorage(type, key) {\n if (isValidType(\"string\", { type, key })) {\n delete window.Graupl[type][key];\n }\n}\n\nexport default {\n initializeStorage,\n getStorage,\n setStorage,\n clearStorage,\n pushToStorage,\n getFromStorage,\n removeFromStorage,\n};\n","/**\n * @file\n * The alert class.\n */\n\nimport { isValidClassList, isValidInstance, isValidType } from \"../validate.js\";\nimport { addClass, removeClass } from \"../domHelpers.js\";\nimport { keyPress, preventEvent } from \"../eventHandlers.js\";\nimport storage from \"../storage.js\";\n\nclass Alert {\n /**\n * The HTML elements for the alert in the DOM.\n *\n * @protected\n *\n * @type {Object<HTMLElement>}\n */\n _dom = {\n alert: null,\n controller: null,\n };\n\n /**\n * A flag to determine if the alert is hidden.\n *\n * @protected\n *\n * @type {boolean}\n */\n _hidden = false;\n\n /**\n * The class to use to show the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _showClass = \"\";\n\n /**\n * The class to use to hide the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _hideClass = \"\";\n\n /**\n * The class to use when transitioning the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _transitionClass = \"\";\n\n /**\n * The time in milliseconds the transition will take.\n *\n * @protected\n *\n * @type {number}\n */\n _transitionTimer = 150;\n\n /**\n * The key used to generate IDs throughout the carousel.\n *\n * @protected\n *\n * @type {string}\n */\n _key = \"\";\n\n /**\n * An array of error messages generated by the alert.\n *\n * @protected\n *\n * @type {string[]}\n */\n _errors = [];\n\n /**\n * The event that is triggered when the alert is shown.\n *\n * @protected\n *\n * @event grauplAlertShow\n *\n * @type {CustomEvent}\n *\n * @property {boolean} bubbles - A flag to bubble the event.\n * @property {Object<Alert>} detail - The details object container the Alert itself.\n */\n _showEvent = new CustomEvent(\"grauplAlertShow\", {\n bubbles: true,\n detail: { alert: this },\n });\n\n /**\n * The event that is triggered when the alert is hidden.\n *\n * @protected\n *\n * @event grauplAlertHide\n *\n * @type {CustomEvent}\n *\n * @property {boolean} bubbles - A flag to bubble the event.\n * @property {Object<Alert>} detail - The details object containing the Alert itself.\n */\n _hideEvent = new CustomEvent(\"grauplAlertHide\", {\n bubbles: true,\n detail: { alert: this },\n });\n\n /**\n * Constructs a new `Alert`.\n *\n * @param {object} options - The options object.\n * @param {HTMLElement} options.alertElement - The alert element.\n * @param {?HTMLElement} [options.controllerElement = null] - The controller element.\n * @param {string|string[]|null} [options.showClass = show] - The class to add when the alert is shown.\n * @param {string|string[]|null} [options.hideClass = hide] - The class to add when\n * @param {string|string[]|null} [options.transitionClass = transitioning] - The class to add when the alert is transitioning between shown and hidden.\n * @param {number} [options.transitionTimer = 150] - The time in milliseconds the transition will take.\n * @param {boolean} [options.isHidden = false] - A flag to determine the initial state of the alert.\n * @param {?string} [options.key = null] - The key used to generate IDs throughout the alert.\n * @param {boolean} [options.initialize = false] - AA flag to initialize the alert immediately upon creation.\n */\n constructor({\n alertElement,\n controllerElement = null,\n showClass = \"show\",\n hideClass = \"hide\",\n transitionClass = \"transitioning\",\n transitionTimer = 150,\n isHidden = false,\n key = null,\n initialize = false,\n }) {\n this._dom.alert = alertElement;\n this._dom.controller = controllerElement;\n this._showClass = showClass || \"\";\n this._hideClass = hideClass || \"\";\n this._transitionClass = transitionClass || \"\";\n this._transitionTimer = transitionTimer;\n this._hidden = isHidden;\n\n // Set the key.\n this._key = key || \"\";\n\n if (initialize) {\n this.initialize();\n }\n }\n\n /**\n * Initializes the alert.\n */\n initialize() {\n try {\n if (!this._validate()) {\n throw new Error(\n `Graupl Alert: cannot initialize alert. The following errors have been found:\\n - ${this.errors.join(\n \"\\n - \"\n )}`\n );\n }\n\n // Set up the DOM.\n this._generateKey();\n this._setIds();\n\n // Handle events.\n this._handleClick();\n this._handleKeydown();\n this._handleKeyup();\n\n // Set up the storage.\n storage.initializeStorage(\"alerts\");\n storage.pushToStorage(\"alerts\", this.dom.alert.id, this);\n } catch (error) {\n console.error(error);\n }\n }\n\n /**\n * The HTML elements for the alert in the DOM.\n *\n * @readonly\n *\n * @see _dom\n *\n * @type {object}\n */\n get dom() {\n return this._dom;\n }\n\n /**\n * The class to use the show the alert.\n *\n * @type {string|string[]}\n *\n * @see _showClass\n */\n get showClass() {\n return this._showClass;\n }\n\n /**\n * The class to use to hide the alert.\n *\n * @type {string|string[]}\n *\n * @see _hideClass\n */\n get hideClass() {\n return this._hideClass;\n }\n\n /**\n * The class to use when transitioning the alert.\n *\n * @type {string|string[]}\n *\n * @see _transitionClass\n */\n get transitionClass() {\n return this._transitionClass;\n }\n\n /**\n * The time in milliseconds the transition will take.\n *\n * @type {number}\n *\n * @see _transitionTimer\n */\n get transitionTimer() {\n return this._transitionTimer;\n }\n\n /**\n * The key used to generate IDs throughout the accordion.\n *\n * @type {string}\n *\n * @see _key\n */\n get key() {\n return this._key;\n }\n\n set showClass(value) {\n isValidClassList({ showClass: value });\n\n if (this._showClass !== value) {\n this._showClass = value;\n }\n }\n\n set hideClass(value) {\n isValidClassList({ hideClass: value });\n\n if (this._hideClass !== value) {\n this._hideClass = value;\n }\n }\n\n set transitionClass(value) {\n isValidClassList({ transitionClass: value });\n\n if (this._transitionClass !== value) {\n this._transitionClass = value;\n }\n }\n\n set transitionTimer(value) {\n isValidType(\"number\", { transitionTimer: value });\n\n if (this._transitionTimer !== value) {\n this._transitionTimer = value;\n }\n }\n\n set key(value) {\n isValidType(\"string\", { value });\n\n if (this._key !== value) {\n this._key = value;\n }\n }\n\n /**\n * Validates all aspects of the alert to ensure proper functionality.\n *\n * @protected\n *\n * @return {boolean} - The result of the validation.\n */\n _validate() {\n let check = true;\n\n // HTML element checks.\n let htmlElementChecks;\n\n if (this._dom.controller !== null) {\n htmlElementChecks = isValidInstance(HTMLElement, {\n alertElement: this._dom.alert,\n controllerElement: this._dom.controller,\n });\n } else {\n htmlElementChecks = isValidInstance(HTMLElement, {\n alertElement: this._dom.alert,\n });\n }\n\n if (!htmlElementChecks.status) {\n this._errors.push(htmlElementChecks.message);\n check = false;\n }\n\n // Class list checks.\n if (this._showClass !== \"\") {\n const showClassCheck = isValidClassList({ showClass: this._showClass });\n\n if (!showClassCheck.status) {\n this._errors.push(showClassCheck.message);\n check = false;\n }\n }\n\n if (this._hideClass !== \"\") {\n const hideClassCheck = isValidClassList({ hideClass: this._hideClass });\n\n if (!hideClassCheck.status) {\n this._errors.push(hideClassCheck.message);\n check = false;\n }\n }\n\n if (this._transitionClass !== \"\") {\n const transitionClassCheck = isValidClassList({\n transitionClass: this._transitionClass,\n });\n\n if (!transitionClassCheck.status) {\n this._errors.push(transitionClassCheck.message);\n check = false;\n }\n }\n\n // Transition timer check.\n const transitionTimerCheck = isValidType(\"number\", {\n transitionTimer: this._transitionTimer,\n });\n\n if (!transitionTimerCheck.status) {\n this._errors.push(transitionTimerCheck.message);\n check = false;\n }\n\n // Hidden check.\n const hiddenCheck = isValidType(\"boolean\", { isHidden: this._hidden });\n\n if (!hiddenCheck.status) {\n this._errors.push(hiddenCheck.message);\n check = false;\n }\n\n return check;\n }\n\n /**\n * Generates a key for the alert.\n *\n * @param {boolean} [regenerate = false] - A flag to determine if the key should be regenerated.\n */\n _generateKey(regenerate = false) {\n if (this.key === \"\" || regenerate) {\n this.key = Math.random()\n .toString(36)\n .replace(/[^a-z]+/g, \"\")\n .substring(0, 10);\n }\n }\n\n /**\n * Sets the IDs of the alert and it's children if they do not already exist.\n *\n * The generated IDs use the key and follow the format:\n * - alert: `alert-${key}`\n * - controller: `alert-controller-${key}`\n */\n _setIds() {\n this.dom.alert.id = this.dom.alert.id || `alert-${this.key}`;\n this.dom.controller.id =\n this.dom.controller.id || `alert-controller-${this.key}`;\n }\n\n /**\n * Shows the alert.\n *\n * @fires grauplAlertShow\n *\n * @param {boolean} [emit = true] - A toggle to emit the show event once shown.\n */\n show(emit = true) {\n if (!this._hidden) {\n return;\n }\n\n // If we're dealing with transition classes, then we need to utilize\n // requestAnimationFrame to add the transition class, remove the hide class,\n // add the show class, and finally remove the transition class.\n if (this.transitionClass !== \"\") {\n addClass(this.transitionClass, this.dom.alert);\n\n requestAnimationFrame(() => {\n if (this.hideClass !== \"\") {\n removeClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n if (this.showClass !== \"\") {\n addClass(this.showClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n });\n });\n } else {\n // Add the show class\n if (this.showClass !== \"\") {\n addClass(this.showClass, this.dom.alert);\n }\n\n // Remove the hide class.\n if (this.hideClass !== \"\") {\n removeClass(this.hideClass, this.dom.alert);\n }\n }\n\n this._hidden = false;\n\n if (emit) {\n this.dom.alert.dispatchEvent(this._hideEvent);\n }\n }\n\n /**\n * Hides the alert.\n *\n * @fires grauplAlertHide\n *\n * @param {boolean} [emit = true] - A toggle to emit the hide event once shown.\n */\n hide(emit = true) {\n if (this._hidden) {\n return;\n }\n // If we're dealing with transition classes, then we need to utilize\n // requestAnimationFrame to add the transition class, remove the show class,\n // add the hide class, and finally remove the transition class.\n if (this.transitionClass !== \"\") {\n addClass(this.transitionClass, this.dom.alert);\n\n requestAnimationFrame(() => {\n if (this.showClass !== \"\") {\n removeClass(this.showClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n if (this.transitionTimer > 0) {\n setTimeout(() => {\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n }, this.transitionTimer);\n } else {\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n }\n });\n });\n } else {\n // Add the hide class\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n // Remove the show class.\n if (this.showClass !== \"\") {\n removeClass(this.showClass, this.dom.alert);\n }\n }\n\n this._hidden = true;\n\n if (emit) {\n this.dom.alert.dispatchEvent(this._hideEvent);\n }\n }\n\n /**\n * Handles click events throughout the alert for proper use.\n *\n * - Adds a `pointerup` listener to the controller that will hide the alert.\n *\n * @protected\n */\n _handleClick() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"pointerup\", () => this.hide());\n }\n\n /**\n * Handles keydown events throughout the alert for proper use.\n *\n * This method exists to assist the _handleKeyup method.\n *\n * - Adds a `keydown` listener to the controller (if it exists).\n * - Blocks propagation on \"Space\" and \"Enter\" keys.\n */\n _handleKeydown() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"keydown\", (event) => {\n const key = keyPress(event);\n\n // Prevent default behavior for space and enter keys.\n if (key === \"Space\" || key === \"Enter\") {\n preventEvent(event);\n }\n });\n }\n\n /**\n * Handles keyup events throughout the alert for proper use.\n *\n * - Adds a `keyup` listener to the controller (if it exists).\n * - Hides the alert when the user hits \"Space\" or \"Enter\".\n */\n _handleKeyup() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"keyup\", (event) => {\n const key = keyPress(event);\n\n if (key === \"Space\" || key === \"Enter\") {\n this.hide();\n }\n });\n }\n}\n\nexport default Alert;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert.es.js","names":["isValidInstance","contructor","elements","elementsType","TypeError","key","elementType","name","status","error","isValidType","type","values","valuesType","valueType","isQuerySelector","Error","document","querySelector","isValidClassList","Array","isArray","forEach","value","obj","isValidHoverType","validTypes","includes","join","isTag","tagName","HTMLElement","tag","toLowerCase","check","isValidState","validStates","isValidEvent","validEvents","addClass","className","element","length","classList","add","removeClass","remove","selectAllFocusableElements","context","document","querySelector","elements","Array","from","querySelectorAll","tabbableElements","filter","check","getAttribute","selectFirstFocusableElement","selectLastFocusableElement","selectNextFocusableElement","index","indexOf","selectPreviousFocusableElement","keyPress","event","key","keyCode","keys","Enter","Space","Escape","ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End","Tab","Object","find","preventEvent","preventDefault","stopPropagation","isValidType","initializeStorage","type","window","Graupl","getStorage","setStorage","data","clearStorage","pushToStorage","key","value","getFromStorage","removeFromStorage","isValidClassList","isValidInstance","isValidType","addClass","removeClass","keyPress","preventEvent","storage","Alert","_dom","alert","controller","_hidden","_showClass","_hideClass","_transitionClass","_transitionTimer","_key","_errors","_showEvent","CustomEvent","bubbles","detail","_hideEvent","constructor","alertElement","controllerElement","showClass","hideClass","transitionClass","transitionTimer","isHidden","key","initialize","_validate","Error","errors","join","_generateKey","_setIds","_handleClick","_handleKeydown","_handleKeyup","initializeStorage","pushToStorage","dom","id","error","console","value","check","htmlElementChecks","HTMLElement","status","push","message","showClassCheck","hideClassCheck","transitionClassCheck","transitionTimerCheck","hiddenCheck","regenerate","Math","random","toString","replace","substring","show","emit","requestAnimationFrame","dispatchEvent","hide","setTimeout","addEventListener","event"],"sources":["../../../src/js/validate.js","../../../src/js/domHelpers.js","../../../src/js/eventHandlers.js","../../../src/js/storage.js","../../../src/js/alert/Alert.js"],"sourcesContent":["/**\n * Check to see if the provided elements have a specific contructor.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * This is essentially just a wrapper function around checking instanceof with\n * more descriptive error message to help debugging.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {object} contructor - The constructor to check for.\n * @param {object} elements - The element(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidInstance(contructor, elements) {\n try {\n if (typeof elements !== \"object\") {\n const elementsType = typeof elements;\n\n throw new TypeError(\n `Elements given to isValidInstance() must be inside of an object. \"${elementsType}\" given.`\n );\n }\n\n for (const key in elements) {\n if (!(elements[key] instanceof contructor)) {\n const elementType = typeof elements[key];\n throw new TypeError(\n `${key} must be an instance of ${contructor.name}. \"${elementType}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are of a specific type.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * This is essentially just a wrapper function around checking typeof with\n * more descriptive error message to help debugging.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {string} type - The type to check for.\n * @param {object} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidType(type, values) {\n try {\n if (typeof values !== \"object\") {\n const valuesType = typeof values;\n\n throw new TypeError(\n `Values given to isValidType() must be inside of an object. \"${valuesType}\" given.`\n );\n }\n\n for (const key in values) {\n const valueType = typeof values[key];\n\n if (valueType !== type) {\n throw new TypeError(`${key} must be a ${type}. \"${valueType}\" given.`);\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided values are valid query selectors.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isQuerySelector(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isQuerySelector() must be inside of an object. \"${type}\" given.`\n );\n }\n\n for (const key in values) {\n try {\n if (values[key] === null) {\n throw new Error();\n }\n\n document.querySelector(values[key]);\n } catch {\n throw new TypeError(\n `${key} must be a valid query selector. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided value is either a string or an array of strings.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string, string[]>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidClassList(values) {\n try {\n if (typeof values !== \"object\" || Array.isArray(values)) {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidClassList() must be inside of an object. \"${type}\" given.`\n );\n }\n\n for (const key in values) {\n const type = typeof values[key];\n\n if (type !== \"string\") {\n if (Array.isArray(values[key])) {\n values[key].forEach((value) => {\n if (typeof value !== \"string\") {\n throw new TypeError(\n `${key} must be a string or an array of strings. An array containing non-strings given.`\n );\n }\n });\n } else {\n throw new TypeError(\n `${key} must be a string or an array of strings. \"${type}\" given.`\n );\n }\n } else {\n const obj = {};\n obj[key] = values[key];\n\n isQuerySelector(obj);\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are valid hover types.\n *\n * Available types are: `\"off\"`, `\"on\"`, and `\"dynamic\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidHoverType(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidHoverType() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validTypes = [\"off\", \"on\", \"dynamic\"];\n\n for (const key in values) {\n if (!validTypes.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validTypes.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided elements are using a specific tag.\n *\n * The elements must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `true` if the check is successful.\n *\n * @param {string} tagName - The name of the tag.\n * @param {Object<HTMLElement>} elements - The element(s) to check.\n * @return {boolean} - The result of the check.\n */\nexport function isTag(tagName, elements) {\n if (\n isValidType(\"string\", { tagName }).status &&\n isValidInstance(HTMLElement, elements).status\n ) {\n const tag = tagName.toLowerCase();\n let check = true;\n\n for (const key in elements) {\n if (elements[key].tagName.toLowerCase() !== tag) check = false;\n }\n\n return check;\n } else {\n return false;\n }\n}\n\n/**\n * Check to see if the provided values are valid focus states for a menu.\n *\n * Available states are: `\"none\"`, `\"self\"`, and `\"child\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidState(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidState() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validStates = [\"none\", \"self\", \"child\"];\n\n for (const key in values) {\n if (!validStates.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validStates.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are valid event types for a menu.\n *\n * Available events are: `\"none\"`, `\"mouse\"`, `\"keyboard\"`, and `\"character\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidEvent(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidEvent() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validEvents = [\"none\", \"mouse\", \"keyboard\", \"character\"];\n\n for (const key in values) {\n if (!validEvents.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validEvents.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n","/**\n * Add a class or array of classes to an element.\n *\n * @param {string|string[]} className - The class or classes to add.\n * @param {HTMLElement} element - The element to add the class to.\n */\nexport function addClass(className, element) {\n // Gracefully handle empty strings or arrays.\n if (className === \"\" || className.length === 0) {\n return;\n }\n\n if (typeof className === \"string\") {\n element.classList.add(className);\n } else {\n element.classList.add(...className);\n }\n}\n\n/**\n * Remove a class or array of classes from an element.\n *\n * @param {string|string[]} className - The class or classes to remove.\n * @param {HTMLElement} element - The element to remove the class from.\n */\nexport function removeClass(className, element) {\n // Gracefully handle empty strings or arrays.\n if (className === \"\" || className.length === 0) {\n return;\n }\n\n if (typeof className === \"string\") {\n element.classList.remove(className);\n } else {\n element.classList.remove(...className);\n }\n}\n\n/**\n * Select all focusable elements within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement[]} - An array of focusable elements.\n */\nexport function selectAllFocusableElements(context = document) {\n const querySelector =\n \"a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),[tabindex]\";\n const elements = Array.from(context.querySelectorAll(querySelector));\n\n const tabbableElements = elements.filter((element) => {\n let check = true;\n\n if (element.getAttribute(\"tabindex\") === \"-1\") check = false;\n\n return check;\n });\n\n return tabbableElements;\n}\n\n/**\n * Select the first focusable element within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The first focusable element or false if none found.\n */\nexport function selectFirstFocusableElement(context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n\n return tabbableElements[0] || false;\n}\n\n/**\n * Select the last focusable element within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The last focusable element or false if none found.\n */\nexport function selectLastFocusableElement(context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n\n return tabbableElements[tabbableElements.length - 1] || false;\n}\n\n/**\n * Select the next focusable element relative to the given element within a context.\n *\n * @param {HTMLElement} element - The reference element.\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The next focusable element or false if none found.\n */\nexport function selectNextFocusableElement(element, context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n const index = tabbableElements.indexOf(element);\n\n return index === tabbableElements.length - 1\n ? false\n : tabbableElements[index + 1];\n}\n\n/**\n * Select the previous focusable element relative to the given element within a context.\n *\n * @param {HTMLElement} element - The reference element.\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The previous focusable element or false if none found.\n */\nexport function selectPreviousFocusableElement(element, context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n const index = tabbableElements.indexOf(element);\n\n return index === 0 ? false : tabbableElements[index - 1];\n}\n","/**\n * Retrieves the pressed key from an event.\n *\n * @param {KeyboardEvent} event - The keyboard event.\n * @return {string} - The name of the key or an empty string.\n */\nexport function keyPress(event) {\n try {\n // Use event.key or event.keyCode to support older browsers.\n const key = event.key || event.keyCode;\n const keys = {\n Enter: key === \"Enter\" || key === 13,\n Space: key === \" \" || key === \"Spacebar\" || key === 32,\n Escape: key === \"Escape\" || key === \"Esc\" || key === 27,\n ArrowUp: key === \"ArrowUp\" || key === \"Up\" || key === 38,\n ArrowRight: key === \"ArrowRight\" || key === \"Right\" || key === 39,\n ArrowDown: key === \"ArrowDown\" || key === \"Down\" || key === 40,\n ArrowLeft: key === \"ArrowLeft\" || key === \"Left\" || key === 37,\n Home: key === \"Home\" || key === 36,\n End: key === \"End\" || key === 35,\n Tab: key === \"Tab\" || key === 9,\n };\n\n return Object.keys(keys).find((key) => keys[key] === true) || \"\";\n } catch {\n // Return an empty string if something goes wrong.\n return \"\";\n }\n}\n\n/**\n * Stops an event from taking action.\n *\n * @param {Event} event - The event.\n */\nexport function preventEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n","/**\n * @file\n * Provides a system to get and store Graupl data in the browser.\n */\n\nimport { isValidType } from \"./validate.js\";\n\n/**\n * Initializes the storage system.\n *\n * @param {?string} [type = null] - The type of storage to initialize.\n */\nexport function initializeStorage(type = null) {\n window.Graupl = window.Graupl || {};\n\n if (isValidType(\"string\", { type })) {\n window.Graupl[type] = window.Graupl[type] || {};\n }\n}\n\n/**\n * Get the storage object.\n *\n * @param {?string} type - The type of storage to get.\n * @return {object} - The storage object.\n */\nexport function getStorage(type = null) {\n if (isValidType(\"string\", { type })) {\n return window.Graupl[type];\n }\n\n return window.Graupl;\n}\n\n/**\n * Set the storage object of a given type.\n *\n * @param {string} type - The type of storage to set.\n * @param {object} data - The data to set.\n */\nexport function setStorage(type, data = {}) {\n if (isValidType(\"string\", { type }) && isValidType(\"object\", { data })) {\n window.Graupl[type] = data;\n }\n}\n\n/**\n * Clear the storage object of a given type.\n *\n * @param {string} type - The type of storage to clear.\n */\nexport function clearStorage(type) {\n if (isValidType(\"string\", { type })) {\n window.Graupl[type] = {};\n }\n}\n\n/**\n * Push a value to the storage object.\n *\n * @param {string} type - The type of storage to push to.\n * @param {string} key - The key to use for the value.\n * @param {*} value - The value to store.\n */\nexport function pushToStorage(type, key, value) {\n if (isValidType(\"string\", { type, key })) {\n window.Graupl[type][key] = value;\n }\n}\n\n/**\n * Get a value from the storage object.\n *\n * @param {string }type - The type of storage to get from.\n * @param {string }key - The key to get the value from.\n * @return {*} - The value from the storage object.\n */\nexport function getFromStorage(type, key) {\n if (isValidType(\"string\", { type, key })) {\n return window.Graupl[type][key];\n }\n\n return null;\n}\n\n/**\n * Remove a value from the storage object.\n *\n * @param {string} type - The type of storage to remove from.\n * @param {string} key - The key to remove the value from.\n */\nexport function removeFromStorage(type, key) {\n if (isValidType(\"string\", { type, key })) {\n delete window.Graupl[type][key];\n }\n}\n\nexport default {\n initializeStorage,\n getStorage,\n setStorage,\n clearStorage,\n pushToStorage,\n getFromStorage,\n removeFromStorage,\n};\n","/**\n * @file\n * The alert class.\n */\n\nimport { isValidClassList, isValidInstance, isValidType } from \"../validate.js\";\nimport { addClass, removeClass } from \"../domHelpers.js\";\nimport { keyPress, preventEvent } from \"../eventHandlers.js\";\nimport storage from \"../storage.js\";\n\nclass Alert {\n /**\n * The HTML elements for the alert in the DOM.\n *\n * @protected\n *\n * @type {Object<HTMLElement>}\n */\n _dom = {\n alert: null,\n controller: null,\n };\n\n /**\n * A flag to determine if the alert is hidden.\n *\n * @protected\n *\n * @type {boolean}\n */\n _hidden = false;\n\n /**\n * The class to use to show the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _showClass = \"\";\n\n /**\n * The class to use to hide the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _hideClass = \"\";\n\n /**\n * The class to use when transitioning the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _transitionClass = \"\";\n\n /**\n * The time in milliseconds the transition will take.\n *\n * @protected\n *\n * @type {number}\n */\n _transitionTimer = 150;\n\n /**\n * The key used to generate IDs throughout the carousel.\n *\n * @protected\n *\n * @type {string}\n */\n _key = \"\";\n\n /**\n * An array of error messages generated by the alert.\n *\n * @protected\n *\n * @type {string[]}\n */\n _errors = [];\n\n /**\n * The event that is triggered when the alert is shown.\n *\n * @protected\n *\n * @event grauplAlertShow\n *\n * @type {CustomEvent}\n *\n * @property {boolean} bubbles - A flag to bubble the event.\n * @property {Object<Alert>} detail - The details object container the Alert itself.\n */\n _showEvent = new CustomEvent(\"grauplAlertShow\", {\n bubbles: true,\n detail: { alert: this },\n });\n\n /**\n * The event that is triggered when the alert is hidden.\n *\n * @protected\n *\n * @event grauplAlertHide\n *\n * @type {CustomEvent}\n *\n * @property {boolean} bubbles - A flag to bubble the event.\n * @property {Object<Alert>} detail - The details object containing the Alert itself.\n */\n _hideEvent = new CustomEvent(\"grauplAlertHide\", {\n bubbles: true,\n detail: { alert: this },\n });\n\n /**\n * Constructs a new `Alert`.\n *\n * @param {object} options - The options object.\n * @param {HTMLElement} options.alertElement - The alert element.\n * @param {?HTMLElement} [options.controllerElement = null] - The controller element.\n * @param {string|string[]|null} [options.showClass = show] - The class to add when the alert is shown.\n * @param {string|string[]|null} [options.hideClass = hide] - The class to add when\n * @param {string|string[]|null} [options.transitionClass = transitioning] - The class to add when the alert is transitioning between shown and hidden.\n * @param {number} [options.transitionTimer = 150] - The time in milliseconds the transition will take.\n * @param {boolean} [options.isHidden = false] - A flag to determine the initial state of the alert.\n * @param {?string} [options.key = null] - The key used to generate IDs throughout the alert.\n * @param {boolean} [options.initialize = false] - AA flag to initialize the alert immediately upon creation.\n */\n constructor({\n alertElement,\n controllerElement = null,\n showClass = \"show\",\n hideClass = \"hide\",\n transitionClass = \"transitioning\",\n transitionTimer = 150,\n isHidden = false,\n key = null,\n initialize = false,\n }) {\n this._dom.alert = alertElement;\n this._dom.controller = controllerElement;\n this._showClass = showClass || \"\";\n this._hideClass = hideClass || \"\";\n this._transitionClass = transitionClass || \"\";\n this._transitionTimer = transitionTimer;\n this._hidden = isHidden;\n\n // Set the key.\n this._key = key || \"\";\n\n if (initialize) {\n this.initialize();\n }\n }\n\n /**\n * Initializes the alert.\n */\n initialize() {\n try {\n if (!this._validate()) {\n throw new Error(\n `Graupl Alert: cannot initialize alert. The following errors have been found:\\n - ${this.errors.join(\n \"\\n - \"\n )}`\n );\n }\n\n // Set up the DOM.\n this._generateKey();\n this._setIds();\n\n // Handle events.\n this._handleClick();\n this._handleKeydown();\n this._handleKeyup();\n\n // Set up the storage.\n storage.initializeStorage(\"alerts\");\n storage.pushToStorage(\"alerts\", this.dom.alert.id, this);\n } catch (error) {\n console.error(error);\n }\n }\n\n /**\n * The HTML elements for the alert in the DOM.\n *\n * @readonly\n *\n * @see _dom\n *\n * @type {object}\n */\n get dom() {\n return this._dom;\n }\n\n /**\n * The class to use the show the alert.\n *\n * @type {string|string[]}\n *\n * @see _showClass\n */\n get showClass() {\n return this._showClass;\n }\n\n /**\n * The class to use to hide the alert.\n *\n * @type {string|string[]}\n *\n * @see _hideClass\n */\n get hideClass() {\n return this._hideClass;\n }\n\n /**\n * The class to use when transitioning the alert.\n *\n * @type {string|string[]}\n *\n * @see _transitionClass\n */\n get transitionClass() {\n return this._transitionClass;\n }\n\n /**\n * The time in milliseconds the transition will take.\n *\n * @type {number}\n *\n * @see _transitionTimer\n */\n get transitionTimer() {\n return this._transitionTimer;\n }\n\n /**\n * The key used to generate IDs throughout the accordion.\n *\n * @type {string}\n *\n * @see _key\n */\n get key() {\n return this._key;\n }\n\n set showClass(value) {\n isValidClassList({ showClass: value });\n\n if (this._showClass !== value) {\n this._showClass = value;\n }\n }\n\n set hideClass(value) {\n isValidClassList({ hideClass: value });\n\n if (this._hideClass !== value) {\n this._hideClass = value;\n }\n }\n\n set transitionClass(value) {\n isValidClassList({ transitionClass: value });\n\n if (this._transitionClass !== value) {\n this._transitionClass = value;\n }\n }\n\n set transitionTimer(value) {\n isValidType(\"number\", { transitionTimer: value });\n\n if (this._transitionTimer !== value) {\n this._transitionTimer = value;\n }\n }\n\n set key(value) {\n isValidType(\"string\", { value });\n\n if (this._key !== value) {\n this._key = value;\n }\n }\n\n /**\n * Validates all aspects of the alert to ensure proper functionality.\n *\n * @protected\n *\n * @return {boolean} - The result of the validation.\n */\n _validate() {\n let check = true;\n\n // HTML element checks.\n let htmlElementChecks;\n\n if (this._dom.controller !== null) {\n htmlElementChecks = isValidInstance(HTMLElement, {\n alertElement: this._dom.alert,\n controllerElement: this._dom.controller,\n });\n } else {\n htmlElementChecks = isValidInstance(HTMLElement, {\n alertElement: this._dom.alert,\n });\n }\n\n if (!htmlElementChecks.status) {\n this._errors.push(htmlElementChecks.message);\n check = false;\n }\n\n // Class list checks.\n if (this._showClass !== \"\") {\n const showClassCheck = isValidClassList({ showClass: this._showClass });\n\n if (!showClassCheck.status) {\n this._errors.push(showClassCheck.message);\n check = false;\n }\n }\n\n if (this._hideClass !== \"\") {\n const hideClassCheck = isValidClassList({ hideClass: this._hideClass });\n\n if (!hideClassCheck.status) {\n this._errors.push(hideClassCheck.message);\n check = false;\n }\n }\n\n if (this._transitionClass !== \"\") {\n const transitionClassCheck = isValidClassList({\n transitionClass: this._transitionClass,\n });\n\n if (!transitionClassCheck.status) {\n this._errors.push(transitionClassCheck.message);\n check = false;\n }\n }\n\n // Transition timer check.\n const transitionTimerCheck = isValidType(\"number\", {\n transitionTimer: this._transitionTimer,\n });\n\n if (!transitionTimerCheck.status) {\n this._errors.push(transitionTimerCheck.message);\n check = false;\n }\n\n // Hidden check.\n const hiddenCheck = isValidType(\"boolean\", { isHidden: this._hidden });\n\n if (!hiddenCheck.status) {\n this._errors.push(hiddenCheck.message);\n check = false;\n }\n\n return check;\n }\n\n /**\n * Generates a key for the alert.\n *\n * @param {boolean} [regenerate = false] - A flag to determine if the key should be regenerated.\n */\n _generateKey(regenerate = false) {\n if (this.key === \"\" || regenerate) {\n this.key = Math.random()\n .toString(36)\n .replace(/[^a-z]+/g, \"\")\n .substring(0, 10);\n }\n }\n\n /**\n * Sets the IDs of the alert and it's children if they do not already exist.\n *\n * The generated IDs use the key and follow the format:\n * - alert: `alert-${key}`\n * - controller: `alert-controller-${key}`\n */\n _setIds() {\n this.dom.alert.id = this.dom.alert.id || `alert-${this.key}`;\n this.dom.controller.id =\n this.dom.controller.id || `alert-controller-${this.key}`;\n }\n\n /**\n * Shows the alert.\n *\n * @fires grauplAlertShow\n *\n * @param {boolean} [emit = true] - A toggle to emit the show event once shown.\n */\n show(emit = true) {\n if (!this._hidden) {\n return;\n }\n\n // If we're dealing with transition classes, then we need to utilize\n // requestAnimationFrame to add the transition class, remove the hide class,\n // add the show class, and finally remove the transition class.\n if (this.transitionClass !== \"\") {\n addClass(this.transitionClass, this.dom.alert);\n\n requestAnimationFrame(() => {\n if (this.hideClass !== \"\") {\n removeClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n if (this.showClass !== \"\") {\n addClass(this.showClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n });\n });\n } else {\n // Add the show class\n if (this.showClass !== \"\") {\n addClass(this.showClass, this.dom.alert);\n }\n\n // Remove the hide class.\n if (this.hideClass !== \"\") {\n removeClass(this.hideClass, this.dom.alert);\n }\n }\n\n this._hidden = false;\n\n if (emit) {\n this.dom.alert.dispatchEvent(this._hideEvent);\n }\n }\n\n /**\n * Hides the alert.\n *\n * @fires grauplAlertHide\n *\n * @param {boolean} [emit = true] - A toggle to emit the hide event once shown.\n */\n hide(emit = true) {\n if (this._hidden) {\n return;\n }\n // If we're dealing with transition classes, then we need to utilize\n // requestAnimationFrame to add the transition class, remove the show class,\n // add the hide class, and finally remove the transition class.\n if (this.transitionClass !== \"\") {\n addClass(this.transitionClass, this.dom.alert);\n\n requestAnimationFrame(() => {\n if (this.showClass !== \"\") {\n removeClass(this.showClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n if (this.transitionTimer > 0) {\n setTimeout(() => {\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n }, this.transitionTimer);\n } else {\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n }\n });\n });\n } else {\n // Add the hide class\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n // Remove the show class.\n if (this.showClass !== \"\") {\n removeClass(this.showClass, this.dom.alert);\n }\n }\n\n this._hidden = true;\n\n if (emit) {\n this.dom.alert.dispatchEvent(this._hideEvent);\n }\n }\n\n /**\n * Handles click events throughout the alert for proper use.\n *\n * - Adds a `pointerup` listener to the controller that will hide the alert.\n *\n * @protected\n */\n _handleClick() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"pointerup\", () => this.hide());\n }\n\n /**\n * Handles keydown events throughout the alert for proper use.\n *\n * This method exists to assist the _handleKeyup method.\n *\n * - Adds a `keydown` listener to the controller (if it exists).\n * - Blocks propagation on \"Space\" and \"Enter\" keys.\n */\n _handleKeydown() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"keydown\", (event) => {\n const key = keyPress(event);\n\n // Prevent default behavior for space and enter keys.\n if (key === \"Space\" || key === \"Enter\") {\n preventEvent(event);\n }\n });\n }\n\n /**\n * Handles keyup events throughout the alert for proper use.\n *\n * - Adds a `keyup` listener to the controller (if it exists).\n * - Hides the alert when the user hits \"Space\" or \"Enter\".\n */\n _handleKeyup() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"keyup\", (event) => {\n const key = keyPress(event);\n\n if (key === \"Space\" || key === \"Enter\") {\n this.hide();\n }\n });\n }\n}\n\nexport default Alert;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"alert.es.js","names":["isValidInstance","constructor","elements","elementsType","TypeError","key","elementType","name","status","error","isValidType","type","values","valuesType","valueType","isQuerySelector","Error","document","querySelector","isValidClassList","Array","isArray","forEach","value","obj","isValidHoverType","validTypes","includes","join","isTag","tagName","HTMLElement","tag","toLowerCase","check","isValidState","validStates","isValidEvent","validEvents","addClass","className","element","length","classList","add","removeClass","remove","selectAllFocusableElements","context","document","querySelector","elements","Array","from","querySelectorAll","tabbableElements","filter","check","getAttribute","selectFirstFocusableElement","selectLastFocusableElement","selectNextFocusableElement","index","indexOf","selectPreviousFocusableElement","keyPress","event","key","keyCode","keys","Enter","Space","Escape","ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End","Tab","Object","find","preventEvent","preventDefault","stopPropagation","isValidType","initializeStorage","type","window","Graupl","getStorage","setStorage","data","clearStorage","pushToStorage","key","value","getFromStorage","removeFromStorage","isValidClassList","isValidInstance","isValidType","addClass","removeClass","keyPress","preventEvent","storage","Alert","_dom","alert","controller","_hidden","_showClass","_hideClass","_transitionClass","_transitionTimer","_key","_errors","_showEvent","CustomEvent","bubbles","detail","_hideEvent","constructor","alertElement","controllerElement","showClass","hideClass","transitionClass","transitionTimer","isHidden","key","initialize","_validate","Error","errors","join","_generateKey","_setIds","_handleClick","_handleKeydown","_handleKeyup","initializeStorage","pushToStorage","dom","id","error","console","value","check","htmlElementChecks","HTMLElement","status","push","message","showClassCheck","hideClassCheck","transitionClassCheck","transitionTimerCheck","hiddenCheck","regenerate","Math","random","toString","replace","substring","show","emit","requestAnimationFrame","dispatchEvent","hide","setTimeout","addEventListener","event"],"sources":["../../../src/js/validate.js","../../../src/js/domHelpers.js","../../../src/js/eventHandlers.js","../../../src/js/storage.js","../../../src/js/alert/Alert.js"],"sourcesContent":["/**\n * Check to see if the provided elements have a specific constructor.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * This is essentially just a wrapper function around checking instanceof with\n * more descriptive error message to help debugging.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {object} constructor - The constructor to check for.\n * @param {object} elements - The element(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidInstance(constructor, elements) {\n try {\n if (typeof elements !== \"object\") {\n const elementsType = typeof elements;\n\n throw new TypeError(\n `Elements given to isValidInstance() must be inside of an object. \"${elementsType}\" given.`\n );\n }\n\n for (const key in elements) {\n if (!(elements[key] instanceof constructor)) {\n const elementType = typeof elements[key];\n throw new TypeError(\n `${key} must be an instance of ${constructor.name}. \"${elementType}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are of a specific type.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * This is essentially just a wrapper function around checking typeof with\n * more descriptive error message to help debugging.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {string} type - The type to check for.\n * @param {object} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidType(type, values) {\n try {\n if (typeof values !== \"object\") {\n const valuesType = typeof values;\n\n throw new TypeError(\n `Values given to isValidType() must be inside of an object. \"${valuesType}\" given.`\n );\n }\n\n for (const key in values) {\n const valueType = typeof values[key];\n\n if (valueType !== type) {\n throw new TypeError(`${key} must be a ${type}. \"${valueType}\" given.`);\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided values are valid query selectors.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isQuerySelector(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isQuerySelector() must be inside of an object. \"${type}\" given.`\n );\n }\n\n for (const key in values) {\n try {\n if (values[key] === null) {\n throw new Error();\n }\n\n document.querySelector(values[key]);\n } catch {\n throw new TypeError(\n `${key} must be a valid query selector. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided value is either a string or an array of strings.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string, string[]>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidClassList(values) {\n try {\n if (typeof values !== \"object\" || Array.isArray(values)) {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidClassList() must be inside of an object. \"${type}\" given.`\n );\n }\n\n for (const key in values) {\n const type = typeof values[key];\n\n if (type !== \"string\") {\n if (Array.isArray(values[key])) {\n values[key].forEach((value) => {\n if (typeof value !== \"string\") {\n throw new TypeError(\n `${key} must be a string or an array of strings. An array containing non-strings given.`\n );\n }\n });\n } else {\n throw new TypeError(\n `${key} must be a string or an array of strings. \"${type}\" given.`\n );\n }\n } else {\n const obj = {};\n obj[key] = values[key];\n\n isQuerySelector(obj);\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are valid hover types.\n *\n * Available types are: `\"off\"`, `\"on\"`, and `\"dynamic\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidHoverType(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidHoverType() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validTypes = [\"off\", \"on\", \"dynamic\"];\n\n for (const key in values) {\n if (!validTypes.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validTypes.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Checks to see if the provided elements are using a specific tag.\n *\n * The elements must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `true` if the check is successful.\n *\n * @param {string} tagName - The name of the tag.\n * @param {Object<HTMLElement>} elements - The element(s) to check.\n * @return {boolean} - The result of the check.\n */\nexport function isTag(tagName, elements) {\n if (\n isValidType(\"string\", { tagName }).status &&\n isValidInstance(HTMLElement, elements).status\n ) {\n const tag = tagName.toLowerCase();\n let check = true;\n\n for (const key in elements) {\n if (elements[key].tagName.toLowerCase() !== tag) check = false;\n }\n\n return check;\n } else {\n return false;\n }\n}\n\n/**\n * Check to see if the provided values are valid focus states for a menu.\n *\n * Available states are: `\"none\"`, `\"self\"`, and `\"child\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidState(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidState() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validStates = [\"none\", \"self\", \"child\"];\n\n for (const key in values) {\n if (!validStates.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validStates.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n\n/**\n * Check to see if the provided values are valid event types for a menu.\n *\n * Available events are: `\"none\"`, `\"mouse\"`, `\"keyboard\"`, and `\"character\"`.\n *\n * The values must be provided inside of an object\n * so the variable name can be retrieved in case of errors.\n *\n * Will return `{ status: true }` if the check is successful.\n *\n * @param {Object<string>} values - The value(s) to check.\n * @return {Object<boolean, string>} - The result of the check.\n */\nexport function isValidEvent(values) {\n try {\n if (typeof values !== \"object\") {\n const type = typeof values;\n\n throw new TypeError(\n `Values given to isValidEvent() must be inside of an object. \"${type}\" given.`\n );\n }\n\n const validEvents = [\"none\", \"mouse\", \"keyboard\", \"character\"];\n\n for (const key in values) {\n if (!validEvents.includes(values[key])) {\n throw new TypeError(\n `${key} must be one of the following values: ${validEvents.join(\n \", \"\n )}. \"${values[key]}\" given.`\n );\n }\n }\n\n return {\n status: true,\n error: null,\n };\n } catch (error) {\n return {\n status: false,\n error,\n };\n }\n}\n","/**\n * Add a class or array of classes to an element.\n *\n * @param {string|string[]} className - The class or classes to add.\n * @param {HTMLElement} element - The element to add the class to.\n */\nexport function addClass(className, element) {\n // Gracefully handle empty strings or arrays.\n if (className === \"\" || className.length === 0) {\n return;\n }\n\n if (typeof className === \"string\") {\n element.classList.add(className);\n } else {\n element.classList.add(...className);\n }\n}\n\n/**\n * Remove a class or array of classes from an element.\n *\n * @param {string|string[]} className - The class or classes to remove.\n * @param {HTMLElement} element - The element to remove the class from.\n */\nexport function removeClass(className, element) {\n // Gracefully handle empty strings or arrays.\n if (className === \"\" || className.length === 0) {\n return;\n }\n\n if (typeof className === \"string\") {\n element.classList.remove(className);\n } else {\n element.classList.remove(...className);\n }\n}\n\n/**\n * Select all focusable elements within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement[]} - An array of focusable elements.\n */\nexport function selectAllFocusableElements(context = document) {\n const querySelector =\n \"a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),[tabindex]\";\n const elements = Array.from(context.querySelectorAll(querySelector));\n\n const tabbableElements = elements.filter((element) => {\n let check = true;\n\n if (element.getAttribute(\"tabindex\") === \"-1\") check = false;\n\n return check;\n });\n\n return tabbableElements;\n}\n\n/**\n * Select the first focusable element within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The first focusable element or false if none found.\n */\nexport function selectFirstFocusableElement(context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n\n return tabbableElements[0] || false;\n}\n\n/**\n * Select the last focusable element within a given context.\n *\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The last focusable element or false if none found.\n */\nexport function selectLastFocusableElement(context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n\n return tabbableElements[tabbableElements.length - 1] || false;\n}\n\n/**\n * Select the next focusable element relative to the given element within a context.\n *\n * @param {HTMLElement} element - The reference element.\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The next focusable element or false if none found.\n */\nexport function selectNextFocusableElement(element, context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n const index = tabbableElements.indexOf(element);\n\n return index === tabbableElements.length - 1\n ? false\n : tabbableElements[index + 1];\n}\n\n/**\n * Select the previous focusable element relative to the given element within a context.\n *\n * @param {HTMLElement} element - The reference element.\n * @param {HTMLElement} [context = document] - The context in which to search for focusable elements.\n * @return {HTMLElement|boolean} - The previous focusable element or false if none found.\n */\nexport function selectPreviousFocusableElement(element, context = document) {\n const tabbableElements = selectAllFocusableElements(context);\n const index = tabbableElements.indexOf(element);\n\n return index === 0 ? false : tabbableElements[index - 1];\n}\n","/**\n * Retrieves the pressed key from an event.\n *\n * @param {KeyboardEvent} event - The keyboard event.\n * @return {string} - The name of the key or an empty string.\n */\nexport function keyPress(event) {\n try {\n // Use event.key or event.keyCode to support older browsers.\n const key = event.key || event.keyCode;\n const keys = {\n Enter: key === \"Enter\" || key === 13,\n Space: key === \" \" || key === \"Spacebar\" || key === 32,\n Escape: key === \"Escape\" || key === \"Esc\" || key === 27,\n ArrowUp: key === \"ArrowUp\" || key === \"Up\" || key === 38,\n ArrowRight: key === \"ArrowRight\" || key === \"Right\" || key === 39,\n ArrowDown: key === \"ArrowDown\" || key === \"Down\" || key === 40,\n ArrowLeft: key === \"ArrowLeft\" || key === \"Left\" || key === 37,\n Home: key === \"Home\" || key === 36,\n End: key === \"End\" || key === 35,\n Tab: key === \"Tab\" || key === 9,\n };\n\n return Object.keys(keys).find((key) => keys[key] === true) || \"\";\n } catch {\n // Return an empty string if something goes wrong.\n return \"\";\n }\n}\n\n/**\n * Stops an event from taking action.\n *\n * @param {Event} event - The event.\n */\nexport function preventEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n","/**\n * @file\n * Provides a system to get and store Graupl data in the browser.\n */\n\nimport { isValidType } from \"./validate.js\";\n\n/**\n * Initializes the storage system.\n *\n * @param {?string} [type = null] - The type of storage to initialize.\n */\nexport function initializeStorage(type = null) {\n window.Graupl = window.Graupl || {};\n\n if (isValidType(\"string\", { type })) {\n window.Graupl[type] = window.Graupl[type] || {};\n }\n}\n\n/**\n * Get the storage object.\n *\n * @param {?string} type - The type of storage to get.\n * @return {object} - The storage object.\n */\nexport function getStorage(type = null) {\n if (isValidType(\"string\", { type })) {\n return window.Graupl[type];\n }\n\n return window.Graupl;\n}\n\n/**\n * Set the storage object of a given type.\n *\n * @param {string} type - The type of storage to set.\n * @param {object} data - The data to set.\n */\nexport function setStorage(type, data = {}) {\n if (isValidType(\"string\", { type }) && isValidType(\"object\", { data })) {\n window.Graupl[type] = data;\n }\n}\n\n/**\n * Clear the storage object of a given type.\n *\n * @param {string} type - The type of storage to clear.\n */\nexport function clearStorage(type) {\n if (isValidType(\"string\", { type })) {\n window.Graupl[type] = {};\n }\n}\n\n/**\n * Push a value to the storage object.\n *\n * @param {string} type - The type of storage to push to.\n * @param {string} key - The key to use for the value.\n * @param {*} value - The value to store.\n */\nexport function pushToStorage(type, key, value) {\n if (isValidType(\"string\", { type, key })) {\n window.Graupl[type][key] = value;\n }\n}\n\n/**\n * Get a value from the storage object.\n *\n * @param {string }type - The type of storage to get from.\n * @param {string }key - The key to get the value from.\n * @return {*} - The value from the storage object.\n */\nexport function getFromStorage(type, key) {\n if (isValidType(\"string\", { type, key })) {\n return window.Graupl[type][key];\n }\n\n return null;\n}\n\n/**\n * Remove a value from the storage object.\n *\n * @param {string} type - The type of storage to remove from.\n * @param {string} key - The key to remove the value from.\n */\nexport function removeFromStorage(type, key) {\n if (isValidType(\"string\", { type, key })) {\n delete window.Graupl[type][key];\n }\n}\n\nexport default {\n initializeStorage,\n getStorage,\n setStorage,\n clearStorage,\n pushToStorage,\n getFromStorage,\n removeFromStorage,\n};\n","/**\n * @file\n * The alert class.\n */\n\nimport { isValidClassList, isValidInstance, isValidType } from \"../validate.js\";\nimport { addClass, removeClass } from \"../domHelpers.js\";\nimport { keyPress, preventEvent } from \"../eventHandlers.js\";\nimport storage from \"../storage.js\";\n\nclass Alert {\n /**\n * The HTML elements for the alert in the DOM.\n *\n * @protected\n *\n * @type {Object<HTMLElement>}\n */\n _dom = {\n alert: null,\n controller: null,\n };\n\n /**\n * A flag to determine if the alert is hidden.\n *\n * @protected\n *\n * @type {boolean}\n */\n _hidden = false;\n\n /**\n * The class to use to show the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _showClass = \"\";\n\n /**\n * The class to use to hide the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _hideClass = \"\";\n\n /**\n * The class to use when transitioning the alert.\n *\n * @protected\n *\n * @type {string|string[]}\n */\n _transitionClass = \"\";\n\n /**\n * The time in milliseconds the transition will take.\n *\n * @protected\n *\n * @type {number}\n */\n _transitionTimer = 150;\n\n /**\n * The key used to generate IDs throughout the carousel.\n *\n * @protected\n *\n * @type {string}\n */\n _key = \"\";\n\n /**\n * An array of error messages generated by the alert.\n *\n * @protected\n *\n * @type {string[]}\n */\n _errors = [];\n\n /**\n * The event that is triggered when the alert is shown.\n *\n * @protected\n *\n * @event grauplAlertShow\n *\n * @type {CustomEvent}\n *\n * @property {boolean} bubbles - A flag to bubble the event.\n * @property {Object<Alert>} detail - The details object container the Alert itself.\n */\n _showEvent = new CustomEvent(\"grauplAlertShow\", {\n bubbles: true,\n detail: { alert: this },\n });\n\n /**\n * The event that is triggered when the alert is hidden.\n *\n * @protected\n *\n * @event grauplAlertHide\n *\n * @type {CustomEvent}\n *\n * @property {boolean} bubbles - A flag to bubble the event.\n * @property {Object<Alert>} detail - The details object containing the Alert itself.\n */\n _hideEvent = new CustomEvent(\"grauplAlertHide\", {\n bubbles: true,\n detail: { alert: this },\n });\n\n /**\n * Constructs a new `Alert`.\n *\n * @param {object} options - The options object.\n * @param {HTMLElement} options.alertElement - The alert element.\n * @param {?HTMLElement} [options.controllerElement = null] - The controller element.\n * @param {string|string[]|null} [options.showClass = show] - The class to add when the alert is shown.\n * @param {string|string[]|null} [options.hideClass = hide] - The class to add when\n * @param {string|string[]|null} [options.transitionClass = transitioning] - The class to add when the alert is transitioning between shown and hidden.\n * @param {number} [options.transitionTimer = 150] - The time in milliseconds the transition will take.\n * @param {boolean} [options.isHidden = false] - A flag to determine the initial state of the alert.\n * @param {?string} [options.key = null] - The key used to generate IDs throughout the alert.\n * @param {boolean} [options.initialize = false] - AA flag to initialize the alert immediately upon creation.\n */\n constructor({\n alertElement,\n controllerElement = null,\n showClass = \"show\",\n hideClass = \"hide\",\n transitionClass = \"transitioning\",\n transitionTimer = 150,\n isHidden = false,\n key = null,\n initialize = false,\n }) {\n this._dom.alert = alertElement;\n this._dom.controller = controllerElement;\n this._showClass = showClass || \"\";\n this._hideClass = hideClass || \"\";\n this._transitionClass = transitionClass || \"\";\n this._transitionTimer = transitionTimer;\n this._hidden = isHidden;\n\n // Set the key.\n this._key = key || \"\";\n\n if (initialize) {\n this.initialize();\n }\n }\n\n /**\n * Initializes the alert.\n */\n initialize() {\n try {\n if (!this._validate()) {\n throw new Error(\n `Graupl Alert: cannot initialize alert. The following errors have been found:\\n - ${this.errors.join(\n \"\\n - \"\n )}`\n );\n }\n\n // Set up the DOM.\n this._generateKey();\n this._setIds();\n\n // Handle events.\n this._handleClick();\n this._handleKeydown();\n this._handleKeyup();\n\n // Set up the storage.\n storage.initializeStorage(\"alerts\");\n storage.pushToStorage(\"alerts\", this.dom.alert.id, this);\n } catch (error) {\n console.error(error);\n }\n }\n\n /**\n * The HTML elements for the alert in the DOM.\n *\n * @readonly\n *\n * @see _dom\n *\n * @type {object}\n */\n get dom() {\n return this._dom;\n }\n\n /**\n * The class to use the show the alert.\n *\n * @type {string|string[]}\n *\n * @see _showClass\n */\n get showClass() {\n return this._showClass;\n }\n\n /**\n * The class to use to hide the alert.\n *\n * @type {string|string[]}\n *\n * @see _hideClass\n */\n get hideClass() {\n return this._hideClass;\n }\n\n /**\n * The class to use when transitioning the alert.\n *\n * @type {string|string[]}\n *\n * @see _transitionClass\n */\n get transitionClass() {\n return this._transitionClass;\n }\n\n /**\n * The time in milliseconds the transition will take.\n *\n * @type {number}\n *\n * @see _transitionTimer\n */\n get transitionTimer() {\n return this._transitionTimer;\n }\n\n /**\n * The key used to generate IDs throughout the accordion.\n *\n * @type {string}\n *\n * @see _key\n */\n get key() {\n return this._key;\n }\n\n set showClass(value) {\n isValidClassList({ showClass: value });\n\n if (this._showClass !== value) {\n this._showClass = value;\n }\n }\n\n set hideClass(value) {\n isValidClassList({ hideClass: value });\n\n if (this._hideClass !== value) {\n this._hideClass = value;\n }\n }\n\n set transitionClass(value) {\n isValidClassList({ transitionClass: value });\n\n if (this._transitionClass !== value) {\n this._transitionClass = value;\n }\n }\n\n set transitionTimer(value) {\n isValidType(\"number\", { transitionTimer: value });\n\n if (this._transitionTimer !== value) {\n this._transitionTimer = value;\n }\n }\n\n set key(value) {\n isValidType(\"string\", { value });\n\n if (this._key !== value) {\n this._key = value;\n }\n }\n\n /**\n * Validates all aspects of the alert to ensure proper functionality.\n *\n * @protected\n *\n * @return {boolean} - The result of the validation.\n */\n _validate() {\n let check = true;\n\n // HTML element checks.\n let htmlElementChecks;\n\n if (this._dom.controller !== null) {\n htmlElementChecks = isValidInstance(HTMLElement, {\n alertElement: this._dom.alert,\n controllerElement: this._dom.controller,\n });\n } else {\n htmlElementChecks = isValidInstance(HTMLElement, {\n alertElement: this._dom.alert,\n });\n }\n\n if (!htmlElementChecks.status) {\n this._errors.push(htmlElementChecks.message);\n check = false;\n }\n\n // Class list checks.\n if (this._showClass !== \"\") {\n const showClassCheck = isValidClassList({ showClass: this._showClass });\n\n if (!showClassCheck.status) {\n this._errors.push(showClassCheck.message);\n check = false;\n }\n }\n\n if (this._hideClass !== \"\") {\n const hideClassCheck = isValidClassList({ hideClass: this._hideClass });\n\n if (!hideClassCheck.status) {\n this._errors.push(hideClassCheck.message);\n check = false;\n }\n }\n\n if (this._transitionClass !== \"\") {\n const transitionClassCheck = isValidClassList({\n transitionClass: this._transitionClass,\n });\n\n if (!transitionClassCheck.status) {\n this._errors.push(transitionClassCheck.message);\n check = false;\n }\n }\n\n // Transition timer check.\n const transitionTimerCheck = isValidType(\"number\", {\n transitionTimer: this._transitionTimer,\n });\n\n if (!transitionTimerCheck.status) {\n this._errors.push(transitionTimerCheck.message);\n check = false;\n }\n\n // Hidden check.\n const hiddenCheck = isValidType(\"boolean\", { isHidden: this._hidden });\n\n if (!hiddenCheck.status) {\n this._errors.push(hiddenCheck.message);\n check = false;\n }\n\n return check;\n }\n\n /**\n * Generates a key for the alert.\n *\n * @param {boolean} [regenerate = false] - A flag to determine if the key should be regenerated.\n */\n _generateKey(regenerate = false) {\n if (this.key === \"\" || regenerate) {\n this.key = Math.random()\n .toString(36)\n .replace(/[^a-z]+/g, \"\")\n .substring(0, 10);\n }\n }\n\n /**\n * Sets the IDs of the alert and it's children if they do not already exist.\n *\n * The generated IDs use the key and follow the format:\n * - alert: `alert-${key}`\n * - controller: `alert-controller-${key}`\n */\n _setIds() {\n this.dom.alert.id = this.dom.alert.id || `alert-${this.key}`;\n this.dom.controller.id =\n this.dom.controller.id || `alert-controller-${this.key}`;\n }\n\n /**\n * Shows the alert.\n *\n * @fires grauplAlertShow\n *\n * @param {boolean} [emit = true] - A toggle to emit the show event once shown.\n */\n show(emit = true) {\n if (!this._hidden) {\n return;\n }\n\n // If we're dealing with transition classes, then we need to utilize\n // requestAnimationFrame to add the transition class, remove the hide class,\n // add the show class, and finally remove the transition class.\n if (this.transitionClass !== \"\") {\n addClass(this.transitionClass, this.dom.alert);\n\n requestAnimationFrame(() => {\n if (this.hideClass !== \"\") {\n removeClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n if (this.showClass !== \"\") {\n addClass(this.showClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n });\n });\n } else {\n // Add the show class\n if (this.showClass !== \"\") {\n addClass(this.showClass, this.dom.alert);\n }\n\n // Remove the hide class.\n if (this.hideClass !== \"\") {\n removeClass(this.hideClass, this.dom.alert);\n }\n }\n\n this._hidden = false;\n\n if (emit) {\n this.dom.alert.dispatchEvent(this._hideEvent);\n }\n }\n\n /**\n * Hides the alert.\n *\n * @fires grauplAlertHide\n *\n * @param {boolean} [emit = true] - A toggle to emit the hide event once shown.\n */\n hide(emit = true) {\n if (this._hidden) {\n return;\n }\n // If we're dealing with transition classes, then we need to utilize\n // requestAnimationFrame to add the transition class, remove the show class,\n // add the hide class, and finally remove the transition class.\n if (this.transitionClass !== \"\") {\n addClass(this.transitionClass, this.dom.alert);\n\n requestAnimationFrame(() => {\n if (this.showClass !== \"\") {\n removeClass(this.showClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n if (this.transitionTimer > 0) {\n setTimeout(() => {\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n }, this.transitionTimer);\n } else {\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n requestAnimationFrame(() => {\n removeClass(this.transitionClass, this.dom.alert);\n });\n }\n });\n });\n } else {\n // Add the hide class\n if (this.hideClass !== \"\") {\n addClass(this.hideClass, this.dom.alert);\n }\n\n // Remove the show class.\n if (this.showClass !== \"\") {\n removeClass(this.showClass, this.dom.alert);\n }\n }\n\n this._hidden = true;\n\n if (emit) {\n this.dom.alert.dispatchEvent(this._hideEvent);\n }\n }\n\n /**\n * Handles click events throughout the alert for proper use.\n *\n * - Adds a `pointerup` listener to the controller that will hide the alert.\n *\n * @protected\n */\n _handleClick() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"pointerup\", () => this.hide());\n }\n\n /**\n * Handles keydown events throughout the alert for proper use.\n *\n * This method exists to assist the _handleKeyup method.\n *\n * - Adds a `keydown` listener to the controller (if it exists).\n * - Blocks propagation on \"Space\" and \"Enter\" keys.\n */\n _handleKeydown() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"keydown\", (event) => {\n const key = keyPress(event);\n\n // Prevent default behavior for space and enter keys.\n if (key === \"Space\" || key === \"Enter\") {\n preventEvent(event);\n }\n });\n }\n\n /**\n * Handles keyup events throughout the alert for proper use.\n *\n * - Adds a `keyup` listener to the controller (if it exists).\n * - Hides the alert when the user hits \"Space\" or \"Enter\".\n */\n _handleKeyup() {\n if (this.dom.controller === null) {\n return;\n }\n\n this.dom.controller.addEventListener(\"keyup\", (event) => {\n const key = keyPress(event);\n\n if (key === \"Space\" || key === \"Enter\") {\n this.hide();\n }\n });\n }\n}\n\nexport default Alert;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var Alert=function(){function l(t,s){try{if(typeof s!="object"){const i=typeof s;throw new TypeError(`Elements given to isValidInstance() must be inside of an object. "${i}" given.`)}for(const i in s)if(!(s[i]instanceof t)){const e=typeof s[i];throw new TypeError(`${i} must be an instance of ${t.name}. "${e}" given.`)}return{status:!0,error:null}}catch(i){return{status:!1,error:i}}}function r(t,s){try{if(typeof s!="object"){const i=typeof s;throw new TypeError(`Values given to isValidType() must be inside of an object. "${i}" given.`)}for(const i in s){const e=typeof s[i];if(e!==t)throw new TypeError(`${i} must be a ${t}. "${e}" given.`)}return{status:!0,error:null}}catch(i){return{status:!1,error:i}}}function u(t){try{if(typeof t!="object"){const s=typeof t;throw new TypeError(`Values given to isQuerySelector() must be inside of an object. "${s}" given.`)}for(const s in t)try{if(t[s]===null)throw new Error;document.querySelector(t[s])}catch{throw new TypeError(`${s} must be a valid query selector. "${t[s]}" given.`)}return{status:!0,error:null}}catch(s){return{status:!1,error:s}}}function h(t){try{if(typeof t!="object"||Array.isArray(t)){const s=typeof t;throw new TypeError(`Values given to isValidClassList() must be inside of an object. "${s}" given.`)}for(const s in t){const i=typeof t[s];if(i!=="string")if(Array.isArray(t[s]))t[s].forEach(e=>{if(typeof e!="string")throw new TypeError(`${s} must be a string or an array of strings. An array containing non-strings given.`)});else throw new TypeError(`${s} must be a string or an array of strings. "${i}" given.`);else{const e={};e[s]=t[s],u(e)}}return{status:!0,error:null}}catch(s){return{status:!1,error:s}}}function o(t,s){t===""||t.length===0||(typeof t=="string"?s.classList.add(t):s.classList.add(...t))}function a(t,s){t===""||t.length===0||(typeof t=="string"?s.classList.remove(t):s.classList.remove(...t))}function d(t){try{const s=t.key||t.keyCode,i={Enter:s==="Enter"||s===13,Space:s===" "||s==="Spacebar"||s===32,Escape:s==="Escape"||s==="Esc"||s===27,ArrowUp:s==="ArrowUp"||s==="Up"||s===38,ArrowRight:s==="ArrowRight"||s==="Right"||s===39,ArrowDown:s==="ArrowDown"||s==="Down"||s===40,ArrowLeft:s==="ArrowLeft"||s==="Left"||s===37,Home:s==="Home"||s===36,End:s==="End"||s===35,Tab:s==="Tab"||s===9};return Object.keys(i).find(e=>i[e]===!0)||""}catch{return""}}function c(t){t.preventDefault(),t.stopPropagation()}function m(t=null){window.Graupl=window.Graupl||{},r("string",{type:t})&&(window.Graupl[t]=window.Graupl[t]||{})}function w(t=null){return r("string",{type:t})?window.Graupl[t]:window.Graupl}function C(t,s={}){r("string",{type:t})&&r("object",{data:s})&&(window.Graupl[t]=s)}function _(t){r("string",{type:t})&&(window.Graupl[t]={})}function g(t,s,i){r("string",{type:t,key:s})&&(window.Graupl[t][s]=i)}function y(t,s){return r("string",{type:t,key:s})?window.Graupl[t][s]:null}function p(t,s){r("string",{type:t,key:s})&&delete window.Graupl[t][s]}var f={initializeStorage:m,getStorage:w,setStorage:C,clearStorage:_,pushToStorage:g,getFromStorage:y,removeFromStorage:p},E=class{_dom={alert:null,controller:null};_hidden=!1;_showClass="";_hideClass="";_transitionClass="";_transitionTimer=150;_key="";_errors=[];_showEvent=new CustomEvent("grauplAlertShow",{bubbles:!0,detail:{alert:this}});_hideEvent=new CustomEvent("grauplAlertHide",{bubbles:!0,detail:{alert:this}});constructor({alertElement:t,controllerElement:s=null,showClass:i="show",hideClass:e="hide",transitionClass:n="transitioning",transitionTimer:b=150,isHidden:k=!1,key:A=null,initialize:S=!1}){this._dom.alert=t,this._dom.controller=s,this._showClass=i||"",this._hideClass=e||"",this._transitionClass=n||"",this._transitionTimer=b,this._hidden=k,this._key=A||"",S&&this.initialize()}initialize(){try{if(!this._validate())throw new Error(`Graupl Alert: cannot initialize alert. The following errors have been found:
|
|
1
|
+
var Alert=(function(){function l(t,s){try{if(typeof s!="object"){const i=typeof s;throw new TypeError(`Elements given to isValidInstance() must be inside of an object. "${i}" given.`)}for(const i in s)if(!(s[i]instanceof t)){const e=typeof s[i];throw new TypeError(`${i} must be an instance of ${t.name}. "${e}" given.`)}return{status:!0,error:null}}catch(i){return{status:!1,error:i}}}function r(t,s){try{if(typeof s!="object"){const i=typeof s;throw new TypeError(`Values given to isValidType() must be inside of an object. "${i}" given.`)}for(const i in s){const e=typeof s[i];if(e!==t)throw new TypeError(`${i} must be a ${t}. "${e}" given.`)}return{status:!0,error:null}}catch(i){return{status:!1,error:i}}}function u(t){try{if(typeof t!="object"){const s=typeof t;throw new TypeError(`Values given to isQuerySelector() must be inside of an object. "${s}" given.`)}for(const s in t)try{if(t[s]===null)throw new Error;document.querySelector(t[s])}catch{throw new TypeError(`${s} must be a valid query selector. "${t[s]}" given.`)}return{status:!0,error:null}}catch(s){return{status:!1,error:s}}}function h(t){try{if(typeof t!="object"||Array.isArray(t)){const s=typeof t;throw new TypeError(`Values given to isValidClassList() must be inside of an object. "${s}" given.`)}for(const s in t){const i=typeof t[s];if(i!=="string")if(Array.isArray(t[s]))t[s].forEach(e=>{if(typeof e!="string")throw new TypeError(`${s} must be a string or an array of strings. An array containing non-strings given.`)});else throw new TypeError(`${s} must be a string or an array of strings. "${i}" given.`);else{const e={};e[s]=t[s],u(e)}}return{status:!0,error:null}}catch(s){return{status:!1,error:s}}}function o(t,s){t===""||t.length===0||(typeof t=="string"?s.classList.add(t):s.classList.add(...t))}function a(t,s){t===""||t.length===0||(typeof t=="string"?s.classList.remove(t):s.classList.remove(...t))}function d(t){try{const s=t.key||t.keyCode,i={Enter:s==="Enter"||s===13,Space:s===" "||s==="Spacebar"||s===32,Escape:s==="Escape"||s==="Esc"||s===27,ArrowUp:s==="ArrowUp"||s==="Up"||s===38,ArrowRight:s==="ArrowRight"||s==="Right"||s===39,ArrowDown:s==="ArrowDown"||s==="Down"||s===40,ArrowLeft:s==="ArrowLeft"||s==="Left"||s===37,Home:s==="Home"||s===36,End:s==="End"||s===35,Tab:s==="Tab"||s===9};return Object.keys(i).find(e=>i[e]===!0)||""}catch{return""}}function c(t){t.preventDefault(),t.stopPropagation()}function m(t=null){window.Graupl=window.Graupl||{},r("string",{type:t})&&(window.Graupl[t]=window.Graupl[t]||{})}function w(t=null){return r("string",{type:t})?window.Graupl[t]:window.Graupl}function C(t,s={}){r("string",{type:t})&&r("object",{data:s})&&(window.Graupl[t]=s)}function _(t){r("string",{type:t})&&(window.Graupl[t]={})}function g(t,s,i){r("string",{type:t,key:s})&&(window.Graupl[t][s]=i)}function y(t,s){return r("string",{type:t,key:s})?window.Graupl[t][s]:null}function p(t,s){r("string",{type:t,key:s})&&delete window.Graupl[t][s]}var f={initializeStorage:m,getStorage:w,setStorage:C,clearStorage:_,pushToStorage:g,getFromStorage:y,removeFromStorage:p},E=class{_dom={alert:null,controller:null};_hidden=!1;_showClass="";_hideClass="";_transitionClass="";_transitionTimer=150;_key="";_errors=[];_showEvent=new CustomEvent("grauplAlertShow",{bubbles:!0,detail:{alert:this}});_hideEvent=new CustomEvent("grauplAlertHide",{bubbles:!0,detail:{alert:this}});constructor({alertElement:t,controllerElement:s=null,showClass:i="show",hideClass:e="hide",transitionClass:n="transitioning",transitionTimer:b=150,isHidden:k=!1,key:A=null,initialize:S=!1}){this._dom.alert=t,this._dom.controller=s,this._showClass=i||"",this._hideClass=e||"",this._transitionClass=n||"",this._transitionTimer=b,this._hidden=k,this._key=A||"",S&&this.initialize()}initialize(){try{if(!this._validate())throw new Error(`Graupl Alert: cannot initialize alert. The following errors have been found:
|
|
2
2
|
- ${this.errors.join(`
|
|
3
|
-
- `)}`);this._generateKey(),this._setIds(),this._handleClick(),this._handleKeydown(),this._handleKeyup(),f.initializeStorage("alerts"),f.pushToStorage("alerts",this.dom.alert.id,this)}catch(t){console.error(t)}}get dom(){return this._dom}get showClass(){return this._showClass}get hideClass(){return this._hideClass}get transitionClass(){return this._transitionClass}get transitionTimer(){return this._transitionTimer}get key(){return this._key}set showClass(t){h({showClass:t}),this._showClass!==t&&(this._showClass=t)}set hideClass(t){h({hideClass:t}),this._hideClass!==t&&(this._hideClass=t)}set transitionClass(t){h({transitionClass:t}),this._transitionClass!==t&&(this._transitionClass=t)}set transitionTimer(t){r("number",{transitionTimer:t}),this._transitionTimer!==t&&(this._transitionTimer=t)}set key(t){r("string",{value:t}),this._key!==t&&(this._key=t)}_validate(){let t=!0,s;if(this._dom.controller!==null?s=l(HTMLElement,{alertElement:this._dom.alert,controllerElement:this._dom.controller}):s=l(HTMLElement,{alertElement:this._dom.alert}),s.status||(this._errors.push(s.message),t=!1),this._showClass!==""){const n=h({showClass:this._showClass});n.status||(this._errors.push(n.message),t=!1)}if(this._hideClass!==""){const n=h({hideClass:this._hideClass});n.status||(this._errors.push(n.message),t=!1)}if(this._transitionClass!==""){const n=h({transitionClass:this._transitionClass});n.status||(this._errors.push(n.message),t=!1)}const i=r("number",{transitionTimer:this._transitionTimer});i.status||(this._errors.push(i.message),t=!1);const e=r("boolean",{isHidden:this._hidden});return e.status||(this._errors.push(e.message),t=!1),t}_generateKey(t=!1){(this.key===""||t)&&(this.key=Math.random().toString(36).replace(/[^a-z]+/g,"").substring(0,10))}_setIds(){this.dom.alert.id=this.dom.alert.id||`alert-${this.key}`,this.dom.controller.id=this.dom.controller.id||`alert-controller-${this.key}`}show(t=!0){this._hidden&&(this.transitionClass!==""?(o(this.transitionClass,this.dom.alert),requestAnimationFrame(()=>{this.hideClass!==""&&a(this.hideClass,this.dom.alert),requestAnimationFrame(()=>{this.showClass!==""&&o(this.showClass,this.dom.alert),requestAnimationFrame(()=>{a(this.transitionClass,this.dom.alert)})})})):(this.showClass!==""&&o(this.showClass,this.dom.alert),this.hideClass!==""&&a(this.hideClass,this.dom.alert)),this._hidden=!1,t&&this.dom.alert.dispatchEvent(this._hideEvent))}hide(t=!0){this._hidden||(this.transitionClass!==""?(o(this.transitionClass,this.dom.alert),requestAnimationFrame(()=>{this.showClass!==""&&a(this.showClass,this.dom.alert),requestAnimationFrame(()=>{this.transitionTimer>0?setTimeout(()=>{this.hideClass!==""&&o(this.hideClass,this.dom.alert),requestAnimationFrame(()=>{a(this.transitionClass,this.dom.alert)})},this.transitionTimer):(this.hideClass!==""&&o(this.hideClass,this.dom.alert),requestAnimationFrame(()=>{a(this.transitionClass,this.dom.alert)}))})})):(this.hideClass!==""&&o(this.hideClass,this.dom.alert),this.showClass!==""&&a(this.showClass,this.dom.alert)),this._hidden=!0,t&&this.dom.alert.dispatchEvent(this._hideEvent))}_handleClick(){this.dom.controller!==null&&this.dom.controller.addEventListener("pointerup",()=>this.hide())}_handleKeydown(){this.dom.controller!==null&&this.dom.controller.addEventListener("keydown",t=>{const s=d(t);(s==="Space"||s==="Enter")&&c(t)})}_handleKeyup(){this.dom.controller!==null&&this.dom.controller.addEventListener("keyup",t=>{const s=d(t);(s==="Space"||s==="Enter")&&this.hide()})}},T=E;return T}();
|
|
3
|
+
- `)}`);this._generateKey(),this._setIds(),this._handleClick(),this._handleKeydown(),this._handleKeyup(),f.initializeStorage("alerts"),f.pushToStorage("alerts",this.dom.alert.id,this)}catch(t){console.error(t)}}get dom(){return this._dom}get showClass(){return this._showClass}get hideClass(){return this._hideClass}get transitionClass(){return this._transitionClass}get transitionTimer(){return this._transitionTimer}get key(){return this._key}set showClass(t){h({showClass:t}),this._showClass!==t&&(this._showClass=t)}set hideClass(t){h({hideClass:t}),this._hideClass!==t&&(this._hideClass=t)}set transitionClass(t){h({transitionClass:t}),this._transitionClass!==t&&(this._transitionClass=t)}set transitionTimer(t){r("number",{transitionTimer:t}),this._transitionTimer!==t&&(this._transitionTimer=t)}set key(t){r("string",{value:t}),this._key!==t&&(this._key=t)}_validate(){let t=!0,s;if(this._dom.controller!==null?s=l(HTMLElement,{alertElement:this._dom.alert,controllerElement:this._dom.controller}):s=l(HTMLElement,{alertElement:this._dom.alert}),s.status||(this._errors.push(s.message),t=!1),this._showClass!==""){const n=h({showClass:this._showClass});n.status||(this._errors.push(n.message),t=!1)}if(this._hideClass!==""){const n=h({hideClass:this._hideClass});n.status||(this._errors.push(n.message),t=!1)}if(this._transitionClass!==""){const n=h({transitionClass:this._transitionClass});n.status||(this._errors.push(n.message),t=!1)}const i=r("number",{transitionTimer:this._transitionTimer});i.status||(this._errors.push(i.message),t=!1);const e=r("boolean",{isHidden:this._hidden});return e.status||(this._errors.push(e.message),t=!1),t}_generateKey(t=!1){(this.key===""||t)&&(this.key=Math.random().toString(36).replace(/[^a-z]+/g,"").substring(0,10))}_setIds(){this.dom.alert.id=this.dom.alert.id||`alert-${this.key}`,this.dom.controller.id=this.dom.controller.id||`alert-controller-${this.key}`}show(t=!0){this._hidden&&(this.transitionClass!==""?(o(this.transitionClass,this.dom.alert),requestAnimationFrame(()=>{this.hideClass!==""&&a(this.hideClass,this.dom.alert),requestAnimationFrame(()=>{this.showClass!==""&&o(this.showClass,this.dom.alert),requestAnimationFrame(()=>{a(this.transitionClass,this.dom.alert)})})})):(this.showClass!==""&&o(this.showClass,this.dom.alert),this.hideClass!==""&&a(this.hideClass,this.dom.alert)),this._hidden=!1,t&&this.dom.alert.dispatchEvent(this._hideEvent))}hide(t=!0){this._hidden||(this.transitionClass!==""?(o(this.transitionClass,this.dom.alert),requestAnimationFrame(()=>{this.showClass!==""&&a(this.showClass,this.dom.alert),requestAnimationFrame(()=>{this.transitionTimer>0?setTimeout(()=>{this.hideClass!==""&&o(this.hideClass,this.dom.alert),requestAnimationFrame(()=>{a(this.transitionClass,this.dom.alert)})},this.transitionTimer):(this.hideClass!==""&&o(this.hideClass,this.dom.alert),requestAnimationFrame(()=>{a(this.transitionClass,this.dom.alert)}))})})):(this.hideClass!==""&&o(this.hideClass,this.dom.alert),this.showClass!==""&&a(this.showClass,this.dom.alert)),this._hidden=!0,t&&this.dom.alert.dispatchEvent(this._hideEvent))}_handleClick(){this.dom.controller!==null&&this.dom.controller.addEventListener("pointerup",()=>this.hide())}_handleKeydown(){this.dom.controller!==null&&this.dom.controller.addEventListener("keydown",t=>{const s=d(t);(s==="Space"||s==="Enter")&&c(t)})}_handleKeyup(){this.dom.controller!==null&&this.dom.controller.addEventListener("keyup",t=>{const s=d(t);(s==="Space"||s==="Enter")&&this.hide()})}},T=E;return T})();
|
|
4
4
|
|
|
5
5
|
//# sourceMappingURL=alert.iife.js.map
|