winduum 3.0.0-next.10 → 3.0.0-next.11

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "winduum",
3
- "version": "3.0.0-next.10",
3
+ "version": "3.0.0-next.11",
4
4
  "type": "module",
5
5
  "types": "types/index.d.ts",
6
6
  "main": "plugin/index.cjs",
@@ -1,3 +1,38 @@
1
+ /**
2
+ * @param {HTMLElement} element
3
+ * @param {boolean} vertical
4
+ * @returns {{ position: number, always: boolean }[]}
5
+ */
6
+ const getSnapPositions = (element, vertical) => {
7
+ const elementRect = element.getBoundingClientRect()
8
+ const scrollPosition = vertical ? element.scrollTop : element.scrollLeft
9
+ const clientSize = vertical ? element.clientHeight : element.clientWidth
10
+ const maxScroll = (vertical ? element.scrollHeight : element.scrollWidth) - clientSize
11
+
12
+ return [...element.children]
13
+ .map((child) => {
14
+ const childRect = child.getBoundingClientRect()
15
+ const start = (vertical ? childRect.top - elementRect.top : childRect.left - elementRect.left) + scrollPosition
16
+ const size = vertical ? childRect.height : childRect.width
17
+ const { scrollSnapAlign, scrollSnapStop } = getComputedStyle(child)
18
+ const align = scrollSnapAlign.split(' ').at(vertical ? 0 : -1)
19
+
20
+ if (align === 'none') return null
21
+
22
+ const position = align === 'end'
23
+ ? start + size - clientSize
24
+ : align === 'center'
25
+ ? start + (size - clientSize) / 2
26
+ : start
27
+
28
+ return {
29
+ position: Math.max(0, Math.min(position, maxScroll)),
30
+ always: scrollSnapStop === 'always',
31
+ }
32
+ })
33
+ .filter(snapPosition => snapPosition !== null)
34
+ }
35
+
1
36
  /**
2
37
  * @param {HTMLElement} element
3
38
  * @param {object} options
@@ -17,8 +52,36 @@ export const scrollBy = (element, { direction = 1, vertical = false, ratio = 0.8
17
52
  position: 'left',
18
53
  }
19
54
 
55
+ /* Safari does not snap after programmatic scrolls — browsers with native
56
+ scroll snap events are the ones that do, others get the exact snap offset */
57
+ if (!('onscrollsnapchanging' in window)) {
58
+ const scrollPosition = vertical ? element.scrollTop : element.scrollLeft
59
+ const targetPosition = scrollPosition + distance * direction
60
+ const passes = snapPosition => direction > 0 ? snapPosition.position > scrollPosition + 1 : snapPosition.position < scrollPosition - 1
61
+ const closer = (a, b) => direction > 0 ? a.position < b.position : a.position > b.position
62
+ const snapPositions = getSnapPositions(element, vertical).filter(passes)
63
+
64
+ if (snapPositions.length) {
65
+ let target = snapPositions.reduce((closest, current) =>
66
+ Math.abs(current.position - targetPosition) < Math.abs(closest.position - targetPosition) ? current : closest,
67
+ )
68
+
69
+ /* scroll-snap-stop: always must not be passed over */
70
+ const stop = snapPositions.reduce((first, current) =>
71
+ current.always && (!first || closer(current, first)) ? current : first, null)
72
+
73
+ if (stop && closer(stop, target)) target = stop
74
+
75
+ element.scrollTo({
76
+ [position]: target.position,
77
+ })
78
+
79
+ return
80
+ }
81
+ }
82
+
20
83
  element.scrollBy({
21
- [position]: (distance ?? element.clientWidth * ratio) * direction,
84
+ [position]: distance * direction,
22
85
  })
23
86
  }
24
87
 
