@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,304 @@
1
+ import { Injector } from '@furystack/inject'
2
+ import { initializeShadeRoot, createComponent } from '@furystack/shades'
3
+ import { ObservableValue, sleepAsync, usingAsync } from '@furystack/utils'
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
+ import { Modal } from './modal.js'
6
+
7
+ describe('Modal', () => {
8
+ beforeEach(() => {
9
+ document.body.innerHTML = '<div id="root"></div>'
10
+ })
11
+
12
+ afterEach(() => {
13
+ document.body.innerHTML = ''
14
+ })
15
+
16
+ describe('visibility', () => {
17
+ it('should render when isVisible is true', async () => {
18
+ await usingAsync(new Injector(), async (injector) => {
19
+ const rootElement = document.getElementById('root') as HTMLDivElement
20
+ const isVisible = new ObservableValue(true)
21
+
22
+ initializeShadeRoot({
23
+ injector,
24
+ rootElement,
25
+ jsxElement: (
26
+ <Modal isVisible={isVisible}>
27
+ <div id="modal-content">Modal Content</div>
28
+ </Modal>
29
+ ),
30
+ })
31
+
32
+ await sleepAsync(50)
33
+ expect(document.body.innerHTML).toContain('shade-backdrop')
34
+ expect(document.body.innerHTML).toContain('modal-content')
35
+ })
36
+ })
37
+
38
+ it('should not render when isVisible is false', async () => {
39
+ await usingAsync(new Injector(), async (injector) => {
40
+ const rootElement = document.getElementById('root') as HTMLDivElement
41
+ const isVisible = new ObservableValue(false)
42
+
43
+ initializeShadeRoot({
44
+ injector,
45
+ rootElement,
46
+ jsxElement: (
47
+ <Modal isVisible={isVisible}>
48
+ <div id="modal-content">Modal Content</div>
49
+ </Modal>
50
+ ),
51
+ })
52
+
53
+ await sleepAsync(50)
54
+ expect(document.body.innerHTML).not.toContain('shade-backdrop')
55
+ expect(document.body.innerHTML).not.toContain('modal-content')
56
+ })
57
+ })
58
+
59
+ it('should show modal when isVisible changes from false to true', async () => {
60
+ await usingAsync(new Injector(), async (injector) => {
61
+ const rootElement = document.getElementById('root') as HTMLDivElement
62
+ const isVisible = new ObservableValue(false)
63
+
64
+ initializeShadeRoot({
65
+ injector,
66
+ rootElement,
67
+ jsxElement: (
68
+ <Modal isVisible={isVisible}>
69
+ <div id="modal-content">Modal Content</div>
70
+ </Modal>
71
+ ),
72
+ })
73
+
74
+ await sleepAsync(50)
75
+ expect(document.body.innerHTML).not.toContain('modal-content')
76
+
77
+ isVisible.setValue(true)
78
+ await sleepAsync(50)
79
+
80
+ expect(document.body.innerHTML).toContain('shade-backdrop')
81
+ expect(document.body.innerHTML).toContain('modal-content')
82
+ })
83
+ })
84
+
85
+ it('should hide modal when isVisible changes from true to false', async () => {
86
+ await usingAsync(new Injector(), async (injector) => {
87
+ const rootElement = document.getElementById('root') as HTMLDivElement
88
+ const isVisible = new ObservableValue(true)
89
+
90
+ initializeShadeRoot({
91
+ injector,
92
+ rootElement,
93
+ jsxElement: (
94
+ <Modal isVisible={isVisible}>
95
+ <div id="modal-content">Modal Content</div>
96
+ </Modal>
97
+ ),
98
+ })
99
+
100
+ await sleepAsync(50)
101
+ expect(document.body.innerHTML).toContain('modal-content')
102
+
103
+ isVisible.setValue(false)
104
+ await sleepAsync(50)
105
+
106
+ expect(document.body.innerHTML).not.toContain('shade-backdrop')
107
+ expect(document.body.innerHTML).not.toContain('modal-content')
108
+ })
109
+ })
110
+ })
111
+
112
+ describe('backdrop click', () => {
113
+ it('should call onClose when backdrop is clicked', async () => {
114
+ await usingAsync(new Injector(), async (injector) => {
115
+ const rootElement = document.getElementById('root') as HTMLDivElement
116
+ const isVisible = new ObservableValue(true)
117
+ const onClose = vi.fn()
118
+
119
+ initializeShadeRoot({
120
+ injector,
121
+ rootElement,
122
+ jsxElement: (
123
+ <Modal isVisible={isVisible} onClose={onClose}>
124
+ <div id="modal-content">Modal Content</div>
125
+ </Modal>
126
+ ),
127
+ })
128
+
129
+ await sleepAsync(50)
130
+ const backdrop = document.querySelector('.shade-backdrop') as HTMLDivElement
131
+ expect(backdrop).not.toBeNull()
132
+
133
+ backdrop.click()
134
+ await sleepAsync(50)
135
+
136
+ expect(onClose).toHaveBeenCalledTimes(1)
137
+ })
138
+ })
139
+
140
+ it('should call hideAnimation before onClose when backdrop is clicked', async () => {
141
+ await usingAsync(new Injector(), async (injector) => {
142
+ const rootElement = document.getElementById('root') as HTMLDivElement
143
+ const isVisible = new ObservableValue(true)
144
+ const callOrder: string[] = []
145
+ const hideAnimation = vi.fn(async () => {
146
+ callOrder.push('hideAnimation')
147
+ })
148
+ const onClose = vi.fn(() => {
149
+ callOrder.push('onClose')
150
+ })
151
+
152
+ initializeShadeRoot({
153
+ injector,
154
+ rootElement,
155
+ jsxElement: (
156
+ <Modal isVisible={isVisible} onClose={onClose} hideAnimation={hideAnimation}>
157
+ <div id="modal-content">Modal Content</div>
158
+ </Modal>
159
+ ),
160
+ })
161
+
162
+ await sleepAsync(50)
163
+ const backdrop = document.querySelector('.shade-backdrop') as HTMLDivElement
164
+ backdrop.click()
165
+ await sleepAsync(50)
166
+
167
+ expect(hideAnimation).toHaveBeenCalledTimes(1)
168
+ expect(onClose).toHaveBeenCalledTimes(1)
169
+ expect(callOrder).toEqual(['hideAnimation', 'onClose'])
170
+ })
171
+ })
172
+ })
173
+
174
+ describe('animations', () => {
175
+ it('should call showAnimation when modal becomes visible', async () => {
176
+ await usingAsync(new Injector(), async (injector) => {
177
+ const rootElement = document.getElementById('root') as HTMLDivElement
178
+ const isVisible = new ObservableValue(true)
179
+ const showAnimation = vi.fn()
180
+
181
+ initializeShadeRoot({
182
+ injector,
183
+ rootElement,
184
+ jsxElement: (
185
+ <Modal isVisible={isVisible} showAnimation={showAnimation}>
186
+ <div id="modal-content">Modal Content</div>
187
+ </Modal>
188
+ ),
189
+ })
190
+
191
+ await sleepAsync(50)
192
+ expect(showAnimation).toHaveBeenCalled()
193
+ })
194
+ })
195
+
196
+ it('should call showAnimation with element when visibility changes to true', async () => {
197
+ await usingAsync(new Injector(), async (injector) => {
198
+ const rootElement = document.getElementById('root') as HTMLDivElement
199
+ const isVisible = new ObservableValue(false)
200
+ const showAnimation = vi.fn()
201
+
202
+ initializeShadeRoot({
203
+ injector,
204
+ rootElement,
205
+ jsxElement: (
206
+ <Modal isVisible={isVisible} showAnimation={showAnimation}>
207
+ <div id="modal-content">Modal Content</div>
208
+ </Modal>
209
+ ),
210
+ })
211
+
212
+ await sleepAsync(50)
213
+ expect(showAnimation).not.toHaveBeenCalled()
214
+
215
+ isVisible.setValue(true)
216
+ await sleepAsync(50)
217
+
218
+ expect(showAnimation).toHaveBeenCalled()
219
+ expect(showAnimation.mock.calls[0][0]).toBeInstanceOf(Element)
220
+ })
221
+ })
222
+
223
+ it('should call hideAnimation with element on backdrop click', async () => {
224
+ await usingAsync(new Injector(), async (injector) => {
225
+ const rootElement = document.getElementById('root') as HTMLDivElement
226
+ const isVisible = new ObservableValue(true)
227
+ const hideAnimation = vi.fn()
228
+
229
+ initializeShadeRoot({
230
+ injector,
231
+ rootElement,
232
+ jsxElement: (
233
+ <Modal isVisible={isVisible} hideAnimation={hideAnimation}>
234
+ <div id="modal-content">Modal Content</div>
235
+ </Modal>
236
+ ),
237
+ })
238
+
239
+ await sleepAsync(50)
240
+ const backdrop = document.querySelector('.shade-backdrop') as HTMLDivElement
241
+ backdrop.click()
242
+ await sleepAsync(50)
243
+
244
+ expect(hideAnimation).toHaveBeenCalled()
245
+ expect(hideAnimation.mock.calls[0][0]).toBeInstanceOf(Element)
246
+ })
247
+ })
248
+ })
249
+
250
+ describe('styling', () => {
251
+ it('should apply custom backdropStyle', async () => {
252
+ await usingAsync(new Injector(), async (injector) => {
253
+ const rootElement = document.getElementById('root') as HTMLDivElement
254
+ const isVisible = new ObservableValue(true)
255
+ const backdropStyle: Partial<CSSStyleDeclaration> = {
256
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
257
+ zIndex: '1000',
258
+ }
259
+
260
+ initializeShadeRoot({
261
+ injector,
262
+ rootElement,
263
+ jsxElement: (
264
+ <Modal isVisible={isVisible} backdropStyle={backdropStyle}>
265
+ <div id="modal-content">Modal Content</div>
266
+ </Modal>
267
+ ),
268
+ })
269
+
270
+ await sleepAsync(50)
271
+ const backdrop = document.querySelector('.shade-backdrop') as HTMLDivElement
272
+ expect(backdrop).not.toBeNull()
273
+ expect(backdrop.style.backgroundColor).toBe('rgba(0, 0, 0, 0.5)')
274
+ expect(backdrop.style.zIndex).toBe('1000')
275
+ })
276
+ })
277
+ })
278
+
279
+ describe('children', () => {
280
+ it('should render children inside the backdrop', async () => {
281
+ await usingAsync(new Injector(), async (injector) => {
282
+ const rootElement = document.getElementById('root') as HTMLDivElement
283
+ const isVisible = new ObservableValue(true)
284
+
285
+ initializeShadeRoot({
286
+ injector,
287
+ rootElement,
288
+ jsxElement: (
289
+ <Modal isVisible={isVisible}>
290
+ <div id="child-1">First Child</div>
291
+ <div id="child-2">Second Child</div>
292
+ </Modal>
293
+ ),
294
+ })
295
+
296
+ await sleepAsync(50)
297
+ const backdrop = document.querySelector('.shade-backdrop') as HTMLDivElement
298
+ expect(backdrop).not.toBeNull()
299
+ expect(backdrop.innerHTML).toContain('child-1')
300
+ expect(backdrop.innerHTML).toContain('child-2')
301
+ })
302
+ })
303
+ })
304
+ })
@@ -11,6 +11,16 @@ export type ModalProps = {
11
11
 
12
12
  export const Modal = Shade<ModalProps>({
13
13
  shadowDomName: 'shade-modal',
14
+ css: {
15
+ '& .shade-backdrop': {
16
+ width: '100%',
17
+ height: '100%',
18
+ display: 'block',
19
+ position: 'fixed',
20
+ top: '0',
21
+ left: '0',
22
+ },
23
+ },
14
24
  render: ({ props, children, useObservable, element }) => {
15
25
  const [isVisible] = useObservable('isVisible', props.isVisible)
16
26
 
@@ -25,15 +35,7 @@ export const Modal = Shade<ModalProps>({
25
35
  await props.hideAnimation?.(element)
26
36
  props.onClose?.()
27
37
  }}
28
- style={{
29
- width: '100%',
30
- height: '100%',
31
- display: 'block',
32
- position: 'fixed',
33
- top: '0',
34
- left: '0',
35
- ...props.backdropStyle,
36
- }}
38
+ style={props.backdropStyle}
37
39
  >
38
40
  {children}
39
41
  </div>