@francofantomius/material-components 1.0.1 → 1.1.0
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/CHANGELOG.md +39 -0
- package/README.md +41 -9
- package/custom-elements.json +19060 -9017
- package/dist/chunks/account-menu-Dau0UHTl.js +1290 -0
- package/dist/chunks/account-menu-Dau0UHTl.js.map +1 -0
- package/dist/chunks/app-drawer-Du1ePzxZ.js +903 -0
- package/dist/chunks/app-drawer-Du1ePzxZ.js.map +1 -0
- package/dist/chunks/bottom-sheet-q79BBYAj.js +402 -0
- package/dist/chunks/bottom-sheet-q79BBYAj.js.map +1 -0
- package/dist/chunks/{button-B4TSZ7Sl.js → button-D2vn7kJ8.js} +9 -8
- package/dist/chunks/button-D2vn7kJ8.js.map +1 -0
- package/dist/chunks/button-group-CNqvJx1n.js +143 -0
- package/dist/chunks/button-group-CNqvJx1n.js.map +1 -0
- package/dist/chunks/carousel-item-BG6kjjjk.js +371 -0
- package/dist/chunks/carousel-item-BG6kjjjk.js.map +1 -0
- package/dist/chunks/date-picker-DJeHi4w-.js +777 -0
- package/dist/chunks/date-picker-DJeHi4w-.js.map +1 -0
- package/dist/chunks/fab-menu.css-3pu930sZ.js +320 -0
- package/dist/chunks/fab-menu.css-3pu930sZ.js.map +1 -0
- package/dist/chunks/{icon-button-BdSc7eot.js → icon-button-BQz73GLa.js} +2 -2
- package/dist/chunks/icon-button-BQz73GLa.js.map +1 -0
- package/dist/chunks/loading-indicator-CvWnZr9o.js +193 -0
- package/dist/chunks/loading-indicator-CvWnZr9o.js.map +1 -0
- package/dist/chunks/menu-item-BBSp5Cqc.js +390 -0
- package/dist/chunks/menu-item-BBSp5Cqc.js.map +1 -0
- package/dist/chunks/navigation-bar-item-C9DfOEzg.js +397 -0
- package/dist/chunks/navigation-bar-item-C9DfOEzg.js.map +1 -0
- package/dist/chunks/navigation-rail-item-6pdhNHJK.js +357 -0
- package/dist/chunks/navigation-rail-item-6pdhNHJK.js.map +1 -0
- package/dist/chunks/segmented-button-B0BvGSQ7.js +265 -0
- package/dist/chunks/segmented-button-B0BvGSQ7.js.map +1 -0
- package/dist/chunks/side-sheet-S2w081AK.js +360 -0
- package/dist/chunks/side-sheet-S2w081AK.js.map +1 -0
- package/dist/chunks/slider-D-mnO8yQ.js +450 -0
- package/dist/chunks/slider-D-mnO8yQ.js.map +1 -0
- package/dist/chunks/split-button-DUfjukQY.js +450 -0
- package/dist/chunks/split-button-DUfjukQY.js.map +1 -0
- package/dist/chunks/{table-aRTYzDyE.js → table-CqHnneAj.js} +2 -2
- package/dist/chunks/{table-aRTYzDyE.js.map → table-CqHnneAj.js.map} +1 -1
- package/dist/chunks/time-picker-CZnb2sWz.js +785 -0
- package/dist/chunks/time-picker-CZnb2sWz.js.map +1 -0
- package/dist/chunks/toolbar-DXVQbQKJ.js +271 -0
- package/dist/chunks/toolbar-DXVQbQKJ.js.map +1 -0
- package/dist/chunks/tooltip-CE7JMHMu.js +398 -0
- package/dist/chunks/tooltip-CE7JMHMu.js.map +1 -0
- package/dist/components/account-menu/account-menu.js +8 -0
- package/dist/components/app-drawer/app-drawer.js +9 -0
- package/dist/components/bottom-sheet/bottom-sheet.css.d.ts +2 -0
- package/dist/components/bottom-sheet/bottom-sheet.css.d.ts.map +1 -0
- package/dist/components/bottom-sheet/bottom-sheet.d.ts +69 -0
- package/dist/components/bottom-sheet/bottom-sheet.d.ts.map +1 -0
- package/dist/components/bottom-sheet/bottom-sheet.js +4 -0
- package/dist/components/button/button.css.d.ts.map +1 -1
- package/dist/components/button/button.js +1 -1
- package/dist/components/button-group/button-group.css.d.ts +2 -0
- package/dist/components/button-group/button-group.css.d.ts.map +1 -0
- package/dist/components/button-group/button-group.d.ts +28 -0
- package/dist/components/button-group/button-group.d.ts.map +1 -0
- package/dist/components/button-group/button-group.js +4 -0
- package/dist/components/carousel/carousel-item.d.ts +33 -0
- package/dist/components/carousel/carousel-item.d.ts.map +1 -0
- package/dist/components/carousel/carousel-item.js +4 -0
- package/dist/components/carousel/carousel.css.d.ts +3 -0
- package/dist/components/carousel/carousel.css.d.ts.map +1 -0
- package/dist/components/carousel/carousel.d.ts +81 -0
- package/dist/components/carousel/carousel.d.ts.map +1 -0
- package/dist/components/carousel/carousel.js +284 -0
- package/dist/components/carousel/carousel.js.map +1 -0
- package/dist/components/date-picker/date-picker.css.d.ts +2 -0
- package/dist/components/date-picker/date-picker.css.d.ts.map +1 -0
- package/dist/components/date-picker/date-picker.d.ts +59 -0
- package/dist/components/date-picker/date-picker.d.ts.map +1 -0
- package/dist/components/date-picker/date-picker.js +4 -0
- package/dist/components/fab-menu/fab-menu-item.d.ts +35 -0
- package/dist/components/fab-menu/fab-menu-item.d.ts.map +1 -0
- package/dist/components/fab-menu/fab-menu-item.js +93 -0
- package/dist/components/fab-menu/fab-menu-item.js.map +1 -0
- package/dist/components/fab-menu/fab-menu.css.d.ts +3 -0
- package/dist/components/fab-menu/fab-menu.css.d.ts.map +1 -0
- package/dist/components/fab-menu/fab-menu.d.ts +72 -0
- package/dist/components/fab-menu/fab-menu.d.ts.map +1 -0
- package/dist/components/fab-menu/fab-menu.js +148 -0
- package/dist/components/fab-menu/fab-menu.js.map +1 -0
- package/dist/components/icon-button/icon-button.js +1 -1
- package/dist/components/loading-indicator/loading-indicator.css.d.ts +2 -0
- package/dist/components/loading-indicator/loading-indicator.css.d.ts.map +1 -0
- package/dist/components/loading-indicator/loading-indicator.d.ts +48 -0
- package/dist/components/loading-indicator/loading-indicator.d.ts.map +1 -0
- package/dist/components/loading-indicator/loading-indicator.js +4 -0
- package/dist/components/menu/menu-item.d.ts +41 -0
- package/dist/components/menu/menu-item.d.ts.map +1 -0
- package/dist/components/menu/menu-item.js +4 -0
- package/dist/components/menu/menu.css.d.ts +3 -0
- package/dist/components/menu/menu.css.d.ts.map +1 -0
- package/dist/components/menu/menu.d.ts +91 -0
- package/dist/components/menu/menu.d.ts.map +1 -0
- package/dist/components/menu/menu.js +205 -0
- package/dist/components/menu/menu.js.map +1 -0
- package/dist/components/navigation-bar/navigation-bar-item.d.ts +49 -0
- package/dist/components/navigation-bar/navigation-bar-item.d.ts.map +1 -0
- package/dist/components/navigation-bar/navigation-bar-item.js +5 -0
- package/dist/components/navigation-bar/navigation-bar.css.d.ts +3 -0
- package/dist/components/navigation-bar/navigation-bar.css.d.ts.map +1 -0
- package/dist/components/navigation-bar/navigation-bar.d.ts +50 -0
- package/dist/components/navigation-bar/navigation-bar.d.ts.map +1 -0
- package/dist/components/navigation-bar/navigation-bar.js +150 -0
- package/dist/components/navigation-bar/navigation-bar.js.map +1 -0
- package/dist/components/navigation-rail/navigation-rail-item.d.ts +36 -0
- package/dist/components/navigation-rail/navigation-rail-item.d.ts.map +1 -0
- package/dist/components/navigation-rail/navigation-rail-item.js +5 -0
- package/dist/components/navigation-rail/navigation-rail.css.d.ts +3 -0
- package/dist/components/navigation-rail/navigation-rail.css.d.ts.map +1 -0
- package/dist/components/navigation-rail/navigation-rail.d.ts +43 -0
- package/dist/components/navigation-rail/navigation-rail.d.ts.map +1 -0
- package/dist/components/navigation-rail/navigation-rail.js +121 -0
- package/dist/components/navigation-rail/navigation-rail.js.map +1 -0
- package/dist/components/segmented-button/segmented-button.css.d.ts +3 -0
- package/dist/components/segmented-button/segmented-button.css.d.ts.map +1 -0
- package/dist/components/segmented-button/segmented-button.d.ts +40 -0
- package/dist/components/segmented-button/segmented-button.d.ts.map +1 -0
- package/dist/components/segmented-button/segmented-button.js +5 -0
- package/dist/components/side-sheet/side-sheet.css.d.ts +2 -0
- package/dist/components/side-sheet/side-sheet.css.d.ts.map +1 -0
- package/dist/components/side-sheet/side-sheet.d.ts +57 -0
- package/dist/components/side-sheet/side-sheet.d.ts.map +1 -0
- package/dist/components/side-sheet/side-sheet.js +4 -0
- package/dist/components/slider/slider.css.d.ts +2 -0
- package/dist/components/slider/slider.css.d.ts.map +1 -0
- package/dist/components/slider/slider.d.ts +51 -0
- package/dist/components/slider/slider.d.ts.map +1 -0
- package/dist/components/slider/slider.js +4 -0
- package/dist/components/split-button/split-button.css.d.ts +2 -0
- package/dist/components/split-button/split-button.css.d.ts.map +1 -0
- package/dist/components/split-button/split-button.d.ts +89 -0
- package/dist/components/split-button/split-button.d.ts.map +1 -0
- package/dist/components/split-button/split-button.js +4 -0
- package/dist/components/table/table.js +1 -1
- package/dist/components/time-picker/time-picker.css.d.ts +2 -0
- package/dist/components/time-picker/time-picker.css.d.ts.map +1 -0
- package/dist/components/time-picker/time-picker.d.ts +87 -0
- package/dist/components/time-picker/time-picker.d.ts.map +1 -0
- package/dist/components/time-picker/time-picker.js +4 -0
- package/dist/components/toolbar/toolbar.css.d.ts +2 -0
- package/dist/components/toolbar/toolbar.css.d.ts.map +1 -0
- package/dist/components/toolbar/toolbar.d.ts +53 -0
- package/dist/components/toolbar/toolbar.d.ts.map +1 -0
- package/dist/components/toolbar/toolbar.js +4 -0
- package/dist/components/tooltip/tooltip.css.d.ts +2 -0
- package/dist/components/tooltip/tooltip.css.d.ts.map +1 -0
- package/dist/components/tooltip/tooltip.d.ts +89 -0
- package/dist/components/tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip/tooltip.js +4 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +148 -2263
- package/dist/tokens/index.js +4 -2
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/theme.css.d.ts.map +1 -1
- package/llms.txt +2326 -0
- package/package.json +99 -2
- package/dist/chunks/button-B4TSZ7Sl.js.map +0 -1
- package/dist/chunks/icon-button-BdSc7eot.js.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel.css.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/carousel.css.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,yBAwK1B,CAAC;AAEF,eAAO,MAAM,kBAAkB,yBAiH9B,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { PropertyValues } from 'lit';
|
|
2
|
+
import { MdBaseElement } from '../../internal/base-component.js';
|
|
3
|
+
export * from './carousel-item.js';
|
|
4
|
+
export type CarouselLayout = 'multi-browse' | 'hero' | 'full-width' | 'uncontained';
|
|
5
|
+
/**
|
|
6
|
+
* Material Design 3 Carousel Component.
|
|
7
|
+
*
|
|
8
|
+
* Supports multi-browse, hero, full-width, and uncontained layouts,
|
|
9
|
+
* smooth scrolling, next/prev navigation buttons, swipe/drag gestures, and pagination indicators.
|
|
10
|
+
*
|
|
11
|
+
* @slot - Default slot for `md-carousel-item` elements.
|
|
12
|
+
* @slot prev-button - Custom previous navigation button.
|
|
13
|
+
* @slot next-button - Custom next navigation button.
|
|
14
|
+
*/
|
|
15
|
+
export declare class MdCarousel extends MdBaseElement {
|
|
16
|
+
static styles: import('lit').CSSResultGroup[];
|
|
17
|
+
layout: CarouselLayout;
|
|
18
|
+
activeIndex: number;
|
|
19
|
+
hideControls: boolean;
|
|
20
|
+
hideIndicators: boolean;
|
|
21
|
+
loop: boolean;
|
|
22
|
+
autoplay: boolean;
|
|
23
|
+
autoplayInterval: number;
|
|
24
|
+
itemSpacing: string;
|
|
25
|
+
itemWidth: string;
|
|
26
|
+
itemHeight: string;
|
|
27
|
+
ariaLabelText: string;
|
|
28
|
+
private assignedItems;
|
|
29
|
+
private get items();
|
|
30
|
+
private scrollerElement?;
|
|
31
|
+
private isAtStart;
|
|
32
|
+
private isAtEnd;
|
|
33
|
+
private itemCount;
|
|
34
|
+
private autoplayTimer;
|
|
35
|
+
private isDragging;
|
|
36
|
+
private dragStartX;
|
|
37
|
+
private dragStartScrollLeft;
|
|
38
|
+
private dragThresholdPassed;
|
|
39
|
+
private isUserInteracting;
|
|
40
|
+
private isProgrammaticScroll;
|
|
41
|
+
private programmaticScrollTimer;
|
|
42
|
+
private scrollDebounceTimer;
|
|
43
|
+
connectedCallback(): void;
|
|
44
|
+
disconnectedCallback(): void;
|
|
45
|
+
updated(changedProperties: PropertyValues<this>): void;
|
|
46
|
+
private handleSlotChange;
|
|
47
|
+
private syncItemsLayout;
|
|
48
|
+
private startAutoplay;
|
|
49
|
+
private stopAutoplay;
|
|
50
|
+
private handleMouseEnter;
|
|
51
|
+
private handleMouseLeave;
|
|
52
|
+
private handleFocusIn;
|
|
53
|
+
private handleFocusOut;
|
|
54
|
+
/**
|
|
55
|
+
* Scrolls to the previous slide in the carousel.
|
|
56
|
+
*/
|
|
57
|
+
previous(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Scrolls to the next slide in the carousel.
|
|
60
|
+
*/
|
|
61
|
+
next(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Smoothly scrolls to a specific item index.
|
|
64
|
+
*/
|
|
65
|
+
scrollToIndex(index: number, smooth?: boolean): void;
|
|
66
|
+
private updateControlsState;
|
|
67
|
+
private handleScroll;
|
|
68
|
+
private determineActiveIndexFromScroll;
|
|
69
|
+
private handlePointerDown;
|
|
70
|
+
private handlePointerMove;
|
|
71
|
+
private handlePointerUp;
|
|
72
|
+
private handlePointerCancel;
|
|
73
|
+
private handleKeyDown;
|
|
74
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
75
|
+
}
|
|
76
|
+
declare global {
|
|
77
|
+
interface HTMLElementTagNameMap {
|
|
78
|
+
'md-carousel': MdCarousel;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=carousel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/carousel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,cAAc,EAAE,MAAM,KAAK,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,iCAAiC,CAAC;AACzC,OAAO,yCAAyC,CAAC;AACjD,OAAO,iBAAiB,CAAC;AAIzB,cAAc,oBAAoB,CAAC;AAEnC,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,MAAM,GAAG,YAAY,GAAG,aAAa,CAAC;AAEpF;;;;;;;;;GASG;AACH,qBACa,UAAW,SAAQ,aAAa;IAC3C,OAAgB,MAAM,iCAA0C;IAGhE,MAAM,EAAE,cAAc,CAAkB;IAGxC,WAAW,SAAK;IAGhB,YAAY,UAAS;IAGrB,cAAc,UAAS;IAGvB,IAAI,UAAS;IAGb,QAAQ,UAAS;IAGjB,gBAAgB,SAAQ;IAGxB,WAAW,SAAM;IAGjB,SAAS,SAAM;IAGf,UAAU,SAAM;IAGhB,aAAa,SAAc;IAG3B,OAAO,CAAC,aAAa,CAAoB;IAEzC,OAAO,KAAK,KAAK,GAKhB;IAGD,OAAO,CAAC,eAAe,CAAC,CAAc;IAGtC,OAAO,CAAC,SAAS,CAAQ;IAGzB,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,uBAAuB,CAA8C;IAC7E,OAAO,CAAC,mBAAmB,CAA8C;IAEhE,iBAAiB;IAkBjB,oBAAoB;IAgBpB,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC;IAmDxD,OAAO,CAAC,gBAAgB,CAItB;IAEF,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,gBAAgB,CAEtB;IAEF,OAAO,CAAC,gBAAgB,CAItB;IAEF,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,cAAc,CAIpB;IAEF;;OAEG;IACI,QAAQ,IAAI,IAAI;IAWvB;;OAEG;IACI,IAAI,IAAI,IAAI;IAWnB;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,OAAc,GAAG,IAAI;IA4CjE,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,YAAY,CAUlB;IAEF,OAAO,CAAC,8BAA8B;IAiCtC,OAAO,CAAC,iBAAiB,CAiBvB;IAEF,OAAO,CAAC,iBAAiB,CAWvB;IAEF,OAAO,CAAC,eAAe,CA8BrB;IAEF,OAAO,CAAC,mBAAmB,CAgBzB;IAEF,OAAO,CAAC,aAAa,CAcnB;IAEO,MAAM;CAiEhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,UAAU,CAAC;KAC3B;CACF"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { n as d, t as r } from "../../chunks/decorate-DXuynaiA.js";
|
|
2
|
+
import "../../chunks/ripple-squbKHhj.js";
|
|
3
|
+
import "../../chunks/focus-ring-CuiJuM-y.js";
|
|
4
|
+
import "../../chunks/icon-DrNqcNEL.js";
|
|
5
|
+
import { n as p, t as E } from "../../chunks/carousel-item-BG6kjjjk.js";
|
|
6
|
+
import { html as n, nothing as m } from "lit";
|
|
7
|
+
import { customElement as g, property as o, query as f, queryAssignedElements as y, state as u } from "lit/decorators.js";
|
|
8
|
+
var s = class extends d {
|
|
9
|
+
constructor(...e) {
|
|
10
|
+
super(...e), this.layout = "multi-browse", this.activeIndex = 0, this.hideControls = !1, this.hideIndicators = !1, this.loop = !1, this.autoplay = !1, this.autoplayInterval = 5e3, this.itemSpacing = "", this.itemWidth = "", this.itemHeight = "", this.ariaLabelText = "Carousel", this.isAtStart = !0, this.isAtEnd = !1, this.itemCount = 0, this.autoplayTimer = null, this.isDragging = !1, this.dragStartX = 0, this.dragStartScrollLeft = 0, this.dragThresholdPassed = !1, this.isUserInteracting = !1, this.isProgrammaticScroll = !1, this.programmaticScrollTimer = null, this.scrollDebounceTimer = null, this.handleSlotChange = () => {
|
|
11
|
+
this.itemCount = this.items?.length || 0, this.syncItemsLayout(), this.updateControlsState();
|
|
12
|
+
}, this.handleMouseEnter = () => {
|
|
13
|
+
this.stopAutoplay();
|
|
14
|
+
}, this.handleMouseLeave = () => {
|
|
15
|
+
this.autoplay && this.startAutoplay();
|
|
16
|
+
}, this.handleFocusIn = () => {
|
|
17
|
+
this.stopAutoplay();
|
|
18
|
+
}, this.handleFocusOut = () => {
|
|
19
|
+
this.autoplay && this.startAutoplay();
|
|
20
|
+
}, this.handleScroll = () => {
|
|
21
|
+
this.isProgrammaticScroll || this.isDragging || (this.scrollDebounceTimer && clearTimeout(this.scrollDebounceTimer), this.scrollDebounceTimer = setTimeout(() => {
|
|
22
|
+
this.determineActiveIndexFromScroll();
|
|
23
|
+
}, 80));
|
|
24
|
+
}, this.handlePointerDown = (t) => {
|
|
25
|
+
if (!(t.button !== 0 && t.pointerType === "mouse") && this.scrollerElement) {
|
|
26
|
+
this.isProgrammaticScroll = !1, this.isDragging = !0, this.dragThresholdPassed = !1, this.dragStartX = t.clientX, this.dragStartScrollLeft = this.scrollerElement.scrollLeft, this.scrollerElement.classList.add("is-dragging"), this.stopAutoplay();
|
|
27
|
+
try {
|
|
28
|
+
t.currentTarget?.setPointerCapture?.(t.pointerId);
|
|
29
|
+
} catch {
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}, this.handlePointerMove = (t) => {
|
|
33
|
+
if (!this.isDragging || !this.scrollerElement) return;
|
|
34
|
+
const i = t.clientX - this.dragStartX;
|
|
35
|
+
Math.abs(i) > 5 && (this.dragThresholdPassed = !0), this.dragThresholdPassed && (this.scrollerElement.scrollLeft = this.dragStartScrollLeft - i);
|
|
36
|
+
}, this.handlePointerUp = (t) => {
|
|
37
|
+
if (this.isDragging) {
|
|
38
|
+
this.isDragging = !1;
|
|
39
|
+
try {
|
|
40
|
+
t.currentTarget?.releasePointerCapture?.(t.pointerId);
|
|
41
|
+
} catch {
|
|
42
|
+
}
|
|
43
|
+
if (this.scrollerElement && this.scrollerElement.classList.remove("is-dragging"), this.dragThresholdPassed && this.scrollerElement) {
|
|
44
|
+
const i = t.clientX - this.dragStartX;
|
|
45
|
+
Math.abs(i) > 40 ? i < 0 ? this.next() : this.previous() : this.scrollToIndex(this.activeIndex, !0);
|
|
46
|
+
}
|
|
47
|
+
this.autoplay && this.startAutoplay();
|
|
48
|
+
}
|
|
49
|
+
}, this.handlePointerCancel = (t) => {
|
|
50
|
+
if (this.isDragging) {
|
|
51
|
+
this.isDragging = !1;
|
|
52
|
+
try {
|
|
53
|
+
t.currentTarget?.releasePointerCapture?.(t.pointerId);
|
|
54
|
+
} catch {
|
|
55
|
+
}
|
|
56
|
+
this.scrollerElement && this.scrollerElement.classList.remove("is-dragging"), this.autoplay && this.startAutoplay();
|
|
57
|
+
}
|
|
58
|
+
}, this.handleKeyDown = (t) => {
|
|
59
|
+
t.key === "ArrowRight" ? (t.preventDefault(), this.next()) : t.key === "ArrowLeft" ? (t.preventDefault(), this.previous()) : t.key === "Home" ? (t.preventDefault(), this.scrollToIndex(0)) : t.key === "End" && (t.preventDefault(), this.scrollToIndex((this.items?.length || 1) - 1));
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
static {
|
|
63
|
+
this.styles = [d.styles, p];
|
|
64
|
+
}
|
|
65
|
+
get items() {
|
|
66
|
+
return this.assignedItems && this.assignedItems.length > 0 ? this.assignedItems : Array.from(this.querySelectorAll("md-carousel-item"));
|
|
67
|
+
}
|
|
68
|
+
connectedCallback() {
|
|
69
|
+
super.connectedCallback(), this.setAttribute("role", "region"), this.setAttribute("aria-roledescription", "carousel"), !this.hasAttribute("aria-label") && this.ariaLabelText && this.setAttribute("aria-label", this.ariaLabelText), this.addEventListener("keydown", this.handleKeyDown), this.addEventListener("mouseenter", this.handleMouseEnter), this.addEventListener("mouseleave", this.handleMouseLeave), this.addEventListener("focusin", this.handleFocusIn), this.addEventListener("focusout", this.handleFocusOut), this.autoplay && this.startAutoplay();
|
|
70
|
+
}
|
|
71
|
+
disconnectedCallback() {
|
|
72
|
+
super.disconnectedCallback(), this.stopAutoplay(), this.removeEventListener("keydown", this.handleKeyDown), this.removeEventListener("mouseenter", this.handleMouseEnter), this.removeEventListener("mouseleave", this.handleMouseLeave), this.removeEventListener("focusin", this.handleFocusIn), this.removeEventListener("focusout", this.handleFocusOut), this.scrollDebounceTimer && clearTimeout(this.scrollDebounceTimer), this.programmaticScrollTimer && clearTimeout(this.programmaticScrollTimer);
|
|
73
|
+
}
|
|
74
|
+
updated(e) {
|
|
75
|
+
if (super.updated(e), e.has("itemSpacing"))
|
|
76
|
+
if (this.itemSpacing) {
|
|
77
|
+
const t = isNaN(Number(this.itemSpacing)) ? this.itemSpacing : `${this.itemSpacing}px`;
|
|
78
|
+
this.style.setProperty("--md-carousel-spacing", t);
|
|
79
|
+
} else this.style.removeProperty("--md-carousel-spacing");
|
|
80
|
+
if (e.has("itemWidth"))
|
|
81
|
+
if (this.itemWidth) {
|
|
82
|
+
const t = isNaN(Number(this.itemWidth)) ? this.itemWidth : `${this.itemWidth}px`;
|
|
83
|
+
this.style.setProperty("--md-carousel-item-width", t);
|
|
84
|
+
} else this.style.removeProperty("--md-carousel-item-width");
|
|
85
|
+
if (e.has("itemHeight"))
|
|
86
|
+
if (this.itemHeight) {
|
|
87
|
+
const t = isNaN(Number(this.itemHeight)) ? this.itemHeight : `${this.itemHeight}px`;
|
|
88
|
+
this.style.setProperty("--md-carousel-height", t), this.style.setProperty("--md-carousel-item-height", t);
|
|
89
|
+
} else
|
|
90
|
+
this.style.removeProperty("--md-carousel-height"), this.style.removeProperty("--md-carousel-item-height");
|
|
91
|
+
e.has("layout") && this.syncItemsLayout(), (e.has("autoplay") || e.has("autoplayInterval")) && (this.autoplay ? this.startAutoplay() : this.stopAutoplay()), e.has("activeIndex") && !this.isUserInteracting && !this.isProgrammaticScroll && this.scrollToIndex(this.activeIndex, !0), this.updateControlsState();
|
|
92
|
+
}
|
|
93
|
+
syncItemsLayout() {
|
|
94
|
+
this.items && this.items.forEach((e, t) => {
|
|
95
|
+
e.layout = this.layout, e.setAttribute("aria-label", `Slide ${t + 1} of ${this.items.length}`);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
startAutoplay() {
|
|
99
|
+
this.stopAutoplay(), this.autoplay && this.autoplayInterval > 0 && (this.autoplayTimer = setInterval(() => {
|
|
100
|
+
this.next();
|
|
101
|
+
}, this.autoplayInterval));
|
|
102
|
+
}
|
|
103
|
+
stopAutoplay() {
|
|
104
|
+
this.autoplayTimer && (clearInterval(this.autoplayTimer), this.autoplayTimer = null);
|
|
105
|
+
}
|
|
106
|
+
previous() {
|
|
107
|
+
const e = this.items?.length || 0;
|
|
108
|
+
e !== 0 && (this.activeIndex > 0 ? this.scrollToIndex(this.activeIndex - 1, !0) : this.loop && this.scrollToIndex(e - 1, !0));
|
|
109
|
+
}
|
|
110
|
+
next() {
|
|
111
|
+
const e = this.items?.length || 0;
|
|
112
|
+
e !== 0 && (this.activeIndex < e - 1 ? this.scrollToIndex(this.activeIndex + 1, !0) : this.loop && this.scrollToIndex(0, !0));
|
|
113
|
+
}
|
|
114
|
+
scrollToIndex(e, t = !0) {
|
|
115
|
+
if (!this.items || this.items.length === 0) return;
|
|
116
|
+
const i = Math.max(0, Math.min(e, this.items.length - 1)), a = this.items[i];
|
|
117
|
+
if (this.isProgrammaticScroll = !0, this.programmaticScrollTimer && clearTimeout(this.programmaticScrollTimer), this.programmaticScrollTimer = setTimeout(() => {
|
|
118
|
+
this.isProgrammaticScroll = !1;
|
|
119
|
+
}, t ? 500 : 50), a && this.scrollerElement)
|
|
120
|
+
if (i === 0) this.scrollerElement.scrollTo({
|
|
121
|
+
left: 0,
|
|
122
|
+
behavior: t ? "smooth" : "auto"
|
|
123
|
+
});
|
|
124
|
+
else {
|
|
125
|
+
const l = this.scrollerElement.getBoundingClientRect(), c = a.getBoundingClientRect(), h = this.scrollerElement.scrollLeft + (c.left - l.left);
|
|
126
|
+
this.scrollerElement.scrollTo({
|
|
127
|
+
left: Math.max(0, h),
|
|
128
|
+
behavior: t ? "smooth" : "auto"
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
this.activeIndex !== i && (this.activeIndex = i, this.emitEvent("change", {
|
|
132
|
+
activeIndex: this.activeIndex,
|
|
133
|
+
item: this.items[this.activeIndex]
|
|
134
|
+
})), this.updateControlsState();
|
|
135
|
+
}
|
|
136
|
+
updateControlsState() {
|
|
137
|
+
const e = this.items?.length || 0;
|
|
138
|
+
if (e === 0) {
|
|
139
|
+
this.isAtStart = !0, this.isAtEnd = !0;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (this.loop) {
|
|
143
|
+
this.isAtStart = !1, this.isAtEnd = !1;
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
this.isAtStart = this.activeIndex <= 0, this.isAtEnd = this.activeIndex >= e - 1;
|
|
147
|
+
}
|
|
148
|
+
determineActiveIndexFromScroll() {
|
|
149
|
+
if (this.isProgrammaticScroll || this.isDragging || !this.scrollerElement || !this.items || this.items.length === 0) return;
|
|
150
|
+
const e = this.scrollerElement.getBoundingClientRect().left;
|
|
151
|
+
let t = 0, i = 1 / 0;
|
|
152
|
+
this.items.forEach((a, l) => {
|
|
153
|
+
const c = a.getBoundingClientRect(), h = Math.abs(c.left - e);
|
|
154
|
+
h < i && (i = h, t = l);
|
|
155
|
+
}), this.activeIndex !== t && (this.isUserInteracting = !0, this.activeIndex = t, this.emitEvent("change", {
|
|
156
|
+
activeIndex: this.activeIndex,
|
|
157
|
+
item: this.items[this.activeIndex]
|
|
158
|
+
}), this.isUserInteracting = !1, this.updateControlsState());
|
|
159
|
+
}
|
|
160
|
+
render() {
|
|
161
|
+
const e = this.items?.length ?? this.itemCount, t = !this.hideControls && (e > 1 || e === 0), i = !this.hideIndicators && e > 1;
|
|
162
|
+
return n`
|
|
163
|
+
<div class="carousel-root">
|
|
164
|
+
<div class="carousel-viewport-wrapper">
|
|
165
|
+
${t ? n`
|
|
166
|
+
<slot name="prev-button">
|
|
167
|
+
<button
|
|
168
|
+
class="control-button prev"
|
|
169
|
+
type="button"
|
|
170
|
+
aria-label="Previous slide"
|
|
171
|
+
?disabled=${!this.loop && this.isAtStart}
|
|
172
|
+
@click=${() => this.previous()}
|
|
173
|
+
>
|
|
174
|
+
<md-icon name="chevron_left"></md-icon>
|
|
175
|
+
</button>
|
|
176
|
+
</slot>
|
|
177
|
+
<slot name="next-button">
|
|
178
|
+
<button
|
|
179
|
+
class="control-button next"
|
|
180
|
+
type="button"
|
|
181
|
+
aria-label="Next slide"
|
|
182
|
+
?disabled=${!this.loop && this.isAtEnd}
|
|
183
|
+
@click=${() => this.next()}
|
|
184
|
+
>
|
|
185
|
+
<md-icon name="chevron_right"></md-icon>
|
|
186
|
+
</button>
|
|
187
|
+
</slot>
|
|
188
|
+
` : m}
|
|
189
|
+
|
|
190
|
+
<div
|
|
191
|
+
class="carousel-scroller"
|
|
192
|
+
id="carousel-scroller"
|
|
193
|
+
tabindex="0"
|
|
194
|
+
aria-label=${this.ariaLabelText}
|
|
195
|
+
@scroll=${this.handleScroll}
|
|
196
|
+
@pointerdown=${this.handlePointerDown}
|
|
197
|
+
@pointermove=${this.handlePointerMove}
|
|
198
|
+
@pointerup=${this.handlePointerUp}
|
|
199
|
+
@pointercancel=${this.handlePointerCancel}
|
|
200
|
+
>
|
|
201
|
+
<slot @slotchange=${this.handleSlotChange}></slot>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
|
|
205
|
+
${i ? n`
|
|
206
|
+
<div class="indicators" role="tablist" aria-label="Carousel navigation">
|
|
207
|
+
${Array.from({ length: e }).map((a, l) => n`
|
|
208
|
+
<button
|
|
209
|
+
class="indicator-dot ${l === this.activeIndex ? "active" : ""}"
|
|
210
|
+
type="button"
|
|
211
|
+
role="tab"
|
|
212
|
+
aria-selected=${l === this.activeIndex ? "true" : "false"}
|
|
213
|
+
aria-label="Go to slide ${l + 1}"
|
|
214
|
+
@click=${() => this.scrollToIndex(l)}
|
|
215
|
+
></button>
|
|
216
|
+
`)}
|
|
217
|
+
</div>
|
|
218
|
+
` : m}
|
|
219
|
+
</div>
|
|
220
|
+
`;
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
r([o({
|
|
224
|
+
type: String,
|
|
225
|
+
reflect: !0
|
|
226
|
+
})], s.prototype, "layout", void 0);
|
|
227
|
+
r([o({
|
|
228
|
+
type: Number,
|
|
229
|
+
reflect: !0,
|
|
230
|
+
attribute: "active-index"
|
|
231
|
+
})], s.prototype, "activeIndex", void 0);
|
|
232
|
+
r([o({
|
|
233
|
+
type: Boolean,
|
|
234
|
+
reflect: !0,
|
|
235
|
+
attribute: "hide-controls"
|
|
236
|
+
})], s.prototype, "hideControls", void 0);
|
|
237
|
+
r([o({
|
|
238
|
+
type: Boolean,
|
|
239
|
+
reflect: !0,
|
|
240
|
+
attribute: "hide-indicators"
|
|
241
|
+
})], s.prototype, "hideIndicators", void 0);
|
|
242
|
+
r([o({
|
|
243
|
+
type: Boolean,
|
|
244
|
+
reflect: !0
|
|
245
|
+
})], s.prototype, "loop", void 0);
|
|
246
|
+
r([o({
|
|
247
|
+
type: Boolean,
|
|
248
|
+
reflect: !0
|
|
249
|
+
})], s.prototype, "autoplay", void 0);
|
|
250
|
+
r([o({
|
|
251
|
+
type: Number,
|
|
252
|
+
attribute: "autoplay-interval"
|
|
253
|
+
})], s.prototype, "autoplayInterval", void 0);
|
|
254
|
+
r([o({
|
|
255
|
+
type: String,
|
|
256
|
+
attribute: "item-spacing"
|
|
257
|
+
})], s.prototype, "itemSpacing", void 0);
|
|
258
|
+
r([o({
|
|
259
|
+
type: String,
|
|
260
|
+
attribute: "item-width"
|
|
261
|
+
})], s.prototype, "itemWidth", void 0);
|
|
262
|
+
r([o({
|
|
263
|
+
type: String,
|
|
264
|
+
attribute: "item-height"
|
|
265
|
+
})], s.prototype, "itemHeight", void 0);
|
|
266
|
+
r([o({
|
|
267
|
+
type: String,
|
|
268
|
+
attribute: "aria-label"
|
|
269
|
+
})], s.prototype, "ariaLabelText", void 0);
|
|
270
|
+
r([y({
|
|
271
|
+
selector: "md-carousel-item",
|
|
272
|
+
flatten: !0
|
|
273
|
+
})], s.prototype, "assignedItems", void 0);
|
|
274
|
+
r([f(".carousel-scroller")], s.prototype, "scrollerElement", void 0);
|
|
275
|
+
r([u()], s.prototype, "isAtStart", void 0);
|
|
276
|
+
r([u()], s.prototype, "isAtEnd", void 0);
|
|
277
|
+
r([u()], s.prototype, "itemCount", void 0);
|
|
278
|
+
s = r([g("md-carousel")], s);
|
|
279
|
+
export {
|
|
280
|
+
s as MdCarousel,
|
|
281
|
+
E as MdCarouselItem
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
//# sourceMappingURL=carousel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel.js","names":[],"sources":["../../../src/components/carousel/carousel.ts"],"sourcesContent":["import { html, nothing, PropertyValues } from 'lit';\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js';\nimport { MdBaseElement } from '../../internal/base-component.js';\nimport '../../internal/ripple/ripple.js';\nimport '../../internal/focus-ring/focus-ring.js';\nimport '../icon/icon.js';\nimport { carouselStyles } from './carousel.css.js';\nimport { MdCarouselItem } from './carousel-item.js';\n\nexport * from './carousel-item.js';\n\nexport type CarouselLayout = 'multi-browse' | 'hero' | 'full-width' | 'uncontained';\n\n/**\n * Material Design 3 Carousel Component.\n *\n * Supports multi-browse, hero, full-width, and uncontained layouts,\n * smooth scrolling, next/prev navigation buttons, swipe/drag gestures, and pagination indicators.\n *\n * @slot - Default slot for `md-carousel-item` elements.\n * @slot prev-button - Custom previous navigation button.\n * @slot next-button - Custom next navigation button.\n */\n@customElement('md-carousel')\nexport class MdCarousel extends MdBaseElement {\n static override styles = [MdBaseElement.styles, carouselStyles];\n\n @property({ type: String, reflect: true })\n layout: CarouselLayout = 'multi-browse';\n\n @property({ type: Number, reflect: true, attribute: 'active-index' })\n activeIndex = 0;\n\n @property({ type: Boolean, reflect: true, attribute: 'hide-controls' })\n hideControls = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'hide-indicators' })\n hideIndicators = false;\n\n @property({ type: Boolean, reflect: true })\n loop = false;\n\n @property({ type: Boolean, reflect: true })\n autoplay = false;\n\n @property({ type: Number, attribute: 'autoplay-interval' })\n autoplayInterval = 5000;\n\n @property({ type: String, attribute: 'item-spacing' })\n itemSpacing = '';\n\n @property({ type: String, attribute: 'item-width' })\n itemWidth = '';\n\n @property({ type: String, attribute: 'item-height' })\n itemHeight = '';\n\n @property({ type: String, attribute: 'aria-label' })\n ariaLabelText = 'Carousel';\n\n @queryAssignedElements({ selector: 'md-carousel-item', flatten: true })\n private assignedItems!: MdCarouselItem[];\n\n private get items(): MdCarouselItem[] {\n if (this.assignedItems && this.assignedItems.length > 0) {\n return this.assignedItems;\n }\n return Array.from(this.querySelectorAll('md-carousel-item')) as MdCarouselItem[];\n }\n\n @query('.carousel-scroller')\n private scrollerElement?: HTMLElement;\n\n @state()\n private isAtStart = true;\n\n @state()\n private isAtEnd = false;\n\n @state()\n private itemCount = 0;\n\n private autoplayTimer: ReturnType<typeof setInterval> | null = null;\n private isDragging = false;\n private dragStartX = 0;\n private dragStartScrollLeft = 0;\n private dragThresholdPassed = false;\n private isUserInteracting = false;\n private isProgrammaticScroll = false;\n private programmaticScrollTimer: ReturnType<typeof setTimeout> | null = null;\n private scrollDebounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n override connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'region');\n this.setAttribute('aria-roledescription', 'carousel');\n if (!this.hasAttribute('aria-label') && this.ariaLabelText) {\n this.setAttribute('aria-label', this.ariaLabelText);\n }\n this.addEventListener('keydown', this.handleKeyDown);\n this.addEventListener('mouseenter', this.handleMouseEnter);\n this.addEventListener('mouseleave', this.handleMouseLeave);\n this.addEventListener('focusin', this.handleFocusIn);\n this.addEventListener('focusout', this.handleFocusOut);\n\n if (this.autoplay) {\n this.startAutoplay();\n }\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.stopAutoplay();\n this.removeEventListener('keydown', this.handleKeyDown);\n this.removeEventListener('mouseenter', this.handleMouseEnter);\n this.removeEventListener('mouseleave', this.handleMouseLeave);\n this.removeEventListener('focusin', this.handleFocusIn);\n this.removeEventListener('focusout', this.handleFocusOut);\n if (this.scrollDebounceTimer) {\n clearTimeout(this.scrollDebounceTimer);\n }\n if (this.programmaticScrollTimer) {\n clearTimeout(this.programmaticScrollTimer);\n }\n }\n\n override updated(changedProperties: PropertyValues<this>) {\n super.updated(changedProperties);\n\n if (changedProperties.has('itemSpacing')) {\n if (this.itemSpacing) {\n const spacingVal = isNaN(Number(this.itemSpacing)) ? this.itemSpacing : `${this.itemSpacing}px`;\n this.style.setProperty('--md-carousel-spacing', spacingVal);\n } else {\n this.style.removeProperty('--md-carousel-spacing');\n }\n }\n\n if (changedProperties.has('itemWidth')) {\n if (this.itemWidth) {\n const widthVal = isNaN(Number(this.itemWidth)) ? this.itemWidth : `${this.itemWidth}px`;\n this.style.setProperty('--md-carousel-item-width', widthVal);\n } else {\n this.style.removeProperty('--md-carousel-item-width');\n }\n }\n\n if (changedProperties.has('itemHeight')) {\n if (this.itemHeight) {\n const heightVal = isNaN(Number(this.itemHeight)) ? this.itemHeight : `${this.itemHeight}px`;\n this.style.setProperty('--md-carousel-height', heightVal);\n this.style.setProperty('--md-carousel-item-height', heightVal);\n } else {\n this.style.removeProperty('--md-carousel-height');\n this.style.removeProperty('--md-carousel-item-height');\n }\n }\n\n if (changedProperties.has('layout')) {\n this.syncItemsLayout();\n }\n\n if (changedProperties.has('autoplay') || changedProperties.has('autoplayInterval')) {\n if (this.autoplay) {\n this.startAutoplay();\n } else {\n this.stopAutoplay();\n }\n }\n\n if (changedProperties.has('activeIndex') && !this.isUserInteracting && !this.isProgrammaticScroll) {\n this.scrollToIndex(this.activeIndex, true);\n }\n\n this.updateControlsState();\n }\n\n private handleSlotChange = () => {\n this.itemCount = this.items?.length || 0;\n this.syncItemsLayout();\n this.updateControlsState();\n };\n\n private syncItemsLayout() {\n if (!this.items) return;\n this.items.forEach((item, index) => {\n item.layout = this.layout;\n item.setAttribute('aria-label', `Slide ${index + 1} of ${this.items.length}`);\n });\n }\n\n private startAutoplay() {\n this.stopAutoplay();\n if (this.autoplay && this.autoplayInterval > 0) {\n this.autoplayTimer = setInterval(() => {\n this.next();\n }, this.autoplayInterval);\n }\n }\n\n private stopAutoplay() {\n if (this.autoplayTimer) {\n clearInterval(this.autoplayTimer);\n this.autoplayTimer = null;\n }\n }\n\n private handleMouseEnter = () => {\n this.stopAutoplay();\n };\n\n private handleMouseLeave = () => {\n if (this.autoplay) {\n this.startAutoplay();\n }\n };\n\n private handleFocusIn = () => {\n this.stopAutoplay();\n };\n\n private handleFocusOut = () => {\n if (this.autoplay) {\n this.startAutoplay();\n }\n };\n\n /**\n * Scrolls to the previous slide in the carousel.\n */\n public previous(): void {\n const count = this.items?.length || 0;\n if (count === 0) return;\n\n if (this.activeIndex > 0) {\n this.scrollToIndex(this.activeIndex - 1, true);\n } else if (this.loop) {\n this.scrollToIndex(count - 1, true);\n }\n }\n\n /**\n * Scrolls to the next slide in the carousel.\n */\n public next(): void {\n const count = this.items?.length || 0;\n if (count === 0) return;\n\n if (this.activeIndex < count - 1) {\n this.scrollToIndex(this.activeIndex + 1, true);\n } else if (this.loop) {\n this.scrollToIndex(0, true);\n }\n }\n\n /**\n * Smoothly scrolls to a specific item index.\n */\n public scrollToIndex(index: number, smooth: boolean = true): void {\n if (!this.items || this.items.length === 0) return;\n\n const clampedIndex = Math.max(0, Math.min(index, this.items.length - 1));\n const targetItem = this.items[clampedIndex];\n\n this.isProgrammaticScroll = true;\n if (this.programmaticScrollTimer) {\n clearTimeout(this.programmaticScrollTimer);\n }\n this.programmaticScrollTimer = setTimeout(() => {\n this.isProgrammaticScroll = false;\n }, smooth ? 500 : 50);\n\n if (targetItem && this.scrollerElement) {\n if (clampedIndex === 0) {\n this.scrollerElement.scrollTo({\n left: 0,\n behavior: smooth ? 'smooth' : 'auto',\n });\n } else {\n const scrollerRect = this.scrollerElement.getBoundingClientRect();\n const itemRect = targetItem.getBoundingClientRect();\n const currentScroll = this.scrollerElement.scrollLeft;\n const targetScroll = currentScroll + (itemRect.left - scrollerRect.left);\n\n this.scrollerElement.scrollTo({\n left: Math.max(0, targetScroll),\n behavior: smooth ? 'smooth' : 'auto',\n });\n }\n }\n\n if (this.activeIndex !== clampedIndex) {\n this.activeIndex = clampedIndex;\n this.emitEvent('change', {\n activeIndex: this.activeIndex,\n item: this.items[this.activeIndex],\n });\n }\n\n this.updateControlsState();\n }\n\n private updateControlsState() {\n const count = this.items?.length || 0;\n if (count === 0) {\n this.isAtStart = true;\n this.isAtEnd = true;\n return;\n }\n\n if (this.loop) {\n this.isAtStart = false;\n this.isAtEnd = false;\n return;\n }\n\n this.isAtStart = this.activeIndex <= 0;\n this.isAtEnd = this.activeIndex >= count - 1;\n }\n\n private handleScroll = () => {\n if (this.isProgrammaticScroll || this.isDragging) return;\n\n if (this.scrollDebounceTimer) {\n clearTimeout(this.scrollDebounceTimer);\n }\n\n this.scrollDebounceTimer = setTimeout(() => {\n this.determineActiveIndexFromScroll();\n }, 80);\n };\n\n private determineActiveIndexFromScroll() {\n if (this.isProgrammaticScroll || this.isDragging) return;\n if (!this.scrollerElement || !this.items || this.items.length === 0) return;\n\n const scrollerRect = this.scrollerElement.getBoundingClientRect();\n const scrollerLeft = scrollerRect.left;\n\n let closestIndex = 0;\n let minDistance = Infinity;\n\n this.items.forEach((item, index) => {\n const itemRect = item.getBoundingClientRect();\n const distance = Math.abs(itemRect.left - scrollerLeft);\n if (distance < minDistance) {\n minDistance = distance;\n closestIndex = index;\n }\n });\n\n if (this.activeIndex !== closestIndex) {\n this.isUserInteracting = true;\n this.activeIndex = closestIndex;\n this.emitEvent('change', {\n activeIndex: this.activeIndex,\n item: this.items[this.activeIndex],\n });\n this.isUserInteracting = false;\n this.updateControlsState();\n }\n }\n\n /* --- Pointer / Mouse Drag & Touch Swipe Support --- */\n\n private handlePointerDown = (event: PointerEvent) => {\n if (event.button !== 0 && event.pointerType === 'mouse') return;\n if (!this.scrollerElement) return;\n\n this.isProgrammaticScroll = false;\n this.isDragging = true;\n this.dragThresholdPassed = false;\n this.dragStartX = event.clientX;\n this.dragStartScrollLeft = this.scrollerElement.scrollLeft;\n this.scrollerElement.classList.add('is-dragging');\n this.stopAutoplay();\n\n try {\n (event.currentTarget as HTMLElement)?.setPointerCapture?.(event.pointerId);\n } catch (_) {\n // Ignore if pointer capture is not supported\n }\n };\n\n private handlePointerMove = (event: PointerEvent) => {\n if (!this.isDragging || !this.scrollerElement) return;\n\n const deltaX = event.clientX - this.dragStartX;\n if (Math.abs(deltaX) > 5) {\n this.dragThresholdPassed = true;\n }\n\n if (this.dragThresholdPassed) {\n this.scrollerElement.scrollLeft = this.dragStartScrollLeft - deltaX;\n }\n };\n\n private handlePointerUp = (event: PointerEvent) => {\n if (!this.isDragging) return;\n this.isDragging = false;\n\n try {\n (event.currentTarget as HTMLElement)?.releasePointerCapture?.(event.pointerId);\n } catch (_) {\n // Ignore if pointer release is not supported\n }\n\n if (this.scrollerElement) {\n this.scrollerElement.classList.remove('is-dragging');\n }\n\n if (this.dragThresholdPassed && this.scrollerElement) {\n const deltaX = event.clientX - this.dragStartX;\n if (Math.abs(deltaX) > 40) {\n if (deltaX < 0) {\n this.next();\n } else {\n this.previous();\n }\n } else {\n this.scrollToIndex(this.activeIndex, true);\n }\n }\n\n if (this.autoplay) {\n this.startAutoplay();\n }\n };\n\n private handlePointerCancel = (event: PointerEvent) => {\n if (!this.isDragging) return;\n this.isDragging = false;\n\n try {\n (event.currentTarget as HTMLElement)?.releasePointerCapture?.(event.pointerId);\n } catch (_) {\n // Ignore if pointer release is not supported\n }\n\n if (this.scrollerElement) {\n this.scrollerElement.classList.remove('is-dragging');\n }\n if (this.autoplay) {\n this.startAutoplay();\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n this.next();\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n this.previous();\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.scrollToIndex(0);\n } else if (event.key === 'End') {\n event.preventDefault();\n this.scrollToIndex((this.items?.length || 1) - 1);\n }\n };\n\n override render() {\n const count = this.items?.length ?? this.itemCount;\n const showControls = !this.hideControls && (count > 1 || count === 0);\n const showIndicators = !this.hideIndicators && count > 1;\n\n return html`\n <div class=\"carousel-root\">\n <div class=\"carousel-viewport-wrapper\">\n ${showControls ? html`\n <slot name=\"prev-button\">\n <button\n class=\"control-button prev\"\n type=\"button\"\n aria-label=\"Previous slide\"\n ?disabled=${!this.loop && this.isAtStart}\n @click=${() => this.previous()}\n >\n <md-icon name=\"chevron_left\"></md-icon>\n </button>\n </slot>\n <slot name=\"next-button\">\n <button\n class=\"control-button next\"\n type=\"button\"\n aria-label=\"Next slide\"\n ?disabled=${!this.loop && this.isAtEnd}\n @click=${() => this.next()}\n >\n <md-icon name=\"chevron_right\"></md-icon>\n </button>\n </slot>\n ` : nothing}\n\n <div\n class=\"carousel-scroller\"\n id=\"carousel-scroller\"\n tabindex=\"0\"\n aria-label=${this.ariaLabelText}\n @scroll=${this.handleScroll}\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n >\n <slot @slotchange=${this.handleSlotChange}></slot>\n </div>\n </div>\n\n ${showIndicators ? html`\n <div class=\"indicators\" role=\"tablist\" aria-label=\"Carousel navigation\">\n ${Array.from({ length: count }).map((_, index) => html`\n <button\n class=\"indicator-dot ${index === this.activeIndex ? 'active' : ''}\"\n type=\"button\"\n role=\"tab\"\n aria-selected=${index === this.activeIndex ? 'true' : 'false'}\n aria-label=\"Go to slide ${index + 1}\"\n @click=${() => this.scrollToIndex(index)}\n ></button>\n `)}\n </div>\n ` : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-carousel': MdCarousel;\n }\n}\n"],"mappings":";;;;;;;AAwBO,IAAM,IAAN,cAAyB,EAAc;AAAA;iBAInB,KAAA,SAAA,gBAGX,KAAA,cAAA,GAGC,KAAA,eAAA,IAGE,KAAA,iBAAA,IAGV,KAAA,OAAA,IAGI,KAAA,WAAA,IAGQ,KAAA,mBAAA,KAGL,KAAA,cAAA,IAGF,KAAA,YAAA,IAGC,KAAA,aAAA,IAGG,KAAA,gBAAA,YAgBI,KAAA,YAAA,IAGF,KAAA,UAAA,IAGE,KAAA,YAAA,GAE2C,KAAA,gBAAA,MAC1C,KAAA,aAAA,IACA,KAAA,aAAA,GACS,KAAA,sBAAA,GACA,KAAA,sBAAA,IACF,KAAA,oBAAA,IACG,KAAA,uBAAA,IACyC,KAAA,0BAAA,MACJ,KAAA,sBAAA,MAuFnC,KAAA,mBAAA,MAAA;AAC/B,WAAK,YAAY,KAAK,OAAO,UAAU,GACvC,KAAK,gBAAgB,GACrB,KAAK,oBAAoB;AAAA,IAC3B,GA0BiC,KAAA,mBAAA,MAAA;AAC/B,WAAK,aAAa;AAAA,IACpB,GAEiC,KAAA,mBAAA,MAAA;AAC/B,MAAI,KAAK,YACP,KAAK,cAAc;AAAA,IAEvB,GAE8B,KAAA,gBAAA,MAAA;AAC5B,WAAK,aAAa;AAAA,IACpB,GAE+B,KAAA,iBAAA,MAAA;AAC7B,MAAI,KAAK,YACP,KAAK,cAAc;AAAA,IAEvB,GA+F6B,KAAA,eAAA,MAAA;AAC3B,MAAI,KAAK,wBAAwB,KAAK,eAElC,KAAK,uBACP,aAAa,KAAK,mBAAmB,GAGvC,KAAK,sBAAsB,WAAA,MAAiB;AAC1C,aAAK,+BAA+B;AAAA,MACtC,GAAG,EAAE;AAAA,IACP,GAmC6B,KAAA,oBAAA,CAAA,MAAwB;AACnD,UAAI,EAAA,EAAM,WAAW,KAAK,EAAM,gBAAgB,YAC3C,KAAK,iBAEV;AAAA,aAAK,uBAAuB,IAC5B,KAAK,aAAa,IAClB,KAAK,sBAAsB,IAC3B,KAAK,aAAa,EAAM,SACxB,KAAK,sBAAsB,KAAK,gBAAgB,YAChD,KAAK,gBAAgB,UAAU,IAAI,aAAa,GAChD,KAAK,aAAa;AAElB,YAAI;AACF,UAAA,EAAO,eAA+B,oBAAoB,EAAM,SAAS;AAAA,QAC3E,QAAY;AAAA,QAEZ;AAAA;AAAA,IACF,GAE6B,KAAA,oBAAA,CAAA,MAAwB;AACnD,UAAI,CAAC,KAAK,cAAc,CAAC,KAAK,gBAAiB;AAE/C,YAAM,IAAS,EAAM,UAAU,KAAK;AACpC,MAAI,KAAK,IAAI,CAAM,IAAI,MACrB,KAAK,sBAAsB,KAGzB,KAAK,wBACP,KAAK,gBAAgB,aAAa,KAAK,sBAAsB;AAAA,IAEjE,GAE2B,KAAA,kBAAA,CAAA,MAAwB;AACjD,UAAK,KAAK,YACV;AAAA,aAAK,aAAa;AAElB,YAAI;AACF,UAAA,EAAO,eAA+B,wBAAwB,EAAM,SAAS;AAAA,QAC/E,QAAY;AAAA,QAEZ;AAMA,YAJI,KAAK,mBACP,KAAK,gBAAgB,UAAU,OAAO,aAAa,GAGjD,KAAK,uBAAuB,KAAK,iBAAiB;AACpD,gBAAM,IAAS,EAAM,UAAU,KAAK;AACpC,UAAI,KAAK,IAAI,CAAM,IAAI,KACjB,IAAS,IACX,KAAK,KAAK,IAEV,KAAK,SAAS,IAGhB,KAAK,cAAc,KAAK,aAAa,EAAI;AAAA,QAE7C;AAEA,QAAI,KAAK,YACP,KAAK,cAAc;AAAA;AAAA,IAEvB,GAE+B,KAAA,sBAAA,CAAA,MAAwB;AACrD,UAAK,KAAK,YACV;AAAA,aAAK,aAAa;AAElB,YAAI;AACF,UAAA,EAAO,eAA+B,wBAAwB,EAAM,SAAS;AAAA,QAC/E,QAAY;AAAA,QAEZ;AAEA,QAAI,KAAK,mBACP,KAAK,gBAAgB,UAAU,OAAO,aAAa,GAEjD,KAAK,YACP,KAAK,cAAc;AAAA;AAAA,IAEvB,GAEyB,KAAA,gBAAA,CAAA,MAAyB;AAChD,MAAI,EAAM,QAAQ,gBAChB,EAAM,eAAe,GACrB,KAAK,KAAK,KACD,EAAM,QAAQ,eACvB,EAAM,eAAe,GACrB,KAAK,SAAS,KACL,EAAM,QAAQ,UACvB,EAAM,eAAe,GACrB,KAAK,cAAc,CAAC,KACX,EAAM,QAAQ,UACvB,EAAM,eAAe,GACrB,KAAK,eAAe,KAAK,OAAO,UAAU,KAAK,CAAC;AAAA,IAEpD;AAAA;;AApbyB,SAAA,SAAA,CAAC,EAAc,QAAQ,CAAc;AAAA;EAsC9D,IAAY,QAA0B;AACpC,WAAI,KAAK,iBAAiB,KAAK,cAAc,SAAS,IAC7C,KAAK,gBAEP,MAAM,KAAK,KAAK,iBAAiB,kBAAkB,CAAC;AAAA,EAC7D;AAAA,EAwBA,oBAA6B;AAC3B,UAAM,kBAAkB,GACxB,KAAK,aAAa,QAAQ,QAAQ,GAClC,KAAK,aAAa,wBAAwB,UAAU,GAChD,CAAC,KAAK,aAAa,YAAY,KAAK,KAAK,iBAC3C,KAAK,aAAa,cAAc,KAAK,aAAa,GAEpD,KAAK,iBAAiB,WAAW,KAAK,aAAa,GACnD,KAAK,iBAAiB,cAAc,KAAK,gBAAgB,GACzD,KAAK,iBAAiB,cAAc,KAAK,gBAAgB,GACzD,KAAK,iBAAiB,WAAW,KAAK,aAAa,GACnD,KAAK,iBAAiB,YAAY,KAAK,cAAc,GAEjD,KAAK,YACP,KAAK,cAAc;AAAA,EAEvB;AAAA,EAEA,uBAAgC;AAC9B,UAAM,qBAAqB,GAC3B,KAAK,aAAa,GAClB,KAAK,oBAAoB,WAAW,KAAK,aAAa,GACtD,KAAK,oBAAoB,cAAc,KAAK,gBAAgB,GAC5D,KAAK,oBAAoB,cAAc,KAAK,gBAAgB,GAC5D,KAAK,oBAAoB,WAAW,KAAK,aAAa,GACtD,KAAK,oBAAoB,YAAY,KAAK,cAAc,GACpD,KAAK,uBACP,aAAa,KAAK,mBAAmB,GAEnC,KAAK,2BACP,aAAa,KAAK,uBAAuB;AAAA,EAE7C;AAAA,EAEA,QAAiB,GAAyC;AAGxD,QAFA,MAAM,QAAQ,CAAiB,GAE3B,EAAkB,IAAI,aAAa;AACrC,UAAI,KAAK,aAAa;AACpB,cAAM,IAAa,MAAM,OAAO,KAAK,WAAW,CAAC,IAAI,KAAK,cAAc,GAAG,KAAK,WAAA;AAChF,aAAK,MAAM,YAAY,yBAAyB,CAAU;AAAA,MAC5D,MACE,MAAK,MAAM,eAAe,uBAAuB;AAIrD,QAAI,EAAkB,IAAI,WAAW;AACnC,UAAI,KAAK,WAAW;AAClB,cAAM,IAAW,MAAM,OAAO,KAAK,SAAS,CAAC,IAAI,KAAK,YAAY,GAAG,KAAK,SAAA;AAC1E,aAAK,MAAM,YAAY,4BAA4B,CAAQ;AAAA,MAC7D,MACE,MAAK,MAAM,eAAe,0BAA0B;AAIxD,QAAI,EAAkB,IAAI,YAAY;AACpC,UAAI,KAAK,YAAY;AACnB,cAAM,IAAY,MAAM,OAAO,KAAK,UAAU,CAAC,IAAI,KAAK,aAAa,GAAG,KAAK,UAAA;AAC7E,aAAK,MAAM,YAAY,wBAAwB,CAAS,GACxD,KAAK,MAAM,YAAY,6BAA6B,CAAS;AAAA,MAC/D;AACE,aAAK,MAAM,eAAe,sBAAsB,GAChD,KAAK,MAAM,eAAe,2BAA2B;AAIzD,IAAI,EAAkB,IAAI,QAAQ,KAChC,KAAK,gBAAgB,IAGnB,EAAkB,IAAI,UAAU,KAAK,EAAkB,IAAI,kBAAkB,OAC3E,KAAK,WACP,KAAK,cAAc,IAEnB,KAAK,aAAa,IAIlB,EAAkB,IAAI,aAAa,KAAK,CAAC,KAAK,qBAAqB,CAAC,KAAK,wBAC3E,KAAK,cAAc,KAAK,aAAa,EAAI,GAG3C,KAAK,oBAAoB;AAAA,EAC3B;AAAA,EAQA,kBAA0B;AACxB,IAAK,KAAK,SACV,KAAK,MAAM,QAAA,CAAS,GAAM,MAAU;AAClC,MAAA,EAAK,SAAS,KAAK,QACnB,EAAK,aAAa,cAAc,SAAS,IAAQ,CAAA,OAAQ,KAAK,MAAM,MAAA,EAAQ;AAAA,IAC9E,CAAC;AAAA,EACH;AAAA,EAEA,gBAAwB;AACtB,SAAK,aAAa,GACd,KAAK,YAAY,KAAK,mBAAmB,MAC3C,KAAK,gBAAgB,YAAA,MAAkB;AACrC,WAAK,KAAK;AAAA,IACZ,GAAG,KAAK,gBAAgB;AAAA,EAE5B;AAAA,EAEA,eAAuB;AACrB,IAAI,KAAK,kBACP,cAAc,KAAK,aAAa,GAChC,KAAK,gBAAgB;AAAA,EAEzB;AAAA,EAyBA,WAAwB;AACtB,UAAM,IAAQ,KAAK,OAAO,UAAU;AACpC,IAAI,MAAU,MAEV,KAAK,cAAc,IACrB,KAAK,cAAc,KAAK,cAAc,GAAG,EAAI,IACpC,KAAK,QACd,KAAK,cAAc,IAAQ,GAAG,EAAI;AAAA,EAEtC;AAAA,EAKA,OAAoB;AAClB,UAAM,IAAQ,KAAK,OAAO,UAAU;AACpC,IAAI,MAAU,MAEV,KAAK,cAAc,IAAQ,IAC7B,KAAK,cAAc,KAAK,cAAc,GAAG,EAAI,IACpC,KAAK,QACd,KAAK,cAAc,GAAG,EAAI;AAAA,EAE9B;AAAA,EAKA,cAAqB,GAAe,IAAkB,IAAY;AAChE,QAAI,CAAC,KAAK,SAAS,KAAK,MAAM,WAAW,EAAG;AAE5C,UAAM,IAAe,KAAK,IAAI,GAAG,KAAK,IAAI,GAAO,KAAK,MAAM,SAAS,CAAC,CAAC,GACjE,IAAa,KAAK,MAAM,CAAA;AAU9B,QARA,KAAK,uBAAuB,IACxB,KAAK,2BACP,aAAa,KAAK,uBAAuB,GAE3C,KAAK,0BAA0B,WAAA,MAAiB;AAC9C,WAAK,uBAAuB;AAAA,IAC9B,GAAG,IAAS,MAAM,EAAE,GAEhB,KAAc,KAAK;AACrB,UAAI,MAAiB,EACnB,MAAK,gBAAgB,SAAS;AAAA,QAC5B,MAAM;AAAA,QACN,UAAU,IAAS,WAAW;AAAA,MAChC,CAAC;AAAA,WACI;AACL,cAAM,IAAe,KAAK,gBAAgB,sBAAsB,GAC1D,IAAW,EAAW,sBAAsB,GAE5C,IADgB,KAAK,gBAAgB,cACL,EAAS,OAAO,EAAa;AAEnE,aAAK,gBAAgB,SAAS;AAAA,UAC5B,MAAM,KAAK,IAAI,GAAG,CAAY;AAAA,UAC9B,UAAU,IAAS,WAAW;AAAA,QAChC,CAAC;AAAA,MACH;AAGF,IAAI,KAAK,gBAAgB,MACvB,KAAK,cAAc,GACnB,KAAK,UAAU,UAAU;AAAA,MACvB,aAAa,KAAK;AAAA,MAClB,MAAM,KAAK,MAAM,KAAK,WAAA;AAAA,IACxB,CAAC,IAGH,KAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,sBAA8B;AAC5B,UAAM,IAAQ,KAAK,OAAO,UAAU;AACpC,QAAI,MAAU,GAAG;AACf,WAAK,YAAY,IACjB,KAAK,UAAU;AACf;AAAA,IACF;AAEA,QAAI,KAAK,MAAM;AACb,WAAK,YAAY,IACjB,KAAK,UAAU;AACf;AAAA,IACF;AAEA,SAAK,YAAY,KAAK,eAAe,GACrC,KAAK,UAAU,KAAK,eAAe,IAAQ;AAAA,EAC7C;AAAA,EAcA,iCAAyC;AAEvC,QADI,KAAK,wBAAwB,KAAK,cAClC,CAAC,KAAK,mBAAmB,CAAC,KAAK,SAAS,KAAK,MAAM,WAAW,EAAG;AAGrE,UAAM,IADe,KAAK,gBAAgB,sBACrB,EAAa;AAElC,QAAI,IAAe,GACf,IAAc;AAElB,SAAK,MAAM,QAAA,CAAS,GAAM,MAAU;AAClC,YAAM,IAAW,EAAK,sBAAsB,GACtC,IAAW,KAAK,IAAI,EAAS,OAAO,CAAY;AACtD,MAAI,IAAW,MACb,IAAc,GACd,IAAe;AAAA,IAEnB,CAAC,GAEG,KAAK,gBAAgB,MACvB,KAAK,oBAAoB,IACzB,KAAK,cAAc,GACnB,KAAK,UAAU,UAAU;AAAA,MACvB,aAAa,KAAK;AAAA,MAClB,MAAM,KAAK,MAAM,KAAK,WAAA;AAAA,IACxB,CAAC,GACD,KAAK,oBAAoB,IACzB,KAAK,oBAAoB;AAAA,EAE7B;AAAA,EAsGA,SAAkB;AAChB,UAAM,IAAQ,KAAK,OAAO,UAAU,KAAK,WACnC,IAAe,CAAC,KAAK,iBAAiB,IAAQ,KAAK,MAAU,IAC7D,IAAiB,CAAC,KAAK,kBAAkB,IAAQ;AAEvD,WAAO;AAAA;AAAA;AAAA,YAGC,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAMC,CAAC,KAAK,QAAQ,KAAK,SAAA;AAAA,yBAChB,MAAA,KAAK,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAUjB,CAAC,KAAK,QAAQ,KAAK,OAAA;AAAA,yBAChB,MAAA,KAAK,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAK3B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMW,KAAK,aAAA;AAAA,sBACR,KAAK,YAAA;AAAA,2BACA,KAAK,iBAAA;AAAA,2BACL,KAAK,iBAAA;AAAA,yBACP,KAAK,eAAA;AAAA,6BACD,KAAK,mBAAA;AAAA;AAAA,gCAEF,KAAK,gBAAA;AAAA;AAAA;AAAA;AAAA,UAI3B,IAAiB;AAAA;AAAA,cAEb,MAAM,KAAK,EAAE,QAAQ,EAAM,CAAC,EAAE,IAAA,CAAK,GAAG,MAAU;AAAA;AAAA,uCAEvB,MAAU,KAAK,cAAc,WAAW,EAAA;AAAA;AAAA;AAAA,gCAG/C,MAAU,KAAK,cAAc,SAAS,OAAA;AAAA,0CAC5B,IAAQ,CAAA;AAAA,yBACnB,MAAA,KAAK,cAAc,CAAK,CAAA;AAAA;AAAA,aAE1C,CAAA;AAAA;AAAA,YAED,CAAA;AAAA;AAAA;AAAA,EAGV;AACF;AArfG,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,MAAA;AAGxC,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,SAAS;AAAA,EAAM,WAAW;AAAe,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,MAAA;AAGnE,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAA,EAAM,WAAW;AAAgB,CAAC,CAAA,GAAA,EAAA,WAAA,gBAAA,MAAA;AAGrE,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAA,EAAM,WAAW;AAAkB,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,MAAA;AAGvE,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,MAAA;AAGzC,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,MAAA;AAGzC,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,WAAW;AAAoB,CAAC,CAAA,GAAA,EAAA,WAAA,oBAAA,MAAA;AAGzD,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,WAAW;AAAe,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,MAAA;AAGpD,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,WAAW;AAAa,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,MAAA;AAGlD,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,WAAW;AAAc,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,MAAA;AAGnD,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,WAAW;AAAa,CAAC,CAAA,GAAA,EAAA,WAAA,iBAAA,MAAA;AAGlD,EAAA,CAAA,EAAsB;AAAA,EAAE,UAAU;AAAA,EAAoB,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,iBAAA,MAAA;AAUrE,EAAA,CAAA,EAAM,oBAAoB,CAAA,GAAA,EAAA,WAAA,mBAAA,MAAA;AAG1B,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,aAAA,MAAA;AAGN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,WAAA,MAAA;AAGN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,aAAA,MAAA;AAxDR,IAAA,EAAA,CAAA,EAAc,aAAa,CAAA,GAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-picker.css.d.ts","sourceRoot":"","sources":["../../../src/components/date-picker/date-picker.css.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,yBAuV5B,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { MdFormAssociatedElement } from '../../internal/form-associated.js';
|
|
2
|
+
export type DatePickerVariant = 'docked' | 'modal';
|
|
3
|
+
export type DatePickerViewMode = 'calendar' | 'year';
|
|
4
|
+
export declare class MdDatePicker extends MdFormAssociatedElement {
|
|
5
|
+
static styles: import('lit').CSSResultGroup[];
|
|
6
|
+
variant: DatePickerVariant;
|
|
7
|
+
range: boolean;
|
|
8
|
+
value: string;
|
|
9
|
+
startDate: string;
|
|
10
|
+
endDate: string;
|
|
11
|
+
min: string;
|
|
12
|
+
max: string;
|
|
13
|
+
label: string;
|
|
14
|
+
headline: string;
|
|
15
|
+
open: boolean;
|
|
16
|
+
error: boolean;
|
|
17
|
+
errorText: string;
|
|
18
|
+
supportingText: string;
|
|
19
|
+
firstDayOfWeek: number;
|
|
20
|
+
showActions: boolean;
|
|
21
|
+
private viewYear;
|
|
22
|
+
private viewMonth;
|
|
23
|
+
private viewMode;
|
|
24
|
+
private hoverDate;
|
|
25
|
+
private selectingEnd;
|
|
26
|
+
private dialogElement?;
|
|
27
|
+
connectedCallback(): void;
|
|
28
|
+
willUpdate(changedProperties: Map<string, unknown>): void;
|
|
29
|
+
updated(changedProperties: Map<string, unknown>): void;
|
|
30
|
+
private syncInitialState;
|
|
31
|
+
private handleValueChange;
|
|
32
|
+
formResetCallback(): void;
|
|
33
|
+
showModal(): void;
|
|
34
|
+
show(): void;
|
|
35
|
+
close(): void;
|
|
36
|
+
reset(): void;
|
|
37
|
+
private validateInput;
|
|
38
|
+
private handlePrevMonth;
|
|
39
|
+
private handleNextMonth;
|
|
40
|
+
private toggleViewMode;
|
|
41
|
+
private selectYear;
|
|
42
|
+
private isDateDisabled;
|
|
43
|
+
private handleDayClick;
|
|
44
|
+
private handleDayMouseEnter;
|
|
45
|
+
private handleDayMouseLeave;
|
|
46
|
+
private handleCancel;
|
|
47
|
+
private handleConfirm;
|
|
48
|
+
private getFormattedHeadline;
|
|
49
|
+
private renderCalendarGrid;
|
|
50
|
+
private renderYearPicker;
|
|
51
|
+
private renderPickerSurface;
|
|
52
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
53
|
+
}
|
|
54
|
+
declare global {
|
|
55
|
+
interface HTMLElementTagNameMap {
|
|
56
|
+
'md-date-picker': MdDatePicker;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=date-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../../src/components/date-picker/date-picker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,iCAAiC,CAAC;AACzC,OAAO,yCAAyC,CAAC;AACjD,OAAO,iBAAiB,CAAC;AACzB,OAAO,+BAA+B,CAAC;AACvC,OAAO,qBAAqB,CAAC;AAG7B,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,CAAC;AACnD,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,CAAC;AAuDrD,qBACa,YAAa,SAAQ,uBAAuB;IACvD,OAAgB,MAAM,iCAAsD;IAG5E,OAAO,EAAE,iBAAiB,CAAY;IAGtC,KAAK,UAAS;IAGd,KAAK,SAAM;IAGX,SAAS,SAAM;IAGf,OAAO,SAAM;IAGb,GAAG,SAAM;IAGT,GAAG,SAAM;IAGT,KAAK,SAAM;IAGX,QAAQ,SAAM;IAGd,IAAI,UAAS;IAGb,KAAK,UAAS;IAGd,SAAS,SAAM;IAGf,cAAc,SAAM;IAGpB,cAAc,SAAK;IAGnB,WAAW,UAAS;IAGpB,OAAO,CAAC,QAAQ,CAAoC;IAGpD,OAAO,CAAC,SAAS,CAAiC;IAGlD,OAAO,CAAC,QAAQ,CAAkC;IAGlD,OAAO,CAAC,SAAS,CAAuB;IAGxC,OAAO,CAAC,YAAY,CAAS;IAG7B,OAAO,CAAC,aAAa,CAAC,CAAoB;IAEjC,iBAAiB;IAMjB,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAwBlD,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAkBxD,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,iBAAiB;IAmBhB,iBAAiB;IAa1B,SAAS;IAIT,IAAI;IAIJ,KAAK;IAIL,KAAK;IAIL,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,eAAe,CAOrB;IAEF,OAAO,CAAC,eAAe,CAOrB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,UAAU,CAGhB;IAEF,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc,CA+CpB;IAEF,OAAO,CAAC,mBAAmB,CAIzB;IAEF,OAAO,CAAC,mBAAmB,CAEzB;IAEF,OAAO,CAAC,YAAY,CAIlB;IAEF,OAAO,CAAC,aAAa,CAOnB;IAEF,OAAO,CAAC,oBAAoB;IA6B5B,OAAO,CAAC,kBAAkB;IAgG1B,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,mBAAmB;IA8ElB,MAAM;CAkBhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,YAAY,CAAC;KAChC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { MdBaseElement } from '../../internal/base-component.js';
|
|
2
|
+
export type FabMenuItemSize = 'small' | 'medium';
|
|
3
|
+
export type FabMenuItemLabelPlacement = 'start' | 'end' | 'top' | 'bottom';
|
|
4
|
+
/**
|
|
5
|
+
* Material Design 3 FAB Menu Item component.
|
|
6
|
+
* Represents a single action item inside an `md-fab-menu` stack.
|
|
7
|
+
*
|
|
8
|
+
* @element md-fab-menu-item
|
|
9
|
+
*
|
|
10
|
+
* @slot - Default slot for item text label.
|
|
11
|
+
* @slot label - Explicit slot for custom label content.
|
|
12
|
+
* @slot icon - Custom icon replacement.
|
|
13
|
+
*
|
|
14
|
+
* @fires action - Dispatched when the item is clicked or activated.
|
|
15
|
+
*/
|
|
16
|
+
export declare class MdFabMenuItem extends MdBaseElement {
|
|
17
|
+
static styles: import('lit').CSSResultGroup[];
|
|
18
|
+
icon: string;
|
|
19
|
+
label: string;
|
|
20
|
+
labelPlacement: FabMenuItemLabelPlacement;
|
|
21
|
+
disabled: boolean;
|
|
22
|
+
value: string;
|
|
23
|
+
size: FabMenuItemSize;
|
|
24
|
+
lowered: boolean;
|
|
25
|
+
ariaLabelText: string;
|
|
26
|
+
private handleClick;
|
|
27
|
+
private handleKeyDown;
|
|
28
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
29
|
+
}
|
|
30
|
+
declare global {
|
|
31
|
+
interface HTMLElementTagNameMap {
|
|
32
|
+
'md-fab-menu-item': MdFabMenuItem;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=fab-menu-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fab-menu-item.d.ts","sourceRoot":"","sources":["../../../src/components/fab-menu/fab-menu-item.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,iCAAiC,CAAC;AACzC,OAAO,yCAAyC,CAAC;AACjD,OAAO,iBAAiB,CAAC;AAGzB,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,CAAC;AACjD,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE3E;;;;;;;;;;;GAWG;AACH,qBACa,aAAc,SAAQ,aAAa;IAC9C,OAAgB,MAAM,iCAA6C;IAGnE,IAAI,SAAM;IAGV,KAAK,SAAM;IAGX,cAAc,EAAE,yBAAyB,CAAW;IAGpD,QAAQ,UAAS;IAGjB,KAAK,SAAM;IAGX,IAAI,EAAE,eAAe,CAAW;IAGhC,OAAO,UAAS;IAGhB,aAAa,SAAM;IAEnB,OAAO,CAAC,WAAW,CAYjB;IAEF,OAAO,CAAC,aAAa,CAMnB;IAEO,MAAM;CAsChB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,aAAa,CAAC;KACnC;CACF"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { n as o, t as i } from "../../chunks/decorate-DXuynaiA.js";
|
|
2
|
+
import "../../chunks/ripple-squbKHhj.js";
|
|
3
|
+
import "../../chunks/focus-ring-CuiJuM-y.js";
|
|
4
|
+
import "../../chunks/icon-DrNqcNEL.js";
|
|
5
|
+
import { t as n } from "../../chunks/fab-menu.css-3pu930sZ.js";
|
|
6
|
+
import { html as l, nothing as r } from "lit";
|
|
7
|
+
import { customElement as d, property as a } from "lit/decorators.js";
|
|
8
|
+
var e = class extends o {
|
|
9
|
+
constructor(...s) {
|
|
10
|
+
super(...s), this.icon = "", this.label = "", this.labelPlacement = "start", this.disabled = !1, this.value = "", this.size = "small", this.lowered = !1, this.ariaLabelText = "", this.handleClick = (t) => {
|
|
11
|
+
if (this.disabled) {
|
|
12
|
+
t.preventDefault(), t.stopImmediatePropagation();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
this.emitEvent("action", {
|
|
16
|
+
item: this,
|
|
17
|
+
value: this.value,
|
|
18
|
+
label: this.label
|
|
19
|
+
});
|
|
20
|
+
}, this.handleKeyDown = (t) => {
|
|
21
|
+
this.disabled || (t.key === "Enter" || t.key === " ") && (t.preventDefault(), this.handleClick(t));
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
static {
|
|
25
|
+
this.styles = [o.styles, n];
|
|
26
|
+
}
|
|
27
|
+
render() {
|
|
28
|
+
const s = !!this.label, t = l`
|
|
29
|
+
<slot name="label">
|
|
30
|
+
${s ? l`<span class="label-pill">${this.label}</span>` : l`<slot class="label-pill"></slot>`}
|
|
31
|
+
</slot>
|
|
32
|
+
`;
|
|
33
|
+
return l`
|
|
34
|
+
<div
|
|
35
|
+
class="item-container"
|
|
36
|
+
role="menuitem"
|
|
37
|
+
tabindex=${this.disabled ? "-1" : "0"}
|
|
38
|
+
aria-disabled=${this.disabled ? "true" : "false"}
|
|
39
|
+
aria-label=${this.ariaLabelText || this.label || r}
|
|
40
|
+
@click=${this.handleClick}
|
|
41
|
+
@keydown=${this.handleKeyDown}
|
|
42
|
+
>
|
|
43
|
+
${t}
|
|
44
|
+
|
|
45
|
+
<button
|
|
46
|
+
type="button"
|
|
47
|
+
class="mini-fab"
|
|
48
|
+
tabindex="-1"
|
|
49
|
+
?disabled=${this.disabled}
|
|
50
|
+
aria-hidden="true"
|
|
51
|
+
>
|
|
52
|
+
<md-ripple ?disabled=${this.disabled}></md-ripple>
|
|
53
|
+
<md-focus-ring></md-focus-ring>
|
|
54
|
+
<span class="icon-wrapper">
|
|
55
|
+
<slot name="icon">
|
|
56
|
+
${this.icon ? l`<md-icon name=${this.icon}></md-icon>` : r}
|
|
57
|
+
</slot>
|
|
58
|
+
</span>
|
|
59
|
+
</button>
|
|
60
|
+
</div>
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
i([a({ type: String })], e.prototype, "icon", void 0);
|
|
65
|
+
i([a({ type: String })], e.prototype, "label", void 0);
|
|
66
|
+
i([a({
|
|
67
|
+
type: String,
|
|
68
|
+
attribute: "label-placement",
|
|
69
|
+
reflect: !0
|
|
70
|
+
})], e.prototype, "labelPlacement", void 0);
|
|
71
|
+
i([a({
|
|
72
|
+
type: Boolean,
|
|
73
|
+
reflect: !0
|
|
74
|
+
})], e.prototype, "disabled", void 0);
|
|
75
|
+
i([a({ type: String })], e.prototype, "value", void 0);
|
|
76
|
+
i([a({
|
|
77
|
+
type: String,
|
|
78
|
+
reflect: !0
|
|
79
|
+
})], e.prototype, "size", void 0);
|
|
80
|
+
i([a({
|
|
81
|
+
type: Boolean,
|
|
82
|
+
reflect: !0
|
|
83
|
+
})], e.prototype, "lowered", void 0);
|
|
84
|
+
i([a({
|
|
85
|
+
type: String,
|
|
86
|
+
attribute: "aria-label"
|
|
87
|
+
})], e.prototype, "ariaLabelText", void 0);
|
|
88
|
+
e = i([d("md-fab-menu-item")], e);
|
|
89
|
+
export {
|
|
90
|
+
e as MdFabMenuItem
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=fab-menu-item.js.map
|