@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
@@ -1,218 +1,183 @@
1
1
  import type { PartialElement } from '@furystack/shades'
2
- import { Shade, attachProps, createComponent } from '@furystack/shades'
3
- import type { Palette, Theme } from '../services/theme-provider-service.js'
4
- import { ThemeProviderService } from '../services/theme-provider-service.js'
5
- import { promisifyAnimation } from '../utils/promisify-animation.js'
2
+ import { Shade, createComponent } from '@furystack/shades'
3
+ import type { Palette } from '../services/theme-provider-service.js'
4
+ import { cssVariableTheme } from '../services/css-variable-theme.js'
6
5
 
7
6
  export type ButtonProps = PartialElement<HTMLButtonElement> & {
8
7
  variant?: 'contained' | 'outlined'
9
8
  color?: keyof Palette
10
9
  }
11
10
 
12
- const getBackground = (buttonProps: ButtonProps, theme: Theme) =>
13
- buttonProps.variant === 'contained'
14
- ? buttonProps.color
15
- ? buttonProps.disabled
16
- ? theme.palette[buttonProps.color].dark
17
- : theme.palette[buttonProps.color].main
18
- : buttonProps.disabled
19
- ? theme.button.disabledBackground
20
- : theme.text.primary
21
- : 'rgba(0,0,0,0)'
22
-
23
- const getHoveredBackground = (buttonProps: ButtonProps, theme: Theme, fallback: () => string) =>
24
- buttonProps.variant === 'contained'
25
- ? buttonProps.color
26
- ? theme.palette[buttonProps.color].dark
27
- : buttonProps.disabled
28
- ? theme.button.disabledBackground
29
- : theme.text.secondary
30
- : fallback()
31
-
32
- const getBoxShadow = (buttonProps: ButtonProps, theme: Theme) =>
33
- buttonProps.variant === 'outlined'
34
- ? buttonProps.color
35
- ? `0px 0px 0px 1px ${
36
- buttonProps.disabled ? theme.palette[buttonProps.color].dark : theme.palette[buttonProps.color].main
37
- }`
38
- : `0px 0px 0px 1px ${buttonProps.disabled ? theme.button.disabledBackground : theme.text.secondary}`
39
- : 'none'
40
-
41
- const getHoveredBoxShadow = (buttonProps: ButtonProps, theme: Theme) =>
42
- buttonProps.variant === 'outlined'
43
- ? buttonProps.color
44
- ? `0px 0px 0px 1px ${
45
- buttonProps.disabled ? theme.button.disabledBackground : theme.palette[buttonProps.color].light
46
- }`
47
- : `0px 0px 0px 1px ${buttonProps.disabled ? theme.button.disabledBackground : theme.text.primary}`
48
- : 'none'
49
-
50
- const getTextColor = (buttonProps: ButtonProps, theme: Theme, fallback: () => string) =>
51
- buttonProps.variant !== 'contained'
52
- ? buttonProps.color
53
- ? buttonProps.disabled
54
- ? theme.palette[buttonProps.color].dark
55
- : theme.palette[buttonProps.color].main
56
- : theme.text.secondary
57
- : fallback()
58
-
59
- const getHoveredTextColor = (buttonProps: ButtonProps, theme: Theme, fallback: () => string) =>
60
- buttonProps.variant !== 'contained'
61
- ? buttonProps.color
62
- ? buttonProps.disabled
63
- ? theme.palette[buttonProps.color].dark
64
- : theme.palette[buttonProps.color].light
65
- : theme.text.primary
66
- : fallback()
11
+ // Color mappings for each palette color
12
+ const colorMap: Record<
13
+ keyof Palette,
14
+ { main: string; mainContrast: string; light: string; dark: string; darkContrast: string }
15
+ > = {
16
+ primary: {
17
+ main: cssVariableTheme.palette.primary.main,
18
+ mainContrast: cssVariableTheme.palette.primary.mainContrast,
19
+ light: cssVariableTheme.palette.primary.light,
20
+ dark: cssVariableTheme.palette.primary.dark,
21
+ darkContrast: cssVariableTheme.palette.primary.darkContrast,
22
+ },
23
+ secondary: {
24
+ main: cssVariableTheme.palette.secondary.main,
25
+ mainContrast: cssVariableTheme.palette.secondary.mainContrast,
26
+ light: cssVariableTheme.palette.secondary.light,
27
+ dark: cssVariableTheme.palette.secondary.dark,
28
+ darkContrast: cssVariableTheme.palette.secondary.darkContrast,
29
+ },
30
+ error: {
31
+ main: cssVariableTheme.palette.error.main,
32
+ mainContrast: cssVariableTheme.palette.error.mainContrast,
33
+ light: cssVariableTheme.palette.error.light,
34
+ dark: cssVariableTheme.palette.error.dark,
35
+ darkContrast: cssVariableTheme.palette.error.darkContrast,
36
+ },
37
+ warning: {
38
+ main: cssVariableTheme.palette.warning.main,
39
+ mainContrast: cssVariableTheme.palette.warning.mainContrast,
40
+ light: cssVariableTheme.palette.warning.light,
41
+ dark: cssVariableTheme.palette.warning.dark,
42
+ darkContrast: cssVariableTheme.palette.warning.darkContrast,
43
+ },
44
+ success: {
45
+ main: cssVariableTheme.palette.success.main,
46
+ mainContrast: cssVariableTheme.palette.success.mainContrast,
47
+ light: cssVariableTheme.palette.success.light,
48
+ dark: cssVariableTheme.palette.success.dark,
49
+ darkContrast: cssVariableTheme.palette.success.darkContrast,
50
+ },
51
+ info: {
52
+ main: cssVariableTheme.palette.info.main,
53
+ mainContrast: cssVariableTheme.palette.info.mainContrast,
54
+ light: cssVariableTheme.palette.info.light,
55
+ dark: cssVariableTheme.palette.info.dark,
56
+ darkContrast: cssVariableTheme.palette.info.darkContrast,
57
+ },
58
+ }
59
+
60
+ // Default colors when no color prop is specified
61
+ const defaultColors = {
62
+ main: cssVariableTheme.text.secondary,
63
+ mainContrast: cssVariableTheme.background.default,
64
+ light: cssVariableTheme.text.primary,
65
+ dark: cssVariableTheme.button.disabledBackground,
66
+ darkContrast: cssVariableTheme.text.primary,
67
+ }
67
68
 
