@sankhyatronics/sankhya-cms 0.2.0 → 0.3.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.
Files changed (209) hide show
  1. package/custom-elements.json +10968 -3080
  2. package/dist/attention-panel/index.js +2 -2
  3. package/dist/bar-chart/index.js +2 -2
  4. package/dist/bento-grid/index.d.ts +25 -0
  5. package/dist/bento-grid/index.js +4 -4
  6. package/dist/booking/index.d.ts +309 -0
  7. package/dist/booking/index.js +20 -0
  8. package/dist/booking/index.js.map +1 -0
  9. package/dist/card/index.js +2 -2
  10. package/dist/carousel/index.d.ts +20 -6
  11. package/dist/carousel/index.js +3 -3
  12. package/dist/chip/index.js +2 -2
  13. package/dist/{chunk-OLA35A2O.js → chunk-2GTR37PU.js} +2 -2
  14. package/dist/{chunk-7NIWQWTA.js → chunk-2HMOX253.js} +128 -25
  15. package/dist/chunk-2HMOX253.js.map +1 -0
  16. package/dist/{chunk-DH53HZPB.js → chunk-37KFBKPD.js} +32 -4
  17. package/dist/chunk-37KFBKPD.js.map +1 -0
  18. package/dist/{chunk-EE6PAN3B.js → chunk-4XPKKYVZ.js} +23 -15
  19. package/dist/chunk-4XPKKYVZ.js.map +1 -0
  20. package/dist/chunk-535QAZ6A.js +236 -0
  21. package/dist/chunk-535QAZ6A.js.map +1 -0
  22. package/dist/{chunk-AKJQ345O.js → chunk-5AWGZQWU.js} +2 -2
  23. package/dist/chunk-6OZKZG5J.js +300 -0
  24. package/dist/chunk-6OZKZG5J.js.map +1 -0
  25. package/dist/chunk-AYNT7G3J.js +805 -0
  26. package/dist/chunk-AYNT7G3J.js.map +1 -0
  27. package/dist/chunk-BEWX3E6P.js +32 -0
  28. package/dist/chunk-BEWX3E6P.js.map +1 -0
  29. package/dist/chunk-CZUGPKXV.js +275 -0
  30. package/dist/chunk-CZUGPKXV.js.map +1 -0
  31. package/dist/{chunk-2DXHPEB5.js → chunk-DJFWZOZM.js} +107 -11
  32. package/dist/chunk-DJFWZOZM.js.map +1 -0
  33. package/dist/chunk-DPANTC3O.js +1714 -0
  34. package/dist/chunk-DPANTC3O.js.map +1 -0
  35. package/dist/chunk-EKZFFY45.js +426 -0
  36. package/dist/chunk-EKZFFY45.js.map +1 -0
  37. package/dist/chunk-ER7MCPDV.js +7 -0
  38. package/dist/chunk-ER7MCPDV.js.map +1 -0
  39. package/dist/chunk-EW2RK5Y6.js +383 -0
  40. package/dist/chunk-EW2RK5Y6.js.map +1 -0
  41. package/dist/{chunk-BLQV2YMO.js → chunk-EZOKT7NJ.js} +2 -2
  42. package/dist/chunk-FF2LWEF3.js +386 -0
  43. package/dist/chunk-FF2LWEF3.js.map +1 -0
  44. package/dist/chunk-FOUK3NHR.js +7 -0
  45. package/dist/chunk-FOUK3NHR.js.map +1 -0
  46. package/dist/{chunk-O4FCRKDX.js → chunk-GB4NGCZI.js} +6 -3
  47. package/dist/chunk-GB4NGCZI.js.map +1 -0
  48. package/dist/{chunk-5F5PTVWR.js → chunk-GOFSMD6W.js} +9 -10
  49. package/dist/chunk-GOFSMD6W.js.map +1 -0
  50. package/dist/{chunk-6D6ROU7X.js → chunk-IGMVF3KK.js} +2 -2
  51. package/dist/{chunk-INMSEYT6.js → chunk-IVPVYVWG.js} +2 -2
  52. package/dist/{chunk-ZRC5BVDX.js → chunk-JURCF4OD.js} +174 -12
  53. package/dist/chunk-JURCF4OD.js.map +1 -0
  54. package/dist/{chunk-FZ36KL73.js → chunk-KZ7PMFWS.js} +11 -1
  55. package/dist/chunk-KZ7PMFWS.js.map +1 -0
  56. package/dist/{chunk-EMCQBT3S.js → chunk-LO6TZBGD.js} +129 -35
  57. package/dist/chunk-LO6TZBGD.js.map +1 -0
  58. package/dist/chunk-MFRGAT6D.js +860 -0
  59. package/dist/chunk-MFRGAT6D.js.map +1 -0
  60. package/dist/chunk-MIBVQXRU.js +1098 -0
  61. package/dist/chunk-MIBVQXRU.js.map +1 -0
  62. package/dist/{chunk-35TX3AOA.js → chunk-NABSRUXG.js} +2 -2
  63. package/dist/{chunk-2FJDNJ7R.js → chunk-NXKDZWS7.js} +44 -6
  64. package/dist/chunk-NXKDZWS7.js.map +1 -0
  65. package/dist/{chunk-KMU6ABQF.js → chunk-NXUS2CH7.js} +14 -1
  66. package/dist/chunk-NXUS2CH7.js.map +1 -0
  67. package/dist/{chunk-GJO3RGOB.js → chunk-OCPGOLVF.js} +56 -11
  68. package/dist/chunk-OCPGOLVF.js.map +1 -0
  69. package/dist/chunk-OEOE6IFY.js +628 -0
  70. package/dist/chunk-OEOE6IFY.js.map +1 -0
  71. package/dist/{chunk-OELI3IWC.js → chunk-PV6OCXXN.js} +2 -2
  72. package/dist/{chunk-5C6C6K5U.js → chunk-Q66CJO3P.js} +200 -12
  73. package/dist/chunk-Q66CJO3P.js.map +1 -0
  74. package/dist/{chunk-MG2VTZA4.js → chunk-QS3ANOWN.js} +2 -2
  75. package/dist/{chunk-3OEEOBHB.js → chunk-QSJ543V2.js} +2 -2
  76. package/dist/{chunk-FML6AG2V.js → chunk-RANC3OI6.js} +2 -2
  77. package/dist/chunk-T4BIN37Q.js +32 -0
  78. package/dist/chunk-T4BIN37Q.js.map +1 -0
  79. package/dist/{chunk-YVTFQHVY.js → chunk-TEAZZPDQ.js} +2 -2
  80. package/dist/chunk-TJK55CJ2.js +49 -0
  81. package/dist/chunk-TJK55CJ2.js.map +1 -0
  82. package/dist/chunk-UKIVLF7S.js +32 -0
  83. package/dist/chunk-UKIVLF7S.js.map +1 -0
  84. package/dist/chunk-V4R7PYP5.js +905 -0
  85. package/dist/chunk-V4R7PYP5.js.map +1 -0
  86. package/dist/{chunk-AG2COC64.js → chunk-VVYQ2DDS.js} +2 -2
  87. package/dist/chunk-WAMOAAMN.js +16 -0
  88. package/dist/chunk-WAMOAAMN.js.map +1 -0
  89. package/dist/chunk-WAYHHL4J.js +1234 -0
  90. package/dist/chunk-WAYHHL4J.js.map +1 -0
  91. package/dist/{chunk-PHEGSCOM.js → chunk-WH6HE6SY.js} +10 -4
  92. package/dist/chunk-WH6HE6SY.js.map +1 -0
  93. package/dist/{chunk-5MY6OWMK.js → chunk-XP6DI3VY.js} +59 -4
  94. package/dist/chunk-XP6DI3VY.js.map +1 -0
  95. package/dist/{chunk-QLA4BH2B.js → chunk-XS6LNTSH.js} +73 -11
  96. package/dist/chunk-XS6LNTSH.js.map +1 -0
  97. package/dist/{chunk-WT4OATGP.js → chunk-ZKFCDVB4.js} +16 -7
  98. package/dist/chunk-ZKFCDVB4.js.map +1 -0
  99. package/dist/cms-theme.css +22 -0
  100. package/dist/contact-form/index.d.ts +220 -0
  101. package/dist/contact-form/index.js +16 -0
  102. package/dist/contact-form/index.js.map +1 -0
  103. package/dist/content-block/index.d.ts +39 -3
  104. package/dist/content-block/index.js +8 -5
  105. package/dist/cookie-consent/index.d.ts +60 -12
  106. package/dist/cookie-consent/index.js +3 -2
  107. package/dist/date-tile/index.js +2 -2
  108. package/dist/dropdown/index.d.ts +22 -1
  109. package/dist/dropdown/index.js +4 -2
  110. package/dist/feature-split/index.d.ts +6 -1
  111. package/dist/feature-split/index.js +5 -5
  112. package/dist/features-section/index.d.ts +49 -5
  113. package/dist/features-section/index.js +6 -6
  114. package/dist/flow/index.js +2 -2
  115. package/dist/footer/index.d.ts +13 -0
  116. package/dist/footer/index.js +2 -2
  117. package/dist/header/index.d.ts +127 -1
  118. package/dist/header/index.js +3 -2
  119. package/dist/hero/index.d.ts +75 -6
  120. package/dist/hero/index.js +6 -3
  121. package/dist/icon-button/index.d.ts +5 -3
  122. package/dist/icon-button/index.js +2 -2
  123. package/dist/index.d.ts +9 -3
  124. package/dist/index.js +118 -57
  125. package/dist/items-accordion/index.d.ts +5 -1
  126. package/dist/items-accordion/index.js +4 -4
  127. package/dist/kpi-card/index.js +2 -2
  128. package/dist/markdown/index.d.ts +18 -0
  129. package/dist/markdown/index.js +3 -3
  130. package/dist/mega-menu/index.d.ts +95 -7
  131. package/dist/mega-menu/index.js +7 -2
  132. package/dist/menu-grid/index.js +2 -2
  133. package/dist/menu-grid-item/index.js +2 -2
  134. package/dist/menu-item/index.d.ts +6 -0
  135. package/dist/menu-item/index.js +3 -2
  136. package/dist/plan-cards/index.d.ts +69 -0
  137. package/dist/plan-cards/index.js +13 -0
  138. package/dist/plan-cards/index.js.map +1 -0
  139. package/dist/product-nav/index.d.ts +127 -0
  140. package/dist/product-nav/index.js +11 -0
  141. package/dist/product-nav/index.js.map +1 -0
  142. package/dist/promo-banner/index.d.ts +34 -7
  143. package/dist/promo-banner/index.js +6 -3
  144. package/dist/quote-dialog/index.d.ts +174 -0
  145. package/dist/quote-dialog/index.js +22 -0
  146. package/dist/quote-dialog/index.js.map +1 -0
  147. package/dist/schema/index.d.ts +8 -0
  148. package/dist/schema/index.js +6 -0
  149. package/dist/schema/index.js.map +1 -1
  150. package/dist/screenshot-tour/index.d.ts +54 -0
  151. package/dist/screenshot-tour/index.js +9 -0
  152. package/dist/screenshot-tour/index.js.map +1 -0
  153. package/dist/section/index.js +3 -3
  154. package/dist/segmented-control/index.js +2 -2
  155. package/dist/select/index.js +2 -2
  156. package/dist/shared/styles.d.ts +7 -1
  157. package/dist/shared/styles.js +3 -1
  158. package/dist/stats/index.js +2 -2
  159. package/dist/steps/index.d.ts +12 -0
  160. package/dist/steps/index.js +4 -3
  161. package/dist/tag-strip/index.d.ts +7 -0
  162. package/dist/tag-strip/index.js +2 -2
  163. package/dist/testimonials/index.d.ts +9 -1
  164. package/dist/testimonials/index.js +3 -3
  165. package/dist/tooltip/index.js +2 -2
  166. package/package.json +26 -2
  167. package/dist/chunk-2DXHPEB5.js.map +0 -1
  168. package/dist/chunk-2FJDNJ7R.js.map +0 -1
  169. package/dist/chunk-4AFOKKSU.js +0 -158
  170. package/dist/chunk-4AFOKKSU.js.map +0 -1
  171. package/dist/chunk-5C6C6K5U.js.map +0 -1
  172. package/dist/chunk-5F5PTVWR.js.map +0 -1
  173. package/dist/chunk-5MY6OWMK.js.map +0 -1
  174. package/dist/chunk-7NIWQWTA.js.map +0 -1
  175. package/dist/chunk-DH53HZPB.js.map +0 -1
  176. package/dist/chunk-EE6PAN3B.js.map +0 -1
  177. package/dist/chunk-EMCQBT3S.js.map +0 -1
  178. package/dist/chunk-FZ36KL73.js.map +0 -1
  179. package/dist/chunk-GJO3RGOB.js.map +0 -1
  180. package/dist/chunk-HMUZON6I.js +0 -202
  181. package/dist/chunk-HMUZON6I.js.map +0 -1
  182. package/dist/chunk-J6EO4R73.js +0 -633
  183. package/dist/chunk-J6EO4R73.js.map +0 -1
  184. package/dist/chunk-KMU6ABQF.js.map +0 -1
  185. package/dist/chunk-MSSH3HFK.js +0 -205
  186. package/dist/chunk-MSSH3HFK.js.map +0 -1
  187. package/dist/chunk-O4FCRKDX.js.map +0 -1
  188. package/dist/chunk-PHEGSCOM.js.map +0 -1
  189. package/dist/chunk-QLA4BH2B.js.map +0 -1
  190. package/dist/chunk-SQ3OZO32.js +0 -486
  191. package/dist/chunk-SQ3OZO32.js.map +0 -1
  192. package/dist/chunk-UAIUBPDN.js +0 -11
  193. package/dist/chunk-UAIUBPDN.js.map +0 -1
  194. package/dist/chunk-WT4OATGP.js.map +0 -1
  195. package/dist/chunk-XUGEXERO.js +0 -708
  196. package/dist/chunk-XUGEXERO.js.map +0 -1
  197. package/dist/chunk-ZRC5BVDX.js.map +0 -1
  198. /package/dist/{chunk-OLA35A2O.js.map → chunk-2GTR37PU.js.map} +0 -0
  199. /package/dist/{chunk-AKJQ345O.js.map → chunk-5AWGZQWU.js.map} +0 -0
  200. /package/dist/{chunk-BLQV2YMO.js.map → chunk-EZOKT7NJ.js.map} +0 -0
  201. /package/dist/{chunk-6D6ROU7X.js.map → chunk-IGMVF3KK.js.map} +0 -0
  202. /package/dist/{chunk-INMSEYT6.js.map → chunk-IVPVYVWG.js.map} +0 -0
  203. /package/dist/{chunk-35TX3AOA.js.map → chunk-NABSRUXG.js.map} +0 -0
  204. /package/dist/{chunk-OELI3IWC.js.map → chunk-PV6OCXXN.js.map} +0 -0
  205. /package/dist/{chunk-MG2VTZA4.js.map → chunk-QS3ANOWN.js.map} +0 -0
  206. /package/dist/{chunk-3OEEOBHB.js.map → chunk-QSJ543V2.js.map} +0 -0
  207. /package/dist/{chunk-FML6AG2V.js.map → chunk-RANC3OI6.js.map} +0 -0
  208. /package/dist/{chunk-YVTFQHVY.js.map → chunk-TEAZZPDQ.js.map} +0 -0
  209. /package/dist/{chunk-AG2COC64.js.map → chunk-VVYQ2DDS.js.map} +0 -0
