@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.
Files changed (141) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/DOM/Class.ts +10 -12
  3. package/DOM/DocumentSize.ts +3 -1
  4. package/DOM/Filter.ts +0 -2
  5. package/DOM/Index.ts +1 -3
  6. package/DOM/Manipulation.ts +0 -3
  7. package/DOM/Matrix.ts +12 -12
  8. package/DOM/Offset.ts +4 -5
  9. package/DOM/OuterSize.ts +12 -12
  10. package/DOM/PageToDOM.ts +2 -2
  11. package/DOM/Position.ts +3 -3
  12. package/DOM/Size.ts +3 -7
  13. package/DOM/StrToDOM.ts +0 -1
  14. package/DOM/Styles.ts +3 -12
  15. package/DOM/Traversing.ts +0 -6
  16. package/DOM/WindowScroll.ts +3 -1
  17. package/DOM/WindowSize.ts +3 -1
  18. package/DOM/Wrap.ts +0 -1
  19. package/Events/DeviceOrientation.ts +27 -31
  20. package/Events/EventsManager.ts +10 -25
  21. package/Events/Gesture.ts +36 -37
  22. package/Events/HistoryController.ts +11 -17
  23. package/Events/ImageLoad.ts +35 -19
  24. package/Events/IntersectObserver.ts +15 -19
  25. package/Events/KeyboardHandler.ts +10 -8
  26. package/Events/MediaQueriesEvents.ts +53 -51
  27. package/Events/OnAnimationEnd.ts +2 -3
  28. package/Events/OnTransitionEnd.ts +3 -3
  29. package/Events/PubSub.ts +5 -8
  30. package/Events/TouchHover.ts +18 -21
  31. package/Events/WindowEvents.ts +26 -30
  32. package/Helpers/Colors.ts +7 -23
  33. package/Helpers/Cookie.ts +5 -12
  34. package/Helpers/Coordinates.ts +0 -7
  35. package/Helpers/Debounce.ts +3 -7
  36. package/Helpers/Defer.ts +1 -1
  37. package/Helpers/GetValue.ts +0 -2
  38. package/Helpers/Insert.ts +0 -1
  39. package/Helpers/Sequential.ts +0 -2
  40. package/Helpers/Slice.ts +0 -3
  41. package/Helpers/Throttle.ts +0 -1
  42. package/Helpers/TransitionHelpers.ts +8 -6
  43. package/Helpers/Type.ts +1 -14
  44. package/Helpers/Unique.ts +3 -3
  45. package/Helpers/UrlParser.ts +13 -22
  46. package/Helpers/Wait.ts +1 -1
  47. package/Modules/Accordion/Tab.ts +18 -16
  48. package/Modules/Accordion/index.ts +24 -16
  49. package/Modules/Autocomplete.ts +95 -101
  50. package/Modules/DragSlider.ts +72 -63
  51. package/Modules/GlobalState.ts +60 -53
  52. package/Modules/LoadGMap.ts +4 -7
  53. package/Modules/Notifications/Notification.ts +28 -32
  54. package/Modules/Notifications/index.ts +43 -36
  55. package/Modules/Popin/Popin.ts +100 -110
  56. package/Modules/Popin/PopinAccessibility.ts +8 -8
  57. package/Modules/Popin/PopinBackground.ts +11 -11
  58. package/Modules/Popin/PopinController.ts +23 -29
  59. package/Modules/Popin/Tools.ts +18 -19
  60. package/Modules/QuickTemplate.ts +4 -6
  61. package/Modules/ScrollSnap.ts +110 -104
  62. package/Modules/SkinCheckbox.ts +51 -37
  63. package/Modules/SkinFile.ts +62 -52
  64. package/Modules/SkinRadio.ts +62 -42
  65. package/Modules/SkinSelect.ts +116 -100
  66. package/Modules/Slider/Slide.ts +49 -52
  67. package/Modules/Slider/Slider.ts +100 -136
  68. package/Modules/Slider/SliderControls.ts +60 -59
  69. package/Modules/Tabs/Tab.ts +27 -23
  70. package/Modules/Tabs/index.ts +35 -25
  71. package/Modules/Validator/Date.ts +2 -1
  72. package/Modules/Validator/Equals.ts +1 -1
  73. package/Modules/Validator/Internal/Input.ts +370 -0
  74. package/Modules/Validator/Internal/InputValidator.ts +99 -0
  75. package/Modules/Validator/Internal/ValidatorFunctionsController.ts +58 -0
  76. package/Modules/Validator/Max.ts +1 -1
  77. package/Modules/Validator/Min.ts +1 -1
  78. package/Modules/Validator/MultiRequired.ts +5 -5
  79. package/Modules/Validator/Number.ts +1 -0
  80. package/Modules/Validator/Pattern.ts +1 -1
  81. package/Modules/Validator/Recaptcha.ts +1 -0
  82. package/Modules/Validator/Required.ts +3 -2
  83. package/Modules/Validator/ServerCheck.ts +23 -15
  84. package/Modules/Validator/Tools/GetQueryFromForm.ts +1 -6
  85. package/Modules/Validator/Tools/IsDate.ts +2 -3
  86. package/Modules/Validator/Tools/IsEmail.ts +2 -5
  87. package/Modules/Validator/Tools/IsEmpty.ts +0 -2
  88. package/Modules/Validator/Tools/IsNumber.ts +0 -2
  89. package/Modules/Validator/Tools/IsUrl.ts +1 -3
  90. package/Modules/Validator/Tools/Label.ts +5 -15
  91. package/Modules/Validator/Tools/RadioButton.ts +4 -10
  92. package/Modules/Validator/Url.ts +1 -0
  93. package/Modules/Validator/index.ts +36 -36
  94. package/Modules/YouTubePlayer.ts +18 -16
  95. package/README.md +1 -1
  96. package/Types/Accordion.d.ts +36 -0
  97. package/Types/Autocomplete.d.ts +95 -0
  98. package/Types/DOM.d.ts +69 -0
  99. package/Types/DragSlider.d.ts +56 -0
  100. package/Types/EventsHelpers.d.ts +390 -0
  101. package/Types/GLImageTransition.d.ts +47 -43
  102. package/Types/GlobalState.d.ts +9 -0
  103. package/Types/Helpers.d.ts +30 -0
  104. package/Types/Notifications.d.ts +48 -44
  105. package/Types/Popin.d.ts +95 -0
  106. package/Types/ScrollSnap.d.ts +66 -0
  107. package/Types/SkinCheckbox.d.ts +26 -0
  108. package/Types/SkinFile.d.ts +38 -0
  109. package/Types/SkinRadio.d.ts +28 -0
  110. package/Types/SkinSelect.d.ts +59 -0
  111. package/Types/Slider.d.ts +106 -0
  112. package/Types/Tabs.d.ts +26 -0
  113. package/Types/Validator.d.ts +72 -0
  114. package/Types/YouTubePlayer.d.ts +27 -0
  115. package/Types/index.d.ts +22 -21
  116. package/WebGL/GLImageTransition/GLImageTransition.ts +83 -80
  117. package/WebGL/GLImageTransition/Presets/Cellular.ts +11 -11
  118. package/WebGL/GLImageTransition/Presets/Fade.ts +2 -3
  119. package/WebGL/GLImageTransition/Presets/HorizontalMovingGrid.ts +9 -9
  120. package/WebGL/GLImageTransition/Presets/PresetSample.ts +11 -9
  121. package/WebGL/GLImageTransition/Presets/Solarisation.ts +7 -12
  122. package/package.json +1 -1
  123. package/Modules/Template.ts +0 -209
  124. package/Types/AccordionTypes.d.ts +0 -29
  125. package/Types/AutocompleteTypes.d.ts +0 -85
  126. package/Types/DOMTypes.d.ts +0 -62
  127. package/Types/DragSliderTypes.d.ts +0 -52
  128. package/Types/EventsHelpersTypes.d.ts +0 -370
  129. package/Types/GlobalStateTypes.d.ts +0 -5
  130. package/Types/HelpersTypes.d.ts +0 -23
  131. package/Types/MediaPreloaderTypes.d.ts +0 -12
  132. package/Types/PopinTypes.d.ts +0 -83
  133. package/Types/ScrollSnapTypes.d.ts +0 -62
  134. package/Types/SkinCheckboxTypes.d.ts +0 -23
  135. package/Types/SkinFileTypes.d.ts +0 -34
  136. package/Types/SkinRadioTypes.d.ts +0 -24
  137. package/Types/SkinSelectTypes.d.ts +0 -48
  138. package/Types/SliderTypes.d.ts +0 -97
  139. package/Types/TabsTypes.d.ts +0 -22
  140. package/Types/ValidatorTypes.d.ts +0 -61
  141. 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: NodeList | null = null;
