@iris.interactive/handcook 2.6.12 → 2.6.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +2 -2
- package/public/scripts/components/collapse/collapse.component.js +12 -1
- package/public/scripts/components/lazyload/lazyload.component.js +6 -3
- package/public/scripts/components/modal/modal.component.js +12 -16
- package/public/scripts/components/slider/slider.component.js +73 -60
- package/public/scripts/components/smooth-scroll/smooth-scroll.component.js +8 -16
- package/public/scripts/enumerators/element.enum.js +1 -1
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Welcome to HandCook 👨🍳
|
|
2
|
-

|
|
3
3
|

|
|
4
4
|
[](#)
|
|
5
5
|
[](https://twitter.com/captain\_iris)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iris.interactive/handcook",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.15",
|
|
4
4
|
"description": "The web cooking by IRIS Interactive",
|
|
5
5
|
"main": "./public/scripts/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@fancyapps/ui": "^4.0.22",
|
|
37
37
|
"bootstrap": "^5.1.3",
|
|
38
|
-
"swiper": "
|
|
38
|
+
"swiper": "8.0.6",
|
|
39
39
|
"tippy.js": "^6.3.7",
|
|
40
40
|
"vanilla-lazyload": "^17.6.1"
|
|
41
41
|
}
|
|
@@ -46,13 +46,24 @@ export class HcCollapse {
|
|
|
46
46
|
});
|
|
47
47
|
});
|
|
48
48
|
document.querySelectorAll('[data-hc-collapse]').forEach(trigger => {
|
|
49
|
+
const triggerEls = document.querySelectorAll(`[data-hc-collapse-trigger="${trigger.getAttribute('id')}"]`);
|
|
49
50
|
trigger.addEventListener('hide.bs.collapse', (e) => {
|
|
51
|
+
triggerEls.forEach(triggerEl => {
|
|
52
|
+
if (triggerEl.classList.contains('active')) {
|
|
53
|
+
triggerEl.classList.remove('active');
|
|
54
|
+
}
|
|
55
|
+
});
|
|
50
56
|
trigger.dispatchEvent(this.hideEvent);
|
|
51
57
|
});
|
|
52
58
|
trigger.addEventListener('hidden.bs.collapse', (e) => {
|
|
53
59
|
trigger.dispatchEvent(this.hiddenEvent);
|
|
54
60
|
});
|
|
55
61
|
trigger.addEventListener('show.bs.collapse', (e) => {
|
|
62
|
+
triggerEls.forEach(triggerEl => {
|
|
63
|
+
if (!triggerEl.classList.contains('active')) {
|
|
64
|
+
triggerEl.classList.add('active');
|
|
65
|
+
}
|
|
66
|
+
});
|
|
56
67
|
trigger.dispatchEvent(this.showEvent);
|
|
57
68
|
});
|
|
58
69
|
trigger.addEventListener('shown.bs.collapse', (e) => {
|
|
@@ -73,4 +84,4 @@ export class HcCollapse {
|
|
|
73
84
|
const hc_collapse = function (trigger) {
|
|
74
85
|
return new HcCollapse(trigger);
|
|
75
86
|
};
|
|
76
|
-
export default hc_collapse;
|
|
87
|
+
export default hc_collapse;
|
|
@@ -16,13 +16,16 @@
|
|
|
16
16
|
|
|
17
17
|
import LazyLoad from "vanilla-lazyload";
|
|
18
18
|
|
|
19
|
-
const hc_lazyload = function() {
|
|
20
|
-
|
|
19
|
+
const hc_lazyload = function (options = {}) {
|
|
20
|
+
|
|
21
|
+
options = Object.assign({
|
|
21
22
|
elements_selector: '[data-hc-src], [data-hc-bg], [data-hc-bg-hidpi]',
|
|
22
23
|
data_src: 'hc-src',
|
|
23
24
|
data_bg: 'hc-bg',
|
|
24
25
|
data_bg_hidpi: 'hc-bg-hidpi'
|
|
25
|
-
})
|
|
26
|
+
}, options)
|
|
27
|
+
|
|
28
|
+
return new LazyLoad(options);
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
export default hc_lazyload;
|
|
@@ -27,23 +27,19 @@ export class HcModal {
|
|
|
27
27
|
constructor(elements = ElementEnum.modal, overrideOptions = {}) {
|
|
28
28
|
this.createEvent();
|
|
29
29
|
document.querySelectorAll(elements).forEach(element => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
},
|
|
42
|
-
closing: () => {
|
|
43
|
-
document.dispatchEvent(this.hideEvent);
|
|
44
|
-
}
|
|
30
|
+
this.initOptions();
|
|
31
|
+
Object.assign(this.options, overrideOptions);
|
|
32
|
+
this.options.src = this.options.src != '' ? this.options.src : (element.hasAttribute('href') ? element.getAttribute('href') : (element.hasAttribute('data-hc-src') ? element.dataset.hcSrc : ''));
|
|
33
|
+
this.options.parentEl = this.options.parentEl !== null ? document.querySelector(this.options.parentEl) : (element.hasAttribute('data-hc-modal-parent') ? document.querySelector(element.getAttribute('data-hc-modal-parent')) : '');
|
|
34
|
+
Fancybox.bind(elements, this.options, {
|
|
35
|
+
on: {
|
|
36
|
+
reveal: () => {
|
|
37
|
+
document.dispatchEvent(this.showEvent);
|
|
38
|
+
},
|
|
39
|
+
closing: () => {
|
|
40
|
+
document.dispatchEvent(this.hideEvent);
|
|
45
41
|
}
|
|
46
|
-
}
|
|
42
|
+
}
|
|
47
43
|
});
|
|
48
44
|
});
|
|
49
45
|
}
|
|
@@ -22,6 +22,19 @@ export class HcSlider {
|
|
|
22
22
|
slider;
|
|
23
23
|
instances = [];
|
|
24
24
|
|
|
25
|
+
breakpoints = [{
|
|
26
|
+
name: "medium",
|
|
27
|
+
value: 650
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "large",
|
|
31
|
+
value: 1000
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "xlarge",
|
|
35
|
+
value: 1453
|
|
36
|
+
}];
|
|
37
|
+
|
|
25
38
|
// Options
|
|
26
39
|
options = {};
|
|
27
40
|
|
|
@@ -54,32 +67,21 @@ export class HcSlider {
|
|
|
54
67
|
this.options['slidesPerView'] = parseFloat(slidesPerView);
|
|
55
68
|
}
|
|
56
69
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
this.options['breakpoints']['1000']['slidesPerView'] = parseFloat(slidesPerViewLarge);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const gapXlarge = this.slider.getAttribute('data-hc-slider-gap-xlarge');
|
|
76
|
-
const slidesPerViewXlarge = this.slider.getAttribute('data-hc-slider-slides-per-view-xlarge');
|
|
77
|
-
if (gapXlarge !== null) {
|
|
78
|
-
this.options['breakpoints']['1453']['spaceBetween'] = parseFloat(gapXlarge);
|
|
79
|
-
}
|
|
80
|
-
if (slidesPerViewXlarge !== null) {
|
|
81
|
-
this.options['breakpoints']['1453']['slidesPerView'] = parseFloat(slidesPerViewXlarge);
|
|
82
|
-
}
|
|
70
|
+
let breakpointOptions = {};
|
|
71
|
+
this.breakpoints.forEach(breakpoint => {
|
|
72
|
+
const gap = this.slider.getAttribute(`data-hc-slider-gap-${breakpoint.name}`);
|
|
73
|
+
const slidesPerView = this.slider.getAttribute(`data-hc-slider-slides-per-view-${breakpoint.name}`);
|
|
74
|
+
if (gap !== null || slidesPerView !== null) {
|
|
75
|
+
breakpointOptions[breakpoint.value] = {};
|
|
76
|
+
if (gap !== null) {
|
|
77
|
+
breakpointOptions[breakpoint.value]['spaceBetween'] = parseFloat(gap);
|
|
78
|
+
}
|
|
79
|
+
if (slidesPerView !== null) {
|
|
80
|
+
breakpointOptions[breakpoint.value]['slidesPerView'] = parseFloat(slidesPerView);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
this.options.breakpoints = breakpointOptions;
|
|
83
85
|
|
|
84
86
|
const freeMode = this.slider.getAttribute('data-hc-slider-free-mode');
|
|
85
87
|
if (freeMode !== null) {
|
|
@@ -87,6 +89,27 @@ export class HcSlider {
|
|
|
87
89
|
enabled: true
|
|
88
90
|
}
|
|
89
91
|
}
|
|
92
|
+
|
|
93
|
+
if (this.slider.hasAttribute('data-hc-slider-pagination')) {
|
|
94
|
+
this.options['pagination'] = {
|
|
95
|
+
el: '.hc-slider-pagination',
|
|
96
|
+
type: 'bullets',
|
|
97
|
+
clickable: true,
|
|
98
|
+
bulletClass: 'hc-slider-pagination-bullet',
|
|
99
|
+
clickableClass: 'hc-slider-pagination-clickable',
|
|
100
|
+
currentClass: 'hc-slider-pagination-current',
|
|
101
|
+
bulletActiveClass: 'hc-slider-pagination-bullet-active'
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (this.slider.hasAttribute('data-hc-slider-arrows')) {
|
|
105
|
+
const suffix = this.slider.getAttribute('data-hc-slider-arrows');
|
|
106
|
+
this.options['navigation'] = {
|
|
107
|
+
nextEl: `.hc-slider-button-next${suffix}`,
|
|
108
|
+
prevEl: `.hc-slider-button-prev${suffix}`,
|
|
109
|
+
disabledClass: `hc-slider-button-disabled${suffix}`,
|
|
110
|
+
hiddenClass: `hc-slider-button-hidden${suffix}`
|
|
111
|
+
};
|
|
112
|
+
}
|
|
90
113
|
}
|
|
91
114
|
|
|
92
115
|
buildDom() {
|
|
@@ -107,38 +130,31 @@ export class HcSlider {
|
|
|
107
130
|
this.slider.appendChild(wrapperElement);
|
|
108
131
|
|
|
109
132
|
// On ajout les différentes div utile en fonction des options passées
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
clickable: true,
|
|
120
|
-
bulletClass: 'hc-slider-pagination-bullet',
|
|
121
|
-
clickableClass: 'hc-slider-pagination-clickable',
|
|
122
|
-
currentClass: 'hc-slider-pagination-current',
|
|
123
|
-
bulletActiveClass: 'hc-slider-pagination-bullet-active'
|
|
124
|
-
};
|
|
133
|
+
// et si les elements n'existent pas déjà
|
|
134
|
+
if (this.options.pagination !== false) {
|
|
135
|
+
|
|
136
|
+
const el = this.slider.querySelectorAll(this.options.pagination.el);
|
|
137
|
+
if (el.length === 0) {
|
|
138
|
+
const paginationElement = document.createElement("div");
|
|
139
|
+
paginationElement.classList.add(this.options.pagination.el.substr(1));
|
|
140
|
+
this.slider.appendChild(paginationElement);
|
|
141
|
+
}
|
|
125
142
|
}
|
|
126
|
-
if (this.
|
|
143
|
+
if (this.options.navigation !== false) {
|
|
127
144
|
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
this.slider.appendChild(buttonNext);
|
|
145
|
+
const prevEl = this.slider.querySelectorAll(this.options.navigation.prevEl);
|
|
146
|
+
if (prevEl.length === 0) {
|
|
147
|
+
const buttonPrev = document.createElement("div");
|
|
148
|
+
buttonPrev.classList.add(this.options.navigation.prevEl.substr(1));
|
|
149
|
+
this.slider.appendChild(buttonPrev);
|
|
150
|
+
}
|
|
135
151
|
|
|
136
|
-
this.options
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
152
|
+
const nextEl = this.slider.querySelectorAll(this.options.navigation.nextEl);
|
|
153
|
+
if (nextEl.length === 0) {
|
|
154
|
+
const buttonNext = document.createElement("div");
|
|
155
|
+
buttonNext.classList.add(this.options.navigation.nextEl.substr(1));
|
|
156
|
+
this.slider.appendChild(buttonNext);
|
|
157
|
+
}
|
|
142
158
|
}
|
|
143
159
|
}
|
|
144
160
|
|
|
@@ -157,6 +173,7 @@ export class HcSlider {
|
|
|
157
173
|
|
|
158
174
|
// layout
|
|
159
175
|
swiper.$el.find('.swiper-wrapper').addClass('hc-slider-wrapper');
|
|
176
|
+
swiper.$el.addClass('hc-slider-initialized');
|
|
160
177
|
|
|
161
178
|
// slide item
|
|
162
179
|
swiper.$el.find('.swiper-slide').addClass('hc-slider-slide');
|
|
@@ -176,11 +193,7 @@ export class HcSlider {
|
|
|
176
193
|
swiper.$el.find('.swiper-slide-prev').addClass('hc-slider-slide-prev');
|
|
177
194
|
}
|
|
178
195
|
},
|
|
179
|
-
breakpoints: {
|
|
180
|
-
650: {},
|
|
181
|
-
1000: {},
|
|
182
|
-
1453: {},
|
|
183
|
-
}
|
|
196
|
+
breakpoints: {}
|
|
184
197
|
};
|
|
185
198
|
}
|
|
186
199
|
}
|
|
@@ -12,29 +12,24 @@
|
|
|
12
12
|
* @date 28/01/2022 14:27
|
|
13
13
|
* @copyright Copyright (c) 2002-2022 IRIS Interactive, Inc. (http://www.iris-interactive.fr)
|
|
14
14
|
*/
|
|
15
|
-
|
|
16
15
|
import ElementEnum from "../../enumerators/element.enum";
|
|
17
16
|
|
|
18
17
|
export class HcSmoothScroll {
|
|
19
|
-
|
|
20
18
|
constructor(triggerAttribute = ElementEnum.scrollSmooth, durationAnimation = 1000) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if(e.target && e.target.hasAttribute(ElementEnum.scrollSmooth)) {
|
|
19
|
+
document.querySelectorAll(triggerAttribute).forEach(trigger => {
|
|
20
|
+
trigger.addEventListener('click', (e) => {
|
|
24
21
|
e.preventDefault();
|
|
25
|
-
const target = (e.
|
|
26
|
-
const shift = (e.
|
|
22
|
+
const target = (e.currentTarget.getAttribute('href') != '') ? document.querySelector(e.currentTarget.getAttribute('href')) : document.querySelector(e.currentTarget.dataset.hcSmoothScrollHref);
|
|
23
|
+
const shift = (e.currentTarget.dataset.hcSmoothScrollShift !== undefined) ? e.currentTarget.dataset.hcSmoothScrollShift : 0;
|
|
27
24
|
const anim = requestAnimationFrame((timestamp) => {
|
|
28
25
|
const stamp = timestamp || new Date().getTime();
|
|
29
26
|
const start = stamp;
|
|
30
|
-
|
|
31
27
|
const startScrollOffset = window.pageYOffset;
|
|
32
28
|
const scrollEndElemTop = target.getBoundingClientRect().top - shift;
|
|
33
|
-
|
|
34
29
|
this.scrollToElem(start, stamp, durationAnimation, scrollEndElemTop, startScrollOffset);
|
|
35
30
|
})
|
|
36
|
-
}
|
|
37
|
-
})
|
|
31
|
+
});
|
|
32
|
+
})
|
|
38
33
|
}
|
|
39
34
|
|
|
40
35
|
easeInCubic(t) {
|
|
@@ -44,11 +39,8 @@ export class HcSmoothScroll {
|
|
|
44
39
|
scrollToElem(startTime, currentTime, duration, scrollEndElemTop, startScrollOffset) {
|
|
45
40
|
const runtime = currentTime - startTime;
|
|
46
41
|
let progress = runtime / duration;
|
|
47
|
-
|
|
48
42
|
progress = Math.min(progress, 1);
|
|
49
|
-
|
|
50
43
|
const ease = this.easeInCubic(progress);
|
|
51
|
-
|
|
52
44
|
window.scroll(0, startScrollOffset + (scrollEndElemTop * ease));
|
|
53
45
|
if (runtime < duration) {
|
|
54
46
|
requestAnimationFrame((timestamp) => {
|
|
@@ -59,7 +51,7 @@ export class HcSmoothScroll {
|
|
|
59
51
|
}
|
|
60
52
|
}
|
|
61
53
|
|
|
62
|
-
const hc_smooth_scroll = function(trigger,
|
|
63
|
-
new HcSmoothScroll(trigger,
|
|
54
|
+
const hc_smooth_scroll = function (trigger, durationAnimation) {
|
|
55
|
+
new HcSmoothScroll(trigger, durationAnimation);
|
|
64
56
|
}
|
|
65
57
|
export default hc_smooth_scroll;
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
export default class ElementEnum {
|
|
17
17
|
static tooltip = '[data-hc-tooltip], [data-hc-popover]';
|
|
18
18
|
static popover = '[data-hc-popover]';
|
|
19
|
-
static scrollSmooth = 'data-hc-smooth-scroll';
|
|
19
|
+
static scrollSmooth = '[data-hc-smooth-scroll]';
|
|
20
20
|
static modal = '[data-hc-modal]';
|
|
21
21
|
static lightbox = '[data-hc-lightbox]';
|
|
22
22
|
static dropdown = '[data-hc-dropdown]';
|