@@ -1,14 +1,15 @@
1
1
  import {
2
2
  cardDescriptionStyles,
3
3
  cardTitleStyles,
4
+ sectionEyebrowStyles,
4
5
  sectionHeaderStyles,
5
6
  sectionSubtitleStyles,
6
7
  sectionTitleStyles
7
- } from "./chunk-FZ36KL73.js";
8
+ } from "./chunk-KZ7PMFWS.js";
8
9
  import {
9
10
  controlBaseStyles,
10
11
  fontFamilyStyles
11
- } from "./chunk-KMU6ABQF.js";
12
+ } from "./chunk-NXUS2CH7.js";
12
13
  import {
13
14
  __decorateClass
14
15
  } from "./chunk-EUXUH3YW.js";
@@ -30,30 +31,36 @@ var FeatureItem = class extends LitElement {
30
31
  this.href = "";
31
32
  this.actionLabel = "Learn more";
32
33
  this.inverted = false;
34
+ this.variant = "default";
33
35
  }
34
- render() {
36
+ renderBody() {
35
37
  const external = this.href.startsWith("http");
38
+ const panel = this.variant === "panel";
36
39
  return html`
37
- <st-card hoverable elevation="sm" ?inverted=${this.inverted} part="card">
38
- <div class="content" part="content">
39
- ${this.icon ? html`<div class="icon" part="icon"><iconify-icon icon=${this.icon}></iconify-icon></div>` : nothing}
40
- <h3 class="title" part="title">${this.title}</h3>
41
- <st-markdown class="description" part="description" .content=${this.description}></st-markdown>
42
- ${this.href ? html`
43
- <a
44
- class="link"
45
- part="link"
46
- href=${this.href}
47
- target=${external ? "_blank" : "_self"}
48
- rel=${external ? "noopener noreferrer" : nothing}
49
- >
50
- ${this.actionLabel} <span>&rarr;</span>
51
- </a>
52
- ` : nothing}
53
- </div>
54
- </st-card>
40
+ <div class="content" part="content">
41
+ ${this.icon && !panel ? html`<div class="icon" part="icon"><iconify-icon icon=${this.icon}></iconify-icon></div>` : nothing}
42
+ <h3 class="title" part="title">${this.title}</h3>
43
+ <st-markdown class="description" part="description" .content=${this.description}></st-markdown>
44
+ ${this.href ? html`
45
+ <a
46
+ class="link"
47
+ part="link"
48
+ href=${this.href}
49
+ target=${external ? "_blank" : "_self"}
50
+ rel=${external ? "noopener noreferrer" : nothing}
51
+ >
52
+ ${this.actionLabel} <span>&rarr;</span>
53
+ </a>
54
+ ` : nothing}
55
+ </div>
55
56
  `;
56
57
  }
58
+ render() {
59
+ if (this.variant === "panel") {
60
+ return html`<div class="panel" part="card">${this.renderBody()}</div>`;
61
+ }
62
+ return html`<st-card hoverable elevation="sm" ?inverted=${this.inverted} part="card">${this.renderBody()}</st-card>`;
63
+ }
57
64
  };
