@sankhyatronics/sankhya-cms 0.0.0-stage → 0.0.9

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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -3
  3. package/custom-elements.json +4008 -0
  4. package/dist/bento-grid/index.d.ts +27 -0
  5. package/dist/bento-grid/index.js +10 -0
  6. package/dist/bento-grid/index.js.map +1 -0
  7. package/dist/card/index.d.ts +20 -0
  8. package/dist/card/index.js +9 -0
  9. package/dist/card/index.js.map +1 -0
  10. package/dist/carousel/index.d.ts +44 -0
  11. package/dist/carousel/index.js +10 -0
  12. package/dist/carousel/index.js.map +1 -0
  13. package/dist/chunk-23IHTBAB.js +557 -0
  14. package/dist/chunk-23IHTBAB.js.map +1 -0
  15. package/dist/chunk-2VZFHTBC.js +203 -0
  16. package/dist/chunk-2VZFHTBC.js.map +1 -0
  17. package/dist/chunk-3ERKQNZT.js +155 -0
  18. package/dist/chunk-3ERKQNZT.js.map +1 -0
  19. package/dist/chunk-3JU3R22O.js +193 -0
  20. package/dist/chunk-3JU3R22O.js.map +1 -0
  21. package/dist/chunk-3TCP25JG.js +347 -0
  22. package/dist/chunk-3TCP25JG.js.map +1 -0
  23. package/dist/chunk-3VE6VFJ4.js +87 -0
  24. package/dist/chunk-3VE6VFJ4.js.map +1 -0
  25. package/dist/chunk-4HKSA5UT.js +312 -0
  26. package/dist/chunk-4HKSA5UT.js.map +1 -0
  27. package/dist/chunk-5REZSZCK.js +266 -0
  28. package/dist/chunk-5REZSZCK.js.map +1 -0
  29. package/dist/chunk-5UFRGZWG.js +268 -0
  30. package/dist/chunk-5UFRGZWG.js.map +1 -0
  31. package/dist/chunk-74MILER4.js +215 -0
  32. package/dist/chunk-74MILER4.js.map +1 -0
  33. package/dist/chunk-7PSYCTEN.js +118 -0
  34. package/dist/chunk-7PSYCTEN.js.map +1 -0
  35. package/dist/chunk-E52WO7R7.js +279 -0
  36. package/dist/chunk-E52WO7R7.js.map +1 -0
  37. package/dist/chunk-EUXUH3YW.js +15 -0
  38. package/dist/chunk-EUXUH3YW.js.map +1 -0
  39. package/dist/chunk-IMACP7HN.js +156 -0
  40. package/dist/chunk-IMACP7HN.js.map +1 -0
  41. package/dist/chunk-LHU23TF6.js +273 -0
  42. package/dist/chunk-LHU23TF6.js.map +1 -0
  43. package/dist/chunk-OEX5FDMR.js +250 -0
  44. package/dist/chunk-OEX5FDMR.js.map +1 -0
  45. package/dist/chunk-RHAOQ6K4.js +138 -0
  46. package/dist/chunk-RHAOQ6K4.js.map +1 -0
  47. package/dist/chunk-RMIJVTFS.js +397 -0
  48. package/dist/chunk-RMIJVTFS.js.map +1 -0
  49. package/dist/chunk-TIU73O7I.js +221 -0
  50. package/dist/chunk-TIU73O7I.js.map +1 -0
  51. package/dist/chunk-USNFT4DU.js +125 -0
  52. package/dist/chunk-USNFT4DU.js.map +1 -0
  53. package/dist/chunk-VYON56QO.js +90 -0
  54. package/dist/chunk-VYON56QO.js.map +1 -0
  55. package/dist/chunk-WCO7JAIK.js +195 -0
  56. package/dist/chunk-WCO7JAIK.js.map +1 -0
  57. package/dist/chunk-XHBC23TV.js +254 -0
  58. package/dist/chunk-XHBC23TV.js.map +1 -0
  59. package/dist/chunk-XXPBFHWR.js +70 -0
  60. package/dist/chunk-XXPBFHWR.js.map +1 -0
  61. package/dist/chunk-YYK4GQUW.js +299 -0
  62. package/dist/chunk-YYK4GQUW.js.map +1 -0
  63. package/dist/cms-theme.css +15 -0
  64. package/dist/content-block/index.d.ts +25 -0
  65. package/dist/content-block/index.js +11 -0
  66. package/dist/content-block/index.js.map +1 -0
  67. package/dist/cookie-consent/index.d.ts +33 -0
  68. package/dist/cookie-consent/index.js +9 -0
  69. package/dist/cookie-consent/index.js.map +1 -0
  70. package/dist/dropdown/index.d.ts +89 -0
  71. package/dist/dropdown/index.js +9 -0
  72. package/dist/dropdown/index.js.map +1 -0
  73. package/dist/feature-split/index.d.ts +38 -0
  74. package/dist/feature-split/index.js +11 -0
  75. package/dist/feature-split/index.js.map +1 -0
  76. package/dist/features-section/index.d.ts +50 -0
  77. package/dist/features-section/index.js +14 -0
  78. package/dist/features-section/index.js.map +1 -0
  79. package/dist/footer/index.d.ts +64 -0
  80. package/dist/footer/index.js +9 -0
  81. package/dist/footer/index.js.map +1 -0
  82. package/dist/header/index.d.ts +112 -0
  83. package/dist/header/index.js +10 -0
  84. package/dist/header/index.js.map +1 -0
  85. package/dist/hero/index.d.ts +32 -0
  86. package/dist/hero/index.js +10 -0
  87. package/dist/hero/index.js.map +1 -0
  88. package/dist/icon-button/index.d.ts +23 -0
  89. package/dist/icon-button/index.js +9 -0
  90. package/dist/icon-button/index.js.map +1 -0
  91. package/dist/index.d.ts +22 -0
  92. package/dist/index.js +93 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/items-accordion/index.d.ts +31 -0
  95. package/dist/items-accordion/index.js +10 -0
  96. package/dist/items-accordion/index.js.map +1 -0
  97. package/dist/markdown/index.d.ts +33 -0
  98. package/dist/markdown/index.js +9 -0
  99. package/dist/markdown/index.js.map +1 -0
  100. package/dist/menu-grid/index.d.ts +21 -0
  101. package/dist/menu-grid/index.js +9 -0
  102. package/dist/menu-grid/index.js.map +1 -0
  103. package/dist/menu-grid-item/index.d.ts +53 -0
  104. package/dist/menu-grid-item/index.js +9 -0
  105. package/dist/menu-grid-item/index.js.map +1 -0
  106. package/dist/menu-item/index.d.ts +50 -0
  107. package/dist/menu-item/index.js +9 -0
  108. package/dist/menu-item/index.js.map +1 -0
  109. package/dist/promo-banner/index.d.ts +22 -0
  110. package/dist/promo-banner/index.js +10 -0
  111. package/dist/promo-banner/index.js.map +1 -0
  112. package/dist/schema/index.d.ts +72 -0
  113. package/dist/schema/index.js +75 -0
  114. package/dist/schema/index.js.map +1 -0
  115. package/dist/select/index.d.ts +77 -0
  116. package/dist/select/index.js +10 -0
  117. package/dist/select/index.js.map +1 -0
  118. package/dist/shared/icons.d.ts +77 -0
  119. package/dist/shared/icons.js +64 -0
  120. package/dist/shared/icons.js.map +1 -0
  121. package/dist/shared/styles.d.ts +90 -0
  122. package/dist/shared/styles.js +48 -0
  123. package/dist/shared/styles.js.map +1 -0
  124. package/dist/stats/index.d.ts +17 -0
  125. package/dist/stats/index.js +9 -0
  126. package/dist/stats/index.js.map +1 -0
  127. package/dist/testimonials/index.d.ts +25 -0
  128. package/dist/testimonials/index.js +10 -0
  129. package/dist/testimonials/index.js.map +1 -0
  130. package/dist/theme.css +292 -0
  131. package/dist/themes.css +65 -0
  132. package/dist/theming/index.d.ts +28 -0
  133. package/dist/theming/index.js +53 -0
  134. package/dist/theming/index.js.map +1 -0
  135. package/package.json +160 -3
