@material/web 2.4.2-nightly.a589695.0 → 2.4.2-nightly.b4af72e.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 (605) hide show
  1. package/button/elevated-button.js +3 -3
  2. package/button/elevated-button.js.map +1 -1
  3. package/button/filled-button.js +3 -3
  4. package/button/filled-button.js.map +1 -1
  5. package/button/filled-tonal-button.js +3 -3
  6. package/button/filled-tonal-button.js.map +1 -1
  7. package/button/internal/_touch-target.scss +1 -1
  8. package/button/internal/button.d.ts +0 -4
  9. package/button/internal/button.js.map +1 -1
  10. package/button/internal/shared-styles.css +1 -1
  11. package/button/internal/shared-styles.css.map +1 -1
  12. package/button/internal/shared-styles.cssresult.js +1 -1
  13. package/button/internal/shared-styles.cssresult.js.map +1 -1
  14. package/button/outlined-button.js +2 -2
  15. package/button/outlined-button.js.map +1 -1
  16. package/button/text-button.js +2 -2
  17. package/button/text-button.js.map +1 -1
  18. package/checkbox/checkbox.js +1 -1
  19. package/checkbox/checkbox.js.map +1 -1
  20. package/checkbox/internal/checkbox.d.ts +2 -2
  21. package/checkbox/internal/checkbox.js.map +1 -1
  22. package/chips/assist-chip.js +8 -4
  23. package/chips/assist-chip.js.map +1 -1
  24. package/chips/chip-set.js +1 -1
  25. package/chips/chip-set.js.map +1 -1
  26. package/chips/filter-chip.js +5 -5
  27. package/chips/filter-chip.js.map +1 -1
  28. package/chips/input-chip.js +4 -4
  29. package/chips/input-chip.js.map +1 -1
  30. package/chips/internal/chip.d.ts +2 -0
  31. package/chips/suggestion-chip.js +8 -4
  32. package/chips/suggestion-chip.js.map +1 -1
  33. package/custom-elements.json +45050 -0
  34. package/dialog/dialog.js +1 -1
  35. package/dialog/dialog.js.map +1 -1
  36. package/divider/divider.js +1 -1
  37. package/divider/divider.js.map +1 -1
  38. package/elevation/elevation.js +1 -1
  39. package/elevation/elevation.js.map +1 -1
  40. package/fab/branded-fab.js +3 -3
  41. package/fab/branded-fab.js.map +1 -1
  42. package/fab/fab.js +8 -4
  43. package/fab/fab.js.map +1 -1
  44. package/field/filled-field.js +2 -2
  45. package/field/filled-field.js.map +1 -1
  46. package/field/outlined-field.js +2 -2
  47. package/field/outlined-field.js.map +1 -1
  48. package/focus/md-focus-ring.js +1 -1
  49. package/focus/md-focus-ring.js.map +1 -1
  50. package/icon/icon.js +1 -1
  51. package/icon/icon.js.map +1 -1
  52. package/icon/internal/icon.d.ts +1 -1
  53. package/icon/internal/icon.js +1 -1
  54. package/icon/internal/icon.js.map +1 -1
  55. package/iconbutton/filled-icon-button.js +2 -2
  56. package/iconbutton/filled-icon-button.js.map +1 -1
  57. package/iconbutton/filled-tonal-icon-button.js +2 -2
  58. package/iconbutton/filled-tonal-icon-button.js.map +1 -1
  59. package/iconbutton/icon-button.js +2 -2
  60. package/iconbutton/icon-button.js.map +1 -1
  61. package/iconbutton/internal/icon-button.d.ts +0 -4
  62. package/iconbutton/internal/icon-button.js.map +1 -1
  63. package/iconbutton/outlined-icon-button.js +2 -2
  64. package/iconbutton/outlined-icon-button.js.map +1 -1
  65. package/internal/aria/aria.d.ts +1 -1
  66. package/internal/events/dispatch-hooks.js +31 -35
  67. package/internal/events/dispatch-hooks.js.map +1 -1
  68. package/labs/badge/badge.js +1 -1
  69. package/labs/badge/badge.js.map +1 -1
  70. package/labs/behaviors/form-associated.d.ts +0 -22
  71. package/labs/behaviors/form-associated.js +0 -11
  72. package/labs/behaviors/form-associated.js.map +1 -1
  73. package/labs/card/elevated-card.js +2 -2
  74. package/labs/card/elevated-card.js.map +1 -1
  75. package/labs/card/filled-card.js +2 -2
  76. package/labs/card/filled-card.js.map +1 -1
  77. package/labs/card/outlined-card.js +2 -2
  78. package/labs/card/outlined-card.js.map +1 -1
  79. package/labs/gb/components/badge/_badge-tokens.scss +18 -0
  80. package/labs/gb/components/badge/badge.css +4 -0
  81. package/labs/gb/components/badge/badge.css.map +1 -0
  82. package/labs/gb/components/badge/badge.cssresult.js +14 -0
  83. package/labs/gb/components/badge/badge.cssresult.js.map +1 -0
  84. package/labs/gb/components/badge/badge.d.ts +32 -0
  85. package/labs/gb/components/badge/badge.js +35 -0
  86. package/labs/gb/components/badge/badge.js.map +1 -0
  87. package/labs/gb/components/badge/badge.scss +49 -0
  88. package/labs/gb/components/badge/md-badge.d.ts +21 -0
  89. package/labs/gb/components/badge/md-badge.js +53 -0
  90. package/labs/gb/components/badge/md-badge.js.map +1 -0
  91. package/labs/gb/components/button/_button-tokens.scss +194 -0
  92. package/labs/gb/components/button/button.css +4 -0
  93. package/labs/gb/components/button/button.css.map +1 -0
  94. package/labs/gb/components/button/button.cssresult.js +14 -0
  95. package/labs/gb/components/button/button.cssresult.js.map +1 -0
  96. package/labs/gb/components/button/button.d.ts +85 -0
  97. package/labs/gb/components/button/button.js +119 -0
  98. package/labs/gb/components/button/button.js.map +1 -0
  99. package/labs/gb/components/button/button.scss +132 -0
  100. package/labs/gb/components/button/md-button.d.ts +104 -0
  101. package/labs/gb/components/button/md-button.js +283 -0
  102. package/labs/gb/components/button/md-button.js.map +1 -0
  103. package/labs/gb/components/card/_card-tokens.scss +56 -0
  104. package/labs/gb/components/card/card.css +4 -0
  105. package/labs/gb/components/card/card.css.map +1 -0
  106. package/labs/gb/components/card/card.cssresult.js +14 -0
  107. package/labs/gb/components/card/card.cssresult.js.map +1 -0
  108. package/labs/gb/components/card/card.d.ts +57 -0
  109. package/labs/gb/components/card/card.js +58 -0
  110. package/labs/gb/components/card/card.js.map +1 -0
  111. package/labs/gb/components/card/card.scss +74 -0
  112. package/labs/gb/components/card/md-card.d.ts +49 -0
  113. package/labs/gb/components/card/md-card.js +173 -0
  114. package/labs/gb/components/card/md-card.js.map +1 -0
  115. package/labs/gb/components/checkbox/_checkbox-tokens.scss +66 -0
  116. package/labs/gb/components/checkbox/checkbox.css +4 -0
  117. package/labs/gb/components/checkbox/checkbox.css.map +1 -0
  118. package/labs/gb/components/checkbox/checkbox.cssresult.js +14 -0
  119. package/labs/gb/components/checkbox/checkbox.cssresult.js.map +1 -0
  120. package/labs/gb/components/checkbox/checkbox.d.ts +59 -0
  121. package/labs/gb/components/checkbox/checkbox.js +62 -0
  122. package/labs/gb/components/checkbox/checkbox.js.map +1 -0
  123. package/labs/gb/components/checkbox/checkbox.scss +105 -0
  124. package/labs/gb/components/checkbox/md-checkbox.d.ts +90 -0
  125. package/labs/gb/components/checkbox/md-checkbox.js +188 -0
  126. package/labs/gb/components/checkbox/md-checkbox.js.map +1 -0
  127. package/labs/gb/components/divider/_divider-tokens.scss +11 -0
  128. package/labs/gb/components/divider/divider.css +4 -0
  129. package/labs/gb/components/divider/divider.css.map +1 -0
  130. package/labs/gb/components/divider/divider.cssresult.js +14 -0
  131. package/labs/gb/components/divider/divider.cssresult.js.map +1 -0
  132. package/labs/gb/components/divider/divider.d.ts +44 -0
  133. package/labs/gb/components/divider/divider.js +47 -0
  134. package/labs/gb/components/divider/divider.js.map +1 -0
  135. package/labs/gb/components/divider/divider.scss +31 -0
  136. package/labs/gb/components/divider/md-divider.d.ts +27 -0
  137. package/labs/gb/components/divider/md-divider.js +55 -0
  138. package/labs/gb/components/divider/md-divider.js.map +1 -0
  139. package/labs/gb/components/fab/_fab-tokens.scss +86 -0
  140. package/labs/gb/components/fab/fab.css +4 -0
  141. package/labs/gb/components/fab/fab.css.map +1 -0
  142. package/labs/gb/components/fab/fab.cssresult.js +14 -0
  143. package/labs/gb/components/fab/fab.cssresult.js.map +1 -0
  144. package/labs/gb/components/fab/fab.d.ts +84 -0
  145. package/labs/gb/components/fab/fab.js +92 -0
  146. package/labs/gb/components/fab/fab.js.map +1 -0
  147. package/labs/gb/components/fab/fab.scss +77 -0
  148. package/labs/gb/components/fab/md-fab.d.ts +37 -0
  149. package/labs/gb/components/fab/md-fab.js +71 -0
  150. package/labs/gb/components/fab/md-fab.js.map +1 -0
  151. package/labs/gb/components/focus/focus-ring.css +4 -0
  152. package/labs/gb/components/focus/focus-ring.css.map +1 -0
  153. package/labs/gb/components/focus/focus-ring.cssresult.js +14 -0
  154. package/labs/gb/components/focus/focus-ring.cssresult.js.map +1 -0
  155. package/labs/gb/components/focus/focus-ring.d.ts +36 -0
  156. package/labs/gb/components/focus/focus-ring.js +34 -0
  157. package/labs/gb/components/focus/focus-ring.js.map +1 -0
  158. package/labs/gb/components/focus/focus-ring.scss +91 -0
  159. package/labs/gb/components/iconbutton/_icon-button-tokens.scss +204 -0
  160. package/labs/gb/components/iconbutton/icon-button.css +4 -0
  161. package/labs/gb/components/iconbutton/icon-button.css.map +1 -0
  162. package/labs/gb/components/iconbutton/icon-button.cssresult.js +14 -0
  163. package/labs/gb/components/iconbutton/icon-button.cssresult.js.map +1 -0
  164. package/labs/gb/components/iconbutton/icon-button.d.ts +97 -0
  165. package/labs/gb/components/iconbutton/icon-button.js +122 -0
  166. package/labs/gb/components/iconbutton/icon-button.js.map +1 -0
  167. package/labs/gb/components/iconbutton/icon-button.scss +153 -0
  168. package/labs/gb/components/iconbutton/md-icon-button.d.ts +87 -0
  169. package/labs/gb/components/iconbutton/md-icon-button.js +190 -0
  170. package/labs/gb/components/iconbutton/md-icon-button.js.map +1 -0
  171. package/labs/gb/components/list/_list-tokens.scss +106 -0
  172. package/labs/gb/components/list/list.css +4 -0
  173. package/labs/gb/components/list/list.css.map +1 -0
  174. package/labs/gb/components/list/list.cssresult.js +14 -0
  175. package/labs/gb/components/list/list.cssresult.js.map +1 -0
  176. package/labs/gb/components/list/list.d.ts +103 -0
  177. package/labs/gb/components/list/list.js +109 -0
  178. package/labs/gb/components/list/list.js.map +1 -0
  179. package/labs/gb/components/list/list.scss +212 -0
  180. package/labs/gb/components/list/md-list-item.d.ts +83 -0
  181. package/labs/gb/components/list/md-list-item.js +161 -0
  182. package/labs/gb/components/list/md-list-item.js.map +1 -0
  183. package/labs/gb/components/list/md-list.d.ts +31 -0
  184. package/labs/gb/components/list/md-list.js +56 -0
  185. package/labs/gb/components/list/md-list.js.map +1 -0
  186. package/labs/gb/components/menu/_menu-tokens.scss +132 -0
  187. package/labs/gb/components/menu/md-menu-group.d.ts +28 -0
  188. package/labs/gb/components/menu/md-menu-group.js +69 -0
  189. package/labs/gb/components/menu/md-menu-group.js.map +1 -0
  190. package/labs/gb/components/menu/md-menu-item.d.ts +61 -0
  191. package/labs/gb/components/menu/md-menu-item.js +197 -0
  192. package/labs/gb/components/menu/md-menu-item.js.map +1 -0
  193. package/labs/gb/components/menu/md-menu.d.ts +38 -0
  194. package/labs/gb/components/menu/md-menu.js +151 -0
  195. package/labs/gb/components/menu/md-menu.js.map +1 -0
  196. package/labs/gb/components/menu/menu.css +4 -0
  197. package/labs/gb/components/menu/menu.css.map +1 -0
  198. package/labs/gb/components/menu/menu.cssresult.js +14 -0
  199. package/labs/gb/components/menu/menu.cssresult.js.map +1 -0
  200. package/labs/gb/components/menu/menu.d.ts +117 -0
  201. package/labs/gb/components/menu/menu.js +107 -0
  202. package/labs/gb/components/menu/menu.js.map +1 -0
  203. package/labs/gb/components/menu/menu.scss +171 -0
  204. package/labs/gb/components/radio/_radio-tokens.scss +39 -0
  205. package/labs/gb/components/radio/md-radio.d.ts +71 -0
  206. package/labs/gb/components/radio/md-radio.js +195 -0
  207. package/labs/gb/components/radio/md-radio.js.map +1 -0
  208. package/labs/gb/components/radio/radio.css +4 -0
  209. package/labs/gb/components/radio/radio.css.map +1 -0
  210. package/labs/gb/components/radio/radio.cssresult.js +14 -0
  211. package/labs/gb/components/radio/radio.cssresult.js.map +1 -0
  212. package/labs/gb/components/radio/radio.d.ts +57 -0
  213. package/labs/gb/components/radio/radio.js +62 -0
  214. package/labs/gb/components/radio/radio.js.map +1 -0
  215. package/labs/gb/components/radio/radio.scss +74 -0
  216. package/labs/gb/components/ripple/ripple.css +4 -0
  217. package/labs/gb/components/ripple/ripple.css.map +1 -0
  218. package/labs/gb/components/ripple/ripple.cssresult.js +14 -0
  219. package/labs/gb/components/ripple/ripple.cssresult.js.map +1 -0
  220. package/labs/gb/components/ripple/ripple.d.ts +77 -0
  221. package/labs/gb/components/ripple/ripple.js +148 -0
  222. package/labs/gb/components/ripple/ripple.js.map +1 -0
  223. package/labs/gb/components/ripple/ripple.scss +103 -0
  224. package/labs/gb/components/shared/directives.d.ts +93 -0
  225. package/labs/gb/components/shared/directives.js +111 -0
  226. package/labs/gb/components/shared/directives.js.map +1 -0
  227. package/labs/gb/components/shared/has-slotted.d.ts +10 -0
  228. package/labs/gb/components/shared/has-slotted.js +19 -0
  229. package/labs/gb/components/shared/has-slotted.js.map +1 -0
  230. package/labs/gb/components/shared/pseudo-classes.d.ts +33 -0
  231. package/labs/gb/components/shared/pseudo-classes.js +36 -0
  232. package/labs/gb/components/shared/pseudo-classes.js.map +1 -0
  233. package/labs/gb/components/splitbutton/_split-button-tokens.scss +139 -0
  234. package/labs/gb/components/splitbutton/md-split-button.d.ts +39 -0
  235. package/labs/gb/components/splitbutton/md-split-button.js +132 -0
  236. package/labs/gb/components/splitbutton/md-split-button.js.map +1 -0
  237. package/labs/gb/components/splitbutton/split-button.css +4 -0
  238. package/labs/gb/components/splitbutton/split-button.css.map +1 -0
  239. package/labs/gb/components/splitbutton/split-button.cssresult.js +14 -0
  240. package/labs/gb/components/splitbutton/split-button.cssresult.js.map +1 -0
  241. package/labs/gb/components/splitbutton/split-button.d.ts +47 -0
  242. package/labs/gb/components/splitbutton/split-button.js +46 -0
  243. package/labs/gb/components/splitbutton/split-button.js.map +1 -0
  244. package/labs/gb/components/splitbutton/split-button.scss +164 -0
  245. package/labs/gb/components/switch/_switch-tokens.scss +58 -0
  246. package/labs/gb/components/switch/md-switch.d.ts +84 -0
  247. package/labs/gb/components/switch/md-switch.js +180 -0
  248. package/labs/gb/components/switch/md-switch.js.map +1 -0
  249. package/labs/gb/components/switch/switch.css +4 -0
  250. package/labs/gb/components/switch/switch.css.map +1 -0
  251. package/labs/gb/components/switch/switch.cssresult.js +14 -0
  252. package/labs/gb/components/switch/switch.cssresult.js.map +1 -0
  253. package/labs/gb/components/switch/switch.d.ts +54 -0
  254. package/labs/gb/components/switch/switch.js +85 -0
  255. package/labs/gb/components/switch/switch.js.map +1 -0
  256. package/labs/gb/components/switch/switch.scss +109 -0
  257. package/labs/gb/styles/adopt-styles.d.ts +41 -0
  258. package/labs/gb/styles/adopt-styles.js +62 -0
  259. package/labs/gb/styles/adopt-styles.js.map +1 -0
  260. package/labs/gb/styles/color/internal/_color-tokens.scss +95 -0
  261. package/labs/gb/styles/color/md-color-tokens-full.css +4 -0
  262. package/labs/gb/styles/color/md-color-tokens-full.css.map +1 -0
  263. package/labs/gb/styles/color/md-color-tokens-full.cssresult.js +14 -0
  264. package/labs/gb/styles/color/md-color-tokens-full.cssresult.js.map +1 -0
  265. package/labs/gb/styles/color/md-color-tokens-full.scss +17 -0
  266. package/labs/gb/styles/color/md-color-tokens.css +4 -0
  267. package/labs/gb/styles/color/md-color-tokens.css.map +1 -0
  268. package/labs/gb/styles/color/md-color-tokens.cssresult.js +14 -0
  269. package/labs/gb/styles/color/md-color-tokens.cssresult.js.map +1 -0
  270. package/labs/gb/styles/color/md-color-tokens.scss +15 -0
  271. package/labs/gb/styles/elevation/md-elevation-tokens.css +4 -0
  272. package/labs/gb/styles/elevation/md-elevation-tokens.css.map +1 -0
  273. package/labs/gb/styles/elevation/md-elevation-tokens.cssresult.js +14 -0
  274. package/labs/gb/styles/elevation/md-elevation-tokens.cssresult.js.map +1 -0
  275. package/labs/gb/styles/elevation/md-elevation-tokens.scss +25 -0
  276. package/labs/gb/styles/icon/md-icon.css +4 -0
  277. package/labs/gb/styles/icon/md-icon.css.map +1 -0
  278. package/labs/gb/styles/icon/md-icon.cssresult.js +14 -0
  279. package/labs/gb/styles/icon/md-icon.cssresult.js.map +1 -0
  280. package/labs/gb/styles/icon/md-icon.d.ts +20 -0
  281. package/labs/gb/styles/icon/md-icon.js +27 -0
  282. package/labs/gb/styles/icon/md-icon.js.map +1 -0
  283. package/labs/gb/styles/icon/md-icon.scss +63 -0
  284. package/labs/gb/styles/m3.css +25 -0
  285. package/labs/gb/styles/m3.css.map +1 -0
  286. package/labs/gb/styles/m3.cssresult.js +35 -0
  287. package/labs/gb/styles/m3.cssresult.js.map +1 -0
  288. package/labs/gb/styles/m3.scss +14 -0
  289. package/labs/gb/styles/motion/md-motion-tokens-easing.css +4 -0
  290. package/labs/gb/styles/motion/md-motion-tokens-easing.css.map +1 -0
  291. package/labs/gb/styles/motion/md-motion-tokens-easing.cssresult.js +14 -0
  292. package/labs/gb/styles/motion/md-motion-tokens-easing.cssresult.js.map +1 -0
  293. package/labs/gb/styles/motion/md-motion-tokens-easing.scss +35 -0
  294. package/labs/gb/styles/shape/md-shape-tokens.css +4 -0
  295. package/labs/gb/styles/shape/md-shape-tokens.css.map +1 -0
  296. package/labs/gb/styles/shape/md-shape-tokens.cssresult.js +14 -0
  297. package/labs/gb/styles/shape/md-shape-tokens.cssresult.js.map +1 -0
  298. package/labs/gb/styles/shape/md-shape-tokens.scss +23 -0
  299. package/labs/gb/styles/space/md-space-tokens.css +4 -0
  300. package/labs/gb/styles/space/md-space-tokens.css.map +1 -0
  301. package/labs/gb/styles/space/md-space-tokens.cssresult.js +14 -0
  302. package/labs/gb/styles/space/md-space-tokens.cssresult.js.map +1 -0
  303. package/labs/gb/styles/space/md-space-tokens.scss +28 -0
  304. package/labs/gb/styles/tailwind.css +4 -0
  305. package/labs/gb/styles/tailwind.css.map +1 -0
  306. package/labs/gb/styles/tailwind.cssresult.js +14 -0
  307. package/labs/gb/styles/tailwind.cssresult.js.map +1 -0
  308. package/labs/gb/styles/tailwind.scss +349 -0
  309. package/labs/gb/styles/typography/internal/_typography-tokens.scss +149 -0
  310. package/labs/gb/styles/typography/md-typography-tokens.css +4 -0
  311. package/labs/gb/styles/typography/md-typography-tokens.css.map +1 -0
  312. package/labs/gb/styles/typography/md-typography-tokens.cssresult.js +14 -0
  313. package/labs/gb/styles/typography/md-typography-tokens.cssresult.js.map +1 -0
  314. package/labs/gb/styles/typography/md-typography-tokens.scss +14 -0
  315. package/labs/item/item.js +1 -1
  316. package/labs/item/item.js.map +1 -1
  317. package/labs/navigationbar/navigation-bar.js +1 -1
  318. package/labs/navigationbar/navigation-bar.js.map +1 -1
  319. package/labs/navigationdrawer/navigation-drawer-modal.js +2 -2
  320. package/labs/navigationdrawer/navigation-drawer-modal.js.map +1 -1
  321. package/labs/navigationdrawer/navigation-drawer.js +2 -2
  322. package/labs/navigationdrawer/navigation-drawer.js.map +1 -1
  323. package/labs/navigationtab/navigation-tab.js +1 -1
  324. package/labs/navigationtab/navigation-tab.js.map +1 -1
  325. package/labs/segmentedbutton/outlined-segmented-button.js +2 -2
  326. package/labs/segmentedbutton/outlined-segmented-button.js.map +1 -1
  327. package/labs/segmentedbuttonset/outlined-segmented-button-set.js +2 -2
  328. package/labs/segmentedbuttonset/outlined-segmented-button-set.js.map +1 -1
  329. package/list/internal/listitem/list-item.d.ts +6 -1
  330. package/list/internal/listitem/list-item.js +4 -1
  331. package/list/internal/listitem/list-item.js.map +1 -1
  332. package/list/list-item.js +1 -1
  333. package/list/list-item.js.map +1 -1
  334. package/list/list.js +1 -1
  335. package/list/list.js.map +1 -1
  336. package/menu/internal/menuitem/menu-item.d.ts +2 -0
  337. package/menu/internal/submenu/sub-menu.d.ts +5 -1
  338. package/menu/internal/submenu/sub-menu.js +5 -1
  339. package/menu/internal/submenu/sub-menu.js.map +1 -1
  340. package/menu/menu-item.js +1 -1
  341. package/menu/menu-item.js.map +1 -1
  342. package/menu/menu.js +1 -1
  343. package/menu/menu.js.map +1 -1
  344. package/menu/sub-menu.js +1 -1
  345. package/menu/sub-menu.js.map +1 -1
  346. package/package.json +54 -27
  347. package/progress/circular-progress.js +1 -1
  348. package/progress/circular-progress.js.map +1 -1
  349. package/progress/linear-progress.js +1 -1
  350. package/progress/linear-progress.js.map +1 -1
  351. package/radio/internal/radio.d.ts +0 -2
  352. package/radio/internal/radio.js.map +1 -1
  353. package/radio/radio.js +1 -1
  354. package/radio/radio.js.map +1 -1
  355. package/ripple/ripple.js +1 -1
  356. package/ripple/ripple.js.map +1 -1
  357. package/select/filled-select.js +2 -2
  358. package/select/filled-select.js.map +1 -1
  359. package/select/internal/select.d.ts +2 -2
  360. package/select/internal/select.js.map +1 -1
  361. package/select/internal/selectoption/select-option.d.ts +2 -0
  362. package/select/outlined-select.js +2 -2
  363. package/select/outlined-select.js.map +1 -1
  364. package/select/select-option.js +1 -1
  365. package/select/select-option.js.map +1 -1
  366. package/slider/internal/slider.d.ts +0 -2
  367. package/slider/internal/slider.js.map +1 -1
  368. package/slider/slider.js +2 -2
  369. package/slider/slider.js.map +1 -1
  370. package/switch/internal/_switch.scss +1 -0
  371. package/switch/internal/switch-styles.css +1 -1
  372. package/switch/internal/switch-styles.css.map +1 -1
  373. package/switch/internal/switch-styles.cssresult.js +1 -1
  374. package/switch/internal/switch-styles.cssresult.js.map +1 -1
  375. package/switch/internal/switch.d.ts +0 -2
  376. package/switch/internal/switch.js.map +1 -1
  377. package/switch/switch.js +1 -1
  378. package/switch/switch.js.map +1 -1
  379. package/tabs/primary-tab.js +2 -2
  380. package/tabs/primary-tab.js.map +1 -1
  381. package/tabs/secondary-tab.js +2 -2
  382. package/tabs/secondary-tab.js.map +1 -1
  383. package/tabs/tabs.js +1 -1
  384. package/tabs/tabs.js.map +1 -1
  385. package/textfield/filled-text-field.js +2 -2
  386. package/textfield/filled-text-field.js.map +1 -1
  387. package/textfield/outlined-text-field.js +2 -2
  388. package/textfield/outlined-text-field.js.map +1 -1
  389. package/types/css-imports.d.ts +12 -0
  390. package/typography/md-typescale-styles.d.ts +6 -3
  391. package/typography/md-typescale-styles.js +1 -5
  392. package/typography/md-typescale-styles.js.map +1 -1
  393. package/button/internal/elevated-styles.js +0 -11
  394. package/button/internal/elevated-styles.js.map +0 -1
  395. package/button/internal/filled-styles.js +0 -11
  396. package/button/internal/filled-styles.js.map +0 -1
  397. package/button/internal/filled-tonal-styles.js +0 -11
  398. package/button/internal/filled-tonal-styles.js.map +0 -1
  399. package/button/internal/outlined-styles.js +0 -11
  400. package/button/internal/outlined-styles.js.map +0 -1
  401. package/button/internal/shared-elevation-styles.js +0 -11
  402. package/button/internal/shared-elevation-styles.js.map +0 -1
  403. package/button/internal/shared-styles.js +0 -11
  404. package/button/internal/shared-styles.js.map +0 -1
  405. package/button/internal/text-styles.js +0 -11
  406. package/button/internal/text-styles.js.map +0 -1
  407. package/checkbox/internal/checkbox-styles.js +0 -11
  408. package/checkbox/internal/checkbox-styles.js.map +0 -1
  409. package/chips/internal/assist-styles.js +0 -11
  410. package/chips/internal/assist-styles.js.map +0 -1
  411. package/chips/internal/chip-set-styles.js +0 -11
  412. package/chips/internal/chip-set-styles.js.map +0 -1
  413. package/chips/internal/elevated-styles.js +0 -11
  414. package/chips/internal/elevated-styles.js.map +0 -1
  415. package/chips/internal/filter-styles.js +0 -11
  416. package/chips/internal/filter-styles.js.map +0 -1
  417. package/chips/internal/input-styles.js +0 -11
  418. package/chips/internal/input-styles.js.map +0 -1
  419. package/chips/internal/selectable-styles.js +0 -11
  420. package/chips/internal/selectable-styles.js.map +0 -1
  421. package/chips/internal/shared-styles.js +0 -11
  422. package/chips/internal/shared-styles.js.map +0 -1
  423. package/chips/internal/suggestion-styles.js +0 -11
  424. package/chips/internal/suggestion-styles.js.map +0 -1
  425. package/chips/internal/trailing-icon-styles.js +0 -11
  426. package/chips/internal/trailing-icon-styles.js.map +0 -1
  427. package/dialog/internal/dialog-styles.js +0 -11
  428. package/dialog/internal/dialog-styles.js.map +0 -1
  429. package/divider/internal/divider-styles.js +0 -11
  430. package/divider/internal/divider-styles.js.map +0 -1
  431. package/elevation/internal/elevation-styles.js +0 -11
  432. package/elevation/internal/elevation-styles.js.map +0 -1
  433. package/fab/internal/fab-branded-styles.js +0 -11
  434. package/fab/internal/fab-branded-styles.js.map +0 -1
  435. package/fab/internal/fab-styles.js +0 -11
  436. package/fab/internal/fab-styles.js.map +0 -1
  437. package/fab/internal/forced-colors-styles.js +0 -11
  438. package/fab/internal/forced-colors-styles.js.map +0 -1
  439. package/fab/internal/shared-styles.js +0 -11
  440. package/fab/internal/shared-styles.js.map +0 -1
  441. package/field/internal/filled-styles.d.ts +0 -3
  442. package/field/internal/filled-styles.js +0 -11
  443. package/field/internal/filled-styles.js.map +0 -1
  444. package/field/internal/outlined-styles.d.ts +0 -3
  445. package/field/internal/outlined-styles.js +0 -11
  446. package/field/internal/outlined-styles.js.map +0 -1
  447. package/field/internal/shared-styles.d.ts +0 -3
  448. package/field/internal/shared-styles.js +0 -11
  449. package/field/internal/shared-styles.js.map +0 -1
  450. package/focus/internal/focus-ring-styles.d.ts +0 -3
  451. package/focus/internal/focus-ring-styles.js +0 -11
  452. package/focus/internal/focus-ring-styles.js.map +0 -1
  453. package/icon/internal/icon-styles.d.ts +0 -3
  454. package/icon/internal/icon-styles.js +0 -11
  455. package/icon/internal/icon-styles.js.map +0 -1
  456. package/iconbutton/internal/filled-styles.d.ts +0 -3
  457. package/iconbutton/internal/filled-styles.js +0 -11
  458. package/iconbutton/internal/filled-styles.js.map +0 -1
  459. package/iconbutton/internal/filled-tonal-styles.d.ts +0 -3
  460. package/iconbutton/internal/filled-tonal-styles.js +0 -11
  461. package/iconbutton/internal/filled-tonal-styles.js.map +0 -1
  462. package/iconbutton/internal/outlined-styles.d.ts +0 -3
  463. package/iconbutton/internal/outlined-styles.js +0 -11
  464. package/iconbutton/internal/outlined-styles.js.map +0 -1
  465. package/iconbutton/internal/shared-styles.d.ts +0 -3
  466. package/iconbutton/internal/shared-styles.js +0 -11
  467. package/iconbutton/internal/shared-styles.js.map +0 -1
  468. package/iconbutton/internal/standard-styles.d.ts +0 -3
  469. package/iconbutton/internal/standard-styles.js +0 -11
  470. package/iconbutton/internal/standard-styles.js.map +0 -1
  471. package/labs/badge/internal/badge-styles.d.ts +0 -3
  472. package/labs/badge/internal/badge-styles.js +0 -11
  473. package/labs/badge/internal/badge-styles.js.map +0 -1
  474. package/labs/card/internal/elevated-styles.d.ts +0 -3
  475. package/labs/card/internal/elevated-styles.js +0 -11
  476. package/labs/card/internal/elevated-styles.js.map +0 -1
  477. package/labs/card/internal/filled-styles.d.ts +0 -3
  478. package/labs/card/internal/filled-styles.js +0 -11
  479. package/labs/card/internal/filled-styles.js.map +0 -1
  480. package/labs/card/internal/outlined-styles.d.ts +0 -3
  481. package/labs/card/internal/outlined-styles.js +0 -11
  482. package/labs/card/internal/outlined-styles.js.map +0 -1
  483. package/labs/card/internal/shared-styles.d.ts +0 -3
  484. package/labs/card/internal/shared-styles.js +0 -11
  485. package/labs/card/internal/shared-styles.js.map +0 -1
  486. package/labs/item/internal/item-styles.d.ts +0 -3
  487. package/labs/item/internal/item-styles.js +0 -11
  488. package/labs/item/internal/item-styles.js.map +0 -1
  489. package/labs/navigationbar/internal/navigation-bar-styles.d.ts +0 -3
  490. package/labs/navigationbar/internal/navigation-bar-styles.js +0 -11
  491. package/labs/navigationbar/internal/navigation-bar-styles.js.map +0 -1
  492. package/labs/navigationdrawer/internal/navigation-drawer-modal-styles.d.ts +0 -3
  493. package/labs/navigationdrawer/internal/navigation-drawer-modal-styles.js +0 -11
  494. package/labs/navigationdrawer/internal/navigation-drawer-modal-styles.js.map +0 -1
  495. package/labs/navigationdrawer/internal/navigation-drawer-styles.d.ts +0 -3
  496. package/labs/navigationdrawer/internal/navigation-drawer-styles.js +0 -11
  497. package/labs/navigationdrawer/internal/navigation-drawer-styles.js.map +0 -1
  498. package/labs/navigationdrawer/internal/shared-styles.d.ts +0 -3
  499. package/labs/navigationdrawer/internal/shared-styles.js +0 -11
  500. package/labs/navigationdrawer/internal/shared-styles.js.map +0 -1
  501. package/labs/navigationtab/internal/navigation-tab-styles.d.ts +0 -3
  502. package/labs/navigationtab/internal/navigation-tab-styles.js +0 -11
  503. package/labs/navigationtab/internal/navigation-tab-styles.js.map +0 -1
  504. package/labs/segmentedbutton/internal/outlined-styles.d.ts +0 -3
  505. package/labs/segmentedbutton/internal/outlined-styles.js +0 -11
  506. package/labs/segmentedbutton/internal/outlined-styles.js.map +0 -1
  507. package/labs/segmentedbutton/internal/shared-styles.d.ts +0 -3
  508. package/labs/segmentedbutton/internal/shared-styles.js +0 -11
  509. package/labs/segmentedbutton/internal/shared-styles.js.map +0 -1
  510. package/labs/segmentedbuttonset/internal/outlined-styles.d.ts +0 -3
  511. package/labs/segmentedbuttonset/internal/outlined-styles.js +0 -11
  512. package/labs/segmentedbuttonset/internal/outlined-styles.js.map +0 -1
  513. package/labs/segmentedbuttonset/internal/shared-styles.d.ts +0 -3
  514. package/labs/segmentedbuttonset/internal/shared-styles.js +0 -11
  515. package/labs/segmentedbuttonset/internal/shared-styles.js.map +0 -1
  516. package/list/internal/list-styles.d.ts +0 -3
  517. package/list/internal/list-styles.js +0 -11
  518. package/list/internal/list-styles.js.map +0 -1
  519. package/list/internal/listitem/list-item-styles.d.ts +0 -3
  520. package/list/internal/listitem/list-item-styles.js +0 -11
  521. package/list/internal/listitem/list-item-styles.js.map +0 -1
  522. package/menu/internal/menu-styles.d.ts +0 -3
  523. package/menu/internal/menu-styles.js +0 -11
  524. package/menu/internal/menu-styles.js.map +0 -1
  525. package/menu/internal/menuitem/menu-item-styles.d.ts +0 -3
  526. package/menu/internal/menuitem/menu-item-styles.js +0 -11
  527. package/menu/internal/menuitem/menu-item-styles.js.map +0 -1
  528. package/menu/internal/submenu/sub-menu-styles.d.ts +0 -3
  529. package/menu/internal/submenu/sub-menu-styles.js +0 -11
  530. package/menu/internal/submenu/sub-menu-styles.js.map +0 -1
  531. package/progress/internal/circular-progress-styles.d.ts +0 -3
  532. package/progress/internal/circular-progress-styles.js +0 -11
  533. package/progress/internal/circular-progress-styles.js.map +0 -1
  534. package/progress/internal/linear-progress-styles.d.ts +0 -3
  535. package/progress/internal/linear-progress-styles.js +0 -11
  536. package/progress/internal/linear-progress-styles.js.map +0 -1
  537. package/radio/internal/radio-styles.d.ts +0 -3
  538. package/radio/internal/radio-styles.js +0 -11
  539. package/radio/internal/radio-styles.js.map +0 -1
  540. package/ripple/internal/ripple-styles.d.ts +0 -3
  541. package/ripple/internal/ripple-styles.js +0 -11
  542. package/ripple/internal/ripple-styles.js.map +0 -1
  543. package/select/internal/filled-select-styles.d.ts +0 -3
  544. package/select/internal/filled-select-styles.js +0 -11
  545. package/select/internal/filled-select-styles.js.map +0 -1
  546. package/select/internal/outlined-select-styles.d.ts +0 -3
  547. package/select/internal/outlined-select-styles.js +0 -11
  548. package/select/internal/outlined-select-styles.js.map +0 -1
  549. package/select/internal/shared-styles.d.ts +0 -3
  550. package/select/internal/shared-styles.js +0 -11
  551. package/select/internal/shared-styles.js.map +0 -1
  552. package/slider/internal/forced-colors-styles.d.ts +0 -3
  553. package/slider/internal/forced-colors-styles.js +0 -11
  554. package/slider/internal/forced-colors-styles.js.map +0 -1
  555. package/slider/internal/slider-styles.d.ts +0 -3
  556. package/slider/internal/slider-styles.js +0 -11
  557. package/slider/internal/slider-styles.js.map +0 -1
  558. package/switch/internal/switch-styles.d.ts +0 -3
  559. package/switch/internal/switch-styles.js +0 -11
  560. package/switch/internal/switch-styles.js.map +0 -1
  561. package/tabs/internal/primary-tab-styles.d.ts +0 -3
  562. package/tabs/internal/primary-tab-styles.js +0 -11
  563. package/tabs/internal/primary-tab-styles.js.map +0 -1
  564. package/tabs/internal/secondary-tab-styles.d.ts +0 -3
  565. package/tabs/internal/secondary-tab-styles.js +0 -11
  566. package/tabs/internal/secondary-tab-styles.js.map +0 -1
  567. package/tabs/internal/tab-styles.d.ts +0 -3
  568. package/tabs/internal/tab-styles.js +0 -11
  569. package/tabs/internal/tab-styles.js.map +0 -1
  570. package/tabs/internal/tabs-styles.d.ts +0 -3
  571. package/tabs/internal/tabs-styles.js +0 -11
  572. package/tabs/internal/tabs-styles.js.map +0 -1
  573. package/textfield/internal/filled-styles.d.ts +0 -3
  574. package/textfield/internal/filled-styles.js +0 -11
  575. package/textfield/internal/filled-styles.js.map +0 -1
  576. package/textfield/internal/outlined-styles.d.ts +0 -3
  577. package/textfield/internal/outlined-styles.js +0 -11
  578. package/textfield/internal/outlined-styles.js.map +0 -1
  579. package/textfield/internal/shared-styles.d.ts +0 -3
  580. package/textfield/internal/shared-styles.js +0 -11
  581. package/textfield/internal/shared-styles.js.map +0 -1
  582. /package/{button/internal/elevated-styles.d.ts → labs/gb/components/badge/badge.cssresult.d.ts} +0 -0
  583. /package/{button/internal/filled-styles.d.ts → labs/gb/components/button/button.cssresult.d.ts} +0 -0
  584. /package/{button/internal/filled-tonal-styles.d.ts → labs/gb/components/card/card.cssresult.d.ts} +0 -0
  585. /package/{button/internal/outlined-styles.d.ts → labs/gb/components/checkbox/checkbox.cssresult.d.ts} +0 -0
  586. /package/{button/internal/shared-elevation-styles.d.ts → labs/gb/components/divider/divider.cssresult.d.ts} +0 -0
  587. /package/{button/internal/shared-styles.d.ts → labs/gb/components/fab/fab.cssresult.d.ts} +0 -0
  588. /package/{button/internal/text-styles.d.ts → labs/gb/components/focus/focus-ring.cssresult.d.ts} +0 -0
  589. /package/{checkbox/internal/checkbox-styles.d.ts → labs/gb/components/iconbutton/icon-button.cssresult.d.ts} +0 -0
  590. /package/{chips/internal/assist-styles.d.ts → labs/gb/components/list/list.cssresult.d.ts} +0 -0
  591. /package/{chips/internal/chip-set-styles.d.ts → labs/gb/components/menu/menu.cssresult.d.ts} +0 -0
  592. /package/{chips/internal/elevated-styles.d.ts → labs/gb/components/radio/radio.cssresult.d.ts} +0 -0
  593. /package/{chips/internal/filter-styles.d.ts → labs/gb/components/ripple/ripple.cssresult.d.ts} +0 -0
  594. /package/{chips/internal/input-styles.d.ts → labs/gb/components/splitbutton/split-button.cssresult.d.ts} +0 -0
  595. /package/{chips/internal/selectable-styles.d.ts → labs/gb/components/switch/switch.cssresult.d.ts} +0 -0
  596. /package/{chips/internal/shared-styles.d.ts → labs/gb/styles/color/md-color-tokens-full.cssresult.d.ts} +0 -0
  597. /package/{chips/internal/suggestion-styles.d.ts → labs/gb/styles/color/md-color-tokens.cssresult.d.ts} +0 -0
  598. /package/{chips/internal/trailing-icon-styles.d.ts → labs/gb/styles/elevation/md-elevation-tokens.cssresult.d.ts} +0 -0
  599. /package/{dialog/internal/dialog-styles.d.ts → labs/gb/styles/icon/md-icon.cssresult.d.ts} +0 -0
  600. /package/{divider/internal/divider-styles.d.ts → labs/gb/styles/m3.cssresult.d.ts} +0 -0
  601. /package/{elevation/internal/elevation-styles.d.ts → labs/gb/styles/motion/md-motion-tokens-easing.cssresult.d.ts} +0 -0
  602. /package/{fab/internal/fab-branded-styles.d.ts → labs/gb/styles/shape/md-shape-tokens.cssresult.d.ts} +0 -0
  603. /package/{fab/internal/fab-styles.d.ts → labs/gb/styles/space/md-space-tokens.cssresult.d.ts} +0 -0
  604. /package/{fab/internal/forced-colors-styles.d.ts → labs/gb/styles/tailwind.cssresult.d.ts} +0 -0
  605. /package/{fab/internal/shared-styles.d.ts → labs/gb/styles/typography/md-typography-tokens.cssresult.d.ts} +0 -0
