@sankhyatronics/sankhya-cms 0.0.0-stage → 0.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/README.md +34 -3
- package/custom-elements.json +4008 -0
- package/dist/bento-grid/index.d.ts +27 -0
- package/dist/bento-grid/index.js +10 -0
- package/dist/bento-grid/index.js.map +1 -0
- package/dist/card/index.d.ts +20 -0
- package/dist/card/index.js +9 -0
- package/dist/card/index.js.map +1 -0
- package/dist/carousel/index.d.ts +44 -0
- package/dist/carousel/index.js +10 -0
- package/dist/carousel/index.js.map +1 -0
- package/dist/chunk-23IHTBAB.js +557 -0
- package/dist/chunk-23IHTBAB.js.map +1 -0
- package/dist/chunk-2VZFHTBC.js +203 -0
- package/dist/chunk-2VZFHTBC.js.map +1 -0
- package/dist/chunk-3ERKQNZT.js +155 -0
- package/dist/chunk-3ERKQNZT.js.map +1 -0
- package/dist/chunk-3JU3R22O.js +193 -0
- package/dist/chunk-3JU3R22O.js.map +1 -0
- package/dist/chunk-3TCP25JG.js +347 -0
- package/dist/chunk-3TCP25JG.js.map +1 -0
- package/dist/chunk-3VE6VFJ4.js +87 -0
- package/dist/chunk-3VE6VFJ4.js.map +1 -0
- package/dist/chunk-4HKSA5UT.js +312 -0
- package/dist/chunk-4HKSA5UT.js.map +1 -0
- package/dist/chunk-5REZSZCK.js +266 -0
- package/dist/chunk-5REZSZCK.js.map +1 -0
- package/dist/chunk-5UFRGZWG.js +268 -0
- package/dist/chunk-5UFRGZWG.js.map +1 -0
- package/dist/chunk-74MILER4.js +215 -0
- package/dist/chunk-74MILER4.js.map +1 -0
- package/dist/chunk-7PSYCTEN.js +118 -0
- package/dist/chunk-7PSYCTEN.js.map +1 -0
- package/dist/chunk-CDC4P77V.js +299 -0
- package/dist/chunk-CDC4P77V.js.map +1 -0
- package/dist/chunk-E52WO7R7.js +279 -0
- package/dist/chunk-E52WO7R7.js.map +1 -0
- package/dist/chunk-EUXUH3YW.js +15 -0
- package/dist/chunk-EUXUH3YW.js.map +1 -0
- package/dist/chunk-IMACP7HN.js +156 -0
- package/dist/chunk-IMACP7HN.js.map +1 -0
- package/dist/chunk-LHU23TF6.js +273 -0
- package/dist/chunk-LHU23TF6.js.map +1 -0
- package/dist/chunk-OEX5FDMR.js +250 -0
- package/dist/chunk-OEX5FDMR.js.map +1 -0
- package/dist/chunk-RHAOQ6K4.js +138 -0
- package/dist/chunk-RHAOQ6K4.js.map +1 -0
- package/dist/chunk-RMIJVTFS.js +397 -0
- package/dist/chunk-RMIJVTFS.js.map +1 -0
- package/dist/chunk-U7YKCCJG.js +228 -0
- package/dist/chunk-U7YKCCJG.js.map +1 -0
- package/dist/chunk-USNFT4DU.js +125 -0
- package/dist/chunk-USNFT4DU.js.map +1 -0
- package/dist/chunk-VYON56QO.js +90 -0
- package/dist/chunk-VYON56QO.js.map +1 -0
- package/dist/chunk-WCO7JAIK.js +195 -0
- package/dist/chunk-WCO7JAIK.js.map +1 -0
- package/dist/chunk-XHBC23TV.js +254 -0
- package/dist/chunk-XHBC23TV.js.map +1 -0
- package/dist/chunk-XXPBFHWR.js +70 -0
- package/dist/chunk-XXPBFHWR.js.map +1 -0
- package/dist/cms-theme.css +15 -0
- package/dist/content-block/index.d.ts +25 -0
- package/dist/content-block/index.js +11 -0
- package/dist/content-block/index.js.map +1 -0
- package/dist/cookie-consent/index.d.ts +33 -0
- package/dist/cookie-consent/index.js +9 -0
- package/dist/cookie-consent/index.js.map +1 -0
- package/dist/dropdown/index.d.ts +89 -0
- package/dist/dropdown/index.js +9 -0
- package/dist/dropdown/index.js.map +1 -0
- package/dist/feature-split/index.d.ts +38 -0
- package/dist/feature-split/index.js +11 -0
- package/dist/feature-split/index.js.map +1 -0
- package/dist/features-section/index.d.ts +50 -0
- package/dist/features-section/index.js +14 -0
- package/dist/features-section/index.js.map +1 -0
- package/dist/footer/index.d.ts +64 -0
- package/dist/footer/index.js +9 -0
- package/dist/footer/index.js.map +1 -0
- package/dist/header/index.d.ts +112 -0
- package/dist/header/index.js +10 -0
- package/dist/header/index.js.map +1 -0
- package/dist/hero/index.d.ts +32 -0
- package/dist/hero/index.js +10 -0
- package/dist/hero/index.js.map +1 -0
- package/dist/icon-button/index.d.ts +23 -0
- package/dist/icon-button/index.js +9 -0
- package/dist/icon-button/index.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/items-accordion/index.d.ts +31 -0
- package/dist/items-accordion/index.js +10 -0
- package/dist/items-accordion/index.js.map +1 -0
- package/dist/markdown/index.d.ts +33 -0
- package/dist/markdown/index.js +9 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/menu-grid/index.d.ts +21 -0
- package/dist/menu-grid/index.js +9 -0
- package/dist/menu-grid/index.js.map +1 -0
- package/dist/menu-grid-item/index.d.ts +53 -0
- package/dist/menu-grid-item/index.js +9 -0
- package/dist/menu-grid-item/index.js.map +1 -0
- package/dist/menu-item/index.d.ts +50 -0
- package/dist/menu-item/index.js +9 -0
- package/dist/menu-item/index.js.map +1 -0
- package/dist/promo-banner/index.d.ts +22 -0
- package/dist/promo-banner/index.js +10 -0
- package/dist/promo-banner/index.js.map +1 -0
- package/dist/schema/index.d.ts +72 -0
- package/dist/schema/index.js +75 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/select/index.d.ts +77 -0
- package/dist/select/index.js +10 -0
- package/dist/select/index.js.map +1 -0
- package/dist/shared/icons.d.ts +77 -0
- package/dist/shared/icons.js +64 -0
- package/dist/shared/icons.js.map +1 -0
- package/dist/shared/styles.d.ts +90 -0
- package/dist/shared/styles.js +48 -0
- package/dist/shared/styles.js.map +1 -0
- package/dist/stats/index.d.ts +17 -0
- package/dist/stats/index.js +9 -0
- package/dist/stats/index.js.map +1 -0
- package/dist/testimonials/index.d.ts +25 -0
- package/dist/testimonials/index.js +10 -0
- package/dist/testimonials/index.js.map +1 -0
- package/dist/theme.css +292 -0
- package/dist/themes.css +65 -0
- package/dist/theming/index.d.ts +28 -0
- package/dist/theming/index.js +53 -0
- package/dist/theming/index.js.map +1 -0
- package/package.json +161 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hero/Hero.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\n\r\nimport { controlBaseStyles, rootFontFamilyStyles } from '../shared/styles';\r\nimport { ctaLinkStyles, paddingScaleStyles } from '../shared/section-styles';\r\nimport type { HeroActionEventDetail } from './HeroEvents';\r\n\r\n/**\r\n * Full-width hero banner: background image with a darkening overlay, title, optional subtitle and\r\n * a call-to-action link. Port of `SankhyaUI`'s React `Hero`; the framer-motion entrance is redone\r\n * as CSS keyframes (skipped under `prefers-reduced-motion`). The CTA fires a cancelable `action`\r\n * event (detail `{ href }`) before navigating.\r\n */\r\n@customElement('st-hero')\r\nexport class Hero extends LitElement {\r\n static styles = css`\r\n ${controlBaseStyles}\r\n ${paddingScaleStyles}\r\n\r\n @keyframes st-hero-zoom {\r\n from { opacity: 0; transform: scale(1.1); }\r\n to { opacity: 1; transform: scale(1); }\r\n }\r\n @keyframes st-hero-rise {\r\n from { opacity: 0; transform: translateY(30px); }\r\n to { opacity: 1; transform: none; }\r\n }\r\n @keyframes st-hero-fade {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n }\r\n\r\n :host {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n position: relative;\r\n overflow: hidden;\r\n width: 100%;\r\n box-sizing: border-box;\r\n background-color: var(--st-color-text-strong);\r\n background-repeat: no-repeat;\r\n background-size: cover;\r\n background-position: var(--st-hero-position, center center);\r\n color: var(--st-color-on-solid);\r\n ${rootFontFamilyStyles}\r\n animation: st-hero-zoom 1.5s ease-out;\r\n }\r\n\r\n :host([inverted]) {\r\n background-color: var(--st-color-surface);\r\n color: var(--st-color-text-strong);\r\n }\r\n\r\n .overlay {\r\n position: absolute;\r\n inset: 0;\r\n z-index: 1;\r\n background: linear-gradient(\r\n to bottom,\r\n color-mix(in oklch, var(--st-color-text-strong) 40%, transparent),\r\n color-mix(in oklch, var(--st-color-text-strong) 20%, transparent),\r\n color-mix(in oklch, var(--st-color-text-strong) 40%, transparent)\r\n );\r\n }\r\n\r\n :host([inverted]) .overlay {\r\n display: none;\r\n }\r\n\r\n .content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--st-space-20);\r\n position: relative;\r\n z-index: 2;\r\n width: 80%;\r\n margin: 0 auto;\r\n text-align: center;\r\n align-items: center;\r\n /* Set here, not only on :host: text sits on the image/overlay, so a colour class the page puts\r\n on the host (e.g. a theme text colour) must not turn it dark. */\r\n color: var(--st-hero-text-color, var(--st-color-on-solid));\r\n }\r\n\r\n :host([inverted]) .content {\r\n color: var(--st-hero-text-color, var(--st-color-text-strong));\r\n }\r\n\r\n :host([text-alignment='left']) .content { text-align: left; align-items: flex-start; }\r\n :host([text-alignment='right']) .content { text-align: right; align-items: flex-end; }\r\n :host([text-alignment='justify']) .content { text-align: justify; align-items: stretch; }\r\n\r\n .title {\r\n font-size: var(--st-cms-text-display);\r\n font-weight: var(--st-font-weight-bold);\r\n line-height: 1.1;\r\n color: inherit;\r\n margin: 0;\r\n animation: st-hero-rise 0.8s 0.3s ease-out backwards;\r\n }\r\n\r\n .subtitle {\r\n font-size: var(--st-cms-text-xl);\r\n line-height: 1.5;\r\n color: inherit;\r\n margin: 0;\r\n animation: st-hero-fade 0.8s 0.5s ease-out backwards;\r\n }\r\n\r\n .actions {\r\n display: flex;\r\n justify-content: center;\r\n width: 100%;\r\n }\r\n\r\n .cta {\r\n ${ctaLinkStyles}\r\n background: var(--st-button-primary-bg);\r\n color: var(--st-button-primary-color);\r\n font-weight: var(--st-button-font-weight);\r\n font-size: var(--st-text-md);\r\n animation: st-hero-rise 0.6s 0.7s ease-out backwards;\r\n }\r\n\r\n .cta:hover {\r\n transform: scale(1.05);\r\n }\r\n\r\n .cta:active {\r\n transform: scale(0.98);\r\n }\r\n\r\n @media (min-width: 768px) {\r\n .content { padding: var(--st-space-32); }\r\n }\r\n @media (min-width: 1024px) {\r\n .content { padding: var(--st-space-48); }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n :host, .title, .subtitle, .cta { animation: none; }\r\n .cta { transition: none; }\r\n }\r\n `;\r\n\r\n @property({ type: String })\r\n title = '';\r\n\r\n @property({ type: String })\r\n subtitle = '';\r\n\r\n @property({ type: String, attribute: 'image-src' })\r\n imageSrc = '';\r\n\r\n @property({ type: String, attribute: 'action-label' })\r\n actionLabel = '';\r\n\r\n @property({ type: String })\r\n href = '';\r\n\r\n @property({ type: String, reflect: true, attribute: 'text-alignment' })\r\n textAlignment: 'left' | 'center' | 'right' | 'justify' = 'left';\r\n\r\n @property({ type: String, reflect: true })\r\n padding: 'none' | 'small' | 'medium' | 'large' = 'none';\r\n\r\n @property({ type: Boolean, reflect: true })\r\n inverted = false;\r\n\r\n @property({ type: String, attribute: 'focal-point' })\r\n focalPoint: 'top' | 'left' | 'right' | 'bottom' | 'center' = 'center';\r\n\r\n private static positions = {\r\n top: 'center top',\r\n left: 'left center',\r\n right: 'right center',\r\n bottom: 'center bottom',\r\n center: 'center center'\r\n } as const;\r\n\r\n protected willUpdate(): void {\r\n this.style.backgroundImage = this.imageSrc ? `url(${JSON.stringify(this.imageSrc)})` : '';\r\n this.style.setProperty('--st-hero-position', Hero.positions[this.focalPoint] ?? Hero.positions.center);\r\n }\r\n\r\n private onClick = (event: MouseEvent): void => {\r\n const action = new CustomEvent<HeroActionEventDetail>('action', {\r\n detail: { href: this.href },\r\n bubbles: true,\r\n composed: true,\r\n cancelable: true\r\n });\r\n this.dispatchEvent(action);\r\n if (action.defaultPrevented) event.preventDefault();\r\n };\r\n\r\n render() {\r\n return html`\r\n <div class=\"overlay\" part=\"overlay\"></div>\r\n <div class=\"content\" part=\"content\">\r\n <h1 class=\"title\" part=\"title\">${this.title}</h1>\r\n ${this.subtitle ? html`<p class=\"subtitle\" part=\"subtitle\">${this.subtitle}</p>` : nothing}\r\n ${this.actionLabel\r\n ? html`<div class=\"actions\" part=\"actions\">\r\n <a class=\"cta\" part=\"action\" href=${this.href || nothing} @click=${this.onClick}>${this.actionLabel}</a>\r\n </div>`\r\n : nothing}\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import {
|
|
2
|
+
controlBaseStyles,
|
|
3
|
+
rootFontFamilyStyles
|
|
4
|
+
} from "./chunk-RHAOQ6K4.js";
|
|
5
|
+
import {
|
|
6
|
+
__decorateClass
|
|
7
|
+
} from "./chunk-EUXUH3YW.js";
|
|
8
|
+
|
|
9
|
+
// src/stats/Stats.ts
|
|
10
|
+
import { LitElement, css, html, nothing } from "lit";
|
|
11
|
+
import { customElement, property } from "lit/decorators.js";
|
|
12
|
+
var Stats = class extends LitElement {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this.items = [];
|
|
16
|
+
this.inverted = false;
|
|
17
|
+
}
|
|
18
|
+
render() {
|
|
19
|
+
return html`
|
|
20
|
+
<div class="grid" part="grid">
|
|
21
|
+
${this.items.map(
|
|
22
|
+
(stat) => html`
|
|
23
|
+
<div class="item" part="item">
|
|
24
|
+
<span class="value" part="value">${stat.value}</span>
|
|
25
|
+
<span class="label" part="label">${stat.label}</span>
|
|
26
|
+
${stat.description ? html`<span class="description" part="description">${stat.description}</span>` : nothing}
|
|
27
|
+
</div>
|
|
28
|
+
`
|
|
29
|
+
)}
|
|
30
|
+
</div>
|
|
31
|
+
`;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
Stats.styles = css`
|
|
35
|
+
${controlBaseStyles}
|
|
36
|
+
|
|
37
|
+
:host {
|
|
38
|
+
display: block;
|
|
39
|
+
box-sizing: border-box;
|
|
40
|
+
padding: var(--st-space-48) var(--st-space-24);
|
|
41
|
+
background-color: var(--st-color-surface);
|
|
42
|
+
border-top: 1px solid var(--st-color-divider);
|
|
43
|
+
border-bottom: 1px solid var(--st-color-divider);
|
|
44
|
+
${rootFontFamilyStyles}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:host([inverted]) {
|
|
48
|
+
background-color: var(--st-color-text-strong);
|
|
49
|
+
border-color: transparent;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.grid {
|
|
53
|
+
max-width: var(--st-cms-container-max);
|
|
54
|
+
margin: 0 auto;
|
|
55
|
+
display: grid;
|
|
56
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
57
|
+
gap: var(--st-space-40);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.item {
|
|
61
|
+
display: flex;
|
|
62
|
+
flex-direction: column;
|
|
63
|
+
align-items: center;
|
|
64
|
+
text-align: center;
|
|
65
|
+
gap: var(--st-space-8);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.value {
|
|
69
|
+
font-size: var(--st-cms-text-3xl);
|
|
70
|
+
font-weight: var(--st-font-weight-bold);
|
|
71
|
+
color: var(--st-color-text-strong);
|
|
72
|
+
line-height: 1;
|
|
73
|
+
letter-spacing: -0.02em;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.label {
|
|
77
|
+
font-size: var(--st-text-xl);
|
|
78
|
+
font-weight: var(--st-font-weight-semibold);
|
|
79
|
+
color: var(--st-color-text-muted);
|
|
80
|
+
text-transform: uppercase;
|
|
81
|
+
letter-spacing: var(--st-tracking-wide);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.description {
|
|
85
|
+
font-size: var(--st-text-sm);
|
|
86
|
+
color: var(--st-color-text-faint);
|
|
87
|
+
max-width: 200px;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
:host([inverted]) .value {
|
|
91
|
+
color: var(--st-color-on-solid);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
:host([inverted]) .label,
|
|
95
|
+
:host([inverted]) .description {
|
|
96
|
+
color: var(--st-color-border);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@media (max-width: 768px) {
|
|
100
|
+
:host {
|
|
101
|
+
padding: var(--st-space-40) var(--st-space-24);
|
|
102
|
+
}
|
|
103
|
+
.grid {
|
|
104
|
+
grid-template-columns: repeat(2, 1fr);
|
|
105
|
+
gap: var(--st-space-24);
|
|
106
|
+
}
|
|
107
|
+
.value {
|
|
108
|
+
font-size: var(--st-cms-text-xl);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
`;
|
|
112
|
+
__decorateClass([
|
|
113
|
+
property({ attribute: false })
|
|
114
|
+
], Stats.prototype, "items", 2);
|
|
115
|
+
__decorateClass([
|
|
116
|
+
property({ type: Boolean, reflect: true })
|
|
117
|
+
], Stats.prototype, "inverted", 2);
|
|
118
|
+
Stats = __decorateClass([
|
|
119
|
+
customElement("st-stats")
|
|
120
|
+
], Stats);
|
|
121
|
+
|
|
122
|
+
export {
|
|
123
|
+
Stats
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=chunk-USNFT4DU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stats/Stats.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\n\r\nimport { controlBaseStyles, rootFontFamilyStyles } from '../shared/styles';\r\n\r\nexport interface StatItem {\r\n value: string;\r\n label: string;\r\n description?: string;\r\n}\r\n\r\n/** Responsive grid of headline numbers with a label and optional description. Port of React `Stats`. */\r\n@customElement('st-stats')\r\nexport class Stats extends LitElement {\r\n static styles = css`\r\n ${controlBaseStyles}\r\n\r\n :host {\r\n display: block;\r\n box-sizing: border-box;\r\n padding: var(--st-space-48) var(--st-space-24);\r\n background-color: var(--st-color-surface);\r\n border-top: 1px solid var(--st-color-divider);\r\n border-bottom: 1px solid var(--st-color-divider);\r\n ${rootFontFamilyStyles}\r\n }\r\n\r\n :host([inverted]) {\r\n background-color: var(--st-color-text-strong);\r\n border-color: transparent;\r\n }\r\n\r\n .grid {\r\n max-width: var(--st-cms-container-max);\r\n margin: 0 auto;\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n gap: var(--st-space-40);\r\n }\r\n\r\n .item {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n text-align: center;\r\n gap: var(--st-space-8);\r\n }\r\n\r\n .value {\r\n font-size: var(--st-cms-text-3xl);\r\n font-weight: var(--st-font-weight-bold);\r\n color: var(--st-color-text-strong);\r\n line-height: 1;\r\n letter-spacing: -0.02em;\r\n }\r\n\r\n .label {\r\n font-size: var(--st-text-xl);\r\n font-weight: var(--st-font-weight-semibold);\r\n color: var(--st-color-text-muted);\r\n text-transform: uppercase;\r\n letter-spacing: var(--st-tracking-wide);\r\n }\r\n\r\n .description {\r\n font-size: var(--st-text-sm);\r\n color: var(--st-color-text-faint);\r\n max-width: 200px;\r\n }\r\n\r\n :host([inverted]) .value {\r\n color: var(--st-color-on-solid);\r\n }\r\n\r\n :host([inverted]) .label,\r\n :host([inverted]) .description {\r\n color: var(--st-color-border);\r\n }\r\n\r\n @media (max-width: 768px) {\r\n :host {\r\n padding: var(--st-space-40) var(--st-space-24);\r\n }\r\n .grid {\r\n grid-template-columns: repeat(2, 1fr);\r\n gap: var(--st-space-24);\r\n }\r\n .value {\r\n font-size: var(--st-cms-text-xl);\r\n }\r\n }\r\n `;\r\n\r\n @property({ attribute: false })\r\n items: StatItem[] = [];\r\n\r\n @property({ type: Boolean, reflect: true })\r\n inverted = false;\r\n\r\n render() {\r\n return html`\r\n <div class=\"grid\" part=\"grid\">\r\n ${this.items.map(\r\n (stat) => html`\r\n <div class=\"item\" part=\"item\">\r\n <span class=\"value\" part=\"value\">${stat.value}</span>\r\n <span class=\"label\" part=\"label\">${stat.label}</span>\r\n ${stat.description ? html`<span class=\"description\" part=\"description\">${stat.description}</span>` : nothing}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n `;\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;AAAA,SAAS,YAAY,KAAK,MAAM,eAAe;AAC/C,SAAS,eAAe,gBAAgB;AAYjC,IAAM,QAAN,cAAoB,WAAW;AAAA,EAA/B;AAAA;AAiFL,iBAAoB,CAAC;AAGrB,oBAAW;AAAA;AAAA,EAEX,SAAS;AACP,WAAO;AAAA;AAAA,UAED,KAAK,MAAM;AAAA,MACX,CAAC,SAAS;AAAA;AAAA,iDAE6B,KAAK,KAAK;AAAA,iDACV,KAAK,KAAK;AAAA,gBAC3C,KAAK,cAAc,oDAAoD,KAAK,WAAW,YAAY,OAAO;AAAA;AAAA;AAAA,IAGlH,CAAC;AAAA;AAAA;AAAA,EAGP;AACF;AArGa,MACJ,SAAS;AAAA,MACZ,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASf,oBAAoB;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;AAAA;AAAA;AAAA;AAsE1B;AAAA,EADC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GAhFnB,MAiFX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAnF/B,MAoFX;AApFW,QAAN;AAAA,EADN,cAAc,UAAU;AAAA,GACZ;","names":[]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import {
|
|
2
|
+
controlBaseStyles
|
|
3
|
+
} from "./chunk-RHAOQ6K4.js";
|
|
4
|
+
import {
|
|
5
|
+
__decorateClass
|
|
6
|
+
} from "./chunk-EUXUH3YW.js";
|
|
7
|
+
|
|
8
|
+
// src/menu-grid/MenuGrid.ts
|
|
9
|
+
import { LitElement, css, html } from "lit";
|
|
10
|
+
import { customElement, property } from "lit/decorators.js";
|
|
11
|
+
var MenuGrid = class extends LitElement {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.columns = 3;
|
|
15
|
+
this.gridClassName = "";
|
|
16
|
+
}
|
|
17
|
+
render() {
|
|
18
|
+
const columns = Math.min(4, Math.max(1, Math.round(this.columns) || 1));
|
|
19
|
+
return html`
|
|
20
|
+
<div class="menu-grid-container" part="container">
|
|
21
|
+
<div part="grid" class="menu-grid columns-${columns} ${this.gridClassName}">
|
|
22
|
+
<slot></slot>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
`;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
MenuGrid.styles = css`
|
|
29
|
+
${controlBaseStyles}
|
|
30
|
+
|
|
31
|
+
:host {
|
|
32
|
+
display: block;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.menu-grid-container {
|
|
36
|
+
width: 100%;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.menu-grid {
|
|
40
|
+
display: grid;
|
|
41
|
+
gap: 12px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.menu-grid.columns-1 {
|
|
45
|
+
grid-template-columns: repeat(1, 1fr);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.menu-grid.columns-2 {
|
|
49
|
+
grid-template-columns: repeat(2, 1fr);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.menu-grid.columns-3 {
|
|
53
|
+
grid-template-columns: repeat(3, 1fr);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.menu-grid.columns-4 {
|
|
57
|
+
grid-template-columns: repeat(4, 1fr);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@media (max-width: 768px) {
|
|
61
|
+
.menu-grid.columns-2,
|
|
62
|
+
.menu-grid.columns-3,
|
|
63
|
+
.menu-grid.columns-4 {
|
|
64
|
+
grid-template-columns: repeat(2, 1fr);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@media (max-width: 480px) {
|
|
69
|
+
.menu-grid.columns-1,
|
|
70
|
+
.menu-grid.columns-2,
|
|
71
|
+
.menu-grid.columns-3,
|
|
72
|
+
.menu-grid.columns-4 {
|
|
73
|
+
grid-template-columns: 1fr;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
__decorateClass([
|
|
78
|
+
property({ type: Number })
|
|
79
|
+
], MenuGrid.prototype, "columns", 2);
|
|
80
|
+
__decorateClass([
|
|
81
|
+
property({ type: String, attribute: "grid-class-name" })
|
|
82
|
+
], MenuGrid.prototype, "gridClassName", 2);
|
|
83
|
+
MenuGrid = __decorateClass([
|
|
84
|
+
customElement("st-menu-grid")
|
|
85
|
+
], MenuGrid);
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
MenuGrid
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=chunk-VYON56QO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/menu-grid/MenuGrid.ts"],"sourcesContent":["import { LitElement, css, html } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\n\r\nimport { controlBaseStyles } from '../shared/styles';\r\n\r\n/**\r\n * A responsive grid of `st-menu-grid-item`s — the \"rich\" nav-menu layout (icon + title +\r\n * description per entry, arranged in columns), typically slotted into `st-dropdown`'s default\r\n * slot. A 1:1 port of `SankhyaUI`'s React `MenuGrid` (`SankhyaCMS/SankhyaUI/src/components/Menu`):\r\n * same markup (`.menu-grid-container` > `.menu-grid.columns-N`), gap and breakpoints (768px: 2–4\r\n * columns → 2; 480px: everything → 1; a 1-column grid stays 1).\r\n */\r\n@customElement('st-menu-grid')\r\nexport class MenuGrid extends LitElement {\r\n static styles = css`\r\n ${controlBaseStyles}\r\n\r\n :host {\r\n display: block;\r\n }\r\n\r\n .menu-grid-container {\r\n width: 100%;\r\n }\r\n\r\n .menu-grid {\r\n display: grid;\r\n gap: 12px;\r\n }\r\n\r\n .menu-grid.columns-1 {\r\n grid-template-columns: repeat(1, 1fr);\r\n }\r\n\r\n .menu-grid.columns-2 {\r\n grid-template-columns: repeat(2, 1fr);\r\n }\r\n\r\n .menu-grid.columns-3 {\r\n grid-template-columns: repeat(3, 1fr);\r\n }\r\n\r\n .menu-grid.columns-4 {\r\n grid-template-columns: repeat(4, 1fr);\r\n }\r\n\r\n @media (max-width: 768px) {\r\n .menu-grid.columns-2,\r\n .menu-grid.columns-3,\r\n .menu-grid.columns-4 {\r\n grid-template-columns: repeat(2, 1fr);\r\n }\r\n }\r\n\r\n @media (max-width: 480px) {\r\n .menu-grid.columns-1,\r\n .menu-grid.columns-2,\r\n .menu-grid.columns-3,\r\n .menu-grid.columns-4 {\r\n grid-template-columns: 1fr;\r\n }\r\n }\r\n `;\r\n\r\n /** Number of columns at full width (1–4, same as the source component's `columns-N` classes). */\r\n @property({ type: Number })\r\n columns = 3;\r\n\r\n /** Extra class(es) appended to the inner grid element — the source component's `gridClassName`.\r\n * Its outer `className` is the host element itself here: set a `class` attribute on `st-menu-grid`. */\r\n @property({ type: String, attribute: 'grid-class-name' })\r\n gridClassName = '';\r\n\r\n render() {\r\n const columns = Math.min(4, Math.max(1, Math.round(this.columns) || 1));\r\n return html`\r\n <div class=\"menu-grid-container\" part=\"container\">\r\n <div part=\"grid\" class=\"menu-grid columns-${columns} ${this.gridClassName}\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n"],"mappings":";;;;;;;;AAAA,SAAS,YAAY,KAAK,YAAY;AACtC,SAAS,eAAe,gBAAgB;AAYjC,IAAM,WAAN,cAAuB,WAAW;AAAA,EAAlC;AAAA;AAqDL,mBAAU;AAKV,yBAAgB;AAAA;AAAA,EAEhB,SAAS;AACP,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,OAAO,KAAK,CAAC,CAAC;AACtE,WAAO;AAAA;AAAA,oDAEyC,OAAO,IAAI,KAAK,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/E;AACF;AAtEa,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;AAmDrB;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GApDf,SAqDX;AAKA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,kBAAkB,CAAC;AAAA,GAzD7C,SA0DX;AA1DW,WAAN;AAAA,EADN,cAAc,cAAc;AAAA,GAChB;","names":[]}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import {
|
|
2
|
+
invertedSectionTextStyles,
|
|
3
|
+
sectionHeaderStyles,
|
|
4
|
+
sectionSubtitleStyles,
|
|
5
|
+
sectionTitleStyles
|
|
6
|
+
} from "./chunk-3VE6VFJ4.js";
|
|
7
|
+
import {
|
|
8
|
+
cardShellStyles,
|
|
9
|
+
controlBaseStyles,
|
|
10
|
+
rootFontFamilyStyles
|
|
11
|
+
} from "./chunk-RHAOQ6K4.js";
|
|
12
|
+
import {
|
|
13
|
+
__decorateClass
|
|
14
|
+
} from "./chunk-EUXUH3YW.js";
|
|
15
|
+
|
|
16
|
+
// src/testimonials/Testimonials.ts
|
|
17
|
+
import { LitElement, css, html, nothing } from "lit";
|
|
18
|
+
import { customElement, property } from "lit/decorators.js";
|
|
19
|
+
import "iconify-icon";
|
|
20
|
+
var Testimonials = class extends LitElement {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
this.title = "";
|
|
24
|
+
this.subtitle = "";
|
|
25
|
+
this.items = [];
|
|
26
|
+
this.inverted = false;
|
|
27
|
+
}
|
|
28
|
+
renderItem(item) {
|
|
29
|
+
const rating = item.rating || 5;
|
|
30
|
+
return html`
|
|
31
|
+
<figure class="card" part="card">
|
|
32
|
+
<div class="stars" part="stars" role="img" aria-label="${rating} / 5">
|
|
33
|
+
${Array.from({ length: rating }, () => html`<iconify-icon icon="mdi:star"></iconify-icon>`)}
|
|
34
|
+
</div>
|
|
35
|
+
<blockquote class="quote" part="quote">"${item.quote}"</blockquote>
|
|
36
|
+
<figcaption class="author" part="author">
|
|
37
|
+
${item.imageSrc ? html`<img class="avatar" part="avatar" src=${item.imageSrc} alt=${item.name} />` : html`<div class="avatar avatar-placeholder" part="avatar">${item.name.charAt(0)}</div>`}
|
|
38
|
+
<span class="author-info">
|
|
39
|
+
<span class="name" part="name">${item.name}</span>
|
|
40
|
+
<span class="role" part="role">${item.role}${item.company ? ` at ${item.company}` : ""}</span>
|
|
41
|
+
</span>
|
|
42
|
+
</figcaption>
|
|
43
|
+
</figure>
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
render() {
|
|
47
|
+
return html`
|
|
48
|
+
<div class="container" part="container">
|
|
49
|
+
<div class="header" part="header">
|
|
50
|
+
<h2 class="title" part="title">${this.title}</h2>
|
|
51
|
+
${this.subtitle ? html`<p class="subtitle" part="subtitle">${this.subtitle}</p>` : nothing}
|
|
52
|
+
</div>
|
|
53
|
+
<div class="grid" part="grid">${this.items.map((item) => this.renderItem(item))}</div>
|
|
54
|
+
</div>
|
|
55
|
+
`;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
Testimonials.styles = css`
|
|
59
|
+
${controlBaseStyles}
|
|
60
|
+
|
|
61
|
+
:host {
|
|
62
|
+
display: block;
|
|
63
|
+
box-sizing: border-box;
|
|
64
|
+
padding: var(--st-space-48) var(--st-space-24);
|
|
65
|
+
background-color: var(--st-color-subtle);
|
|
66
|
+
${rootFontFamilyStyles}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
:host([inverted]) {
|
|
70
|
+
background-color: var(--st-color-text-strong);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.container {
|
|
74
|
+
max-width: var(--st-cms-container-max);
|
|
75
|
+
margin: 0 auto;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.header {
|
|
79
|
+
${sectionHeaderStyles}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.title {
|
|
83
|
+
${sectionTitleStyles}
|
|
84
|
+
margin-bottom: var(--st-space-16);
|
|
85
|
+
letter-spacing: -0.02em;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.subtitle {
|
|
89
|
+
${sectionSubtitleStyles}
|
|
90
|
+
margin: 0 auto;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
${invertedSectionTextStyles}
|
|
94
|
+
|
|
95
|
+
.grid {
|
|
96
|
+
display: grid;
|
|
97
|
+
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
|
98
|
+
gap: var(--st-space-32);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.card {
|
|
102
|
+
${cardShellStyles}
|
|
103
|
+
display: flex;
|
|
104
|
+
flex-direction: column;
|
|
105
|
+
gap: var(--st-space-24);
|
|
106
|
+
margin: 0;
|
|
107
|
+
padding: var(--st-space-24);
|
|
108
|
+
box-shadow: 0 1px 3px var(--st-shadow-color-sm);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.stars {
|
|
112
|
+
display: flex;
|
|
113
|
+
gap: var(--st-space-4);
|
|
114
|
+
color: var(--st-favorite-accent);
|
|
115
|
+
font-size: var(--st-size-20);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.quote {
|
|
119
|
+
font-size: var(--st-text-md);
|
|
120
|
+
line-height: 1.6;
|
|
121
|
+
color: var(--st-color-text);
|
|
122
|
+
font-style: italic;
|
|
123
|
+
margin: 0;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.author {
|
|
127
|
+
display: flex;
|
|
128
|
+
align-items: center;
|
|
129
|
+
gap: var(--st-space-12);
|
|
130
|
+
margin-top: auto;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.avatar {
|
|
134
|
+
width: var(--st-space-48);
|
|
135
|
+
height: var(--st-space-48);
|
|
136
|
+
border-radius: var(--st-radius-circle);
|
|
137
|
+
object-fit: cover;
|
|
138
|
+
background-color: var(--st-color-divider);
|
|
139
|
+
flex-shrink: 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.avatar-placeholder {
|
|
143
|
+
display: flex;
|
|
144
|
+
align-items: center;
|
|
145
|
+
justify-content: center;
|
|
146
|
+
color: var(--st-color-text-muted);
|
|
147
|
+
font-weight: var(--st-font-weight-semibold);
|
|
148
|
+
font-size: var(--st-text-xl);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.author-info {
|
|
152
|
+
display: flex;
|
|
153
|
+
flex-direction: column;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.name {
|
|
157
|
+
font-weight: var(--st-font-weight-semibold);
|
|
158
|
+
color: var(--st-color-text-strong);
|
|
159
|
+
font-size: var(--st-text-xl);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.role {
|
|
163
|
+
font-size: var(--st-text-sm);
|
|
164
|
+
color: var(--st-color-text-faint);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
@media (max-width: 768px) {
|
|
168
|
+
:host {
|
|
169
|
+
padding: var(--st-space-40) var(--st-space-20);
|
|
170
|
+
}
|
|
171
|
+
.grid {
|
|
172
|
+
grid-template-columns: 1fr;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
`;
|
|
176
|
+
__decorateClass([
|
|
177
|
+
property({ type: String })
|
|
178
|
+
], Testimonials.prototype, "title", 2);
|
|
179
|
+
__decorateClass([
|
|
180
|
+
property({ type: String })
|
|
181
|
+
], Testimonials.prototype, "subtitle", 2);
|
|
182
|
+
__decorateClass([
|
|
183
|
+
property({ attribute: false })
|
|
184
|
+
], Testimonials.prototype, "items", 2);
|
|
185
|
+
__decorateClass([
|
|
186
|
+
property({ type: Boolean, reflect: true })
|
|
187
|
+
], Testimonials.prototype, "inverted", 2);
|
|
188
|
+
Testimonials = __decorateClass([
|
|
189
|
+
customElement("st-testimonials")
|
|
190
|
+
], Testimonials);
|
|
191
|
+
|
|
192
|
+
export {
|
|
193
|
+
Testimonials
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=chunk-WCO7JAIK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testimonials/Testimonials.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\nimport 'iconify-icon';\r\n\r\nimport { cardShellStyles, controlBaseStyles, rootFontFamilyStyles } from '../shared/styles';\r\nimport { sectionSubtitleStyles, sectionTitleStyles, invertedSectionTextStyles, sectionHeaderStyles } from '../shared/section-styles';\r\n\r\nexport interface TestimonialItem {\r\n id?: string;\r\n name: string;\r\n role: string;\r\n company?: string;\r\n imageSrc?: string;\r\n quote: string;\r\n /** Number of stars, default 5. */\r\n rating?: number;\r\n}\r\n\r\n/** Section heading plus a grid of quote cards with star rating and author. Port of React `Testimonials`. */\r\n@customElement('st-testimonials')\r\nexport class Testimonials extends LitElement {\r\n static styles = css`\r\n ${controlBaseStyles}\r\n\r\n :host {\r\n display: block;\r\n box-sizing: border-box;\r\n padding: var(--st-space-48) var(--st-space-24);\r\n background-color: var(--st-color-subtle);\r\n ${rootFontFamilyStyles}\r\n }\r\n\r\n :host([inverted]) {\r\n background-color: var(--st-color-text-strong);\r\n }\r\n\r\n .container {\r\n max-width: var(--st-cms-container-max);\r\n margin: 0 auto;\r\n }\r\n\r\n .header {\r\n ${sectionHeaderStyles}\r\n }\r\n\r\n .title {\r\n ${sectionTitleStyles}\r\n margin-bottom: var(--st-space-16);\r\n letter-spacing: -0.02em;\r\n }\r\n\r\n .subtitle {\r\n ${sectionSubtitleStyles}\r\n margin: 0 auto;\r\n }\r\n\r\n ${invertedSectionTextStyles}\r\n\r\n .grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\r\n gap: var(--st-space-32);\r\n }\r\n\r\n .card {\r\n ${cardShellStyles}\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--st-space-24);\r\n margin: 0;\r\n padding: var(--st-space-24);\r\n box-shadow: 0 1px 3px var(--st-shadow-color-sm);\r\n }\r\n\r\n .stars {\r\n display: flex;\r\n gap: var(--st-space-4);\r\n color: var(--st-favorite-accent);\r\n font-size: var(--st-size-20);\r\n }\r\n\r\n .quote {\r\n font-size: var(--st-text-md);\r\n line-height: 1.6;\r\n color: var(--st-color-text);\r\n font-style: italic;\r\n margin: 0;\r\n }\r\n\r\n .author {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--st-space-12);\r\n margin-top: auto;\r\n }\r\n\r\n .avatar {\r\n width: var(--st-space-48);\r\n height: var(--st-space-48);\r\n border-radius: var(--st-radius-circle);\r\n object-fit: cover;\r\n background-color: var(--st-color-divider);\r\n flex-shrink: 0;\r\n }\r\n\r\n .avatar-placeholder {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: var(--st-color-text-muted);\r\n font-weight: var(--st-font-weight-semibold);\r\n font-size: var(--st-text-xl);\r\n }\r\n\r\n .author-info {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .name {\r\n font-weight: var(--st-font-weight-semibold);\r\n color: var(--st-color-text-strong);\r\n font-size: var(--st-text-xl);\r\n }\r\n\r\n .role {\r\n font-size: var(--st-text-sm);\r\n color: var(--st-color-text-faint);\r\n }\r\n\r\n @media (max-width: 768px) {\r\n :host {\r\n padding: var(--st-space-40) var(--st-space-20);\r\n }\r\n .grid {\r\n grid-template-columns: 1fr;\r\n }\r\n }\r\n `;\r\n\r\n @property({ type: String })\r\n title = '';\r\n\r\n @property({ type: String })\r\n subtitle = '';\r\n\r\n @property({ attribute: false })\r\n items: TestimonialItem[] = [];\r\n\r\n @property({ type: Boolean, reflect: true })\r\n inverted = false;\r\n\r\n private renderItem(item: TestimonialItem) {\r\n const rating = item.rating || 5;\r\n return html`\r\n <figure class=\"card\" part=\"card\">\r\n <div class=\"stars\" part=\"stars\" role=\"img\" aria-label=\"${rating} / 5\">\r\n ${Array.from({ length: rating }, () => html`<iconify-icon icon=\"mdi:star\"></iconify-icon>`)}\r\n </div>\r\n <blockquote class=\"quote\" part=\"quote\">\"${item.quote}\"</blockquote>\r\n <figcaption class=\"author\" part=\"author\">\r\n ${item.imageSrc\r\n ? html`<img class=\"avatar\" part=\"avatar\" src=${item.imageSrc} alt=${item.name} />`\r\n : html`<div class=\"avatar avatar-placeholder\" part=\"avatar\">${item.name.charAt(0)}</div>`}\r\n <span class=\"author-info\">\r\n <span class=\"name\" part=\"name\">${item.name}</span>\r\n <span class=\"role\" part=\"role\">${item.role}${item.company ? ` at ${item.company}` : ''}</span>\r\n </span>\r\n </figcaption>\r\n </figure>\r\n `;\r\n }\r\n\r\n render() {\r\n return html`\r\n <div class=\"container\" part=\"container\">\r\n <div class=\"header\" part=\"header\">\r\n <h2 class=\"title\" part=\"title\">${this.title}</h2>\r\n ${this.subtitle ? html`<p class=\"subtitle\" part=\"subtitle\">${this.subtitle}</p>` : nothing}\r\n </div>\r\n <div class=\"grid\" part=\"grid\">${this.items.map((item) => this.renderItem(item))}</div>\r\n </div>\r\n `;\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,YAAY,KAAK,MAAM,eAAe;AAC/C,SAAS,eAAe,gBAAgB;AACxC,OAAO;AAkBA,IAAM,eAAN,cAA2B,WAAW;AAAA,EAAtC;AAAA;AAyHL,iBAAQ;AAGR,oBAAW;AAGX,iBAA2B,CAAC;AAG5B,oBAAW;AAAA;AAAA,EAEH,WAAW,MAAuB;AACxC,UAAM,SAAS,KAAK,UAAU;AAC9B,WAAO;AAAA;AAAA,iEAEsD,MAAM;AAAA,YAC3D,MAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,MAAM,mDAAmD,CAAC;AAAA;AAAA,kDAEnD,KAAK,KAAK;AAAA;AAAA,YAEhD,KAAK,WACH,6CAA6C,KAAK,QAAQ,QAAQ,KAAK,IAAI,QAC3E,4DAA4D,KAAK,KAAK,OAAO,CAAC,CAAC,QAAQ;AAAA;AAAA,6CAExD,KAAK,IAAI;AAAA,6CACT,KAAK,IAAI,GAAG,KAAK,UAAU,OAAO,KAAK,OAAO,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhG;AAAA,EAEA,SAAS;AACP,WAAO;AAAA;AAAA;AAAA,2CAGgC,KAAK,KAAK;AAAA,YACzC,KAAK,WAAW,2CAA2C,KAAK,QAAQ,SAAS,OAAO;AAAA;AAAA,wCAE5D,KAAK,MAAM,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC;AAAA;AAAA;AAAA,EAGrF;AACF;AApKa,aACJ,SAAS;AAAA,MACZ,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOf,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAapB,mBAAmB;AAAA;AAAA;AAAA;AAAA,QAInB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMlB,qBAAqB;AAAA;AAAA;AAAA;AAAA,MAIvB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASvB,eAAe;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4ErB;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAxHf,aAyHX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GA3Hf,aA4HX;AAGA;AAAA,EADC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GA9HnB,aA+HX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAjI/B,aAkIX;AAlIW,eAAN;AAAA,EADN,cAAc,iBAAiB;AAAA,GACnB;","names":[]}
|