@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,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/moni-carousel.ts
|
|
3
|
+
* @package @moni-labs/moni-ui
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @contributors Moni Labs & Contributors
|
|
6
|
+
*/
|
|
1
7
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
8
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
9
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -10,23 +16,60 @@ import { MoniElement, sharedStyles } from './_base/index.js';
|
|
|
10
16
|
import { gsap } from 'gsap';
|
|
11
17
|
/**
|
|
12
18
|
* Material Design 3 Expressive Carousel component.
|
|
13
|
-
* Supports three layouts:
|
|
14
|
-
* - `multi-browse`: Shows a collection of items (large, medium, and small items).
|
|
15
|
-
* - `hero`: Focuses on one large item with a smaller item peeking.
|
|
16
|
-
* - `uncontained`: Standard same-sized layout bleeding off the edges.
|
|
17
19
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
20
|
+
* Carousels display a collection of related items in a scrollable, horizontal list.
|
|
21
|
+
* They allow users to quickly browse through items like images, cards, or products.
|
|
22
|
+
*
|
|
23
|
+
* **M3 spec reference:** `m3-docs/components/carousel/specs.md`
|
|
24
|
+
*
|
|
25
|
+
* **Layout variants:**
|
|
26
|
+
* - `multi-browse` (default) — Shows a mix of large, medium, and small (peeking)
|
|
27
|
+
* items. Best for exploring a large number of items.
|
|
28
|
+
* - `hero` — Focuses on one large primary item while showing a sliver of the
|
|
29
|
+
* next item. Best for featuring important content.
|
|
30
|
+
* - `uncontained` — Standard layout where all items have the same width and
|
|
31
|
+
* bleed off the edges of the container.
|
|
32
|
+
*
|
|
33
|
+
* **Animation & Gestures:**
|
|
34
|
+
* This component uses GSAP for smooth drag, flick, and snap animations,
|
|
35
|
+
* mirroring the high-fidelity M3 Expressive motion specs. It handles touch
|
|
36
|
+
* gestures for mobile and mouse-drag for desktop.
|
|
37
|
+
*
|
|
38
|
+
* **Auto-sizing (`auto` mode):**
|
|
39
|
+
* When `auto=true` (default), the carousel measures its own width and
|
|
40
|
+
* dynamically calculates the optimal sizes for large, medium, and small items
|
|
41
|
+
* based on the active `layout` to ensure they fit perfectly without awkward gaps
|
|
42
|
+
* or clipping at the edges.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```html
|
|
46
|
+
* <!-- Declarative usage via DOM properties (recommended) -->
|
|
47
|
+
* <moni-carousel layout="hero"></moni-carousel>
|
|
48
|
+
* <script>
|
|
49
|
+
* const carousel = document.querySelector('moni-carousel');
|
|
50
|
+
* carousel.items = [
|
|
51
|
+
* { title: 'Item 1', img: '/img1.jpg', href: '/link1' },
|
|
52
|
+
* { title: 'Item 2', img: '/img2.jpg' }
|
|
53
|
+
* ];
|
|
54
|
+
* </script>
|
|
55
|
+
*
|
|
56
|
+
* <!-- Slot-based usage (for SSR or simple static content) -->
|
|
57
|
+
* <moni-carousel layout="uncontained">
|
|
58
|
+
* <div slot="item">
|
|
59
|
+
* <img src="/img1.jpg" />
|
|
60
|
+
* <h3>Static Item</h3>
|
|
61
|
+
* </div>
|
|
62
|
+
* </moni-carousel>
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @slot item - Alternative to the `items` property. Slot individual HTML elements
|
|
66
|
+
* instead of passing data objects.
|
|
67
|
+
*
|
|
68
|
+
* @csspart carousel - The outer wrapper.
|
|
69
|
+
* @csspart track - The scrolling track element.
|
|
70
|
+
* @csspart item - Individual carousel item containers.
|
|
71
|
+
* @csspart img - The image elements inside the items.
|
|
72
|
+
* @csspart title - The title text elements inside the items.
|
|
30
73
|
*/
|
|
31
74
|
let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
32
75
|
constructor() {
|
|
@@ -44,6 +87,9 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
44
87
|
this.showAllText = 'Show all';
|
|
45
88
|
this.headerText = '';
|
|
46
89
|
this.hideNav = false;
|
|
90
|
+
this.infinite = false;
|
|
91
|
+
this.autoplay = false;
|
|
92
|
+
this.autoplayInterval = 3000;
|
|
47
93
|
this._containerWidth = 0;
|
|
48
94
|
this._slottedItems = [];
|
|
49
95
|
this._hasSlottedShowAll = false;
|
|
@@ -61,6 +107,9 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
61
107
|
this._tickerTarget = 0;
|
|
62
108
|
this._tickerCurrent = 0;
|
|
63
109
|
this._isTicking = false;
|
|
110
|
+
// Infinite & Autoplay state
|
|
111
|
+
this._infiniteInitialized = false;
|
|
112
|
+
this._autoplayTimer = null;
|
|
64
113
|
// quickSetter caches — avoid gsap.set() overhead per frame
|
|
65
114
|
this._cardSetX = [];
|
|
66
115
|
this._cardSetWidth = [];
|
|
@@ -79,6 +128,7 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
79
128
|
this._tickerCurrent = this._tickerTarget;
|
|
80
129
|
gsap.ticker.remove(this._tick);
|
|
81
130
|
this._isTicking = false;
|
|
131
|
+
this._checkInfiniteWrap();
|
|
82
132
|
}
|
|
83
133
|
this._applyLayout(this._tickerCurrent);
|
|
84
134
|
};
|
|
@@ -98,6 +148,30 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
98
148
|
if (this._cardSetX.length !== this._cards.length) {
|
|
99
149
|
this._buildQuickSetters();
|
|
100
150
|
}
|
|
151
|
+
if (this.infinite && !this._infiniteInitialized && this.effectiveItems.length > 0) {
|
|
152
|
+
const C = this.effectiveItems.length;
|
|
153
|
+
const V = C * this._visualCardsMultiplier;
|
|
154
|
+
const K = this._snapSetsCount;
|
|
155
|
+
const centerSetIndex = Math.floor(K / 2);
|
|
156
|
+
// Wait for the browser to render the new items so scrollWidth is updated
|
|
157
|
+
// A double-rAF or setTimeout ensures the layout engine has processed the new snap-items
|
|
158
|
+
requestAnimationFrame(() => {
|
|
159
|
+
setTimeout(() => {
|
|
160
|
+
if (this._scrollContainer) {
|
|
161
|
+
// Force layout calculation
|
|
162
|
+
this._scrollContainer.scrollWidth;
|
|
163
|
+
this._scrollContainer.scrollLeft = centerSetIndex * V * this.itemSize;
|
|
164
|
+
// If the browser still clamped it, it means it's not ready.
|
|
165
|
+
// But with setTimeout it should be fully ready.
|
|
166
|
+
// Force the visual ticker to match instantly to avoid an animation zoom from 0
|
|
167
|
+
this._tickerTarget = this._scrollContainer.scrollLeft / this.itemSize;
|
|
168
|
+
this._tickerCurrent = this._tickerTarget;
|
|
169
|
+
this._applyLayout(this._tickerCurrent);
|
|
170
|
+
}
|
|
171
|
+
}, 20);
|
|
172
|
+
});
|
|
173
|
+
this._infiniteInitialized = true;
|
|
174
|
+
}
|
|
101
175
|
this._tickerTarget = this._scrollContainer.scrollLeft / this.itemSize;
|
|
102
176
|
if (instant || (!this._isTicking && this._tickerCurrent === 0)) {
|
|
103
177
|
this._tickerCurrent = this._tickerTarget;
|
|
@@ -391,6 +465,9 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
391
465
|
}
|
|
392
466
|
this._buildQuickSetters();
|
|
393
467
|
this.updateLayout(true);
|
|
468
|
+
if (this.autoplay) {
|
|
469
|
+
this._startAutoplay();
|
|
470
|
+
}
|
|
394
471
|
}
|
|
395
472
|
updated(changedProperties) {
|
|
396
473
|
super.updated(changedProperties);
|
|
@@ -402,15 +479,30 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
402
479
|
changedProperties.has('padding') ||
|
|
403
480
|
changedProperties.has('items') ||
|
|
404
481
|
changedProperties.has('hideNav') ||
|
|
482
|
+
changedProperties.has('infinite') ||
|
|
483
|
+
changedProperties.has('autoplay') ||
|
|
484
|
+
changedProperties.has('autoplayInterval') ||
|
|
405
485
|
changedProperties.has('_containerWidth') ||
|
|
406
486
|
changedProperties.has('_slottedItems') ||
|
|
407
487
|
changedProperties.has('_hasSlottedShowAll')) {
|
|
488
|
+
if (changedProperties.has('infinite') || changedProperties.has('items') || changedProperties.has('_slottedItems')) {
|
|
489
|
+
this._infiniteInitialized = false;
|
|
490
|
+
}
|
|
408
491
|
if (changedProperties.has('layout') && this._scrollContainer) {
|
|
409
492
|
this._scrollContainer.scrollLeft = 0;
|
|
493
|
+
this._infiniteInitialized = false;
|
|
410
494
|
this._scrollContainer.style.scrollSnapType =
|
|
411
495
|
this.layout === 'uncontained' ? 'none' : 'x mandatory';
|
|
412
496
|
}
|
|
413
497
|
this.updateLayout(true);
|
|
498
|
+
if (changedProperties.has('autoplay') || changedProperties.has('autoplayInterval') || changedProperties.has('items') || changedProperties.has('_slottedItems')) {
|
|
499
|
+
if (this.autoplay) {
|
|
500
|
+
this._startAutoplay();
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
this._stopAutoplay();
|
|
504
|
+
}
|
|
505
|
+
}
|
|
414
506
|
}
|
|
415
507
|
}
|
|
416
508
|
get computedLayout() {
|
|
@@ -596,7 +688,21 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
596
688
|
const isMobile = this._isMobile;
|
|
597
689
|
const cardCount = this._cards.length;
|
|
598
690
|
for (let i = 0; i < cardCount; i++) {
|
|
599
|
-
|
|
691
|
+
let p = i - t;
|
|
692
|
+
if (this.infinite) {
|
|
693
|
+
// Modulo wrap so the cards perfectly loop around the center
|
|
694
|
+
p = i - (t % cardCount);
|
|
695
|
+
if (p > cardCount / 2)
|
|
696
|
+
p -= cardCount;
|
|
697
|
+
if (p < -cardCount / 2)
|
|
698
|
+
p += cardCount;
|
|
699
|
+
}
|
|
700
|
+
// Optimization: if the card is far off-screen, hide it to save rendering work
|
|
701
|
+
if (p < -15 || p > 15) {
|
|
702
|
+
this._cardSetX[i](-9999);
|
|
703
|
+
this._titleSetOpacity[i](0);
|
|
704
|
+
continue;
|
|
705
|
+
}
|
|
600
706
|
const layout = this._getCardLayout(p);
|
|
601
707
|
// Use quickSetters — ~3x faster than gsap.set() per call
|
|
602
708
|
this._cardSetX[i](layout.x);
|
|
@@ -609,8 +715,97 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
609
715
|
this._titleSetOpacity[i](layout.opacity);
|
|
610
716
|
}
|
|
611
717
|
}
|
|
718
|
+
get _visualCardsMultiplier() {
|
|
719
|
+
if (!this.infinite || this.effectiveItems.length === 0)
|
|
720
|
+
return 1;
|
|
721
|
+
const C = this.effectiveItems.length;
|
|
722
|
+
// We need at least ~15 cards to fill the screen seamlessly for small datasets
|
|
723
|
+
return Math.max(1, Math.ceil(15 / C));
|
|
724
|
+
}
|
|
725
|
+
get _snapSetsCount() {
|
|
726
|
+
if (!this.infinite || this.effectiveItems.length === 0)
|
|
727
|
+
return 1;
|
|
728
|
+
const C = this.effectiveItems.length;
|
|
729
|
+
const V = C * this._visualCardsMultiplier;
|
|
730
|
+
// We want enough snap items so the user NEVER reaches the end in a single fast swipe.
|
|
731
|
+
// A total of ~1000 items is extremely cheap as empty divs, and provides a massive buffer.
|
|
732
|
+
let K = Math.ceil(1000 / V);
|
|
733
|
+
if (K % 2 === 0)
|
|
734
|
+
K += 1; // Keep it odd for a perfect center
|
|
735
|
+
return Math.max(3, K);
|
|
736
|
+
}
|
|
737
|
+
get _snapItemsCount() {
|
|
738
|
+
if (this.infinite) {
|
|
739
|
+
const C = this.effectiveItems.length;
|
|
740
|
+
const V_mult = this._visualCardsMultiplier;
|
|
741
|
+
const K = this._snapSetsCount;
|
|
742
|
+
return K * (C * V_mult);
|
|
743
|
+
}
|
|
744
|
+
return this.effectiveItems.length;
|
|
745
|
+
}
|
|
746
|
+
_checkInfiniteWrap() {
|
|
747
|
+
if (!this.infinite || this.effectiveItems.length === 0 || !this._scrollContainer)
|
|
748
|
+
return;
|
|
749
|
+
const C = this.effectiveItems.length;
|
|
750
|
+
const V = C * this._visualCardsMultiplier;
|
|
751
|
+
const K = this._snapSetsCount;
|
|
752
|
+
const centerSetIndex = Math.floor(K / 2);
|
|
753
|
+
// The scroll track is divided into K sets, each containing V items.
|
|
754
|
+
const setWidth = V * this.itemSize;
|
|
755
|
+
const currentScroll = this._scrollContainer.scrollLeft;
|
|
756
|
+
const currentSet = Math.floor(currentScroll / setWidth);
|
|
757
|
+
if (currentSet !== centerSetIndex) {
|
|
758
|
+
const delta = (centerSetIndex - currentSet) * setWidth;
|
|
759
|
+
const oldSnap = this._scrollContainer.style.scrollSnapType;
|
|
760
|
+
const oldBehavior = this._scrollContainer.style.scrollBehavior;
|
|
761
|
+
// Temporarily disable snap and smooth behavior so the wrap is instantaneous
|
|
762
|
+
this._scrollContainer.style.scrollSnapType = 'none';
|
|
763
|
+
this._scrollContainer.style.scrollBehavior = 'auto';
|
|
764
|
+
this._scrollContainer.scrollLeft += delta;
|
|
765
|
+
// INSTANTLY update the GSAP visual ticker so it doesn't animate the jump
|
|
766
|
+
this._tickerTarget = this._scrollContainer.scrollLeft / this.itemSize;
|
|
767
|
+
this._tickerCurrent = this._tickerTarget;
|
|
768
|
+
this._applyLayout(this._tickerCurrent);
|
|
769
|
+
// Restore original scroll behavior
|
|
770
|
+
this._scrollContainer.style.scrollBehavior = oldBehavior;
|
|
771
|
+
if (this._isDown) {
|
|
772
|
+
this._scrollLeftStart += delta;
|
|
773
|
+
}
|
|
774
|
+
if (oldSnap && oldSnap !== 'none') {
|
|
775
|
+
// Re-enable snap on the next frame to avoid jumping
|
|
776
|
+
requestAnimationFrame(() => {
|
|
777
|
+
if (this._scrollContainer && !this._isDown) {
|
|
778
|
+
this._scrollContainer.style.scrollSnapType = oldSnap;
|
|
779
|
+
}
|
|
780
|
+
});
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
_startAutoplay() {
|
|
785
|
+
this._stopAutoplay();
|
|
786
|
+
if (this.autoplay && this.effectiveItems.length > 0) {
|
|
787
|
+
this._autoplayTimer = setInterval(() => {
|
|
788
|
+
// We removed _isInteracting to make autoplay more robust. It only pauses on active drag.
|
|
789
|
+
if (!this._isDown) {
|
|
790
|
+
this._scrollNext();
|
|
791
|
+
}
|
|
792
|
+
}, this.autoplayInterval);
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
_stopAutoplay() {
|
|
796
|
+
if (this._autoplayTimer) {
|
|
797
|
+
clearInterval(this._autoplayTimer);
|
|
798
|
+
this._autoplayTimer = null;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
_handleMouseEnter() {
|
|
802
|
+
}
|
|
803
|
+
_handleMouseLeave() {
|
|
804
|
+
this._handleMouseUp();
|
|
805
|
+
}
|
|
612
806
|
_handleMouseDown(e) {
|
|
613
807
|
gsap.killTweensOf(this._scrollContainer);
|
|
808
|
+
this._checkInfiniteWrap();
|
|
614
809
|
this._isDown = true;
|
|
615
810
|
this._draggedDistance = 0;
|
|
616
811
|
this._scrollContainer.style.scrollBehavior = 'auto';
|
|
@@ -647,11 +842,20 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
647
842
|
}
|
|
648
843
|
// Dynamic momentum: stronger swipes have a much higher multiplier
|
|
649
844
|
const momentumMultiplier = 350 + Math.abs(this._velocity) * 300;
|
|
650
|
-
|
|
845
|
+
let projectedScrollLeft = this._scrollContainer.scrollLeft - this._velocity * momentumMultiplier;
|
|
846
|
+
// Cap momentum throw to prevent hitting infinite wrap edges on fast swipes
|
|
847
|
+
const maxThrowDist = 15 * this.itemSize;
|
|
848
|
+
if (projectedScrollLeft < this._scrollContainer.scrollLeft - maxThrowDist) {
|
|
849
|
+
projectedScrollLeft = this._scrollContainer.scrollLeft - maxThrowDist;
|
|
850
|
+
}
|
|
851
|
+
else if (projectedScrollLeft > this._scrollContainer.scrollLeft + maxThrowDist) {
|
|
852
|
+
projectedScrollLeft = this._scrollContainer.scrollLeft + maxThrowDist;
|
|
853
|
+
}
|
|
651
854
|
if (this.layout !== 'uncontained') {
|
|
652
855
|
this._scrollContainer.style.scrollSnapType = 'none';
|
|
653
856
|
let targetIndex = Math.round(projectedScrollLeft / this.itemSize);
|
|
654
|
-
|
|
857
|
+
const maxIndex = this.effectiveItems.length > 0 ? this._snapItemsCount - 1 : 0;
|
|
858
|
+
targetIndex = Math.max(0, Math.min(maxIndex, targetIndex));
|
|
655
859
|
const snapPoint = targetIndex * this.itemSize;
|
|
656
860
|
// Dynamic duration: longer distance = more time, max 0.85s for faster feeling
|
|
657
861
|
const currentIndex = Math.round(this._scrollContainer.scrollLeft / this.itemSize);
|
|
@@ -672,6 +876,7 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
672
876
|
}
|
|
673
877
|
_handleTouchStart(e) {
|
|
674
878
|
gsap.killTweensOf(this._scrollContainer);
|
|
879
|
+
this._checkInfiniteWrap();
|
|
675
880
|
this._isDown = true;
|
|
676
881
|
this._draggedDistance = 0;
|
|
677
882
|
this._scrollContainer.style.scrollBehavior = 'auto';
|
|
@@ -727,7 +932,7 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
727
932
|
if (this._wheelTimeout)
|
|
728
933
|
clearTimeout(this._wheelTimeout);
|
|
729
934
|
this._wheelTimeout = setTimeout(() => {
|
|
730
|
-
if (this.layout !== 'uncontained') {
|
|
935
|
+
if (this.layout !== 'uncontained' && !this._isDown) {
|
|
731
936
|
this._scrollContainer.style.scrollSnapType = 'x mandatory';
|
|
732
937
|
}
|
|
733
938
|
}, 150);
|
|
@@ -739,20 +944,20 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
739
944
|
e.stopPropagation();
|
|
740
945
|
return;
|
|
741
946
|
}
|
|
947
|
+
const originalIndex = index % this.effectiveItems.length;
|
|
742
948
|
this.dispatchEvent(new CustomEvent('item-click', {
|
|
743
|
-
detail: { item, index },
|
|
949
|
+
detail: { item, index: originalIndex },
|
|
744
950
|
bubbles: true,
|
|
745
951
|
composed: true
|
|
746
952
|
}));
|
|
747
953
|
}
|
|
748
954
|
_scrollPrevious() {
|
|
749
|
-
const target =
|
|
955
|
+
const target = this._scrollContainer.scrollLeft - this.itemSize;
|
|
750
956
|
this._scrollContainer.style.scrollBehavior = 'smooth';
|
|
751
957
|
this._scrollContainer.scrollTo({ left: target, behavior: 'smooth' });
|
|
752
958
|
}
|
|
753
959
|
_scrollNext() {
|
|
754
|
-
const
|
|
755
|
-
const target = Math.min(maxScroll, this._scrollContainer.scrollLeft + this.itemSize);
|
|
960
|
+
const target = this._scrollContainer.scrollLeft + this.itemSize;
|
|
756
961
|
this._scrollContainer.style.scrollBehavior = 'smooth';
|
|
757
962
|
this._scrollContainer.scrollTo({ left: target, behavior: 'smooth' });
|
|
758
963
|
}
|
|
@@ -840,14 +1045,23 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
840
1045
|
if (rightPadding < minRightPaddingNeeded) {
|
|
841
1046
|
rightPadding = minRightPaddingNeeded;
|
|
842
1047
|
}
|
|
1048
|
+
let snapItemsCount = hasItems ? this._snapItemsCount : 0;
|
|
1049
|
+
let visualItems = this.effectiveItems;
|
|
1050
|
+
if (this.infinite && hasItems) {
|
|
1051
|
+
const V_mult = this._visualCardsMultiplier;
|
|
1052
|
+
visualItems = [];
|
|
1053
|
+
for (let i = 0; i < V_mult; i++) {
|
|
1054
|
+
visualItems = visualItems.concat(this.effectiveItems);
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
843
1057
|
const trackWidth = hasItems
|
|
844
|
-
?
|
|
1058
|
+
? snapItemsCount * L + (snapItemsCount - 1) * this.gap
|
|
845
1059
|
: 0;
|
|
846
1060
|
const isScrollable = hasItems && this._scrollContainer &&
|
|
847
1061
|
(this._scrollContainer.scrollWidth > this._scrollContainer.clientWidth);
|
|
848
|
-
const showPrevArrow = isScrollable && this._scrollContainer.scrollLeft > 5;
|
|
849
|
-
const showNextArrow = isScrollable &&
|
|
850
|
-
(this._scrollContainer.scrollWidth - this._scrollContainer.scrollLeft - this._scrollContainer.clientWidth > 5);
|
|
1062
|
+
const showPrevArrow = this.infinite || (isScrollable && this._scrollContainer.scrollLeft > 5);
|
|
1063
|
+
const showNextArrow = this.infinite || (isScrollable &&
|
|
1064
|
+
(this._scrollContainer.scrollWidth - this._scrollContainer.scrollLeft - this._scrollContainer.clientWidth > 5));
|
|
851
1065
|
return html `
|
|
852
1066
|
<div class="carousel-container" style="
|
|
853
1067
|
--carousel-snap-width: ${L}px;
|
|
@@ -894,34 +1108,35 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
|
|
|
894
1108
|
@mousedown=${this._handleMouseDown}
|
|
895
1109
|
@mousemove=${this._handleMouseMove}
|
|
896
1110
|
@mouseup=${this._handleMouseUp}
|
|
897
|
-
@
|
|
1111
|
+
@mouseenter=${this._handleMouseEnter}
|
|
1112
|
+
@mouseleave=${this._handleMouseLeave}
|
|
898
1113
|
@touchstart=${this._handleTouchStart}
|
|
899
1114
|
@touchmove=${this._handleTouchMove}
|
|
900
1115
|
@touchend=${this._handleTouchEnd}
|
|
901
1116
|
@wheel=${this._handleWheel}
|
|
902
1117
|
>
|
|
903
1118
|
<div class="snap-track">
|
|
904
|
-
${hasItems ?
|
|
1119
|
+
${hasItems ? Array.from({ length: snapItemsCount }).map(() => html `<div class="snap-item"></div>`) : ''}
|
|
905
1120
|
</div>
|
|
906
1121
|
<div class="visual-track">
|
|
907
1122
|
${hasItems
|
|
908
|
-
?
|
|
1123
|
+
? visualItems.map((item, idx) => html `
|
|
909
1124
|
<div
|
|
910
1125
|
class="card"
|
|
911
1126
|
@click=${(e) => this._handleCardClick(e, item, idx)}
|
|
912
1127
|
>
|
|
913
1128
|
${item.href
|
|
914
1129
|
? html `
|
|
915
|
-
<a href="${item.href}" target="${item.target || '_self'}" style="text-decoration:none; color:inherit;">
|
|
1130
|
+
<a href="${item.href}" target="${item.target || '_self'}" style="text-decoration:none; color:inherit;" draggable="false">
|
|
916
1131
|
<div class="img-parallax-container">
|
|
917
|
-
<img src="${item.img}" alt="${item.title}" draggable="false" />
|
|
1132
|
+
<img src="${item.img}" alt="${item.title}" draggable="false" loading="lazy" />
|
|
918
1133
|
</div>
|
|
919
1134
|
<h2 class="card-title">${item.title}</h2>
|
|
920
1135
|
</a>
|
|
921
1136
|
`
|
|
922
1137
|
: html `
|
|
923
1138
|
<div class="img-parallax-container">
|
|
924
|
-
<img src="${item.img}" alt="${item.title}" draggable="false" />
|
|
1139
|
+
<img src="${item.img}" alt="${item.title}" draggable="false" loading="lazy" />
|
|
925
1140
|
</div>
|
|
926
1141
|
<h2 class="card-title">${item.title}</h2>
|
|
927
1142
|
`}
|
|
@@ -986,6 +1201,15 @@ __decorate([
|
|
|
986
1201
|
__decorate([
|
|
987
1202
|
property({ type: Boolean, attribute: 'hide-nav' })
|
|
988
1203
|
], MoniCarousel.prototype, "hideNav", void 0);
|
|
1204
|
+
__decorate([
|
|
1205
|
+
property({ type: Boolean, reflect: true })
|
|
1206
|
+
], MoniCarousel.prototype, "infinite", void 0);
|
|
1207
|
+
__decorate([
|
|
1208
|
+
property({ type: Boolean, reflect: true })
|
|
1209
|
+
], MoniCarousel.prototype, "autoplay", void 0);
|
|
1210
|
+
__decorate([
|
|
1211
|
+
property({ type: Number, attribute: 'autoplay-interval' })
|
|
1212
|
+
], MoniCarousel.prototype, "autoplayInterval", void 0);
|
|
989
1213
|
__decorate([
|
|
990
1214
|
state()
|
|
991
1215
|
], MoniCarousel.prototype, "_containerWidth", void 0);
|
|
@@ -1,34 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/moni-checkbox.ts
|
|
3
|
+
* @package @moni-labs/moni-ui
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @contributors Moni Labs & Contributors
|
|
6
|
+
*/
|
|
1
7
|
import { MoniElement } from './_base/index.js';
|
|
2
8
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
9
|
+
* Material Design 3 Checkbox component.
|
|
10
|
+
*
|
|
11
|
+
* Checkboxes allow users to select one or more items from a set, or toggle
|
|
12
|
+
* a single binary option. They are visual-only shells — the consumer is
|
|
13
|
+
* responsible for wiring up form submission and validation logic.
|
|
14
|
+
*
|
|
15
|
+
* **Visual architecture (BeerCSS pattern):**
|
|
16
|
+
* The native `<input type="checkbox">` occupies real layout space (16×16 minimum)
|
|
17
|
+
* but is visually hidden via `opacity: 0`. A `<span>` sibling rendered after
|
|
18
|
+
* the input holds two pseudo-elements:
|
|
19
|
+
* - `::before` — the visible checkbox icon (Material Symbols ligature).
|
|
20
|
+
* - `::after` — the hover/focus state layer ripple ring.
|
|
21
|
+
*
|
|
22
|
+
* The `::before` content switches between:
|
|
23
|
+
* - `'check_box_outline_blank'` (unchecked)
|
|
24
|
+
* - `'check_box'` (checked)
|
|
25
|
+
* - `'indeterminate_check_box'` (native indeterminate state)
|
|
26
|
+
*
|
|
27
|
+
* **Form integration:**
|
|
28
|
+
* Setting `name` and `value` passes them to the native `<input>` element,
|
|
29
|
+
* enabling participation in HTML form submissions.
|
|
30
|
+
*
|
|
31
|
+
* @fires change - Bubbles and is composed. Fired when the checkbox is toggled.
|
|
32
|
+
* The consumer can read `element.checked` for the new state.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```html
|
|
36
|
+
* <moni-checkbox label="Accept terms" name="terms" value="yes"></moni-checkbox>
|
|
37
|
+
*
|
|
38
|
+
* <script>
|
|
39
|
+
* document.querySelector('moni-checkbox').addEventListener('change', (e) => {
|
|
40
|
+
* console.log('checked:', e.target.checked);
|
|
41
|
+
* });
|
|
42
|
+
* </script>
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @csspart checkbox - The outer `<label>` element.
|
|
19
46
|
*/
|
|
20
47
|
export declare class MoniCheckbox extends MoniElement {
|
|
48
|
+
/**
|
|
49
|
+
* Text label displayed to the right of the checkbox icon.
|
|
50
|
+
*
|
|
51
|
+
* When non-empty, the label is rendered as a text node inside the `<span>`.
|
|
52
|
+
* When empty, the default slot is rendered instead, allowing slotted HTML.
|
|
53
|
+
*
|
|
54
|
+
* @default ''
|
|
55
|
+
*/
|
|
21
56
|
label: string;
|
|
57
|
+
/**
|
|
58
|
+
* Whether the checkbox is currently checked.
|
|
59
|
+
*
|
|
60
|
+
* Reflected as an attribute so CSS attribute selectors and external state
|
|
61
|
+
* readers can observe the checked state without accessing the JS property.
|
|
62
|
+
* Synced to the native input via `updated()`.
|
|
63
|
+
*
|
|
64
|
+
* @default false
|
|
65
|
+
*/
|
|
22
66
|
checked: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* When `true`, the native input is disabled: the checkbox is not interactive
|
|
69
|
+
* and renders at 50% opacity.
|
|
70
|
+
*
|
|
71
|
+
* @default false
|
|
72
|
+
*/
|
|
23
73
|
disabled: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Visual size of the checkbox icon.
|
|
76
|
+
*
|
|
77
|
+
* Maps to the `--_size` custom property which controls both the invisible
|
|
78
|
+
* input's hit area and the visible `::before` icon size.
|
|
79
|
+
*
|
|
80
|
+
* | Value | `--_size` |
|
|
81
|
+
* |------------|-----------|
|
|
82
|
+
* | `'small'` | 1rem |
|
|
83
|
+
* | `'medium'` | 1.5rem |
|
|
84
|
+
* | `'large'` | 2rem |
|
|
85
|
+
* | `'extra'` | 2.5rem |
|
|
86
|
+
*
|
|
87
|
+
* @default 'medium'
|
|
88
|
+
*/
|
|
24
89
|
size: 'small' | 'medium' | 'large' | 'extra';
|
|
90
|
+
/**
|
|
91
|
+
* Forwarded to the native `<input name>` attribute.
|
|
92
|
+
* Required for grouping checkboxes within a form.
|
|
93
|
+
*
|
|
94
|
+
* @default ''
|
|
95
|
+
*/
|
|
25
96
|
name: string;
|
|
97
|
+
/**
|
|
98
|
+
* Forwarded to the native `<input value>` attribute.
|
|
99
|
+
* The value submitted in a form when this checkbox is checked.
|
|
100
|
+
*
|
|
101
|
+
* @default ''
|
|
102
|
+
*/
|
|
26
103
|
value: string;
|
|
104
|
+
/** Direct reference to the native input element for programmatic access. */
|
|
27
105
|
private _input;
|
|
106
|
+
/**
|
|
107
|
+
* Syncs `checked` and `disabled` back to the native input element after
|
|
108
|
+
* Lit's render cycle, ensuring the DOM stays in sync with component state.
|
|
109
|
+
*
|
|
110
|
+
* This is necessary because Lit's `.property=${value}` binding updates the
|
|
111
|
+
* DOM property, but the `live()` directive and direct property assignment
|
|
112
|
+
* are more reliable for boolean inputs across browser implementations.
|
|
113
|
+
*
|
|
114
|
+
* @param changed - Map of changed property names to their previous values.
|
|
115
|
+
*/
|
|
28
116
|
updated(changed: Map<string, unknown>): void;
|
|
29
117
|
static styles: import("lit").CSSResult[];
|
|
118
|
+
/**
|
|
119
|
+
* Handles the native input's `change` event.
|
|
120
|
+
*
|
|
121
|
+
* Reads the new checked state from the input and re-dispatches a composed
|
|
122
|
+
* `'change'` event so the signal crosses shadow DOM boundaries and can be
|
|
123
|
+
* heard by parent elements in the light DOM.
|
|
124
|
+
*
|
|
125
|
+
* @param e - The native `change` event from the hidden `<input>`.
|
|
126
|
+
*/
|
|
30
127
|
private _onChange;
|
|
31
|
-
|
|
128
|
+
/**
|
|
129
|
+
* Renders the accessible checkbox label structure.
|
|
130
|
+
*
|
|
131
|
+
* The `<label>` wraps the hidden `<input>` and a `<span>` so that clicking
|
|
132
|
+
* anywhere on the label area (including the text) toggles the checkbox.
|
|
133
|
+
* The `has-label` class on the span adds left padding to separate the icon
|
|
134
|
+
* from the label text.
|
|
135
|
+
*/
|
|
136
|
+
render(): import("lit").TemplateResult<1>;
|
|
32
137
|
}
|
|
33
138
|
declare global {
|
|
34
139
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moni-checkbox.d.ts","sourceRoot":"","sources":["../../src/components/moni-checkbox.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"moni-checkbox.d.ts","sourceRoot":"","sources":["../../src/components/moni-checkbox.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBACa,YAAa,SAAQ,WAAW;IAC5C;;;;;;;OAOG;IAC0B,KAAK,SAAM;IAExC;;;;;;;;OAQG;IACyC,OAAO,UAAS;IAE5D;;;;;OAKG;IACyC,QAAQ,UAAS;IAE7D;;;;;;;;;;;;;;OAcG;IAEH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAY;IAExD;;;;;OAKG;IAC0B,IAAI,SAAM;IAEvC;;;;;OAKG;IAC0B,KAAK,SAAM;IAExC,4EAA4E;IAC5D,OAAO,CAAC,MAAM,CAAoB;IAElD;;;;;;;;;OASG;IACM,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAO9C,OAAgB,MAAM,4BAoHpB;IAEF;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAKjB;;;;;;;OAOG;IACM,MAAM;CAiBf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,eAAe,EAAE,YAAY,CAAC;KAC9B;CACD;AAED,eAAe,YAAY,CAAC"}
|