@graupl/graupl 1.0.0-alpha.14 → 1.0.0-alpha.16

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 (168) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/build.js +7 -0
  3. package/dist/css/base/button.css +2 -0
  4. package/dist/css/base/button.css.map +1 -0
  5. package/dist/css/base/form.css.map +1 -0
  6. package/dist/css/base/link.css.map +1 -0
  7. package/dist/css/base/table.css.map +1 -0
  8. package/dist/css/base.css +2 -0
  9. package/dist/css/base.css.map +1 -0
  10. package/dist/css/component/accordion.css +2 -0
  11. package/dist/css/component/accordion.css.map +1 -0
  12. package/dist/css/component/alert.css +2 -0
  13. package/dist/css/component/alert.css.map +1 -0
  14. package/dist/css/component/card.css.map +1 -0
  15. package/dist/css/component/carousel.css +2 -0
  16. package/dist/css/component/carousel.css.map +1 -0
  17. package/dist/css/component/input-group.css.map +1 -0
  18. package/dist/css/component/menu.css.map +1 -0
  19. package/dist/css/component/navigation.css.map +1 -0
  20. package/dist/css/component.css +2 -0
  21. package/dist/css/component.css.map +1 -0
  22. package/dist/css/graupl.css +2 -0
  23. package/dist/css/graupl.css.map +1 -0
  24. package/dist/css/init.css.map +1 -0
  25. package/dist/css/layout/columns.css.map +1 -0
  26. package/dist/css/layout/container.css.map +1 -0
  27. package/dist/css/layout/flex-columns.css.map +1 -0
  28. package/dist/css/layout.css +2 -0
  29. package/dist/css/layout.css.map +1 -0
  30. package/dist/css/normalize.css.map +1 -0
  31. package/dist/css/state/focus.css +2 -0
  32. package/dist/css/state/focus.css.map +1 -0
  33. package/dist/css/state.css +2 -0
  34. package/dist/css/state.css.map +1 -0
  35. package/dist/css/theme/color.css.map +1 -0
  36. package/dist/css/theme/typography.css.map +1 -0
  37. package/dist/css/theme.css.map +1 -0
  38. package/dist/css/utilities/alignment.css.map +1 -0
  39. package/dist/css/utilities/color.css.map +1 -0
  40. package/dist/css/utilities/display.css.map +1 -0
  41. package/dist/css/utilities/flex.css.map +1 -0
  42. package/dist/css/utilities/height.css.map +1 -0
  43. package/dist/css/utilities/inset.css.map +1 -0
  44. package/dist/css/utilities/justification.css.map +1 -0
  45. package/dist/css/utilities/list.css.map +1 -0
  46. package/dist/css/utilities/order.css.map +1 -0
  47. package/dist/css/utilities/postion.css.map +1 -0
  48. package/dist/css/utilities/spacing.css.map +1 -0
  49. package/dist/css/utilities/typography.css.map +1 -0
  50. package/dist/css/utilities/visibility.css.map +1 -0
  51. package/dist/css/utilities/width.css.map +1 -0
  52. package/dist/css/utilities.css.map +1 -0
  53. package/dist/js/component/accordion.cjs.js +3 -0
  54. package/dist/js/component/accordion.esm.js +1289 -0
  55. package/dist/js/component/accordion.iife.js +3 -0
  56. package/dist/js/component/alert.cjs.js +3 -0
  57. package/dist/js/component/alert.esm.js +529 -0
  58. package/dist/js/component/alert.iife.js +3 -0
  59. package/dist/js/component/carousel.cjs.js +3 -0
  60. package/dist/js/component/carousel.esm.js +1110 -0
  61. package/dist/js/component/carousel.iife.js +3 -0
  62. package/dist/js/graupl.cjs.js +5 -0
  63. package/dist/js/graupl.esm.js +1462 -0
  64. package/dist/js/graupl.iife.js +5 -0
  65. package/index.html +56 -2
  66. package/index.js +12 -0
  67. package/package.json +26 -5
  68. package/scss/component/accordion.scss +3 -0
  69. package/src/js/accordion/Accordion.js +1163 -0
  70. package/src/js/accordion/AccordionItem.js +496 -0
  71. package/src/js/accordion/index.js +10 -0
  72. package/src/js/alert/Alert.js +71 -1
  73. package/src/js/alert/index.js +1 -11
  74. package/src/js/carousel/Carousel.js +67 -16
  75. package/src/js/carousel/index.js +1 -11
  76. package/src/js/eventHandlers.js +7 -0
  77. package/src/js/storage.js +106 -0
  78. package/src/scss/_defaults.scss +29 -0
  79. package/src/scss/base/button/_mixins.scss +64 -62
  80. package/src/scss/component/_index.scss +1 -0
  81. package/src/scss/component/accordion/_defaults.scss +40 -0
  82. package/src/scss/component/accordion/_index.scss +180 -0
  83. package/src/scss/component/accordion/_variables.scss +304 -0
  84. package/src/scss/component/carousel/_index.scss +6 -0
  85. package/src/scss/layout/columns/_index.scss +1 -1
  86. package/src/scss/layout/flex-columns/_index.scss +1 -1
  87. package/src/scss/state/focus/_index.scss +6 -6
  88. package/src/scss/state/focus/_mixins.scss +15 -0
  89. package/stylelint.config.js +4 -0
  90. package/vite.config.js +57 -0
  91. package/dist/base/button.css +0 -2
  92. package/dist/base/button.css.map +0 -1
  93. package/dist/base/form.css.map +0 -1
  94. package/dist/base/link.css.map +0 -1
  95. package/dist/base/table.css.map +0 -1
  96. package/dist/base.css +0 -2
  97. package/dist/base.css.map +0 -1
  98. package/dist/component/alert.css +0 -2
  99. package/dist/component/alert.css.map +0 -1
  100. package/dist/component/card.css.map +0 -1
  101. package/dist/component/carousel.css +0 -2
  102. package/dist/component/carousel.css.map +0 -1
  103. package/dist/component/input-group.css.map +0 -1
  104. package/dist/component/menu.css.map +0 -1
  105. package/dist/component/navigation.css.map +0 -1
  106. package/dist/component.css +0 -2
  107. package/dist/component.css.map +0 -1
  108. package/dist/graupl.css +0 -2
  109. package/dist/graupl.css.map +0 -1
  110. package/dist/init.css.map +0 -1
  111. package/dist/layout/columns.css.map +0 -1
  112. package/dist/layout/container.css.map +0 -1
  113. package/dist/layout/flex-columns.css.map +0 -1
  114. package/dist/layout.css +0 -2
  115. package/dist/layout.css.map +0 -1
  116. package/dist/normalize.css.map +0 -1
  117. package/dist/state/focus.css +0 -2
  118. package/dist/state/focus.css.map +0 -1
  119. package/dist/state.css +0 -2
  120. package/dist/state.css.map +0 -1
  121. package/dist/theme/color.css.map +0 -1
  122. package/dist/theme/typography.css.map +0 -1
  123. package/dist/theme.css.map +0 -1
  124. package/dist/utilities/alignment.css.map +0 -1
  125. package/dist/utilities/color.css.map +0 -1
  126. package/dist/utilities/display.css.map +0 -1
  127. package/dist/utilities/flex.css.map +0 -1
  128. package/dist/utilities/height.css.map +0 -1
  129. package/dist/utilities/inset.css.map +0 -1
  130. package/dist/utilities/justification.css.map +0 -1
  131. package/dist/utilities/list.css.map +0 -1
  132. package/dist/utilities/order.css.map +0 -1
  133. package/dist/utilities/postion.css.map +0 -1
  134. package/dist/utilities/spacing.css.map +0 -1
  135. package/dist/utilities/typography.css.map +0 -1
  136. package/dist/utilities/visibility.css.map +0 -1
  137. package/dist/utilities/width.css.map +0 -1
  138. package/dist/utilities.css.map +0 -1
  139. /package/dist/{base → css/base}/form.css +0 -0
  140. /package/dist/{base → css/base}/link.css +0 -0
  141. /package/dist/{base → css/base}/table.css +0 -0
  142. /package/dist/{component → css/component}/card.css +0 -0
  143. /package/dist/{component → css/component}/input-group.css +0 -0
  144. /package/dist/{component → css/component}/menu.css +0 -0
  145. /package/dist/{component → css/component}/navigation.css +0 -0
  146. /package/dist/{init.css → css/init.css} +0 -0
  147. /package/dist/{layout → css/layout}/columns.css +0 -0
  148. /package/dist/{layout → css/layout}/container.css +0 -0
  149. /package/dist/{layout → css/layout}/flex-columns.css +0 -0
  150. /package/dist/{normalize.css → css/normalize.css} +0 -0
  151. /package/dist/{theme → css/theme}/color.css +0 -0
  152. /package/dist/{theme → css/theme}/typography.css +0 -0
  153. /package/dist/{theme.css → css/theme.css} +0 -0
  154. /package/dist/{utilities → css/utilities}/alignment.css +0 -0
  155. /package/dist/{utilities → css/utilities}/color.css +0 -0
  156. /package/dist/{utilities → css/utilities}/display.css +0 -0
  157. /package/dist/{utilities → css/utilities}/flex.css +0 -0
  158. /package/dist/{utilities → css/utilities}/height.css +0 -0
  159. /package/dist/{utilities → css/utilities}/inset.css +0 -0
  160. /package/dist/{utilities → css/utilities}/justification.css +0 -0
  161. /package/dist/{utilities → css/utilities}/list.css +0 -0
  162. /package/dist/{utilities → css/utilities}/order.css +0 -0
  163. /package/dist/{utilities → css/utilities}/postion.css +0 -0
  164. /package/dist/{utilities → css/utilities}/spacing.css +0 -0
  165. /package/dist/{utilities → css/utilities}/typography.css +0 -0
  166. /package/dist/{utilities → css/utilities}/visibility.css +0 -0
  167. /package/dist/{utilities → css/utilities}/width.css +0 -0
  168. /package/dist/{utilities.css → css/utilities.css} +0 -0
