@api-client/ui 0.2.12 → 0.3.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 (317) hide show
  1. package/.vscode/settings.json +1 -0
  2. package/build/src/core/ModalActivity.d.ts +1 -1
  3. package/build/src/core/ModalActivity.d.ts.map +1 -1
  4. package/build/src/core/ModalActivity.js +6 -5
  5. package/build/src/core/ModalActivity.js.map +1 -1
  6. package/build/src/core/ThemeManager.d.ts +4 -2
  7. package/build/src/core/ThemeManager.d.ts.map +1 -1
  8. package/build/src/core/ThemeManager.js.map +1 -1
  9. package/build/src/demo/DemoPage.d.ts +1 -4
  10. package/build/src/demo/DemoPage.d.ts.map +1 -1
  11. package/build/src/demo/DemoPage.js +2 -5
  12. package/build/src/demo/DemoPage.js.map +1 -1
  13. package/build/src/elements/authorization/ui/CcAuthorization.d.ts +1 -1
  14. package/build/src/elements/authorization/ui/CcAuthorization.d.ts.map +1 -1
  15. package/build/src/elements/authorization/ui/CcAuthorization.js +2 -2
  16. package/build/src/elements/authorization/ui/CcAuthorization.js.map +1 -1
  17. package/build/src/elements/authorization/ui/OAuth2Authorization.d.ts +1 -1
  18. package/build/src/elements/authorization/ui/OAuth2Authorization.d.ts.map +1 -1
  19. package/build/src/elements/authorization/ui/OAuth2Authorization.js +11 -5
  20. package/build/src/elements/authorization/ui/OAuth2Authorization.js.map +1 -1
  21. package/build/src/elements/authorization/ui/OidcAuthorization.d.ts +1 -2
  22. package/build/src/elements/authorization/ui/OidcAuthorization.d.ts.map +1 -1
  23. package/build/src/elements/authorization/ui/OidcAuthorization.js +10 -8
  24. package/build/src/elements/authorization/ui/OidcAuthorization.js.map +1 -1
  25. package/build/src/elements/code/HttpSnippets.d.ts +1 -1
  26. package/build/src/elements/code/HttpSnippets.d.ts.map +1 -1
  27. package/build/src/elements/code/HttpSnippets.js +5 -5
  28. package/build/src/elements/code/HttpSnippets.js.map +1 -1
  29. package/build/src/elements/dialog/internals/ConfirmDelete.d.ts +1 -1
  30. package/build/src/elements/dialog/internals/ConfirmDelete.d.ts.map +1 -1
  31. package/build/src/elements/dialog/internals/ConfirmDelete.js +5 -5
  32. package/build/src/elements/dialog/internals/ConfirmDelete.js.map +1 -1
  33. package/build/src/elements/dialog/internals/Rename.d.ts +1 -1
  34. package/build/src/elements/dialog/internals/Rename.d.ts.map +1 -1
  35. package/build/src/elements/dialog/internals/Rename.js +6 -5
  36. package/build/src/elements/dialog/internals/Rename.js.map +1 -1
  37. package/build/src/elements/environment/EnvironmentEditor.d.ts +1 -1
  38. package/build/src/elements/environment/EnvironmentEditor.d.ts.map +1 -1
  39. package/build/src/elements/environment/EnvironmentEditor.js +5 -4
  40. package/build/src/elements/environment/EnvironmentEditor.js.map +1 -1
  41. package/build/src/elements/file-system/internals/Breadcrumbs.d.ts +2 -1
  42. package/build/src/elements/file-system/internals/Breadcrumbs.d.ts.map +1 -1
  43. package/build/src/elements/file-system/internals/Breadcrumbs.js +3 -4
  44. package/build/src/elements/file-system/internals/Breadcrumbs.js.map +1 -1
  45. package/build/src/elements/http/BodyEditor.d.ts +1 -3
  46. package/build/src/elements/http/BodyEditor.d.ts.map +1 -1
  47. package/build/src/elements/http/BodyEditor.js +25 -20
  48. package/build/src/elements/http/BodyEditor.js.map +1 -1
  49. package/build/src/elements/http/BodyMultipartEditor.d.ts +1 -1
  50. package/build/src/elements/http/BodyMultipartEditor.d.ts.map +1 -1
  51. package/build/src/elements/http/BodyMultipartEditor.js +3 -3
  52. package/build/src/elements/http/BodyMultipartEditor.js.map +1 -1
  53. package/build/src/elements/http/CertificateAdd.element.d.ts +1 -3
  54. package/build/src/elements/http/CertificateAdd.element.d.ts.map +1 -1
  55. package/build/src/elements/http/CertificateAdd.element.js +6 -10
  56. package/build/src/elements/http/CertificateAdd.element.js.map +1 -1
  57. package/build/src/elements/http/HeadersForm.d.ts +1 -1
  58. package/build/src/elements/http/HeadersForm.d.ts.map +1 -1
  59. package/build/src/elements/http/HeadersForm.js +3 -3
  60. package/build/src/elements/http/HeadersForm.js.map +1 -1
  61. package/build/src/elements/http/HttpAssertions.element.d.ts +1 -1
  62. package/build/src/elements/http/HttpAssertions.element.d.ts.map +1 -1
  63. package/build/src/elements/http/HttpAssertions.element.js +2 -2
  64. package/build/src/elements/http/HttpAssertions.element.js.map +1 -1
  65. package/build/src/elements/http/HttpFlows.element.d.ts +1 -1
  66. package/build/src/elements/http/HttpFlows.element.d.ts.map +1 -1
  67. package/build/src/elements/http/HttpFlows.element.js +6 -6
  68. package/build/src/elements/http/HttpFlows.element.js.map +1 -1
  69. package/build/src/elements/http/RequestEditor.d.ts +1 -3
  70. package/build/src/elements/http/RequestEditor.d.ts.map +1 -1
  71. package/build/src/elements/http/RequestEditor.js +10 -11
  72. package/build/src/elements/http/RequestEditor.js.map +1 -1
  73. package/build/src/elements/http/UrlParamsForm.d.ts +1 -1
  74. package/build/src/elements/http/UrlParamsForm.d.ts.map +1 -1
  75. package/build/src/elements/http/UrlParamsForm.js +4 -4
  76. package/build/src/elements/http/UrlParamsForm.js.map +1 -1
  77. package/build/src/elements/project/HttpProjectRequest.d.ts +1 -1
  78. package/build/src/elements/project/HttpProjectRequest.d.ts.map +1 -1
  79. package/build/src/elements/project/HttpProjectRequest.js +3 -3
  80. package/build/src/elements/project/HttpProjectRequest.js.map +1 -1
  81. package/build/src/elements/project/HttpProjectRequestHistory.d.ts +1 -2
  82. package/build/src/elements/project/HttpProjectRequestHistory.d.ts.map +1 -1
  83. package/build/src/elements/project/HttpProjectRequestHistory.js +5 -6
  84. package/build/src/elements/project/HttpProjectRequestHistory.js.map +1 -1
  85. package/build/src/elements/project/ProjectRunReport.d.ts +1 -1
  86. package/build/src/elements/project/ProjectRunReport.d.ts.map +1 -1
  87. package/build/src/elements/project/ProjectRunReport.js +7 -7
  88. package/build/src/elements/project/ProjectRunReport.js.map +1 -1
  89. package/build/src/elements/project/ProjectRunner.d.ts +1 -2
  90. package/build/src/elements/project/ProjectRunner.d.ts.map +1 -1
  91. package/build/src/elements/project/ProjectRunner.js +4 -5
  92. package/build/src/elements/project/ProjectRunner.js.map +1 -1
  93. package/build/src/md/button/internals/base.d.ts +98 -0
  94. package/build/src/md/button/internals/base.d.ts.map +1 -0
  95. package/build/src/md/button/internals/base.js +353 -0
  96. package/build/src/md/button/internals/base.js.map +1 -0
  97. package/build/src/md/button/internals/button.d.ts +7 -75
  98. package/build/src/md/button/internals/button.d.ts.map +1 -1
  99. package/build/src/md/button/internals/button.js +18 -247
  100. package/build/src/md/button/internals/button.js.map +1 -1
  101. package/build/src/md/button/internals/{button-styles.d.ts → button.styles.d.ts} +1 -1
  102. package/build/src/md/button/internals/button.styles.d.ts.map +1 -0
  103. package/build/src/md/button/internals/button.styles.js +319 -0
  104. package/build/src/md/button/internals/button.styles.js.map +1 -0
  105. package/build/src/md/button/internals/group.d.ts +54 -0
  106. package/build/src/md/button/internals/group.d.ts.map +1 -0
  107. package/build/src/md/button/internals/group.js +157 -0
  108. package/build/src/md/button/internals/group.js.map +1 -0
  109. package/build/src/md/button/internals/{text-button.styles.d.ts → group.styles.d.ts} +1 -1
  110. package/build/src/md/button/internals/group.styles.d.ts.map +1 -0
  111. package/build/src/md/button/internals/group.styles.js +102 -0
  112. package/build/src/md/button/internals/group.styles.js.map +1 -0
  113. package/build/src/md/button/ui-button-group.d.ts +11 -0
  114. package/build/src/md/button/ui-button-group.d.ts.map +1 -0
  115. package/build/src/md/{icon-button/ui-filled-icon-button.js → button/ui-button-group.js} +10 -11
  116. package/build/src/md/button/ui-button-group.js.map +1 -0
  117. package/build/src/md/button/ui-button.d.ts +14 -0
  118. package/build/src/md/button/ui-button.d.ts.map +1 -0
  119. package/build/src/md/button/{ui-text-button.js → ui-button.js} +10 -11
  120. package/build/src/md/button/ui-button.js.map +1 -0
  121. package/build/src/md/dialog/internals/Dialog.d.ts +5 -5
  122. package/build/src/md/dialog/internals/Dialog.d.ts.map +1 -1
  123. package/build/src/md/dialog/internals/Dialog.js +14 -9
  124. package/build/src/md/dialog/internals/Dialog.js.map +1 -1
  125. package/build/src/md/dropdown-list/internals/UiDropdownList.d.ts +1 -1
  126. package/build/src/md/dropdown-list/internals/UiDropdownList.js +1 -1
  127. package/build/src/md/dropdown-list/internals/UiDropdownList.js.map +1 -1
  128. package/build/src/md/icon-button/internals/IconButton.d.ts +12 -36
  129. package/build/src/md/icon-button/internals/IconButton.d.ts.map +1 -1
  130. package/build/src/md/icon-button/internals/IconButton.js +32 -144
  131. package/build/src/md/icon-button/internals/IconButton.js.map +1 -1
  132. package/build/src/md/{button/internals/filled-button.styles.d.ts → icon-button/internals/IconButton.styles.d.ts} +1 -1
  133. package/build/src/md/icon-button/internals/IconButton.styles.d.ts.map +1 -0
  134. package/build/src/md/icon-button/internals/IconButton.styles.js +286 -0
  135. package/build/src/md/icon-button/internals/IconButton.styles.js.map +1 -0
  136. package/build/src/md/icon-button/ui-icon-button.d.ts.map +1 -1
  137. package/build/src/md/icon-button/ui-icon-button.js +2 -3
  138. package/build/src/md/icon-button/ui-icon-button.js.map +1 -1
  139. package/build/src/md/ripple/internals/ripple.d.ts +2 -0
  140. package/build/src/md/ripple/internals/ripple.d.ts.map +1 -1
  141. package/build/src/md/ripple/internals/ripple.js +20 -10
  142. package/build/src/md/ripple/internals/ripple.js.map +1 -1
  143. package/build/src/md/ripple/internals/ripple.styles.d.ts.map +1 -1
  144. package/build/src/md/ripple/internals/ripple.styles.js +8 -20
  145. package/build/src/md/ripple/internals/ripple.styles.js.map +1 -1
  146. package/build/src/md/snackbar/internals/Snackbar.d.ts +1 -1
  147. package/build/src/md/snackbar/internals/Snackbar.d.ts.map +1 -1
  148. package/build/src/md/snackbar/internals/Snackbar.js +4 -2
  149. package/build/src/md/snackbar/internals/Snackbar.js.map +1 -1
  150. package/build/src/md/text-field/internals/filled.styles.d.ts.map +1 -1
  151. package/build/src/md/text-field/internals/filled.styles.js +3 -0
  152. package/build/src/md/text-field/internals/filled.styles.js.map +1 -1
  153. package/build/src/styles/m3/dialog.module.d.ts +2 -2
  154. package/build/src/styles/m3/dialog.module.js +2 -2
  155. package/build/src/styles/m3/dialog.module.js.map +1 -1
  156. package/build/src/styles/m3/tokens.d.ts.map +1 -1
  157. package/build/src/styles/m3/tokens.js +208 -182
  158. package/build/src/styles/m3/tokens.js.map +1 -1
  159. package/demo/elements/authorization/oauth-authorize.html +1 -1
  160. package/demo/elements/authorization/oauth-authorize.ts +1 -1
  161. package/demo/elements/environment/variables-editor.ts +2 -2
  162. package/demo/elements/http/url-editing.ts +3 -3
  163. package/demo/elements/project/request-editor.ts +4 -4
  164. package/demo/layout/index.ts +5 -5
  165. package/demo/md/buttons/button.html +121 -0
  166. package/demo/md/buttons/button.ts +246 -0
  167. package/demo/md/buttons/{index.html → group.html} +15 -2
  168. package/demo/md/buttons/group.ts +171 -0
  169. package/demo/md/checkbox/index.ts +1 -1
  170. package/demo/md/dialog/dialog.ts +8 -9
  171. package/demo/md/dropdown-list/index.ts +68 -71
  172. package/demo/md/icon-button/index.html +97 -7
  173. package/demo/md/icon-button/index.ts +97 -201
  174. package/demo/md/index.html +3 -1
  175. package/demo/md/inputs/input.ts +1 -1
  176. package/demo/md/inputs/radio.ts +1 -1
  177. package/demo/md/inputs/switch.ts +1 -1
  178. package/demo/md/notification/snack.ts +5 -5
  179. package/demo/md/progress/progress.ts +4 -3
  180. package/package.json +2 -2
  181. package/src/core/ModalActivity.ts +6 -5
  182. package/src/core/ThemeManager.ts +5 -4
  183. package/src/demo/DemoPage.ts +2 -5
  184. package/src/elements/authorization/ui/CcAuthorization.ts +2 -2
  185. package/src/elements/authorization/ui/OAuth2Authorization.ts +11 -5
  186. package/src/elements/authorization/ui/OidcAuthorization.ts +10 -8
  187. package/src/elements/code/HttpSnippets.ts +5 -5
  188. package/src/elements/dialog/internals/ConfirmDelete.ts +5 -5
  189. package/src/elements/dialog/internals/Rename.ts +6 -5
  190. package/src/elements/environment/EnvironmentEditor.ts +5 -4
  191. package/src/elements/file-system/internals/Breadcrumbs.ts +3 -4
  192. package/src/elements/http/BodyEditor.ts +25 -20
  193. package/src/elements/http/BodyMultipartEditor.ts +3 -3
  194. package/src/elements/http/CertificateAdd.element.ts +6 -10
  195. package/src/elements/http/HeadersForm.ts +3 -3
  196. package/src/elements/http/HttpAssertions.element.ts +2 -2
  197. package/src/elements/http/HttpFlows.element.ts +6 -6
  198. package/src/elements/http/RequestEditor.ts +10 -11
  199. package/src/elements/http/UrlParamsForm.ts +4 -4
  200. package/src/elements/project/HttpProjectRequest.ts +3 -3
  201. package/src/elements/project/HttpProjectRequestHistory.ts +5 -6
  202. package/src/elements/project/ProjectRunReport.ts +7 -7
  203. package/src/elements/project/ProjectRunner.ts +4 -5
  204. package/src/md/button/internals/base.ts +299 -0
  205. package/src/md/button/internals/button.styles.ts +319 -0
  206. package/src/md/button/internals/button.ts +8 -234
  207. package/src/md/button/internals/group.styles.ts +102 -0
  208. package/src/md/button/internals/group.ts +121 -0
  209. package/src/md/button/ui-button-group.ts +15 -0
  210. package/src/md/button/ui-button.ts +18 -0
  211. package/src/md/dialog/internals/Dialog.ts +14 -9
  212. package/src/md/dropdown-list/internals/UiDropdownList.ts +1 -1
  213. package/src/md/icon-button/internals/IconButton.styles.ts +286 -0
  214. package/src/md/icon-button/internals/IconButton.ts +15 -139
  215. package/src/md/icon-button/ui-icon-button.ts +2 -3
  216. package/src/md/ripple/internals/ripple.styles.ts +8 -20
  217. package/src/md/ripple/internals/ripple.ts +21 -13
  218. package/src/md/snackbar/internals/Snackbar.ts +4 -2
  219. package/src/md/text-field/internals/filled.styles.ts +3 -0
  220. package/src/styles/m3/dialog.module.ts +2 -2
  221. package/src/styles/m3/native.css +270 -0
  222. package/src/styles/m3/tokens.css +208 -182
  223. package/src/styles/m3/tokens.ts +208 -182
  224. package/test/ui/button/UiButton.test.ts +51 -29
  225. package/test/ui/button/UiIconButton.test.ts +25 -19
  226. package/test/ui/dialog/UiDialog.test.ts +10 -10
  227. package/build/src/md/button/internals/button-styles.d.ts.map +0 -1
  228. package/build/src/md/button/internals/button-styles.js +0 -143
  229. package/build/src/md/button/internals/button-styles.js.map +0 -1
  230. package/build/src/md/button/internals/elevated-button.d.ts +0 -4
  231. package/build/src/md/button/internals/elevated-button.d.ts.map +0 -1
  232. package/build/src/md/button/internals/elevated-button.js +0 -4
  233. package/build/src/md/button/internals/elevated-button.js.map +0 -1
  234. package/build/src/md/button/internals/elevated-button.styles.d.ts +0 -3
  235. package/build/src/md/button/internals/elevated-button.styles.d.ts.map +0 -1
  236. package/build/src/md/button/internals/elevated-button.styles.js +0 -38
  237. package/build/src/md/button/internals/elevated-button.styles.js.map +0 -1
  238. package/build/src/md/button/internals/filled-button.d.ts +0 -4
  239. package/build/src/md/button/internals/filled-button.d.ts.map +0 -1
  240. package/build/src/md/button/internals/filled-button.js +0 -4
  241. package/build/src/md/button/internals/filled-button.js.map +0 -1
  242. package/build/src/md/button/internals/filled-button.styles.d.ts.map +0 -1
  243. package/build/src/md/button/internals/filled-button.styles.js +0 -30
  244. package/build/src/md/button/internals/filled-button.styles.js.map +0 -1
  245. package/build/src/md/button/internals/filled-tonal-button.d.ts +0 -4
  246. package/build/src/md/button/internals/filled-tonal-button.d.ts.map +0 -1
  247. package/build/src/md/button/internals/filled-tonal-button.js +0 -4
  248. package/build/src/md/button/internals/filled-tonal-button.js.map +0 -1
  249. package/build/src/md/button/internals/filled-tonal-button.styles.d.ts +0 -3
  250. package/build/src/md/button/internals/filled-tonal-button.styles.d.ts.map +0 -1
  251. package/build/src/md/button/internals/filled-tonal-button.styles.js +0 -30
  252. package/build/src/md/button/internals/filled-tonal-button.styles.js.map +0 -1
  253. package/build/src/md/button/internals/outlined-button.d.ts +0 -4
  254. package/build/src/md/button/internals/outlined-button.d.ts.map +0 -1
  255. package/build/src/md/button/internals/outlined-button.js +0 -4
  256. package/build/src/md/button/internals/outlined-button.js.map +0 -1
  257. package/build/src/md/button/internals/outlined-button.styles.d.ts +0 -3
  258. package/build/src/md/button/internals/outlined-button.styles.d.ts.map +0 -1
  259. package/build/src/md/button/internals/outlined-button.styles.js +0 -31
  260. package/build/src/md/button/internals/outlined-button.styles.js.map +0 -1
  261. package/build/src/md/button/internals/text-button.d.ts +0 -4
  262. package/build/src/md/button/internals/text-button.d.ts.map +0 -1
  263. package/build/src/md/button/internals/text-button.js +0 -4
  264. package/build/src/md/button/internals/text-button.js.map +0 -1
  265. package/build/src/md/button/internals/text-button.styles.d.ts.map +0 -1
  266. package/build/src/md/button/internals/text-button.styles.js +0 -30
  267. package/build/src/md/button/internals/text-button.styles.js.map +0 -1
  268. package/build/src/md/button/ui-elevated-button.d.ts +0 -14
  269. package/build/src/md/button/ui-elevated-button.d.ts.map +0 -1
  270. package/build/src/md/button/ui-elevated-button.js +0 -31
  271. package/build/src/md/button/ui-elevated-button.js.map +0 -1
  272. package/build/src/md/button/ui-filled-button.d.ts +0 -14
  273. package/build/src/md/button/ui-filled-button.d.ts.map +0 -1
  274. package/build/src/md/button/ui-filled-button.js +0 -31
  275. package/build/src/md/button/ui-filled-button.js.map +0 -1
  276. package/build/src/md/button/ui-filled-tonal-button.d.ts +0 -14
  277. package/build/src/md/button/ui-filled-tonal-button.d.ts.map +0 -1
  278. package/build/src/md/button/ui-filled-tonal-button.js +0 -31
  279. package/build/src/md/button/ui-filled-tonal-button.js.map +0 -1
  280. package/build/src/md/button/ui-outlined-button.d.ts +0 -14
  281. package/build/src/md/button/ui-outlined-button.d.ts.map +0 -1
  282. package/build/src/md/button/ui-outlined-button.js +0 -31
  283. package/build/src/md/button/ui-outlined-button.js.map +0 -1
  284. package/build/src/md/button/ui-text-button.d.ts +0 -14
  285. package/build/src/md/button/ui-text-button.d.ts.map +0 -1
  286. package/build/src/md/button/ui-text-button.js.map +0 -1
  287. package/build/src/md/icon-button/ui-filled-icon-button.d.ts +0 -11
  288. package/build/src/md/icon-button/ui-filled-icon-button.d.ts.map +0 -1
  289. package/build/src/md/icon-button/ui-filled-icon-button.js.map +0 -1
  290. package/build/src/md/icon-button/ui-filled-tonal-icon-button.d.ts +0 -11
  291. package/build/src/md/icon-button/ui-filled-tonal-icon-button.d.ts.map +0 -1
  292. package/build/src/md/icon-button/ui-filled-tonal-icon-button.js +0 -28
  293. package/build/src/md/icon-button/ui-filled-tonal-icon-button.js.map +0 -1
  294. package/build/src/md/icon-button/ui-outlined-icon-button.d.ts +0 -11
  295. package/build/src/md/icon-button/ui-outlined-icon-button.d.ts.map +0 -1
  296. package/build/src/md/icon-button/ui-outlined-icon-button.js +0 -28
  297. package/build/src/md/icon-button/ui-outlined-icon-button.js.map +0 -1
  298. package/demo/md/buttons/index.ts +0 -279
  299. package/src/md/button/internals/button-styles.ts +0 -143
  300. package/src/md/button/internals/elevated-button.styles.ts +0 -38
  301. package/src/md/button/internals/elevated-button.ts +0 -3
  302. package/src/md/button/internals/filled-button.styles.ts +0 -30
  303. package/src/md/button/internals/filled-button.ts +0 -3
  304. package/src/md/button/internals/filled-tonal-button.styles.ts +0 -30
  305. package/src/md/button/internals/filled-tonal-button.ts +0 -3
  306. package/src/md/button/internals/outlined-button.styles.ts +0 -31
  307. package/src/md/button/internals/outlined-button.ts +0 -3
  308. package/src/md/button/internals/text-button.styles.ts +0 -30
  309. package/src/md/button/internals/text-button.ts +0 -3
  310. package/src/md/button/ui-elevated-button.ts +0 -19
  311. package/src/md/button/ui-filled-button.ts +0 -19
  312. package/src/md/button/ui-filled-tonal-button.ts +0 -19
  313. package/src/md/button/ui-outlined-button.ts +0 -19
  314. package/src/md/button/ui-text-button.ts +0 -19
  315. package/src/md/icon-button/ui-filled-icon-button.ts +0 -16
  316. package/src/md/icon-button/ui-filled-tonal-icon-button.ts +0 -16
  317. package/src/md/icon-button/ui-outlined-icon-button.ts +0 -16
