@material/web 1.0.0-pre.2 → 1.0.0-pre.3

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 (534) hide show
  1. package/README.md +4 -4
  2. package/autocomplete/autocomplete-item.js.map +1 -1
  3. package/autocomplete/autocomplete-list.js.map +1 -1
  4. package/autocomplete/autocomplete-surface.js.map +1 -1
  5. package/autocomplete/filled-autocomplete.d.ts +0 -2
  6. package/autocomplete/filled-autocomplete.js +0 -7
  7. package/autocomplete/filled-autocomplete.js.map +1 -1
  8. package/autocomplete/lib/_filled-autocomplete.scss +22 -28
  9. package/autocomplete/lib/_outlined-autocomplete.scss +23 -29
  10. package/autocomplete/lib/_shared.scss +6 -10
  11. package/autocomplete/lib/autocomplete.d.ts +2 -2
  12. package/autocomplete/lib/autocomplete.js +4 -5
  13. package/autocomplete/lib/autocomplete.js.map +1 -1
  14. package/autocomplete/lib/autocompletelist/autocomplete-list-styles.scss +2 -0
  15. package/autocomplete/lib/autocompletesurface/autocomplete-surface-styles.scss +2 -0
  16. package/autocomplete/lib/filled-styles.css.js +1 -1
  17. package/autocomplete/lib/filled-styles.css.js.map +1 -1
  18. package/autocomplete/lib/filled-styles.scss +2 -0
  19. package/autocomplete/lib/outlined-styles.css.js +1 -1
  20. package/autocomplete/lib/outlined-styles.css.js.map +1 -1
  21. package/autocomplete/lib/outlined-styles.scss +2 -0
  22. package/autocomplete/lib/shared-styles.scss +2 -0
  23. package/autocomplete/outlined-autocomplete.d.ts +0 -2
  24. package/autocomplete/outlined-autocomplete.js +0 -7
  25. package/autocomplete/outlined-autocomplete.js.map +1 -1
  26. package/badge/badge.js.map +1 -1
  27. package/badge/lib/_badge.scss +10 -13
  28. package/badge/lib/badge-styles.css.js +1 -1
  29. package/badge/lib/badge-styles.css.js.map +1 -1
  30. package/badge/lib/badge-styles.scss +2 -0
  31. package/badge/lib/badge.js.map +1 -1
  32. package/button/elevated-button.js.map +1 -1
  33. package/button/elevated-link-button.js.map +1 -1
  34. package/button/filled-button.js.map +1 -1
  35. package/button/filled-link-button.js.map +1 -1
  36. package/button/lib/_elevated-button.scss +10 -15
  37. package/button/lib/_elevation.scss +4 -1
  38. package/button/lib/_filled-button.scss +12 -14
  39. package/button/lib/_icon.scss +1 -0
  40. package/button/lib/_outlined-button.scss +10 -15
  41. package/button/lib/_shared.scss +14 -19
  42. package/button/lib/_text-button.scss +12 -14
  43. package/button/lib/_tonal-button.scss +10 -15
  44. package/button/lib/button.js.map +1 -1
  45. package/button/lib/elevated-styles.css.js +1 -1
  46. package/button/lib/elevated-styles.css.js.map +1 -1
  47. package/button/lib/elevated-styles.scss +2 -0
  48. package/button/lib/filled-styles.css.js +1 -1
  49. package/button/lib/filled-styles.css.js.map +1 -1
  50. package/button/lib/filled-styles.scss +2 -0
  51. package/button/lib/link-button.js.map +1 -1
  52. package/button/lib/outlined-styles.css.js +1 -1
  53. package/button/lib/outlined-styles.css.js.map +1 -1
  54. package/button/lib/outlined-styles.scss +2 -0
  55. package/button/lib/shared-elevation-styles.scss +2 -0
  56. package/button/lib/shared-styles.css.js +1 -1
  57. package/button/lib/shared-styles.css.js.map +1 -1
  58. package/button/lib/shared-styles.scss +2 -0
  59. package/button/lib/text-styles.css.js +1 -1
  60. package/button/lib/text-styles.css.js.map +1 -1
  61. package/button/lib/text-styles.scss +2 -0
  62. package/button/lib/tonal-styles.css.js +1 -1
  63. package/button/lib/tonal-styles.css.js.map +1 -1
  64. package/button/lib/tonal-styles.scss +2 -0
  65. package/button/outlined-button.js.map +1 -1
  66. package/button/outlined-link-button.js.map +1 -1
  67. package/button/text-button.js.map +1 -1
  68. package/button/text-link-button.js.map +1 -1
  69. package/button/tonal-button.js.map +1 -1
  70. package/button/tonal-link-button.js.map +1 -1
  71. package/checkbox/checkbox.js.map +1 -1
  72. package/checkbox/lib/_checkbox.scss +26 -31
  73. package/checkbox/lib/checkbox-styles.css.js +1 -1
  74. package/checkbox/lib/checkbox-styles.css.js.map +1 -1
  75. package/checkbox/lib/checkbox-styles.scss +2 -0
  76. package/checkbox/lib/checkbox.js +6 -6
  77. package/checkbox/lib/checkbox.js.map +1 -1
  78. package/checkbox/lib/forced-colors-styles.scss +2 -0
  79. package/chips/action/delete-action.js.map +1 -1
  80. package/chips/action/lib/action.js +4 -4
  81. package/chips/action/lib/action.js.map +1 -1
  82. package/chips/action/lib/link-action.js +1 -1
  83. package/chips/action/lib/link-action.js.map +1 -1
  84. package/chips/action/lib/primary-action.js.map +1 -1
  85. package/chips/action/lib/selectable-action.js.map +1 -1
  86. package/chips/action/link-action.js.map +1 -1
  87. package/chips/action/presentational-action.js.map +1 -1
  88. package/chips/action/primary-action.js.map +1 -1
  89. package/chips/action/selectable-action.js.map +1 -1
  90. package/chips/chip/lib/_assist-chip-theme.scss +4 -0
  91. package/chips/chip/lib/_chip-theme.scss +29 -40
  92. package/chips/chip/lib/_chip.scss +2 -0
  93. package/chips/chip/lib/_filter-chip-theme.scss +4 -0
  94. package/chips/chip/lib/_input-chip-theme.scss +4 -0
  95. package/chips/chip/lib/_suggestion-chip-theme.scss +4 -0
  96. package/chips/chip/lib/chip.js.map +1 -1
  97. package/chips/chip/lib/foundation.js +4 -4
  98. package/chips/chip/lib/foundation.js.map +1 -1
  99. package/chips/chip/lib/link-chip.js.map +1 -1
  100. package/chips/chip/lib/selectable-chip.js.map +1 -1
  101. package/chips/chip/lib/types.d.ts +2 -2
  102. package/chips/chipset/lib/_chip-set-theme.scss +2 -0
  103. package/chips/chipset/lib/_chip-set.scss +2 -0
  104. package/chips/chipset/lib/foundation.js +3 -3
  105. package/chips/chipset/lib/foundation.js.map +1 -1
  106. package/chips/chipset/lib/types.d.ts +3 -3
  107. package/controller/events.js +4 -0
  108. package/controller/events.js.map +1 -1
  109. package/controller/form-controller.js.map +1 -1
  110. package/controller/foundation.d.ts +1 -1
  111. package/controller/observer.d.ts +2 -2
  112. package/dialog/dialog.js.map +1 -1
  113. package/dialog/harness.d.ts +2 -2
  114. package/dialog/harness.js +11 -8
  115. package/dialog/harness.js.map +1 -1
  116. package/dialog/lib/_dialog.scss +7 -11
  117. package/dialog/lib/_tokens.scss +9 -6
  118. package/dialog/lib/dialog-styles.css.js +1 -1
  119. package/dialog/lib/dialog-styles.css.js.map +1 -1
  120. package/dialog/lib/dialog-styles.scss +2 -0
  121. package/dialog/lib/dialog.js +9 -7
  122. package/dialog/lib/dialog.js.map +1 -1
  123. package/divider/divider.js.map +1 -1
  124. package/divider/lib/_divider.scss +2 -0
  125. package/divider/lib/divider-styles.scss +2 -0
  126. package/divider/lib/divider.js.map +1 -1
  127. package/elevation/elevation.js.map +1 -1
  128. package/elevation/lib/_elevation.scss +4 -0
  129. package/elevation/lib/_md-comp-elevation.scss +4 -0
  130. package/elevation/lib/elevation-styles.scss +2 -0
  131. package/elevation/lib/elevation.js.map +1 -1
  132. package/fab/fab-extended.js.map +1 -1
  133. package/fab/fab.js.map +1 -1
  134. package/fab/lib/_fab-extended.scss +18 -11
  135. package/fab/lib/_fab.scss +7 -2
  136. package/fab/lib/_shared.scss +16 -8
  137. package/fab/lib/fab-extended-styles.css.js +1 -1
  138. package/fab/lib/fab-extended-styles.css.js.map +1 -1
  139. package/fab/lib/fab-extended-styles.scss +2 -0
  140. package/fab/lib/fab-shared-styles.css.js +1 -1
  141. package/fab/lib/fab-shared-styles.css.js.map +1 -1
  142. package/fab/lib/fab-shared-styles.scss +2 -0
  143. package/fab/lib/fab-shared.d.ts +9 -15
  144. package/fab/lib/fab-shared.js +21 -33
  145. package/fab/lib/fab-shared.js.map +1 -1
  146. package/fab/lib/fab-styles.css.js +1 -1
  147. package/fab/lib/fab-styles.css.js.map +1 -1
  148. package/fab/lib/fab-styles.scss +2 -0
  149. package/field/filled-field.d.ts +1 -1
  150. package/field/filled-field.js +1 -1
  151. package/field/filled-field.js.map +1 -1
  152. package/field/harness.js +1 -1
  153. package/field/harness.js.map +1 -1
  154. package/field/lib/_content.scss +35 -50
  155. package/field/lib/_filled-field.scss +60 -79
  156. package/field/lib/_label.scss +26 -63
  157. package/field/lib/_md-comp-filled-field.scss +14 -2
  158. package/field/lib/_md-comp-outlined-field.scss +15 -4
  159. package/field/lib/_outlined-field.scss +96 -110
  160. package/field/lib/_shared.scss +13 -35
  161. package/field/lib/_supporting-text.scss +25 -52
  162. package/field/lib/field.d.ts +14 -31
  163. package/field/lib/field.js +77 -97
  164. package/field/lib/field.js.map +1 -1
  165. package/field/lib/filled-field.d.ts +10 -16
  166. package/field/lib/filled-field.js +14 -37
  167. package/field/lib/filled-field.js.map +1 -1
  168. package/field/lib/filled-styles.css.js +1 -1
  169. package/field/lib/filled-styles.css.js.map +1 -1
  170. package/field/lib/outlined-field.d.ts +4 -10
  171. package/field/lib/outlined-field.js +13 -33
  172. package/field/lib/outlined-field.js.map +1 -1
  173. package/field/lib/outlined-styles.css.js +1 -1
  174. package/field/lib/outlined-styles.css.js.map +1 -1
  175. package/field/lib/shared-styles.css.js +1 -1
  176. package/field/lib/shared-styles.css.js.map +1 -1
  177. package/field/outlined-field.d.ts +1 -1
  178. package/field/outlined-field.js +1 -1
  179. package/field/outlined-field.js.map +1 -1
  180. package/focus/focus-ring.js.map +1 -1
  181. package/focus/lib/_focus-ring.scss +7 -13
  182. package/focus/lib/_md-comp-focus-ring.scss +4 -0
  183. package/focus/lib/focus-ring-styles.css.js +1 -1
  184. package/focus/lib/focus-ring-styles.css.js.map +1 -1
  185. package/focus/lib/focus-ring-styles.scss +2 -0
  186. package/focus/lib/focus-ring.js.map +1 -1
  187. package/icon/icon.js.map +1 -1
  188. package/icon/lib/_icon.scss +2 -0
  189. package/icon/lib/icon-styles.scss +2 -0
  190. package/iconbutton/filled-icon-button-toggle.js.map +1 -1
  191. package/iconbutton/filled-icon-button.js.map +1 -1
  192. package/iconbutton/filled-link-icon-button.js.map +1 -1
  193. package/iconbutton/filled-tonal-icon-button-toggle.js.map +1 -1
  194. package/iconbutton/filled-tonal-icon-button.js.map +1 -1
  195. package/iconbutton/filled-tonal-link-icon-button.js.map +1 -1
  196. package/iconbutton/lib/_filled-icon-button.scss +19 -19
  197. package/iconbutton/lib/_filled-tonal-icon-button.scss +19 -19
  198. package/iconbutton/lib/_outlined-icon-button.scss +20 -16
  199. package/iconbutton/lib/_shared.scss +8 -8
  200. package/iconbutton/lib/_standard-icon-button.scss +21 -18
  201. package/iconbutton/lib/filled-styles.css.js +1 -1
  202. package/iconbutton/lib/filled-styles.css.js.map +1 -1
  203. package/iconbutton/lib/filled-styles.scss +2 -0
  204. package/iconbutton/lib/filled-tonal-styles.css.js +1 -1
  205. package/iconbutton/lib/filled-tonal-styles.css.js.map +1 -1
  206. package/iconbutton/lib/filled-tonal-styles.scss +2 -0
  207. package/iconbutton/lib/icon-button-toggle.js.map +1 -1
  208. package/iconbutton/lib/icon-button.js.map +1 -1
  209. package/iconbutton/lib/link-icon-button.js.map +1 -1
  210. package/iconbutton/lib/outlined-styles.css.js +1 -1
  211. package/iconbutton/lib/outlined-styles.css.js.map +1 -1
  212. package/iconbutton/lib/outlined-styles.scss +2 -0
  213. package/iconbutton/lib/shared-styles.scss +2 -0
  214. package/iconbutton/lib/standard-styles.css.js +1 -1
  215. package/iconbutton/lib/standard-styles.css.js.map +1 -1
  216. package/iconbutton/lib/standard-styles.scss +2 -0
  217. package/iconbutton/outlined-icon-button-toggle.js.map +1 -1
  218. package/iconbutton/outlined-icon-button.js.map +1 -1
  219. package/iconbutton/outlined-link-icon-button.js.map +1 -1
  220. package/iconbutton/standard-icon-button-toggle.js.map +1 -1
  221. package/iconbutton/standard-icon-button.js.map +1 -1
  222. package/iconbutton/standard-link-icon-button.js.map +1 -1
  223. package/list/lib/_list.scss +6 -2
  224. package/list/lib/avatar/_list-item-avatar.scss +2 -0
  225. package/list/lib/avatar/list-item-avatar-styles.scss +2 -0
  226. package/list/lib/avatar/list-item-avatar.js.map +1 -1
  227. package/list/lib/icon/_list-item-icon.scss +4 -0
  228. package/list/lib/icon/list-item-icon-styles.scss +2 -0
  229. package/list/lib/image/_list-item-image.scss +5 -1
  230. package/list/lib/image/list-item-image-styles.scss +2 -0
  231. package/list/lib/image/list-item-image.js.map +1 -1
  232. package/list/lib/list-styles.css.js +1 -1
  233. package/list/lib/list-styles.css.js.map +1 -1
  234. package/list/lib/list-styles.scss +2 -0
  235. package/list/lib/list.js +3 -1
  236. package/list/lib/list.js.map +1 -1
  237. package/list/lib/listitem/_list-item.scss +31 -30
  238. package/list/lib/listitem/list-item-private-styles.css.js +1 -1
  239. package/list/lib/listitem/list-item-private-styles.css.js.map +1 -1
  240. package/list/lib/listitem/list-item-private-styles.scss +2 -0
  241. package/list/lib/listitem/list-item-styles.css.js +1 -1
  242. package/list/lib/listitem/list-item-styles.css.js.map +1 -1
  243. package/list/lib/listitem/list-item-styles.scss +2 -0
  244. package/list/lib/listitem/list-item.d.ts +1 -1
  245. package/list/lib/listitem/list-item.js +3 -1
  246. package/list/lib/listitem/list-item.js.map +1 -1
  247. package/list/lib/listitemlink/list-item-link.js.map +1 -1
  248. package/list/lib/video/_list-item-video.scss +5 -1
  249. package/list/lib/video/list-item-video-styles.scss +2 -0
  250. package/list/lib/video/list-item-video.js.map +1 -1
  251. package/list/list-item-avatar.js.map +1 -1
  252. package/list/list-item-icon.js.map +1 -1
  253. package/list/list-item-image.js.map +1 -1
  254. package/list/list-item-link.js.map +1 -1
  255. package/list/list-item-video.js.map +1 -1
  256. package/list/list-item.js.map +1 -1
  257. package/list/list.js.map +1 -1
  258. package/menu/lib/_menu.scss +7 -4
  259. package/menu/lib/menu-styles.css.js +1 -1
  260. package/menu/lib/menu-styles.css.js.map +1 -1
  261. package/menu/lib/menu-styles.scss +2 -0
  262. package/menu/lib/menu.d.ts +1 -1
  263. package/menu/lib/menu.js.map +1 -1
  264. package/menu/lib/menuitem/_menu-item.scss +17 -9
  265. package/menu/lib/menuitem/menu-item-private-styles.css.js +1 -1
  266. package/menu/lib/menuitem/menu-item-private-styles.css.js.map +1 -1
  267. package/menu/lib/menuitem/menu-item-private-styles.scss +2 -0
  268. package/menu/lib/menuitem/menu-item-styles.css.js +1 -1
  269. package/menu/lib/menuitem/menu-item-styles.css.js.map +1 -1
  270. package/menu/lib/menuitem/menu-item-styles.scss +2 -0
  271. package/menu/lib/menuitem/menu-item.js.map +1 -1
  272. package/menu/lib/menuitemlink/menu-item-link.js.map +1 -1
  273. package/menu/lib/shared.d.ts +3 -3
  274. package/menu/lib/submenuitem/sub-menu-item.js.map +1 -1
  275. package/menu/lib/surfacePositionController.d.ts +1 -1
  276. package/menu/lib/typeaheadController.d.ts +1 -1
  277. package/menu/menu-item-link.js.map +1 -1
  278. package/menu/menu-item.js.map +1 -1
  279. package/menu/menu.js.map +1 -1
  280. package/menu/sub-menu-item.js.map +1 -1
  281. package/menusurface/lib/_md-comp-menu-surface.scss +4 -0
  282. package/menusurface/lib/_menu-surface.scss +4 -0
  283. package/menusurface/lib/foundation.js +31 -31
  284. package/menusurface/lib/foundation.js.map +1 -1
  285. package/menusurface/lib/menu-surface-styles.scss +2 -0
  286. package/menusurface/lib/menu-surface.d.ts +2 -2
  287. package/menusurface/lib/menu-surface.js.map +1 -1
  288. package/menusurface/menu-surface.js.map +1 -1
  289. package/navigationbar/lib/_navigation-bar.scss +2 -0
  290. package/navigationbar/lib/constants.d.ts +1 -1
  291. package/navigationbar/lib/navigation-bar-styles.scss +2 -0
  292. package/navigationbar/lib/navigation-bar.js.map +1 -1
  293. package/navigationbar/navigation-bar.js.map +1 -1
  294. package/navigationdrawer/lib/_navigation-drawer-modal.scss +11 -2
  295. package/navigationdrawer/lib/_navigation-drawer.scss +10 -5
  296. package/navigationdrawer/lib/_shared.scss +4 -8
  297. package/navigationdrawer/lib/navigation-drawer-modal-styles.css.js +1 -1
  298. package/navigationdrawer/lib/navigation-drawer-modal-styles.css.js.map +1 -1
  299. package/navigationdrawer/lib/navigation-drawer-modal-styles.scss +2 -0
  300. package/navigationdrawer/lib/navigation-drawer-modal.js.map +1 -1
  301. package/navigationdrawer/lib/navigation-drawer-styles.css.js +1 -1
  302. package/navigationdrawer/lib/navigation-drawer-styles.css.js.map +1 -1
  303. package/navigationdrawer/lib/navigation-drawer-styles.scss +2 -0
  304. package/navigationdrawer/lib/navigation-drawer.js.map +1 -1
  305. package/navigationdrawer/lib/shared-styles.scss +2 -0
  306. package/navigationdrawer/navigation-drawer-modal.js.map +1 -1
  307. package/navigationdrawer/navigation-drawer.js.map +1 -1
  308. package/navigationtab/lib/_navigation-tab.scss +26 -22
  309. package/navigationtab/lib/navigation-tab-styles.css.js +1 -1
  310. package/navigationtab/lib/navigation-tab-styles.css.js.map +1 -1
  311. package/navigationtab/lib/navigation-tab-styles.scss +2 -0
  312. package/navigationtab/lib/navigation-tab.js +4 -4
  313. package/navigationtab/lib/navigation-tab.js.map +1 -1
  314. package/navigationtab/navigation-tab.js.map +1 -1
  315. package/package.json +2 -2
  316. package/radio/lib/_radio.scss +16 -14
  317. package/radio/lib/forced-colors-styles.scss +2 -0
  318. package/radio/lib/radio-styles.css.js +1 -1
  319. package/radio/lib/radio-styles.css.js.map +1 -1
  320. package/radio/lib/radio-styles.scss +2 -0
  321. package/radio/lib/radio.js +21 -21
  322. package/radio/lib/radio.js.map +1 -1
  323. package/radio/radio.js.map +1 -1
  324. package/ripple/directive.d.ts +1 -33
  325. package/ripple/directive.js +7 -194
  326. package/ripple/directive.js.map +1 -1
  327. package/ripple/lib/_md-comp-ripple.scss +20 -19
  328. package/ripple/lib/_ripple.scss +20 -20
  329. package/ripple/lib/ripple-styles.css.js +1 -1
  330. package/ripple/lib/ripple-styles.css.js.map +1 -1
  331. package/ripple/lib/ripple-styles.scss +2 -0
  332. package/ripple/lib/ripple.d.ts +50 -48
  333. package/ripple/lib/ripple.js +214 -76
  334. package/ripple/lib/ripple.js.map +1 -1
  335. package/ripple/ripple.d.ts +9 -1
  336. package/ripple/ripple.js +9 -1
  337. package/ripple/ripple.js.map +1 -1
  338. package/sass/_assert.scss +2 -0
  339. package/sass/_color-scheme.scss +4 -0
  340. package/sass/_color.scss +4 -0
  341. package/sass/_elevation.scss +4 -0
  342. package/sass/_feature-flags.scss +2 -0
  343. package/sass/_map-ext.scss +2 -0
  344. package/sass/_resolvers.scss +4 -4
  345. package/sass/_shape.scss +75 -27
  346. package/sass/_string-ext.scss +44 -0
  347. package/sass/_theme.scss +4 -0
  348. package/sass/_typography.scss +18 -93
  349. package/sass/_var.scss +4 -0
  350. package/segmentedbutton/lib/_outlined-segmented-button.scss +4 -0
  351. package/segmentedbutton/lib/_shared.scss +18 -22
  352. package/segmentedbutton/lib/outlined-styles.css.js +1 -1
  353. package/segmentedbutton/lib/outlined-styles.css.js.map +1 -1
  354. package/segmentedbutton/lib/outlined-styles.scss +2 -0
  355. package/segmentedbutton/lib/segmented-button.js +4 -4
  356. package/segmentedbutton/lib/segmented-button.js.map +1 -1
  357. package/segmentedbutton/lib/shared-styles.css.js +1 -1
  358. package/segmentedbutton/lib/shared-styles.css.js.map +1 -1
  359. package/segmentedbutton/lib/shared-styles.scss +2 -0
  360. package/segmentedbutton/outlined-segmented-button.js.map +1 -1
  361. package/segmentedbuttonset/lib/_outlined-segmented-button-set.scss +9 -5
  362. package/segmentedbuttonset/lib/_shared.scss +0 -13
  363. package/segmentedbuttonset/lib/outlined-styles.css.js +1 -1
  364. package/segmentedbuttonset/lib/outlined-styles.css.js.map +1 -1
  365. package/segmentedbuttonset/lib/outlined-styles.scss +2 -0
  366. package/segmentedbuttonset/lib/segmented-button-set.js.map +1 -1
  367. package/segmentedbuttonset/lib/shared-styles.scss +2 -0
  368. package/segmentedbuttonset/outlined-segmented-button-set.js.map +1 -1
  369. package/slider/_slider.scss +6 -0
  370. package/slider/harness.d.ts +20 -0
  371. package/slider/harness.js +63 -0
  372. package/slider/harness.js.map +1 -0
  373. package/slider/lib/_slider.scss +503 -0
  374. package/slider/lib/_tokens.scss +66 -0
  375. package/slider/lib/forced-colors-styles.css.js +9 -0
  376. package/slider/lib/forced-colors-styles.css.js.map +1 -0
  377. package/slider/lib/forced-colors-styles.scss +53 -0
  378. package/slider/lib/slider-styles.css.js +9 -0
  379. package/slider/lib/slider-styles.css.js.map +1 -0
  380. package/slider/lib/slider-styles.scss +8 -0
  381. package/slider/lib/slider.d.ts +158 -0
  382. package/slider/lib/slider.js +575 -0
  383. package/slider/lib/slider.js.map +1 -0
  384. package/slider/slider.d.ts +28 -0
  385. package/slider/slider.js +32 -0
  386. package/slider/slider.js.map +1 -0
  387. package/switch/lib/README.md +55 -0
  388. package/switch/lib/_handle.scss +17 -18
  389. package/switch/lib/_icon.scss +4 -0
  390. package/switch/lib/_switch.scss +11 -18
  391. package/switch/lib/_track.scss +2 -0
  392. package/switch/lib/switch-styles.css.js +1 -1
  393. package/switch/lib/switch-styles.css.js.map +1 -1
  394. package/switch/lib/switch-styles.scss +2 -0
  395. package/switch/lib/switch.js +9 -9
  396. package/switch/lib/switch.js.map +1 -1
  397. package/switch/switch.js.map +1 -1
  398. package/textfield/filled-text-field.d.ts +1 -1
  399. package/textfield/filled-text-field.js +1 -2
  400. package/textfield/filled-text-field.js.map +1 -1
  401. package/textfield/harness.js +1 -1
  402. package/textfield/harness.js.map +1 -1
  403. package/textfield/lib/_filled-text-field.scss +25 -21
  404. package/textfield/lib/_icon.scss +41 -56
  405. package/textfield/lib/_input.scss +17 -36
  406. package/textfield/lib/_outlined-text-field.scss +26 -21
  407. package/textfield/lib/_shared.scss +10 -29
  408. package/textfield/lib/filled-forced-colors-styles.scss +2 -0
  409. package/textfield/lib/filled-styles.css.js +1 -1
  410. package/textfield/lib/filled-styles.css.js.map +1 -1
  411. package/textfield/lib/filled-styles.scss +2 -0
  412. package/textfield/lib/filled-text-field.d.ts +6 -5
  413. package/textfield/lib/filled-text-field.js +8 -7
  414. package/textfield/lib/filled-text-field.js.map +1 -1
  415. package/textfield/lib/outlined-forced-colors-styles.scss +2 -0
  416. package/textfield/lib/outlined-styles.css.js +1 -1
  417. package/textfield/lib/outlined-styles.css.js.map +1 -1
  418. package/textfield/lib/outlined-styles.scss +2 -0
  419. package/textfield/lib/outlined-text-field.d.ts +6 -5
  420. package/textfield/lib/outlined-text-field.js +8 -7
  421. package/textfield/lib/outlined-text-field.js.map +1 -1
  422. package/textfield/lib/shared-styles.css.js +1 -1
  423. package/textfield/lib/shared-styles.css.js.map +1 -1
  424. package/textfield/lib/shared-styles.scss +2 -0
  425. package/textfield/lib/text-field.d.ts +40 -88
  426. package/textfield/lib/text-field.js +194 -270
  427. package/textfield/lib/text-field.js.map +1 -1
  428. package/textfield/outlined-text-field.d.ts +1 -1
  429. package/textfield/outlined-text-field.js +1 -2
  430. package/textfield/outlined-text-field.js.map +1 -1
  431. package/tokens/_index.scss +1 -1
  432. package/tokens/{v0_152 → v0_160}/_md-comp-assist-chip.scss +1 -1
  433. package/tokens/{v0_152 → v0_160}/_md-comp-badge.scss +1 -1
  434. package/tokens/{v0_152 → v0_160}/_md-comp-banner.scss +1 -1
  435. package/tokens/{v0_152 → v0_160}/_md-comp-bottom-app-bar.scss +1 -1
  436. package/tokens/{v0_152 → v0_160}/_md-comp-carousel-item.scss +1 -1
  437. package/tokens/{v0_152 → v0_160}/_md-comp-checkbox.scss +4 -15
  438. package/tokens/{v0_152 → v0_160}/_md-comp-circular-progress-indicator.scss +1 -1
  439. package/tokens/{v0_152 → v0_160}/_md-comp-data-table.scss +1 -3
  440. package/tokens/{v0_152 → v0_160}/_md-comp-date-input-modal.scss +10 -10
  441. package/tokens/{v0_152 → v0_160}/_md-comp-date-picker-docked.scss +23 -23
  442. package/tokens/{v0_152 → v0_160}/_md-comp-date-picker-modal.scss +34 -34
  443. package/tokens/{v0_152 → v0_160}/_md-comp-dialog.scss +1 -1
  444. package/tokens/{v0_152 → v0_160}/_md-comp-divider.scss +1 -1
  445. package/tokens/{v0_152 → v0_160}/_md-comp-elevated-button.scss +1 -1
  446. package/tokens/{v0_152 → v0_160}/_md-comp-elevated-card.scss +1 -1
  447. package/tokens/{v0_152 → v0_160}/_md-comp-extended-fab-branded.scss +1 -1
  448. package/tokens/{v0_152 → v0_160}/_md-comp-extended-fab-primary.scss +1 -1
  449. package/tokens/{v0_152 → v0_160}/_md-comp-extended-fab-secondary.scss +1 -1
  450. package/tokens/{v0_152 → v0_160}/_md-comp-extended-fab-surface.scss +1 -1
  451. package/tokens/{v0_152 → v0_160}/_md-comp-extended-fab-tertiary.scss +1 -1
  452. package/tokens/{v0_152 → v0_160}/_md-comp-fab-branded-large.scss +1 -1
  453. package/tokens/{v0_152 → v0_160}/_md-comp-fab-branded.scss +1 -1
  454. package/tokens/{v0_152 → v0_160}/_md-comp-fab-primary-large.scss +1 -1
  455. package/tokens/{v0_152 → v0_160}/_md-comp-fab-primary-small.scss +1 -1
  456. package/tokens/{v0_152 → v0_160}/_md-comp-fab-primary.scss +1 -1
  457. package/tokens/{v0_152 → v0_160}/_md-comp-fab-secondary-large.scss +1 -1
  458. package/tokens/{v0_152 → v0_160}/_md-comp-fab-secondary-small.scss +1 -1
  459. package/tokens/{v0_152 → v0_160}/_md-comp-fab-secondary.scss +1 -1
  460. package/tokens/{v0_152 → v0_160}/_md-comp-fab-surface-large.scss +1 -1
  461. package/tokens/{v0_152 → v0_160}/_md-comp-fab-surface-small.scss +1 -1
  462. package/tokens/{v0_152 → v0_160}/_md-comp-fab-surface.scss +1 -1
  463. package/tokens/{v0_152 → v0_160}/_md-comp-fab-tertiary-large.scss +1 -1
  464. package/tokens/{v0_152 → v0_160}/_md-comp-fab-tertiary-small.scss +1 -1
  465. package/tokens/{v0_152 → v0_160}/_md-comp-fab-tertiary.scss +1 -1
  466. package/tokens/{v0_152 → v0_160}/_md-comp-filled-autocomplete.scss +1 -1
  467. package/tokens/{v0_152 → v0_160}/_md-comp-filled-button.scss +1 -1
  468. package/tokens/{v0_152 → v0_160}/_md-comp-filled-card.scss +1 -1
  469. package/tokens/{v0_152 → v0_160}/_md-comp-filled-icon-button.scss +1 -1
  470. package/tokens/{v0_152 → v0_160}/_md-comp-filled-menu-button.scss +1 -1
  471. package/tokens/{v0_152 → v0_160}/_md-comp-filled-select.scss +1 -1
  472. package/tokens/{v0_152 → v0_160}/_md-comp-filled-text-field.scss +1 -1
  473. package/tokens/{v0_152 → v0_160}/_md-comp-filled-tonal-button.scss +1 -1
  474. package/tokens/{v0_152 → v0_160}/_md-comp-filled-tonal-icon-button.scss +1 -1
  475. package/tokens/{v0_152 → v0_160}/_md-comp-filter-chip.scss +1 -1
  476. package/tokens/{v0_152 → v0_160}/_md-comp-full-screen-dialog.scss +1 -1
  477. package/tokens/{v0_152 → v0_160}/_md-comp-icon-button.scss +1 -1
  478. package/tokens/{v0_152 → v0_160}/_md-comp-input-chip.scss +1 -1
  479. package/tokens/{v0_152 → v0_160}/_md-comp-linear-progress-indicator.scss +1 -1
  480. package/tokens/{v0_152 → v0_160}/_md-comp-list.scss +1 -1
  481. package/tokens/{v0_152 → v0_160}/_md-comp-menu.scss +1 -1
  482. package/tokens/{v0_152 → v0_160}/_md-comp-navigation-bar.scss +1 -1
  483. package/tokens/{v0_152 → v0_160}/_md-comp-navigation-drawer.scss +1 -1
  484. package/tokens/{v0_152 → v0_160}/_md-comp-navigation-rail.scss +1 -1
  485. package/tokens/{v0_152 → v0_160}/_md-comp-outlined-autocomplete.scss +1 -1
  486. package/tokens/{v0_152 → v0_160}/_md-comp-outlined-button.scss +1 -1
  487. package/tokens/{v0_152 → v0_160}/_md-comp-outlined-card.scss +1 -1
  488. package/tokens/{v0_152 → v0_160}/_md-comp-outlined-icon-button.scss +1 -1
  489. package/tokens/{v0_152 → v0_160}/_md-comp-outlined-menu-button.scss +1 -1
  490. package/tokens/{v0_152 → v0_160}/_md-comp-outlined-segmented-button.scss +1 -1
  491. package/tokens/{v0_152 → v0_160}/_md-comp-outlined-select.scss +1 -1
  492. package/tokens/{v0_152 → v0_160}/_md-comp-outlined-text-field.scss +1 -1
  493. package/tokens/{v0_152 → v0_160}/_md-comp-plain-tooltip.scss +1 -1
  494. package/tokens/{v0_152 → v0_160}/_md-comp-primary-navigation-tab.scss +1 -3
  495. package/tokens/{v0_152 → v0_160}/_md-comp-radio-button.scss +1 -1
  496. package/tokens/{v0_152 → v0_160}/_md-comp-rich-tooltip.scss +1 -1
  497. package/tokens/{v0_152 → v0_160}/_md-comp-scrim.scss +1 -1
  498. package/tokens/{v0_152 → v0_160}/_md-comp-search-bar.scss +1 -1
  499. package/tokens/{v0_152 → v0_160}/_md-comp-search-view.scss +1 -1
  500. package/tokens/{v0_152 → v0_160}/_md-comp-secondary-navigation-tab.scss +1 -3
  501. package/tokens/{v0_152 → v0_160}/_md-comp-sheet-bottom.scss +1 -1
  502. package/tokens/{v0_152 → v0_160}/_md-comp-sheet-floating.scss +1 -1
  503. package/tokens/{v0_152 → v0_160}/_md-comp-sheet-side.scss +10 -10
  504. package/tokens/{v0_152 → v0_160}/_md-comp-slider.scss +1 -1
  505. package/tokens/{v0_152 → v0_160}/_md-comp-snackbar.scss +1 -1
  506. package/tokens/{v0_152 → v0_160}/_md-comp-standard-menu-button.scss +1 -1
  507. package/tokens/{v0_152 → v0_160}/_md-comp-suggestion-chip.scss +1 -1
  508. package/tokens/{v0_152 → v0_160}/_md-comp-switch.scss +1 -1
  509. package/tokens/{v0_152 → v0_160}/_md-comp-text-button.scss +1 -1
  510. package/tokens/{v0_152 → v0_160}/_md-comp-time-input.scss +1 -1
  511. package/tokens/{v0_152 → v0_160}/_md-comp-time-picker.scss +1 -1
  512. package/tokens/{v0_152 → v0_160}/_md-comp-top-app-bar-large.scss +1 -1
  513. package/tokens/{v0_152 → v0_160}/_md-comp-top-app-bar-medium.scss +1 -1
  514. package/tokens/{v0_152 → v0_160}/_md-comp-top-app-bar-small-centered.scss +1 -1
  515. package/tokens/{v0_152 → v0_160}/_md-comp-top-app-bar-small.scss +1 -1
  516. package/tokens/{v0_152 → v0_160}/_md-ref-palette.scss +1 -1
  517. package/tokens/{v0_152 → v0_160}/_md-ref-typeface.scss +1 -1
  518. package/tokens/{v0_152 → v0_160}/_md-sys-color.scss +217 -1
  519. package/tokens/{v0_152 → v0_160}/_md-sys-elevation.scss +1 -1
  520. package/tokens/{v0_152 → v0_160}/_md-sys-motion.scss +1 -1
  521. package/tokens/{v0_152 → v0_160}/_md-sys-shape.scss +1 -1
  522. package/tokens/{v0_152 → v0_160}/_md-sys-state.scss +1 -1
  523. package/tokens/{v0_152 → v0_160}/_md-sys-typescale.scss +1 -1
  524. package/tokens/v0_160/index.test.css.d.ts +1 -0
  525. package/tokens/v0_160/lib.test.css.d.ts +1 -0
  526. /package/{tokens/v0_152/index.test.css.d.ts → slider/lib/forced-colors-styles.css.d.ts} +0 -0
  527. /package/{tokens/v0_152/lib.test.css.d.ts → slider/lib/slider-styles.css.d.ts} +0 -0
  528. /package/tokens/{v0_152 → v0_160}/_index.scss +0 -0
  529. /package/tokens/{v0_152 → v0_160}/index.test.css.js +0 -0
  530. /package/tokens/{v0_152 → v0_160}/index.test.css.js.map +0 -0
  531. /package/tokens/{v0_152 → v0_160}/index.test.scss +0 -0
  532. /package/tokens/{v0_152 → v0_160}/lib.test.css.js +0 -0
  533. /package/tokens/{v0_152 → v0_160}/lib.test.css.js.map +0 -0
  534. /package/tokens/{v0_152 → v0_160}/lib.test.scss +0 -0