@@ -0,0 +1,13 @@
1
+ export interface ValidateFieldOptions {
2
+ validationMessage?: string
3
+ selector?: string
4
+ validitySelector?: string
5
+ infoContent?: string
6
+ iconParentSelector?: string
7
+ iconSelector?: string
8
+ iconContent?: string
9
+ validIcon?: string | null
10
+ invalidIcon?: string
11
+ }
12
+
13
+ export function validateField(element: HTMLElement, options?: ValidateFieldOptions): void
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @param {HTMLElement} element
3
+ * @param {import("./").ValidateFieldOptions} options
4
+ * @returns void
5
+ */
6
+ export const validateField = (element, options = {}) => {
7
+ options = {
8
+ selector: ':is(input:not([type="hidden"]), textarea, select):not([readonly], [data-novalidate])',
9
+ validitySelector: '[data-validity]',
10
+ infoContent: '<div class="x-info text-error" data-validity></div>',
11
+ iconParentSelector: '.x-control',
12
+ iconSelector: '.ms-auto',
13
+ iconContent: '<div class="ms-auto"></div>',
14
+ validIcon: null,
15
+ invalidIcon: '<svg class="text-error" data-validity aria-hidden="true"><use href="#heroicons-outline/exclamation-circle"></use></svg>',
16
+ ...options,
17
+ }
18
+
19
+ const validationElements = [...element.querySelectorAll(options.selector)]
20
+
21
+ if (!validationElements.length) return
22
+
23
+ element.querySelectorAll(options.validitySelector).forEach(el => el.remove())
24
+
25
+ const invalidElements = validationElements.filter(validationElement => !validationElement.checkValidity())
26
+
27
+ validationElements.forEach((validationElement) => {
28
+ const icon = invalidElements.includes(validationElement) ? options.invalidIcon : options.validIcon
29
+ const iconParentElement = validationElement.closest(options.iconParentSelector)
30
+
31
+ if (!iconParentElement || !icon) return
32
+
33
+ if (!iconParentElement.querySelector(options.iconSelector)) {
34
+ iconParentElement.insertAdjacentHTML('beforeend', options.iconContent)
35
+ }
36
+
37
+ iconParentElement.querySelector(options.iconSelector).insertAdjacentHTML('afterbegin', icon)
38
+ })
39
+
40
+ if (!invalidElements.length) return
41
+
42
+ element.insertAdjacentHTML('beforeend', options.infoContent)
43
+ element.lastElementChild.textContent = options.validationMessage ?? invalidElements[0].dataset.validationMessage ?? invalidElements[0].validationMessage
44
+ }
45
+
46
+ export default {
47
+ validateField,
48
+ }
@@ -1,3 +1,5 @@
1
+ import { validateField, type ValidateFieldOptions } from "../field";
2
+
1
3
  export interface ValidateFormOptions {
2
4
  validateSelector?: string
3
5
  validateOptions?: ValidateFieldOptions
@@ -6,17 +8,4 @@ export interface ValidateFormOptions {
6
8
  submitterLoadingAttribute?: string
7
9
  }
8
10
 
9
- export interface ValidateFieldOptions {
10
- validationMessage?: string
11
- selector?: string
12
- validitySelector?: string
13
- infoContent?: string
14
- iconParentSelector?: string
15
- iconSelector?: string
16
- iconContent?: string
17
- validIcon?: string | null
18
- invalidIcon?: string
19
- }
20
-
21
11
  export function validateForm(event: Event | SubmitEvent, options?: ValidateFormOptions): void
22
- export function validateField(element: HTMLElement, options?: ValidateFieldOptions): void
@@ -1,3 +1,5 @@
1
+ import { validateField } from '../field/index.js'
2
+
1
3
  /**
2
4
  * @param {SubmitEvent & { target: HTMLFormElement }} event
3
5
  * @param {import("./").ValidateFormOptions} options
@@ -29,52 +31,6 @@ export const validateForm = (event, options = {}) => {
29
31
  })
30
32
  }
31
33
 
32
- /**
33
- * @param {HTMLElement} element
34
- * @param {import("./").ValidateFieldOptions} options
35
- * @returns void
36
- */
37
- export const validateField = (element, options = {}) => {
38
- options = {
39
- selector: ':is(input:not([type="hidden"]), textarea, select):not([readonly], [data-novalidate])',
40
- validitySelector: '[data-validity]',
41
- infoContent: '<div class="x-info text-error" data-validity></div>',
42
- iconParentSelector: '.x-control',
43
- iconSelector: '.ms-auto',
44
- iconContent: '<div class="ms-auto"></div>',
45
- validIcon: null,
46
- invalidIcon: '<svg class="text-error" data-validity aria-hidden="true"><use href="#heroicons-outline/exclamation-circle"></use></svg>',
47
- ...options,
48
- }
49
-
50
- const validationElements = [...element.querySelectorAll(options.selector)]
51
-
52
- if (!validationElements.length) return
53
-
54
- element.querySelectorAll(options.validitySelector).forEach(el => el.remove())
55
-
56
- const invalidElements = validationElements.filter(validationElement => !validationElement.checkValidity())
57
-
58
- validationElements.forEach((validationElement) => {
59
- const icon = invalidElements.includes(validationElement) ? options.invalidIcon : options.validIcon
60
- const iconParentElement = validationElement.closest(options.iconParentSelector)
61
-
62
- if (!iconParentElement || !icon) return
63
-
64
- if (!iconParentElement.querySelector(options.iconSelector)) {
65
- iconParentElement.insertAdjacentHTML('beforeend', options.iconContent)
66
- }
67
-
68
- iconParentElement.querySelector(options.iconSelector).insertAdjacentHTML('afterbegin', icon)
69
- })
70
-
71
- if (!invalidElements.length) return
72
-
73
- element.insertAdjacentHTML('beforeend', options.infoContent)
74
- element.lastElementChild.textContent = options.validationMessage ?? invalidElements[0].dataset.validationMessage ?? invalidElements[0].validationMessage
75
- }
76
-
77
34
  export default {
78
35
  validateForm,
79
- validateField,
80
36
  }
package/types/index.d.ts CHANGED
@@ -32,50 +32,35 @@ declare module 'winduum/supports' {
32
32
 
33
33
  export const supportsInterestFor: boolean;
34
34
 
35
+ export const supportsScrollInitialTarget: boolean;
36
+
37
+ export const supportsAnimationTimeline: boolean;
38
+
39
+ export const supportsScrollSnapEvents: boolean;
40
+
35
41
  export {};
36
42
  }
37
43
 
38
44
  declare module 'winduum/src/components/carousel' {
39
- export interface ObserveCarouselOptions {
40
- visibleAttribute?: string
41
- observerOptions?: {
42
- rootMargin?: string
43
- threshold?: number | number[]
44
- }
45
- }
46
-
47
- export interface PaginationCarouselOptions {
48
- element?: HTMLElement | Element
49
- itemContent?: string
50
- activeAttribute?: string
51
- }
45
+ export type CarouselPlacement = 'left' | 'right' | 'top' | 'bottom'
52
46
 
53
- export interface ScrollCarouselOptions {
54
- observe?: ObserveCarouselOptions
55
- pagination?: PaginationCarouselOptions
56
- progressElement?: HTMLProgressElement | Element
57
- counterMinElement?: HTMLElement | Element
58
- counterMaxElement?: HTMLElement | Element
47
+ export interface ScrollByOptions {
48
+ direction?: number
49
+ vertical?: boolean
50
+ ratio?: number
59
51
  }
60
52
 
61
- export interface AutoplayCarouselOptions {
62
- delay?: number
63
- pauseElements?: HTMLElement[] | Element[]
53
+ export interface ToggleScrollStateOptions {
54
+ prevElement?: HTMLButtonElement | null
55
+ nextElement?: HTMLButtonElement | null
56
+ vertical?: boolean
64
57
  }
65
58
 
66
- export interface DragCarouselOptions {
67
- activeAttribute?: string
68
- }
69
-
70
- export function scrollPrev(element: HTMLElement | Element): void
71
- export function scrollNext(element: HTMLElement | Element): void
72
- export function scrollTo(element: HTMLElement | Element, selected?: number): void
73
- export function getItemCount(element: HTMLElement | Element, scrollWidth?: number, mathFloor?: boolean): number
74
- export function observeCarousel(element: HTMLElement | Element, options?: ObserveCarouselOptions): void
75
- export function scrollCarousel(element: HTMLElement | Element, options?: ScrollCarouselOptions): void
76
- export function paginationCarousel(element: HTMLElement | Element, options?: PaginationCarouselOptions): void
77
- export function autoplayCarousel(element: HTMLElement | Element, options?: AutoplayCarouselOptions): void
78
- export function dragCarousel(element: HTMLElement | Element, options?: DragCarouselOptions): void
59
+ export function scrollBy(element: HTMLElement, options?: ScrollByOptions): void
60
+ export function toggleScrollState(element: HTMLElement, options?: ToggleScrollStateOptions): void
61
+ export function setCurrentAttribute(element: HTMLElement, index: number, attributeName?: string): void
62
+ export function setSnappedAttribute(element: HTMLElement, target: HTMLElement, markerGroupElement?: HTMLElement | null): void
63
+ export function scrollToMarker(element: HTMLElement, target: HTMLElement, markerGroupElement: HTMLElement, scrollIntoViewOptions?: ScrollIntoViewOptions): void
79
64
 
80
65
  export {};
81
66
  }
@@ -99,22 +84,33 @@ declare module 'winduum/src/components/dialog' {
99
84
  }
100
85
 
101
86
  declare module 'winduum/src/components/drawer' {
102
- export interface ScrollDrawerOptions {
103
- snapClass?: string
104
- opacityProperty?: string
105
- opacityRatio?: number
106
- scrollOpen?: number
107
- scrollClose?: number
108
- scrollSize?: number
109
- scrollDirection?:number
87
+ export type DrawerPlacement = 'left' | 'right' | 'top' | 'bottom'
88
+
89
+ export function isVerticalDrawer(placement: DrawerPlacement): boolean
90
+ export function scrollDrawer(element: HTMLElement | Element, placement: DrawerPlacement, reverse?: boolean, behavior?: 'auto' | 'instant'): void
91
+ export function showDrawer(element: HTMLElement | Element, placement: DrawerPlacement): Promise<void>
92
+ export function closeDrawer(element: HTMLElement | Element, placement: DrawerPlacement): void
93
+ export function drawerEvents(element: HTMLDialogElement | Element, contentElement: HTMLElement | Element, placement: DrawerPlacement, signal?: AbortSignal): void
94
+ export function drawerObserver(element: HTMLDialogElement | Element, placement: DrawerPlacement): IntersectionObserver
95
+ export function drawerProperties(element: HTMLElement | Element, placement: DrawerPlacement): ['top' | 'left', number, number]
96
+
97
+ export {};
98
+ }
99
+
100
+ declare module 'winduum/src/components/field' {
101
+ export interface ValidateFieldOptions {
102
+ validationMessage?: string
103
+ selector?: string
104
+ validitySelector?: string
105
+ infoContent?: string
106
+ iconParentSelector?: string
107
+ iconSelector?: string
108
+ iconContent?: string
109
+ validIcon?: string | null
110
+ invalidIcon?: string
110
111
  }
111
112
 
112
- export function showDrawer(element: HTMLElement | Element, distance?: number, direction?: 'left' | 'top'): void
113
- export function closeDrawer(element: HTMLElement | Element, distance?: number, direction?: 'left' | 'top'): void
114
- export function scrollInitDrawer(element: HTMLElement | Element, distance?: number, direction?: 'left' | 'top'): void
115
- export function toggleDrawerAttributes(element: HTMLDialogElement | Element, state?: 'open' | 'close', snapClass?: string): void
116
- export function scrollDrawerState(scrollState: number, scrollDirection: number): boolean
117
- export function scrollDrawer(element: HTMLDialogElement | Element, options?: ScrollDrawerOptions): void
113
+ export function validateField(element: HTMLElement, options?: ValidateFieldOptions): void
118
114
 
119
115
  export {};
120
116
  }
@@ -128,7 +124,8 @@ declare module 'winduum/src/components/form' {
128
124
  submitterLoadingAttribute?: string
129
125
  }
130
126
 
131
- export interface ValidateFieldOptions {
127
+ export function validateForm(event: Event | SubmitEvent, options?: ValidateFormOptions): void
128
+ interface ValidateFieldOptions {
132
129
  validationMessage?: string
133
130
  selector?: string
134
131
  validitySelector?: string
@@ -140,16 +137,15 @@ declare module 'winduum/src/components/form' {
140
137
  invalidIcon?: string
141
138
  }
142
139
 
143
- export function validateForm(event: Event | SubmitEvent, options?: ValidateFormOptions): void
144
- export function validateField(element: HTMLElement, options?: ValidateFieldOptions): void
140
+ function validateField(element: HTMLElement, options?: ValidateFieldOptions): void
145
141
 
146
142
  export {};
147
143
  }
148
144
 
149
145
  declare module 'winduum/src/components/tabs' {
150
146
  interface ToggleTabOptions {
151
- tabElements?: NodeListOf<Element>
152
- tabPanelElements?: NodeListOf<Element>
147
+ tabElements?: NodeListOf<Element> | Element[]
148
+ tabPanelElements?: NodeListOf<Element> | Element[]
153
149
  }
154
150
 
155
151
  export function toggleTab(element: HTMLElement | Element, options?: ToggleTabOptions): void
@@ -184,6 +180,7 @@ declare module 'winduum/src/components/toaster' {
184
180
  }
185
181
 
186
182
  export function closeToaster(element: HTMLElement, options?: CloseToastOptions): Promise<void>
183
+ export function toasterObserver(): MutationObserver
187
184
 
188
185
  export {};
189
186
  }
@@ -7,42 +7,33 @@
7
7
  "createPlugin",
8
8
  "supportsTimelineTrigger",
9
9
  "supportsInterestFor",
10
- "ObserveCarouselOptions",
11
- "PaginationCarouselOptions",
12
- "ScrollCarouselOptions",
13
- "AutoplayCarouselOptions",
14
- "DragCarouselOptions",
15
- "scrollPrev",
16
- "scrollNext",
17
- "scrollTo",
18
- "getItemCount",
19
- "observeCarousel",
20
- "scrollCarousel",
21
- "paginationCarousel",
22
- "autoplayCarousel",
23
- "dragCarousel",
10
+ "supportsScrollInitialTarget",
11
+ "supportsAnimationTimeline",
12
+ "supportsScrollSnapEvents",
13
+ "CarouselPlacement",
14
+ "ScrollByOptions",
15
+ "ToggleScrollStateOptions",
16
+ "scrollBy",
17
+ "toggleScrollState",
18
+ "setCurrentAttribute",
19
+ "setSnappedAttribute",
20
+ "scrollToMarker",
24
21
  "SetPositionOptions",
25
22
  "setPosition",
26
23
  "setKeyboardStep",
27
24
  "setMouseStep",
28
- "DefaultOptions",
29
- "defaultOptions",
30
- "showDetails",
31
- "closeDetails",
32
- "toggleDetails",
33
- "showDialog",
34
- "closeDialog",
35
- "ScrollDrawerOptions",
25
+ "DrawerPlacement",
26
+ "isVerticalDrawer",
27
+ "scrollDrawer",
36
28
  "showDrawer",
37
29
  "closeDrawer",
38
- "scrollInitDrawer",
39
- "toggleDrawerAttributes",
40
- "scrollDrawerState",
41
- "scrollDrawer",
42
- "ValidateFormOptions",
30
+ "drawerEvents",
31
+ "drawerObserver",
32
+ "drawerProperties",
43
33
  "ValidateFieldOptions",
44
- "validateForm",
45
34
  "validateField",
35
+ "ValidateFormOptions",
36
+ "validateForm",
46
37
  "ToggleTabOptions",
47
38
  "toggleTab",
48
39
  "ShowToastOptions",
@@ -50,11 +41,9 @@
50
41
  "closeToast",
51
42
  "showToast",
52
43
  "closeToaster",
53
- "ShowPopoverOptions",
54
- "HidePopoverOptions",
55
- "showPopover",
56
- "hidePopover",
57
- "togglePopover",
44
+ "toasterObserver",
45
+ "computePositionPopover",
46
+ "autoUpdatePopover",
58
47
  "SetTrackPropertyOptions",
59
48
  "SetValueOptions",
60
49
  "SetOutputOptions",
@@ -70,9 +59,8 @@
70
59
  "../src/supports.js",
71
60
  "../src/components/carousel/index.d.ts",
72
61
  "../src/components/compare/index.d.ts",
73
- "../src/components/details/index.d.ts",
74
- "../src/components/dialog/index.d.ts",
75
62
  "../src/components/drawer/index.d.ts",
63
+ "../src/components/field/index.d.ts",
76
64
  "../src/components/form/index.d.ts",
77
65
  "../src/components/tabs/index.d.ts",
78
66
  "../src/components/toast/index.d.ts",
@@ -96,9 +84,8 @@
96
84
  null,
97
85
  null,
98
86
  null,
99
- null,
100
87
  null
101
88
  ],
102
- "mappings": ";;kBAEiBA,aAAaA;;;;;;;;;;;;;;;;;;;;cAoBjBC,aAAaA;;yBAEFC,YAAYA;;;;;;cCrBvBC,uBAAuBA;;cAKvBC,mBAAmBA;;;;;;kBCRfC,sBAAsBA;;;;;;;;kBAQtBC,yBAAyBA;;;;;;kBAMzBC,qBAAqBA;;;;;;;;kBAQrBC,uBAAuBA;;;;;kBAKvBC,mBAAmBA;;;;iBAIpBC,UAAUA;iBACVC,UAAUA;iBACVC,QAAQA;iBACRC,YAAYA;iBACZC,eAAeA;iBACfC,cAAcA;iBACdC,kBAAkBA;iBAClBC,gBAAgBA;iBAChBC,YAAYA;;;;;;kBCvCXC,kBAAkBA;;;;;iBAKnBC,WAAWA;iBACXC,eAAeA;iBACfC,YAAYA;;;;;;kBCPXC,cAAcA;;;;;cAKlBC,cAAcA;iBACXC,WAAWA;iBACXC,YAAYA;iBACZC,aAAaA;;;;;;kBCRZJ,cAAcA;;;;;;;;;;cAUlBC,cAAcA;iBACXI,UAAUA;iBACVC,WAAWA;;;;;;kBCZVC,mBAAmBA;;;;;;;;;;iBAUpBC,UAAUA;iBACVC,WAAWA;iBACXC,gBAAgBA;iBAChBC,sBAAsBA;iBACtBC,iBAAiBA;iBACjBC,YAAYA;;;;;;kBCfXC,mBAAmBA;;;;;;;;kBAQnBC,oBAAoBA;;;;;;;;;;;;;;;;;;;iBAmBrBC,YAAYA;iBACZC,aAAaA;;;;;;WC5BnBC,gBAAgBA;;;;;iBAKVC,SAASA;;;;;;kBCLRC,gBAAgBA;;;;;;;kBAOhBC,iBAAiBA;;;;;;iBAMlBC,UAAUA;iBACVC,SAASA;;;;;;kBCdRF,iBAAiBA;;;;;iBAKlBG,YAAYA;;;;;;;kBCHXC,kBAAkBA;;;;;;;;;;;kBAWlBC,kBAAkBA;;;;iBAInBC,WAAWA;iBACXC,WAAWA;iBACXC,aAAaA;;;;;;kBCnBZC,uBAAuBA;;;;;;;kBAOvBC,eAAeA;;;;;kBAKfC,gBAAgBA;;;;;iBAKjBC,gBAAgBA;iBAChBC,QAAQA;iBACRC,cAAcA;;;;;;kBCnBbC,eAAeA;;;;;;iBAMhBC,UAAUA;;;;;;iBCNVC,UAAUA",
89
+ "mappings": ";;kBAEiBA,aAAaA;;;;;;;;;;;;;;;;;;;;cAoBjBC,aAAaA;;yBAEFC,YAAYA;;;;;;cCrBvBC,uBAAuBA;;cAKvBC,mBAAmBA;;cAKnBC,2BAA2BA;;cAK3BC,yBAAyBA;;cAKzBC,wBAAwBA;;;;;;aCvBzBC,iBAAiBA;;kBAEZC,eAAeA;;;;;;kBAMfC,wBAAwBA;;;;;;iBAMzBC,QAAQA;iBACRC,iBAAiBA;iBACjBC,mBAAmBA;iBACnBC,mBAAmBA;iBACnBC,cAAcA;;;;;;kBClBbC,kBAAkBA;;;;;iBAKnBC,WAAWA;iBACXC,eAAeA;iBACfC,YAAYA;;;;;;;;;;;aCPhBC,eAAeA;;iBAEXC,gBAAgBA;iBAChBC,YAAYA;iBACZC,UAAUA;iBACVC,WAAWA;iBACXC,YAAYA;iBACZC,cAAcA;iBACdC,gBAAgBA;;;;;;kBCRfC,oBAAoBA;;;;;;;;;;;;iBAYrBC,aAAaA;;;;;;kBCVZC,mBAAmBA;;;;;;;;iBAQpBC,YAAYA;WDVXH,oBAAoBA;;;;;;;;;;;;UAYrBC,aAAaA;;;;;;WEZnBG,gBAAgBA;;;;;iBAKVC,SAASA;;;;;;kBCLRC,gBAAgBA;;;;;;;kBAOhBC,iBAAiBA;;;;;;iBAMlBC,UAAUA;iBACVC,SAASA;;;;;;kBCdRF,iBAAiBA;;;;;iBAKlBG,YAAYA;iBACZC,eAAeA;;;;;;;;kBCHPC,sBAAsBA;;;;;;;kBAOtBC,iBAAiBA;;;;;;;;;;;kBCVxBC,uBAAuBA;;;;;;;kBAOvBC,eAAeA;;;;;kBAKfC,gBAAgBA;;;;;iBAKjBC,gBAAgBA;iBAChBC,QAAQA;iBACRC,cAAcA;;;;;;kBCnBbC,eAAeA;;;;;;iBAMhBC,UAAUA;;;;;;iBCNVC,UAAUA",
103
90
  "ignoreList": []
104
91
  }