@graupl/graupl 1.0.0-alpha.9 → 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/.github/workflows/codeql-analysis.yml +3 -3
  2. package/.husky/commit-msg +0 -1
  3. package/.husky/pre-commit +0 -1
  4. package/CHANGELOG.md +153 -0
  5. package/build.js +7 -0
  6. package/dist/css/base/button.css +2 -0
  7. package/dist/css/base/button.css.map +1 -0
  8. package/dist/css/base/form.css +2 -0
  9. package/dist/css/base/form.css.map +1 -0
  10. package/dist/css/base/link.css +2 -0
  11. package/dist/css/base/link.css.map +1 -0
  12. package/dist/css/base/table.css +2 -0
  13. package/dist/css/base/table.css.map +1 -0
  14. package/dist/css/base.css +2 -0
  15. package/dist/css/base.css.map +1 -0
  16. package/dist/css/component/accordion.css +2 -0
  17. package/dist/css/component/accordion.css.map +1 -0
  18. package/dist/css/component/alert.css +2 -0
  19. package/dist/css/component/alert.css.map +1 -0
  20. package/dist/css/component/card.css +2 -0
  21. package/dist/css/component/card.css.map +1 -0
  22. package/dist/css/component/carousel.css +2 -0
  23. package/dist/css/component/carousel.css.map +1 -0
  24. package/dist/{component → css/component}/input-group.css +1 -1
  25. package/dist/css/component/input-group.css.map +1 -0
  26. package/dist/css/component/menu.css +2 -0
  27. package/dist/css/component/menu.css.map +1 -0
  28. package/dist/css/component/navigation.css +2 -0
  29. package/dist/css/component/navigation.css.map +1 -0
  30. package/dist/css/component.css +2 -0
  31. package/dist/css/component.css.map +1 -0
  32. package/dist/css/graupl.css +2 -0
  33. package/dist/css/graupl.css.map +1 -0
  34. package/dist/css/init.css +2 -0
  35. package/dist/css/init.css.map +1 -0
  36. package/dist/css/layout/columns.css +2 -0
  37. package/dist/css/layout/columns.css.map +1 -0
  38. package/dist/css/layout/container.css.map +1 -0
  39. package/dist/css/layout/flex-columns.css +2 -0
  40. package/dist/css/layout/flex-columns.css.map +1 -0
  41. package/dist/css/layout.css +2 -0
  42. package/dist/css/layout.css.map +1 -0
  43. package/dist/css/normalize.css +2 -0
  44. package/dist/css/normalize.css.map +1 -0
  45. package/dist/css/state/focus.css +2 -0
  46. package/dist/css/state/focus.css.map +1 -0
  47. package/dist/css/state.css +2 -0
  48. package/dist/css/state.css.map +1 -0
  49. package/dist/css/theme/color.css +2 -0
  50. package/dist/css/theme/color.css.map +1 -0
  51. package/dist/css/theme/typography.css +2 -0
  52. package/dist/css/theme/typography.css.map +1 -0
  53. package/dist/css/theme.css +2 -0
  54. package/dist/css/theme.css.map +1 -0
  55. package/dist/css/utilities/alignment.css +2 -0
  56. package/dist/css/utilities/alignment.css.map +1 -0
  57. package/dist/{utilities/colors.css → css/utilities/color.css} +2 -2
  58. package/dist/css/utilities/color.css.map +1 -0
  59. package/dist/css/utilities/display.css +2 -0
  60. package/dist/css/utilities/display.css.map +1 -0
  61. package/dist/css/utilities/flex.css +2 -0
  62. package/dist/css/utilities/flex.css.map +1 -0
  63. package/dist/css/utilities/height.css +2 -0
  64. package/dist/css/utilities/height.css.map +1 -0
  65. package/dist/css/utilities/inset.css +2 -0
  66. package/dist/css/utilities/inset.css.map +1 -0
  67. package/dist/css/utilities/justification.css +2 -0
  68. package/dist/css/utilities/justification.css.map +1 -0
  69. package/dist/css/utilities/list.css +2 -0
  70. package/dist/css/utilities/list.css.map +1 -0
  71. package/dist/css/utilities/order.css +2 -0
  72. package/dist/css/utilities/order.css.map +1 -0
  73. package/dist/css/utilities/postion.css +2 -0
  74. package/dist/css/utilities/postion.css.map +1 -0
  75. package/dist/css/utilities/ratio.css +2 -0
  76. package/dist/css/utilities/ratio.css.map +1 -0
  77. package/dist/css/utilities/spacing.css +2 -0
  78. package/dist/css/utilities/spacing.css.map +1 -0
  79. package/dist/css/utilities/typography.css +2 -0
  80. package/dist/css/utilities/typography.css.map +1 -0
  81. package/dist/css/utilities/visibility.css +2 -0
  82. package/dist/css/utilities/visibility.css.map +1 -0
  83. package/dist/css/utilities/width.css +2 -0
  84. package/dist/css/utilities/width.css.map +1 -0
  85. package/dist/css/utilities.css +2 -0
  86. package/dist/css/utilities.css.map +1 -0
  87. package/dist/js/component/accordion.cjs.js +3 -0
  88. package/dist/js/component/accordion.esm.js +1289 -0
  89. package/dist/js/component/accordion.iife.js +3 -0
  90. package/dist/js/component/alert.cjs.js +3 -0
  91. package/dist/js/component/alert.esm.js +529 -0
  92. package/dist/js/component/alert.iife.js +3 -0
  93. package/dist/js/component/carousel.cjs.js +3 -0
  94. package/dist/js/component/carousel.esm.js +1110 -0
  95. package/dist/js/component/carousel.iife.js +3 -0
  96. package/dist/js/graupl.cjs.js +5 -0
  97. package/dist/js/graupl.esm.js +1462 -0
  98. package/dist/js/graupl.iife.js +5 -0
  99. package/docs/.vitepress/config.js +39 -12
  100. package/docs/components/alert.md +130 -0
  101. package/docs/components/button.md +84 -0
  102. package/docs/components/card.md +369 -0
  103. package/docs/components/index.md +1 -0
  104. package/docs/components/inputgroup.md +159 -0
  105. package/docs/components/menu.md +326 -0
  106. package/docs/components/navigation.md +158 -0
  107. package/docs/content.md +237 -0
  108. package/docs/defaults.md +121 -0
  109. package/docs/forms.md +79 -0
  110. package/docs/functions.md +9 -0
  111. package/docs/getting-started.md +1 -0
  112. package/docs/index.md +1 -7
  113. package/docs/introduction.md +22 -2
  114. package/docs/layout.md +200 -0
  115. package/docs/mixins.md +47 -0
  116. package/docs/state.md +67 -0
  117. package/docs/theme.md +258 -0
  118. package/docs/utilities.md +357 -0
  119. package/eslint.config.js +1 -0
  120. package/index.html +816 -327
  121. package/index.js +12 -0
  122. package/package.json +31 -10
  123. package/scss/base/button.scss +3 -0
  124. package/scss/base/form.scss +1 -1
  125. package/scss/base/link.scss +1 -1
  126. package/scss/base/table.scss +1 -1
  127. package/scss/base.scss +1 -1
  128. package/scss/component/accordion.scss +3 -0
  129. package/scss/component/alert.scss +3 -0
  130. package/scss/component/card.scss +3 -0
  131. package/scss/component/carousel.scss +3 -0
  132. package/scss/component/input-group.scss +1 -1
  133. package/scss/component/menu.scss +3 -0
  134. package/scss/component/navigation.scss +3 -0
  135. package/scss/component.scss +1 -1
  136. package/scss/graupl.scss +1 -3
  137. package/scss/init.scss +3 -0
  138. package/scss/layout/columns.scss +1 -1
  139. package/scss/layout/container.scss +1 -1
  140. package/scss/layout/flex-columns.scss +3 -0
  141. package/scss/layout.scss +1 -1
  142. package/scss/normalize.scss +3 -0
  143. package/scss/state/focus.scss +1 -1
  144. package/scss/state.scss +1 -1
  145. package/scss/theme/color.scss +1 -1
  146. package/scss/theme/typography.scss +1 -1
  147. package/scss/theme.scss +1 -1
  148. package/scss/utilities/alignment.scss +3 -0
  149. package/scss/utilities/color.scss +3 -0
  150. package/scss/utilities/display.scss +3 -0
  151. package/scss/utilities/flex.scss +3 -0
  152. package/scss/utilities/height.scss +3 -0
  153. package/scss/utilities/inset.scss +3 -0
  154. package/scss/utilities/justification.scss +3 -0
  155. package/scss/utilities/list.scss +3 -0
  156. package/scss/utilities/order.scss +3 -0
  157. package/scss/utilities/postion.scss +3 -0
  158. package/scss/utilities/ratio.scss +3 -0
  159. package/scss/utilities/spacing.scss +1 -1
  160. package/scss/utilities/typography.scss +1 -1
  161. package/scss/utilities/visibility.scss +3 -0
  162. package/scss/utilities/width.scss +3 -0
  163. package/scss/utilities.scss +1 -1
  164. package/src/js/accordion/Accordion.js +1163 -0
  165. package/src/js/accordion/AccordionItem.js +496 -0
  166. package/src/js/accordion/index.js +10 -0
  167. package/src/js/alert/Alert.js +581 -0
  168. package/src/js/alert/index.js +11 -0
  169. package/src/js/carousel/Carousel.js +1427 -0
  170. package/src/js/carousel/index.js +10 -0
  171. package/src/js/domHelpers.js +37 -0
  172. package/src/js/eventHandlers.js +39 -0
  173. package/src/js/navigation/index.js +36 -0
  174. package/src/js/storage.js +106 -0
  175. package/src/js/validate.js +225 -0
  176. package/src/scss/_defaults.scss +74 -5
  177. package/src/scss/_index.scss +4 -3
  178. package/src/scss/_init.scss +2 -2
  179. package/src/scss/_normalize.scss +197 -0
  180. package/src/scss/_variables.scss +7 -7
  181. package/src/scss/base/_index.scss +2 -1
  182. package/src/scss/base/button/_defaults.scss +60 -0
  183. package/src/scss/base/button/_index.scss +107 -0
  184. package/src/scss/base/button/_mixins.scss +166 -0
  185. package/src/scss/{component → base}/button/_variables.scss +64 -19
  186. package/src/scss/base/form/_defaults.scss +14 -4
  187. package/src/scss/base/form/_index.scss +23 -20
  188. package/src/scss/base/form/_variables.scss +14 -2
  189. package/src/scss/base/link/_defaults.scss +48 -5
  190. package/src/scss/base/link/_index.scss +111 -10
  191. package/src/scss/base/link/_variables.scss +234 -4
  192. package/src/scss/base/table/_defaults.scss +49 -4
  193. package/src/scss/base/table/_index.scss +102 -8
  194. package/src/scss/base/table/_variables.scss +75 -5
  195. package/src/scss/component/_index.scss +7 -3
  196. package/src/scss/component/accordion/_defaults.scss +40 -0
  197. package/src/scss/component/accordion/_index.scss +180 -0
  198. package/src/scss/component/accordion/_variables.scss +316 -0
  199. package/src/scss/component/alert/_defaults.scss +49 -0
  200. package/src/scss/component/alert/_index.scss +118 -0
  201. package/src/scss/component/alert/_variables.scss +173 -0
  202. package/src/scss/component/card/_defaults.scss +32 -0
  203. package/src/scss/component/card/_index.scss +178 -0
  204. package/src/scss/component/card/_variables.scss +186 -0
  205. package/src/scss/component/carousel/_defaults.scss +43 -0
  206. package/src/scss/component/carousel/_index.scss +188 -0
  207. package/src/scss/component/carousel/_variables.scss +104 -0
  208. package/src/scss/component/input-group/_defaults.scss +11 -4
  209. package/src/scss/component/input-group/_index.scss +13 -11
  210. package/src/scss/component/input-group/_variables.scss +4 -1
  211. package/src/scss/component/menu/_defaults.scss +66 -0
  212. package/src/scss/component/menu/_index.scss +305 -0
  213. package/src/scss/component/menu/_variables.scss +500 -0
  214. package/src/scss/component/navigation/_defaults.scss +29 -0
  215. package/src/scss/component/navigation/_index.scss +189 -0
  216. package/src/scss/component/navigation/_variables.scss +237 -0
  217. package/src/scss/functions/_important.scss +2 -0
  218. package/src/scss/functions/_screen.scss +30 -0
  219. package/src/scss/functions/_theme.scss +28 -7
  220. package/src/scss/layout/_index.scss +2 -1
  221. package/src/scss/layout/columns/_defaults.scss +12 -4
  222. package/src/scss/layout/columns/_index.scss +29 -7
  223. package/src/scss/layout/columns/_variables.scss +6 -2
  224. package/src/scss/layout/container/_defaults.scss +13 -4
  225. package/src/scss/layout/container/_index.scss +12 -7
  226. package/src/scss/layout/container/_variables.scss +4 -1
  227. package/src/scss/layout/flex-columns/_defaults.scss +18 -0
  228. package/src/scss/layout/flex-columns/_index.scss +80 -0
  229. package/src/scss/layout/flex-columns/_variables.scss +26 -0
  230. package/src/scss/mixins/_animation.scss +15 -0
  231. package/src/scss/mixins/_layer.scss +3 -5
  232. package/src/scss/mixins/_screen.scss +56 -0
  233. package/src/scss/mixins/_utility.scss +30 -0
  234. package/src/scss/mixins/_visually-hidden.scss +20 -0
  235. package/src/scss/state/_index.scss +1 -1
  236. package/src/scss/state/focus/_defaults.scss +6 -4
  237. package/src/scss/state/focus/_index.scss +7 -7
  238. package/src/scss/state/focus/_mixins.scss +15 -0
  239. package/src/scss/state/focus/_variables.scss +6 -2
  240. package/src/scss/theme/_index.scss +1 -1
  241. package/src/scss/theme/color/_defaults.scss +101 -19
  242. package/src/scss/theme/color/_index.scss +17 -17
  243. package/src/scss/theme/color/_variables.scss +72 -64
  244. package/src/scss/theme/typography/_defaults.scss +7 -5
  245. package/src/scss/theme/typography/_index.scss +1 -1
  246. package/src/scss/theme/typography/_variables.scss +11 -7
  247. package/src/scss/utilities/_index.scss +14 -2
  248. package/src/scss/utilities/alignment/_defaults.scss +62 -0
  249. package/src/scss/utilities/alignment/_index.scss +75 -0
  250. package/src/scss/utilities/alignment/_variables.scss +6 -0
  251. package/src/scss/utilities/color/_defaults.scss +35 -0
  252. package/src/scss/utilities/color/_index.scss +91 -0
  253. package/src/scss/utilities/color/_variables.scss +6 -0
  254. package/src/scss/utilities/display/_defaults.scss +32 -0
  255. package/src/scss/utilities/display/_index.scss +61 -0
  256. package/src/scss/utilities/display/_variables.scss +6 -0
  257. package/src/scss/utilities/flex/_defaults.scss +63 -0
  258. package/src/scss/utilities/flex/_index.scss +71 -0
  259. package/src/scss/utilities/flex/_variables.scss +6 -0
  260. package/src/scss/utilities/height/_defaults.scss +41 -0
  261. package/src/scss/utilities/height/_index.scss +98 -0
  262. package/src/scss/utilities/height/_variables.scss +6 -0
  263. package/src/scss/utilities/inset/_defaults.scss +41 -0
  264. package/src/scss/utilities/inset/_index.scss +37 -0
  265. package/src/scss/utilities/inset/_variables.scss +6 -0
  266. package/src/scss/utilities/justification/_defaults.scss +59 -0
  267. package/src/scss/utilities/justification/_index.scss +75 -0
  268. package/src/scss/utilities/justification/_variables.scss +6 -0
  269. package/src/scss/utilities/list/_defaults.scss +39 -0
  270. package/src/scss/utilities/list/_index.scss +56 -0
  271. package/src/scss/utilities/list/_variables.scss +6 -0
  272. package/src/scss/utilities/order/_defaults.scss +22 -0
  273. package/src/scss/utilities/order/_index.scss +63 -0
  274. package/src/scss/utilities/order/_variables.scss +6 -0
  275. package/src/scss/utilities/position/_defaults.scss +26 -0
  276. package/src/scss/utilities/position/_index.scss +37 -0
  277. package/src/scss/utilities/position/_variables.scss +6 -0
  278. package/src/scss/utilities/ratio/_defaults.scss +28 -0
  279. package/src/scss/utilities/ratio/_index.scss +52 -0
  280. package/src/scss/utilities/ratio/_variables.scss +9 -0
  281. package/src/scss/utilities/spacing/_defaults.scss +9 -4
  282. package/src/scss/utilities/spacing/_index.scss +134 -29
  283. package/src/scss/utilities/spacing/_variables.scss +5 -2
  284. package/src/scss/utilities/typography/_defaults.scss +29 -4
  285. package/src/scss/utilities/typography/_index.scss +155 -23
  286. package/src/scss/utilities/typography/_variables.scss +5 -2
  287. package/src/scss/utilities/visibility/_defaults.scss +25 -0
  288. package/src/scss/utilities/visibility/_index.scss +36 -0
  289. package/src/scss/utilities/visibility/_variables.scss +6 -0
  290. package/src/scss/utilities/width/_defaults.scss +41 -0
  291. package/src/scss/utilities/width/_index.scss +98 -0
  292. package/src/scss/utilities/width/_variables.scss +6 -0
  293. package/stylelint.config.js +5 -0
  294. package/vite.config.js +57 -0
  295. package/dist/base/form.css +0 -2
  296. package/dist/base/form.css.map +0 -1
  297. package/dist/base/link.css +0 -2
  298. package/dist/base/link.css.map +0 -1
  299. package/dist/base/table.css +0 -2
  300. package/dist/base/table.css.map +0 -1
  301. package/dist/base.css +0 -2
  302. package/dist/base.css.map +0 -1
  303. package/dist/component/button.css +0 -2
  304. package/dist/component/button.css.map +0 -1
  305. package/dist/component/input-group.css.map +0 -1
  306. package/dist/component/table.css +0 -2
  307. package/dist/component/table.css.map +0 -1
  308. package/dist/component.css +0 -2
  309. package/dist/component.css.map +0 -1
  310. package/dist/graupl.css +0 -2
  311. package/dist/graupl.css.map +0 -1
  312. package/dist/layout/columns.css +0 -2
  313. package/dist/layout/columns.css.map +0 -1
  314. package/dist/layout/container.css.map +0 -1
  315. package/dist/layout.css +0 -2
  316. package/dist/layout.css.map +0 -1
  317. package/dist/state/focus.css +0 -2
  318. package/dist/state/focus.css.map +0 -1
  319. package/dist/state.css +0 -2
  320. package/dist/state.css.map +0 -1
  321. package/dist/theme/color.css +0 -2
  322. package/dist/theme/color.css.map +0 -1
  323. package/dist/theme/typography.css +0 -2
  324. package/dist/theme/typography.css.map +0 -1
  325. package/dist/theme.css +0 -2
  326. package/dist/theme.css.map +0 -1
  327. package/dist/utilities/colors.css.map +0 -1
  328. package/dist/utilities/spacing.css +0 -2
  329. package/dist/utilities/spacing.css.map +0 -1
  330. package/dist/utilities/typography.css +0 -2
  331. package/dist/utilities/typography.css.map +0 -1
  332. package/dist/utilities.css +0 -2
  333. package/dist/utilities.css.map +0 -1
  334. package/scss/component/button.scss +0 -3
  335. package/scss/component/table.scss +0 -3
  336. package/scss/utilities/colors.scss +0 -3
  337. package/src/scss/component/button/_defaults.scss +0 -39
  338. package/src/scss/component/button/_index.scss +0 -98
  339. package/src/scss/component/table/_defaults.scss +0 -30
  340. package/src/scss/component/table/_index.scss +0 -77
  341. package/src/scss/component/table/_variables.scss +0 -64
  342. package/src/scss/mixins/_media-queries.scss +0 -26
  343. package/src/scss/utilities/colors/_defaults.scss +0 -5
  344. package/src/scss/utilities/colors/_index.scss +0 -22
  345. package/src/scss/utilities/colors/_variables.scss +0 -3
  346. /package/dist/{layout → css/layout}/container.css +0 -0
