@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,71 @@
1
1
  # Changelog
2
2
 
3
+ ## [11.0.0] - 2026-02-01
4
+
5
+ ### 💥 Breaking Changes
6
+
7
+ ### Added Contrast Colors to ColorVariants
8
+
9
+ The `ColorVariants` type now requires contrast color properties for accessible text on colored backgrounds. This affects any code that defines custom themes or palette colors.
10
+
11
+ **New required properties:**
12
+
13
+ - `lightContrast` - Text color for the `light` variant background
14
+ - `mainContrast` - Text color for the `main` variant background
15
+ - `darkContrast` - Text color for the `dark` variant background
16
+
17
+ **Migration:**
18
+
19
+ ```typescript
20
+ // Before
21
+ const myPalette: Palette = {
22
+ primary: {
23
+ light: '#6573c3',
24
+ main: '#3f51b5',
25
+ dark: '#2c387e',
26
+ },
27
+ // ...
28
+ }
29
+
30
+ // After
31
+ const myPalette: Palette = {
32
+ primary: {
33
+ light: '#6573c3',
34
+ lightContrast: '#ffffff',
35
+ main: '#3f51b5',
36
+ mainContrast: '#ffffff',
37
+ dark: '#2c387e',
38
+ darkContrast: '#ffffff',
39
+ },
40
+ // ...
41
+ }
42
+ ```
43
+
44
+ ### ♻️ Refactoring
45
+
46
+ ### Migrated Components to CSS Property
47
+
48
+ Refactored all components to use the new `css` property from `@furystack/shades` instead of inline styles and `useState` for CSS states. This provides cleaner code, better separation of concerns, and improved performance.
49
+
50
+ **Refactored components:**
51
+
52
+ - `Button` - uses `css` for hover/active/disabled states and variant styles via data attributes
53
+ - `AppBar` and `AppBarLink` - moved layout and hover styles to `css`
54
+ - `Avatar` - moved styling to `css` with support for customizable border radius
55
+ - `CommandPalette`, `CommandPaletteInput`, `CommandPaletteSuggestionList` - consolidated styles into `css`
56
+ - `DataGrid`, `DataGridRow`, `DataGridHeader`, `DataGridFooter`, `SelectionCell` - migrated grid styling to `css`
57
+ - `FAB` (Floating Action Button) - moved positioning and hover effects to `css`
58
+ - `Grid` - moved responsive grid styling to `css`
59
+ - `Input` and `TextArea` - migrated input styling and focus states to `css`
60
+ - `Loader` - minor style cleanup
61
+ - `Modal` - moved backdrop and content container styles to `css`
62
+ - `NotyList` - migrated notification styling to `css`
63
+ - `Paper` - moved card styling to `css`
64
+ - `Skeleton` - minor style cleanup
65
+ - `Suggest`, `SuggestInput`, `SuggestionList` - consolidated autocomplete styling into `css`
66
+ - `Tabs` - moved tab styling and active states to `css`
67
+ - `Wizard` - moved wizard container styles to `css`
68
+
3
69
  ## [10.0.35] - 2026-01-26
4
70
 
