@furystack/shades-common-components 12.0.0 → 12.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 (49) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +26 -0
  3. package/esm/components/cache-view.d.ts +46 -0
  4. package/esm/components/cache-view.d.ts.map +1 -0
  5. package/esm/components/cache-view.js +65 -0
  6. package/esm/components/cache-view.js.map +1 -0
  7. package/esm/components/cache-view.spec.d.ts +2 -0
  8. package/esm/components/cache-view.spec.d.ts.map +1 -0
  9. package/esm/components/cache-view.spec.js +183 -0
  10. package/esm/components/cache-view.spec.js.map +1 -0
  11. package/esm/components/command-palette/command-palette-input.spec.js +148 -148
  12. package/esm/components/command-palette/command-palette-input.spec.js.map +1 -1
  13. package/esm/components/command-palette/command-palette-suggestion-list.spec.js +258 -258
  14. package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
  15. package/esm/components/context-menu/context-menu-manager.spec.js +211 -217
  16. package/esm/components/context-menu/context-menu-manager.spec.js.map +1 -1
  17. package/esm/components/data-grid/body.spec.js +173 -173
  18. package/esm/components/data-grid/body.spec.js.map +1 -1
  19. package/esm/components/data-grid/data-grid.spec.js +39 -130
  20. package/esm/components/data-grid/data-grid.spec.js.map +1 -1
  21. package/esm/components/index.d.ts +1 -0
  22. package/esm/components/index.d.ts.map +1 -1
  23. package/esm/components/index.js +1 -0
  24. package/esm/components/index.js.map +1 -1
  25. package/esm/components/skeleton.d.ts.map +1 -1
  26. package/esm/components/skeleton.js +2 -11
  27. package/esm/components/skeleton.js.map +1 -1
  28. package/esm/components/skeleton.spec.js +6 -55
  29. package/esm/components/skeleton.spec.js.map +1 -1
  30. package/esm/services/click-away-service.spec.js +14 -12
  31. package/esm/services/click-away-service.spec.js.map +1 -1
  32. package/esm/services/list-service.spec.js +170 -141
  33. package/esm/services/list-service.spec.js.map +1 -1
  34. package/esm/services/tree-service.spec.js +190 -159
  35. package/esm/services/tree-service.spec.js.map +1 -1
  36. package/package.json +8 -8
  37. package/src/components/cache-view.spec.tsx +210 -0
  38. package/src/components/cache-view.tsx +103 -0
  39. package/src/components/command-palette/command-palette-input.spec.tsx +183 -194
  40. package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +303 -321
  41. package/src/components/context-menu/context-menu-manager.spec.ts +213 -258
  42. package/src/components/data-grid/body.spec.tsx +266 -276
  43. package/src/components/data-grid/data-grid.spec.tsx +137 -232
  44. package/src/components/index.ts +1 -0
  45. package/src/components/skeleton.spec.tsx +6 -73
  46. package/src/components/skeleton.tsx +2 -11
  47. package/src/services/click-away-service.spec.ts +14 -16
  48. package/src/services/list-service.spec.ts +170 -172
  49. package/src/services/tree-service.spec.ts +191 -207