@@ -13,7 +13,7 @@ import type { IResponse } from '@api-client/core/models/Response.js'
13
13
  import '@github/relative-time-element'
14
14
  import '../../define/http/http-request-log.js'
15
15
  import '../../md/icons/ui-icon.js'
16
- import '../../md/button/ui-filled-tonal-button.js'
16
+ import '../../md/button/ui-button.js'
17
17
  import '../../md/dropdown-list/ui-dropdown-list.js'
18
18
  import '../../md/list/ui-list.js'
19
19
  import '../../md/list/ui-list-item.js'
@@ -228,10 +228,10 @@ export default class ProjectRunReport extends LitElement {
228
228
  closeOnOutsideClick
229
229
  @select="${this.handleIterationSelection}"
230
230
  >
231
- <ui-filled-tonal-button>
231
+ <ui-button color="tonal">
232
232
  <ui-icon slot="icon" icon="arrowDropDown"></ui-icon>
233
233
  Iteration #${index}
234
- </ui-filled-tonal-button>
234
+ </ui-button>
235
235
  <ui-list slot="dropdown" role="menu" aria-label="Iterations list">
236
236
  ${iterations.map((current) => this.renderIterationOption(current.index))}
237
237
  </ui-list>
@@ -269,10 +269,10 @@ export default class ProjectRunReport extends LitElement {
269
269
  closeOnOutsideClick
270
270
  @select="${this.handleRequestSelection}"
271
271
  >
272
- <ui-filled-tonal-button title="${title}">
272
+ <ui-button color="tonal" title="${title}">
273
273
  <ui-icon slot="icon" icon="arrowDropDown"></ui-icon>
274
274
  <span class="request-title-dropdown">${title}</span>
275
- </ui-filled-tonal-button>
275
+ </ui-button>
276
276
  <ui-list slot="dropdown" role="menu" aria-label="History list"> ${options} </ui-list>
277
277
  </ui-dropdown-list>
278
278
  `
@@ -280,10 +280,10 @@ export default class ProjectRunReport extends LitElement {
280
280
 
281
281
  protected renderEmptyRequestsList(): TemplateResult {
282
282
  return html`
283
- <ui-filled-tonal-button disabled>
283
+ <ui-button color="tonal" disabled>
284
284
  <ui-icon slot="icon" icon="arrowDropDown"></ui-icon>
285
285
  No requests
286
- </ui-filled-tonal-button>
286
+ </ui-button>
287
287
  `
288
288
  }
289
289
 
@@ -17,8 +17,7 @@ import '@github/relative-time-element'
17
17
  import '../../define/http-project/project-run-report.js'
18
18
  import '../../md/checkbox/ui-checkbox.js'
19
19
  import '../../md/text-field/ui-filled-text-field.js'
20
- import '../../md/button/ui-filled-button.js'
21
- import '../../md/button/ui-filled-tonal-button.js'
20
+ import '../../md/button/ui-button.js'
22
21
  import '../../md/progress/ui-progress.js'
23
22
  import '../../md/icons/ui-icon.js'
24
23
  import '../../md/dropdown-list/ui-dropdown-list.js'
@@ -447,7 +446,7 @@ export default class ProjectRunner extends ApiElement {
447
446
  protected renderSubmit(): TemplateResult {
448
447
  return html`
449
448
  <div class="submit-row">
450
- <ui-filled-button @click="${this.handleRun}" ?disabled="${this.running}">Run</ui-filled-button>
449
+ <ui-button color="filled" @click="${this.handleRun}" ?disabled="${this.running}">Run</ui-button>
451
450
  </div>
452
451
  `
453
452
  }
@@ -493,12 +492,12 @@ export default class ProjectRunner extends ApiElement {
493
492
  closeOnOutsideClick
494
493
  @select="${this.handleHistorySelection}"
495
494
  >
496
- <ui-filled-tonal-button ?disabled="${disabled}">
495
+ <ui-button color="tonal" ?disabled="${disabled}">
497
496
  <ui-icon slot="icon" icon="arrowDropDown"></ui-icon>
498
497
  ${selected
499
498
  ? html`<relative-time datetime="${new Date(selected.ended).toISOString()}"></relative-time>`
500
499
  : 'History'}
501
- </ui-filled-tonal-button>
500
+ </ui-button>
502
501
  <ui-list slot="dropdown" role="menu" aria-label="History list">
503
502
  ${history.map((current) => this.renderHistoryOption(current))}
504
503
  </ui-list>
@@ -0,0 +1,299 @@
1
+ import { html, nothing, type PropertyValues, type TemplateResult } from 'lit'
2
+ import { property, query } from 'lit/decorators.js'
3
+ import { UiElement } from '../../UiElement.js'
4
+ import type { BeginPressConfig, EndPressConfig } from '../../../controllers/ActionController.js'
5
+ import { isDisabled, setDisabled } from '../../../lib/disabled.js'
6
+ import type UiRipple from '../../ripple/internals/ripple.js'
7
+
8
+ import '../../ripple/ui-ripple.js'
9
+ import '@material/web/focus/md-focus-ring.js'
10
+
11
+ export type ButtonType = 'submit' | 'reset' | 'button'
12
+ export type MdButtonShape = 'round' | 'square'
13
+ export type MdButtonSize = 'xs' | 's' | 'm' | 'l' | 'xl'
14
+
15
+ /**
16
+ * A material design button with M3 Expressive features - CSS-native implementation.
17
+ *
18
+ * @slot icon - A slot for the icon element
19
+ * @slot - The default slot for the label
20
+ * @attribute {string} form - The form associated with this element when the element is outside the form.
21
+ * @fires {ToggleEvent} toggle - Fired when the `toggle` property is true and the button is clicked,
22
+ * changing its selection state.
23
+ * The event's `newState` and `oldState` properties (string values: 'selected' or
24
+ * 'unselected') detail this selection change.
25
+ */
26
+ export default class BaseButton extends UiElement {
27
+ static readonly formAssociated = true
28
+
29
+ #internals = this.attachInternals()
30
+
31
+ /**
32
+ * The form associated with this element
33
+ * @attribute
34
+ */
35
+ get form(): HTMLFormElement | null | string {
36
+ return this.#internals.form
37
+ }
38
+
39
+ get validity() {
40
+ return this.#internals.validity
41
+ }
42
+
43
+ get validationMessage() {
44
+ return this.#internals.validationMessage
45
+ }
46
+
47
+ get willValidate() {
48
+ return this.#internals.willValidate
49
+ }
50
+
51
+ /**
52
+ * The name of the button, submitted as a pair with the button's value as part of the form data.
53
+ * @attribute
54
+ */
55
+ @property({ type: String }) accessor name: string | undefined
56
+
57
+ #value?: string
58
+
59
+ get value(): string | undefined {
60
+ return this.#value
61
+ }
62
+
63
+ /**
64
+ * Defines the value associated with the button's name when it's submitted with the form data.
65
+ * @attribute
66
+ */
67
+ @property({ type: String })
68
+ set value(value: string | undefined) {
69
+ if (this.#value === value) {
70
+ return
71
+ }
72
+ this.#value = value
73
+ this.#internals?.setFormValue(value || null)
74
+ }
75
+
76
+ /**
77
+ * Whether to render the icon at the inline end of the label rather than the inline start.
78
+ * @attribute
79
+ */
80
+ @property({ type: Boolean, attribute: 'trailingicon', reflect: true }) accessor trailingIcon = false
81
+
82
+ /**
83
+ * The default behavior of the button.
84
+ * @attribute
85
+ */
86
+ @property({ type: String, reflect: true }) accessor type: ButtonType = 'button'
87
+
88
+ /**
89
+ * When set, the button is a toggle button.
90
+ * @attribute
91
+ */
92
+ @property({ type: Boolean, reflect: true }) accessor toggle = false
93
+
94
+ /**
95
+ * Indicates that the button is currently selected.
96
+ * @attribute
97
+ */
98
+ @property({ type: Boolean, reflect: true }) accessor selected = false
99
+
100
+ /**
101
+ * The shape of the button.
102
+ * @attribute
103
+ */
104
+ @property({ type: String, reflect: true }) accessor shape: MdButtonShape = 'round'
105
+
106
+ /**
107
+ * The size of the button.
108
+ * @attribute
109
+ */
110
+ @property({ type: String, reflect: true }) accessor size: MdButtonSize = 's'
111
+
112
+ get disabled(): boolean {
113
+ return isDisabled(this)
114
+ }
115
+
116
+ /**
117
+ * When set, the button is in a disabled state.
118
+ * @attribute
119
+ */
120
+ @property({ reflect: true, type: Boolean })
121
+ set disabled(value: boolean) {
122
+ const old = isDisabled(this)
123
+ setDisabled(this, value)
124
+ this.requestUpdate('disabled', old)
125
+ }
126
+
127
+ @query('ui-ripple') protected accessor ripple!: UiRipple | null
128
+
129
+ constructor() {
130
+ super()
131
+ this.actionController.cancelKeyboardEvents = true
132
+ this.addEventListener('keydown', this.handleKeyDown.bind(this))
133
+ this.addEventListener('keyup', this.handleKeyUp.bind(this))
134
+ this.addEventListener('click', this.handleClick.bind(this))
135
+ this.addEventListener('pointerdown', this.handlePointerDown.bind(this))
136
+ this.addEventListener('pointerup', this.handlePointerUp.bind(this))
137
+ this.addEventListener('pointercancel', this.handlePointerCancel.bind(this))
138
+ this.addEventListener('pointerleave', this.handlePointerLeave.bind(this))
139
+ this.addEventListener('pointerenter', this.handlePointerEnter.bind(this))
140
+ this.addEventListener('contextmenu', this.handleContextMenu.bind(this))
141
+ }
142
+
143
+ override connectedCallback(): void {
144
+ super.connectedCallback()
145
+ if (!this.hasAttribute('role')) {
146
+ this.setAttribute('role', 'button')
147
+ }
148
+ if (!this.hasAttribute('tabindex') && !this.disabled) {
149
+ this.setAttribute('tabindex', '0')
150
+ }
151
+ }
152
+
153
+ protected override updated(cp: PropertyValues<this>): void {
154
+ super.updated(cp)
155
+
156
+ // If the button is disabled, remove the tabindex attribute
157
+ if (cp.has('disabled')) {
158
+ if (this.disabled) {
159
+ this.removeAttribute('tabindex')
160
+ } else if (!this.hasAttribute('tabindex')) {
161
+ this.setAttribute('tabindex', '0')
162
+ }
163
+ }
164
+
165
+ if (cp.has('toggle') || cp.has('selected')) {
166
+ this.updatePressedState()
167
+ }
168
+ }
169
+
170
+ protected updatePressedState(): void {
171
+ if (this.toggle) {
172
+ this.ariaPressed = String(this.selected)
173
+ } else {
174
+ this.selected = false
175
+ this.removeAttribute('aria-pressed')
176
+ }
177
+ }
178
+
179
+ checkValidity() {
180
+ return this.#internals.checkValidity()
181
+ }
182
+
183
+ reportValidity() {
184
+ return this.#internals.reportValidity()
185
+ }
186
+
187
+ protected override firstUpdated(): void {
188
+ this.#internals?.setFormValue(this.value || null)
189
+ }
190
+
191
+ override beginPress(options: BeginPressConfig): void {
192
+ super.beginPress(options)
193
+ this.classList.add('pressed')
194
+ this.ripple?.beginFocus()
195
+ }
196
+
197
+ override endPress(config: EndPressConfig): void {
198
+ super.endPress(config)
199
+ this.classList.remove('pressed')
200
+ this.ripple?.endFocus()
201
+ const { cancelled, reason } = config
202
+ if (cancelled) {
203
+ return
204
+ }
205
+ const allowedReasons = reason === 'enter' || reason === 'space'
206
+ if (this.type === 'submit' && (!reason || allowedReasons)) {
207
+ this.handleSubmit()
208
+ } else if (allowedReasons) {
209
+ this.click()
210
+ }
211
+ }
212
+
213
+ override handleClick(e: MouseEvent): void {
214
+ super.handleClick(e)
215
+ if (this.disabled) {
216
+ e.preventDefault()
217
+ e.stopPropagation()
218
+ return
219
+ }
220
+
221
+ if (this.toggle) {
222
+ this.selected = !this.selected
223
+ const e = new ToggleEvent('toggle', {
224
+ bubbles: true,
225
+ composed: true,
226
+ newState: this.selected ? 'selected' : 'unselected',
227
+ oldState: this.selected ? 'unselected' : 'selected',
228
+ })
229
+ this.dispatchEvent(e)
230
+ }
231
+ this.endPress({ cancelled: false, actionData: { event: e } })
232
+ }
233
+
234
+ protected handleSubmit(): void {
235
+ const { name, value, type, disabled, form } = this
236
+ if (!form || !type || disabled) {
237
+ return
238
+ }
239
+ const typedForm = form as HTMLFormElement
240
+ let button: HTMLButtonElement | undefined
241
+ if (name || value) {
242
+ button = document.createElement('button')
243
+ if (name) {
244
+ button.name = name
245
+ }
246
+ if (value) {
247
+ button.value = value
248
+ }
249
+ button.type = type
250
+ button.hidden = true
251
+ typedForm.append(button)
252
+ }
253
+ try {
254
+ typedForm.requestSubmit(button)
255
+ } catch {
256
+ // Ignore errors
257
+ }
258
+ if (button) {
259
+ typedForm.removeChild(button)
260
+ }
261
+ }
262
+
263
+ override handlePointerEnter(e: PointerEvent): void {
264
+ super.handlePointerEnter(e)
265
+ if (this.ripple) {
266
+ this.ripple.beginHover(e)
267
+ }
268
+ }
269
+
270
+ override handlePointerLeave(e: PointerEvent): void {
271
+ super.handlePointerLeave(e)
272
+ if (this.ripple) {
273
+ this.ripple.endHover()
274
+ }
275
+ }
276
+
277
+ protected override render(): TemplateResult {
278
+ const { trailingIcon = false } = this
279
+ const icon = this.renderIcon()
280
+
281
+ return html`
282
+ ${this.renderFocusRing()} ${this.renderRipple()} ${trailingIcon ? nothing : icon}
283
+ <slot></slot>
284
+ ${trailingIcon ? icon : nothing}
285
+ `
286
+ }
287
+
288
+ protected renderIcon(): TemplateResult {
289
+ return html`<slot name="icon"></slot>`
290
+ }
291
+
292
+ protected renderFocusRing(): TemplateResult {
293
+ return html`<md-focus-ring part="focus-ring" class="focus-ring" .control="${this as HTMLElement}"></md-focus-ring>`
294
+ }
295
+
296
+ protected renderRipple(): TemplateResult {
297
+ return html`<ui-ripple class="ripple" ?disabled="${this.disabled}"></ui-ripple>`
298
+ }
299
+ }
@@ -0,0 +1,319 @@
1
+ import { css } from 'lit'
2
+
3
+ /* Material Design 3 Expressive Button - CSS-Native Implementation */
4
+ export default css`
5
+ :host {
6
+ all: unset;
7
+
8
+ /* Layout and positioning */
9
+ display: inline-flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ position: relative;
13
+ box-sizing: border-box;
14
+ white-space: nowrap;
15
+
16
+ /* Default sizing */
17
+ min-height: 40px;
18
+ min-width: 64px;
19
+ padding-inline: 16px;
20
+ gap: 8px;
21
+
22
+ /* Typography from Material 3 tokens */
23
+ font-family: var(--md-sys-typescale-label-large-font, var(--md-ref-typeface-plain, system-ui));
24
+ font-size: var(--md-sys-typescale-label-large-size, 0.875rem);
25
+ font-weight: var(--md-sys-typescale-label-large-weight, 500);
26
+ line-height: var(--md-sys-typescale-label-large-height, 1.25);
27
+ letter-spacing: var(--md-sys-typescale-label-large-tracking, 0.01em);
28
+
29
+ --md-ripple-hover-state-layer-color: currentColor;
30
+ --md-ripple-focus-state-layer-color: currentColor;
31
+ --md-ripple-pressed-state-layer-color: currentColor;
32
+
33
+ /* CSS custom property for pill radius - half of the button height */
34
+ --_pill-radius: 20px;
35
+ /* Default icon size */
36
+ --_icon-size: var(--md-button-icon-size, 20px);
37
+ --_background-color: transparent;
38
+ --_color: inherit;
39
+ --_shadow: var(--md-sys-elevation-0);
40
+
41
+ border-end-end-radius: var(--ui-button-shape-end-end, var(--_pill-radius));
42
+ border-end-start-radius: var(--ui-button-shape-end-start, var(--_pill-radius));
43
+ border-start-end-radius: var(--ui-button-shape-start-end, var(--_pill-radius));
44
+ border-start-start-radius: var(--ui-button-shape-start-start, var(--_pill-radius));
45
+ background-color: var(--_background-color);
46
+ color: var(--_color);
47
+ box-shadow: var(--_shadow);
48
+
49
+ /* Interaction styles */
50
+ cursor: pointer;
51
+ user-select: none;
52
+ -webkit-tap-highlight-color: transparent;
53
+ outline: none;
54
+
55
+ transition:
56
+ background-color var(--md-sys-motion-duration-short2, 200ms)
57
+ var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
58
+ color var(--md-sys-motion-duration-short2, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
59
+ box-shadow var(--md-sys-motion-duration-short2, 200ms)
60
+ var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
61
+ border-color var(--md-sys-motion-duration-short2, 200ms)
62
+ var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
63
+ border-radius var(--md-sys-motion-duration-medium1) var(--md-sys-motion-easing-standard);
64
+ }
65
+
66
+ /* Icon styling */
67
+ ::slotted([slot='icon']) {
68
+ flex-shrink: 0;
69
+ width: var(--_icon-size);
70
+ height: var(--_icon-size);
71
+ font-size: inherit;
72
+ }
73
+
74
+ /* Modern CSS: Container queries for responsive sizing */
75
+ @container (min-width: 320px) {
76
+ :host {
77
+ min-width: 80px;
78
+ }
79
+ }
80
+
81
+ .ripple {
82
+ border-radius: inherit;
83
+ transition: border-radius var(--md-sys-motion-duration-medium1) var(--md-sys-motion-easing-standard);
84
+ }
85
+
86
+ .focus-ring {
87
+ --md-focus-ring-shape-end-end: var(--ui-button-shape-end-end, var(--_pill-radius));
88
+ --md-focus-ring-shape-end-start: var(--ui-button-shape-end-start, var(--_pill-radius));
89
+ --md-focus-ring-shape-start-end: var(--ui-button-shape-start-end, var(--_pill-radius));
90
+ --md-focus-ring-shape-start-start: var(--ui-button-shape-start-start, var(--_pill-radius));
91
+ transition: border-radius var(--md-sys-motion-duration-medium1) var(--md-sys-motion-easing-standard);
92
+ }
93
+
94
+ .ripple.activated {
95
+ z-index: 1;
96
+ }
97
+
98
+ /* Disabled state */
99
+ :host([disabled]) {
100
+ background-color: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent);
101
+ color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
102
+ box-shadow: none;
103
+ cursor: not-allowed;
104
+ pointer-events: none;
105
+ }
106
+
107
+ /* Size Variations */
108
+ :host([size='xs']) {
109
+ min-height: 32px;
110
+ padding-inline: 12px;
111
+ font-size: var(--md-sys-typescale-label-medium-size, 0.75rem);
112
+ gap: 6px;
113
+ --_icon-size: 20px;
114
+ }
115
+
116
+ :host([size='s']) {
117
+ min-height: 40px;
118
+ padding-inline: 16px;
119
+ --_icon-size: 20px;
120
+ }
121
+
122
+ :host([size='m']) {
123
+ min-height: 56px;
124
+ padding-inline: 24px;
125
+ font-size: var(--md-sys-typescale-label-large-size, 1rem);
126
+ gap: 10px;
127
+ --_icon-size: 24px;
128
+ }
129
+
130
+ :host([size='l']) {
131
+ min-height: 96px;
132
+ padding-inline: 48px;
133
+ font-size: var(--md-sys-typescale-title-medium-size, 1.125rem);
134
+ gap: 12px;
135
+ --_icon-size: 32px;
136
+ }
137
+
138
+ :host([size='xl']) {
139
+ min-height: 136px;
140
+ padding-inline: 64px;
141
+ font-size: var(--md-sys-typescale-title-large-size, 1.375rem);
142
+ gap: 16px;
143
+ --_icon-size: 40px;
144
+ }
145
+
146
+ /* Pressed state is the same to all combinations of shape and size */
147
+ :host([size='xs'].pressed),
148
+ :host([size='s'].pressed) {
149
+ --_pill-radius: 8px !important;
150
+ }
151
+ :host([size='m'].pressed) {
152
+ --_pill-radius: 12px !important;
153
+ }
154
+ :host([size='xl'].pressed),
155
+ :host([size='l'].pressed) {
156
+ --_pill-radius: 16px !important;
157
+ }
158
+
159
+ /* Shape setup */
160
+ /* For the round shape, we can't use the "--md-sys-shape-corner-full" value as it has a value of 999px and it would make animations impossible so see. */
161
+ :host([toggle][selected][shape='square'][size='xs']),
162
+ :host([shape='round'][size='xs']) {
163
+ --_pill-radius: 16px; /* Half of 32px height */
164
+ }
165
+ :host([toggle][selected][shape='square'][size='s']),
166
+ :host([shape='round'][size='s']) {
167
+ --_pill-radius: 20px; /* Half of 40px height */
168
+ }
169
+ :host([toggle][selected][shape='square'][size='m']),
170
+ :host([shape='round'][size='m']) {
171
+ --_pill-radius: 28px; /* Half of 56px height */
172
+ }
173
+ :host([toggle][selected][shape='square'][size='l']),
174
+ :host([shape='round'][size='l']) {
175
+ --_pill-radius: 48px; /* Half of 96px height */
176
+ }
177
+ :host([toggle][selected][shape='square'][size='xl']),
178
+ :host([shape='round'][size='xl']) {
179
+ --_pill-radius: 68px; /* Half of 136px height */
180
+ }
181
+
182
+ :host([shape='square'][size='xs']),
183
+ :host([shape='square'][size='s']) {
184
+ --_pill-radius: var(--md-sys-shape-corner-medium);
185
+ }
186
+
187
+ :host([shape='square'][size='m']) {
188
+ --_pill-radius: var(--md-sys-shape-corner-large);
189
+ }
190
+
191
+ :host([shape='square'][size='l']),
192
+ :host([shape='square'][size='xl']) {
193
+ --_pill-radius: var(--md-sys-shape-corner-extra-large);
194
+ }
195
+
196
+ /* Button Color Variants - Material 3 Expressive */
197
+
198
+ /* Elevated Button */
199
+ :host([color='elevated']) {
200
+ --_background-color: var(--md-sys-color-surface-container-low);
201
+ --_color: var(--md-sys-color-primary);
202
+ --_shadow: var(--md-sys-elevation-1);
203
+ }
204
+
205
+ :host([color='elevated'][toggle][selected]) {
206
+ --_background-color: var(--md-sys-color-primary);
207
+ --_color: var(--md-sys-color-on-primary);
208
+ }
209
+
210
+ :host([color='elevated']:hover:not([disabled])) {
211
+ --_shadow: var(--md-sys-elevation-2);
212
+ }
213
+
214
+ :host([color='elevated'][disabled]) {
215
+ --_background-color: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent);
216
+ --_color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
217
+ --_shadow: var(--md-sys-elevation-0);
218
+ }
219
+
220
+ /* Filled Button */
221
+ :host([color='filled']) {
222
+ --_background-color: var(--md-sys-color-primary);
223
+ --_color: var(--md-sys-color-on-primary);
224
+ }
225
+
226
+ :host([color='filled'][toggle]) {
227
+ --_background-color: var(--md-sys-color-surface-container);
228
+ --_color: var(--md-sys-color-on-surface-variant);
229
+ }
230
+
231
+ :host([color='filled'][toggle][selected]) {
232
+ --_background-color: var(--md-sys-color-primary);
233
+ --_color: var(--md-sys-color-on-primary);
234
+ }
235
+
236
+ :host([color='filled']:hover:not([disabled])) {
237
+ --_shadow: var(--md-sys-elevation-1);
238
+ }
239
+
240
+ :host([color='filled'][disabled]) {
241
+ --_background-color: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent);
242
+ --_color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
243
+ }
244
+
245
+ /* Filled Tonal Button */
246
+ :host([color='tonal']) {
247
+ --_background-color: var(--md-sys-color-secondary-container);
248
+ --_color: var(--md-sys-color-on-secondary-container);
249
+ }
250
+
251
+ :host([color='tonal'][toggle]) {
252
+ --_background-color: var(--md-sys-color-secondary-container);
253
+ --_color: var(--md-sys-color-on-secondary-container);
254
+ }
255
+
256
+ :host([color='tonal'][toggle][selected]) {
257
+ --_background-color: var(--md-sys-color-secondary);
258
+ --_color: var(--md-sys-color-on-secondary);
259
+ }
260
+
261
+ :host([color='tonal']:hover:not([disabled])) {
262
+ --_shadow: var(--md-sys-elevation-1);
263
+ }
264
+
265
+ :host([color='tonal'][disabled]) {
266
+ --_background-color: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent);
267
+ --_color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
268
+ }
269
+
270
+ /* Outlined Button */
271
+ :host([color='outlined']) {
272
+ border: 1px var(--md-sys-color-outline-variant) solid;
273
+ --_color: var(--md-sys-color-on-surface-variant);
274
+ }
275
+
276
+ :host([color='outlined'][toggle][selected]) {
277
+ --_background-color: var(--md-sys-color-inverse-surface);
278
+ --_color: var(--md-sys-color-inverse-on-surface);
279
+ }
280
+
281
+ :host([color='outlined'][disabled]) {
282
+ border-color: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent);
283
+ --_color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
284
+ }
285
+
286
+ /* Text Button */
287
+ :host([color='text']) {
288
+ --_color: var(--md-sys-color-primary);
289
+ }
290
+
291
+ :host([color='text'][disabled]) {
292
+ color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
293
+ }
294
+
295
+ :host([toggle][selected][shape='round']) {
296
+ --_pill-radius: var(--md-sys-shape-corner-medium);
297
+ }
298
+
299
+ /* Preference-based animations */
300
+ @media (prefers-reduced-motion: reduce) {
301
+ :host {
302
+ transition-duration: 0.01ms;
303
+ animation-duration: 0.01ms;
304
+ }
305
+ }
306
+
307
+ /* High contrast mode support */
308
+ @media (prefers-contrast: high) {
309
+ :host {
310
+ border-width: 2px;
311
+ }
312
+
313
+ :host([color='text']),
314
+ :host([color='outlined']) {
315
+ border-width: 2px;
316
+ border-style: solid;
317
+ }
318
+ }
319
+ `