@@ -0,0 +1,27 @@
1
+ import * as lit from 'lit';
2
+ import { LitElement } from 'lit';
3
+
4
+ interface BentoGridItem {
5
+ title: string;
6
+ description?: string;
7
+ /** Iconify icon name, e.g. `mdi:home`. */
8
+ icon?: string;
9
+ imageSrc?: string;
10
+ imageAlt?: string;
11
+ colSpan?: 1 | 2 | 3 | 4;
12
+ rowSpan?: 1 | 2;
13
+ /** Turns the card into a link. */
14
+ href?: string;
15
+ }
16
+ /** A responsive 4-column bento grid of icon/image cards. Items are set via the `items` property. */
17
+ declare class BentoGrid extends LitElement {
18
+ static styles: lit.CSSResult;
19
+ inverted: boolean;
20
+ title: string;
21
+ subtitle: string;
22
+ items: BentoGridItem[];
23
+ private renderCard;
24
+ render(): lit.TemplateResult<1>;
25
+ }
26
+
27
+ export { BentoGrid, type BentoGridItem };
@@ -0,0 +1,10 @@
1
+ import {
2
+ BentoGrid
3
+ } from "../chunk-OEX5FDMR.js";
4
+ import "../chunk-3VE6VFJ4.js";
5
+ import "../chunk-RHAOQ6K4.js";
6
+ import "../chunk-EUXUH3YW.js";
7
+ export {
8
+ BentoGrid
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,20 @@
1
+ import * as lit from 'lit';
2
+ import { LitElement } from 'lit';
3
+
4
+ /**
5
+ * A surfaced container — content goes in the default slot. Ports `SankhyaUI`'s React `Card`
6
+ * (`variant`, `padding`, `elevation`, `hoverable`, `inverted`); `onClick` is just a native `click`
7
+ * listener on the element. `padding` takes `none | small | medium | large` (the source's
8
+ * `sm|md|lg`, spelled like `paddingScaleStyles`); `elevation` takes `none | sm | md | lg`.
9
+ */
10
+ declare class Card extends LitElement {
11
+ static styles: lit.CSSResult;
12
+ variant: 'default' | 'bordered';
13
+ padding: 'none' | 'small' | 'medium' | 'large';
14
+ elevation: 'none' | 'sm' | 'md' | 'lg';
15
+ hoverable: boolean;
16
+ inverted: boolean;
17
+ render(): lit.TemplateResult<1>;
18
+ }
19
+
20
+ export { Card };
@@ -0,0 +1,9 @@
1
+ import {
2
+ Card
3
+ } from "../chunk-7PSYCTEN.js";
4
+ import "../chunk-RHAOQ6K4.js";
5
+ import "../chunk-EUXUH3YW.js";
6
+ export {
7
+ Card
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,44 @@
1
+ import * as lit from 'lit';
2
+ import { LitElement } from 'lit';
3
+
4
+ /**
5
+ * Cycles through its slotted children, one visible at a time, with optional autoplay, arrows and
6
+ * dot indicators. The incoming slide slides in from the travel direction (CSS keyframes in place
7
+ * of the source's framer-motion spring). Autoplay pauses while hovered or focused and stops when
8
+ * the element is disconnected.
9
+ */
10
+ declare class Carousel extends LitElement {
11
+ static styles: lit.CSSResult;
12
+ autoPlay: boolean;
13
+ /** Autoplay delay in milliseconds. */
14
+ interval: number;
15
+ showArrows: boolean;
16
+ showIndicators: boolean;
17
+ private index;
18
+ private count;
19
+ private paused;
20
+ private timer?;
21
+ connectedCallback(): void;
22
+ disconnectedCallback(): void;
23
+ protected updated(changed: Map<string, unknown>): void;
24
+ private pause;
25
+ private resume;
26
+ private get slides();
27
+ private syncSlides;
28
+ private onSlotChange;
29
+ private stopTimer;
30
+ private restartTimer;
31
+ private go;
32
+ render(): lit.TemplateResult<1>;
33
+ }
34
+
35
+ interface CarouselChangeEventDetail {
36
+ index: number;
37
+ }
38
+ declare global {
39
+ interface HTMLElementEventMap {
40
+ 'carousel-change': CustomEvent<CarouselChangeEventDetail>;
41
+ }
42
+ }
43
+
44
+ export { Carousel, type CarouselChangeEventDetail };
@@ -0,0 +1,10 @@
1
+ import {
2
+ Carousel
3
+ } from "../chunk-XHBC23TV.js";
4
+ import "../chunk-3VE6VFJ4.js";
5
+ import "../chunk-RHAOQ6K4.js";
6
+ import "../chunk-EUXUH3YW.js";
7
+ export {
8
+ Carousel
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,557 @@
1
+ import {
2
+ chevronIcon,
3
+ closeIcon,
4
+ menuIcon
5
+ } from "./chunk-3TCP25JG.js";
6
+ import {
7
+ BREAKPOINT_TABLET,
8
+ buttonResetStyles,
9
+ controlBaseStyles,
10
+ dropdownPanelStyles,
11
+ rootFontFamilyStyles
12
+ } from "./chunk-RHAOQ6K4.js";
13
+ import {
14
+ __decorateClass
15
+ } from "./chunk-EUXUH3YW.js";
16
+
17
+ // src/header/Header.ts
18
+ import { LitElement, css, html, nothing } from "lit";
19
+ import { customElement, property, state } from "lit/decorators.js";
20
+ var Header = class extends LitElement {
21
+ constructor() {
22
+ super(...arguments);
23
+ this.title = "";
24
+ this.brandImageUrl = "";
25
+ this.altText = "Logo";
26
+ this.logoHref = "";
27
+ this.logoTarget = "_self";
28
+ this.logoClassName = "";
29
+ this.inverted = false;
30
+ this.sticky = false;
31
+ this.languages = [];
32
+ this.currentLanguageCode = "";
33
+ this.languageMenuLabel = "Language";
34
+ this.mobileOpen = false;
35
+ this.compact = false;
36
+ this.languageMenuOpen = false;
37
+ this.hasUtility = false;
38
+ /** The dropdowns this header switched to `inline` — only these are switched back, so a caller's
39
+ * own `inline` setting is left alone. */
40
+ this.inlinedDropdowns = /* @__PURE__ */ new Set();
41
+ /** While the hamburger layout is on, the dropdowns in the header open in the flow of the
42
+ * full-screen panel instead of floating over it (SankhyaUI's touch-device layout). */
43
+ this.syncInlineDropdowns = () => {
44
+ const collapsed = this.compact || !!this.narrowQuery?.matches;
45
+ const dropdowns = Array.from(this.querySelectorAll("st-dropdown"));
46
+ if (collapsed) {
47
+ for (const dropdown of dropdowns) {
48
+ if (dropdown.inline) continue;
49
+ dropdown.inline = true;
50
+ this.inlinedDropdowns.add(dropdown);
51
+ }
52
+ } else {
53
+ for (const dropdown of this.inlinedDropdowns) dropdown.inline = false;
54
+ this.inlinedDropdowns.clear();
55
+ }
56
+ };
57
+ this.onUtilitySlotChange = (event) => {
58
+ this.hasUtility = event.target.assignedElements({ flatten: true }).length > 0;
59
+ this.evaluateFit();
60
+ };
61
+ this.onMenuSlotChange = () => {
62
+ this.evaluateFit();
63
+ this.syncInlineDropdowns();
64
+ };
65
+ /** The bar width at which the menu last overflowed — the bar only expands again once it is
66
+ * clearly wider than this, so it can't flip back and forth right at the threshold. */
67
+ this.collapsedAtWidth = 0;
68
+ /** Collapses to the hamburger layout when the slotted menu overflows its row, and expands again
69
+ * once there is room. The collapsed layout hides the menu, so the room it needs can't be
70
+ * measured then; the width remembered when it collapsed stands in for it. */
71
+ this.evaluateFit = () => {
72
+ const width = this.clientWidth;
73
+ if (this.compact) {
74
+ if (width > this.collapsedAtWidth + 24) {
75
+ this.compact = false;
76
+ this.mobileOpen = false;
77
+ void this.updateComplete.then(this.evaluateFit);
78
+ }
79
+ return;
80
+ }
81
+ if (this.menuOverflows()) {
82
+ this.collapsedAtWidth = width;
83
+ this.compact = true;
84
+ }
85
+ };
86
+ this.closeOnEscape = (event) => {
87
+ if (this.mobileOpen && event.key === "Escape") this.mobileOpen = false;
88
+ if (this.languageMenuOpen && event.key === "Escape") this.languageMenuOpen = false;
89
+ };
90
+ this.closeLanguageMenuOnOutsideClick = (event) => {
91
+ if (this.languageMenuOpen && !event.composedPath().includes(this)) this.languageMenuOpen = false;
92
+ };
93
+ }
94
+ updated(changed) {
95
+ if (changed.has("compact")) this.syncInlineDropdowns();
96
+ }
97
+ /** Whether the visible menu items reach past the right edge of the menu row. Measured from the
98
+ * items' own boxes (the slotted elements and their direct children), not the row's scrollWidth:
99
+ * a closed dropdown's absolutely positioned panel also counts towards scrollWidth, which would
100
+ * report overflow at any width. */
101
+ menuOverflows() {
102
+ const row = this.renderRoot.querySelector(".menu-row");
103
+ const slot = this.renderRoot.querySelector('slot[name="menu"]');
104
+ if (!row || !slot) return false;
105
+ const limit = row.getBoundingClientRect().right + 1;
106
+ let right = 0;
107
+ for (const el of slot.assignedElements({ flatten: true })) {
108
+ for (const box of [el, ...Array.from(el.children)]) {
109
+ const rect = box.getBoundingClientRect();
110
+ if (rect.width > 0) right = Math.max(right, rect.right);
111
+ }
112
+ }
113
+ return right > limit;
114
+ }
115
+ firstUpdated() {
116
+ this.resizeObserver = new ResizeObserver(this.evaluateFit);
117
+ this.resizeObserver.observe(this);
118
+ this.evaluateFit();
119
+ this.syncInlineDropdowns();
120
+ }
121
+ connectedCallback() {
122
+ super.connectedCallback();
123
+ window.addEventListener("keydown", this.closeOnEscape);
124
+ window.addEventListener("click", this.closeLanguageMenuOnOutsideClick);
125
+ this.narrowQuery = window.matchMedia(`(max-width: ${BREAKPOINT_TABLET}px)`);
126
+ this.narrowQuery.addEventListener("change", this.syncInlineDropdowns);
127
+ this.lightDomObserver = new MutationObserver(this.syncInlineDropdowns);
128
+ this.lightDomObserver.observe(this, { childList: true, subtree: true });
129
+ }
130
+ disconnectedCallback() {
131
+ this.lightDomObserver?.disconnect();
132
+ this.narrowQuery?.removeEventListener("change", this.syncInlineDropdowns);
133
+ this.resizeObserver?.disconnect();
134
+ window.removeEventListener("keydown", this.closeOnEscape);
135
+ window.removeEventListener("click", this.closeLanguageMenuOnOutsideClick);
136
+ super.disconnectedCallback();
137
+ }
138
+ renderLanguageMenu() {
139
+ if (this.languages.length < 2) return nothing;
140
+ const current = this.languages.find((lang) => lang.code === this.currentLanguageCode);
141
+ return html`
142
+ <div class="lang-menu" part="language-menu">
143
+ <button
144
+ part="language-menu-trigger"
145
+ type="button"
146
+ class="lang-trigger"
147
+ aria-label=${this.languageMenuLabel}
148
+ aria-expanded=${this.languageMenuOpen}
149
+ @click=${(event) => {
150
+ event.stopPropagation();
151
+ this.languageMenuOpen = !this.languageMenuOpen;
152
+ }}
153
+ >
154
+ <span part="language-menu-current">${current?.label ?? this.languageMenuLabel}</span>
155
+ ${chevronIcon("down", 10)}
156
+ </button>
157
+ ${this.languageMenuOpen ? html`
158
+ <div part="language-dropdown" class="lang-dropdown">
159
+ ${this.languages.map(
160
+ (lang) => html`
161
+ <button
162
+ part="language-option"
163
+ type="button"
164
+ class="lang-option ${lang.code === this.currentLanguageCode ? "active" : ""}"
165
+ aria-current=${lang.code === this.currentLanguageCode}
166
+ @click=${() => this.onLanguageSelect(lang.code)}
167
+ >
168
+ ${lang.label}
169
+ </button>
170
+ `
171
+ )}
172
+ </div>
173
+ ` : nothing}
174
+ </div>
175
+ `;
176
+ }
177
+ onLanguageSelect(code) {
178
+ this.languageMenuOpen = false;
179
+ if (code === this.currentLanguageCode) return;
180
+ this.dispatchEvent(new CustomEvent("language-change", { detail: { code }, bubbles: true, composed: true }));
181
+ }
182
+ renderBrand() {
183
+ const content = html`
184
+ ${this.brandImageUrl ? html`<img part="brand-mark" class="brand-mark" src=${this.brandImageUrl} alt=${this.altText} /> ` : nothing}
185
+ <span part="brand-title" class="brand-title">${this.title}</span>
186
+ `;
187
+ return this.logoHref ? html`<a part="brand" class="brand ${this.logoClassName}" href=${this.logoHref} target=${this.logoTarget}>${content}</a>` : html`<div part="brand" class="brand ${this.logoClassName}">${content}</div>`;
188
+ }
189
+ render() {
190
+ return html`
191
+ ${this.renderBrand()}
192
+
193
+ <div class="mobile-panel" part="mobile-panel" @click=${() => this.mobileOpen = false}>
194
+ <div class="menu-row" part="menu-row"><slot name="menu" @slotchange=${this.onMenuSlotChange}></slot></div>
195
+ <div class="utility-row ${this.hasUtility || this.languages.length >= 2 ? "" : "empty"}" part="utility-row">
196
+ ${this.renderLanguageMenu()}<slot name="utility" @slotchange=${this.onUtilitySlotChange}></slot>
197
+ </div>
198
+ </div>
199
+
200
+ <button
201
+ part="toggle"
202
+ type="button"
203
+ class="toggle"
204
+ aria-label=${this.mobileOpen ? "Close menu" : "Open menu"}
205
+ aria-expanded=${this.mobileOpen}
206
+ @click=${() => this.mobileOpen = !this.mobileOpen}
207
+ >
208
+ ${this.mobileOpen ? closeIcon() : menuIcon()}
209
+ </button>
210
+ `;
211
+ }
212
+ };
213
+ Header.styles = css`
214
+ ${controlBaseStyles}
215
+
216
+ :host {
217
+ display: flex;
218
+ align-items: center;
219
+ /* Spacing between brand, menu and utility controls is the rows' own margins (SankhyaUI's
220
+ layout), not a flex gap. */
221
+ gap: 0;
222
+ /* !important on the box-model properties only: a shadow host's own :host rule always loses
223
+ * to ANY rule the consuming page has for the same property on that element, regardless of
224
+ * specificity (see st-footer's own padding/border-top for the same fix). Without
225
+ * box-sizing: border-box pinned here, a page that also sets its own padding on this host
226
+ * (e.g. a p-2 utility class) adds that padding on TOP of the fixed 64px height instead of
227
+ * being absorbed inside it — which is exactly what happens in Template Hub, the one app that
228
+ * doesn't load Tailwind Preflight (Preflight's own box-sizing: border-box reset is what
229
+ * silently keeps every other app's header at the intended 64px). */
230
+ box-sizing: border-box !important;
231
+ padding: 0 2rem !important;
232
+ height: 64px !important;
233
+ background: var(--st-color-surface);
234
+ border-bottom: 1px solid var(--st-color-border) !important;
235
+ ${rootFontFamilyStyles}
236
+ color: var(--st-color-text-strong);
237
+ }
238
+
239
+ :host([sticky]) {
240
+ position: sticky;
241
+ top: 0;
242
+ z-index: 100;
243
+ }
244
+
245
+ :host([inverted]) {
246
+ background: var(--st-color-text-strong);
247
+ color: var(--st-color-on-solid);
248
+ border-bottom-color: transparent;
249
+ }
250
+
251
+ .brand {
252
+ display: flex;
253
+ align-items: center;
254
+ gap: var(--st-space-10);
255
+ flex: none;
256
+ text-decoration: none;
257
+ color: inherit;
258
+ }
259
+
260
+ .brand-mark {
261
+ width: var(--st-size-28);
262
+ height: var(--st-size-28);
263
+ border-radius: var(--st-radius-sm);
264
+ flex: none;
265
+ object-fit: contain;
266
+ }
267
+
268
+ .brand-title {
269
+ font-size: var(--st-text-xl);
270
+ font-weight: var(--st-font-weight-bold);
271
+ letter-spacing: var(--st-tracking-tight);
272
+ white-space: nowrap;
273
+ }
274
+
275
+ /* Desktop: a transparent pass-through so .menu-row/.utility-row lay out directly as :host's
276
+ own flex children. Mobile (see below) turns this into the actual overlay box. */
277
+ .mobile-panel {
278
+ display: contents;
279
+ }
280
+
281
+ /* Desktop layout from SankhyaUI's Header: the menu starts 4rem after the brand and takes the
282
+ free width; the utility controls sit after a vertical divider. Between 901px and 1200px the
283
+ gaps tighten so the menu still fits down to the 900px hamburger breakpoint. */
284
+ .menu-row {
285
+ flex: 1;
286
+ display: flex;
287
+ align-items: center;
288
+ gap: 1.5rem;
289
+ min-width: 0;
290
+ margin-left: 4rem;
291
+ }
292
+
293
+ .utility-row {
294
+ flex: none;
295
+ display: flex;
296
+ align-items: center;
297
+ gap: 1rem;
298
+ margin-left: 1.5rem;
299
+ padding-left: 1.5rem;
300
+ border-left: 1px solid var(--st-color-border);
301
+ }
302
+
303
+ :host([inverted]) .utility-row {
304
+ border-left-color: currentColor;
305
+ }
306
+
307
+ .utility-row.empty {
308
+ display: none;
309
+ }
310
+
311
+ @media (max-width: 1200px) {
312
+ :host {
313
+ padding: 0 1rem !important;
314
+ }
315
+
316
+ .menu-row {
317
+ margin-left: 0.5rem;
318
+ }
319
+
320
+ .utility-row {
321
+ margin-left: 0.5rem;
322
+ padding-left: 0.5rem;
323
+ }
324
+ }
325
+
326
+ @keyframes st-header-fade-in {
327
+ from {
328
+ opacity: 0;
329
+ }
330
+ to {
331
+ opacity: 1;
332
+ }
333
+ }
334
+
335
+ .toggle {
336
+ display: none;
337
+ align-items: center;
338
+ justify-content: center;
339
+ flex: none;
340
+ position: relative;
341
+ z-index: 1002;
342
+ width: var(--st-size-32);
343
+ height: var(--st-size-32);
344
+ margin-left: auto;
345
+ padding: 0.5rem;
346
+ border: 0;
347
+ border-radius: var(--st-radius-sm);
348
+ background: transparent;
349
+ color: var(--st-color-text-strong);
350
+ cursor: pointer;
351
+ }
352
+
353
+ .toggle:hover {
354
+ background: var(--st-color-hover);
355
+ }
356
+
357
+ .lang-menu {
358
+ position: relative;
359
+ flex: none;
360
+ }
361
+
362
+ .lang-trigger {
363
+ ${buttonResetStyles}
364
+ display: flex;
365
+ align-items: center;
366
+ gap: var(--st-space-4);
367
+ height: var(--st-size-32);
368
+ padding: 0 var(--st-space-8);
369
+ border-radius: var(--st-radius-sm);
370
+ font-size: var(--st-text-base);
371
+ font-weight: var(--st-font-weight-semibold);
372
+ color: var(--st-color-text-muted);
373
+ }
374
+
375
+ .lang-trigger:hover {
376
+ background: var(--st-color-hover);
377
+ color: var(--st-color-text-strong);
378
+ }
379
+
380
+ .lang-dropdown {
381
+ ${dropdownPanelStyles}
382
+ min-width: 140px;
383
+ }
384
+
385
+ .lang-option {
386
+ ${buttonResetStyles}
387
+ display: block;
388
+ width: 100%;
389
+ padding: var(--st-space-10) var(--st-space-14);
390
+ font-size: var(--st-text-base);
391
+ font-weight: var(--st-font-weight-semibold);
392
+ text-align: left;
393
+ color: inherit;
394
+ }
395
+
396
+ .lang-option:hover {
397
+ background: var(--st-color-hover);
398
+ }
399
+
400
+ .lang-option.active {
401
+ color: var(--st-color-accent-text);
402
+ }
403
+
404
+ /* Hamburger layout from SankhyaUI's Header: a full-screen layer under the toggle, menu above
405
+ the utility controls, the menu's dropdowns opening in the flow (see syncInlineDropdowns). */
406
+ @media (max-width: ${BREAKPOINT_TABLET}px) {
407
+ :host {
408
+ padding: 0 1rem !important;
409
+ }
410
+
411
+ .mobile-panel {
412
+ display: none;
413
+ }
414
+
415
+ .toggle {
416
+ display: inline-flex;
417
+ }
418
+
419
+ :host([mobile-open]) .mobile-panel {
420
+ display: flex;
421
+ flex-direction: column;
422
+ gap: 2rem;
423
+ position: fixed;
424
+ inset: 0;
425
+ background: var(--st-color-surface);
426
+ padding: 5rem 1.5rem 2rem;
427
+ overflow-y: auto;
428
+ z-index: 1001;
429
+ animation: st-header-fade-in 0.3s ease;
430
+ }
431
+
432
+ :host([mobile-open]) .menu-row,
433
+ :host([mobile-open]) .utility-row {
434
+ flex-direction: column;
435
+ align-items: stretch;
436
+ gap: 1.5rem;
437
+ margin-left: 0;
438
+ }
439
+
440
+ :host([mobile-open]) .utility-row {
441
+ padding: 1.5rem 0 0;
442
+ border-left: 0;
443
+ border-top: 1px solid var(--st-color-border);
444
+ }
445
+
446
+ /* Apps usually slot one flex-row wrapper per slot; stack its items as the source does. */
447
+ :host([mobile-open]) ::slotted([slot='menu']),
448
+ :host([mobile-open]) ::slotted([slot='utility']) {
449
+ flex-direction: column !important;
450
+ align-items: stretch !important;
451
+ margin: 0 !important;
452
+ }
453
+ }
454
+
455
+ /* The same collapsed layout, switched on by script when the menu no longer fits the bar at
456
+ desktop width (see evaluateFit) — without it the menu spills over the utility controls. */
457
+ :host([compact]) .mobile-panel {
458
+ display: none;
459
+ }
460
+
461
+ :host([compact]) .toggle {
462
+ display: inline-flex;
463
+ }
464
+
465
+ :host([compact][mobile-open]) .mobile-panel {
466
+ display: flex;
467
+ flex-direction: column;
468
+ gap: 2rem;
469
+ position: fixed;
470
+ inset: 0;
471
+ background: var(--st-color-surface);
472
+ padding: 5rem 1.5rem 2rem;
473
+ overflow-y: auto;
474
+ z-index: 1001;
475
+ animation: st-header-fade-in 0.3s ease;
476
+ }
477
+
478
+ :host([compact][mobile-open]) .menu-row,
479
+ :host([compact][mobile-open]) .utility-row {
480
+ flex-direction: column;
481
+ align-items: stretch;
482
+ gap: 1.5rem;
483
+ margin-left: 0;
484
+ }
485
+
486
+ :host([compact][mobile-open]) .utility-row {
487
+ padding: 1.5rem 0 0;
488
+ border-left: 0;
489
+ border-top: 1px solid var(--st-color-border);
490
+ }
491
+
492
+ :host([compact][mobile-open]) ::slotted([slot='menu']),
493
+ :host([compact][mobile-open]) ::slotted([slot='utility']) {
494
+ flex-direction: column !important;
495
+ align-items: stretch !important;
496
+ margin: 0 !important;
497
+ }
498
+
499
+ @media (prefers-reduced-motion: reduce) {
500
+ .mobile-panel {
501
+ animation: none !important;
502
+ }
503
+ }
504
+ `;
505
+ __decorateClass([
506
+ property({ type: String })
507
+ ], Header.prototype, "title", 2);
508
+ __decorateClass([
509
+ property({ type: String, attribute: "brand-image-url" })
510
+ ], Header.prototype, "brandImageUrl", 2);
511
+ __decorateClass([
512
+ property({ type: String, attribute: "alt-text" })
513
+ ], Header.prototype, "altText", 2);
514
+ __decorateClass([
515
+ property({ type: String })
516
+ ], Header.prototype, "logoHref", 2);
517
+ __decorateClass([
518
+ property({ type: String, attribute: "logo-target" })
519
+ ], Header.prototype, "logoTarget", 2);
520
+ __decorateClass([
521
+ property({ type: String, attribute: "logo-class-name" })
522
+ ], Header.prototype, "logoClassName", 2);
523
+ __decorateClass([
524
+ property({ type: Boolean, reflect: true })
525
+ ], Header.prototype, "inverted", 2);
526
+ __decorateClass([
527
+ property({ type: Boolean, reflect: true })
528
+ ], Header.prototype, "sticky", 2);
529
+ __decorateClass([
530
+ property({ attribute: false })
531
+ ], Header.prototype, "languages", 2);
532
+ __decorateClass([
533
+ property({ type: String, attribute: "current-language-code" })
534
+ ], Header.prototype, "currentLanguageCode", 2);
535
+ __decorateClass([
536
+ property({ type: String, attribute: "language-menu-label" })
537
+ ], Header.prototype, "languageMenuLabel", 2);
538
+ __decorateClass([
539
+ property({ type: Boolean, reflect: true, attribute: "mobile-open" })
540
+ ], Header.prototype, "mobileOpen", 2);
541
+ __decorateClass([
542
+ property({ type: Boolean, reflect: true })
543
+ ], Header.prototype, "compact", 2);
544
+ __decorateClass([
545
+ state()
546
+ ], Header.prototype, "languageMenuOpen", 2);
547
+ __decorateClass([
548
+ state()
549
+ ], Header.prototype, "hasUtility", 2);
550
+ Header = __decorateClass([
551
+ customElement("st-header")
552
+ ], Header);
553
+
554
+ export {
555
+ Header
556
+ };
557
+ //# sourceMappingURL=chunk-23IHTBAB.js.map