@furystack/shades-common-components 10.0.35 → 11.0.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 (295) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/esm/components/animations.spec.d.ts +2 -0
  3. package/esm/components/animations.spec.d.ts.map +1 -0
  4. package/esm/components/animations.spec.js +201 -0
  5. package/esm/components/animations.spec.js.map +1 -0
  6. package/esm/components/app-bar-link.js +21 -20
  7. package/esm/components/app-bar-link.js.map +1 -1
  8. package/esm/components/app-bar-link.spec.d.ts +2 -0
  9. package/esm/components/app-bar-link.spec.d.ts.map +1 -0
  10. package/esm/components/app-bar-link.spec.js +252 -0
  11. package/esm/components/app-bar-link.spec.js.map +1 -0
  12. package/esm/components/app-bar.js +21 -21
  13. package/esm/components/app-bar.js.map +1 -1
  14. package/esm/components/app-bar.spec.d.ts +2 -0
  15. package/esm/components/app-bar.spec.d.ts.map +1 -0
  16. package/esm/components/app-bar.spec.js +117 -0
  17. package/esm/components/app-bar.spec.js.map +1 -0
  18. package/esm/components/avatar.d.ts.map +1 -1
  19. package/esm/components/avatar.js +15 -19
  20. package/esm/components/avatar.js.map +1 -1
  21. package/esm/components/avatar.spec.d.ts +2 -0
  22. package/esm/components/avatar.spec.d.ts.map +1 -0
  23. package/esm/components/avatar.spec.js +114 -0
  24. package/esm/components/avatar.spec.js.map +1 -0
  25. package/esm/components/button.d.ts.map +1 -1
  26. package/esm/components/button.js +145 -156
  27. package/esm/components/button.js.map +1 -1
  28. package/esm/components/button.spec.d.ts +2 -0
  29. package/esm/components/button.spec.d.ts.map +1 -0
  30. package/esm/components/button.spec.js +155 -0
  31. package/esm/components/button.spec.js.map +1 -0
  32. package/esm/components/command-palette/command-palette-input.d.ts.map +1 -1
  33. package/esm/components/command-palette/command-palette-input.js +18 -16
  34. package/esm/components/command-palette/command-palette-input.js.map +1 -1
  35. package/esm/components/command-palette/command-palette-input.spec.d.ts +2 -0
  36. package/esm/components/command-palette/command-palette-input.spec.d.ts.map +1 -0
  37. package/esm/components/command-palette/command-palette-input.spec.js +233 -0
  38. package/esm/components/command-palette/command-palette-input.spec.js.map +1 -0
  39. package/esm/components/command-palette/command-palette-manager.spec.d.ts +2 -0
  40. package/esm/components/command-palette/command-palette-manager.spec.d.ts.map +1 -0
  41. package/esm/components/command-palette/command-palette-manager.spec.js +362 -0
  42. package/esm/components/command-palette/command-palette-manager.spec.js.map +1 -0
  43. package/esm/components/command-palette/command-palette-suggestion-list.d.ts.map +1 -1
  44. package/esm/components/command-palette/command-palette-suggestion-list.js +42 -46
  45. package/esm/components/command-palette/command-palette-suggestion-list.js.map +1 -1
  46. package/esm/components/command-palette/command-palette-suggestion-list.spec.d.ts +2 -0
  47. package/esm/components/command-palette/command-palette-suggestion-list.spec.d.ts.map +1 -0
  48. package/esm/components/command-palette/command-palette-suggestion-list.spec.js +376 -0
  49. package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -0
  50. package/esm/components/command-palette/index.d.ts.map +1 -1
  51. package/esm/components/command-palette/index.js +100 -110
  52. package/esm/components/command-palette/index.js.map +1 -1
  53. package/esm/components/command-palette/index.spec.d.ts +2 -0
  54. package/esm/components/command-palette/index.spec.d.ts.map +1 -0
  55. package/esm/components/command-palette/index.spec.js +509 -0
  56. package/esm/components/command-palette/index.spec.js.map +1 -0
  57. package/esm/components/data-grid/body.js +1 -1
  58. package/esm/components/data-grid/body.js.map +1 -1
  59. package/esm/components/data-grid/body.spec.d.ts +2 -0
  60. package/esm/components/data-grid/body.spec.d.ts.map +1 -0
  61. package/esm/components/data-grid/body.spec.js +228 -0
  62. package/esm/components/data-grid/body.spec.js.map +1 -0
  63. package/esm/components/data-grid/data-grid-row.d.ts.map +1 -1
  64. package/esm/components/data-grid/data-grid-row.js +49 -73
  65. package/esm/components/data-grid/data-grid-row.js.map +1 -1
  66. package/esm/components/data-grid/data-grid-row.spec.d.ts +2 -0
  67. package/esm/components/data-grid/data-grid-row.spec.d.ts.map +1 -0
  68. package/esm/components/data-grid/data-grid-row.spec.js +296 -0
  69. package/esm/components/data-grid/data-grid-row.spec.js.map +1 -0
  70. package/esm/components/data-grid/data-grid.d.ts.map +1 -1
  71. package/esm/components/data-grid/data-grid.js +35 -28
  72. package/esm/components/data-grid/data-grid.js.map +1 -1
  73. package/esm/components/data-grid/data-grid.spec.d.ts +2 -0
  74. package/esm/components/data-grid/data-grid.spec.d.ts.map +1 -0
  75. package/esm/components/data-grid/data-grid.spec.js +544 -0
  76. package/esm/components/data-grid/data-grid.spec.js.map +1 -0
  77. package/esm/components/data-grid/footer.js +21 -15
  78. package/esm/components/data-grid/footer.js.map +1 -1
  79. package/esm/components/data-grid/footer.spec.d.ts +2 -0
  80. package/esm/components/data-grid/footer.spec.d.ts.map +1 -0
  81. package/esm/components/data-grid/footer.spec.js +264 -0
  82. package/esm/components/data-grid/footer.spec.js.map +1 -0
  83. package/esm/components/data-grid/header.d.ts.map +1 -1
  84. package/esm/components/data-grid/header.js +55 -33
  85. package/esm/components/data-grid/header.js.map +1 -1
  86. package/esm/components/data-grid/header.spec.d.ts +2 -0
  87. package/esm/components/data-grid/header.spec.d.ts.map +1 -0
  88. package/esm/components/data-grid/header.spec.js +421 -0
  89. package/esm/components/data-grid/header.spec.js.map +1 -0
  90. package/esm/components/data-grid/selection-cell.d.ts.map +1 -1
  91. package/esm/components/data-grid/selection-cell.js +13 -6
  92. package/esm/components/data-grid/selection-cell.js.map +1 -1
  93. package/esm/components/data-grid/selection-cell.spec.d.ts +2 -0
  94. package/esm/components/data-grid/selection-cell.spec.d.ts.map +1 -0
  95. package/esm/components/data-grid/selection-cell.spec.js +118 -0
  96. package/esm/components/data-grid/selection-cell.spec.js.map +1 -0
  97. package/esm/components/fab.d.ts.map +1 -1
  98. package/esm/components/fab.js +10 -1
  99. package/esm/components/fab.js.map +1 -1
  100. package/esm/components/fab.spec.d.ts +2 -0
  101. package/esm/components/fab.spec.d.ts.map +1 -0
  102. package/esm/components/fab.spec.js +95 -0
  103. package/esm/components/fab.spec.js.map +1 -0
  104. package/esm/components/form.spec.d.ts +2 -0
  105. package/esm/components/form.spec.d.ts.map +1 -0
  106. package/esm/components/form.spec.js +314 -0
  107. package/esm/components/form.spec.js.map +1 -0
  108. package/esm/components/grid.d.ts.map +1 -1
  109. package/esm/components/grid.js +40 -37
  110. package/esm/components/grid.js.map +1 -1
  111. package/esm/components/grid.spec.d.ts +2 -0
  112. package/esm/components/grid.spec.d.ts.map +1 -0
  113. package/esm/components/grid.spec.js +316 -0
  114. package/esm/components/grid.spec.js.map +1 -0
  115. package/esm/components/inputs/autocomplete.spec.d.ts +2 -0
  116. package/esm/components/inputs/autocomplete.spec.d.ts.map +1 -0
  117. package/esm/components/inputs/autocomplete.spec.js +194 -0
  118. package/esm/components/inputs/autocomplete.spec.js.map +1 -0
  119. package/esm/components/inputs/input.d.ts.map +1 -1
  120. package/esm/components/inputs/input.js +141 -109
  121. package/esm/components/inputs/input.js.map +1 -1
  122. package/esm/components/inputs/input.spec.d.ts +2 -0
  123. package/esm/components/inputs/input.spec.d.ts.map +1 -0
  124. package/esm/components/inputs/input.spec.js +577 -0
  125. package/esm/components/inputs/input.spec.js.map +1 -0
  126. package/esm/components/inputs/text-area.d.ts.map +1 -1
  127. package/esm/components/inputs/text-area.js +54 -58
  128. package/esm/components/inputs/text-area.js.map +1 -1
  129. package/esm/components/inputs/text-area.spec.d.ts +2 -0
  130. package/esm/components/inputs/text-area.spec.d.ts.map +1 -0
  131. package/esm/components/inputs/text-area.spec.js +214 -0
  132. package/esm/components/inputs/text-area.spec.js.map +1 -0
  133. package/esm/components/loader.js +1 -1
  134. package/esm/components/loader.js.map +1 -1
  135. package/esm/components/loader.spec.d.ts +2 -0
  136. package/esm/components/loader.spec.d.ts.map +1 -0
  137. package/esm/components/loader.spec.js +251 -0
  138. package/esm/components/loader.spec.js.map +1 -0
  139. package/esm/components/modal.d.ts.map +1 -1
  140. package/esm/components/modal.js +11 -9
  141. package/esm/components/modal.js.map +1 -1
  142. package/esm/components/modal.spec.d.ts +2 -0
  143. package/esm/components/modal.spec.d.ts.map +1 -0
  144. package/esm/components/modal.spec.js +227 -0
  145. package/esm/components/modal.spec.js.map +1 -0
  146. package/esm/components/noty-list.d.ts.map +1 -1
  147. package/esm/components/noty-list.js +39 -40
  148. package/esm/components/noty-list.js.map +1 -1
  149. package/esm/components/noty-list.spec.d.ts +2 -0
  150. package/esm/components/noty-list.spec.d.ts.map +1 -0
  151. package/esm/components/noty-list.spec.js +486 -0
  152. package/esm/components/noty-list.spec.js.map +1 -0
  153. package/esm/components/paper.d.ts.map +1 -1
  154. package/esm/components/paper.js +15 -12
  155. package/esm/components/paper.js.map +1 -1
  156. package/esm/components/paper.spec.d.ts +2 -0
  157. package/esm/components/paper.spec.d.ts.map +1 -0
  158. package/esm/components/paper.spec.js +63 -0
  159. package/esm/components/paper.spec.js.map +1 -0
  160. package/esm/components/skeleton.js +1 -1
  161. package/esm/components/skeleton.js.map +1 -1
  162. package/esm/components/skeleton.spec.d.ts +2 -0
  163. package/esm/components/skeleton.spec.d.ts.map +1 -0
  164. package/esm/components/skeleton.spec.js +159 -0
  165. package/esm/components/skeleton.spec.js.map +1 -0
  166. package/esm/components/styles.spec.d.ts +2 -0
  167. package/esm/components/styles.spec.d.ts.map +1 -0
  168. package/esm/components/styles.spec.js +56 -0
  169. package/esm/components/styles.spec.js.map +1 -0
  170. package/esm/components/suggest/index.d.ts.map +1 -1
  171. package/esm/components/suggest/index.js +74 -83
  172. package/esm/components/suggest/index.js.map +1 -1
  173. package/esm/components/suggest/index.spec.d.ts +2 -0
  174. package/esm/components/suggest/index.spec.d.ts.map +1 -0
  175. package/esm/components/suggest/index.spec.js +515 -0
  176. package/esm/components/suggest/index.spec.js.map +1 -0
  177. package/esm/components/suggest/suggest-input.d.ts.map +1 -1
  178. package/esm/components/suggest/suggest-input.js +16 -17
  179. package/esm/components/suggest/suggest-input.js.map +1 -1
  180. package/esm/components/suggest/suggest-input.spec.d.ts +2 -0
  181. package/esm/components/suggest/suggest-input.spec.d.ts.map +1 -0
  182. package/esm/components/suggest/suggest-input.spec.js +138 -0
  183. package/esm/components/suggest/suggest-input.spec.js.map +1 -0
  184. package/esm/components/suggest/suggest-manager.spec.d.ts +2 -0
  185. package/esm/components/suggest/suggest-manager.spec.d.ts.map +1 -0
  186. package/esm/components/suggest/suggest-manager.spec.js +308 -0
  187. package/esm/components/suggest/suggest-manager.spec.js.map +1 -0
  188. package/esm/components/suggest/suggestion-list.d.ts.map +1 -1
  189. package/esm/components/suggest/suggestion-list.js +43 -48
  190. package/esm/components/suggest/suggestion-list.js.map +1 -1
  191. package/esm/components/suggest/suggestion-list.spec.d.ts +2 -0
  192. package/esm/components/suggest/suggestion-list.spec.d.ts.map +1 -0
  193. package/esm/components/suggest/suggestion-list.spec.js +252 -0
  194. package/esm/components/suggest/suggestion-list.spec.js.map +1 -0
  195. package/esm/components/tabs.d.ts.map +1 -1
  196. package/esm/components/tabs.js +32 -18
  197. package/esm/components/tabs.js.map +1 -1
  198. package/esm/components/tabs.spec.d.ts +2 -0
  199. package/esm/components/tabs.spec.d.ts.map +1 -0
  200. package/esm/components/tabs.spec.js +187 -0
  201. package/esm/components/tabs.spec.js.map +1 -0
  202. package/esm/components/wizard/index.d.ts.map +1 -1
  203. package/esm/components/wizard/index.js +10 -7
  204. package/esm/components/wizard/index.js.map +1 -1
  205. package/esm/components/wizard/index.spec.d.ts +2 -0
  206. package/esm/components/wizard/index.spec.d.ts.map +1 -0
  207. package/esm/components/wizard/index.spec.js +171 -0
  208. package/esm/components/wizard/index.spec.js.map +1 -0
  209. package/esm/services/collection-service.spec.js +391 -2
  210. package/esm/services/collection-service.spec.js.map +1 -1
  211. package/esm/services/css-variable-theme.d.ts.map +1 -1
  212. package/esm/services/css-variable-theme.js +21 -1
  213. package/esm/services/css-variable-theme.js.map +1 -1
  214. package/esm/services/css-variable-theme.spec.d.ts +2 -0
  215. package/esm/services/css-variable-theme.spec.d.ts.map +1 -0
  216. package/esm/services/css-variable-theme.spec.js +169 -0
  217. package/esm/services/css-variable-theme.spec.js.map +1 -0
  218. package/esm/services/default-palette.d.ts +4 -0
  219. package/esm/services/default-palette.d.ts.map +1 -1
  220. package/esm/services/default-palette.js +22 -0
  221. package/esm/services/default-palette.js.map +1 -1
  222. package/esm/services/theme-provider-service.d.ts +59 -1
  223. package/esm/services/theme-provider-service.d.ts.map +1 -1
  224. package/esm/services/theme-provider-service.js.map +1 -1
  225. package/esm/services/theme-provider-service.spec.d.ts +2 -0
  226. package/esm/services/theme-provider-service.spec.d.ts.map +1 -0
  227. package/esm/services/theme-provider-service.spec.js +166 -0
  228. package/esm/services/theme-provider-service.spec.js.map +1 -0
  229. package/package.json +2 -2
  230. package/src/components/animations.spec.ts +299 -0
  231. package/src/components/app-bar-link.spec.tsx +341 -0
  232. package/src/components/app-bar-link.tsx +21 -21
  233. package/src/components/app-bar.spec.tsx +142 -0
  234. package/src/components/app-bar.tsx +22 -22
  235. package/src/components/avatar.spec.tsx +146 -0
  236. package/src/components/avatar.tsx +17 -20
  237. package/src/components/button.spec.tsx +193 -0
  238. package/src/components/button.tsx +162 -197
  239. package/src/components/command-palette/command-palette-input.spec.tsx +320 -0
  240. package/src/components/command-palette/command-palette-input.tsx +19 -22
  241. package/src/components/command-palette/command-palette-manager.spec.ts +470 -0
  242. package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +499 -0
  243. package/src/components/command-palette/command-palette-suggestion-list.tsx +42 -46
  244. package/src/components/command-palette/index.spec.tsx +684 -0
  245. package/src/components/command-palette/index.tsx +107 -136
  246. package/src/components/data-grid/body.spec.tsx +340 -0
  247. package/src/components/data-grid/body.tsx +1 -1
  248. package/src/components/data-grid/data-grid-row.spec.tsx +382 -0
  249. package/src/components/data-grid/data-grid-row.tsx +50 -82
  250. package/src/components/data-grid/data-grid.spec.tsx +939 -0
  251. package/src/components/data-grid/data-grid.tsx +38 -35
  252. package/src/components/data-grid/footer.spec.tsx +344 -0
  253. package/src/components/data-grid/footer.tsx +19 -19
  254. package/src/components/data-grid/header.spec.tsx +563 -0
  255. package/src/components/data-grid/header.tsx +53 -44
  256. package/src/components/data-grid/selection-cell.spec.tsx +150 -0
  257. package/src/components/data-grid/selection-cell.tsx +12 -6
  258. package/src/components/fab.spec.tsx +108 -0
  259. package/src/components/fab.tsx +10 -1
  260. package/src/components/form.spec.tsx +481 -0
  261. package/src/components/grid.spec.tsx +334 -0
  262. package/src/components/grid.tsx +57 -63
  263. package/src/components/inputs/autocomplete.spec.tsx +258 -0
  264. package/src/components/inputs/input.spec.tsx +808 -0
  265. package/src/components/inputs/input.tsx +153 -139
  266. package/src/components/inputs/text-area.spec.tsx +285 -0
  267. package/src/components/inputs/text-area.tsx +53 -79
  268. package/src/components/loader.spec.tsx +346 -0
  269. package/src/components/loader.tsx +1 -1
  270. package/src/components/modal.spec.tsx +304 -0
  271. package/src/components/modal.tsx +11 -9
  272. package/src/components/noty-list.spec.tsx +631 -0
  273. package/src/components/noty-list.tsx +39 -50
  274. package/src/components/paper.spec.tsx +72 -0
  275. package/src/components/paper.tsx +15 -13
  276. package/src/components/skeleton.spec.tsx +219 -0
  277. package/src/components/skeleton.tsx +1 -1
  278. package/src/components/styles.spec.ts +70 -0
  279. package/src/components/suggest/index.spec.tsx +861 -0
  280. package/src/components/suggest/index.tsx +74 -101
  281. package/src/components/suggest/suggest-input.spec.tsx +181 -0
  282. package/src/components/suggest/suggest-input.tsx +16 -24
  283. package/src/components/suggest/suggest-manager.spec.ts +409 -0
  284. package/src/components/suggest/suggestion-list.spec.tsx +334 -0
  285. package/src/components/suggest/suggestion-list.tsx +43 -48
  286. package/src/components/tabs.spec.tsx +236 -0
  287. package/src/components/tabs.tsx +33 -21
  288. package/src/components/wizard/index.spec.tsx +224 -0
  289. package/src/components/wizard/index.tsx +10 -9
  290. package/src/services/collection-service.spec.ts +492 -3
  291. package/src/services/css-variable-theme.spec.ts +204 -0
  292. package/src/services/css-variable-theme.ts +21 -1
  293. package/src/services/default-palette.ts +22 -0
  294. package/src/services/theme-provider-service.spec.ts +195 -0
  295. package/src/services/theme-provider-service.ts +60 -2