@@ -5,6 +5,7 @@
5
5
 
6
6
  import { addClass, removeClass } from "../domHelpers.js";
7
7
  import { preventEvent, keyPress } from "../eventHandlers.js";
8
+ import storage from "../storage.js";
8
9
  import {
9
10
  isQuerySelector,
10
11
  isTag,
@@ -200,6 +201,15 @@ class Carousel {
200
201
  */
201
202
  _prefix = "graupl-";
202
203
 
204
+ /**
205
+ * The key used to generate IDs throughout the carousel.
206
+ *
207
+ * @protected
208
+ *
209
+ * @type {string}
210
+ */
211
+ _key = "";
212
+
203
213
  /**
204
214
  * An array of error messages generated by the carousel.
205
215
  *
@@ -233,7 +243,8 @@ class Carousel {
233
243
  * @param {number} [options.transitionDuration = 500] - The duration time (in milliseconds) for the transition between carousel items.
234
244
  * @param {?string} [options.playText = Play] - The text to use for the play button.
235
245
  * @param {?string} [options.pauseText = Pause] - The text to use for the pause button.
236
- * @param {?string} [options.prefix = graupl-] - The prefix to use for CSS custom properties.
246
+ * @param {?string} [options.prefix = graupl-] - The prefix to use for CSS custom properties.
247
+ * @param {?string} [options.key = null] - The key used to generate IDs throughout the carousel.
237
248
  * @param {boolean} [options.initialize = false] - A flag to initialize the carousel immediately upon creation.
238
249
  */
239
250
  constructor({
@@ -258,6 +269,7 @@ class Carousel {
258
269
  playText = "Play",
259
270
  pauseText = "Pause",
260
271
  prefix = "graupl-",
272
+ key = null,
261
273
  initialize = false,
262
274
  }) {
263
275
  // Set DOM elements.
@@ -295,6 +307,9 @@ class Carousel {
295
307
  // Set prefix.
296
308
  this._prefix = prefix || "";
297
309
 
310
+ // Set the key.
311
+ this._key = key || "";
312
+
298
313
  if (initialize) {
299
314
  this.initialize();
300
315
  }
@@ -313,21 +328,15 @@ class Carousel {
313
328
  );
314
329
  }
315
330
 
316
- // Set DOM elements.
331
+ // Set up the DOM.
332
+ this._generateKey();
317
333
  this._setDOMElements();
318
-
319
- // Set ids.
320
334
  this._setIds();
321
-
322
- // Set aria attributes.
323
335
  this._setAriaAttributes();
324
336
 
325
337
  // Activate the first item.
326
338
  this.activateFirstItem();
327
339
 
328
- // Set the custom props.
329
- this._setTransitionDuration();
330
-
331
340
  // Handle events.
332
341
  this._handleAutoplay();
333
342
  this._handleFocus();
@@ -335,6 +344,13 @@ class Carousel {
335
344
  this._handleHover();
336
345
  this._handleKeydown();
337
346
  this._handleKeyup();
347
+
348
+ // Set the custom props.
349
+ this._setTransitionDuration();
350
+
351
+ // Set up the storage.
352
+ storage.initializeStorage("carousels");
353
+ storage.pushToStorage("carousels", this.dom.carousel.id, this);
338
354
  } catch (error) {
339
355
  console.error(error);
340
356
  }
@@ -520,6 +536,17 @@ class Carousel {
520
536
  return this._prefix;
521
537
  }
522
538
 
539
+ /**
540
+ * The key used to generate IDs throughout the accordion.
541
+ *
542
+ * @type {string}
543
+ *
544
+ * @see _key
545
+ */
546
+ get key() {
547
+ return this._key;
548
+ }
549
+
523
550
  /**
524
551
  * The current action being performed by the carousel.
525
552
  *
@@ -659,6 +686,14 @@ class Carousel {
659
686
  }
660
687
  }
661
688
 
689
+ set key(value) {
690
+ isValidType("string", { value });
691
+
692
+ if (this._key !== value) {
693
+ this._key = value;
694
+ }
695
+ }
696
+
662
697
  /**
663
698
  * Validates all aspects of the carousel to ensure proper functionality.
664
699
  *
@@ -941,20 +976,36 @@ class Carousel {
941
976
  }
942
977
 
943
978
  /**
944
- * Sets the ids for the carousel items and tabs.
979
+ * Generates a key for the carousel.
980
+ *
981
+ * @param {boolean} [regenerate = false] - A flag to determine if the key should be regenerated.
982
+ */
983
+ _generateKey(regenerate = false) {
984
+ if (this.key === "" || regenerate) {
985
+ this.key = Math.random()
986
+ .toString(36)
987
+ .replace(/[^a-z]+/g, "")
988
+ .substring(0, 10);
989
+ }
990
+ }
991
+
992
+ /**
993
+ * Sets the IDs of the carousel and it's children if they do not already exist.
994
+ *
995
+ * The generated IDs use the key and follow the format:
996
+ * - carousel: `carousel-${key}`
997
+ * - carousel items: `carousel-item-${key}-${index}`
998
+ * - carousel tabs: `carousel-tab-${key}-${index}`
945
999
  */
946
1000
  _setIds() {
947
- const randomString = Math.random()
948
- .toString(36)
949
- .replace(/[^a-z]+/g, "")
950
- .substring(0, 10);
1001
+ this.dom.carousel.id = this.dom.carousel.id || `carousel-${this.key}`;
951
1002
 
952
1003
  this.dom.carouselItems.forEach((item, index) => {
953
- item.id = item.id || `carousel-item-${randomString}-${index}`;
1004
+ item.id = item.id || `carousel-item-${this.key}-${index}`;
954
1005
  });
955
1006
 
956
1007
  this.dom.carouselTabs.forEach((tab, index) => {
957
- tab.id = tab.id || `carousel-tab-${randomString}-${index}`;
1008
+ tab.id = tab.id || `carousel-tab-${this.key}-${index}`;
958
1009
  });
959
1010
  }
960
1011
 
@@ -1,20 +1,10 @@
1
1
  import Carousel from "./Carousel.js";
2
2
 
3
3
  document.addEventListener("DOMContentLoaded", () => {
4
- const carousels = [];
5
-
6
4
  document.querySelectorAll(".carousel").forEach((carouselElement) => {
7
- const carousel = new Carousel({
5
+ new Carousel({
8
6
  carouselElement,
9
7
  initialize: true,
10
8
  });
11
-
12
- carousels.push(carousel);
13
9
  });
14
-
15
- const graupl = window.Graupl || {};
16
-
17
- graupl.carousels = carousels;
18
-
19
- window.Graupl = graupl;
20
10
  });
@@ -12,6 +12,13 @@ export function keyPress(event) {
12
12
  Enter: key === "Enter" || key === 13,
13
13
  Space: key === " " || key === "Spacebar" || key === 32,
14
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,
15
22
  };
16
23
 
17
24
  return Object.keys(keys).find((key) => keys[key] === true) || "";
@@ -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
+ };
@@ -31,6 +31,7 @@ $base-screen-size-triggers: (
31
31
  navigation-collapse: "(width <= 72ch)",
32
32
  navigation-expand: "(72ch < width)",
33
33
  force-vertical-card: "(width <= 72ch)",
34
+ force-single-column: "(width <= 48ch)",
34
35
  );
35
36
  $custom-screen-size-triggers: () !default;
36
37
  $screen-size-triggers: map.merge(
@@ -81,3 +82,31 @@ $transition-durations: map.merge(
81
82
  $base-transition-durations,
82
83
  $custom-transition-durations
83
84
  );
85
+
86
+ // State selectors.
87
+ $base-state-selectors: (
88
+ visited: (
89
+ ".visited",
90
+ ":visited",
91
+ ),
92
+ focus: (
93
+ ".focus",
94
+ ":focus-visible",
95
+ ),
96
+ hover: (
97
+ ".hover",
98
+ ":hover",
99
+ ),
100
+ active: (
101
+ ".active",
102
+ ":active",
103
+ ),
104
+ disabled: (
105
+ ".disabled",
106
+ ":disabled",
107
+ "[disabled]",
108
+ "[aria-disabled=true]",
109
+ ),
110
+ );
111
+ $custom-state-selectors: () !default;
112
+ $state-selectors: map.merge($base-state-selectors, $custom-state-selectors);
@@ -56,41 +56,42 @@
56
56
  font-size: $font-size;
57
57
  cursor: pointer;
58
58
 
59
- &:visited,
60
- &#{defaults.$button-visited-selector} {
61
- --#{root-defaults.$prefix}-button-transform: #{$visited-transform};
59
+ @each $selector in map.get(root-defaults.$state-selectors, visited) {
60
+ &#{$selector} {
61
+ --#{root-defaults.$prefix}-button-transform: #{$visited-transform};
62
+ }
62
63
  }
63
64
 
64
- &:focus-visible,
65
- &#{defaults.$button-focus-selector} {
66
- --#{root-defaults.$prefix}-button-transform: #{$focus-transform};
65
+ @each $selector in map.get(root-defaults.$state-selectors, focus) {
66
+ &#{$selector} {
67
+ --#{root-defaults.$prefix}-button-transform: #{$focus-transform};
68
+ }
67
69
  }
68
70
 
69
- &:hover,
70
- &#{defaults.$button-hover-selector} {
71
- --#{root-defaults.$prefix}-button-transform: #{$hover-transform};
71
+ @each $selector in map.get(root-defaults.$state-selectors, hover) {
72
+ &#{$selector} {
73
+ --#{root-defaults.$prefix}-button-transform: #{$hover-transform};
74
+ }
72
75
  }
73
76
 
74
- &:active,
75
- &#{defaults.$button-active-selector} {
76
- --#{root-defaults.$prefix}-button-transform: #{$active-transform};
77
+ @each $selector in map.get(root-defaults.$state-selectors, active) {
78
+ &#{$selector} {
79
+ --#{root-defaults.$prefix}-button-transform: #{$active-transform};
80
+ }
77
81
  }
78
82
 
79
- &:disabled,
80
- &[disabled],
81
- &#{defaults.$button-disabled-selector} {
82
- cursor: not-allowed;
83
-
84
- &,
85
- &:visited,
86
- &#{defaults.$button-visited-selector},
87
- &:focus-visible,
88
- &#{defaults.$button-focus-selector},
89
- &:hover,
90
- &#{defaults.$button-hover-selector},
91
- &:active,
92
- &#{defaults.$button-active-selector} {
93
- --#{root-defaults.$prefix}-button-transform: #{$disabled-transform};
83
+ @each $selector in map.get(root-defaults.$state-selectors, disabled) {
84
+ &#{$selector} {
85
+ @each $state, $selectors in root-defaults.$state-selectors {
86
+ @each $selector in $selectors {
87
+ &,
88
+ &#{$selector} {
89
+ --#{root-defaults.$prefix}-button-transform: #{$disabled-transform};
90
+
91
+ cursor: not-allowed;
92
+ }
93
+ }
94
+ }
94
95
  }
95
96
  }
