@moni-labs/moni-ui 0.2.0 → 0.3.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 +52 -194
- package/custom-elements.json +1709 -338
- package/dist/actions/index.d.ts +6 -0
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +6 -0
- package/dist/components/_base/field-styles.d.ts +51 -16
- package/dist/components/_base/field-styles.d.ts.map +1 -1
- package/dist/components/_base/field-styles.js +164 -36
- package/dist/components/_base/index.d.ts +25 -0
- package/dist/components/_base/index.d.ts.map +1 -1
- package/dist/components/_base/index.js +25 -0
- package/dist/components/_base/interaction-styles.d.ts +39 -12
- package/dist/components/_base/interaction-styles.d.ts.map +1 -1
- package/dist/components/_base/interaction-styles.js +85 -33
- package/dist/components/_base/moni-element.d.ts +43 -8
- package/dist/components/_base/moni-element.d.ts.map +1 -1
- package/dist/components/_base/moni-element.js +43 -8
- package/dist/components/_base/shared-styles.d.ts +41 -17
- package/dist/components/_base/shared-styles.d.ts.map +1 -1
- package/dist/components/_base/shared-styles.js +113 -21
- package/dist/components/index.d.ts +6 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +6 -0
- package/dist/components/loading-shapes.d.ts +6 -0
- package/dist/components/loading-shapes.d.ts.map +1 -1
- package/dist/components/loading-shapes.js +6 -0
- package/dist/components/moni-app-bar.d.ts +128 -33
- package/dist/components/moni-app-bar.d.ts.map +1 -1
- package/dist/components/moni-app-bar.js +121 -26
- package/dist/components/moni-badge.d.ts +122 -14
- package/dist/components/moni-badge.d.ts.map +1 -1
- package/dist/components/moni-badge.js +122 -14
- package/dist/components/moni-bottom-sheet.d.ts +120 -15
- package/dist/components/moni-bottom-sheet.d.ts.map +1 -1
- package/dist/components/moni-bottom-sheet.js +116 -12
- package/dist/components/moni-button-group.d.ts +53 -27
- package/dist/components/moni-button-group.d.ts.map +1 -1
- package/dist/components/moni-button-group.js +49 -23
- package/dist/components/moni-button-segment.d.ts +28 -8
- package/dist/components/moni-button-segment.d.ts.map +1 -1
- package/dist/components/moni-button-segment.js +27 -7
- package/dist/components/moni-button.d.ts +51 -32
- package/dist/components/moni-button.d.ts.map +1 -1
- package/dist/components/moni-button.js +50 -31
- package/dist/components/moni-card.d.ts +91 -31
- package/dist/components/moni-card.d.ts.map +1 -1
- package/dist/components/moni-card.js +86 -26
- package/dist/components/moni-carousel.d.ts +80 -17
- package/dist/components/moni-carousel.d.ts.map +1 -1
- package/dist/components/moni-carousel.js +258 -34
- package/dist/components/moni-checkbox.d.ts +122 -17
- package/dist/components/moni-checkbox.d.ts.map +1 -1
- package/dist/components/moni-checkbox.js +118 -14
- package/dist/components/moni-chip.d.ts +56 -30
- package/dist/components/moni-chip.d.ts.map +1 -1
- package/dist/components/moni-chip.js +51 -25
- package/dist/components/moni-color-field.d.ts +44 -6
- package/dist/components/moni-color-field.d.ts.map +1 -1
- package/dist/components/moni-color-field.js +43 -5
- package/dist/components/moni-context-menu.d.ts +44 -22
- package/dist/components/moni-context-menu.d.ts.map +1 -1
- package/dist/components/moni-context-menu.js +43 -21
- package/dist/components/moni-dialog.d.ts +107 -15
- package/dist/components/moni-dialog.d.ts.map +1 -1
- package/dist/components/moni-dialog.js +105 -14
- package/dist/components/moni-divider.d.ts +50 -15
- package/dist/components/moni-divider.d.ts.map +1 -1
- package/dist/components/moni-divider.js +49 -14
- package/dist/components/moni-expansion.d.ts +44 -8
- package/dist/components/moni-expansion.d.ts.map +1 -1
- package/dist/components/moni-expansion.js +43 -7
- package/dist/components/moni-fab-menu.d.ts +39 -20
- package/dist/components/moni-fab-menu.d.ts.map +1 -1
- package/dist/components/moni-fab-menu.js +38 -19
- package/dist/components/moni-fab.d.ts +49 -23
- package/dist/components/moni-fab.d.ts.map +1 -1
- package/dist/components/moni-fab.js +46 -20
- package/dist/components/moni-file-field.d.ts +54 -14
- package/dist/components/moni-file-field.d.ts.map +1 -1
- package/dist/components/moni-file-field.js +53 -13
- package/dist/components/moni-icon.d.ts +78 -11
- package/dist/components/moni-icon.d.ts.map +1 -1
- package/dist/components/moni-icon.js +77 -10
- package/dist/components/moni-list-item.d.ts +61 -30
- package/dist/components/moni-list-item.d.ts.map +1 -1
- package/dist/components/moni-list-item.js +55 -24
- package/dist/components/moni-list.d.ts +37 -13
- package/dist/components/moni-list.d.ts.map +1 -1
- package/dist/components/moni-list.js +36 -12
- package/dist/components/moni-loading-indicator.d.ts +38 -11
- package/dist/components/moni-loading-indicator.d.ts.map +1 -1
- package/dist/components/moni-loading-indicator.js +37 -10
- package/dist/components/moni-menu-item.d.ts +31 -8
- package/dist/components/moni-menu-item.d.ts.map +1 -1
- package/dist/components/moni-menu-item.js +30 -7
- package/dist/components/moni-menu.d.ts +58 -33
- package/dist/components/moni-menu.d.ts.map +1 -1
- package/dist/components/moni-menu.js +51 -26
- package/dist/components/moni-morph-modal.d.ts +7 -1
- package/dist/components/moni-morph-modal.d.ts.map +1 -1
- package/dist/components/moni-morph-modal.js +46 -24
- package/dist/components/moni-nav-item.d.ts +50 -10
- package/dist/components/moni-nav-item.d.ts.map +1 -1
- package/dist/components/moni-nav-item.js +48 -8
- package/dist/components/moni-nav.d.ts +57 -22
- package/dist/components/moni-nav.d.ts.map +1 -1
- package/dist/components/moni-nav.js +53 -18
- package/dist/components/moni-progress.d.ts +108 -20
- package/dist/components/moni-progress.d.ts.map +1 -1
- package/dist/components/moni-progress.js +104 -16
- package/dist/components/moni-radio.d.ts +106 -14
- package/dist/components/moni-radio.d.ts.map +1 -1
- package/dist/components/moni-radio.js +104 -13
- package/dist/components/moni-ripple.d.ts +121 -10
- package/dist/components/moni-ripple.d.ts.map +1 -1
- package/dist/components/moni-ripple.js +120 -9
- package/dist/components/moni-segmented-button.d.ts +31 -11
- package/dist/components/moni-segmented-button.d.ts.map +1 -1
- package/dist/components/moni-segmented-button.js +30 -10
- package/dist/components/moni-select-option.d.ts +43 -9
- package/dist/components/moni-select-option.d.ts.map +1 -1
- package/dist/components/moni-select-option.js +41 -7
- package/dist/components/moni-select.d.ts +59 -2
- package/dist/components/moni-select.d.ts.map +1 -1
- package/dist/components/moni-select.js +58 -1
- package/dist/components/moni-shape.d.ts +1 -1
- package/dist/components/moni-side-sheet.d.ts +56 -19
- package/dist/components/moni-side-sheet.d.ts.map +1 -1
- package/dist/components/moni-side-sheet.js +53 -16
- package/dist/components/moni-slider.d.ts +56 -25
- package/dist/components/moni-slider.d.ts.map +1 -1
- package/dist/components/moni-slider.js +55 -24
- package/dist/components/moni-snackbar.d.ts +86 -17
- package/dist/components/moni-snackbar.d.ts.map +1 -1
- package/dist/components/moni-snackbar.js +85 -16
- package/dist/components/moni-split-button.d.ts +38 -9
- package/dist/components/moni-split-button.d.ts.map +1 -1
- package/dist/components/moni-split-button.js +37 -8
- package/dist/components/moni-step.d.ts +42 -9
- package/dist/components/moni-step.d.ts.map +1 -1
- package/dist/components/moni-step.js +41 -8
- package/dist/components/moni-stepper.d.ts +43 -6
- package/dist/components/moni-stepper.d.ts.map +1 -1
- package/dist/components/moni-stepper.js +42 -5
- package/dist/components/moni-switch.d.ts +103 -16
- package/dist/components/moni-switch.d.ts.map +1 -1
- package/dist/components/moni-switch.js +99 -13
- package/dist/components/moni-tab.d.ts +35 -8
- package/dist/components/moni-tab.d.ts.map +1 -1
- package/dist/components/moni-tab.js +34 -7
- package/dist/components/moni-tabs.d.ts +51 -13
- package/dist/components/moni-tabs.d.ts.map +1 -1
- package/dist/components/moni-tabs.js +48 -10
- package/dist/components/moni-text-field.d.ts +55 -10
- package/dist/components/moni-text-field.d.ts.map +1 -1
- package/dist/components/moni-text-field.js +54 -9
- package/dist/components/moni-textarea.d.ts +51 -21
- package/dist/components/moni-textarea.d.ts.map +1 -1
- package/dist/components/moni-textarea.js +48 -18
- package/dist/components/moni-time-picker.d.ts +41 -11
- package/dist/components/moni-time-picker.d.ts.map +1 -1
- package/dist/components/moni-time-picker.js +40 -10
- package/dist/components/moni-toolbar.d.ts +43 -15
- package/dist/components/moni-toolbar.d.ts.map +1 -1
- package/dist/components/moni-toolbar.js +42 -14
- package/dist/components/moni-tooltip.d.ts +55 -25
- package/dist/components/moni-tooltip.d.ts.map +1 -1
- package/dist/components/moni-tooltip.js +54 -24
- package/dist/components/moni-typography.d.ts +43 -18
- package/dist/components/moni-typography.d.ts.map +1 -1
- package/dist/components/moni-typography.js +42 -17
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -2
- package/dist/styles/tailwind.css +67 -0
- package/dist/styles/tokens.css +111 -99
- package/dist/utils/color.d.ts +181 -2
- package/dist/utils/color.d.ts.map +1 -1
- package/dist/utils/color.js +182 -4
- package/dist/utils/theme.svelte.d.ts +305 -2
- package/dist/utils/theme.svelte.d.ts.map +1 -1
- package/dist/utils/theme.svelte.js +331 -2
- package/dist/web-components.d.ts +28 -0
- package/dist/web-components.d.ts.map +1 -1
- package/dist/web-components.js +29 -2
- package/package.json +1 -1
- package/src/actions/index.ts +7 -0
- package/src/components/_base/field-styles.ts +165 -37
- package/src/components/_base/index.ts +27 -0
- package/src/components/_base/interaction-styles.ts +86 -33
- package/src/components/_base/moni-element.ts +44 -8
- package/src/components/_base/shared-styles.ts +114 -21
- package/src/components/index.ts +7 -0
- package/src/components/loading-shapes.ts +7 -0
- package/src/components/moni-app-bar.ts +127 -26
- package/src/components/moni-badge.ts +128 -14
- package/src/components/moni-bottom-sheet.ts +125 -13
- package/src/components/moni-button-group.ts +50 -23
- package/src/components/moni-button-segment.ts +28 -7
- package/src/components/moni-button.ts +51 -31
- package/src/components/moni-card.ts +90 -26
- package/src/components/moni-carousel.ts +282 -34
- package/src/components/moni-checkbox.ts +125 -14
- package/src/components/moni-chip.ts +52 -25
- package/src/components/moni-color-field.ts +44 -5
- package/src/components/moni-context-menu.ts +44 -21
- package/src/components/moni-dialog.ts +111 -14
- package/src/components/moni-divider.ts +50 -14
- package/src/components/moni-expansion.ts +44 -7
- package/src/components/moni-fab-menu.ts +39 -19
- package/src/components/moni-fab.ts +47 -20
- package/src/components/moni-file-field.ts +54 -13
- package/src/components/moni-icon.ts +80 -10
- package/src/components/moni-list-item.ts +56 -24
- package/src/components/moni-list.ts +37 -12
- package/src/components/moni-loading-indicator.ts +38 -10
- package/src/components/moni-menu-item.ts +31 -7
- package/src/components/moni-menu.ts +52 -26
- package/src/components/moni-morph-modal.ts +58 -24
- package/src/components/moni-nav-item.ts +49 -8
- package/src/components/moni-nav.ts +54 -18
- package/src/components/moni-progress.ts +109 -16
- package/src/components/moni-radio.ts +111 -13
- package/src/components/moni-ripple.ts +126 -9
- package/src/components/moni-segmented-button.ts +31 -10
- package/src/components/moni-select-option.ts +42 -7
- package/src/components/moni-select.ts +79 -1
- package/src/components/moni-side-sheet.ts +54 -16
- package/src/components/moni-slider.ts +56 -24
- package/src/components/moni-snackbar.ts +90 -16
- package/src/components/moni-split-button.ts +38 -8
- package/src/components/moni-step.ts +42 -8
- package/src/components/moni-stepper.ts +43 -5
- package/src/components/moni-switch.ts +106 -13
- package/src/components/moni-tab.ts +35 -7
- package/src/components/moni-tabs.ts +49 -10
- package/src/components/moni-text-field.ts +55 -9
- package/src/components/moni-textarea.ts +49 -18
- package/src/components/moni-time-picker.ts +41 -10
- package/src/components/moni-toolbar.ts +43 -14
- package/src/components/moni-tooltip.ts +55 -24
- package/src/components/moni-typography.ts +43 -17
- package/src/index.ts +67 -3
- package/src/styles/tailwind.css +67 -0
- package/src/styles/tokens.css +111 -99
- package/src/types/svelte-runes.d.ts +64 -2
- package/src/utils/color.ts +286 -5
- package/src/utils/theme.svelte.ts +411 -2
- package/src/web-components.ts +31 -2
- package/dist/assets/shapes/arch.svg +0 -1
- package/dist/assets/shapes/arrow.svg +0 -1
- package/dist/assets/shapes/boom.svg +0 -1
- package/dist/assets/shapes/burst.svg +0 -1
- package/dist/assets/shapes/circle.svg +0 -1
- package/dist/assets/shapes/clamshell.svg +0 -1
- package/dist/assets/shapes/diamond.svg +0 -1
- package/dist/assets/shapes/fan.svg +0 -1
- package/dist/assets/shapes/flower.svg +0 -1
- package/dist/assets/shapes/gem.svg +0 -1
- package/dist/assets/shapes/ghost-ish.svg +0 -1
- package/dist/assets/shapes/heart.svg +0 -1
- package/dist/assets/shapes/leaf-clover4.svg +0 -1
- package/dist/assets/shapes/leaf-clover8.svg +0 -1
- package/dist/assets/shapes/loading-indicator.svg +0 -1
- package/dist/assets/shapes/oval.svg +0 -1
- package/dist/assets/shapes/pentagon.svg +0 -1
- package/dist/assets/shapes/pill.svg +0 -1
- package/dist/assets/shapes/pixel-circle.svg +0 -1
- package/dist/assets/shapes/pixel-triangle.svg +0 -1
- package/dist/assets/shapes/puffy-diamond.svg +0 -1
- package/dist/assets/shapes/puffy.svg +0 -1
- package/dist/assets/shapes/semicircle.svg +0 -1
- package/dist/assets/shapes/sided-cookie12.svg +0 -1
- package/dist/assets/shapes/sided-cookie4.svg +0 -1
- package/dist/assets/shapes/sided-cookie6.svg +0 -1
- package/dist/assets/shapes/sided-cookie7.svg +0 -1
- package/dist/assets/shapes/sided-cookie9.svg +0 -1
- package/dist/assets/shapes/slanted.svg +0 -1
- package/dist/assets/shapes/soft-boom.svg +0 -1
- package/dist/assets/shapes/soft-burst.svg +0 -1
- package/dist/assets/shapes/square.svg +0 -1
- package/dist/assets/shapes/sunny.svg +0 -1
- package/dist/assets/shapes/triangle.svg +0 -1
- package/dist/assets/shapes/very-sunny.svg +0 -1
- package/dist/assets/shapes/wavy-circle.svg +0 -1
- package/dist/assets/shapes/wavy.svg +0 -1
- package/src/assets/shapes/arch.svg +0 -1
- package/src/assets/shapes/arrow.svg +0 -1
- package/src/assets/shapes/boom.svg +0 -1
- package/src/assets/shapes/burst.svg +0 -1
- package/src/assets/shapes/circle.svg +0 -1
- package/src/assets/shapes/clamshell.svg +0 -1
- package/src/assets/shapes/diamond.svg +0 -1
- package/src/assets/shapes/fan.svg +0 -1
- package/src/assets/shapes/flower.svg +0 -1
- package/src/assets/shapes/gem.svg +0 -1
- package/src/assets/shapes/ghost-ish.svg +0 -1
- package/src/assets/shapes/heart.svg +0 -1
- package/src/assets/shapes/leaf-clover4.svg +0 -1
- package/src/assets/shapes/leaf-clover8.svg +0 -1
- package/src/assets/shapes/loading-indicator.svg +0 -1
- package/src/assets/shapes/oval.svg +0 -1
- package/src/assets/shapes/pentagon.svg +0 -1
- package/src/assets/shapes/pill.svg +0 -1
- package/src/assets/shapes/pixel-circle.svg +0 -1
- package/src/assets/shapes/pixel-triangle.svg +0 -1
- package/src/assets/shapes/puffy-diamond.svg +0 -1
- package/src/assets/shapes/puffy.svg +0 -1
- package/src/assets/shapes/semicircle.svg +0 -1
- package/src/assets/shapes/sided-cookie12.svg +0 -1
- package/src/assets/shapes/sided-cookie4.svg +0 -1
- package/src/assets/shapes/sided-cookie6.svg +0 -1
- package/src/assets/shapes/sided-cookie7.svg +0 -1
- package/src/assets/shapes/sided-cookie9.svg +0 -1
- package/src/assets/shapes/slanted.svg +0 -1
- package/src/assets/shapes/soft-boom.svg +0 -1
- package/src/assets/shapes/soft-burst.svg +0 -1
- package/src/assets/shapes/square.svg +0 -1
- package/src/assets/shapes/sunny.svg +0 -1
- package/src/assets/shapes/triangle.svg +0 -1
- package/src/assets/shapes/very-sunny.svg +0 -1
- package/src/assets/shapes/wavy-circle.svg +0 -1
- package/src/assets/shapes/wavy.svg +0 -1
|
@@ -1,33 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/moni-ripple.ts
|
|
3
|
+
* @package @moni-labs/moni-ui
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @contributors Moni Labs & Contributors
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import { html, css } from 'lit';
|
|
2
9
|
import { customElement, property } from 'lit/decorators.js';
|
|
3
10
|
import { MoniElement, sharedStyles } from './_base/index.js';
|
|
4
11
|
|
|
5
12
|
/**
|
|
6
|
-
* Visual-only ripple decoration.
|
|
13
|
+
* Visual-only ripple decoration component.
|
|
14
|
+
*
|
|
15
|
+
* Provides a pointer-origin ripple animation — the expanding circle starts
|
|
16
|
+
* at the exact pointer-down coordinates rather than the element's center.
|
|
17
|
+
* This is the full-fidelity M3 ripple; for a simpler CSS-only center-ripple,
|
|
18
|
+
* use the `interactionStyles` `.interactive::after` pseudo-element instead.
|
|
19
|
+
*
|
|
20
|
+
* **Usage:**
|
|
21
|
+
* Drop `<moni-ripple>` as a **child** of any interactive element. The component
|
|
22
|
+
* automatically attaches a `pointerdown` listener to its `parentElement` and
|
|
23
|
+
* calculates the ripple origin in percentage coordinates relative to the parent.
|
|
24
|
+
*
|
|
25
|
+
* The parent element must NOT have `position: static` (the ripple applies
|
|
26
|
+
* `position: relative` automatically in `connectedCallback`).
|
|
27
|
+
*
|
|
28
|
+
* **Timing model:**
|
|
29
|
+
* On `pointerdown`:
|
|
30
|
+
* 1. `active = false` is set (cancels any in-progress ripple).
|
|
31
|
+
* 2. A `requestAnimationFrame` tick ensures the browser has processed the reset.
|
|
32
|
+
* 3. `active = true` triggers the CSS scale animation.
|
|
33
|
+
* 4. A `setTimeout` of `duration` ms (based on `speed`) resets `active = false`.
|
|
7
34
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* run for `duration` ms and then the element becomes hidden.
|
|
35
|
+
* The duration matches the CSS transition duration so the opacity fade-out
|
|
36
|
+
* completes before `active` is cleared.
|
|
11
37
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
38
|
+
* **Cleanup:**
|
|
39
|
+
* `disconnectedCallback` removes the `pointerdown` listener and clears any
|
|
40
|
+
* pending timeout. Always call `super.disconnectedCallback()` if subclassing.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```html
|
|
44
|
+
* <!-- Ripple on a custom element -->
|
|
45
|
+
* <div class="my-button" style="position: relative; overflow: hidden;">
|
|
46
|
+
* Click me
|
|
47
|
+
* <moni-ripple color="primary"></moni-ripple>
|
|
48
|
+
* </div>
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @csspart ripple - The inner `<span>` that performs the scale animation.
|
|
17
52
|
*/
|
|
18
53
|
@customElement('moni-ripple')
|
|
19
54
|
export class MoniRipple extends MoniElement {
|
|
55
|
+
/**
|
|
56
|
+
* Horizontal origin of the ripple as a percentage of the parent's width.
|
|
57
|
+
*
|
|
58
|
+
* Set automatically by `_onPointerDown` based on the pointer coordinates.
|
|
59
|
+
* Can be set manually to trigger a ripple at a specific location.
|
|
60
|
+
*
|
|
61
|
+
* @default 50
|
|
62
|
+
*/
|
|
20
63
|
@property({ type: Number, reflect: true }) x = 50;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Vertical origin of the ripple as a percentage of the parent's height.
|
|
67
|
+
*
|
|
68
|
+
* Set automatically by `_onPointerDown` based on the pointer coordinates.
|
|
69
|
+
*
|
|
70
|
+
* @default 50
|
|
71
|
+
*/
|
|
21
72
|
@property({ type: Number, reflect: true }) y = 50;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* When `true`, the ripple is visible and animating.
|
|
76
|
+
*
|
|
77
|
+
* Toggled automatically by `_onPointerDown`. Can be set manually for
|
|
78
|
+
* programmatically-triggered ripple effects.
|
|
79
|
+
*
|
|
80
|
+
* @default false
|
|
81
|
+
*/
|
|
22
82
|
@property({ type: Boolean, reflect: true }) active = false;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Animation speed of the ripple expand-and-fade sequence.
|
|
86
|
+
*
|
|
87
|
+
* Maps to the `--_dur` CSS custom property:
|
|
88
|
+
* - `'fast'` — 300ms
|
|
89
|
+
* - `'normal'` — 600ms (default)
|
|
90
|
+
* - `'slow'` — 1200ms
|
|
91
|
+
*
|
|
92
|
+
* @default 'normal'
|
|
93
|
+
*/
|
|
23
94
|
@property({ reflect: true })
|
|
24
95
|
speed: 'fast' | 'normal' | 'slow' = 'normal';
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Color token for the ripple overlay.
|
|
99
|
+
*
|
|
100
|
+
* Sets the `color` CSS property on `:host`, which the `.ripple` span
|
|
101
|
+
* inherits via `background-color: currentColor`.
|
|
102
|
+
*
|
|
103
|
+
* - `'primary'` — `--primary` (default)
|
|
104
|
+
* - `'secondary'` — `--secondary`
|
|
105
|
+
* - `'surface'` — `--surface-variant` (subtle, for surface containers)
|
|
106
|
+
*
|
|
107
|
+
* @default 'primary'
|
|
108
|
+
*/
|
|
25
109
|
@property({ reflect: true })
|
|
26
110
|
color: 'primary' | 'secondary' | 'surface' = 'primary';
|
|
27
111
|
|
|
112
|
+
/**
|
|
113
|
+
* Reference to the parent element that the ripple is anchored to.
|
|
114
|
+
* Populated in `connectedCallback`, cleared in `disconnectedCallback`.
|
|
115
|
+
*/
|
|
28
116
|
private _target: HTMLElement | null = null;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* ID of the pending `setTimeout` that clears `active` after the animation.
|
|
120
|
+
* Stored so it can be cancelled if a second pointer event fires before the
|
|
121
|
+
* first ripple finishes (rapid double-tap prevention).
|
|
122
|
+
*/
|
|
29
123
|
private _timeoutId: any = null;
|
|
30
124
|
|
|
125
|
+
/**
|
|
126
|
+
* Attaches the ripple to its parent element.
|
|
127
|
+
*
|
|
128
|
+
* - Stores a reference to `parentElement` for pointer event listening.
|
|
129
|
+
* - Ensures the parent has `position: relative` so the ripple's `position: absolute`
|
|
130
|
+
* stays within bounds.
|
|
131
|
+
* - Registers the `_onPointerDown` event listener.
|
|
132
|
+
*/
|
|
31
133
|
override connectedCallback() {
|
|
32
134
|
super.connectedCallback();
|
|
33
135
|
this._target = this.parentElement;
|
|
@@ -40,6 +142,12 @@ export class MoniRipple extends MoniElement {
|
|
|
40
142
|
}
|
|
41
143
|
}
|
|
42
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Detaches the ripple from its parent element.
|
|
147
|
+
*
|
|
148
|
+
* Removes the `pointerdown` listener and clears any pending timeout to
|
|
149
|
+
* prevent the `active` flag from being set after the element is removed.
|
|
150
|
+
*/
|
|
43
151
|
override disconnectedCallback() {
|
|
44
152
|
if (this._target) {
|
|
45
153
|
this._target.removeEventListener('pointerdown', this._onPointerDown);
|
|
@@ -50,6 +158,15 @@ export class MoniRipple extends MoniElement {
|
|
|
50
158
|
super.disconnectedCallback();
|
|
51
159
|
}
|
|
52
160
|
|
|
161
|
+
/**
|
|
162
|
+
* Handles pointer-down events on the parent element.
|
|
163
|
+
*
|
|
164
|
+
* Computes the ripple origin as a percentage of the parent's bounding rect,
|
|
165
|
+
* cancels any in-progress ripple, then triggers a new one after one
|
|
166
|
+
* animation frame to guarantee the CSS transition fires from the new position.
|
|
167
|
+
*
|
|
168
|
+
* @param e - The `PointerEvent` from the parent's `pointerdown` listener.
|
|
169
|
+
*/
|
|
53
170
|
private _onPointerDown = (e: PointerEvent) => {
|
|
54
171
|
if (!this._target) return;
|
|
55
172
|
const rect = this._target.getBoundingClientRect();
|
|
@@ -1,26 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/moni-segmented-button.ts
|
|
3
|
+
* @package @moni-labs/moni-ui
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @contributors Moni Labs & Contributors
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import { html, css } from 'lit';
|
|
2
9
|
import { customElement, property, queryAssignedElements } from 'lit/decorators.js';
|
|
3
10
|
import { MoniElement, sharedStyles } from './_base/index.js';
|
|
4
11
|
import { MoniButtonSegment } from './moni-button-segment.js';
|
|
5
12
|
|
|
6
13
|
/**
|
|
14
|
+
* Material Design 3 Segmented Button component (Legacy).
|
|
15
|
+
*
|
|
7
16
|
* A form-associated group of selectable segmented buttons.
|
|
8
17
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* `m3-docs/components/segmented-buttons/overview.md` § M3 Expressive update.
|
|
18
|
+
* **Deprecation Notice:** The M3 spec (`m3-docs/components/segmented-buttons/overview.md`)
|
|
19
|
+
* has updated the segmented button pattern. The bespoke segments have been
|
|
20
|
+
* replaced with standard `<moni-button>` elements grouped inside a
|
|
21
|
+
* `<moni-button-group variant="connected">`.
|
|
14
22
|
*
|
|
15
23
|
* This component continues to work for backward compatibility but will be
|
|
16
24
|
* removed in v1.0. A deprecation warning is logged to the console when the
|
|
17
25
|
* element is connected to the DOM.
|
|
18
26
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
27
|
+
* @deprecated Use `<moni-button-group variant="connected">` instead.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```html
|
|
31
|
+
* <!-- Legacy usage (not recommended) -->
|
|
32
|
+
* <moni-segmented-button name="view" multi>
|
|
33
|
+
* <moni-button-segment value="day">Day</moni-button-segment>
|
|
34
|
+
* <moni-button-segment value="week">Week</moni-button-segment>
|
|
35
|
+
* </moni-segmented-button>
|
|
36
|
+
*
|
|
37
|
+
* <!-- Modern M3 equivalent -->
|
|
38
|
+
* <moni-button-group variant="connected">
|
|
39
|
+
* <moni-button>Day</moni-button>
|
|
40
|
+
* <moni-button>Week</moni-button>
|
|
41
|
+
* </moni-button-group>
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @slot default - `<moni-button-segment>` elements.
|
|
24
45
|
*/
|
|
25
46
|
@customElement('moni-segmented-button')
|
|
26
47
|
export class MoniSegmentedButton extends MoniElement {
|
|
@@ -1,16 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/moni-select-option.ts
|
|
3
|
+
* @package @moni-labs/moni-ui
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @contributors Moni Labs & Contributors
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import { html, css } from 'lit';
|
|
2
9
|
import { customElement, property } from 'lit/decorators.js';
|
|
3
10
|
import { MoniElement, sharedStyles } from './_base/index.js';
|
|
4
11
|
|
|
5
12
|
/**
|
|
6
|
-
*
|
|
13
|
+
* Material Design 3 Select Option component.
|
|
14
|
+
*
|
|
15
|
+
* An individual selectable item designed to be placed inside a
|
|
16
|
+
* `<moni-select>` dropdown.
|
|
17
|
+
*
|
|
18
|
+
* **Interaction and layout:**
|
|
19
|
+
* Options are rendered as accessible `<li>` elements styled identically to
|
|
20
|
+
* `<moni-menu-item>`. When slotted into a `<moni-select>`, the parent
|
|
21
|
+
* component extracts their `value`, `label`, and `group` attributes to build
|
|
22
|
+
* its internal data model and handles the actual selection logic, keyboard
|
|
23
|
+
* navigation, and rendering within the dropdown popup.
|
|
24
|
+
*
|
|
25
|
+
* **Grouping:**
|
|
26
|
+
* Options can be categorized into subcategories by providing a `group`
|
|
27
|
+
* attribute. The parent `<moni-select>` uses this to automatically generate
|
|
28
|
+
* group headers (`<moni-select-group>`) in the dropdown list.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```html
|
|
32
|
+
* <moni-select label="Favorite framework">
|
|
33
|
+
* <!-- Standard option -->
|
|
34
|
+
* <moni-select-option value="lit">Lit Element</moni-select-option>
|
|
35
|
+
*
|
|
36
|
+
* <!-- Disabled option -->
|
|
37
|
+
* <moni-select-option value="react" disabled>React (not allowed)</moni-select-option>
|
|
38
|
+
*
|
|
39
|
+
* <!-- Grouped option -->
|
|
40
|
+
* <moni-select-option value="vue" group="Other">Vue.js</moni-select-option>
|
|
41
|
+
* </moni-select>
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @slot default - The text label for the option. If the `label` attribute is
|
|
45
|
+
* omitted, the parent `<moni-select>` will read this slot's
|
|
46
|
+
* `textContent`.
|
|
7
47
|
*
|
|
8
|
-
*
|
|
9
|
-
* - value: string value of the option
|
|
10
|
-
* - label: text label (uses textContent or slot if empty)
|
|
11
|
-
* - group: subcategory group/category name
|
|
12
|
-
* - selected: present -> active highlight state
|
|
13
|
-
* - disabled: present -> disabled
|
|
48
|
+
* @csspart item - The outer `<li>` element.
|
|
14
49
|
*/
|
|
15
50
|
@customElement('moni-select-option')
|
|
16
51
|
export class MoniSelectOption extends MoniElement {
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/moni-select.ts
|
|
3
|
+
* @package @moni-labs/moni-ui
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @contributors Moni Labs & Contributors
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import { html, css, nothing } from 'lit';
|
|
2
9
|
import { customElement, property, state, query } from 'lit/decorators.js';
|
|
3
10
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
@@ -7,25 +14,96 @@ import './moni-icon.js';
|
|
|
7
14
|
import './moni-progress.js';
|
|
8
15
|
import './moni-select-option.js';
|
|
9
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Internal representation of a single option within the select dropdown.
|
|
19
|
+
*
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
10
22
|
interface OptionNode {
|
|
23
|
+
/** Discriminant property that identifies this node as an option. */
|
|
11
24
|
type: 'option';
|
|
25
|
+
/** The value submitted when this option is selected. */
|
|
12
26
|
value: string;
|
|
27
|
+
/** The display label shown in the dropdown list. */
|
|
13
28
|
label: string;
|
|
29
|
+
/** When `true`, the option is non-interactive and grayed out. */
|
|
14
30
|
disabled?: boolean;
|
|
31
|
+
/** Reference to the original slotted `<moni-select-option>` element, if any. */
|
|
15
32
|
element?: HTMLElement;
|
|
33
|
+
/** Optional group name for organizing options under a `<moni-select-group>`. */
|
|
16
34
|
group?: string;
|
|
17
35
|
}
|
|
18
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Internal representation of an option group within the select dropdown.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
19
42
|
interface GroupNode {
|
|
43
|
+
/** Discriminant property that identifies this node as a group. */
|
|
20
44
|
type: 'group';
|
|
45
|
+
/** The group header label displayed above the group's options. */
|
|
21
46
|
label: string;
|
|
47
|
+
/** The options nested within this group. */
|
|
22
48
|
children: DropdownNode[];
|
|
23
49
|
}
|
|
24
50
|
|
|
51
|
+
/** Union type for any node in the dropdown tree. @internal */
|
|
25
52
|
type DropdownNode = OptionNode | GroupNode;
|
|
26
53
|
|
|
27
54
|
/**
|
|
28
|
-
*
|
|
55
|
+
* Material Design 3 Select (Dropdown) component.
|
|
56
|
+
*
|
|
57
|
+
* A fully-featured custom select dropdown with searchability, option groups,
|
|
58
|
+
* keyboard navigation, animation, and optional mobile drawer/sheet mode.
|
|
59
|
+
* Replaces the native `<select>` element with a fully styled, accessible
|
|
60
|
+
* M3-compliant alternative.
|
|
61
|
+
*
|
|
62
|
+
* **M3 spec reference:** `m3-docs/components/menus/specs.md` (dropdown menus)
|
|
63
|
+
*
|
|
64
|
+
* **Feature summary:**
|
|
65
|
+
* - Filled and outlined variants matching the M3 text field styles.
|
|
66
|
+
* - Floating label with the standard field-styles floating label animation.
|
|
67
|
+
* - Searchable mode: `searchable` attribute adds an inline filter input.
|
|
68
|
+
* - Option groups: slot `<moni-select-group>` elements for hierarchical options.
|
|
69
|
+
* - Mobile drawer: `drawer` attribute opens options in a `<moni-bottom-sheet>`
|
|
70
|
+
* instead of a dropdown popup, ideal for touch UIs.
|
|
71
|
+
* - Keyboard navigation: Arrow keys, Enter, Escape, and Tab per ARIA combobox.
|
|
72
|
+
* - Loading state: `loading` shows an indeterminate circular progress.
|
|
73
|
+
* - Multi-value support: `multiple` enables multiple selection.
|
|
74
|
+
*
|
|
75
|
+
* **Option sources:**
|
|
76
|
+
* Options can be provided in two ways:
|
|
77
|
+
* 1. **Slotted `<moni-select-option>` elements** (default, recommended for SSR).
|
|
78
|
+
* 2. **`options` property** — a `DropdownNode[]` array for fully programmatic control.
|
|
79
|
+
*
|
|
80
|
+
* **Value binding:**
|
|
81
|
+
* The `value` property holds the currently selected option's value string.
|
|
82
|
+
* For multiple selection, `values` holds `string[]`. On change, a composed
|
|
83
|
+
* `'change'` event is fired.
|
|
84
|
+
*
|
|
85
|
+
* @fires change - Bubbles and is composed. Fired when the selected value changes.
|
|
86
|
+
* Read `element.value` (or `element.values` for `multiple`).
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```html
|
|
90
|
+
* <moni-select label="Country" name="country" variant="outlined">
|
|
91
|
+
* <moni-select-option value="us">United States</moni-select-option>
|
|
92
|
+
* <moni-select-option value="gb">United Kingdom</moni-select-option>
|
|
93
|
+
* <moni-select-option value="de">Germany</moni-select-option>
|
|
94
|
+
* </moni-select>
|
|
95
|
+
*
|
|
96
|
+
* <!-- Searchable select -->
|
|
97
|
+
* <moni-select label="Language" searchable>
|
|
98
|
+
* <moni-select-option value="ts">TypeScript</moni-select-option>
|
|
99
|
+
* <moni-select-option value="py">Python</moni-select-option>
|
|
100
|
+
* </moni-select>
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @slot default - `<moni-select-option>` or `<moni-select-group>` children.
|
|
104
|
+
*
|
|
105
|
+
* @csspart field - The outer `.field` div container.
|
|
106
|
+
* @csspart dropdown - The floating option list container.
|
|
29
107
|
*/
|
|
30
108
|
@customElement('moni-select')
|
|
31
109
|
export class MoniSelect extends MoniElement {
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/moni-side-sheet.ts
|
|
3
|
+
* @package @moni-labs/moni-ui
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @contributors Moni Labs & Contributors
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import { html, css, PropertyValues } from 'lit';
|
|
2
9
|
import { customElement, property, query } from 'lit/decorators.js';
|
|
3
10
|
import { MoniElement, sharedStyles } from './_base/index.js';
|
|
@@ -5,24 +12,55 @@ import './moni-icon.js';
|
|
|
5
12
|
import './moni-button.js';
|
|
6
13
|
|
|
7
14
|
/**
|
|
8
|
-
* Material Design 3 Side Sheet
|
|
9
|
-
*
|
|
15
|
+
* Material Design 3 Side Sheet component.
|
|
16
|
+
*
|
|
17
|
+
* Side sheets show supplementary content that is anchored to the left or right
|
|
18
|
+
* edge of the screen. They can be standard (inline with content) or modal
|
|
19
|
+
* (overlaying content with a scrim).
|
|
20
|
+
*
|
|
21
|
+
* **M3 spec reference:** `m3-docs/components/side-sheets/specs.md`
|
|
22
|
+
*
|
|
23
|
+
* **Dialog behavior:**
|
|
24
|
+
* Internally, this component uses the native HTML `<dialog>` element for robust
|
|
25
|
+
* accessibility, focus trapping, and top-layer rendering.
|
|
26
|
+
* - When `modal=true`, the sheet uses `dialog.showModal()`, rendering a scrim
|
|
27
|
+
* backdrop and trapping focus. Pressing `Escape` closes it.
|
|
28
|
+
* - When `modal=false`, the sheet uses `dialog.show()` and remains interactive
|
|
29
|
+
* alongside the main page content.
|
|
30
|
+
*
|
|
31
|
+
* **Drag & Resize (Moni feature):**
|
|
32
|
+
* Setting the `with-handle` attribute adds a draggable grab handle to the inner
|
|
33
|
+
* edge of the sheet. Users can click and drag this handle to resize the sheet's
|
|
34
|
+
* width up to the `max-width` limit. If the user drags the sheet towards the
|
|
35
|
+
* screen edge quickly or beyond a certain threshold, it automatically closes.
|
|
36
|
+
*
|
|
37
|
+
* **Animations:**
|
|
38
|
+
* Side sheets slide in from the specified `side` (`left` or `right`). The open
|
|
39
|
+
* and close animations are handled via CSS transitions tied to the `open` property.
|
|
40
|
+
*
|
|
41
|
+
* @fires close - Fired when the side sheet is completely closed (after animations
|
|
42
|
+
* finish), either via the close button, scrim click, drag-to-close,
|
|
43
|
+
* or `Escape` key.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```html
|
|
47
|
+
* <!-- Modal side sheet on the right -->
|
|
48
|
+
* <moni-side-sheet id="details-sheet" modal title="Item Details">
|
|
49
|
+
* <p>Here is more information about the selected item.</p>
|
|
50
|
+
* <div slot="footer">
|
|
51
|
+
* <moni-button>Save</moni-button>
|
|
52
|
+
* </div>
|
|
53
|
+
* </moni-side-sheet>
|
|
10
54
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* - detached: boolean (adds 16px/16dp margins/rounded corners all around)
|
|
17
|
-
* - showClose: boolean (shows standard close button)
|
|
18
|
-
* - showBack: boolean (shows standard back button)
|
|
19
|
-
* - noBorder: boolean (removes borders, default: false)
|
|
20
|
-
* - withHandle: boolean (shows grab handle and enables dragging to close/resize, default: false)
|
|
21
|
-
* - expanded-width: string (width when expanded, default: '600px')
|
|
22
|
-
* - max-width: string (maximum width restriction, default: '100%')
|
|
55
|
+
* <!-- Resizable, detached side sheet on the left -->
|
|
56
|
+
* <moni-side-sheet side="left" detached with-handle max-width="50vw">
|
|
57
|
+
* <p>Navigation options</p>
|
|
58
|
+
* </moni-side-sheet>
|
|
59
|
+
* ```
|
|
23
60
|
*
|
|
24
|
-
*
|
|
25
|
-
* -
|
|
61
|
+
* @slot default - Main body content.
|
|
62
|
+
* @slot header - Custom header content (overrides `title`, close/back buttons remain).
|
|
63
|
+
* @slot footer - Bottom-anchored action area.
|
|
26
64
|
*/
|
|
27
65
|
@customElement('moni-side-sheet')
|
|
28
66
|
export class MoniSideSheet extends MoniElement {
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/moni-slider.ts
|
|
3
|
+
* @package @moni-labs/moni-ui
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @contributors Moni Labs & Contributors
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import { html, css, nothing } from 'lit';
|
|
2
9
|
import { customElement, property, state } from 'lit/decorators.js';
|
|
3
10
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
@@ -5,33 +12,58 @@ import { MoniElement, sharedStyles } from './_base/index.js';
|
|
|
5
12
|
import './moni-icon.js';
|
|
6
13
|
|
|
7
14
|
/**
|
|
8
|
-
*
|
|
15
|
+
* Material Design 3 Slider component.
|
|
16
|
+
*
|
|
17
|
+
* Sliders allow users to select a single value or a range of values from a
|
|
18
|
+
* continuous or discrete scale.
|
|
19
|
+
*
|
|
20
|
+
* **M3 spec reference:** `m3-docs/components/sliders/specs.md`
|
|
21
|
+
*
|
|
22
|
+
* **Slider modes:**
|
|
23
|
+
* - **Continuous** (default) — Smooth drag between `min` and `max`. Use when
|
|
24
|
+
* the exact value does not need to be defined by the user (e.g. volume).
|
|
25
|
+
* - **Discrete** — Set `step` to snap to discrete intervals. Tick marks
|
|
26
|
+
* appear via the native `<datalist>` element in Chrome/Edge. Firefox does
|
|
27
|
+
* not render datalist ticks for range inputs.
|
|
28
|
+
* - **Range** (`range` attribute) — Two thumbs that define a minimum and
|
|
29
|
+
* maximum value within the slider's extent.
|
|
30
|
+
* - **Vertical** (`vertical` attribute) — 90° rotated slider.
|
|
31
|
+
*
|
|
32
|
+
* **Value label tooltip:**
|
|
33
|
+
* When `indicator` is set, the current value is displayed in a tooltip above
|
|
34
|
+
* (or below, via `indicator-placement`) the active thumb during focus/drag.
|
|
35
|
+
*
|
|
36
|
+
* **Tick marks:**
|
|
37
|
+
* - `ticks` attribute: adds datalist with marks at `min` and `max` only.
|
|
38
|
+
* - `tick-interval` attribute: generates datalist options at every N units
|
|
39
|
+
* between `min` and `max`, creating visible tick marks at those positions.
|
|
40
|
+
*
|
|
41
|
+
* **Internal state management:**
|
|
42
|
+
* Uses `@state()` for `_value` and `_valueHigh` so the fill track width and
|
|
43
|
+
* tooltip position update reactively on every drag `input` event without
|
|
44
|
+
* waiting for the `change` event.
|
|
45
|
+
*
|
|
46
|
+
* @fires change - Bubbles and is composed. Fired when dragging ends and the
|
|
47
|
+
* value is committed. Read `element.value` for the new value.
|
|
48
|
+
* @fires input - Fired on every drag step. Read `element.value` for the
|
|
49
|
+
* live value during drag.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```html
|
|
53
|
+
* <!-- Continuous slider -->
|
|
54
|
+
* <moni-slider name="volume" min="0" max="100" value="60"></moni-slider>
|
|
9
55
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* - Track visual (span) and tooltip positions update immediately on drag
|
|
56
|
+
* <!-- Discrete slider with ticks every 10 units -->
|
|
57
|
+
* <moni-slider step="10" tick-interval="10" indicator></moni-slider>
|
|
13
58
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* - Tick marks: in Chrome/Edge, native `<datalist>` ticks render at every
|
|
18
|
-
* option value. In Firefox, the datalist ticks are not rendered for
|
|
19
|
-
* range inputs; consumers can use `tick-interval` to manually generate
|
|
20
|
-
* a visual fallback if needed (P3.4 — outside the scope of this release).
|
|
21
|
-
* - State layer: hover/focus state uses CSS `::before` overlay at 0.08/0.12
|
|
22
|
-
* opacity per M3 (handled by `interaction-styles.ts`).
|
|
59
|
+
* <!-- Range slider -->
|
|
60
|
+
* <moni-slider range min="0" max="100" value="20" value-high="80"></moni-slider>
|
|
61
|
+
* ```
|
|
23
62
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* - range: present → two thumbs
|
|
29
|
-
* - ticks: present → datalist with min/max marks
|
|
30
|
-
* - tick-interval: number — when set, generates datalist options every
|
|
31
|
-
* N units between min and max. Overrides `ticks`.
|
|
32
|
-
* - indicator: present → show value tooltip on focus
|
|
33
|
-
* - indicator-placement: top (default) | bottom
|
|
34
|
-
* - inset-icon: Material Symbols name inside the colored track
|
|
63
|
+
* @csspart slider - The outer slider container.
|
|
64
|
+
* @csspart track - The track background.
|
|
65
|
+
* @csspart fill - The filled portion of the track.
|
|
66
|
+
* @csspart indicator - The value label tooltip.
|
|
35
67
|
*/
|
|
36
68
|
@customElement('moni-slider')
|
|
37
69
|
export class MoniSlider extends MoniElement {
|