@madgex/design-system 1.23.10 → 1.24.1

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 (42) hide show
  1. package/__tests__/unit/src/components/accordion.spec.js +84 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +79 -0
  4. package/coverage/cobertura-coverage.xml +419 -0
  5. package/coverage/components/accordion/accordion.js.html +393 -0
  6. package/coverage/components/accordion/index.html +97 -0
  7. package/coverage/components/tabs/index.html +97 -0
  8. package/coverage/components/tabs/tabs.js.html +516 -0
  9. package/coverage/index.html +149 -0
  10. package/coverage/js/common.js.html +105 -0
  11. package/coverage/js/index-polyfills.js.html +75 -0
  12. package/coverage/js/index.html +123 -0
  13. package/coverage/js/index.js.html +123 -0
  14. package/coverage/js/polyfills/closest.js.html +117 -0
  15. package/coverage/js/polyfills/index.html +97 -0
  16. package/coverage/prettify.css +1 -0
  17. package/coverage/prettify.js +2 -0
  18. package/coverage/sort-arrow-sprite.png +0 -0
  19. package/coverage/sorter.js +170 -0
  20. package/coverage/tokens/_config.js.html +552 -0
  21. package/coverage/tokens/index.html +97 -0
  22. package/dist/_tokens/css/_tokens.css +1 -1
  23. package/dist/_tokens/js/_tokens-module.js +1 -1
  24. package/dist/_tokens/scss/_tokens.scss +1 -1
  25. package/dist/css/index.css +1 -1
  26. package/dist/js/index.js +2 -2
  27. package/fractal.js +1 -0
  28. package/jest.config.js +6 -0
  29. package/package.json +6 -3
  30. package/src/components/accordion/README.md +15 -0
  31. package/src/components/accordion/_macro.njk +3 -0
  32. package/src/components/accordion/_template.njk +35 -0
  33. package/src/components/accordion/accordion.config.js +43 -0
  34. package/src/components/accordion/accordion.js +108 -0
  35. package/src/components/accordion/accordion.njk +15 -0
  36. package/src/components/accordion/accordion.scss +15 -0
  37. package/src/components/button/button.config.js +7 -0
  38. package/src/components/button/button.scss +13 -1
  39. package/src/components/icons/README.md +5 -0
  40. package/src/components/icons/_template.njk +8 -1
  41. package/src/js/index.js +2 -0
  42. package/src/scss/components/__index.scss +2 -1
