@sankhyatronics/sankhya-cms 0.1.1 → 0.1.3

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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/custom-elements.json +1843 -952
  3. package/dist/carousel/index.d.ts +38 -2
  4. package/dist/carousel/index.js +1 -1
  5. package/dist/chunk-47RPYNFG.js +527 -0
  6. package/dist/chunk-47RPYNFG.js.map +1 -0
  7. package/dist/chunk-5DNVCMOO.js +509 -0
  8. package/dist/chunk-5DNVCMOO.js.map +1 -0
  9. package/dist/{chunk-RMIJVTFS.js → chunk-FWIG6GEZ.js} +8 -4
  10. package/dist/chunk-FWIG6GEZ.js.map +1 -0
  11. package/dist/{chunk-U7YKCCJG.js → chunk-K4ZICRZL.js} +134 -14
  12. package/dist/chunk-K4ZICRZL.js.map +1 -0
  13. package/dist/chunk-N63TVWK3.js +203 -0
  14. package/dist/chunk-N63TVWK3.js.map +1 -0
  15. package/dist/{chunk-23IHTBAB.js → chunk-PKTRYUGP.js} +108 -2
  16. package/dist/chunk-PKTRYUGP.js.map +1 -0
  17. package/dist/{chunk-LHU23TF6.js → chunk-TH5NZXA7.js} +5 -4
  18. package/dist/chunk-TH5NZXA7.js.map +1 -0
  19. package/dist/dropdown/index.js +1 -1
  20. package/dist/header/index.d.ts +18 -0
  21. package/dist/header/index.js +1 -1
  22. package/dist/hero/index.d.ts +29 -4
  23. package/dist/hero/index.js +1 -1
  24. package/dist/index.d.ts +2 -1
  25. package/dist/index.js +23 -19
  26. package/dist/menu-item/index.js +1 -1
  27. package/dist/schema/index.d.ts +1 -0
  28. package/dist/schema/index.js +1 -0
  29. package/dist/schema/index.js.map +1 -1
  30. package/dist/section/index.d.ts +33 -0
  31. package/dist/section/index.js +10 -0
  32. package/dist/section/index.js.map +1 -0
  33. package/dist/testimonials/index.d.ts +62 -6
  34. package/dist/testimonials/index.js +2 -1
  35. package/package.json +25 -21
  36. package/dist/chunk-23IHTBAB.js.map +0 -1
  37. package/dist/chunk-LHU23TF6.js.map +0 -1
  38. package/dist/chunk-RMIJVTFS.js.map +0 -1
  39. package/dist/chunk-U7YKCCJG.js.map +0 -1
  40. package/dist/chunk-WCO7JAIK.js +0 -195
  41. package/dist/chunk-WCO7JAIK.js.map +0 -1
  42. package/dist/chunk-XHBC23TV.js +0 -254
  43. package/dist/chunk-XHBC23TV.js.map +0 -1
@@ -4,8 +4,21 @@ import { LitElement } from 'lit';
4
4
  /**
5
5
  * Cycles through its slotted children, one visible at a time, with optional autoplay, arrows and
6
6
  * dot indicators. The incoming slide slides in from the travel direction (CSS keyframes in place
7
- * of the source's framer-motion spring). Autoplay pauses while hovered or focused and stops when
8
- * the element is disconnected.
7
+ * of the source's framer-motion spring), or fades in with `transition="fade"`. Autoplay pauses
8
+ * while hovered or focused and stops when the element is disconnected; a paused slide keeps the
9
+ * time it had left.
10
+ *
11
+ * `indicator-style="tabs"` replaces the dots with a row of labelled tabs along the bottom, each
12
+ * with a progress bar that fills while its slide is showing, plus a pause button — the tabbed hero
13
+ * carousel layout (put `st-hero`s in it). Tab labels come from `tab-labels`, else each slide's
14
+ * `data-tab-label` attribute, else its `title`.
15
+ *
16
+ * @fires carousel-change - Detail `{ index }`, when the visible slide changes.
17
+ * @cssprop --st-carousel-tab-color - Tab text and progress colour (default: light, for slides with a dark image).
18
+ * @cssprop --st-carousel-tabs-space - Room kept free under each slide's content for the tabs (default `6rem`).
19
+ * @csspart tabs - The tab row.
20
+ * @csspart tab - One tab button.
21
+ * @csspart progress - A tab's progress bar.
9
22
  */
10
23
  declare class Carousel extends LitElement {
11
24
  static styles: lit.CSSResult;
@@ -14,21 +27,44 @@ declare class Carousel extends LitElement {
14
27
  interval: number;
15
28
  showArrows: boolean;
16
29
  showIndicators: boolean;
30
+ /** `dots` (default) or `tabs`: labelled tabs with progress bars along the bottom. */
31
+ indicatorStyle: 'dots' | 'tabs';
32
+ /** `slide` (default) or `fade`. */
33
+ transition: 'slide' | 'fade';
34
+ /** Tab labels, one per slide, for `indicator-style="tabs"`. Missing entries fall back to the slide's `data-tab-label`, then its `title`. */
35
+ tabLabels: string[];
17
36
  private index;
18
37
  private count;
38
+ private slideLabels;
39
+ /** Paused with the pause button; stays paused until the button is pressed again. */
40
+ private userPaused;
41
+ /** Paused while hovered or focused. */
19
42
  private paused;
20
43
  private timer?;
44
+ /** Time left on the current slide, so a pause resumes where it stopped. */
45
+ private remaining;
46
+ private startedAt;
21
47
  connectedCallback(): void;
22
48
  disconnectedCallback(): void;
49
+ protected willUpdate(changed: Map<string, unknown>): void;
23
50
  protected updated(changed: Map<string, unknown>): void;
51
+ private get halted();
52
+ /** Applies a pause-state change, freezing or resuming the timer (and the tab progress bar). */
53
+ private hold;
24
54
  private pause;
25
55
  private resume;
56
+ private togglePlay;
26
57
  private get slides();
58
+ private labelFor;
27
59
  private syncSlides;
28
60
  private onSlotChange;
29
61
  private stopTimer;
62
+ private startTimer;
30
63
  private restartTimer;
31
64
  private go;
65
+ private onTabKeydown;
66
+ private renderTabs;
67
+ private renderDots;
32
68
  render(): lit.TemplateResult<1>;
33
69
  }
34
70
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Carousel
3
- } from "../chunk-XHBC23TV.js";
3
+ } from "../chunk-47RPYNFG.js";
4
4
  import "../chunk-3VE6VFJ4.js";
5
5
  import "../chunk-RHAOQ6K4.js";