@@ -0,0 +1,320 @@
1
+ import { Injector } from '@furystack/inject'
2
+ import { createComponent, initializeShadeRoot } from '@furystack/shades'
3
+ import { sleepAsync } from '@furystack/utils'
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
+ import { CommandPaletteInput } from './command-palette-input.js'
6
+ import { CommandPaletteManager } from './command-palette-manager.js'
7
+
8
+ describe('CommandPaletteInput', () => {
9
+ let originalAnimate: typeof Element.prototype.animate
10
+ let animateCalls: Array<{ keyframes: unknown; options: unknown }>
11
+
12
+ beforeEach(() => {
13
+ document.body.innerHTML = '<div id="root"></div>'
14
+ animateCalls = []
15
+ originalAnimate = Element.prototype.animate
16
+
17
+ Element.prototype.animate = vi.fn(
18
+ (keyframes: Keyframe[] | PropertyIndexedKeyframes | null, options?: number | KeyframeAnimationOptions) => {
19
+ animateCalls.push({ keyframes, options })
20
+ const mockAnimation = {
21
+ onfinish: null as ((event: AnimationPlaybackEvent) => void) | null,
22
+ oncancel: null as ((event: AnimationPlaybackEvent) => void) | null,
23
+ cancel: vi.fn(),
24
+ play: vi.fn(),
25
+ pause: vi.fn(),
26
+ finish: vi.fn(),
27
+ addEventListener: vi.fn(),
28
+ removeEventListener: vi.fn(),
29
+ }
30
+
31
+ setTimeout(() => {
32
+ mockAnimation.onfinish?.({} as AnimationPlaybackEvent)
33
+ }, 10)
34
+
35
+ return mockAnimation as unknown as Animation
36
+ },
37
+ ) as typeof Element.prototype.animate
38
+ })
39
+
40
+ afterEach(() => {
41
+ document.body.innerHTML = ''
42
+ Element.prototype.animate = originalAnimate
43
+ vi.restoreAllMocks()
44
+ })
45
+
46
+ const createManager = () => {
47
+ return new CommandPaletteManager([])
48
+ }
49
+
50
+ it('should render with shadow DOM', async () => {
51
+ const injector = new Injector()
52
+ const manager = createManager()
53
+ const rootElement = document.getElementById('root') as HTMLDivElement
54
+
55
+ initializeShadeRoot({
56
+ injector,
57
+ rootElement,
58
+ jsxElement: <CommandPaletteInput manager={manager} />,
59
+ })
60
+
61
+ await sleepAsync(50)
62
+
63
+ const input = document.querySelector('shades-command-palette-input')
64
+ expect(input).not.toBeNull()
65
+
66
+ manager[Symbol.dispose]()
67
+ })
68
+
69
+ it('should render an input element with placeholder', async () => {
70
+ const injector = new Injector()
71
+ const manager = createManager()
72
+ const rootElement = document.getElementById('root') as HTMLDivElement
73
+
74
+ initializeShadeRoot({
75
+ injector,
76
+ rootElement,
77
+ jsxElement: <CommandPaletteInput manager={manager} />,
78
+ })
79
+
80
+ await sleepAsync(50)
81
+
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
+
87
+ manager[Symbol.dispose]()
88
+ })
89
+
90
+ it('should start with width 0% when closed', async () => {
91
+ const injector = new Injector()
92
+ const manager = createManager()
93
+ manager.isOpened.setValue(false)
94
+ const rootElement = document.getElementById('root') as HTMLDivElement
95
+
96
+ initializeShadeRoot({
97
+ injector,
98
+ rootElement,
99
+ jsxElement: <CommandPaletteInput manager={manager} />,
100
+ })
101
+
102
+ await sleepAsync(50)
103
+
104
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
105
+ expect(component.style.width).toBe('0%')
106
+
107
+ manager[Symbol.dispose]()
108
+ })
109
+
110
+ it('should have width 100% when opened', async () => {
111
+ const injector = new Injector()
112
+ const manager = createManager()
113
+ manager.isOpened.setValue(true)
114
+ const rootElement = document.getElementById('root') as HTMLDivElement
115
+
116
+ initializeShadeRoot({
117
+ injector,
118
+ rootElement,
119
+ jsxElement: <CommandPaletteInput manager={manager} />,
120
+ })
121
+
122
+ await sleepAsync(50)
123
+
124
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
125
+ expect(component.style.width).toBe('100%')
126
+
127
+ manager[Symbol.dispose]()
128
+ })
129
+
130
+ it('should animate width when opening', async () => {
131
+ const injector = new Injector()
132
+ const manager = createManager()
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)
157
+
158
+ manager[Symbol.dispose]()
159
+ })
160
+
161
+ it('should animate width when closing', async () => {
162
+ const injector = new Injector()
163
+ const manager = createManager()
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()
187
+
188
+ manager[Symbol.dispose]()
189
+ })
190
+
191
+ it('should clear input value when opening', async () => {
192
+ const injector = new Injector()
193
+ const manager = createManager()
194
+ manager.isOpened.setValue(false)
195
+ const rootElement = document.getElementById('root') as HTMLDivElement
196
+
197
+ initializeShadeRoot({
198
+ injector,
199
+ rootElement,
200
+ jsxElement: <CommandPaletteInput manager={manager} />,
201
+ })
202
+
203
+ await sleepAsync(50)
204
+
205
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
206
+ const inputElement = component?.querySelector('input') as HTMLInputElement
207
+ inputElement.value = 'some text'
208
+
209
+ manager.isOpened.setValue(true)
210
+ await sleepAsync(50)
211
+
212
+ expect(inputElement.value).toBe('')
213
+
214
+ manager[Symbol.dispose]()
215
+ })
216
+
217
+ it('should clear input value when closing', async () => {
218
+ const injector = new Injector()
219
+ const manager = createManager()
220
+ manager.isOpened.setValue(true)
221
+ const rootElement = document.getElementById('root') as HTMLDivElement
222
+
223
+ initializeShadeRoot({
224
+ injector,
225
+ rootElement,
226
+ jsxElement: <CommandPaletteInput manager={manager} />,
227
+ })
228
+
229
+ await sleepAsync(50)
230
+
231
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
232
+ const inputElement = component?.querySelector('input') as HTMLInputElement
233
+ inputElement.value = 'search term'
234
+
235
+ manager.isOpened.setValue(false)
236
+ await sleepAsync(50)
237
+
238
+ expect(inputElement.value).toBe('')
239
+
240
+ manager[Symbol.dispose]()
241
+ })
242
+
243
+ it('should have overflow hidden style', async () => {
244
+ const injector = new Injector()
245
+ const manager = createManager()
246
+ const rootElement = document.getElementById('root') as HTMLDivElement
247
+
248
+ initializeShadeRoot({
249
+ injector,
250
+ rootElement,
251
+ jsxElement: <CommandPaletteInput manager={manager} />,
252
+ })
253
+
254
+ await sleepAsync(50)
255
+
256
+ const component = document.querySelector('shades-command-palette-input') as HTMLElement
257
+ const computedStyle = window.getComputedStyle(component)
258
+ expect(computedStyle.overflow).toBe('hidden')
259
+
260
+ manager[Symbol.dispose]()
261
+ })
262
+
263
+ it('should use cubic-bezier easing for animations', async () => {
264
+ const injector = new Injector()
265
+ const manager = createManager()
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
+ )
289
+
290
+ manager[Symbol.dispose]()
291
+ })
292
+
293
+ it('should fill animation forwards', async () => {
294
+ const injector = new Injector()
295
+ const manager = createManager()
296
+ manager.isOpened.setValue(false)
297
+ const rootElement = document.getElementById('root') as HTMLDivElement
298
+
299
+ initializeShadeRoot({
300
+ injector,
301
+ rootElement,
302
+ jsxElement: <CommandPaletteInput manager={manager} />,
303
+ })
304
+
305
+ await sleepAsync(50)
306
+ animateCalls = []
307
+
308
+ manager.isOpened.setValue(true)
309
+ await sleepAsync(50)
310
+
311
+ const widthAnimation = animateCalls.find(
312
+ (call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'width' in kf),
313
+ )
314
+
315
+ expect(widthAnimation).toBeDefined()
316
+ expect((widthAnimation?.options as KeyframeAnimationOptions)?.fill).toBe('forwards')
317
+
318
+ manager[Symbol.dispose]()
319
+ })
320
+ })
@@ -1,5 +1,5 @@
1
1
  import { Shade, createComponent } from '@furystack/shades'