5
71
  ### 🔧 Chores
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=animations.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animations.spec.d.ts","sourceRoot":"","sources":["../../src/components/animations.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,201 @@
1
+ import { sleepAsync } from '@furystack/utils';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ import { collapse, expand, fadeIn, fadeOut, hideSlide, showParallax, showSlide } from './animations.js';
4
+ const createMockElement = (scrollHeight = 100) => {
5
+ const el = document.createElement('div');
6
+ const onfinish = vi.fn();
7
+ const oncancel = vi.fn();
8
+ const animate = vi.fn(() => {
9
+ const animation = {
10
+ onfinish,
11
+ oncancel,
12
+ };
13
+ void sleepAsync(10).then(() => {
14
+ animation.onfinish();
15
+ });
16
+ return animation;
17
+ });
18
+ Object.defineProperty(el, 'animate', { value: animate, writable: true });
19
+ Object.defineProperty(el, 'scrollHeight', { value: scrollHeight, writable: true });
20
+ return { el, animate, onfinish, oncancel };
21
+ };
22
+ describe('animations', () => {
23
+ describe('showSlide', () => {
24
+ it('should animate element with slide-in keyframes', async () => {
25
+ const { el, animate } = createMockElement();
26
+ await showSlide(el);
27
+ expect(animate).toHaveBeenCalledWith([
28
+ { transform: 'translate(-350px, 0)scale(0)', opacity: 0 },
29
+ { transform: 'translate(0, 0)scale(1)', opacity: 1 },
30
+ ], expect.objectContaining({
31
+ duration: 500,
32
+ easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',
33
+ fill: 'forwards',
34
+ }));
35
+ });
36
+ it('should merge custom options', async () => {
37
+ const { el, animate } = createMockElement();
38
+ await showSlide(el, { duration: 1000, delay: 200 });
39
+ expect(animate).toHaveBeenCalledWith(expect.any(Array), expect.objectContaining({
40
+ duration: 1000,
41
+ delay: 200,
42
+ easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',
43
+ fill: 'forwards',
44
+ }));
45
+ });
46
+ it('should reject when element is null', async () => {
47
+ await expect(showSlide(null)).rejects.toThrow('No element provided');
48
+ });
49
+ it('should reject when element is undefined', async () => {
50
+ await expect(showSlide(undefined)).rejects.toThrow('No element provided');
51
+ });
52
+ });
53
+ describe('hideSlide', () => {
54
+ it('should animate element with slide-out keyframes', async () => {
55
+ const { el, animate } = createMockElement();
56
+ await hideSlide(el);
57
+ expect(animate).toHaveBeenCalledWith([
58
+ { transform: 'translate(0, 0)scale(1)', opacity: 1 },
59
+ { transform: 'translate(-350px, 0)scale(0)', opacity: 0 },
60
+ ], expect.objectContaining({
61
+ duration: 500,
62
+ easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',
63
+ fill: 'forwards',
64
+ }));
65
+ });
66
+ it('should merge custom options', async () => {
67
+ const { el, animate } = createMockElement();
68
+ await hideSlide(el, { duration: 300 });
69
+ expect(animate).toHaveBeenCalledWith(expect.any(Array), expect.objectContaining({
70
+ duration: 300,
71
+ }));
72
+ });
73
+ it('should reject when element is null', async () => {
74
+ await expect(hideSlide(null)).rejects.toThrow('No element provided');
75
+ });
76
+ });
77
+ describe('fadeOut', () => {
78
+ it('should animate element with fade-out keyframes', async () => {
79
+ const { el, animate } = createMockElement();
80
+ await fadeOut(el);
81
+ expect(animate).toHaveBeenCalledWith([{ opacity: 1 }, { opacity: 0 }], expect.objectContaining({
82
+ duration: 500,
83
+ easing: 'cubic-bezier(0.165, 0.840, 0.440, 1.000)',
84
+ }));
85
+ });
86
+ it('should merge custom options', async () => {
87
+ const { el, animate } = createMockElement();
88
+ await fadeOut(el, { duration: 200, fill: 'both' });
89
+ expect(animate).toHaveBeenCalledWith(expect.any(Array), expect.objectContaining({
90
+ duration: 200,
91
+ fill: 'both',
92
+ }));
93
+ });
94
+ it('should reject when element is null', async () => {
95
+ await expect(fadeOut(null)).rejects.toThrow('No element provided');
96
+ });
97
+ });
98
+ describe('fadeIn', () => {
99
+ it('should animate element with fade-in keyframes', async () => {
100
+ const { el, animate } = createMockElement();
101
+ await fadeIn(el);
102
+ expect(animate).toHaveBeenCalledWith([{ opacity: 0 }, { opacity: 1 }], expect.objectContaining({
103
+ duration: 500,
104
+ easing: 'cubic-bezier(0.165, 0.840, 0.440, 1.000)',
105
+ }));
106
+ });
107
+ it('should merge custom options', async () => {
108
+ const { el, animate } = createMockElement();
109
+ await fadeIn(el, { duration: 800, easing: 'linear' });
110
+ expect(animate).toHaveBeenCalledWith(expect.any(Array), expect.objectContaining({
111
+ duration: 800,
112
+ easing: 'linear',
113
+ }));
114
+ });
115
+ it('should reject when element is null', async () => {
116
+ await expect(fadeIn(null)).rejects.toThrow('No element provided');
117
+ });
118
+ });
119
+ describe('showParallax', () => {
120
+ it('should animate element with parallax keyframes', async () => {
121
+ const { el, animate } = createMockElement();
122
+ await showParallax(el);
123
+ expect(animate).toHaveBeenCalledWith([
124
+ { transform: 'translate(50px, 0)', opacity: 0 },
125
+ { transform: 'translate(0, 0)', opacity: 1 },
126
+ ], expect.objectContaining({
127
+ duration: 900,
128
+ easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',
129
+ fill: 'forwards',
130
+ }));
131
+ });
132
+ it('should merge custom options', async () => {
133
+ const { el, animate } = createMockElement();
134
+ await showParallax(el, { duration: 1200 });
135
+ expect(animate).toHaveBeenCalledWith(expect.any(Array), expect.objectContaining({
136
+ duration: 1200,
137
+ }));
138
+ });
139
+ it('should reject when element is null', async () => {
140
+ await expect(showParallax(null)).rejects.toThrow('No element provided');
141
+ });
142
+ });
143
+ describe('collapse', () => {
144
+ it('should animate element with collapse keyframes using scrollHeight', async () => {
145
+ const { el, animate } = createMockElement(150);
146
+ await collapse(el);
147
+ expect(animate).toHaveBeenCalledWith([
148
+ { height: '150px', opacity: 1 },
149
+ { height: '0px', opacity: 0 },
150
+ ], expect.objectContaining({
151
+ duration: 500,
152
+ easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',
153
+ fill: 'forwards',
154
+ }));
155
+ });
156
+ it('should merge custom options', async () => {
157
+ const { el, animate } = createMockElement();
158
+ await collapse(el, { duration: 250 });
159
+ expect(animate).toHaveBeenCalledWith(expect.any(Array), expect.objectContaining({
160
+ duration: 250,
161
+ }));
162
+ });
163
+ it('should reject when element is null', async () => {
164
+ await expect(collapse(null)).rejects.toThrow('No element provided');
165
+ });
166
+ it('should handle zero scrollHeight', async () => {
167
+ const { el, animate } = createMockElement(0);
168
+ await collapse(el);
169
+ expect(animate).toHaveBeenCalledWith([
170
+ { height: '0px', opacity: 1 },
171
+ { height: '0px', opacity: 0 },
172
+ ], expect.any(Object));
173
+ });
174
+ });
175
+ describe('expand', () => {
176
+ it('should animate element with expand keyframes using scrollHeight', async () => {
177
+ const { el, animate } = createMockElement(200);
178
+ await expand(el);
179
+ expect(animate).toHaveBeenCalledWith([
180
+ { height: '0px', opacity: 0 },
181
+ { height: '200px', opacity: 1 },
182
+ ], expect.objectContaining({
183
+ duration: 500,
184
+ easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',
185
+ fill: 'forwards',
186
+ }));
187
+ });
188
+ it('should merge custom options', async () => {
189
+ const { el, animate } = createMockElement();
190
+ await expand(el, { duration: 400, fill: 'both' });
191
+ expect(animate).toHaveBeenCalledWith(expect.any(Array), expect.objectContaining({
192
+ duration: 400,
193
+ fill: 'both',
194
+ }));
195
+ });
196
+ it('should reject when element is null', async () => {
197
+ await expect(expand(null)).rejects.toThrow('No element provided');
198
+ });
199
+ });
200
+ });
201
+ //# sourceMappingURL=animations.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animations.spec.js","sourceRoot":"","sources":["../../src/components/animations.spec.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,29 @@
1
- import { attachProps, createComponent, LocationService, RouteLink, Shade } from '@furystack/shades';
1
+ import { createComponent, LocationService, RouteLink, Shade } from '@furystack/shades';
2
2
  import { match } from 'path-to-regexp';