96
97
 
@@ -115,49 +116,50 @@
115
116
  }
116
117
  }
117
118
 
118
- &:visited,
119
- &#{defaults.$button-visited-selector} {
120
- --#{root-defaults.$prefix}-button-border-color: #{$visited-border-color};
121
- --#{root-defaults.$prefix}-button-background: #{$visited-background};
122
- --#{root-defaults.$prefix}-button-color: #{$visited-color};
119
+ @each $selector in map.get(root-defaults.$state-selectors, visited) {
120
+ &#{$selector} {
121
+ --#{root-defaults.$prefix}-button-border-color: #{$visited-border-color};
122
+ --#{root-defaults.$prefix}-button-background: #{$visited-background};
123
+ --#{root-defaults.$prefix}-button-color: #{$visited-color};
124
+ }
123
125
  }
124
126
 
125
- &:focus-visible,
126
- &#{defaults.$button-focus-selector} {
127
- --#{root-defaults.$prefix}-button-border-color: #{$focus-border-color};
128
- --#{root-defaults.$prefix}-button-background: #{$focus-background};
129
- --#{root-defaults.$prefix}-button-color: #{$focus-color};
127
+ @each $selector in map.get(root-defaults.$state-selectors, focus) {
128
+ &#{$selector} {
129
+ --#{root-defaults.$prefix}-button-border-color: #{$focus-border-color};
130
+ --#{root-defaults.$prefix}-button-background: #{$focus-background};
131
+ --#{root-defaults.$prefix}-button-color: #{$focus-color};
132
+ }
130
133
  }