2
- import { ThemeProviderService } from '../../services/theme-provider-service.js'
2
+ import { cssVariableTheme } from '../../services/css-variable-theme.js'
3
3
  import { promisifyAnimation } from '../../utils/promisify-animation.js'
4
4
  import type { CommandPaletteManager } from './command-palette-manager.js'
5
5
 
@@ -27,32 +27,29 @@ const updateComponent = async (element: HTMLElement, isOpened: boolean) => {
27
27
 
28
28
  export const CommandPaletteInput = Shade<{ manager: CommandPaletteManager }>({
29
29
  shadowDomName: 'shades-command-palette-input',
30
- render: ({ element, props, injector, useObservable }) => {
31
- const { theme } = injector.getInstance(ThemeProviderService)
30
+ css: {
31
+ overflow: 'hidden',
32
+ '& input': {
33
+ color: cssVariableTheme.text.primary,
34
+ outline: 'none',
35
+ padding: '0.875em 0.5em',
36
+ background: 'transparent',
37
+ border: 'none',
38
+ display: 'inline-flex',
39
+ width: 'calc(100% - 1em)',
40
+ fontSize: '0.95em',
41
+ fontWeight: '400',
42
+ letterSpacing: '0.01em',
43
+ },
44
+ },
45
+ render: ({ element, props, useObservable }) => {
32
46
  const { manager } = props
33
47
 
34
48
  const [isCurrentlyOpened] = useObservable('isOpened', manager.isOpened, {
35
49
  onChange: (newValue) => void updateComponent(element, newValue),
36
50
  })
37
51
  element.style.width = isCurrentlyOpened ? '100%' : '0%'
38
- element.style.overflow = 'hidden'
39
- return (
40
- <input
41
- autofocus
42
- placeholder="Type to search commands..."
43
- style={{
44
- color: theme.text.primary,
45
- outline: 'none',
46
- padding: '0.875em 0.5em',
47
- background: 'transparent',
48
- border: 'none',
49
- display: 'inline-flex',
50
- width: 'calc(100% - 1em)',
51
- fontSize: '0.95em',
52
- fontWeight: '400',
53
- letterSpacing: '0.01em',
54
- }}
55
- />
56
- )
52
+
53
+ return <input autofocus placeholder="Type to search commands..." />
57
54
  },
58
55
  })