68
69
  export const Button = Shade<ButtonProps>({
69
70
  shadowDomName: 'shade-button',
70
71
  elementBase: HTMLButtonElement,
71
72
  elementBaseName: 'button',
72
- constructed: ({ element }) => {
73
- /**
74
- * @param this The Document instance
75
- * @param ev The Mouse event
76
- */
77
- function mouseUp(this: Document, ev: MouseEvent) {
78
- if (ev.target === element) {
79
- void promisifyAnimation(
80
- element,
81
- [
82
- {
83
- transform: 'scale(1)',
84
- },
85
- ],
86
- { duration: 150, fill: 'forwards', easing: 'cubic-bezier(0.230, 1.000, 0.320, 1.000)' },
87
- )
88
- }
89
- }
73
+ css: {
74
+ // Base styles (layout, typography)
75
+ display: 'inline-flex',
76
+ alignItems: 'center',
77
+ justifyContent: 'center',
78
+ margin: '8px',
79
+ padding: '8px 20px',
80
+ border: 'none',
81
+ borderRadius: '6px',
82
+ textTransform: 'uppercase',
83
+ fontSize: '14px',
84
+ fontWeight: '500',
85
+ letterSpacing: '0.5px',
86
+ lineHeight: '1.75',
87
+ minWidth: '64px',
88
+ userSelect: 'none',
89
+ cursor: 'pointer',
90
+ boxShadow: 'none',
91
+ background: 'transparent',
92
+ transition:
93
+ 'background 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1), transform 0.1s cubic-bezier(0.230, 1.000, 0.320, 1.000), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1)',
90
94
 
91
- document.addEventListener('mouseup', mouseUp)
95
+ // Common states
96
+ '&:active:not(:disabled)': {
97
+ transform: 'scale(0.96)',
98
+ },
92
99
 
93
- return () => {
94
- document.removeEventListener('mouseup', mouseUp)
95
- }
100
+ '&:disabled': {
101
+ cursor: 'not-allowed',
102
+ opacity: '0.6',
103
+ },
104
+
105
+ // ==========================================
106
+ // FLAT VARIANT (default - no data-variant)
107
+ // Uses CSS custom properties set in render
108
+ // ==========================================
109
+
110
+ color: 'var(--btn-color-main)',
111
+
112
+ '&:not([data-variant]):hover:not(:disabled)': {
113
+ color: 'var(--btn-color-light)',
114
+ background: 'color-mix(in srgb, var(--btn-color-main) 10%, transparent)',
115
+ },
116
+
117
+ '&:not([data-variant]):disabled': {
118
+ color: 'var(--btn-color-dark)',
119
+ },
120
+
121
+ // ==========================================
122
+ // CONTAINED VARIANT
123
+ // ==========================================
124
+
125
+ '&[data-variant="contained"]': {
126
+ background: 'var(--btn-color-main)',
127
+ color: 'var(--btn-color-main-contrast)',
128
+ },
129
+
130
+ '&[data-variant="contained"]:hover:not(:disabled)': {
131
+ background: 'var(--btn-color-dark)',
132
+ color: 'var(--btn-color-dark-contrast)',
133
+ },
134
+
135
+ '&[data-variant="contained"]:disabled': {
136
+ background: 'var(--btn-color-dark)',
137
+ color: 'var(--btn-color-dark-contrast)',
138
+ },
139
+
140
+ // ==========================================
141
+ // OUTLINED VARIANT
142
+ // ==========================================
143
+
144
+ '&[data-variant="outlined"]': {
145
+ color: 'var(--btn-color-main)',
146
+ boxShadow: '0px 0px 0px 1px var(--btn-color-main)',
147
+ backdropFilter: 'blur(35px)',
148
+ },
149
+
150
+ '&[data-variant="outlined"]:hover:not(:disabled)': {
151
+ color: 'var(--btn-color-light)',
152
+ boxShadow: '0px 0px 0px 1px var(--btn-color-light)',
153
+ background: 'color-mix(in srgb, var(--btn-color-main) 10%, transparent)',
154
+ },
155
+
156
+ '&[data-variant="outlined"]:disabled': {
157
+ color: 'var(--btn-color-dark)',
158
+ boxShadow: '0px 0px 0px 1px var(--btn-color-dark)',
159
+ },
96
160
  },
97
- render: ({ props, children, injector, element, useDisposable }) => {
98
- const mouseDownHandler = props.onmousedown
99
- const mouseUpHandler = props.onmouseup
100
- const themeProvider = injector.getInstance(ThemeProviderService)
101
- const { theme } = themeProvider
102
- const background = getBackground(props, theme)
103
-
104
- if (props.variant === 'contained') {
105
- useDisposable('themeChanged', () =>
106
- themeProvider.subscribe('themeChanged', () => {
107
- const el = element
108
- el.style.color = getTextColor(props, themeProvider.theme, () =>
109
- themeProvider.getTextColor(el.style.background || el.style.backgroundColor),
110
- )
111
- }),
112
- )
161
+ render: ({ props, children, element }) => {
162
+ // Set data attributes for CSS styling
163
+ if (props.variant) {
164
+ element.setAttribute('data-variant', props.variant)
165
+ } else {
166
+ element.removeAttribute('data-variant')
113
167
  }
114
168
 
115
- const hoveredBackground = getHoveredBackground(props, theme, () => {
116
- const { r, g, b } = themeProvider.getRgbFromColorString(
117
- (props.color && theme.palette[props.color].main) || theme.text.primary,
118
- )
119
- return `rgba(${r}, ${g}, ${b}, 0.1)`
120
- })
121
- const boxShadow = getBoxShadow(props, theme)
122
- const hoveredBoxShadow = getHoveredBoxShadow(props, theme)
123
- const getTextColorInner = () => getTextColor(props, theme, () => themeProvider.getTextColor(background))
124
- const getHoveredTextColorInner = () =>
125
- getHoveredTextColor(props, theme, () => themeProvider.getTextColor(background))
126
-
127
- const tryAnimate = async (
128
- keyframes: PropertyIndexedKeyframes | Keyframe[] | null,
129
- options?: number | KeyframeAnimationOptions,
130
- ) => {
131
- const el = element
132
- if (element) {
133
- void promisifyAnimation(el, keyframes, options)
134
- }
135
- }
169
+ // Set CSS custom properties for the button colors
170
+ const colors = props.color ? colorMap[props.color] : defaultColors
171
+ element.style.setProperty('--btn-color-main', colors.main)
172
+ element.style.setProperty('--btn-color-main-contrast', colors.mainContrast)
173
+ element.style.setProperty('--btn-color-light', colors.light)
174
+ element.style.setProperty('--btn-color-dark', colors.dark)
175
+ element.style.setProperty('--btn-color-dark-contrast', colors.darkContrast)
136
176
 
137
- attachProps(element, {
138
- ...props,
139
- onmousedown(this: HTMLElement, ev: MouseEvent) {
140
- mouseDownHandler?.call(this, ev)
141
- if (!props.disabled) {
142
- void tryAnimate(
143
- [
144
- {
145
- transform: 'scale(0.96)',
146
- },
147
- ],
148
- { duration: 100, fill: 'forwards', easing: 'cubic-bezier(0.230, 1.000, 0.320, 1.000)' },
149
- )
150
- }
151
- },
152
- onmouseup(this: HTMLElement, ev: MouseEvent) {
153
- mouseUpHandler?.call(this, ev)
154
- },
155
- onmouseenter: () => {
156
- if (!props.disabled) {
157
- void tryAnimate(
158
- [
159
- {
160
- background,
161
- boxShadow,
162
- color: getTextColorInner(),
163
- },
164
- {
165
- background: hoveredBackground,
166
- boxShadow: hoveredBoxShadow,
167
- color: getHoveredTextColorInner(),
168
- },
169
- ],
170
- { duration: 200, fill: 'forwards', easing: 'cubic-bezier(0.4, 0, 0.2, 1)' },
171
- )
172
- }
173
- },
174
- onmouseleave: () => {
175
- if (!props.disabled) {
176
- void tryAnimate(
177
- [
178
- { background: hoveredBackground, boxShadow: hoveredBoxShadow, color: getHoveredTextColorInner() },
179
- { background, boxShadow, color: getTextColorInner() },
180
- ],
181
- {
182
- duration: 200,
183
- fill: 'forwards',
184
- easing: 'cubic-bezier(0.4, 0, 0.2, 1)',
185
- },
186
- )
187
- }
188
- },
189
- ...props,
190
- style: {
191
- display: 'inline-flex',
192
- alignItems: 'center',
193
- justifyContent: 'center',
194
- cursor: props.disabled ? 'not-allowed' : 'pointer',
195
- background,
196
- boxShadow,
197
- margin: '8px',
198
- padding: '8px 20px',
199
- border: 'none',
200
- borderRadius: '6px',
201
- textTransform: 'uppercase',
202
- color: getTextColorInner(),
203
- fontSize: '14px',
204
- fontWeight: '500',
205
- letterSpacing: '0.5px',
206
- lineHeight: '1.75',
207
- minWidth: '64px',
208
- backdropFilter: props.variant === 'outlined' ? 'blur(35px)' : undefined,
209
- userSelect: 'none',
210
- opacity: props.disabled ? '0.6' : '1',
211
- transition: 'opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1)',
212
- WebkitTapHighlightColor: 'transparent',
213
- ...props.style,
214
- },
215
- })
177
+ // Apply any custom styles from props
178
+ if (props.style) {
179
+ Object.assign(element.style, props.style)
180
+ }
216
181
 
217
182
  return <>{children}</>
218
183
  },