@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.
- package/CHANGELOG.md +141 -0
- package/autocomplete/lib/_filled-autocomplete.scss +3 -4
- package/autocomplete/lib/_outlined-autocomplete.scss +3 -3
- package/autocomplete/lib/_shared.scss +2 -7
- package/autocomplete/lib/filled-styles.css.js +1 -1
- package/autocomplete/lib/filled-styles.css.js.map +1 -1
- package/autocomplete/lib/outlined-styles.css.js +1 -1
- package/autocomplete/lib/outlined-styles.css.js.map +1 -1
- package/button/lib/_elevated-button.scss +6 -0
- package/button/lib/_elevation.scss +30 -28
- package/button/lib/_filled-button.scss +6 -0
- package/button/lib/_outlined-button.scss +10 -1
- package/button/lib/_shared.scss +18 -8
- package/button/lib/_text-button.scss +6 -0
- package/button/lib/_tonal-button.scss +6 -0
- package/button/lib/elevated-styles.css.js +1 -1
- package/button/lib/elevated-styles.css.js.map +1 -1
- package/button/lib/filled-styles.css.js +1 -1
- package/button/lib/filled-styles.css.js.map +1 -1
- package/button/lib/outlined-styles.css.js +1 -1
- package/button/lib/outlined-styles.css.js.map +1 -1
- package/button/lib/shared-elevation-styles.css.js +1 -1
- package/button/lib/shared-elevation-styles.css.js.map +1 -1
- package/button/lib/shared-styles.css.js +1 -1
- package/button/lib/shared-styles.css.js.map +1 -1
- package/button/lib/text-styles.css.js +1 -1
- package/button/lib/text-styles.css.js.map +1 -1
- package/button/lib/tonal-styles.css.js +1 -1
- package/button/lib/tonal-styles.css.js.map +1 -1
- package/checkbox/lib/_checkbox.scss +5 -1
- package/checkbox/lib/checkbox-styles.css.js +1 -1
- package/checkbox/lib/checkbox-styles.css.js.map +1 -1
- package/chips/chip/lib/_chip-theme.scss +29 -33
- package/chips/chip/lib/_chip.scss +2 -4
- package/chips/chip/lib/_input-chip-theme.scss +16 -26
- package/chips/chip/lib/chip.d.ts +1 -0
- package/chips/chip/lib/chip.js +2 -1
- package/chips/chip/lib/chip.js.map +1 -1
- package/fab/fab-extended.js +1 -2
- package/fab/fab-extended.js.map +1 -1
- package/fab/fab.js +1 -2
- package/fab/fab.js.map +1 -1
- package/fab/lib/_shared.scss +13 -11
- package/fab/lib/fab-shared-styles.css.js +1 -1
- package/fab/lib/fab-shared-styles.css.js.map +1 -1
- package/field/lib/filled-styles.css.js +1 -1
- package/field/lib/filled-styles.css.js.map +1 -1
- package/iconbutton/lib/_filled-icon-button.scss +18 -4
- package/iconbutton/lib/_filled-tonal-icon-button.scss +18 -4
- package/iconbutton/lib/_outlined-icon-button.scss +17 -3
- package/iconbutton/lib/_shared.scss +20 -1
- package/iconbutton/lib/_standard-icon-button.scss +25 -3
- package/iconbutton/lib/filled-styles.css.js +1 -1
- package/iconbutton/lib/filled-styles.css.js.map +1 -1
- package/iconbutton/lib/filled-tonal-styles.css.js +1 -1
- package/iconbutton/lib/filled-tonal-styles.css.js.map +1 -1
- package/iconbutton/lib/icon-button-toggle.js +1 -1
- package/iconbutton/lib/icon-button-toggle.js.map +1 -1
- package/iconbutton/lib/icon-button.js +1 -1
- package/iconbutton/lib/icon-button.js.map +1 -1
- package/iconbutton/lib/outlined-styles.css.js +1 -1
- package/iconbutton/lib/outlined-styles.css.js.map +1 -1
- package/iconbutton/lib/shared-styles.css.js +1 -1
- package/iconbutton/lib/shared-styles.css.js.map +1 -1
- package/iconbutton/lib/standard-styles.css.js +1 -1
- package/iconbutton/lib/standard-styles.css.js.map +1 -1
- package/list/lib/_list.scss +20 -14
- package/list/lib/divider/list-divider.js +2 -0
- package/list/lib/divider/list-divider.js.map +1 -1
- package/list/lib/list-styles.css.js +1 -1
- package/list/lib/list-styles.css.js.map +1 -1
- package/list/lib/list.d.ts +1 -0
- package/list/lib/list.js +4 -1
- package/list/lib/list.js.map +1 -1
- package/list/lib/listitem/list-item.js +2 -0
- package/list/lib/listitem/list-item.js.map +1 -1
- package/menu/lib/_menu.scss +7 -10
- package/menu/lib/menu-styles.css.js +1 -1
- package/menu/lib/menu-styles.css.js.map +1 -1
- package/menusurface/lib/_md-comp-menu-surface.scss +6 -14
- package/menusurface/lib/_menu-surface.scss +8 -4
- package/menusurface/lib/menu-surface-styles.css.js +1 -1
- package/menusurface/lib/menu-surface-styles.css.js.map +1 -1
- package/menusurface/lib/menu-surface.d.ts +1 -0
- package/menusurface/lib/menu-surface.js +2 -0
- package/menusurface/lib/menu-surface.js.map +1 -1
- package/navigationdrawer/lib/_navigation-drawer-modal.scss +7 -22
- package/navigationdrawer/lib/_navigation-drawer.scss +15 -18
- package/navigationdrawer/lib/_shared.scss +2 -7
- package/navigationdrawer/lib/navigation-drawer-modal-styles.css.js +1 -1
- package/navigationdrawer/lib/navigation-drawer-modal-styles.css.js.map +1 -1
- package/navigationdrawer/lib/navigation-drawer-styles.css.js +1 -1
- package/navigationdrawer/lib/navigation-drawer-styles.css.js.map +1 -1
- package/navigationdrawer/lib/navigation-drawer.d.ts +1 -0
- package/navigationdrawer/lib/navigation-drawer.js +3 -2
- package/navigationdrawer/lib/navigation-drawer.js.map +1 -1
- package/navigationtab/lib/_navigation-tab.scss +3 -3
- package/package.json +8 -1
- package/radio/_radio.scss +6 -1
- package/radio/lib/_radio.scss +128 -92
- package/radio/lib/forced-colors-styles.css.d.ts +1 -0
- package/radio/lib/forced-colors-styles.css.js +9 -0
- package/radio/lib/forced-colors-styles.css.js.map +1 -0
- package/radio/lib/forced-colors-styles.scss +27 -0
- package/radio/lib/radio-styles.css.js +1 -1
- package/radio/lib/radio-styles.css.js.map +1 -1
- package/radio/lib/radio-styles.scss +1 -7
- package/radio/lib/radio.d.ts +30 -69
- package/radio/lib/radio.js +104 -235
- package/radio/lib/radio.js.map +1 -1
- package/radio/lib/single-selection-controller.d.ts +51 -138
- package/radio/lib/single-selection-controller.js +153 -249
- package/radio/lib/single-selection-controller.js.map +1 -1
- package/radio/radio.js +2 -1
- package/radio/radio.js.map +1 -1
- package/ripple/lib/_ripple.scss +21 -4
- package/ripple/lib/ripple-styles.css.js +1 -1
- package/ripple/lib/ripple-styles.css.js.map +1 -1
- package/ripple/lib/ripple.js +4 -1
- package/ripple/lib/ripple.js.map +1 -1
- package/segmentedbutton/lib/_shared.scss +3 -3
- package/switch/lib/_handle.scss +4 -3
- package/switch/lib/switch-styles.css.js +1 -1
- package/switch/lib/switch-styles.css.js.map +1 -1
- package/switch/lib/switch.d.ts +17 -21
- package/switch/lib/switch.js +54 -57
- package/switch/lib/switch.js.map +1 -1
- package/textfield/filled-text-field.d.ts +1 -0
- package/textfield/filled-text-field.js.map +1 -1
- package/textfield/lib/_shared.scss +1 -0
- package/textfield/lib/filled-styles.css.js +1 -1
- package/textfield/lib/filled-styles.css.js.map +1 -1
- package/textfield/lib/shared-styles.css.js +1 -1
- package/textfield/lib/shared-styles.css.js.map +1 -1
- package/textfield/lib/text-field.js +3 -0
- package/textfield/lib/text-field.js.map +1 -1
- package/textfield/outlined-text-field.d.ts +1 -0
- package/textfield/outlined-text-field.js.map +1 -1
- package/tokens/_index.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_index.scss +0 -0
- package/tokens/{v0_144 → v0_150}/_md-comp-assist-chip.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-badge.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-banner.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-bottom-app-bar.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-carousel-item.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-checkbox.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-circular-progress-indicator.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-data-table.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-date-input-modal.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-date-picker-docked.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-date-picker-modal.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-dialog.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-divider.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-elevated-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-elevated-card.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-branded.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-primary.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-secondary.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-surface.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-extended-fab-tertiary.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-branded-large.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-branded.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-primary-large.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-primary-small.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-primary.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-secondary-large.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-secondary-small.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-secondary.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-surface-large.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-surface-small.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-surface.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-tertiary-large.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-tertiary-small.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-fab-tertiary.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-filled-autocomplete.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-filled-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-filled-card.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-filled-icon-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-filled-menu-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-filled-select.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-filled-text-field.scss +2 -2
- package/tokens/{v0_144 → v0_150}/_md-comp-filled-tonal-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-filled-tonal-icon-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-filter-chip.scss +2 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-full-screen-dialog.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-icon-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-input-chip.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-linear-progress-indicator.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-list.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-menu.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-navigation-bar.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-navigation-drawer.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-navigation-rail.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-outlined-autocomplete.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-outlined-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-outlined-card.scss +5 -5
- package/tokens/{v0_144 → v0_150}/_md-comp-outlined-icon-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-outlined-menu-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-outlined-segmented-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-outlined-select.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-outlined-text-field.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-plain-tooltip.scss +2 -2
- package/tokens/{v0_144 → v0_150}/_md-comp-primary-navigation-tab.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-radio-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-rich-tooltip.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-scrim.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-search-bar.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-search-view.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-secondary-navigation-tab.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-sheet-bottom.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-sheet-floating.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-sheet-side.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-slider.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-snackbar.scss +25 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-standard-menu-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-suggestion-chip.scss +6 -6
- package/tokens/{v0_144 → v0_150}/_md-comp-switch.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-text-button.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-time-input.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-time-picker.scss +2 -2
- package/tokens/{v0_144 → v0_150}/_md-comp-top-app-bar-large.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-top-app-bar-medium.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-top-app-bar-small-centered.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-comp-top-app-bar-small.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-ref-palette.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-ref-typeface.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-sys-color.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-sys-elevation.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-sys-motion.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-sys-shape.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-sys-state.scss +1 -1
- package/tokens/{v0_144 → v0_150}/_md-sys-typescale.scss +1 -1
- package/tokens/v0_150/index.test.css.d.ts +1 -0
- package/tokens/v0_150/index.test.css.js +9 -0
- package/tokens/v0_150/index.test.css.js.map +1 -0
- package/tokens/v0_150/index.test.scss +584 -0
- package/tokens/v0_150/lib.test.css.d.ts +1 -0
- package/tokens/v0_150/lib.test.css.js +9 -0
- package/tokens/v0_150/lib.test.css.js.map +1 -0
- package/tokens/v0_150/lib.test.scss +663 -0
- package/elevationold/lib/_elevation-overlay-theme.scss +0 -31
- package/elevationold/lib/_elevation-overlay.scss +0 -18
- package/elevationold/lib/_elevation-theme.scss +0 -74
- package/elevationold/lib/_surface.scss +0 -15
- package/elevationold/lib/elevation-overlay-styles.scss +0 -9
- package/radio/lib/_radio-theme.scss +0 -377
- package/ripple/_ripple-theme.scss +0 -17
package/radio/lib/radio.d.ts
CHANGED
|
@@ -5,86 +5,47 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import '../../focus/focus-ring.js';
|
|
7
7
|
import '../../ripple/ripple.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
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
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
54
|
-
protected selectionController?: SingleSelectionController;
|
|
24
|
+
value: string;
|
|
55
25
|
/**
|
|
56
|
-
*
|
|
57
|
-
* Tab navigation will be removed from unchecked radios.
|
|
26
|
+
* The HTML name to use in form submission.
|
|
58
27
|
*/
|
|
59
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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 {};
|
package/radio/lib/radio.js
CHANGED
|
@@ -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 {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
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 {
|
|
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
|
|
23
|
+
export class Radio extends LitElement {
|
|
25
24
|
constructor() {
|
|
26
|
-
super(
|
|
27
|
-
this
|
|
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
|
-
*
|
|
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.
|
|
31
|
+
this.value = 'on';
|
|
39
32
|
/**
|
|
40
|
-
*
|
|
41
|
-
* Tab navigation will be removed from unchecked radios.
|
|
33
|
+
* The HTML name to use in form submission.
|
|
42
34
|
*/
|
|
43
|
-
this.
|
|
44
|
-
this.
|
|
45
|
-
this.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
this.ripple.beginPress(positionEvent);
|
|
56
|
+
get checked() {
|
|
57
|
+
return this[CHECKED];
|
|
141
58
|
}
|
|
142
|
-
|
|
143
|
-
this.
|
|
144
|
-
if (
|
|
59
|
+
set checked(checked) {
|
|
60
|
+
const wasChecked = this.checked;
|
|
61
|
+
if (wasChecked === checked) {
|
|
145
62
|
return;
|
|
146
63
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
});
|
|
64
|
+
this[CHECKED] = checked;
|
|
65
|
+
this.requestUpdate('checked', wasChecked);
|
|
66
|
+
this.selectionController.handleCheckedChange();
|
|
151
67
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
157
|
-
this.
|
|
158
|
-
this.showFocusRing = shouldShowStrongFocus();
|
|
74
|
+
[(_a = CHECKED, getFormValue)]() {
|
|
75
|
+
return this.checked ? this.value : null;
|
|
159
76
|
}
|
|
160
|
-
|
|
161
|
-
this.
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
215
|
-
this.
|
|
107
|
+
handleBlur() {
|
|
108
|
+
this.showFocusRing = false;
|
|
216
109
|
}
|
|
217
|
-
|
|
218
|
-
super.handlePointerDown(event);
|
|
219
|
-
pointerPress();
|
|
110
|
+
handleFocus() {
|
|
220
111
|
this.showFocusRing = shouldShowStrongFocus();
|
|
221
112
|
}
|
|
222
|
-
|
|
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
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
239
|
-
|
|
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
|
-
|
|
291
|
-
,
|
|
292
|
-
|
|
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
|
-
|
|
297
|
-
,
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
package/radio/lib/radio.js.map
CHANGED
|
@@ -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"]}
|