38
+ #$bullets: NodeListOf<HTMLElement> | null = null;
37
39
  #paginationKeyboardControls;
38
40
  #inSlideKeyboardControls;
39
- #isAutoslideEnabled: boolean = false;
40
- #options: SliderControlsOptionsType;
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: SliderControlsOptionsType ) {
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.updateBullets( data.targetSlide, data.currentSlide );
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.updateBullets( data.currentSlide );
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
- let matchSlide = slider.getSlide( index );
86
+ const matchSlide = slider.getSlide( index );
85
87
 
86
- ($bullet as HTMLElement).setAttribute( 'role', 'tab' );
87
- ($bullet as HTMLElement).setAttribute( 'aria-selected', 'false' );
88
- ($bullet as HTMLElement).setAttribute( 'tabindex', '-1' );
89
- ($bullet as HTMLElement).setAttribute( 'aria-controls', matchSlide.id );
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.onPrev.bind( 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.onNext.bind( this ),
105
+ "tap": this.#onNext.bind( this ),
104
106
  } );
105
107
  }
106
108
 
107
- if ( this.#$bullets ) {
108
- gesture( options.$pagination!, '__sliderBtPagination', {
109
+ if ( this.#$bullets && options.$pagination ) {
110
+ gesture( options.$pagination, '__sliderBtPagination', {
109
111
  "selector": options.paginationItemsSelector,
110
- "tap": this.onPager.bind( 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
- if ( options.gestureOptions!.swipeLeft ) {
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
- if ( options.gestureOptions!.swipeRight ) {
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.updateBulletsFocus();
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.updateBulletsFocus
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.updateBulletsFocus
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.updateBulletsFocus
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.updateBulletsFocus
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.onNext.bind( 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.onPrev.bind( 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._stopAutoslide();
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._stopAutoslide();
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._stopAutoslide();
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!, '__sliderBtPagination' );
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.autoslideLoop();
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._stopAutoslide();
346
- };
343
+ stopAutoslide(): this {
344
+ this.#_stopAutoslide();
345
+
346
+ return this;
347
+ }
347
348
 
348
349
 
349
- public onPrev( e, $target: HTMLElement ) {
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
- private onNext( e, $target: HTMLElement ) {
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
- private onPager( e, $target: HTMLElement ) {
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
- private _stopAutoslide() {
371
+ #_stopAutoslide = (): void => {
371
372
  clearTimeout( this.#autoslideTimeoutId );
372
373
  this.#isAutoslideEnabled = false;
373
374
  }
374
375
 
375
376
 
376
- private makeAutoslide() {
377
+ #makeAutoslide = (): void => {
377
378
  this.#slider.next().then( () => {
378
379
  if ( this.#isAutoslideEnabled ) {
379
- this.autoslideLoop();
380
+ this.#autoslideLoop();
380
381
  }
381
382
  } );
382
383
  }
383
384
 
384
385
 
385
- private autoslideLoop() {
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.makeAutoslide,
392
- ( currentSlide.delay as number || this.#options.autoslide! as number ) * 1000
392
+ this.#makeAutoslide,
393
+ ( currentSlide.delay as number || this.#options.autoslide as number ) * 1000
393
394
  );
394
395
  }
395
396
 
396
397
 
397
- private updateBullets( targetSlide: Slide, currentSlide?: Slide ) {
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
- private updateBulletsFocus( data? ) {
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 ] ) {
@@ -6,23 +6,23 @@ import { on, off } from '../../Events/EventsManager';
6
6
  */
7
7
  export default class Tab {
8
8
 
9
- #options: TabOptionsType;
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: TabOptionsType ) {
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.openTab( true );
49
+ this.#openTab( true );
50
50
  }
51
51
  }
52
52
 
53
53
 
54
- private changeTabState( isOpenAtStart?: boolean ) {
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
- private openTab( isOpenAtStart?: boolean ) {
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.changeTabState( isOpenAtStart );
82
+ this.#changeTabState( isOpenAtStart );
83
83
  }
84
84
 
85
85
 
86
- private closeTab( autoClose?: boolean ) {
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.changeTabState();
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.closeTab();
103
+ this.#closeTab();
104
104
  }
105
105
  else {
106
- this.openTab();
106
+ this.#openTab();
107
107
  }
108
108
  }
109
109
 
110
110
 
111
- close( autoClose?: boolean ) {
112
- if( !this.#isOpen ) {
113
- return;
111
+ close( autoClose?: boolean ): this {
112
+ if( this.#isOpen ) {
113
+ this.#closeTab( autoClose );
114
114
  }
115
- this.closeTab( autoClose );
115
+
116
+ return this;
116
117
  }
117
118
 
118
119
 
119
- open( autoOpen?: boolean ) {
120
- if( this.#isOpen ) {
121
- return;
120
+ open( autoOpen?: boolean ): this {
121
+ if( !this.#isOpen ) {
122
+ this.#openTab( autoOpen );
122
123
  }
123
- this.openTab( autoOpen );
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
  }
@@ -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: TabsOptionsType;
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
- #lastOpenedTab!: Tab;
101
- #keyboard!: KeyboardHandler;
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: TabsOptionsType ) {
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.on();
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
- private onNext() {
133
- const indexToOpen = this.#lastOpenedTab.index + 1 >= this.#tablist.length ? 0 : this.#lastOpenedTab.index + 1;
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
- private onPrevious() {
140
- const indexToOpen = this.#lastOpenedTab.index - 1 < 0 ? this.#tablist.length - 1 : this.#lastOpenedTab.index - 1;
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
- private on() {
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.onPrevious,
177
- "onDown": this.onNext
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.onNext,
184
- "onLeft": this.onPrevious
189
+ "onRight": this.#onNext,
190
+ "onLeft": this.#onPrevious
185
191
  } );
186
192
  }
187
193
  }
188
194
 
189
195
 
190
- private off() {
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.off();
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.off();
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.off();
217
- this.on();
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({