@creative-web-solution/front-library 7.0.7 → 7.1.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.
- package/CHANGELOG.md +15 -0
- package/DOM/Class.ts +10 -12
- package/DOM/DocumentSize.ts +3 -1
- package/DOM/Filter.ts +0 -2
- package/DOM/Index.ts +1 -3
- package/DOM/Manipulation.ts +0 -3
- package/DOM/Matrix.ts +12 -12
- package/DOM/Offset.ts +4 -5
- package/DOM/OuterSize.ts +12 -12
- package/DOM/PageToDOM.ts +2 -2
- package/DOM/Position.ts +3 -3
- package/DOM/Size.ts +3 -7
- package/DOM/StrToDOM.ts +0 -1
- package/DOM/Styles.ts +3 -12
- package/DOM/Traversing.ts +0 -6
- package/DOM/WindowScroll.ts +3 -1
- package/DOM/WindowSize.ts +3 -1
- package/DOM/Wrap.ts +0 -1
- package/Events/DeviceOrientation.ts +27 -31
- package/Events/EventsManager.ts +10 -25
- package/Events/Gesture.ts +36 -37
- package/Events/HistoryController.ts +11 -17
- package/Events/ImageLoad.ts +35 -19
- package/Events/IntersectObserver.ts +15 -19
- package/Events/KeyboardHandler.ts +10 -8
- package/Events/MediaQueriesEvents.ts +53 -51
- package/Events/OnAnimationEnd.ts +2 -3
- package/Events/OnTransitionEnd.ts +3 -3
- package/Events/PubSub.ts +5 -8
- package/Events/TouchHover.ts +18 -21
- package/Events/WindowEvents.ts +26 -30
- package/Helpers/Colors.ts +7 -23
- package/Helpers/Cookie.ts +5 -12
- package/Helpers/Coordinates.ts +0 -7
- package/Helpers/Debounce.ts +3 -7
- package/Helpers/Defer.ts +1 -1
- package/Helpers/GetValue.ts +0 -2
- package/Helpers/Insert.ts +0 -1
- package/Helpers/Sequential.ts +0 -2
- package/Helpers/Slice.ts +0 -3
- package/Helpers/Throttle.ts +0 -1
- package/Helpers/TransitionHelpers.ts +8 -6
- package/Helpers/Type.ts +1 -14
- package/Helpers/Unique.ts +3 -3
- package/Helpers/UrlParser.ts +13 -22
- package/Helpers/Wait.ts +1 -1
- package/Modules/Accordion/Tab.ts +18 -16
- package/Modules/Accordion/index.ts +24 -16
- package/Modules/Autocomplete.ts +95 -101
- package/Modules/DragSlider.ts +72 -63
- package/Modules/GlobalState.ts +60 -53
- package/Modules/LoadGMap.ts +4 -7
- package/Modules/Notifications/Notification.ts +28 -32
- package/Modules/Notifications/index.ts +43 -36
- package/Modules/Popin/Popin.ts +100 -110
- package/Modules/Popin/PopinAccessibility.ts +8 -8
- package/Modules/Popin/PopinBackground.ts +11 -11
- package/Modules/Popin/PopinController.ts +23 -29
- package/Modules/Popin/Tools.ts +18 -19
- package/Modules/QuickTemplate.ts +4 -6
- package/Modules/ScrollSnap.ts +110 -104
- package/Modules/SkinCheckbox.ts +51 -37
- package/Modules/SkinFile.ts +62 -52
- package/Modules/SkinRadio.ts +62 -42
- package/Modules/SkinSelect.ts +116 -100
- package/Modules/Slider/Slide.ts +49 -52
- package/Modules/Slider/Slider.ts +100 -136
- package/Modules/Slider/SliderControls.ts +60 -59
- package/Modules/Tabs/Tab.ts +27 -23
- package/Modules/Tabs/index.ts +35 -25
- package/Modules/Validator/Date.ts +2 -1
- package/Modules/Validator/Equals.ts +1 -1
- package/Modules/Validator/Internal/Input.ts +370 -0
- package/Modules/Validator/Internal/InputValidator.ts +99 -0
- package/Modules/Validator/Internal/ValidatorFunctionsController.ts +58 -0
- package/Modules/Validator/Max.ts +1 -1
- package/Modules/Validator/Min.ts +1 -1
- package/Modules/Validator/MultiRequired.ts +5 -5
- package/Modules/Validator/Number.ts +1 -0
- package/Modules/Validator/Pattern.ts +1 -1
- package/Modules/Validator/Recaptcha.ts +1 -0
- package/Modules/Validator/Required.ts +3 -2
- package/Modules/Validator/ServerCheck.ts +23 -15
- package/Modules/Validator/Tools/GetQueryFromForm.ts +1 -6
- package/Modules/Validator/Tools/IsDate.ts +2 -3
- package/Modules/Validator/Tools/IsEmail.ts +2 -5
- package/Modules/Validator/Tools/IsEmpty.ts +0 -2
- package/Modules/Validator/Tools/IsNumber.ts +0 -2
- package/Modules/Validator/Tools/IsUrl.ts +1 -3
- package/Modules/Validator/Tools/Label.ts +5 -15
- package/Modules/Validator/Tools/RadioButton.ts +4 -10
- package/Modules/Validator/Url.ts +1 -0
- package/Modules/Validator/index.ts +36 -36
- package/Modules/YouTubePlayer.ts +18 -16
- package/README.md +1 -1
- package/Types/Accordion.d.ts +36 -0
- package/Types/Autocomplete.d.ts +95 -0
- package/Types/DOM.d.ts +69 -0
- package/Types/DragSlider.d.ts +56 -0
- package/Types/EventsHelpers.d.ts +390 -0
- package/Types/GLImageTransition.d.ts +47 -43
- package/Types/GlobalState.d.ts +9 -0
- package/Types/Helpers.d.ts +30 -0
- package/Types/Notifications.d.ts +48 -44
- package/Types/Popin.d.ts +95 -0
- package/Types/ScrollSnap.d.ts +66 -0
- package/Types/SkinCheckbox.d.ts +26 -0
- package/Types/SkinFile.d.ts +38 -0
- package/Types/SkinRadio.d.ts +28 -0
- package/Types/SkinSelect.d.ts +59 -0
- package/Types/Slider.d.ts +106 -0
- package/Types/Tabs.d.ts +26 -0
- package/Types/Validator.d.ts +72 -0
- package/Types/YouTubePlayer.d.ts +27 -0
- package/Types/index.d.ts +22 -21
- package/WebGL/GLImageTransition/GLImageTransition.ts +83 -80
- package/WebGL/GLImageTransition/Presets/Cellular.ts +11 -11
- package/WebGL/GLImageTransition/Presets/Fade.ts +2 -3
- package/WebGL/GLImageTransition/Presets/HorizontalMovingGrid.ts +9 -9
- package/WebGL/GLImageTransition/Presets/PresetSample.ts +11 -9
- package/WebGL/GLImageTransition/Presets/Solarisation.ts +7 -12
- package/package.json +1 -1
- package/Modules/Template.ts +0 -209
- package/Types/AccordionTypes.d.ts +0 -29
- package/Types/AutocompleteTypes.d.ts +0 -85
- package/Types/DOMTypes.d.ts +0 -62
- package/Types/DragSliderTypes.d.ts +0 -52
- package/Types/EventsHelpersTypes.d.ts +0 -370
- package/Types/GlobalStateTypes.d.ts +0 -5
- package/Types/HelpersTypes.d.ts +0 -23
- package/Types/MediaPreloaderTypes.d.ts +0 -12
- package/Types/PopinTypes.d.ts +0 -83
- package/Types/ScrollSnapTypes.d.ts +0 -62
- package/Types/SkinCheckboxTypes.d.ts +0 -23
- package/Types/SkinFileTypes.d.ts +0 -34
- package/Types/SkinRadioTypes.d.ts +0 -24
- package/Types/SkinSelectTypes.d.ts +0 -48
- package/Types/SliderTypes.d.ts +0 -97
- package/Types/TabsTypes.d.ts +0 -22
- package/Types/ValidatorTypes.d.ts +0 -61
- package/Types/YouTubePlayerTypes.d.ts +0 -23
|
@@ -13,6 +13,7 @@ import { Slide } from './Slide';
|
|
|
13
13
|
* @see extra/modules/slider.md
|
|
14
14
|
*
|
|
15
15
|
* @example
|
|
16
|
+
* ```ts
|
|
16
17
|
* let controls = new SliderControls(
|
|
17
18
|
* slider,
|
|
18
19
|
* {
|
|
@@ -26,6 +27,7 @@ import { Slide } from './Slide';
|
|
|
26
27
|
* "gestureOptions": Object
|
|
27
28
|
* }
|
|
28
29
|
* );
|
|
30
|
+
* ```
|
|
29
31
|
*/
|
|
30
32
|
export default class SliderControls {
|
|
31
33
|
|
|
@@ -33,22 +35,22 @@ export default class SliderControls {
|
|
|
33
35
|
#autoslideTimeoutId;
|
|
34
36
|
#keyboardPreviousButton;
|
|
35
37
|
#keyboardNextButton;
|
|
36
|
-
#$bullets:
|
|
38
|
+
#$bullets: NodeListOf<HTMLElement> | null = null;
|
|
37
39
|
#paginationKeyboardControls;
|
|
38
40
|
#inSlideKeyboardControls;
|
|
39
|
-
#isAutoslideEnabled
|
|
40
|
-
#options:
|
|
41
|
+
#isAutoslideEnabled = false;
|
|
42
|
+
#options: FLib.Slider.ControlsOptions;
|
|
41
43
|
|
|
42
44
|
|
|
43
45
|
/**
|
|
44
46
|
* Controlled slider
|
|
45
47
|
*/
|
|
46
|
-
get slider() {
|
|
48
|
+
get slider(): Slider {
|
|
47
49
|
return this.#slider;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
|
|
51
|
-
constructor( slider, options:
|
|
53
|
+
constructor( slider: Slider, options: FLib.Slider.ControlsOptions ) {
|
|
52
54
|
this.#slider = slider;
|
|
53
55
|
this.#options = options;
|
|
54
56
|
|
|
@@ -64,14 +66,14 @@ export default class SliderControls {
|
|
|
64
66
|
on( slider, {
|
|
65
67
|
"eventsName": "before",
|
|
66
68
|
"callback": data => {
|
|
67
|
-
this
|
|
69
|
+
this.#updateBullets( data.targetSlide, data.currentSlide );
|
|
68
70
|
}
|
|
69
71
|
} );
|
|
70
72
|
|
|
71
73
|
on( slider, {
|
|
72
74
|
"eventsName": "start",
|
|
73
75
|
"callback": data => {
|
|
74
|
-
this
|
|
76
|
+
this.#updateBullets( data.currentSlide );
|
|
75
77
|
}
|
|
76
78
|
} );
|
|
77
79
|
|
|
@@ -81,12 +83,12 @@ export default class SliderControls {
|
|
|
81
83
|
|
|
82
84
|
if ( this.#$bullets ) {
|
|
83
85
|
this.#$bullets.forEach( ( $bullet, index ) => {
|
|
84
|
-
|
|
86
|
+
const matchSlide = slider.getSlide( index );
|
|
85
87
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
$bullet.setAttribute( 'role', 'tab' );
|
|
89
|
+
$bullet.setAttribute( 'aria-selected', 'false' );
|
|
90
|
+
$bullet.setAttribute( 'tabindex', '-1' );
|
|
91
|
+
$bullet.setAttribute( 'aria-controls', matchSlide.id );
|
|
90
92
|
} );
|
|
91
93
|
}
|
|
92
94
|
|
|
@@ -94,20 +96,20 @@ export default class SliderControls {
|
|
|
94
96
|
|
|
95
97
|
if ( options.$btPrev ) {
|
|
96
98
|
gesture( options.$btPrev, '__sliderBtPrev', {
|
|
97
|
-
"tap": this
|
|
99
|
+
"tap": this.#onPrev.bind( this ),
|
|
98
100
|
} );
|
|
99
101
|
}
|
|
100
102
|
|
|
101
103
|
if ( options.$btNext ) {
|
|
102
104
|
gesture( options.$btNext, '__sliderBtNext', {
|
|
103
|
-
"tap": this
|
|
105
|
+
"tap": this.#onNext.bind( this ),
|
|
104
106
|
} );
|
|
105
107
|
}
|
|
106
108
|
|
|
107
|
-
if ( this.#$bullets ) {
|
|
108
|
-
gesture( options.$pagination
|
|
109
|
+
if ( this.#$bullets && options.$pagination ) {
|
|
110
|
+
gesture( options.$pagination, '__sliderBtPagination', {
|
|
109
111
|
"selector": options.paginationItemsSelector,
|
|
110
|
-
"tap": this
|
|
112
|
+
"tap": this.#onPager.bind( this ),
|
|
111
113
|
} );
|
|
112
114
|
}
|
|
113
115
|
|
|
@@ -134,9 +136,7 @@ export default class SliderControls {
|
|
|
134
136
|
{
|
|
135
137
|
"swipeLeft": ( e: Event, $target: HTMLElement, type: string ) => {
|
|
136
138
|
this.next();
|
|
137
|
-
|
|
138
|
-
options.gestureOptions!.swipeLeft.call( this, e, $target, type );
|
|
139
|
-
}
|
|
139
|
+
options.gestureOptions?.swipeLeft?.call( this, e, $target, type );
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
);
|
|
@@ -148,9 +148,7 @@ export default class SliderControls {
|
|
|
148
148
|
{
|
|
149
149
|
"swipeRight": ( e: Event, $target: HTMLElement, type: string ) => {
|
|
150
150
|
this.previous();
|
|
151
|
-
|
|
152
|
-
options.gestureOptions!.swipeRight.call( this, e, $target, type );
|
|
153
|
-
}
|
|
151
|
+
options.gestureOptions?.swipeRight?.call( this, e, $target, type );
|
|
154
152
|
}
|
|
155
153
|
}
|
|
156
154
|
);
|
|
@@ -168,14 +166,14 @@ export default class SliderControls {
|
|
|
168
166
|
{
|
|
169
167
|
"onUp": e => {
|
|
170
168
|
if ( e.ctrlKey ) {
|
|
171
|
-
this
|
|
169
|
+
this.#updateBulletsFocus();
|
|
172
170
|
}
|
|
173
171
|
},
|
|
174
172
|
"onPageUp": e => {
|
|
175
173
|
if (e.ctrlKey) {
|
|
176
174
|
one(slider, {
|
|
177
175
|
"eventsName": "before",
|
|
178
|
-
"callback": this
|
|
176
|
+
"callback": this.#updateBulletsFocus
|
|
179
177
|
});
|
|
180
178
|
slider.previous();
|
|
181
179
|
}
|
|
@@ -184,7 +182,7 @@ export default class SliderControls {
|
|
|
184
182
|
if (e.ctrlKey) {
|
|
185
183
|
one(slider, {
|
|
186
184
|
"eventsName": "before",
|
|
187
|
-
"callback": this
|
|
185
|
+
"callback": this.#updateBulletsFocus
|
|
188
186
|
});
|
|
189
187
|
slider.next();
|
|
190
188
|
}
|
|
@@ -202,14 +200,14 @@ export default class SliderControls {
|
|
|
202
200
|
"onPrevious": () => {
|
|
203
201
|
one( slider, {
|
|
204
202
|
"eventsName": "before",
|
|
205
|
-
"callback": this
|
|
203
|
+
"callback": this.#updateBulletsFocus
|
|
206
204
|
} );
|
|
207
205
|
slider.previous();
|
|
208
206
|
},
|
|
209
207
|
"onNext": () => {
|
|
210
208
|
one( slider, {
|
|
211
209
|
"eventsName": "before",
|
|
212
|
-
"callback": this
|
|
210
|
+
"callback": this.#updateBulletsFocus
|
|
213
211
|
} );
|
|
214
212
|
slider.next();
|
|
215
213
|
},
|
|
@@ -223,7 +221,7 @@ export default class SliderControls {
|
|
|
223
221
|
this.#keyboardNextButton = new KeyboardHandler(
|
|
224
222
|
options.$btNext,
|
|
225
223
|
{
|
|
226
|
-
"onSelect": this
|
|
224
|
+
"onSelect": this.#onNext.bind( this ),
|
|
227
225
|
}
|
|
228
226
|
);
|
|
229
227
|
}
|
|
@@ -232,7 +230,7 @@ export default class SliderControls {
|
|
|
232
230
|
this.#keyboardPreviousButton = new KeyboardHandler(
|
|
233
231
|
options.$btPrev,
|
|
234
232
|
{
|
|
235
|
-
"onSelect": this
|
|
233
|
+
"onSelect": this.#onPrev.bind( this ),
|
|
236
234
|
}
|
|
237
235
|
);
|
|
238
236
|
}
|
|
@@ -250,9 +248,9 @@ export default class SliderControls {
|
|
|
250
248
|
* @param _$button - Internal use
|
|
251
249
|
*/
|
|
252
250
|
next( _$button?: HTMLElement ): Promise<void> {
|
|
253
|
-
this
|
|
251
|
+
this.#_stopAutoslide();
|
|
254
252
|
return this.#slider.next( _$button );
|
|
255
|
-
}
|
|
253
|
+
}
|
|
256
254
|
|
|
257
255
|
|
|
258
256
|
/**
|
|
@@ -261,21 +259,20 @@ export default class SliderControls {
|
|
|
261
259
|
* @param _$button - Internal use
|
|
262
260
|
*/
|
|
263
261
|
previous( _$button?: HTMLElement ): Promise<void> {
|
|
264
|
-
this
|
|
262
|
+
this.#_stopAutoslide();
|
|
265
263
|
return this.#slider.previous( _$button );
|
|
266
|
-
}
|
|
264
|
+
}
|
|
267
265
|
|
|
268
266
|
|
|
269
267
|
/**
|
|
270
268
|
* Go to the asked slide or page
|
|
271
269
|
*
|
|
272
|
-
* @param index
|
|
273
270
|
* @param $button - Internal use
|
|
274
271
|
*/
|
|
275
272
|
goTo( index: number, _$button?: HTMLElement ): Promise<void> {
|
|
276
|
-
this
|
|
273
|
+
this.#_stopAutoslide();
|
|
277
274
|
return this.#slider.goTo( index, _$button );
|
|
278
|
-
}
|
|
275
|
+
}
|
|
279
276
|
|
|
280
277
|
|
|
281
278
|
/**
|
|
@@ -283,13 +280,13 @@ export default class SliderControls {
|
|
|
283
280
|
*/
|
|
284
281
|
isEnabled(): boolean {
|
|
285
282
|
return this.#slider.isEnabled();
|
|
286
|
-
}
|
|
283
|
+
}
|
|
287
284
|
|
|
288
285
|
|
|
289
286
|
/**
|
|
290
287
|
* Destroy the slider and its controls
|
|
291
288
|
*/
|
|
292
|
-
destroy() {
|
|
289
|
+
destroy(): void {
|
|
293
290
|
clearTimeout( this.#autoslideTimeoutId );
|
|
294
291
|
this.#slider.destroy();
|
|
295
292
|
|
|
@@ -317,84 +314,88 @@ export default class SliderControls {
|
|
|
317
314
|
this.#inSlideKeyboardControls.off();
|
|
318
315
|
}
|
|
319
316
|
|
|
320
|
-
if ( this.#$bullets ) {
|
|
321
|
-
gestureOff( this.#options.$pagination
|
|
317
|
+
if ( this.#$bullets && this.#options.$pagination ) {
|
|
318
|
+
gestureOff( this.#options.$pagination, '__sliderBtPagination' );
|
|
322
319
|
}
|
|
323
320
|
|
|
324
321
|
if ( this.#options.swipe ) {
|
|
325
322
|
gestureOff( this.#slider.$slider, '__sliderSwipe' );
|
|
326
323
|
}
|
|
327
|
-
}
|
|
324
|
+
}
|
|
328
325
|
|
|
329
326
|
|
|
330
327
|
/**
|
|
331
328
|
* Start the autoslide
|
|
332
329
|
*/
|
|
333
|
-
startAutoslide() {
|
|
330
|
+
startAutoslide(): this {
|
|
334
331
|
if ( this.#options.autoslide ) {
|
|
335
332
|
this.#isAutoslideEnabled = true;
|
|
336
|
-
this
|
|
333
|
+
this.#autoslideLoop();
|
|
337
334
|
}
|
|
338
|
-
|
|
335
|
+
|
|
336
|
+
return this;
|
|
337
|
+
}
|
|
339
338
|
|
|
340
339
|
|
|
341
340
|
/**
|
|
342
341
|
* Stop the autoslide
|
|
343
342
|
*/
|
|
344
|
-
stopAutoslide() {
|
|
345
|
-
this
|
|
346
|
-
|
|
343
|
+
stopAutoslide(): this {
|
|
344
|
+
this.#_stopAutoslide();
|
|
345
|
+
|
|
346
|
+
return this;
|
|
347
|
+
}
|
|
347
348
|
|
|
348
349
|
|
|
349
|
-
|
|
350
|
+
#onPrev = ( e: Event, $target: HTMLElement ): void => {
|
|
350
351
|
e.preventDefault();
|
|
351
352
|
|
|
352
353
|
this.previous( $target );
|
|
353
354
|
}
|
|
354
355
|
|
|
355
356
|
|
|
356
|
-
|
|
357
|
+
#onNext = ( e: Event, $target: HTMLElement ): void => {
|
|
357
358
|
e.preventDefault();
|
|
358
359
|
|
|
359
360
|
this.next( $target );
|
|
360
361
|
}
|
|
361
362
|
|
|
362
363
|
|
|
363
|
-
|
|
364
|
+
#onPager = ( e: Event, $target: HTMLElement ): void => {
|
|
364
365
|
e.preventDefault();
|
|
365
366
|
|
|
366
367
|
this.goTo( index( $target ), $target );
|
|
367
368
|
}
|
|
368
369
|
|
|
369
370
|
|
|
370
|
-
|
|
371
|
+
#_stopAutoslide = (): void => {
|
|
371
372
|
clearTimeout( this.#autoslideTimeoutId );
|
|
372
373
|
this.#isAutoslideEnabled = false;
|
|
373
374
|
}
|
|
374
375
|
|
|
375
376
|
|
|
376
|
-
|
|
377
|
+
#makeAutoslide = (): void => {
|
|
377
378
|
this.#slider.next().then( () => {
|
|
378
379
|
if ( this.#isAutoslideEnabled ) {
|
|
379
|
-
this
|
|
380
|
+
this.#autoslideLoop();
|
|
380
381
|
}
|
|
381
382
|
} );
|
|
382
383
|
}
|
|
383
384
|
|
|
384
385
|
|
|
385
|
-
|
|
386
|
+
#autoslideLoop = (): void => {
|
|
386
387
|
const currentSlide = this.#slider.getCurrentSlide();
|
|
387
388
|
|
|
388
389
|
clearTimeout( this.#autoslideTimeoutId );
|
|
389
390
|
|
|
390
391
|
this.#autoslideTimeoutId = setTimeout(
|
|
391
|
-
this
|
|
392
|
-
( currentSlide.delay as number || this.#options.autoslide
|
|
392
|
+
this.#makeAutoslide,
|
|
393
|
+
( currentSlide.delay as number || this.#options.autoslide as number ) * 1000
|
|
393
394
|
);
|
|
394
395
|
}
|
|
395
396
|
|
|
396
397
|
|
|
397
|
-
|
|
398
|
+
#updateBullets = ( targetSlide: Slide, currentSlide?: Slide ): void => {
|
|
398
399
|
if ( !this.#$bullets ) {
|
|
399
400
|
return;
|
|
400
401
|
}
|
|
@@ -413,7 +414,7 @@ export default class SliderControls {
|
|
|
413
414
|
}
|
|
414
415
|
|
|
415
416
|
|
|
416
|
-
|
|
417
|
+
#updateBulletsFocus = ( data?: { currentSlide: FLib.Slider.SlideProperties, targetSlide: FLib.Slider.SlideProperties } ): void => {
|
|
417
418
|
const currentSlide = data ? data.targetSlide : this.#slider.getCurrentSlide();
|
|
418
419
|
|
|
419
420
|
if ( this.#$bullets && this.#$bullets[ currentSlide.index ] ) {
|
package/Modules/Tabs/Tab.ts
CHANGED
|
@@ -6,23 +6,23 @@ import { on, off } from '../../Events/EventsManager';
|
|
|
6
6
|
*/
|
|
7
7
|
export default class Tab {
|
|
8
8
|
|
|
9
|
-
#options:
|
|
9
|
+
#options: FLib.Tabs.TabOptions;
|
|
10
10
|
#$TAB: HTMLElement;
|
|
11
11
|
#$TAB_PANNEL: HTMLElement;
|
|
12
12
|
#isOpen: boolean;
|
|
13
13
|
#originalOpenedState: boolean;
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
get isOpened() {
|
|
16
|
+
get isOpened(): boolean {
|
|
17
17
|
return this.#isOpen;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
get index() {
|
|
20
|
+
get index(): number {
|
|
21
21
|
return this.#options.index;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
constructor( $TAB: HTMLElement, options:
|
|
25
|
+
constructor( $TAB: HTMLElement, options: FLib.Tabs.TabOptions ) {
|
|
26
26
|
this.#options = options;
|
|
27
27
|
this.#$TAB = $TAB;
|
|
28
28
|
|
|
@@ -46,12 +46,12 @@ export default class Tab {
|
|
|
46
46
|
} );
|
|
47
47
|
|
|
48
48
|
if ( this.#isOpen ) {
|
|
49
|
-
this
|
|
49
|
+
this.#openTab( true );
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
#changeTabState = ( isOpenAtStart?: boolean ): void => {
|
|
55
55
|
this.#$TAB.setAttribute( 'aria-selected', this.#isOpen ? 'true' : 'false' );
|
|
56
56
|
this.#$TAB.setAttribute( 'tabindex', this.#isOpen ? '0' : '-1' );
|
|
57
57
|
|
|
@@ -62,7 +62,7 @@ export default class Tab {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
#openTab = ( isOpenAtStart?: boolean ): void => {
|
|
66
66
|
this.#options.animations
|
|
67
67
|
.open( this.#$TAB, this.#$TAB_PANNEL )
|
|
68
68
|
.then( () => {
|
|
@@ -79,11 +79,11 @@ export default class Tab {
|
|
|
79
79
|
this.#options.onOpenTab( this );
|
|
80
80
|
}
|
|
81
81
|
this.#isOpen = true;
|
|
82
|
-
this
|
|
82
|
+
this.#changeTabState( isOpenAtStart );
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
#closeTab = ( autoClose?: boolean ): void => {
|
|
87
87
|
this.#options.animations
|
|
88
88
|
.close( this.#$TAB, this.#$TAB_PANNEL )
|
|
89
89
|
.then( () => {
|
|
@@ -92,39 +92,41 @@ export default class Tab {
|
|
|
92
92
|
}
|
|
93
93
|
} );
|
|
94
94
|
this.#isOpen = false;
|
|
95
|
-
this
|
|
95
|
+
this.#changeTabState();
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
|
|
99
|
-
#toggleTab = ( e ) => {
|
|
99
|
+
#toggleTab = ( e: Event ): void => {
|
|
100
100
|
e.preventDefault();
|
|
101
101
|
|
|
102
102
|
if( this.#isOpen ) {
|
|
103
|
-
this
|
|
103
|
+
this.#closeTab();
|
|
104
104
|
}
|
|
105
105
|
else {
|
|
106
|
-
this
|
|
106
|
+
this.#openTab();
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
|
|
111
|
-
close( autoClose?: boolean ) {
|
|
112
|
-
if(
|
|
113
|
-
|
|
111
|
+
close( autoClose?: boolean ): this {
|
|
112
|
+
if( this.#isOpen ) {
|
|
113
|
+
this.#closeTab( autoClose );
|
|
114
114
|
}
|
|
115
|
-
|
|
115
|
+
|
|
116
|
+
return this;
|
|
116
117
|
}
|
|
117
118
|
|
|
118
119
|
|
|
119
|
-
open( autoOpen?: boolean ) {
|
|
120
|
-
if( this.#isOpen ) {
|
|
121
|
-
|
|
120
|
+
open( autoOpen?: boolean ): this {
|
|
121
|
+
if( !this.#isOpen ) {
|
|
122
|
+
this.#openTab( autoOpen );
|
|
122
123
|
}
|
|
123
|
-
|
|
124
|
+
|
|
125
|
+
return this;
|
|
124
126
|
}
|
|
125
127
|
|
|
126
128
|
|
|
127
|
-
destroy() {
|
|
129
|
+
destroy(): this {
|
|
128
130
|
this.#options.animations.destroy( this.#$TAB, this.#$TAB_PANNEL );
|
|
129
131
|
|
|
130
132
|
off( this.#$TAB, {
|
|
@@ -133,5 +135,7 @@ export default class Tab {
|
|
|
133
135
|
} );
|
|
134
136
|
|
|
135
137
|
this.#$TAB.setAttribute( 'aria-selected', this.#originalOpenedState ? 'true' : 'false' );
|
|
136
|
-
|
|
138
|
+
|
|
139
|
+
return this;
|
|
140
|
+
}
|
|
137
141
|
}
|
package/Modules/Tabs/index.ts
CHANGED
|
@@ -33,6 +33,7 @@ const DEFAULT_OPTIONS = {
|
|
|
33
33
|
* Tabs
|
|
34
34
|
*
|
|
35
35
|
* @example
|
|
36
|
+
* ```ts
|
|
36
37
|
* new Tabs( document.querySelector( '.tabs' ), {
|
|
37
38
|
* "tabSelector": ".tab",
|
|
38
39
|
* "animations": {
|
|
@@ -62,9 +63,11 @@ const DEFAULT_OPTIONS = {
|
|
|
62
63
|
* console.log( 'close: ', $tab, $panel );
|
|
63
64
|
* }
|
|
64
65
|
* } );
|
|
66
|
+
* ```
|
|
65
67
|
*
|
|
66
68
|
* HTML:
|
|
67
69
|
*
|
|
70
|
+
* ```html
|
|
68
71
|
* <div class="tabs">
|
|
69
72
|
* <ul role="tablist">
|
|
70
73
|
* <li role="tab" id="tab-1" tabindex="-1" aria-selected="false" aria-controls="panel-1">Tab 1</li>
|
|
@@ -85,42 +88,43 @@ const DEFAULT_OPTIONS = {
|
|
|
85
88
|
* [Content 4]
|
|
86
89
|
* </div>
|
|
87
90
|
* </div>
|
|
91
|
+
* ```
|
|
88
92
|
*
|
|
89
93
|
* Set aria-selected to "true" and tabindex="0" on the tab you want open at start.
|
|
90
94
|
* If the tabs are displayed vertically, add aria-orientation="vertical" on the role="tablist" element
|
|
91
95
|
*/
|
|
92
96
|
export default class Tabs {
|
|
93
97
|
|
|
94
|
-
#options:
|
|
98
|
+
#options: FLib.Tabs.Options;
|
|
95
99
|
#$TABS_LIST: HTMLElement;
|
|
96
100
|
#$TABS: NodeList;
|
|
97
101
|
#tablist: Tab[];
|
|
98
102
|
#status: string;
|
|
99
103
|
#VERTICAL_MODE: boolean;
|
|
100
|
-
|
|
101
|
-
#keyboard
|
|
104
|
+
#lastOpenedTab: Tab | undefined;
|
|
105
|
+
#keyboard: KeyboardHandler | undefined;
|
|
102
106
|
#$tabsWrapper: HTMLElement;
|
|
103
107
|
|
|
104
108
|
#STATUS_ON = 'STATUS_ON';
|
|
105
109
|
#STATUS_OFF = 'STATUS_OFF';
|
|
106
110
|
|
|
107
|
-
constructor( $tabsWrapper, userOptions:
|
|
111
|
+
constructor( $tabsWrapper: HTMLElement, userOptions: Partial<FLib.Tabs.Options> ) {
|
|
108
112
|
this.#$tabsWrapper = $tabsWrapper;
|
|
109
113
|
|
|
110
114
|
this.#options = extend( DEFAULT_OPTIONS, userOptions );
|
|
111
115
|
|
|
112
|
-
this.#$TABS_LIST = $tabsWrapper.querySelector( '[role="tablist"]' );
|
|
116
|
+
this.#$TABS_LIST = $tabsWrapper.querySelector( '[role="tablist"]' ) as HTMLElement;
|
|
113
117
|
this.#$TABS = this.#$TABS_LIST.querySelectorAll( this.#options.tabSelector );
|
|
114
118
|
this.#tablist = [];
|
|
115
119
|
this.#status = this.#STATUS_OFF;
|
|
116
120
|
|
|
117
121
|
this.#VERTICAL_MODE = this.#$TABS_LIST.getAttribute( 'aria-orientation' ) === 'vertical';
|
|
118
122
|
|
|
119
|
-
this
|
|
123
|
+
this.#on();
|
|
120
124
|
}
|
|
121
125
|
|
|
122
126
|
|
|
123
|
-
#onOpenTab = ( tab: Tab ) => {
|
|
127
|
+
#onOpenTab = ( tab: Tab ): void => {
|
|
124
128
|
if ( this.#lastOpenedTab ) {
|
|
125
129
|
this.#lastOpenedTab.close( true );
|
|
126
130
|
}
|
|
@@ -129,21 +133,23 @@ export default class Tabs {
|
|
|
129
133
|
}
|
|
130
134
|
|
|
131
135
|
|
|
132
|
-
|
|
133
|
-
const
|
|
136
|
+
#onNext = (): void => {
|
|
137
|
+
const lastIndex = this.#lastOpenedTab ? this.#lastOpenedTab.index : 0;
|
|
138
|
+
const indexToOpen = lastIndex + 1 >= this.#tablist.length ? 0 : lastIndex + 1;
|
|
134
139
|
|
|
135
140
|
this.#tablist[ indexToOpen ].open();
|
|
136
141
|
}
|
|
137
142
|
|
|
138
143
|
|
|
139
|
-
|
|
140
|
-
const
|
|
144
|
+
#onPrevious = (): void => {
|
|
145
|
+
const lastIndex = this.#lastOpenedTab ? this.#lastOpenedTab.index : 0;
|
|
146
|
+
const indexToOpen = lastIndex - 1 < 0 ? this.#tablist.length - 1 : lastIndex - 1;
|
|
141
147
|
|
|
142
148
|
this.#tablist[ indexToOpen ].open();
|
|
143
149
|
}
|
|
144
150
|
|
|
145
151
|
|
|
146
|
-
|
|
152
|
+
#on = (): void => {
|
|
147
153
|
let hasAnOpenedTab;
|
|
148
154
|
|
|
149
155
|
if( this.#status === this.#STATUS_ON ) {
|
|
@@ -173,21 +179,21 @@ export default class Tabs {
|
|
|
173
179
|
if ( this.#VERTICAL_MODE ) {
|
|
174
180
|
this.#keyboard = new KeyboardHandler( this.#$tabsWrapper, {
|
|
175
181
|
"selector": this.#options.tabSelector,
|
|
176
|
-
"onUp": this
|
|
177
|
-
"onDown": this
|
|
182
|
+
"onUp": this.#onPrevious,
|
|
183
|
+
"onDown": this.#onNext
|
|
178
184
|
} );
|
|
179
185
|
}
|
|
180
186
|
else {
|
|
181
187
|
this.#keyboard = new KeyboardHandler( this.#$tabsWrapper, {
|
|
182
188
|
"selector": this.#options.tabSelector,
|
|
183
|
-
"onRight": this
|
|
184
|
-
"onLeft": this
|
|
189
|
+
"onRight": this.#onNext,
|
|
190
|
+
"onLeft": this.#onPrevious
|
|
185
191
|
} );
|
|
186
192
|
}
|
|
187
193
|
}
|
|
188
194
|
|
|
189
195
|
|
|
190
|
-
|
|
196
|
+
#off = (): void => {
|
|
191
197
|
if( this.#status === this.#STATUS_OFF ){
|
|
192
198
|
return;
|
|
193
199
|
}
|
|
@@ -197,23 +203,27 @@ export default class Tabs {
|
|
|
197
203
|
tab.destroy();
|
|
198
204
|
} );
|
|
199
205
|
|
|
200
|
-
this.#keyboard
|
|
206
|
+
this.#keyboard?.off();
|
|
201
207
|
}
|
|
202
208
|
|
|
203
209
|
|
|
204
210
|
/**
|
|
205
211
|
* Remove all events, css class, ...
|
|
206
212
|
*/
|
|
207
|
-
destroy() {
|
|
208
|
-
this
|
|
209
|
-
|
|
213
|
+
destroy(): this {
|
|
214
|
+
this.#off();
|
|
215
|
+
|
|
216
|
+
return this;
|
|
217
|
+
}
|
|
210
218
|
|
|
211
219
|
|
|
212
220
|
/**
|
|
213
221
|
* Restart the module
|
|
214
222
|
*/
|
|
215
|
-
update() {
|
|
216
|
-
this
|
|
217
|
-
this
|
|
218
|
-
|
|
223
|
+
update(): this {
|
|
224
|
+
this.#off();
|
|
225
|
+
this.#on();
|
|
226
|
+
|
|
227
|
+
return this;
|
|
228
|
+
}
|
|
219
229
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import isDate from './Tools/IsDate';
|
|
2
2
|
import { addValidator } from './index';
|
|
3
3
|
|
|
4
|
+
|
|
4
5
|
/**
|
|
5
6
|
* Date validation
|
|
6
7
|
*/
|
|
@@ -11,7 +12,7 @@ addValidator( 'date', '[data-date-control]', ( $input, value, isLiveValidation )
|
|
|
11
12
|
"isValid": value === '' ||
|
|
12
13
|
isDate(
|
|
13
14
|
value as string,
|
|
14
|
-
$input.getAttribute( 'data-date-control' ) ||
|
|
15
|
+
$input.getAttribute( 'data-date-control' ) || ''
|
|
15
16
|
),
|
|
16
17
|
"label": "date",
|
|
17
18
|
isLiveValidation
|
|
@@ -6,7 +6,7 @@ import { addValidator } from './index';
|
|
|
6
6
|
* "Two fields equals" validation
|
|
7
7
|
*/
|
|
8
8
|
addValidator( 'equals', '[data-equals]', ( $input, value, isLiveValidation ) => {
|
|
9
|
-
const name = $input.getAttribute( 'data-equals' )
|
|
9
|
+
const name = $input.getAttribute( 'data-equals' ) as string;
|
|
10
10
|
const $target = document.getElementById( name );
|
|
11
11
|
|
|
12
12
|
return Promise.resolve({
|