@material/web 0.1.0-alpha.1 → 1.0.0-pre.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 (247) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/autocomplete/lib/_filled-autocomplete.scss +3 -4
  3. package/autocomplete/lib/_outlined-autocomplete.scss +3 -3
  4. package/autocomplete/lib/_shared.scss +2 -7
  5. package/autocomplete/lib/filled-styles.css.js +1 -1
  6. package/autocomplete/lib/filled-styles.css.js.map +1 -1
  7. package/autocomplete/lib/outlined-styles.css.js +1 -1
  8. package/autocomplete/lib/outlined-styles.css.js.map +1 -1
  9. package/button/lib/_elevated-button.scss +6 -0
  10. package/button/lib/_elevation.scss +30 -28
  11. package/button/lib/_filled-button.scss +6 -0
  12. package/button/lib/_outlined-button.scss +10 -1
  13. package/button/lib/_shared.scss +18 -8
  14. package/button/lib/_text-button.scss +6 -0
  15. package/button/lib/_tonal-button.scss +6 -0
  16. package/button/lib/elevated-styles.css.js +1 -1
  17. package/button/lib/elevated-styles.css.js.map +1 -1
  18. package/button/lib/filled-styles.css.js +1 -1
  19. package/button/lib/filled-styles.css.js.map +1 -1
  20. package/button/lib/outlined-styles.css.js +1 -1
  21. package/button/lib/outlined-styles.css.js.map +1 -1
  22. package/button/lib/shared-elevation-styles.css.js +1 -1
  23. package/button/lib/shared-elevation-styles.css.js.map +1 -1
  24. package/button/lib/shared-styles.css.js +1 -1
  25. package/button/lib/shared-styles.css.js.map +1 -1
  26. package/button/lib/text-styles.css.js +1 -1
  27. package/button/lib/text-styles.css.js.map +1 -1
  28. package/button/lib/tonal-styles.css.js +1 -1
  29. package/button/lib/tonal-styles.css.js.map +1 -1
  30. package/checkbox/lib/_checkbox.scss +5 -1
  31. package/checkbox/lib/checkbox-styles.css.js +1 -1
  32. package/checkbox/lib/checkbox-styles.css.js.map +1 -1
  33. package/chips/chip/lib/_chip-theme.scss +29 -33
  34. package/chips/chip/lib/_chip.scss +2 -4
  35. package/chips/chip/lib/_input-chip-theme.scss +16 -26
  36. package/chips/chip/lib/chip.d.ts +1 -0
  37. package/chips/chip/lib/chip.js +2 -1
  38. package/chips/chip/lib/chip.js.map +1 -1
  39. package/fab/fab-extended.js +1 -2
  40. package/fab/fab-extended.js.map +1 -1
  41. package/fab/fab.js +1 -2
  42. package/fab/fab.js.map +1 -1
  43. package/fab/lib/_shared.scss +13 -11
  44. package/fab/lib/fab-shared-styles.css.js +1 -1
  45. package/fab/lib/fab-shared-styles.css.js.map +1 -1
  46. package/field/lib/filled-styles.css.js +1 -1
  47. package/field/lib/filled-styles.css.js.map +1 -1
  48. package/iconbutton/lib/_filled-icon-button.scss +18 -4
  49. package/iconbutton/lib/_filled-tonal-icon-button.scss +18 -4
  50. package/iconbutton/lib/_outlined-icon-button.scss +17 -3
  51. package/iconbutton/lib/_shared.scss +20 -1
  52. package/iconbutton/lib/_standard-icon-button.scss +25 -3
  53. package/iconbutton/lib/filled-styles.css.js +1 -1
  54. package/iconbutton/lib/filled-styles.css.js.map +1 -1
  55. package/iconbutton/lib/filled-tonal-styles.css.js +1 -1
  56. package/iconbutton/lib/filled-tonal-styles.css.js.map +1 -1
  57. package/iconbutton/lib/icon-button-toggle.js +1 -1
  58. package/iconbutton/lib/icon-button-toggle.js.map +1 -1
  59. package/iconbutton/lib/icon-button.js +1 -1
  60. package/iconbutton/lib/icon-button.js.map +1 -1
  61. package/iconbutton/lib/outlined-styles.css.js +1 -1
  62. package/iconbutton/lib/outlined-styles.css.js.map +1 -1
  63. package/iconbutton/lib/shared-styles.css.js +1 -1
  64. package/iconbutton/lib/shared-styles.css.js.map +1 -1
  65. package/iconbutton/lib/standard-styles.css.js +1 -1
  66. package/iconbutton/lib/standard-styles.css.js.map +1 -1
  67. package/list/lib/_list.scss +20 -14
  68. package/list/lib/divider/list-divider.js +2 -0
  69. package/list/lib/divider/list-divider.js.map +1 -1
  70. package/list/lib/list-styles.css.js +1 -1
  71. package/list/lib/list-styles.css.js.map +1 -1
  72. package/list/lib/list.d.ts +1 -0
  73. package/list/lib/list.js +4 -1
  74. package/list/lib/list.js.map +1 -1
  75. package/list/lib/listitem/list-item.js +2 -0
  76. package/list/lib/listitem/list-item.js.map +1 -1
  77. package/menu/lib/_menu.scss +7 -10
  78. package/menu/lib/menu-styles.css.js +1 -1
  79. package/menu/lib/menu-styles.css.js.map +1 -1
  80. package/menusurface/lib/_md-comp-menu-surface.scss +6 -14
  81. package/menusurface/lib/_menu-surface.scss +8 -4
  82. package/menusurface/lib/menu-surface-styles.css.js +1 -1
  83. package/menusurface/lib/menu-surface-styles.css.js.map +1 -1
  84. package/menusurface/lib/menu-surface.d.ts +1 -0
  85. package/menusurface/lib/menu-surface.js +2 -0
  86. package/menusurface/lib/menu-surface.js.map +1 -1
  87. package/navigationdrawer/lib/_navigation-drawer-modal.scss +7 -22
  88. package/navigationdrawer/lib/_navigation-drawer.scss +15 -18
  89. package/navigationdrawer/lib/_shared.scss +2 -7
  90. package/navigationdrawer/lib/navigation-drawer-modal-styles.css.js +1 -1
  91. package/navigationdrawer/lib/navigation-drawer-modal-styles.css.js.map +1 -1
  92. package/navigationdrawer/lib/navigation-drawer-styles.css.js +1 -1
  93. package/navigationdrawer/lib/navigation-drawer-styles.css.js.map +1 -1
  94. package/navigationdrawer/lib/navigation-drawer.d.ts +1 -0
  95. package/navigationdrawer/lib/navigation-drawer.js +3 -2
  96. package/navigationdrawer/lib/navigation-drawer.js.map +1 -1
  97. package/navigationtab/lib/_navigation-tab.scss +3 -3
  98. package/package.json +8 -1
  99. package/radio/_radio.scss +6 -1
  100. package/radio/lib/_radio.scss +128 -92
  101. package/radio/lib/forced-colors-styles.css.d.ts +1 -0
  102. package/radio/lib/forced-colors-styles.css.js +9 -0
  103. package/radio/lib/forced-colors-styles.css.js.map +1 -0
  104. package/radio/lib/forced-colors-styles.scss +27 -0
  105. package/radio/lib/radio-styles.css.js +1 -1
  106. package/radio/lib/radio-styles.css.js.map +1 -1
  107. package/radio/lib/radio-styles.scss +1 -7
  108. package/radio/lib/radio.d.ts +30 -69
  109. package/radio/lib/radio.js +104 -235
  110. package/radio/lib/radio.js.map +1 -1
  111. package/radio/lib/single-selection-controller.d.ts +51 -138
  112. package/radio/lib/single-selection-controller.js +153 -249
  113. package/radio/lib/single-selection-controller.js.map +1 -1
  114. package/radio/radio.js +2 -1
  115. package/radio/radio.js.map +1 -1
  116. package/ripple/lib/_ripple.scss +21 -4
  117. package/ripple/lib/ripple-styles.css.js +1 -1
  118. package/ripple/lib/ripple-styles.css.js.map +1 -1
  119. package/ripple/lib/ripple.js +4 -1
  120. package/ripple/lib/ripple.js.map +1 -1
  121. package/segmentedbutton/lib/_shared.scss +3 -3
  122. package/switch/lib/_handle.scss +4 -3
  123. package/switch/lib/switch-styles.css.js +1 -1
  124. package/switch/lib/switch-styles.css.js.map +1 -1
  125. package/switch/lib/switch.d.ts +17 -21
  126. package/switch/lib/switch.js +54 -57
  127. package/switch/lib/switch.js.map +1 -1
  128. package/textfield/filled-text-field.d.ts +1 -0
  129. package/textfield/filled-text-field.js.map +1 -1
  130. package/textfield/lib/_shared.scss +1 -0
  131. package/textfield/lib/filled-styles.css.js +1 -1
  132. package/textfield/lib/filled-styles.css.js.map +1 -1
  133. package/textfield/lib/shared-styles.css.js +1 -1
  134. package/textfield/lib/shared-styles.css.js.map +1 -1
  135. package/textfield/lib/text-field.js +3 -0
  136. package/textfield/lib/text-field.js.map +1 -1
  137. package/textfield/outlined-text-field.d.ts +1 -0
  138. package/textfield/outlined-text-field.js.map +1 -1
  139. package/tokens/_index.scss +1 -1
  140. package/tokens/{v0_144 → v0_150}/_index.scss +0 -0
  141. package/tokens/{v0_144 → v0_150}/_md-comp-assist-chip.scss +1 -1
  142. package/tokens/{v0_144 → v0_150}/_md-comp-badge.scss +1 -1
  143. package/tokens/{v0_144 → v0_150}/_md-comp-banner.scss +1 -1
  144. package/tokens/{v0_144 → v0_150}/_md-comp-bottom-app-bar.scss +1 -1
  145. package/tokens/{v0_144 → v0_150}/_md-comp-carousel-item.scss +1 -1
  146. package/tokens/{v0_144 → v0_150}/_md-comp-checkbox.scss +1 -1
  147. package/tokens/{v0_144 → v0_150}/_md-comp-circular-progress-indicator.scss +1 -1
  148. package/tokens/{v0_144 → v0_150}/_md-comp-data-table.scss +1 -1
  149. package/tokens/{v0_144 → v0_150}/_md-comp-date-input-modal.scss +1 -1
  150. package/tokens/{v0_144 → v0_150}/_md-comp-date-picker-docked.scss +1 -1
  151. package/tokens/{v0_144 → v0_150}/_md-comp-date-picker-modal.scss +1 -1
  152. package/tokens/{v0_144 → v0_150}/_md-comp-dialog.scss +1 -1
  153. package/tokens/{v0_144 → v0_150}/_md-comp-divider.scss +1 -1
  154. package/tokens/{v0_144 → v0_150}/_md-comp-elevated-button.scss +1 -1
  155. package/tokens/{v0_144 → v0_150}/_md-comp-elevated-card.scss +1 -1
  156. package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-branded.scss +1 -1
  157. package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-primary.scss +1 -1
  158. package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-secondary.scss +1 -1
  159. package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-surface.scss +1 -1
  160. package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-tertiary.scss +1 -1
  161. package/tokens/{v0_144 → v0_150}/_md-comp-fab-branded-large.scss +1 -1
  162. package/tokens/{v0_144 → v0_150}/_md-comp-fab-branded.scss +1 -1
  163. package/tokens/{v0_144 → v0_150}/_md-comp-fab-primary-large.scss +1 -1
  164. package/tokens/{v0_144 → v0_150}/_md-comp-fab-primary-small.scss +1 -1
  165. package/tokens/{v0_144 → v0_150}/_md-comp-fab-primary.scss +1 -1
  166. package/tokens/{v0_144 → v0_150}/_md-comp-fab-secondary-large.scss +1 -1
  167. package/tokens/{v0_144 → v0_150}/_md-comp-fab-secondary-small.scss +1 -1
  168. package/tokens/{v0_144 → v0_150}/_md-comp-fab-secondary.scss +1 -1
  169. package/tokens/{v0_144 → v0_150}/_md-comp-fab-surface-large.scss +1 -1
  170. package/tokens/{v0_144 → v0_150}/_md-comp-fab-surface-small.scss +1 -1
  171. package/tokens/{v0_144 → v0_150}/_md-comp-fab-surface.scss +1 -1
  172. package/tokens/{v0_144 → v0_150}/_md-comp-fab-tertiary-large.scss +1 -1
  173. package/tokens/{v0_144 → v0_150}/_md-comp-fab-tertiary-small.scss +1 -1
  174. package/tokens/{v0_144 → v0_150}/_md-comp-fab-tertiary.scss +1 -1
  175. package/tokens/{v0_144 → v0_150}/_md-comp-filled-autocomplete.scss +1 -1
  176. package/tokens/{v0_144 → v0_150}/_md-comp-filled-button.scss +1 -1
  177. package/tokens/{v0_144 → v0_150}/_md-comp-filled-card.scss +1 -1
  178. package/tokens/{v0_144 → v0_150}/_md-comp-filled-icon-button.scss +1 -1
  179. package/tokens/{v0_144 → v0_150}/_md-comp-filled-menu-button.scss +1 -1
  180. package/tokens/{v0_144 → v0_150}/_md-comp-filled-select.scss +1 -1
  181. package/tokens/{v0_144 → v0_150}/_md-comp-filled-text-field.scss +2 -2
  182. package/tokens/{v0_144 → v0_150}/_md-comp-filled-tonal-button.scss +1 -1
  183. package/tokens/{v0_144 → v0_150}/_md-comp-filled-tonal-icon-button.scss +1 -1
  184. package/tokens/{v0_144 → v0_150}/_md-comp-filter-chip.scss +2 -1
  185. package/tokens/{v0_144 → v0_150}/_md-comp-full-screen-dialog.scss +1 -1
  186. package/tokens/{v0_144 → v0_150}/_md-comp-icon-button.scss +1 -1
  187. package/tokens/{v0_144 → v0_150}/_md-comp-input-chip.scss +1 -1
  188. package/tokens/{v0_144 → v0_150}/_md-comp-linear-progress-indicator.scss +1 -1
  189. package/tokens/{v0_144 → v0_150}/_md-comp-list.scss +1 -1
  190. package/tokens/{v0_144 → v0_150}/_md-comp-menu.scss +1 -1
  191. package/tokens/{v0_144 → v0_150}/_md-comp-navigation-bar.scss +1 -1
  192. package/tokens/{v0_144 → v0_150}/_md-comp-navigation-drawer.scss +1 -1
  193. package/tokens/{v0_144 → v0_150}/_md-comp-navigation-rail.scss +1 -1
  194. package/tokens/{v0_144 → v0_150}/_md-comp-outlined-autocomplete.scss +1 -1
  195. package/tokens/{v0_144 → v0_150}/_md-comp-outlined-button.scss +1 -1
  196. package/tokens/{v0_144 → v0_150}/_md-comp-outlined-card.scss +5 -5
  197. package/tokens/{v0_144 → v0_150}/_md-comp-outlined-icon-button.scss +1 -1
  198. package/tokens/{v0_144 → v0_150}/_md-comp-outlined-menu-button.scss +1 -1
  199. package/tokens/{v0_144 → v0_150}/_md-comp-outlined-segmented-button.scss +1 -1
  200. package/tokens/{v0_144 → v0_150}/_md-comp-outlined-select.scss +1 -1
  201. package/tokens/{v0_144 → v0_150}/_md-comp-outlined-text-field.scss +1 -1
  202. package/tokens/{v0_144 → v0_150}/_md-comp-plain-tooltip.scss +2 -2
  203. package/tokens/{v0_144 → v0_150}/_md-comp-primary-navigation-tab.scss +1 -1
  204. package/tokens/{v0_144 → v0_150}/_md-comp-radio-button.scss +1 -1
  205. package/tokens/{v0_144 → v0_150}/_md-comp-rich-tooltip.scss +1 -1
  206. package/tokens/{v0_144 → v0_150}/_md-comp-scrim.scss +1 -1
  207. package/tokens/{v0_144 → v0_150}/_md-comp-search-bar.scss +1 -1
  208. package/tokens/{v0_144 → v0_150}/_md-comp-search-view.scss +1 -1
  209. package/tokens/{v0_144 → v0_150}/_md-comp-secondary-navigation-tab.scss +1 -1
  210. package/tokens/{v0_144 → v0_150}/_md-comp-sheet-bottom.scss +1 -1
  211. package/tokens/{v0_144 → v0_150}/_md-comp-sheet-floating.scss +1 -1
  212. package/tokens/{v0_144 → v0_150}/_md-comp-sheet-side.scss +1 -1
  213. package/tokens/{v0_144 → v0_150}/_md-comp-slider.scss +1 -1
  214. package/tokens/{v0_144 → v0_150}/_md-comp-snackbar.scss +25 -1
  215. package/tokens/{v0_144 → v0_150}/_md-comp-standard-menu-button.scss +1 -1
  216. package/tokens/{v0_144 → v0_150}/_md-comp-suggestion-chip.scss +6 -6
  217. package/tokens/{v0_144 → v0_150}/_md-comp-switch.scss +1 -1
  218. package/tokens/{v0_144 → v0_150}/_md-comp-text-button.scss +1 -1
  219. package/tokens/{v0_144 → v0_150}/_md-comp-time-input.scss +1 -1
  220. package/tokens/{v0_144 → v0_150}/_md-comp-time-picker.scss +2 -2
  221. package/tokens/{v0_144 → v0_150}/_md-comp-top-app-bar-large.scss +1 -1
  222. package/tokens/{v0_144 → v0_150}/_md-comp-top-app-bar-medium.scss +1 -1
  223. package/tokens/{v0_144 → v0_150}/_md-comp-top-app-bar-small-centered.scss +1 -1
  224. package/tokens/{v0_144 → v0_150}/_md-comp-top-app-bar-small.scss +1 -1
  225. package/tokens/{v0_144 → v0_150}/_md-ref-palette.scss +1 -1
  226. package/tokens/{v0_144 → v0_150}/_md-ref-typeface.scss +1 -1
  227. package/tokens/{v0_144 → v0_150}/_md-sys-color.scss +1 -1
  228. package/tokens/{v0_144 → v0_150}/_md-sys-elevation.scss +1 -1
  229. package/tokens/{v0_144 → v0_150}/_md-sys-motion.scss +1 -1
  230. package/tokens/{v0_144 → v0_150}/_md-sys-shape.scss +1 -1
  231. package/tokens/{v0_144 → v0_150}/_md-sys-state.scss +1 -1
  232. package/tokens/{v0_144 → v0_150}/_md-sys-typescale.scss +1 -1
  233. package/tokens/v0_150/index.test.css.d.ts +1 -0
  234. package/tokens/v0_150/index.test.css.js +9 -0
  235. package/tokens/v0_150/index.test.css.js.map +1 -0
  236. package/tokens/v0_150/index.test.scss +584 -0
  237. package/tokens/v0_150/lib.test.css.d.ts +1 -0
  238. package/tokens/v0_150/lib.test.css.js +9 -0
  239. package/tokens/v0_150/lib.test.css.js.map +1 -0
  240. package/tokens/v0_150/lib.test.scss +663 -0
  241. package/elevationold/lib/_elevation-overlay-theme.scss +0 -31
  242. package/elevationold/lib/_elevation-overlay.scss +0 -18
  243. package/elevationold/lib/_elevation-theme.scss +0 -74
  244. package/elevationold/lib/_surface.scss +0 -15
  245. package/elevationold/lib/elevation-overlay-styles.scss +0 -9
  246. package/radio/lib/_radio-theme.scss +0 -377
  247. package/ripple/_ripple-theme.scss +0 -17
