@m3e/core 1.0.0-rc.1 → 1.0.0-rc.2
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 +1 -2
- package/dist/a11y.js +6 -18
- package/dist/a11y.js.map +1 -1
- package/dist/a11y.min.js +5 -5
- package/dist/a11y.min.js.map +1 -1
- package/dist/custom-elements.json +3449 -3429
- package/dist/html-custom-data.json +14 -6
- package/dist/index.js +198 -29
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +87 -87
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
- package/cem.config.mjs +0 -16
- package/demo/index.html +0 -58
- package/dist/src/a11y/AriaDescriber.d.ts +0 -31
- package/dist/src/a11y/AriaDescriber.d.ts.map +0 -1
- package/dist/src/a11y/FocusTrapElement.d.ts +0 -25
- package/dist/src/a11y/FocusTrapElement.d.ts.map +0 -1
- package/dist/src/a11y/InteractivityChecker.d.ts +0 -22
- package/dist/src/a11y/InteractivityChecker.d.ts.map +0 -1
- package/dist/src/a11y/LiveAnnouncer.d.ts +0 -56
- package/dist/src/a11y/LiveAnnouncer.d.ts.map +0 -1
- package/dist/src/a11y/aria-reference.d.ts +0 -30
- package/dist/src/a11y/aria-reference.d.ts.map +0 -1
- package/dist/src/a11y/index.d.ts +0 -8
- package/dist/src/a11y/index.d.ts.map +0 -1
- package/dist/src/a11y/keycodes/KeyCode.d.ts +0 -118
- package/dist/src/a11y/keycodes/KeyCode.d.ts.map +0 -1
- package/dist/src/a11y/keycodes/ModifierKeys.d.ts +0 -5
- package/dist/src/a11y/keycodes/ModifierKeys.d.ts.map +0 -1
- package/dist/src/a11y/keycodes/getKeyCode.d.ts +0 -7
- package/dist/src/a11y/keycodes/getKeyCode.d.ts.map +0 -1
- package/dist/src/a11y/keycodes/hasModifierKey.d.ts +0 -9
- package/dist/src/a11y/keycodes/hasModifierKey.d.ts.map +0 -1
- package/dist/src/a11y/keycodes/index.d.ts +0 -6
- package/dist/src/a11y/keycodes/index.d.ts.map +0 -1
- package/dist/src/a11y/keycodes/isModifierAllowed.d.ts +0 -9
- package/dist/src/a11y/keycodes/isModifierAllowed.d.ts.map +0 -1
- package/dist/src/a11y/list-key/FocusKeyManager.d.ts +0 -17
- package/dist/src/a11y/list-key/FocusKeyManager.d.ts.map +0 -1
- package/dist/src/a11y/list-key/ListKeyManager.d.ts +0 -114
- package/dist/src/a11y/list-key/ListKeyManager.d.ts.map +0 -1
- package/dist/src/a11y/list-key/ListManager.d.ts +0 -37
- package/dist/src/a11y/list-key/ListManager.d.ts.map +0 -1
- package/dist/src/a11y/list-key/RadioKeyManager.d.ts +0 -20
- package/dist/src/a11y/list-key/RadioKeyManager.d.ts.map +0 -1
- package/dist/src/a11y/list-key/RovingTabIndexManager.d.ts +0 -22
- package/dist/src/a11y/list-key/RovingTabIndexManager.d.ts.map +0 -1
- package/dist/src/a11y/list-key/SelectionManager.d.ts +0 -46
- package/dist/src/a11y/list-key/SelectionManager.d.ts.map +0 -1
- package/dist/src/a11y/list-key/Typeahead.d.ts +0 -64
- package/dist/src/a11y/list-key/Typeahead.d.ts.map +0 -1
- package/dist/src/a11y/list-key/index.d.ts +0 -8
- package/dist/src/a11y/list-key/index.d.ts.map +0 -1
- package/dist/src/a11y/visuallyHide.d.ts +0 -6
- package/dist/src/a11y/visuallyHide.d.ts.map +0 -1
- package/dist/src/anchoring/AnchorOptions.d.ts +0 -15
- package/dist/src/anchoring/AnchorOptions.d.ts.map +0 -1
- package/dist/src/anchoring/AnchorPosition.d.ts +0 -3
- package/dist/src/anchoring/AnchorPosition.d.ts.map +0 -1
- package/dist/src/anchoring/index.d.ts +0 -4
- package/dist/src/anchoring/index.d.ts.map +0 -1
- package/dist/src/anchoring/positionAnchor.d.ts +0 -12
- package/dist/src/anchoring/positionAnchor.d.ts.map +0 -1
- package/dist/src/bidi/Directionality.d.ts +0 -27
- package/dist/src/bidi/Directionality.d.ts.map +0 -1
- package/dist/src/bidi/index.d.ts +0 -2
- package/dist/src/bidi/index.d.ts.map +0 -1
- package/dist/src/index.d.ts +0 -2
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/layout/Breakpoint.d.ts +0 -26
- package/dist/src/layout/Breakpoint.d.ts.map +0 -1
- package/dist/src/layout/BreakpointObserver.d.ts +0 -18
- package/dist/src/layout/BreakpointObserver.d.ts.map +0 -1
- package/dist/src/layout/index.d.ts +0 -3
- package/dist/src/layout/index.d.ts.map +0 -1
- package/dist/src/platform/Platform.d.ts +0 -34
- package/dist/src/platform/Platform.d.ts.map +0 -1
- package/dist/src/platform/index.d.ts +0 -2
- package/dist/src/platform/index.d.ts.map +0 -1
- package/dist/src/shared/controllers/FocusController.d.ts +0 -30
- package/dist/src/shared/controllers/FocusController.d.ts.map +0 -1
- package/dist/src/shared/controllers/HoverController.d.ts +0 -40
- package/dist/src/shared/controllers/HoverController.d.ts.map +0 -1
- package/dist/src/shared/controllers/IntersectionController.d.ts +0 -40
- package/dist/src/shared/controllers/IntersectionController.d.ts.map +0 -1
- package/dist/src/shared/controllers/LongPressController.d.ts +0 -32
- package/dist/src/shared/controllers/LongPressController.d.ts.map +0 -1
- package/dist/src/shared/controllers/MonitorControllerBase.d.ts +0 -62
- package/dist/src/shared/controllers/MonitorControllerBase.d.ts.map +0 -1
- package/dist/src/shared/controllers/MutationController.d.ts +0 -37
- package/dist/src/shared/controllers/MutationController.d.ts.map +0 -1
- package/dist/src/shared/controllers/PressedController.d.ts +0 -45
- package/dist/src/shared/controllers/PressedController.d.ts.map +0 -1
- package/dist/src/shared/controllers/ResizeController.d.ts +0 -40
- package/dist/src/shared/controllers/ResizeController.d.ts.map +0 -1
- package/dist/src/shared/controllers/ScrollController.d.ts +0 -34
- package/dist/src/shared/controllers/ScrollController.d.ts.map +0 -1
- package/dist/src/shared/controllers/index.d.ts +0 -9
- package/dist/src/shared/controllers/index.d.ts.map +0 -1
- package/dist/src/shared/decorators/debounce.d.ts +0 -7
- package/dist/src/shared/decorators/debounce.d.ts.map +0 -1
- package/dist/src/shared/decorators/index.d.ts +0 -2
- package/dist/src/shared/decorators/index.d.ts.map +0 -1
- package/dist/src/shared/directives/index.d.ts +0 -2
- package/dist/src/shared/directives/index.d.ts.map +0 -1
- package/dist/src/shared/directives/safeStyleMap.d.ts +0 -44
- package/dist/src/shared/directives/safeStyleMap.d.ts.map +0 -1
- package/dist/src/shared/index.d.ts +0 -8
- package/dist/src/shared/index.d.ts.map +0 -1
- package/dist/src/shared/mixins/AttachInternals.d.ts +0 -24
- package/dist/src/shared/mixins/AttachInternals.d.ts.map +0 -1
- package/dist/src/shared/mixins/Checked.d.ts +0 -24
- package/dist/src/shared/mixins/Checked.d.ts.map +0 -1
- package/dist/src/shared/mixins/CheckedIndeterminate.d.ts +0 -25
- package/dist/src/shared/mixins/CheckedIndeterminate.d.ts.map +0 -1
- package/dist/src/shared/mixins/CheckedOrSelected.d.ts +0 -23
- package/dist/src/shared/mixins/CheckedOrSelected.d.ts.map +0 -1
- package/dist/src/shared/mixins/ConstraintValidation.d.ts +0 -48
- package/dist/src/shared/mixins/ConstraintValidation.d.ts.map +0 -1
- package/dist/src/shared/mixins/Constructor.d.ts +0 -3
- package/dist/src/shared/mixins/Constructor.d.ts.map +0 -1
- package/dist/src/shared/mixins/Dirty.d.ts +0 -27
- package/dist/src/shared/mixins/Dirty.d.ts.map +0 -1
- package/dist/src/shared/mixins/Disabled.d.ts +0 -25
- package/dist/src/shared/mixins/Disabled.d.ts.map +0 -1
- package/dist/src/shared/mixins/DisabledInteractive.d.ts +0 -25
- package/dist/src/shared/mixins/DisabledInteractive.d.ts.map +0 -1
- package/dist/src/shared/mixins/EventAttribute.d.ts +0 -11
- package/dist/src/shared/mixins/EventAttribute.d.ts.map +0 -1
- package/dist/src/shared/mixins/Focusable.d.ts +0 -11
- package/dist/src/shared/mixins/Focusable.d.ts.map +0 -1
- package/dist/src/shared/mixins/FormAssociated.d.ts +0 -34
- package/dist/src/shared/mixins/FormAssociated.d.ts.map +0 -1
- package/dist/src/shared/mixins/FormSubmitter.d.ts +0 -31
- package/dist/src/shared/mixins/FormSubmitter.d.ts.map +0 -1
- package/dist/src/shared/mixins/HtmlFor.d.ts +0 -30
- package/dist/src/shared/mixins/HtmlFor.d.ts.map +0 -1
- package/dist/src/shared/mixins/KeyboardClick.d.ts +0 -11
- package/dist/src/shared/mixins/KeyboardClick.d.ts.map +0 -1
- package/dist/src/shared/mixins/Labelled.d.ts +0 -22
- package/dist/src/shared/mixins/Labelled.d.ts.map +0 -1
- package/dist/src/shared/mixins/LinkButton.d.ts +0 -36
- package/dist/src/shared/mixins/LinkButton.d.ts.map +0 -1
- package/dist/src/shared/mixins/ReadOnly.d.ts +0 -25
- package/dist/src/shared/mixins/ReadOnly.d.ts.map +0 -1
- package/dist/src/shared/mixins/Required.d.ts +0 -26
- package/dist/src/shared/mixins/Required.d.ts.map +0 -1
- package/dist/src/shared/mixins/RequiredConstraintValidation.d.ts +0 -21
- package/dist/src/shared/mixins/RequiredConstraintValidation.d.ts.map +0 -1
- package/dist/src/shared/mixins/Role.d.ts +0 -13
- package/dist/src/shared/mixins/Role.d.ts.map +0 -1
- package/dist/src/shared/mixins/Selected.d.ts +0 -24
- package/dist/src/shared/mixins/Selected.d.ts.map +0 -1
- package/dist/src/shared/mixins/Touched.d.ts +0 -27
- package/dist/src/shared/mixins/Touched.d.ts.map +0 -1
- package/dist/src/shared/mixins/Vertical.d.ts +0 -24
- package/dist/src/shared/mixins/Vertical.d.ts.map +0 -1
- package/dist/src/shared/mixins/hasKeys.d.ts +0 -9
- package/dist/src/shared/mixins/hasKeys.d.ts.map +0 -1
- package/dist/src/shared/mixins/index.d.ts +0 -25
- package/dist/src/shared/mixins/index.d.ts.map +0 -1
- package/dist/src/shared/primitives/CollapsibleElement.d.ts +0 -58
- package/dist/src/shared/primitives/CollapsibleElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/ElevationElement.d.ts +0 -88
- package/dist/src/shared/primitives/ElevationElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/ElevationLevel.d.ts +0 -3
- package/dist/src/shared/primitives/ElevationLevel.d.ts.map +0 -1
- package/dist/src/shared/primitives/ElevationToken.d.ts +0 -15
- package/dist/src/shared/primitives/ElevationToken.d.ts.map +0 -1
- package/dist/src/shared/primitives/FocusRingElement.d.ts +0 -78
- package/dist/src/shared/primitives/FocusRingElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/FocusRingToken.d.ts +0 -17
- package/dist/src/shared/primitives/FocusRingToken.d.ts.map +0 -1
- package/dist/src/shared/primitives/PseudoCheckboxElement.d.ts +0 -50
- package/dist/src/shared/primitives/PseudoCheckboxElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/PseudoRadioElement.d.ts +0 -41
- package/dist/src/shared/primitives/PseudoRadioElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/RippleElement.d.ts +0 -110
- package/dist/src/shared/primitives/RippleElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/RippleToken.d.ts +0 -12
- package/dist/src/shared/primitives/RippleToken.d.ts.map +0 -1
- package/dist/src/shared/primitives/ScrollContainerElement.d.ts +0 -64
- package/dist/src/shared/primitives/ScrollContainerElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/ScrollDividers.d.ts +0 -3
- package/dist/src/shared/primitives/ScrollDividers.d.ts.map +0 -1
- package/dist/src/shared/primitives/SlideElement.d.ts +0 -48
- package/dist/src/shared/primitives/SlideElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/StateLayerElement.d.ts +0 -77
- package/dist/src/shared/primitives/StateLayerElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/StateLayerToken.d.ts +0 -13
- package/dist/src/shared/primitives/StateLayerToken.d.ts.map +0 -1
- package/dist/src/shared/primitives/TextOverflowElement.d.ts +0 -39
- package/dist/src/shared/primitives/TextOverflowElement.d.ts.map +0 -1
- package/dist/src/shared/primitives/index.d.ts +0 -13
- package/dist/src/shared/primitives/index.d.ts.map +0 -1
- package/dist/src/shared/tokens/ColorToken.d.ts +0 -96
- package/dist/src/shared/tokens/ColorToken.d.ts.map +0 -1
- package/dist/src/shared/tokens/DensityToken.d.ts +0 -15
- package/dist/src/shared/tokens/DensityToken.d.ts.map +0 -1
- package/dist/src/shared/tokens/DesignToken.d.ts +0 -366
- package/dist/src/shared/tokens/DesignToken.d.ts.map +0 -1
- package/dist/src/shared/tokens/ElevationToken.d.ts +0 -16
- package/dist/src/shared/tokens/ElevationToken.d.ts.map +0 -1
- package/dist/src/shared/tokens/MotionToken.d.ts +0 -69
- package/dist/src/shared/tokens/MotionToken.d.ts.map +0 -1
- package/dist/src/shared/tokens/ScrollbarToken.d.ts +0 -10
- package/dist/src/shared/tokens/ScrollbarToken.d.ts.map +0 -1
- package/dist/src/shared/tokens/ShapeToken.d.ts +0 -79
- package/dist/src/shared/tokens/ShapeToken.d.ts.map +0 -1
- package/dist/src/shared/tokens/StateToken.d.ts +0 -10
- package/dist/src/shared/tokens/StateToken.d.ts.map +0 -1
- package/dist/src/shared/tokens/TypescaleToken.d.ts +0 -220
- package/dist/src/shared/tokens/TypescaleToken.d.ts.map +0 -1
- package/dist/src/shared/tokens/index.d.ts +0 -2
- package/dist/src/shared/tokens/index.d.ts.map +0 -1
- package/dist/src/shared/utils/getTextContent.d.ts +0 -8
- package/dist/src/shared/utils/getTextContent.d.ts.map +0 -1
- package/dist/src/shared/utils/guid.d.ts +0 -6
- package/dist/src/shared/utils/guid.d.ts.map +0 -1
- package/dist/src/shared/utils/hasAssignedNodes.d.ts +0 -7
- package/dist/src/shared/utils/hasAssignedNodes.d.ts.map +0 -1
- package/dist/src/shared/utils/index.d.ts +0 -6
- package/dist/src/shared/utils/index.d.ts.map +0 -1
- package/dist/src/shared/utils/prefersReducedMotion.d.ts +0 -6
- package/dist/src/shared/utils/prefersReducedMotion.d.ts.map +0 -1
- package/dist/src/shared/utils/scrollIntoViewIfNeeded.d.ts +0 -8
- package/dist/src/shared/utils/scrollIntoViewIfNeeded.d.ts.map +0 -1
- package/eslint.config.mjs +0 -21
- package/rollup.config.js +0 -132
- package/src/a11y/AriaDescriber.ts +0 -130
- package/src/a11y/FocusTrapElement.ts +0 -136
- package/src/a11y/InteractivityChecker.ts +0 -62
- package/src/a11y/LiveAnnouncer.ts +0 -143
- package/src/a11y/aria-reference.ts +0 -51
- package/src/a11y/index.ts +0 -8
- package/src/a11y/keycodes/KeyCode.ts +0 -128
- package/src/a11y/keycodes/ModifierKeys.ts +0 -5
- package/src/a11y/keycodes/getKeyCode.ts +0 -8
- package/src/a11y/keycodes/hasModifierKey.ts +0 -11
- package/src/a11y/keycodes/index.ts +0 -5
- package/src/a11y/keycodes/isModifierAllowed.ts +0 -12
- package/src/a11y/list-key/FocusKeyManager.ts +0 -25
- package/src/a11y/list-key/ListKeyManager.ts +0 -350
- package/src/a11y/list-key/ListManager.ts +0 -66
- package/src/a11y/list-key/RadioKeyManager.ts +0 -49
- package/src/a11y/list-key/RovingTabIndexManager.ts +0 -56
- package/src/a11y/list-key/SelectionManager.ts +0 -132
- package/src/a11y/list-key/Typeahead.ts +0 -131
- package/src/a11y/list-key/index.ts +0 -7
- package/src/a11y/visuallyHide.ts +0 -18
- package/src/anchoring/AnchorOptions.ts +0 -19
- package/src/anchoring/AnchorPosition.ts +0 -14
- package/src/anchoring/index.ts +0 -3
- package/src/anchoring/positionAnchor.ts +0 -53
- package/src/bidi/Directionality.ts +0 -85
- package/src/bidi/index.ts +0 -1
- package/src/index.ts +0 -1
- package/src/layout/Breakpoint.ts +0 -26
- package/src/layout/BreakpointObserver.ts +0 -44
- package/src/layout/index.ts +0 -2
- package/src/platform/Platform.ts +0 -67
- package/src/platform/index.ts +0 -1
- package/src/shared/controllers/FocusController.ts +0 -60
- package/src/shared/controllers/HoverController.ts +0 -140
- package/src/shared/controllers/IntersectionController.ts +0 -81
- package/src/shared/controllers/LongPressController.ts +0 -87
- package/src/shared/controllers/MonitorControllerBase.ts +0 -99
- package/src/shared/controllers/MutationController.ts +0 -89
- package/src/shared/controllers/PressedController.ts +0 -137
- package/src/shared/controllers/ResizeController.ts +0 -83
- package/src/shared/controllers/ScrollController.ts +0 -100
- package/src/shared/controllers/index.ts +0 -8
- package/src/shared/decorators/debounce.ts +0 -19
- package/src/shared/decorators/index.ts +0 -1
- package/src/shared/directives/index.ts +0 -1
- package/src/shared/directives/safeStyleMap.ts +0 -108
- package/src/shared/index.ts +0 -7
- package/src/shared/mixins/AttachInternals.ts +0 -48
- package/src/shared/mixins/Checked.ts +0 -50
- package/src/shared/mixins/CheckedIndeterminate.ts +0 -47
- package/src/shared/mixins/CheckedOrSelected.ts +0 -36
- package/src/shared/mixins/ConstraintValidation.ts +0 -213
- package/src/shared/mixins/Constructor.ts +0 -2
- package/src/shared/mixins/Dirty.ts +0 -71
- package/src/shared/mixins/Disabled.ts +0 -49
- package/src/shared/mixins/DisabledInteractive.ts +0 -78
- package/src/shared/mixins/EventAttribute.ts +0 -25
- package/src/shared/mixins/Focusable.ts +0 -52
- package/src/shared/mixins/FormAssociated.ts +0 -152
- package/src/shared/mixins/FormSubmitter.ts +0 -123
- package/src/shared/mixins/HtmlFor.ts +0 -89
- package/src/shared/mixins/KeyboardClick.ts +0 -46
- package/src/shared/mixins/Labelled.ts +0 -88
- package/src/shared/mixins/LinkButton.ts +0 -169
- package/src/shared/mixins/ReadOnly.ts +0 -48
- package/src/shared/mixins/Required.ts +0 -50
- package/src/shared/mixins/RequiredConstraintValidation.ts +0 -45
- package/src/shared/mixins/Role.ts +0 -134
- package/src/shared/mixins/Selected.ts +0 -50
- package/src/shared/mixins/Touched.ts +0 -71
- package/src/shared/mixins/Vertical.ts +0 -44
- package/src/shared/mixins/hasKeys.ts +0 -10
- package/src/shared/mixins/index.ts +0 -24
- package/src/shared/primitives/CollapsibleElement.ts +0 -227
- package/src/shared/primitives/ElevationElement.ts +0 -254
- package/src/shared/primitives/ElevationLevel.ts +0 -2
- package/src/shared/primitives/ElevationToken.ts +0 -18
- package/src/shared/primitives/FocusRingElement.ts +0 -199
- package/src/shared/primitives/FocusRingToken.ts +0 -24
- package/src/shared/primitives/PseudoCheckboxElement.ts +0 -116
- package/src/shared/primitives/PseudoRadioElement.ts +0 -83
- package/src/shared/primitives/RippleElement.ts +0 -289
- package/src/shared/primitives/RippleToken.ts +0 -15
- package/src/shared/primitives/ScrollContainerElement.ts +0 -151
- package/src/shared/primitives/ScrollDividers.ts +0 -2
- package/src/shared/primitives/SlideElement.ts +0 -128
- package/src/shared/primitives/StateLayerElement.ts +0 -191
- package/src/shared/primitives/StateLayerToken.ts +0 -16
- package/src/shared/primitives/TextOverflowElement.ts +0 -60
- package/src/shared/primitives/index.ts +0 -12
- package/src/shared/tokens/ColorToken.ts +0 -142
- package/src/shared/tokens/DensityToken.ts +0 -23
- package/src/shared/tokens/DesignToken.ts +0 -35
- package/src/shared/tokens/ElevationToken.ts +0 -115
- package/src/shared/tokens/MotionToken.ts +0 -107
- package/src/shared/tokens/ScrollbarToken.ts +0 -13
- package/src/shared/tokens/ShapeToken.ts +0 -138
- package/src/shared/tokens/StateToken.ts +0 -13
- package/src/shared/tokens/TypescaleToken.ts +0 -230
- package/src/shared/tokens/index.ts +0 -1
- package/src/shared/utils/getTextContent.ts +0 -31
- package/src/shared/utils/guid.ts +0 -11
- package/src/shared/utils/hasAssignedNodes.ts +0 -8
- package/src/shared/utils/index.ts +0 -5
- package/src/shared/utils/prefersReducedMotion.ts +0 -9
- package/src/shared/utils/scrollIntoViewIfNeeded.ts +0 -18
- package/tsconfig.json +0 -9
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
import { css, CSSResultGroup, LitElement, PropertyValues } from "lit";
|
|
2
|
-
import { customElement, property } from "lit/decorators.js";
|
|
3
|
-
|
|
4
|
-
import { PressedController } from "../controllers";
|
|
5
|
-
import { HtmlFor, Role } from "../mixins";
|
|
6
|
-
|
|
7
|
-
import { RippleToken } from "./RippleToken";
|
|
8
|
-
import { DesignToken } from "../tokens";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @summary
|
|
12
|
-
* Connects user input to screen reactions using ripples.
|
|
13
|
-
*
|
|
14
|
-
* @description
|
|
15
|
-
* The `m3e-ripple` component is an absolute positioned element used to depict a ripple.
|
|
16
|
-
* The parenting element must be a relative positioned element.
|
|
17
|
-
*
|
|
18
|
-
* The component can be attached to an interactive element using the `for` attribute or programmatically using the `attach` method.
|
|
19
|
-
* The ripple is displayed when the interactive element is pressed and hidden when released. This can be disabled using the `disabled` attribute.
|
|
20
|
-
*
|
|
21
|
-
* The pressed state actives either using both pointer and keyboard events. For keyboard events, `SPACE` and `ENTER` activate a ripple.
|
|
22
|
-
* You can disabled whether the `ENTER` key actives a ripple using the `disable-enter` attribute.
|
|
23
|
-
*
|
|
24
|
-
* Alternately, you can use the `show` and `hide` methods to programmatically control the ripple.
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* The following example illustrates attaching a ripple to an interactive element. In this example, the parenting div
|
|
28
|
-
* has relative positioning and is given an `id` referenced by `m3e-ripple` using the `for` attribute. Note that `#myDiv`
|
|
29
|
-
* is not used when specifying the attached element's identifier. The `#` is inferred.
|
|
30
|
-
*
|
|
31
|
-
* ```html
|
|
32
|
-
* <div id="myDiv" tabindex="0" style="position: relative;">
|
|
33
|
-
* <m3e-ripple for="myDiv"></m3e-ripple>
|
|
34
|
-
* <div>
|
|
35
|
-
* ```
|
|
36
|
-
*
|
|
37
|
-
* @tag m3e-ripple
|
|
38
|
-
*
|
|
39
|
-
* @attr centered - Whether the ripple always originates from the center of the element's bounds, rather than originating from the location of the click event.
|
|
40
|
-
* @attr disable-enter - Whether the ripple is disabled when the enter key is pressed.
|
|
41
|
-
* @attr disabled - Whether click events will not trigger the ripple. Ripples can be still controlled manually by using the `show` and 'hide' methods.
|
|
42
|
-
* @attr for - The identifier of the interactive control to which this element is attached.
|
|
43
|
-
* @attr radius - The radius, in pixels, of the ripple.
|
|
44
|
-
* @attr unbounded - Whether the ripple is visible outside the element's bounds.
|
|
45
|
-
*
|
|
46
|
-
* @cssprop --m3e-ripple-color - The color of the ripple.
|
|
47
|
-
* @cssprop --m3e-ripple-enter-duration - The duration for the enter animation (expansion from point of contact).
|
|
48
|
-
* @cssprop --m3e-ripple-exit-duration - The duration for the exit animation (fade-out).
|
|
49
|
-
* @cssprop --m3e-ripple-opacity - The opacity of the ripple.
|
|
50
|
-
* @cssprop --m3e-ripple-scale-factor - The factor by which to scale the ripple.
|
|
51
|
-
* @cssprop --m3e-ripple-shape - The shape of the ripple.
|
|
52
|
-
*/
|
|
53
|
-
@customElement("m3e-ripple")
|
|
54
|
-
export class M3eRippleElement extends HtmlFor(Role(LitElement, "none")) {
|
|
55
|
-
/** The styles of the element. */
|
|
56
|
-
static override styles: CSSResultGroup = css`
|
|
57
|
-
:host {
|
|
58
|
-
display: block;
|
|
59
|
-
position: absolute;
|
|
60
|
-
left: 0;
|
|
61
|
-
top: 0;
|
|
62
|
-
right: 0;
|
|
63
|
-
bottom: 0;
|
|
64
|
-
pointer-events: none;
|
|
65
|
-
border-radius: inherit;
|
|
66
|
-
}
|
|
67
|
-
:host(:not([unbounded])) {
|
|
68
|
-
overflow: hidden;
|
|
69
|
-
}
|
|
70
|
-
.ripple {
|
|
71
|
-
display: block;
|
|
72
|
-
position: absolute;
|
|
73
|
-
left: 0;
|
|
74
|
-
top: 0;
|
|
75
|
-
right: 0;
|
|
76
|
-
bottom: 0;
|
|
77
|
-
pointer-events: none;
|
|
78
|
-
transform: scale(0);
|
|
79
|
-
border-radius: ${DesignToken.shape.corner.full};
|
|
80
|
-
background-color: color-mix(in srgb, ${RippleToken.color} ${RippleToken.opacity}, transparent);
|
|
81
|
-
will-change: background-color, opacity;
|
|
82
|
-
}
|
|
83
|
-
.ripple:not(.persistent) {
|
|
84
|
-
animation: ripple ${RippleToken.enterDuration} linear;
|
|
85
|
-
}
|
|
86
|
-
.ripple.persistent {
|
|
87
|
-
animation: persistent-ripple ${RippleToken.enterDuration} linear;
|
|
88
|
-
}
|
|
89
|
-
.ripple.persistent.pressed {
|
|
90
|
-
transform: scale(${RippleToken.scaleFactor});
|
|
91
|
-
}
|
|
92
|
-
.ripple.exit {
|
|
93
|
-
transition: opacity ${RippleToken.exitDuration} cubic-bezier(0, 0, 0.2, 0.1);
|
|
94
|
-
opacity: 0;
|
|
95
|
-
}
|
|
96
|
-
@keyframes persistent-ripple {
|
|
97
|
-
to {
|
|
98
|
-
transform: scale(${RippleToken.scaleFactor});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
@keyframes ripple {
|
|
102
|
-
to {
|
|
103
|
-
transform: scale(${RippleToken.scaleFactor});
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
@media (prefers-reduced-motion) {
|
|
107
|
-
.ripple {
|
|
108
|
-
transform: scale(${RippleToken.scaleFactor});
|
|
109
|
-
}
|
|
110
|
-
.ripple:not(.persistent),
|
|
111
|
-
.ripple.persistent {
|
|
112
|
-
animation-duration: 90ms;
|
|
113
|
-
}
|
|
114
|
-
.ripple.exit {
|
|
115
|
-
transition-duration: 10ms;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
@media (forced-colors: active) {
|
|
119
|
-
.ripple {
|
|
120
|
-
display: none;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
`;
|
|
124
|
-
|
|
125
|
-
/** @private */ #ripple: HTMLElement | null = null;
|
|
126
|
-
/** @private */ readonly #pressedController = new PressedController(this, {
|
|
127
|
-
target: null,
|
|
128
|
-
isPressedKey: (key) => key === " " || (!this.disableEnter && key === "Enter"),
|
|
129
|
-
callback: (pressed, { x, y }) => this.#handlePressedChange(pressed, x, y),
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Whether click events will not trigger the ripple.
|
|
134
|
-
* Ripples can be still controlled manually by using the `show` and 'hide' methods.
|
|
135
|
-
* @default false
|
|
136
|
-
*/
|
|
137
|
-
@property({ type: Boolean, reflect: true }) disabled = false;
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Whether the ripple is disabled when the enter key is pressed.
|
|
141
|
-
* @default false
|
|
142
|
-
*/
|
|
143
|
-
@property({ attribute: "disable-enter", type: Boolean, reflect: true }) disableEnter = false;
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Whether the ripple always originates from the center of the element's bounds, rather
|
|
147
|
-
* than originating from the location of the click event.
|
|
148
|
-
* @default false
|
|
149
|
-
*/
|
|
150
|
-
@property({ type: Boolean, reflect: true }) centered = false;
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Whether the ripple is visible outside the element's bounds.
|
|
154
|
-
* @default false
|
|
155
|
-
*/
|
|
156
|
-
@property({ type: Boolean, reflect: true }) unbounded = false;
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* The radius, in pixels, of the ripple.
|
|
160
|
-
* @default null
|
|
161
|
-
*/
|
|
162
|
-
@property({ type: Number }) radius: number | null = null;
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* The element that triggers the ripple when click events are received.
|
|
166
|
-
* @default null
|
|
167
|
-
*/
|
|
168
|
-
@property() trigger: string | HTMLElement | null = null;
|
|
169
|
-
|
|
170
|
-
/** Whether the ripple is currently visible to the user. */
|
|
171
|
-
get visible() {
|
|
172
|
-
return this.#ripple !== null;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Launches a manual ripple.
|
|
177
|
-
* @param {number} x The x-coordinate, relative to the viewport, at which to present the ripple.
|
|
178
|
-
* @param {number} y The y-coordinate, relative to the viewport, at which to present the ripple.
|
|
179
|
-
* @param {boolean} [persistent=false] Whether the ripple will persist until hidden.
|
|
180
|
-
*/
|
|
181
|
-
show(x: number, y: number, persistent: boolean = false): void {
|
|
182
|
-
this.#destroyRipple();
|
|
183
|
-
|
|
184
|
-
const bounds = this.getBoundingClientRect();
|
|
185
|
-
if (this.centered) {
|
|
186
|
-
x = bounds.left + bounds.width / 2;
|
|
187
|
-
y = bounds.top + bounds.height / 2;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
let radius = this.radius;
|
|
191
|
-
|
|
192
|
-
if (!radius || isNaN(radius)) {
|
|
193
|
-
const distX = Math.max(Math.abs(x - bounds.left), Math.abs(x - bounds.right));
|
|
194
|
-
const distY = Math.max(Math.abs(y - bounds.top), Math.abs(y - bounds.bottom));
|
|
195
|
-
radius = Math.sqrt(distX * distX + distY * distY);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const offsetX = x - bounds.left;
|
|
199
|
-
const offsetY = y - bounds.top;
|
|
200
|
-
|
|
201
|
-
this.#ripple = document.createElement("div");
|
|
202
|
-
this.#ripple.classList.add("ripple");
|
|
203
|
-
if (persistent) {
|
|
204
|
-
this.#ripple.classList.add("persistent");
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
this.#ripple.style.left = `${offsetX - radius}px`;
|
|
208
|
-
this.#ripple.style.top = `${offsetY - radius}px`;
|
|
209
|
-
this.#ripple.style.width = `${radius * 2}px`;
|
|
210
|
-
this.#ripple.style.height = `${radius * 2}px`;
|
|
211
|
-
|
|
212
|
-
this.#ripple.addEventListener("animationend", () => this.#handleAnimationEnd(persistent), { once: true });
|
|
213
|
-
this.#ripple.addEventListener("transitionend", () => this.#destroyRipple(), { once: true });
|
|
214
|
-
|
|
215
|
-
this.shadowRoot?.appendChild(this.#ripple);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/** Manually hides the ripple. */
|
|
219
|
-
hide(): void {
|
|
220
|
-
this.#ripple?.classList.add("exit");
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/** @inheritdoc */
|
|
224
|
-
override attach(control: HTMLElement): void {
|
|
225
|
-
super.attach(control);
|
|
226
|
-
this.#pressedController.observe(control);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/** @inheritdoc */
|
|
230
|
-
override detach(): void {
|
|
231
|
-
if (this.control) {
|
|
232
|
-
this.#pressedController.unobserve(this.control);
|
|
233
|
-
}
|
|
234
|
-
super.detach();
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/** @inheritdoc */
|
|
238
|
-
override connectedCallback(): void {
|
|
239
|
-
this.ariaHidden = "true";
|
|
240
|
-
super.connectedCallback();
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/** @inheritdoc */
|
|
244
|
-
override disconnectedCallback(): void {
|
|
245
|
-
super.disconnectedCallback();
|
|
246
|
-
this.#destroyRipple();
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/** @inheritdoc */
|
|
250
|
-
protected override updated(_changedProperties: PropertyValues<this>): void {
|
|
251
|
-
super.updated(_changedProperties);
|
|
252
|
-
|
|
253
|
-
if (_changedProperties.has("disabled") && this.disabled) {
|
|
254
|
-
this.hide();
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/** @private */
|
|
259
|
-
#destroyRipple(): void {
|
|
260
|
-
this.#ripple?.remove();
|
|
261
|
-
this.#ripple = null;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/** @private */
|
|
265
|
-
#handleAnimationEnd(persistent: boolean): void {
|
|
266
|
-
if (persistent) {
|
|
267
|
-
this.#ripple?.classList.add("pressed");
|
|
268
|
-
} else {
|
|
269
|
-
this.hide();
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/** @private */
|
|
274
|
-
#handlePressedChange(pressed: boolean, x: number, y: number): void {
|
|
275
|
-
if (!this.disabled) {
|
|
276
|
-
if (pressed) {
|
|
277
|
-
this.show(x, y, true);
|
|
278
|
-
} else {
|
|
279
|
-
this.hide();
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
declare global {
|
|
286
|
-
interface HTMLElementTagNameMap {
|
|
287
|
-
"m3e-ripple": M3eRippleElement;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { unsafeCSS } from "lit";
|
|
2
|
-
|
|
3
|
-
import { DesignToken } from "../tokens";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Component design tokens that control the `M3eRippleElement`.
|
|
7
|
-
* @internal
|
|
8
|
-
*/
|
|
9
|
-
export const RippleToken = {
|
|
10
|
-
color: unsafeCSS(`var(--m3e-ripple-color, ${DesignToken.color.onSurface})`),
|
|
11
|
-
opacity: unsafeCSS(`var(--m3e-ripple-opacity, ${DesignToken.state.pressedStateLayerOpacity})`),
|
|
12
|
-
enterDuration: unsafeCSS(`var(--m3e-ripple-enter-duration, ${DesignToken.motion.duration.long4})`),
|
|
13
|
-
exitDuration: unsafeCSS(`var(--m3e-ripple-exit-duration, ${DesignToken.motion.duration.short2})`),
|
|
14
|
-
scaleFactor: unsafeCSS(`var(--m3e-ripple-scale-factor, 2.5)`),
|
|
15
|
-
} as const;
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit";
|
|
2
|
-
import { customElement, property } from "lit/decorators.js";
|
|
3
|
-
|
|
4
|
-
import { Role } from "../mixins";
|
|
5
|
-
import { debounce } from "../decorators";
|
|
6
|
-
import { DesignToken } from "../tokens";
|
|
7
|
-
|
|
8
|
-
import { ScrollDividers } from "./ScrollDividers";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @summary
|
|
12
|
-
* A vertically oriented content container which presents dividers above and below content when scrolled.
|
|
13
|
-
*
|
|
14
|
-
* @description
|
|
15
|
-
* The `m3e-scroll-container` component provides a vertically oriented scrollable container with dynamic
|
|
16
|
-
* dividers above and below content. Designed according to Material 3 principles, it supports custom scrollbar
|
|
17
|
-
* thickness, divider styling, and focus ring theming via CSS custom properties.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* This example shows a scrollable container with dividers above and below the content, and thin scrollbars enabled.
|
|
21
|
-
* ```html
|
|
22
|
-
* <m3e-scroll-container dividers="above-below" thin>
|
|
23
|
-
* <div>Scrollable content goes here</div>
|
|
24
|
-
* </m3e-scroll-container>
|
|
25
|
-
* ```
|
|
26
|
-
*
|
|
27
|
-
* @tag m3e-scroll-container
|
|
28
|
-
*
|
|
29
|
-
* @slot - Renders the scrollable content.
|
|
30
|
-
*
|
|
31
|
-
* @attr dividers - The dividers used to separate scrollable content.
|
|
32
|
-
* @attr thin - Whether to present thin scrollbars.
|
|
33
|
-
*
|
|
34
|
-
* @cssprop --m3e-divider-thickness - Thickness of the divider lines above and below content.
|
|
35
|
-
* @cssprop --m3e-divider-color - Color of the divider lines when visible.
|
|
36
|
-
* @cssprop --m3e-focus-ring-color - Color of the focus ring outline.
|
|
37
|
-
* @cssprop --m3e-focus-ring-thickness - Thickness of the focus ring outline.
|
|
38
|
-
* @cssprop --m3e-focus-ring-factor - Animation factor for focus ring thickness.
|
|
39
|
-
* @cssprop --m3e-focus-ring-duration - Duration of the focus ring animation.
|
|
40
|
-
*/
|
|
41
|
-
@customElement("m3e-scroll-container")
|
|
42
|
-
export class M3eScrollContainerElement extends Role(LitElement, "none") {
|
|
43
|
-
/** The styles of the element. */
|
|
44
|
-
static override styles: CSSResultGroup = css`
|
|
45
|
-
:host {
|
|
46
|
-
display: block;
|
|
47
|
-
overflow-y: auto;
|
|
48
|
-
position: relative;
|
|
49
|
-
box-sizing: border-box;
|
|
50
|
-
scrollbar-color: ${DesignToken.scrollbar.color};
|
|
51
|
-
border-top: var(--m3e-divider-thickness, 1px) solid transparent;
|
|
52
|
-
border-bottom: var(--m3e-divider-thickness, 1px) solid transparent;
|
|
53
|
-
outline: var(--m3e-focus-ring-color, ${DesignToken.color.secondary});
|
|
54
|
-
outline-width: var(--m3e-focus-ring-thickness, 0.25rem);
|
|
55
|
-
outline-offset: calc(var(--m3e-focus-ring-thickness, 0.25rem) / 2);
|
|
56
|
-
}
|
|
57
|
-
:host([thin]) {
|
|
58
|
-
scrollbar-width: ${DesignToken.scrollbar.thinWidth};
|
|
59
|
-
}
|
|
60
|
-
:host(:not([thin])) {
|
|
61
|
-
scrollbar-width: ${DesignToken.scrollbar.width};
|
|
62
|
-
}
|
|
63
|
-
:host(:not(:focus-visible).-above) {
|
|
64
|
-
border-top-color: var(--m3e-divider-color, ${DesignToken.color.outlineVariant});
|
|
65
|
-
}
|
|
66
|
-
:host(:not(:focus-visible).-below) {
|
|
67
|
-
border-bottom-color: var(--m3e-divider-color, ${DesignToken.color.outlineVariant});
|
|
68
|
-
}
|
|
69
|
-
:host(:focus-visible) {
|
|
70
|
-
outline-style: solid;
|
|
71
|
-
animation: grow-shrink var(--m3e-focus-ring-duration, ${DesignToken.motion.duration.long2});
|
|
72
|
-
}
|
|
73
|
-
@keyframes grow-shrink {
|
|
74
|
-
50% {
|
|
75
|
-
outline-width: calc(var(--m3e-focus-ring-thickness, 0.25rem) * var(--m3e-focus-ring-factor, 2));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
@media (forced-colors: active) {
|
|
79
|
-
:host {
|
|
80
|
-
border-top: var(--m3e-divider-thickness, 1px) solid Canvas;
|
|
81
|
-
border-bottom: var(--m3e-divider-thickness, 1px) solid Canvas;
|
|
82
|
-
}
|
|
83
|
-
:host(:not(:focus-visible).-above) {
|
|
84
|
-
border-top-color: GrayText;
|
|
85
|
-
}
|
|
86
|
-
:host(:not(:focus-visible).-below) {
|
|
87
|
-
border-bottom-color: GrayText;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
@media (prefers-reduced-motion) {
|
|
91
|
-
:host(:focus-visible) {
|
|
92
|
-
animation: none;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
`;
|
|
96
|
-
|
|
97
|
-
/** @private */ readonly #scrollHandler = () => this._updateScroll();
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* The dividers used to separate scrollable content.
|
|
101
|
-
* @default "above-below"
|
|
102
|
-
*/
|
|
103
|
-
@property() dividers: ScrollDividers = "above-below";
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Whether to present thin scrollbars.
|
|
107
|
-
* @default false
|
|
108
|
-
*/
|
|
109
|
-
@property({ type: Boolean, reflect: true }) thin = false;
|
|
110
|
-
|
|
111
|
-
/** @inheritdoc */
|
|
112
|
-
override disconnectedCallback(): void {
|
|
113
|
-
super.disconnectedCallback();
|
|
114
|
-
this.removeEventListener("scroll", this.#scrollHandler);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/** @inheritdoc */
|
|
118
|
-
protected override update(changedProperties: PropertyValues<this>): void {
|
|
119
|
-
super.update(changedProperties);
|
|
120
|
-
|
|
121
|
-
if (changedProperties.has("dividers")) {
|
|
122
|
-
this.removeEventListener("scroll", this.#scrollHandler);
|
|
123
|
-
if (this.dividers !== "none") {
|
|
124
|
-
this.addEventListener("scroll", this.#scrollHandler);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/** @inheritdoc */
|
|
130
|
-
protected override render(): unknown {
|
|
131
|
-
return html`<slot @slotchange="${this._updateScroll}"></slot>`;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/** @private */
|
|
135
|
-
@debounce(40)
|
|
136
|
-
private _updateScroll(): void {
|
|
137
|
-
const before = (this.dividers === "above" || this.dividers === "above-below") && this.scrollTop > 0;
|
|
138
|
-
const after =
|
|
139
|
-
(this.dividers === "below" || this.dividers === "above-below") &&
|
|
140
|
-
this.scrollHeight - this.scrollTop - this.clientHeight > 1;
|
|
141
|
-
|
|
142
|
-
this.classList.toggle("-above", before);
|
|
143
|
-
this.classList.toggle("-below", after);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
declare global {
|
|
148
|
-
interface HTMLElementTagNameMap {
|
|
149
|
-
"m3e-scroll-container": M3eScrollContainerElement;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { css, CSSResultGroup, html, LitElement, PropertyValues, unsafeCSS } from "lit";
|
|
2
|
-
import { customElement, property, queryAssignedElements } from "lit/decorators.js";
|
|
3
|
-
|
|
4
|
-
import { DesignToken } from "../tokens";
|
|
5
|
-
import { Role } from "../mixins";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* A carousel-like container used to horizontally cycle through slotted items.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* The following example illustrates the use of `m3e-slide` to cycle through content.
|
|
12
|
-
* In this example, `selected-index` is set to `1` so that "Content at index 1" is presented
|
|
13
|
-
* by the component.
|
|
14
|
-
* ```html
|
|
15
|
-
* <m3e-slide selected-index="1">
|
|
16
|
-
* <div>Content at index 0</div>
|
|
17
|
-
* <div>Content at index 1</div>
|
|
18
|
-
* <div>Content at index 2</div>
|
|
19
|
-
* <div>Content at index 3</div>
|
|
20
|
-
* </m3e-slide>
|
|
21
|
-
* ```
|
|
22
|
-
*
|
|
23
|
-
* @tag m3e-slide
|
|
24
|
-
*
|
|
25
|
-
* @attr selected-index - The zero-based index of the visible item.
|
|
26
|
-
*
|
|
27
|
-
* @cssprop --m3e-slide-animation-duration - The duration of transitions between slotted items.
|
|
28
|
-
*/
|
|
29
|
-
@customElement("m3e-slide")
|
|
30
|
-
export class M3eSlide extends Role(LitElement, "none") {
|
|
31
|
-
/** The styles of the element. */
|
|
32
|
-
static override styles: CSSResultGroup = css`
|
|
33
|
-
:host {
|
|
34
|
-
display: flex;
|
|
35
|
-
position: relative;
|
|
36
|
-
overflow: hidden;
|
|
37
|
-
}
|
|
38
|
-
::slotted(*) {
|
|
39
|
-
width: 100%;
|
|
40
|
-
top: 0;
|
|
41
|
-
transition: ${unsafeCSS(
|
|
42
|
-
`left var(--m3e-slide-animation-duration, ${DesignToken.motion.duration.long2}) ${DesignToken.motion.easing.standard},
|
|
43
|
-
visibility var(--m3e-slide-animation-duration, ${DesignToken.motion.duration.long2}) ${DesignToken.motion.easing.standard} allow-discrete`
|
|
44
|
-
)};
|
|
45
|
-
}
|
|
46
|
-
::slotted(.-before),
|
|
47
|
-
::slotted(.-after) {
|
|
48
|
-
visibility: hidden;
|
|
49
|
-
position: absolute;
|
|
50
|
-
}
|
|
51
|
-
::slotted(.-before) {
|
|
52
|
-
left: -100%;
|
|
53
|
-
}
|
|
54
|
-
::slotted(.-after) {
|
|
55
|
-
left: 100%;
|
|
56
|
-
}
|
|
57
|
-
::slotted(:not(.-before):not(.-after)) {
|
|
58
|
-
visibility: visible;
|
|
59
|
-
position: relative;
|
|
60
|
-
left: 0;
|
|
61
|
-
}
|
|
62
|
-
:host(.-no-animate) ::slotted(*) {
|
|
63
|
-
transition: none;
|
|
64
|
-
}
|
|
65
|
-
@media (prefers-reduced-motion) {
|
|
66
|
-
::slotted(*) {
|
|
67
|
-
transition: none;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
`;
|
|
71
|
-
|
|
72
|
-
/** @private */ @queryAssignedElements({ flatten: true }) private readonly _items!: Element[];
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* The zero-based index of the visible item.
|
|
76
|
-
* @default null
|
|
77
|
-
*/
|
|
78
|
-
@property({ attribute: "selected-index", type: Number, reflect: true }) selectedIndex: number | null = null;
|
|
79
|
-
|
|
80
|
-
/** @inheritdoc */
|
|
81
|
-
override connectedCallback(): void {
|
|
82
|
-
super.connectedCallback();
|
|
83
|
-
this.classList.toggle("-no-animate", true);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/** @inheritdoc */
|
|
87
|
-
protected override update(changedProperties: PropertyValues<this>): void {
|
|
88
|
-
super.update(changedProperties);
|
|
89
|
-
|
|
90
|
-
if (changedProperties.has("selectedIndex")) {
|
|
91
|
-
if (this.selectedIndex === null) {
|
|
92
|
-
this.classList.toggle("-no-animate", true);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
this.#updateItems();
|
|
96
|
-
|
|
97
|
-
if (this.selectedIndex !== null && this.classList.contains("-no-animate")) {
|
|
98
|
-
requestAnimationFrame(() => {
|
|
99
|
-
if (this.selectedIndex !== null) {
|
|
100
|
-
this.classList.toggle("-no-animate", false);
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/** @inheritdoc */
|
|
108
|
-
protected override render(): unknown {
|
|
109
|
-
return html`<slot @slotchange="${this.#updateItems}"></slot>`;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/** @private */
|
|
113
|
-
#updateItems(): void {
|
|
114
|
-
const selectedIndex = this.selectedIndex ?? this._items.length;
|
|
115
|
-
for (let i = 0; i < this._items.length; i++) {
|
|
116
|
-
const item = this._items[i];
|
|
117
|
-
item.classList.toggle("-before", i < selectedIndex);
|
|
118
|
-
item.classList.toggle("-after", i > selectedIndex);
|
|
119
|
-
item.toggleAttribute("inert", i !== selectedIndex);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
declare global {
|
|
125
|
-
interface HTMLElementTagNameMap {
|
|
126
|
-
"m3e-slide": M3eSlide;
|
|
127
|
-
}
|
|
128
|
-
}
|