@@ -0,0 +1,10 @@
1
+ import Carousel from "./Carousel.js";
2
+
3
+ document.addEventListener("DOMContentLoaded", () => {
4
+ document.querySelectorAll(".carousel").forEach((carouselElement) => {
5
+ new Carousel({
6
+ carouselElement,
7
+ initialize: true,
8
+ });
9
+ });
10
+ });
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Add a class or array of classes to an element.
3
+ *
4
+ * @param {string|string[]} className - The class or classes to add.
5
+ * @param {HTMLElement} element - The element to add the class to.
6
+ */
7
+ export function addClass(className, element) {
8
+ // Gracefully handle empty strings or arrays.
9
+ if (className === "" || className.length === 0) {
10
+ return;
11
+ }
12
+
13
+ if (typeof className === "string") {
14
+ element.classList.add(className);
15
+ } else {
16
+ element.classList.add(...className);
17
+ }
18
+ }
19
+
20
+ /**
21
+ * Remove a class or array of classes from an element.
22
+ *
23
+ * @param {string|string[]} className - The class or classes to remove.
24
+ * @param {HTMLElement} element - The element to remove the class from.
25
+ */
26
+ export function removeClass(className, element) {
27
+ // Gracefully handle empty strings or arrays.
28
+ if (className === "" || className.length === 0) {
29
+ return;
30
+ }
31
+
32
+ if (typeof className === "string") {
33
+ element.classList.remove(className);
34
+ } else {
35
+ element.classList.remove(...className);
36
+ }
37
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Retrieves the pressed key from an event.
3
+ *
4
+ * @param {KeyboardEvent} event - The keyboard event.
5
+ * @return {string} - The name of the key or an empty string.
6
+ */
7
+ export function keyPress(event) {
8
+ try {
9
+ // Use event.key or event.keyCode to support older browsers.
10
+ const key = event.key || event.keyCode;
11
+ const keys = {
12
+ Enter: key === "Enter" || key === 13,
13
+ Space: key === " " || key === "Spacebar" || key === 32,
14
+ Escape: key === "Escape" || key === "Esc" || key === 27,
15
+ ArrowUp: key === "ArrowUp" || key === "Up" || key === 38,
16
+ ArrowRight: key === "ArrowRight" || key === "Right" || key === 39,
17
+ ArrowDown: key === "ArrowDown" || key === "Down" || key === 40,
18
+ ArrowLeft: key === "ArrowLeft" || key === "Left" || key === 37,
19
+ Home: key === "Home" || key === 36,
20
+ End: key === "End" || key === 35,
21
+ Tab: key === "Tab" || key === 9,
22
+ };
23
+
24
+ return Object.keys(keys).find((key) => keys[key] === true) || "";
25
+ } catch {
26
+ // Return an empty string if something goes wrong.
27
+ return "";
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Stops an event from taking action.
33
+ *
34
+ * @param {Event} event - The event.
35
+ */
36
+ export function preventEvent(event) {
37
+ event.preventDefault();
38
+ event.stopPropagation();
39
+ }
@@ -0,0 +1,36 @@
1
+ import storage from "../storage.js";
2
+
3
+ document.addEventListener("DOMContentLoaded", function () {
4
+ const navs = document.querySelectorAll(".navigation");
5
+
6
+ navs.forEach((nav) => {
7
+ const MenuConstructor = nav.dataset.grauplMenuType || DisclosureMenu;
8
+
9
+ if (window[MenuConstructor] === undefined) {
10
+ console.warn(
11
+ `Graupl navigation requires accessible-menu's ${MenuConstructor}. Please make sure to include it on this page.`
12
+ );
13
+
14
+ return;
15
+ }
16
+
17
+ const menuOptions =
18
+ JSON.parse(nav.dataset.grauplMenuOptions.replace(/'/g, '"')) || {};
19
+ const menuElement = nav.querySelector(".menu");
20
+ const controllerElement = nav.querySelector(".navigation-toggle") || null;
21
+ const containerElement = controllerElement ? nav : null;
22
+ const menu = new window[MenuConstructor]({
23
+ menuElement,
24
+ menuItemSelector: ".menu-item",
25
+ menuLinkSelector: ".menu-link",
26
+ submenuItemSelector: ".submenu-item",
27
+ submenuToggleSelector: ".submenu-toggle",
28
+ controllerElement,
29
+ containerElement,
30
+ ...menuOptions,
31
+ });
32
+
33
+ storage.initializeStorage("menus");
34
+ storage.pushToStorage("menus", menu.dom.menu.id, menu);
35
+ });
36
+ });
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @file
3
+ * Provides a system to get and store Graupl data in the browser.
4
+ */
5
+
6
+ import { isValidType } from "./validate.js";
7
+
8
+ /**
9
+ * Initializes the storage system.
10
+ *
11
+ * @param {?string} [type = null] - The type of storage to initialize.
12
+ */
13
+ export function initializeStorage(type = null) {
14
+ window.Graupl = window.Graupl || {};
15
+
16
+ if (isValidType("string", { type })) {
17
+ window.Graupl[type] = window.Graupl[type] || {};
18
+ }
19
+ }
20
+
21
+ /**
22
+ * Get the storage object.
23
+ *
24
+ * @param {?string} type - The type of storage to get.
25
+ * @return {object} - The storage object.
26
+ */
27
+ export function getStorage(type = null) {
28
+ if (isValidType("string", { type })) {
29
+ return window.Graupl[type];
30
+ }
31
+
32
+ return window.Graupl;
33
+ }
34
+
35
+ /**
36
+ * Set the storage object of a given type.
37
+ *
38
+ * @param {string} type - The type of storage to set.
39
+ * @param {object} data - The data to set.
40
+ */
41
+ export function setStorage(type, data = {}) {
42
+ if (isValidType("string", { type }) && isValidType("object", { data })) {
43
+ window.Graupl[type] = data;
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Clear the storage object of a given type.
49
+ *
50
+ * @param {string} type - The type of storage to clear.
51
+ */
52
+ export function clearStorage(type) {
53
+ if (isValidType("string", { type })) {
54
+ window.Graupl[type] = {};
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Push a value to the storage object.
60
+ *
61
+ * @param {string} type - The type of storage to push to.
62
+ * @param {string} key - The key to use for the value.
63
+ * @param {*} value - The value to store.
64
+ */
65
+ export function pushToStorage(type, key, value) {
66
+ if (isValidType("string", { type, key })) {
67
+ window.Graupl[type][key] = value;
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Get a value from the storage object.
73
+ *
74
+ * @param {string }type - The type of storage to get from.
75
+ * @param {string }key - The key to get the value from.
76
+ * @return {*} - The value from the storage object.
77
+ */
78
+ export function getFromStorage(type, key) {
79
+ if (isValidType("string", { type, key })) {
80
+ return window.Graupl[type][key];
81
+ }
82
+
83
+ return null;
84
+ }
85
+
86
+ /**
87
+ * Remove a value from the storage object.
88
+ *
89
+ * @param {string} type - The type of storage to remove from.
90
+ * @param {string} key - The key to remove the value from.
91
+ */
92
+ export function removeFromStorage(type, key) {
93
+ if (isValidType("string", { type, key })) {
94
+ delete window.Graupl[type][key];
95
+ }
96
+ }
97
+
98
+ export default {
99
+ initializeStorage,
100
+ getStorage,
101
+ setStorage,
102
+ clearStorage,
103
+ pushToStorage,
104
+ getFromStorage,
105
+ removeFromStorage,
106
+ };
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Check to see if the provided elements have a specific contructor.
3
+ *
4
+ * The values must be provided inside of an object
5
+ * so the variable name can be retrieved in case of errors.
6
+ *
7
+ * This is essentially just a wrapper function around checking instanceof with
8
+ * more descriptive error message to help debugging.
9
+ *
10
+ * Will return `{ status: true }` if the check is successful.
11
+ *
12
+ * @param {object} contructor - The constructor to check for.
13
+ * @param {object} elements - The element(s) to check.
14
+ * @return {Object<boolean, string>} - The result of the check.
15
+ */
16
+ export function isValidInstance(contructor, elements) {
17
+ try {
18
+ if (typeof elements !== "object") {
19
+ const elementsType = typeof elements;
20
+
21
+ throw new TypeError(
22
+ `Elements given to isValidInstance() must be inside of an object. "${elementsType}" given.`
23
+ );
24
+ }
25
+
26
+ for (const key in elements) {
27
+ if (!(elements[key] instanceof contructor)) {
28
+ const elementType = typeof elements[key];
29
+ throw new TypeError(
30
+ `${key} must be an instance of ${contructor.name}. "${elementType}" given.`
31
+ );
32
+ }
33
+ }
34
+
35
+ return {
36
+ status: true,
37
+ error: null,
38
+ };
39
+ } catch (error) {
40
+ return {
41
+ status: false,
42
+ error,
43
+ };
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Check to see if the provided values are of a specific type.
49
+ *
50
+ * The values must be provided inside of an object
51
+ * so the variable name can be retrieved in case of errors.
52
+ *
53
+ * This is essentially just a wrapper function around checking typeof with
54
+ * more descriptive error message to help debugging.
55
+ *
56
+ * Will return `{ status: true }` if the check is successful.
57
+ *
58
+ * @param {string} type - The type to check for.
59
+ * @param {object} values - The value(s) to check.
60
+ * @return {Object<boolean, string>} - The result of the check.
61
+ */
62
+ export function isValidType(type, values) {
63
+ try {
64
+ if (typeof values !== "object") {
65
+ const valuesType = typeof values;
66
+
67
+ throw new TypeError(
68
+ `Values given to isValidType() must be inside of an object. "${valuesType}" given.`
69
+ );
70
+ }
71
+
72
+ for (const key in values) {
73
+ const valueType = typeof values[key];
74
+
75
+ if (valueType !== type) {
76
+ throw new TypeError(`${key} must be a ${type}. "${valueType}" given.`);
77
+ }
78
+ }
79
+
80
+ return {
81
+ status: true,
82
+ error: null,
83
+ };
84
+ } catch (error) {
85
+ return {
86
+ status: false,
87
+ error,
88
+ };
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Checks to see if the provided values are valid query selectors.
94
+ *
95
+ * The values must be provided inside of an object
96
+ * so the variable name can be retrieved in case of errors.
97
+ *
98
+ * Will return `{ status: true }` if the check is successful.
99
+ *
100
+ * @param {Object<string>} values - The value(s) to check.
101
+ * @return {Object<boolean, string>} - The result of the check.
102
+ */
103
+ export function isQuerySelector(values) {
104
+ try {
105
+ if (typeof values !== "object") {
106
+ const type = typeof values;
107
+
108
+ throw new TypeError(
109
+ `Values given to isQuerySelector() must be inside of an object. "${type}" given.`
110
+ );
111
+ }
112
+
113
+ for (const key in values) {
114
+ try {
115
+ if (values[key] === null) {
116
+ throw new Error();
117
+ }
118
+
119
+ document.querySelector(values[key]);
120
+ } catch {
121
+ throw new TypeError(
122
+ `${key} must be a valid query selector. "${values[key]}" given.`
123
+ );
124
+ }
125
+ }
126
+
127
+ return {
128
+ status: true,
129
+ error: null,
130
+ };
131
+ } catch (error) {
132
+ return {
133
+ status: false,
134
+ error,
135
+ };
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Checks to see if the provided value is either a string or an array of strings.
141
+ *
142
+ * The values must be provided inside of an object
143
+ * so the variable name can be retrieved in case of errors.
144
+ *
145
+ * Will return `{ status: true }` if the check is successful.
146
+ *
147
+ * @param {Object<string, string[]>} values - The value(s) to check.
148
+ * @return {Object<boolean, string>} - The result of the check.
149
+ */
150
+ export function isValidClassList(values) {
151
+ try {
152
+ if (typeof values !== "object" || Array.isArray(values)) {
153
+ const type = typeof values;
154
+
155
+ throw new TypeError(
156
+ `Values given to isValidClassList() must be inside of an object. "${type}" given.`
157
+ );
158
+ }
159
+
160
+ for (const key in values) {
161
+ const type = typeof values[key];
162
+
163
+ if (type !== "string") {
164
+ if (Array.isArray(values[key])) {
165
+ values[key].forEach((value) => {
166
+ if (typeof value !== "string") {
167
+ throw new TypeError(
168
+ `${key} must be a string or an array of strings. An array containing non-strings given.`
169
+ );
170
+ }
171
+ });
172
+ } else {
173
+ throw new TypeError(
174
+ `${key} must be a string or an array of strings. "${type}" given.`
175
+ );
176
+ }
177
+ } else {
178
+ const obj = {};
179
+ obj[key] = values[key];
180
+
181
+ isQuerySelector(obj);
182
+ }
183
+ }
184
+
185
+ return {
186
+ status: true,
187
+ error: null,
188
+ };
189
+ } catch (error) {
190
+ return {
191
+ status: false,
192
+ error,
193
+ };
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Checks to see if the provided elements are using a specific tag.
199
+ *
200
+ * The elements must be provided inside of an object
201
+ * so the variable name can be retrieved in case of errors.
202
+ *
203
+ * Will return `true` if the check is successful.
204
+ *
205
+ * @param {string} tagName - The name of the tag.
206
+ * @param {Object<HTMLElement>} elements - The element(s) to check.
207
+ * @return {boolean} - The result of the check.
208
+ */
209
+ export function isTag(tagName, elements) {
210
+ if (
211
+ isValidType("string", { tagName }).status &&
212
+ isValidInstance(HTMLElement, elements).status
213
+ ) {
214
+ const tag = tagName.toLowerCase();
215
+ let check = true;
216
+
217
+ for (const key in elements) {
218
+ if (elements[key].tagName.toLowerCase() !== tag) check = false;
219
+ }
220
+
221
+ return check;
222
+ } else {
223
+ return false;
224
+ }
225
+ }
@@ -1,8 +1,10 @@
1
- // Default values for Graupl.
1
+ // @graupl/graupl default values.
2
2
  //
3
- // Generally, these should not be used directly when styling components.
4
- // They are mainly used to provide default fallbacks for custom properties
5
- // which can be found in the `variables.scss` file.
3
+ // Generally, these should not be used directly when styling components unless a static value is needed.
4
+ // They are mainly used to provide class selectors, fallbacks for custom properties, or loop values.
5
+ //
6
+ // They should not be used to define direct property values (i.e. font-size, color, etc.).
7
+ // Those should be defined as custom properties in the `_variables.scss` file.
6
8
 
7
9
  @use "sass:map";
8
10
 
@@ -11,16 +13,52 @@ $prefix: "graupl" !default;
11
13
 
12
14
  // Settings.
13
15
  $use-important: true !default;
16
+ $responsive-utilities: true !default;
14
17
 
15
18
  // Layout properties.
16
19
  $content-max-width: 96ch !default;
17
20
 
18
21
  // Screen sizes.
19
22
  $base-screen-sizes: (
20
- xs: "(0 <= width <= 48ch)",
23
+ xs: 0,
24
+ sm: 48ch,
25
+ md: 72ch,
26
+ lg: 108ch,
27
+ xl: 156ch,
21
28
  );
22
29
  $custom-screen-sizes: () !default;
23
30
  $screen-sizes: map.merge($base-screen-sizes, $custom-screen-sizes);
31
+ $base-screen-size-triggers: (
32
+ navigation-collapse: (
33
+ mixin: "down",
34
+ args: (
35
+ "sm",
36
+ ),
37
+ ),
38
+ navigation-expand: (
39
+ mixin: "up",
40
+ args: (
41
+ "md",
42
+ ),
43
+ ),
44
+ force-vertical-card: (
45
+ mixin: "down",
46
+ args: (
47
+ "sm",
48
+ ),
49
+ ),
50
+ force-single-column: (
51
+ mixin: "down",
52
+ args: (
53
+ "xs",
54
+ ),
55
+ ),
56
+ );
57
+ $custom-screen-size-triggers: () !default;
58
+ $screen-size-triggers: map.merge(
59
+ $base-screen-size-triggers,
60
+ $custom-screen-size-triggers
61
+ );
24
62
 
25
63
  // Spacing properties.
26
64
  $spacer: 1rem !default;
@@ -65,3 +103,34 @@ $transition-durations: map.merge(
65
103
  $base-transition-durations,
66
104
  $custom-transition-durations
67
105
  );
106
+
107
+ // State selectors.
108
+ $base-state-selectors: (
109
+ visited: (
110
+ ".visited",
111
+ ":visited",
112
+ ),
113
+ focus: (
114
+ ".focus",
115
+ ":focus-visible",
116
+ ),
117
+ hover: (
118
+ ".hover",
119
+ ":hover",
120
+ ),
121
+ active: (
122
+ ".active",
123
+ ":active",
124
+ ),
125
+ disabled: (
126
+ ".disabled",
127
+ ":disabled",
128
+ "[disabled]",
129
+ "[aria-disabled=true]",
130
+ ),
131
+ );
132
+ $custom-state-selectors: () !default;
133
+ $state-selectors: map.merge($base-state-selectors, $custom-state-selectors);
134
+
135
+ // Responsive utility separator.
136
+ $responsive-separator: "\\:" !default;
@@ -1,10 +1,11 @@
1
- // Graupl Components.
2
- //
3
- // Forwards all components for easy development.
1
+ // @graupl/graupl styles.
4
2
 
5
3
  // Forward the layer initialization.
6
4
  @forward "init";
7
5
 
6
+ // Forward normalize.
7
+ @forward "normalize";
8
+
8
9
  // Forward all layers.
9
10
  @forward "base";
10
11
  @forward "layout";
@@ -1,3 +1,3 @@
1
- // Graupl layer initialization.
1
+ // @graupl/graupl layer initialization styles.
2
2
 
3
- @layer graupl.base, graupl.layout, graupl.component, graupl.theme, graupl.utilities, graupl.state;
3
+ @layer graupl.normalize, graupl.base, graupl.layout, graupl.component, graupl.theme, graupl.utilities, graupl.state;