@@ -5,86 +5,47 @@
5
5
  */
6
6
  import '../../focus/focus-ring.js';
7
7
  import '../../ripple/ripple.js';
8
- import { PropertyValues, TemplateResult } from 'lit';
9
- import { ActionElement, BeginPressConfig, EndPressConfig } from '../../actionelement/action-element.js';
10
- import { MdRipple } from '../../ripple/ripple.js';
11
- import { SingleSelectionController } from './single-selection-controller.js';
8
+ import { LitElement, TemplateResult } from 'lit';
9
+ import { getFormValue } from '../../controller/form-controller.js';
10
+ declare const CHECKED: unique symbol;
12
11
  /**
13
12
  * @fires checked
14
- * @soyCompatible
15
13
  */
16
- export declare class Radio extends ActionElement {
17
- protected formElement: HTMLInputElement;
18
- ripple: MdRipple;
19
- protected _checked: boolean;
20
- protected showFocusRing: boolean;
21
- global: boolean;
14
+ export declare class Radio extends LitElement {
15
+ static shadowRootOptions: ShadowRootInit;
16
+ static formAssociated: boolean;
22
17
  get checked(): boolean;
23
- protected getChecked(): boolean;
24
- /**
25
- * We define our own getter/setter for `checked` because we need to track
26
- * changes to it synchronously.
27
- *
28
- * The order in which the `checked` property is set across radio buttons
29
- * within the same group is very important. However, we can't rely on
30
- * UpdatingElement's `updated` callback to observe these changes (which is
31
- * also what the `@observer` decorator uses), because it batches changes to
32
- * all properties.
33
- *
34
- * Consider:
35
- *
36
- * radio1.disabled = true;
37
- * radio2.checked = true;
38
- * radio1.checked = true;
39
- *
40
- * In this case we'd first see all changes for radio1, and then for radio2,
41
- * and we couldn't tell that radio1 was the most recently checked.
42
- */
43
- set checked(isChecked: boolean);
44
- protected setChecked(isChecked: boolean): void;
18
+ set checked(checked: boolean);
19
+ [CHECKED]: boolean;
45
20
  disabled: boolean;
46
- value: string;
47
- name: string;
48
21
  /**
49
- * Touch target extends beyond visual boundary of a component by default.
50
- * Set to `true` to remove touch target added to the component.
51
- * @see https://material.io/design/usability/accessibility.html
22
+ * The element value to use in form submission when checked.
52
23
  */
53
- reducedTouchTarget: boolean;
54
- protected selectionController?: SingleSelectionController;
24
+ value: string;
55
25
  /**
56
- * input's tabindex is updated based on checked status.
57
- * Tab navigation will be removed from unchecked radios.
26
+ * The HTML name to use in form submission.
58
27
  */
59
- formElementTabIndex: number;
60
- protected focused: boolean;
28
+ name: string;
61
29
  ariaLabel: string;
62
- ariaLabelledBy: string;
63
- ariaDescribedBy: undefined | string;
64
- protected rippleElement: MdRipple | null;
65
- /** @soyTemplate */
66
- protected renderRipple(): TemplateResult | string;
67
- /** @soyTemplate */
68
- protected renderFocusRing(): TemplateResult;
69
- get isRippleActive(): boolean;
70
- connectedCallback(): void;
71
- disconnectedCallback(): void;
72
- updated(changedProperties: PropertyValues): void;
73
- protected createAdapter(): void;
74
- beginPress({ positionEvent }: BeginPressConfig): void;
75
- endPress({ cancelled }: EndPressConfig): void;
76
- click(): void;
77
- protected handleFocus(): void;
78
- protected handleBlur(): void;
79
- protected setFormData(formData: FormData): void;
80
30
  /**
81
- * @soyTemplate
82
- * @soyAttributes radioAttributes: input
83
- * @soyClasses radioClasses: .md3-radio
31
+ * The associated form element with which this element's value will submit.
84
32
  */
33
+ get form(): HTMLFormElement;
34
+ private readonly input;
35
+ private readonly ripple;
36
+ private readonly selectionController;
37
+ private showFocusRing;
38
+ private showRipple;
39
+ constructor();
40
+ [getFormValue](): string;
41
+ focus(): void;
85
42
  protected render(): TemplateResult;
86
- protected handlePointerEnter(): void;
87
- handlePointerDown(event: PointerEvent): void;
88
- handlePointerLeave(e: PointerEvent): void;
89
- protected changeHandler(): void;
43
+ private handleBlur;
44
+ private handleFocus;
45
+ private handleChange;
46
+ private handlePointerDown;
47
+ private readonly getRipple;
48
+ private readonly renderRipple;
49
+ private renderFocusRing;
90
50
  }
51
+ export {};
@@ -3,261 +3,138 @@
3
3
  * Copyright 2018 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ var _a;
6
7
  import { __decorate, __metadata } from "tslib";
7
- // Style preference for leading underscores.
8
- // tslint:disable:strip-private-property-underscore
9
8
  import '../../focus/focus-ring.js';
10
9
  import '../../ripple/ripple.js';
11
- import { html } from 'lit';
12
- import { property, query, state } from 'lit/decorators.js';
13
- import { classMap } from 'lit/directives/class-map.js';
14
- import { ifDefined } from 'lit/directives/if-defined.js';
15
- import { ActionElement } from '../../actionelement/action-element.js';
10
+ import { html, LitElement, nothing } from 'lit';
11
+ import { property, query, queryAsync, state } from 'lit/decorators.js';
12
+ import { when } from 'lit/directives/when.js';
13
+ import { dispatchActivationClick, isActivationClick, redispatchEvent } from '../../controller/events.js';
14
+ import { FormController, getFormValue } from '../../controller/form-controller.js';
16
15
  import { ariaProperty } from '../../decorators/aria-property.js';
17
16
  import { pointerPress, shouldShowStrongFocus } from '../../focus/strong-focus.js';
18
- import { MdRipple } from '../../ripple/ripple.js';
17
+ import { ripple } from '../../ripple/directive.js';
19
18
  import { SingleSelectionController } from './single-selection-controller.js';
19
+ const CHECKED = Symbol('checked');
20
20
  /**
21
21
  * @fires checked
22
- * @soyCompatible
23
22
  */
24
- export class Radio extends ActionElement {
23
+ export class Radio extends LitElement {
25
24
  constructor() {
26
- super(...arguments);
27
- this._checked = false;
28
- this.showFocusRing = false;
29
- this.global = false;
25
+ super();
26
+ this[_a] = false;
30
27
  this.disabled = false;
31
- this.value = 'on';
32
- this.name = '';
33
28
  /**
34
- * Touch target extends beyond visual boundary of a component by default.
35
- * Set to `true` to remove touch target added to the component.
36
- * @see https://material.io/design/usability/accessibility.html
29
+ * The element value to use in form submission when checked.
37
30
  */
38
- this.reducedTouchTarget = false;
31
+ this.value = 'on';
39
32
  /**
40
- * input's tabindex is updated based on checked status.
41
- * Tab navigation will be removed from unchecked radios.
33
+ * The HTML name to use in form submission.
42
34
  */
43
- this.formElementTabIndex = 0;
44
- this.focused = false;
45
- this.rippleElement = null;
46
- }
47
- get checked() {
48
- return this.getChecked();
49
- }
50
- getChecked() {
51
- return this._checked;
52
- }
53
- /**
54
- * We define our own getter/setter for `checked` because we need to track
55
- * changes to it synchronously.
56
- *
57
- * The order in which the `checked` property is set across radio buttons
58
- * within the same group is very important. However, we can't rely on
59
- * UpdatingElement's `updated` callback to observe these changes (which is
60
- * also what the `@observer` decorator uses), because it batches changes to
61
- * all properties.
62
- *
63
- * Consider:
64
- *
65
- * radio1.disabled = true;
66
- * radio2.checked = true;
67
- * radio1.checked = true;
68
- *
69
- * In this case we'd first see all changes for radio1, and then for radio2,
70
- * and we couldn't tell that radio1 was the most recently checked.
71
- */
72
- set checked(isChecked) {
73
- this.setChecked(isChecked);
74
- }
75
- setChecked(isChecked) {
76
- const oldValue = this._checked;
77
- if (isChecked === oldValue) {
78
- return;
79
- }
80
- this._checked = isChecked;
81
- this.selectionController?.update(this);
82
- this.requestUpdate('checked', oldValue);
83
- // useful when unchecks self and wrapping element needs to synchronize
84
- // TODO(b/168543810): Remove triggering event on programmatic API call.
85
- this.dispatchEvent(new Event('checked', { bubbles: true, composed: true }));
86
- }
87
- /** @soyTemplate */
88
- renderRipple() {
89
- return html `<md-ripple unbounded
90
- ?disabled="${this.disabled}"></md-ripple>`;
91
- }
92
- /** @soyTemplate */
93
- renderFocusRing() {
94
- return html `<md-focus-ring .visible="${this.showFocusRing}"></md-focus-ring>`;
95
- }
96
- get isRippleActive() {
97
- return false;
98
- }
99
- connectedCallback() {
100
- super.connectedCallback();
101
- // Note that we must defer creating the selection controller until the
102
- // element has connected, because selection controllers are keyed by the
103
- // radio's shadow root. For example, if we're stamping in a lit map
104
- // or repeat, then we'll be constructed before we're added to a root node.
105
- //
106
- // Also note if we aren't using native shadow DOM, we still need a
107
- // SelectionController, because we should update checked status of other
108
- // radios in the group when selection changes. It also simplifies
109
- // implementation and testing to use one in all cases.
110
- //
111
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
112
- this.selectionController = SingleSelectionController.getController(this);
113
- this.selectionController.register(this);
114
- // Radios maybe checked before connected, update selection as soon it is
115
- // connected to DOM. Last checked radio button in the DOM will be selected.
116
- //
117
- // NOTE: If we update selection only after firstUpdate() we might mistakenly
118
- // update checked status before other radios are rendered.
119
- this.selectionController.update(this);
120
- }
121
- disconnectedCallback() {
122
- // The controller is initialized in connectedCallback, so if we are in
123
- // disconnectedCallback then it must be initialized.
124
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
125
- this.selectionController.unregister(this);
126
- this.selectionController = undefined;
127
- }
128
- updated(changedProperties) {
129
- if (changedProperties.has('checked') && this.formElement) {
130
- this.formElement.checked = this.checked;
131
- if (!this.checked) {
132
- // Remove focus ring when unchecked on other radio programmatically.
133
- // Blur on input since this determines the focus style.
134
- this.formElement?.blur();
35
+ this.name = '';
36
+ this.selectionController = new SingleSelectionController(this);
37
+ this.showFocusRing = false;
38
+ this.showRipple = false;
39
+ this.getRipple = () => {
40
+ this.showRipple = true;
41
+ return this.ripple;
42
+ };
43
+ this.renderRipple = () => {
44
+ return html `<md-ripple unbounded ?disabled=${this.disabled}></md-ripple>`;
45
+ };
46
+ this.addController(new FormController(this));
47
+ this.addController(this.selectionController);
48
+ this.addEventListener('click', (event) => {
49
+ if (!isActivationClick(event)) {
50
+ return;
135
51
  }
136
- }
52
+ this.focus();
53
+ dispatchActivationClick(this.input);
54
+ });
137
55
  }
138
- createAdapter() { }
139
- beginPress({ positionEvent }) {
140
- this.ripple.beginPress(positionEvent);
56
+ get checked() {
57
+ return this[CHECKED];
141
58
  }
142
- endPress({ cancelled }) {
143
- this.ripple.endPress();
144
- if (cancelled) {
59
+ set checked(checked) {
60
+ const wasChecked = this.checked;
61
+ if (wasChecked === checked) {
145
62
  return;
146
63
  }
147
- super.endPress({
148
- cancelled,
149
- actionData: { checked: this.formElement.checked, value: this.formElement.value }
150
- });
64
+ this[CHECKED] = checked;
65
+ this.requestUpdate('checked', wasChecked);
66
+ this.selectionController.handleCheckedChange();
151
67
  }
152
- click() {
153
- this.formElement.focus();
154
- this.formElement.click();
68
+ /**
69
+ * The associated form element with which this element's value will submit.
70
+ */
71
+ get form() {
72
+ return this.closest('form');
155
73
  }
156
- handleFocus() {
157
- this.focused = true;
158
- this.showFocusRing = shouldShowStrongFocus();
74
+ [(_a = CHECKED, getFormValue)]() {
75
+ return this.checked ? this.value : null;
159
76
  }
160
- handleBlur() {
161
- this.focused = false;
162
- this.showFocusRing = false;
163
- }
164
- setFormData(formData) {
165
- if (this.name && this.checked) {
166
- formData.append(this.name, this.value);
167
- }
77
+ focus() {
78
+ this.input?.focus();
168
79
  }
169
- /**
170
- * @soyTemplate
171
- * @soyAttributes radioAttributes: input
172
- * @soyClasses radioClasses: .md3-radio
173
- */
174
80
  render() {
175
- /** @classMap */
176
- const classes = {
177
- 'md3-radio--touch': !this.reducedTouchTarget,
178
- 'md3-ripple-upgraded--background-focused': this.focused,
179
- 'md3-radio--disabled': this.disabled,
180
- };
181
81
  return html `
182
- <div class="md3-radio ${classMap(classes)}">
183
- ${this.renderFocusRing()}
184
- <input
185
- tabindex="${this.formElementTabIndex}"
186
- class="md3-radio__native-control"
187
- type="radio"
188
- name="${this.name}"
189
- aria-label="${ifDefined(this.ariaLabel)}"
190
- aria-labelledby="${ifDefined(this.ariaLabelledBy)}"
191
- aria-describedby="${ifDefined(this.ariaDescribedBy)}"
192
- ?checked="${this.checked}"
193
- .value="${this.value}"
194
- ?disabled="${this.disabled}"
195
- @change="${this.changeHandler}"
196
- @focus="${this.handleFocus}"
197
- @click="${this.handleClick}"
198
- @blur="${this.handleBlur}"
199
- @pointerenter=${this.handlePointerEnter}
200
- @pointerdown=${this.handlePointerDown}
201
- @pointerup=${this.handlePointerUp}
202
- @pointercancel=${this.handlePointerCancel}
203
- @pointerleave=${this.handlePointerLeave}
204
- >
205
- <div class="md3-radio__background">
206
- <div class="md3-radio__outer-circle"></div>
207
- <div class="md3-radio__inner-circle"></div>
208
- </div>
209
- <div class="md3-radio__ripple">
210
- ${this.renderRipple()}
211
- </div>
212
- </div>`;
82
+ ${when(this.showRipple, this.renderRipple)}
83
+ ${this.renderFocusRing()}
84
+ <svg class="icon" viewBox="0 0 20 20">
85
+ <mask id="cutout">
86
+ <rect width="100%" height="100%" fill="white" />
87
+ <circle cx="10" cy="10" r="8" fill="black" />
88
+ </mask>
89
+ <circle cx="10" cy="10" r="10" mask="url(#cutout)" />
90
+ <circle cx="10" cy="10" r="5" class="inner-circle" />
91
+ </svg>
92
+ <input
93
+ type="radio"
94
+ name=${this.name}
95
+ aria-label=${this.ariaLabel || nothing}
96
+ .checked=${this.checked}
97
+ .value=${this.value}
98
+ ?disabled=${this.disabled}
99
+ @change=${this.handleChange}
100
+ @focus=${this.handleFocus}
101
+ @blur=${this.handleBlur}
102
+ @pointerdown=${this.handlePointerDown}
103
+ ${ripple(this.getRipple)}
104
+ >
105
+ `;
213
106
  }
214
- handlePointerEnter() {
215
- this.ripple.beginHover();
107
+ handleBlur() {
108
+ this.showFocusRing = false;
216
109
  }
217
- handlePointerDown(event) {
218
- super.handlePointerDown(event);
219
- pointerPress();
110
+ handleFocus() {
220
111
  this.showFocusRing = shouldShowStrongFocus();
221
112
  }
222
- handlePointerLeave(e) {
223
- super.handlePointerLeave(e);
224
- this.ripple.endHover();
225
- }
226
- changeHandler() {
113
+ handleChange(event) {
227
114
  if (this.disabled) {
228
115
  return;
229
116
  }
230
117
  // Per spec, the change event on a radio input always represents checked.
231
118
  this.checked = true;
232
- this.dispatchEvent(new Event('change', {
233
- bubbles: true,
234
- composed: true,
235
- }));
119
+ redispatchEvent(this, event);
120
+ }
121
+ handlePointerDown() {
122
+ pointerPress();
123
+ this.showFocusRing = shouldShowStrongFocus();
124
+ }
125
+ renderFocusRing() {
126
+ return html `<md-focus-ring .visible=${this.showFocusRing}></md-focus-ring>`;
236
127
  }
237
128
  }
238
- __decorate([
239
- query('input'),
240
- __metadata("design:type", HTMLInputElement)
241
- ], Radio.prototype, "formElement", void 0);
242
- __decorate([
243
- query('md-ripple'),
244
- __metadata("design:type", MdRipple)
245
- ], Radio.prototype, "ripple", void 0);
246
- __decorate([
247
- state(),
248
- __metadata("design:type", Object)
249
- ], Radio.prototype, "showFocusRing", void 0);
250
- __decorate([
251
- property({ type: Boolean }),
252
- __metadata("design:type", Object)
253
- ], Radio.prototype, "global", void 0);
129
+ Radio.shadowRootOptions = { ...LitElement.shadowRootOptions, delegatesFocus: true };
130
+ Radio.formAssociated = true;
254
131
  __decorate([
255
132
  property({ type: Boolean, reflect: true }),
256
133
  __metadata("design:type", Boolean),
257
134
  __metadata("design:paramtypes", [Boolean])
258
135
  ], Radio.prototype, "checked", null);
259
136
  __decorate([
260
- property({ type: Boolean }),
137
+ property({ type: Boolean, reflect: true }),
261
138
  __metadata("design:type", Object)
262
139
  ], Radio.prototype, "disabled", void 0);
263
140
  __decorate([
@@ -265,21 +142,9 @@ __decorate([
265
142
  __metadata("design:type", Object)
266
143
  ], Radio.prototype, "value", void 0);
267
144
  __decorate([
268
- property({ type: String }),
145
+ property({ type: String, reflect: true }),
269
146
  __metadata("design:type", Object)
270
147
  ], Radio.prototype, "name", void 0);
271
- __decorate([
272
- property({ type: Boolean }),
273
- __metadata("design:type", Object)
274
- ], Radio.prototype, "reducedTouchTarget", void 0);
275
- __decorate([
276
- property({ type: Number }),
277
- __metadata("design:type", Object)
278
- ], Radio.prototype, "formElementTabIndex", void 0);
279
- __decorate([
280
- state(),
281
- __metadata("design:type", Object)
282
- ], Radio.prototype, "focused", void 0);
283
148
  __decorate([
284
149
  ariaProperty // tslint:disable-line:no-new-decorators
285
150
  ,
@@ -287,15 +152,19 @@ __decorate([
287
152
  __metadata("design:type", String)
288
153
  ], Radio.prototype, "ariaLabel", void 0);
289
154
  __decorate([
290
- ariaProperty // tslint:disable-line:no-new-decorators
291
- ,
292
- property({ attribute: 'data-aria-labelledby', noAccessor: true }),
293
- __metadata("design:type", String)
294
- ], Radio.prototype, "ariaLabelledBy", void 0);
155
+ query('input'),
156
+ __metadata("design:type", HTMLInputElement)
157
+ ], Radio.prototype, "input", void 0);
295
158
  __decorate([
296
- ariaProperty // tslint:disable-line:no-new-decorators
297
- ,
298
- property({ type: String, attribute: 'data-aria-describedby', noAccessor: true }),
299
- __metadata("design:type", String)
300
- ], Radio.prototype, "ariaDescribedBy", void 0);
159
+ queryAsync('md-ripple'),
160
+ __metadata("design:type", Promise)
161
+ ], Radio.prototype, "ripple", void 0);
162
+ __decorate([
163
+ state(),
164
+ __metadata("design:type", Object)
165
+ ], Radio.prototype, "showFocusRing", void 0);
166
+ __decorate([
167
+ state(),
168
+ __metadata("design:type", Object)
169
+ ], Radio.prototype, "showRipple", void 0);
301
170
  //# sourceMappingURL=radio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"radio.js","sourceRoot":"","sources":["radio.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Style preference for leading underscores.\n// tslint:disable:strip-private-property-underscore\n\nimport '../../focus/focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, PropertyValues, TemplateResult} from 'lit';\nimport {property, query, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport {ifDefined} from 'lit/directives/if-defined.js';\n\nimport {ActionElement, BeginPressConfig, EndPressConfig} from '../../actionelement/action-element.js';\nimport {ariaProperty} from '../../decorators/aria-property.js';\nimport {pointerPress, shouldShowStrongFocus} from '../../focus/strong-focus.js';\nimport {MdRipple} from '../../ripple/ripple.js';\n\nimport {SingleSelectionController} from './single-selection-controller.js';\n\n/**\n * @fires checked\n * @soyCompatible\n */\nexport class Radio extends ActionElement {\n @query('input') protected formElement!: HTMLInputElement;\n\n @query('md-ripple') ripple!: MdRipple;\n\n protected _checked = false;\n\n @state() protected showFocusRing = false;\n\n @property({type: Boolean}) global = false;\n\n @property({type: Boolean, reflect: true})\n get checked(): boolean {\n return this.getChecked();\n }\n\n protected getChecked(): boolean {\n return this._checked;\n }\n\n /**\n * We define our own getter/setter for `checked` because we need to track\n * changes to it synchronously.\n *\n * The order in which the `checked` property is set across radio buttons\n * within the same group is very important. However, we can't rely on\n * UpdatingElement's `updated` callback to observe these changes (which is\n * also what the `@observer` decorator uses), because it batches changes to\n * all properties.\n *\n * Consider:\n *\n * radio1.disabled = true;\n * radio2.checked = true;\n * radio1.checked = true;\n *\n * In this case we'd first see all changes for radio1, and then for radio2,\n * and we couldn't tell that radio1 was the most recently checked.\n */\n set checked(isChecked: boolean) {\n this.setChecked(isChecked);\n }\n\n protected setChecked(isChecked: boolean) {\n const oldValue = this._checked;\n if (isChecked === oldValue) {\n return;\n }\n this._checked = isChecked;\n this.selectionController?.update(this);\n\n this.requestUpdate('checked', oldValue);\n\n // useful when unchecks self and wrapping element needs to synchronize\n // TODO(b/168543810): Remove triggering event on programmatic API call.\n this.dispatchEvent(new Event('checked', {bubbles: true, composed: true}));\n }\n\n @property({type: Boolean}) override disabled = false;\n\n @property({type: String}) value = 'on';\n\n @property({type: String}) name = '';\n\n /**\n * Touch target extends beyond visual boundary of a component by default.\n * Set to `true` to remove touch target added to the component.\n * @see https://material.io/design/usability/accessibility.html\n */\n @property({type: Boolean}) reducedTouchTarget = false;\n\n protected selectionController?: SingleSelectionController;\n\n /**\n * input's tabindex is updated based on checked status.\n * Tab navigation will be removed from unchecked radios.\n */\n @property({type: Number}) formElementTabIndex = 0;\n\n @state() protected focused = false;\n\n @ariaProperty // tslint:disable-line:no-new-decorators\n @property({attribute: 'data-aria-label', noAccessor: true})\n override ariaLabel!: string;\n\n @ariaProperty // tslint:disable-line:no-new-decorators\n @property({attribute: 'data-aria-labelledby', noAccessor: true})\n ariaLabelledBy!: string;\n\n @ariaProperty // tslint:disable-line:no-new-decorators\n @property(\n {type: String, attribute: 'data-aria-describedby', noAccessor: true})\n ariaDescribedBy!: undefined|string;\n\n protected rippleElement: MdRipple|null = null;\n\n /** @soyTemplate */\n protected renderRipple(): TemplateResult|string {\n return html`<md-ripple unbounded\n ?disabled=\"${this.disabled}\"></md-ripple>`;\n }\n\n /** @soyTemplate */\n protected renderFocusRing(): TemplateResult {\n return html`<md-focus-ring .visible=\"${\n this.showFocusRing}\"></md-focus-ring>`;\n }\n\n get isRippleActive() {\n return false;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n // Note that we must defer creating the selection controller until the\n // element has connected, because selection controllers are keyed by the\n // radio's shadow root. For example, if we're stamping in a lit map\n // or repeat, then we'll be constructed before we're added to a root node.\n //\n // Also note if we aren't using native shadow DOM, we still need a\n // SelectionController, because we should update checked status of other\n // radios in the group when selection changes. It also simplifies\n // implementation and testing to use one in all cases.\n //\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n this.selectionController = SingleSelectionController.getController(this);\n this.selectionController.register(this);\n\n // Radios maybe checked before connected, update selection as soon it is\n // connected to DOM. Last checked radio button in the DOM will be selected.\n //\n // NOTE: If we update selection only after firstUpdate() we might mistakenly\n // update checked status before other radios are rendered.\n this.selectionController.update(this);\n }\n\n override disconnectedCallback() {\n // The controller is initialized in connectedCallback, so if we are in\n // disconnectedCallback then it must be initialized.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.selectionController!.unregister(this);\n this.selectionController = undefined;\n }\n\n override updated(changedProperties: PropertyValues) {\n if (changedProperties.has('checked') && this.formElement) {\n this.formElement.checked = this.checked;\n if (!this.checked) {\n // Remove focus ring when unchecked on other radio programmatically.\n // Blur on input since this determines the focus style.\n this.formElement?.blur();\n }\n }\n }\n\n protected createAdapter() {}\n\n override beginPress({positionEvent}: BeginPressConfig) {\n this.ripple.beginPress(positionEvent);\n }\n\n override endPress({cancelled}: EndPressConfig) {\n this.ripple.endPress();\n\n if (cancelled) {\n return;\n }\n\n super.endPress({\n cancelled,\n actionData:\n {checked: this.formElement.checked, value: this.formElement.value}\n });\n }\n\n override click() {\n this.formElement.focus();\n this.formElement.click();\n }\n\n protected handleFocus() {\n this.focused = true;\n this.showFocusRing = shouldShowStrongFocus();\n }\n\n protected handleBlur() {\n this.focused = false;\n this.showFocusRing = false;\n }\n\n protected setFormData(formData: FormData) {\n if (this.name && this.checked) {\n formData.append(this.name, this.value);\n }\n }\n\n /**\n * @soyTemplate\n * @soyAttributes radioAttributes: input\n * @soyClasses radioClasses: .md3-radio\n */\n protected override render(): TemplateResult {\n /** @classMap */\n const classes = {\n 'md3-radio--touch': !this.reducedTouchTarget,\n 'md3-ripple-upgraded--background-focused': this.focused,\n 'md3-radio--disabled': this.disabled,\n };\n\n return html`\n <div class=\"md3-radio ${classMap(classes)}\">\n ${this.renderFocusRing()}\n <input\n tabindex=\"${this.formElementTabIndex}\"\n class=\"md3-radio__native-control\"\n type=\"radio\"\n name=\"${this.name}\"\n aria-label=\"${ifDefined(this.ariaLabel)}\"\n aria-labelledby=\"${ifDefined(this.ariaLabelledBy)}\"\n aria-describedby=\"${ifDefined(this.ariaDescribedBy)}\"\n ?checked=\"${this.checked}\"\n .value=\"${this.value}\"\n ?disabled=\"${this.disabled}\"\n @change=\"${this.changeHandler}\"\n @focus=\"${this.handleFocus}\"\n @click=\"${this.handleClick}\"\n @blur=\"${this.handleBlur}\"\n @pointerenter=${this.handlePointerEnter}\n @pointerdown=${this.handlePointerDown}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n @pointerleave=${this.handlePointerLeave}\n >\n <div class=\"md3-radio__background\">\n <div class=\"md3-radio__outer-circle\"></div>\n <div class=\"md3-radio__inner-circle\"></div>\n </div>\n <div class=\"md3-radio__ripple\">\n ${this.renderRipple()}\n </div>\n </div>`;\n }\n\n protected handlePointerEnter() {\n this.ripple.beginHover();\n }\n\n override handlePointerDown(event: PointerEvent) {\n super.handlePointerDown(event);\n\n pointerPress();\n this.showFocusRing = shouldShowStrongFocus();\n }\n\n override handlePointerLeave(e: PointerEvent) {\n super.handlePointerLeave(e);\n this.ripple.endHover();\n }\n\n protected changeHandler() {\n if (this.disabled) {\n return;\n }\n\n // Per spec, the change event on a radio input always represents checked.\n this.checked = true;\n this.dispatchEvent(new Event('change', {\n bubbles: true,\n composed: true,\n }));\n }\n}\n"]}
1
+ {"version":3,"file":"radio.js","sourceRoot":"","sources":["radio.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../focus/focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, LitElement, nothing, TemplateResult} from 'lit';\nimport {property, query, queryAsync, state} from 'lit/decorators.js';\nimport {when} from 'lit/directives/when.js';\n\nimport {dispatchActivationClick, isActivationClick, redispatchEvent} from '../../controller/events.js';\nimport {FormController, getFormValue} from '../../controller/form-controller.js';\nimport {ariaProperty} from '../../decorators/aria-property.js';\nimport {pointerPress, shouldShowStrongFocus} from '../../focus/strong-focus.js';\nimport {ripple} from '../../ripple/directive.js';\nimport {MdRipple} from '../../ripple/ripple.js';\n\nimport {SingleSelectionController} from './single-selection-controller.js';\n\nconst CHECKED = Symbol('checked');\n\n/**\n * @fires checked\n */\nexport class Radio extends LitElement {\n static override shadowRootOptions:\n ShadowRootInit = {...LitElement.shadowRootOptions, delegatesFocus: true};\n\n static formAssociated = true;\n\n @property({type: Boolean, reflect: true})\n get checked() {\n return this[CHECKED];\n }\n set checked(checked: boolean) {\n const wasChecked = this.checked;\n if (wasChecked === checked) {\n return;\n }\n\n this[CHECKED] = checked;\n this.requestUpdate('checked', wasChecked);\n this.selectionController.handleCheckedChange();\n }\n\n [CHECKED] = false;\n\n @property({type: Boolean, reflect: true}) disabled = false;\n\n /**\n * The element value to use in form submission when checked.\n */\n @property({type: String}) value = 'on';\n\n /**\n * The HTML name to use in form submission.\n */\n @property({type: String, reflect: true}) name = '';\n\n @ariaProperty // tslint:disable-line:no-new-decorators\n @property({attribute: 'data-aria-label', noAccessor: true})\n override ariaLabel!: string;\n\n /**\n * The associated form element with which this element's value will submit.\n */\n get form() {\n return this.closest('form');\n }\n\n @query('input') private readonly input!: HTMLInputElement|null;\n @queryAsync('md-ripple') private readonly ripple!: Promise<MdRipple|null>;\n private readonly selectionController = new SingleSelectionController(this);\n @state() private showFocusRing = false;\n @state() private showRipple = false;\n\n constructor() {\n super();\n this.addController(new FormController(this));\n this.addController(this.selectionController);\n this.addEventListener('click', (event: Event) => {\n if (!isActivationClick(event)) {\n return;\n }\n this.focus();\n dispatchActivationClick(this.input!);\n });\n }\n\n [getFormValue]() {\n return this.checked ? this.value : null;\n }\n\n override focus() {\n this.input?.focus();\n }\n\n protected override render(): TemplateResult {\n return html`\n ${when(this.showRipple, this.renderRipple)}\n ${this.renderFocusRing()}\n <svg class=\"icon\" viewBox=\"0 0 20 20\">\n <mask id=\"cutout\">\n <rect width=\"100%\" height=\"100%\" fill=\"white\" />\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"black\" />\n </mask>\n <circle cx=\"10\" cy=\"10\" r=\"10\" mask=\"url(#cutout)\" />\n <circle cx=\"10\" cy=\"10\" r=\"5\" class=\"inner-circle\" />\n </svg>\n <input\n type=\"radio\"\n name=${this.name}\n aria-label=${this.ariaLabel || nothing}\n .checked=${this.checked}\n .value=${this.value}\n ?disabled=${this.disabled}\n @change=${this.handleChange}\n @focus=${this.handleFocus}\n @blur=${this.handleBlur}\n @pointerdown=${this.handlePointerDown}\n ${ripple(this.getRipple)}\n >\n `;\n }\n\n private handleBlur() {\n this.showFocusRing = false;\n }\n\n private handleFocus() {\n this.showFocusRing = shouldShowStrongFocus();\n }\n\n private handleChange(event: Event) {\n if (this.disabled) {\n return;\n }\n\n // Per spec, the change event on a radio input always represents checked.\n this.checked = true;\n redispatchEvent(this, event);\n }\n\n private handlePointerDown() {\n pointerPress();\n this.showFocusRing = shouldShowStrongFocus();\n }\n\n private readonly getRipple = () => {\n this.showRipple = true;\n return this.ripple;\n };\n\n private readonly renderRipple = () => {\n return html`<md-ripple unbounded ?disabled=${this.disabled}></md-ripple>`;\n };\n\n private renderFocusRing(): TemplateResult {\n return html`<md-focus-ring .visible=${this.showFocusRing}></md-focus-ring>`;\n }\n}\n"]}