@material/web 1.0.0 → 1.0.2-nightly.33c1afe.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/all.d.ts +2 -0
- package/all.js +2 -0
- package/all.js.map +1 -1
- package/button/elevated-button.js +5 -1
- package/button/elevated-button.js.map +1 -1
- package/button/internal/_elevation.scss +32 -32
- package/button/internal/_icon.scss +22 -23
- package/button/internal/_outlined-button.scss +21 -19
- package/button/internal/_shared.scss +84 -77
- package/button/internal/_touch-target.scss +4 -0
- package/button/internal/button.d.ts +7 -11
- package/button/internal/button.js +52 -38
- package/button/internal/button.js.map +1 -1
- package/button/internal/elevated-button.d.ts +1 -1
- package/button/internal/elevated-button.js +1 -1
- package/button/internal/elevated-button.js.map +1 -1
- package/button/internal/filled-button.d.ts +1 -1
- package/button/internal/filled-button.js +1 -1
- package/button/internal/filled-button.js.map +1 -1
- package/button/internal/filled-tonal-button.d.ts +1 -1
- package/button/internal/filled-tonal-button.js +1 -1
- package/button/internal/filled-tonal-button.js.map +1 -1
- package/button/internal/outlined-button.d.ts +1 -1
- package/button/internal/outlined-button.js +2 -2
- package/button/internal/outlined-button.js.map +1 -1
- package/button/internal/outlined-styles.css.js +1 -1
- package/button/internal/outlined-styles.css.js.map +1 -1
- package/button/internal/shared-elevation-styles.css.js +1 -1
- package/button/internal/shared-elevation-styles.css.js.map +1 -1
- package/button/internal/shared-styles.css.js +1 -1
- package/button/internal/shared-styles.css.js.map +1 -1
- package/checkbox/internal/_checkbox.scss +6 -0
- package/checkbox/internal/checkbox-styles.css.js +1 -1
- package/checkbox/internal/checkbox-styles.css.js.map +1 -1
- package/checkbox/internal/checkbox.d.ts +20 -87
- package/checkbox/internal/checkbox.js +35 -153
- package/checkbox/internal/checkbox.js.map +1 -1
- package/chips/filter-chip.js +5 -1
- package/chips/filter-chip.js.map +1 -1
- package/chips/harness.js.map +1 -1
- package/chips/input-chip.js +6 -1
- package/chips/input-chip.js.map +1 -1
- package/chips/internal/_shared.scss +1 -0
- package/chips/internal/assist-chip.js +8 -4
- package/chips/internal/assist-chip.js.map +1 -1
- package/chips/internal/chip-set.js +6 -4
- package/chips/internal/chip-set.js.map +1 -1
- package/chips/internal/chip.d.ts +3 -0
- package/chips/internal/chip.js +7 -5
- package/chips/internal/chip.js.map +1 -1
- package/chips/internal/filter-chip.d.ts +2 -0
- package/chips/internal/filter-chip.js +11 -5
- package/chips/internal/filter-chip.js.map +1 -1
- package/chips/internal/input-chip.d.ts +2 -0
- package/chips/internal/input-chip.js +10 -4
- package/chips/internal/input-chip.js.map +1 -1
- package/chips/internal/multi-action-chip.js.map +1 -1
- package/chips/internal/shared-styles.css.js +1 -1
- package/chips/internal/shared-styles.css.js.map +1 -1
- package/chips/internal/trailing-icons.d.ts +1 -1
- package/chips/internal/trailing-icons.js +6 -5
- package/chips/internal/trailing-icons.js.map +1 -1
- package/common.d.ts +2 -0
- package/common.js +2 -0
- package/common.js.map +1 -1
- package/dialog/harness.js +1 -2
- package/dialog/harness.js.map +1 -1
- package/dialog/internal/_dialog.scss +1 -1
- package/dialog/internal/animations.js +14 -12
- package/dialog/internal/animations.js.map +1 -1
- package/dialog/internal/dialog-styles.css.js +1 -1
- package/dialog/internal/dialog-styles.css.js.map +1 -1
- package/dialog/internal/dialog.d.ts +6 -6
- package/dialog/internal/dialog.js +24 -24
- package/dialog/internal/dialog.js.map +1 -1
- package/fab/harness.js.map +1 -1
- package/fab/internal/_fab.scss +4 -0
- package/fab/internal/_shared.scss +1 -0
- package/fab/internal/fab-styles.css.js +1 -1
- package/fab/internal/fab-styles.css.js.map +1 -1
- package/fab/internal/fab.js.map +1 -1
- package/fab/internal/shared-styles.css.js +1 -1
- package/fab/internal/shared-styles.css.js.map +1 -1
- package/fab/internal/shared.js +10 -11
- package/fab/internal/shared.js.map +1 -1
- package/field/harness.js.map +1 -1
- package/field/internal/_content.scss +185 -174
- package/field/internal/_filled-field.scss +147 -135
- package/field/internal/_label.scss +83 -72
- package/field/internal/_outlined-field.scss +276 -261
- package/field/internal/_supporting-text.scss +53 -42
- package/field/internal/field.js +26 -22
- package/field/internal/field.js.map +1 -1
- package/field/internal/filled-styles.css.js +1 -1
- package/field/internal/filled-styles.css.js.map +1 -1
- package/field/internal/outlined-styles.css.js +1 -1
- package/field/internal/outlined-styles.css.js.map +1 -1
- package/field/internal/shared-styles.css.js +1 -1
- package/field/internal/shared-styles.css.js.map +1 -1
- package/focus/internal/focus-ring.d.ts +2 -0
- package/focus/internal/focus-ring.js +3 -3
- package/focus/internal/focus-ring.js.map +1 -1
- package/icon/internal/_icon.scss +7 -4
- package/icon/internal/icon-styles.css.js +1 -1
- package/icon/internal/icon-styles.css.js.map +1 -1
- package/iconbutton/internal/icon-button.d.ts +9 -4
- package/iconbutton/internal/icon-button.js +35 -22
- package/iconbutton/internal/icon-button.js.map +1 -1
- package/internal/aria/aria.d.ts +4 -26
- package/internal/aria/aria.js +10 -28
- package/internal/aria/aria.js.map +1 -1
- package/internal/aria/delegate.js +2 -2
- package/internal/aria/delegate.js.map +1 -1
- package/internal/controller/attachable-controller.js +3 -5
- package/internal/controller/attachable-controller.js.map +1 -1
- package/internal/controller/form-submitter.d.ts +3 -5
- package/internal/controller/form-submitter.js +5 -7
- package/internal/controller/form-submitter.js.map +1 -1
- package/internal/controller/is-rtl.js +2 -2
- package/internal/controller/is-rtl.js.map +1 -1
- package/internal/controller/string-converter.js +1 -1
- package/internal/controller/string-converter.js.map +1 -1
- package/internal/motion/animation.js.map +1 -1
- package/labs/behaviors/constraint-validation.d.ts +133 -0
- package/labs/behaviors/constraint-validation.js +114 -0
- package/labs/behaviors/constraint-validation.js.map +1 -0
- package/labs/behaviors/element-internals.d.ts +45 -0
- package/labs/behaviors/element-internals.js +50 -0
- package/labs/behaviors/element-internals.js.map +1 -0
- package/labs/behaviors/focusable.d.ts +39 -0
- package/labs/behaviors/focusable.js +82 -0
- package/labs/behaviors/focusable.js.map +1 -0
- package/labs/behaviors/form-associated.d.ts +199 -0
- package/labs/behaviors/form-associated.js +155 -0
- package/labs/behaviors/form-associated.js.map +1 -0
- package/labs/behaviors/mixin.d.ts +54 -0
- package/labs/behaviors/mixin.js +7 -0
- package/labs/behaviors/mixin.js.map +1 -0
- package/labs/behaviors/on-report-validity.d.ts +70 -0
- package/labs/behaviors/on-report-validity.js +150 -0
- package/labs/behaviors/on-report-validity.js.map +1 -0
- package/labs/behaviors/validators/checkbox-validator.d.ts +31 -0
- package/labs/behaviors/validators/checkbox-validator.js +29 -0
- package/labs/behaviors/validators/checkbox-validator.js.map +1 -0
- package/labs/behaviors/validators/select-validator.d.ts +31 -0
- package/labs/behaviors/validators/select-validator.js +30 -0
- package/labs/behaviors/validators/select-validator.js.map +1 -0
- package/labs/behaviors/validators/validator.d.ts +92 -0
- package/labs/behaviors/validators/validator.js +83 -0
- package/labs/behaviors/validators/validator.js.map +1 -0
- package/labs/card/_elevated-card.scss +6 -0
- package/labs/card/_filled-card.scss +6 -0
- package/labs/card/_outlined-card.scss +6 -0
- package/labs/card/elevated-card.d.ts +18 -0
- package/labs/card/elevated-card.js +21 -0
- package/labs/card/elevated-card.js.map +1 -0
- package/labs/card/filled-card.d.ts +18 -0
- package/labs/card/filled-card.js +21 -0
- package/labs/card/filled-card.js.map +1 -0
- package/labs/card/internal/_elevated-card.scss +35 -0
- package/labs/card/internal/_filled-card.scss +35 -0
- package/labs/card/internal/_outlined-card.scss +39 -0
- package/labs/card/internal/_shared.scss +40 -0
- package/labs/card/internal/card.d.ts +13 -0
- package/labs/card/internal/card.js +20 -0
- package/labs/card/internal/card.js.map +1 -0
- package/labs/card/internal/elevated-styles.css.js +9 -0
- package/labs/card/internal/elevated-styles.css.js.map +1 -0
- package/labs/card/internal/elevated-styles.scss +10 -0
- package/labs/card/internal/filled-styles.css.js +9 -0
- package/labs/card/internal/filled-styles.css.js.map +1 -0
- package/labs/card/internal/filled-styles.scss +10 -0
- package/labs/card/internal/outlined-styles.css.js +9 -0
- package/labs/card/internal/outlined-styles.css.js.map +1 -0
- package/labs/card/internal/outlined-styles.scss +10 -0
- package/labs/card/internal/shared-styles.css.js +9 -0
- package/labs/card/internal/shared-styles.css.js.map +1 -0
- package/labs/card/internal/shared-styles.scss +10 -0
- package/labs/card/outlined-card.d.ts +18 -0
- package/labs/card/outlined-card.js +21 -0
- package/labs/card/outlined-card.js.map +1 -0
- package/labs/item/internal/_item.scss +1 -1
- package/labs/item/internal/item-styles.css.js +1 -1
- package/labs/item/internal/item-styles.css.js.map +1 -1
- package/labs/item/internal/item.js +8 -8
- package/labs/item/internal/item.js.map +1 -1
- package/labs/navigationbar/internal/constants.js.map +1 -1
- package/labs/navigationbar/internal/navigation-bar.d.ts +3 -0
- package/labs/navigationbar/internal/navigation-bar.js +18 -11
- package/labs/navigationbar/internal/navigation-bar.js.map +1 -1
- package/labs/navigationdrawer/internal/navigation-drawer-modal.d.ts +3 -0
- package/labs/navigationdrawer/internal/navigation-drawer-modal.js +10 -3
- package/labs/navigationdrawer/internal/navigation-drawer-modal.js.map +1 -1
- package/labs/navigationdrawer/internal/navigation-drawer.d.ts +3 -0
- package/labs/navigationdrawer/internal/navigation-drawer.js +8 -1
- package/labs/navigationdrawer/internal/navigation-drawer.js.map +1 -1
- package/labs/navigationtab/harness.js.map +1 -1
- package/labs/navigationtab/internal/navigation-tab.d.ts +6 -0
- package/labs/navigationtab/internal/navigation-tab.js +43 -27
- package/labs/navigationtab/internal/navigation-tab.js.map +1 -1
- package/labs/navigationtab/internal/state.js.map +1 -1
- package/labs/segmentedbutton/internal/_shared.scss +1 -0
- package/labs/segmentedbutton/internal/segmented-button.d.ts +3 -0
- package/labs/segmentedbutton/internal/segmented-button.js +26 -12
- package/labs/segmentedbutton/internal/segmented-button.js.map +1 -1
- package/labs/segmentedbutton/internal/shared-styles.css.js +1 -1
- package/labs/segmentedbutton/internal/shared-styles.css.js.map +1 -1
- package/labs/segmentedbuttonset/internal/segmented-button-set.d.ts +5 -0
- package/labs/segmentedbuttonset/internal/segmented-button-set.js +14 -9
- package/labs/segmentedbuttonset/internal/segmented-button-set.js.map +1 -1
- package/list/harness.d.ts +3 -2
- package/list/harness.js.map +1 -1
- package/list/internal/list-controller.d.ts +1 -1
- package/list/internal/list-controller.js +7 -3
- package/list/internal/list-controller.js.map +1 -1
- package/list/internal/list-navigation-helpers.js.map +1 -1
- package/list/internal/list.d.ts +2 -2
- package/list/internal/list.js +8 -6
- package/list/internal/list.js.map +1 -1
- package/list/internal/listitem/_list-item.scss +19 -0
- package/list/internal/listitem/harness.d.ts +3 -3
- package/list/internal/listitem/harness.js.map +1 -1
- package/list/internal/listitem/list-item-styles.css.js +1 -1
- package/list/internal/listitem/list-item-styles.css.js.map +1 -1
- package/list/internal/listitem/list-item.d.ts +3 -2
- package/list/internal/listitem/list-item.js +20 -21
- package/list/internal/listitem/list-item.js.map +1 -1
- package/list/list-item.d.ts +4 -12
- package/list/list-item.js +5 -14
- package/list/list-item.js.map +1 -1
- package/menu/harness.js.map +1 -1
- package/menu/internal/_menu.scss +20 -1
- package/menu/internal/controllers/menuItemController.d.ts +7 -0
- package/menu/internal/controllers/menuItemController.js +17 -4
- package/menu/internal/controllers/menuItemController.js.map +1 -1
- package/menu/internal/controllers/shared.d.ts +9 -1
- package/menu/internal/controllers/shared.js +4 -4
- package/menu/internal/controllers/shared.js.map +1 -1
- package/menu/internal/controllers/surfacePositionController.d.ts +16 -2
- package/menu/internal/controllers/surfacePositionController.js +134 -56
- package/menu/internal/controllers/surfacePositionController.js.map +1 -1
- package/menu/internal/controllers/typeaheadController.js +19 -14
- package/menu/internal/controllers/typeaheadController.js.map +1 -1
- package/menu/internal/menu-styles.css.js +1 -1
- package/menu/internal/menu-styles.css.js.map +1 -1
- package/menu/internal/menu.d.ts +55 -17
- package/menu/internal/menu.js +175 -88
- package/menu/internal/menu.js.map +1 -1
- package/menu/internal/menuitem/_menu-item.scss +24 -0
- package/menu/internal/menuitem/harness.d.ts +3 -1
- package/menu/internal/menuitem/harness.js.map +1 -1
- package/menu/internal/menuitem/menu-item-styles.css.js +1 -1
- package/menu/internal/menuitem/menu-item-styles.css.js.map +1 -1
- package/menu/internal/menuitem/menu-item.d.ts +3 -2
- package/menu/internal/menuitem/menu-item.js +20 -20
- package/menu/internal/menuitem/menu-item.js.map +1 -1
- package/menu/internal/submenu/sub-menu.d.ts +9 -8
- package/menu/internal/submenu/sub-menu.js +35 -22
- package/menu/internal/submenu/sub-menu.js.map +1 -1
- package/menu/internal/types.js.map +1 -1
- package/menu/menu-item.js +1 -2
- package/menu/menu-item.js.map +1 -1
- package/menu/menu.js +1 -2
- package/menu/menu.js.map +1 -1
- package/package.json +1 -1
- package/progress/internal/_circular-progress.scss +2 -2
- package/progress/internal/_linear-progress.scss +1 -1
- package/progress/internal/circular-progress-styles.css.js +1 -1
- package/progress/internal/circular-progress-styles.css.js.map +1 -1
- package/progress/internal/circular-progress.js +11 -10
- package/progress/internal/circular-progress.js.map +1 -1
- package/progress/internal/linear-progress-styles.css.js +1 -1
- package/progress/internal/linear-progress-styles.css.js.map +1 -1
- package/progress/internal/linear-progress.d.ts +1 -1
- package/progress/internal/linear-progress.js +3 -3
- package/progress/internal/linear-progress.js.map +1 -1
- package/progress/internal/progress.js +4 -2
- package/progress/internal/progress.js.map +1 -1
- package/radio/internal/_radio.scss +144 -123
- package/radio/internal/radio-styles.css.js +1 -1
- package/radio/internal/radio-styles.css.js.map +1 -1
- package/radio/internal/radio.d.ts +12 -23
- package/radio/internal/radio.js +31 -50
- package/radio/internal/radio.js.map +1 -1
- package/radio/internal/single-selection-controller.js +1 -1
- package/radio/internal/single-selection-controller.js.map +1 -1
- package/radio/radio.js +1 -2
- package/radio/radio.js.map +1 -1
- package/ripple/internal/ripple.js +21 -18
- package/ripple/internal/ripple.js.map +1 -1
- package/select/filled-select.js +1 -2
- package/select/filled-select.js.map +1 -1
- package/select/harness.js +1 -1
- package/select/harness.js.map +1 -1
- package/select/internal/_shared.scss +4 -0
- package/select/internal/select.d.ts +26 -99
- package/select/internal/select.js +78 -187
- package/select/internal/select.js.map +1 -1
- package/select/internal/selectoption/select-option.d.ts +8 -6
- package/select/internal/selectoption/select-option.js +25 -23
- package/select/internal/selectoption/select-option.js.map +1 -1
- package/select/internal/selectoption/selectOptionController.js +1 -1
- package/select/internal/selectoption/selectOptionController.js.map +1 -1
- package/select/internal/shared-styles.css.js +1 -1
- package/select/internal/shared-styles.css.js.map +1 -1
- package/select/outlined-select.js +1 -2
- package/select/outlined-select.js.map +1 -1
- package/select/select-option.js +1 -2
- package/select/select-option.js.map +1 -1
- package/slider/harness.js +5 -5
- package/slider/harness.js.map +1 -1
- package/slider/internal/_slider.scss +68 -30
- package/slider/internal/slider-styles.css.js +1 -1
- package/slider/internal/slider-styles.css.js.map +1 -1
- package/slider/internal/slider.d.ts +16 -25
- package/slider/internal/slider.js +111 -115
- package/slider/internal/slider.js.map +1 -1
- package/switch/internal/_handle.scss +159 -141
- package/switch/internal/_icon.scss +95 -72
- package/switch/internal/_switch.scss +90 -95
- package/switch/internal/_track.scss +110 -77
- package/switch/internal/switch-styles.css.js +1 -1
- package/switch/internal/switch-styles.css.js.map +1 -1
- package/switch/internal/switch.d.ts +13 -89
- package/switch/internal/switch.js +32 -159
- package/switch/internal/switch.js.map +1 -1
- package/switch/switch.js +1 -2
- package/switch/switch.js.map +1 -1
- package/tabs/harness.js +3 -3
- package/tabs/harness.js.map +1 -1
- package/tabs/internal/_tab.scss +27 -35
- package/tabs/internal/primary-tab.d.ts +0 -2
- package/tabs/internal/tab-styles.css.js +1 -1
- package/tabs/internal/tab-styles.css.js.map +1 -1
- package/tabs/internal/tab.d.ts +10 -5
- package/tabs/internal/tab.js +43 -22
- package/tabs/internal/tab.js.map +1 -1
- package/tabs/internal/tabs.d.ts +7 -4
- package/tabs/internal/tabs.js +23 -22
- package/tabs/internal/tabs.js.map +1 -1
- package/textfield/filled-text-field.js +1 -2
- package/textfield/filled-text-field.js.map +1 -1
- package/textfield/harness.js +3 -2
- package/textfield/harness.js.map +1 -1
- package/textfield/internal/text-field.d.ts +33 -18
- package/textfield/internal/text-field.js +96 -58
- package/textfield/internal/text-field.js.map +1 -1
- package/textfield/outlined-text-field.js +1 -2
- package/textfield/outlined-text-field.js.map +1 -1
- package/tokens/_index.scss +3 -0
- package/tokens/_md-comp-elevated-card.scss +63 -0
- package/tokens/_md-comp-filled-card.scss +63 -0
- package/tokens/_md-comp-icon.scss +2 -0
- package/tokens/_md-comp-outlined-card.scss +69 -0
- package/tokens/_md-comp-test-table.scss +1 -0
- package/internal/controller/element-internals.d.ts +0 -35
- package/internal/controller/element-internals.js +0 -24
- package/internal/controller/element-internals.js.map +0 -1
- package/list/internal/listitem/forced-colors-styles.css.js +0 -9
- package/list/internal/listitem/forced-colors-styles.css.js.map +0 -1
- package/list/internal/listitem/forced-colors-styles.scss +0 -19
- package/menu/internal/forced-colors-styles.css.js +0 -9
- package/menu/internal/forced-colors-styles.css.js.map +0 -1
- package/menu/internal/forced-colors-styles.scss +0 -12
- package/menu/internal/menuitem/forced-colors-styles.css.js +0 -9
- package/menu/internal/menuitem/forced-colors-styles.css.js.map +0 -1
- package/menu/internal/menuitem/forced-colors-styles.scss +0 -26
- package/radio/internal/forced-colors-styles.css.js +0 -9
- package/radio/internal/forced-colors-styles.css.js.map +0 -1
- package/radio/internal/forced-colors-styles.scss +0 -29
- package/select/internal/filled-forced-colors-styles.css.d.ts +0 -1
- package/select/internal/filled-forced-colors-styles.css.js +0 -9
- package/select/internal/filled-forced-colors-styles.css.js.map +0 -1
- package/select/internal/filled-forced-colors-styles.scss +0 -29
- package/select/internal/outlined-forced-colors-styles.css.d.ts +0 -1
- package/select/internal/outlined-forced-colors-styles.css.js +0 -9
- package/select/internal/outlined-forced-colors-styles.css.js.map +0 -1
- package/select/internal/outlined-forced-colors-styles.scss +0 -29
- package/switch/internal/forced-colors-styles.css.d.ts +0 -1
- package/switch/internal/forced-colors-styles.css.js +0 -9
- package/switch/internal/forced-colors-styles.css.js.map +0 -1
- package/switch/internal/forced-colors-styles.scss +0 -42
- package/textfield/internal/filled-forced-colors-styles.css.d.ts +0 -1
- package/textfield/internal/filled-forced-colors-styles.css.js +0 -9
- package/textfield/internal/filled-forced-colors-styles.css.js.map +0 -1
- package/textfield/internal/filled-forced-colors-styles.scss +0 -29
- package/textfield/internal/outlined-forced-colors-styles.css.d.ts +0 -1
- package/textfield/internal/outlined-forced-colors-styles.css.js +0 -9
- package/textfield/internal/outlined-forced-colors-styles.css.js.map +0 -1
- package/textfield/internal/outlined-forced-colors-styles.scss +0 -29
- /package/{list/internal/listitem/forced-colors-styles.css.d.ts → labs/card/internal/elevated-styles.css.d.ts} +0 -0
- /package/{menu/internal/forced-colors-styles.css.d.ts → labs/card/internal/filled-styles.css.d.ts} +0 -0
- /package/{menu/internal/menuitem/forced-colors-styles.css.d.ts → labs/card/internal/outlined-styles.css.d.ts} +0 -0
- /package/{radio/internal/forced-colors-styles.css.d.ts → labs/card/internal/shared-styles.css.d.ts} +0 -0
package/tabs/internal/_tab.scss
CHANGED
|
@@ -18,10 +18,20 @@
|
|
|
18
18
|
@mixin styles() {
|
|
19
19
|
:host {
|
|
20
20
|
display: inline-flex;
|
|
21
|
+
align-items: center;
|
|
22
|
+
justify-content: center;
|
|
21
23
|
outline: none;
|
|
24
|
+
padding: 0 16px;
|
|
25
|
+
position: relative;
|
|
22
26
|
-webkit-tap-highlight-color: transparent;
|
|
23
27
|
vertical-align: middle;
|
|
24
28
|
user-select: none;
|
|
29
|
+
font-family: var(--_label-text-font);
|
|
30
|
+
font-size: var(--_label-text-size);
|
|
31
|
+
line-height: var(--_label-text-line-height);
|
|
32
|
+
font-weight: var(--_label-text-weight);
|
|
33
|
+
color: var(--_label-text-color);
|
|
34
|
+
z-index: 0; // Ensure this is a stacking context so the indicator displays
|
|
25
35
|
|
|
26
36
|
@include ripple.theme(
|
|
27
37
|
(
|
|
@@ -45,24 +55,6 @@
|
|
|
45
55
|
margin-bottom: calc(var(--_active-indicator-height) + 1px);
|
|
46
56
|
}
|
|
47
57
|
|
|
48
|
-
.button {
|
|
49
|
-
box-sizing: border-box;
|
|
50
|
-
display: inline-flex;
|
|
51
|
-
align-items: center;
|
|
52
|
-
justify-content: center;
|
|
53
|
-
vertical-align: middle;
|
|
54
|
-
width: 100%;
|
|
55
|
-
position: relative;
|
|
56
|
-
padding: 0 16px;
|
|
57
|
-
margin: 0;
|
|
58
|
-
z-index: 0; // Ensure this is a stacking context so the indicator displays
|
|
59
|
-
font-family: var(--_label-text-font);
|
|
60
|
-
font-size: var(--_label-text-size);
|
|
61
|
-
line-height: var(--_label-text-line-height);
|
|
62
|
-
font-weight: var(--_label-text-weight);
|
|
63
|
-
color: var(--_label-text-color);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
58
|
.button::before {
|
|
67
59
|
background: var(--_container-color);
|
|
68
60
|
content: '';
|
|
@@ -72,7 +64,8 @@
|
|
|
72
64
|
}
|
|
73
65
|
|
|
74
66
|
.button::before,
|
|
75
|
-
md-ripple
|
|
67
|
+
md-ripple,
|
|
68
|
+
md-elevation {
|
|
76
69
|
border-start-start-radius: var(--_container-shape-start-start);
|
|
77
70
|
border-start-end-radius: var(--_container-shape-start-end);
|
|
78
71
|
border-end-end-radius: var(--_container-shape-end-end);
|
|
@@ -104,7 +97,7 @@
|
|
|
104
97
|
}
|
|
105
98
|
|
|
106
99
|
// unselected states
|
|
107
|
-
|
|
100
|
+
::slotted([slot='icon']) {
|
|
108
101
|
display: inline-flex;
|
|
109
102
|
position: relative;
|
|
110
103
|
writing-mode: horizontal-tb;
|
|
@@ -115,29 +108,28 @@
|
|
|
115
108
|
height: var(--_icon-size);
|
|
116
109
|
}
|
|
117
110
|
|
|
118
|
-
|
|
111
|
+
:host(:hover) {
|
|
119
112
|
color: var(--_hover-label-text-color);
|
|
120
113
|
cursor: pointer;
|
|
121
114
|
}
|
|
122
115
|
|
|
123
|
-
|
|
116
|
+
:host(:hover) ::slotted([slot='icon']) {
|
|
124
117
|
color: var(--_hover-icon-color);
|
|
125
118
|
}
|
|
126
119
|
|
|
127
|
-
|
|
120
|
+
:host(:focus) {
|
|
128
121
|
color: var(--_focus-label-text-color);
|
|
129
122
|
}
|
|
130
123
|
|
|
131
|
-
|
|
124
|
+
:host(:focus) ::slotted([slot='icon']) {
|
|
132
125
|
color: var(--_focus-icon-color);
|
|
133
126
|
}
|
|
134
127
|
|
|
135
|
-
|
|
128
|
+
:host(:active) {
|
|
136
129
|
color: var(--_pressed-label-text-color);
|
|
137
|
-
outline: none;
|
|
138
130
|
}
|
|
139
131
|
|
|
140
|
-
|
|
132
|
+
:host(:active) ::slotted([slot='icon']) {
|
|
141
133
|
color: var(--_pressed-icon-color);
|
|
142
134
|
}
|
|
143
135
|
|
|
@@ -145,7 +137,7 @@
|
|
|
145
137
|
:host([active]) .indicator {
|
|
146
138
|
opacity: 1;
|
|
147
139
|
}
|
|
148
|
-
:host([active])
|
|
140
|
+
:host([active]) {
|
|
149
141
|
color: var(--_active-label-text-color);
|
|
150
142
|
@include elevation.theme(
|
|
151
143
|
(
|
|
@@ -163,32 +155,32 @@
|
|
|
163
155
|
);
|
|
164
156
|
}
|
|
165
157
|
|
|
166
|
-
:host([active])
|
|
158
|
+
:host([active]) ::slotted([slot='icon']) {
|
|
167
159
|
color: var(--_active-icon-color);
|
|
168
160
|
}
|
|
169
161
|
|
|
170
162
|
// selected states
|
|
171
|
-
:host([active]
|
|
163
|
+
:host([active]:hover) {
|
|
172
164
|
color: var(--_active-hover-label-text-color);
|
|
173
165
|
}
|
|
174
166
|
|
|
175
|
-
:host([active]
|
|
167
|
+
:host([active]:hover) ::slotted([slot='icon']) {
|
|
176
168
|
color: var(--_active-hover-icon-color);
|
|
177
169
|
}
|
|
178
170
|
|
|
179
|
-
:host([active]
|
|
171
|
+
:host([active]:focus) {
|
|
180
172
|
color: var(--_active-focus-label-text-color);
|
|
181
173
|
}
|
|
182
174
|
|
|
183
|
-
:host([active]
|
|
175
|
+
:host([active]:focus) ::slotted([slot='icon']) {
|
|
184
176
|
color: var(--_active-focus-icon-color);
|
|
185
177
|
}
|
|
186
178
|
|
|
187
|
-
:host([active]
|
|
179
|
+
:host([active]:active) {
|
|
188
180
|
color: var(--_active-pressed-label-text-color);
|
|
189
181
|
}
|
|
190
182
|
|
|
191
|
-
:host([active]
|
|
183
|
+
:host([active]:active) ::slotted([slot='icon']) {
|
|
192
184
|
color: var(--_active-pressed-icon-color);
|
|
193
185
|
}
|
|
194
186
|
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { css } from 'lit';
|
|
7
|
-
export const styles = css `:host{display:inline-flex;outline:none;-webkit-tap-highlight-color:rgba(0,0,0,0);vertical-align:middle;user-select:none;--md-ripple-hover-color: var(--_hover-state-layer-color);--md-ripple-hover-opacity: var(--_hover-state-layer-opacity);--md-ripple-pressed-color: var(--_pressed-state-layer-color);--md-ripple-pressed-opacity: var(--_pressed-state-layer-opacity)}md-focus-ring{--md-focus-ring-shape: 8px}:host([active]) md-focus-ring{margin-bottom:calc(var(--_active-indicator-height) + 1px)}.button
|
|
7
|
+
export const styles = css `:host{display:inline-flex;align-items:center;justify-content:center;outline:none;padding:0 16px;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0);vertical-align:middle;user-select:none;font-family:var(--_label-text-font);font-size:var(--_label-text-size);line-height:var(--_label-text-line-height);font-weight:var(--_label-text-weight);color:var(--_label-text-color);z-index:0;--md-ripple-hover-color: var(--_hover-state-layer-color);--md-ripple-hover-opacity: var(--_hover-state-layer-opacity);--md-ripple-pressed-color: var(--_pressed-state-layer-color);--md-ripple-pressed-opacity: var(--_pressed-state-layer-opacity)}md-focus-ring{--md-focus-ring-shape: 8px}:host([active]) md-focus-ring{margin-bottom:calc(var(--_active-indicator-height) + 1px)}.button::before{background:var(--_container-color);content:"";inset:0;position:absolute;z-index:-1}.button::before,md-ripple,md-elevation{border-start-start-radius:var(--_container-shape-start-start);border-start-end-radius:var(--_container-shape-start-end);border-end-end-radius:var(--_container-shape-end-end);border-end-start-radius:var(--_container-shape-end-start)}.content{position:relative;box-sizing:border-box;display:inline-flex;flex-direction:row;align-items:center;justify-content:center;height:var(--_container-height);gap:8px}.indicator{position:absolute;box-sizing:border-box;z-index:-1;transform-origin:bottom left;background:var(--_active-indicator-color);border-radius:var(--_active-indicator-shape);height:var(--_active-indicator-height);inset:auto 0 0 0;opacity:0}::slotted([slot=icon]){display:inline-flex;position:relative;writing-mode:horizontal-tb;fill:currentColor;color:var(--_icon-color);font-size:var(--_icon-size);width:var(--_icon-size);height:var(--_icon-size)}:host(:hover){color:var(--_hover-label-text-color);cursor:pointer}:host(:hover) ::slotted([slot=icon]){color:var(--_hover-icon-color)}:host(:focus){color:var(--_focus-label-text-color)}:host(:focus) ::slotted([slot=icon]){color:var(--_focus-icon-color)}:host(:active){color:var(--_pressed-label-text-color)}:host(:active) ::slotted([slot=icon]){color:var(--_pressed-icon-color)}:host([active]) .indicator{opacity:1}:host([active]){color:var(--_active-label-text-color);--md-elevation-level: var(--_container-elevation);--md-ripple-hover-color: var(--_active-hover-state-layer-color);--md-ripple-hover-opacity: var(--_active-hover-state-layer-opacity);--md-ripple-pressed-color: var(--_active-pressed-state-layer-color);--md-ripple-pressed-opacity: var(--_active-pressed-state-layer-opacity)}:host([active]) ::slotted([slot=icon]){color:var(--_active-icon-color)}:host([active]:hover){color:var(--_active-hover-label-text-color)}:host([active]:hover) ::slotted([slot=icon]){color:var(--_active-hover-icon-color)}:host([active]:focus){color:var(--_active-focus-label-text-color)}:host([active]:focus) ::slotted([slot=icon]){color:var(--_active-focus-icon-color)}:host([active]:active){color:var(--_active-pressed-label-text-color)}:host([active]:active) ::slotted([slot=icon]){color:var(--_active-pressed-icon-color)}:host,::slotted(*){white-space:nowrap}@media(forced-colors: active){.indicator{background:CanvasText}}/*# sourceMappingURL=tab-styles.css.map */
|
|
8
8
|
`;
|
|
9
9
|
//# sourceMappingURL=tab-styles.css.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-styles.css.js","sourceRoot":"","sources":["tab-styles.css.ts"],"names":[],"mappings":"AAAA;;;;IAII;AACH,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAC;AACxB,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;CACzB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2022 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n import {css} from 'lit';\n export const styles = css`:host{display:inline-flex;outline:none;-webkit-tap-highlight-color:rgba(0,0,0,0);vertical-align:middle;user-select:none;--md-ripple-hover-color: var(--_hover-state-layer-color);--md-ripple-hover-opacity: var(--_hover-state-layer-opacity);--md-ripple-pressed-color: var(--_pressed-state-layer-color);--md-ripple-pressed-opacity: var(--_pressed-state-layer-opacity)}md-focus-ring{--md-focus-ring-shape: 8px}:host([active]) md-focus-ring{margin-bottom:calc(var(--_active-indicator-height) + 1px)}.button
|
|
1
|
+
{"version":3,"file":"tab-styles.css.js","sourceRoot":"","sources":["tab-styles.css.ts"],"names":[],"mappings":"AAAA;;;;IAII;AACH,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAC;AACxB,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;CACzB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2022 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n import {css} from 'lit';\n export const styles = css`:host{display:inline-flex;align-items:center;justify-content:center;outline:none;padding:0 16px;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0);vertical-align:middle;user-select:none;font-family:var(--_label-text-font);font-size:var(--_label-text-size);line-height:var(--_label-text-line-height);font-weight:var(--_label-text-weight);color:var(--_label-text-color);z-index:0;--md-ripple-hover-color: var(--_hover-state-layer-color);--md-ripple-hover-opacity: var(--_hover-state-layer-opacity);--md-ripple-pressed-color: var(--_pressed-state-layer-color);--md-ripple-pressed-opacity: var(--_pressed-state-layer-opacity)}md-focus-ring{--md-focus-ring-shape: 8px}:host([active]) md-focus-ring{margin-bottom:calc(var(--_active-indicator-height) + 1px)}.button::before{background:var(--_container-color);content:\"\";inset:0;position:absolute;z-index:-1}.button::before,md-ripple,md-elevation{border-start-start-radius:var(--_container-shape-start-start);border-start-end-radius:var(--_container-shape-start-end);border-end-end-radius:var(--_container-shape-end-end);border-end-start-radius:var(--_container-shape-end-start)}.content{position:relative;box-sizing:border-box;display:inline-flex;flex-direction:row;align-items:center;justify-content:center;height:var(--_container-height);gap:8px}.indicator{position:absolute;box-sizing:border-box;z-index:-1;transform-origin:bottom left;background:var(--_active-indicator-color);border-radius:var(--_active-indicator-shape);height:var(--_active-indicator-height);inset:auto 0 0 0;opacity:0}::slotted([slot=icon]){display:inline-flex;position:relative;writing-mode:horizontal-tb;fill:currentColor;color:var(--_icon-color);font-size:var(--_icon-size);width:var(--_icon-size);height:var(--_icon-size)}:host(:hover){color:var(--_hover-label-text-color);cursor:pointer}:host(:hover) ::slotted([slot=icon]){color:var(--_hover-icon-color)}:host(:focus){color:var(--_focus-label-text-color)}:host(:focus) ::slotted([slot=icon]){color:var(--_focus-icon-color)}:host(:active){color:var(--_pressed-label-text-color)}:host(:active) ::slotted([slot=icon]){color:var(--_pressed-icon-color)}:host([active]) .indicator{opacity:1}:host([active]){color:var(--_active-label-text-color);--md-elevation-level: var(--_container-elevation);--md-ripple-hover-color: var(--_active-hover-state-layer-color);--md-ripple-hover-opacity: var(--_active-hover-state-layer-opacity);--md-ripple-pressed-color: var(--_active-pressed-state-layer-color);--md-ripple-pressed-opacity: var(--_active-pressed-state-layer-opacity)}:host([active]) ::slotted([slot=icon]){color:var(--_active-icon-color)}:host([active]:hover){color:var(--_active-hover-label-text-color)}:host([active]:hover) ::slotted([slot=icon]){color:var(--_active-hover-icon-color)}:host([active]:focus){color:var(--_active-focus-label-text-color)}:host([active]:focus) ::slotted([slot=icon]){color:var(--_active-focus-icon-color)}:host([active]:active){color:var(--_active-pressed-label-text-color)}:host([active]:active) ::slotted([slot=icon]){color:var(--_active-pressed-icon-color)}:host,::slotted(*){white-space:nowrap}@media(forced-colors: active){.indicator{background:CanvasText}}/*# sourceMappingURL=tab-styles.css.map */\n`;\n "]}
|
package/tabs/internal/tab.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import '../../elevation/elevation.js';
|
|
|
7
7
|
import '../../focus/md-focus-ring.js';
|
|
8
8
|
import '../../ripple/ripple.js';
|
|
9
9
|
import { LitElement } from 'lit';
|
|
10
|
+
import { ClassInfo } from 'lit/directives/class-map.js';
|
|
10
11
|
/**
|
|
11
12
|
* Symbol for tabs to use to animate their indicators based off another tab's
|
|
12
13
|
* indicator.
|
|
@@ -17,10 +18,17 @@ declare const INDICATOR: unique symbol;
|
|
|
17
18
|
* previously selected tab.
|
|
18
19
|
*/
|
|
19
20
|
export declare const ANIMATE_INDICATOR: unique symbol;
|
|
21
|
+
declare const tabBaseClass: import("../../labs/behaviors/mixin.js").MixinReturn<typeof LitElement, import("../../labs/behaviors/focusable.js").Focusable>;
|
|
20
22
|
/**
|
|
21
23
|
* Tab component.
|
|
22
24
|
*/
|
|
23
|
-
export declare class Tab extends
|
|
25
|
+
export declare class Tab extends tabBaseClass {
|
|
26
|
+
/**
|
|
27
|
+
* The attribute `md-tab` indicates that the element is a tab for the parent
|
|
28
|
+
* element, `<md-tabs>`. Make sure if you're implementing your own `md-tab`
|
|
29
|
+
* component that you have an `md-tab` attribute set.
|
|
30
|
+
*/
|
|
31
|
+
readonly isTab = true;
|
|
24
32
|
/**
|
|
25
33
|
* Whether or not the tab is selected.
|
|
26
34
|
**/
|
|
@@ -46,10 +54,7 @@ export declare class Tab extends LitElement {
|
|
|
46
54
|
private readonly internals;
|
|
47
55
|
constructor();
|
|
48
56
|
protected render(): import("lit-html").TemplateResult<1>;
|
|
49
|
-
protected getContentClasses():
|
|
50
|
-
'has-icon': boolean;
|
|
51
|
-
'has-label': boolean;
|
|
52
|
-
};
|
|
57
|
+
protected getContentClasses(): ClassInfo;
|
|
53
58
|
protected updated(): void;
|
|
54
59
|
private handleKeydown;
|
|
55
60
|
private handleContentClick;
|
package/tabs/internal/tab.js
CHANGED
|
@@ -9,10 +9,11 @@ import '../../elevation/elevation.js';
|
|
|
9
9
|
import '../../focus/md-focus-ring.js';
|
|
10
10
|
import '../../ripple/ripple.js';
|
|
11
11
|
import { html, isServer, LitElement, nothing } from 'lit';
|
|
12
|
-
import { property, query, queryAssignedElements, queryAssignedNodes, state } from 'lit/decorators.js';
|
|
12
|
+
import { property, query, queryAssignedElements, queryAssignedNodes, state, } from 'lit/decorators.js';
|
|
13
13
|
import { classMap } from 'lit/directives/class-map.js';
|
|
14
|
-
import { polyfillElementInternalsAria,
|
|
14
|
+
import { polyfillARIAMixin, polyfillElementInternalsAria, } from '../../internal/aria/aria.js';
|
|
15
15
|
import { EASING } from '../../internal/motion/animation.js';
|
|
16
|
+
import { mixinFocusable } from '../../labs/behaviors/focusable.js';
|
|
16
17
|
/**
|
|
17
18
|
* Symbol for tabs to use to animate their indicators based off another tab's
|
|
18
19
|
* indicator.
|
|
@@ -23,10 +24,12 @@ const INDICATOR = Symbol('indicator');
|
|
|
23
24
|
* previously selected tab.
|
|
24
25
|
*/
|
|
25
26
|
export const ANIMATE_INDICATOR = Symbol('animateIndicator');
|
|
27
|
+
// Separate variable needed for closure.
|
|
28
|
+
const tabBaseClass = mixinFocusable(LitElement);
|
|
26
29
|
/**
|
|
27
30
|
* Tab component.
|
|
28
31
|
*/
|
|
29
|
-
export class Tab extends
|
|
32
|
+
export class Tab extends tabBaseClass {
|
|
30
33
|
/**
|
|
31
34
|
* TODO(b/293476210): remove after migrating
|
|
32
35
|
* @deprecated use `active`
|
|
@@ -39,6 +42,12 @@ export class Tab extends LitElement {
|
|
|
39
42
|
}
|
|
40
43
|
constructor() {
|
|
41
44
|
super();
|
|
45
|
+
/**
|
|
46
|
+
* The attribute `md-tab` indicates that the element is a tab for the parent
|
|
47
|
+
* element, `<md-tabs>`. Make sure if you're implementing your own `md-tab`
|
|
48
|
+
* component that you have an `md-tab` attribute set.
|
|
49
|
+
*/
|
|
50
|
+
this.isTab = true;
|
|
42
51
|
/**
|
|
43
52
|
* Whether or not the tab is selected.
|
|
44
53
|
**/
|
|
@@ -52,7 +61,9 @@ export class Tab extends LitElement {
|
|
|
52
61
|
*/
|
|
53
62
|
this.iconOnly = false;
|
|
54
63
|
this.fullWidthIndicator = false;
|
|
55
|
-
this.internals = polyfillElementInternalsAria(this,
|
|
64
|
+
this.internals = polyfillElementInternalsAria(this,
|
|
65
|
+
// Cast needed for closure
|
|
66
|
+
this.attachInternals());
|
|
56
67
|
if (!isServer) {
|
|
57
68
|
this.internals.role = 'tab';
|
|
58
69
|
this.addEventListener('keydown', this.handleKeydown.bind(this));
|
|
@@ -60,20 +71,22 @@ export class Tab extends LitElement {
|
|
|
60
71
|
}
|
|
61
72
|
render() {
|
|
62
73
|
const indicator = html `<div class="indicator"></div>`;
|
|
63
|
-
return html
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
${this.fullWidthIndicator ?
|
|
76
|
-
</div
|
|
74
|
+
return html `<div
|
|
75
|
+
class="button"
|
|
76
|
+
role="presentation"
|
|
77
|
+
@click=${this.handleContentClick}>
|
|
78
|
+
<md-focus-ring part="focus-ring" inward .control=${this}></md-focus-ring>
|
|
79
|
+
<md-elevation></md-elevation>
|
|
80
|
+
<md-ripple .control=${this}></md-ripple>
|
|
81
|
+
<div
|
|
82
|
+
class="content ${classMap(this.getContentClasses())}"
|
|
83
|
+
role="presentation">
|
|
84
|
+
<slot name="icon" @slotchange=${this.handleIconSlotChange}></slot>
|
|
85
|
+
<slot @slotchange=${this.handleSlotChange}></slot>
|
|
86
|
+
${this.fullWidthIndicator ? nothing : indicator}
|
|
87
|
+
</div>
|
|
88
|
+
${this.fullWidthIndicator ? indicator : nothing}
|
|
89
|
+
</div>`;
|
|
77
90
|
}
|
|
78
91
|
getContentClasses() {
|
|
79
92
|
return {
|
|
@@ -106,12 +119,15 @@ export class Tab extends LitElement {
|
|
|
106
119
|
if (!this[INDICATOR]) {
|
|
107
120
|
return;
|
|
108
121
|
}
|
|
109
|
-
this[INDICATOR].getAnimations().forEach(a => {
|
|
122
|
+
this[INDICATOR].getAnimations().forEach((a) => {
|
|
110
123
|
a.cancel();
|
|
111
124
|
});
|
|
112
125
|
const frames = this.getKeyframes(previousTab);
|
|
113
126
|
if (frames !== null) {
|
|
114
|
-
this[INDICATOR].animate(frames, {
|
|
127
|
+
this[INDICATOR].animate(frames, {
|
|
128
|
+
duration: 250,
|
|
129
|
+
easing: EASING.EMPHASIZED,
|
|
130
|
+
});
|
|
115
131
|
}
|
|
116
132
|
}
|
|
117
133
|
getKeyframes(previousTab) {
|
|
@@ -127,7 +143,9 @@ export class Tab extends LitElement {
|
|
|
127
143
|
const toPos = toRect.left;
|
|
128
144
|
const toExtent = toRect.width;
|
|
129
145
|
const scale = fromExtent / toExtent;
|
|
130
|
-
if (!reduceMotion &&
|
|
146
|
+
if (!reduceMotion &&
|
|
147
|
+
fromPos !== undefined &&
|
|
148
|
+
toPos !== undefined &&
|
|
131
149
|
!isNaN(scale)) {
|
|
132
150
|
from['transform'] = `translateX(${(fromPos - toPos).toFixed(4)}px) scaleX(${scale.toFixed(4)})`;
|
|
133
151
|
}
|
|
@@ -156,8 +174,11 @@ export class Tab extends LitElement {
|
|
|
156
174
|
}
|
|
157
175
|
}
|
|
158
176
|
(() => {
|
|
159
|
-
|
|
177
|
+
polyfillARIAMixin(Tab);
|
|
160
178
|
})();
|
|
179
|
+
__decorate([
|
|
180
|
+
property({ type: Boolean, reflect: true, attribute: 'md-tab' })
|
|
181
|
+
], Tab.prototype, "isTab", void 0);
|
|
161
182
|
__decorate([
|
|
162
183
|
property({ type: Boolean, reflect: true })
|
|
163
184
|
], Tab.prototype, "active", void 0);
|
package/tabs/internal/tab.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab.js","sourceRoot":"","sources":["tab.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../elevation/elevation.js';\nimport '../../focus/md-focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, isServer, LitElement, nothing} from 'lit';\nimport {property, query, queryAssignedElements, queryAssignedNodes, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\n\nimport {polyfillElementInternalsAria, setupHostAria} from '../../internal/aria/aria.js';\nimport {EASING} from '../../internal/motion/animation.js';\n\n/**\n * Symbol for tabs to use to animate their indicators based off another tab's\n * indicator.\n */\nconst INDICATOR = Symbol('indicator');\n\n/**\n * Symbol used by the tab bar to request a tab to animate its indicator from a\n * previously selected tab.\n */\nexport const ANIMATE_INDICATOR = Symbol('animateIndicator');\n\n/**\n * Tab component.\n */\nexport class Tab extends LitElement {\n static {\n setupHostAria(Tab);\n }\n\n /**\n * Whether or not the tab is selected.\n **/\n @property({type: Boolean, reflect: true}) active = false;\n\n /**\n * TODO(b/293476210): remove after migrating\n * @deprecated use `active`\n */\n @property({type: Boolean})\n get selected() {\n return this.active;\n }\n set selected(active: boolean) {\n this.active = active;\n }\n\n /**\n * In SSR, set this to true when an icon is present.\n */\n @property({type: Boolean, attribute: 'has-icon'}) hasIcon = false;\n\n /**\n * In SSR, set this to true when there is no label and only an icon.\n */\n @property({type: Boolean, attribute: 'icon-only'}) iconOnly = false;\n\n @query('.indicator') readonly[INDICATOR]!: HTMLElement|null;\n @state() protected fullWidthIndicator = false;\n @queryAssignedNodes({flatten: true})\n private readonly assignedDefaultNodes!: Node[];\n @queryAssignedElements({slot: 'icon', flatten: true})\n private readonly assignedIcons!: HTMLElement[];\n private readonly internals = polyfillElementInternalsAria(\n this, (this as HTMLElement /* needed for closure */).attachInternals());\n\n constructor() {\n super();\n if (!isServer) {\n this.internals.role = 'tab';\n this.addEventListener('keydown', this.handleKeydown.bind(this));\n }\n }\n\n protected override render() {\n const indicator = html`<div class=\"indicator\"></div>`;\n return html`\n <div class=\"button\" role=\"presentation\" @click=${this.handleContentClick}>\n <md-focus-ring part=\"focus-ring\" inward\n .control=${this}></md-focus-ring>\n <md-elevation></md-elevation>\n <md-ripple .control=${this}></md-ripple>\n <div class=\"content ${classMap(this.getContentClasses())}\"\n role=\"presentation\">\n <slot name=\"icon\" @slotchange=${this.handleIconSlotChange}></slot>\n <slot @slotchange=${this.handleSlotChange}></slot>\n ${this.fullWidthIndicator ? nothing : indicator}\n </div>\n ${this.fullWidthIndicator ? indicator : nothing}\n </div>`;\n }\n\n protected getContentClasses() {\n return {\n 'has-icon': this.hasIcon,\n 'has-label': !this.iconOnly,\n };\n }\n\n protected override updated() {\n this.internals.ariaSelected = String(this.active);\n }\n\n private async handleKeydown(event: KeyboardEvent) {\n // Allow event to bubble.\n await 0;\n if (event.defaultPrevented) {\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n // Prevent default behavior such as scrolling when pressing spacebar.\n event.preventDefault();\n this.click();\n }\n }\n\n private handleContentClick(event: Event) {\n // Ensure the \"click\" target is always the tab, and not content, by stopping\n // propagation of content clicks and re-clicking the host.\n event.stopPropagation();\n this.click();\n }\n\n [ANIMATE_INDICATOR](previousTab: Tab) {\n if (!this[INDICATOR]) {\n return;\n }\n\n this[INDICATOR].getAnimations().forEach(a => {\n a.cancel();\n });\n const frames = this.getKeyframes(previousTab);\n if (frames !== null) {\n this[INDICATOR].animate(\n frames, {duration: 250, easing: EASING.EMPHASIZED});\n }\n }\n\n private getKeyframes(previousTab: Tab) {\n const reduceMotion = shouldReduceMotion();\n if (!this.active) {\n return reduceMotion ? [{'opacity': 1}, {'transform': 'none'}] : null;\n }\n\n const from: Keyframe = {};\n const fromRect =\n previousTab[INDICATOR]?.getBoundingClientRect() ?? ({} as DOMRect);\n const fromPos = fromRect.left;\n const fromExtent = fromRect.width;\n const toRect = this[INDICATOR]!.getBoundingClientRect();\n const toPos = toRect.left;\n const toExtent = toRect.width;\n const scale = fromExtent / toExtent;\n if (!reduceMotion && fromPos !== undefined && toPos !== undefined &&\n !isNaN(scale)) {\n from['transform'] = `translateX(${\n (fromPos - toPos).toFixed(4)}px) scaleX(${scale.toFixed(4)})`;\n } else {\n from['opacity'] = 0;\n }\n // note, including `transform: none` avoids quirky Safari behavior\n // that can hide the animation.\n return [from, {'transform': 'none'}];\n }\n\n private handleSlotChange() {\n this.iconOnly = false;\n // Check if there's any label text or elements. If not, then there is only\n // an icon.\n for (const node of this.assignedDefaultNodes) {\n const hasTextContent = node.nodeType === Node.TEXT_NODE &&\n !!(node as Text).wholeText.match(/\\S/);\n if (node.nodeType === Node.ELEMENT_NODE || hasTextContent) {\n return;\n }\n }\n\n this.iconOnly = true;\n }\n\n private handleIconSlotChange() {\n this.hasIcon = this.assignedIcons.length > 0;\n }\n}\n\nfunction shouldReduceMotion() {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tab.js","sourceRoot":"","sources":["tab.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../elevation/elevation.js';\nimport '../../focus/md-focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, isServer, LitElement, nothing} from 'lit';\nimport {\n property,\n query,\n queryAssignedElements,\n queryAssignedNodes,\n state,\n} from 'lit/decorators.js';\nimport {ClassInfo, classMap} from 'lit/directives/class-map.js';\n\nimport {\n polyfillARIAMixin,\n polyfillElementInternalsAria,\n} from '../../internal/aria/aria.js';\nimport {EASING} from '../../internal/motion/animation.js';\nimport {mixinFocusable} from '../../labs/behaviors/focusable.js';\n\n/**\n * Symbol for tabs to use to animate their indicators based off another tab's\n * indicator.\n */\nconst INDICATOR = Symbol('indicator');\n\n/**\n * Symbol used by the tab bar to request a tab to animate its indicator from a\n * previously selected tab.\n */\nexport const ANIMATE_INDICATOR = Symbol('animateIndicator');\n\n// Separate variable needed for closure.\nconst tabBaseClass = mixinFocusable(LitElement);\n\n/**\n * Tab component.\n */\nexport class Tab extends tabBaseClass {\n static {\n polyfillARIAMixin(Tab);\n }\n\n /**\n * The attribute `md-tab` indicates that the element is a tab for the parent\n * element, `<md-tabs>`. Make sure if you're implementing your own `md-tab`\n * component that you have an `md-tab` attribute set.\n */\n @property({type: Boolean, reflect: true, attribute: 'md-tab'})\n readonly isTab = true;\n\n /**\n * Whether or not the tab is selected.\n **/\n @property({type: Boolean, reflect: true}) active = false;\n\n /**\n * TODO(b/293476210): remove after migrating\n * @deprecated use `active`\n */\n @property({type: Boolean})\n get selected() {\n return this.active;\n }\n set selected(active: boolean) {\n this.active = active;\n }\n\n /**\n * In SSR, set this to true when an icon is present.\n */\n @property({type: Boolean, attribute: 'has-icon'}) hasIcon = false;\n\n /**\n * In SSR, set this to true when there is no label and only an icon.\n */\n @property({type: Boolean, attribute: 'icon-only'}) iconOnly = false;\n\n @query('.indicator') readonly [INDICATOR]!: HTMLElement | null;\n @state() protected fullWidthIndicator = false;\n @queryAssignedNodes({flatten: true})\n private readonly assignedDefaultNodes!: Node[];\n @queryAssignedElements({slot: 'icon', flatten: true})\n private readonly assignedIcons!: HTMLElement[];\n private readonly internals = polyfillElementInternalsAria(\n this,\n // Cast needed for closure\n (this as HTMLElement).attachInternals(),\n );\n\n constructor() {\n super();\n if (!isServer) {\n this.internals.role = 'tab';\n this.addEventListener('keydown', this.handleKeydown.bind(this));\n }\n }\n\n protected override render() {\n const indicator = html`<div class=\"indicator\"></div>`;\n return html`<div\n class=\"button\"\n role=\"presentation\"\n @click=${this.handleContentClick}>\n <md-focus-ring part=\"focus-ring\" inward .control=${this}></md-focus-ring>\n <md-elevation></md-elevation>\n <md-ripple .control=${this}></md-ripple>\n <div\n class=\"content ${classMap(this.getContentClasses())}\"\n role=\"presentation\">\n <slot name=\"icon\" @slotchange=${this.handleIconSlotChange}></slot>\n <slot @slotchange=${this.handleSlotChange}></slot>\n ${this.fullWidthIndicator ? nothing : indicator}\n </div>\n ${this.fullWidthIndicator ? indicator : nothing}\n </div>`;\n }\n\n protected getContentClasses(): ClassInfo {\n return {\n 'has-icon': this.hasIcon,\n 'has-label': !this.iconOnly,\n };\n }\n\n protected override updated() {\n this.internals.ariaSelected = String(this.active);\n }\n\n private async handleKeydown(event: KeyboardEvent) {\n // Allow event to bubble.\n await 0;\n if (event.defaultPrevented) {\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n // Prevent default behavior such as scrolling when pressing spacebar.\n event.preventDefault();\n this.click();\n }\n }\n\n private handleContentClick(event: Event) {\n // Ensure the \"click\" target is always the tab, and not content, by stopping\n // propagation of content clicks and re-clicking the host.\n event.stopPropagation();\n this.click();\n }\n\n [ANIMATE_INDICATOR](previousTab: Tab) {\n if (!this[INDICATOR]) {\n return;\n }\n\n this[INDICATOR].getAnimations().forEach((a) => {\n a.cancel();\n });\n const frames = this.getKeyframes(previousTab);\n if (frames !== null) {\n this[INDICATOR].animate(frames, {\n duration: 250,\n easing: EASING.EMPHASIZED,\n });\n }\n }\n\n private getKeyframes(previousTab: Tab) {\n const reduceMotion = shouldReduceMotion();\n if (!this.active) {\n return reduceMotion ? [{'opacity': 1}, {'transform': 'none'}] : null;\n }\n\n const from: Keyframe = {};\n const fromRect =\n previousTab[INDICATOR]?.getBoundingClientRect() ?? ({} as DOMRect);\n const fromPos = fromRect.left;\n const fromExtent = fromRect.width;\n const toRect = this[INDICATOR]!.getBoundingClientRect();\n const toPos = toRect.left;\n const toExtent = toRect.width;\n const scale = fromExtent / toExtent;\n if (\n !reduceMotion &&\n fromPos !== undefined &&\n toPos !== undefined &&\n !isNaN(scale)\n ) {\n from['transform'] = `translateX(${(fromPos - toPos).toFixed(\n 4,\n )}px) scaleX(${scale.toFixed(4)})`;\n } else {\n from['opacity'] = 0;\n }\n // note, including `transform: none` avoids quirky Safari behavior\n // that can hide the animation.\n return [from, {'transform': 'none'}];\n }\n\n private handleSlotChange() {\n this.iconOnly = false;\n // Check if there's any label text or elements. If not, then there is only\n // an icon.\n for (const node of this.assignedDefaultNodes) {\n const hasTextContent =\n node.nodeType === Node.TEXT_NODE &&\n !!(node as Text).wholeText.match(/\\S/);\n if (node.nodeType === Node.ELEMENT_NODE || hasTextContent) {\n return;\n }\n }\n\n this.iconOnly = true;\n }\n\n private handleIconSlotChange() {\n this.hasIcon = this.assignedIcons.length > 0;\n }\n}\n\nfunction shouldReduceMotion() {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n"]}
|
package/tabs/internal/tabs.d.ts
CHANGED
|
@@ -7,12 +7,12 @@ import '../../divider/divider.js';
|
|
|
7
7
|
import { LitElement } from 'lit';
|
|
8
8
|
import { Tab } from './tab.js';
|
|
9
9
|
/**
|
|
10
|
-
* @fires change Fired when the selected tab changes. The target's selected or
|
|
10
|
+
* @fires change {Event} Fired when the selected tab changes. The target's selected or
|
|
11
11
|
* selectedItem and previousSelected or previousSelectedItem provide information
|
|
12
12
|
* about the selection change. The change event is fired when a user interaction
|
|
13
13
|
* like a space/enter key or click cause a selection change. The tab selection
|
|
14
14
|
* based on these actions can be cancelled by calling preventDefault on the
|
|
15
|
-
* triggering `keydown` or `click` event.
|
|
15
|
+
* triggering `keydown` or `click` event. --bubbles
|
|
16
16
|
*
|
|
17
17
|
* @example
|
|
18
18
|
* // perform an action if a tab is clicked
|
|
@@ -34,14 +34,18 @@ export declare class Tabs extends LitElement {
|
|
|
34
34
|
/**
|
|
35
35
|
* The tabs of this tab bar.
|
|
36
36
|
*/
|
|
37
|
-
|
|
37
|
+
readonly tabs: Tab[];
|
|
38
38
|
/**
|
|
39
39
|
* The currently selected tab, `null` only when there are no tab children.
|
|
40
|
+
*
|
|
41
|
+
* @export
|
|
40
42
|
*/
|
|
41
43
|
get activeTab(): Tab | null;
|
|
42
44
|
set activeTab(tab: Tab | null);
|
|
43
45
|
/**
|
|
44
46
|
* The index of the currently selected tab.
|
|
47
|
+
*
|
|
48
|
+
* @export
|
|
45
49
|
*/
|
|
46
50
|
get activeTabIndex(): number;
|
|
47
51
|
set activeTabIndex(index: number);
|
|
@@ -50,7 +54,6 @@ export declare class Tabs extends LitElement {
|
|
|
50
54
|
*/
|
|
51
55
|
autoActivate: boolean;
|
|
52
56
|
private readonly slotElement;
|
|
53
|
-
private readonly maybeTabs;
|
|
54
57
|
private get focusedTab();
|
|
55
58
|
private readonly internals;
|
|
56
59
|
constructor();
|
package/tabs/internal/tabs.js
CHANGED
|
@@ -7,15 +7,15 @@ import { __decorate } from "tslib";
|
|
|
7
7
|
import '../../divider/divider.js';
|
|
8
8
|
import { html, isServer, LitElement } from 'lit';
|
|
9
9
|
import { property, query, queryAssignedElements } from 'lit/decorators.js';
|
|
10
|
-
import { polyfillElementInternalsAria,
|
|
11
|
-
import { ANIMATE_INDICATOR
|
|
10
|
+
import { polyfillARIAMixin, polyfillElementInternalsAria, } from '../../internal/aria/aria.js';
|
|
11
|
+
import { ANIMATE_INDICATOR } from './tab.js';
|
|
12
12
|
/**
|
|
13
|
-
* @fires change Fired when the selected tab changes. The target's selected or
|
|
13
|
+
* @fires change {Event} Fired when the selected tab changes. The target's selected or
|
|
14
14
|
* selectedItem and previousSelected or previousSelectedItem provide information
|
|
15
15
|
* about the selection change. The change event is fired when a user interaction
|
|
16
16
|
* like a space/enter key or click cause a selection change. The tab selection
|
|
17
17
|
* based on these actions can be cancelled by calling preventDefault on the
|
|
18
|
-
* triggering `keydown` or `click` event.
|
|
18
|
+
* triggering `keydown` or `click` event. --bubbles
|
|
19
19
|
*
|
|
20
20
|
* @example
|
|
21
21
|
* // perform an action if a tab is clicked
|
|
@@ -34,17 +34,13 @@ import { ANIMATE_INDICATOR, Tab } from './tab.js';
|
|
|
34
34
|
*
|
|
35
35
|
*/
|
|
36
36
|
export class Tabs extends LitElement {
|
|
37
|
-
/**
|
|
38
|
-
* The tabs of this tab bar.
|
|
39
|
-
*/
|
|
40
|
-
get tabs() {
|
|
41
|
-
return this.maybeTabs.filter(isTab);
|
|
42
|
-
}
|
|
43
37
|
/**
|
|
44
38
|
* The currently selected tab, `null` only when there are no tab children.
|
|
39
|
+
*
|
|
40
|
+
* @export
|
|
45
41
|
*/
|
|
46
42
|
get activeTab() {
|
|
47
|
-
return this.tabs.find(tab => tab.active) ?? null;
|
|
43
|
+
return this.tabs.find((tab) => tab.active) ?? null;
|
|
48
44
|
}
|
|
49
45
|
set activeTab(tab) {
|
|
50
46
|
// Ignore setting activeTab to null. As long as there are children, one tab
|
|
@@ -55,9 +51,11 @@ export class Tabs extends LitElement {
|
|
|
55
51
|
}
|
|
56
52
|
/**
|
|
57
53
|
* The index of the currently selected tab.
|
|
54
|
+
*
|
|
55
|
+
* @export
|
|
58
56
|
*/
|
|
59
57
|
get activeTabIndex() {
|
|
60
|
-
return this.tabs.findIndex(tab => tab.active);
|
|
58
|
+
return this.tabs.findIndex((tab) => tab.active);
|
|
61
59
|
}
|
|
62
60
|
set activeTabIndex(index) {
|
|
63
61
|
const activateTabAtIndex = () => {
|
|
@@ -88,7 +86,7 @@ export class Tabs extends LitElement {
|
|
|
88
86
|
activateTabAtIndex();
|
|
89
87
|
}
|
|
90
88
|
get focusedTab() {
|
|
91
|
-
return this.tabs.find(tab => tab.matches(':focus-within'));
|
|
89
|
+
return this.tabs.find((tab) => tab.matches(':focus-within'));
|
|
92
90
|
}
|
|
93
91
|
constructor() {
|
|
94
92
|
super();
|
|
@@ -96,7 +94,9 @@ export class Tabs extends LitElement {
|
|
|
96
94
|
* Whether or not to automatically select a tab when it is focused.
|
|
97
95
|
*/
|
|
98
96
|
this.autoActivate = false;
|
|
99
|
-
this.internals = polyfillElementInternalsAria(this,
|
|
97
|
+
this.internals = polyfillElementInternalsAria(this,
|
|
98
|
+
// Cast needed for closure
|
|
99
|
+
this.attachInternals());
|
|
100
100
|
if (!isServer) {
|
|
101
101
|
this.internals.role = 'tablist';
|
|
102
102
|
this.addEventListener('keydown', this.handleKeydown.bind(this));
|
|
@@ -138,8 +138,9 @@ export class Tabs extends LitElement {
|
|
|
138
138
|
render() {
|
|
139
139
|
return html `
|
|
140
140
|
<div class="tabs">
|
|
141
|
-
<slot
|
|
142
|
-
|
|
141
|
+
<slot
|
|
142
|
+
@slotchange=${this.handleSlotChange}
|
|
143
|
+
@click=${this.handleTabClick}></slot>
|
|
143
144
|
</div>
|
|
144
145
|
<md-divider part="divider"></md-divider>
|
|
145
146
|
`;
|
|
@@ -192,7 +193,7 @@ export class Tabs extends LitElement {
|
|
|
192
193
|
const isHome = event.key === 'Home';
|
|
193
194
|
const isEnd = event.key === 'End';
|
|
194
195
|
// Ignore non-navigation keys
|
|
195
|
-
if (event.defaultPrevented || !isLeft && !isRight && !isHome && !isEnd) {
|
|
196
|
+
if (event.defaultPrevented || (!isLeft && !isRight && !isHome && !isEnd)) {
|
|
196
197
|
return;
|
|
197
198
|
}
|
|
198
199
|
const { tabs } = this;
|
|
@@ -266,18 +267,18 @@ export class Tabs extends LitElement {
|
|
|
266
267
|
}
|
|
267
268
|
}
|
|
268
269
|
(() => {
|
|
269
|
-
|
|
270
|
+
polyfillARIAMixin(Tabs);
|
|
270
271
|
})();
|
|
272
|
+
__decorate([
|
|
273
|
+
queryAssignedElements({ flatten: true, selector: '[md-tab]' })
|
|
274
|
+
], Tabs.prototype, "tabs", void 0);
|
|
271
275
|
__decorate([
|
|
272
276
|
property({ type: Boolean, attribute: 'auto-activate' })
|
|
273
277
|
], Tabs.prototype, "autoActivate", void 0);
|
|
274
278
|
__decorate([
|
|
275
279
|
query('slot')
|
|
276
280
|
], Tabs.prototype, "slotElement", void 0);
|
|
277
|
-
__decorate([
|
|
278
|
-
queryAssignedElements({ flatten: true })
|
|
279
|
-
], Tabs.prototype, "maybeTabs", void 0);
|
|
280
281
|
function isTab(element) {
|
|
281
|
-
return element instanceof
|
|
282
|
+
return element instanceof HTMLElement && element.hasAttribute('md-tab');
|
|
282
283
|
}
|
|
283
284
|
//# sourceMappingURL=tabs.js.map
|