@@ -3,60 +3,62 @@
3
3
  * Copyright 2022 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { LitElement, PropertyValues, TemplateResult } from 'lit';
7
- import { ClassInfo } from 'lit/directives/class-map.js';
8
- /** @soyCompatible */
6
+ import { LitElement, PropertyValues } from 'lit';
7
+ /**
8
+ * A ripple component.
9
+ */
9
10
  export declare class Ripple extends LitElement {
10
- mdRoot: HTMLElement;
11
+ /**
12
+ * Sets the ripple to be an unbounded circle.
13
+ */
11
14
  unbounded: boolean;
12
- disabled: boolean;
13
- protected hovered: boolean;
14
- protected focused: boolean;
15
- protected pressed: boolean;
16
- protected rippleSize: string;
17
- protected rippleScale: string;
18
- protected initialSize: number;
19
- protected pressAnimationSignal: import("../../motion/animation.js").AnimationSignal;
20
- protected growAnimation: Animation | null;
21
- protected delayedEndPressHandle: number | null;
22
- /** @soyTemplate */
23
- protected render(): TemplateResult;
24
- /** @soyTemplate */
25
- protected getRenderRippleClasses(): ClassInfo;
26
- protected update(changedProps: PropertyValues<this>): void;
27
- protected getDimensions(): DOMRect;
28
- protected determineRippleSize(): void;
29
- protected getNormalizedPointerEventCoords(pointerEvent: PointerEvent): {
30
- x: number;
31
- y: number;
32
- };
33
- protected getTranslationCoordinates(positionEvent?: Event | null): {
34
- startPoint: {
35
- x: number;
36
- y: number;
37
- };
38
- endPoint: {
39
- x: number;
40
- y: number;
41
- };
42
- };
43
- protected startPressAnimation(positionEvent?: Event | null): void;
44
15
  /**
45
- * @deprecated Use beginHover
16
+ * Disables the ripple.
46
17
  */
47
- startHover(hoverEvent?: Event): void;
48
- beginHover(hoverEvent?: Event): void;
49
- endHover(): void;
18
+ disabled: boolean;
19
+ private hovered;
20
+ private focused;
21
+ private pressed;
22
+ private readonly mdRoot;
23
+ private rippleSize;
24
+ private rippleScale;
25
+ private initialSize;
26
+ private growAnimation?;
27
+ private state;
28
+ private rippleStartEvent?;
29
+ private checkBoundsAfterContextMenu;
30
+ handlePointerenter(event: PointerEvent): void;
31
+ handlePointerleave(event: PointerEvent): void;
32
+ handleFocusin(): void;
33
+ handleFocusout(): void;
34
+ handlePointerup(event: PointerEvent): void;
35
+ handlePointerdown(event: PointerEvent): Promise<void>;
36
+ handleClick(): void;
37
+ handlePointercancel(event: PointerEvent): void;
38
+ handleContextmenu(): void;
39
+ protected render(): import("lit-html").TemplateResult<1>;
40
+ protected update(changedProps: PropertyValues<this>): void;
41
+ private getDimensions;
42
+ private determineRippleSize;
43
+ private getNormalizedPointerEventCoords;
44
+ private getTranslationCoordinates;
45
+ private startPressAnimation;
46
+ private endPressAnimation;
50
47
  /**
51
- * @deprecated Use beginFocus
48
+ * Returns `true` if
49
+ * - the ripple element is enabled
50
+ * - the pointer is primary for the input type
51
+ * - the pointer is the pointer that started the interaction, or will start
52
+ * the interaction
53
+ * - the pointer is a touch, or the pointer state has the primary button
54
+ * held, or the pointer is hovering
52
55
  */
53
- startFocus(): void;
54
- beginFocus(): void;
55
- endFocus(): void;
56
+ private shouldReactToEvent;
56
57
  /**
57
- * @deprecated Use beginPress
58
+ * Check if the event is within the bounds of the element.
59
+ *
60
+ * This is only needed for the "stuck" contextmenu longpress on Chrome.
58
61
  */
59
- startPress(positionEvent?: Event | null): void;
60
- beginPress(positionEvent?: Event | null): void;
61
- endPress(): void;
62
+ private inBounds;
63
+ private isTouch;
62
64
  }
