mtrl 0.10.0-next.3 → 0.10.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 +130 -84
- package/dist/README.md +130 -84
- package/dist/components/badge/features.js +1 -1
- package/dist/components/bottom-sheet/api.d.ts +4 -3
- package/dist/components/bottom-sheet/config.js +1 -1
- package/dist/components/bottom-sheet/features/drag.d.ts +3 -0
- package/dist/components/bottom-sheet/features/drag.js +23 -0
- package/dist/components/bottom-sheet/features/state.js +20 -1
- package/dist/components/bottom-sheet/features/structure.js +4 -3
- package/dist/components/button/features/progress.js +5 -3
- package/dist/components/button-group/button-group.js +3 -1
- package/dist/components/button-group/config.d.ts +8 -8
- package/dist/components/button-group/config.js +3 -2
- package/dist/components/button-group/constants.d.ts +7 -2
- package/dist/components/button-group/constants.js +5 -5
- package/dist/components/button-group/types.d.ts +5 -0
- package/dist/components/card/api.d.ts +4 -0
- package/dist/components/card/api.js +8 -0
- package/dist/components/card/card.js +1 -2
- package/dist/components/card/config.js +2 -14
- package/dist/components/card/content.js +1 -6
- package/dist/components/card/features.d.ts +5 -19
- package/dist/components/card/features.js +1 -11
- package/dist/components/card/index.d.ts +1 -1
- package/dist/components/card/types.d.ts +34 -3
- package/dist/components/carousel/features/scroll.js +7 -3
- package/dist/components/checkbox/config.js +18 -6
- package/dist/components/chips/api.js +1 -1
- package/dist/components/chips/config.js +1 -1
- package/dist/components/chips/features/controller.js +12 -6
- package/dist/components/chips/index.d.ts +1 -1
- package/dist/components/chips/types.d.ts +24 -5
- package/dist/components/datepicker/datepicker.d.ts +8 -2
- package/dist/components/datepicker/datepicker.js +61 -25
- package/dist/components/datepicker/index.d.ts +1 -1
- package/dist/components/datepicker/types.d.ts +63 -30
- package/dist/components/datepicker/utils.d.ts +5 -0
- package/dist/components/datepicker/utils.js +2 -0
- package/dist/components/dialog/config.js +1 -1
- package/dist/components/dialog/features.js +21 -12
- package/dist/components/dialog/types.d.ts +4 -2
- package/dist/components/divider/features.js +3 -2
- package/dist/components/drawer/features/items.js +1 -0
- package/dist/components/drawer/types.d.ts +6 -0
- package/dist/components/extended-fab/api.d.ts +2 -0
- package/dist/components/extended-fab/api.js +2 -0
- package/dist/components/extended-fab/types.d.ts +6 -2
- package/dist/components/fab-menu/config.d.ts +11 -0
- package/dist/components/fab-menu/config.js +15 -0
- package/dist/components/fab-menu/constants.d.ts +59 -0
- package/dist/components/fab-menu/constants.js +30 -0
- package/dist/components/fab-menu/fab-menu.d.ts +40 -0
- package/dist/components/fab-menu/fab-menu.js +323 -0
- package/dist/components/fab-menu/index.d.ts +6 -0
- package/dist/components/fab-menu/index.js +4 -0
- package/dist/components/fab-menu/stagger.d.ts +10 -0
- package/dist/components/fab-menu/stagger.js +24 -0
- package/dist/components/fab-menu/types.d.ts +114 -0
- package/dist/components/fab-menu/types.js +1 -0
- package/dist/components/icon-button/features/toggle.d.ts +1 -0
- package/dist/components/icon-button/features/toggle.js +1 -0
- package/dist/components/icon-button/icon-button.d.ts +2 -2
- package/dist/components/icon-button/index.d.ts +2 -2
- package/dist/components/icon-button/types.d.ts +9 -2
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +2 -0
- package/dist/components/list/api.d.ts +2 -2
- package/dist/components/list/features/selection.js +1 -1
- package/dist/components/list/types.d.ts +5 -0
- package/dist/components/menu/features/controller.d.ts +2 -0
- package/dist/components/menu/features/controller.js +36 -34
- package/dist/components/menu/features/index.d.ts +1 -2
- package/dist/components/menu/features/index.js +1 -2
- package/dist/components/menu/features/loader.d.ts +35 -0
- package/dist/components/menu/features/loader.js +64 -0
- package/dist/components/menu/features/position.js +32 -32
- package/dist/components/menu/menu.js +2 -2
- package/dist/components/menu/types.d.ts +10 -2
- package/dist/components/navigation-rail/navigation-rail.js +1 -1
- package/dist/components/navigation-rail/types.d.ts +2 -0
- package/dist/components/progress/api.d.ts +4 -0
- package/dist/components/progress/api.js +17 -10
- package/dist/components/progress/config.js +3 -11
- package/dist/components/progress/features/canvas.d.ts +1 -0
- package/dist/components/progress/features/canvas.js +1 -1
- package/dist/components/progress/features/circular.js +7 -1
- package/dist/components/progress/features/state.js +5 -3
- package/dist/components/progress/index.d.ts +1 -1
- package/dist/components/progress/types.d.ts +21 -12
- package/dist/components/radios/radio.js +1 -3
- package/dist/components/search/api.d.ts +1 -1
- package/dist/components/search/api.js +2 -2
- package/dist/components/search/config.d.ts +2 -2
- package/dist/components/search/config.js +1 -1
- package/dist/components/search/features/suggestions.d.ts +2 -1
- package/dist/components/search/types.d.ts +2 -2
- package/dist/components/segmented-button/config.d.ts +1 -1
- package/dist/components/segmented-button/segmented-button.js +1 -43
- package/dist/components/segmented-button/types.d.ts +3 -3
- package/dist/components/select/features.js +2 -15
- package/dist/components/side-sheet/api.d.ts +4 -3
- package/dist/components/side-sheet/config.js +1 -1
- package/dist/components/side-sheet/features/state.js +20 -1
- package/dist/components/slider/api.js +2 -2
- package/dist/components/slider/features/controller.d.ts +14 -14
- package/dist/components/slider/features/controller.js +2 -2
- package/dist/components/slider/features/tracks.d.ts +0 -9
- package/dist/components/slider/features/tracks.js +3 -1
- package/dist/components/slider/types.d.ts +2 -2
- package/dist/components/split-button/api.js +2 -1
- package/dist/components/split-button/types.d.ts +2 -0
- package/dist/components/switch/api.js +7 -0
- package/dist/components/switch/features.d.ts +4 -0
- package/dist/components/switch/features.js +9 -2
- package/dist/components/switch/types.d.ts +6 -0
- package/dist/components/tabs/api.js +0 -9
- package/dist/components/tabs/types.d.ts +1 -1
- package/dist/components/textfield/api.d.ts +1 -0
- package/dist/components/textfield/api.js +4 -1
- package/dist/components/textfield/constants.d.ts +5 -1
- package/dist/components/textfield/features/counter.d.ts +29 -0
- package/dist/components/textfield/features/counter.js +54 -0
- package/dist/components/textfield/features/field.d.ts +37 -0
- package/dist/components/textfield/features/field.js +39 -0
- package/dist/components/textfield/features/index.d.ts +4 -0
- package/dist/components/textfield/features/index.js +2 -0
- package/dist/components/textfield/features/leading-icon.js +2 -1
- package/dist/components/textfield/features/placement.js +65 -60
- package/dist/components/textfield/features/prefix-text.js +2 -1
- package/dist/components/textfield/features/suffix-text.js +2 -1
- package/dist/components/textfield/features/supporting-text.js +16 -33
- package/dist/components/textfield/features/trailing-icon.js +2 -1
- package/dist/components/textfield/textfield.js +2 -2
- package/dist/components/textfield/types.d.ts +7 -0
- package/dist/components/timepicker/api.js +4 -7
- package/dist/components/timepicker/config.d.ts +3 -3
- package/dist/components/timepicker/config.js +1 -1
- package/dist/components/timepicker/dial.d.ts +3 -3
- package/dist/components/timepicker/index.d.ts +2 -1
- package/dist/components/timepicker/types.d.ts +28 -14
- package/dist/components/timepicker/utils.d.ts +2 -2
- package/dist/components/toolbar/config.d.ts +19 -0
- package/dist/components/toolbar/config.js +46 -0
- package/dist/components/toolbar/constants.d.ts +66 -0
- package/dist/components/toolbar/constants.js +32 -0
- package/dist/components/toolbar/index.d.ts +6 -0
- package/dist/components/toolbar/index.js +4 -0
- package/dist/components/toolbar/toolbar.d.ts +29 -0
- package/dist/components/toolbar/toolbar.js +204 -0
- package/dist/components/toolbar/types.d.ts +152 -0
- package/dist/components/toolbar/types.js +1 -0
- package/dist/components/tooltip/types.d.ts +3 -2
- package/dist/core/compose/features/checkable.d.ts +3 -6
- package/dist/core/compose/features/checkable.js +4 -20
- package/dist/core/compose/features/disabled.js +14 -14
- package/dist/core/compose/features/events.d.ts +16 -4
- package/dist/core/compose/features/input.js +1 -4
- package/dist/core/compose/features/textinput.js +18 -18
- package/dist/core/compose/features/textlabel.js +6 -7
- package/dist/core/dom/index.d.ts +3 -1
- package/dist/core/dom/index.js +2 -1
- package/dist/core/dom/layer.d.ts +8 -0
- package/dist/core/dom/layer.js +26 -0
- package/dist/core/dom/roving.d.ts +30 -0
- package/dist/core/dom/roving.js +75 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +1 -0
- package/dist/core/state/emitter.d.ts +8 -2
- package/dist/core/state/events.d.ts +4 -3
- package/dist/core/theme/index.d.ts +7 -0
- package/dist/core/theme/index.js +2 -0
- package/dist/core/theme/shape.d.ts +9 -0
- package/dist/core/theme/shape.js +1 -0
- package/dist/core/theme/tokens.d.ts +45 -0
- package/dist/core/theme/tokens.js +36 -0
- package/dist/core/utils/theme.d.ts +7 -2
- package/dist/core/utils/theme.js +21 -23
- package/dist/core/utils/warn.d.ts +8 -0
- package/dist/core/utils/warn.js +5 -0
- package/dist/elements/adapter.d.ts +3 -0
- package/dist/elements/adapter.js +3 -0
- package/dist/elements/badge.d.ts +8 -0
- package/dist/elements/bottom-app-bar.d.ts +9 -0
- package/dist/elements/bottom-app-bar.js +1 -0
- package/dist/elements/bottom-sheet.d.ts +9 -0
- package/dist/elements/bottom-sheet.js +1 -0
- package/dist/elements/button-group.d.ts +9 -0
- package/dist/elements/button.d.ts +8 -0
- package/dist/elements/card.d.ts +9 -0
- package/dist/elements/card.js +1 -0
- package/dist/elements/carousel.d.ts +9 -0
- package/dist/elements/checkbox.d.ts +8 -0
- package/dist/elements/chips.d.ts +10 -0
- package/dist/elements/chips.js +1 -3
- package/dist/elements/css/badge.js +3 -2
- package/dist/elements/css/bottom-app-bar.js +3 -2
- package/dist/elements/css/bottom-sheet.js +3 -2
- package/dist/elements/css/button-group.js +3 -2
- package/dist/elements/css/button.js +3 -2
- package/dist/elements/css/card.js +3 -2
- package/dist/elements/css/carousel.js +3 -2
- package/dist/elements/css/checkbox.js +3 -2
- package/dist/elements/css/chips.js +3 -2
- package/dist/elements/css/datepicker.js +3 -2
- package/dist/elements/css/dialog.js +3 -2
- package/dist/elements/css/divider.js +2 -1
- package/dist/elements/css/drawer.js +3 -2
- package/dist/elements/css/extended-fab.js +3 -2
- package/dist/elements/css/fab-menu.d.ts +1 -0
- package/dist/elements/css/fab-menu.js +6 -0
- package/dist/elements/css/fab.js +3 -2
- package/dist/elements/css/icon-button.js +3 -2
- package/dist/elements/css/index.js +2 -0
- package/dist/elements/css/list.js +3 -2
- package/dist/elements/css/loading-indicator.js +3 -2
- package/dist/elements/css/menu.js +3 -2
- package/dist/elements/css/navigation-rail.js +3 -2
- package/dist/elements/css/progress.js +3 -2
- package/dist/elements/css/radios.js +3 -2
- package/dist/elements/css/search.js +3 -2
- package/dist/elements/css/select.js +3 -2
- package/dist/elements/css/side-sheet.js +3 -2
- package/dist/elements/css/slider.js +3 -2
- package/dist/elements/css/snackbar.js +3 -2
- package/dist/elements/css/split-button.js +3 -2
- package/dist/elements/css/switch.js +3 -2
- package/dist/elements/css/tabs.js +3 -2
- package/dist/elements/css/textfield.js +3 -2
- package/dist/elements/css/timepicker.js +3 -2
- package/dist/elements/css/toolbar.d.ts +1 -0
- package/dist/elements/css/toolbar.js +6 -0
- package/dist/elements/css/tooltip.js +3 -2
- package/dist/elements/css/top-app-bar.js +3 -2
- package/dist/elements/datepicker.d.ts +17 -9
- package/dist/elements/datepicker.js +13 -43
- package/dist/elements/define.d.ts +30 -2
- package/dist/elements/define.js +84 -9
- package/dist/elements/dialog.d.ts +9 -0
- package/dist/elements/dialog.js +1 -0
- package/dist/elements/divider.d.ts +8 -0
- package/dist/elements/drawer.d.ts +10 -0
- package/dist/elements/extended-fab.d.ts +16 -0
- package/dist/elements/extended-fab.js +4 -0
- package/dist/elements/fab-menu.d.ts +112 -0
- package/dist/elements/fab-menu.js +68 -0
- package/dist/elements/fab.d.ts +8 -0
- package/dist/elements/icon-button.d.ts +17 -1
- package/dist/elements/icon-button.js +6 -4
- package/dist/elements/index.d.ts +21 -1
- package/dist/elements/index.js +9 -0
- package/dist/elements/list.d.ts +9 -0
- package/dist/elements/loading-indicator.d.ts +8 -0
- package/dist/elements/menu.d.ts +9 -0
- package/dist/elements/navigation-rail.d.ts +11 -0
- package/dist/elements/navigation-rail.js +1 -0
- package/dist/elements/preupgrade.css +2 -0
- package/dist/elements/preupgrade.css.d.ts +1 -0
- package/dist/elements/preupgrade.d.ts +2 -0
- package/dist/elements/preupgrade.js +4 -0
- package/dist/elements/progress.d.ts +8 -0
- package/dist/elements/radios.d.ts +9 -0
- package/dist/elements/search.d.ts +10 -0
- package/dist/elements/select.d.ts +9 -0
- package/dist/elements/side-sheet.d.ts +9 -0
- package/dist/elements/side-sheet.js +1 -0
- package/dist/elements/slider.d.ts +9 -0
- package/dist/elements/snackbar.d.ts +8 -0
- package/dist/elements/split-button.d.ts +8 -0
- package/dist/elements/styles.d.ts +18 -0
- package/dist/elements/styles.js +41 -0
- package/dist/elements/switch.d.ts +10 -0
- package/dist/elements/switch.js +2 -2
- package/dist/elements/tabs.d.ts +9 -0
- package/dist/elements/textfield.d.ts +11 -1
- package/dist/elements/textfield.js +1 -6
- package/dist/elements/timepicker.d.ts +9 -0
- package/dist/elements/timepicker.js +5 -5
- package/dist/elements/toolbar.d.ts +103 -0
- package/dist/elements/toolbar.js +77 -0
- package/dist/elements/tooltip.d.ts +8 -0
- package/dist/elements/top-app-bar.d.ts +9 -0
- package/dist/elements/top-app-bar.js +1 -0
- package/dist/index.cjs +0 -0
- package/dist/package.json +16 -2
- package/dist/react/badge.d.ts +4 -0
- package/dist/react/badge.js +7 -0
- package/dist/react/bottom-app-bar.d.ts +4 -0
- package/dist/react/bottom-app-bar.js +7 -0
- package/dist/react/bottom-sheet.d.ts +4 -0
- package/dist/react/bottom-sheet.js +7 -0
- package/dist/react/button-group-item.d.ts +3 -0
- package/dist/react/button-group-item.js +6 -0
- package/dist/react/button-group.d.ts +7 -0
- package/dist/react/button-group.js +10 -0
- package/dist/react/button.d.ts +5 -0
- package/dist/react/button.js +8 -0
- package/dist/react/card.d.ts +4 -0
- package/dist/react/card.js +7 -0
- package/dist/react/carousel-item.d.ts +3 -0
- package/dist/react/carousel-item.js +6 -0
- package/dist/react/carousel.d.ts +4 -0
- package/dist/react/carousel.js +7 -0
- package/dist/react/checkbox.d.ts +4 -0
- package/dist/react/checkbox.js +7 -0
- package/dist/react/chip.d.ts +3 -0
- package/dist/react/chip.js +6 -0
- package/dist/react/chips.d.ts +4 -0
- package/dist/react/chips.js +7 -0
- package/dist/react/create.d.ts +11 -2
- package/dist/react/create.js +12 -2
- package/dist/react/datepicker.d.ts +4 -0
- package/dist/react/datepicker.js +7 -0
- package/dist/react/dialog.d.ts +4 -0
- package/dist/react/dialog.js +7 -0
- package/dist/react/divider.d.ts +4 -0
- package/dist/react/divider.js +7 -0
- package/dist/react/drawer-item.d.ts +3 -0
- package/dist/react/drawer-item.js +6 -0
- package/dist/react/drawer.d.ts +4 -0
- package/dist/react/drawer.js +7 -0
- package/dist/react/extended-fab.d.ts +4 -0
- package/dist/react/extended-fab.js +7 -0
- package/dist/react/fab-menu-item.d.ts +3 -0
- package/dist/react/fab-menu-item.js +6 -0
- package/dist/react/fab-menu.d.ts +6 -0
- package/dist/react/fab-menu.js +9 -0
- package/dist/react/fab.d.ts +4 -0
- package/dist/react/fab.js +7 -0
- package/dist/react/icon-button.d.ts +4 -0
- package/dist/react/icon-button.js +7 -0
- package/dist/react/index.d.ts +48 -81
- package/dist/react/index.js +48 -81
- package/dist/react/jsx.d.ts +74 -0
- package/dist/react/jsx.js +2 -0
- package/dist/react/list-item.d.ts +3 -0
- package/dist/react/list-item.js +6 -0
- package/dist/react/list.d.ts +4 -0
- package/dist/react/list.js +7 -0
- package/dist/react/loading-indicator.d.ts +4 -0
- package/dist/react/loading-indicator.js +7 -0
- package/dist/react/menu-item.d.ts +3 -0
- package/dist/react/menu-item.js +6 -0
- package/dist/react/menu.d.ts +4 -0
- package/dist/react/menu.js +7 -0
- package/dist/react/navigation-rail-item.d.ts +3 -0
- package/dist/react/navigation-rail-item.js +6 -0
- package/dist/react/navigation-rail.d.ts +4 -0
- package/dist/react/navigation-rail.js +7 -0
- package/dist/react/progress.d.ts +4 -0
- package/dist/react/progress.js +7 -0
- package/dist/react/radio.d.ts +3 -0
- package/dist/react/radio.js +6 -0
- package/dist/react/radios.d.ts +4 -0
- package/dist/react/radios.js +7 -0
- package/dist/react/search-suggestion.d.ts +3 -0
- package/dist/react/search-suggestion.js +6 -0
- package/dist/react/search.d.ts +4 -0
- package/dist/react/search.js +7 -0
- package/dist/react/select-option.d.ts +3 -0
- package/dist/react/select-option.js +6 -0
- package/dist/react/select.d.ts +6 -0
- package/dist/react/select.js +9 -0
- package/dist/react/side-sheet.d.ts +4 -0
- package/dist/react/side-sheet.js +7 -0
- package/dist/react/slider.d.ts +4 -0
- package/dist/react/slider.js +7 -0
- package/dist/react/snackbar.d.ts +7 -0
- package/dist/react/snackbar.js +10 -0
- package/dist/react/split-button.d.ts +7 -0
- package/dist/react/split-button.js +10 -0
- package/dist/react/switch.d.ts +4 -0
- package/dist/react/switch.js +7 -0
- package/dist/react/tab.d.ts +3 -0
- package/dist/react/tab.js +6 -0
- package/dist/react/tabs.d.ts +7 -0
- package/dist/react/tabs.js +10 -0
- package/dist/react/textfield.d.ts +4 -0
- package/dist/react/textfield.js +7 -0
- package/dist/react/timepicker.d.ts +4 -0
- package/dist/react/timepicker.js +7 -0
- package/dist/react/toolbar.d.ts +5 -0
- package/dist/react/toolbar.js +8 -0
- package/dist/react/tooltip.d.ts +4 -0
- package/dist/react/tooltip.js +7 -0
- package/dist/react/top-app-bar.d.ts +4 -0
- package/dist/react/top-app-bar.js +7 -0
- package/dist/solid/badge.d.ts +4 -0
- package/dist/solid/badge.js +6 -0
- package/dist/solid/bottom-app-bar.d.ts +4 -0
- package/dist/solid/bottom-app-bar.js +6 -0
- package/dist/solid/bottom-sheet.d.ts +4 -0
- package/dist/solid/bottom-sheet.js +6 -0
- package/dist/solid/button-group-item.d.ts +3 -0
- package/dist/solid/button-group-item.js +5 -0
- package/dist/solid/button-group.d.ts +7 -0
- package/dist/solid/button-group.js +9 -0
- package/dist/solid/button.d.ts +5 -0
- package/dist/solid/button.js +7 -0
- package/dist/solid/card.d.ts +4 -0
- package/dist/solid/card.js +6 -0
- package/dist/solid/carousel-item.d.ts +3 -0
- package/dist/solid/carousel-item.js +5 -0
- package/dist/solid/carousel.d.ts +4 -0
- package/dist/solid/carousel.js +6 -0
- package/dist/solid/checkbox.d.ts +4 -0
- package/dist/solid/checkbox.js +6 -0
- package/dist/solid/chip.d.ts +3 -0
- package/dist/solid/chip.js +5 -0
- package/dist/solid/chips.d.ts +4 -0
- package/dist/solid/chips.js +6 -0
- package/dist/solid/create.d.ts +11 -2
- package/dist/solid/create.js +22 -4
- package/dist/solid/datepicker.d.ts +4 -0
- package/dist/solid/datepicker.js +6 -0
- package/dist/solid/dialog.d.ts +4 -0
- package/dist/solid/dialog.js +6 -0
- package/dist/solid/divider.d.ts +4 -0
- package/dist/solid/divider.js +6 -0
- package/dist/solid/drawer-item.d.ts +3 -0
- package/dist/solid/drawer-item.js +5 -0
- package/dist/solid/drawer.d.ts +4 -0
- package/dist/solid/drawer.js +6 -0
- package/dist/solid/extended-fab.d.ts +4 -0
- package/dist/solid/extended-fab.js +6 -0
- package/dist/solid/fab-menu-item.d.ts +3 -0
- package/dist/solid/fab-menu-item.js +5 -0
- package/dist/solid/fab-menu.d.ts +6 -0
- package/dist/solid/fab-menu.js +8 -0
- package/dist/solid/fab.d.ts +4 -0
- package/dist/solid/fab.js +6 -0
- package/dist/solid/icon-button.d.ts +4 -0
- package/dist/solid/icon-button.js +6 -0
- package/dist/solid/index.d.ts +48 -81
- package/dist/solid/index.js +48 -81
- package/dist/solid/jsx.d.ts +96 -0
- package/dist/solid/jsx.js +1 -0
- package/dist/solid/list-item.d.ts +3 -0
- package/dist/solid/list-item.js +5 -0
- package/dist/solid/list.d.ts +4 -0
- package/dist/solid/list.js +6 -0
- package/dist/solid/loading-indicator.d.ts +4 -0
- package/dist/solid/loading-indicator.js +6 -0
- package/dist/solid/menu-item.d.ts +3 -0
- package/dist/solid/menu-item.js +5 -0
- package/dist/solid/menu.d.ts +4 -0
- package/dist/solid/menu.js +6 -0
- package/dist/solid/navigation-rail-item.d.ts +3 -0
- package/dist/solid/navigation-rail-item.js +5 -0
- package/dist/solid/navigation-rail.d.ts +4 -0
- package/dist/solid/navigation-rail.js +6 -0
- package/dist/solid/progress.d.ts +4 -0
- package/dist/solid/progress.js +6 -0
- package/dist/solid/radio.d.ts +3 -0
- package/dist/solid/radio.js +5 -0
- package/dist/solid/radios.d.ts +4 -0
- package/dist/solid/radios.js +6 -0
- package/dist/solid/search-suggestion.d.ts +3 -0
- package/dist/solid/search-suggestion.js +5 -0
- package/dist/solid/search.d.ts +4 -0
- package/dist/solid/search.js +6 -0
- package/dist/solid/select-option.d.ts +3 -0
- package/dist/solid/select-option.js +5 -0
- package/dist/solid/select.d.ts +6 -0
- package/dist/solid/select.js +8 -0
- package/dist/solid/side-sheet.d.ts +4 -0
- package/dist/solid/side-sheet.js +6 -0
- package/dist/solid/slider.d.ts +4 -0
- package/dist/solid/slider.js +6 -0
- package/dist/solid/snackbar.d.ts +7 -0
- package/dist/solid/snackbar.js +9 -0
- package/dist/solid/split-button.d.ts +7 -0
- package/dist/solid/split-button.js +9 -0
- package/dist/solid/switch.d.ts +4 -0
- package/dist/solid/switch.js +6 -0
- package/dist/solid/tab.d.ts +3 -0
- package/dist/solid/tab.js +5 -0
- package/dist/solid/tabs.d.ts +7 -0
- package/dist/solid/tabs.js +9 -0
- package/dist/solid/textfield.d.ts +4 -0
- package/dist/solid/textfield.js +6 -0
- package/dist/solid/timepicker.d.ts +4 -0
- package/dist/solid/timepicker.js +6 -0
- package/dist/solid/toolbar.d.ts +5 -0
- package/dist/solid/toolbar.js +7 -0
- package/dist/solid/tooltip.d.ts +4 -0
- package/dist/solid/tooltip.js +6 -0
- package/dist/solid/top-app-bar.d.ts +4 -0
- package/dist/solid/top-app-bar.js +6 -0
- package/dist/styles/badge.css +2 -2
- package/dist/styles/base.css +2 -2
- package/dist/styles/bottom-app-bar.css +2 -2
- package/dist/styles/bottom-sheet.css +2 -2
- package/dist/styles/button-group.css +2 -2
- package/dist/styles/button.css +2 -2
- package/dist/styles/card.css +2 -2
- package/dist/styles/carousel.css +2 -2
- package/dist/styles/checkbox.css +2 -2
- package/dist/styles/chips.css +2 -2
- package/dist/styles/datepicker.css +2 -2
- package/dist/styles/dialog.css +2 -2
- package/dist/styles/divider.css +2 -2
- package/dist/styles/drawer.css +2 -2
- package/dist/styles/extended-fab.css +2 -2
- package/dist/styles/fab-menu.css +2 -0
- package/dist/styles/fab-menu.d.ts +1 -0
- package/dist/styles/fab-menu.js +3 -0
- package/dist/styles/fab.css +2 -2
- package/dist/styles/icon-button.css +2 -2
- package/dist/styles/list.css +2 -2
- package/dist/styles/loading-indicator.css +2 -2
- package/dist/styles/menu.css +2 -2
- package/dist/styles/navigation-rail.css +2 -2
- package/dist/styles/progress.css +2 -2
- package/dist/styles/radios.css +2 -2
- package/dist/styles/search.css +2 -2
- package/dist/styles/segmented-button.css +2 -2
- package/dist/styles/select.css +2 -2
- package/dist/styles/side-sheet.css +2 -2
- package/dist/styles/slider.css +2 -2
- package/dist/styles/snackbar.css +2 -2
- package/dist/styles/split-button.css +2 -2
- package/dist/styles/switch.css +2 -2
- package/dist/styles/tabs.css +2 -2
- package/dist/styles/textfield.css +2 -2
- package/dist/styles/timepicker.css +2 -2
- package/dist/styles/toolbar.css +2 -0
- package/dist/styles/toolbar.d.ts +1 -0
- package/dist/styles/toolbar.js +3 -0
- package/dist/styles/tooltip.css +2 -2
- package/dist/styles/top-app-bar.css +2 -2
- package/dist/styles/utilities.css +2 -2
- package/dist/styles.css +2 -2
- package/dist/svelte/Badge.svelte +7 -2
- package/dist/svelte/Badge.svelte.d.ts +2 -2
- package/dist/svelte/BottomAppBar.svelte +7 -2
- package/dist/svelte/BottomAppBar.svelte.d.ts +2 -2
- package/dist/svelte/BottomSheet.svelte +7 -2
- package/dist/svelte/BottomSheet.svelte.d.ts +2 -2
- package/dist/svelte/Button.svelte +8 -2
- package/dist/svelte/Button.svelte.d.ts +2 -2
- package/dist/svelte/ButtonGroup.svelte +10 -2
- package/dist/svelte/ButtonGroup.svelte.d.ts +2 -2
- package/dist/svelte/ButtonGroupItem.svelte +1 -1
- package/dist/svelte/Card.svelte +7 -2
- package/dist/svelte/Card.svelte.d.ts +2 -2
- package/dist/svelte/Carousel.svelte +7 -2
- package/dist/svelte/Carousel.svelte.d.ts +2 -2
- package/dist/svelte/CarouselItem.svelte +1 -1
- package/dist/svelte/Checkbox.svelte +7 -2
- package/dist/svelte/Checkbox.svelte.d.ts +2 -2
- package/dist/svelte/Chip.svelte +1 -1
- package/dist/svelte/Chips.svelte +7 -2
- package/dist/svelte/Chips.svelte.d.ts +2 -2
- package/dist/svelte/Datepicker.svelte +7 -2
- package/dist/svelte/Datepicker.svelte.d.ts +2 -2
- package/dist/svelte/Dialog.svelte +7 -2
- package/dist/svelte/Dialog.svelte.d.ts +2 -2
- package/dist/svelte/Divider.svelte +7 -2
- package/dist/svelte/Divider.svelte.d.ts +2 -2
- package/dist/svelte/Drawer.svelte +7 -2
- package/dist/svelte/Drawer.svelte.d.ts +2 -2
- package/dist/svelte/DrawerItem.svelte +1 -1
- package/dist/svelte/ExtendedFab.svelte +7 -2
- package/dist/svelte/ExtendedFab.svelte.d.ts +2 -2
- package/dist/svelte/Fab.svelte +7 -2
- package/dist/svelte/Fab.svelte.d.ts +2 -2
- package/dist/svelte/FabMenu.svelte +26 -0
- package/dist/svelte/FabMenu.svelte.d.ts +5 -0
- package/dist/svelte/FabMenuItem.svelte +11 -0
- package/dist/svelte/FabMenuItem.svelte.d.ts +5 -0
- package/dist/svelte/IconButton.svelte +7 -2
- package/dist/svelte/IconButton.svelte.d.ts +2 -2
- package/dist/svelte/List.svelte +7 -2
- package/dist/svelte/List.svelte.d.ts +2 -2
- package/dist/svelte/ListItem.svelte +1 -1
- package/dist/svelte/LoadingIndicator.svelte +7 -2
- package/dist/svelte/LoadingIndicator.svelte.d.ts +2 -2
- package/dist/svelte/Menu.svelte +7 -2
- package/dist/svelte/Menu.svelte.d.ts +2 -2
- package/dist/svelte/MenuItem.svelte +1 -1
- package/dist/svelte/NavigationRail.svelte +7 -2
- package/dist/svelte/NavigationRail.svelte.d.ts +2 -2
- package/dist/svelte/NavigationRailItem.svelte +1 -1
- package/dist/svelte/Progress.svelte +7 -2
- package/dist/svelte/Progress.svelte.d.ts +2 -2
- package/dist/svelte/Radio.svelte +1 -1
- package/dist/svelte/Radios.svelte +7 -2
- package/dist/svelte/Radios.svelte.d.ts +2 -2
- package/dist/svelte/Search.svelte +7 -2
- package/dist/svelte/Search.svelte.d.ts +2 -2
- package/dist/svelte/SearchSuggestion.svelte +1 -1
- package/dist/svelte/Select.svelte +9 -2
- package/dist/svelte/Select.svelte.d.ts +2 -2
- package/dist/svelte/SelectOption.svelte +1 -1
- package/dist/svelte/SideSheet.svelte +7 -2
- package/dist/svelte/SideSheet.svelte.d.ts +2 -2
- package/dist/svelte/Slider.svelte +7 -2
- package/dist/svelte/Slider.svelte.d.ts +2 -2
- package/dist/svelte/Snackbar.svelte +10 -2
- package/dist/svelte/Snackbar.svelte.d.ts +2 -2
- package/dist/svelte/SplitButton.svelte +10 -2
- package/dist/svelte/SplitButton.svelte.d.ts +2 -2
- package/dist/svelte/Switch.svelte +7 -2
- package/dist/svelte/Switch.svelte.d.ts +2 -2
- package/dist/svelte/Tab.svelte +1 -1
- package/dist/svelte/Tabs.svelte +10 -2
- package/dist/svelte/Tabs.svelte.d.ts +2 -2
- package/dist/svelte/Textfield.svelte +7 -2
- package/dist/svelte/Textfield.svelte.d.ts +2 -2
- package/dist/svelte/Timepicker.svelte +7 -2
- package/dist/svelte/Timepicker.svelte.d.ts +2 -2
- package/dist/svelte/Toolbar.svelte +25 -0
- package/dist/svelte/Toolbar.svelte.d.ts +5 -0
- package/dist/svelte/Tooltip.svelte +7 -2
- package/dist/svelte/Tooltip.svelte.d.ts +2 -2
- package/dist/svelte/TopAppBar.svelte +7 -2
- package/dist/svelte/TopAppBar.svelte.d.ts +2 -2
- package/dist/svelte/index.d.ts +3 -0
- package/dist/svelte/index.js +3 -34
- package/dist/svelte/runtime.d.ts +12 -2
- package/dist/svelte/runtime.js +11 -2
- package/dist/themes/autumn.css +2 -2
- package/dist/themes/baseline.css +2 -2
- package/dist/themes/brownbeige.css +2 -2
- package/dist/themes/browngreen.css +2 -2
- package/dist/themes/content.css +2 -0
- package/dist/themes/desert.css +2 -2
- package/dist/themes/expressive.css +2 -0
- package/dist/themes/fidelity.css +2 -0
- package/dist/themes/forest.css +2 -2
- package/dist/themes/fruit-salad.css +2 -0
- package/dist/themes/highcontrast.css +2 -2
- package/dist/themes/legacy.css +2 -2
- package/dist/themes/material.css +2 -2
- package/dist/themes/monochrome.css +2 -0
- package/dist/themes/neutral.css +2 -0
- package/dist/themes/ocean.css +2 -2
- package/dist/themes/rainbow.css +2 -0
- package/dist/themes/sageivory.css +2 -2
- package/dist/themes/spring.css +2 -2
- package/dist/themes/summer.css +2 -2
- package/dist/themes/sunset.css +2 -2
- package/dist/themes/tealcaramel.css +2 -2
- package/dist/themes/vibrant.css +2 -0
- package/dist/themes/winter.css +2 -2
- package/dist/vue/badge.d.ts +4 -0
- package/dist/vue/badge.js +6 -0
- package/dist/vue/bottom-app-bar.d.ts +4 -0
- package/dist/vue/bottom-app-bar.js +6 -0
- package/dist/vue/bottom-sheet.d.ts +4 -0
- package/dist/vue/bottom-sheet.js +6 -0
- package/dist/vue/button-group-item.d.ts +3 -0
- package/dist/vue/button-group-item.js +5 -0
- package/dist/vue/button-group.d.ts +7 -0
- package/dist/vue/button-group.js +9 -0
- package/dist/vue/button.d.ts +5 -0
- package/dist/vue/button.js +7 -0
- package/dist/vue/card.d.ts +4 -0
- package/dist/vue/card.js +6 -0
- package/dist/vue/carousel-item.d.ts +3 -0
- package/dist/vue/carousel-item.js +5 -0
- package/dist/vue/carousel.d.ts +4 -0
- package/dist/vue/carousel.js +6 -0
- package/dist/vue/checkbox.d.ts +4 -0
- package/dist/vue/checkbox.js +6 -0
- package/dist/vue/chip.d.ts +3 -0
- package/dist/vue/chip.js +5 -0
- package/dist/vue/chips.d.ts +4 -0
- package/dist/vue/chips.js +6 -0
- package/dist/vue/create.d.ts +9 -3
- package/dist/vue/create.js +15 -2
- package/dist/vue/datepicker.d.ts +4 -0
- package/dist/vue/datepicker.js +6 -0
- package/dist/vue/dialog.d.ts +4 -0
- package/dist/vue/dialog.js +6 -0
- package/dist/vue/divider.d.ts +4 -0
- package/dist/vue/divider.js +6 -0
- package/dist/vue/drawer-item.d.ts +3 -0
- package/dist/vue/drawer-item.js +5 -0
- package/dist/vue/drawer.d.ts +4 -0
- package/dist/vue/drawer.js +6 -0
- package/dist/vue/extended-fab.d.ts +4 -0
- package/dist/vue/extended-fab.js +6 -0
- package/dist/vue/fab-menu-item.d.ts +3 -0
- package/dist/vue/fab-menu-item.js +5 -0
- package/dist/vue/fab-menu.d.ts +6 -0
- package/dist/vue/fab-menu.js +8 -0
- package/dist/vue/fab.d.ts +4 -0
- package/dist/vue/fab.js +6 -0
- package/dist/vue/icon-button.d.ts +4 -0
- package/dist/vue/icon-button.js +6 -0
- package/dist/vue/index.d.ts +49 -82
- package/dist/vue/index.js +48 -81
- package/dist/vue/list-item.d.ts +3 -0
- package/dist/vue/list-item.js +5 -0
- package/dist/vue/list.d.ts +4 -0
- package/dist/vue/list.js +6 -0
- package/dist/vue/loading-indicator.d.ts +4 -0
- package/dist/vue/loading-indicator.js +6 -0
- package/dist/vue/menu-item.d.ts +3 -0
- package/dist/vue/menu-item.js +5 -0
- package/dist/vue/menu.d.ts +4 -0
- package/dist/vue/menu.js +6 -0
- package/dist/vue/navigation-rail-item.d.ts +3 -0
- package/dist/vue/navigation-rail-item.js +5 -0
- package/dist/vue/navigation-rail.d.ts +4 -0
- package/dist/vue/navigation-rail.js +6 -0
- package/dist/vue/progress.d.ts +4 -0
- package/dist/vue/progress.js +6 -0
- package/dist/vue/radio.d.ts +3 -0
- package/dist/vue/radio.js +5 -0
- package/dist/vue/radios.d.ts +4 -0
- package/dist/vue/radios.js +6 -0
- package/dist/vue/search-suggestion.d.ts +3 -0
- package/dist/vue/search-suggestion.js +5 -0
- package/dist/vue/search.d.ts +4 -0
- package/dist/vue/search.js +6 -0
- package/dist/vue/select-option.d.ts +3 -0
- package/dist/vue/select-option.js +5 -0
- package/dist/vue/select.d.ts +6 -0
- package/dist/vue/select.js +8 -0
- package/dist/vue/side-sheet.d.ts +4 -0
- package/dist/vue/side-sheet.js +6 -0
- package/dist/vue/slider.d.ts +4 -0
- package/dist/vue/slider.js +6 -0
- package/dist/vue/snackbar.d.ts +7 -0
- package/dist/vue/snackbar.js +9 -0
- package/dist/vue/split-button.d.ts +7 -0
- package/dist/vue/split-button.js +9 -0
- package/dist/vue/switch.d.ts +4 -0
- package/dist/vue/switch.js +6 -0
- package/dist/vue/tab.d.ts +3 -0
- package/dist/vue/tab.js +5 -0
- package/dist/vue/tabs.d.ts +7 -0
- package/dist/vue/tabs.js +9 -0
- package/dist/vue/textfield.d.ts +4 -0
- package/dist/vue/textfield.js +6 -0
- package/dist/vue/timepicker.d.ts +4 -0
- package/dist/vue/timepicker.js +6 -0
- package/dist/vue/toolbar.d.ts +5 -0
- package/dist/vue/toolbar.js +7 -0
- package/dist/vue/tooltip.d.ts +4 -0
- package/dist/vue/tooltip.js +6 -0
- package/dist/vue/top-app-bar.d.ts +4 -0
- package/dist/vue/top-app-bar.js +6 -0
- package/package.json +17 -46
- package/src/styles/abstract/_functions.scss +13 -1
- package/src/styles/abstract/_mixins.scss +16 -1
- package/src/styles/abstract/_theme.scss +4 -88
- package/src/styles/abstract/_variables.scss +42 -2
- package/src/styles/base/_tokens.scss +2 -13
- package/src/styles/base/_typography.scss +14 -70
- package/src/styles/components/_badge.scss +2 -2
- package/src/styles/components/_bottom-app-bar.scss +0 -4
- package/src/styles/components/_bottom-sheet.scss +26 -6
- package/src/styles/components/_button-group.scss +5 -2
- package/src/styles/components/_button.scss +29 -43
- package/src/styles/components/_card.scss +0 -2
- package/src/styles/components/_carousel.scss +2 -1
- package/src/styles/components/_datepicker.scss +4 -0
- package/src/styles/components/_divider.scss +1 -1
- package/src/styles/components/_drawer.scss +11 -11
- package/src/styles/components/_fab-menu.scss +242 -0
- package/src/styles/components/_icon-button.scss +18 -14
- package/src/styles/components/_list.scss +3 -2
- package/src/styles/components/_menu.scss +13 -2
- package/src/styles/components/_navigation-rail.scss +5 -4
- package/src/styles/components/_search.scss +2 -1
- package/src/styles/components/_select.scss +9 -89
- package/src/styles/components/_side-sheet.scss +7 -4
- package/src/styles/components/_slider.scss +2 -2
- package/src/styles/components/_split-button.scss +5 -5
- package/src/styles/components/_switch.scss +1 -1
- package/src/styles/components/_textfield.scss +144 -93
- package/src/styles/components/_toolbar.scss +203 -0
- package/src/styles/components/_tooltip.scss +20 -12
- package/src/styles/elements/_badge.scss +12 -0
- package/src/styles/elements/_bottom-app-bar.scss +27 -0
- package/src/styles/elements/_bottom-sheet.scss +6 -0
- package/src/styles/elements/_button-group.scss +25 -0
- package/src/styles/elements/_button.scss +78 -0
- package/src/styles/elements/_card.scss +57 -0
- package/src/styles/elements/_carousel.scss +12 -0
- package/src/styles/elements/_checkbox.scss +38 -0
- package/src/styles/elements/_chips.scss +33 -0
- package/src/styles/elements/_config.scss +48 -0
- package/src/styles/elements/_datepicker.scss +31 -0
- package/src/styles/elements/_dialog.scss +6 -0
- package/src/styles/elements/_divider.scss +19 -0
- package/src/styles/elements/_drawer.scss +23 -0
- package/src/styles/elements/_extended-fab.scss +57 -0
- package/src/styles/elements/_fab-menu.scss +43 -0
- package/src/styles/elements/_fab.scss +33 -0
- package/src/styles/elements/_field.scss +111 -0
- package/src/styles/elements/_icon-button.scss +55 -0
- package/src/styles/elements/_index.scss +41 -0
- package/src/styles/elements/_list.scss +34 -0
- package/src/styles/elements/_loading-indicator.scss +13 -0
- package/src/styles/elements/_menu.scss +6 -0
- package/src/styles/elements/_navigation-rail.scss +24 -0
- package/src/styles/elements/_progress.scss +24 -0
- package/src/styles/elements/_radios.scss +23 -0
- package/src/styles/elements/_search.scss +36 -0
- package/src/styles/elements/_select.scss +15 -0
- package/src/styles/elements/_side-sheet.scss +6 -0
- package/src/styles/elements/_slider.scss +10 -0
- package/src/styles/elements/_snackbar.scss +6 -0
- package/src/styles/elements/_split-button.scss +53 -0
- package/src/styles/elements/_switch.scss +51 -0
- package/src/styles/elements/_tabs.scss +22 -0
- package/src/styles/elements/_textfield.scss +9 -0
- package/src/styles/elements/_timepicker.scss +6 -0
- package/src/styles/elements/_toolbar.scss +47 -0
- package/src/styles/elements/_tooltip.scss +6 -0
- package/src/styles/elements/_top-app-bar.scss +57 -0
- package/src/styles/main.scss +2 -0
- package/src/styles/themes/_autumn.scss +18 -17
- package/src/styles/themes/_base-theme.scss +29 -39
- package/src/styles/themes/_baseline.scss +58 -83
- package/src/styles/themes/_brownbeige.scss +95 -123
- package/src/styles/themes/_browngreen.scss +1 -49
- package/src/styles/themes/_content.scss +108 -0
- package/src/styles/themes/_desert.scss +94 -80
- package/src/styles/themes/_expressive.scss +108 -0
- package/src/styles/themes/_fidelity.scss +108 -0
- package/src/styles/themes/_forest.scss +19 -3
- package/src/styles/themes/_fruit-salad.scss +108 -0
- package/src/styles/themes/_highcontrast.scss +91 -149
- package/src/styles/themes/_legacy.scss +1 -2
- package/src/styles/themes/_material.scss +1 -50
- package/src/styles/themes/_monochrome.scss +108 -0
- package/src/styles/themes/_neutral.scss +108 -0
- package/src/styles/themes/_ocean.scss +19 -3
- package/src/styles/themes/_rainbow.scss +108 -0
- package/src/styles/themes/_sageivory.scss +95 -125
- package/src/styles/themes/_spring.scss +19 -3
- package/src/styles/themes/_summer.scss +95 -87
- package/src/styles/themes/_sunset.scss +19 -3
- package/src/styles/themes/_tealcaramel.scss +94 -124
- package/src/styles/themes/_vibrant.scss +108 -0
- package/src/styles/themes/_winter.scss +1 -3
- package/src/styles/themes/_bluekhaki.scss +0 -136
- package/src/styles/themes/_greenbeige.scss +0 -138
package/README.md
CHANGED
|
@@ -1,15 +1,70 @@
|
|
|
1
1
|
# mtrl
|
|
2
2
|
|
|
3
|
-
Material Design 3 components for the web,
|
|
3
|
+
Material Design 3 components for the web: as plain JavaScript, as web components, and as React, Vue, Svelte and Solid components. Written in TypeScript, with zero dependencies.
|
|
4
4
|
|
|
5
|
-
mtrl implements the M3
|
|
5
|
+
mtrl implements the M3 Expressive update: component sizes, shapes, colours and spring motion follow the Material 3 tokens. One implementation serves every way of using it, so a button looks and behaves the same in each. The documentation site, [md3.io](https://md3.io), has a live playground and examples in every framework for each component.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Install
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install mtrl
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
+
React, Vue, Svelte and Solid are optional peer dependencies: mtrl uses the one your app has and installs none of them.
|
|
14
|
+
|
|
15
|
+
## Use it your way
|
|
16
|
+
|
|
17
|
+
| Way | Import from | Good for |
|
|
18
|
+
|-----|-------------|----------|
|
|
19
|
+
| Web components | `mtrl/elements` | Plain HTML, server templates, Angular, any framework |
|
|
20
|
+
| React | `mtrl/react` | React 18 and 19, Next.js |
|
|
21
|
+
| Vue | `mtrl/vue` | Vue 3, Nuxt |
|
|
22
|
+
| Svelte | `mtrl/svelte` | Svelte 5, SvelteKit |
|
|
23
|
+
| Solid | `mtrl/solid` | SolidJS, SolidStart |
|
|
24
|
+
| Vanilla factories | `mtrl` | The smallest bundles and full control |
|
|
25
|
+
|
|
26
|
+
Every app imports the base stylesheet once: the theme, the tokens and the ripple.
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import 'mtrl/styles/base';
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Web components**: register them once, then write HTML.
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<script type="module">
|
|
36
|
+
import 'mtrl/styles/base';
|
|
37
|
+
import 'mtrl/elements/css';
|
|
38
|
+
import { defineAll } from 'mtrl/elements';
|
|
39
|
+
defineAll();
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<form>
|
|
43
|
+
<m-textfield name="email" type="email" label="Email" required></m-textfield>
|
|
44
|
+
<m-switch name="news" checked>Newsletter</m-switch>
|
|
45
|
+
<m-button type="submit">Sign up</m-button>
|
|
46
|
+
</form>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**React** (Vue, Svelte and Solid work the same way, see [below](#react-vue-svelte-and-solid)):
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import 'mtrl/styles/base';
|
|
53
|
+
import { Button, Switch, Textfield } from 'mtrl/react';
|
|
54
|
+
|
|
55
|
+
export function Signup() {
|
|
56
|
+
return (
|
|
57
|
+
<form>
|
|
58
|
+
<Textfield name="email" type="email" label="Email" required />
|
|
59
|
+
<Switch name="news" defaultChecked>Newsletter</Switch>
|
|
60
|
+
<Button type="submit">Sign up</Button>
|
|
61
|
+
</form>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Vanilla**: each component is a function that returns a DOM element and a small API.
|
|
67
|
+
|
|
13
68
|
```typescript
|
|
14
69
|
import 'mtrl/styles';
|
|
15
70
|
import { createButton, createTextfield } from 'mtrl';
|
|
@@ -22,10 +77,7 @@ name.on('input', ({ value }: { value: string }) => {
|
|
|
22
77
|
if (value.trim()) save.disabled.enable();
|
|
23
78
|
else save.disabled.disable();
|
|
24
79
|
});
|
|
25
|
-
|
|
26
|
-
save.on('click', () => {
|
|
27
|
-
console.log('Saved', name.getValue());
|
|
28
|
-
});
|
|
80
|
+
save.on('click', () => console.log('Saved', name.getValue()));
|
|
29
81
|
|
|
30
82
|
document.body.append(name.element, save.element);
|
|
31
83
|
|
|
@@ -34,24 +86,25 @@ name.destroy();
|
|
|
34
86
|
save.destroy();
|
|
35
87
|
```
|
|
36
88
|
|
|
37
|
-
`mtrl/styles` loads every component
|
|
89
|
+
The factories are the fastest way to render hundreds of components at once, such as a long editable table; the elements style a shadow root each. `mtrl/styles` loads every component's styles; for a smaller bundle, import only what you use (see [Styles](#styles)).
|
|
38
90
|
|
|
39
91
|
## Components
|
|
40
92
|
|
|
41
|
-
Every component
|
|
93
|
+
Every component comes three ways: a factory (`createButton`), an element (`<m-button>`) and a framework component (`Button`; `MButton` in Vue).
|
|
42
94
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
95
|
+
| Group | Components |
|
|
96
|
+
|-------|------------|
|
|
97
|
+
| Actions | Button, Icon button, Button group, Split button, FAB, Extended FAB, FAB menu, Toolbar |
|
|
98
|
+
| Selection and input | Checkbox, Switch, Radio buttons, Chips, Slider, Text field, Select, Search, Date picker, Time picker |
|
|
99
|
+
| Navigation | Navigation rail, Drawer, Tabs, Menu, Top app bar, Bottom app bar |
|
|
100
|
+
| Containment | Card, Carousel, List, Divider, Dialog, Bottom sheet, Side sheet |
|
|
101
|
+
| Communication | Badge, Progress, Loading indicator, Snackbar, Tooltip |
|
|
49
102
|
|
|
50
|
-
|
|
103
|
+
The factories are exported from `mtrl`: `createButton`, `createIconButton`, `createButtonGroup`, `createSplitButton`, `createFab`, `createExtendedFab`, `createFabMenu`, `createToolbar`, `createCheckbox`, `createSwitch`, `createRadios`, `createChips` (with `createAssistChip`, `createFilterChip`, `createInputChip` and `createSuggestionChip`), `createSlider`, `createTextfield`, `createSelect`, `createSearch`, `createDatePicker`, `createTimePicker`, `createNavigationRail`, `createDrawer`, `createTabs` and `createTab`, `createMenu`, `createTopAppBar`, `createBottomAppBar`, `createCard` (with `createCardHeader`, `createCardContent`, `createCardMedia` and `createCardActions`), `createCarousel`, `createList`, `createDivider`, `createDialog`, `createBottomSheet`, `createSideSheet`, `createBadge`, `createProgress`, `createLoadingIndicator`, `createSnackbar` and `createTooltip`. Deprecated: `createSegmentedButton` and `createSegment`, replaced by `createButtonGroup` with `kind: 'connected'`.
|
|
51
104
|
|
|
52
105
|
## Styles
|
|
53
106
|
|
|
54
|
-
Import the full stylesheet once:
|
|
107
|
+
The web components and the framework components carry their own styles in their shadow roots; they need only the base stylesheet, `mtrl/styles/base`, for the theme and its tokens. The factories render in the page, so they use the page's stylesheets. Import the full stylesheet once:
|
|
55
108
|
|
|
56
109
|
```typescript
|
|
57
110
|
import 'mtrl/styles';
|
|
@@ -69,7 +122,7 @@ import 'mtrl/themes/ocean';
|
|
|
69
122
|
import 'mtrl/styles/utilities';
|
|
70
123
|
```
|
|
71
124
|
|
|
72
|
-
The base includes the baseline theme in light and dark, the tokens, a reset, typography and the ripple. Each selective entry imports what it depends on (the select brings the text field and the menu), so use a CSS-capable bundler to resolve and deduplicate them. Choose either the full stylesheet or selective imports, not both.
|
|
125
|
+
The base includes the baseline theme in light and dark, the tokens, a reset, typography and the ripple. Each selective entry imports what it depends on (the select brings the text field and the menu), so use a CSS-capable bundler to resolve and deduplicate them. Choose either the full stylesheet or selective imports, not both.
|
|
73
126
|
|
|
74
127
|
Library styles sit in ordered `mtrl` cascade layers, so unlayered application CSS overrides them without specificity battles.
|
|
75
128
|
|
|
@@ -86,7 +139,11 @@ document.documentElement.dataset.theme = 'ocean';
|
|
|
86
139
|
document.documentElement.dataset.themeMode = 'dark';
|
|
87
140
|
```
|
|
88
141
|
|
|
89
|
-
Available themes: `baseline`, `ocean`, `desert`, `forest`, `sunset`, `spring`, `summer`, `autumn`, `
|
|
142
|
+
Available themes: `baseline`, `ocean`, `desert`, `forest`, `sunset`, `spring`, `summer`, `autumn`, `brownbeige`, `sageivory`, `tealcaramel` and `highcontrast`. With selective styles, import the theme's entry, for example `mtrl/themes/ocean`.
|
|
143
|
+
|
|
144
|
+
M3's scheme variants, generated from the baseline seed, ship as their own entries only (not in the full stylesheet): `neutral`, `vibrant`, `expressive`, `fidelity`, `content`, `monochrome`, `rainbow` and `fruit-salad`, for example `mtrl/themes/vibrant`. `schemeToTokens` (`mtrl/core/theme`) turns any M3 scheme's role colours into these tokens.
|
|
145
|
+
|
|
146
|
+
Deprecated, removed in 1.0: `material` (use `baseline`), `winter` (use `ocean`), `browngreen` (use `brownbeige`) and `legacy`.
|
|
90
147
|
|
|
91
148
|
### Custom properties
|
|
92
149
|
|
|
@@ -99,7 +156,7 @@ Components read the theme's colour roles, so overriding a role restyles every co
|
|
|
99
156
|
}
|
|
100
157
|
```
|
|
101
158
|
|
|
102
|
-
The type scale and
|
|
159
|
+
The type scale, the typefaces and the corner scale are custom properties too (`--mtrl-sys-typescale-*`, `--mtrl-ref-typeface-brand` and `--mtrl-ref-typeface-plain`, `--mtrl-sys-shape-corner-*`): setting a typeface or a corner step on `:root` restyles every component that uses it. Component hooks follow one convention, `--mtrl-<component>-<name>`:
|
|
103
160
|
|
|
104
161
|
```css
|
|
105
162
|
.brand-slider {
|
|
@@ -108,6 +165,44 @@ The type scale and shape scale are custom properties too (`--mtrl-sys-typescale-
|
|
|
108
165
|
}
|
|
109
166
|
```
|
|
110
167
|
|
|
168
|
+
## Web components
|
|
169
|
+
|
|
170
|
+
Overlays open in the browser's top layer (`showModal()` or `popover`) from inside their own shadow root, so they keep their styles, trap focus and make the page inert where M3 says so. Form controls are form-associated: `name`, the form value, reset, validation, `<label for>` and back-navigation restore work as on native controls.
|
|
171
|
+
|
|
172
|
+
Declaration children describe a component's items, as native `<select>` and `<option>` do:
|
|
173
|
+
|
|
174
|
+
```html
|
|
175
|
+
<m-tabs value="songs">
|
|
176
|
+
<m-tab value="songs">Songs</m-tab>
|
|
177
|
+
<m-tab value="albums">Albums</m-tab>
|
|
178
|
+
</m-tabs>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
The page still loads mtrl's base styles and a theme (see [Styles](#styles)); the elements render in shadow DOM and pick up the theme's tokens. Attributes are defaults and properties the live state, as on native controls: a `checked` or `value` attribute sets the state until the user or a script changes it, and `form.reset()` goes back to it. Form controls take part in forms (their host's `name`), reset, validation and back-navigation restore.
|
|
182
|
+
|
|
183
|
+
A server-rendered page sends each element as its tag and light DOM; the element takes its real look once its script defines it. So that nothing moves meanwhile, put the pre-upgrade stylesheet in `<head>`: it gives every element not defined yet the box it will have (and its label the final type style), hides what it declares (`<m-tab>`, `<m-menu-item>`, …) and overlays. Its rules match only `:not(:defined)`, in the `mtrl.preupgrade` cascade layer.
|
|
184
|
+
|
|
185
|
+
```html
|
|
186
|
+
<link rel="stylesheet" href="/node_modules/mtrl/dist/elements/preupgrade.css">
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
With another tag prefix, `preupgradeStyles('x')` from `mtrl/elements/preupgrade` returns the same stylesheet for `<x-*>`, to inline on the server. The CSS modules (`mtrl/elements/css`) also apply these rules until the elements are defined, for the default prefix and the one given to `configure()` or `define()`.
|
|
190
|
+
|
|
191
|
+
## React, Vue, Svelte and Solid
|
|
192
|
+
|
|
193
|
+
The framework components render the elements, so everything above holds: forms, the top layer, the styling. `mtrl/react`, `mtrl/vue`, `mtrl/svelte` and `mtrl/solid` load the elements' CSS and register each element the first time it mounts.
|
|
194
|
+
|
|
195
|
+
| Framework | Import | Two-way binding |
|
|
196
|
+
|-----------|--------|-----------------|
|
|
197
|
+
| React 18 and 19 | `import { Switch } from 'mtrl/react'` | `checked` + `onChange`, or `defaultChecked` |
|
|
198
|
+
| Vue 3 | `import { MSwitch } from 'mtrl/vue'` | `v-model` |
|
|
199
|
+
| Svelte 5 | `import { Switch } from 'mtrl/svelte'` | `bind:checked` |
|
|
200
|
+
| Solid | `import { Switch } from 'mtrl/solid'` | `checked` + `onChange` |
|
|
201
|
+
|
|
202
|
+
Each framework is an optional peer dependency; mtrl installs none of them. All adapters render on the server and hydrate. Angular apps use the elements directly, with `CUSTOM_ELEMENTS_SCHEMA`.
|
|
203
|
+
|
|
204
|
+
Each framework has a guide on [md3.io](https://md3.io/docs/): props and events, controlled and uncontrolled state, named slots, refs and server rendering.
|
|
205
|
+
|
|
111
206
|
## Imports and tree-shaking
|
|
112
207
|
|
|
113
208
|
mtrl publishes ESM with type declarations, so bundlers drop unused exports and split dynamic imports. CommonJS remains available through `require('mtrl')`.
|
|
@@ -132,57 +227,7 @@ const button = createButton({
|
|
|
132
227
|
});
|
|
133
228
|
```
|
|
134
229
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
## Web components and frameworks (experimental)
|
|
138
|
-
|
|
139
|
-
From the 0.10.0 prereleases (`npm install mtrl@next`), every component also ships as a custom element, with thin adapters for React, Vue, Svelte and Solid. The API may still change before 1.0.
|
|
140
|
-
|
|
141
|
-
| Kind | Elements | Framework components (Vue: `M` prefix, e.g. `MDialog`) |
|
|
142
|
-
|------|----------|--------------------------------------------------------|
|
|
143
|
-
| Actions | `<m-button>`, `<m-icon-button>`, `<m-fab>`, `<m-extended-fab>`, `<m-split-button>`, `<m-button-group>` + `<m-button-group-item>` | `Button`, `IconButton`, `Fab`, `ExtendedFab`, `SplitButton`, `ButtonGroup`, `ButtonGroupItem` |
|
|
144
|
-
| Form controls | `<m-checkbox>`, `<m-switch>`, `<m-radios>` + `<m-radio>`, `<m-slider>`, `<m-textfield>`, `<m-select>` + `<m-select-option>`, `<m-search>` + `<m-search-suggestion>`, `<m-datepicker>`, `<m-timepicker>` | `Checkbox`, `Switch`, `Radios`, `Radio`, `Slider`, `Textfield`, `Select`, `SelectOption`, `Search`, `SearchSuggestion`, `Datepicker`, `Timepicker` |
|
|
145
|
-
| Selection | `<m-chips>` + `<m-chip>`, `<m-tabs>` + `<m-tab>`, `<m-list>` + `<m-list-item>` | `Chips`, `Chip`, `Tabs`, `Tab`, `List`, `ListItem` |
|
|
146
|
-
| Navigation | `<m-navigation-rail>` + `<m-navigation-rail-item>`, `<m-drawer>` + `<m-drawer-item>`, `<m-top-app-bar>`, `<m-bottom-app-bar>` | `NavigationRail`, `NavigationRailItem`, `Drawer`, `DrawerItem`, `TopAppBar`, `BottomAppBar` |
|
|
147
|
-
| Overlays (top layer) | `<m-menu>` + `<m-menu-item>`, `<m-dialog>`, `<m-bottom-sheet>`, `<m-side-sheet>`, `<m-tooltip>`, `<m-snackbar>` | `Menu`, `MenuItem`, `Dialog`, `BottomSheet`, `SideSheet`, `Tooltip`, `Snackbar` |
|
|
148
|
-
| Containment | `<m-card>`, `<m-carousel>` + `<m-carousel-item>` | `Card`, `Carousel`, `CarouselItem` |
|
|
149
|
-
| Indicators | `<m-progress>`, `<m-loading-indicator>`, `<m-badge>`, `<m-divider>` | `Progress`, `LoadingIndicator`, `Badge`, `Divider` |
|
|
150
|
-
|
|
151
|
-
Overlays open in the browser's top layer (`showModal()` or `popover`) from inside their own shadow root, so they keep their styles, trap focus and make the page inert where M3 says so. Form controls are form-associated: `name`, the form value, reset, validation, `<label for>` and back-navigation restore work as on native controls.
|
|
152
|
-
|
|
153
|
-
```html
|
|
154
|
-
<script type="module">
|
|
155
|
-
import 'mtrl/elements/css'; // the elements' styles
|
|
156
|
-
import { defineAll } from 'mtrl/elements';
|
|
157
|
-
defineAll(); // registers every element (<m-button>, <m-switch>, …)
|
|
158
|
-
</script>
|
|
159
|
-
|
|
160
|
-
<form>
|
|
161
|
-
<m-textfield name="email" type="email" label="Email" required></m-textfield>
|
|
162
|
-
<m-radios name="plan" value="free" aria-label="Plan">
|
|
163
|
-
<m-radio value="free">Free</m-radio>
|
|
164
|
-
<m-radio value="pro">Pro</m-radio>
|
|
165
|
-
</m-radios>
|
|
166
|
-
<m-switch name="news" checked>Newsletter</m-switch>
|
|
167
|
-
<m-button type="submit">Sign up</m-button>
|
|
168
|
-
</form>
|
|
169
|
-
|
|
170
|
-
<m-tabs value="songs">
|
|
171
|
-
<m-tab value="songs">Songs</m-tab>
|
|
172
|
-
<m-tab value="albums">Albums</m-tab>
|
|
173
|
-
</m-tabs>
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
The page still loads mtrl's base styles and a theme (see [Styles](#styles)); the elements render in shadow DOM and pick up the theme's tokens. Attributes are defaults and properties the live state, as on native controls: a `checked` or `value` attribute sets the state until the user or a script changes it, and `form.reset()` goes back to it. Form controls take part in forms (their host's `name`), reset, validation and back-navigation restore.
|
|
177
|
-
|
|
178
|
-
| Framework | Import | Two-way binding |
|
|
179
|
-
|-----------|--------|-----------------|
|
|
180
|
-
| React 18 and 19 | `import { Switch } from 'mtrl/react'` | `checked` + `onChange`, or `defaultChecked` |
|
|
181
|
-
| Vue 3 | `import { MSwitch } from 'mtrl/vue'` | `v-model` |
|
|
182
|
-
| Svelte 5 | `import { Switch } from 'mtrl/svelte'` | `bind:checked` |
|
|
183
|
-
| Solid | `import { Switch } from 'mtrl/solid'` | `checked` + `onChange` |
|
|
184
|
-
|
|
185
|
-
Each framework is an optional peer dependency; mtrl installs none of them. All adapters render on the server and hydrate. Angular apps use the elements directly, with `CUSTOM_ELEMENTS_SCHEMA`.
|
|
230
|
+
Some parts load on demand: a button's progress indicator, a card's action buttons, a menu's submenus and the FAB menu's desktop menu. Enable code splitting in your build to keep them out of the initial chunk.
|
|
186
231
|
|
|
187
232
|
## Building your own components
|
|
188
233
|
|
|
@@ -190,17 +235,8 @@ Components are composed from small features with `pipe`. The same building block
|
|
|
190
235
|
|
|
191
236
|
```typescript
|
|
192
237
|
import { pipe, createBase, withEvents, withElement } from 'mtrl/core/compose';
|
|
193
|
-
import type { ElementComponent } from 'mtrl/core/compose';
|
|
194
|
-
|
|
195
|
-
interface NoteConfig {
|
|
196
|
-
text?: string;
|
|
197
|
-
}
|
|
198
238
|
|
|
199
|
-
|
|
200
|
-
setText: (text: string) => NoteComponent;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const createNote = (config: NoteConfig): NoteComponent =>
|
|
239
|
+
const createNote = (config: { text?: string } = {}) =>
|
|
204
240
|
pipe(
|
|
205
241
|
createBase,
|
|
206
242
|
withEvents(),
|
|
@@ -209,10 +245,16 @@ const createNote = (config: NoteConfig): NoteComponent =>
|
|
|
209
245
|
...component,
|
|
210
246
|
setText(text: string) {
|
|
211
247
|
component.element.textContent = text;
|
|
212
|
-
return this;
|
|
213
248
|
},
|
|
214
249
|
})
|
|
215
250
|
)(config);
|
|
251
|
+
|
|
252
|
+
// The component's type is what the pipe builds
|
|
253
|
+
type NoteComponent = ReturnType<typeof createNote>;
|
|
254
|
+
|
|
255
|
+
const note: NoteComponent = createNote();
|
|
256
|
+
note.setText('Saved');
|
|
257
|
+
document.body.append(note.element);
|
|
216
258
|
```
|
|
217
259
|
|
|
218
260
|
The element gets the `mtrl-note` class, `withEvents` adds `on`, `off` and `emit`, and `destroy()` removes the element. Add `withLifecycle()` from `mtrl/core/compose/features` when features need to register cleanup.
|
|
@@ -237,6 +279,10 @@ configureHTML({ sanitize: (html) => policy.createHTML(html) });
|
|
|
237
279
|
|
|
238
280
|
The policy sees every string, the library's own icons included; a `TrustedHTML` value passed as an icon or content skips it. With no policy set, markup is written as it is. Text options (`text`, a card's `text`) never go through `innerHTML`.
|
|
239
281
|
|
|
282
|
+
## Upgrading from 0.9
|
|
283
|
+
|
|
284
|
+
0.10.0 adds the elements and framework components; for factory users, most apps need nothing. The changes to check are listed in the [0.10.0 changelog's migration section](CHANGELOG.md#migrating-from-09x): setters no longer emit `change`, the time picker's events pass `{ value }`, the `--mtrl-sys-color-*-rgb` properties are gone, disabled non-form roots use `aria-disabled`, cards are `article`s, and the text field's DOM gained a `__field` wrapper.
|
|
285
|
+
|
|
240
286
|
## Upgrading from 0.7
|
|
241
287
|
|
|
242
288
|
0.8.0 aligns the components with Material 3 expressive, and some of that changes the API or the styles:
|
|
@@ -252,11 +298,11 @@ The full list, with every renamed property, is in the [0.8.0 changelog](CHANGELO
|
|
|
252
298
|
|
|
253
299
|
## Browser support
|
|
254
300
|
|
|
255
|
-
Current Chrome, Edge, Firefox and Safari. The spring motion uses CSS `linear()` easing (Safari 17.2 or later); older browsers render every component but skip those transitions.
|
|
301
|
+
Current Chrome, Edge, Firefox and Safari. The spring motion uses CSS `linear()` easing (Safari 17.2 or later); older browsers render every component but skip those transitions. The elements use form-associated custom elements and the top layer (`popover` and `<dialog>`), both available in every current browser.
|
|
256
302
|
|
|
257
303
|
## Contributing
|
|
258
304
|
|
|
259
|
-
Contributions are welcome. [CONTRIBUTING.md](CONTRIBUTING.md) covers the development setup, conventions and the distribution checks
|
|
305
|
+
Contributions are welcome. [CONTRIBUTING.md](.github/CONTRIBUTING.md) covers the development setup, conventions and the distribution checks.
|
|
260
306
|
|
|
261
307
|
## License
|
|
262
308
|
|
package/dist/README.md
CHANGED
|
@@ -1,15 +1,70 @@
|
|
|
1
1
|
# mtrl
|
|
2
2
|
|
|
3
|
-
Material Design 3 components for the web,
|
|
3
|
+
Material Design 3 components for the web: as plain JavaScript, as web components, and as React, Vue, Svelte and Solid components. Written in TypeScript, with zero dependencies.
|
|
4
4
|
|
|
5
|
-
mtrl implements the M3
|
|
5
|
+
mtrl implements the M3 Expressive update: component sizes, shapes, colours and spring motion follow the Material 3 tokens. One implementation serves every way of using it, so a button looks and behaves the same in each. The documentation site, [md3.io](https://md3.io), has a live playground and examples in every framework for each component.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Install
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install mtrl
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
+
React, Vue, Svelte and Solid are optional peer dependencies: mtrl uses the one your app has and installs none of them.
|
|
14
|
+
|
|
15
|
+
## Use it your way
|
|
16
|
+
|
|
17
|
+
| Way | Import from | Good for |
|
|
18
|
+
|-----|-------------|----------|
|
|
19
|
+
| Web components | `mtrl/elements` | Plain HTML, server templates, Angular, any framework |
|
|
20
|
+
| React | `mtrl/react` | React 18 and 19, Next.js |
|
|
21
|
+
| Vue | `mtrl/vue` | Vue 3, Nuxt |
|
|
22
|
+
| Svelte | `mtrl/svelte` | Svelte 5, SvelteKit |
|
|
23
|
+
| Solid | `mtrl/solid` | SolidJS, SolidStart |
|
|
24
|
+
| Vanilla factories | `mtrl` | The smallest bundles and full control |
|
|
25
|
+
|
|
26
|
+
Every app imports the base stylesheet once: the theme, the tokens and the ripple.
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import 'mtrl/styles/base';
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Web components**: register them once, then write HTML.
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<script type="module">
|
|
36
|
+
import 'mtrl/styles/base';
|
|
37
|
+
import 'mtrl/elements/css';
|
|
38
|
+
import { defineAll } from 'mtrl/elements';
|
|
39
|
+
defineAll();
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<form>
|
|
43
|
+
<m-textfield name="email" type="email" label="Email" required></m-textfield>
|
|
44
|
+
<m-switch name="news" checked>Newsletter</m-switch>
|
|
45
|
+
<m-button type="submit">Sign up</m-button>
|
|
46
|
+
</form>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**React** (Vue, Svelte and Solid work the same way, see [below](#react-vue-svelte-and-solid)):
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import 'mtrl/styles/base';
|
|
53
|
+
import { Button, Switch, Textfield } from 'mtrl/react';
|
|
54
|
+
|
|
55
|
+
export function Signup() {
|
|
56
|
+
return (
|
|
57
|
+
<form>
|
|
58
|
+
<Textfield name="email" type="email" label="Email" required />
|
|
59
|
+
<Switch name="news" defaultChecked>Newsletter</Switch>
|
|
60
|
+
<Button type="submit">Sign up</Button>
|
|
61
|
+
</form>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Vanilla**: each component is a function that returns a DOM element and a small API.
|
|
67
|
+
|
|
13
68
|
```typescript
|
|
14
69
|
import 'mtrl/styles';
|
|
15
70
|
import { createButton, createTextfield } from 'mtrl';
|
|
@@ -22,10 +77,7 @@ name.on('input', ({ value }: { value: string }) => {
|
|
|
22
77
|
if (value.trim()) save.disabled.enable();
|
|
23
78
|
else save.disabled.disable();
|
|
24
79
|
});
|
|
25
|
-
|
|
26
|
-
save.on('click', () => {
|
|
27
|
-
console.log('Saved', name.getValue());
|
|
28
|
-
});
|
|
80
|
+
save.on('click', () => console.log('Saved', name.getValue()));
|
|
29
81
|
|
|
30
82
|
document.body.append(name.element, save.element);
|
|
31
83
|
|
|
@@ -34,24 +86,25 @@ name.destroy();
|
|
|
34
86
|
save.destroy();
|
|
35
87
|
```
|
|
36
88
|
|
|
37
|
-
`mtrl/styles` loads every component
|
|
89
|
+
The factories are the fastest way to render hundreds of components at once, such as a long editable table; the elements style a shadow root each. `mtrl/styles` loads every component's styles; for a smaller bundle, import only what you use (see [Styles](#styles)).
|
|
38
90
|
|
|
39
91
|
## Components
|
|
40
92
|
|
|
41
|
-
Every component
|
|
93
|
+
Every component comes three ways: a factory (`createButton`), an element (`<m-button>`) and a framework component (`Button`; `MButton` in Vue).
|
|
42
94
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
95
|
+
| Group | Components |
|
|
96
|
+
|-------|------------|
|
|
97
|
+
| Actions | Button, Icon button, Button group, Split button, FAB, Extended FAB, FAB menu, Toolbar |
|
|
98
|
+
| Selection and input | Checkbox, Switch, Radio buttons, Chips, Slider, Text field, Select, Search, Date picker, Time picker |
|
|
99
|
+
| Navigation | Navigation rail, Drawer, Tabs, Menu, Top app bar, Bottom app bar |
|
|
100
|
+
| Containment | Card, Carousel, List, Divider, Dialog, Bottom sheet, Side sheet |
|
|
101
|
+
| Communication | Badge, Progress, Loading indicator, Snackbar, Tooltip |
|
|
49
102
|
|
|
50
|
-
|
|
103
|
+
The factories are exported from `mtrl`: `createButton`, `createIconButton`, `createButtonGroup`, `createSplitButton`, `createFab`, `createExtendedFab`, `createFabMenu`, `createToolbar`, `createCheckbox`, `createSwitch`, `createRadios`, `createChips` (with `createAssistChip`, `createFilterChip`, `createInputChip` and `createSuggestionChip`), `createSlider`, `createTextfield`, `createSelect`, `createSearch`, `createDatePicker`, `createTimePicker`, `createNavigationRail`, `createDrawer`, `createTabs` and `createTab`, `createMenu`, `createTopAppBar`, `createBottomAppBar`, `createCard` (with `createCardHeader`, `createCardContent`, `createCardMedia` and `createCardActions`), `createCarousel`, `createList`, `createDivider`, `createDialog`, `createBottomSheet`, `createSideSheet`, `createBadge`, `createProgress`, `createLoadingIndicator`, `createSnackbar` and `createTooltip`. Deprecated: `createSegmentedButton` and `createSegment`, replaced by `createButtonGroup` with `kind: 'connected'`.
|
|
51
104
|
|
|
52
105
|
## Styles
|
|
53
106
|
|
|
54
|
-
Import the full stylesheet once:
|
|
107
|
+
The web components and the framework components carry their own styles in their shadow roots; they need only the base stylesheet, `mtrl/styles/base`, for the theme and its tokens. The factories render in the page, so they use the page's stylesheets. Import the full stylesheet once:
|
|
55
108
|
|
|
56
109
|
```typescript
|
|
57
110
|
import 'mtrl/styles';
|
|
@@ -69,7 +122,7 @@ import 'mtrl/themes/ocean';
|
|
|
69
122
|
import 'mtrl/styles/utilities';
|
|
70
123
|
```
|
|
71
124
|
|
|
72
|
-
The base includes the baseline theme in light and dark, the tokens, a reset, typography and the ripple. Each selective entry imports what it depends on (the select brings the text field and the menu), so use a CSS-capable bundler to resolve and deduplicate them. Choose either the full stylesheet or selective imports, not both.
|
|
125
|
+
The base includes the baseline theme in light and dark, the tokens, a reset, typography and the ripple. Each selective entry imports what it depends on (the select brings the text field and the menu), so use a CSS-capable bundler to resolve and deduplicate them. Choose either the full stylesheet or selective imports, not both.
|
|
73
126
|
|
|
74
127
|
Library styles sit in ordered `mtrl` cascade layers, so unlayered application CSS overrides them without specificity battles.
|
|
75
128
|
|
|
@@ -86,7 +139,11 @@ document.documentElement.dataset.theme = 'ocean';
|
|
|
86
139
|
document.documentElement.dataset.themeMode = 'dark';
|
|
87
140
|
```
|
|
88
141
|
|
|
89
|
-
Available themes: `baseline`, `ocean`, `desert`, `forest`, `sunset`, `spring`, `summer`, `autumn`, `
|
|
142
|
+
Available themes: `baseline`, `ocean`, `desert`, `forest`, `sunset`, `spring`, `summer`, `autumn`, `brownbeige`, `sageivory`, `tealcaramel` and `highcontrast`. With selective styles, import the theme's entry, for example `mtrl/themes/ocean`.
|
|
143
|
+
|
|
144
|
+
M3's scheme variants, generated from the baseline seed, ship as their own entries only (not in the full stylesheet): `neutral`, `vibrant`, `expressive`, `fidelity`, `content`, `monochrome`, `rainbow` and `fruit-salad`, for example `mtrl/themes/vibrant`. `schemeToTokens` (`mtrl/core/theme`) turns any M3 scheme's role colours into these tokens.
|
|
145
|
+
|
|
146
|
+
Deprecated, removed in 1.0: `material` (use `baseline`), `winter` (use `ocean`), `browngreen` (use `brownbeige`) and `legacy`.
|
|
90
147
|
|
|
91
148
|
### Custom properties
|
|
92
149
|
|
|
@@ -99,7 +156,7 @@ Components read the theme's colour roles, so overriding a role restyles every co
|
|
|
99
156
|
}
|
|
100
157
|
```
|
|
101
158
|
|
|
102
|
-
The type scale and
|
|
159
|
+
The type scale, the typefaces and the corner scale are custom properties too (`--mtrl-sys-typescale-*`, `--mtrl-ref-typeface-brand` and `--mtrl-ref-typeface-plain`, `--mtrl-sys-shape-corner-*`): setting a typeface or a corner step on `:root` restyles every component that uses it. Component hooks follow one convention, `--mtrl-<component>-<name>`:
|
|
103
160
|
|
|
104
161
|
```css
|
|
105
162
|
.brand-slider {
|
|
@@ -108,6 +165,44 @@ The type scale and shape scale are custom properties too (`--mtrl-sys-typescale-
|
|
|
108
165
|
}
|
|
109
166
|
```
|
|
110
167
|
|
|
168
|
+
## Web components
|
|
169
|
+
|
|
170
|
+
Overlays open in the browser's top layer (`showModal()` or `popover`) from inside their own shadow root, so they keep their styles, trap focus and make the page inert where M3 says so. Form controls are form-associated: `name`, the form value, reset, validation, `<label for>` and back-navigation restore work as on native controls.
|
|
171
|
+
|
|
172
|
+
Declaration children describe a component's items, as native `<select>` and `<option>` do:
|
|
173
|
+
|
|
174
|
+
```html
|
|
175
|
+
<m-tabs value="songs">
|
|
176
|
+
<m-tab value="songs">Songs</m-tab>
|
|
177
|
+
<m-tab value="albums">Albums</m-tab>
|
|
178
|
+
</m-tabs>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
The page still loads mtrl's base styles and a theme (see [Styles](#styles)); the elements render in shadow DOM and pick up the theme's tokens. Attributes are defaults and properties the live state, as on native controls: a `checked` or `value` attribute sets the state until the user or a script changes it, and `form.reset()` goes back to it. Form controls take part in forms (their host's `name`), reset, validation and back-navigation restore.
|
|
182
|
+
|
|
183
|
+
A server-rendered page sends each element as its tag and light DOM; the element takes its real look once its script defines it. So that nothing moves meanwhile, put the pre-upgrade stylesheet in `<head>`: it gives every element not defined yet the box it will have (and its label the final type style), hides what it declares (`<m-tab>`, `<m-menu-item>`, …) and overlays. Its rules match only `:not(:defined)`, in the `mtrl.preupgrade` cascade layer.
|
|
184
|
+
|
|
185
|
+
```html
|
|
186
|
+
<link rel="stylesheet" href="/node_modules/mtrl/dist/elements/preupgrade.css">
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
With another tag prefix, `preupgradeStyles('x')` from `mtrl/elements/preupgrade` returns the same stylesheet for `<x-*>`, to inline on the server. The CSS modules (`mtrl/elements/css`) also apply these rules until the elements are defined, for the default prefix and the one given to `configure()` or `define()`.
|
|
190
|
+
|
|
191
|
+
## React, Vue, Svelte and Solid
|
|
192
|
+
|
|
193
|
+
The framework components render the elements, so everything above holds: forms, the top layer, the styling. `mtrl/react`, `mtrl/vue`, `mtrl/svelte` and `mtrl/solid` load the elements' CSS and register each element the first time it mounts.
|
|
194
|
+
|
|
195
|
+
| Framework | Import | Two-way binding |
|
|
196
|
+
|-----------|--------|-----------------|
|
|
197
|
+
| React 18 and 19 | `import { Switch } from 'mtrl/react'` | `checked` + `onChange`, or `defaultChecked` |
|
|
198
|
+
| Vue 3 | `import { MSwitch } from 'mtrl/vue'` | `v-model` |
|
|
199
|
+
| Svelte 5 | `import { Switch } from 'mtrl/svelte'` | `bind:checked` |
|
|
200
|
+
| Solid | `import { Switch } from 'mtrl/solid'` | `checked` + `onChange` |
|
|
201
|
+
|
|
202
|
+
Each framework is an optional peer dependency; mtrl installs none of them. All adapters render on the server and hydrate. Angular apps use the elements directly, with `CUSTOM_ELEMENTS_SCHEMA`.
|
|
203
|
+
|
|
204
|
+
Each framework has a guide on [md3.io](https://md3.io/docs/): props and events, controlled and uncontrolled state, named slots, refs and server rendering.
|
|
205
|
+
|
|
111
206
|
## Imports and tree-shaking
|
|
112
207
|
|
|
113
208
|
mtrl publishes ESM with type declarations, so bundlers drop unused exports and split dynamic imports. CommonJS remains available through `require('mtrl')`.
|
|
@@ -132,57 +227,7 @@ const button = createButton({
|
|
|
132
227
|
});
|
|
133
228
|
```
|
|
134
229
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
## Web components and frameworks (experimental)
|
|
138
|
-
|
|
139
|
-
From the 0.10.0 prereleases (`npm install mtrl@next`), every component also ships as a custom element, with thin adapters for React, Vue, Svelte and Solid. The API may still change before 1.0.
|
|
140
|
-
|
|
141
|
-
| Kind | Elements | Framework components (Vue: `M` prefix, e.g. `MDialog`) |
|
|
142
|
-
|------|----------|--------------------------------------------------------|
|
|
143
|
-
| Actions | `<m-button>`, `<m-icon-button>`, `<m-fab>`, `<m-extended-fab>`, `<m-split-button>`, `<m-button-group>` + `<m-button-group-item>` | `Button`, `IconButton`, `Fab`, `ExtendedFab`, `SplitButton`, `ButtonGroup`, `ButtonGroupItem` |
|
|
144
|
-
| Form controls | `<m-checkbox>`, `<m-switch>`, `<m-radios>` + `<m-radio>`, `<m-slider>`, `<m-textfield>`, `<m-select>` + `<m-select-option>`, `<m-search>` + `<m-search-suggestion>`, `<m-datepicker>`, `<m-timepicker>` | `Checkbox`, `Switch`, `Radios`, `Radio`, `Slider`, `Textfield`, `Select`, `SelectOption`, `Search`, `SearchSuggestion`, `Datepicker`, `Timepicker` |
|
|
145
|
-
| Selection | `<m-chips>` + `<m-chip>`, `<m-tabs>` + `<m-tab>`, `<m-list>` + `<m-list-item>` | `Chips`, `Chip`, `Tabs`, `Tab`, `List`, `ListItem` |
|
|
146
|
-
| Navigation | `<m-navigation-rail>` + `<m-navigation-rail-item>`, `<m-drawer>` + `<m-drawer-item>`, `<m-top-app-bar>`, `<m-bottom-app-bar>` | `NavigationRail`, `NavigationRailItem`, `Drawer`, `DrawerItem`, `TopAppBar`, `BottomAppBar` |
|
|
147
|
-
| Overlays (top layer) | `<m-menu>` + `<m-menu-item>`, `<m-dialog>`, `<m-bottom-sheet>`, `<m-side-sheet>`, `<m-tooltip>`, `<m-snackbar>` | `Menu`, `MenuItem`, `Dialog`, `BottomSheet`, `SideSheet`, `Tooltip`, `Snackbar` |
|
|
148
|
-
| Containment | `<m-card>`, `<m-carousel>` + `<m-carousel-item>` | `Card`, `Carousel`, `CarouselItem` |
|
|
149
|
-
| Indicators | `<m-progress>`, `<m-loading-indicator>`, `<m-badge>`, `<m-divider>` | `Progress`, `LoadingIndicator`, `Badge`, `Divider` |
|
|
150
|
-
|
|
151
|
-
Overlays open in the browser's top layer (`showModal()` or `popover`) from inside their own shadow root, so they keep their styles, trap focus and make the page inert where M3 says so. Form controls are form-associated: `name`, the form value, reset, validation, `<label for>` and back-navigation restore work as on native controls.
|
|
152
|
-
|
|
153
|
-
```html
|
|
154
|
-
<script type="module">
|
|
155
|
-
import 'mtrl/elements/css'; // the elements' styles
|
|
156
|
-
import { defineAll } from 'mtrl/elements';
|
|
157
|
-
defineAll(); // registers every element (<m-button>, <m-switch>, …)
|
|
158
|
-
</script>
|
|
159
|
-
|
|
160
|
-
<form>
|
|
161
|
-
<m-textfield name="email" type="email" label="Email" required></m-textfield>
|
|
162
|
-
<m-radios name="plan" value="free" aria-label="Plan">
|
|
163
|
-
<m-radio value="free">Free</m-radio>
|
|
164
|
-
<m-radio value="pro">Pro</m-radio>
|
|
165
|
-
</m-radios>
|
|
166
|
-
<m-switch name="news" checked>Newsletter</m-switch>
|
|
167
|
-
<m-button type="submit">Sign up</m-button>
|
|
168
|
-
</form>
|
|
169
|
-
|
|
170
|
-
<m-tabs value="songs">
|
|
171
|
-
<m-tab value="songs">Songs</m-tab>
|
|
172
|
-
<m-tab value="albums">Albums</m-tab>
|
|
173
|
-
</m-tabs>
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
The page still loads mtrl's base styles and a theme (see [Styles](#styles)); the elements render in shadow DOM and pick up the theme's tokens. Attributes are defaults and properties the live state, as on native controls: a `checked` or `value` attribute sets the state until the user or a script changes it, and `form.reset()` goes back to it. Form controls take part in forms (their host's `name`), reset, validation and back-navigation restore.
|
|
177
|
-
|
|
178
|
-
| Framework | Import | Two-way binding |
|
|
179
|
-
|-----------|--------|-----------------|
|
|
180
|
-
| React 18 and 19 | `import { Switch } from 'mtrl/react'` | `checked` + `onChange`, or `defaultChecked` |
|
|
181
|
-
| Vue 3 | `import { MSwitch } from 'mtrl/vue'` | `v-model` |
|
|
182
|
-
| Svelte 5 | `import { Switch } from 'mtrl/svelte'` | `bind:checked` |
|
|
183
|
-
| Solid | `import { Switch } from 'mtrl/solid'` | `checked` + `onChange` |
|
|
184
|
-
|
|
185
|
-
Each framework is an optional peer dependency; mtrl installs none of them. All adapters render on the server and hydrate. Angular apps use the elements directly, with `CUSTOM_ELEMENTS_SCHEMA`.
|
|
230
|
+
Some parts load on demand: a button's progress indicator, a card's action buttons, a menu's submenus and the FAB menu's desktop menu. Enable code splitting in your build to keep them out of the initial chunk.
|
|
186
231
|
|
|
187
232
|
## Building your own components
|
|
188
233
|
|
|
@@ -190,17 +235,8 @@ Components are composed from small features with `pipe`. The same building block
|
|
|
190
235
|
|
|
191
236
|
```typescript
|
|
192
237
|
import { pipe, createBase, withEvents, withElement } from 'mtrl/core/compose';
|
|
193
|
-
import type { ElementComponent } from 'mtrl/core/compose';
|
|
194
|
-
|
|
195
|
-
interface NoteConfig {
|
|
196
|
-
text?: string;
|
|
197
|
-
}
|
|
198
238
|
|
|
199
|
-
|
|
200
|
-
setText: (text: string) => NoteComponent;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const createNote = (config: NoteConfig): NoteComponent =>
|
|
239
|
+
const createNote = (config: { text?: string } = {}) =>
|
|
204
240
|
pipe(
|
|
205
241
|
createBase,
|
|
206
242
|
withEvents(),
|
|
@@ -209,10 +245,16 @@ const createNote = (config: NoteConfig): NoteComponent =>
|
|
|
209
245
|
...component,
|
|
210
246
|
setText(text: string) {
|
|
211
247
|
component.element.textContent = text;
|
|
212
|
-
return this;
|
|
213
248
|
},
|
|
214
249
|
})
|
|
215
250
|
)(config);
|
|
251
|
+
|
|
252
|
+
// The component's type is what the pipe builds
|
|
253
|
+
type NoteComponent = ReturnType<typeof createNote>;
|
|
254
|
+
|
|
255
|
+
const note: NoteComponent = createNote();
|
|
256
|
+
note.setText('Saved');
|
|
257
|
+
document.body.append(note.element);
|
|
216
258
|
```
|
|
217
259
|
|
|
218
260
|
The element gets the `mtrl-note` class, `withEvents` adds `on`, `off` and `emit`, and `destroy()` removes the element. Add `withLifecycle()` from `mtrl/core/compose/features` when features need to register cleanup.
|
|
@@ -237,6 +279,10 @@ configureHTML({ sanitize: (html) => policy.createHTML(html) });
|
|
|
237
279
|
|
|
238
280
|
The policy sees every string, the library's own icons included; a `TrustedHTML` value passed as an icon or content skips it. With no policy set, markup is written as it is. Text options (`text`, a card's `text`) never go through `innerHTML`.
|
|
239
281
|
|
|
282
|
+
## Upgrading from 0.9
|
|
283
|
+
|
|
284
|
+
0.10.0 adds the elements and framework components; for factory users, most apps need nothing. The changes to check are listed in the [0.10.0 changelog's migration section](CHANGELOG.md#migrating-from-09x): setters no longer emit `change`, the time picker's events pass `{ value }`, the `--mtrl-sys-color-*-rgb` properties are gone, disabled non-form roots use `aria-disabled`, cards are `article`s, and the text field's DOM gained a `__field` wrapper.
|
|
285
|
+
|
|
240
286
|
## Upgrading from 0.7
|
|
241
287
|
|
|
242
288
|
0.8.0 aligns the components with Material 3 expressive, and some of that changes the API or the styles:
|
|
@@ -252,11 +298,11 @@ The full list, with every renamed property, is in the [0.8.0 changelog](CHANGELO
|
|
|
252
298
|
|
|
253
299
|
## Browser support
|
|
254
300
|
|
|
255
|
-
Current Chrome, Edge, Firefox and Safari. The spring motion uses CSS `linear()` easing (Safari 17.2 or later); older browsers render every component but skip those transitions.
|
|
301
|
+
Current Chrome, Edge, Firefox and Safari. The spring motion uses CSS `linear()` easing (Safari 17.2 or later); older browsers render every component but skip those transitions. The elements use form-associated custom elements and the top layer (`popover` and `<dialog>`), both available in every current browser.
|
|
256
302
|
|
|
257
303
|
## Contributing
|
|
258
304
|
|
|
259
|
-
Contributions are welcome. [CONTRIBUTING.md](CONTRIBUTING.md) covers the development setup, conventions and the distribution checks
|
|
305
|
+
Contributions are welcome. [CONTRIBUTING.md](.github/CONTRIBUTING.md) covers the development setup, conventions and the distribution checks.
|
|
260
306
|
|
|
261
307
|
## License
|
|
262
308
|
|