@@ -0,0 +1,108 @@
1
+ const accordionClass = 'mds-accordion';
2
+ const accordionTriggerClass = 'mds-accordion__trigger';
3
+ const accordionTriggerButtonClass = 'mds-accordion__trigger-button';
4
+ const accordionExpandedClass = 'mds-accordion--expanded';
5
+ const accordionLabelInverseData = 'data-labelinverse';
6
+ const accordionTriggerLabelClass = 'mds-accordion__trigger-label';
7
+
8
+ const accordion = {
9
+ init: () => {
10
+ const accordionList = Array.from(document.querySelectorAll(`.${accordionClass}`));
11
+ const screenWidth = window.innerWidth;
12
+
13
+ accordionList.forEach((element) => {
14
+ const isAccordion = accordion.checkBreakpoint(element, screenWidth);
15
+ if (isAccordion) {
16
+ accordion.setAccordion(element);
17
+ } else {
18
+ element.classList.add(accordionExpandedClass);
19
+ }
20
+ });
21
+ },
22
+ checkBreakpoint: (element, screenWidth) => {
23
+ let breakpoint = 0;
24
+
25
+ if (element.dataset.bp) {
26
+ const breakpointValue = element.dataset.bp.replace(/\D/g, '');
27
+ const breakpointUnit = element.dataset.bp.replace(/[0-9]/g, '');
28
+ let fontSize;
29
+ let conversionValue;
30
+
31
+ switch (breakpointUnit) {
32
+ case 'px':
33
+ breakpoint = breakpointValue;
34
+ break;
35
+ case 'em':
36
+ fontSize = window.getComputedStyle(document.querySelector('body'))['font-size'];
37
+ conversionValue = breakpointValue * parseFloat(fontSize);
38
+ breakpoint = conversionValue;
39
+ break;
40
+ case 'rem':
41
+ fontSize = window.getComputedStyle(document.querySelector('body'))['font-size'];
42
+ conversionValue = breakpointValue * parseFloat(fontSize);
43
+ breakpoint = conversionValue;
44
+ break;
45
+ default:
46
+ return true;
47
+ }
48
+
49
+ if (screenWidth > breakpoint) {
50
+ return false;
51
+ }
52
+
53
+ return true;
54
+ }
55
+ return true;
56
+ },
57
+ setAccordion: (element) => {
58
+ const accordionId = element.id;
59
+ const accordionTrigger = element.querySelector(`.${accordionTriggerClass}`);
60
+ const accordionTriggerButton = accordion.createButton(accordionId, element);
61
+ accordionTrigger.classList.remove('mds-display-none');
62
+ accordionTrigger.innerHTML = '';
63
+ accordionTrigger.appendChild(accordionTriggerButton);
64
+
65
+ accordionTriggerButton.addEventListener('click', (elem) => {
66
+ elem.preventDefault();
67
+ accordion.toggleExpand(accordionTriggerButton);
68
+ });
69
+ },
70
+ createButton: (accordionId, element) => {
71
+ const accordionTriggerSpan = element.querySelector(`.${accordionTriggerClass} > span`);
72
+ const accordionTriggerButton = document.createElement('button');
73
+ accordionTriggerButton.className = accordionTriggerButtonClass;
74
+ accordionTriggerButton.classList.add('mds-button', 'mds-button--plain', 'mds-padding-b0');
75
+ accordionTriggerButton.setAttribute('id', `accordion-trigger-${accordionId}`);
76
+ accordionTriggerButton.setAttribute('aria-expanded', false);
77
+ accordionTriggerButton.setAttribute('aria-controls', `accordion-content-${accordionId}`);
78
+ accordionTriggerButton.append(accordionTriggerSpan);
79
+
80
+ return accordionTriggerButton;
81
+ },
82
+ switchLabel: (e) => {
83
+ const element = e;
84
+
85
+ if (element.dataset.labelinverse) {
86
+ const labelToInverse = element.textContent;
87
+ element.textContent = element.dataset.labelinverse;
88
+ element.setAttribute(accordionLabelInverseData, labelToInverse);
89
+ }
90
+ return element;
91
+ },
92
+ toggleExpand: (e) => {
93
+ const accordionTriggerButton = e;
94
+ const accordionTriggerButtonLabel = e.querySelector(`.${accordionTriggerLabelClass}`);
95
+ const accordionParent = accordionTriggerButton.closest(`.${accordionClass}`);
96
+
97
+ if (accordionTriggerButton.getAttribute('aria-expanded') === 'false') {
98
+ accordionTriggerButton.setAttribute('aria-expanded', true);
99
+ accordionParent.classList.add(accordionExpandedClass);
100
+ } else {
101
+ accordionTriggerButton.setAttribute('aria-expanded', false);
102
+ accordionParent.classList.remove(accordionExpandedClass);
103
+ }
104
+ accordion.switchLabel(accordionTriggerButtonLabel);
105
+ },
106
+ };
107
+
108
+ export default accordion;
@@ -0,0 +1,15 @@
1
+ {% from "./accordion/_macro.njk" import MdsAccordion %}
2
+
3
+ <h3>{{ name }}</h3>
4
+ {{ MdsAccordion({
5
+ id: id,
6
+ name: name,
7
+ triggerLabel: triggerLabel,
8
+ triggerLabelActive: triggerLabelActive,
9
+ triggerNoJsHidden: triggerNoJsHidden,
10
+ triggerIsHeader: triggerIsHeader,
11
+ headerClass: headerClass,
12
+ breakpoint: breakpoint,
13
+ content: content
14
+ }) }}
15
+ <hr />
@@ -0,0 +1,15 @@
1
+ .js .mds-accordion .mds-accordion__content{
2
+ display: none;
3
+ }
4
+
5
+ .js .mds-accordion.mds-accordion--expanded .mds-accordion__content{
6
+ display: block;
7
+ }
8
+
9
+ html:not(.js) .mds-accordion .mds-accordion__trigger .mds-icon{
10
+ display: none;
11
+ }
12
+
13
+ .mds-accordion:not(.mds-accordion--expanded) .mds-icon{
14
+ transform: rotate(90deg);
15
+ }
@@ -19,6 +19,13 @@ module.exports = {
19
19
  text: 'Input button 3',
20
20
  },