58
65
  FeatureItem.styles = css`
59
66
  ${controlBaseStyles}
@@ -103,9 +110,11 @@ FeatureItem.styles = css`
103
110
  margin: 0;
104
111
  }
105
112
 
113
+ /* Inverted tiles sit on the dark band: explicit light text, 17:1 on the default navy, instead of
114
+ whatever the card's colour happens to be. */
106
115
  :host([inverted]) .title,
107
116
  :host([inverted]) .description {
108
- color: inherit;
117
+ color: var(--st-color-on-solid);
109
118
  }
110
119
 
111
120
  .link {
@@ -130,6 +139,46 @@ FeatureItem.styles = css`
130
139
  color: inherit;
131
140
  }
132
141
 
142
+ /* variant="panel": a compact card without the icon tile. */
143
+ .panel {
144
+ box-sizing: border-box;
145
+ height: 100%;
146
+ padding: var(--st-feature-item-panel-padding, 20px);
147
+ border: 1px solid var(--st-feature-item-panel-border, var(--st-color-border));
148
+ border-radius: var(--st-feature-item-panel-radius, 12px);
149
+ background: var(--st-feature-item-panel-bg, var(--st-color-surface));
150
+ }
151
+
152
+ :host([variant='panel']) .panel .content {
153
+ gap: var(--st-feature-item-panel-gap, var(--st-space-8));
154
+ }
155
+
156
+ :host([variant='panel']) .title {
157
+ font-size: var(--st-feature-item-panel-title-size, 16px);
158
+ font-weight: var(--st-feature-item-panel-title-weight, var(--st-font-weight-bold));
159
+ line-height: 1.35;
160
+ color: var(--st-feature-item-panel-title-color, var(--st-color-text-strong));
161
+ }
162
+
163
+ :host([variant='panel']) .description {
164
+ font-size: 14px;
165
+ color: var(--st-feature-item-panel-desc-color, var(--st-color-text-muted));
166
+ }
167
+
168
+ /* Panels on the dark band: a lighter navy surface, a hairline border, light text (AA on navy-2). */
169
+ :host([variant='panel'][inverted]) .panel {
170
+ background: var(--st-cms-navy-2);
171
+ border-color: var(--st-cms-navy-2-border);
172
+ }
173
+
174
+ :host([variant='panel'][inverted]) .title {
175
+ color: var(--st-cms-on-dark);
176
+ }
177
+
178
+ :host([variant='panel'][inverted]) .description {
179
+ color: var(--st-cms-on-navy-muted);
180
+ }
181
+
133
182
  @media (prefers-reduced-motion: reduce) {
134
183
  .link {
135
184
  transition: none;
@@ -154,6 +203,9 @@ __decorateClass([
154
203
  __decorateClass([
155
204
  property({ type: Boolean, reflect: true })
156
205
  ], FeatureItem.prototype, "inverted", 2);
206
+ __decorateClass([
207
+ property({ type: String, reflect: true })
208
+ ], FeatureItem.prototype, "variant", 2);
157
209
  FeatureItem = __decorateClass([
158
210
  customElement("st-feature-item")
159
211
  ], FeatureItem);
@@ -162,11 +214,14 @@ FeatureItem = __decorateClass([
162
214
  var FeaturesSection = class extends LitElement2 {
163
215
  constructor() {
164
216
  super(...arguments);
217
+ this.eyebrow = "";
165
218
  this.title = "";
166
219
  this.subtitle = "";
167
220
  this.actionLabel = "Learn more";
168
221
  this.columns = 0;
222
+ this.align = "start";
169
223
  this.inverted = false;
224
+ this.variant = "default";
170
225
  this.items = [];
171
226
  }
172
227
  render() {
@@ -174,19 +229,22 @@ var FeaturesSection = class extends LitElement2 {
174
229
  return html2`
175
230
  <section class="container" part="container">
176
231
  <div class="header" part="header">
177
- <div class="title" part="title">${this.title}</div>
232
+ ${this.eyebrow ? html2`<p class="eyebrow" part="eyebrow">${this.eyebrow}</p>` : nothing2}
233
+ ${this.title ? html2`<h2 class="title" part="title">${this.title}</h2>` : nothing2}
178
234
  ${this.subtitle ? html2`<div class="subtitle" part="subtitle">${this.subtitle}</div>` : nothing2}
179
235
  </div>
180
- <div class="grid" part="grid" style=${gridStyle}>
236
+ <div class="grid ${this.align === "center" ? "center" : ""}" part="grid" style=${gridStyle}>
181
237
  <slot></slot>
182
238
  ${this.items.map(
183
239
  (item) => html2`
184
240
  <st-feature-item
241
+ class=${item.span === "full" ? "full" : ""}
185
242
  .icon=${item.icon ?? ""}
186
243
  .title=${item.title}
187
244
  .description=${item.description}
188
245
  .href=${item.href ?? ""}
189
246
  .actionLabel=${this.actionLabel}
247
+ .variant=${this.variant}
190
248
  ?inverted=${this.inverted}
191
249
  ></st-feature-item>
192
250
  `
@@ -221,6 +279,10 @@ FeaturesSection.styles = css2`
221
279
  ${sectionHeaderStyles}
222
280
  }
223
281
 
282
+ .eyebrow {
283
+ ${sectionEyebrowStyles}
284
+ }
285
+
224
286
  .title {
225
287
  ${sectionTitleStyles}
226
288
  margin: 0;
@@ -231,6 +293,10 @@ FeaturesSection.styles = css2`
231
293
  margin: 0 auto;
232
294
  }
233
295
 
296
+ :host([inverted]) .eyebrow {
297
+ color: var(--st-cms-highlight);
298
+ }
299
+
234
300
  :host([inverted]) .title,
235
301
  :host([inverted]) .subtitle {
236
302
  color: var(--st-color-on-solid);
@@ -242,6 +308,29 @@ FeaturesSection.styles = css2`
242
308
  gap: var(--st-space-32);
243
309
  }
244
310
 
311
+ /* align="center": a wrapping row, so an incomplete last row is centred. Each tile takes an equal
312
+ share of the width less the gaps. */
313
+ .grid.center {
314
+ display: flex;
315
+ flex-wrap: wrap;
316
+ justify-content: center;
317
+ }
318
+
319
+ .grid.center > st-feature-item,
320
+ .grid.center ::slotted(*) {
321
+ flex: 0 0 calc((100% - (var(--features-columns, 2) - 1) * var(--st-space-32)) / var(--features-columns, 2));
322
+ min-width: 0;
323
+ }
324
+
325
+ /* span: "full" on an items tile: the whole row (a flex row when align="center"). */
326
+ .grid > st-feature-item.full {
327
+ grid-column: 1 / -1;
328
+ }
329
+
330
+ .grid.center > st-feature-item.full {
331
+ flex-basis: 100%;
332
+ }
333
+
245
334
  @media (max-width: 768px) {
246
335
  :host {
247
336
  padding: var(--st-features-section-padding, var(--st-space-48) var(--st-space-16)) !important;
@@ -250,8 +339,16 @@ FeaturesSection.styles = css2`
250
339
  .grid {
251
340
  grid-template-columns: 1fr;
252
341
  }
342
+
343
+ .grid.center > st-feature-item,
344
+ .grid.center ::slotted(*) {
345
+ flex-basis: 100%;
346
+ }
253
347
  }
254
348
  `;
349
+ __decorateClass([
350
+ property2({ type: String })
351
+ ], FeaturesSection.prototype, "eyebrow", 2);
255
352
  __decorateClass([
256
353
  property2({ type: String })
257
354
  ], FeaturesSection.prototype, "title", 2);
@@ -264,9 +361,15 @@ __decorateClass([
264
361
  __decorateClass([
265
362
  property2({ type: Number })
266
363
  ], FeaturesSection.prototype, "columns", 2);
364
+ __decorateClass([
365
+ property2({ type: String, reflect: true })
366
+ ], FeaturesSection.prototype, "align", 2);
267
367
  __decorateClass([
268
368
  property2({ type: Boolean, reflect: true })
269
369
  ], FeaturesSection.prototype, "inverted", 2);
370
+ __decorateClass([
371
+ property2({ type: String, reflect: true })
372
+ ], FeaturesSection.prototype, "variant", 2);
270
373
  __decorateClass([
271
374
  property2({ attribute: false })
272
375
  ], FeaturesSection.prototype, "items", 2);
@@ -278,4 +381,4 @@ export {
278
381
  FeatureItem,
279
382
  FeaturesSection
280
383
  };
281
- //# sourceMappingURL=chunk-7NIWQWTA.js.map
384
+ //# sourceMappingURL=chunk-2HMOX253.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/features-section/FeaturesSection.ts","../src/features-section/FeatureItem.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { controlBaseStyles, fontFamilyStyles } from '../shared/styles';\nimport { sectionEyebrowStyles, sectionSubtitleStyles, sectionTitleStyles, sectionHeaderStyles } from '../shared/section-styles';\nimport './FeatureItem';\n\n/** Data for one tile when using the `items` property (mirrors `st-feature-item`'s properties). */\nexport interface FeatureItemData {\n /** Iconify name. Without it the tile has no icon tile. */\n icon?: string;\n title: string;\n description: string;\n href?: string;\n /** `full` makes the tile span every column of the grid (a wide call-out between rows). */\n span?: 'full';\n}\n\n/**\n * A titled grid of feature tiles. Tiles come from the `items` property, from slotted\n * `st-feature-item` elements, or both (slotted first). `columns` sets the grid width (default 2;\n * one column below 768px). `inverted` is passed on to the `items` tiles; slotted tiles need their\n * own `inverted` attribute.\n *\n * The header can carry an `eyebrow` (a small uppercase label above the title). The title is a\n * real `<h2>`; each tile's title is an `<h3>`. `align=\"center\"` centres the last, incomplete row:\n * five tiles in three columns lay out as 3 + 2 centred, instead of 3 + 2 left-aligned.\n *\n * `variant=\"panel\"` renders the `items` tiles as compact panels without icon tiles (see\n * `st-feature-item`). A tile from `items` with `span: \"full\"` spans every column. Slotted tiles\n * need their own `variant` attribute.\n *\n * @cssprop --st-features-section-padding - Overrides the section's padding.\n * @csspart header - The eyebrow, title and subtitle block.\n * @csspart eyebrow - The small uppercase label above the title.\n * @csspart title - The section heading (`<h2>`).\n * @csspart subtitle - The line under the title.\n * @csspart grid - The grid holding the tiles.\n */\n@customElement('st-features-section')\nexport class FeaturesSection extends LitElement {\n static styles = css`\n ${controlBaseStyles}\n\n :host {\n display: block;\n ${fontFamilyStyles}\n /* !important: a page-level reset (e.g. Tailwind Preflight) otherwise zeroes a shadow host's\n padding; override with --st-features-section-padding instead. */\n padding: var(--st-features-section-padding, var(--st-cms-section-padding) var(--st-space-24)) !important;\n background: var(--st-color-surface);\n }\n\n :host([inverted]) {\n background: var(--st-color-text-strong);\n }\n\n .container {\n max-width: var(--st-cms-container-max);\n margin: 0 auto;\n }\n\n .header {\n ${sectionHeaderStyles}\n }\n\n .eyebrow {\n ${sectionEyebrowStyles}\n }\n\n .title {\n ${sectionTitleStyles}\n margin: 0;\n }\n\n .subtitle {\n ${sectionSubtitleStyles}\n margin: 0 auto;\n }\n\n :host([inverted]) .eyebrow {\n color: var(--st-cms-highlight);\n }\n\n :host([inverted]) .title,\n :host([inverted]) .subtitle {\n color: var(--st-color-on-solid);\n }\n\n .grid {\n display: grid;\n grid-template-columns: repeat(var(--features-columns, 2), 1fr);\n gap: var(--st-space-32);\n }\n\n /* align=\"center\": a wrapping row, so an incomplete last row is centred. Each tile takes an equal\n share of the width less the gaps. */\n .grid.center {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .grid.center > st-feature-item,\n .grid.center ::slotted(*) {\n flex: 0 0 calc((100% - (var(--features-columns, 2) - 1) * var(--st-space-32)) / var(--features-columns, 2));\n min-width: 0;\n }\n\n /* span: \"full\" on an items tile: the whole row (a flex row when align=\"center\"). */\n .grid > st-feature-item.full {\n grid-column: 1 / -1;\n }\n\n .grid.center > st-feature-item.full {\n flex-basis: 100%;\n }\n\n @media (max-width: 768px) {\n :host {\n padding: var(--st-features-section-padding, var(--st-space-48) var(--st-space-16)) !important;\n }\n\n .grid {\n grid-template-columns: 1fr;\n }\n\n .grid.center > st-feature-item,\n .grid.center ::slotted(*) {\n flex-basis: 100%;\n }\n }\n `;\n\n /** Small uppercase label above the title (e.g. \"Why Sankhya\"). */\n @property({ type: String })\n eyebrow = '';\n\n @property({ type: String })\n title = '';\n\n @property({ type: String })\n subtitle = '';\n\n /** Applied to every tile built from `items`. */\n @property({ type: String, attribute: 'action-label' })\n actionLabel = 'Learn more';\n\n @property({ type: Number })\n columns = 0;\n\n /** `start` (default) lays tiles out in a grid. `center` centres the last, incomplete row. */\n @property({ type: String, reflect: true })\n align: 'start' | 'center' = 'start';\n\n @property({ type: Boolean, reflect: true })\n inverted = false;\n\n /** `default` is the icon tile grid; `panel` gives the `items` tiles compact panels without icon tiles. */\n @property({ type: String, reflect: true })\n variant: 'default' | 'panel' = 'default';\n\n /** Tiles to render (property only). */\n @property({ attribute: false })\n items: FeatureItemData[] = [];\n\n render() {\n const gridStyle = this.columns ? `--features-columns: ${this.columns}` : nothing;\n return html`\n <section class=\"container\" part=\"container\">\n <div class=\"header\" part=\"header\">\n ${this.eyebrow ? html`<p class=\"eyebrow\" part=\"eyebrow\">${this.eyebrow}</p>` : nothing}\n ${this.title ? html`<h2 class=\"title\" part=\"title\">${this.title}</h2>` : nothing}\n ${this.subtitle ? html`<div class=\"subtitle\" part=\"subtitle\">${this.subtitle}</div>` : nothing}\n </div>\n <div class=\"grid ${this.align === 'center' ? 'center' : ''}\" part=\"grid\" style=${gridStyle}>\n <slot></slot>\n ${this.items.map(\n (item) => html`\n <st-feature-item\n class=${item.span === 'full' ? 'full' : ''}\n .icon=${item.icon ?? ''}\n .title=${item.title}\n .description=${item.description}\n .href=${item.href ?? ''}\n .actionLabel=${this.actionLabel}\n .variant=${this.variant}\n ?inverted=${this.inverted}\n ></st-feature-item>\n `\n )}\n </div>\n </section>\n `;\n }\n}\n","import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport 'iconify-icon';\n\nimport { controlBaseStyles, fontFamilyStyles } from '../shared/styles';\nimport { cardDescriptionStyles, cardTitleStyles } from '../shared/section-styles';\nimport '../card';\nimport '../markdown';\n\n/**\n * One feature tile for `st-features-section`: optional icon, title (`<h3>`), Markdown description\n * and an optional \"Learn more\" link, rendered on an `st-card`. `icon` is an Iconify name (e.g.\n * `mdi:rocket`). The link is a plain `<a href>`, so it works without JavaScript; the click is\n * composed, so an SPA router can intercept it (e.g. via `event.composedPath()`) and navigate\n * client-side. `http(s)` links open in a new tab.\n *\n * @csspart card - The `st-card` around the tile.\n * @csspart icon - The icon tile.\n * @csspart title - The tile heading (`<h3>`).\n * `variant=\"panel\"` drops the icon tile for a compact card (20px padding, 12px radius, 16px title).\n * Inverted panels sit on the lighter navy panel colour (`--st-cms-navy-2`) with a hairline border.\n *\n * @csspart card - The `st-card` around the tile (the panel `div` with `variant=\"panel\"`).\n * @csspart description - The Markdown description.\n * @csspart link - The \"Learn more\" link.\n * @cssprop --st-feature-item-panel-bg - Panel background (default `--st-color-surface`).\n * @cssprop --st-feature-item-panel-border - Panel border colour (default `--st-color-border`).\n * @cssprop --st-feature-item-panel-radius - Panel corner radius (default 12px).\n * @cssprop --st-feature-item-panel-padding - Panel padding (default 20px).\n * @cssprop --st-feature-item-panel-gap - Gap between panel title and description (default `--st-space-8`).\n * @cssprop --st-feature-item-panel-title-size - Panel title size (default 16px).\n * @cssprop --st-feature-item-panel-title-weight - Panel title weight (default bold).\n * @cssprop --st-feature-item-panel-title-color - Panel title colour (default `--st-color-text-strong`).\n * @cssprop --st-feature-item-panel-desc-color - Panel description colour (default `--st-color-text-muted`).\n */\n@customElement('st-feature-item')\nexport class FeatureItem extends LitElement {\n static styles = css`\n ${controlBaseStyles}\n\n :host {\n display: block;\n ${fontFamilyStyles}\n }\n\n st-card {\n height: 100%;\n }\n\n .content {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--st-space-16);\n height: 100%;\n }\n\n .icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n border-radius: var(--st-radius-lg);\n background: var(--st-color-subtle);\n color: var(--st-color-text-strong);\n margin-bottom: var(--st-space-8);\n font-size: 24px;\n }\n\n :host([inverted]) .icon {\n background: var(--st-color-text-muted);\n color: var(--st-color-on-solid);\n }\n\n .title {\n ${cardTitleStyles}\n margin: 0;\n }\n\n .description {\n ${cardDescriptionStyles}\n margin: 0;\n }\n\n /* Inverted tiles sit on the dark band: explicit light text, 17:1 on the default navy, instead of\n whatever the card's colour happens to be. */\n :host([inverted]) .title,\n :host([inverted]) .description {\n color: var(--st-color-on-solid);\n }\n\n .link {\n display: flex;\n align-items: center;\n gap: var(--st-space-4);\n margin-top: auto;\n color: var(--st-color-text-muted);\n font-weight: var(--st-font-weight-medium);\n font-size: var(--st-text-md);\n text-decoration: none;\n transition: color 0.2s ease;\n }\n\n .link:hover {\n color: var(--st-color-text-strong);\n text-decoration: underline;\n }\n\n :host([inverted]) .link,\n :host([inverted]) .link:hover {\n color: inherit;\n }\n\n /* variant=\"panel\": a compact card without the icon tile. */\n .panel {\n box-sizing: border-box;\n height: 100%;\n padding: var(--st-feature-item-panel-padding, 20px);\n border: 1px solid var(--st-feature-item-panel-border, var(--st-color-border));\n border-radius: var(--st-feature-item-panel-radius, 12px);\n background: var(--st-feature-item-panel-bg, var(--st-color-surface));\n }\n\n :host([variant='panel']) .panel .content {\n gap: var(--st-feature-item-panel-gap, var(--st-space-8));\n }\n\n :host([variant='panel']) .title {\n font-size: var(--st-feature-item-panel-title-size, 16px);\n font-weight: var(--st-feature-item-panel-title-weight, var(--st-font-weight-bold));\n line-height: 1.35;\n color: var(--st-feature-item-panel-title-color, var(--st-color-text-strong));\n }\n\n :host([variant='panel']) .description {\n font-size: 14px;\n color: var(--st-feature-item-panel-desc-color, var(--st-color-text-muted));\n }\n\n /* Panels on the dark band: a lighter navy surface, a hairline border, light text (AA on navy-2). */\n :host([variant='panel'][inverted]) .panel {\n background: var(--st-cms-navy-2);\n border-color: var(--st-cms-navy-2-border);\n }\n\n :host([variant='panel'][inverted]) .title {\n color: var(--st-cms-on-dark);\n }\n\n :host([variant='panel'][inverted]) .description {\n color: var(--st-cms-on-navy-muted);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .link {\n transition: none;\n }\n }\n `;\n\n /** Iconify icon name, e.g. `mdi:rocket`. */\n @property({ type: String })\n icon = '';\n\n @property({ type: String })\n title = '';\n\n /** Markdown. */\n @property({ type: String })\n description = '';\n\n @property({ type: String })\n href = '';\n\n @property({ type: String, attribute: 'action-label' })\n actionLabel = 'Learn more';\n\n @property({ type: Boolean, reflect: true })\n inverted = false;\n\n /** `default` is the icon card; `panel` is the compact card without an icon tile. */\n @property({ type: String, reflect: true })\n variant: 'default' | 'panel' = 'default';\n\n private renderBody() {\n const external = this.href.startsWith('http');\n const panel = this.variant === 'panel';\n return html`\n <div class=\"content\" part=\"content\">\n ${this.icon && !panel\n ? html`<div class=\"icon\" part=\"icon\"><iconify-icon icon=${this.icon}></iconify-icon></div>`\n : nothing}\n <h3 class=\"title\" part=\"title\">${this.title}</h3>\n <st-markdown class=\"description\" part=\"description\" .content=${this.description}></st-markdown>\n ${this.href\n ? html`\n <a\n class=\"link\"\n part=\"link\"\n href=${this.href}\n target=${external ? '_blank' : '_self'}\n rel=${external ? 'noopener noreferrer' : nothing}\n >\n ${this.actionLabel} <span>&rarr;</span>\n </a>\n `\n : nothing}\n </div>\n `;\n }\n\n render() {\n if (this.variant === 'panel') {\n return html`<div class=\"panel\" part=\"card\">${this.renderBody()}</div>`;\n }\n return html`<st-card hoverable elevation=\"sm\" ?inverted=${this.inverted} part=\"card\">${this.renderBody()}</st-card>`;\n }\n}\n"],"mappings":"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","names":["LitElement","css","html","nothing","customElement","property","LitElement","nothing","html","css","property","customElement"]}
@@ -7,13 +7,13 @@ import {
7
7
  sectionHeaderStyles,
8
8
  sectionSubtitleStyles,
9
9
  sectionTitleStyles
10
- } from "./chunk-FZ36KL73.js";
10
+ } from "./chunk-KZ7PMFWS.js";
11
11
  import {
12
12
  buttonResetStyles,
13
13
  cardShellStyles,
14
14
  controlBaseStyles,
15
15
  rootFontFamilyStyles
16
- } from "./chunk-KMU6ABQF.js";
16
+ } from "./chunk-NXUS2CH7.js";
17
17
  import {
18
18
  __decorateClass
19
19
  } from "./chunk-EUXUH3YW.js";