6
6
  import "../chunk-EUXUH3YW.js";
@@ -0,0 +1,527 @@
1
+ import {
2
+ reducedMotionStyles
3
+ } from "./chunk-3VE6VFJ4.js";
4
+ import {
5
+ buttonResetStyles,
6
+ controlBaseStyles
7
+ } from "./chunk-RHAOQ6K4.js";
8
+ import {
9
+ __decorateClass
10
+ } from "./chunk-EUXUH3YW.js";
11
+
12
+ // src/carousel/Carousel.ts
13
+ import { LitElement, css, html, nothing } from "lit";
14
+ import { customElement, property, state } from "lit/decorators.js";
15
+ var Carousel = class extends LitElement {
16
+ constructor() {
17
+ super(...arguments);
18
+ this.autoPlay = true;
19
+ this.interval = 5e3;
20
+ this.showArrows = true;
21
+ this.showIndicators = true;
22
+ this.indicatorStyle = "dots";
23
+ this.transition = "slide";
24
+ this.tabLabels = [];
25
+ this.index = 0;
26
+ this.count = 0;
27
+ this.slideLabels = [];
28
+ this.userPaused = false;
29
+ /** Paused while hovered or focused. */
30
+ this.paused = false;
31
+ /** Time left on the current slide, so a pause resumes where it stopped. */
32
+ this.remaining = 0;
33
+ this.startedAt = 0;
34
+ this.pause = () => this.hold(() => this.paused = true);
35
+ this.resume = () => this.hold(() => this.paused = false);
36
+ this.togglePlay = () => this.hold(() => this.userPaused = !this.userPaused);
37
+ }
38
+ connectedCallback() {
39
+ super.connectedCallback();
40
+ this.addEventListener("mouseenter", this.pause);
41
+ this.addEventListener("mouseleave", this.resume);
42
+ this.addEventListener("focusin", this.pause);
43
+ this.addEventListener("focusout", this.resume);
44
+ }
45
+ disconnectedCallback() {
46
+ this.stopTimer();
47
+ this.removeEventListener("mouseenter", this.pause);
48
+ this.removeEventListener("mouseleave", this.resume);
49
+ this.removeEventListener("focusin", this.pause);
50
+ this.removeEventListener("focusout", this.resume);
51
+ super.disconnectedCallback();
52
+ }
53
+ willUpdate(changed) {
54
+ if (changed.has("interval")) this.style.setProperty("--st-carousel-interval", `${this.interval}ms`);
55
+ }
56
+ updated(changed) {
57
+ if (changed.has("index") || changed.has("count") || changed.has("indicatorStyle") || changed.has("tabLabels")) this.syncSlides();
58
+ if (changed.has("autoPlay") || changed.has("interval") || changed.has("count")) this.restartTimer();
59
+ }
60
+ get halted() {
61
+ return this.paused || this.userPaused;
62
+ }
63
+ /** Applies a pause-state change, freezing or resuming the timer (and the tab progress bar). */
64
+ hold(update) {
65
+ const was = this.halted;
66
+ update();
67
+ const now = this.halted;
68
+ if (was === now) return;
69
+ this.toggleAttribute("data-paused", now);
70
+ if (now) {
71
+ if (this.timer !== void 0) this.remaining -= performance.now() - this.startedAt;
72
+ this.stopTimer();
73
+ } else {
74
+ this.startTimer();
75
+ }
76
+ }
77
+ get slides() {
78
+ return this.shadowRoot?.querySelector("slot")?.assignedElements({ flatten: true }) ?? [];
79
+ }
80
+ labelFor(i) {
81
+ return this.tabLabels[i] || this.slideLabels[i] || `Slide ${i + 1}`;
82
+ }
83
+ syncSlides() {
84
+ const tabs = this.indicatorStyle === "tabs";
85
+ this.slides.forEach((el, i) => {
86
+ el.toggleAttribute("data-st-active", i === this.index);
87
+ if (tabs) {
88
+ el.setAttribute("role", "tabpanel");
89
+ el.setAttribute("aria-label", this.labelFor(i));
90
+ } else if (el.getAttribute("role") === "tabpanel") {
91
+ el.removeAttribute("role");
92
+ el.removeAttribute("aria-label");
93
+ }
94
+ });
95
+ }
96
+ onSlotChange() {
97
+ const slides = this.slides;
98
+ this.count = slides.length;
99
+ this.slideLabels = slides.map((el) => el.dataset.tabLabel || el.title || "");
100
+ if (this.index >= this.count) this.index = 0;
101
+ this.syncSlides();
102
+ }
103
+ stopTimer() {
104
+ if (this.timer !== void 0) clearTimeout(this.timer);
105
+ this.timer = void 0;
106
+ }
107
+ startTimer() {
108
+ this.stopTimer();
109
+ if (!this.autoPlay || this.count < 2 || this.halted) return;
110
+ this.startedAt = performance.now();
111
+ this.timer = setTimeout(() => this.go(this.index + 1, "next"), Math.max(0, this.remaining));
112
+ }
113
+ restartTimer() {
114
+ this.remaining = this.interval;
115
+ this.startTimer();
116
+ }
117
+ go(target, direction) {
118
+ if (this.count === 0) return;
119
+ this.setAttribute("data-direction", direction);
120
+ this.index = (target + this.count) % this.count;
121
+ this.dispatchEvent(
122
+ new CustomEvent("carousel-change", {
123
+ detail: { index: this.index },
124
+ bubbles: true,
125
+ composed: true
126
+ })
127
+ );
128
+ this.restartTimer();
129
+ }
130
+ onTabKeydown(event) {
131
+ const step = { ArrowRight: 1, ArrowLeft: -1 }[event.key];
132
+ let target;
133
+ if (step !== void 0) target = this.index + step;
134
+ else if (event.key === "Home") target = 0;
135
+ else if (event.key === "End") target = this.count - 1;
136
+ if (target === void 0) return;
137
+ event.preventDefault();
138
+ this.go(target, step === -1 || target < this.index ? "prev" : "next");
139
+ void this.updateComplete.then(() => this.renderRoot.querySelector(".tab.active")?.focus());
140
+ }
141
+ renderTabs() {
142
+ const running = this.autoPlay && this.count > 1;
143
+ return html`<div class="tabs" part="tabs">
144
+ <div class="tabs-inner">
145
+ <p class="tab-current" aria-hidden="true">${this.labelFor(this.index)}</p>
146
+ <div class="tablist" role="tablist" aria-label="Slides" @keydown=${this.onTabKeydown}>
147
+ ${Array.from({ length: this.count }, (_, i) => {
148
+ const active = i === this.index;
149
+ return html`
150
+ <button
151
+ part="tab"
152
+ type="button"
153
+ role="tab"
154
+ class="tab ${active ? "active" : ""} ${running ? "running" : ""}"
155
+ aria-selected=${active ? "true" : "false"}
156
+ tabindex=${active ? 0 : -1}
157
+ @click=${() => active || this.go(i, i > this.index ? "next" : "prev")}
158
+ >
159
+ <span class="progress" part="progress"><span class="fill"></span></span>
160
+ <span class="tab-label">${this.labelFor(i)}</span>
161
+ </button>
162
+ `;
163
+ })}
164
+ </div>
165
+ ${running ? html`<button
166
+ part="play-button"
167
+ type="button"
168
+ class="play"
169
+ aria-label=${this.userPaused ? "Play slides" : "Pause slides"}
170
+ @click=${this.togglePlay}
171
+ >
172
+ ${this.userPaused ? html`<svg width="12" height="12" viewBox="0 0 12 12" aria-hidden="true"><path d="M3 1.5v9l7.5-4.5z" fill="currentColor" /></svg>` : html`<svg width="12" height="12" viewBox="0 0 12 12" aria-hidden="true"><path d="M2.5 1.5h2.5v9H2.5zM7 1.5h2.5v9H7z" fill="currentColor" /></svg>`}
173
+ </button>` : nothing}
174
+ </div>
175
+ </div>`;
176
+ }
177
+ renderDots() {
178
+ return html`<div class="indicators" part="indicators">
179
+ ${Array.from(
180
+ { length: this.count },
181
+ (_, i) => html`
182
+ <button
183
+ part="dot"
184
+ class="dot ${i === this.index ? "active" : ""}"
185
+ aria-label="Go to slide ${i + 1}"
186
+ aria-current=${i === this.index ? "true" : "false"}
187
+ @click=${() => this.go(i, i > this.index ? "next" : "prev")}
188
+ ></button>
189
+ `
190
+ )}
191
+ </div>`;
192
+ }
193
+ render() {
194
+ const multiple = this.count > 1;
195
+ return html`
196
+ <slot @slotchange=${this.onSlotChange}></slot>
197
+ ${this.showArrows && multiple ? html`
198
+ <button part="nav-button prev" class="nav prev" aria-label="Previous Slide" @click=${() => this.go(this.index - 1, "prev")}>&#10094;</button>
199
+ <button part="nav-button next" class="nav next" aria-label="Next Slide" @click=${() => this.go(this.index + 1, "next")}>&#10095;</button>
200
+ ` : nothing}
201
+ ${this.showIndicators && multiple ? this.indicatorStyle === "tabs" ? this.renderTabs() : this.renderDots() : nothing}
202
+ `;
203
+ }
204
+ };
205
+ Carousel.styles = css`
206
+ ${controlBaseStyles}
207
+
208
+ :host {
209
+ display: block;
210
+ position: relative;
211
+ width: 100%;
212
+ overflow: hidden;
213
+ }
214
+
215
+ ::slotted(*) {
216
+ display: none !important;
217
+ }
218
+
219
+ ::slotted([data-st-active]) {
220
+ display: block !important;
221
+ animation: st-carousel-in-next 0.4s ease both;
222
+ }
223
+
224
+ :host([data-direction='prev']) ::slotted([data-st-active]) {
225
+ animation-name: st-carousel-in-prev;
226
+ }
227
+
228
+ :host([transition='fade']) ::slotted([data-st-active]),
229
+ :host([transition='fade'][data-direction]) ::slotted([data-st-active]) {
230
+ animation: st-carousel-fade 0.7s ease both;
231
+ }
232
+
233
+ @keyframes st-carousel-in-next {
234
+ from {
235
+ transform: translateX(10%);
236
+ opacity: 0;
237
+ }
238
+ to {
239
+ transform: none;
240
+ opacity: 1;
241
+ }
242
+ }
243
+
244
+ @keyframes st-carousel-in-prev {
245
+ from {
246
+ transform: translateX(-10%);
247
+ opacity: 0;
248
+ }
249
+ to {
250
+ transform: none;
251
+ opacity: 1;
252
+ }
253
+ }
254
+
255
+ @keyframes st-carousel-fade {
256
+ from {
257
+ opacity: 0;
258
+ }
259
+ to {
260
+ opacity: 1;
261
+ }
262
+ }
263
+
264
+ .nav {
265
+ ${buttonResetStyles}
266
+ position: absolute;
267
+ top: 50%;
268
+ transform: translateY(-50%);
269
+ z-index: 10;
270
+ display: flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ width: var(--st-size-38);
274
+ height: var(--st-size-38);
275
+ border-radius: var(--st-radius-circle);
276
+ border: 1px solid var(--st-color-border);
277
+ background: var(--st-color-surface);
278
+ color: var(--st-color-text-strong);
279
+ font-size: var(--st-text-xl);
280
+ opacity: 0.8;
281
+ transition:
282
+ opacity 0.3s ease,
283
+ transform 0.3s ease;
284
+ }
285
+
286
+ .nav:hover {
287
+ opacity: 1;
288
+ transform: translateY(-50%) scale(1.1);
289
+ }
290
+
291
+ .prev {
292
+ left: var(--st-space-12);
293
+ }
294
+
295
+ .next {
296
+ right: var(--st-space-12);
297
+ }
298
+
299
+ .indicators {
300
+ position: absolute;
301
+ bottom: var(--st-space-24);
302
+ left: 50%;
303
+ transform: translateX(-50%);
304
+ z-index: 10;
305
+ display: flex;
306
+ gap: var(--st-space-12);
307
+ }
308
+
309
+ .dot {
310
+ ${buttonResetStyles}
311
+ width: var(--st-space-12);
312
+ height: var(--st-space-12);
313
+ padding: 0;
314
+ border-radius: var(--st-radius-circle);
315
+ background: var(--st-color-border-strong);
316
+ transition:
317
+ background 0.3s ease,
318
+ transform 0.3s ease;
319
+ }
320
+
321
+ .dot:hover {
322
+ background: var(--st-color-text-muted);
323
+ }
324
+
325
+ .dot.active {
326
+ background: var(--st-color-text-strong);
327
+ transform: scale(1.2);
328
+ }
329
+
330
+ /* ---- indicator-style="tabs" ---- */
331
+
332
+ :host([indicator-style='tabs']) ::slotted(*) {
333
+ padding-bottom: var(--st-carousel-tabs-space, 6rem);
334
+ }
335
+
336
+ .tabs {
337
+ position: absolute;
338
+ left: 0;
339
+ right: 0;
340
+ bottom: 0;
341
+ z-index: 10;
342
+ color: var(--st-carousel-tab-color, var(--st-color-on-solid));
343
+ }
344
+
345
+ .tabs-inner {
346
+ display: flex;
347
+ align-items: flex-start;
348
+ gap: var(--st-space-24);
349
+ max-width: var(--st-cms-container-max);
350
+ margin: 0 auto;
351
+ box-sizing: border-box;
352
+ padding: 0 var(--st-space-24) var(--st-space-24);
353
+ }
354
+
355
+ .tablist {
356
+ flex: 1;
357
+ display: grid;
358
+ grid-auto-flow: column;
359
+ grid-auto-columns: minmax(0, 1fr);
360
+ gap: var(--st-space-24);
361
+ }
362
+
363
+ .tab {
364
+ ${buttonResetStyles}
365
+ display: flex;
366
+ flex-direction: column;
367
+ gap: var(--st-space-12);
368
+ padding: var(--st-space-12) 0;
369
+ color: inherit;
370
+ text-align: left;
371
+ font-size: var(--st-text-base);
372
+ font-weight: var(--st-font-weight-semibold);
373
+ line-height: 1.3;
374
+ opacity: 0.7;
375
+ transition: opacity 0.2s ease;
376
+ }
377
+
378
+ .tab:hover,
379
+ .tab.active {
380
+ opacity: 1;
381
+ }
382
+
383
+ .tab:focus-visible,
384
+ .play:focus-visible {
385
+ outline: 2px solid currentColor;
386
+ outline-offset: 4px;
387
+ }
388
+
389
+ .progress {
390
+ position: relative;
391
+ display: block;
392
+ height: 3px;
393
+ border-radius: 2px;
394
+ overflow: hidden;
395
+ background: color-mix(in oklch, currentColor 30%, transparent);
396
+ }
397
+
398
+ .fill {
399
+ position: absolute;
400
+ inset: 0;
401
+ background: currentColor;
402
+ transform: scaleX(0);
403
+ transform-origin: left center;
404
+ }
405
+
406
+ .tab.active .fill {
407
+ transform: scaleX(1);
408
+ }
409
+
410
+ .tab.active.running .fill {
411
+ animation: st-carousel-progress var(--st-carousel-interval, 5000ms) linear both;
412
+ }
413
+
414
+ :host([data-paused]) .tab.active.running .fill {
415
+ animation-play-state: paused;
416
+ }
417
+
418
+ @keyframes st-carousel-progress {
419
+ from {
420
+ transform: scaleX(0);
421
+ }
422
+ to {
423
+ transform: scaleX(1);
424
+ }
425
+ }
426
+
427
+ .play {
428
+ ${buttonResetStyles}
429
+ flex: none;
430
+ display: inline-flex;
431
+ align-items: center;
432
+ justify-content: center;
433
+ width: var(--st-size-32);
434
+ height: var(--st-size-32);
435
+ margin-top: var(--st-space-4);
436
+ border-radius: var(--st-radius-circle);
437
+ color: inherit;
438
+ box-shadow: inset 0 0 0 1.5px color-mix(in oklch, currentColor 60%, transparent);
439
+ }
440
+
441
+ .play:hover {
442
+ background: color-mix(in oklch, currentColor 15%, transparent);
443
+ }
444
+
445
+ .tab-current {
446
+ display: none;
447
+ }
448
+
449
+ @media (max-width: 768px) {
450
+ .tablist {
451
+ gap: var(--st-space-8);
452
+ }
453
+
454
+ .tab-label {
455
+ display: none;
456
+ }
457
+
458
+ .tab-current {
459
+ display: block;
460
+ margin: 0 0 var(--st-space-4);
461
+ font-size: var(--st-text-base);
462
+ font-weight: var(--st-font-weight-semibold);
463
+ }
464
+
465
+ .tabs-inner {
466
+ flex-wrap: wrap;
467
+ align-items: center;
468
+ }
469
+ }
470
+
471
+ @media (min-width: 1024px) {
472
+ .tabs-inner {
473
+ padding: 0 var(--st-space-32) var(--st-space-32);
474
+ }
475
+ }
476
+
477
+ ${reducedMotionStyles}
478
+ @media (prefers-reduced-motion: reduce) {
479
+ ::slotted([data-st-active]) {
480
+ animation: none;
481
+ }
482
+ .tab.active.running .fill {
483
+ animation: none;
484
+ }
485
+ }
486
+ `;
487
+ __decorateClass([
488
+ property({ type: Boolean, attribute: "auto-play" })
489
+ ], Carousel.prototype, "autoPlay", 2);
490
+ __decorateClass([
491
+ property({ type: Number })
492
+ ], Carousel.prototype, "interval", 2);
493
+ __decorateClass([
494
+ property({ type: Boolean, attribute: "show-arrows" })
495
+ ], Carousel.prototype, "showArrows", 2);
496
+ __decorateClass([
497
+ property({ type: Boolean, attribute: "show-indicators" })
498
+ ], Carousel.prototype, "showIndicators", 2);
499
+ __decorateClass([
500
+ property({ type: String, reflect: true, attribute: "indicator-style" })
501
+ ], Carousel.prototype, "indicatorStyle", 2);
502
+ __decorateClass([
503
+ property({ type: String, reflect: true })
504
+ ], Carousel.prototype, "transition", 2);
505
+ __decorateClass([
506
+ property({ attribute: false })
507
+ ], Carousel.prototype, "tabLabels", 2);
508
+ __decorateClass([
509
+ state()
510
+ ], Carousel.prototype, "index", 2);
511
+ __decorateClass([
512
+ state()
513
+ ], Carousel.prototype, "count", 2);
514
+ __decorateClass([
515
+ state()
516
+ ], Carousel.prototype, "slideLabels", 2);
517
+ __decorateClass([
518
+ state()
519
+ ], Carousel.prototype, "userPaused", 2);
520
+ Carousel = __decorateClass([
521
+ customElement("st-carousel")
522
+ ], Carousel);
523
+
524
+ export {
525
+ Carousel
526
+ };
527
+ //# sourceMappingURL=chunk-47RPYNFG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/carousel/Carousel.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { buttonResetStyles, controlBaseStyles } from '../shared/styles';\nimport { reducedMotionStyles } from '../shared/section-styles';\nimport type { CarouselChangeEventDetail } from './CarouselEvents';\n\n/**\n * Cycles through its slotted children, one visible at a time, with optional autoplay, arrows and\n * dot indicators. The incoming slide slides in from the travel direction (CSS keyframes in place\n * of the source's framer-motion spring), or fades in with `transition=\"fade\"`. Autoplay pauses\n * while hovered or focused and stops when the element is disconnected; a paused slide keeps the\n * time it had left.\n *\n * `indicator-style=\"tabs\"` replaces the dots with a row of labelled tabs along the bottom, each\n * with a progress bar that fills while its slide is showing, plus a pause button — the tabbed hero\n * carousel layout (put `st-hero`s in it). Tab labels come from `tab-labels`, else each slide's\n * `data-tab-label` attribute, else its `title`.\n *\n * @fires carousel-change - Detail `{ index }`, when the visible slide changes.\n * @cssprop --st-carousel-tab-color - Tab text and progress colour (default: light, for slides with a dark image).\n * @cssprop --st-carousel-tabs-space - Room kept free under each slide's content for the tabs (default `6rem`).\n * @csspart tabs - The tab row.\n * @csspart tab - One tab button.\n * @csspart progress - A tab's progress bar.\n */\n@customElement('st-carousel')\nexport class Carousel extends LitElement {\n static styles = css`\n ${controlBaseStyles}\n\n :host {\n display: block;\n position: relative;\n width: 100%;\n overflow: hidden;\n }\n\n ::slotted(*) {\n display: none !important;\n }\n\n ::slotted([data-st-active]) {\n display: block !important;\n animation: st-carousel-in-next 0.4s ease both;\n }\n\n :host([data-direction='prev']) ::slotted([data-st-active]) {\n animation-name: st-carousel-in-prev;\n }\n\n :host([transition='fade']) ::slotted([data-st-active]),\n :host([transition='fade'][data-direction]) ::slotted([data-st-active]) {\n animation: st-carousel-fade 0.7s ease both;\n }\n\n @keyframes st-carousel-in-next {\n from {\n transform: translateX(10%);\n opacity: 0;\n }\n to {\n transform: none;\n opacity: 1;\n }\n }\n\n @keyframes st-carousel-in-prev {\n from {\n transform: translateX(-10%);\n opacity: 0;\n }\n to {\n transform: none;\n opacity: 1;\n }\n }\n\n @keyframes st-carousel-fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n .nav {\n ${buttonResetStyles}\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--st-size-38);\n height: var(--st-size-38);\n border-radius: var(--st-radius-circle);\n border: 1px solid var(--st-color-border);\n background: var(--st-color-surface);\n color: var(--st-color-text-strong);\n font-size: var(--st-text-xl);\n opacity: 0.8;\n transition:\n opacity 0.3s ease,\n transform 0.3s ease;\n }\n\n .nav:hover {\n opacity: 1;\n transform: translateY(-50%) scale(1.1);\n }\n\n .prev {\n left: var(--st-space-12);\n }\n\n .next {\n right: var(--st-space-12);\n }\n\n .indicators {\n position: absolute;\n bottom: var(--st-space-24);\n left: 50%;\n transform: translateX(-50%);\n z-index: 10;\n display: flex;\n gap: var(--st-space-12);\n }\n\n .dot {\n ${buttonResetStyles}\n width: var(--st-space-12);\n height: var(--st-space-12);\n padding: 0;\n border-radius: var(--st-radius-circle);\n background: var(--st-color-border-strong);\n transition:\n background 0.3s ease,\n transform 0.3s ease;\n }\n\n .dot:hover {\n background: var(--st-color-text-muted);\n }\n\n .dot.active {\n background: var(--st-color-text-strong);\n transform: scale(1.2);\n }\n\n /* ---- indicator-style=\"tabs\" ---- */\n\n :host([indicator-style='tabs']) ::slotted(*) {\n padding-bottom: var(--st-carousel-tabs-space, 6rem);\n }\n\n .tabs {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10;\n color: var(--st-carousel-tab-color, var(--st-color-on-solid));\n }\n\n .tabs-inner {\n display: flex;\n align-items: flex-start;\n gap: var(--st-space-24);\n max-width: var(--st-cms-container-max);\n margin: 0 auto;\n box-sizing: border-box;\n padding: 0 var(--st-space-24) var(--st-space-24);\n }\n\n .tablist {\n flex: 1;\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: minmax(0, 1fr);\n gap: var(--st-space-24);\n }\n\n .tab {\n ${buttonResetStyles}\n display: flex;\n flex-direction: column;\n gap: var(--st-space-12);\n padding: var(--st-space-12) 0;\n color: inherit;\n text-align: left;\n font-size: var(--st-text-base);\n font-weight: var(--st-font-weight-semibold);\n line-height: 1.3;\n opacity: 0.7;\n transition: opacity 0.2s ease;\n }\n\n .tab:hover,\n .tab.active {\n opacity: 1;\n }\n\n .tab:focus-visible,\n .play:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 4px;\n }\n\n .progress {\n position: relative;\n display: block;\n height: 3px;\n border-radius: 2px;\n overflow: hidden;\n background: color-mix(in oklch, currentColor 30%, transparent);\n }\n\n .fill {\n position: absolute;\n inset: 0;\n background: currentColor;\n transform: scaleX(0);\n transform-origin: left center;\n }\n\n .tab.active .fill {\n transform: scaleX(1);\n }\n\n .tab.active.running .fill {\n animation: st-carousel-progress var(--st-carousel-interval, 5000ms) linear both;\n }\n\n :host([data-paused]) .tab.active.running .fill {\n animation-play-state: paused;\n }\n\n @keyframes st-carousel-progress {\n from {\n transform: scaleX(0);\n }\n to {\n transform: scaleX(1);\n }\n }\n\n .play {\n ${buttonResetStyles}\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--st-size-32);\n height: var(--st-size-32);\n margin-top: var(--st-space-4);\n border-radius: var(--st-radius-circle);\n color: inherit;\n box-shadow: inset 0 0 0 1.5px color-mix(in oklch, currentColor 60%, transparent);\n }\n\n .play:hover {\n background: color-mix(in oklch, currentColor 15%, transparent);\n }\n\n .tab-current {\n display: none;\n }\n\n @media (max-width: 768px) {\n .tablist {\n gap: var(--st-space-8);\n }\n\n .tab-label {\n display: none;\n }\n\n .tab-current {\n display: block;\n margin: 0 0 var(--st-space-4);\n font-size: var(--st-text-base);\n font-weight: var(--st-font-weight-semibold);\n }\n\n .tabs-inner {\n flex-wrap: wrap;\n align-items: center;\n }\n }\n\n @media (min-width: 1024px) {\n .tabs-inner {\n padding: 0 var(--st-space-32) var(--st-space-32);\n }\n }\n\n ${reducedMotionStyles}\n @media (prefers-reduced-motion: reduce) {\n ::slotted([data-st-active]) {\n animation: none;\n }\n .tab.active.running .fill {\n animation: none;\n }\n }\n `;\n\n @property({ type: Boolean, attribute: 'auto-play' })\n autoPlay = true;\n\n /** Autoplay delay in milliseconds. */\n @property({ type: Number })\n interval = 5000;\n\n @property({ type: Boolean, attribute: 'show-arrows' })\n showArrows = true;\n\n @property({ type: Boolean, attribute: 'show-indicators' })\n showIndicators = true;\n\n /** `dots` (default) or `tabs`: labelled tabs with progress bars along the bottom. */\n @property({ type: String, reflect: true, attribute: 'indicator-style' })\n indicatorStyle: 'dots' | 'tabs' = 'dots';\n\n /** `slide` (default) or `fade`. */\n @property({ type: String, reflect: true })\n transition: 'slide' | 'fade' = 'slide';\n\n /** Tab labels, one per slide, for `indicator-style=\"tabs\"`. Missing entries fall back to the slide's `data-tab-label`, then its `title`. */\n @property({ attribute: false })\n tabLabels: string[] = [];\n\n @state() private index = 0;\n @state() private count = 0;\n @state() private slideLabels: string[] = [];\n /** Paused with the pause button; stays paused until the button is pressed again. */\n @state() private userPaused = false;\n /** Paused while hovered or focused. */\n private paused = false;\n private timer?: ReturnType<typeof setTimeout>;\n /** Time left on the current slide, so a pause resumes where it stopped. */\n private remaining = 0;\n private startedAt = 0;\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('mouseenter', this.pause);\n this.addEventListener('mouseleave', this.resume);\n this.addEventListener('focusin', this.pause);\n this.addEventListener('focusout', this.resume);\n }\n\n disconnectedCallback() {\n this.stopTimer();\n this.removeEventListener('mouseenter', this.pause);\n this.removeEventListener('mouseleave', this.resume);\n this.removeEventListener('focusin', this.pause);\n this.removeEventListener('focusout', this.resume);\n super.disconnectedCallback();\n }\n\n protected willUpdate(changed: Map<string, unknown>) {\n if (changed.has('interval')) this.style.setProperty('--st-carousel-interval', `${this.interval}ms`);\n }\n\n protected updated(changed: Map<string, unknown>) {\n if (changed.has('index') || changed.has('count') || changed.has('indicatorStyle') || changed.has('tabLabels')) this.syncSlides();\n if (changed.has('autoPlay') || changed.has('interval') || changed.has('count')) this.restartTimer();\n }\n\n private get halted(): boolean {\n return this.paused || this.userPaused;\n }\n\n /** Applies a pause-state change, freezing or resuming the timer (and the tab progress bar). */\n private hold(update: () => void) {\n const was = this.halted;\n update();\n const now = this.halted;\n if (was === now) return;\n this.toggleAttribute('data-paused', now);\n if (now) {\n if (this.timer !== undefined) this.remaining -= performance.now() - this.startedAt;\n this.stopTimer();\n } else {\n this.startTimer();\n }\n }\n\n private pause = () => this.hold(() => (this.paused = true));\n\n private resume = () => this.hold(() => (this.paused = false));\n\n private togglePlay = () => this.hold(() => (this.userPaused = !this.userPaused));\n\n private get slides(): Element[] {\n return this.shadowRoot?.querySelector('slot')?.assignedElements({ flatten: true }) ?? [];\n }\n\n private labelFor(i: number): string {\n return this.tabLabels[i] || this.slideLabels[i] || `Slide ${i + 1}`;\n }\n\n private syncSlides() {\n const tabs = this.indicatorStyle === 'tabs';\n this.slides.forEach((el, i) => {\n el.toggleAttribute('data-st-active', i === this.index);\n if (tabs) {\n el.setAttribute('role', 'tabpanel');\n el.setAttribute('aria-label', this.labelFor(i));\n } else if (el.getAttribute('role') === 'tabpanel') {\n el.removeAttribute('role');\n el.removeAttribute('aria-label');\n }\n });\n }\n\n private onSlotChange() {\n const slides = this.slides;\n this.count = slides.length;\n this.slideLabels = slides.map(el => (el as HTMLElement).dataset.tabLabel || (el as HTMLElement).title || '');\n if (this.index >= this.count) this.index = 0;\n this.syncSlides();\n }\n\n private stopTimer() {\n if (this.timer !== undefined) clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n private startTimer() {\n this.stopTimer();\n if (!this.autoPlay || this.count < 2 || this.halted) return;\n this.startedAt = performance.now();\n this.timer = setTimeout(() => this.go(this.index + 1, 'next'), Math.max(0, this.remaining));\n }\n\n private restartTimer() {\n this.remaining = this.interval;\n this.startTimer();\n }\n\n private go(target: number, direction: 'next' | 'prev') {\n if (this.count === 0) return;\n this.setAttribute('data-direction', direction);\n this.index = (target + this.count) % this.count;\n this.dispatchEvent(\n new CustomEvent<CarouselChangeEventDetail>('carousel-change', {\n detail: { index: this.index },\n bubbles: true,\n composed: true,\n }),\n );\n this.restartTimer();\n }\n\n private onTabKeydown(event: KeyboardEvent) {\n const step = { ArrowRight: 1, ArrowLeft: -1 }[event.key];\n let target: number | undefined;\n if (step !== undefined) target = this.index + step;\n else if (event.key === 'Home') target = 0;\n else if (event.key === 'End') target = this.count - 1;\n if (target === undefined) return;\n event.preventDefault();\n this.go(target, step === -1 || target < this.index ? 'prev' : 'next');\n void this.updateComplete.then(() => this.renderRoot.querySelector<HTMLElement>('.tab.active')?.focus());\n }\n\n private renderTabs() {\n const running = this.autoPlay && this.count > 1;\n return html`<div class=\"tabs\" part=\"tabs\">\n <div class=\"tabs-inner\">\n <p class=\"tab-current\" aria-hidden=\"true\">${this.labelFor(this.index)}</p>\n <div class=\"tablist\" role=\"tablist\" aria-label=\"Slides\" @keydown=${this.onTabKeydown}>\n ${Array.from({ length: this.count }, (_, i) => {\n const active = i === this.index;\n return html`\n <button\n part=\"tab\"\n type=\"button\"\n role=\"tab\"\n class=\"tab ${active ? 'active' : ''} ${running ? 'running' : ''}\"\n aria-selected=${active ? 'true' : 'false'}\n tabindex=${active ? 0 : -1}\n @click=${() => active || this.go(i, i > this.index ? 'next' : 'prev')}\n >\n <span class=\"progress\" part=\"progress\"><span class=\"fill\"></span></span>\n <span class=\"tab-label\">${this.labelFor(i)}</span>\n </button>\n `;\n })}\n </div>\n ${running\n ? html`<button\n part=\"play-button\"\n type=\"button\"\n class=\"play\"\n aria-label=${this.userPaused ? 'Play slides' : 'Pause slides'}\n @click=${this.togglePlay}\n >\n ${this.userPaused\n ? html`<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" aria-hidden=\"true\"><path d=\"M3 1.5v9l7.5-4.5z\" fill=\"currentColor\" /></svg>`\n : html`<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" aria-hidden=\"true\"><path d=\"M2.5 1.5h2.5v9H2.5zM7 1.5h2.5v9H7z\" fill=\"currentColor\" /></svg>`}\n </button>`\n : nothing}\n </div>\n </div>`;\n }\n\n private renderDots() {\n return html`<div class=\"indicators\" part=\"indicators\">\n ${Array.from(\n { length: this.count },\n (_, i) => html`\n <button\n part=\"dot\"\n class=\"dot ${i === this.index ? 'active' : ''}\"\n aria-label=\"Go to slide ${i + 1}\"\n aria-current=${i === this.index ? 'true' : 'false'}\n @click=${() => this.go(i, i > this.index ? 'next' : 'prev')}\n ></button>\n `,\n )}\n </div>`;\n }\n\n render() {\n const multiple = this.count > 1;\n return html`\n <slot @slotchange=${this.onSlotChange}></slot>\n ${this.showArrows && multiple\n ? html`\n <button part=\"nav-button prev\" class=\"nav prev\" aria-label=\"Previous Slide\" @click=${() => this.go(this.index - 1, 'prev')}>&#10094;</button>\n <button part=\"nav-button next\" class=\"nav next\" aria-label=\"Next Slide\" @click=${() => this.go(this.index + 1, 'next')}>&#10095;</button>\n `\n : nothing}\n ${this.showIndicators && multiple ? (this.indicatorStyle === 'tabs' ? this.renderTabs() : this.renderDots()) : nothing}\n `;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,YAAY,KAAK,MAAM,eAAe;AAC/C,SAAS,eAAe,UAAU,aAAa;AA0BxC,IAAM,WAAN,cAAuB,WAAW;AAAA,EAAlC;AAAA;AA6RL,oBAAW;AAIX,oBAAW;AAGX,sBAAa;AAGb,0BAAiB;AAIjB,0BAAkC;AAIlC,sBAA+B;AAI/B,qBAAsB,CAAC;AAEd,SAAQ,QAAQ;AAChB,SAAQ,QAAQ;AAChB,SAAQ,cAAwB,CAAC;AAEjC,SAAQ,aAAa;AAE9B;AAAA,SAAQ,SAAS;AAGjB;AAAA,SAAQ,YAAY;AACpB,SAAQ,YAAY;AA+CpB,SAAQ,QAAQ,MAAM,KAAK,KAAK,MAAO,KAAK,SAAS,IAAK;AAE1D,SAAQ,SAAS,MAAM,KAAK,KAAK,MAAO,KAAK,SAAS,KAAM;AAE5D,SAAQ,aAAa,MAAM,KAAK,KAAK,MAAO,KAAK,aAAa,CAAC,KAAK,UAAW;AAAA;AAAA,EAjD/E,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,iBAAiB,cAAc,KAAK,KAAK;AAC9C,SAAK,iBAAiB,cAAc,KAAK,MAAM;AAC/C,SAAK,iBAAiB,WAAW,KAAK,KAAK;AAC3C,SAAK,iBAAiB,YAAY,KAAK,MAAM;AAAA,EAC/C;AAAA,EAEA,uBAAuB;AACrB,SAAK,UAAU;AACf,SAAK,oBAAoB,cAAc,KAAK,KAAK;AACjD,SAAK,oBAAoB,cAAc,KAAK,MAAM;AAClD,SAAK,oBAAoB,WAAW,KAAK,KAAK;AAC9C,SAAK,oBAAoB,YAAY,KAAK,MAAM;AAChD,UAAM,qBAAqB;AAAA,EAC7B;AAAA,EAEU,WAAW,SAA+B;AAClD,QAAI,QAAQ,IAAI,UAAU,EAAG,MAAK,MAAM,YAAY,0BAA0B,GAAG,KAAK,QAAQ,IAAI;AAAA,EACpG;AAAA,EAEU,QAAQ,SAA+B;AAC/C,QAAI,QAAQ,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,IAAI,gBAAgB,KAAK,QAAQ,IAAI,WAAW,EAAG,MAAK,WAAW;AAC/H,QAAI,QAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,OAAO,EAAG,MAAK,aAAa;AAAA,EACpG;AAAA,EAEA,IAAY,SAAkB;AAC5B,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA;AAAA,EAGQ,KAAK,QAAoB;AAC/B,UAAM,MAAM,KAAK;AACjB,WAAO;AACP,UAAM,MAAM,KAAK;AACjB,QAAI,QAAQ,IAAK;AACjB,SAAK,gBAAgB,eAAe,GAAG;AACvC,QAAI,KAAK;AACP,UAAI,KAAK,UAAU,OAAW,MAAK,aAAa,YAAY,IAAI,IAAI,KAAK;AACzE,WAAK,UAAU;AAAA,IACjB,OAAO;AACL,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAQA,IAAY,SAAoB;AAC9B,WAAO,KAAK,YAAY,cAAc,MAAM,GAAG,iBAAiB,EAAE,SAAS,KAAK,CAAC,KAAK,CAAC;AAAA,EACzF;AAAA,EAEQ,SAAS,GAAmB;AAClC,WAAO,KAAK,UAAU,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,SAAS,IAAI,CAAC;AAAA,EACnE;AAAA,EAEQ,aAAa;AACnB,UAAM,OAAO,KAAK,mBAAmB;AACrC,SAAK,OAAO,QAAQ,CAAC,IAAI,MAAM;AAC7B,SAAG,gBAAgB,kBAAkB,MAAM,KAAK,KAAK;AACrD,UAAI,MAAM;AACR,WAAG,aAAa,QAAQ,UAAU;AAClC,WAAG,aAAa,cAAc,KAAK,SAAS,CAAC,CAAC;AAAA,MAChD,WAAW,GAAG,aAAa,MAAM,MAAM,YAAY;AACjD,WAAG,gBAAgB,MAAM;AACzB,WAAG,gBAAgB,YAAY;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe;AACrB,UAAM,SAAS,KAAK;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,cAAc,OAAO,IAAI,QAAO,GAAmB,QAAQ,YAAa,GAAmB,SAAS,EAAE;AAC3G,QAAI,KAAK,SAAS,KAAK,MAAO,MAAK,QAAQ;AAC3C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,YAAY;AAClB,QAAI,KAAK,UAAU,OAAW,cAAa,KAAK,KAAK;AACrD,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,aAAa;AACnB,SAAK,UAAU;AACf,QAAI,CAAC,KAAK,YAAY,KAAK,QAAQ,KAAK,KAAK,OAAQ;AACrD,SAAK,YAAY,YAAY,IAAI;AACjC,SAAK,QAAQ,WAAW,MAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC;AAAA,EAC5F;AAAA,EAEQ,eAAe;AACrB,SAAK,YAAY,KAAK;AACtB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,GAAG,QAAgB,WAA4B;AACrD,QAAI,KAAK,UAAU,EAAG;AACtB,SAAK,aAAa,kBAAkB,SAAS;AAC7C,SAAK,SAAS,SAAS,KAAK,SAAS,KAAK;AAC1C,SAAK;AAAA,MACH,IAAI,YAAuC,mBAAmB;AAAA,QAC5D,QAAQ,EAAE,OAAO,KAAK,MAAM;AAAA,QAC5B,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,aAAa,OAAsB;AACzC,UAAM,OAAO,EAAE,YAAY,GAAG,WAAW,GAAG,EAAE,MAAM,GAAG;AACvD,QAAI;AACJ,QAAI,SAAS,OAAW,UAAS,KAAK,QAAQ;AAAA,aACrC,MAAM,QAAQ,OAAQ,UAAS;AAAA,aAC/B,MAAM,QAAQ,MAAO,UAAS,KAAK,QAAQ;AACpD,QAAI,WAAW,OAAW;AAC1B,UAAM,eAAe;AACrB,SAAK,GAAG,QAAQ,SAAS,MAAM,SAAS,KAAK,QAAQ,SAAS,MAAM;AACpE,SAAK,KAAK,eAAe,KAAK,MAAM,KAAK,WAAW,cAA2B,aAAa,GAAG,MAAM,CAAC;AAAA,EACxG;AAAA,EAEQ,aAAa;AACnB,UAAM,UAAU,KAAK,YAAY,KAAK,QAAQ;AAC9C,WAAO;AAAA;AAAA,oDAEyC,KAAK,SAAS,KAAK,KAAK,CAAC;AAAA,2EACF,KAAK,YAAY;AAAA,YAChF,MAAM,KAAK,EAAE,QAAQ,KAAK,MAAM,GAAG,CAAC,GAAG,MAAM;AAC7C,YAAM,SAAS,MAAM,KAAK;AAC1B,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA,6BAKU,SAAS,WAAW,EAAE,IAAI,UAAU,YAAY,EAAE;AAAA,gCAC/C,SAAS,SAAS,OAAO;AAAA,2BAC9B,SAAS,IAAI,EAAE;AAAA,yBACjB,MAAM,UAAU,KAAK,GAAG,GAAG,IAAI,KAAK,QAAQ,SAAS,MAAM,CAAC;AAAA;AAAA;AAAA,0CAG3C,KAAK,SAAS,CAAC,CAAC;AAAA;AAAA;AAAA,IAGhD,CAAC,CAAC;AAAA;AAAA,UAEF,UACE;AAAA;AAAA;AAAA;AAAA,2BAIe,KAAK,aAAa,gBAAgB,cAAc;AAAA,uBACpD,KAAK,UAAU;AAAA;AAAA,gBAEtB,KAAK,aACH,oIACA,kJAAkJ;AAAA,yBAExJ,OAAO;AAAA;AAAA;AAAA,EAGjB;AAAA,EAEQ,aAAa;AACnB,WAAO;AAAA,QACH,MAAM;AAAA,MACN,EAAE,QAAQ,KAAK,MAAM;AAAA,MACrB,CAAC,GAAG,MAAM;AAAA;AAAA;AAAA,yBAGO,MAAM,KAAK,QAAQ,WAAW,EAAE;AAAA,sCACnB,IAAI,CAAC;AAAA,2BAChB,MAAM,KAAK,QAAQ,SAAS,OAAO;AAAA,qBACzC,MAAM,KAAK,GAAG,GAAG,IAAI,KAAK,QAAQ,SAAS,MAAM,CAAC;AAAA;AAAA;AAAA,IAGjE,CAAC;AAAA;AAAA,EAEL;AAAA,EAEA,SAAS;AACP,UAAM,WAAW,KAAK,QAAQ;AAC9B,WAAO;AAAA,0BACe,KAAK,YAAY;AAAA,QACnC,KAAK,cAAc,WACjB;AAAA,iGACuF,MAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,MAAM,CAAC;AAAA,6FACzC,MAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,MAAM,CAAC;AAAA,cAExH,OAAO;AAAA,QACT,KAAK,kBAAkB,WAAY,KAAK,mBAAmB,SAAS,KAAK,WAAW,IAAI,KAAK,WAAW,IAAK,OAAO;AAAA;AAAA,EAE1H;AACF;AApgBa,SACJ,SAAS;AAAA,MACZ,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA2Df,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA6CjB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAsDjB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAgEjB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiDnB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYvB;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,WAAW,YAAY,CAAC;AAAA,GA5RxC,SA6RX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAhSf,SAiSX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,WAAW,cAAc,CAAC;AAAA,GAnS1C,SAoSX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,WAAW,kBAAkB,CAAC;AAAA,GAtS9C,SAuSX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,WAAW,kBAAkB,CAAC;AAAA,GA1S5D,SA2SX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GA9S9B,SA+SX;AAIA;AAAA,EADC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GAlTnB,SAmTX;AAEiB;AAAA,EAAhB,MAAM;AAAA,GArTI,SAqTM;AACA;AAAA,EAAhB,MAAM;AAAA,GAtTI,SAsTM;AACA;AAAA,EAAhB,MAAM;AAAA,GAvTI,SAuTM;AAEA;AAAA,EAAhB,MAAM;AAAA,GAzTI,SAyTM;AAzTN,WAAN;AAAA,EADN,cAAc,aAAa;AAAA,GACf;","names":[]}