slim-select 3.4.3 → 3.6.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 (73) hide show
  1. package/dist/classes.d.ts +47 -0
  2. package/dist/helpers.d.ts +5 -0
  3. package/dist/index.d.ts +53 -319
  4. package/dist/index.umd.d.ts +2 -0
  5. package/dist/react/index.d.ts +4 -319
  6. package/dist/react/index.js +1471 -1697
  7. package/dist/react/index.umd.js +2 -2
  8. package/dist/react/react.d.ts +17 -0
  9. package/dist/react/react.test.d.ts +1 -0
  10. package/dist/react/slim-select/react/index.d.ts +4 -0
  11. package/dist/render.d.ts +90 -0
  12. package/dist/select.d.ts +38 -0
  13. package/dist/settings.d.ts +40 -0
  14. package/dist/slimselect.cjs.js +2 -2
  15. package/dist/slimselect.cjs.js.map +1 -1
  16. package/dist/slimselect.css +1 -1
  17. package/dist/slimselect.css.map +1 -1
  18. package/dist/slimselect.es.js +1245 -1385
  19. package/dist/slimselect.es.js.map +1 -1
  20. package/dist/slimselect.iife.js +2 -2
  21. package/dist/slimselect.iife.js.map +1 -1
  22. package/dist/slimselect.js +2 -2
  23. package/dist/slimselect.js.map +1 -1
  24. package/dist/src/docs/main.d.ts +0 -0
  25. package/dist/src/docs/router.d.ts +2 -0
  26. package/dist/src/docs/store.d.ts +12 -0
  27. package/dist/store.d.ts +53 -0
  28. package/dist/vue/index.d.ts +4 -319
  29. package/dist/vue/index.js +1347 -1504
  30. package/dist/vue/index.umd.js +1 -1
  31. package/dist/vue/slim-select/vue/index.d.ts +4 -0
  32. package/package.json +30 -36
  33. package/src/slim-select/slimselect.scss +47 -5
  34. package/.nvmrc +0 -1
  35. package/.prettierignore +0 -1
  36. package/.prettierrc +0 -7
  37. package/CODE_OF_CONDUCT.md +0 -46
  38. package/CONTRIBUTING.md +0 -1
  39. package/cdn.html +0 -21
  40. package/docs.go +0 -12
  41. package/example.html +0 -25
  42. package/index.html +0 -76
  43. package/release.js +0 -191
  44. package/sitemap.js +0 -108
  45. package/src/slim-select/accessibility.test.ts +0 -782
  46. package/src/slim-select/classes.test.ts +0 -73
  47. package/src/slim-select/classes.ts +0 -117
  48. package/src/slim-select/helpers.test.ts +0 -162
  49. package/src/slim-select/helpers.ts +0 -61
  50. package/src/slim-select/index.test.ts +0 -1356
  51. package/src/slim-select/index.ts +0 -594
  52. package/src/slim-select/index.umd.ts +0 -8
  53. package/src/slim-select/react/index.tsx +0 -9
  54. package/src/slim-select/react/react.test.tsx +0 -498
  55. package/src/slim-select/react/react.tsx +0 -209
  56. package/src/slim-select/render.test.ts +0 -1927
  57. package/src/slim-select/render.ts +0 -1771
  58. package/src/slim-select/select.test.ts +0 -683
  59. package/src/slim-select/select.ts +0 -659
  60. package/src/slim-select/settings.test.ts +0 -285
  61. package/src/slim-select/settings.ts +0 -78
  62. package/src/slim-select/store.test.ts +0 -1007
  63. package/src/slim-select/store.ts +0 -433
  64. package/src/slim-select/vue/index.ts +0 -9
  65. package/src/slim-select/vue/vue.test.ts +0 -1091
  66. package/src/slim-select/vue/vue.vue +0 -224
  67. package/tsconfig.json +0 -26
  68. package/vite.config.docs.mts +0 -29
  69. package/vite.config.lib.es-cjs.ts +0 -40
  70. package/vite.config.lib.umd-iife.ts +0 -34
  71. package/vite.config.react.mts +0 -41
  72. package/vite.config.vue.mts +0 -40
  73. 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
- }