@@ -0,0 +1,58 @@
1
+ //
2
+ // Copyright 2026 Google LLC
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ //
5
+
6
+ @mixin root {
7
+ // LINT.IfChange
8
+ --handle-color: var(--md-sys-color-outline);
9
+ --handle-size: 16px;
10
+ --with-icon-handle-size: 24px;
11
+ --icon-color: var(--md-sys-color-surface-container-highest);
12
+ --icon-size: 18px;
13
+ --state-layer-color: var(--md-sys-color-on-surface);
14
+ --state-layer-size: 40px;
15
+ --track-color: var(--md-sys-color-surface-container-highest);
16
+ --track-height: 32px;
17
+ --track-outline-color: var(--md-sys-color-outline);
18
+ --track-outline-width: 2px;
19
+ --track-width: 52px;
20
+ // LINT.ThenChange(md-switch.ts) keep in sync with `@cssprop` jsdoc tags
21
+ }
22
+
23
+ @mixin hovered {
24
+ --handle-color: var(--md-sys-color-on-surface-variant);
25
+ }
26
+
27
+ @mixin selected {
28
+ --track-color: var(--md-sys-color-primary);
29
+ --track-outline-color: transparent;
30
+ --handle-color: var(--md-sys-color-on-primary);
31
+ --handle-size: 24px;
32
+ --icon-color: var(--md-sys-color-on-primary-container);
33
+ --state-layer-color: var(--md-sys-color-primary);
34
+ }
35
+
36
+ @mixin selected-hovered {
37
+ --handle-color: var(--md-sys-color-primary-container);
38
+ }
39
+
40
+ @mixin pressed {
41
+ --handle-size: 28px;
42
+ }
43
+
44
+ @mixin disabled {
45
+ --handle-color: hsl(from var(--md-sys-color-on-surface) h s l / 38%);
46
+ --track-color: hsl(
47
+ from var(--md-sys-color-surface-container-highest) h s l / 12%
48
+ );
49
+ --track-outline-color: hsl(
50
+ from var(--md-sys-color-on-surface) h s l / 12%
51
+ );
52
+ }
53
+
54
+ @mixin disabled-selected {
55
+ --handle-color: var(--md-sys-color-surface);
56
+ --icon-color: hsl(from var(--md-sys-color-on-surface) h s l / 38%);
57
+ --track-color: hsl(from var(--md-sys-color-on-surface) h s l / 12%);
58
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { CSSResultOrNative, LitElement } from 'lit';
7
+ import { createValidator, getValidityAnchor } from '../../../behaviors/constraint-validation.js';
8
+ import { getFormState, getFormValue } from '../../../behaviors/form-associated.js';
9
+ import { CheckboxValidator } from '../../../behaviors/validators/checkbox-validator.js';
10
+ declare global {
11
+ interface HTMLElementTagNameMap {
12
+ /** A Material Design switch component. */
13
+ 'md-gb-switch': Switch;
14
+ }
15
+ }
16
+ declare const baseClass: import("@material/web/labs/behaviors/mixin.js").MixinReturn<import("@material/web/labs/behaviors/mixin.js").MixinReturn<import("@material/web/labs/behaviors/mixin.js").MixinReturn<(abstract new (...args: any[]) => import("../../../behaviors/custom-state-set.js").WithCustomStateSet) & (abstract new (...args: any[]) => import("../../../behaviors/element-internals.js").WithElementInternals) & typeof LitElement & import("../../../behaviors/form-associated.js").FormAssociatedConstructor, import("../../../behaviors/form-associated.js").FormAssociated>, import("../../../behaviors/constraint-validation.js").ConstraintValidation>>;
17
+ /**
18
+ * A Material Design switch component.
19
+ *
20
+ * @slot off-icon - Used to show an icon when the switch is unselected.
21
+ * @slot on-icon - Used to show an icon when the switch is selected.
22
+ * @fires {InputEvent} input - Fired when the switch is selected or unselected. --bubbles --composed
23
+ * @fires {Event} change - Fired when the switch is selected or unselected. --bubbles
24
+ * @csspart switch - The switch's root element.
25
+ * @cssprop --handle-color
26
+ * @cssprop --handle-size
27
+ * @cssprop --with-icon-handle-size
28
+ * @cssprop --icon-color
29
+ * @cssprop --icon-size
30
+ * @cssprop --state-layer-color
31
+ * @cssprop --state-layer-size
32
+ * @cssprop --track-color
33
+ * @cssprop --track-height
34
+ * @cssprop --track-outline-color
35
+ * @cssprop --track-outline-width
36
+ * @cssprop --track-width
37
+ */
38
+ export declare class Switch extends baseClass {
39
+ /** @nocollapse */
40
+ static shadowRootOptions: ShadowRootInit;
41
+ static styles: CSSResultOrNative[];
42
+ /**
43
+ * Puts the switch in the selected state and sets the form submission value to
44
+ * the `value` property.
45
+ */
46
+ get selected(): boolean;
47
+ set selected(value: boolean);
48
+ /**
49
+ * The default selected state of the switch.
50
+ */
51
+ get defaultSelected(): boolean;
52
+ set defaultSelected(value: boolean);
53
+ /**
54
+ * When true, require the switch to be selected when participating in
55
+ * form submission.
56
+ *
57
+ * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#validation
58
+ */
59
+ required: boolean;
60
+ /**
61
+ * The value associated with this switch on form submission. `null` is
62
+ * submitted when `selected` is `false`.
63
+ */
64
+ value: string;
65
+ private readonly button;
66
+ /**
67
+ * Mimics the behavior of <input> dirty checkedness, where the `checked`
68
+ * attribute only updates the checked state if the checkbox has not been
69
+ * interacted with.
70
+ *
71
+ * @see https://html.spec.whatwg.org/multipage/input.html#concept-input-checked-dirty-flag
72
+ */
73
+ private dirtyCheckedness;
74
+ protected render(): import("lit-html").TemplateResult<1>;
75
+ private handleChange;
76
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
77
+ [getFormValue](): string;
78
+ [getFormState](): string;
79
+ formResetCallback(): void;
80
+ formStateRestoreCallback(state: string): void;
81
+ [createValidator](): CheckboxValidator;
82
+ [getValidityAnchor](): HTMLButtonElement;
83
+ }
84
+ export {};
@@ -0,0 +1,180 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { __decorate } from "tslib";
7
+ import { css, html, LitElement, nothing } from 'lit';
8
+ import { customElement, property, query } from 'lit/decorators.js';
9
+ import { mixinDelegatesAria } from '../../../../internal/aria/delegate.js';
10
+ import { redispatchEvent } from '../../../../internal/events/redispatch-event.js';
11
+ import { createValidator, getValidityAnchor, mixinConstraintValidation, } from '../../../behaviors/constraint-validation.js';
12
+ import { hasState, mixinCustomStateSet, toggleState, } from '../../../behaviors/custom-state-set.js';
13
+ import { mixinElementInternals } from '../../../behaviors/element-internals.js';
14
+ import { getFormState, getFormValue, mixinFormAssociated, } from '../../../behaviors/form-associated.js';
15
+ import { CheckboxValidator } from '../../../behaviors/validators/checkbox-validator.js';
16
+ import { hasSlotted } from '../shared/has-slotted.js';
17
+ import focusRingStyles from '../focus/focus-ring.css' with { type: 'css' }; // github-only
18
+ // import focusRingStyles from '../focus/focus-ring.cssresult.js'; // google3-only
19
+ import rippleStyles from '../ripple/ripple.css' with { type: 'css' }; // github-only
20
+ // import rippleStyles from '../ripple/ripple.cssresult.js'; // google3-only
21
+ import switchStyles from './switch.css' with { type: 'css' }; // github-only
22
+ // import switchStyles from './switch.cssresult.js'; // google3-only
23
+ import { switchToggle } from './switch.js';
24
+ // Separate variable needed for closure.
25
+ const baseClass = mixinDelegatesAria(mixinConstraintValidation(mixinFormAssociated(mixinCustomStateSet(mixinElementInternals(LitElement)))));
26
+ /**
27
+ * A Material Design switch component.
28
+ *
29
+ * @slot off-icon - Used to show an icon when the switch is unselected.
30
+ * @slot on-icon - Used to show an icon when the switch is selected.
31
+ * @fires {InputEvent} input - Fired when the switch is selected or unselected. --bubbles --composed
32
+ * @fires {Event} change - Fired when the switch is selected or unselected. --bubbles
33
+ * @csspart switch - The switch's root element.
34
+ * @cssprop --handle-color
35
+ * @cssprop --handle-size
36
+ * @cssprop --with-icon-handle-size
37
+ * @cssprop --icon-color
38
+ * @cssprop --icon-size
39
+ * @cssprop --state-layer-color
40
+ * @cssprop --state-layer-size
41
+ * @cssprop --track-color
42
+ * @cssprop --track-height
43
+ * @cssprop --track-outline-color
44
+ * @cssprop --track-outline-width
45
+ * @cssprop --track-width
46
+ */
47
+ let Switch = class Switch extends baseClass {
48
+ constructor() {
49
+ super(...arguments);
50
+ /**
51
+ * When true, require the switch to be selected when participating in
52
+ * form submission.
53
+ *
54
+ * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#validation
55
+ */
56
+ this.required = false;
57
+ /**
58
+ * The value associated with this switch on form submission. `null` is
59
+ * submitted when `selected` is `false`.
60
+ */
61
+ this.value = 'on';
62
+ /**
63
+ * Mimics the behavior of <input> dirty checkedness, where the `checked`
64
+ * attribute only updates the checked state if the checkbox has not been
65
+ * interacted with.
66
+ *
67
+ * @see https://html.spec.whatwg.org/multipage/input.html#concept-input-checked-dirty-flag
68
+ */
69
+ this.dirtyCheckedness = false;
70
+ }
71
+ /**
72
+ * Puts the switch in the selected state and sets the form submission value to
73
+ * the `value` property.
74
+ */
75
+ get selected() {
76
+ return this[hasState]('selected');
77
+ }
78
+ set selected(value) {
79
+ this[toggleState]('selected', value);
80
+ }
81
+ /**
82
+ * The default selected state of the switch.
83
+ */
84
+ get defaultSelected() {
85
+ return this.hasAttribute('selected');
86
+ }
87
+ set defaultSelected(value) {
88
+ this.toggleAttribute('selected', value || false);
89
+ }
90
+ render() {
91
+ const { ariaLabel } = this;
92
+ return html `
93
+ <button
94
+ role="switch"
95
+ part="switch"
96
+ class="${switchToggle()}"
97
+ aria-checked="${this.selected ? 'true' : 'false'}"
98
+ aria-label=${ariaLabel || nothing}
99
+ ?disabled=${this.disabled}
100
+ @change=${this.handleChange}>
101
+ <slot name="off-icon" class="switch-icon-off" ${hasSlotted()}></slot>
102
+ <slot name="on-icon" class="switch-icon-on"></slot>
103
+ </button>
104
+ `;
105
+ }
106
+ handleChange(event) {
107
+ this.dirtyCheckedness = true;
108
+ this.selected = this.button?.ariaChecked === 'true';
109
+ // Change event is not composed, re-dispatch it.
110
+ redispatchEvent(this, event);
111
+ }
112
+ attributeChangedCallback(name, oldValue, newValue) {
113
+ if (name === 'selected' && this.dirtyCheckedness) {
114
+ // The 'selected' attribute does not update switches that have been
115
+ // interacted with.
116
+ return;
117
+ }
118
+ super.attributeChangedCallback(name, oldValue, newValue);
119
+ }
120
+ [getFormValue]() {
121
+ return this.selected ? this.value : null;
122
+ }
123
+ [getFormState]() {
124
+ return String(this.selected);
125
+ }
126
+ formResetCallback() {
127
+ this.dirtyCheckedness = false;
128
+ this.selected = this.defaultSelected;
129
+ }
130
+ formStateRestoreCallback(state) {
131
+ this.selected = state === 'true';
132
+ }
133
+ [createValidator]() {
134
+ return new CheckboxValidator(() => ({
135
+ checked: this.selected,
136
+ required: this.required,
137
+ }));
138
+ }
139
+ [getValidityAnchor]() {
140
+ return this.button;
141
+ }
142
+ };
143
+ /** @nocollapse */
144
+ Switch.shadowRootOptions = {
145
+ mode: 'open',
146
+ delegatesFocus: true,
147
+ };
148
+ Switch.styles = [
149
+ focusRingStyles,
150
+ rippleStyles,
151
+ switchStyles,
152
+ css `
153
+ :host {
154
+ display: inline-flex;
155
+ }
156
+ .switch {
157
+ flex: 1;
158
+ }
159
+ ::slotted(*) {
160
+ grid-area: handle;
161
+ }
162
+ `,
163
+ ];
164
+ __decorate([
165
+ property({ type: Boolean })
166
+ ], Switch.prototype, "selected", null);
167
+ __decorate([
168
+ property({ type: Boolean })
169
+ ], Switch.prototype, "required", void 0);
170
+ __decorate([
171
+ property()
172
+ ], Switch.prototype, "value", void 0);
173
+ __decorate([
174
+ query('button', true)
175
+ ], Switch.prototype, "button", void 0);
176
+ Switch = __decorate([
177
+ customElement('md-gb-switch')
178
+ ], Switch);
179
+ export { Switch };
180
+ //# sourceMappingURL=md-switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md-switch.js","sourceRoot":"","sources":["md-switch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,EAAC,GAAG,EAAqB,IAAI,EAAE,UAAU,EAAE,OAAO,EAAC,MAAM,KAAK,CAAC;AACtE,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAC,eAAe,EAAC,MAAM,iDAAiD,CAAC;AAChF,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,WAAW,GACZ,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAC,qBAAqB,EAAC,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAC,iBAAiB,EAAC,MAAM,qDAAqD,CAAC;AACtF,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAEpD,OAAO,eAAe,MAAM,yBAAyB,CAAC,OAAM,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC,cAAc;AACxF,kFAAkF;AAClF,OAAO,YAAY,MAAM,sBAAsB,CAAC,OAAM,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC,cAAc;AAClF,4EAA4E;AAC5E,OAAO,YAAY,MAAM,cAAc,CAAC,OAAM,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC,cAAc;AAC1E,oEAAoE;AAEpE,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AASzC,wCAAwC;AACxC,MAAM,SAAS,GAAG,kBAAkB,CAClC,yBAAyB,CACvB,mBAAmB,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,CAC5E,CACF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AAEI,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,SAAS;IAA9B;;QA8CL;;;;;WAKG;QACwB,aAAQ,GAAG,KAAK,CAAC;QAE5C;;;WAGG;QACS,UAAK,GAAG,IAAI,CAAC;QAKzB;;;;;;WAMG;QACK,qBAAgB,GAAG,KAAK,CAAC;IAmEnC,CAAC;IAjHC;;;OAGG;IAEH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,QAAQ,CAAC,KAAc;QACzB,IAAI,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,eAAe,CAAC,KAAc;QAChC,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC;IACnD,CAAC;IA4BkB,MAAM;QACvB,MAAM,EAAC,SAAS,EAAC,GAAG,IAAuB,CAAC;QAC5C,OAAO,IAAI,CAAA;;;;iBAIE,YAAY,EAAE;wBACP,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;qBACnC,SAAS,IAAI,OAAO;oBACrB,IAAI,CAAC,QAAQ;kBACf,IAAI,CAAC,YAAY;wDACqB,UAAU,EAAE;;;KAG/D,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,KAAY;QAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,CAAC;QACpD,gDAAgD;QAChD,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAEQ,wBAAwB,CAC/B,IAAY,EACZ,QAAuB,EACvB,QAAuB;QAEvB,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjD,mEAAmE;YACnE,mBAAmB;YACnB,OAAO;QACT,CAAC;QAED,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAEQ,CAAC,YAAY,CAAC;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAEQ,CAAC,YAAY,CAAC;QACrB,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAEQ,iBAAiB;QACxB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;IACvC,CAAC;IAEQ,wBAAwB,CAAC,KAAa;QAC7C,IAAI,CAAC,QAAQ,GAAG,KAAK,KAAK,MAAM,CAAC;IACnC,CAAC;IAEQ,CAAC,eAAe,CAAC;QACxB,OAAO,IAAI,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC;YAClC,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAEQ,CAAC,iBAAiB,CAAC;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;;AAvID,kBAAkB;AACF,wBAAiB,GAAmB;IAClD,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,IAAI;CACrB,AAHgC,CAG/B;AAEc,aAAM,GAAwB;IAC5C,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,GAAG,CAAA;;;;;;;;;;KAUF;CACF,AAfqB,CAepB;AAOF;IADC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;sCAGzB;AAqB0B;IAA1B,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;wCAAkB;AAMhC;IAAX,QAAQ,EAAE;qCAAc;AAGR;IADhB,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;sCAC6B;AA7DxC,MAAM;IADlB,aAAa,CAAC,cAAc,CAAC;GACjB,MAAM,CAyIlB","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {css, CSSResultOrNative, html, LitElement, nothing} from 'lit';\nimport {customElement, property, query} from 'lit/decorators.js';\nimport {ARIAMixinStrict} from '../../../../internal/aria/aria.js';\nimport {mixinDelegatesAria} from '../../../../internal/aria/delegate.js';\nimport {redispatchEvent} from '../../../../internal/events/redispatch-event.js';\nimport {\n createValidator,\n getValidityAnchor,\n mixinConstraintValidation,\n} from '../../../behaviors/constraint-validation.js';\nimport {\n hasState,\n mixinCustomStateSet,\n toggleState,\n} from '../../../behaviors/custom-state-set.js';\nimport {mixinElementInternals} from '../../../behaviors/element-internals.js';\nimport {\n getFormState,\n getFormValue,\n mixinFormAssociated,\n} from '../../../behaviors/form-associated.js';\nimport {CheckboxValidator} from '../../../behaviors/validators/checkbox-validator.js';\nimport {hasSlotted} from '../shared/has-slotted.js';\n\nimport focusRingStyles from '../focus/focus-ring.css' with {type: 'css'}; // github-only\n// import focusRingStyles from '../focus/focus-ring.cssresult.js'; // google3-only\nimport rippleStyles from '../ripple/ripple.css' with {type: 'css'}; // github-only\n// import rippleStyles from '../ripple/ripple.cssresult.js'; // google3-only\nimport switchStyles from './switch.css' with {type: 'css'}; // github-only\n// import switchStyles from './switch.cssresult.js'; // google3-only\n\nimport {switchToggle} from './switch.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n /** A Material Design switch component. */\n 'md-gb-switch': Switch;\n }\n}\n\n// Separate variable needed for closure.\nconst baseClass = mixinDelegatesAria(\n mixinConstraintValidation(\n mixinFormAssociated(mixinCustomStateSet(mixinElementInternals(LitElement))),\n ),\n);\n\n/**\n * A Material Design switch component.\n *\n * @slot off-icon - Used to show an icon when the switch is unselected.\n * @slot on-icon - Used to show an icon when the switch is selected.\n * @fires {InputEvent} input - Fired when the switch is selected or unselected. --bubbles --composed\n * @fires {Event} change - Fired when the switch is selected or unselected. --bubbles\n * @csspart switch - The switch's root element.\n * @cssprop --handle-color\n * @cssprop --handle-size\n * @cssprop --with-icon-handle-size\n * @cssprop --icon-color\n * @cssprop --icon-size\n * @cssprop --state-layer-color\n * @cssprop --state-layer-size\n * @cssprop --track-color\n * @cssprop --track-height\n * @cssprop --track-outline-color\n * @cssprop --track-outline-width\n * @cssprop --track-width\n */\n@customElement('md-gb-switch')\nexport class Switch extends baseClass {\n /** @nocollapse */\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n };\n\n static override styles: CSSResultOrNative[] = [\n focusRingStyles,\n rippleStyles,\n switchStyles,\n css`\n :host {\n display: inline-flex;\n }\n .switch {\n flex: 1;\n }\n ::slotted(*) {\n grid-area: handle;\n }\n `,\n ];\n\n /**\n * Puts the switch in the selected state and sets the form submission value to\n * the `value` property.\n */\n @property({type: Boolean})\n get selected() {\n return this[hasState]('selected');\n }\n set selected(value: boolean) {\n this[toggleState]('selected', value);\n }\n\n /**\n * The default selected state of the switch.\n */\n get defaultSelected(): boolean {\n return this.hasAttribute('selected');\n }\n set defaultSelected(value: boolean) {\n this.toggleAttribute('selected', value || false);\n }\n\n /**\n * When true, require the switch to be selected when participating in\n * form submission.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#validation\n */\n @property({type: Boolean}) required = false;\n\n /**\n * The value associated with this switch on form submission. `null` is\n * submitted when `selected` is `false`.\n */\n @property() value = 'on';\n\n @query('button', true)\n private readonly button!: HTMLButtonElement | null;\n\n /**\n * Mimics the behavior of <input> dirty checkedness, where the `checked`\n * attribute only updates the checked state if the checkbox has not been\n * interacted with.\n *\n * @see https://html.spec.whatwg.org/multipage/input.html#concept-input-checked-dirty-flag\n */\n private dirtyCheckedness = false;\n\n protected override render() {\n const {ariaLabel} = this as ARIAMixinStrict;\n return html`\n <button\n role=\"switch\"\n part=\"switch\"\n class=\"${switchToggle()}\"\n aria-checked=\"${this.selected ? 'true' : 'false'}\"\n aria-label=${ariaLabel || nothing}\n ?disabled=${this.disabled}\n @change=${this.handleChange}>\n <slot name=\"off-icon\" class=\"switch-icon-off\" ${hasSlotted()}></slot>\n <slot name=\"on-icon\" class=\"switch-icon-on\"></slot>\n </button>\n `;\n }\n\n private handleChange(event: Event) {\n this.dirtyCheckedness = true;\n this.selected = this.button?.ariaChecked === 'true';\n // Change event is not composed, re-dispatch it.\n redispatchEvent(this, event);\n }\n\n override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null,\n ) {\n if (name === 'selected' && this.dirtyCheckedness) {\n // The 'selected' attribute does not update switches that have been\n // interacted with.\n return;\n }\n\n super.attributeChangedCallback(name, oldValue, newValue);\n }\n\n override [getFormValue]() {\n return this.selected ? this.value : null;\n }\n\n override [getFormState]() {\n return String(this.selected);\n }\n\n override formResetCallback() {\n this.dirtyCheckedness = false;\n this.selected = this.defaultSelected;\n }\n\n override formStateRestoreCallback(state: string) {\n this.selected = state === 'true';\n }\n\n override [createValidator]() {\n return new CheckboxValidator(() => ({\n checked: this.selected,\n required: this.required,\n }));\n }\n\n override [getValidityAnchor]() {\n return this.button;\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ /*!
2
+ * Copyright 2026 Google LLC
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */@layer md.sys, md.comp.ripple, md.comp.focus-ring;@layer md.comp.switch{.switch{--handle-color: var(--md-sys-color-outline);--handle-size: 16px;--with-icon-handle-size: 24px;--icon-color: var(--md-sys-color-surface-container-highest);--icon-size: 18px;--state-layer-color: var(--md-sys-color-on-surface);--state-layer-size: 40px;--track-color: var(--md-sys-color-surface-container-highest);--track-height: 32px;--track-outline-color: var(--md-sys-color-outline);--track-outline-width: 2px;--track-width: 52px}.switch:is(:hover,.hover){--handle-color: var(--md-sys-color-on-surface-variant)}.switch:is(:checked,.checked,[aria-checked=true]){--track-color: var(--md-sys-color-primary);--track-outline-color: transparent;--handle-color: var(--md-sys-color-on-primary);--handle-size: 24px;--icon-color: var(--md-sys-color-on-primary-container);--state-layer-color: var(--md-sys-color-primary)}.switch:is(:checked,.checked,[aria-checked=true]):where(:hover,.hover){--handle-color: var(--md-sys-color-primary-container)}.switch:is(:active,.active):where(:not(:disabled,.disabled)){--handle-size: 28px}.switch:is(:disabled,.disabled){--handle-color: hsl(from var(--md-sys-color-on-surface) h s l / 38%);--track-color: hsl( from var(--md-sys-color-surface-container-highest) h s l / 12% );--track-outline-color: hsl( from var(--md-sys-color-on-surface) h s l / 12% )}.switch:is(:disabled,.disabled):where(:checked,.checked,[aria-checked=true]){--handle-color: var(--md-sys-color-surface);--icon-color: hsl(from var(--md-sys-color-on-surface) h s l / 38%);--track-color: hsl(from var(--md-sys-color-on-surface) h s l / 12%)}.switch{display:inline-grid;grid-template:". handle ." 1fr/0fr min-content 1fr;place-items:center;appearance:none;background:var(--track-color);border:var(--track-outline-width) solid var(--track-outline-color);border-radius:calc(var(--track-height)/2);width:var(--track-width);height:var(--track-height);margin:0;padding:0;transition:grid-template-columns 75ms cubic-bezier(0.4, 0, 0.2, 1);isolation:isolate;position:relative;color:var(--icon-color);--md-icon-size: var(--icon-size);--icon: ""}.switch:is(:checked,.checked,[aria-checked=true]){grid-template-columns:1fr min-content 0fr}.switch::before{--_handle-size: if( style(--icon: ""): var(--handle-size); else: max(var(--handle-size), var(--with-icon-handle-size)); );content:var(--icon);font:var(--md-icon-size) var(--md-icon-font);display:grid;place-items:center;z-index:-1;grid-area:handle;aspect-ratio:1;height:100%;clip-path:circle(calc(var(--_handle-size) / 2));transition:clip-path 75ms cubic-bezier(0.4, 0, 0.2, 1);border-radius:50%;background:var(--handle-color)}.switch::after{content:"";z-index:-1;position:absolute;grid-area:handle;background-image:var(--ripple);aspect-ratio:1;width:var(--state-layer-size);border-radius:50%;color:var(--state-layer-color);transition:var(--ripple-transition);animation:var(--ripple-animation)}.switch:has(.switch-icon-off:not(slot),.switch-icon-off.has-slotted){--icon: " "}.switch .switch-icon-off:not(slot),.switch .switch-icon-off::slotted(*),.switch .switch-icon-on:not(slot),.switch .switch-icon-on::slotted(*){grid-area:handle}.switch:is(:checked,.checked,[aria-checked=true]) .switch-icon-off,.switch:not(:checked,.checked,[aria-checked=true]) .switch-icon-on{display:none}}/*# sourceMappingURL=switch.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["switch.scss","_switch-tokens.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAAA,GASA,kDACA,sBAEI,QCLF,4CACA,oBACA,8BACA,4DACA,kBACA,oDACA,yBACA,6DACA,qBACA,mDACA,2BACA,oBDHE,0BCQF,uDDLE,kDCSF,2CACA,mCACA,+CACA,oBACA,uDACA,iDDZI,uECgBJ,sDDZE,6DCgBF,oBDbE,gCCiBF,qEACA,qFAGA,8EDnBI,6ECyBJ,4CACA,mEACA,oEDtBE,QACE,oBACA,mDACA,mBACA,gBACA,8BACA,mEACA,0CACA,yBACA,2BACA,SACA,UACA,mEACA,kBACA,kBACA,wBACA,iCACA,WAEA,kDACE,0CAGF,gBACE,0HAIA,oBACA,6CACA,aACA,mBACA,WACA,iBACA,eACA,YACA,gDACA,uDACA,kBACA,+BAGF,eACE,WACA,WACA,kBACA,iBACA,+BACA,eACA,8BACA,kBACA,+BACA,oCACA,kCAIJ,qEACE,YAKA,8IAEE,iBAIJ,sIAEE","file":"switch.css"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ // Generated stylesheet for ./labs/gb/components/switch/switch.css.
7
+ import { css } from 'lit';
8
+ export const styles = css `/*!
9
+ * Copyright 2026 Google LLC
10
+ * SPDX-License-Identifier: Apache-2.0
11
+ */@layer md.sys, md.comp.ripple, md.comp.focus-ring;@layer md.comp.switch{.switch{--handle-color: var(--md-sys-color-outline);--handle-size: 16px;--with-icon-handle-size: 24px;--icon-color: var(--md-sys-color-surface-container-highest);--icon-size: 18px;--state-layer-color: var(--md-sys-color-on-surface);--state-layer-size: 40px;--track-color: var(--md-sys-color-surface-container-highest);--track-height: 32px;--track-outline-color: var(--md-sys-color-outline);--track-outline-width: 2px;--track-width: 52px}.switch:is(:hover,.hover){--handle-color: var(--md-sys-color-on-surface-variant)}.switch:is(:checked,.checked,[aria-checked=true]){--track-color: var(--md-sys-color-primary);--track-outline-color: transparent;--handle-color: var(--md-sys-color-on-primary);--handle-size: 24px;--icon-color: var(--md-sys-color-on-primary-container);--state-layer-color: var(--md-sys-color-primary)}.switch:is(:checked,.checked,[aria-checked=true]):where(:hover,.hover){--handle-color: var(--md-sys-color-primary-container)}.switch:is(:active,.active):where(:not(:disabled,.disabled)){--handle-size: 28px}.switch:is(:disabled,.disabled){--handle-color: hsl(from var(--md-sys-color-on-surface) h s l / 38%);--track-color: hsl( from var(--md-sys-color-surface-container-highest) h s l / 12% );--track-outline-color: hsl( from var(--md-sys-color-on-surface) h s l / 12% )}.switch:is(:disabled,.disabled):where(:checked,.checked,[aria-checked=true]){--handle-color: var(--md-sys-color-surface);--icon-color: hsl(from var(--md-sys-color-on-surface) h s l / 38%);--track-color: hsl(from var(--md-sys-color-on-surface) h s l / 12%)}.switch{display:inline-grid;grid-template:". handle ." 1fr/0fr min-content 1fr;place-items:center;appearance:none;background:var(--track-color);border:var(--track-outline-width) solid var(--track-outline-color);border-radius:calc(var(--track-height)/2);width:var(--track-width);height:var(--track-height);margin:0;padding:0;transition:grid-template-columns 75ms cubic-bezier(0.4, 0, 0.2, 1);isolation:isolate;position:relative;color:var(--icon-color);--md-icon-size: var(--icon-size);--icon: ""}.switch:is(:checked,.checked,[aria-checked=true]){grid-template-columns:1fr min-content 0fr}.switch::before{--_handle-size: if( style(--icon: ""): var(--handle-size); else: max(var(--handle-size), var(--with-icon-handle-size)); );content:var(--icon);font:var(--md-icon-size) var(--md-icon-font);display:grid;place-items:center;z-index:-1;grid-area:handle;aspect-ratio:1;height:100%;clip-path:circle(calc(var(--_handle-size) / 2));transition:clip-path 75ms cubic-bezier(0.4, 0, 0.2, 1);border-radius:50%;background:var(--handle-color)}.switch::after{content:"";z-index:-1;position:absolute;grid-area:handle;background-image:var(--ripple);aspect-ratio:1;width:var(--state-layer-size);border-radius:50%;color:var(--state-layer-color);transition:var(--ripple-transition);animation:var(--ripple-animation)}.switch:has(.switch-icon-off:not(slot),.switch-icon-off.has-slotted){--icon: " "}.switch .switch-icon-off:not(slot),.switch .switch-icon-off::slotted(*),.switch .switch-icon-on:not(slot),.switch .switch-icon-on::slotted(*){grid-area:handle}.switch:is(:checked,.checked,[aria-checked=true]) .switch-icon-off,.switch:not(:checked,.checked,[aria-checked=true]) .switch-icon-on{display:none}}
12
+ `;
13
+ export default styles.styleSheet;
14
+ //# sourceMappingURL=switch.cssresult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.cssresult.js","sourceRoot":"","sources":["switch.cssresult.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,mEAAmE;AACnE,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAC;AACxB,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;CAIxB,CAAC;AACF,eAAe,MAAM,CAAC,UAAW,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n// Generated stylesheet for ./labs/gb/components/switch/switch.css.\nimport {css} from 'lit';\nexport const styles = css`/*!\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */@layer md.sys, md.comp.ripple, md.comp.focus-ring;@layer md.comp.switch{.switch{--handle-color: var(--md-sys-color-outline);--handle-size: 16px;--with-icon-handle-size: 24px;--icon-color: var(--md-sys-color-surface-container-highest);--icon-size: 18px;--state-layer-color: var(--md-sys-color-on-surface);--state-layer-size: 40px;--track-color: var(--md-sys-color-surface-container-highest);--track-height: 32px;--track-outline-color: var(--md-sys-color-outline);--track-outline-width: 2px;--track-width: 52px}.switch:is(:hover,.hover){--handle-color: var(--md-sys-color-on-surface-variant)}.switch:is(:checked,.checked,[aria-checked=true]){--track-color: var(--md-sys-color-primary);--track-outline-color: transparent;--handle-color: var(--md-sys-color-on-primary);--handle-size: 24px;--icon-color: var(--md-sys-color-on-primary-container);--state-layer-color: var(--md-sys-color-primary)}.switch:is(:checked,.checked,[aria-checked=true]):where(:hover,.hover){--handle-color: var(--md-sys-color-primary-container)}.switch:is(:active,.active):where(:not(:disabled,.disabled)){--handle-size: 28px}.switch:is(:disabled,.disabled){--handle-color: hsl(from var(--md-sys-color-on-surface) h s l / 38%);--track-color: hsl( from var(--md-sys-color-surface-container-highest) h s l / 12% );--track-outline-color: hsl( from var(--md-sys-color-on-surface) h s l / 12% )}.switch:is(:disabled,.disabled):where(:checked,.checked,[aria-checked=true]){--handle-color: var(--md-sys-color-surface);--icon-color: hsl(from var(--md-sys-color-on-surface) h s l / 38%);--track-color: hsl(from var(--md-sys-color-on-surface) h s l / 12%)}.switch{display:inline-grid;grid-template:\". handle .\" 1fr/0fr min-content 1fr;place-items:center;appearance:none;background:var(--track-color);border:var(--track-outline-width) solid var(--track-outline-color);border-radius:calc(var(--track-height)/2);width:var(--track-width);height:var(--track-height);margin:0;padding:0;transition:grid-template-columns 75ms cubic-bezier(0.4, 0, 0.2, 1);isolation:isolate;position:relative;color:var(--icon-color);--md-icon-size: var(--icon-size);--icon: \"\"}.switch:is(:checked,.checked,[aria-checked=true]){grid-template-columns:1fr min-content 0fr}.switch::before{--_handle-size: if( style(--icon: \"\"): var(--handle-size); else: max(var(--handle-size), var(--with-icon-handle-size)); );content:var(--icon);font:var(--md-icon-size) var(--md-icon-font);display:grid;place-items:center;z-index:-1;grid-area:handle;aspect-ratio:1;height:100%;clip-path:circle(calc(var(--_handle-size) / 2));transition:clip-path 75ms cubic-bezier(0.4, 0, 0.2, 1);border-radius:50%;background:var(--handle-color)}.switch::after{content:\"\";z-index:-1;position:absolute;grid-area:handle;background-image:var(--ripple);aspect-ratio:1;width:var(--state-layer-size);border-radius:50%;color:var(--state-layer-color);transition:var(--ripple-transition);animation:var(--ripple-animation)}.switch:has(.switch-icon-off:not(slot),.switch-icon-off.has-slotted){--icon: \" \"}.switch .switch-icon-off:not(slot),.switch .switch-icon-off::slotted(*),.switch .switch-icon-on:not(slot),.switch .switch-icon-on::slotted(*){grid-area:handle}.switch:is(:checked,.checked,[aria-checked=true]) .switch-icon-off,.switch:not(:checked,.checked,[aria-checked=true]) .switch-icon-on{display:none}}\n`;\nexport default styles.styleSheet!;\n"]}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { type ClassInfo } from 'lit/directives/class-map.js';
7
+ /** Switch classes. */
8
+ export declare const SWITCH_CLASSES: {
9
+ readonly switch: "switch";
10
+ readonly checked: string;
11
+ readonly hover: string;
12
+ readonly active: string;
13
+ readonly disabled: string;
14
+ };
15
+ /** The state provided to the `switchClasses()` function. */
16
+ export interface SwitchClassesState {
17
+ /** Emulates `:checked`. */
18
+ checked?: boolean;
19
+ /** Emulates `:hover`. */
20
+ hover?: boolean;
21
+ /** Emulates `:active`. */
22
+ active?: boolean;
23
+ /** Emulates `:disabled`. */
24
+ disabled?: boolean;
25
+ }
26
+ /**
27
+ * Returns the switch classes to apply to an element based on the given state.
28
+ *
29
+ * @param state The state of the switch.
30
+ * @return An object of class names and truthy values if they apply.
31
+ */
32
+ export declare function switchClasses({ checked, hover, active, disabled, }?: SwitchClassesState): ClassInfo;
33
+ /**
34
+ * Sets up switch functionality for the given element.
35
+ *
36
+ * @param switchEl The element on which to set up switch functionality.
37
+ * @param opts Setup options, supports a cleanup `signal`.
38
+ */
39
+ export declare function setupSwitch(switchEl: HTMLElement, opts?: {
40
+ signal?: AbortSignal;
41
+ }): void;
42
+ /**
43
+ * A Lit directive that adds switch styling and functionality to its element.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * html`
48
+ * <input role="switch" type="checkbox" class="${switchToggle()}">
49
+ *
50
+ * <button role="switch" aria-checked="false" class="${switchToggle()}"></button>
51
+ * `;
52
+ * ```
53
+ */
54
+ export declare const switchToggle: (state?: SwitchClassesState & import("../shared/directives.js").AdditionalClasses) => import("lit-html/directive.js").DirectiveResult;
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { afterDispatch, setupDispatchHooks, } from '../../../../internal/events/dispatch-hooks.js';
7
+ import { focusRingClasses } from '../focus/focus-ring.js';
8
+ import { rippleClasses, setupRipple } from '../ripple/ripple.js';
9
+ import { createClassMapDirective } from '../shared/directives.js';
10
+ import { PSEUDO_CLASSES, isDisabled } from '../shared/pseudo-classes.js';
11
+ /** Switch classes. */
12
+ export const SWITCH_CLASSES = {
13
+ switch: 'switch',
14
+ checked: PSEUDO_CLASSES.checked,
15
+ hover: PSEUDO_CLASSES.hover,
16
+ active: PSEUDO_CLASSES.active,
17
+ disabled: PSEUDO_CLASSES.disabled,
18
+ };
19
+ /**
20
+ * Returns the switch classes to apply to an element based on the given state.
21
+ *
22
+ * @param state The state of the switch.
23
+ * @return An object of class names and truthy values if they apply.
24
+ */
25
+ export function switchClasses({ checked = false, hover = false, active = false, disabled = false, } = {}) {
26
+ return {
27
+ ...rippleClasses(),
28
+ ...focusRingClasses(),
29
+ [SWITCH_CLASSES.switch]: true,
30
+ [SWITCH_CLASSES.checked]: checked,
31
+ [SWITCH_CLASSES.hover]: hover,
32
+ [SWITCH_CLASSES.active]: active,
33
+ [SWITCH_CLASSES.disabled]: disabled,
34
+ };
35
+ }
36
+ /**
37
+ * Sets up switch functionality for the given element.
38
+ *
39
+ * @param switchEl The element on which to set up switch functionality.
40
+ * @param opts Setup options, supports a cleanup `signal`.
41
+ */
42
+ export function setupSwitch(switchEl, opts) {
43
+ const isButton = switchEl.matches('button');
44
+ if (isButton) {
45
+ // Only setup dispatch hooks if we add a button click listener, but call it
46
+ // before setupRipple() adds its click listener.
47
+ setupDispatchHooks(switchEl, 'click');
48
+ }
49
+ setupRipple(switchEl, opts);
50
+ if (!isButton)
51
+ return;
52
+ // Support toggling <button role="switch" aria-checked="">
53
+ switchEl.addEventListener('click', (event) => {
54
+ if (isDisabled(switchEl))
55
+ return;
56
+ const wasChecked = switchEl.ariaChecked === 'true';
57
+ switchEl.ariaChecked = String(!wasChecked);
58
+ afterDispatch(event, () => {
59
+ if (event.defaultPrevented) {
60
+ switchEl.ariaChecked = String(wasChecked);
61
+ return;
62
+ }
63
+ // Mimic native browser input and change event behavior.
64
+ switchEl.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true }));
65
+ switchEl.dispatchEvent(new Event('change', { bubbles: true }));
66
+ });
67
+ }, opts);
68
+ }
69
+ /**
70
+ * A Lit directive that adds switch styling and functionality to its element.
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * html`
75
+ * <input role="switch" type="checkbox" class="${switchToggle()}">
76
+ *
77
+ * <button role="switch" aria-checked="false" class="${switchToggle()}"></button>
78
+ * `;
79
+ * ```
80
+ */
81
+ export const switchToggle = createClassMapDirective({
82
+ getClasses: switchClasses,
83
+ setupElement: setupSwitch,
84
+ });
85
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["switch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,aAAa,EACb,kBAAkB,GACnB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAC,aAAa,EAAE,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAC,uBAAuB,EAAC,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAC,cAAc,EAAE,UAAU,EAAC,MAAM,6BAA6B,CAAC;AAEvE,sBAAsB;AACtB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,cAAc,CAAC,OAAO;IAC/B,KAAK,EAAE,cAAc,CAAC,KAAK;IAC3B,MAAM,EAAE,cAAc,CAAC,MAAM;IAC7B,QAAQ,EAAE,cAAc,CAAC,QAAQ;CACzB,CAAC;AAcX;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,GAAG,KAAK,EACf,KAAK,GAAG,KAAK,EACb,MAAM,GAAG,KAAK,EACd,QAAQ,GAAG,KAAK,MACM,EAAE;IACxB,OAAO;QACL,GAAG,aAAa,EAAE;QAClB,GAAG,gBAAgB,EAAE;QACrB,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI;QAC7B,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO;QACjC,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK;QAC7B,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM;QAC/B,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,QAAQ;KACpC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,QAAqB,EACrB,IAA6B;IAE7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,QAAQ,EAAE,CAAC;QACb,2EAA2E;QAC3E,gDAAgD;QAChD,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEtB,0DAA0D;IAC1D,QAAQ,CAAC,gBAAgB,CACvB,OAAO,EACP,CAAC,KAAK,EAAE,EAAE;QACR,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO;QACjC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,KAAK,MAAM,CAAC;QACnD,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QAC3C,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE;YACxB,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,wDAAwD;YACxD,QAAQ,CAAC,aAAa,CACpB,IAAI,UAAU,CAAC,OAAO,EAAE,EAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CACzD,CAAC;YACF,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,EACD,IAAI,CACL,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;IAClD,UAAU,EAAE,aAAa;IACzB,YAAY,EAAE,WAAW;CAC1B,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {type ClassInfo} from 'lit/directives/class-map.js';\nimport {\n afterDispatch,\n setupDispatchHooks,\n} from '../../../../internal/events/dispatch-hooks.js';\nimport {focusRingClasses} from '../focus/focus-ring.js';\nimport {rippleClasses, setupRipple} from '../ripple/ripple.js';\nimport {createClassMapDirective} from '../shared/directives.js';\nimport {PSEUDO_CLASSES, isDisabled} from '../shared/pseudo-classes.js';\n\n/** Switch classes. */\nexport const SWITCH_CLASSES = {\n switch: 'switch',\n checked: PSEUDO_CLASSES.checked,\n hover: PSEUDO_CLASSES.hover,\n active: PSEUDO_CLASSES.active,\n disabled: PSEUDO_CLASSES.disabled,\n} as const;\n\n/** The state provided to the `switchClasses()` function. */\nexport interface SwitchClassesState {\n /** Emulates `:checked`. */\n checked?: boolean;\n /** Emulates `:hover`. */\n hover?: boolean;\n /** Emulates `:active`. */\n active?: boolean;\n /** Emulates `:disabled`. */\n disabled?: boolean;\n}\n\n/**\n * Returns the switch classes to apply to an element based on the given state.\n *\n * @param state The state of the switch.\n * @return An object of class names and truthy values if they apply.\n */\nexport function switchClasses({\n checked = false,\n hover = false,\n active = false,\n disabled = false,\n}: SwitchClassesState = {}): ClassInfo {\n return {\n ...rippleClasses(),\n ...focusRingClasses(),\n [SWITCH_CLASSES.switch]: true,\n [SWITCH_CLASSES.checked]: checked,\n [SWITCH_CLASSES.hover]: hover,\n [SWITCH_CLASSES.active]: active,\n [SWITCH_CLASSES.disabled]: disabled,\n };\n}\n\n/**\n * Sets up switch functionality for the given element.\n *\n * @param switchEl The element on which to set up switch functionality.\n * @param opts Setup options, supports a cleanup `signal`.\n */\nexport function setupSwitch(\n switchEl: HTMLElement,\n opts?: {signal?: AbortSignal},\n): void {\n const isButton = switchEl.matches('button');\n if (isButton) {\n // Only setup dispatch hooks if we add a button click listener, but call it\n // before setupRipple() adds its click listener.\n setupDispatchHooks(switchEl, 'click');\n }\n\n setupRipple(switchEl, opts);\n if (!isButton) return;\n\n // Support toggling <button role=\"switch\" aria-checked=\"\">\n switchEl.addEventListener(\n 'click',\n (event) => {\n if (isDisabled(switchEl)) return;\n const wasChecked = switchEl.ariaChecked === 'true';\n switchEl.ariaChecked = String(!wasChecked);\n afterDispatch(event, () => {\n if (event.defaultPrevented) {\n switchEl.ariaChecked = String(wasChecked);\n return;\n }\n\n // Mimic native browser input and change event behavior.\n switchEl.dispatchEvent(\n new InputEvent('input', {bubbles: true, composed: true}),\n );\n switchEl.dispatchEvent(new Event('change', {bubbles: true}));\n });\n },\n opts,\n );\n}\n\n/**\n * A Lit directive that adds switch styling and functionality to its element.\n *\n * @example\n * ```ts\n * html`\n * <input role=\"switch\" type=\"checkbox\" class=\"${switchToggle()}\">\n *\n * <button role=\"switch\" aria-checked=\"false\" class=\"${switchToggle()}\"></button>\n * `;\n * ```\n */\nexport const switchToggle = createClassMapDirective({\n getClasses: switchClasses,\n setupElement: setupSwitch,\n});\n"]}
@@ -0,0 +1,109 @@
1
+ /*!
2
+ * Copyright 2026 Google LLC
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ // go/keep-sorted start by_regex='(.+) prefix_order=sass:
7
+ @use 'switch-tokens';
8
+ // go/keep-sorted end
9
+
10
+ @layer md.sys, md.comp.ripple, md.comp.focus-ring;
11
+ @layer md.comp.switch {
12
+ .switch {
13
+ & {
14
+ @include switch-tokens.root;
15
+ }
16
+ &:is(:hover, .hover) {
17
+ @include switch-tokens.hovered;
18
+ }
19
+ &:is(:checked, .checked, [aria-checked='true']) {
20
+ @include switch-tokens.selected;
21
+ &:where(:hover, .hover) {
22
+ @include switch-tokens.selected-hovered;
23
+ }
24
+ }
25
+ &:is(:active, .active):where(:not(:disabled, .disabled)) {
26
+ @include switch-tokens.pressed;
27
+ }
28
+ &:is(:disabled, .disabled) {
29
+ @include switch-tokens.disabled;
30
+ &:where(:checked, .checked, [aria-checked='true']) {
31
+ @include switch-tokens.disabled-selected;
32
+ }
33
+ }
34
+
35
+ & {
36
+ display: inline-grid;
37
+ grid-template: '. handle .' 1fr / 0fr min-content 1fr;
38
+ place-items: center;
39
+ appearance: none;
40
+ background: var(--track-color);
41
+ border: var(--track-outline-width) solid var(--track-outline-color);
42
+ border-radius: calc(var(--track-height) / 2);
43
+ width: var(--track-width);
44
+ height: var(--track-height);
45
+ margin: 0;
46
+ padding: 0;
47
+ transition: grid-template-columns 75ms cubic-bezier(0.4, 0, 0.2, 1);
48
+ isolation: isolate;
49
+ position: relative;
50
+ color: var(--icon-color);
51
+ --md-icon-size: var(--icon-size);
52
+ --icon: '';
53
+
54
+ &:is(:checked, .checked, [aria-checked='true']) {
55
+ grid-template-columns: 1fr min-content 0fr;
56
+ }
57
+
58
+ &::before {
59
+ --_handle-size: if(
60
+ style(--icon: ''): var(--handle-size);
61
+ else: max(var(--handle-size), var(--with-icon-handle-size));
62
+ );
63
+ content: var(--icon);
64
+ font: var(--md-icon-size) var(--md-icon-font);
65
+ display: grid;
66
+ place-items: center;
67
+ z-index: -1;
68
+ grid-area: handle;
69
+ aspect-ratio: 1;
70
+ height: 100%;
71
+ clip-path: circle(calc(var(--_handle-size) / 2));
72
+ transition: clip-path 75ms cubic-bezier(0.4, 0, 0.2, 1);
73
+ border-radius: 50%;
74
+ background: var(--handle-color);
75
+ }
76
+
77
+ &::after {
78
+ content: '';
79
+ z-index: -1;
80
+ position: absolute;
81
+ grid-area: handle;
82
+ background-image: var(--ripple);
83
+ aspect-ratio: 1;
84
+ width: var(--state-layer-size);
85
+ border-radius: 50%;
86
+ color: var(--state-layer-color);
87
+ transition: var(--ripple-transition);
88
+ animation: var(--ripple-animation);
89
+ }
90
+ }
91
+
92
+ &:has(.switch-icon-off:not(slot), .switch-icon-off.has-slotted) {
93
+ --icon: ' '; // Use space to clear CSS icon and update the handle size.
94
+ }
95
+
96
+ .switch-icon-off,
97
+ .switch-icon-on {
98
+ &:not(slot),
99
+ &::slotted(*) {
100
+ grid-area: handle;
101
+ }
102
+ }
103
+
104
+ &:is(:checked, .checked, [aria-checked='true']) .switch-icon-off,
105
+ &:not(:checked, .checked, [aria-checked='true']) .switch-icon-on {
106
+ display: none;
107
+ }
108
+ }
109
+ }