131
134
 
132
- &:hover,
133
- &#{defaults.$button-hover-selector} {
134
- --#{root-defaults.$prefix}-button-border-color: #{$hover-border-color};
135
- --#{root-defaults.$prefix}-button-background: #{$hover-background};
136
- --#{root-defaults.$prefix}-button-color: #{$hover-color};
135
+ @each $selector in map.get(root-defaults.$state-selectors, hover) {
136
+ &#{$selector} {
137
+ --#{root-defaults.$prefix}-button-border-color: #{$hover-border-color};
138
+ --#{root-defaults.$prefix}-button-background: #{$hover-background};
139
+ --#{root-defaults.$prefix}-button-color: #{$hover-color};
140
+ }
137
141
  }
138
142
 
139
- &:active,
140
- &#{defaults.$button-active-selector} {
141
- --#{root-defaults.$prefix}-button-border-color: #{$active-border-color};
142
- --#{root-defaults.$prefix}-button-background: #{$active-background};
143
- --#{root-defaults.$prefix}-button-color: #{$active-color};
143
+ @each $selector in map.get(root-defaults.$state-selectors, active) {
144
+ &#{$selector} {
145
+ --#{root-defaults.$prefix}-button-border-color: #{$active-border-color};
146
+ --#{root-defaults.$prefix}-button-background: #{$active-background};
147
+ --#{root-defaults.$prefix}-button-color: #{$active-color};
148
+ }
144
149
  }
