@shortfuse/materialdesignweb 0.8.0 → 0.9.1
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/README.md +50 -198
- package/bin/mdw-css.js +1 -1
- package/components/Badge.js +15 -5
- package/components/Body.js +7 -0
- package/components/BottomAppBar.js +7 -10
- package/components/BottomSheet.js +472 -0
- package/components/Box.js +11 -49
- package/components/Button.js +81 -82
- package/components/Card.js +74 -62
- package/components/Checkbox.js +15 -25
- package/components/CheckboxIcon.js +19 -31
- package/components/Chip.js +18 -13
- package/components/Dialog.js +70 -100
- package/components/DialogActions.js +4 -0
- package/components/Display.js +64 -0
- package/components/Divider.js +5 -0
- package/components/Fab.js +94 -17
- package/components/FabContainer.js +57 -0
- package/components/FilterChip.js +43 -32
- package/components/Grid.js +187 -0
- package/components/Headline.js +9 -28
- package/components/Icon.js +80 -71
- package/components/IconButton.js +77 -120
- package/components/Input.js +745 -86
- package/components/InputChip.js +193 -0
- package/components/Label.js +7 -0
- package/components/List.js +11 -5
- package/components/ListItem.js +92 -23
- package/components/ListOption.js +143 -65
- package/components/Listbox.js +57 -17
- package/components/Menu.js +39 -27
- package/components/MenuItem.js +49 -36
- package/components/NavBar.js +66 -21
- package/components/NavBarItem.js +5 -0
- package/components/NavDrawer.js +33 -16
- package/components/NavDrawerItem.js +7 -4
- package/components/NavItem.js +61 -34
- package/components/NavRail.js +32 -21
- package/components/NavRailItem.js +10 -2
- package/components/Page.js +119 -0
- package/components/Pane.js +24 -0
- package/components/Popup.js +23 -8
- package/components/Progress.js +25 -5
- package/components/Radio.js +8 -7
- package/components/RadioIcon.js +24 -15
- package/components/Ripple.js +25 -7
- package/components/Root.js +225 -0
- package/components/Scrim.js +95 -0
- package/components/Search.js +30 -25
- package/components/SegmentedButton.js +53 -40
- package/components/SegmentedButtonGroup.js +15 -12
- package/components/Select.js +19 -10
- package/components/Shape.js +10 -66
- package/components/SideSheet.js +337 -0
- package/components/Slider.js +93 -36
- package/components/Snackbar.js +52 -20
- package/components/SnackbarContainer.js +51 -0
- package/components/Surface.js +20 -10
- package/components/Switch.js +21 -18
- package/components/SwitchIcon.js +62 -33
- package/components/Tab.js +78 -38
- package/components/TabContent.js +33 -12
- package/components/TabList.js +95 -34
- package/components/TabPanel.js +10 -1
- package/components/Table.js +151 -0
- package/components/TextArea.js +48 -16
- package/components/Title.js +8 -9
- package/components/Tooltip.js +51 -22
- package/components/TopAppBar.js +71 -78
- package/constants/shapes.js +36 -0
- package/constants/typography.js +127 -0
- package/core/Composition.js +391 -201
- package/core/CompositionAdapter.js +35 -18
- package/core/CustomElement.js +634 -254
- package/core/css.js +117 -12
- package/core/customTypes.js +161 -49
- package/core/dom.js +18 -11
- package/core/jsonMergePatch.js +27 -11
- package/core/observe.js +308 -256
- package/core/optimizations.js +9 -9
- package/core/template.js +14 -57
- package/dist/CustomElement.min.js +2 -0
- package/dist/CustomElement.min.js.map +7 -0
- package/dist/core/CustomElement.min.js +2 -0
- package/dist/core/CustomElement.min.js.map +7 -0
- package/dist/index.min.js +85 -115
- package/dist/index.min.js.map +4 -4
- package/dist/meta.json +1 -1
- package/dom/HTMLOptionsCollectionProxy.js +108 -0
- package/{theming/themableMixinLoader.js → loaders/palette.js} +4 -3
- package/loaders/theme.js +12 -0
- package/mixins/AriaReflectorMixin.js +64 -15
- package/mixins/AriaToolbarMixin.js +6 -0
- package/mixins/ControlMixin.js +79 -33
- package/mixins/DelegatesFocusMixin.js +62 -0
- package/mixins/DensityMixin.js +7 -3
- package/mixins/ElevationMixin.js +61 -0
- package/mixins/FlexableMixin.js +87 -39
- package/mixins/FormAssociatedMixin.js +76 -10
- package/mixins/HyperlinkMixin.js +76 -0
- package/mixins/InputMixin.js +227 -32
- package/mixins/KeyboardNavMixin.js +11 -7
- package/mixins/NavigationListenerMixin.js +33 -0
- package/mixins/PopupMixin.js +216 -219
- package/mixins/RTLObserverMixin.js +2 -0
- package/mixins/ResizeObserverMixin.js +18 -4
- package/mixins/RippleMixin.js +11 -7
- package/mixins/ScrollListenerMixin.js +14 -2
- package/mixins/SemiStickyMixin.js +51 -98
- package/mixins/ShapeMaskedMixin.js +125 -0
- package/mixins/ShapeMixin.js +30 -203
- package/mixins/StateMixin.js +74 -34
- package/mixins/TextFieldMixin.js +128 -145
- package/mixins/ThemableMixin.js +57 -56
- package/mixins/TooltipTriggerMixin.js +305 -359
- package/mixins/TouchTargetMixin.js +5 -2
- package/mixins/TypographyMixin.js +128 -0
- package/package.json +125 -81
- package/services/rtl.js +10 -0
- package/services/svgAlias.js +17 -0
- package/{theming/index.js → services/theme.js} +25 -176
- package/types/bin/mdw-css.d.ts +3 -0
- package/types/bin/mdw-css.d.ts.map +1 -0
- package/types/components/Badge.d.ts +39 -0
- package/types/components/Badge.d.ts.map +1 -0
- package/types/components/Body.d.ts +29 -0
- package/types/components/Body.d.ts.map +1 -0
- package/types/components/BottomAppBar.d.ts +72 -0
- package/types/components/BottomAppBar.d.ts.map +1 -0
- package/types/components/BottomSheet.d.ts +135 -0
- package/types/components/BottomSheet.d.ts.map +1 -0
- package/types/components/Box.d.ts +16 -0
- package/types/components/Box.d.ts.map +1 -0
- package/types/components/Button.d.ts +245 -0
- package/types/components/Button.d.ts.map +1 -0
- package/types/components/Card.d.ts +147 -0
- package/types/components/Card.d.ts.map +1 -0
- package/types/components/Checkbox.d.ts +207 -0
- package/types/components/Checkbox.d.ts.map +1 -0
- package/types/components/CheckboxIcon.d.ts +44 -0
- package/types/components/CheckboxIcon.d.ts.map +1 -0
- package/types/components/Chip.d.ts +248 -0
- package/types/components/Chip.d.ts.map +1 -0
- package/types/components/Dialog.d.ts +103 -0
- package/types/components/Dialog.d.ts.map +1 -0
- package/types/components/DialogActions.d.ts +4 -0
- package/types/components/DialogActions.d.ts.map +1 -0
- package/types/components/Display.d.ts +46 -0
- package/types/components/Display.d.ts.map +1 -0
- package/types/components/Divider.d.ts +10 -0
- package/types/components/Divider.d.ts.map +1 -0
- package/types/components/Fab.d.ts +273 -0
- package/types/components/Fab.d.ts.map +1 -0
- package/types/components/FabContainer.d.ts +10 -0
- package/types/components/FabContainer.d.ts.map +1 -0
- package/types/components/FilterChip.d.ts +256 -0
- package/types/components/FilterChip.d.ts.map +1 -0
- package/types/components/Grid.d.ts +38 -0
- package/types/components/Grid.d.ts.map +1 -0
- package/types/components/Headline.d.ts +46 -0
- package/types/components/Headline.d.ts.map +1 -0
- package/types/components/Icon.d.ts +55 -0
- package/types/components/Icon.d.ts.map +1 -0
- package/types/components/IconButton.d.ts +284 -0
- package/types/components/IconButton.d.ts.map +1 -0
- package/types/components/Input.d.ts +2528 -0
- package/types/components/Input.d.ts.map +1 -0
- package/types/components/InputChip.d.ts +85 -0
- package/types/components/InputChip.d.ts.map +1 -0
- package/types/components/Label.d.ts +29 -0
- package/types/components/Label.d.ts.map +1 -0
- package/types/components/List.d.ts +35 -0
- package/types/components/List.d.ts.map +1 -0
- package/types/components/ListItem.d.ts +124 -0
- package/types/components/ListItem.d.ts.map +1 -0
- package/types/components/ListOption.d.ts +158 -0
- package/types/components/ListOption.d.ts.map +1 -0
- package/types/components/Listbox.d.ts +763 -0
- package/types/components/Listbox.d.ts.map +1 -0
- package/types/components/Menu.d.ts +130 -0
- package/types/components/Menu.d.ts.map +1 -0
- package/types/components/MenuItem.d.ts +232 -0
- package/types/components/MenuItem.d.ts.map +1 -0
- package/types/components/NavBar.d.ts +20 -0
- package/types/components/NavBar.d.ts.map +1 -0
- package/types/components/NavBarItem.d.ts +97 -0
- package/types/components/NavBarItem.d.ts.map +1 -0
- package/types/components/NavDrawer.d.ts +107 -0
- package/types/components/NavDrawer.d.ts.map +1 -0
- package/types/components/NavDrawerItem.d.ts +97 -0
- package/types/components/NavDrawerItem.d.ts.map +1 -0
- package/types/components/NavItem.d.ts +99 -0
- package/types/components/NavItem.d.ts.map +1 -0
- package/types/components/NavRail.d.ts +108 -0
- package/types/components/NavRail.d.ts.map +1 -0
- package/types/components/NavRailItem.d.ts +97 -0
- package/types/components/NavRailItem.d.ts.map +1 -0
- package/types/components/Page.d.ts +25 -0
- package/types/components/Page.d.ts.map +1 -0
- package/types/components/Pane.d.ts +44 -0
- package/types/components/Pane.d.ts.map +1 -0
- package/types/components/Popup.d.ts +78 -0
- package/types/components/Popup.d.ts.map +1 -0
- package/types/components/Progress.d.ts +21 -0
- package/types/components/Progress.d.ts.map +1 -0
- package/types/components/Radio.d.ts +201 -0
- package/types/components/Radio.d.ts.map +1 -0
- package/types/components/RadioIcon.d.ts +46 -0
- package/types/components/RadioIcon.d.ts.map +1 -0
- package/types/components/Ripple.d.ts +35 -0
- package/types/components/Ripple.d.ts.map +1 -0
- package/types/components/Root.d.ts +68 -0
- package/types/components/Root.d.ts.map +1 -0
- package/types/components/Scrim.d.ts +6 -0
- package/types/components/Scrim.d.ts.map +1 -0
- package/types/components/Search.d.ts +516 -0
- package/types/components/Search.d.ts.map +1 -0
- package/types/components/SegmentedButton.d.ts +252 -0
- package/types/components/SegmentedButton.d.ts.map +1 -0
- package/types/components/SegmentedButtonGroup.d.ts +43 -0
- package/types/components/SegmentedButtonGroup.d.ts.map +1 -0
- package/types/components/Select.d.ts +158 -0
- package/types/components/Select.d.ts.map +1 -0
- package/types/components/Shape.d.ts +10 -0
- package/types/components/Shape.d.ts.map +1 -0
- package/types/components/SideSheet.d.ts +111 -0
- package/types/components/SideSheet.d.ts.map +1 -0
- package/types/components/Slider.d.ts +203 -0
- package/types/components/Slider.d.ts.map +1 -0
- package/types/components/Snackbar.d.ts +73 -0
- package/types/components/Snackbar.d.ts.map +1 -0
- package/types/components/SnackbarContainer.d.ts +6 -0
- package/types/components/SnackbarContainer.d.ts.map +1 -0
- package/types/components/Surface.d.ts +45 -0
- package/types/components/Surface.d.ts.map +1 -0
- package/types/components/Switch.d.ts +187 -0
- package/types/components/Switch.d.ts.map +1 -0
- package/types/components/SwitchIcon.d.ts +61 -0
- package/types/components/SwitchIcon.d.ts.map +1 -0
- package/types/components/Tab.d.ts +139 -0
- package/types/components/Tab.d.ts.map +1 -0
- package/types/components/TabContent.d.ts +124 -0
- package/types/components/TabContent.d.ts.map +1 -0
- package/types/components/TabList.d.ts +1111 -0
- package/types/components/TabList.d.ts.map +1 -0
- package/types/components/TabPanel.d.ts +28 -0
- package/types/components/TabPanel.d.ts.map +1 -0
- package/types/components/Table.d.ts +25 -0
- package/types/components/Table.d.ts.map +1 -0
- package/types/components/TextArea.d.ts +201 -0
- package/types/components/TextArea.d.ts.map +1 -0
- package/types/components/Title.d.ts +46 -0
- package/types/components/Title.d.ts.map +1 -0
- package/types/components/Tooltip.d.ts +49 -0
- package/types/components/Tooltip.d.ts.map +1 -0
- package/types/components/TopAppBar.d.ts +129 -0
- package/types/components/TopAppBar.d.ts.map +1 -0
- package/types/constants/colorKeywords.d.ts +2 -0
- package/types/constants/colorKeywords.d.ts.map +1 -0
- package/types/constants/shapes.d.ts +38 -0
- package/types/constants/shapes.d.ts.map +1 -0
- package/types/constants/typography.d.ts +212 -0
- package/types/constants/typography.d.ts.map +1 -0
- package/types/core/Composition.d.ts +260 -0
- package/types/core/Composition.d.ts.map +1 -0
- package/types/core/CompositionAdapter.d.ts +114 -0
- package/types/core/CompositionAdapter.d.ts.map +1 -0
- package/types/core/CustomElement.d.ts +304 -0
- package/types/core/CustomElement.d.ts.map +1 -0
- package/types/core/css.d.ts +44 -0
- package/types/core/css.d.ts.map +1 -0
- package/types/core/customTypes.d.ts +22 -0
- package/types/core/customTypes.d.ts.map +1 -0
- package/types/core/dom.d.ts +32 -0
- package/types/core/dom.d.ts.map +1 -0
- package/types/core/jsonMergePatch.d.ts +31 -0
- package/types/core/jsonMergePatch.d.ts.map +1 -0
- package/types/core/observe.d.ts +114 -0
- package/types/core/observe.d.ts.map +1 -0
- package/types/core/optimizations.d.ts +7 -0
- package/types/core/optimizations.d.ts.map +1 -0
- package/types/core/template.d.ts +47 -0
- package/types/core/template.d.ts.map +1 -0
- package/types/core/uid.d.ts +6 -0
- package/types/core/uid.d.ts.map +1 -0
- package/types/dom/HTMLOptionsCollectionProxy.d.ts +18 -0
- package/types/dom/HTMLOptionsCollectionProxy.d.ts.map +1 -0
- package/types/index.d.ts +88 -0
- package/types/index.d.ts.map +1 -0
- package/types/loaders/palette.d.ts +2 -0
- package/types/loaders/palette.d.ts.map +1 -0
- package/types/loaders/theme.d.ts +2 -0
- package/types/loaders/theme.d.ts.map +1 -0
- package/types/mixins/AriaReflectorMixin.d.ts +31 -0
- package/types/mixins/AriaReflectorMixin.d.ts.map +1 -0
- package/types/mixins/AriaToolbarMixin.d.ts +34 -0
- package/types/mixins/AriaToolbarMixin.d.ts.map +1 -0
- package/types/mixins/ControlMixin.d.ts +124 -0
- package/types/mixins/ControlMixin.d.ts.map +1 -0
- package/types/mixins/DelegatesFocusMixin.d.ts +13 -0
- package/types/mixins/DelegatesFocusMixin.d.ts.map +1 -0
- package/types/mixins/DensityMixin.d.ts +8 -0
- package/types/mixins/DensityMixin.d.ts.map +1 -0
- package/types/mixins/ElevationMixin.d.ts +32 -0
- package/types/mixins/ElevationMixin.d.ts.map +1 -0
- package/types/mixins/FlexableMixin.d.ts +14 -0
- package/types/mixins/FlexableMixin.d.ts.map +1 -0
- package/types/mixins/FormAssociatedMixin.d.ts +123 -0
- package/types/mixins/FormAssociatedMixin.d.ts.map +1 -0
- package/types/mixins/HyperlinkMixin.d.ts +25 -0
- package/types/mixins/HyperlinkMixin.d.ts.map +1 -0
- package/types/mixins/InputMixin.d.ts +173 -0
- package/types/mixins/InputMixin.d.ts.map +1 -0
- package/types/mixins/KeyboardNavMixin.d.ts +46 -0
- package/types/mixins/KeyboardNavMixin.d.ts.map +1 -0
- package/types/mixins/NavigationListenerMixin.d.ts +8 -0
- package/types/mixins/NavigationListenerMixin.d.ts.map +1 -0
- package/types/mixins/PopupMixin.d.ts +98 -0
- package/types/mixins/PopupMixin.d.ts.map +1 -0
- package/types/mixins/RTLObserverMixin.d.ts +8 -0
- package/types/mixins/RTLObserverMixin.d.ts.map +1 -0
- package/types/mixins/ResizeObserverMixin.d.ts +13 -0
- package/types/mixins/ResizeObserverMixin.d.ts.map +1 -0
- package/types/mixins/RippleMixin.d.ts +94 -0
- package/types/mixins/RippleMixin.d.ts.map +1 -0
- package/types/mixins/ScrollListenerMixin.d.ts +46 -0
- package/types/mixins/ScrollListenerMixin.d.ts.map +1 -0
- package/types/mixins/SemiStickyMixin.d.ts +50 -0
- package/types/mixins/SemiStickyMixin.d.ts.map +1 -0
- package/types/mixins/ShapeMaskedMixin.d.ts +12 -0
- package/types/mixins/ShapeMaskedMixin.d.ts.map +1 -0
- package/types/mixins/ShapeMixin.d.ts +39 -0
- package/types/mixins/ShapeMixin.d.ts.map +1 -0
- package/types/mixins/StateMixin.d.ts +29 -0
- package/types/mixins/StateMixin.d.ts.map +1 -0
- package/types/mixins/TextFieldMixin.d.ts +153 -0
- package/types/mixins/TextFieldMixin.d.ts.map +1 -0
- package/types/mixins/ThemableMixin.d.ts +10 -0
- package/types/mixins/ThemableMixin.d.ts.map +1 -0
- package/types/mixins/TooltipTriggerMixin.d.ts +114 -0
- package/types/mixins/TooltipTriggerMixin.d.ts.map +1 -0
- package/types/mixins/TouchTargetMixin.d.ts +6 -0
- package/types/mixins/TouchTargetMixin.d.ts.map +1 -0
- package/types/mixins/TypographyMixin.d.ts +20 -0
- package/types/mixins/TypographyMixin.d.ts.map +1 -0
- package/types/services/rtl.d.ts +3 -0
- package/types/services/rtl.d.ts.map +1 -0
- package/types/services/svgAlias.d.ts +13 -0
- package/types/services/svgAlias.d.ts.map +1 -0
- package/types/services/theme.d.ts +45 -0
- package/types/services/theme.d.ts.map +1 -0
- package/types/utils/cli.d.ts +3 -0
- package/types/utils/cli.d.ts.map +1 -0
- package/types/utils/function.d.ts +3 -0
- package/types/utils/function.d.ts.map +1 -0
- package/types/utils/jsx-runtime.d.ts +20 -0
- package/types/utils/jsx-runtime.d.ts.map +1 -0
- package/types/utils/material-color/blend.d.ts +34 -0
- package/types/utils/material-color/blend.d.ts.map +1 -0
- package/types/utils/material-color/hct/Cam16.d.ts +142 -0
- package/types/utils/material-color/hct/Cam16.d.ts.map +1 -0
- package/types/utils/material-color/hct/Hct.d.ts +93 -0
- package/types/utils/material-color/hct/Hct.d.ts.map +1 -0
- package/types/utils/material-color/hct/ViewingConditions.d.ts +69 -0
- package/types/utils/material-color/hct/ViewingConditions.d.ts.map +1 -0
- package/types/utils/material-color/hct/hctSolver.d.ts +30 -0
- package/types/utils/material-color/hct/hctSolver.d.ts.map +1 -0
- package/types/utils/material-color/helper.d.ts +8 -0
- package/types/utils/material-color/helper.d.ts.map +1 -0
- package/types/utils/material-color/palettes/CorePalette.d.ts +75 -0
- package/types/utils/material-color/palettes/CorePalette.d.ts.map +1 -0
- package/types/utils/material-color/palettes/TonalPalette.d.ts +38 -0
- package/types/utils/material-color/palettes/TonalPalette.d.ts.map +1 -0
- package/types/utils/material-color/scheme/Scheme.d.ts +264 -0
- package/types/utils/material-color/scheme/Scheme.d.ts.map +1 -0
- package/types/utils/material-color/utils/color.d.ts +172 -0
- package/types/utils/material-color/utils/color.d.ts.map +1 -0
- package/types/utils/material-color/utils/math.d.ts +94 -0
- package/types/utils/material-color/utils/math.d.ts.map +1 -0
- package/types/utils/pixelmatch.d.ts +22 -0
- package/types/utils/pixelmatch.d.ts.map +1 -0
- package/types/utils/popup.d.ts +106 -0
- package/types/utils/popup.d.ts.map +1 -0
- package/types/utils/searchParams.d.ts +3 -0
- package/types/utils/searchParams.d.ts.map +1 -0
- package/types/utils/svg.d.ts +7 -0
- package/types/utils/svg.d.ts.map +1 -0
- package/utils/jsx-runtime.js +9 -4
- package/utils/material-color/scheme/Scheme.js +1 -1
- package/utils/pixelmatch.js +363 -0
- package/utils/popup.js +86 -10
- package/utils/searchParams.js +22 -0
- package/components/Button.md +0 -61
- package/components/ExtendedFab.js +0 -32
- package/components/Layout.js +0 -504
- package/components/Nav.js +0 -38
- package/core/DomAdapter.js +0 -586
- package/core/ICustomElement.d.ts +0 -291
- package/core/ICustomElement.js +0 -1
- package/core/test.js +0 -126
- package/core/typings.d.ts +0 -142
- package/core/typings.js +0 -1
- package/mixins/SurfaceMixin.js +0 -127
- package/theming/loader.js +0 -22
- /package/{utils/color_keywords.js → constants/colorKeywords.js} +0 -0
package/components/Chip.js
CHANGED
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
import Button from './Button.js';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Chips help people enter information, make selections, filter content, or trigger actions.
|
|
5
|
+
* @see https://m3.material.io/components/chips/specs
|
|
6
|
+
*/
|
|
3
7
|
export default Button
|
|
4
8
|
.extend()
|
|
5
9
|
.observe({
|
|
10
|
+
/** When true, renders the chip as a suggestion variant. */
|
|
6
11
|
suggestion: 'boolean',
|
|
7
12
|
})
|
|
13
|
+
.expressions({
|
|
14
|
+
iconVariation({ elevated }) {
|
|
15
|
+
return elevated ? 'filled' : null;
|
|
16
|
+
},
|
|
17
|
+
})
|
|
8
18
|
.css`
|
|
9
|
-
/* https://m3.material.io/components/chips/specs */
|
|
10
|
-
|
|
11
19
|
:host {
|
|
12
20
|
--mdw-shape__size: 8px;
|
|
13
21
|
--mdw-ink: var(--mdw-color__on-surface);
|
|
@@ -43,16 +51,13 @@ export default Button
|
|
|
43
51
|
}
|
|
44
52
|
|
|
45
53
|
`
|
|
46
|
-
.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
outline.setAttribute('color', '{color}');
|
|
55
|
-
icon.setAttribute('ink', inline(({ ink, iconInk }) => iconInk ?? ink ?? 'primary'));
|
|
56
|
-
},
|
|
54
|
+
.recompose(({ inline, refs: { slot, outline, icon } }) => {
|
|
55
|
+
slot.setAttribute('disabled', '{disabledState}');
|
|
56
|
+
slot.removeAttribute('ink');
|
|
57
|
+
slot.removeAttribute('color');
|
|
58
|
+
outline.setAttribute('mdw-if', '{!elevated}');
|
|
59
|
+
outline.setAttribute('ink', '{ink}');
|
|
60
|
+
outline.setAttribute('color', '{color}');
|
|
61
|
+
icon.setAttribute('ink', inline(({ ink, iconInk }) => iconInk ?? ink ?? 'primary'));
|
|
57
62
|
})
|
|
58
63
|
.autoRegister('mdw-chip');
|
package/components/Dialog.js
CHANGED
|
@@ -7,7 +7,6 @@ import CustomElement from '../core/CustomElement.js';
|
|
|
7
7
|
import { attemptFocus } from '../core/dom.js';
|
|
8
8
|
import PopupMixin from '../mixins/PopupMixin.js';
|
|
9
9
|
import ShapeMixin from '../mixins/ShapeMixin.js';
|
|
10
|
-
import SurfaceMixin from '../mixins/SurfaceMixin.js';
|
|
11
10
|
import ThemableMixin from '../mixins/ThemableMixin.js';
|
|
12
11
|
|
|
13
12
|
/**
|
|
@@ -18,12 +17,12 @@ import ThemableMixin from '../mixins/ThemableMixin.js';
|
|
|
18
17
|
function listTabbables(root) {
|
|
19
18
|
const treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
|
|
20
19
|
const focusables = [];
|
|
21
|
-
/** @type {
|
|
20
|
+
/** @type {HTMLElement} */
|
|
22
21
|
let node;
|
|
23
|
-
while ((node = treeWalker.nextNode())) {
|
|
22
|
+
while ((node = /** @type {HTMLElement} */ (treeWalker.nextNode()))) {
|
|
24
23
|
if (node.tagName === 'SLOT') {
|
|
25
24
|
for (const el of (/** @type {HTMLSlotElement} */ (node)).assignedElements()) {
|
|
26
|
-
if (el.tabIndex >= 0 && !el.matches(':disabled')) {
|
|
25
|
+
if ((/** @type {HTMLElement} */ (el)).tabIndex >= 0 && !el.matches(':disabled')) {
|
|
27
26
|
focusables.push(el);
|
|
28
27
|
}
|
|
29
28
|
focusables.push(...listTabbables(el));
|
|
@@ -49,7 +48,7 @@ function focusOnTree(root, autofocus, forward = true) {
|
|
|
49
48
|
const focusables = [];
|
|
50
49
|
/** @type {Element} */
|
|
51
50
|
let node;
|
|
52
|
-
while ((node = treeWalker.nextNode())) {
|
|
51
|
+
while ((node = /** @type {Element} */ (treeWalker.nextNode()))) {
|
|
53
52
|
if (autofocus && node.hasAttribute('autofocus')) {
|
|
54
53
|
if (attemptFocus(node)) return true;
|
|
55
54
|
continue;
|
|
@@ -60,20 +59,26 @@ function focusOnTree(root, autofocus, forward = true) {
|
|
|
60
59
|
if (attemptFocus(el)) return true;
|
|
61
60
|
continue;
|
|
62
61
|
}
|
|
62
|
+
// @ts-ignore Valid as long tabIndex isn't negative
|
|
63
63
|
if (el.tabIndex >= 0) {
|
|
64
64
|
// Can focus, add to later in case we find an autofocusable
|
|
65
65
|
if (autofocus || !forward) {
|
|
66
66
|
focusables.push(node);
|
|
67
|
-
} else if (attemptFocus(node))
|
|
67
|
+
} else if (attemptFocus(node)) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
68
70
|
}
|
|
69
71
|
if (focusOnTree(el, autofocus, forward)) return true;
|
|
70
72
|
}
|
|
71
73
|
// Step through
|
|
72
74
|
}
|
|
75
|
+
// @ts-ignore Valid as long tabIndex isn't negative
|
|
73
76
|
if (node.tabIndex >= 0) {
|
|
74
77
|
if (autofocus || !forward) {
|
|
75
78
|
focusables.push(node);
|
|
76
|
-
} else if (attemptFocus(node))
|
|
79
|
+
} else if (attemptFocus(node)) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
77
82
|
}
|
|
78
83
|
}
|
|
79
84
|
for (const el of forward ? focusables : focusables.reverse()) {
|
|
@@ -82,36 +87,49 @@ function focusOnTree(root, autofocus, forward = true) {
|
|
|
82
87
|
return false;
|
|
83
88
|
}
|
|
84
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Dialogs provide important prompts in a user flow.
|
|
92
|
+
* @see https://m3.material.io/components/dialogs/specs
|
|
93
|
+
*/
|
|
85
94
|
export default CustomElement
|
|
86
95
|
.extend()
|
|
87
96
|
.mixin(ThemableMixin)
|
|
88
|
-
.mixin(SurfaceMixin)
|
|
89
97
|
.mixin(ShapeMixin)
|
|
90
98
|
.mixin(PopupMixin)
|
|
91
99
|
.define({
|
|
100
|
+
/** Return the `returnValue` from the internal dialog element. */
|
|
92
101
|
returnValue() {
|
|
93
102
|
return /** @type {HTMLDialogElement} */ (this.refs.dialog).returnValue;
|
|
94
103
|
},
|
|
95
104
|
})
|
|
96
105
|
.observe({
|
|
106
|
+
/** Divider style for the dialog: 'full', 'inset', or empty. */
|
|
97
107
|
dividers: {
|
|
98
108
|
/** @type {'full'|''|'inset'} */
|
|
99
109
|
value: null,
|
|
100
110
|
},
|
|
111
|
+
/** Headline text displayed in the dialog header. */
|
|
101
112
|
headline: 'string',
|
|
113
|
+
/** Optional icon name shown in the dialog header. */
|
|
102
114
|
icon: 'string',
|
|
115
|
+
/** Default action (value) for the dialog when submitting. */
|
|
103
116
|
default: { value: 'confirm' },
|
|
117
|
+
/** Label for the cancel action button. */
|
|
104
118
|
cancel: { value: 'Cancel' },
|
|
119
|
+
/** Label for the confirm action button. */
|
|
105
120
|
confirm: { value: 'Confirm' },
|
|
106
121
|
})
|
|
122
|
+
.define({
|
|
123
|
+
/** Dialogs are not anchored to source */
|
|
124
|
+
_anchor: {
|
|
125
|
+
get() { return null; },
|
|
126
|
+
set() { /* noop */ },
|
|
127
|
+
},
|
|
128
|
+
})
|
|
107
129
|
.set({
|
|
130
|
+
flow: 'center',
|
|
108
131
|
_useScrim: true,
|
|
109
132
|
})
|
|
110
|
-
.overrides({
|
|
111
|
-
updatePopupPosition() {
|
|
112
|
-
// noop (keep centered);
|
|
113
|
-
},
|
|
114
|
-
})
|
|
115
133
|
.methods({
|
|
116
134
|
/**
|
|
117
135
|
* @param {Event & {currentTarget: HTMLSlotElement}} event
|
|
@@ -123,30 +141,7 @@ export default CustomElement
|
|
|
123
141
|
|| (node.nodeType === node.TEXT_NODE && node.nodeValue.trim().length));
|
|
124
142
|
currentTarget.toggleAttribute('slotted', hasContent);
|
|
125
143
|
},
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* @param {SubmitEvent & {currentTarget: HTMLFormElement}} event
|
|
129
|
-
* @return {void}
|
|
130
|
-
*/
|
|
131
|
-
onFormSubmit(event) {
|
|
132
|
-
if (event.currentTarget.assignedSlot) {
|
|
133
|
-
// Custom form.
|
|
134
|
-
// @ts-ignore Skip cast
|
|
135
|
-
const returnValue = event.submitter?.value;
|
|
136
|
-
this.close(returnValue);
|
|
137
|
-
event.preventDefault();
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* @param {Event & {currentTarget: HTMLFormElement}} event
|
|
143
|
-
* @return {void}
|
|
144
|
-
*/
|
|
145
|
-
onFormSlotChange({ currentTarget }) {
|
|
146
|
-
/** @type {HTMLFormElement} */
|
|
147
|
-
const [form] = currentTarget.assignedNodes();
|
|
148
|
-
form?.addEventListener('submit', (e) => this.onFormSubmit(e));
|
|
149
|
-
},
|
|
144
|
+
/** Focus the first autofocusable or focusable element inside the dialog. */
|
|
150
145
|
focus() {
|
|
151
146
|
focusOnTree(this.shadowRoot, true, true);
|
|
152
147
|
},
|
|
@@ -156,60 +151,41 @@ export default CustomElement
|
|
|
156
151
|
confirmAutoFocus({ default: d }) { return d === 'confirm'; },
|
|
157
152
|
})
|
|
158
153
|
.html`
|
|
159
|
-
<div id=
|
|
160
|
-
<mdw-icon mdw-if={icon} id=icon class=content ink=secondary aria-hidden=true
|
|
154
|
+
<div id=dialog-inner>
|
|
155
|
+
<mdw-icon mdw-if={icon} id=icon class=content ink=secondary aria-hidden=true icon={icon}></mdw-icon>
|
|
161
156
|
<slot id=headline name=headline on-slotchange={onSlotChange} role=header>{headline}</slot>
|
|
162
157
|
<slot id=fixed name=fixed class=content on-slotchange={onSlotChange}></slot>
|
|
163
158
|
<mdw-divider id=divider-top size={dividers}></mdw-divider>
|
|
164
|
-
|
|
165
|
-
<div id=append>
|
|
159
|
+
<slot id=content name=content></slot>
|
|
166
160
|
<mdw-divider id=divider-bottom size={dividers}></mdw-divider>
|
|
167
|
-
<slot
|
|
168
|
-
<form
|
|
169
|
-
<mdw-
|
|
170
|
-
|
|
171
|
-
autofocus={cancelAutoFocus}>{cancel}</mdw-button>
|
|
172
|
-
<mdw-button id=confirm type=submit value=confirm
|
|
173
|
-
autofocus={confirmAutoFocus}>{confirm}</mdw-button>
|
|
174
|
-
</mdw-dialog-actions>
|
|
161
|
+
<slot id=actions name=actions>
|
|
162
|
+
<form method=dialog role=none>
|
|
163
|
+
<mdw-button id=cancel type=submit value=cancel autofocus={cancelAutoFocus} formnovalidate>{cancel}</mdw-button>
|
|
164
|
+
<mdw-button id=confirm type=submit value=confirm autofocus={confirmAutoFocus}>{confirm}</mdw-button>
|
|
175
165
|
</form>
|
|
176
166
|
</slot>
|
|
177
167
|
</div>
|
|
178
168
|
`
|
|
179
|
-
.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
prepend.remove();
|
|
191
|
-
append.remove();
|
|
192
|
-
},
|
|
169
|
+
.recompose(({ refs: { dialog, dialogInner, content, slot } }) => {
|
|
170
|
+
dialog.setAttribute('aria-labelledby', 'headline');
|
|
171
|
+
dialog.setAttribute('aria-describedby', 'slot');
|
|
172
|
+
|
|
173
|
+
// Use content slot as content
|
|
174
|
+
// Use default slot as padded content
|
|
175
|
+
slot.classList.add('content');
|
|
176
|
+
content.append(slot);
|
|
177
|
+
|
|
178
|
+
dialog.prepend(...dialogInner.childNodes);
|
|
179
|
+
dialogInner.remove();
|
|
193
180
|
})
|
|
194
181
|
.css`
|
|
195
182
|
/* https://m3.material.io/components/dialogs/specs */
|
|
196
183
|
|
|
197
184
|
:host {
|
|
198
|
-
--mdw-shape__size: 28px;
|
|
199
|
-
|
|
200
|
-
--mdw-surface__shadow__resting: var(--mdw-surface__shadow__3);
|
|
201
|
-
--mdw-surface__shadow__raised: var(--mdw-surface__shadow__resting);
|
|
202
|
-
/* padding-inline: 12px; */
|
|
203
|
-
|
|
204
185
|
--mdw-bg: var(--mdw-color__surface-container-high);
|
|
205
186
|
--mdw-ink: var(--mdw-color__on-surface);
|
|
206
187
|
position: fixed;
|
|
207
188
|
|
|
208
|
-
/* stylelint-disable-next-line liberty/use-logical-spec */
|
|
209
|
-
top: 50%;
|
|
210
|
-
/* stylelint-disable-next-line liberty/use-logical-spec */
|
|
211
|
-
left: 50%;
|
|
212
|
-
|
|
213
189
|
display: flex;
|
|
214
190
|
align-items: flex-start;
|
|
215
191
|
flex-direction: column;
|
|
@@ -219,33 +195,18 @@ export default CustomElement
|
|
|
219
195
|
overscroll-behavior: none;
|
|
220
196
|
overscroll-behavior: contain;
|
|
221
197
|
|
|
222
|
-
box-sizing: border-box;
|
|
223
198
|
max-block-size: calc(100% - 40px);
|
|
224
199
|
inline-size: max-content;
|
|
225
200
|
min-inline-size: 280px;
|
|
226
201
|
max-inline-size: min(560px, calc(100% - 40px));
|
|
227
|
-
|
|
228
202
|
padding-block-start: 8px;
|
|
229
203
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
opacity: 0;
|
|
233
|
-
|
|
234
|
-
transform: translateX(-50%) translateY(-50%) scale(0);
|
|
235
|
-
/* visiblity:hidden still registers events, hide from pointer with scale(0) */
|
|
236
|
-
transform-origin: top center;
|
|
237
|
-
visibility: hidden;
|
|
204
|
+
transform: translateY(-40px) scaleY(0);
|
|
205
|
+
transform-origin: top center !important;
|
|
238
206
|
|
|
207
|
+
background-color: rgb(var(--mdw-bg));
|
|
239
208
|
color: rgb(var(--mdw-ink));
|
|
240
209
|
|
|
241
|
-
font: var(--mdw-type__font);
|
|
242
|
-
letter-spacing: var(--mdw-type__letter-spacing);
|
|
243
|
-
|
|
244
|
-
transition-delay: 0s, 200ms, 200ms;
|
|
245
|
-
transition-duration: 200ms, 0s, 0s;
|
|
246
|
-
transition-property: opacity, transform, visibility;
|
|
247
|
-
transition-timing-function: ease-out;
|
|
248
|
-
will-change: display, transform, opacity;
|
|
249
210
|
}
|
|
250
211
|
|
|
251
212
|
#dialog:modal {
|
|
@@ -256,10 +217,6 @@ export default CustomElement
|
|
|
256
217
|
align-items: center;
|
|
257
218
|
}
|
|
258
219
|
|
|
259
|
-
#shape {
|
|
260
|
-
background-color: rgb(var(--mdw-bg));
|
|
261
|
-
}
|
|
262
|
-
|
|
263
220
|
#icon {
|
|
264
221
|
padding-block-start: 16px;
|
|
265
222
|
|
|
@@ -335,14 +292,18 @@ export default CustomElement
|
|
|
335
292
|
display: contents;
|
|
336
293
|
}
|
|
337
294
|
|
|
338
|
-
#
|
|
339
|
-
display:
|
|
295
|
+
#actions {
|
|
296
|
+
display: flex;
|
|
297
|
+
align-self: flex-end;
|
|
298
|
+
|
|
299
|
+
margin-block: 24px;
|
|
300
|
+
padding-inline: 24px;
|
|
340
301
|
}
|
|
341
302
|
`
|
|
342
303
|
.events({
|
|
343
304
|
keydown(event) {
|
|
344
305
|
if (event.key === 'Tab') {
|
|
345
|
-
if (!this.
|
|
306
|
+
if (!this.native) {
|
|
346
307
|
// Tab trap
|
|
347
308
|
event.preventDefault();
|
|
348
309
|
const tabbables = listTabbables(this.shadowRoot);
|
|
@@ -401,6 +362,15 @@ export default CustomElement
|
|
|
401
362
|
this.close(undefined, false);
|
|
402
363
|
});
|
|
403
364
|
},
|
|
365
|
+
submit(event) {
|
|
366
|
+
if (event.defaultPrevented) return;
|
|
367
|
+
const form = event.target;
|
|
368
|
+
if (form instanceof HTMLFormElement === false) return;
|
|
369
|
+
if (form.method !== 'dialog') return;
|
|
370
|
+
const submitter = /** @type {HTMLInputElement|HTMLButtonElement} */ (event.submitter);
|
|
371
|
+
const returnValue = submitter?.value;
|
|
372
|
+
this.close(returnValue);
|
|
373
|
+
},
|
|
404
374
|
})
|
|
405
375
|
.childEvents({
|
|
406
376
|
dialog: {
|
|
@@ -418,7 +388,7 @@ export default CustomElement
|
|
|
418
388
|
'~click'(event) {
|
|
419
389
|
// Track if click on backdrop
|
|
420
390
|
if (event.target !== event.currentTarget) return;
|
|
421
|
-
if (!this.
|
|
391
|
+
if (!this.native) return;
|
|
422
392
|
if (event.offsetX >= 0 && event.offsetX < event.currentTarget.offsetWidth
|
|
423
393
|
&& event.offsetY >= 0 && event.offsetY < event.currentTarget.offsetHeight) return;
|
|
424
394
|
const cancelEvent = new Event('cancel', { cancelable: true });
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';
|
|
2
|
+
import TypographyMixin from '../mixins/TypographyMixin.js';
|
|
3
|
+
|
|
4
|
+
import Box from './Box.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Material Design Type scale: Display
|
|
8
|
+
* @see https://m3.material.io/styles/typography/type-scale-tokens
|
|
9
|
+
*/
|
|
10
|
+
export default Box
|
|
11
|
+
.extend()
|
|
12
|
+
.mixin(AriaReflectorMixin)
|
|
13
|
+
.mixin(TypographyMixin)
|
|
14
|
+
.set({
|
|
15
|
+
/** ARIA role applied to the host (default: 'heading'). */
|
|
16
|
+
_ariaRole: 'heading',
|
|
17
|
+
/** Base aria level used when computing the heading level. */
|
|
18
|
+
_baseAriaLevel: 1,
|
|
19
|
+
})
|
|
20
|
+
.observe({
|
|
21
|
+
/** Explicit aria-level; if set, overrides the computed level. */
|
|
22
|
+
ariaLevel: 'string',
|
|
23
|
+
/** Display size controlling typographic scale: 'large'|'medium'|'small'. */
|
|
24
|
+
size: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
/** @type {'large'|'medium'|'small'} */
|
|
27
|
+
empty: 'large',
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
.observe({
|
|
31
|
+
/** Computed aria-level (string) derived from `ariaLevel` and `size`. */
|
|
32
|
+
_computedAriaLevel({ ariaLevel, size, _baseAriaLevel }) {
|
|
33
|
+
if (ariaLevel) return ariaLevel;
|
|
34
|
+
if (size === 'medium') return `${_baseAriaLevel + 1}`;
|
|
35
|
+
if (size === 'small') return `${_baseAriaLevel + 2}`;
|
|
36
|
+
return `${_baseAriaLevel}`;
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
.on({
|
|
41
|
+
_computedAriaLevelChanged(oldValue, newValue) {
|
|
42
|
+
this.updateAriaProperty('ariaLevel', newValue);
|
|
43
|
+
},
|
|
44
|
+
constructed() {
|
|
45
|
+
this.updateAriaProperty('ariaLevel', this._computedAriaLevel);
|
|
46
|
+
},
|
|
47
|
+
})
|
|
48
|
+
.css`
|
|
49
|
+
:host {
|
|
50
|
+
font: var(--mdw-typescale__display-large__font);
|
|
51
|
+
letter-spacing: var(--mdw-typescale__display-large__letter-spacing);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
:host([size="medium"]) {
|
|
55
|
+
font: var(--mdw-typescale__display-medium__font);
|
|
56
|
+
letter-spacing: var(--mdw-typescale__display-medium__letter-spacing);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
:host([size="small"]) {
|
|
60
|
+
font: var(--mdw-typescale__display-small__font);
|
|
61
|
+
letter-spacing: var(--mdw-typescale__display-small__letter-spacing);
|
|
62
|
+
}
|
|
63
|
+
`
|
|
64
|
+
.autoRegister('mdw-display');
|
package/components/Divider.js
CHANGED
|
@@ -3,10 +3,15 @@
|
|
|
3
3
|
import CustomElement from '../core/CustomElement.js';
|
|
4
4
|
import ThemableMixin from '../mixins/ThemableMixin.js';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Dividers are thin lines that group content in lists or other containers
|
|
8
|
+
* @see https://m3.material.io/components/divider/specs
|
|
9
|
+
*/
|
|
6
10
|
export default CustomElement
|
|
7
11
|
.extend()
|
|
8
12
|
.mixin(ThemableMixin)
|
|
9
13
|
.observe({
|
|
14
|
+
/** When true, render the divider vertically instead of horizontally. */
|
|
10
15
|
vertical: 'boolean',
|
|
11
16
|
})
|
|
12
17
|
.css`
|
package/components/Fab.js
CHANGED
|
@@ -1,29 +1,94 @@
|
|
|
1
1
|
import TooltipTriggerMixin from '../mixins/TooltipTriggerMixin.js';
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import Button from './Button.js';
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Floating action buttons (FABs) help people take primary actions.
|
|
7
|
+
* @see https://m3.material.io/components/floating-action-button/specs
|
|
8
|
+
* @see https://m3.material.io/components/extended-fab/specs
|
|
9
|
+
*/
|
|
10
|
+
export default Button
|
|
6
11
|
.extend()
|
|
7
12
|
.mixin(TooltipTriggerMixin)
|
|
8
13
|
.observe({
|
|
14
|
+
/** When true, render the lowered FAB variant (reduced elevation). */
|
|
15
|
+
lowered: 'boolean',
|
|
16
|
+
/** When true, the FAB is extended and shows a text label. */
|
|
17
|
+
extended: 'boolean',
|
|
18
|
+
/** FAB size: `null` (default), 'small' or 'large'. */
|
|
9
19
|
fabSize: {
|
|
10
20
|
/** @type {null|'small'|'large'} */
|
|
11
21
|
value: null,
|
|
12
22
|
},
|
|
23
|
+
/** Filled variant; default is 'tonal' when omitted. */
|
|
24
|
+
filled: { empty: 'tonal' },
|
|
25
|
+
/** Whether the FAB uses elevated styling. */
|
|
26
|
+
elevated: { type: 'boolean', empty: true },
|
|
27
|
+
})
|
|
28
|
+
.observe({
|
|
29
|
+
/** Whether to show the tooltip automatically (true when not extended). */
|
|
30
|
+
autoTooltip({ extended }) {
|
|
31
|
+
return !extended;
|
|
32
|
+
},
|
|
33
|
+
})
|
|
34
|
+
.recompose(({ refs: { icon, slot } }) => {
|
|
35
|
+
icon.setAttribute('fab-size', '{fabSize}');
|
|
36
|
+
slot.setAttribute('extended', '{extended}');
|
|
37
|
+
slot.setAttribute('icon', '{icon}');
|
|
13
38
|
})
|
|
14
39
|
.css`
|
|
15
|
-
/* https://m3.material.io/components/
|
|
40
|
+
/* https://m3.material.io/components/extended-fab/specs */
|
|
16
41
|
|
|
17
42
|
:host {
|
|
43
|
+
--mdw-bg: var(--mdw-color__surface-container-high);
|
|
44
|
+
--mdw-ink: var(--mdw-color__primary);
|
|
45
|
+
--mdw-shape__size: 16px;
|
|
46
|
+
gap: 0;
|
|
47
|
+
grid-area: fab;
|
|
48
|
+
|
|
18
49
|
min-inline-size: 24px;
|
|
50
|
+
padding: calc(16px + (var(--mdw-density) * 2px));
|
|
51
|
+
|
|
52
|
+
background-color: rgb(var(--mdw-bg));
|
|
53
|
+
|
|
54
|
+
box-shadow: var(--mdw-elevation__box-shadow__3);
|
|
55
|
+
color: rgb(var(--mdw-ink));
|
|
56
|
+
|
|
57
|
+
transition-duration: 200ms;
|
|
58
|
+
|
|
59
|
+
transition-property: box-shadow, gap, min-inline-size;
|
|
19
60
|
}
|
|
20
61
|
|
|
21
|
-
|
|
22
|
-
|
|
62
|
+
:host(:where([extended])) {
|
|
63
|
+
gap: 8px;
|
|
64
|
+
|
|
65
|
+
min-inline-size: 48px;
|
|
23
66
|
}
|
|
24
67
|
|
|
25
|
-
#
|
|
26
|
-
|
|
68
|
+
#slot {
|
|
69
|
+
display: inline-flex;
|
|
70
|
+
align-items: center;
|
|
71
|
+
|
|
72
|
+
min-block-size: 24px;
|
|
73
|
+
|
|
74
|
+
visibility: hidden;
|
|
75
|
+
|
|
76
|
+
color: transparent;
|
|
77
|
+
|
|
78
|
+
font-size: 0;
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
transition: color 200ms, font-size 200ms, visibility 200ms;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
#slot[extended] {
|
|
85
|
+
visibility: inherit;
|
|
86
|
+
|
|
87
|
+
color: inherit;
|
|
88
|
+
|
|
89
|
+
font-size: inherit;
|
|
90
|
+
|
|
91
|
+
transition: color 200ms, font-size 200ms, visibility 0ms;
|
|
27
92
|
}
|
|
28
93
|
|
|
29
94
|
:host([fab-size="small"]) {
|
|
@@ -35,15 +100,27 @@ export default ExtendedFab
|
|
|
35
100
|
--mdw-shape__size: 28px;
|
|
36
101
|
padding: calc(30px + (var(--mdw-density) * 2px));
|
|
37
102
|
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
#icon {
|
|
106
|
+
font-size: 24px;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
#icon[fab-size="large"] {
|
|
110
|
+
font-size: 36px;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
:host(:where([lowered])) {
|
|
114
|
+
--mdw-bg: var(--mdw-color__surface-container-low);
|
|
115
|
+
box-shadow: var(--mdw-elevation__box-shadow__1);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
:host(:where(:hover:not(:active))) {
|
|
119
|
+
box-shadow: var(--mdw-elevation__box-shadow__4);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
:host(:where([lowered]:hover:not(:active))) {
|
|
123
|
+
box-shadow: var(--mdw-elevation__box-shadow__2);
|
|
124
|
+
}
|
|
38
125
|
`
|
|
39
|
-
.on({
|
|
40
|
-
composed() {
|
|
41
|
-
const { slot, tooltipSlot, control, shape, icon } = this.refs;
|
|
42
|
-
slot.remove();
|
|
43
|
-
tooltipSlot.removeAttribute('name');
|
|
44
|
-
control.setAttribute('aria-labelledby', 'tooltip');
|
|
45
|
-
shape.setAttribute('fab-size', '{fabSize}');
|
|
46
|
-
icon.setAttribute('fab-size', '{fabSize}');
|
|
47
|
-
},
|
|
48
|
-
})
|
|
49
126
|
.autoRegister('mdw-fab');
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import CustomElement from '../core/CustomElement.js';
|
|
2
|
+
import { ELEMENT_STYLE_TYPE } from '../core/customTypes.js';
|
|
3
|
+
import DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Container for Floating Action Buttons (FAB) used to position FABs.
|
|
7
|
+
* @see https://m3.material.io/components/floating-action-button/specs
|
|
8
|
+
*/
|
|
9
|
+
export default CustomElement
|
|
10
|
+
.extend()
|
|
11
|
+
.mixin(DelegatesFocusMixin)
|
|
12
|
+
.observe({
|
|
13
|
+
/** Hide the FAB container at this min-width (pixels). */
|
|
14
|
+
hideBreakpoint: { value: 728 },
|
|
15
|
+
})
|
|
16
|
+
.observe({
|
|
17
|
+
/**
|
|
18
|
+
* Computed element styles. Generates a media query that hides the
|
|
19
|
+
* container when `hideBreakpoint` is set.
|
|
20
|
+
*/
|
|
21
|
+
_styles: {
|
|
22
|
+
...ELEMENT_STYLE_TYPE,
|
|
23
|
+
get({ hideBreakpoint }) {
|
|
24
|
+
if (hideBreakpoint) {
|
|
25
|
+
return `@media(min-width:${hideBreakpoint}px){:host{display:none}}`;
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
.html`<slot id=slot></slot>`
|
|
32
|
+
.css`
|
|
33
|
+
:host {
|
|
34
|
+
display: grid;
|
|
35
|
+
align-items: flex-end;
|
|
36
|
+
grid-template:
|
|
37
|
+
"fab" auto
|
|
38
|
+
/ auto;
|
|
39
|
+
justify-content: flex-end;
|
|
40
|
+
|
|
41
|
+
margin: 16px;
|
|
42
|
+
|
|
43
|
+
pointer-events: none;
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@media (min-width: 648px) {
|
|
48
|
+
:host {
|
|
49
|
+
margin: 24px;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#slot {
|
|
54
|
+
pointer-events: auto;
|
|
55
|
+
}
|
|
56
|
+
`
|
|
57
|
+
.autoRegister('mdw-fab-container');
|