3
- import { ThemeProviderService } from '../services/theme-provider-service.js';
3
+ import { cssVariableTheme } from '../services/css-variable-theme.js';
4
4
  export const AppBarLink = Shade({
5
5
  shadowDomName: 'shade-app-bar-link',
6
+ css: {
7
+ display: 'flex',
8
+ height: '100%',
9
+ textDecoration: 'none',
10
+ alignItems: 'center',
11
+ padding: '0 8px',
12
+ transition: 'color .2s ease-in-out, transform .2s ease-in-out',
13
+ cursor: 'pointer',
14
+ color: cssVariableTheme.text.secondary,
15
+ opacity: '0.8',
16
+ transform: 'scale(0.9)',
17
+ '&.active': {
18
+ color: cssVariableTheme.text.primary,
19
+ opacity: '1',
20
+ transform: 'scale(1)',
21
+ },
22
+ },
6
23
  render: ({ children, props, useObservable, injector, element }) => {
7
- const getAnchorStyle = (currentUrl) => {
8
- const isActive = !!match(props.href, props.routingOptions)(currentUrl);
9
- const themeProviderService = injector.getInstance(ThemeProviderService);
10
- const { theme } = themeProviderService;
11
- return {
12
- display: 'flex',
13
- height: '100%',
14
- textDecoration: 'none',
15
- alignItems: 'center',
16
- padding: '0 8px',
17
- transition: 'color .2s ease-in-out, transform .2s ease-in-out',
18
- color: isActive ? theme.text.primary : theme.text.secondary,
19
- opacity: isActive ? '1' : '0.8',
20
- transform: isActive ? 'scale(1)' : 'scale(0.9)',
21
- cursor: 'pointer',
22
- };
23
- };
24
24
  const [currentUrl] = useObservable('locationChange', injector.getInstance(LocationService).onLocationPathChanged);
25
- attachProps(element, { style: getAnchorStyle(currentUrl) });
25
+ const isActive = !!match(props.href, props.routingOptions)(currentUrl);
26
+ element.classList.toggle('active', isActive);
26
27
  return createComponent(RouteLink, { ...props }, children);
27
28
  },
28
29
  });
