@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,77 @@
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
+ /** Ripple classes. */
8
+ export declare const RIPPLE_CLASSES: {
9
+ ripple: string;
10
+ rippleTarget: string;
11
+ rippleHost: string;
12
+ hover: string;
13
+ active: string;
14
+ disabled: string;
15
+ };
16
+ /** The state provided to the `rippleClasses()` function. */
17
+ export interface RippleClassesState {
18
+ /** Emulates `:hover`. */
19
+ hover?: boolean;
20
+ /** Emulates `:active`. */
21
+ active?: boolean;
22
+ /** Emulates `:disabled`. */
23
+ disabled?: boolean;
24
+ }
25
+ /**
26
+ * Returns the ripple classes to apply to an element based on the given state.
27
+ *
28
+ * @param state The state of the ripple.
29
+ * @return An object of class names and truthy values if they apply.
30
+ */
31
+ export declare function rippleClasses({ hover, active, disabled, }?: RippleClassesState): ClassInfo;
32
+ /**
33
+ * Sets up ripple functionality for the given element.
34
+ *
35
+ * @param ripple The element on which to set up ripple functionality.
36
+ * @param opts Setup options, supports a cleanup `signal`.
37
+ */
38
+ export declare function setupRipple(ripple: HTMLElement, opts?: {
39
+ signal?: AbortSignal;
40
+ }): void;
41
+ /**
42
+ * A Lit directive that adds updates the position of a ripple to match pointer
43
+ * interactions. Use with the `.ripple` class.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * class Component extends LitElement {
48
+ * static styles = [rippleStyles, css`...`];
49
+ *
50
+ * render() {
51
+ * return html`<button class="ripple" ${ripple()}>Ripple effect</button>`;
52
+ * }
53
+ * }
54
+ * ```
55
+ *
56
+ * Use the `.ripple-target` class if the interactive element is a parent or
57
+ * child of the ripple element.
58
+ *
59
+ * The `ripple()` directive should be applied to the parent element, which may
60
+ * be the `.ripple-target` instead of the `.ripple`.
61
+ *
62
+ * @example
63
+ * ```ts
64
+ * html`
65
+ * <div class="card ripple" ${ripple()}>
66
+ * Child interactive element
67
+ * <button class="ripple-target card-btn"></button>
68
+ * </div>
69
+ *
70
+ * <button class="ripple-target" ${ripple()}>
71
+ * Parent interactive element
72
+ * <span class="ripple"></span>
73
+ * </button>
74
+ * `;
75
+ * ```
76
+ */
77
+ export declare const ripple: () => import("lit-html/directive.js").DirectiveResult;
@@ -0,0 +1,148 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { createElementDirective } from '../shared/directives.js';
7
+ import { PSEUDO_CLASSES, isDisabled } from '../shared/pseudo-classes.js';
8
+ /** Ripple classes. */
9
+ export const RIPPLE_CLASSES = {
10
+ ripple: 'ripple',
11
+ rippleTarget: 'ripple-target',
12
+ rippleHost: 'ripple-host',
13
+ hover: PSEUDO_CLASSES.hover,
14
+ active: PSEUDO_CLASSES.active,
15
+ disabled: PSEUDO_CLASSES.disabled,
16
+ };
17
+ /**
18
+ * Returns the ripple classes to apply to an element based on the given state.
19
+ *
20
+ * @param state The state of the ripple.
21
+ * @return An object of class names and truthy values if they apply.
22
+ */
23
+ export function rippleClasses({ hover = false, active = false, disabled = false, } = {}) {
24
+ return {
25
+ [RIPPLE_CLASSES.ripple]: true,
26
+ [RIPPLE_CLASSES.hover]: hover,
27
+ [RIPPLE_CLASSES.active]: active,
28
+ [RIPPLE_CLASSES.disabled]: disabled,
29
+ };
30
+ }
31
+ const MINIMUM_PRESS_MS = 225;
32
+ let ripplePropertiesRegistered = false;
33
+ /**
34
+ * Sets up ripple functionality for the given element.
35
+ *
36
+ * @param ripple The element on which to set up ripple functionality.
37
+ * @param opts Setup options, supports a cleanup `signal`.
38
+ */
39
+ export function setupRipple(ripple, opts) {
40
+ if (!ripplePropertiesRegistered) {
41
+ const properties = [
42
+ ['--ripple-scale', '0%'],
43
+ ['--ripple-hover-opacity', '0%'],
44
+ ['--ripple-press-opacity', '0%'],
45
+ ['--ripple-x', '50%'],
46
+ ['--ripple-y', '50%'],
47
+ ];
48
+ try {
49
+ for (const [property, value] of properties) {
50
+ CSS.registerProperty({
51
+ name: property,
52
+ syntax: '<percentage>',
53
+ inherits: false,
54
+ initialValue: value,
55
+ });
56
+ }
57
+ }
58
+ catch {
59
+ // Ignore errors if the properties are already registered.
60
+ }
61
+ finally {
62
+ ripplePropertiesRegistered = true;
63
+ }
64
+ }
65
+ let minimumPressTimeoutId;
66
+ const activateRipple = () => {
67
+ // If the ripple is already active, restart the current press animation.
68
+ if (ripple.classList.contains(RIPPLE_CLASSES.active)) {
69
+ const pressAnimation = ripple
70
+ .getAnimations()
71
+ .find((animation) => animation.animationName ===
72
+ 'ripple-press');
73
+ pressAnimation?.cancel();
74
+ pressAnimation?.play();
75
+ }
76
+ // Emulate the `:active` class for a minimum press duration to show the
77
+ // ripple effect on short clicks.
78
+ ripple.classList.add(RIPPLE_CLASSES.active);
79
+ clearTimeout(minimumPressTimeoutId);
80
+ minimumPressTimeoutId = setTimeout(() => {
81
+ ripple.classList.remove(RIPPLE_CLASSES.active);
82
+ }, MINIMUM_PRESS_MS);
83
+ };
84
+ // Return true if the ripple is disabled, or if the ripple class has been
85
+ // removed. This allows components to disable and re-enable ripple behavior.
86
+ const isRippleDisabled = () => isDisabled(ripple) || !ripple.matches(`.${RIPPLE_CLASSES.ripple}`);
87
+ ripple.addEventListener('pointerdown', (event) => {
88
+ if (isRippleDisabled())
89
+ return;
90
+ // Set ripple position to the pointer position.
91
+ const rect = ripple.getBoundingClientRect();
92
+ const x = (event.clientX - rect.x) / rect.width;
93
+ const y = (event.clientY - rect.y) / rect.height;
94
+ ripple.style.setProperty('--ripple-x', `${x * 100}%`);
95
+ ripple.style.setProperty('--ripple-y', `${y * 100}%`);
96
+ activateRipple();
97
+ }, opts);
98
+ ripple.addEventListener('keydown', (event) => {
99
+ // Reset ripple pointer position when a key is pressed.
100
+ ripple.style.removeProperty('--ripple-x');
101
+ ripple.style.removeProperty('--ripple-y');
102
+ }, opts);
103
+ ripple.addEventListener('click', (event) => {
104
+ // A UIEvent.detail click count of 0 indicates the click was not triggered
105
+ // by a pointer. Show the ripple press effect for these clicks as well.
106
+ if (event.detail === 0 && !isRippleDisabled()) {
107
+ activateRipple();
108
+ }
109
+ }, opts);
110
+ }
111
+ /**
112
+ * A Lit directive that adds updates the position of a ripple to match pointer
113
+ * interactions. Use with the `.ripple` class.
114
+ *
115
+ * @example
116
+ * ```ts
117
+ * class Component extends LitElement {
118
+ * static styles = [rippleStyles, css`...`];
119
+ *
120
+ * render() {
121
+ * return html`<button class="ripple" ${ripple()}>Ripple effect</button>`;
122
+ * }
123
+ * }
124
+ * ```
125
+ *
126
+ * Use the `.ripple-target` class if the interactive element is a parent or
127
+ * child of the ripple element.
128
+ *
129
+ * The `ripple()` directive should be applied to the parent element, which may
130
+ * be the `.ripple-target` instead of the `.ripple`.
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * html`
135
+ * <div class="card ripple" ${ripple()}>
136
+ * Child interactive element
137
+ * <button class="ripple-target card-btn"></button>
138
+ * </div>
139
+ *
140
+ * <button class="ripple-target" ${ripple()}>
141
+ * Parent interactive element
142
+ * <span class="ripple"></span>
143
+ * </button>
144
+ * `;
145
+ * ```
146
+ */
147
+ export const ripple = createElementDirective(setupRipple);
148
+ //# sourceMappingURL=ripple.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ripple.js","sourceRoot":"","sources":["ripple.ts"],"names":[],"mappings":"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","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 {createElementDirective} from '../shared/directives.js';\nimport {PSEUDO_CLASSES, isDisabled} from '../shared/pseudo-classes.js';\n\n/** Ripple classes. */\nexport const RIPPLE_CLASSES = {\n ripple: 'ripple',\n rippleTarget: 'ripple-target',\n rippleHost: 'ripple-host',\n hover: PSEUDO_CLASSES.hover,\n active: PSEUDO_CLASSES.active,\n disabled: PSEUDO_CLASSES.disabled,\n};\n\n/** The state provided to the `rippleClasses()` function. */\nexport interface RippleClassesState {\n /** Emulates `:hover`. */\n hover?: boolean;\n /** Emulates `:active`. */\n active?: boolean;\n /** Emulates `:disabled`. */\n disabled?: boolean;\n}\n\n/**\n * Returns the ripple classes to apply to an element based on the given state.\n *\n * @param state The state of the ripple.\n * @return An object of class names and truthy values if they apply.\n */\nexport function rippleClasses({\n hover = false,\n active = false,\n disabled = false,\n}: RippleClassesState = {}): ClassInfo {\n return {\n [RIPPLE_CLASSES.ripple]: true,\n [RIPPLE_CLASSES.hover]: hover,\n [RIPPLE_CLASSES.active]: active,\n [RIPPLE_CLASSES.disabled]: disabled,\n };\n}\n\nconst MINIMUM_PRESS_MS = 225;\nlet ripplePropertiesRegistered = false;\n\n/**\n * Sets up ripple functionality for the given element.\n *\n * @param ripple The element on which to set up ripple functionality.\n * @param opts Setup options, supports a cleanup `signal`.\n */\nexport function setupRipple(\n ripple: HTMLElement,\n opts?: {signal?: AbortSignal},\n): void {\n if (!ripplePropertiesRegistered) {\n const properties = [\n ['--ripple-scale', '0%'],\n ['--ripple-hover-opacity', '0%'],\n ['--ripple-press-opacity', '0%'],\n ['--ripple-x', '50%'],\n ['--ripple-y', '50%'],\n ];\n\n try {\n for (const [property, value] of properties) {\n CSS.registerProperty({\n name: property,\n syntax: '<percentage>',\n inherits: false,\n initialValue: value,\n });\n }\n } catch {\n // Ignore errors if the properties are already registered.\n } finally {\n ripplePropertiesRegistered = true;\n }\n }\n\n let minimumPressTimeoutId: number | undefined;\n const activateRipple = () => {\n // If the ripple is already active, restart the current press animation.\n if (ripple.classList.contains(RIPPLE_CLASSES.active)) {\n const pressAnimation = ripple\n .getAnimations()\n .find(\n (animation) =>\n (animation as Partial<CSSAnimation>).animationName ===\n 'ripple-press',\n );\n pressAnimation?.cancel();\n pressAnimation?.play();\n }\n\n // Emulate the `:active` class for a minimum press duration to show the\n // ripple effect on short clicks.\n ripple.classList.add(RIPPLE_CLASSES.active);\n clearTimeout(minimumPressTimeoutId);\n minimumPressTimeoutId = setTimeout(() => {\n ripple.classList.remove(RIPPLE_CLASSES.active);\n }, MINIMUM_PRESS_MS);\n };\n\n // Return true if the ripple is disabled, or if the ripple class has been\n // removed. This allows components to disable and re-enable ripple behavior.\n const isRippleDisabled = () =>\n isDisabled(ripple) || !ripple.matches(`.${RIPPLE_CLASSES.ripple}`);\n\n ripple.addEventListener(\n 'pointerdown',\n (event: PointerEvent): void => {\n if (isRippleDisabled()) return;\n // Set ripple position to the pointer position.\n const rect = ripple.getBoundingClientRect();\n const x = (event.clientX - rect.x) / rect.width;\n const y = (event.clientY - rect.y) / rect.height;\n ripple.style.setProperty('--ripple-x', `${x * 100}%`);\n ripple.style.setProperty('--ripple-y', `${y * 100}%`);\n activateRipple();\n },\n opts,\n );\n\n ripple.addEventListener(\n 'keydown',\n (event: KeyboardEvent): void => {\n // Reset ripple pointer position when a key is pressed.\n ripple.style.removeProperty('--ripple-x');\n ripple.style.removeProperty('--ripple-y');\n },\n opts,\n );\n\n ripple.addEventListener(\n 'click',\n (event) => {\n // A UIEvent.detail click count of 0 indicates the click was not triggered\n // by a pointer. Show the ripple press effect for these clicks as well.\n if (event.detail === 0 && !isRippleDisabled()) {\n activateRipple();\n }\n },\n opts,\n );\n}\n\n/**\n * A Lit directive that adds updates the position of a ripple to match pointer\n * interactions. Use with the `.ripple` class.\n *\n * @example\n * ```ts\n * class Component extends LitElement {\n * static styles = [rippleStyles, css`...`];\n *\n * render() {\n * return html`<button class=\"ripple\" ${ripple()}>Ripple effect</button>`;\n * }\n * }\n * ```\n *\n * Use the `.ripple-target` class if the interactive element is a parent or\n * child of the ripple element.\n *\n * The `ripple()` directive should be applied to the parent element, which may\n * be the `.ripple-target` instead of the `.ripple`.\n *\n * @example\n * ```ts\n * html`\n * <div class=\"card ripple\" ${ripple()}>\n * Child interactive element\n * <button class=\"ripple-target card-btn\"></button>\n * </div>\n *\n * <button class=\"ripple-target\" ${ripple()}>\n * Parent interactive element\n * <span class=\"ripple\"></span>\n * </button>\n * `;\n * ```\n */\nexport const ripple = createElementDirective(setupRipple);\n"]}
@@ -0,0 +1,103 @@
1
+ /*!
2
+ * Copyright 2026 Google LLC
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ @layer md.sys;
7
+ @layer md.comp.ripple {
8
+ @property --ripple-scale {
9
+ syntax: '<percentage>';
10
+ inherits: false;
11
+ initial-value: 0%;
12
+ }
13
+ @property --ripple-hover-opacity {
14
+ syntax: '<percentage>';
15
+ inherits: false;
16
+ initial-value: 0%;
17
+ }
18
+ @property --ripple-press-opacity {
19
+ syntax: '<percentage>';
20
+ inherits: false;
21
+ initial-value: 0%;
22
+ }
23
+ @property --ripple-x {
24
+ syntax: '<percentage>';
25
+ inherits: false;
26
+ initial-value: 50%;
27
+ }
28
+ @property --ripple-y {
29
+ syntax: '<percentage>';
30
+ inherits: false;
31
+ initial-value: 50%;
32
+ }
33
+
34
+ .ripple {
35
+ --ripple-color: currentColor;
36
+ --ripple-press-transition: --ripple-press-opacity 375ms linear;
37
+ --ripple-transition: --ripple-hover-opacity 15ms linear,
38
+ var(--ripple-press-transition);
39
+ --ripple-animation: ripple-release 375ms linear;
40
+ --ripple: radial-gradient(
41
+ hsl(from var(--ripple-color) h s l / var(--ripple-hover-opacity))
42
+ ),
43
+ radial-gradient(
44
+ circle at var(--ripple-x) var(--ripple-y),
45
+ hsl(from var(--ripple-color) h s l / var(--ripple-press-opacity))
46
+ var(--ripple-scale),
47
+ transparent calc(var(--ripple-scale) * 1.35)
48
+ );
49
+
50
+ background-image: var(--ripple);
51
+ transition: var(--ripple-transition);
52
+ animation: var(--ripple-animation), var(--focus-ring-animation, none);
53
+
54
+ // Ripples support the following DOM use cases:
55
+ // 1. `.ripple` and interactive element are the same.
56
+ // 2. `.ripple` is a parent of a child interactive `.ripple-target`.
57
+ // 3. `.ripple` is a child of a parent interactive `.ripple-target`.
58
+ // 4. `.ripple.ripple-host` is a within an interactive shadow DOM host.
59
+ //
60
+ // Pseudo class emulation is only needed for the `.ripple` element, not for
61
+ // the target or host elements.
62
+
63
+ &:is(:hover, .hover),
64
+ &:has(.ripple-target:hover),
65
+ .ripple-target:hover &,
66
+ :host(:hover) &.ripple-host {
67
+ --ripple-hover-opacity: 8%;
68
+ }
69
+
70
+ &:is(:active, .active),
71
+ &:has(.ripple-target:active),
72
+ .ripple-target:active &,
73
+ :host(:active) &.ripple-host {
74
+ --ripple-press-opacity: 10%;
75
+ --ripple-press-transition: --ripple-press-opacity 100ms linear;
76
+ --ripple-animation: ripple-press forwards 450ms cubic-bezier(0.2, 0, 0, 1);
77
+ }
78
+
79
+ &:is(:disabled, .disabled) {
80
+ --ripple: none;
81
+ }
82
+ }
83
+
84
+ @keyframes ripple-press {
85
+ from {
86
+ --ripple-scale: 20%;
87
+ }
88
+ to {
89
+ --ripple-scale: 100%;
90
+ --ripple-x: 50%;
91
+ --ripple-y: 50%;
92
+ }
93
+ }
94
+
95
+ @keyframes ripple-release {
96
+ from {
97
+ --ripple-scale: 100%;
98
+ }
99
+ to {
100
+ --ripple-scale: 100%;
101
+ }
102
+ }
103
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { DirectiveResult } from 'lit/async-directive.js';
7
+ import { type ClassInfo } from 'lit/directives/class-map.js';
8
+ /**
9
+ * A function that sets up logic for a directive's element.
10
+ *
11
+ * @param element The element attached to the directive.
12
+ * @param opts Options for setting up the element, including an AbortSignal for
13
+ * cleanup.
14
+ */
15
+ export type SetupElementFunction = (element: HTMLElement, opts: {
16
+ signal: AbortSignal;
17
+ }) => void;
18
+ /**
19
+ * All class map directives include AdditionalClasses to allow adding dynamic
20
+ * classes to the element using `classMap()`.
21
+ */
22
+ export interface AdditionalClasses {
23
+ /**
24
+ * Additional classes to apply to the element.
25
+ */
26
+ classes?: ClassInfo;
27
+ }
28
+ /**
29
+ * Options for creating a class map directive.
30
+ *
31
+ * @param getClasses A function that returns the class names and truthy values
32
+ * if they apply.
33
+ * @param setupElement An optional function to set up logic for the directive's
34
+ * element.
35
+ */
36
+ export interface ClassMapDirectiveOptions<State> {
37
+ getClasses: (state?: State) => ClassInfo;
38
+ setupElement?: SetupElementFunction;
39
+ }
40
+ /**
41
+ * Creates a Lit directive that behaves like `classMap()`, but also provides
42
+ * element setup and cleanup logic.
43
+ *
44
+ * These directives bind to `class="${componentDirectiveName()}"`.
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * const toggleButton = createClassMapDirective({
49
+ * getClasses: (state: ToggleButtonState) => ({
50
+ * 'toggle-button': true,
51
+ * 'toggle-button-selected': state.selected,
52
+ * }),
53
+ * setupElement: (element, opts) => {
54
+ * element.addEventListener('click', () => {
55
+ * state.selected = !state.selected;
56
+ * }, opts);
57
+ * },
58
+ * });
59
+ *
60
+ * html`
61
+ * <button class="${toggleButton()}">Unselected</button>
62
+ * <button class="${toggleButton({selected: true})}">Selected</button>
63
+ * <button class="${toggleButton({classes: {'visible': isVisible}})}">
64
+ * With additional classes
65
+ * </button>
66
+ * `;
67
+ * ```
68
+ *
69
+ * @param options Options for creating the class map directive.
70
+ * @return A Lit `directive()` that binds to the class attribute.
71
+ */
72
+ export declare function createClassMapDirective<State = {}>(options: ClassMapDirectiveOptions<State>): (state?: State & AdditionalClasses) => DirectiveResult;
73
+ /**
74
+ * Creates a Lit directive that can be used to add setup and cleanup logic to
75
+ * an element.
76
+ *
77
+ * These directives bind as element parts.
78
+ *
79
+ * @example
80
+ * ```ts
81
+ * const logClick = createElementDirective((element, opts) => {
82
+ * element.addEventListener('click', (event) => {
83
+ * console.log('click', event);
84
+ * }, opts);
85
+ * });
86
+ *
87
+ * html`<button ${logClick()}>Click me</button>`;
88
+ * ```
89
+ *
90
+ * @param setupElement The function to set up logic for the directive's element.
91
+ * @return A Lit `directive()` that binds as an element part.
92
+ */
93
+ export declare function createElementDirective(setupElement: SetupElementFunction): () => DirectiveResult;
@@ -0,0 +1,111 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { noChange } from 'lit';
7
+ import { AsyncDirective, directive, } from 'lit/async-directive.js';
8
+ import { classMap } from 'lit/directives/class-map.js';
9
+ /**
10
+ * Creates a Lit directive that behaves like `classMap()`, but also provides
11
+ * element setup and cleanup logic.
12
+ *
13
+ * These directives bind to `class="${componentDirectiveName()}"`.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const toggleButton = createClassMapDirective({
18
+ * getClasses: (state: ToggleButtonState) => ({
19
+ * 'toggle-button': true,
20
+ * 'toggle-button-selected': state.selected,
21
+ * }),
22
+ * setupElement: (element, opts) => {
23
+ * element.addEventListener('click', () => {
24
+ * state.selected = !state.selected;
25
+ * }, opts);
26
+ * },
27
+ * });
28
+ *
29
+ * html`
30
+ * <button class="${toggleButton()}">Unselected</button>
31
+ * <button class="${toggleButton({selected: true})}">Selected</button>
32
+ * <button class="${toggleButton({classes: {'visible': isVisible}})}">
33
+ * With additional classes
34
+ * </button>
35
+ * `;
36
+ * ```
37
+ *
38
+ * @param options Options for creating the class map directive.
39
+ * @return A Lit `directive()` that binds to the class attribute.
40
+ */
41
+ export function createClassMapDirective(options) {
42
+ return directive(class ComponentClassMapDirective extends SetupElementDirective {
43
+ constructor() {
44
+ super(...arguments);
45
+ this.setupElement = options.setupElement;
46
+ }
47
+ render(params) {
48
+ return classMap({
49
+ ...(params?.classes || {}),
50
+ ...options.getClasses(params),
51
+ });
52
+ }
53
+ });
54
+ }
55
+ /**
56
+ * Creates a Lit directive that can be used to add setup and cleanup logic to
57
+ * an element.
58
+ *
59
+ * These directives bind as element parts.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * const logClick = createElementDirective((element, opts) => {
64
+ * element.addEventListener('click', (event) => {
65
+ * console.log('click', event);
66
+ * }, opts);
67
+ * });
68
+ *
69
+ * html`<button ${logClick()}>Click me</button>`;
70
+ * ```
71
+ *
72
+ * @param setupElement The function to set up logic for the directive's element.
73
+ * @return A Lit `directive()` that binds as an element part.
74
+ */
75
+ export function createElementDirective(setupElement) {
76
+ return directive(class ElementDirective extends SetupElementDirective {
77
+ constructor() {
78
+ super(...arguments);
79
+ this.setupElement = setupElement;
80
+ }
81
+ render() {
82
+ return noChange;
83
+ }
84
+ });
85
+ }
86
+ /**
87
+ * A base class for Lit element and attribute directives that provides a setup
88
+ * method for initializing logic when a directive's element is connected.
89
+ */
90
+ class SetupElementDirective extends AsyncDirective {
91
+ update({ element }, params) {
92
+ if (element !== this.element) {
93
+ this.element = element;
94
+ this.disconnected();
95
+ if (this.isConnected) {
96
+ this.reconnected();
97
+ }
98
+ }
99
+ return this.render(...params);
100
+ }
101
+ disconnected() {
102
+ this.cleanup?.abort();
103
+ }
104
+ reconnected() {
105
+ if (this.element && this.setupElement) {
106
+ this.cleanup = new AbortController();
107
+ this.setupElement(this.element, { signal: this.cleanup.signal });
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=directives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directives.js","sourceRoot":"","sources":["directives.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAC,MAAM,KAAK,CAAC;AAC7B,OAAO,EACL,cAAc,EAEd,SAAS,GAGV,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,QAAQ,EAAiB,MAAM,6BAA6B,CAAC;AAsCrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAwC;IAExC,OAAO,SAAS,CACd,MAAM,0BAA2B,SAAQ,qBAAqB;QAA9D;;YAQqB,iBAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzD,CAAC;QARC,MAAM,CAAC,MAAkC;YACvC,OAAO,QAAQ,CAAC;gBACd,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;gBAC1B,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;aAC9B,CAAC,CAAC;QACL,CAAC;KAGF,CACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,sBAAsB,CACpC,YAAkC;IAElC,OAAO,SAAS,CACd,MAAM,gBAAiB,SAAQ,qBAAqB;QAApD;;YAKqB,iBAAY,GAAG,YAAY,CAAC;QACjD,CAAC;QALC,MAAM;YACJ,OAAO,QAAQ,CAAC;QAClB,CAAC;KAGF,CACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAe,qBAAsB,SAAQ,cAAc;IAmBhD,MAAM,CAAC,EAAC,OAAO,EAA8B,EAAE,MAAiB;QACvE,IAAI,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,OAAsB,CAAC;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IAChC,CAAC;IAEkB,YAAY;QAC7B,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC;IAEkB,WAAW;QAC5B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {noChange} from 'lit';\nimport {\n AsyncDirective,\n AttributePart,\n directive,\n DirectiveResult,\n ElementPart,\n} from 'lit/async-directive.js';\nimport {classMap, type ClassInfo} from 'lit/directives/class-map.js';\n\n/**\n * A function that sets up logic for a directive's element.\n *\n * @param element The element attached to the directive.\n * @param opts Options for setting up the element, including an AbortSignal for\n * cleanup.\n */\nexport type SetupElementFunction = (\n element: HTMLElement,\n opts: {signal: AbortSignal},\n) => void;\n\n/**\n * All class map directives include AdditionalClasses to allow adding dynamic\n * classes to the element using `classMap()`.\n */\nexport interface AdditionalClasses {\n /**\n * Additional classes to apply to the element.\n */\n classes?: ClassInfo;\n}\n\n/**\n * Options for creating a class map directive.\n *\n * @param getClasses A function that returns the class names and truthy values\n * if they apply.\n * @param setupElement An optional function to set up logic for the directive's\n * element.\n */\nexport interface ClassMapDirectiveOptions<State> {\n getClasses: (state?: State) => ClassInfo;\n setupElement?: SetupElementFunction;\n}\n\n/**\n * Creates a Lit directive that behaves like `classMap()`, but also provides\n * element setup and cleanup logic.\n *\n * These directives bind to `class=\"${componentDirectiveName()}\"`.\n *\n * @example\n * ```ts\n * const toggleButton = createClassMapDirective({\n * getClasses: (state: ToggleButtonState) => ({\n * 'toggle-button': true,\n * 'toggle-button-selected': state.selected,\n * }),\n * setupElement: (element, opts) => {\n * element.addEventListener('click', () => {\n * state.selected = !state.selected;\n * }, opts);\n * },\n * });\n *\n * html`\n * <button class=\"${toggleButton()}\">Unselected</button>\n * <button class=\"${toggleButton({selected: true})}\">Selected</button>\n * <button class=\"${toggleButton({classes: {'visible': isVisible}})}\">\n * With additional classes\n * </button>\n * `;\n * ```\n *\n * @param options Options for creating the class map directive.\n * @return A Lit `directive()` that binds to the class attribute.\n */\nexport function createClassMapDirective<State = {}>(\n options: ClassMapDirectiveOptions<State>,\n): (state?: State & AdditionalClasses) => DirectiveResult {\n return directive(\n class ComponentClassMapDirective extends SetupElementDirective {\n render(params?: State & AdditionalClasses) {\n return classMap({\n ...(params?.classes || {}),\n ...options.getClasses(params),\n });\n }\n\n protected override setupElement = options.setupElement;\n },\n );\n}\n\n/**\n * Creates a Lit directive that can be used to add setup and cleanup logic to\n * an element.\n *\n * These directives bind as element parts.\n *\n * @example\n * ```ts\n * const logClick = createElementDirective((element, opts) => {\n * element.addEventListener('click', (event) => {\n * console.log('click', event);\n * }, opts);\n * });\n *\n * html`<button ${logClick()}>Click me</button>`;\n * ```\n *\n * @param setupElement The function to set up logic for the directive's element.\n * @return A Lit `directive()` that binds as an element part.\n */\nexport function createElementDirective(\n setupElement: SetupElementFunction,\n): () => DirectiveResult {\n return directive(\n class ElementDirective extends SetupElementDirective {\n render() {\n return noChange;\n }\n\n protected override setupElement = setupElement;\n },\n );\n}\n\n/**\n * A base class for Lit element and attribute directives that provides a setup\n * method for initializing logic when a directive's element is connected.\n */\nabstract class SetupElementDirective extends AsyncDirective {\n /**\n * Called when the directive's element changes. Use this method to add\n * event listeners or perform other setup logic.\n *\n * The `signal` option is used to clean up setup logic when the element is\n * disconnected.\n *\n * @param element The element attached to the directive.\n * @param signal An AbortSignal to clean up event listeners and other logic.\n */\n protected setupElement?: (\n element: HTMLElement,\n opts: {signal: AbortSignal},\n ) => void;\n\n private element?: HTMLElement;\n private cleanup?: AbortController;\n\n override update({element}: ElementPart | AttributePart, params: unknown[]) {\n if (element !== this.element) {\n this.element = element as HTMLElement;\n this.disconnected();\n if (this.isConnected) {\n this.reconnected();\n }\n }\n\n return this.render(...params);\n }\n\n protected override disconnected() {\n this.cleanup?.abort();\n }\n\n protected override reconnected() {\n if (this.element && this.setupElement) {\n this.cleanup = new AbortController();\n this.setupElement(this.element, {signal: this.cleanup.signal});\n }\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Emulates the `:has-slotted` CSS pseudo class by adding a `.has-slotted` class
8
+ * to `<slot>` elements when they have assigned nodes.
9
+ */
10
+ export declare const hasSlotted: () => import("lit-html/directive.js").DirectiveResult;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { createElementDirective } from './directives.js';
7
+ /**
8
+ * Emulates the `:has-slotted` CSS pseudo class by adding a `.has-slotted` class
9
+ * to `<slot>` elements when they have assigned nodes.
10
+ */
11
+ export const hasSlotted = createElementDirective((element, opts) => {
12
+ if (!element.matches('slot')) {
13
+ throw new Error('hasSlotted() must be used on a <slot> element.');
14
+ }
15
+ element.addEventListener('slotchange', (event) => {
16
+ element.classList.toggle('has-slotted', element.assignedNodes().length > 0);
17
+ }, opts);
18
+ });
19
+ //# sourceMappingURL=has-slotted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-slotted.js","sourceRoot":"","sources":["has-slotted.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,sBAAsB,EAAC,MAAM,iBAAiB,CAAC;AAEvD;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,sBAAsB,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACjE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,CAAC,gBAAgB,CACtB,YAAY,EACZ,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,CAAC,SAAS,CAAC,MAAM,CACtB,aAAa,EACZ,OAA2B,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC,CACxD,CAAC;IACJ,CAAC,EACD,IAAI,CACL,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {createElementDirective} from './directives.js';\n\n/**\n * Emulates the `:has-slotted` CSS pseudo class by adding a `.has-slotted` class\n * to `<slot>` elements when they have assigned nodes.\n */\nexport const hasSlotted = createElementDirective((element, opts) => {\n if (!element.matches('slot')) {\n throw new Error('hasSlotted() must be used on a <slot> element.');\n }\n\n element.addEventListener(\n 'slotchange',\n (event) => {\n element.classList.toggle(\n 'has-slotted',\n (element as HTMLSlotElement).assignedNodes().length > 0,\n );\n },\n opts,\n );\n});\n"]}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Cross-component classes for emulating pseudo-classes.
8
+ *
9
+ * All components that style with psuedo-classes for their DOM structure also
10
+ * support emulating these states.
11
+ *
12
+ * @example
13
+ * ```html
14
+ * <button class="ripple active">Pressed ripple</button>
15
+ * ```
16
+ */
17
+ export declare const PSEUDO_CLASSES: {
18
+ active: string;
19
+ checked: string;
20
+ disabled: string;
21
+ focus: string;
22
+ focusVisible: string;
23
+ hover: string;
24
+ indeterminate: string;
25
+ invalid: string;
26
+ };
27
+ /**
28
+ * Returns whether the element is disabled.
29
+ *
30
+ * @param element The element to check.
31
+ * @return true if the element is disabled.
32
+ */
33
+ export declare function isDisabled(element: Element): boolean;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Cross-component classes for emulating pseudo-classes.
8
+ *
9
+ * All components that style with psuedo-classes for their DOM structure also
10
+ * support emulating these states.
11
+ *
12
+ * @example
13
+ * ```html
14
+ * <button class="ripple active">Pressed ripple</button>
15
+ * ```
16
+ */
17
+ export const PSEUDO_CLASSES = {
18
+ active: 'active',
19
+ checked: 'checked',
20
+ disabled: 'disabled',
21
+ focus: 'focus',
22
+ focusVisible: 'focus-visible',
23
+ hover: 'hover',
24
+ indeterminate: 'indeterminate',
25
+ invalid: 'invalid',
26
+ };
27
+ /**
28
+ * Returns whether the element is disabled.
29
+ *
30
+ * @param element The element to check.
31
+ * @return true if the element is disabled.
32
+ */
33
+ export function isDisabled(element) {
34
+ return element.matches('.disabled,:disabled,[disabled],[aria-disabled=true]');
35
+ }
36
+ //# sourceMappingURL=pseudo-classes.js.map