@@ -49,283 +49,272 @@ describe('CommandPaletteInput', () => {
49
49
 
50
50
  it('should render as custom element', async () => {
51
51
  await usingAsync(new Injector(), async (injector) => {
52
- const manager = createManager()
53
- const rootElement = document.getElementById('root') as HTMLDivElement
52
+ await usingAsync(createManager(), async (manager) => {
53
+ const rootElement = document.getElementById('root') as HTMLDivElement
54
54
 
55
- initializeShadeRoot({
56
- injector,
57
- rootElement,
58
- jsxElement: <CommandPaletteInput manager={manager} />,
59
- })
60
-
61
- await sleepAsync(50)
55
+ initializeShadeRoot({
56
+ injector,
57
+ rootElement,
58
+ jsxElement: <CommandPaletteInput manager={manager} />,
59
+ })
62
60
 
63
- const input = document.querySelector('shades-command-palette-input')
64
- expect(input).not.toBeNull()
61
+ await sleepAsync(50)
65
62
 
66
- manager[Symbol.dispose]()
63
+ const input = document.querySelector('shades-command-palette-input')
64
+ expect(input).not.toBeNull()
65
+ })
67
66
  })
68
67
  })
69
68
 
70
69
  it('should render an input element with placeholder', async () => {
71
70
  await usingAsync(new Injector(), async (injector) => {
72
- const manager = createManager()
73
- const rootElement = document.getElementById('root') as HTMLDivElement
74
-
75
- initializeShadeRoot({
76
- injector,
77
- rootElement,
78
- jsxElement: <CommandPaletteInput manager={manager} />,
79
- })
71
+ await usingAsync(createManager(), async (manager) => {
72
+ const rootElement = document.getElementById('root') as HTMLDivElement
80
73
 
81
- await sleepAsync(50)
74
+ initializeShadeRoot({
75
+ injector,
76
+ rootElement,
77
+ jsxElement: <CommandPaletteInput manager={manager} />,
78
+ })
82
79
 
83
- const component = document.querySelector('shades-command-palette-input') as HTMLElement
84
- const inputElement = component?.querySelector('input')
85
- expect(inputElement).not.toBeNull()
86
- expect(inputElement?.placeholder).toBe('Type to search commands...')
80
+ await sleepAsync(50)
87
81
 
88
- manager[Symbol.dispose]()
82
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
83
+ const inputElement = component?.querySelector('input')
84
+ expect(inputElement).not.toBeNull()
85
+ expect(inputElement?.placeholder).toBe('Type to search commands...')
86
+ })
89
87
  })
90
88
  })
91
89
 
92
90
  it('should start with width 0% when closed', async () => {
93
91
  await usingAsync(new Injector(), async (injector) => {
94
- const manager = createManager()
95
- manager.isOpened.setValue(false)
96
- const rootElement = document.getElementById('root') as HTMLDivElement
97
-
98
- initializeShadeRoot({
99
- injector,
100
- rootElement,
101
- jsxElement: <CommandPaletteInput manager={manager} />,
102
- })
92
+ await usingAsync(createManager(), async (manager) => {
93
+ manager.isOpened.setValue(false)
94
+ const rootElement = document.getElementById('root') as HTMLDivElement
103
95
 
104
- await sleepAsync(50)
96
+ initializeShadeRoot({
97
+ injector,
98
+ rootElement,
99
+ jsxElement: <CommandPaletteInput manager={manager} />,
100
+ })
105
101
 
106
- const component = document.querySelector('shades-command-palette-input') as HTMLElement
107
- expect(component.hasAttribute('data-opened')).toBe(false)
102
+ await sleepAsync(50)
108
103
 
109
- manager[Symbol.dispose]()
104
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
105
+ expect(component.hasAttribute('data-opened')).toBe(false)
106
+ })
110
107
  })
111
108
  })
112
109
 
113
110
  it('should have width 100% when opened', async () => {
114
111
  await usingAsync(new Injector(), async (injector) => {
115
- const manager = createManager()
116
- manager.isOpened.setValue(true)
117
- const rootElement = document.getElementById('root') as HTMLDivElement
118
-
119
- initializeShadeRoot({
120
- injector,
121
- rootElement,
122
- jsxElement: <CommandPaletteInput manager={manager} />,
123
- })
112
+ await usingAsync(createManager(), async (manager) => {
113
+ manager.isOpened.setValue(true)
114
+ const rootElement = document.getElementById('root') as HTMLDivElement
124
115
 
125
- await sleepAsync(50)
116
+ initializeShadeRoot({
117
+ injector,
118
+ rootElement,
119
+ jsxElement: <CommandPaletteInput manager={manager} />,
120
+ })
126
121
 
127
- const component = document.querySelector('shades-command-palette-input') as HTMLElement
128
- expect(component.hasAttribute('data-opened')).toBe(true)
122
+ await sleepAsync(50)
129
123
 
130
- manager[Symbol.dispose]()
124
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
125
+ expect(component.hasAttribute('data-opened')).toBe(true)
126
+ })
131
127
  })
132
128
  })
133
129
 
134
130
  it('should animate width when opening', async () => {
135
131
  await usingAsync(new Injector(), async (injector) => {
136
- const manager = createManager()
137
- manager.isOpened.setValue(false)
138
- const rootElement = document.getElementById('root') as HTMLDivElement
139
-
140
- initializeShadeRoot({
141
- injector,
142
- rootElement,
143
- jsxElement: <CommandPaletteInput manager={manager} />,
132
+ await usingAsync(createManager(), async (manager) => {
133
+ manager.isOpened.setValue(false)
134
+ const rootElement = document.getElementById('root') as HTMLDivElement
135
+
136
+ initializeShadeRoot({
137
+ injector,
138
+ rootElement,
139
+ jsxElement: <CommandPaletteInput manager={manager} />,
140
+ })
141
+
142
+ await sleepAsync(50)
143
+ animateCalls = []
144
+
145
+ manager.isOpened.setValue(true)
146
+ await sleepAsync(50)
147
+
148
+ const widthAnimation = animateCalls.find(
149
+ (call) =>
150
+ Array.isArray(call.keyframes) &&
151
+ call.keyframes.some((kf: Keyframe) => kf.width === '0%') &&
152
+ call.keyframes.some((kf: Keyframe) => kf.width === '100%'),
153
+ )
154
+
155
+ expect(widthAnimation).toBeDefined()
156
+ expect((widthAnimation?.options as KeyframeAnimationOptions)?.duration).toBe(300)
144
157
  })
145
-
146
- await sleepAsync(50)
147
- animateCalls = []
148
-
149
- manager.isOpened.setValue(true)
150
- await sleepAsync(50)
151
-
152
- const widthAnimation = animateCalls.find(
153
- (call) =>
154
- Array.isArray(call.keyframes) &&
155
- call.keyframes.some((kf: Keyframe) => kf.width === '0%') &&
156
- call.keyframes.some((kf: Keyframe) => kf.width === '100%'),
157
- )
158
-
159
- expect(widthAnimation).toBeDefined()
160
- expect((widthAnimation?.options as KeyframeAnimationOptions)?.duration).toBe(300)
161
-
162
- manager[Symbol.dispose]()
163
158
  })
164
159
  })
165
160
 
166
161
  it('should animate width when closing', async () => {
167
162
  await usingAsync(new Injector(), async (injector) => {
168
- const manager = createManager()
169
- manager.isOpened.setValue(true)
170
- const rootElement = document.getElementById('root') as HTMLDivElement
171
-
172
- initializeShadeRoot({
173
- injector,
174
- rootElement,
175
- jsxElement: <CommandPaletteInput manager={manager} />,
163
+ await usingAsync(createManager(), async (manager) => {
164
+ manager.isOpened.setValue(true)
165
+ const rootElement = document.getElementById('root') as HTMLDivElement
166
+
167
+ initializeShadeRoot({
168
+ injector,
169
+ rootElement,
170
+ jsxElement: <CommandPaletteInput manager={manager} />,
171
+ })
172
+
173
+ await sleepAsync(50)
174
+ animateCalls = []
175
+
176
+ manager.isOpened.setValue(false)
177
+ await sleepAsync(50)
178
+
179
+ const widthAnimation = animateCalls.find(
180
+ (call) =>
181
+ Array.isArray(call.keyframes) &&
182
+ call.keyframes.some((kf: Keyframe) => kf.width === '100%') &&
183
+ call.keyframes.some((kf: Keyframe) => kf.width === '0%'),
184
+ )
185
+
186
+ expect(widthAnimation).toBeDefined()
176
187
  })
177
-
178
- await sleepAsync(50)
179
- animateCalls = []
180
-
181
- manager.isOpened.setValue(false)
182
- await sleepAsync(50)
183
-
184
- const widthAnimation = animateCalls.find(
185
- (call) =>
186
- Array.isArray(call.keyframes) &&
187
- call.keyframes.some((kf: Keyframe) => kf.width === '100%') &&
188
- call.keyframes.some((kf: Keyframe) => kf.width === '0%'),
189
- )
190
-
191
- expect(widthAnimation).toBeDefined()
192
-
193
- manager[Symbol.dispose]()
194
188
  })
195
189
  })
196
190
 
197
191
  it('should clear input value when opening', async () => {
198
192
  await usingAsync(new Injector(), async (injector) => {
199
- const manager = createManager()
200
- manager.isOpened.setValue(false)
201
- const rootElement = document.getElementById('root') as HTMLDivElement
202
-
203
- initializeShadeRoot({
204
- injector,
205
- rootElement,
206
- jsxElement: <CommandPaletteInput manager={manager} />,
207
- })
193
+ await usingAsync(createManager(), async (manager) => {
194
+ manager.isOpened.setValue(false)
195
+ const rootElement = document.getElementById('root') as HTMLDivElement
208
196
 
209
- await sleepAsync(50)
197
+ initializeShadeRoot({
198
+ injector,
199
+ rootElement,
200
+ jsxElement: <CommandPaletteInput manager={manager} />,
201
+ })
210
202
 
211
- const component = document.querySelector('shades-command-palette-input') as HTMLElement
212
- const inputElement = component?.querySelector('input') as HTMLInputElement
213
- inputElement.value = 'some text'
203
+ await sleepAsync(50)
214
204
 
215
- manager.isOpened.setValue(true)
216
- await sleepAsync(50)
205
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
206
+ const inputElement = component?.querySelector('input') as HTMLInputElement
207
+ inputElement.value = 'some text'
217
208
 
218
- expect(inputElement.value).toBe('')
209
+ manager.isOpened.setValue(true)
210
+ await sleepAsync(50)
219
211
 
220
- manager[Symbol.dispose]()
212
+ expect(inputElement.value).toBe('')
213
+ })
221
214
  })
222
215
  })
223
216
 
224
217
  it('should clear input value when closing', async () => {
225
218
  await usingAsync(new Injector(), async (injector) => {
226
- const manager = createManager()
227
- manager.isOpened.setValue(true)
228
- const rootElement = document.getElementById('root') as HTMLDivElement
229
-
230
- initializeShadeRoot({
231
- injector,
232
- rootElement,
233
- jsxElement: <CommandPaletteInput manager={manager} />,
234
- })
219
+ await usingAsync(createManager(), async (manager) => {
220
+ manager.isOpened.setValue(true)
221
+ const rootElement = document.getElementById('root') as HTMLDivElement
235
222
 
236
- await sleepAsync(50)
223
+ initializeShadeRoot({
224
+ injector,
225
+ rootElement,
226
+ jsxElement: <CommandPaletteInput manager={manager} />,
227
+ })
237
228
 
238
- const component = document.querySelector('shades-command-palette-input') as HTMLElement
239
- const inputElement = component?.querySelector('input') as HTMLInputElement
240
- inputElement.value = 'search term'
229
+ await sleepAsync(50)
241
230
 
242
- manager.isOpened.setValue(false)
243
- await sleepAsync(50)
231
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
232
+ const inputElement = component?.querySelector('input') as HTMLInputElement
233
+ inputElement.value = 'search term'
244
234
 
245
- expect(inputElement.value).toBe('')
235
+ manager.isOpened.setValue(false)
236
+ await sleepAsync(50)
246
237
 
247
- manager[Symbol.dispose]()
238
+ expect(inputElement.value).toBe('')
239
+ })
248
240
  })
249
241
  })
250
242
 
251
243
  it('should have overflow hidden style', async () => {
252
244
  await usingAsync(new Injector(), async (injector) => {
253
- const manager = createManager()
254
- const rootElement = document.getElementById('root') as HTMLDivElement
255
-
256
- initializeShadeRoot({
257
- injector,
258
- rootElement,
259
- jsxElement: <CommandPaletteInput manager={manager} />,
260
- })
245
+ await usingAsync(createManager(), async (manager) => {
246
+ const rootElement = document.getElementById('root') as HTMLDivElement
261
247
 
262
- await sleepAsync(50)
248
+ initializeShadeRoot({
249
+ injector,
250
+ rootElement,
251
+ jsxElement: <CommandPaletteInput manager={manager} />,
252
+ })
263
253
 
264
- const component = document.querySelector('shades-command-palette-input') as HTMLElement
265
- const computedStyle = window.getComputedStyle(component)
266
- expect(computedStyle.overflow).toBe('hidden')
254
+ await sleepAsync(50)
267
255
 
268
- manager[Symbol.dispose]()
256
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
257
+ const computedStyle = window.getComputedStyle(component)
258
+ expect(computedStyle.overflow).toBe('hidden')
259
+ })
269
260
  })
270
261
  })
271
262
 
272
263
  it('should use cubic-bezier easing for animations', async () => {
273
264
  await usingAsync(new Injector(), async (injector) => {
274
- const manager = createManager()
275
- manager.isOpened.setValue(false)
276
- const rootElement = document.getElementById('root') as HTMLDivElement
277
-
278
- initializeShadeRoot({
279
- injector,
280
- rootElement,
281
- jsxElement: <CommandPaletteInput manager={manager} />,
265
+ await usingAsync(createManager(), async (manager) => {
266
+ manager.isOpened.setValue(false)
267
+ const rootElement = document.getElementById('root') as HTMLDivElement
268
+
269
+ initializeShadeRoot({
270
+ injector,
271
+ rootElement,
272
+ jsxElement: <CommandPaletteInput manager={manager} />,
273
+ })
274
+
275
+ await sleepAsync(50)
276
+ animateCalls = []
277
+
278
+ manager.isOpened.setValue(true)
279
+ await sleepAsync(50)
280
+
281
+ const widthAnimation = animateCalls.find(
282
+ (call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'width' in kf),
283
+ )
284
+
285
+ expect(widthAnimation).toBeDefined()
286
+ expect((widthAnimation?.options as KeyframeAnimationOptions)?.easing).toBe(
287
+ 'cubic-bezier(0.595, 0.425, 0.415, 0.845)',
288
+ )
282
289
  })
283
-
284
- await sleepAsync(50)
285
- animateCalls = []
286
-
287
- manager.isOpened.setValue(true)
288
- await sleepAsync(50)
289
-
290
- const widthAnimation = animateCalls.find(
291
- (call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'width' in kf),
292
- )
293
-
294
- expect(widthAnimation).toBeDefined()
295
- expect((widthAnimation?.options as KeyframeAnimationOptions)?.easing).toBe(
296
- 'cubic-bezier(0.595, 0.425, 0.415, 0.845)',
297
- )
298
-
299
- manager[Symbol.dispose]()
300
290
  })
301
291
  })
302
292
 
303
293
  it('should fill animation forwards', async () => {
304
294
  await usingAsync(new Injector(), async (injector) => {
305
- const manager = createManager()
306
- manager.isOpened.setValue(false)
307
- const rootElement = document.getElementById('root') as HTMLDivElement
308
-
309
- initializeShadeRoot({
310
- injector,
311
- rootElement,
312
- jsxElement: <CommandPaletteInput manager={manager} />,
313
- })
295
+ await usingAsync(createManager(), async (manager) => {
296
+ manager.isOpened.setValue(false)
297
+ const rootElement = document.getElementById('root') as HTMLDivElement
314
298
 
315
- await sleepAsync(50)
316
- animateCalls = []
299
+ initializeShadeRoot({
300
+ injector,
301
+ rootElement,
302
+ jsxElement: <CommandPaletteInput manager={manager} />,
303
+ })
317
304
 
318
- manager.isOpened.setValue(true)
319
- await sleepAsync(50)
305
+ await sleepAsync(50)
306
+ animateCalls = []
320
307
 
321
- const widthAnimation = animateCalls.find(
322
- (call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'width' in kf),
323
- )
308
+ manager.isOpened.setValue(true)
309
+ await sleepAsync(50)
324
310
 
325
- expect(widthAnimation).toBeDefined()
326
- expect((widthAnimation?.options as KeyframeAnimationOptions)?.fill).toBe('forwards')
311
+ const widthAnimation = animateCalls.find(
312
+ (call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'width' in kf),
313
+ )
327
314
 
328
- manager[Symbol.dispose]()
315
+ expect(widthAnimation).toBeDefined()
316
+ expect((widthAnimation?.options as KeyframeAnimationOptions)?.fill).toBe('forwards')
317
+ })
329
318
  })
330
319
  })
331
320
  })