145
150
 
146
- &:disabled,
147
- &[disabled],
148
- &#{defaults.$button-disabled-selector} {
149
- &,
150
- &:visited,
151
- &#{defaults.$button-visited-selector},
152
- &:focus-visible,
153
- &#{defaults.$button-focus-selector},
154
- &:hover,
155
- &#{defaults.$button-hover-selector},
156
- &:active,
157
- &#{defaults.$button-active-selector} {
158
- --#{root-defaults.$prefix}-button-border-color: #{$disabled-border-color};
159
- --#{root-defaults.$prefix}-button-background: #{$disabled-background};
160
- --#{root-defaults.$prefix}-button-color: #{$disabled-color};
151
+ @each $selector in map.get(root-defaults.$state-selectors, disabled) {
152
+ &#{$selector} {
153
+ @each $state, $selectors in root-defaults.$state-selectors {
154
+ @each $selector in $selectors {
155
+ &,
156
+ &#{$selector} {
157
+ --#{root-defaults.$prefix}-button-border-color: #{$disabled-border-color};
158
+ --#{root-defaults.$prefix}-button-background: #{$disabled-background};
159
+ --#{root-defaults.$prefix}-button-color: #{$disabled-color};
160
+ }
161
+ }
162
+ }
161
163
  }
162
164
  }