21
21
  },
22
+ {
23
+ name: 'plain-buttons',
24
+ context: {
25
+ text: 'Plain button',
26
+ classes: 'mds-button--plain',
27
+ },
28
+ },
22
29
  {
23
30
  name: 'small-buttons',
24
31
  context: {
@@ -48,4 +48,16 @@ $mds-color-button-text-hover: $mds-color-button-text !default;
48
48
 
49
49
  .mds-button--large {
50
50
  padding: ($mds-size-baseline * 4) ($mds-size-baseline * 6);
51
- }
51
+ }
52
+
53
+ .mds-button--plain {
54
+ background-color: transparent;
55
+ color: $mds-color-link;
56
+
57
+ &:hover,
58
+ &:focus {
59
+ background-color: transparent;
60
+ color: $mds-color-link-hover;
61
+ text-decoration: underline;
62
+ }
63
+ }
@@ -5,6 +5,11 @@
5
5
  - `path`: if you need to use a different path than the default (*/assets/icons.svg*)
6
6
  - `visuallyHiddenLabel`: add a visually hidden label (see Accessibility notes below)
7
7
 
8
+ **Note regarding the default path of the icons file**:
9
+ If you would like to change the default path, you can use the `defaultIconPath` variable in Nunjucks. You can set it as global variable like this:
10
+
11
+ `env.addGlobal('defaultIconPath', value)`
12
+
8
13
  ## Accessibility
9
14
 
10
15
  The SVGs are hidden from screen readers by default (with the use of `aria-hidden=true` and `focusable=false`). When the icons are used without a visible label, a **visually hidden label needs to be added** instead.
@@ -1,5 +1,12 @@
1
+ {% set iconPath %}
2
+ {% if defaultIconPath %}
3
+ {{ defaultIconPath }}
4
+ {% else %}
5
+ '/assets/icons.svg'
6
+ {% endif %}
7
+ {% endset %}
1
8
  <svg aria-hidden="true" focusable="false" class="mds-icon mds-icon--{{ params.iconName }}{% if params.classes %} {{ params.classes }}{% endif %}">
2
- <use href="{{ params.path | default('/assets/icons.svg') }}#{{ params.iconName }}" />
9
+ <use href="{{ params.path | default(iconPath) }}#{{ params.iconName }}" />
3
10
  </svg>
4
11
  {%- if params.visuallyHiddenLabel %}
5
12
  <span class="mds-visually-hidden">{{ params.visuallyHiddenLabel }}</span>
package/src/js/index.js CHANGED
@@ -10,7 +10,9 @@
10
10
  import './common';
11
11
 
12
12
  import tabs from '../components/tabs/tabs';
13
+ import accordion from '../components/accordion/accordion';
13
14
 
14
15
  document.addEventListener('DOMContentLoaded', () => {
15
16
  tabs.init();
17
+ accordion.init();
16
18
  });
@@ -4,4 +4,5 @@
4
4
  @import '../../components/section-title/section-title';
5
5
  @import '../../components/tabs/tabs';
6
6
  @import '../../components/input/input';
7
- @import '../../components/textarea/textarea';
7
+ @import '../../components/textarea/textarea';
8
+ @import '../../components/accordion/accordion';