@@ -1 +1 @@
1
- {"version":3,"file":"app-bar-link.js","sourceRoot":"","sources":["../../src/components/app-bar-link.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACnG,OAAO,EAAE,KAAK,EAAqB,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAE5E,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAqD;IAClF,aAAa,EAAE,oBAAoB;IACnC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QAChE,MAAM,cAAc,GAAG,CAAC,UAAkB,EAAE,EAAE;YAC5C,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAc,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,CAAA;YAChF,MAAM,oBAAoB,GAAG,QAAQ,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAA;YACvE,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAoB,CAAA;YACtC,OAAO;gBACL,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,MAAM;gBACd,cAAc,EAAE,MAAM;gBACtB,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE,OAAO;gBAChB,UAAU,EAAE,kDAAkD;gBAC9D,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS;gBAC3D,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;gBAC/B,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;gBAC/C,MAAM,EAAE,SAAS;aAClB,CAAA;QACH,CAAC,CAAA;QAED,MAAM,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC,gBAAgB,EAAE,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAA;QAEjH,WAAW,CAAC,OAAsB,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAE1E,OAAO,gBAAC,SAAS,OAAK,KAAK,IAAG,QAAQ,CAAa,CAAA;IACrD,CAAC;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"app-bar-link.js","sourceRoot":"","sources":["../../src/components/app-bar-link.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,KAAK,EAAqB,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAEpE,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAqD;IAClF,aAAa,EAAE,oBAAoB;IACnC,GAAG,EAAE;QACH,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,MAAM;QACd,cAAc,EAAE,MAAM;QACtB,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,kDAAkD;QAC9D,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,SAAS;QACtC,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE;YACV,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO;YACpC,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,UAAU;SACtB;KACF;IACD,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QAChE,MAAM,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC,gBAAgB,EAAE,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAA;QAEjH,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAc,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,CAAA;QAChF,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAE5C,OAAO,gBAAC,SAAS,OAAK,KAAK,IAAG,QAAQ,CAAa,CAAA;IACrD,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=app-bar-link.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-bar-link.spec.d.ts","sourceRoot":"","sources":["../../src/components/app-bar-link.spec.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,252 @@
1
+ import { Injector } from '@furystack/inject';
2
+ import { createComponent, initializeShadeRoot, LocationService } from '@furystack/shades';
3
+ import { sleepAsync, usingAsync } from '@furystack/utils';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { AppBarLink } from './app-bar-link.js';
6
+ describe('AppBarLink component', () => {
7
+ beforeEach(() => {
8
+ document.body.innerHTML = '<div id="root"></div>';
9
+ });
10
+ afterEach(() => {
11
+ document.body.innerHTML = '';
12
+ });
13
+ describe('rendering', () => {
14
+ it('should render the shade-app-bar-link custom element', async () => {
15
+ await usingAsync(new Injector(), async (injector) => {
16
+ const rootElement = document.getElementById('root');
17
+ initializeShadeRoot({
18
+ injector,
19
+ rootElement,
20
+ jsxElement: createComponent(AppBarLink, { href: "/test" }, "Link"),
21
+ });
22
+ await sleepAsync(50);
23
+ const appBarLink = document.querySelector('shade-app-bar-link');
24
+ expect(appBarLink).not.toBeNull();
25
+ expect(appBarLink?.tagName.toLowerCase()).toBe('shade-app-bar-link');
26
+ });
27
+ });
28
+ it('should render children through RouteLink', async () => {
29
+ await usingAsync(new Injector(), async (injector) => {
30
+ const rootElement = document.getElementById('root');
31
+ initializeShadeRoot({
32
+ injector,
33
+ rootElement,
34
+ jsxElement: createComponent(AppBarLink, { href: "/test" }, "Test Link Text"),
35
+ });
36
+ await sleepAsync(50);
37
+ expect(document.body.innerHTML).toContain('Test Link Text');
38
+ });
39
+ });
40
+ it('should render RouteLink with correct href', async () => {
41
+ await usingAsync(new Injector(), async (injector) => {
42
+ const rootElement = document.getElementById('root');
43
+ initializeShadeRoot({
44
+ injector,
45
+ rootElement,
46
+ jsxElement: createComponent(AppBarLink, { href: "/my-route" }, "Link"),
47
+ });
48
+ await sleepAsync(50);
49
+ expect(document.body.innerHTML).toContain('href="/my-route"');
50
+ });
51
+ });
52
+ });
53
+ describe('route matching', () => {
54
+ it('should have active class when current URL matches href', async () => {
55
+ await usingAsync(new Injector(), async (injector) => {
56
+ history.pushState(null, '', '/dashboard');
57
+ const rootElement = document.getElementById('root');
58
+ initializeShadeRoot({
59
+ injector,
60
+ rootElement,
61
+ jsxElement: createComponent(AppBarLink, { href: "/dashboard" }, "Dashboard"),
62
+ });
63
+ await sleepAsync(50);
64
+ const appBarLink = document.querySelector('shade-app-bar-link');
65
+ expect(appBarLink?.classList.contains('active')).toBe(true);
66
+ });
67
+ });
68
+ it('should not have active class when current URL does not match href', async () => {
69
+ await usingAsync(new Injector(), async (injector) => {
70
+ history.pushState(null, '', '/other-page');
71
+ const rootElement = document.getElementById('root');
72
+ initializeShadeRoot({
73
+ injector,
74
+ rootElement,
75
+ jsxElement: createComponent(AppBarLink, { href: "/dashboard" }, "Dashboard"),
76
+ });
77
+ await sleepAsync(50);
78
+ const appBarLink = document.querySelector('shade-app-bar-link');
79
+ expect(appBarLink?.classList.contains('active')).toBe(false);
80
+ });
81
+ });
82
+ it('should update active class when location changes', async () => {
83
+ await usingAsync(new Injector(), async (injector) => {
84
+ history.pushState(null, '', '/home');
85
+ const rootElement = document.getElementById('root');
86
+ initializeShadeRoot({
87
+ injector,
88
+ rootElement,
89
+ jsxElement: createComponent(AppBarLink, { href: "/dashboard" }, "Dashboard"),
90
+ });
91
+ await sleepAsync(50);
92
+ const appBarLink = document.querySelector('shade-app-bar-link');
93
+ expect(appBarLink?.classList.contains('active')).toBe(false);
94
+ // Navigate to matching route
95
+ history.pushState(null, '', '/dashboard');
96
+ injector.getInstance(LocationService).updateState();
97
+ await sleepAsync(50);
98
+ expect(appBarLink?.classList.contains('active')).toBe(true);
99
+ });
100
+ });
101
+ it('should remove active class when navigating away', async () => {
102
+ await usingAsync(new Injector(), async (injector) => {
103
+ history.pushState(null, '', '/dashboard');
104
+ const rootElement = document.getElementById('root');
105
+ initializeShadeRoot({
106
+ injector,
107
+ rootElement,
108
+ jsxElement: createComponent(AppBarLink, { href: "/dashboard" }, "Dashboard"),
109
+ });
110
+ await sleepAsync(50);
111
+ const appBarLink = document.querySelector('shade-app-bar-link');
112
+ expect(appBarLink?.classList.contains('active')).toBe(true);
113
+ // Navigate away
114
+ history.pushState(null, '', '/other');
115
+ injector.getInstance(LocationService).updateState();
116
+ await sleepAsync(50);
117
+ expect(appBarLink?.classList.contains('active')).toBe(false);
118
+ });
119
+ });
120
+ it('should match routes with parameters', async () => {
121
+ await usingAsync(new Injector(), async (injector) => {
122
+ history.pushState(null, '', '/users/123');
123
+ const rootElement = document.getElementById('root');
124
+ initializeShadeRoot({
125
+ injector,
126
+ rootElement,
127
+ jsxElement: createComponent(AppBarLink, { href: "/users/:id" }, "Users"),
128
+ });
129
+ await sleepAsync(50);
130
+ const appBarLink = document.querySelector('shade-app-bar-link');
131
+ expect(appBarLink?.classList.contains('active')).toBe(true);
132
+ });
133
+ });
134
+ it('should support routingOptions with end: false for prefix matching', async () => {
135
+ await usingAsync(new Injector(), async (injector) => {
136
+ history.pushState(null, '', '/admin/settings/security');
137
+ const rootElement = document.getElementById('root');
138
+ initializeShadeRoot({
139
+ injector,
140
+ rootElement,
141
+ jsxElement: (createComponent(AppBarLink, { href: "/admin", routingOptions: { end: false } }, "Admin")),
142
+ });
143
+ await sleepAsync(50);
144
+ const appBarLink = document.querySelector('shade-app-bar-link');
145
+ expect(appBarLink?.classList.contains('active')).toBe(true);
146
+ });
147
+ });
148
+ it('should not match prefix by default (end: true)', async () => {
149
+ await usingAsync(new Injector(), async (injector) => {
150
+ history.pushState(null, '', '/admin/settings');
151
+ const rootElement = document.getElementById('root');
152
+ initializeShadeRoot({
153
+ injector,
154
+ rootElement,
155
+ jsxElement: createComponent(AppBarLink, { href: "/admin" }, "Admin"),
156
+ });
157
+ await sleepAsync(50);
158
+ const appBarLink = document.querySelector('shade-app-bar-link');
159
+ expect(appBarLink?.classList.contains('active')).toBe(false);
160
+ });
161
+ });
162
+ });
163
+ describe('multiple links', () => {
164
+ it('should only activate the matching link', async () => {
165
+ await usingAsync(new Injector(), async (injector) => {
166
+ history.pushState(null, '', '/settings');
167
+ const rootElement = document.getElementById('root');
168
+ initializeShadeRoot({
169
+ injector,
170
+ rootElement,
171
+ jsxElement: (createComponent("div", null,
172
+ createComponent(AppBarLink, { href: "/home" }, "Home"),
173
+ createComponent(AppBarLink, { href: "/settings" }, "Settings"),
174
+ createComponent(AppBarLink, { href: "/about" }, "About"))),
175
+ });
176
+ await sleepAsync(50);
177
+ const links = document.querySelectorAll('shade-app-bar-link');
178
+ expect(links[0]?.classList.contains('active')).toBe(false);
179
+ expect(links[1]?.classList.contains('active')).toBe(true);
180
+ expect(links[2]?.classList.contains('active')).toBe(false);
181
+ });
182
+ });
183
+ it('should update all links when location changes', async () => {
184
+ await usingAsync(new Injector(), async (injector) => {
185
+ history.pushState(null, '', '/home');
186
+ const rootElement = document.getElementById('root');
187
+ initializeShadeRoot({
188
+ injector,
189
+ rootElement,
190
+ jsxElement: (createComponent("div", null,
191
+ createComponent(AppBarLink, { href: "/home" }, "Home"),
192
+ createComponent(AppBarLink, { href: "/settings" }, "Settings"))),
193
+ });
194
+ await sleepAsync(50);
195
+ const links = document.querySelectorAll('shade-app-bar-link');
196
+ expect(links[0]?.classList.contains('active')).toBe(true);
197
+ expect(links[1]?.classList.contains('active')).toBe(false);
198
+ // Navigate to settings
199
+ history.pushState(null, '', '/settings');
200
+ injector.getInstance(LocationService).updateState();
201
+ await sleepAsync(50);
202
+ expect(links[0]?.classList.contains('active')).toBe(false);
203
+ expect(links[1]?.classList.contains('active')).toBe(true);
204
+ });
205
+ });
206
+ });
207
+ describe('styling', () => {
208
+ it('should have flex display', async () => {
209
+ await usingAsync(new Injector(), async (injector) => {
210
+ const rootElement = document.getElementById('root');
211
+ initializeShadeRoot({
212
+ injector,
213
+ rootElement,
214
+ jsxElement: createComponent(AppBarLink, { href: "/test" }, "Link"),
215
+ });
216
+ await sleepAsync(50);
217
+ const appBarLink = document.querySelector('shade-app-bar-link');
218
+ const computedStyle = window.getComputedStyle(appBarLink);
219
+ expect(computedStyle.display).toBe('flex');
220
+ });
221
+ });
222
+ it('should have pointer cursor', async () => {
223
+ await usingAsync(new Injector(), async (injector) => {
224
+ const rootElement = document.getElementById('root');
225
+ initializeShadeRoot({
226
+ injector,
227
+ rootElement,
228
+ jsxElement: createComponent(AppBarLink, { href: "/test" }, "Link"),
229
+ });
230
+ await sleepAsync(50);
231
+ const appBarLink = document.querySelector('shade-app-bar-link');
232
+ const computedStyle = window.getComputedStyle(appBarLink);
233
+ expect(computedStyle.cursor).toBe('pointer');
234
+ });
235
+ });
236
+ it('should have transition for animations', async () => {
237
+ await usingAsync(new Injector(), async (injector) => {
238
+ const rootElement = document.getElementById('root');
239
+ initializeShadeRoot({
240
+ injector,
241
+ rootElement,
242
+ jsxElement: createComponent(AppBarLink, { href: "/test" }, "Link"),
243
+ });
244
+ await sleepAsync(50);
245
+ const appBarLink = document.querySelector('shade-app-bar-link');
246
+ const computedStyle = window.getComputedStyle(appBarLink);
247
+ expect(computedStyle.transition).toContain('color');
248
+ });
249
+ });
250
+ });
251
+ });
252
+ //# sourceMappingURL=app-bar-link.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-bar-link.spec.js","sourceRoot":"","sources":["../../src/components/app-bar-link.spec.tsx"],"names":[],"mappings":"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"}