@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
@@ -39,7 +39,7 @@ export const NotyComponent = Shade<{ model: NotyModel; onDismiss: () => void }>(
39
39
  )
40
40
  })
41
41
  },
42
- style: {
42
+ css: {
43
43
  margin: '8px',
44
44
  overflow: 'hidden',
45
45
  borderRadius: '12px',
@@ -50,6 +50,39 @@ export const NotyComponent = Shade<{ model: NotyModel; onDismiss: () => void }>(
50
50
  height: '0px',
51
51
  border: '1px solid rgba(0, 0, 0, 0.1)',
52
52
  backdropFilter: 'blur(10px)',
53
+ '& .noty-header': {
54
+ display: 'flex',
55
+ justifyContent: 'space-between',
56
+ alignItems: 'center',
57
+ padding: '12px 12px 12px 20px',
58
+ borderBottom: '1px solid rgba(0, 0, 0, 0.1)',
59
+ },
60
+ '& .noty-title': {
61
+ whiteSpace: 'nowrap',
62
+ overflow: 'hidden',
63
+ textOverflow: 'ellipsis',
64
+ margin: '0',
65
+ fontSize: '0.95em',
66
+ fontWeight: '600',
67
+ letterSpacing: '0.01em',
68
+ },
69
+ '& .dismiss-button': {
70
+ margin: '0',
71
+ padding: '4px 8px',
72
+ fontSize: '16px',
73
+ minWidth: '28px',
74
+ opacity: '0.8',
75
+ transition: 'opacity 0.2s ease',
76
+ },
77
+ '& .dismiss-button:hover': {
78
+ opacity: '1',
79
+ },
80
+ '& .noty-body': {
81
+ padding: '16px 20px 18px 20px',
82
+ fontSize: '0.9em',
83
+ lineHeight: '1.5',
84
+ fontWeight: '400',
85
+ },
53
86
  },
54
87
  render: ({ props, injector, element }) => {
55
88
  const themeProvider = injector.getInstance(ThemeProviderService)
@@ -84,47 +117,12 @@ export const NotyComponent = Shade<{ model: NotyModel; onDismiss: () => void }>(
84
117
 
85
118
  return (
86
119
  <>
87
- <div
88
- style={{
89
- display: 'flex',
90
- justifyContent: 'space-between',
91
- alignItems: 'center',
92
- padding: '12px 12px 12px 20px',
93
- backgroundColor: colors.dark,
94
- color: headerTextColor,
95
- borderBottom: '1px solid rgba(0, 0, 0, 0.1)',
96
- }}
97
- >
98
- <h5
99
- style={{
100
- whiteSpace: 'nowrap',
101
- overflow: 'hidden',
102
- textOverflow: 'ellipsis',
103
- margin: '0',
104
- fontSize: '0.95em',
105
- fontWeight: '600',
106
- letterSpacing: '0.01em',
107
- }}
108
- title={props.model.title}
109
- >
120
+ <div className="noty-header" style={{ backgroundColor: colors.dark, color: headerTextColor }}>
121
+ <h5 className="noty-title" title={props.model.title}>
110
122
  {props.model.title}
111
123
  </h5>
112
124
  <Button
113
- style={{
114
- margin: '0',
115
- padding: '4px 8px',
116
- fontSize: '16px',
117
- minWidth: '28px',
118
- opacity: '0.8',
119
- transition: 'opacity 0.2s ease',
120
- }}
121
- className="dismissNoty"
122
- onmouseenter={(e: MouseEvent) => {
123
- ;(e.currentTarget as HTMLElement).style.opacity = '1'
124
- }}
125
- onmouseleave={(e: MouseEvent) => {
126
- ;(e.currentTarget as HTMLElement).style.opacity = '0.8'
127
- }}
125
+ className="dismiss-button"
128
126
  onclick={removeSelf}
129
127
  title="Close Notification"
130
128
  variant="contained"
@@ -133,16 +131,7 @@ export const NotyComponent = Shade<{ model: NotyModel; onDismiss: () => void }>(
133
131
 
134
132
  </Button>
135
133
  </div>
136
- <div
137
- style={{
138
- padding: '16px 20px 18px 20px',
139
- fontSize: '0.9em',
140
- lineHeight: '1.5',
141
- fontWeight: '400',
142
- }}
143
- >
144
- {props.model.body}
145
- </div>
134
+ <div className="noty-body">{props.model.body}</div>
146
135
  </>
147
136
  )
148
137
  },
@@ -150,7 +139,7 @@ export const NotyComponent = Shade<{ model: NotyModel; onDismiss: () => void }>(
150
139
 
151
140
  export const NotyList = Shade({
152
141
  shadowDomName: 'shade-noty-list',
153
- style: {
142
+ css: {
154
143
  position: 'fixed',
155
144
  bottom: '1em',
156
145
  right: '1em',
@@ -0,0 +1,72 @@
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 } from 'vitest'
5
+ import { Paper } from './paper.js'
6
+
7
+ describe('Paper', () => {
8
+ beforeEach(() => {
9
+ document.body.innerHTML = '<div id="root"></div>'
10
+ })
11
+
12
+ afterEach(() => {
13
+ document.body.innerHTML = ''
14
+ })
15
+
16
+ const renderPaper = async (props: Parameters<typeof Paper>[0] = {}, children?: JSX.Element[]) => {
17
+ const injector = new Injector()
18
+ const root = document.getElementById('root')!
19
+ initializeShadeRoot({
20
+ injector,
21
+ rootElement: root,
22
+ jsxElement: <Paper {...props}>{children}</Paper>,
23
+ })
24
+ await sleepAsync(50)
25
+ return {
26
+ injector,
27
+ paper: root.querySelector('div[is="shade-paper"]') as HTMLDivElement,
28
+ }
29
+ }
30
+
31
+ describe('rendering', () => {
32
+ it('should render a div element', async () => {
33
+ const { paper } = await renderPaper()
34
+ expect(paper).toBeTruthy()
35
+ expect(paper.tagName.toLowerCase()).toBe('div')
36
+ expect(paper.getAttribute('is')).toBe('shade-paper')
37
+ })
38
+
39
+ it('should render children', async () => {
40
+ const { paper } = await renderPaper({}, [<span>Child content</span>])
41
+ expect(paper.textContent).toContain('Child content')
42
+ })
43
+
44
+ it('should render multiple children', async () => {
45
+ const { paper } = await renderPaper({}, [<span>First</span>, <span>Second</span>])
46
+ expect(paper.textContent).toContain('First')
47
+ expect(paper.textContent).toContain('Second')
48
+ })
49
+ })
50
+
51
+ describe('elevation', () => {
52
+ it('should have data-elevation="1" by default', async () => {
53
+ const { paper } = await renderPaper()
54
+ expect(paper.getAttribute('data-elevation')).toBe('1')
55
+ })
56
+
57
+ it('should set data-elevation="1" for elevation 1', async () => {
58
+ const { paper } = await renderPaper({ elevation: 1 })
59
+ expect(paper.getAttribute('data-elevation')).toBe('1')
60
+ })
61
+
62
+ it('should set data-elevation="2" for elevation 2', async () => {
63
+ const { paper } = await renderPaper({ elevation: 2 })
64
+ expect(paper.getAttribute('data-elevation')).toBe('2')
65
+ })
66
+
67
+ it('should set data-elevation="3" for elevation 3', async () => {
68
+ const { paper } = await renderPaper({ elevation: 3 })
69
+ expect(paper.getAttribute('data-elevation')).toBe('3')
70
+ })
71
+ })
72
+ })
@@ -1,27 +1,29 @@
1
- import { attachStyles } from '@furystack/shades'
2
1
  import { Shade, createComponent } from '@furystack/shades'
3
- import { ThemeProviderService } from '../services/theme-provider-service.js'
2
+ import { cssVariableTheme } from '../services/css-variable-theme.js'
4
3
 
5
4
  export const Paper = Shade<{ elevation?: 1 | 2 | 3 }>({
6
5
  shadowDomName: 'shade-paper',
7
6
  elementBase: HTMLDivElement,
8
7
  elementBaseName: 'div',
9
- style: {
8
+ css: {
10
9
  borderRadius: '3px',
11
10
  margin: '8px',
12
11
  padding: '6px 16px',
12
+ backgroundColor: cssVariableTheme.background.paper,
13
+ color: cssVariableTheme.text.secondary,
14
+ '&[data-elevation="1"]': {
15
+ boxShadow: '1px 1px 1px rgba(0,0,0,0.3)',
16
+ },
17
+ '&[data-elevation="2"]': {
18
+ boxShadow: '1px 2px 2px rgba(0,0,0,0.3)',
19
+ },
20
+ '&[data-elevation="3"]': {
21
+ boxShadow: '1px 3px 3px rgba(0,0,0,0.3)',
22
+ },
13
23
  },
14
- render: ({ injector, props, children, element }) => {
15
- const themeProvider = injector.getInstance(ThemeProviderService)
24
+ render: ({ props, children, element }) => {
16
25
  const { elevation = 1 } = props
17
-
18
- attachStyles(element, {
19
- style: {
20
- boxShadow: elevation ? `1px ${elevation}px ${elevation}px rgba(0,0,0,0.3)` : '',
21
- backgroundColor: themeProvider.theme.background.paper,
22
- color: themeProvider.theme.text.secondary,
23
- },
24
- })
26
+ element.setAttribute('data-elevation', elevation.toString())
25
27
 
26
28
  return <>{children}</>
27
29
  },
@@ -0,0 +1,219 @@
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 { Skeleton } from './skeleton.js'
6
+
7
+ describe('Skeleton', () => {
8
+ let originalAnimate: typeof Element.prototype.animate
9
+ let animateCalls: Array<{ keyframes: unknown; options: unknown }>
10
+
11
+ beforeEach(() => {
12
+ document.body.innerHTML = '<div id="root"></div>'
13
+ animateCalls = []
14
+ originalAnimate = Element.prototype.animate
15
+
16
+ Element.prototype.animate = vi.fn(
17
+ (keyframes: Keyframe[] | PropertyIndexedKeyframes | null, options?: number | KeyframeAnimationOptions) => {
18
+ animateCalls.push({ keyframes, options })
19
+ const mockAnimation = {
20
+ onfinish: null as ((event: AnimationPlaybackEvent) => void) | null,
21
+ oncancel: null as ((event: AnimationPlaybackEvent) => void) | null,
22
+ cancel: vi.fn(),
23
+ play: vi.fn(),
24
+ pause: vi.fn(),
25
+ finish: vi.fn(),
26
+ addEventListener: vi.fn(),
27
+ removeEventListener: vi.fn(),
28
+ }
29
+
30
+ if (Array.isArray(keyframes) && keyframes.some((kf: Keyframe) => 'opacity' in kf)) {
31
+ setTimeout(() => {
32
+ if (mockAnimation.onfinish) {
33
+ mockAnimation.onfinish({} as AnimationPlaybackEvent)
34
+ }
35
+ }, 10)
36
+ }
37
+
38
+ return mockAnimation as unknown as Animation
39
+ },
40
+ ) as typeof Element.prototype.animate
41
+ })
42
+
43
+ afterEach(() => {
44
+ document.body.innerHTML = ''
45
+ Element.prototype.animate = originalAnimate
46
+ vi.restoreAllMocks()
47
+ })
48
+
49
+ it('should render with shadow DOM', async () => {
50
+ const injector = new Injector()
51
+ const rootElement = document.getElementById('root') as HTMLDivElement
52
+
53
+ initializeShadeRoot({
54
+ injector,
55
+ rootElement,
56
+ jsxElement: <Skeleton />,
57
+ })
58
+
59
+ await sleepAsync(50)
60
+
61
+ const skeleton = document.querySelector('shade-skeleton')
62
+ expect(skeleton).not.toBeNull()
63
+ })
64
+
65
+ it('should have initial opacity of 0', async () => {
66
+ const injector = new Injector()
67
+ const rootElement = document.getElementById('root') as HTMLDivElement
68
+
69
+ initializeShadeRoot({
70
+ injector,
71
+ rootElement,
72
+ jsxElement: <Skeleton />,
73
+ })
74
+
75
+ await sleepAsync(50)
76
+
77
+ const skeleton = document.querySelector('shade-skeleton') as HTMLElement
78
+ expect(skeleton).not.toBeNull()
79
+
80
+ const computedStyle = window.getComputedStyle(skeleton)
81
+ expect(computedStyle.opacity).toBe('0')
82
+ })
83
+
84
+ it('should use default delay of 1500ms', async () => {
85
+ const injector = new Injector()
86
+ const rootElement = document.getElementById('root') as HTMLDivElement
87
+
88
+ initializeShadeRoot({
89
+ injector,
90
+ rootElement,
91
+ jsxElement: <Skeleton />,
92
+ })
93
+
94
+ await sleepAsync(50)
95
+
96
+ const fadeInCall = animateCalls.find(
97
+ (call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'opacity' in kf),
98
+ )
99
+
100
+ expect(fadeInCall).toBeDefined()
101
+ expect((fadeInCall?.options as KeyframeAnimationOptions)?.delay).toBe(1500)
102
+ })
103
+
104
+ it('should use custom delay when provided', async () => {
105
+ const injector = new Injector()
106
+ const rootElement = document.getElementById('root') as HTMLDivElement
107
+
108
+ initializeShadeRoot({
109
+ injector,
110
+ rootElement,
111
+ jsxElement: <Skeleton delay={500} />,
112
+ })
113
+
114
+ await sleepAsync(50)
115
+
116
+ const fadeInCall = animateCalls.find(
117
+ (call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'opacity' in kf),
118
+ )
119
+
120
+ expect(fadeInCall).toBeDefined()
121
+ expect((fadeInCall?.options as KeyframeAnimationOptions)?.delay).toBe(500)
122
+ })
123
+
124
+ it('should have correct css styles applied', async () => {
125
+ const injector = new Injector()
126
+ const rootElement = document.getElementById('root') as HTMLDivElement
127
+
128
+ initializeShadeRoot({
129
+ injector,
130
+ rootElement,
131
+ jsxElement: <Skeleton />,
132
+ })
133
+
134
+ await sleepAsync(50)
135
+
136
+ const skeleton = document.querySelector('shade-skeleton') as HTMLElement
137
+ expect(skeleton).not.toBeNull()
138
+
139
+ const computedStyle = window.getComputedStyle(skeleton)
140
+ expect(computedStyle.display).toBe('inline-block')
141
+ })
142
+
143
+ it('should start fade-in animation with correct parameters', async () => {
144
+ const injector = new Injector()
145
+ const rootElement = document.getElementById('root') as HTMLDivElement
146
+
147
+ initializeShadeRoot({
148
+ injector,
149
+ rootElement,
150
+ jsxElement: <Skeleton delay={100} />,
151
+ })
152
+
153
+ await sleepAsync(50)
154
+
155
+ const fadeInCall = animateCalls.find(
156
+ (call) =>
157
+ Array.isArray(call.keyframes) &&
158
+ call.keyframes.length === 2 &&
159
+ (call.keyframes[0] as Keyframe).opacity === 0 &&
160
+ (call.keyframes[1] as Keyframe).opacity === 1,
161
+ )
162
+
163
+ expect(fadeInCall).toBeDefined()
164
+
165
+ const options = fadeInCall?.options as KeyframeAnimationOptions
166
+ expect(options.fill).toBe('forwards')
167
+ expect(options.duration).toBe(300)
168
+ expect(options.easing).toBe('ease-out')
169
+ expect(options.delay).toBe(100)
170
+ })
171
+
172
+ it('should start background animation after fade-in completes', async () => {
173
+ const injector = new Injector()
174
+ const rootElement = document.getElementById('root') as HTMLDivElement
175
+
176
+ initializeShadeRoot({
177
+ injector,
178
+ rootElement,
179
+ jsxElement: <Skeleton delay={0} />,
180
+ })
181
+
182
+ await sleepAsync(100)
183
+
184
+ const backgroundAnimation = animateCalls.find(
185
+ (call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'backgroundPosition' in kf),
186
+ )
187
+
188
+ expect(backgroundAnimation).toBeDefined()
189
+
190
+ const options = backgroundAnimation?.options as KeyframeAnimationOptions
191
+ expect(options.duration).toBe(10000)
192
+ expect(options.iterations).toBe(Infinity)
193
+ })
194
+
195
+ it('should have gradient background animation keyframes', async () => {
196
+ const injector = new Injector()
197
+ const rootElement = document.getElementById('root') as HTMLDivElement
198
+
199
+ initializeShadeRoot({
200
+ injector,
201
+ rootElement,
202
+ jsxElement: <Skeleton delay={0} />,
203
+ })
204
+
205
+ await sleepAsync(100)
206
+
207
+ const backgroundAnimation = animateCalls.find(
208
+ (call) => Array.isArray(call.keyframes) && call.keyframes.some((kf: Keyframe) => 'backgroundPosition' in kf),
209
+ )
210
+
211
+ expect(backgroundAnimation).toBeDefined()
212
+
213
+ const keyframes = backgroundAnimation?.keyframes as Keyframe[]
214
+ expect(keyframes).toHaveLength(3)
215
+ expect(keyframes[0].backgroundPosition).toBe('0% 50%')
216
+ expect(keyframes[1].backgroundPosition).toBe('100% 50%')
217
+ expect(keyframes[2].backgroundPosition).toBe('0% 50%')
218
+ })
219
+ })
@@ -10,7 +10,7 @@ export type SkeletonProps = {
10
10
 
11
11
  export const Skeleton = Shade<SkeletonProps>({
12
12
  shadowDomName: 'shade-skeleton',
13
- style: {
13
+ css: {
14
14
  opacity: '0',
15
15
  display: 'inline-block',
16
16
  background: 'linear-gradient(-45deg, rgba(128,128,128,0.1), rgba(128,128,128,0.3), rgba(128,128,128,0.1))',
@@ -0,0 +1,70 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { colors, styles } from './styles.js'
3
+
4
+ describe('styles', () => {
5
+ describe('colors', () => {
6
+ describe('primary', () => {
7
+ it('should have light color', () => {
8
+ expect(colors.primary.light).toBe('#82e9de')
9
+ })
10
+
11
+ it('should have main color', () => {
12
+ expect(colors.primary.main).toBe('#4db6ac')
13
+ })
14
+
15
+ it('should have dark color', () => {
16
+ expect(colors.primary.dark).toBe('#00867d')
17
+ })
18
+
19
+ it('should have contrastText color', () => {
20
+ expect(colors.primary.contrastText).toBe('#000')
21
+ })
22
+ })
23
+
24
+ describe('secondary', () => {
25
+ it('should have light color', () => {
26
+ expect(colors.secondary.light).toBe('#62727b')
27
+ })
28
+
29
+ it('should have main color', () => {
30
+ expect(colors.secondary.main).toBe('#37474f')
31
+ })
32
+
33
+ it('should have dark color', () => {
34
+ expect(colors.secondary.dark).toBe('#102027')
35
+ })
36
+
37
+ it('should have contrastText color', () => {
38
+ expect(colors.secondary.contrastText).toBe('#fff')
39
+ })
40
+ })
41
+
42
+ describe('error', () => {
43
+ it('should have main color', () => {
44
+ expect(colors.error.main).toBe('red')
45
+ })
46
+ })
47
+ })
48
+
49
+ describe('styles', () => {
50
+ describe('glassBox', () => {
51
+ it('should have backdropFilter', () => {
52
+ expect(styles.glassBox.backdropFilter).toBe('blur(4px)')
53
+ })
54
+
55
+ it('should have borderRadius', () => {
56
+ expect(styles.glassBox.borderRadius).toBe('5px')
57
+ })
58
+
59
+ it('should have border', () => {
60
+ expect(styles.glassBox.border).toBe('1px solid rgba(128,128,128,.3)')
61
+ })
62
+
63
+ it('should have boxShadow', () => {
64
+ expect(styles.glassBox.boxShadow).toBe(
65
+ 'rgba(0, 0, 0, 0.3) 2px 2px 2px, 1px 1px 3px -2px rgba(255,255,255,0.3) inset',
66
+ )
67
+ })
68
+ })
69
+ })
70
+ })