slim-select 3.4.2 → 3.5.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/dist/classes.d.ts +46 -0
- package/dist/helpers.d.ts +5 -0
- package/dist/index.d.ts +53 -318
- package/dist/index.umd.d.ts +2 -0
- package/dist/react/index.d.ts +4 -318
- package/dist/react/index.js +1459 -1696
- package/dist/react/index.umd.js +2 -2
- package/dist/react/react.d.ts +17 -0
- package/dist/react/react.test.d.ts +1 -0
- package/dist/react/slim-select/react/index.d.ts +4 -0
- package/dist/render.d.ts +88 -0
- package/dist/select.d.ts +38 -0
- package/dist/settings.d.ts +39 -0
- package/dist/slimselect.cjs.js +2 -2
- package/dist/slimselect.cjs.js.map +1 -1
- package/dist/slimselect.css +1 -1
- package/dist/slimselect.css.map +1 -1
- package/dist/slimselect.es.js +1233 -1384
- package/dist/slimselect.es.js.map +1 -1
- package/dist/slimselect.iife.js +2 -2
- package/dist/slimselect.iife.js.map +1 -1
- package/dist/slimselect.js +2 -2
- package/dist/slimselect.js.map +1 -1
- package/dist/src/docs/main.d.ts +0 -0
- package/dist/src/docs/router.d.ts +2 -0
- package/dist/src/docs/store.d.ts +12 -0
- package/dist/store.d.ts +53 -0
- package/dist/vue/index.d.ts +4 -318
- package/dist/vue/index.js +1335 -1503
- package/dist/vue/index.umd.js +1 -1
- package/dist/vue/slim-select/vue/index.d.ts +4 -0
- package/package.json +30 -36
- package/src/slim-select/slimselect.scss +34 -5
- package/.nvmrc +0 -1
- package/.prettierignore +0 -1
- package/.prettierrc +0 -7
- package/CODE_OF_CONDUCT.md +0 -46
- package/CONTRIBUTING.md +0 -1
- package/cdn.html +0 -21
- package/docs.go +0 -12
- package/example.html +0 -25
- package/index.html +0 -76
- package/release.js +0 -191
- package/sitemap.js +0 -108
- package/src/slim-select/accessibility.test.ts +0 -782
- package/src/slim-select/classes.test.ts +0 -73
- package/src/slim-select/classes.ts +0 -117
- package/src/slim-select/helpers.test.ts +0 -162
- package/src/slim-select/helpers.ts +0 -61
- package/src/slim-select/index.test.ts +0 -1356
- package/src/slim-select/index.ts +0 -594
- package/src/slim-select/index.umd.ts +0 -8
- package/src/slim-select/react/index.tsx +0 -9
- package/src/slim-select/react/react.test.tsx +0 -498
- package/src/slim-select/react/react.tsx +0 -209
- package/src/slim-select/render.test.ts +0 -1877
- package/src/slim-select/render.ts +0 -1765
- package/src/slim-select/select.test.ts +0 -683
- package/src/slim-select/select.ts +0 -659
- package/src/slim-select/settings.test.ts +0 -285
- package/src/slim-select/settings.ts +0 -78
- package/src/slim-select/store.test.ts +0 -1007
- package/src/slim-select/store.ts +0 -433
- package/src/slim-select/vue/index.ts +0 -9
- package/src/slim-select/vue/vue.test.ts +0 -1091
- package/src/slim-select/vue/vue.vue +0 -224
- package/tsconfig.json +0 -26
- package/vite.config.docs.mts +0 -29
- package/vite.config.lib.es-cjs.ts +0 -40
- package/vite.config.lib.umd-iife.ts +0 -34
- package/vite.config.react.mts +0 -41
- package/vite.config.vue.mts +0 -40
- package/vitest.config.ts +0 -30
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { describe, expect, test } from 'vitest'
|
|
4
|
-
import CssClasses from './classes'
|
|
5
|
-
|
|
6
|
-
const defaultClasses: { [key: string]: string } = {
|
|
7
|
-
main: 'ss-main',
|
|
8
|
-
placeholder: 'ss-placeholder',
|
|
9
|
-
values: 'ss-values',
|
|
10
|
-
single: 'ss-single',
|
|
11
|
-
max: 'ss-max',
|
|
12
|
-
value: 'ss-value',
|
|
13
|
-
valueText: 'ss-value-text',
|
|
14
|
-
valueDelete: 'ss-value-delete',
|
|
15
|
-
valueOut: 'ss-value-out',
|
|
16
|
-
deselect: 'ss-deselect',
|
|
17
|
-
deselectPath: 'M10,10 L90,90 M10,90 L90,10',
|
|
18
|
-
arrow: 'ss-arrow',
|
|
19
|
-
arrowClose: 'M10,30 L50,70 L90,30',
|
|
20
|
-
arrowOpen: 'M10,70 L50,30 L90,70',
|
|
21
|
-
content: 'ss-content',
|
|
22
|
-
contentOpen: 'ss-open',
|
|
23
|
-
dirAbove: 'ss-dir-above',
|
|
24
|
-
dirBelow: 'ss-dir-below',
|
|
25
|
-
search: 'ss-search',
|
|
26
|
-
searchHighlighter: 'ss-search-highlight',
|
|
27
|
-
searching: 'ss-searching',
|
|
28
|
-
addable: 'ss-addable',
|
|
29
|
-
addablePath: 'M50,10 L50,90 M10,50 L90,50',
|
|
30
|
-
list: 'ss-list',
|
|
31
|
-
optgroup: 'ss-optgroup',
|
|
32
|
-
optgroupLabel: 'ss-optgroup-label',
|
|
33
|
-
optgroupLabelText: 'ss-optgroup-label-text',
|
|
34
|
-
optgroupActions: 'ss-optgroup-actions',
|
|
35
|
-
optgroupSelectAll: 'ss-selectall',
|
|
36
|
-
optgroupSelectAllBox: 'M60,10 L10,10 L10,90 L90,90 L90,50',
|
|
37
|
-
optgroupSelectAllCheck: 'M30,45 L50,70 L90,10',
|
|
38
|
-
optgroupClosable: 'ss-closable',
|
|
39
|
-
option: 'ss-option',
|
|
40
|
-
optionDelete: 'M10,10 L90,90 M10,90 L90,10',
|
|
41
|
-
highlighted: 'ss-highlighted',
|
|
42
|
-
mainOpen: 'ss-open',
|
|
43
|
-
close: 'ss-close',
|
|
44
|
-
selected: 'ss-selected',
|
|
45
|
-
error: 'ss-error',
|
|
46
|
-
disabled: 'ss-disabled',
|
|
47
|
-
hide: 'ss-hide'
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
describe('CssClasses module', () => {
|
|
51
|
-
test('empty constructor returns default classes', () => {
|
|
52
|
-
// We test the traditional classes here. Since old versions of slim-select didn't allow CSS class overrides, users
|
|
53
|
-
// may have written their CSS to match those classes, which means we should never change them in the library.
|
|
54
|
-
|
|
55
|
-
// Convert to unknown and then to custom object to prevent TS from throwing errors
|
|
56
|
-
const classes = new CssClasses() as unknown as { [key: string]: string }
|
|
57
|
-
Object.keys(defaultClasses).forEach((key) => {
|
|
58
|
-
expect(classes[key]).toBe(defaultClasses[key])
|
|
59
|
-
})
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
test('classes can be added via the constructor', () => {
|
|
63
|
-
const classesWithOverride = JSON.parse(JSON.stringify(defaultClasses))
|
|
64
|
-
classesWithOverride['main'] = 'ss-main new-main'
|
|
65
|
-
classesWithOverride['mainOpen'] = 'ss-open new-open'
|
|
66
|
-
|
|
67
|
-
// Convert to unknown and then to custom object to prevent TS from throwing errors
|
|
68
|
-
const classes = new CssClasses({ main: 'new-main', mainOpen: 'new-open' }) as unknown as { [key: string]: string }
|
|
69
|
-
Object.keys(classesWithOverride).forEach((key) => {
|
|
70
|
-
expect(classes[key]).toBe(classesWithOverride[key])
|
|
71
|
-
})
|
|
72
|
-
})
|
|
73
|
-
})
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
export default class CssClasses {
|
|
2
|
-
public main: string
|
|
3
|
-
// Placeholder
|
|
4
|
-
public placeholder: string
|
|
5
|
-
|
|
6
|
-
// Values
|
|
7
|
-
public values: string
|
|
8
|
-
public single: string
|
|
9
|
-
public max: string
|
|
10
|
-
public value: string
|
|
11
|
-
public valueText: string
|
|
12
|
-
public valueDelete: string
|
|
13
|
-
public valueOut: string
|
|
14
|
-
|
|
15
|
-
// Deselect
|
|
16
|
-
public deselect: string
|
|
17
|
-
public deselectPath: string // Not a class but whatever
|
|
18
|
-
|
|
19
|
-
// Arrow
|
|
20
|
-
public arrow: string
|
|
21
|
-
public arrowClose: string // Not a class but whatever
|
|
22
|
-
public arrowOpen: string // Not a class but whatever
|
|
23
|
-
|
|
24
|
-
// Content
|
|
25
|
-
public content: string
|
|
26
|
-
public contentOpen: string
|
|
27
|
-
public dirAbove: string
|
|
28
|
-
public dirBelow: string
|
|
29
|
-
|
|
30
|
-
// Search
|
|
31
|
-
public search: string
|
|
32
|
-
public searchHighlighter: string
|
|
33
|
-
public searching: string
|
|
34
|
-
public addable: string
|
|
35
|
-
public addablePath: string // Not a class but whatever
|
|
36
|
-
|
|
37
|
-
// List optgroups/options
|
|
38
|
-
public list: string
|
|
39
|
-
|
|
40
|
-
// Optgroup
|
|
41
|
-
public optgroup: string
|
|
42
|
-
public optgroupLabel: string
|
|
43
|
-
public optgroupLabelText: string
|
|
44
|
-
public optgroupActions: string
|
|
45
|
-
public optgroupSelectAll: string // optgroup select all
|
|
46
|
-
public optgroupSelectAllBox: string // Not a class but whatever
|
|
47
|
-
public optgroupSelectAllCheck: string // Not a class but whatever
|
|
48
|
-
public optgroupClosable: string
|
|
49
|
-
|
|
50
|
-
// Option
|
|
51
|
-
public option: string
|
|
52
|
-
public optionDelete: string // Not a class but whatever
|
|
53
|
-
public highlighted: string
|
|
54
|
-
|
|
55
|
-
// Misc
|
|
56
|
-
public mainOpen: string
|
|
57
|
-
public close: string
|
|
58
|
-
public selected: string
|
|
59
|
-
public error: string
|
|
60
|
-
public disabled: string
|
|
61
|
-
public hide: string
|
|
62
|
-
|
|
63
|
-
constructor(classes?: Partial<CssClasses>) {
|
|
64
|
-
if (!classes) {
|
|
65
|
-
classes = {}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
let join = (a = '', b = '') => `${a} ${b}`.trim()
|
|
69
|
-
|
|
70
|
-
this.main = join('ss-main', classes.main)
|
|
71
|
-
this.placeholder = join('ss-placeholder', classes.placeholder)
|
|
72
|
-
this.values = join('ss-values', classes.values)
|
|
73
|
-
this.single = join('ss-single', classes.single)
|
|
74
|
-
this.max = join('ss-max', classes.max)
|
|
75
|
-
this.value = join('ss-value', classes.value)
|
|
76
|
-
this.valueText = join('ss-value-text', classes.valueText)
|
|
77
|
-
this.valueDelete = join('ss-value-delete', classes.valueDelete)
|
|
78
|
-
this.valueOut = join('ss-value-out', classes.valueOut)
|
|
79
|
-
|
|
80
|
-
this.deselect = join('ss-deselect', classes.deselect)
|
|
81
|
-
this.deselectPath = classes.deselectPath || 'M10,10 L90,90 M10,90 L90,10'
|
|
82
|
-
this.arrow = join('ss-arrow', classes.arrow)
|
|
83
|
-
this.arrowClose = classes.arrowClose || 'M10,30 L50,70 L90,30'
|
|
84
|
-
this.arrowOpen = classes.arrowOpen || 'M10,70 L50,30 L90,70'
|
|
85
|
-
this.content = join('ss-content', classes.content)
|
|
86
|
-
this.contentOpen = join('ss-open', classes.contentOpen)
|
|
87
|
-
this.dirAbove = join('ss-dir-above', classes.dirAbove)
|
|
88
|
-
this.dirBelow = join('ss-dir-below', classes.dirBelow)
|
|
89
|
-
this.search = join('ss-search', classes.search)
|
|
90
|
-
this.searchHighlighter = join('ss-search-highlight', classes.searchHighlighter)
|
|
91
|
-
this.searching = join('ss-searching', classes.searching)
|
|
92
|
-
this.addable = join('ss-addable', classes.addable)
|
|
93
|
-
this.addablePath = classes.addablePath || 'M50,10 L50,90 M10,50 L90,50'
|
|
94
|
-
this.list = join('ss-list', classes.list)
|
|
95
|
-
this.optgroup = join('ss-optgroup', classes.optgroup)
|
|
96
|
-
this.optgroupLabel = join('ss-optgroup-label', classes.optgroupLabel)
|
|
97
|
-
this.optgroupLabelText = join('ss-optgroup-label-text', classes.optgroupLabelText)
|
|
98
|
-
this.optgroupActions = join('ss-optgroup-actions', classes.optgroupActions)
|
|
99
|
-
this.optgroupSelectAll = join('ss-selectall', classes.optgroupSelectAll)
|
|
100
|
-
this.optgroupSelectAllBox = classes.optgroupSelectAllBox || 'M60,10 L10,10 L10,90 L90,90 L90,50'
|
|
101
|
-
this.optgroupSelectAllCheck = classes.optgroupSelectAllCheck || 'M30,45 L50,70 L90,10'
|
|
102
|
-
this.optgroupClosable = join('ss-closable', classes.optgroupClosable)
|
|
103
|
-
this.option = join('ss-option', classes.option)
|
|
104
|
-
this.optionDelete = classes.optionDelete || 'M10,10 L90,90 M10,90 L90,10'
|
|
105
|
-
this.highlighted = join('ss-highlighted', classes.highlighted)
|
|
106
|
-
this.mainOpen = join('ss-open', classes.mainOpen)
|
|
107
|
-
this.close = join('ss-close', classes.close)
|
|
108
|
-
this.selected = join('ss-selected', classes.selected)
|
|
109
|
-
this.error = join('ss-error', classes.error)
|
|
110
|
-
this.disabled = join('ss-disabled', classes.disabled)
|
|
111
|
-
this.hide = join('ss-hide', classes.hide)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
public getFirst(name: keyof Omit<CssClasses, 'getFirst'>): string {
|
|
115
|
-
return this[name].split(' ')[0]
|
|
116
|
-
}
|
|
117
|
-
}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @jest-environment jsdom
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
'use strict'
|
|
6
|
-
|
|
7
|
-
import { describe, expect, test, vi } from 'vitest'
|
|
8
|
-
import { hasClassInTree, debounce, isEqual, kebabCase } from './helpers'
|
|
9
|
-
|
|
10
|
-
describe('helpers module', () => {
|
|
11
|
-
describe('hasClassInTree', () => {
|
|
12
|
-
test('single element does not have class', () => {
|
|
13
|
-
const element = document.createElement('div')
|
|
14
|
-
element.className = 'invalid-class'
|
|
15
|
-
|
|
16
|
-
expect(hasClassInTree(element, 'test-class')).toBeNull()
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
test('single element has class', () => {
|
|
20
|
-
const element = document.createElement('div')
|
|
21
|
-
element.className = 'test-class'
|
|
22
|
-
|
|
23
|
-
expect(hasClassInTree(element, 'test-class')).toBe(element)
|
|
24
|
-
|
|
25
|
-
element.classList.add('class-2', 'class-3')
|
|
26
|
-
expect(hasClassInTree(element, 'test-class')).toBe(element)
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
test('single element has class as data id', () => {
|
|
30
|
-
const element = document.createElement('div')
|
|
31
|
-
element.dataset.id = 'test-class'
|
|
32
|
-
|
|
33
|
-
expect(hasClassInTree(element, 'test-class')).toBe(element)
|
|
34
|
-
|
|
35
|
-
element.classList.add('class-2', 'class-3')
|
|
36
|
-
expect(hasClassInTree(element, 'test-class')).toBe(element)
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
test('parent element does not have class', () => {
|
|
40
|
-
const element = document.createElement('div')
|
|
41
|
-
element.className = 'invalid-class'
|
|
42
|
-
const child = document.createElement('div')
|
|
43
|
-
element.appendChild(child)
|
|
44
|
-
|
|
45
|
-
expect(hasClassInTree(child, 'test-class')).toBeNull()
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
test('parent element has class', () => {
|
|
49
|
-
const element = document.createElement('div')
|
|
50
|
-
element.className = 'test-class'
|
|
51
|
-
const child = document.createElement('div')
|
|
52
|
-
element.appendChild(child)
|
|
53
|
-
|
|
54
|
-
expect(hasClassInTree(child, 'test-class')).toBe(element)
|
|
55
|
-
|
|
56
|
-
element.classList.add('class-2', 'class-3')
|
|
57
|
-
expect(hasClassInTree(child, 'test-class')).toBe(element)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
test('parent element has class as data id', () => {
|
|
61
|
-
const element = document.createElement('div')
|
|
62
|
-
element.dataset.id = 'test-class'
|
|
63
|
-
|
|
64
|
-
const child = document.createElement('div')
|
|
65
|
-
element.appendChild(child)
|
|
66
|
-
|
|
67
|
-
expect(hasClassInTree(child, 'test-class')).toBe(element)
|
|
68
|
-
|
|
69
|
-
element.classList.add('class-2', 'class-3')
|
|
70
|
-
expect(hasClassInTree(child, 'test-class')).toBe(element)
|
|
71
|
-
})
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
describe('debounce', () => {
|
|
75
|
-
test('debounce calls function after default timeout', async () => {
|
|
76
|
-
const callback = vi.fn()
|
|
77
|
-
const debounced_function = debounce(callback)
|
|
78
|
-
debounced_function()
|
|
79
|
-
|
|
80
|
-
await new Promise((r) => setTimeout(r, 100))
|
|
81
|
-
|
|
82
|
-
expect(callback).toHaveBeenCalled()
|
|
83
|
-
expect(callback).toHaveBeenCalledTimes(1)
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
test('debounce calls function after higher timeout', async () => {
|
|
87
|
-
const callback = vi.fn()
|
|
88
|
-
const debounced_function = debounce(callback, 100)
|
|
89
|
-
debounced_function()
|
|
90
|
-
|
|
91
|
-
await new Promise((r) => setTimeout(r, 50))
|
|
92
|
-
expect(callback).not.toHaveBeenCalled()
|
|
93
|
-
|
|
94
|
-
// Wait a bit longer to account for CI timing variations
|
|
95
|
-
await new Promise((r) => setTimeout(r, 100))
|
|
96
|
-
expect(callback).toHaveBeenCalled()
|
|
97
|
-
expect(callback).toHaveBeenCalledTimes(1)
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
test('debounce calls function after lower timeout', async () => {
|
|
101
|
-
const callback = vi.fn()
|
|
102
|
-
const debounced_function = debounce(callback, 10)
|
|
103
|
-
debounced_function()
|
|
104
|
-
|
|
105
|
-
await new Promise((r) => setTimeout(r, 5))
|
|
106
|
-
expect(callback).not.toHaveBeenCalled()
|
|
107
|
-
|
|
108
|
-
// Wait a bit longer to account for CI timing variations
|
|
109
|
-
await new Promise((r) => setTimeout(r, 10))
|
|
110
|
-
expect(callback).toHaveBeenCalled()
|
|
111
|
-
expect(callback).toHaveBeenCalledTimes(1)
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
test('debounce respects inmediate setting', () => {
|
|
115
|
-
const callback = vi.fn()
|
|
116
|
-
const debounced_function = debounce(callback, 1000, true)
|
|
117
|
-
debounced_function()
|
|
118
|
-
|
|
119
|
-
expect(callback).toHaveBeenCalled()
|
|
120
|
-
expect(callback).toHaveBeenCalledTimes(1)
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
test('debounce respects order of calls', async () => {
|
|
124
|
-
const callback = vi.fn(() => {})
|
|
125
|
-
const debounced_function: (a: number) => void = debounce(callback)
|
|
126
|
-
debounced_function(0)
|
|
127
|
-
debounced_function(1)
|
|
128
|
-
|
|
129
|
-
await new Promise((r) => setTimeout(r, 50))
|
|
130
|
-
expect(callback).toHaveBeenCalledTimes(1)
|
|
131
|
-
expect(callback.mock.calls[0]).toStrictEqual([1])
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
describe('isEqual', () => {
|
|
136
|
-
test('different objects are not equal', () => {
|
|
137
|
-
expect(isEqual({ a: 1 }, { b: 1 })).toBe(false)
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
test('equal objects are equal', () => {
|
|
141
|
-
expect(isEqual({ a: 1 }, { a: 1 })).toBe(true)
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
test('more complex objects are equal', () => {
|
|
145
|
-
expect(isEqual({ a: 1, b: { c: 'asdf' } }, { a: 1, b: { c: 'asdf' } })).toBe(true)
|
|
146
|
-
})
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
describe('kebabCase', () => {
|
|
150
|
-
test('kebab-case string', () => {
|
|
151
|
-
expect(kebabCase('kebab-case')).toBe('kebab-case')
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
test('camelCase string', () => {
|
|
155
|
-
expect(kebabCase('camelCase')).toBe('camel-case')
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
test('string with initial uppercase', () => {
|
|
159
|
-
expect(kebabCase('UpperCase')).toBe('upper-case')
|
|
160
|
-
})
|
|
161
|
-
})
|
|
162
|
-
})
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
// Generate an 8 character random string
|
|
2
|
-
export function generateID(): string {
|
|
3
|
-
return Math.random().toString(36).substring(2, 10)
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export function hasClassInTree(element: HTMLElement, className: string): HTMLElement | null {
|
|
7
|
-
function hasClass(e: HTMLElement, c: string) {
|
|
8
|
-
// If the element has the class return element
|
|
9
|
-
if (c && e && e.classList && e.classList.contains(c)) {
|
|
10
|
-
return e
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// If the element has a dataset id of the class return element
|
|
14
|
-
if (c && e && e.dataset && e.dataset.id && e.dataset.id === className) {
|
|
15
|
-
return e
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return null
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function parentByClass(e: any, c: string): any {
|
|
22
|
-
if (!e || e === (document as any)) {
|
|
23
|
-
return null
|
|
24
|
-
} else if (hasClass(e, c)) {
|
|
25
|
-
return e
|
|
26
|
-
} else {
|
|
27
|
-
return parentByClass(e.parentNode, c)
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return hasClass(element, className) || parentByClass(element, className)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// debounce will call the last requested function after the wait time
|
|
35
|
-
export function debounce<T extends (...args: any[]) => void>(func: T, wait = 50, immediate = false): () => void {
|
|
36
|
-
let timeout: any
|
|
37
|
-
return function (this: any, ...args: any[]): void {
|
|
38
|
-
const context = self
|
|
39
|
-
const later = () => {
|
|
40
|
-
timeout = null
|
|
41
|
-
if (!immediate) {
|
|
42
|
-
func.apply(context, args)
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
const callNow = immediate && !timeout
|
|
46
|
-
clearTimeout(timeout)
|
|
47
|
-
timeout = setTimeout(later, wait)
|
|
48
|
-
if (callNow) {
|
|
49
|
-
func.apply(context, args)
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function isEqual(a: any, b: any): boolean {
|
|
55
|
-
return JSON.stringify(a) === JSON.stringify(b)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function kebabCase(str: string): string {
|
|
59
|
-
const result = str.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, (match) => '-' + match.toLowerCase())
|
|
60
|
-
return str[0] === str[0].toUpperCase() ? result.substring(1) : result
|
|
61
|
-
}
|