163
165
  }
@@ -1,6 +1,7 @@
1
1
  // @graupl/graupl component styles.
2
2
 
3
3
  @forward "alert";
4
+ @forward "accordion";
4
5
  @forward "card";
5
6
  @forward "carousel";
6
7
  @forward "input-group";
@@ -0,0 +1,40 @@
1
+ // @graupl/graupl accordion component default values.
2
+ //
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.
8
+
9
+ @use "sass:map";
10
+
11
+ // Accordion selectors.
12
+ $accordion-selector: ".accordion" !default;
13
+ $accordion-item-selector: ".accordion-item" !default;
14
+ $accordion-item-header-selector: ".accordion-item-header" !default;
15
+ $accordion-item-title-selector: ".accordion-item-title" !default;
16
+ $accordion-item-toggle-selector: ".accordion-item-toggle" !default;
17
+ $accordion-item-content-selector: ".accordion-item-content" !default;
18
+ $accordion-item-body-selector: ".accordion-item-body" !default;
19
+ $accordion-item-footer-selector: ".accordion-item-footer" !default;
20
+ $accordion-item-open-selector: ".show" !default;
21
+ $accordion-item-close-selector: ".hide" !default;
22
+ $accordion-item-transition-selector: ".transitioning" !default;
23
+ $accordion-item-toggle-pseudo-selector: "::after" !default;
24
+
25
+ // Toggle transform properties.
26
+ $accordion-item-toggle-transform: none !default;
27
+ $accordion-item-toggle-visited-transform: $accordion-item-toggle-transform !default;
28
+ $accordion-item-toggle-focus-transform: $accordion-item-toggle-transform !default;
29
+ $accordion-item-toggle-hover-transform: $accordion-item-toggle-transform !default;
30
+ $accordion-item-toggle-active-transform: $accordion-item-toggle-transform !default;
31
+ $accordion-item-toggle-disabled-transform: $accordion-item-toggle-transform !default;
32
+ $accordion-item-toggle-pseudo-transform: none !default;
33
+ $accordion-item-toggle-pseudo-open-transform: rotate(-180deg) !default;
34
+
35
+ // Toggle properties.
36
+ $accordion-item-toggle-pseudo-content: "▼" !default;
37
+
38
+ // Accordion transform properties.
39
+ $accordion-item-content-transform: translateY(-100%) !default;
40
+ $accordion-item-content-open-transform: translateY(0) !default;