@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
@@ -0,0 +1,1098 @@
1
+ import {
2
+ MEGA_MENU_LAYOUT_EVENT
3
+ } from "./chunk-ER7MCPDV.js";
4
+ import {
5
+ isCurrentPath
6
+ } from "./chunk-UKIVLF7S.js";
7
+ import {
8
+ arrowUpRightIcon
9
+ } from "./chunk-WTD2YIAA.js";
10
+ import {
11
+ controlBaseStyles,
12
+ fontFamilyStyles
13
+ } from "./chunk-NXUS2CH7.js";
14
+ import {
15
+ __decorateClass
16
+ } from "./chunk-EUXUH3YW.js";
17
+
18
+ // src/mega-menu/MegaMenu.ts
19
+ import { LitElement, css, html, nothing } from "lit";
20
+ import { customElement, property, state } from "lit/decorators.js";
21
+ var MegaMenu = class extends LitElement {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.heading = "";
25
+ this.description = "";
26
+ this.featuredHeading = "";
27
+ this.columns = 0;
28
+ this.ctaLabel = "";
29
+ this.ctaHref = "";
30
+ this.visible = true;
31
+ this.columnCount = 1;
32
+ this.hasIntroLinks = false;
33
+ this.hasFeatured = false;
34
+ this.onColumnsSlotChange = (event) => {
35
+ this.columnCount = Math.max(1, event.target.assignedElements({ flatten: true }).length);
36
+ };
37
+ this.onIntroSlotChange = (event) => {
38
+ this.hasIntroLinks = event.target.assignedElements({ flatten: true }).length > 0;
39
+ };
40
+ this.onFeaturedSlotChange = (event) => {
41
+ this.hasFeatured = event.target.assignedElements({ flatten: true }).length > 0;
42
+ };
43
+ this.lastTracks = 0;
44
+ }
45
+ get layout() {
46
+ const columns = Math.min(6, Math.max(1, Math.round(this.columns) || this.columnCount));
47
+ const hasIntroText = !!(this.heading || this.description);
48
+ const hasCta = !!(this.ctaLabel && this.ctaHref);
49
+ const hasIntro = hasIntroText || this.hasIntroLinks || hasCta;
50
+ const hasFeatured = this.hasFeatured || !!this.featuredHeading;
51
+ return { columns, hasIntroText, hasCta, hasIntro, hasFeatured, tracks: columns + (hasIntro ? 1 : 0) + (hasFeatured ? 1 : 0) };
52
+ }
53
+ updated(_changed) {
54
+ const { tracks } = this.layout;
55
+ if (tracks === this.lastTracks) return;
56
+ this.lastTracks = tracks;
57
+ this.dispatchEvent(
58
+ new CustomEvent(MEGA_MENU_LAYOUT_EVENT, { detail: { tracks }, bubbles: true, composed: true })
59
+ );
60
+ }
61
+ render() {
62
+ const { columns, hasIntroText, hasCta, hasIntro, hasFeatured } = this.layout;
63
+ const tracks = [hasIntro ? "minmax(0, 1fr)" : "", `minmax(0, ${columns}fr)`, hasFeatured ? "minmax(0, 1fr)" : ""].filter(Boolean).join(" ");
64
+ return html`
65
+ <div
66
+ part="inner"
67
+ class="inner"
68
+ ?hidden=${!this.visible}
69
+ style="grid-template-columns:${tracks};--st-mega-menu-columns:${columns};--st-mega-menu-columns-md:${Math.min(2, columns)}"
70
+ >
71
+ <div part="intro" class="intro" ?hidden=${!hasIntro}>
72
+ ${this.heading ? html`<p part="heading" class="intro-heading">${this.heading}</p>` : nothing}
73
+ ${this.description ? html`<p part="description" class="intro-description">${this.description}</p>` : nothing}
74
+ <div part="intro-links" class="intro-links ${hasIntroText ? "" : "no-text"}" ?hidden=${!this.hasIntroLinks}>
75
+ <slot name="intro" @slotchange=${this.onIntroSlotChange}></slot>
76
+ </div>
77
+ ${hasCta ? html`<div part="cta-row" class="intro-footer"><a part="cta" class="intro-cta" href=${this.ctaHref}>${this.ctaLabel}</a></div>` : nothing}
78
+ </div>
79
+ <div part="columns" class="columns"><slot @slotchange=${this.onColumnsSlotChange}></slot></div>
80
+ <div part="featured" class="featured" ?hidden=${!hasFeatured}>
81
+ ${this.featuredHeading ? html`<p part="featured-heading" class="featured-heading">${this.featuredHeading}</p>` : nothing}
82
+ <div class="featured-items"><slot name="featured" @slotchange=${this.onFeaturedSlotChange}></slot></div>
83
+ </div>
84
+ </div>
85
+ `;
86
+ }
87
+ };
88
+ MegaMenu.styles = css`
89
+ ${controlBaseStyles}
90
+
91
+ :host {
92
+ display: block;
93
+ container-type: inline-size;
94
+ ${fontFamilyStyles}
95
+ }
96
+
97
+ .inner {
98
+ display: grid;
99
+ gap: 3rem;
100
+ padding: 3rem 3.5rem;
101
+ box-sizing: border-box;
102
+ }
103
+
104
+ .columns {
105
+ display: grid;
106
+ grid-template-columns: repeat(var(--st-mega-menu-columns, 3), minmax(0, 1fr));
107
+ gap: 3rem;
108
+ align-items: stretch;
109
+ }
110
+
111
+ .intro,
112
+ .featured {
113
+ display: flex;
114
+ flex-direction: column;
115
+ min-width: 0;
116
+ }
117
+
118
+ .intro-heading {
119
+ margin: 0 0 1rem;
120
+ font-size: 2rem;
121
+ font-weight: 400;
122
+ line-height: 1.15;
123
+ color: var(--st-color-text-strong);
124
+ }
125
+
126
+ .intro-description {
127
+ margin: 0;
128
+ font-size: 1rem;
129
+ line-height: 1.55;
130
+ color: var(--st-color-text);
131
+ }
132
+
133
+ .intro-links {
134
+ display: flex;
135
+ flex-direction: column;
136
+ gap: 2px;
137
+ margin-top: 2.5rem;
138
+ padding-top: 2rem;
139
+ border-top: 1px solid var(--st-color-border);
140
+ }
141
+
142
+ .intro-links.no-text {
143
+ margin-top: 0;
144
+ padding-top: 0;
145
+ border-top: 0;
146
+ }
147
+
148
+ /* The intro column's call to action: pinned to the foot of the column, so it lines up with the featured cards. */
149
+ .intro-footer {
150
+ display: flex;
151
+ margin-top: auto;
152
+ padding-top: 2rem;
153
+ }
154
+
155
+ .intro-cta {
156
+ display: inline-flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ box-sizing: border-box;
160
+ min-height: 44px;
161
+ padding: 0 1.25rem;
162
+ border-radius: 9999px;
163
+ background: var(--st-color-accent);
164
+ color: var(--st-color-on-solid);
165
+ font-size: 1rem;
166
+ font-weight: 600;
167
+ text-decoration: none;
168
+ }
169
+
170
+ .intro-cta:hover {
171
+ background: color-mix(in oklch, var(--st-color-accent) 88%, var(--st-color-text-strong));
172
+ }
173
+
174
+ .featured-heading {
175
+ margin: 0 0 1rem;
176
+ font-size: 1.125rem;
177
+ font-weight: 500;
178
+ line-height: 1.35;
179
+ color: var(--st-color-text-strong);
180
+ }
181
+
182
+ .featured-items {
183
+ display: flex;
184
+ flex-direction: column;
185
+ gap: 0.75rem;
186
+ }
187
+
188
+ [hidden] {
189
+ display: none !important;
190
+ }
191
+
192
+ /* Medium panel: intro on top, two link columns, featured cards side by side underneath. */
193
+ @container (max-width: 960px) {
194
+ .inner {
195
+ grid-template-columns: minmax(0, 1fr) !important;
196
+ gap: 2rem;
197
+ padding: 2rem;
198
+ }
199
+
200
+ .columns {
201
+ grid-template-columns: repeat(var(--st-mega-menu-columns-md, 2), minmax(0, 1fr));
202
+ gap: 2rem;
203
+ }
204
+
205
+ .intro-links {
206
+ margin-top: 1.5rem;
207
+ padding-top: 1.5rem;
208
+ }
209
+
210
+ .featured-items {
211
+ display: grid;
212
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
213
+ }
214
+ }
215
+
216
+ /* Narrow panel (the phone drill-down): everything stacked. */
217
+ @container (max-width: 560px) {
218
+ .inner {
219
+ gap: 1.75rem;
220
+ padding: 0.5rem 0 1.5rem;
221
+ }
222
+
223
+ .columns {
224
+ grid-template-columns: minmax(0, 1fr);
225
+ gap: 1.75rem;
226
+ }
227
+
228
+ .intro-heading {
229
+ display: none;
230
+ }
231
+ }
232
+ `;
233
+ __decorateClass([
234
+ property({ type: String })
235
+ ], MegaMenu.prototype, "heading", 2);
236
+ __decorateClass([
237
+ property({ type: String })
238
+ ], MegaMenu.prototype, "description", 2);
239
+ __decorateClass([
240
+ property({ type: String, attribute: "featured-heading" })
241
+ ], MegaMenu.prototype, "featuredHeading", 2);
242
+ __decorateClass([
243
+ property({ type: Number })
244
+ ], MegaMenu.prototype, "columns", 2);
245
+ __decorateClass([
246
+ property({ type: String, attribute: "cta-label" })
247
+ ], MegaMenu.prototype, "ctaLabel", 2);
248
+ __decorateClass([
249
+ property({ type: String, attribute: "cta-href" })
250
+ ], MegaMenu.prototype, "ctaHref", 2);
251
+ __decorateClass([
252
+ property({ type: Boolean })
253
+ ], MegaMenu.prototype, "visible", 2);
254
+ __decorateClass([
255
+ state()
256
+ ], MegaMenu.prototype, "columnCount", 2);
257
+ __decorateClass([
258
+ state()
259
+ ], MegaMenu.prototype, "hasIntroLinks", 2);
260
+ __decorateClass([
261
+ state()
262
+ ], MegaMenu.prototype, "hasFeatured", 2);
263
+ MegaMenu = __decorateClass([
264
+ customElement("st-mega-menu")
265
+ ], MegaMenu);
266
+
267
+ // src/mega-menu/MegaMenuColumn.ts
268
+ import "iconify-icon";
269
+ import { LitElement as LitElement2, css as css2, html as html2, nothing as nothing2, svg } from "lit";
270
+ import { customElement as customElement2, property as property2, state as state2 } from "lit/decorators.js";
271
+ var DECORATIONS = {
272
+ flow: svg`
273
+ <path d="M240 8 C 190 20, 150 70, 70 150" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"/>
274
+ <path d="M240 28 C 196 40, 162 84, 100 156" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.25"/>
275
+ <path d="M240 48 C 204 60, 176 98, 130 160" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1"/>
276
+ <path d="M226 0 C 180 10, 130 52, 40 132" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.25"/>
277
+ <path d="M206 0 C 166 8, 112 36, 12 108" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1"/>
278
+ `,
279
+ orbit: svg`
280
+ <circle cx="240" cy="0" r="36" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"/>
281
+ <circle cx="240" cy="0" r="62" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.25"/>
282
+ <circle cx="240" cy="0" r="90" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1"/>
283
+ <circle cx="240" cy="0" r="120" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1" stroke-dasharray="2 6"/>
284
+ <circle cx="204" cy="34" r="3" fill="currentColor" stroke="none"/>
285
+ `,
286
+ waves: svg`
287
+ <path d="M0 30 C 40 6, 80 54, 120 30 S 200 6, 240 30" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"/>
288
+ <path d="M0 48 C 40 24, 80 72, 120 48 S 200 24, 240 48" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.25"/>
289
+ <path d="M0 66 C 40 42, 80 90, 120 66 S 200 42, 240 66" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1"/>
290
+ <path d="M0 84 C 40 60, 80 108, 120 84 S 200 60, 240 84" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1"/>
291
+ `,
292
+ ribbon: svg`
293
+ <path d="M250 20 C 170 -10, 120 90, 180 110 S 250 40, 150 20 S 40 70, -10 40" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"/>
294
+ <path d="M250 50 C 180 20, 140 110, 196 128 S 256 70, 160 52 S 60 100, -10 80" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1"/>
295
+ `
296
+ };
297
+ var MegaMenuColumn = class extends LitElement2 {
298
+ constructor() {
299
+ super(...arguments);
300
+ this.heading = "";
301
+ this.href = "";
302
+ this.description = "";
303
+ this.variant = "plain";
304
+ this.ctaLabel = "";
305
+ this.ctaHref = "";
306
+ this.currentVariant = "";
307
+ this.icon = "";
308
+ this.iconSrc = "";
309
+ this.iconSrcDark = "";
310
+ this.tag = "";
311
+ this.accent = "";
312
+ this.decoration = "none";
313
+ this.currentLabel = "Current";
314
+ this.currentPath = "";
315
+ this.current = false;
316
+ this.hasLinks = false;
317
+ this.onLinksSlotChange = (event) => {
318
+ this.hasLinks = event.target.assignedElements({ flatten: true }).length > 0;
319
+ };
320
+ }
321
+ willUpdate(changed) {
322
+ if (changed.has("currentVariant") || changed.has("variant") || changed.has("currentPath") || changed.has("href") || changed.has("ctaHref")) {
323
+ this.current = (!!this.currentVariant || this.variant === "product") && (isCurrentPath(this.href, this.currentPath) || isCurrentPath(this.ctaHref, this.currentPath));
324
+ }
325
+ if (changed.has("accent")) {
326
+ if (this.accent) this.style.setProperty("--st-mega-menu-column-accent", this.accent);
327
+ else this.style.removeProperty("--st-mega-menu-column-accent");
328
+ }
329
+ }
330
+ select(event, href) {
331
+ if (href.startsWith("http")) return;
332
+ const selectEvent = new CustomEvent("mega-menu-select", {
333
+ detail: { href },
334
+ bubbles: true,
335
+ composed: true,
336
+ cancelable: true
337
+ });
338
+ this.dispatchEvent(selectEvent);
339
+ if (selectEvent.defaultPrevented) event.preventDefault();
340
+ }
341
+ renderHeading() {
342
+ if (!this.heading) return nothing2;
343
+ return this.href ? html2`<a
344
+ part="heading"
345
+ class="heading"
346
+ href=${this.href}
347
+ aria-current=${isCurrentPath(this.href, this.currentPath) ? "page" : nothing2}
348
+ @click=${(event) => this.select(event, this.href)}
349
+ >${this.heading}</a
350
+ >` : html2`<p part="heading" class="heading">${this.heading}</p>`;
351
+ }
352
+ renderDecoration() {
353
+ if (this.variant !== "product" || this.decoration === "none") return nothing2;
354
+ return html2`<svg
355
+ class="deco"
356
+ part="decoration"
357
+ viewBox="0 0 240 160"
358
+ preserveAspectRatio="xMaxYMin meet"
359
+ aria-hidden="true"
360
+ focusable="false"
361
+ >${DECORATIONS[this.decoration]}</svg
362
+ >`;
363
+ }
364
+ /** The tile's content: the `icon-src` image (light, plus the dark one when `icon-src-dark` is set), else the iconify `icon`. */
365
+ renderTileIcon() {
366
+ if (this.iconSrc) {
367
+ const light = html2`<img class="${this.iconSrcDark ? "theme-light" : ""}" src=${this.iconSrc} alt="" width="28" height="28" />`;
368
+ if (!this.iconSrcDark) return light;
369
+ return html2`${light}<img class="theme-dark" src=${this.iconSrcDark} alt="" width="28" height="28" />`;
370
+ }
371
+ return html2`<iconify-icon icon=${this.icon} aria-hidden="true"></iconify-icon>`;
372
+ }
373
+ renderTop() {
374
+ if (this.variant !== "product") return nothing2;
375
+ return html2`<div part="top" class="top">
376
+ ${this.iconSrc || this.icon ? html2`<span part="icon" class="tile ${this.iconSrc ? "image" : ""}">${this.renderTileIcon()}</span>` : nothing2}
377
+ <span class="pills">
378
+ ${this.current ? html2`<span part="current" class="pill current">${this.currentLabel}</span>` : this.tag ? html2`<span part="tag" class="pill tag">${this.tag}</span>` : nothing2}
379
+ </span>
380
+ </div>`;
381
+ }
382
+ renderCta() {
383
+ if (!this.ctaLabel || !this.ctaHref) return nothing2;
384
+ const external = this.ctaHref.startsWith("http");
385
+ let trailing = nothing2;
386
+ if (external) trailing = arrowUpRightIcon(14);
387
+ else if (this.variant === "product") trailing = html2`<span class="cta-arrow" aria-hidden="true">→</span>`;
388
+ return html2`
389
+ <span class="cta-spacer"></span>
390
+ <a
391
+ part="cta"
392
+ class="cta"
393
+ href=${this.ctaHref}
394
+ target=${external ? "_blank" : "_self"}
395
+ rel=${external ? "noopener noreferrer" : nothing2}
396
+ aria-current=${isCurrentPath(this.ctaHref, this.currentPath) ? "page" : nothing2}
397
+ @click=${(event) => this.select(event, this.ctaHref)}
398
+ >${this.ctaLabel} ${trailing}</a
399
+ >
400
+ `;
401
+ }
402
+ render() {
403
+ return html2`
404
+ ${this.renderDecoration()}
405
+ ${this.variant === "product" ? html2`<span class="edge" part="edge" aria-hidden="true"></span>` : nothing2}
406
+ ${this.renderTop()}
407
+ ${this.renderHeading()}
408
+ ${this.description ? html2`<p part="description" class="description">${this.description}</p>` : nothing2}
409
+ <div part="items" class=${this.hasLinks ? "items has-links" : "items"} role="group" aria-label=${this.heading || nothing2}><slot @slotchange=${this.onLinksSlotChange}></slot></div>
410
+ ${this.renderCta()}
411
+ `;
412
+ }
413
+ };
414
+ MegaMenuColumn.styles = css2`
415
+ ${controlBaseStyles}
416
+
417
+ :host {
418
+ display: flex;
419
+ flex-direction: column;
420
+ min-width: 0;
421
+ box-sizing: border-box;
422
+ --st-mega-menu-column-accent: var(--st-color-accent);
423
+ /* Accent for text and icons: blended with the theme's strong text colour, so a dark accent
424
+ (e.g. navy) still reads on the dark theme's surface and stays crisp on the light one. */
425
+ --st-mega-menu-column-accent-text: color-mix(in oklch, var(--st-mega-menu-column-accent) 60%, var(--st-color-text-strong));
426
+ ${fontFamilyStyles}
427
+ }
428
+
429
+ :host([variant='card']),
430
+ :host([variant='accent']) {
431
+ /* !important: a page-level reset (e.g. Tailwind Preflight) otherwise zeroes a shadow host's
432
+ padding; override with --st-mega-menu-column-padding instead. */
433
+ padding: var(--st-mega-menu-column-padding, 2rem 1.75rem 1.75rem) !important;
434
+ border-radius: 20px;
435
+ background: color-mix(in oklch, var(--st-color-text-strong) 5%, var(--st-color-surface));
436
+ }
437
+
438
+ /* The accent look, from variant="accent" or from current-variant="accent" while the page it links to is shown. */
439
+ :host([variant='accent']),
440
+ :host([current][current-variant='accent']) {
441
+ background: var(--st-color-accent);
442
+ color: var(--st-color-on-solid);
443
+ /* Read by the st-menu-item links inside. */
444
+ --st-nav-color: var(--st-color-on-solid);
445
+ --st-nav-hover-bg: transparent;
446
+ }
447
+
448
+ .heading {
449
+ display: inline-flex;
450
+ align-items: center;
451
+ gap: 6px;
452
+ margin: 0 0 0.75rem;
453
+ font-size: 1.125rem;
454
+ font-weight: 500;
455
+ line-height: 1.35;
456
+ color: var(--st-color-text-strong);
457
+ text-decoration: none;
458
+ }
459
+
460
+ :host([variant='card']) .heading,
461
+ :host([variant='accent']) .heading {
462
+ font-size: 1.375rem;
463
+ }
464
+
465
+ :host([variant='accent']) .heading,
466
+ :host([current][current-variant='accent']) .heading {
467
+ color: inherit;
468
+ }
469
+
470
+ a.heading:hover,
471
+ a.heading:focus-visible {
472
+ text-decoration: underline;
473
+ text-underline-offset: 4px;
474
+ }
475
+
476
+ .description {
477
+ margin: -0.25rem 0 0.75rem;
478
+ font-size: 0.875rem;
479
+ line-height: 1.5;
480
+ color: var(--st-color-text-muted);
481
+ }
482
+
483
+ :host([variant='accent']) .description,
484
+ :host([current][current-variant='accent']) .description {
485
+ color: inherit;
486
+ opacity: 0.85;
487
+ }
488
+
489
+ .items {
490
+ display: flex;
491
+ flex-direction: column;
492
+ gap: 2px;
493
+ }
494
+
495
+ /* Nested groups stack with room between them (!important for the same page-reset reason). */
496
+ ::slotted(st-mega-menu-column:not(:first-child)) {
497
+ margin-top: 2rem !important;
498
+ }
499
+
500
+ .cta {
501
+ display: inline-flex;
502
+ align-items: center;
503
+ justify-content: center;
504
+ gap: 6px;
505
+ padding: 0.875rem 1.5rem;
506
+ border-radius: 9999px;
507
+ background: var(--st-color-surface);
508
+ color: var(--st-color-text-strong);
509
+ font-size: 1rem;
510
+ font-weight: 500;
511
+ text-align: center;
512
+ text-decoration: none;
513
+ transition: box-shadow 0.2s ease;
514
+ }
515
+
516
+ .cta-spacer {
517
+ flex: 1;
518
+ min-height: 1.75rem;
519
+ }
520
+
521
+ .cta:hover,
522
+ .cta:focus-visible {
523
+ box-shadow: 0 0 0 2px currentColor;
524
+ }
525
+
526
+ .cta-arrow {
527
+ display: inline-block;
528
+ }
529
+
530
+ @media (prefers-reduced-motion: reduce) {
531
+ .cta {
532
+ transition: none;
533
+ }
534
+ }
535
+
536
+ /* ---- variant="product": a product card ---- */
537
+
538
+ .edge,
539
+ .top,
540
+ .tile,
541
+ .pill {
542
+ display: none;
543
+ }
544
+
545
+ :host([variant='product']) {
546
+ position: relative;
547
+ overflow: hidden;
548
+ gap: 14px;
549
+ /* !important for the same page-reset reason as card/accent. The border is 1px; the current card's
550
+ 2px border takes its padding from the 1px it gives up, so nothing moves. */
551
+ padding: 24px !important;
552
+ border: 1px solid var(--st-color-border);
553
+ border-radius: 20px;
554
+ background: var(--st-color-surface);
555
+ box-shadow: 0 1px 2px var(--st-shadow-color-sm);
556
+ transition:
557
+ transform 0.2s ease,
558
+ box-shadow 0.2s ease,
559
+ border-color 0.2s ease,
560
+ background-color 0.2s ease;
561
+ }
562
+
563
+ :host([variant='product']) .edge {
564
+ display: block;
565
+ position: absolute;
566
+ top: 0;
567
+ left: 0;
568
+ right: 0;
569
+ height: 3px;
570
+ background: linear-gradient(90deg, var(--st-mega-menu-column-accent), transparent);
571
+ pointer-events: none;
572
+ }
573
+
574
+ /* The decorative line art: behind the card's content (z-index 0), faded toward the bottom-left. */
575
+ :host([variant='product']) .deco {
576
+ position: absolute;
577
+ top: 0;
578
+ right: 0;
579
+ width: 240px;
580
+ height: 160px;
581
+ z-index: 0;
582
+ pointer-events: none;
583
+ color: var(--st-mega-menu-column-accent);
584
+ opacity: var(--st-mega-menu-column-deco-opacity, 0.28);
585
+ -webkit-mask-image: radial-gradient(120% 120% at 100% 0%, #000 35%, transparent 75%);
586
+ mask-image: radial-gradient(120% 120% at 100% 0%, #000 35%, transparent 75%);
587
+ transition:
588
+ transform 0.4s ease,
589
+ opacity 0.4s ease;
590
+ }
591
+
592
+ /* Everything else in the card paints above the line art (.edge keeps its absolute position). */
593
+ :host([variant='product']) .edge {
594
+ z-index: 1;
595
+ }
596
+
597
+ :host([variant='product']) .top,
598
+ :host([variant='product']) .heading,
599
+ :host([variant='product']) .description,
600
+ :host([variant='product']) .items,
601
+ :host([variant='product']) .cta-spacer,
602
+ :host([variant='product']) .cta {
603
+ position: relative;
604
+ z-index: 1;
605
+ }
606
+
607
+ :host([variant='product']:hover) .deco,
608
+ :host([variant='product']:focus-within) .deco {
609
+ opacity: 0.5;
610
+ transform: var(--st-mega-menu-column-deco-transform, translate(-6px, 4px));
611
+ }
612
+
613
+ :host([variant='product'][current]) .deco {
614
+ opacity: 0.42;
615
+ }
616
+
617
+ :host([variant='product']) .top {
618
+ display: flex;
619
+ align-items: flex-start;
620
+ justify-content: space-between;
621
+ gap: 8px;
622
+ }
623
+
624
+ :host([variant='product']) .tile {
625
+ display: inline-flex;
626
+ flex: none;
627
+ align-items: center;
628
+ justify-content: center;
629
+ width: 44px;
630
+ height: 44px;
631
+ border-radius: 12px;
632
+ background: color-mix(in oklch, var(--st-mega-menu-column-accent) 14%, transparent);
633
+ color: var(--st-mega-menu-column-accent-text);
634
+ }
635
+
636
+ :host([variant='product']) .tile iconify-icon {
637
+ display: block;
638
+ width: 24px;
639
+ height: 24px;
640
+ font-size: 24px;
641
+ }
642
+
643
+ /* The image is 28px inside the 44px tile, which keeps the same tinted background as an iconify tile. No display here: the theme classes below set it. */
644
+ :host([variant='product']) .tile img {
645
+ flex: none;
646
+ width: 28px;
647
+ height: 28px;
648
+ object-fit: contain;
649
+ }
650
+
651
+ /* Light and dark icon per the site's theme: the dark one shows on :root.dark (see --st-theme-*-display). */
652
+ .theme-light {
653
+ display: var(--st-theme-light-display, inline-block);
654
+ }
655
+
656
+ .theme-dark {
657
+ display: var(--st-theme-dark-display, none);
658
+ }
659
+
660
+ :host([variant='product']) .pills {
661
+ display: flex;
662
+ flex-wrap: wrap;
663
+ justify-content: flex-end;
664
+ gap: 6px;
665
+ margin-left: auto;
666
+ }
667
+
668
+ :host([variant='product']) .pill {
669
+ display: inline-flex;
670
+ align-items: center;
671
+ height: 22px;
672
+ padding: 0 8px;
673
+ border-radius: 9999px;
674
+ font-size: 11px;
675
+ font-weight: 600;
676
+ letter-spacing: 0.04em;
677
+ text-transform: uppercase;
678
+ white-space: nowrap;
679
+ }
680
+
681
+ :host([variant='product']) .pill.tag {
682
+ display: inline-flex;
683
+ background: color-mix(in oklch, var(--st-mega-menu-column-accent) 12%, transparent);
684
+ color: var(--st-mega-menu-column-accent-text);
685
+ }
686
+
687
+ :host([variant='product']) .heading {
688
+ margin: 0;
689
+ font-size: 1.125rem;
690
+ font-weight: 600;
691
+ }
692
+
693
+ :host([variant='product']) .description {
694
+ margin: 0;
695
+ }
696
+
697
+ :host([variant='product']) .items.has-links {
698
+ gap: 4px;
699
+ padding-top: 12px;
700
+ border-top: 1px solid var(--st-color-border);
701
+ }
702
+
703
+ /* Each link is a row: the arrow (set on the links here, drawn by st-menu-item) slides on hover in the accent. */
704
+ :host([variant='product']) ::slotted(st-menu-item) {
705
+ --st-menu-item-arrow: '→';
706
+ }
707
+
708
+ :host([variant='product']) ::slotted(st-menu-item:hover) {
709
+ --st-nav-color: var(--st-mega-menu-column-accent-text);
710
+ }
711
+
712
+ :host([variant='product']) .cta {
713
+ display: flex;
714
+ box-sizing: border-box;
715
+ width: 100%;
716
+ height: 40px;
717
+ padding: 0 1rem;
718
+ white-space: nowrap;
719
+ background: color-mix(in oklch, var(--st-mega-menu-column-accent) 10%, transparent);
720
+ color: var(--st-mega-menu-column-accent-text);
721
+ font-size: 0.875rem;
722
+ font-weight: 600;
723
+ transition:
724
+ background-color 0.2s ease,
725
+ color 0.2s ease;
726
+ }
727
+
728
+ :host([variant='product']) .cta:hover,
729
+ :host([variant='product']) .cta:focus-visible {
730
+ box-shadow: none;
731
+ background: var(--st-mega-menu-column-accent);
732
+ color: #fff;
733
+ }
734
+
735
+ :host([variant='product']) .cta:hover .cta-arrow,
736
+ :host([variant='product']) .cta:focus-visible .cta-arrow {
737
+ transform: translateX(2px);
738
+ }
739
+
740
+ :host([variant='product']:hover),
741
+ :host([variant='product']:focus-within) {
742
+ transform: translateY(var(--st-mega-menu-column-lift, -3px));
743
+ box-shadow: 0 16px 32px -12px var(--st-shadow-color-md);
744
+ border-color: color-mix(in oklch, var(--st-mega-menu-column-accent) 45%, var(--st-color-border));
745
+ }
746
+
747
+ /* The page being shown: no solid block, an accent border and wash, and a solid button. Declared after
748
+ the hover rules so it keeps its border while hovered. */
749
+ :host([variant='product'][current]) {
750
+ padding: 23px !important;
751
+ border: 2px solid var(--st-mega-menu-column-accent);
752
+ background: color-mix(in oklch, var(--st-mega-menu-column-accent) 6%, var(--st-color-surface));
753
+ }
754
+
755
+ :host([variant='product'][current]) .pill.current {
756
+ display: inline-flex;
757
+ background: var(--st-mega-menu-column-accent);
758
+ color: #fff;
759
+ }
760
+
761
+ :host([variant='product'][current]) .cta {
762
+ background: var(--st-mega-menu-column-accent);
763
+ color: #fff;
764
+ }
765
+
766
+ :host([variant='product'][current]) .cta:hover,
767
+ :host([variant='product'][current]) .cta:focus-visible {
768
+ background: color-mix(in oklch, var(--st-mega-menu-column-accent) 85%, #000);
769
+ color: #fff;
770
+ }
771
+
772
+ @media (prefers-reduced-motion: reduce) {
773
+ :host([variant='product']),
774
+ :host([variant='product']) .cta,
775
+ :host([variant='product']) .cta-arrow {
776
+ transition: none;
777
+ }
778
+
779
+ :host([variant='product']:hover),
780
+ :host([variant='product']:focus-within) {
781
+ transform: none;
782
+ }
783
+
784
+ :host([variant='product']) .deco {
785
+ transition: none;
786
+ }
787
+
788
+ :host([variant='product']:hover) .deco,
789
+ :host([variant='product']:focus-within) .deco {
790
+ transform: none;
791
+ }
792
+
793
+ :host([variant='product']) .cta:hover .cta-arrow,
794
+ :host([variant='product']) .cta:focus-visible .cta-arrow {
795
+ transform: none;
796
+ }
797
+ }
798
+ `;
799
+ __decorateClass([
800
+ property2({ type: String })
801
+ ], MegaMenuColumn.prototype, "heading", 2);
802
+ __decorateClass([
803
+ property2({ type: String })
804
+ ], MegaMenuColumn.prototype, "href", 2);
805
+ __decorateClass([
806
+ property2({ type: String })
807
+ ], MegaMenuColumn.prototype, "description", 2);
808
+ __decorateClass([
809
+ property2({ type: String, reflect: true })
810
+ ], MegaMenuColumn.prototype, "variant", 2);
811
+ __decorateClass([
812
+ property2({ type: String, attribute: "cta-label" })
813
+ ], MegaMenuColumn.prototype, "ctaLabel", 2);
814
+ __decorateClass([
815
+ property2({ type: String, attribute: "cta-href" })
816
+ ], MegaMenuColumn.prototype, "ctaHref", 2);
817
+ __decorateClass([
818
+ property2({ type: String, attribute: "current-variant", reflect: true })
819
+ ], MegaMenuColumn.prototype, "currentVariant", 2);
820
+ __decorateClass([
821
+ property2({ type: String })
822
+ ], MegaMenuColumn.prototype, "icon", 2);
823
+ __decorateClass([
824
+ property2({ type: String, attribute: "icon-src" })
825
+ ], MegaMenuColumn.prototype, "iconSrc", 2);
826
+ __decorateClass([
827
+ property2({ type: String, attribute: "icon-src-dark" })
828
+ ], MegaMenuColumn.prototype, "iconSrcDark", 2);
829
+ __decorateClass([
830
+ property2({ type: String })
831
+ ], MegaMenuColumn.prototype, "tag", 2);
832
+ __decorateClass([
833
+ property2({ type: String })
834
+ ], MegaMenuColumn.prototype, "accent", 2);
835
+ __decorateClass([
836
+ property2({ type: String, reflect: true })
837
+ ], MegaMenuColumn.prototype, "decoration", 2);
838
+ __decorateClass([
839
+ property2({ type: String, attribute: "current-label" })
840
+ ], MegaMenuColumn.prototype, "currentLabel", 2);
841
+ __decorateClass([
842
+ property2({ attribute: false })
843
+ ], MegaMenuColumn.prototype, "currentPath", 2);
844
+ __decorateClass([
845
+ property2({ type: Boolean, reflect: true })
846
+ ], MegaMenuColumn.prototype, "current", 2);
847
+ __decorateClass([
848
+ state2()
849
+ ], MegaMenuColumn.prototype, "hasLinks", 2);
850
+ MegaMenuColumn = __decorateClass([
851
+ customElement2("st-mega-menu-column")
852
+ ], MegaMenuColumn);
853
+
854
+ // src/mega-menu/MegaMenuFeature.ts
855
+ import { LitElement as LitElement3, css as css3, html as html3, nothing as nothing3 } from "lit";
856
+ import { customElement as customElement3, property as property3 } from "lit/decorators.js";
857
+ var MegaMenuFeature = class extends LitElement3 {
858
+ constructor() {
859
+ super(...arguments);
860
+ this.variant = "story";
861
+ this.title = "";
862
+ this.description = "";
863
+ this.eyebrow = "";
864
+ this.href = "";
865
+ this.target = "";
866
+ this.imageUrl = "";
867
+ this.imageAlt = "";
868
+ this.logoUrl = "";
869
+ this.logoAlt = "";
870
+ this.ctaLabel = "";
871
+ this.currentPath = "";
872
+ this.onClick = (event) => {
873
+ if (this.isExternal) return;
874
+ const selectEvent = new CustomEvent("mega-menu-select", {
875
+ detail: { href: this.href },
876
+ bubbles: true,
877
+ composed: true,
878
+ cancelable: true
879
+ });
880
+ this.dispatchEvent(selectEvent);
881
+ if (selectEvent.defaultPrevented) event.preventDefault();
882
+ };
883
+ }
884
+ get isExternal() {
885
+ return this.href.startsWith("http");
886
+ }
887
+ render() {
888
+ const target = this.target || (this.isExternal ? "_blank" : "_self");
889
+ const overlay = this.variant === "overlay";
890
+ const style = overlay && this.imageUrl ? `--st-mega-menu-feature-image:url(${JSON.stringify(this.imageUrl)})` : "";
891
+ return html3`
892
+ <a
893
+ part="card"
894
+ class="card"
895
+ style=${style}
896
+ href=${this.href || nothing3}
897
+ target=${target}
898
+ rel=${target === "_blank" ? "noopener noreferrer" : nothing3}
899
+ aria-current=${isCurrentPath(this.href, this.currentPath) ? "page" : nothing3}
900
+ @click=${this.onClick}
901
+ >
902
+ ${overlay && this.logoUrl ? html3`<img part="logo" class="logo" src=${this.logoUrl} alt=${this.logoAlt} />` : nothing3}
903
+ ${!overlay && this.imageUrl ? html3`<img part="image" class="image" src=${this.imageUrl} alt=${this.imageAlt} loading="lazy" />` : nothing3}
904
+ ${this.eyebrow ? html3`<span part="eyebrow" class="eyebrow">${this.eyebrow}</span>` : nothing3}
905
+ ${this.title ? html3`<p part="title" class="title">${this.title}</p>` : nothing3}
906
+ ${this.description ? html3`<p part="description" class="description">${this.description}</p>` : nothing3}
907
+ ${this.ctaLabel ? html3`<span part="cta" class="cta">${this.ctaLabel}</span>` : nothing3}
908
+ </a>
909
+ `;
910
+ }
911
+ };
912
+ /** `focus()` on the element focuses its link, so `st-dropdown` can arrow-key to it. */
913
+ MegaMenuFeature.shadowRootOptions = { ...LitElement3.shadowRootOptions, delegatesFocus: true };
914
+ MegaMenuFeature.styles = css3`
915
+ ${controlBaseStyles}
916
+
917
+ :host {
918
+ display: block;
919
+ ${fontFamilyStyles}
920
+ }
921
+
922
+ .card {
923
+ display: flex;
924
+ flex-direction: column;
925
+ gap: 0.75rem;
926
+ box-sizing: border-box;
927
+ color: var(--st-color-text-strong);
928
+ text-decoration: none;
929
+ }
930
+
931
+ .image {
932
+ display: block;
933
+ width: 100%;
934
+ aspect-ratio: 9 / 8;
935
+ object-fit: cover;
936
+ border-radius: 20px;
937
+ transition: transform 0.3s ease;
938
+ }
939
+
940
+ .card:hover .image {
941
+ transform: scale(1.015);
942
+ }
943
+
944
+ .eyebrow {
945
+ font-size: 0.75rem;
946
+ font-weight: 600;
947
+ letter-spacing: 0.06em;
948
+ text-transform: uppercase;
949
+ color: var(--st-color-accent-text);
950
+ }
951
+
952
+ .title {
953
+ margin: 0;
954
+ font-size: 1.125rem;
955
+ font-weight: 500;
956
+ line-height: 1.3;
957
+ }
958
+
959
+ .description {
960
+ margin: 0;
961
+ font-size: 0.9375rem;
962
+ line-height: 1.5;
963
+ }
964
+
965
+ .cta {
966
+ align-self: flex-start;
967
+ margin-top: 0.75rem;
968
+ font-size: 0.9375rem;
969
+ font-weight: 500;
970
+ text-decoration: underline;
971
+ text-underline-offset: 5px;
972
+ text-decoration-thickness: 1px;
973
+ }
974
+
975
+ .card:hover .cta,
976
+ .card:focus-visible .cta {
977
+ text-decoration-thickness: 2px;
978
+ }
979
+
980
+ /* overlay */
981
+ :host([variant='overlay']) .card {
982
+ justify-content: flex-end;
983
+ gap: 0.5rem;
984
+ min-height: 15rem;
985
+ padding: 1.75rem;
986
+ border-radius: 20px;
987
+ color: #fff;
988
+ background-color: var(--st-color-accent);
989
+ background-image:
990
+ linear-gradient(to top, rgb(0 0 0 / 0.55), rgb(0 0 0 / 0.05)),
991
+ var(--st-mega-menu-feature-image, linear-gradient(160deg, var(--st-mega-menu-feature-from, var(--st-color-accent)), var(--st-mega-menu-feature-to, oklch(0.25 0.12 280))));
992
+ background-size: cover;
993
+ background-position: center;
994
+ transition: transform 0.2s ease;
995
+ }
996
+
997
+ :host([variant='overlay']) .card:hover {
998
+ transform: translateY(-2px);
999
+ }
1000
+
1001
+ :host([variant='overlay']) .logo {
1002
+ height: 2.25rem;
1003
+ width: auto;
1004
+ max-width: 70%;
1005
+ margin-bottom: auto;
1006
+ align-self: flex-start;
1007
+ object-fit: contain;
1008
+ }
1009
+
1010
+ :host([variant='overlay']) .title {
1011
+ font-size: 1.75rem;
1012
+ font-weight: 400;
1013
+ }
1014
+
1015
+ :host([variant='overlay']) .eyebrow,
1016
+ :host([variant='overlay']) .cta {
1017
+ color: inherit;
1018
+ }
1019
+
1020
+ /* tip: a light-blue card with dark text, like a tip panel on a page. */
1021
+ :host([variant='tip']) .card {
1022
+ gap: 0.5rem;
1023
+ padding: 1.25rem;
1024
+ border-radius: var(--st-radius-md);
1025
+ border: 1px solid var(--st-color-accent-border);
1026
+ background: var(--st-color-accent-subtle);
1027
+ color: var(--st-color-text);
1028
+ transition: border-color 0.2s ease;
1029
+ }
1030
+
1031
+ :host([variant='tip']) .card:hover {
1032
+ border-color: var(--st-color-accent-muted);
1033
+ }
1034
+
1035
+ :host([variant='tip']) .title {
1036
+ font-size: var(--st-text-lg);
1037
+ font-weight: var(--st-font-weight-semibold);
1038
+ color: var(--st-color-text-strong);
1039
+ }
1040
+
1041
+ :host([variant='tip']) .eyebrow,
1042
+ :host([variant='tip']) .cta {
1043
+ color: var(--st-color-accent-text);
1044
+ }
1045
+
1046
+ @media (prefers-reduced-motion: reduce) {
1047
+ .image,
1048
+ :host([variant='overlay']) .card {
1049
+ transition: none;
1050
+ }
1051
+ }
1052
+ `;
1053
+ __decorateClass([
1054
+ property3({ type: String, reflect: true })
1055
+ ], MegaMenuFeature.prototype, "variant", 2);
1056
+ __decorateClass([
1057
+ property3({ type: String })
1058
+ ], MegaMenuFeature.prototype, "title", 2);
1059
+ __decorateClass([
1060
+ property3({ type: String })
1061
+ ], MegaMenuFeature.prototype, "description", 2);
1062
+ __decorateClass([
1063
+ property3({ type: String })
1064
+ ], MegaMenuFeature.prototype, "eyebrow", 2);
1065
+ __decorateClass([
1066
+ property3({ type: String })
1067
+ ], MegaMenuFeature.prototype, "href", 2);
1068
+ __decorateClass([
1069
+ property3({ type: String })
1070
+ ], MegaMenuFeature.prototype, "target", 2);
1071
+ __decorateClass([
1072
+ property3({ type: String, attribute: "image-url" })
1073
+ ], MegaMenuFeature.prototype, "imageUrl", 2);
1074
+ __decorateClass([
1075
+ property3({ type: String, attribute: "image-alt" })
1076
+ ], MegaMenuFeature.prototype, "imageAlt", 2);
1077
+ __decorateClass([
1078
+ property3({ type: String, attribute: "logo-url" })
1079
+ ], MegaMenuFeature.prototype, "logoUrl", 2);
1080
+ __decorateClass([
1081
+ property3({ type: String, attribute: "logo-alt" })
1082
+ ], MegaMenuFeature.prototype, "logoAlt", 2);
1083
+ __decorateClass([
1084
+ property3({ type: String, attribute: "cta-label" })
1085
+ ], MegaMenuFeature.prototype, "ctaLabel", 2);
1086
+ __decorateClass([
1087
+ property3({ attribute: false })
1088
+ ], MegaMenuFeature.prototype, "currentPath", 2);
1089
+ MegaMenuFeature = __decorateClass([
1090
+ customElement3("st-mega-menu-feature")
1091
+ ], MegaMenuFeature);
1092
+
1093
+ export {
1094
+ MegaMenu,
1095
+ MegaMenuColumn,
1096
+ MegaMenuFeature
1097
+ };
1098
+ //# sourceMappingURL=chunk-MIBVQXRU.js.map