@@ -31,6 +31,8 @@ var Testimonials = class extends LitElement {
31
31
  this.inverted = false;
32
32
  this.layout = "grid";
33
33
  this.linkLabel = "See full story";
34
+ this.regionLabel = "";
35
+ this.roleDescription = "";
34
36
  this.actionLabel = "";
35
37
  this.actionHref = "";
36
38
  this.atStart = true;
@@ -131,7 +133,15 @@ var Testimonials = class extends LitElement {
131
133
  </button>
132
134
  </div>` : nothing}
133
135
  </div>
134
- ${carousel ? html`<div class="track" part="track" role="region" aria-label=${this.title || "Stories"} tabindex="0" @scroll=${this.syncArrows}>
136
+ ${carousel ? html`<div
137
+ class="track"
138
+ part="track"
139
+ role="region"
140
+ aria-roledescription=${this.roleDescription || "carousel"}
141
+ aria-label=${this.regionLabel || this.title || "Stories"}
142
+ tabindex="0"
143
+ @scroll=${this.syncArrows}
144
+ >
135
145
  ${this.items.map((item) => this.renderItem(item))}
136
146
  </div>` : html`<div class="grid" part="grid">${this.items.map((item) => this.renderItem(item))}</div>`}
137
147
  ${sectionLink ? html`<div class="section-footer">${this.renderLink(this.actionLabel, this.actionHref, carousel ? "footer-link" : "", "action")}</div>` : nothing}
@@ -322,6 +332,7 @@ Testimonials.styles = css`
322
332
  }
323
333
 
324
334
  .link {
335
+ position: relative;
325
336
  display: inline-flex;
326
337
  align-items: center;
327
338
  gap: var(--st-space-8);
@@ -331,6 +342,17 @@ Testimonials.styles = css`
331
342
  text-decoration: none;
332
343
  }
333
344
 
345
+ /* Touch target: the link keeps its size; a 44px hit area (WCAG 2.5.5) sits over it. */
346
+ .link::after {
347
+ content: '';
348
+ position: absolute;
349
+ top: 50%;
350
+ left: 50%;
351
+ width: max(100%, 44px);
352
+ height: 44px;
353
+ transform: translate(-50%, -50%);
354
+ }
355
+
334
356
  .author + .link {
335
357
  margin-top: 0;
336
358
  }
@@ -489,6 +511,12 @@ __decorateClass([
489
511
  __decorateClass([
490
512
  property({ type: String, attribute: "link-label" })
491
513
  ], Testimonials.prototype, "linkLabel", 2);
514
+ __decorateClass([
515
+ property({ type: String, attribute: "region-label" })
516
+ ], Testimonials.prototype, "regionLabel", 2);
517
+ __decorateClass([
518
+ property({ type: String, attribute: "role-description" })
519
+ ], Testimonials.prototype, "roleDescription", 2);
492
520
  __decorateClass([
493
521
  property({ type: String, attribute: "action-label" })
494
522
  ], Testimonials.prototype, "actionLabel", 2);
@@ -508,4 +536,4 @@ Testimonials = __decorateClass([
508
536
  export {
509
537
  Testimonials
510
538
  };
511
- //# sourceMappingURL=chunk-DH53HZPB.js.map
539
+ //# sourceMappingURL=chunk-37KFBKPD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testimonials/Testimonials.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport 'iconify-icon';\n\nimport { chevronIcon } from '../shared/icons';\nimport { buttonResetStyles, cardShellStyles, controlBaseStyles, rootFontFamilyStyles } from '../shared/styles';\nimport { sectionSubtitleStyles, sectionTitleStyles, invertedSectionTextStyles, sectionHeaderStyles, reducedMotionStyles } from '../shared/section-styles';\nimport type { TestimonialsLinkEventDetail } from './TestimonialsEvents';\n\nexport interface TestimonialMetric {\n /** The figure, e.g. `100M` or `85%`. */\n value: string;\n label: string;\n}\n\nexport interface TestimonialItem {\n id?: string;\n name?: string;\n role?: string;\n company?: string;\n /** Author photo. */\n imageSrc?: string;\n quote?: string;\n /** Number of stars. Default: 5 for a plain quote card; no stars on a story card (one with a `headline` or `logoSrc`). `0` hides them. */\n rating?: number;\n /** Customer logo, shown at the top of the card body. */\n logoSrc?: string;\n /** Wide image across the top of the card. */\n mediaSrc?: string;\n /** Story headline, e.g. \"Acme gives 100 million users a seamless sign-in\". */\n headline?: string;\n /** Key results, shown as large figures. */\n metrics?: TestimonialMetric[];\n /** Link to the full story. */\n href?: string;\n /** Text of the story link; defaults to the section's `link-label`. */\n linkLabel?: string;\n}\n\n/**\n * Section heading plus customer quotes or stories. Port of React `Testimonials`.\n *\n * Each card shows whatever its item has: a cover image, the customer logo, a story headline, a\n * quote with star rating, result metrics, the author and a \"See full story\" link. `layout=\"grid\"`\n * (default) lays the cards out in a grid; `layout=\"carousel\"` puts them on one horizontally\n * scrolling, snapping row with previous/next buttons next to the heading — the customer-story\n * carousel of enterprise marketing pages. `action-label`/`action-href` add a section-level link\n * (e.g. \"Explore customer stories\"). Any item set can use the carousel: `region-label` names it for\n * assistive technology (e.g. \"Services\") and `role-description` changes its `aria-roledescription`.\n *\n * @fires testimonials-link - Cancelable, before following a story or section link. Detail `{ href }`.\n * @cssprop --st-testimonials-padding - Overrides the section's padding.\n */\n@customElement('st-testimonials')\nexport class Testimonials extends LitElement {\n static styles = css`\n ${controlBaseStyles}\n\n :host {\n display: block;\n box-sizing: border-box;\n /* !important: a page-level reset (e.g. Tailwind Preflight) otherwise zeroes a shadow host's\n padding; override with --st-testimonials-padding instead. */\n padding: var(--st-testimonials-padding, var(--st-space-48) var(--st-space-24)) !important;\n background-color: var(--st-color-subtle);\n ${rootFontFamilyStyles}\n }\n\n :host([inverted]) {\n background-color: var(--st-color-text-strong);\n }\n\n .container {\n max-width: var(--st-cms-container-max);\n margin: 0 auto;\n }\n\n .header {\n ${sectionHeaderStyles}\n }\n\n .title {\n ${sectionTitleStyles}\n margin-bottom: var(--st-space-16);\n letter-spacing: -0.02em;\n }\n\n .subtitle {\n ${sectionSubtitleStyles}\n margin: 0 auto;\n }\n\n ${invertedSectionTextStyles}\n\n .grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n gap: var(--st-space-32);\n }\n\n .card {\n ${cardShellStyles}\n display: flex;\n flex-direction: column;\n margin: 0;\n overflow: hidden;\n box-shadow: 0 1px 3px var(--st-shadow-color-sm);\n }\n\n .media {\n aspect-ratio: 16 / 9;\n background: var(--st-color-divider);\n }\n\n .media img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: transform 0.4s ease;\n }\n\n .card:hover .media img {\n transform: scale(1.03);\n }\n\n .body {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--st-space-24);\n padding: var(--st-space-24);\n }\n\n .logo {\n display: block;\n height: 32px;\n width: auto;\n max-width: 60%;\n object-fit: contain;\n object-position: left center;\n }\n\n .headline {\n margin: 0;\n font-size: var(--st-text-xl);\n font-weight: var(--st-font-weight-semibold);\n line-height: 1.35;\n color: var(--st-color-text-strong);\n }\n\n .stars {\n display: flex;\n gap: var(--st-space-4);\n color: var(--st-favorite-accent);\n font-size: var(--st-size-20);\n }\n\n .quote {\n font-size: var(--st-text-md);\n line-height: 1.6;\n color: var(--st-color-text);\n font-style: italic;\n margin: 0;\n }\n\n .metrics {\n display: flex;\n flex-wrap: wrap;\n gap: var(--st-space-16) var(--st-space-32);\n margin: 0;\n padding-top: var(--st-space-16);\n border-top: 1px solid var(--st-color-border);\n }\n\n .metric {\n display: flex;\n flex-direction: column-reverse;\n min-width: 6rem;\n }\n\n .metric dt {\n font-size: var(--st-text-sm);\n color: var(--st-color-text-muted);\n line-height: 1.4;\n }\n\n .metric dd {\n margin: 0;\n font-size: var(--st-cms-text-4xl);\n font-weight: var(--st-font-weight-bold);\n letter-spacing: -0.02em;\n line-height: 1.1;\n color: var(--st-color-text-strong);\n }\n\n .author {\n display: flex;\n align-items: center;\n gap: var(--st-space-12);\n margin-top: auto;\n }\n\n .avatar {\n width: var(--st-space-48);\n height: var(--st-space-48);\n border-radius: var(--st-radius-circle);\n object-fit: cover;\n background-color: var(--st-color-divider);\n flex-shrink: 0;\n }\n\n .avatar-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--st-color-text-muted);\n font-weight: var(--st-font-weight-semibold);\n font-size: var(--st-text-xl);\n }\n\n .author-info {\n display: flex;\n flex-direction: column;\n }\n\n .name {\n font-weight: var(--st-font-weight-semibold);\n color: var(--st-color-text-strong);\n font-size: var(--st-text-xl);\n }\n\n .role {\n font-size: var(--st-text-sm);\n color: var(--st-color-text-faint);\n }\n\n .link {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: var(--st-space-8);\n margin-top: auto;\n font-weight: var(--st-font-weight-semibold);\n color: var(--st-color-text-strong);\n text-decoration: none;\n }\n\n /* Touch target: the link keeps its size; a 44px hit area (WCAG 2.5.5) sits over it. */\n .link::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: max(100%, 44px);\n height: 44px;\n transform: translate(-50%, -50%);\n }\n\n .author + .link {\n margin-top: 0;\n }\n\n .link:hover {\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .link svg {\n transition: transform 0.2s ease;\n }\n\n .link:hover svg {\n transform: translateX(3px);\n }\n\n /* ---- layout=\"carousel\" ---- */\n\n :host([layout='carousel']) .header {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: var(--st-space-24);\n text-align: left;\n margin-bottom: var(--st-space-32);\n }\n\n :host([layout='carousel']) .subtitle {\n margin: 0;\n }\n\n .controls {\n display: flex;\n align-items: center;\n gap: var(--st-space-12);\n flex: none;\n }\n\n .section-link {\n margin-right: var(--st-space-12);\n }\n\n :host([inverted]) .section-link {\n color: var(--st-color-on-solid);\n }\n\n .arrow {\n ${buttonResetStyles}\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--st-size-40);\n height: var(--st-size-40);\n border-radius: var(--st-radius-circle);\n border: 1px solid var(--st-color-border-strong);\n color: var(--st-color-text-strong);\n background: var(--st-color-surface);\n transition:\n background 0.2s ease,\n opacity 0.2s ease;\n }\n\n .arrow:hover:not(:disabled) {\n background: var(--st-color-hover);\n }\n\n .arrow:disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .track {\n display: flex;\n gap: var(--st-space-24);\n overflow-x: auto;\n scroll-snap-type: x mandatory;\n scroll-behavior: smooth;\n scrollbar-width: none;\n /* Room for the cards' shadow and focus rings. */\n padding: var(--st-space-4) var(--st-space-4) var(--st-space-12);\n margin: calc(-1 * var(--st-space-4));\n }\n\n .track::-webkit-scrollbar {\n display: none;\n }\n\n .track > .card {\n flex: 0 0 min(380px, 85%);\n scroll-snap-align: start;\n }\n\n /* The section link sits under the grid; in the carousel it is next to the arrows instead, and\n only drops below the row on a narrow screen. */\n .section-footer {\n margin-top: var(--st-space-32);\n text-align: center;\n }\n\n :host([inverted]) .section-footer .link {\n color: var(--st-color-on-solid);\n }\n\n :host([layout='carousel']) .section-footer {\n margin-top: 0;\n text-align: left;\n }\n\n .footer-link {\n display: none;\n }\n\n @media (max-width: 768px) {\n :host {\n padding: var(--st-testimonials-padding, var(--st-space-40) var(--st-space-20)) !important;\n }\n .grid {\n grid-template-columns: 1fr;\n }\n :host([layout='carousel']) .header {\n flex-direction: column;\n align-items: flex-start;\n }\n .section-link {\n display: none;\n }\n .footer-link {\n display: inline-flex;\n margin-top: var(--st-space-24);\n }\n }\n\n ${reducedMotionStyles}\n @media (prefers-reduced-motion: reduce) {\n .track {\n scroll-behavior: auto;\n }\n }\n `;\n\n @property({ type: String })\n title = '';\n\n @property({ type: String })\n subtitle = '';\n\n @property({ attribute: false })\n items: TestimonialItem[] = [];\n\n @property({ type: Boolean, reflect: true })\n inverted = false;\n\n /** `grid` (default) or `carousel`: one scrolling row with previous/next buttons. */\n @property({ type: String, reflect: true })\n layout: 'grid' | 'carousel' = 'grid';\n\n /** Default text of each card's story link. */\n @property({ type: String, attribute: 'link-label' })\n linkLabel = 'See full story';\n\n /**\n * Accessible name of the carousel's scrolling region. Default: the `title`, or \"Stories\". Set it to\n * what the items are (e.g. \"Services\" for a row of service cards).\n */\n @property({ type: String, attribute: 'region-label' })\n regionLabel = '';\n\n /** `aria-roledescription` of the carousel's scrolling region. Default: \"carousel\". */\n @property({ type: String, attribute: 'role-description' })\n roleDescription = '';\n\n /** Section-level link text, e.g. \"Explore customer stories\". */\n @property({ type: String, attribute: 'action-label' })\n actionLabel = '';\n\n @property({ type: String, attribute: 'action-href' })\n actionHref = '';\n\n @state() private atStart = true;\n @state() private atEnd = false;\n\n private get track(): HTMLElement | null {\n return this.renderRoot.querySelector('.track');\n }\n\n private resizeObserver?: ResizeObserver;\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('layout') || changed.has('items')) {\n this.resizeObserver?.disconnect();\n const track = this.track;\n if (track) {\n this.resizeObserver = new ResizeObserver(this.syncArrows);\n this.resizeObserver.observe(track);\n }\n this.syncArrows();\n }\n }\n\n disconnectedCallback(): void {\n this.resizeObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n private syncArrows = (): void => {\n const track = this.track;\n if (!track) return;\n this.atStart = track.scrollLeft <= 1;\n this.atEnd = track.scrollLeft + track.clientWidth >= track.scrollWidth - 1;\n };\n\n private scrollByCard(direction: 1 | -1): void {\n const track = this.track;\n const card = track?.querySelector<HTMLElement>('.card');\n if (!track || !card) return;\n const gap = parseFloat(getComputedStyle(track).columnGap) || 0;\n track.scrollBy({ left: direction * (card.offsetWidth + gap) });\n }\n\n private onLinkClick(event: MouseEvent, href: string): void {\n const link = new CustomEvent<TestimonialsLinkEventDetail>('testimonials-link', {\n detail: { href },\n bubbles: true,\n composed: true,\n cancelable: true\n });\n this.dispatchEvent(link);\n if (link.defaultPrevented) event.preventDefault();\n }\n\n private renderLink(label: string, href: string, className: string, part: string) {\n return html`<a class=\"link ${className}\" part=${part} href=${href} @click=${(event: MouseEvent) => this.onLinkClick(event, href)}>\n ${label} ${chevronIcon('right', 14)}\n </a>`;\n }\n\n private renderItem(item: TestimonialItem) {\n const story = !!(item.headline || item.logoSrc);\n const rating = item.rating ?? (item.quote && !story ? 5 : 0);\n const metrics = item.metrics ?? [];\n return html`\n <article class=\"card\" part=\"card\">\n ${item.mediaSrc ? html`<div class=\"media\" part=\"media\"><img src=${item.mediaSrc} alt=\"\" loading=\"lazy\" /></div>` : nothing}\n <div class=\"body\" part=\"body\">\n ${item.logoSrc ? html`<img class=\"logo\" part=\"logo\" src=${item.logoSrc} alt=${item.company || item.name || ''} />` : nothing}\n ${item.headline ? html`<h3 class=\"headline\" part=\"headline\">${item.headline}</h3>` : nothing}\n ${rating > 0\n ? html`<div class=\"stars\" part=\"stars\" role=\"img\" aria-label=\"${rating} / 5\">\n ${Array.from({ length: rating }, () => html`<iconify-icon icon=\"mdi:star\"></iconify-icon>`)}\n </div>`\n : nothing}\n ${item.quote ? html`<blockquote class=\"quote\" part=\"quote\">\"${item.quote}\"</blockquote>` : nothing}\n ${metrics.length\n ? html`<dl class=\"metrics\" part=\"metrics\">\n ${metrics.map(metric => html`<div class=\"metric\"><dt>${metric.label}</dt><dd>${metric.value}</dd></div>`)}\n </dl>`\n : nothing}\n ${item.name\n ? html`<div class=\"author\" part=\"author\">\n ${item.imageSrc\n ? html`<img class=\"avatar\" part=\"avatar\" src=${item.imageSrc} alt=${item.name} />`\n : html`<div class=\"avatar avatar-placeholder\" part=\"avatar\">${item.name.charAt(0)}</div>`}\n <span class=\"author-info\">\n <span class=\"name\" part=\"name\">${item.name}</span>\n ${item.role || item.company\n ? html`<span class=\"role\" part=\"role\">${[item.role, item.company].filter(Boolean).join(' at ')}</span>`\n : nothing}\n </span>\n </div>`\n : nothing}\n ${item.href ? this.renderLink(item.linkLabel || this.linkLabel, item.href, '', 'link') : nothing}\n </div>\n </article>\n `;\n }\n\n render() {\n const carousel = this.layout === 'carousel';\n const sectionLink = this.actionLabel && this.actionHref;\n return html`\n <div class=\"container\" part=\"container\">\n <div class=\"header\" part=\"header\">\n <div>\n <h2 class=\"title\" part=\"title\">${this.title}</h2>\n ${this.subtitle ? html`<p class=\"subtitle\" part=\"subtitle\">${this.subtitle}</p>` : nothing}\n </div>\n ${carousel\n ? html`<div class=\"controls\" part=\"controls\">\n ${sectionLink ? this.renderLink(this.actionLabel, this.actionHref, 'section-link', 'action') : nothing}\n <button class=\"arrow\" part=\"arrow prev\" type=\"button\" aria-label=\"Previous\" ?disabled=${this.atStart} @click=${() => this.scrollByCard(-1)}>\n ${chevronIcon('left', 16)}\n </button>\n <button class=\"arrow\" part=\"arrow next\" type=\"button\" aria-label=\"Next\" ?disabled=${this.atEnd} @click=${() => this.scrollByCard(1)}>\n ${chevronIcon('right', 16)}\n </button>\n </div>`\n : nothing}\n </div>\n ${carousel\n ? html`<div\n class=\"track\"\n part=\"track\"\n role=\"region\"\n aria-roledescription=${this.roleDescription || 'carousel'}\n aria-label=${this.regionLabel || this.title || 'Stories'}\n tabindex=\"0\"\n @scroll=${this.syncArrows}\n >\n ${this.items.map(item => this.renderItem(item))}\n </div>`\n : html`<div class=\"grid\" part=\"grid\">${this.items.map(item => this.renderItem(item))}</div>`}\n ${sectionLink\n ? html`<div class=\"section-footer\">${this.renderLink(this.actionLabel, this.actionHref, carousel ? 'footer-link' : '', 'action')}</div>`\n : nothing}\n </div>\n `;\n }\n}\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA8Mf,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqFnB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASvB;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GA1Vf,aA2VX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GA7Vf,aA8VX;AAGA;AAAA,EADC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GAhWnB,aAiWX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAnW/B,aAoWX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAvW9B,aAwWX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GA3WxC,aA4WX;AAOA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,eAAe,CAAC;AAAA,GAlX1C,aAmXX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,mBAAmB,CAAC;AAAA,GAtX9C,aAuXX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,eAAe,CAAC;AAAA,GA1X1C,aA2XX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,cAAc,CAAC;AAAA,GA7XzC,aA8XX;AAEiB;AAAA,EAAhB,MAAM;AAAA,GAhYI,aAgYM;AACA;AAAA,EAAhB,MAAM;AAAA,GAjYI,aAiYM;AAjYN,eAAN;AAAA,EADN,cAAc,iBAAiB;AAAA,GACnB;","names":[]}
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  renderMarkdown
3
- } from "./chunk-UAIUBPDN.js";
3
+ } from "./chunk-TJK55CJ2.js";
4
4
  import {
5
5
  reducedMotionStyles,
6
6
  sectionHeaderStyles,
7
7
  sectionSubtitleStyles,
8
8
  sectionTitleStyles
9
- } from "./chunk-FZ36KL73.js";
9
+ } from "./chunk-KZ7PMFWS.js";
10
10
  import {
11
11
  buttonResetStyles,
12
12
  controlBaseStyles,
13
13
  fontFamilyStyles
14
- } from "./chunk-KMU6ABQF.js";
14
+ } from "./chunk-NXUS2CH7.js";
15
15
  import {
16
16
  __decorateClass
17
17
  } from "./chunk-EUXUH3YW.js";
@@ -62,17 +62,19 @@ var ItemsAccordion = class extends LitElement {
62
62
  const open = this.openIds.has(item.id);
63
63
  return html`
64
64
  <div class="item ${open ? "open" : ""}" part="item">
65
- <button
66
- class="trigger"
67
- part="trigger"
68
- type="button"
69
- aria-expanded=${open ? "true" : "false"}
70
- aria-controls="content-${item.id}"
71
- @click=${() => this.toggle(item.id)}
72
- >
73
- <span>${item.title}</span>
74
- <iconify-icon class="chevron" icon="mdi:chevron-down"></iconify-icon>
75
- </button>
65
+ <h3 class="heading" part="heading">
66
+ <button
67
+ class="trigger"
68
+ part="trigger"
69
+ type="button"
70
+ aria-expanded=${open ? "true" : "false"}
71
+ aria-controls="content-${item.id}"
72
+ @click=${() => this.toggle(item.id)}
73
+ >
74
+ <span>${item.title}</span>
75
+ <iconify-icon class="chevron" icon="mdi:chevron-down" aria-hidden="true"></iconify-icon>
76
+ </button>
77
+ </h3>
76
78
  <div class="content" id="content-${item.id}" part="content" role="region" ?inert=${!open}>
77
79
  <div class="content-clip">
78
80
  <div class="content-inner">${unsafeHTML(renderMarkdown(item.content))}</div>
@@ -140,6 +142,12 @@ ItemsAccordion.styles = css`
140
142
  box-shadow: 0 4px 6px -1px var(--st-shadow-color-sm);
141
143
  }
142
144
 
145
+ /* Each row title is an <h3> wrapping its trigger button (the WAI-ARIA accordion pattern). */
146
+ .heading {
147
+ margin: 0;
148
+ font: inherit;
149
+ }
150
+
143
151
  .trigger {
144
152
  ${buttonResetStyles}
145
153
  width: 100%;
@@ -245,4 +253,4 @@ ItemsAccordion = __decorateClass([
245
253
  export {
246
254
  ItemsAccordion
247
255
  };
248
- //# sourceMappingURL=chunk-EE6PAN3B.js.map
256
+ //# sourceMappingURL=chunk-4XPKKYVZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/items-accordion/ItemsAccordion.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport 'iconify-icon';\n\nimport { buttonResetStyles, controlBaseStyles, fontFamilyStyles } from '../shared/styles';\nimport { renderMarkdown } from '../shared/markdown';\nimport {\n reducedMotionStyles,\n sectionHeaderStyles,\n sectionSubtitleStyles,\n sectionTitleStyles,\n} from '../shared/section-styles';\nimport type { AccordionToggleEventDetail } from './ItemsAccordionEvents';\n\nexport interface AccordionItem {\n id: string;\n title: string;\n /** Markdown (plain text works too). */\n content: string;\n}\n\n/**\n * A vertical list of collapsible title/content rows; one open at a time unless `allow-multiple`.\n * Each row's `content` is Markdown, sanitized. `open-first` starts with the first row open. The\n * section title is an `<h2>` and each row title an `<h3>` wrapping its toggle button, which\n * exposes `aria-expanded` and `aria-controls` for the row's panel.\n *\n * @cssprop --st-items-accordion-padding - Overrides the block's padding.\n * @csspart trigger - The button that opens and closes a row.\n * @csspart heading - The `<h3>` wrapping each trigger.\n */\n@customElement('st-items-accordion')\nexport class ItemsAccordion extends LitElement {\n static styles = css`\n ${controlBaseStyles}\n\n :host {\n display: block;\n /* !important: a page-level reset (e.g. Tailwind Preflight) otherwise zeroes a shadow host's\n padding; override with --st-items-accordion-padding instead. */\n padding: var(--st-items-accordion-padding, var(--st-cms-section-padding) var(--st-space-24)) !important;\n background: var(--st-color-page);\n ${fontFamilyStyles}\n }\n\n .container {\n max-width: 800px;\n margin: 0 auto;\n }\n\n .header {\n ${sectionHeaderStyles}\n }\n\n .title {\n ${sectionTitleStyles}\n font-size: var(--st-text-2xl);\n margin-bottom: var(--st-space-12);\n }\n\n .subtitle {\n ${sectionSubtitleStyles}\n font-size: var(--st-text-base);\n margin: 0;\n }\n\n .list {\n display: flex;\n flex-direction: column;\n gap: var(--st-space-16);\n }\n\n .item {\n border: 1px solid var(--st-color-border);\n border-radius: var(--st-radius-lg);\n background: var(--st-color-surface);\n overflow: hidden;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n }\n\n .item.open {\n border-color: var(--st-color-border-strong);\n box-shadow: 0 4px 6px -1px var(--st-shadow-color-sm);\n }\n\n /* Each row title is an <h3> wrapping its trigger button (the WAI-ARIA accordion pattern). */\n .heading {\n margin: 0;\n font: inherit;\n }\n\n .trigger {\n ${buttonResetStyles}\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: var(--st-space-24);\n text-align: left;\n font-size: var(--st-text-lg);\n font-weight: var(--st-font-weight-semibold);\n color: var(--st-color-text-strong);\n }\n\n .trigger:hover {\n background: var(--st-color-hover);\n }\n\n .chevron {\n flex-shrink: 0;\n margin-left: var(--st-space-16);\n font-size: 24px;\n color: var(--st-color-text-faint);\n transition: transform 0.3s ease;\n }\n\n .open .chevron {\n transform: rotate(180deg);\n }\n\n .content {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 0.3s ease;\n }\n\n .open .content {\n grid-template-rows: 1fr;\n }\n\n .content-clip {\n overflow: hidden;\n min-height: 0;\n }\n\n .content-inner {\n padding: 0 var(--st-space-24) var(--st-space-24);\n color: var(--st-color-text);\n line-height: 1.6;\n }\n\n .content-inner > :first-child {\n margin-top: 0;\n }\n\n .content-inner > :last-child {\n margin-bottom: 0;\n }\n\n .content-inner p {\n margin: 0 0 var(--st-space-12);\n }\n\n .content-inner a {\n color: inherit;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n @media (max-width: 768px) {\n :host {\n padding: var(--st-items-accordion-padding, var(--st-space-48) var(--st-space-20)) !important;\n }\n\n .title {\n font-size: var(--st-text-xl);\n }\n }\n\n ${reducedMotionStyles}\n `;\n\n @property({ type: String })\n title = '';\n\n @property({ type: String })\n subtitle = '';\n\n @property({ attribute: false })\n items: AccordionItem[] = [];\n\n @property({ type: Boolean, attribute: 'allow-multiple' })\n allowMultiple = false;\n\n /** Starts with the first row open. Applies when `items` or this flag changes while nothing is open. */\n @property({ type: Boolean, attribute: 'open-first' })\n openFirst = false;\n\n @state() private openIds = new Set<string>();\n\n protected willUpdate(changed: Map<string, unknown>): void {\n if (this.openFirst && (changed.has('items') || changed.has('openFirst')) && this.openIds.size === 0 && this.items.length) {\n this.openIds = new Set([this.items[0].id]);\n }\n }\n\n private toggle(id: string) {\n const wasOpen = this.openIds.has(id);\n const next = new Set(this.allowMultiple ? this.openIds : []);\n if (wasOpen) next.delete(id);\n else next.add(id);\n this.openIds = next;\n this.dispatchEvent(\n new CustomEvent<AccordionToggleEventDetail>('accordion-toggle', {\n detail: { id, open: !wasOpen },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n <div class=\"container\" part=\"container\">\n ${this.title || this.subtitle\n ? html`<div class=\"header\" part=\"header\">\n ${this.title ? html`<h2 class=\"title\" part=\"title\">${this.title}</h2>` : nothing}\n ${this.subtitle ? html`<p class=\"subtitle\" part=\"subtitle\">${this.subtitle}</p>` : nothing}\n </div>`\n : nothing}\n <div class=\"list\" part=\"list\">\n ${this.items.map((item) => {\n const open = this.openIds.has(item.id);\n return html`\n <div class=\"item ${open ? 'open' : ''}\" part=\"item\">\n <h3 class=\"heading\" part=\"heading\">\n <button\n class=\"trigger\"\n part=\"trigger\"\n type=\"button\"\n aria-expanded=${open ? 'true' : 'false'}\n aria-controls=\"content-${item.id}\"\n @click=${() => this.toggle(item.id)}\n >\n <span>${item.title}</span>\n <iconify-icon class=\"chevron\" icon=\"mdi:chevron-down\" aria-hidden=\"true\"></iconify-icon>\n </button>\n </h3>\n <div class=\"content\" id=\"content-${item.id}\" part=\"content\" role=\"region\" ?inert=${!open}>\n <div class=\"content-clip\">\n <div class=\"content-inner\">${unsafeHTML(renderMarkdown(item.content))}</div>\n </div>\n </div>\n </div>\n `;\n })}\n </div>\n </div>\n `;\n }\n}\n"],"mappings":"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","names":[]}