@@ -7,7 +7,7 @@ import { __decorate, __metadata } from "tslib";
7
7
  import { html, LitElement } from 'lit';
8
8
  import { property, query, state } from 'lit/decorators.js';
9
9
  import { classMap } from 'lit/directives/class-map.js';
10
- import { createAnimationSignal, EASING } from '../../motion/animation.js';
10
+ import { EASING } from '../../motion/animation.js';
11
11
  const PRESS_GROW_MS = 450;
12
12
  const MINIMUM_PRESS_MS = 225;
13
13
  const INITIAL_ORIGIN_SCALE = 0.2;
@@ -16,14 +16,72 @@ const SOFT_EDGE_MINIMUM_SIZE = 75;
16
16
  const SOFT_EDGE_CONTAINER_RATIO = 0.35;
17
17
  const PRESS_PSEUDO = '::after';
18
18
  const ANIMATION_FILL = 'forwards';
19
- /** @soyCompatible */
19
+ /**
20
+ * Interaction states for the ripple.
21
+ *
22
+ * On Touch:
23
+ * - `INACTIVE -> TOUCH_DELAY -> WAITING_FOR_CLICK -> INACTIVE`
24
+ * - `INACTIVE -> TOUCH_DELAY -> HOLDING -> WAITING_FOR_CLICK -> INACTIVE`
25
+ *
26
+ * On Mouse or Pen:
27
+ * - `INACTIVE -> WAITING_FOR_CLICK -> INACTIVE`
28
+ */
29
+ var State;
30
+ (function (State) {
31
+ /**
32
+ * Initial state of the control, no touch in progress.
33
+ *
34
+ * Transitions:
35
+ * - on touch down: transition to `TOUCH_DELAY`.
36
+ * - on mouse down: transition to `WAITING_FOR_CLICK`.
37
+ */
38
+ State[State["INACTIVE"] = 0] = "INACTIVE";
39
+ /**
40
+ * Touch down has been received, waiting to determine if it's a swipe or
41
+ * scroll.
42
+ *
43
+ * Transitions:
44
+ * - on touch up: begin press; transition to `WAITING_FOR_CLICK`.
45
+ * - on cancel: transition to `INACTIVE`.
46
+ * - after `TOUCH_DELAY_MS`: begin press; transition to `HOLDING`.
47
+ */
48
+ State[State["TOUCH_DELAY"] = 1] = "TOUCH_DELAY";
49
+ /**
50
+ * A touch has been deemed to be a press
51
+ *
52
+ * Transitions:
53
+ * - on up: transition to `WAITING_FOR_CLICK`.
54
+ */
55
+ State[State["HOLDING"] = 2] = "HOLDING";
56
+ /**
57
+ * The user touch has finished, transition into rest state.
58
+ *
59
+ * Transitions:
60
+ * - on click end press; transition to `INACTIVE`.
61
+ */
62
+ State[State["WAITING_FOR_CLICK"] = 3] = "WAITING_FOR_CLICK";
63
+ })(State || (State = {}));
64
+ /**
65
+ * Delay reacting to touch so that we do not show the ripple for a swipe or
66
+ * scroll interaction.
67
+ */
68
+ const TOUCH_DELAY_MS = 150;
69
+ /**
70
+ * A ripple component.
71
+ */
20
72
  export class Ripple extends LitElement {
21
73
  constructor() {
22
74
  super(...arguments);
23
75
  // TODO(https://bugs.webkit.org/show_bug.cgi?id=247546)
24
76
  // Remove Safari workaround that requires reflecting `unbounded` so
25
77
  // it can be styled against.
78
+ /**
79
+ * Sets the ripple to be an unbounded circle.
80
+ */
26
81
  this.unbounded = false;
82
+ /**
83
+ * Disables the ripple.
84
+ */
27
85
  this.disabled = false;
28
86
  this.hovered = false;
29
87
  this.focused = false;
@@ -31,28 +89,116 @@ export class Ripple extends LitElement {
31
89
  this.rippleSize = '';
32
90
  this.rippleScale = '';
33
91
  this.initialSize = 0;
34
- this.pressAnimationSignal = createAnimationSignal();
35
- this.growAnimation = null;
36
- this.delayedEndPressHandle = null;
92
+ this.state = State.INACTIVE;
93
+ this.checkBoundsAfterContextMenu = false;
94
+ }
95
+ handlePointerenter(event) {
96
+ if (!this.shouldReactToEvent(event)) {
97
+ return;
98
+ }
99
+ this.hovered = true;
100
+ }
101
+ handlePointerleave(event) {
102
+ if (!this.shouldReactToEvent(event)) {
103
+ return;
104
+ }
105
+ this.hovered = false;
106
+ // release a held mouse or pen press that moves outside the element
107
+ if (this.state !== State.INACTIVE) {
108
+ this.endPressAnimation();
109
+ }
110
+ }
111
+ handleFocusin() {
112
+ this.focused = true;
113
+ }
114
+ handleFocusout() {
115
+ this.focused = false;
116
+ }
117
+ handlePointerup(event) {
118
+ if (!this.shouldReactToEvent(event)) {
119
+ return;
120
+ }
121
+ if (this.state === State.HOLDING) {
122
+ this.state = State.WAITING_FOR_CLICK;
123
+ return;
124
+ }
125
+ if (this.state === State.TOUCH_DELAY) {
126
+ this.state = State.WAITING_FOR_CLICK;
127
+ this.startPressAnimation(this.rippleStartEvent);
128
+ return;
129
+ }
130
+ }
131
+ async handlePointerdown(event) {
132
+ if (!this.shouldReactToEvent(event)) {
133
+ return;
134
+ }
135
+ this.rippleStartEvent = event;
136
+ if (!this.isTouch(event)) {
137
+ this.state = State.WAITING_FOR_CLICK;
138
+ this.startPressAnimation(event);
139
+ return;
140
+ }
141
+ // after a longpress contextmenu event, an extra `pointerdown` can be
142
+ // dispatched to the pressed element. Check that the down is within
143
+ // bounds of the element in this case.
144
+ if (this.checkBoundsAfterContextMenu && !this.inBounds(event)) {
145
+ return;
146
+ }
147
+ this.checkBoundsAfterContextMenu = false;
148
+ // Wait for a hold after touch delay
149
+ this.state = State.TOUCH_DELAY;
150
+ await new Promise(resolve => {
151
+ setTimeout(resolve, TOUCH_DELAY_MS);
152
+ });
153
+ if (this.state !== State.TOUCH_DELAY) {
154
+ return;
155
+ }
156
+ this.state = State.HOLDING;
157
+ this.startPressAnimation(event);
158
+ }
159
+ handleClick() {
160
+ // Click is a MouseEvent in Firefox and Safari, so we cannot use
161
+ // `shouldReactToEvent`
162
+ if (this.disabled) {
163
+ return;
164
+ }
165
+ if (this.state === State.WAITING_FOR_CLICK) {
166
+ this.endPressAnimation();
167
+ return;
168
+ }
169
+ if (this.state === State.INACTIVE) {
170
+ // keyboard synthesized click event
171
+ this.startPressAnimation();
172
+ this.endPressAnimation();
173
+ }
174
+ }
175
+ handlePointercancel(event) {
176
+ if (!this.shouldReactToEvent(event)) {
177
+ return;
178
+ }
179
+ this.endPressAnimation();
180
+ }
181
+ handleContextmenu() {
182
+ if (this.disabled) {
183
+ return;
184
+ }
185
+ this.checkBoundsAfterContextMenu = true;
186
+ this.endPressAnimation();
37
187
  }
38
- /** @soyTemplate */
39
188
  render() {
40
- return html `<div class="md3-ripple-surface ${classMap(this.getRenderRippleClasses())}"></div>`;
41
- }
42
- /** @soyTemplate */
43
- getRenderRippleClasses() {
44
- return {
45
- 'md3-ripple--hovered': this.hovered,
46
- 'md3-ripple--focused': this.focused,
47
- 'md3-ripple--pressed': this.pressed,
48
- 'md3-ripple--unbounded': this.unbounded,
189
+ const classes = {
190
+ 'hovered': this.hovered,
191
+ 'focused': this.focused,
192
+ 'pressed': this.pressed,
193
+ 'unbounded': this.unbounded,
49
194
  };
195
+ return html `<div class="surface ${classMap(classes)}"></div>`;
50
196
  }
51
197
  update(changedProps) {
52
198
  if (changedProps.has('disabled') && this.disabled) {
53
- this.endHover();
54
- this.endFocus();
55
- this.endPress();
199
+ this.hovered = false;
200
+ this.focused = false;
201
+ this.pressed = false;
56
202
  }
57
203
  super.update(changedProps);
58
204
  }
@@ -108,12 +254,13 @@ export class Ripple extends LitElement {
108
254
  return { startPoint, endPoint };
109
255
  }
110
256
  startPressAnimation(positionEvent) {
257
+ this.pressed = true;
258
+ this.growAnimation?.cancel();
111
259
  this.determineRippleSize();
112
260
  const { startPoint, endPoint } = this.getTranslationCoordinates(positionEvent);
113
261
  const translateStart = `${startPoint.x}px, ${startPoint.y}px`;
114
262
  const translateEnd = `${endPoint.x}px, ${endPoint.y}px`;
115
- const signal = this.pressAnimationSignal.start();
116
- const growAnimation = this.mdRoot.animate({
263
+ this.growAnimation = this.mdRoot.animate({
117
264
  top: [0, 0],
118
265
  left: [0, 0],
119
266
  height: [this.rippleSize, this.rippleSize],
@@ -128,73 +275,60 @@ export class Ripple extends LitElement {
128
275
  easing: EASING.STANDARD,
129
276
  fill: ANIMATION_FILL
130
277
  });
131
- growAnimation.addEventListener('finish', () => {
132
- this.pressAnimationSignal.finish();
133
- this.growAnimation = null;
134
- });
135
- signal.addEventListener('abort', () => {
136
- growAnimation.cancel();
137
- this.growAnimation = null;
138
- });
139
- this.growAnimation = growAnimation;
140
- }
141
- /**
142
- * @deprecated Use beginHover
143
- */
144
- startHover(hoverEvent) {
145
- this.beginHover(hoverEvent);
146
278
  }
147
- beginHover(hoverEvent) {
148
- if (hoverEvent?.pointerType !== 'touch') {
149
- this.hovered = true;
279
+ async endPressAnimation() {
280
+ const animation = this.growAnimation;
281
+ const pressAnimationPlayState = animation?.currentTime ?? Infinity;
282
+ if (pressAnimationPlayState >= MINIMUM_PRESS_MS) {
283
+ this.pressed = false;
284
+ return;
150
285
  }
151
- }
152
- endHover() {
153
- this.hovered = false;
286
+ await new Promise(resolve => {
287
+ setTimeout(resolve, MINIMUM_PRESS_MS - pressAnimationPlayState);
288
+ });
289
+ if (this.growAnimation !== animation) {
290
+ // A new press animation was started. The old animation was canceled and
291
+ // should not finish the pressed state.
292
+ return;
293
+ }
294
+ this.pressed = false;
154
295
  }
155
296
  /**
156
- * @deprecated Use beginFocus
297
+ * Returns `true` if
298
+ * - the ripple element is enabled
299
+ * - the pointer is primary for the input type
300
+ * - the pointer is the pointer that started the interaction, or will start
301
+ * the interaction
302
+ * - the pointer is a touch, or the pointer state has the primary button
303
+ * held, or the pointer is hovering
157
304
  */
158
- startFocus() {
159
- this.beginFocus();
160
- }
161
- beginFocus() {
162
- this.focused = true;
163
- }
164
- endFocus() {
165
- this.focused = false;
305
+ shouldReactToEvent(event) {
306
+ if (this.disabled || !event.isPrimary) {
307
+ return false;
308
+ }
309
+ if (this.rippleStartEvent &&
310
+ this.rippleStartEvent.pointerId !== event.pointerId) {
311
+ return false;
312
+ }
313
+ if (event.type === 'pointerenter' || event.type === 'pointerleave') {
314
+ return !this.isTouch(event);
315
+ }
316
+ const isPrimaryButton = event.buttons === 1;
317
+ return this.isTouch(event) || isPrimaryButton;
166
318
  }
167
319
  /**
168
- * @deprecated Use beginPress
320
+ * Check if the event is within the bounds of the element.
321
+ *
322
+ * This is only needed for the "stuck" contextmenu longpress on Chrome.
169
323
  */
170
- startPress(positionEvent) {
171
- this.beginPress(positionEvent);
324
+ inBounds({ x, y }) {
325
+ const { top, left, bottom, right } = this.getBoundingClientRect();
326
+ return x >= left && x <= right && y >= top && y <= bottom;
172
327
  }
173
- beginPress(positionEvent) {
174
- this.pressed = true;
175
- if (this.delayedEndPressHandle !== null) {
176
- clearTimeout(this.delayedEndPressHandle);
177
- this.delayedEndPressHandle = null;
178
- }
179
- this.startPressAnimation(positionEvent);
180
- }
181
- endPress() {
182
- const pressAnimationPlayState = this.growAnimation?.currentTime ?? Infinity;
183
- if (pressAnimationPlayState >= MINIMUM_PRESS_MS) {
184
- this.pressed = false;
185
- }
186
- else {
187
- this.delayedEndPressHandle = setTimeout(() => {
188
- this.pressed = false;
189
- this.delayedEndPressHandle = null;
190
- }, MINIMUM_PRESS_MS - pressAnimationPlayState);
191
- }
328
+ isTouch({ pointerType }) {
329
+ return pointerType === 'touch';
192
330
  }
193
331
  }
194
- __decorate([
195
- query('.md3-ripple-surface'),
196
- __metadata("design:type", HTMLElement)
197
- ], Ripple.prototype, "mdRoot", void 0);
198
332
  __decorate([
199
333
  property({ type: Boolean, reflect: true }),
200
334
  __metadata("design:type", Object)
@@ -215,4 +349,8 @@ __decorate([
215
349
  state(),
216
350
  __metadata("design:type", Object)
217
351
  ], Ripple.prototype, "pressed", void 0);
352
+ __decorate([
353
+ query('.surface'),
354
+ __metadata("design:type", HTMLElement)
355
+ ], Ripple.prototype, "mdRoot", void 0);
218
356
  //# sourceMappingURL=ripple.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ripple.js","sourceRoot":"","sources":["ripple.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,EAAC,IAAI,EAAE,UAAU,EAAiC,MAAM,KAAK,CAAC;AACrE,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAY,QAAQ,EAAC,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAC,qBAAqB,EAAE,MAAM,EAAC,MAAM,2BAA2B,CAAC;AAExE,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,OAAO,GAAG,EAAE,CAAC;AACnB,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,qBAAqB;AACrB,MAAM,OAAO,MAAO,SAAQ,UAAU;IAAtC;;QAGE,uDAAuD;QACvD,mEAAmE;QACnE,4BAA4B;QACc,cAAS,GAAG,KAAK,CAAC;QAClB,aAAQ,GAAG,KAAK,CAAC;QAExC,YAAO,GAAG,KAAK,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAEzB,eAAU,GAAG,EAAE,CAAC;QAChB,gBAAW,GAAG,EAAE,CAAC;QACjB,gBAAW,GAAG,CAAC,CAAC;QAChB,yBAAoB,GAAG,qBAAqB,EAAE,CAAC;QAC/C,kBAAa,GAAmB,IAAI,CAAC;QACrC,0BAAqB,GAAgB,IAAI,CAAC;IA8LtD,CAAC;IA5LC,mBAAmB;IACA,MAAM;QACvB,OAAO,IAAI,CAAA,kCACP,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,UAAU,CAAC;IACxD,CAAC;IAED,mBAAmB;IACT,sBAAsB;QAC9B,OAAO;YACL,qBAAqB,EAAE,IAAI,CAAC,OAAO;YACnC,qBAAqB,EAAE,IAAI,CAAC,OAAO;YACnC,qBAAqB,EAAE,IAAI,CAAC,OAAO;YACnC,uBAAuB,EAAE,IAAI,CAAC,SAAS;SACxC,CAAC;IACJ,CAAC;IAEkB,MAAM,CAAC,YAAkC;QAC1D,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;QACD,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAES,aAAa;QACrB,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,qBAAqB,EAAE,CAAC;IAC9D,CAAC;IAES,mBAAmB;QAC3B,MAAM,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,YAAY,GACd,IAAI,CAAC,GAAG,CAAC,yBAAyB,GAAG,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAGzE,IAAI,SAAS,GAAG,MAAM,CAAC;QACvB,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,CAAC,CAAC;QAE5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC;QACvD,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;QAEjC,6CAA6C;QAC7C,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,WAAW,GAAG,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;SAC/C;QAED,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,SAAS,GAAG,YAAY,CAAC,GAAG,WAAW,EAAE,CAAC;QACjE,IAAI,CAAC,UAAU,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC;IAC5C,CAAC;IAES,+BAA+B,CAAC,YAA0B;QAElE,MAAM,EAAC,OAAO,EAAE,OAAO,EAAC,GAAG,MAAM,CAAC;QAClC,MAAM,EAAC,IAAI,EAAE,GAAG,EAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;QACjC,MAAM,SAAS,GAAG,OAAO,GAAG,GAAG,CAAC;QAChC,MAAM,EAAC,KAAK,EAAE,KAAK,EAAC,GAAG,YAAY,CAAC;QACpC,OAAO,EAAC,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,CAAC,EAAE,KAAK,GAAG,SAAS,EAAC,CAAC;IACtD,CAAC;IAES,yBAAyB,CAAC,aAA0B;QAC5D,MAAM,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,oBAAoB;QACpB,MAAM,QAAQ,GAAG;YACf,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YACjC,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;SACnC,CAAC;QAEF,IAAI,UAAU,CAAC;QACf,IAAI,aAAa,YAAY,YAAY,EAAE;YACzC,UAAU,GAAG,IAAI,CAAC,+BAA+B,CAAC,aAAa,CAAC,CAAC;SAClE;aAAM;YACL,UAAU,GAAG;gBACX,CAAC,EAAE,KAAK,GAAG,CAAC;gBACZ,CAAC,EAAE,MAAM,GAAG,CAAC;aACd,CAAC;SACH;QAED,4BAA4B;QAC5B,UAAU,GAAG;YACX,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YACxC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;SACzC,CAAC;QAEF,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAC,CAAC;IAChC,CAAC;IAES,mBAAmB,CAAC,aAA0B;QACtD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,EAAC,UAAU,EAAE,QAAQ,EAAC,GACxB,IAAI,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,GAAG,UAAU,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,IAAI,CAAC;QAC9D,MAAM,YAAY,GAAG,GAAG,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,IAAI,CAAC;QAExD,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAEjD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CACrC;YACE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACZ,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;YAC1C,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;YACzC,SAAS,EAAE;gBACT,aAAa,cAAc,YAAY;gBACvC,aAAa,YAAY,WAAW,IAAI,CAAC,WAAW,GAAG;aACxD;SACF,EACD;YACE,aAAa,EAAE,YAAY;YAC3B,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;QAEP,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC5C,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACpC,aAAa,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,UAAkB;QAC3B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU,CAAC,UAAkB;QAC3B,IAAK,UAA2B,EAAE,WAAW,KAAK,OAAO,EAAE;YACzD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;SACrB;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,aAA0B;QACnC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,aAA0B;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE;YACvC,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACzC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;SACnC;QACD,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;IAED,QAAQ;QACN,MAAM,uBAAuB,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,IAAI,QAAQ,CAAC;QAC5E,IAAI,uBAAuB,IAAI,gBAAgB,EAAE;YAC/C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACtB;aAAM;YACL,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC3C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACpC,CAAC,EAAE,gBAAgB,GAAG,uBAAuB,CAAC,CAAC;SAChD;IACH,CAAC;CACF;AA/M+B;IAA7B,KAAK,CAAC,qBAAqB,CAAC;8BAAU,WAAW;sCAAC;AAKT;IAAzC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;;yCAAmB;AAClB;IAAzC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;;wCAAkB;AAElD;IAAR,KAAK,EAAE;;uCAA2B;AAC1B;IAAR,KAAK,EAAE;;uCAA2B;AAC1B;IAAR,KAAK,EAAE;;uCAA2B","sourcesContent":["/**\n * @license\n * Copyright 2022 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {html, LitElement, PropertyValues, TemplateResult} from 'lit';\nimport {property, query, state} from 'lit/decorators.js';\nimport {ClassInfo, classMap} from 'lit/directives/class-map.js';\n\nimport {createAnimationSignal, EASING} from '../../motion/animation.js';\n\nconst PRESS_GROW_MS = 450;\nconst MINIMUM_PRESS_MS = 225;\nconst INITIAL_ORIGIN_SCALE = 0.2;\nconst PADDING = 10;\nconst SOFT_EDGE_MINIMUM_SIZE = 75;\nconst SOFT_EDGE_CONTAINER_RATIO = 0.35;\nconst PRESS_PSEUDO = '::after';\nconst ANIMATION_FILL = 'forwards';\n\n/** @soyCompatible */\nexport class Ripple extends LitElement {\n @query('.md3-ripple-surface') mdRoot!: HTMLElement;\n\n // TODO(https://bugs.webkit.org/show_bug.cgi?id=247546)\n // Remove Safari workaround that requires reflecting `unbounded` so\n // it can be styled against.\n @property({type: Boolean, reflect: true}) unbounded = false;\n @property({type: Boolean, reflect: true}) disabled = false;\n\n @state() protected hovered = false;\n @state() protected focused = false;\n @state() protected pressed = false;\n\n protected rippleSize = '';\n protected rippleScale = '';\n protected initialSize = 0;\n protected pressAnimationSignal = createAnimationSignal();\n protected growAnimation: Animation|null = null;\n protected delayedEndPressHandle: number|null = null;\n\n /** @soyTemplate */\n protected override render(): TemplateResult {\n return html`<div class=\"md3-ripple-surface ${\n classMap(this.getRenderRippleClasses())}\"></div>`;\n }\n\n /** @soyTemplate */\n protected getRenderRippleClasses(): ClassInfo {\n return {\n 'md3-ripple--hovered': this.hovered,\n 'md3-ripple--focused': this.focused,\n 'md3-ripple--pressed': this.pressed,\n 'md3-ripple--unbounded': this.unbounded,\n };\n }\n\n protected override update(changedProps: PropertyValues<this>) {\n if (changedProps.has('disabled') && this.disabled) {\n this.endHover();\n this.endFocus();\n this.endPress();\n }\n super.update(changedProps);\n }\n\n protected getDimensions() {\n return (this.parentElement ?? this).getBoundingClientRect();\n }\n\n protected determineRippleSize() {\n const {height, width} = this.getDimensions();\n const maxDim = Math.max(height, width);\n const softEdgeSize =\n Math.max(SOFT_EDGE_CONTAINER_RATIO * maxDim, SOFT_EDGE_MINIMUM_SIZE);\n\n\n let maxRadius = maxDim;\n let initialSize = Math.floor(maxDim * INITIAL_ORIGIN_SCALE);\n\n const hypotenuse = Math.sqrt(width ** 2 + height ** 2);\n maxRadius = hypotenuse + PADDING;\n\n // ensure `initialSize` is even for unbounded\n if (this.unbounded) {\n initialSize = initialSize - (initialSize % 2);\n }\n\n this.initialSize = initialSize;\n this.rippleScale = `${(maxRadius + softEdgeSize) / initialSize}`;\n this.rippleSize = `${this.initialSize}px`;\n }\n\n protected getNormalizedPointerEventCoords(pointerEvent: PointerEvent):\n {x: number, y: number} {\n const {scrollX, scrollY} = window;\n const {left, top} = this.getDimensions();\n const documentX = scrollX + left;\n const documentY = scrollY + top;\n const {pageX, pageY} = pointerEvent;\n return {x: pageX - documentX, y: pageY - documentY};\n }\n\n protected getTranslationCoordinates(positionEvent?: Event|null) {\n const {height, width} = this.getDimensions();\n // end in the center\n const endPoint = {\n x: (width - this.initialSize) / 2,\n y: (height - this.initialSize) / 2,\n };\n\n let startPoint;\n if (positionEvent instanceof PointerEvent) {\n startPoint = this.getNormalizedPointerEventCoords(positionEvent);\n } else {\n startPoint = {\n x: width / 2,\n y: height / 2,\n };\n }\n\n // center around start point\n startPoint = {\n x: startPoint.x - (this.initialSize / 2),\n y: startPoint.y - (this.initialSize / 2),\n };\n\n return {startPoint, endPoint};\n }\n\n protected startPressAnimation(positionEvent?: Event|null) {\n this.determineRippleSize();\n const {startPoint, endPoint} =\n this.getTranslationCoordinates(positionEvent);\n const translateStart = `${startPoint.x}px, ${startPoint.y}px`;\n const translateEnd = `${endPoint.x}px, ${endPoint.y}px`;\n\n const signal = this.pressAnimationSignal.start();\n\n const growAnimation = this.mdRoot.animate(\n {\n top: [0, 0],\n left: [0, 0],\n height: [this.rippleSize, this.rippleSize],\n width: [this.rippleSize, this.rippleSize],\n transform: [\n `translate(${translateStart}) scale(1)`,\n `translate(${translateEnd}) scale(${this.rippleScale})`\n ],\n },\n {\n pseudoElement: PRESS_PSEUDO,\n duration: PRESS_GROW_MS,\n easing: EASING.STANDARD,\n fill: ANIMATION_FILL\n });\n\n growAnimation.addEventListener('finish', () => {\n this.pressAnimationSignal.finish();\n this.growAnimation = null;\n });\n\n signal.addEventListener('abort', () => {\n growAnimation.cancel();\n this.growAnimation = null;\n });\n\n this.growAnimation = growAnimation;\n }\n\n /**\n * @deprecated Use beginHover\n */\n startHover(hoverEvent?: Event) {\n this.beginHover(hoverEvent);\n }\n\n beginHover(hoverEvent?: Event) {\n if ((hoverEvent as PointerEvent)?.pointerType !== 'touch') {\n this.hovered = true;\n }\n }\n\n endHover() {\n this.hovered = false;\n }\n\n /**\n * @deprecated Use beginFocus\n */\n startFocus() {\n this.beginFocus();\n }\n\n beginFocus() {\n this.focused = true;\n }\n\n endFocus() {\n this.focused = false;\n }\n\n /**\n * @deprecated Use beginPress\n */\n startPress(positionEvent?: Event|null) {\n this.beginPress(positionEvent);\n }\n\n beginPress(positionEvent?: Event|null) {\n this.pressed = true;\n if (this.delayedEndPressHandle !== null) {\n clearTimeout(this.delayedEndPressHandle);\n this.delayedEndPressHandle = null;\n }\n this.startPressAnimation(positionEvent);\n }\n\n endPress() {\n const pressAnimationPlayState = this.growAnimation?.currentTime ?? Infinity;\n if (pressAnimationPlayState >= MINIMUM_PRESS_MS) {\n this.pressed = false;\n } else {\n this.delayedEndPressHandle = setTimeout(() => {\n this.pressed = false;\n this.delayedEndPressHandle = null;\n }, MINIMUM_PRESS_MS - pressAnimationPlayState);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ripple.js","sourceRoot":"","sources":["ripple.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,EAAC,IAAI,EAAE,UAAU,EAAiB,MAAM,KAAK,CAAC;AACrD,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAC,QAAQ,EAAC,MAAM,6BAA6B,CAAC;AAErD,OAAO,EAAC,MAAM,EAAC,MAAM,2BAA2B,CAAC;AAEjD,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,OAAO,GAAG,EAAE,CAAC;AACnB,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC;;;;;;;;;GASG;AACH,IAAK,KAiCJ;AAjCD,WAAK,KAAK;IACR;;;;;;OAMG;IACH,yCAAQ,CAAA;IACR;;;;;;;;OAQG;IACH,+CAAW,CAAA;IACX;;;;;OAKG;IACH,uCAAO,CAAA;IACP;;;;;OAKG;IACH,2DAAiB,CAAA;AACnB,CAAC,EAjCI,KAAK,KAAL,KAAK,QAiCT;AAED;;;GAGG;AACH,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;GAEG;AACH,MAAM,OAAO,MAAO,SAAQ,UAAU;IAAtC;;QACE,uDAAuD;QACvD,mEAAmE;QACnE,4BAA4B;QAC5B;;WAEG;QACuC,cAAS,GAAG,KAAK,CAAC;QAE5D;;WAEG;QACuC,aAAQ,GAAG,KAAK,CAAC;QAE1C,YAAO,GAAG,KAAK,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAGzB,eAAU,GAAG,EAAE,CAAC;QAChB,gBAAW,GAAG,EAAE,CAAC;QACjB,gBAAW,GAAG,CAAC,CAAC;QAEhB,UAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEvB,gCAA2B,GAAG,KAAK,CAAC;IAoS9C,CAAC;IAlSC,kBAAkB,CAAC,KAAmB;QACpC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;YACnC,OAAO;SACR;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,kBAAkB,CAAC,KAAmB;QACpC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;YACnC,OAAO;SACR;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,mEAAmE;QACnE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,EAAE;YACjC,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC1B;IACH,CAAC;IAED,aAAa;QACX,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,eAAe,CAAC,KAAmB;QACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;YACnC,OAAO;SACR;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE;YAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC;YACrC,OAAO;SACR;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE;YACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC;YACrC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChD,OAAO;SACR;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAmB;QACzC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;YACnC,OAAO;SACR;QAED,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC;YACrC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO;SACR;QAED,qEAAqE;QACrE,mEAAmE;QACnE,sCAAsC;QACtC,IAAI,IAAI,CAAC,2BAA2B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAC7D,OAAO;SACR;QAED,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC;QAEzC,oCAAoC;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;QAC/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE;YACpC,OAAO;SACR;QAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,WAAW;QACT,gEAAgE;QAChE,uBAAuB;QACvB,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO;SACR;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,iBAAiB,EAAE;YAC1C,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO;SACR;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,EAAE;YACjC,mCAAmC;YACnC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC1B;IACH,CAAC;IAED,mBAAmB,CAAC,KAAmB;QACrC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;YACnC,OAAO;SACR;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO;SACR;QAED,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEkB,MAAM;QACvB,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,IAAI,CAAC,OAAO;YACvB,SAAS,EAAE,IAAI,CAAC,OAAO;YACvB,SAAS,EAAE,IAAI,CAAC,OAAO;YACvB,WAAW,EAAE,IAAI,CAAC,SAAS;SAC5B,CAAC;QAEF,OAAO,IAAI,CAAA,uBAAuB,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;IAChE,CAAC;IAEkB,MAAM,CAAC,YAAkC;QAC1D,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACtB;QACD,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAEO,aAAa;QACnB,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,qBAAqB,EAAE,CAAC;IAC9D,CAAC;IAEO,mBAAmB;QACzB,MAAM,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,YAAY,GACd,IAAI,CAAC,GAAG,CAAC,yBAAyB,GAAG,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAGzE,IAAI,SAAS,GAAG,MAAM,CAAC;QACvB,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,CAAC,CAAC;QAE5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC;QACvD,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;QAEjC,6CAA6C;QAC7C,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,WAAW,GAAG,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;SAC/C;QAED,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,SAAS,GAAG,YAAY,CAAC,GAAG,WAAW,EAAE,CAAC;QACjE,IAAI,CAAC,UAAU,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC;IAC5C,CAAC;IAEO,+BAA+B,CAAC,YAA0B;QAEhE,MAAM,EAAC,OAAO,EAAE,OAAO,EAAC,GAAG,MAAM,CAAC;QAClC,MAAM,EAAC,IAAI,EAAE,GAAG,EAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;QACjC,MAAM,SAAS,GAAG,OAAO,GAAG,GAAG,CAAC;QAChC,MAAM,EAAC,KAAK,EAAE,KAAK,EAAC,GAAG,YAAY,CAAC;QACpC,OAAO,EAAC,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,CAAC,EAAE,KAAK,GAAG,SAAS,EAAC,CAAC;IACtD,CAAC;IAEO,yBAAyB,CAAC,aAAqB;QACrD,MAAM,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,oBAAoB;QACpB,MAAM,QAAQ,GAAG;YACf,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YACjC,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;SACnC,CAAC;QAEF,IAAI,UAAU,CAAC;QACf,IAAI,aAAa,YAAY,YAAY,EAAE;YACzC,UAAU,GAAG,IAAI,CAAC,+BAA+B,CAAC,aAAa,CAAC,CAAC;SAClE;aAAM;YACL,UAAU,GAAG;gBACX,CAAC,EAAE,KAAK,GAAG,CAAC;gBACZ,CAAC,EAAE,MAAM,GAAG,CAAC;aACd,CAAC;SACH;QAED,4BAA4B;QAC5B,UAAU,GAAG;YACX,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YACxC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;SACzC,CAAC;QAEF,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAC,CAAC;IAChC,CAAC;IAEO,mBAAmB,CAAC,aAAqB;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,EAAC,UAAU,EAAE,QAAQ,EAAC,GACxB,IAAI,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,GAAG,UAAU,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,IAAI,CAAC;QAC9D,MAAM,YAAY,GAAG,GAAG,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,IAAI,CAAC;QAExD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CACpC;YACE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACZ,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;YAC1C,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;YACzC,SAAS,EAAE;gBACT,aAAa,cAAc,YAAY;gBACvC,aAAa,YAAY,WAAW,IAAI,CAAC,WAAW,GAAG;aACxD;SACF,EACD;YACE,aAAa,EAAE,YAAY;YAC3B,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;IACT,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QACrC,MAAM,uBAAuB,GAAG,SAAS,EAAE,WAAW,IAAI,QAAQ,CAAC;QACnE,IAAI,uBAAuB,IAAI,gBAAgB,EAAE;YAC/C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,OAAO;SACR;QAED,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,uBAAuB,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;YACpC,wEAAwE;YACxE,uCAAuC;YACvC,OAAO;SACR;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;;;;;;;OAQG;IACK,kBAAkB,CAAC,KAAmB;QAC5C,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACrC,OAAO,KAAK,CAAC;SACd;QAED,IAAI,IAAI,CAAC,gBAAgB;YACrB,IAAI,CAAC,gBAAgB,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;YACvD,OAAO,KAAK,CAAC;SACd;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE;YAClE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC7B;QAED,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACK,QAAQ,CAAC,EAAC,CAAC,EAAE,CAAC,EAAe;QACnC,MAAM,EAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAChE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC;IAC5D,CAAC;IAEO,OAAO,CAAC,EAAC,WAAW,EAAe;QACzC,OAAO,WAAW,KAAK,OAAO,CAAC;IACjC,CAAC;CACF;AAtTC;IAAC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;;yCAAmB;AAK5D;IAAC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;;wCAAkB;AAE3D;IAAC,KAAK,EAAE;;uCAAyB;AACjC;IAAC,KAAK,EAAE;;uCAAyB;AACjC;IAAC,KAAK,EAAE;;uCAAyB;AAEjC;IAAC,KAAK,CAAC,UAAU,CAAC;8BAA2B,WAAW;sCAAC","sourcesContent":["/**\n * @license\n * Copyright 2022 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {html, LitElement, PropertyValues} from 'lit';\nimport {property, query, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\n\nimport {EASING} from '../../motion/animation.js';\n\nconst PRESS_GROW_MS = 450;\nconst MINIMUM_PRESS_MS = 225;\nconst INITIAL_ORIGIN_SCALE = 0.2;\nconst PADDING = 10;\nconst SOFT_EDGE_MINIMUM_SIZE = 75;\nconst SOFT_EDGE_CONTAINER_RATIO = 0.35;\nconst PRESS_PSEUDO = '::after';\nconst ANIMATION_FILL = 'forwards';\n\n/**\n * Interaction states for the ripple.\n *\n * On Touch:\n * - `INACTIVE -> TOUCH_DELAY -> WAITING_FOR_CLICK -> INACTIVE`\n * - `INACTIVE -> TOUCH_DELAY -> HOLDING -> WAITING_FOR_CLICK -> INACTIVE`\n *\n * On Mouse or Pen:\n * - `INACTIVE -> WAITING_FOR_CLICK -> INACTIVE`\n */\nenum State {\n /**\n * Initial state of the control, no touch in progress.\n *\n * Transitions:\n * - on touch down: transition to `TOUCH_DELAY`.\n * - on mouse down: transition to `WAITING_FOR_CLICK`.\n */\n INACTIVE,\n /**\n * Touch down has been received, waiting to determine if it's a swipe or\n * scroll.\n *\n * Transitions:\n * - on touch up: begin press; transition to `WAITING_FOR_CLICK`.\n * - on cancel: transition to `INACTIVE`.\n * - after `TOUCH_DELAY_MS`: begin press; transition to `HOLDING`.\n */\n TOUCH_DELAY,\n /**\n * A touch has been deemed to be a press\n *\n * Transitions:\n * - on up: transition to `WAITING_FOR_CLICK`.\n */\n HOLDING,\n /**\n * The user touch has finished, transition into rest state.\n *\n * Transitions:\n * - on click end press; transition to `INACTIVE`.\n */\n WAITING_FOR_CLICK\n}\n\n/**\n * Delay reacting to touch so that we do not show the ripple for a swipe or\n * scroll interaction.\n */\nconst TOUCH_DELAY_MS = 150;\n\n/**\n * A ripple component.\n */\nexport class Ripple extends LitElement {\n // TODO(https://bugs.webkit.org/show_bug.cgi?id=247546)\n // Remove Safari workaround that requires reflecting `unbounded` so\n // it can be styled against.\n /**\n * Sets the ripple to be an unbounded circle.\n */\n @property({type: Boolean, reflect: true}) unbounded = false;\n\n /**\n * Disables the ripple.\n */\n @property({type: Boolean, reflect: true}) disabled = false;\n\n @state() private hovered = false;\n @state() private focused = false;\n @state() private pressed = false;\n\n @query('.surface') private readonly mdRoot!: HTMLElement;\n private rippleSize = '';\n private rippleScale = '';\n private initialSize = 0;\n private growAnimation?: Animation;\n private state = State.INACTIVE;\n private rippleStartEvent?: PointerEvent;\n private checkBoundsAfterContextMenu = false;\n\n handlePointerenter(event: PointerEvent) {\n if (!this.shouldReactToEvent(event)) {\n return;\n }\n\n this.hovered = true;\n }\n\n handlePointerleave(event: PointerEvent) {\n if (!this.shouldReactToEvent(event)) {\n return;\n }\n\n this.hovered = false;\n\n // release a held mouse or pen press that moves outside the element\n if (this.state !== State.INACTIVE) {\n this.endPressAnimation();\n }\n }\n\n handleFocusin() {\n this.focused = true;\n }\n\n handleFocusout() {\n this.focused = false;\n }\n\n handlePointerup(event: PointerEvent) {\n if (!this.shouldReactToEvent(event)) {\n return;\n }\n\n if (this.state === State.HOLDING) {\n this.state = State.WAITING_FOR_CLICK;\n return;\n }\n\n if (this.state === State.TOUCH_DELAY) {\n this.state = State.WAITING_FOR_CLICK;\n this.startPressAnimation(this.rippleStartEvent);\n return;\n }\n }\n\n async handlePointerdown(event: PointerEvent) {\n if (!this.shouldReactToEvent(event)) {\n return;\n }\n\n this.rippleStartEvent = event;\n if (!this.isTouch(event)) {\n this.state = State.WAITING_FOR_CLICK;\n this.startPressAnimation(event);\n return;\n }\n\n // after a longpress contextmenu event, an extra `pointerdown` can be\n // dispatched to the pressed element. Check that the down is within\n // bounds of the element in this case.\n if (this.checkBoundsAfterContextMenu && !this.inBounds(event)) {\n return;\n }\n\n this.checkBoundsAfterContextMenu = false;\n\n // Wait for a hold after touch delay\n this.state = State.TOUCH_DELAY;\n await new Promise(resolve => {\n setTimeout(resolve, TOUCH_DELAY_MS);\n });\n\n if (this.state !== State.TOUCH_DELAY) {\n return;\n }\n\n this.state = State.HOLDING;\n this.startPressAnimation(event);\n }\n\n handleClick() {\n // Click is a MouseEvent in Firefox and Safari, so we cannot use\n // `shouldReactToEvent`\n if (this.disabled) {\n return;\n }\n\n if (this.state === State.WAITING_FOR_CLICK) {\n this.endPressAnimation();\n return;\n }\n\n if (this.state === State.INACTIVE) {\n // keyboard synthesized click event\n this.startPressAnimation();\n this.endPressAnimation();\n }\n }\n\n handlePointercancel(event: PointerEvent) {\n if (!this.shouldReactToEvent(event)) {\n return;\n }\n\n this.endPressAnimation();\n }\n\n handleContextmenu() {\n if (this.disabled) {\n return;\n }\n\n this.checkBoundsAfterContextMenu = true;\n this.endPressAnimation();\n }\n\n protected override render() {\n const classes = {\n 'hovered': this.hovered,\n 'focused': this.focused,\n 'pressed': this.pressed,\n 'unbounded': this.unbounded,\n };\n\n return html`<div class=\"surface ${classMap(classes)}\"></div>`;\n }\n\n protected override update(changedProps: PropertyValues<this>) {\n if (changedProps.has('disabled') && this.disabled) {\n this.hovered = false;\n this.focused = false;\n this.pressed = false;\n }\n super.update(changedProps);\n }\n\n private getDimensions() {\n return (this.parentElement ?? this).getBoundingClientRect();\n }\n\n private determineRippleSize() {\n const {height, width} = this.getDimensions();\n const maxDim = Math.max(height, width);\n const softEdgeSize =\n Math.max(SOFT_EDGE_CONTAINER_RATIO * maxDim, SOFT_EDGE_MINIMUM_SIZE);\n\n\n let maxRadius = maxDim;\n let initialSize = Math.floor(maxDim * INITIAL_ORIGIN_SCALE);\n\n const hypotenuse = Math.sqrt(width ** 2 + height ** 2);\n maxRadius = hypotenuse + PADDING;\n\n // ensure `initialSize` is even for unbounded\n if (this.unbounded) {\n initialSize = initialSize - (initialSize % 2);\n }\n\n this.initialSize = initialSize;\n this.rippleScale = `${(maxRadius + softEdgeSize) / initialSize}`;\n this.rippleSize = `${this.initialSize}px`;\n }\n\n private getNormalizedPointerEventCoords(pointerEvent: PointerEvent):\n {x: number, y: number} {\n const {scrollX, scrollY} = window;\n const {left, top} = this.getDimensions();\n const documentX = scrollX + left;\n const documentY = scrollY + top;\n const {pageX, pageY} = pointerEvent;\n return {x: pageX - documentX, y: pageY - documentY};\n }\n\n private getTranslationCoordinates(positionEvent?: Event) {\n const {height, width} = this.getDimensions();\n // end in the center\n const endPoint = {\n x: (width - this.initialSize) / 2,\n y: (height - this.initialSize) / 2,\n };\n\n let startPoint;\n if (positionEvent instanceof PointerEvent) {\n startPoint = this.getNormalizedPointerEventCoords(positionEvent);\n } else {\n startPoint = {\n x: width / 2,\n y: height / 2,\n };\n }\n\n // center around start point\n startPoint = {\n x: startPoint.x - (this.initialSize / 2),\n y: startPoint.y - (this.initialSize / 2),\n };\n\n return {startPoint, endPoint};\n }\n\n private startPressAnimation(positionEvent?: Event) {\n this.pressed = true;\n this.growAnimation?.cancel();\n this.determineRippleSize();\n const {startPoint, endPoint} =\n this.getTranslationCoordinates(positionEvent);\n const translateStart = `${startPoint.x}px, ${startPoint.y}px`;\n const translateEnd = `${endPoint.x}px, ${endPoint.y}px`;\n\n this.growAnimation = this.mdRoot.animate(\n {\n top: [0, 0],\n left: [0, 0],\n height: [this.rippleSize, this.rippleSize],\n width: [this.rippleSize, this.rippleSize],\n transform: [\n `translate(${translateStart}) scale(1)`,\n `translate(${translateEnd}) scale(${this.rippleScale})`\n ],\n },\n {\n pseudoElement: PRESS_PSEUDO,\n duration: PRESS_GROW_MS,\n easing: EASING.STANDARD,\n fill: ANIMATION_FILL\n });\n }\n\n private async endPressAnimation() {\n const animation = this.growAnimation;\n const pressAnimationPlayState = animation?.currentTime ?? Infinity;\n if (pressAnimationPlayState >= MINIMUM_PRESS_MS) {\n this.pressed = false;\n return;\n }\n\n await new Promise(resolve => {\n setTimeout(resolve, MINIMUM_PRESS_MS - pressAnimationPlayState);\n });\n\n if (this.growAnimation !== animation) {\n // A new press animation was started. The old animation was canceled and\n // should not finish the pressed state.\n return;\n }\n\n this.pressed = false;\n }\n\n /**\n * Returns `true` if\n * - the ripple element is enabled\n * - the pointer is primary for the input type\n * - the pointer is the pointer that started the interaction, or will start\n * the interaction\n * - the pointer is a touch, or the pointer state has the primary button\n * held, or the pointer is hovering\n */\n private shouldReactToEvent(event: PointerEvent) {\n if (this.disabled || !event.isPrimary) {\n return false;\n }\n\n if (this.rippleStartEvent &&\n this.rippleStartEvent.pointerId !== event.pointerId) {\n return false;\n }\n\n if (event.type === 'pointerenter' || event.type === 'pointerleave') {\n return !this.isTouch(event);\n }\n\n const isPrimaryButton = event.buttons === 1;\n return this.isTouch(event) || isPrimaryButton;\n }\n\n /**\n * Check if the event is within the bounds of the element.\n *\n * This is only needed for the \"stuck\" contextmenu longpress on Chrome.\n */\n private inBounds({x, y}: PointerEvent) {\n const {top, left, bottom, right} = this.getBoundingClientRect();\n return x >= left && x <= right && y >= top && y <= bottom;\n }\n\n private isTouch({pointerType}: PointerEvent) {\n return pointerType === 'touch';\n }\n}\n"]}
@@ -10,7 +10,15 @@ declare global {
10
10
  }
11
11
  }
12
12
  /**
13
- * @soyCompatible
13
+ * @summary Ripples, also known as state layers, are visual indicators used to
14
+ * communicate the status of a component or interactive element.
15
+ *
16
+ * @description A state layer is a semi-transparent covering on an element that
17
+ * indicates its state. State layers provide a systematic approach to
18
+ * visualizing states by using opacity. A layer can be applied to an entire
19
+ * element or in a circular shape and only one state layer can be applied at a
20
+ * given time.
21
+ *
14
22
  * @final
15
23
  * @suppress {visibility}
16
24
  */
package/ripple/ripple.js CHANGED
@@ -8,7 +8,15 @@ import { customElement } from 'lit/decorators.js';
8
8
  import { Ripple } from './lib/ripple.js';
9
9
  import { styles } from './lib/ripple-styles.css.js';
10
10
  /**
11
- * @soyCompatible
11
+ * @summary Ripples, also known as state layers, are visual indicators used to
12
+ * communicate the status of a component or interactive element.
13
+ *
14
+ * @description A state layer is a semi-transparent covering on an element that
15
+ * indicates its state. State layers provide a systematic approach to
16
+ * visualizing states by using opacity. A layer can be applied to an entire
17
+ * element or in a circular shape and only one state layer can be applied at a
18
+ * given time.
19
+ *
12
20
  * @final
13
21
  * @suppress {visibility}
14
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ripple.js","sourceRoot":"","sources":["ripple.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAC;AAQlD;;;;GAIG;AAEH,IAAa,QAAQ,GAArB,MAAa,QAAS,SAAQ,MAAM;CAEnC,CAAA;AADiB,eAAM,GAAG,CAAC,MAAM,CAAE,CAAA;AADvB,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CAEpB;SAFY,QAAQ","sourcesContent":["/**\n * @license\n * Copyright 2022 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {customElement} from 'lit/decorators.js';\n\nimport {Ripple} from './lib/ripple.js';\nimport {styles} from './lib/ripple-styles.css.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-ripple': MdRipple;\n }\n}\n\n/**\n * @soyCompatible\n * @final\n * @suppress {visibility}\n */\n@customElement('md-ripple')\nexport class MdRipple extends Ripple {\n static override styles = [styles];\n}"]}
1
+ {"version":3,"file":"ripple.js","sourceRoot":"","sources":["ripple.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAC;AAQlD;;;;;;;;;;;;GAYG;AAEI,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,MAAM;;AAClB,eAAM,GAAG,CAAC,MAAM,CAAC,CAAC;AADvB,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CAEpB;SAFY,QAAQ","sourcesContent":["/**\n * @license\n * Copyright 2022 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {customElement} from 'lit/decorators.js';\n\nimport {Ripple} from './lib/ripple.js';\nimport {styles} from './lib/ripple-styles.css.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-ripple': MdRipple;\n }\n}\n\n/**\n * @summary Ripples, also known as state layers, are visual indicators used to\n * communicate the status of a component or interactive element.\n *\n * @description A state layer is a semi-transparent covering on an element that\n * indicates its state. State layers provide a systematic approach to\n * visualizing states by using opacity. A layer can be applied to an entire\n * element or in a circular shape and only one state layer can be applied at a\n * given time.\n *\n * @final\n * @suppress {visibility}\n */\n@customElement('md-ripple')\nexport class MdRipple extends Ripple {\n static override styles = [styles];\n}\n"]}
package/sass/_assert.scss CHANGED
@@ -3,7 +3,9 @@
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  //
5
5
 
6
+ // go/keep-sorted start
6
7
  @use 'sass:meta';
8
+ // go/keep-sorted end
7
9
 
8
10
  ///
9
11
  /// is-type returns the given value if it matches the given type. If not, it
@@ -3,11 +3,15 @@
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  //
5
5
 
6
+ // go/keep-sorted start
6
7
  @use 'sass:map';
8
+ // go/keep-sorted end
9
+ // go/keep-sorted start
7
10
  @use '../tokens';
8
11
  @use './color';
9
12
  @use './theme';
10
13
  @use './var';
14
+ // go/keep-sorted end
11
15
 
12
16
  // TODO(b/213571555): Following Sass mixins will call color scheme APIs which
13
17
  // are generated using tokens compiler when ready.
package/sass/_color.scss CHANGED
@@ -3,13 +3,17 @@
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  //
5
5
 
6
+ // go/keep-sorted start
6
7
  @use 'sass:list';
7
8
  @use 'sass:map';
8
9
  @use 'sass:meta';
9
10
  @use 'sass:string';
11
+ // go/keep-sorted end
12
+ // go/keep-sorted start
10
13
  @use './assert';
11
14
  @use './string-ext';
12
15
  @use './var';
16
+ // go/keep-sorted end
13
17
 
14
18
  $_hex: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'a' 'b' 'c' 'd' 'e' 'f';
15
19
 
@@ -3,10 +3,14 @@
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  //
5
5
 
6
+ // go/keep-sorted start
6
7
  @use 'sass:map';
7
8
  @use 'sass:meta';
9
+ // go/keep-sorted end
10
+ // go/keep-sorted start
8
11
  @use './color';
9
12
  @use './var';
13
+ // go/keep-sorted end
10
14
 
11
15
  /// Returns the appropriate elevation theme for the given args.
12
16
  ///
@@ -3,9 +3,11 @@
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  //
5
5
 
6
+ // go/keep-sorted start
6
7
  @use 'sass:list';
7
8
  @use 'sass:map';
8
9
  @use 'sass:meta';
10
+ // go/keep-sorted end
9
11
 
10
12
  /// Valid configuration values for each config option.
11
13
  $_valid-values: (