mp-design-system 0.9.29 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/build/js/app.js +1 -1
- package/dist/build/js/app.js.map +1 -1
- package/dist/build/scss/library.css +1 -1
- package/dist/build/scss/library.css.map +1 -1
- package/dist/build/scss/main.css +1 -1
- package/dist/build/scss/main.css.map +1 -1
- package/package.json +1 -1
- package/src/_includes/components/button/button.config.js +6 -0
- package/src/_includes/components/button/button.scss +7 -0
- package/src/_includes/components/card/card.config.js +143 -1
- package/src/_includes/components/card/card.scss +13 -0
- package/src/_includes/components/input/checkbox.config.js +6 -0
- package/src/_includes/components/input/checkbox.njk +2 -2
- package/src/_includes/components/input/input.config.js +6 -0
- package/src/_includes/components/input/input.njk +1 -1
- package/src/_includes/components/input/input.scss +11 -0
- package/src/_includes/components/input/radio.config.js +6 -0
- package/src/_includes/components/input/radio.njk +2 -2
- package/src/_includes/components/input/radio.scss +13 -0
- package/src/_includes/components/input/select.config.js +6 -0
- package/src/_includes/components/input/select.njk +1 -1
- package/src/_includes/components/input/textarea.config.js +6 -0
- package/src/_includes/components/input/textarea.njk +1 -1
- package/src/_includes/components/input/toggle.config.js +6 -0
- package/src/_includes/components/input/toggle.njk +2 -2
- package/src/_includes/components/input/toggle.scss +16 -0
- package/src/_includes/components/tabs/tabs.config.js +5 -5
- package/src/_includes/components/tabs/tabs.njk +1 -1
- package/src/_includes/components/tabs/tabs.scss +4 -0
- package/src/_includes/components/twi/twi.njk +1 -1
- package/src/_includes/includes/system-scripts.njk +1 -1
- package/src/_includes/layout.njk +1 -0
- package/src/_includes/system-home-page.njk +1 -0
- package/src/assets/js/app.js +2 -0
- package/src/assets/js/imports/off-canvas.js +97 -0
- package/src/assets/scss/elements/reset.scss +0 -7
- package/src/assets/scss/objects/index.scss +1 -0
- package/src/assets/scss/objects/off-canvas.scss +85 -0
- package/src/assets/scss/utilities/link.scss +1 -0
- package/src/components/iconography.njk +3 -0
- package/src/index.njk +14 -7
- package/src/patterns/form.njk +324 -151
- package/src/patterns/off-canvas.njk +42 -0
- package/src/prototype/index.njk +2 -2
- package/src/static/svg/sprite.svg +41 -20
package/package.json
CHANGED
@@ -737,7 +737,45 @@ module.exports = {
|
|
737
737
|
}
|
738
738
|
},
|
739
739
|
{
|
740
|
-
title: '
|
740
|
+
title: 'In-person event card',
|
741
|
+
preview: 'content-width',
|
742
|
+
context: {
|
743
|
+
theme: {
|
744
|
+
border: false,
|
745
|
+
size: 'small',
|
746
|
+
layout: 'multi',
|
747
|
+
name: 'event',
|
748
|
+
inlineSpecs: true,
|
749
|
+
corner: true,
|
750
|
+
},
|
751
|
+
header: {
|
752
|
+
title: 'Discover how on-line particle sizing optimises mining analytics.',
|
753
|
+
date: {
|
754
|
+
date: new Date(),
|
755
|
+
time: '11:00 – 12:00',
|
756
|
+
timezone: 'EST'
|
757
|
+
},
|
758
|
+
meta: [
|
759
|
+
'English'
|
760
|
+
],
|
761
|
+
},
|
762
|
+
body: {
|
763
|
+
keySpecs: [
|
764
|
+
{
|
765
|
+
title: 'Products',
|
766
|
+
term: 'Morphologi G3-ID'
|
767
|
+
},
|
768
|
+
{
|
769
|
+
title: 'Technologies',
|
770
|
+
term: 'Morphologically-Directed Raman Spectroscopy'
|
771
|
+
}
|
772
|
+
]
|
773
|
+
},
|
774
|
+
link: '#'
|
775
|
+
}
|
776
|
+
},
|
777
|
+
{
|
778
|
+
title: 'In-person event card with image',
|
741
779
|
preview: 'content-width',
|
742
780
|
context: {
|
743
781
|
theme: {
|
@@ -778,9 +816,113 @@ module.exports = {
|
|
778
816
|
link: '#'
|
779
817
|
}
|
780
818
|
},
|
819
|
+
{
|
820
|
+
title: 'On-demand event card',
|
821
|
+
preview: 'content-width',
|
822
|
+
context: {
|
823
|
+
theme: {
|
824
|
+
border: false,
|
825
|
+
size: 'small',
|
826
|
+
layout: 'multi',
|
827
|
+
name: 'event',
|
828
|
+
inlineSpecs: true
|
829
|
+
},
|
830
|
+
header: {
|
831
|
+
title: 'Discover how on-line particle sizing optimises mining analytics.',
|
832
|
+
date: {
|
833
|
+
date: new Date(),
|
834
|
+
duration: '36:01'
|
835
|
+
},
|
836
|
+
meta: [
|
837
|
+
'English'
|
838
|
+
]
|
839
|
+
},
|
840
|
+
body: {
|
841
|
+
keySpecs: [
|
842
|
+
{
|
843
|
+
title: 'Products',
|
844
|
+
term: 'Morphologi G3-ID'
|
845
|
+
},
|
846
|
+
{
|
847
|
+
title: 'Technologies',
|
848
|
+
term: 'Morphologically-Directed Raman Spectroscopy'
|
849
|
+
}
|
850
|
+
],
|
851
|
+
},
|
852
|
+
tag: 'Recorded webinar'
|
853
|
+
}
|
854
|
+
},
|
855
|
+
{
|
856
|
+
title: 'On-demand event card with image',
|
857
|
+
preview: 'content-width',
|
858
|
+
context: {
|
859
|
+
theme: {
|
860
|
+
border: false,
|
861
|
+
size: 'small',
|
862
|
+
layout: 'multi',
|
863
|
+
name: 'event',
|
864
|
+
inlineSpecs: true
|
865
|
+
},
|
866
|
+
image: {
|
867
|
+
src: '/static/img/blog-page-image-1.jpg',
|
868
|
+
alt: 'Product image alt'
|
869
|
+
},
|
870
|
+
header: {
|
871
|
+
title: 'Discover how on-line particle sizing optimises mining analytics.',
|
872
|
+
date: {
|
873
|
+
date: new Date(),
|
874
|
+
duration: '36:01'
|
875
|
+
},
|
876
|
+
meta: [
|
877
|
+
'English'
|
878
|
+
]
|
879
|
+
},
|
880
|
+
body: {
|
881
|
+
keySpecs: [
|
882
|
+
{
|
883
|
+
title: 'Products',
|
884
|
+
term: 'Morphologi G3-ID'
|
885
|
+
},
|
886
|
+
{
|
887
|
+
title: 'Technologies',
|
888
|
+
term: 'Morphologically-Directed Raman Spectroscopy'
|
889
|
+
}
|
890
|
+
],
|
891
|
+
},
|
892
|
+
tag: 'Recorded webinar'
|
893
|
+
}
|
894
|
+
},
|
781
895
|
{
|
782
896
|
title: 'Event series card',
|
783
897
|
preview: 'content-width',
|
898
|
+
context: {
|
899
|
+
theme: {
|
900
|
+
border: false,
|
901
|
+
layout: 'single',
|
902
|
+
name: 'event-series',
|
903
|
+
inlineSpecs: false,
|
904
|
+
corner: false,
|
905
|
+
},
|
906
|
+
header: {
|
907
|
+
title: 'Part 1 - The theory of X-Ray Fluorescence (XRF)',
|
908
|
+
date: {
|
909
|
+
date: (new Date()).toLocaleString('default', { month: 'short', year: 'numeric' }),
|
910
|
+
formatted: true,
|
911
|
+
},
|
912
|
+
},
|
913
|
+
footer: {
|
914
|
+
cta: {
|
915
|
+
link: '#',
|
916
|
+
label: 'Watch now',
|
917
|
+
icon: 'play',
|
918
|
+
}
|
919
|
+
},
|
920
|
+
link: '#'
|
921
|
+
}
|
922
|
+
},
|
923
|
+
{
|
924
|
+
title: 'Event series card with image',
|
925
|
+
preview: 'content-width',
|
784
926
|
context: {
|
785
927
|
theme: {
|
786
928
|
border: false,
|
@@ -408,6 +408,10 @@
|
|
408
408
|
&--event.c-card--has-image {
|
409
409
|
@extend .c-card--switch;
|
410
410
|
|
411
|
+
&.c-card--has-tag .c-card__tag {
|
412
|
+
z-index: 1;
|
413
|
+
}
|
414
|
+
|
411
415
|
.c-card__wrapper {
|
412
416
|
@include padding(0);
|
413
417
|
|
@@ -454,6 +458,15 @@
|
|
454
458
|
object-fit: cover;
|
455
459
|
}
|
456
460
|
|
461
|
+
.c-card__wrapper,
|
462
|
+
.c-card__primary {
|
463
|
+
height: 100%;
|
464
|
+
}
|
465
|
+
|
466
|
+
.c-card__primary {
|
467
|
+
flex-shrink: 1;
|
468
|
+
}
|
469
|
+
|
457
470
|
.c-card__header > * + * {
|
458
471
|
@include margin('s', 0, 0, 0);
|
459
472
|
}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<input type="checkbox" class="c-checkbox" name="{{ params.name or params.id }}" id="{{ params.id }}" value="{{ params.value }}" {{ 'checked' if params.checked }} {{ 'required' if params.required }} />
|
2
|
-
<label for="{{ params.id }}">{{ params.label }}</label>
|
1
|
+
<input type="checkbox" class="c-checkbox" name="{{ params.name or params.id }}" id="{{ params.id }}" value="{{ params.value }}" {{ 'checked' if params.checked }} {{ 'required' if params.required }} {{ 'disabled' if params.disabled }} />
|
2
|
+
<label for="{{ params.id }}">{{ params.label }}</label>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
{% if params.button %}
|
4
4
|
<div class="u-flex u-border">
|
5
5
|
{% endif %}
|
6
|
-
<input type="{{ params.type or 'text' }}" class="c-input {{ 'c-input--with-button' if params.button }}{{ params.classes }}" name="{{ params.name or params.id }}" placeholder="{{ params.placeholder }}" id="{{ params.id }}" {{ 'required' if params.required }} />
|
6
|
+
<input type="{{ params.type or 'text' }}" class="c-input {{ 'c-input--with-button' if params.button }}{{ params.classes }}" name="{{ params.name or params.id }}" placeholder="{{ params.placeholder }}" id="{{ params.id }}" {{ 'required' if params.required }} {{ 'disabled' if params.disabled }} />
|
7
7
|
{% if params.button %}
|
8
8
|
<button type="button" class="mp c-button--white">Search</button>
|
9
9
|
{% endif %}
|
@@ -83,6 +83,17 @@
|
|
83
83
|
@include step(-1);
|
84
84
|
color: var(--error-state);
|
85
85
|
}
|
86
|
+
|
87
|
+
&[disabled],
|
88
|
+
[disabled] & {
|
89
|
+
background-color: color('petrol', 'step-2');
|
90
|
+
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" id="lock" viewBox="0 0 25 24" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.45 4.17A4 4 0 0 1 16.28 7v3h-8V7a4 4 0 0 1 1.17-2.83ZM6.28 10V7a6 6 0 1 1 12 0v3h.22c1.64 0 2.78 1.46 2.78 3v7c0 1.54-1.14 3-2.78 3H6.06c-1.65 0-2.78-1.46-2.78-3v-7c0-1.54 1.13-3 2.78-3h.22Zm1 2H6.06c-.33 0-.78.33-.78 1v7c0 .67.45 1 .78 1H18.5c.32 0 .78-.33.78-1v-7c0-.67-.46-1-.78-1H7.28Zm3 3.35a2 2 0 1 1 3 1.73v1.77a1 1 0 1 1-2 0v-1.77a2 2 0 0 1-1-1.73Z"/></svg>');
|
91
|
+
background-position: right var(--space-2xs) center;
|
92
|
+
background-repeat: no-repeat;
|
93
|
+
@include space('background-size', 's');
|
94
|
+
cursor: not-allowed;
|
95
|
+
opacity: 0.6;
|
96
|
+
}
|
86
97
|
}
|
87
98
|
|
88
99
|
.c-input--with-button {
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<input type="radio" class="c-radio" name="{{ params.name or params.id }}" id="{{ params.id }}" value="{{ params.value }}" {{ 'checked' if params.checked }} {{ 'required' if params.required }} />
|
2
|
-
<label for="{{ params.id }}">{{ params.label }}</label>
|
1
|
+
<input type="radio" class="c-radio" name="{{ params.name or params.id }}" id="{{ params.id }}" value="{{ params.value }}" {{ 'checked' if params.checked }} {{ 'required' if params.required }} {{ 'disabled' if params.disabled }} />
|
2
|
+
<label for="{{ params.id }}">{{ params.label }}</label>
|
@@ -25,6 +25,19 @@
|
|
25
25
|
&:focus + input[type=hidden] + label:before {
|
26
26
|
outline: 2px solid;
|
27
27
|
}
|
28
|
+
|
29
|
+
&[disabled],
|
30
|
+
[disabled] & {
|
31
|
+
& + label:before {
|
32
|
+
background-color: color('petrol', 'step-2');
|
33
|
+
cursor: not-allowed;
|
34
|
+
opacity: 0.6;
|
35
|
+
|
36
|
+
}
|
37
|
+
&:hover + label:before {
|
38
|
+
background-color: color('petrol', 'step-2');
|
39
|
+
}
|
40
|
+
}
|
28
41
|
}
|
29
42
|
|
30
43
|
.c-checkbox {
|
@@ -1,6 +1,6 @@
|
|
1
1
|
{% inputWrapper params.error %}
|
2
2
|
<label class="{{ 'u-hidden' if params.hideLabel else 'c-label' }}{{ params.classes }}" for="{{ params.id }}">{{ params.label }}</label>
|
3
|
-
<select class="c-input c-input--select" name="{{ params.name or params.id }}" id="{{ params.id }}" {{ 'required' if params.required }}>
|
3
|
+
<select class="c-input c-input--select" name="{{ params.name or params.id }}" id="{{ params.id }}" {{ 'required' if params.required }} {{ 'disabled' if params.disabled }}>
|
4
4
|
{% if params.placeholder %}<option value="">{{ params.placeholder }}</option>{% endif %}
|
5
5
|
{% if params.options | length %}
|
6
6
|
{% for option in params.options %}
|
@@ -1,4 +1,4 @@
|
|
1
1
|
{% inputWrapper params.error %}
|
2
2
|
<label class="{{ 'u-hidden' if params.hideLabel else 'c-label' }}{{ params.classes }}" for="{{ params.id }}">{{ params.label }}</label>
|
3
|
-
<textarea class="c-input c-input--textarea" name="{{ params.name or params.id }}" placeholder="{{ params.placeholder }}" id="{{ params.id }}" {{ 'required' if params.required }}></textarea>
|
3
|
+
<textarea class="c-input c-input--textarea" name="{{ params.name or params.id }}" placeholder="{{ params.placeholder }}" id="{{ params.id }}" {{ 'required' if params.required }} {{ 'disabled' if params.disabled }}></textarea>
|
4
4
|
{% endinputWrapper %}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<label for="{{ params.id }}" class="c-toggle">
|
2
|
-
<input type="checkbox" class="c-toggle__checkbox" id="{{ params.id }}" value="{{ params.value }}" role="switch" aria-checked="false" aria-label="{{ params.label }}" {{ 'checked' if params.checked }} {{ 'required' if params.required }} />
|
2
|
+
<input type="checkbox" class="c-toggle__checkbox" id="{{ params.id }}" value="{{ params.value }}" role="switch" aria-checked="false" aria-label="{{ params.label }}" {{ 'checked' if params.checked }} {{ 'required' if params.required }} {{ 'disabled' if params.disabled }} />
|
3
3
|
<span class="c-toggle__slider"></span>
|
4
|
-
{{ params.label }}
|
4
|
+
<span class="c-toggle__label">{{ params.label }}</span>
|
5
5
|
</label>
|
@@ -56,4 +56,20 @@
|
|
56
56
|
&__checkbox:checked + &__slider::before {
|
57
57
|
transform: translateX(1rem);
|
58
58
|
}
|
59
|
+
|
60
|
+
input[disabled] {
|
61
|
+
& + .c-toggle__slider {
|
62
|
+
background-color: color('petrol', 'step-2');
|
63
|
+
cursor: not-allowed;
|
64
|
+
opacity: 0.6;
|
65
|
+
|
66
|
+
&:before {
|
67
|
+
background-color: color('petrol', 'step-3');
|
68
|
+
}
|
69
|
+
}
|
70
|
+
& ~ .c-toggle__label {
|
71
|
+
cursor: not-allowed;
|
72
|
+
opacity: 0.6;
|
73
|
+
}
|
74
|
+
}
|
59
75
|
}
|
@@ -8,11 +8,11 @@ module.exports = {
|
|
8
8
|
context: {
|
9
9
|
type: 'anchor',
|
10
10
|
tabs: [
|
11
|
-
{ id: 'tab-1', label: 'Primary materials', content: '<
|
12
|
-
{ id: 'tab-2', label: 'Pharmaceuticals', content: '<
|
13
|
-
{ id: 'tab-3', label: 'Advanced materials', content: '<
|
14
|
-
{ id: 'tab-4', label: 'Academia', content: '<
|
15
|
-
{ id: 'tab-5', label: 'Connected world', content: '<
|
11
|
+
{ id: 'tab-1', label: 'Primary materials', content: '<strong>Primary materials</strong> lorem ipsum a maecenas parturient ipsum at nisl id nisi a imperdiet platea dui venenatis sit euismod.', active: true },
|
12
|
+
{ id: 'tab-2', label: 'Pharmaceuticals', content: '<strong>Pharmaceuticals</strong> lorem ipsum parturient a ullamcorper nisl parturient cum ullamcorper augue arcu a feugiat mus imperdiet curae suspendisse rhoncus sit id parturient cubilia adipiscing ad ullamcorper aliquet mi.' },
|
13
|
+
{ id: 'tab-3', label: 'Advanced materials', content: '<strong>Advanced materials</strong> lorem ipsum fringilla eros cum facilisis id ullamcorper pretium sociosqu a eu vestibulum cras vivamus inceptos sed potenti a.' },
|
14
|
+
{ id: 'tab-4', label: 'Academia', content: '<strong>Academia</strong> lorem ipsum augue et vestibulum ut luctus ut vestibulum proin eros mauris sodales penatibus euismod a sem eleifend suspendisse litora fringilla habitasse suspendisse.' },
|
15
|
+
{ id: 'tab-5', label: 'Connected world', content: '<strong>Connected world</strong> lorem ipsum eros a parturient libero ullamcorper natoque vestibulum turpis egestas suspendisse parturient et adipiscing arcu a.' },
|
16
16
|
]
|
17
17
|
},
|
18
18
|
props: [
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<div class="c-tabs__content">
|
11
11
|
{% for tab in params.tabs %}
|
12
12
|
<div id="{{ tab.id }}" class="c-tab {{ 'c-tab--active' if tab.active }}">
|
13
|
-
{{ tab.content | safe }}
|
13
|
+
<div class="o-prose"><p>{{ tab.content | safe }}</p></div>
|
14
14
|
</div>
|
15
15
|
{% endfor %}
|
16
16
|
</div>
|
@@ -67,7 +67,7 @@
|
|
67
67
|
function toggleBackgroundColour(event) {
|
68
68
|
const iframe = event.currentTarget.parentNode.parentNode.querySelector('iframe');
|
69
69
|
if (iframe) {
|
70
|
-
iframe.classList.toggle('u-bg-petrol-step-
|
70
|
+
iframe.classList.toggle('u-bg-petrol-step-3');
|
71
71
|
iframe.classList.toggle('u-pad-s');
|
72
72
|
}
|
73
73
|
}
|
package/src/_includes/layout.njk
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
7
7
|
<title>{{ fullTitle }}</title>
|
8
8
|
{% if description %} <meta name="description" content="{{ description }}" /> {% endif %}
|
9
|
+
{% if not index %}<meta name="robots" content="noindex" />{% endif %}
|
9
10
|
<meta name="theme-color" content="#005461">
|
10
11
|
<meta property="og:type" content="website" />
|
11
12
|
<meta property="og:title" content="{{ fullTitle }}" />
|
package/src/assets/js/app.js
CHANGED
@@ -5,6 +5,7 @@ import Comparison from './imports/comparison';
|
|
5
5
|
import Gallery from './imports/gallery';
|
6
6
|
import HeroPattern from './imports/hero-pattern';
|
7
7
|
import HeroVideo from './imports/hero-video';
|
8
|
+
import OffCanvas from './imports/off-canvas';
|
8
9
|
import ResponsiveTable from './imports/responsive-table';
|
9
10
|
import ScrollbarWidth from './imports/scrollbar-width';
|
10
11
|
import ScrollSpy from './imports/scroll-spy';
|
@@ -25,6 +26,7 @@ import Tabs from './imports/tabs';
|
|
25
26
|
Gallery();
|
26
27
|
HeroPattern();
|
27
28
|
HeroVideo();
|
29
|
+
OffCanvas();
|
28
30
|
ResponsiveTable();
|
29
31
|
ScrollbarWidth();
|
30
32
|
ScrollSpy();
|
@@ -0,0 +1,97 @@
|
|
1
|
+
// Add click event listeners to each toggle button
|
2
|
+
function OffCanvas() {
|
3
|
+
const toggleButtons = Array.from(document.querySelectorAll('.c-button--off-canvas-toggle'));
|
4
|
+
toggleButtons.forEach((button) => {
|
5
|
+
button.addEventListener('click', handleToggleClick);
|
6
|
+
});
|
7
|
+
}
|
8
|
+
|
9
|
+
// Function to handle the toggle button click
|
10
|
+
function handleToggleClick() {
|
11
|
+
const target = this.getAttribute('data-target');
|
12
|
+
const offCanvas = document.getElementById(target);
|
13
|
+
openOffCanvas(offCanvas);
|
14
|
+
}
|
15
|
+
|
16
|
+
// Function to open the off-canvas drawer
|
17
|
+
function openOffCanvas(offCanvas) {
|
18
|
+
const offCanvasList = document.querySelectorAll('.o-off-canvas');
|
19
|
+
const isOpen = offCanvas.classList.contains('o-off-canvas--open');
|
20
|
+
|
21
|
+
// Close other off-canvas drawers only if the target is not already open
|
22
|
+
if (!isOpen) {
|
23
|
+
offCanvasList.forEach((drawer) => {
|
24
|
+
if (drawer !== offCanvas) {
|
25
|
+
closeOffCanvas(drawer);
|
26
|
+
}
|
27
|
+
});
|
28
|
+
}
|
29
|
+
|
30
|
+
// Open the target off-canvas drawer
|
31
|
+
offCanvas.classList.add('o-off-canvas--open');
|
32
|
+
offCanvas.setAttribute('aria-hidden', 'false');
|
33
|
+
|
34
|
+
// Add click event listener to the backdrop to close the off-canvas drawer
|
35
|
+
const backdrop = offCanvas.querySelector('.o-off-canvas__backdrop');
|
36
|
+
backdrop.addEventListener('click', handleBackdropClick);
|
37
|
+
|
38
|
+
// Add keydown event listener to close the off-canvas drawer with the Esc key
|
39
|
+
document.addEventListener('keydown', handleKeyDown);
|
40
|
+
}
|
41
|
+
|
42
|
+
// Function to handle the backdrop click
|
43
|
+
function handleBackdropClick() {
|
44
|
+
const offCanvas = this.closest('.o-off-canvas');
|
45
|
+
closeOffCanvas(offCanvas);
|
46
|
+
}
|
47
|
+
|
48
|
+
// Function to handle the keydown event
|
49
|
+
function handleKeyDown(event) {
|
50
|
+
if (event.key === 'Escape') {
|
51
|
+
const openDrawer = document.querySelector('.o-off-canvas--open');
|
52
|
+
if (openDrawer) {
|
53
|
+
closeOffCanvas(openDrawer);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
// Function to close the off-canvas drawer
|
59
|
+
function closeOffCanvas(offCanvas) {
|
60
|
+
offCanvas.classList.remove('o-off-canvas--open');
|
61
|
+
offCanvas.setAttribute('aria-hidden', 'true');
|
62
|
+
|
63
|
+
// Remove backdrop click event listener when closing the off-canvas drawer
|
64
|
+
const backdrop = offCanvas.querySelector('.o-off-canvas__backdrop');
|
65
|
+
backdrop.removeEventListener('click', handleBackdropClick);
|
66
|
+
|
67
|
+
// Remove keydown event listener when closing the off-canvas drawer
|
68
|
+
document.removeEventListener('keydown', handleKeyDown);
|
69
|
+
}
|
70
|
+
|
71
|
+
// Update button functionality
|
72
|
+
const updateButton = document.querySelectorAll('.o-off-canvas__update');
|
73
|
+
updateButton.forEach((button) => {
|
74
|
+
button.addEventListener('click', handleUpdateButtonClick);
|
75
|
+
});
|
76
|
+
|
77
|
+
// Handle the update button click
|
78
|
+
function handleUpdateButtonClick() {
|
79
|
+
// Save the options somewhere
|
80
|
+
const offCanvas = this.closest('.o-off-canvas');
|
81
|
+
closeOffCanvas(offCanvas);
|
82
|
+
}
|
83
|
+
|
84
|
+
// Close button functionality
|
85
|
+
const closeButton = document.querySelectorAll('.o-off-canvas__close');
|
86
|
+
closeButton.forEach((button) => {
|
87
|
+
button.addEventListener('click', handleCloseButtonClick);
|
88
|
+
});
|
89
|
+
|
90
|
+
// Handle the close button click
|
91
|
+
function handleCloseButtonClick() {
|
92
|
+
const offCanvas = this.closest('.o-off-canvas');
|
93
|
+
closeOffCanvas(offCanvas);
|
94
|
+
};
|
95
|
+
|
96
|
+
|
97
|
+
export default OffCanvas;
|