@sankhyatronics/sankhya-cms 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +34 -3
  2. package/custom-elements.json +4008 -0
  3. package/dist/bento-grid/index.d.ts +27 -0
  4. package/dist/bento-grid/index.js +10 -0
  5. package/dist/bento-grid/index.js.map +1 -0
  6. package/dist/card/index.d.ts +20 -0
  7. package/dist/card/index.js +9 -0
  8. package/dist/card/index.js.map +1 -0
  9. package/dist/carousel/index.d.ts +44 -0
  10. package/dist/carousel/index.js +10 -0
  11. package/dist/carousel/index.js.map +1 -0
  12. package/dist/chunk-23IHTBAB.js +557 -0
  13. package/dist/chunk-23IHTBAB.js.map +1 -0
  14. package/dist/chunk-2VZFHTBC.js +203 -0
  15. package/dist/chunk-2VZFHTBC.js.map +1 -0
  16. package/dist/chunk-3ERKQNZT.js +155 -0
  17. package/dist/chunk-3ERKQNZT.js.map +1 -0
  18. package/dist/chunk-3JU3R22O.js +193 -0
  19. package/dist/chunk-3JU3R22O.js.map +1 -0
  20. package/dist/chunk-3TCP25JG.js +347 -0
  21. package/dist/chunk-3TCP25JG.js.map +1 -0
  22. package/dist/chunk-3VE6VFJ4.js +87 -0
  23. package/dist/chunk-3VE6VFJ4.js.map +1 -0
  24. package/dist/chunk-4HKSA5UT.js +312 -0
  25. package/dist/chunk-4HKSA5UT.js.map +1 -0
  26. package/dist/chunk-5REZSZCK.js +266 -0
  27. package/dist/chunk-5REZSZCK.js.map +1 -0
  28. package/dist/chunk-5UFRGZWG.js +268 -0
  29. package/dist/chunk-5UFRGZWG.js.map +1 -0
  30. package/dist/chunk-74MILER4.js +215 -0
  31. package/dist/chunk-74MILER4.js.map +1 -0
  32. package/dist/chunk-7PSYCTEN.js +118 -0
  33. package/dist/chunk-7PSYCTEN.js.map +1 -0
  34. package/dist/chunk-CDC4P77V.js +299 -0
  35. package/dist/chunk-CDC4P77V.js.map +1 -0
  36. package/dist/chunk-E52WO7R7.js +279 -0
  37. package/dist/chunk-E52WO7R7.js.map +1 -0
  38. package/dist/chunk-EUXUH3YW.js +15 -0
  39. package/dist/chunk-EUXUH3YW.js.map +1 -0
  40. package/dist/chunk-IMACP7HN.js +156 -0
  41. package/dist/chunk-IMACP7HN.js.map +1 -0
  42. package/dist/chunk-LHU23TF6.js +273 -0
  43. package/dist/chunk-LHU23TF6.js.map +1 -0
  44. package/dist/chunk-OEX5FDMR.js +250 -0
  45. package/dist/chunk-OEX5FDMR.js.map +1 -0
  46. package/dist/chunk-RHAOQ6K4.js +138 -0
  47. package/dist/chunk-RHAOQ6K4.js.map +1 -0
  48. package/dist/chunk-RMIJVTFS.js +397 -0
  49. package/dist/chunk-RMIJVTFS.js.map +1 -0
  50. package/dist/chunk-U7YKCCJG.js +228 -0
  51. package/dist/chunk-U7YKCCJG.js.map +1 -0
  52. package/dist/chunk-USNFT4DU.js +125 -0
  53. package/dist/chunk-USNFT4DU.js.map +1 -0
  54. package/dist/chunk-VYON56QO.js +90 -0
  55. package/dist/chunk-VYON56QO.js.map +1 -0
  56. package/dist/chunk-WCO7JAIK.js +195 -0
  57. package/dist/chunk-WCO7JAIK.js.map +1 -0
  58. package/dist/chunk-XHBC23TV.js +254 -0
  59. package/dist/chunk-XHBC23TV.js.map +1 -0
  60. package/dist/chunk-XXPBFHWR.js +70 -0
  61. package/dist/chunk-XXPBFHWR.js.map +1 -0
  62. package/dist/cms-theme.css +15 -0
  63. package/dist/content-block/index.d.ts +25 -0
  64. package/dist/content-block/index.js +11 -0
  65. package/dist/content-block/index.js.map +1 -0
  66. package/dist/cookie-consent/index.d.ts +33 -0
  67. package/dist/cookie-consent/index.js +9 -0
  68. package/dist/cookie-consent/index.js.map +1 -0
  69. package/dist/dropdown/index.d.ts +89 -0
  70. package/dist/dropdown/index.js +9 -0
  71. package/dist/dropdown/index.js.map +1 -0
  72. package/dist/feature-split/index.d.ts +38 -0
  73. package/dist/feature-split/index.js +11 -0
  74. package/dist/feature-split/index.js.map +1 -0
  75. package/dist/features-section/index.d.ts +50 -0
  76. package/dist/features-section/index.js +14 -0
  77. package/dist/features-section/index.js.map +1 -0
  78. package/dist/footer/index.d.ts +64 -0
  79. package/dist/footer/index.js +9 -0
  80. package/dist/footer/index.js.map +1 -0
  81. package/dist/header/index.d.ts +112 -0
  82. package/dist/header/index.js +10 -0
  83. package/dist/header/index.js.map +1 -0
  84. package/dist/hero/index.d.ts +32 -0
  85. package/dist/hero/index.js +10 -0
  86. package/dist/hero/index.js.map +1 -0
  87. package/dist/icon-button/index.d.ts +23 -0
  88. package/dist/icon-button/index.js +9 -0
  89. package/dist/icon-button/index.js.map +1 -0
  90. package/dist/index.d.ts +22 -0
  91. package/dist/index.js +93 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/items-accordion/index.d.ts +31 -0
  94. package/dist/items-accordion/index.js +10 -0
  95. package/dist/items-accordion/index.js.map +1 -0
  96. package/dist/markdown/index.d.ts +33 -0
  97. package/dist/markdown/index.js +9 -0
  98. package/dist/markdown/index.js.map +1 -0
  99. package/dist/menu-grid/index.d.ts +21 -0
  100. package/dist/menu-grid/index.js +9 -0
  101. package/dist/menu-grid/index.js.map +1 -0
  102. package/dist/menu-grid-item/index.d.ts +53 -0
  103. package/dist/menu-grid-item/index.js +9 -0
  104. package/dist/menu-grid-item/index.js.map +1 -0
  105. package/dist/menu-item/index.d.ts +50 -0
  106. package/dist/menu-item/index.js +9 -0
  107. package/dist/menu-item/index.js.map +1 -0
  108. package/dist/promo-banner/index.d.ts +22 -0
  109. package/dist/promo-banner/index.js +10 -0
  110. package/dist/promo-banner/index.js.map +1 -0
  111. package/dist/schema/index.d.ts +72 -0
  112. package/dist/schema/index.js +75 -0
  113. package/dist/schema/index.js.map +1 -0
  114. package/dist/select/index.d.ts +77 -0
  115. package/dist/select/index.js +10 -0
  116. package/dist/select/index.js.map +1 -0
  117. package/dist/shared/icons.d.ts +77 -0
  118. package/dist/shared/icons.js +64 -0
  119. package/dist/shared/icons.js.map +1 -0
  120. package/dist/shared/styles.d.ts +90 -0
  121. package/dist/shared/styles.js +48 -0
  122. package/dist/shared/styles.js.map +1 -0
  123. package/dist/stats/index.d.ts +17 -0
  124. package/dist/stats/index.js +9 -0
  125. package/dist/stats/index.js.map +1 -0
  126. package/dist/testimonials/index.d.ts +25 -0
  127. package/dist/testimonials/index.js +10 -0
  128. package/dist/testimonials/index.js.map +1 -0
  129. package/dist/theme.css +292 -0
  130. package/dist/themes.css +65 -0
  131. package/dist/theming/index.d.ts +28 -0
  132. package/dist/theming/index.js +53 -0
  133. package/dist/theming/index.js.map +1 -0
  134. package/package.json +161 -4
@@ -0,0 +1,254 @@
1
+ import {
2
+ reducedMotionStyles
3
+ } from "./chunk-3VE6VFJ4.js";
4
+ import {
5
+ buttonResetStyles,
6
+ controlBaseStyles
7
+ } from "./chunk-RHAOQ6K4.js";
8
+ import {
9
+ __decorateClass
10
+ } from "./chunk-EUXUH3YW.js";
11
+
12
+ // src/carousel/Carousel.ts
13
+ import { LitElement, css, html, nothing } from "lit";
14
+ import { customElement, property, state } from "lit/decorators.js";
15
+ var Carousel = class extends LitElement {
16
+ constructor() {
17
+ super(...arguments);
18
+ this.autoPlay = true;
19
+ this.interval = 5e3;
20
+ this.showArrows = true;
21
+ this.showIndicators = true;
22
+ this.index = 0;
23
+ this.count = 0;
24
+ this.paused = false;
25
+ this.pause = () => {
26
+ this.paused = true;
27
+ };
28
+ this.resume = () => {
29
+ this.paused = false;
30
+ };
31
+ }
32
+ connectedCallback() {
33
+ super.connectedCallback();
34
+ this.addEventListener("mouseenter", this.pause);
35
+ this.addEventListener("mouseleave", this.resume);
36
+ this.addEventListener("focusin", this.pause);
37
+ this.addEventListener("focusout", this.resume);
38
+ }
39
+ disconnectedCallback() {
40
+ this.stopTimer();
41
+ this.removeEventListener("mouseenter", this.pause);
42
+ this.removeEventListener("mouseleave", this.resume);
43
+ this.removeEventListener("focusin", this.pause);
44
+ this.removeEventListener("focusout", this.resume);
45
+ super.disconnectedCallback();
46
+ }
47
+ updated(changed) {
48
+ if (changed.has("index") || changed.has("count")) this.syncSlides();
49
+ if (changed.has("autoPlay") || changed.has("interval") || changed.has("count")) this.restartTimer();
50
+ }
51
+ get slides() {
52
+ return this.shadowRoot?.querySelector("slot")?.assignedElements({ flatten: true }) ?? [];
53
+ }
54
+ syncSlides() {
55
+ this.slides.forEach((el, i) => el.toggleAttribute("data-st-active", i === this.index));
56
+ }
57
+ onSlotChange() {
58
+ this.count = this.slides.length;
59
+ if (this.index >= this.count) this.index = 0;
60
+ this.syncSlides();
61
+ }
62
+ stopTimer() {
63
+ if (this.timer !== void 0) clearInterval(this.timer);
64
+ this.timer = void 0;
65
+ }
66
+ restartTimer() {
67
+ this.stopTimer();
68
+ if (!this.autoPlay || this.count < 2) return;
69
+ this.timer = setInterval(() => {
70
+ if (!this.paused) this.go(this.index + 1, "next");
71
+ }, this.interval);
72
+ }
73
+ go(target, direction) {
74
+ if (this.count === 0) return;
75
+ this.setAttribute("data-direction", direction);
76
+ this.index = (target + this.count) % this.count;
77
+ this.dispatchEvent(
78
+ new CustomEvent("carousel-change", {
79
+ detail: { index: this.index },
80
+ bubbles: true,
81
+ composed: true
82
+ })
83
+ );
84
+ this.restartTimer();
85
+ }
86
+ render() {
87
+ const multiple = this.count > 1;
88
+ return html`
89
+ <slot @slotchange=${this.onSlotChange}></slot>
90
+ ${this.showArrows && multiple ? html`
91
+ <button part="nav-button prev" class="nav prev" aria-label="Previous Slide" @click=${() => this.go(this.index - 1, "prev")}>&#10094;</button>
92
+ <button part="nav-button next" class="nav next" aria-label="Next Slide" @click=${() => this.go(this.index + 1, "next")}>&#10095;</button>
93
+ ` : nothing}
94
+ ${this.showIndicators && multiple ? html`<div class="indicators" part="indicators">
95
+ ${Array.from(
96
+ { length: this.count },
97
+ (_, i) => html`
98
+ <button
99
+ part="dot"
100
+ class="dot ${i === this.index ? "active" : ""}"
101
+ aria-label="Go to slide ${i + 1}"
102
+ aria-current=${i === this.index ? "true" : "false"}
103
+ @click=${() => this.go(i, i > this.index ? "next" : "prev")}
104
+ ></button>
105
+ `
106
+ )}
107
+ </div>` : nothing}
108
+ `;
109
+ }
110
+ };
111
+ Carousel.styles = css`
112
+ ${controlBaseStyles}
113
+
114
+ :host {
115
+ display: block;
116
+ position: relative;
117
+ width: 100%;
118
+ overflow: hidden;
119
+ }
120
+
121
+ ::slotted(*) {
122
+ display: none !important;
123
+ }
124
+
125
+ ::slotted([data-st-active]) {
126
+ display: block !important;
127
+ animation: st-carousel-in-next 0.4s ease both;
128
+ }
129
+
130
+ :host([data-direction='prev']) ::slotted([data-st-active]) {
131
+ animation-name: st-carousel-in-prev;
132
+ }
133
+
134
+ @keyframes st-carousel-in-next {
135
+ from {
136
+ transform: translateX(10%);
137
+ opacity: 0;
138
+ }
139
+ to {
140
+ transform: none;
141
+ opacity: 1;
142
+ }
143
+ }
144
+
145
+ @keyframes st-carousel-in-prev {
146
+ from {
147
+ transform: translateX(-10%);
148
+ opacity: 0;
149
+ }
150
+ to {
151
+ transform: none;
152
+ opacity: 1;
153
+ }
154
+ }
155
+
156
+ .nav {
157
+ ${buttonResetStyles}
158
+ position: absolute;
159
+ top: 50%;
160
+ transform: translateY(-50%);
161
+ z-index: 10;
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ width: var(--st-size-38);
166
+ height: var(--st-size-38);
167
+ border-radius: var(--st-radius-circle);
168
+ border: 1px solid var(--st-color-border);
169
+ background: var(--st-color-surface);
170
+ color: var(--st-color-text-strong);
171
+ font-size: var(--st-text-xl);
172
+ opacity: 0.8;
173
+ transition:
174
+ opacity 0.3s ease,
175
+ transform 0.3s ease;
176
+ }
177
+
178
+ .nav:hover {
179
+ opacity: 1;
180
+ transform: translateY(-50%) scale(1.1);
181
+ }
182
+
183
+ .prev {
184
+ left: var(--st-space-12);
185
+ }
186
+
187
+ .next {
188
+ right: var(--st-space-12);
189
+ }
190
+
191
+ .indicators {
192
+ position: absolute;
193
+ bottom: var(--st-space-24);
194
+ left: 50%;
195
+ transform: translateX(-50%);
196
+ z-index: 10;
197
+ display: flex;
198
+ gap: var(--st-space-12);
199
+ }
200
+
201
+ .dot {
202
+ ${buttonResetStyles}
203
+ width: var(--st-space-12);
204
+ height: var(--st-space-12);
205
+ padding: 0;
206
+ border-radius: var(--st-radius-circle);
207
+ background: var(--st-color-border-strong);
208
+ transition:
209
+ background 0.3s ease,
210
+ transform 0.3s ease;
211
+ }
212
+
213
+ .dot:hover {
214
+ background: var(--st-color-text-muted);
215
+ }
216
+
217
+ .dot.active {
218
+ background: var(--st-color-text-strong);
219
+ transform: scale(1.2);
220
+ }
221
+
222
+ ${reducedMotionStyles}
223
+ @media (prefers-reduced-motion: reduce) {
224
+ ::slotted([data-st-active]) {
225
+ animation: none;
226
+ }
227
+ }
228
+ `;
229
+ __decorateClass([
230
+ property({ type: Boolean, attribute: "auto-play" })
231
+ ], Carousel.prototype, "autoPlay", 2);
232
+ __decorateClass([
233
+ property({ type: Number })
234
+ ], Carousel.prototype, "interval", 2);
235
+ __decorateClass([
236
+ property({ type: Boolean, attribute: "show-arrows" })
237
+ ], Carousel.prototype, "showArrows", 2);
238
+ __decorateClass([
239
+ property({ type: Boolean, attribute: "show-indicators" })
240
+ ], Carousel.prototype, "showIndicators", 2);
241
+ __decorateClass([
242
+ state()
243
+ ], Carousel.prototype, "index", 2);
244
+ __decorateClass([
245
+ state()
246
+ ], Carousel.prototype, "count", 2);
247
+ Carousel = __decorateClass([
248
+ customElement("st-carousel")
249
+ ], Carousel);
250
+
251
+ export {
252
+ Carousel
253
+ };
254
+ //# sourceMappingURL=chunk-XHBC23TV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/carousel/Carousel.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\r\nimport { customElement, property, state } from 'lit/decorators.js';\r\n\r\nimport { buttonResetStyles, controlBaseStyles } from '../shared/styles';\r\nimport { reducedMotionStyles } from '../shared/section-styles';\r\nimport type { CarouselChangeEventDetail } from './CarouselEvents';\r\n\r\n/**\r\n * Cycles through its slotted children, one visible at a time, with optional autoplay, arrows and\r\n * dot indicators. The incoming slide slides in from the travel direction (CSS keyframes in place\r\n * of the source's framer-motion spring). Autoplay pauses while hovered or focused and stops when\r\n * the element is disconnected.\r\n */\r\n@customElement('st-carousel')\r\nexport class Carousel extends LitElement {\r\n static styles = css`\r\n ${controlBaseStyles}\r\n\r\n :host {\r\n display: block;\r\n position: relative;\r\n width: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n ::slotted(*) {\r\n display: none !important;\r\n }\r\n\r\n ::slotted([data-st-active]) {\r\n display: block !important;\r\n animation: st-carousel-in-next 0.4s ease both;\r\n }\r\n\r\n :host([data-direction='prev']) ::slotted([data-st-active]) {\r\n animation-name: st-carousel-in-prev;\r\n }\r\n\r\n @keyframes st-carousel-in-next {\r\n from {\r\n transform: translateX(10%);\r\n opacity: 0;\r\n }\r\n to {\r\n transform: none;\r\n opacity: 1;\r\n }\r\n }\r\n\r\n @keyframes st-carousel-in-prev {\r\n from {\r\n transform: translateX(-10%);\r\n opacity: 0;\r\n }\r\n to {\r\n transform: none;\r\n opacity: 1;\r\n }\r\n }\r\n\r\n .nav {\r\n ${buttonResetStyles}\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n z-index: 10;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--st-size-38);\r\n height: var(--st-size-38);\r\n border-radius: var(--st-radius-circle);\r\n border: 1px solid var(--st-color-border);\r\n background: var(--st-color-surface);\r\n color: var(--st-color-text-strong);\r\n font-size: var(--st-text-xl);\r\n opacity: 0.8;\r\n transition:\r\n opacity 0.3s ease,\r\n transform 0.3s ease;\r\n }\r\n\r\n .nav:hover {\r\n opacity: 1;\r\n transform: translateY(-50%) scale(1.1);\r\n }\r\n\r\n .prev {\r\n left: var(--st-space-12);\r\n }\r\n\r\n .next {\r\n right: var(--st-space-12);\r\n }\r\n\r\n .indicators {\r\n position: absolute;\r\n bottom: var(--st-space-24);\r\n left: 50%;\r\n transform: translateX(-50%);\r\n z-index: 10;\r\n display: flex;\r\n gap: var(--st-space-12);\r\n }\r\n\r\n .dot {\r\n ${buttonResetStyles}\r\n width: var(--st-space-12);\r\n height: var(--st-space-12);\r\n padding: 0;\r\n border-radius: var(--st-radius-circle);\r\n background: var(--st-color-border-strong);\r\n transition:\r\n background 0.3s ease,\r\n transform 0.3s ease;\r\n }\r\n\r\n .dot:hover {\r\n background: var(--st-color-text-muted);\r\n }\r\n\r\n .dot.active {\r\n background: var(--st-color-text-strong);\r\n transform: scale(1.2);\r\n }\r\n\r\n ${reducedMotionStyles}\r\n @media (prefers-reduced-motion: reduce) {\r\n ::slotted([data-st-active]) {\r\n animation: none;\r\n }\r\n }\r\n `;\r\n\r\n @property({ type: Boolean, attribute: 'auto-play' })\r\n autoPlay = true;\r\n\r\n /** Autoplay delay in milliseconds. */\r\n @property({ type: Number })\r\n interval = 5000;\r\n\r\n @property({ type: Boolean, attribute: 'show-arrows' })\r\n showArrows = true;\r\n\r\n @property({ type: Boolean, attribute: 'show-indicators' })\r\n showIndicators = true;\r\n\r\n @state() private index = 0;\r\n @state() private count = 0;\r\n private paused = false;\r\n private timer?: ReturnType<typeof setInterval>;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.addEventListener('mouseenter', this.pause);\r\n this.addEventListener('mouseleave', this.resume);\r\n this.addEventListener('focusin', this.pause);\r\n this.addEventListener('focusout', this.resume);\r\n }\r\n\r\n disconnectedCallback() {\r\n this.stopTimer();\r\n this.removeEventListener('mouseenter', this.pause);\r\n this.removeEventListener('mouseleave', this.resume);\r\n this.removeEventListener('focusin', this.pause);\r\n this.removeEventListener('focusout', this.resume);\r\n super.disconnectedCallback();\r\n }\r\n\r\n protected updated(changed: Map<string, unknown>) {\r\n if (changed.has('index') || changed.has('count')) this.syncSlides();\r\n if (changed.has('autoPlay') || changed.has('interval') || changed.has('count')) this.restartTimer();\r\n }\r\n\r\n private pause = () => {\r\n this.paused = true;\r\n };\r\n\r\n private resume = () => {\r\n this.paused = false;\r\n };\r\n\r\n private get slides(): Element[] {\r\n return this.shadowRoot?.querySelector('slot')?.assignedElements({ flatten: true }) ?? [];\r\n }\r\n\r\n private syncSlides() {\r\n this.slides.forEach((el, i) => el.toggleAttribute('data-st-active', i === this.index));\r\n }\r\n\r\n private onSlotChange() {\r\n this.count = this.slides.length;\r\n if (this.index >= this.count) this.index = 0;\r\n this.syncSlides();\r\n }\r\n\r\n private stopTimer() {\r\n if (this.timer !== undefined) clearInterval(this.timer);\r\n this.timer = undefined;\r\n }\r\n\r\n private restartTimer() {\r\n this.stopTimer();\r\n if (!this.autoPlay || this.count < 2) return;\r\n this.timer = setInterval(() => {\r\n if (!this.paused) this.go(this.index + 1, 'next');\r\n }, this.interval);\r\n }\r\n\r\n private go(target: number, direction: 'next' | 'prev') {\r\n if (this.count === 0) return;\r\n this.setAttribute('data-direction', direction);\r\n this.index = (target + this.count) % this.count;\r\n this.dispatchEvent(\r\n new CustomEvent<CarouselChangeEventDetail>('carousel-change', {\r\n detail: { index: this.index },\r\n bubbles: true,\r\n composed: true,\r\n }),\r\n );\r\n this.restartTimer();\r\n }\r\n\r\n render() {\r\n const multiple = this.count > 1;\r\n return html`\r\n <slot @slotchange=${this.onSlotChange}></slot>\r\n ${this.showArrows && multiple\r\n ? html`\r\n <button part=\"nav-button prev\" class=\"nav prev\" aria-label=\"Previous Slide\" @click=${() => this.go(this.index - 1, 'prev')}>&#10094;</button>\r\n <button part=\"nav-button next\" class=\"nav next\" aria-label=\"Next Slide\" @click=${() => this.go(this.index + 1, 'next')}>&#10095;</button>\r\n `\r\n : nothing}\r\n ${this.showIndicators && multiple\r\n ? html`<div class=\"indicators\" part=\"indicators\">\r\n ${Array.from(\r\n { length: this.count },\r\n (_, i) => html`\r\n <button\r\n part=\"dot\"\r\n class=\"dot ${i === this.index ? 'active' : ''}\"\r\n aria-label=\"Go to slide ${i + 1}\"\r\n aria-current=${i === this.index ? 'true' : 'false'}\r\n @click=${() => this.go(i, i > this.index ? 'next' : 'prev')}\r\n ></button>\r\n `,\r\n )}\r\n </div>`\r\n : nothing}\r\n `;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,70 @@
1
+ import {
2
+ buttonResetStyles,
3
+ controlBaseStyles,
4
+ rootFontFamilyStyles
5
+ } from "./chunk-RHAOQ6K4.js";
6
+ import {
7
+ __decorateClass
8
+ } from "./chunk-EUXUH3YW.js";
9
+
10
+ // src/icon-button/IconButton.ts
11
+ import { LitElement, css, html } from "lit";
12
+ import { customElement, property } from "lit/decorators.js";
13
+ var IconButton = class extends LitElement {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.label = "";
17
+ this.disabled = false;
18
+ }
19
+ render() {
20
+ return html`
21
+ <button part="button" type="button" aria-label=${this.label} title=${this.label} ?disabled=${this.disabled}>
22
+ <slot></slot>
23
+ </button>
24
+ `;
25
+ }
26
+ };
27
+ IconButton.styles = css`
28
+ ${controlBaseStyles}
29
+
30
+ :host {
31
+ display: inline-flex;
32
+ ${rootFontFamilyStyles}
33
+ }
34
+
35
+ button {
36
+ ${buttonResetStyles}
37
+ display: inline-flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+ width: var(--st-size-32);
41
+ height: var(--st-size-32);
42
+ border-radius: var(--st-radius-sm);
43
+ color: var(--st-color-text-muted);
44
+ }
45
+
46
+ button:hover {
47
+ background: var(--st-color-hover);
48
+ color: var(--st-color-text-strong);
49
+ }
50
+
51
+ :host([disabled]) button {
52
+ color: var(--st-color-text-muted);
53
+ cursor: not-allowed;
54
+ pointer-events: none;
55
+ }
56
+ `;
57
+ __decorateClass([
58
+ property({ type: String })
59
+ ], IconButton.prototype, "label", 2);
60
+ __decorateClass([
61
+ property({ type: Boolean, reflect: true })
62
+ ], IconButton.prototype, "disabled", 2);
63
+ IconButton = __decorateClass([
64
+ customElement("st-icon-button")
65
+ ], IconButton);
66
+
67
+ export {
68
+ IconButton
69
+ };
70
+ //# sourceMappingURL=chunk-XXPBFHWR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/icon-button/IconButton.ts"],"sourcesContent":["import { LitElement, css, html } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\n\r\nimport { buttonResetStyles, controlBaseStyles, rootFontFamilyStyles } from '../shared/styles';\r\n\r\n/**\r\n * A small, icon-only action button — ported from `SankhyaUI`'s React `IconButton` (a separate,\r\n * unrelated marketing-site project; that source takes an iconify string `icon` prop, this package\r\n * has no iconify dependency, so the icon is default-slotted content instead, same convention as\r\n * `st-dropdown`/`st-menu-grid-item`'s `slot=\"icon\"`).\r\n *\r\n * Fires a plain native `click` — no custom event, since a caller just wants an ordinary button.\r\n */\r\n@customElement('st-icon-button')\r\nexport class IconButton extends LitElement {\r\n static styles = css`\r\n ${controlBaseStyles}\r\n\r\n :host {\r\n display: inline-flex;\r\n ${rootFontFamilyStyles}\r\n }\r\n\r\n button {\r\n ${buttonResetStyles}\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--st-size-32);\r\n height: var(--st-size-32);\r\n border-radius: var(--st-radius-sm);\r\n color: var(--st-color-text-muted);\r\n }\r\n\r\n button:hover {\r\n background: var(--st-color-hover);\r\n color: var(--st-color-text-strong);\r\n }\r\n\r\n :host([disabled]) button {\r\n color: var(--st-color-text-muted);\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n `;\r\n\r\n /** Accessible name and tooltip — matches the source component's `ariaLabel` (renamed: modern\r\n * browsers already expose a native `ariaLabel` reflected property on every `Element`, so reusing\r\n * that exact name as a Lit reactive property would shadow it). Required for a control with no\r\n * visible text. */\r\n @property({ type: String })\r\n label = '';\r\n\r\n @property({ type: Boolean, reflect: true })\r\n disabled = false;\r\n\r\n render() {\r\n return html`\r\n <button part=\"button\" type=\"button\" aria-label=${this.label} title=${this.label} ?disabled=${this.disabled}>\r\n <slot></slot>\r\n </button>\r\n `;\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;AAAA,SAAS,YAAY,KAAK,YAAY;AACtC,SAAS,eAAe,gBAAgB;AAajC,IAAM,aAAN,cAAyB,WAAW;AAAA,EAApC;AAAA;AAqCL,iBAAQ;AAGR,oBAAW;AAAA;AAAA,EAEX,SAAS;AACP,WAAO;AAAA,uDAC4C,KAAK,KAAK,UAAU,KAAK,KAAK,cAAc,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA,EAI9G;AACF;AAjDa,WACJ,SAAS;AAAA,MACZ,iBAAiB;AAAA;AAAA;AAAA;AAAA,QAIf,oBAAoB;AAAA;AAAA;AAAA;AAAA,QAIpB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BvB;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GApCf,WAqCX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAvC/B,WAwCX;AAxCW,aAAN;AAAA,EADN,cAAc,gBAAgB;AAAA,GAClB;","names":[]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Marketing-scale tokens for the CMS section components (hero, features, stats, ...).
3
+ * theme.css is tuned for dense app chrome (its largest text step is 20px), so
4
+ * the display sizes a content page needs live here. Import after theme.css (shipped in this package);
5
+ * override any of these at :root to rescale the CMS components.
6
+ */
7
+ :root {
8
+ --st-cms-text-display: 3.75rem;
9
+ --st-cms-text-4xl: 2.25rem;
10
+ --st-cms-text-3xl: 1.875rem;
11
+ --st-cms-text-xl: 1.25rem;
12
+ --st-cms-text-lg: 1.125rem;
13
+ --st-cms-section-padding: 4rem;
14
+ --st-cms-container-max: 1200px;
15
+ }
@@ -0,0 +1,25 @@
1
+ import * as lit from 'lit';
2
+ import { LitElement } from 'lit';
3
+
4
+ /**
5
+ * A long-form article section: centered title/subtitle, an optional featured image with caption,
6
+ * then Markdown body text. Ports `SankhyaUI`'s React `ContentBlock`. The body comes from
7
+ * `content-src` (a Markdown URL, as in the source) or an inline `content` string (added so the
8
+ * block works without a fetch); `content-src` wins when both are set.
9
+ */
10
+ declare class ContentBlock extends LitElement {
11
+ static styles: lit.CSSResult;
12
+ title: string;
13
+ subtitle: string;
14
+ /** URL of a Markdown file. */
15
+ contentSrc: string;
16
+ /** Inline Markdown, used when `content-src` is not set. */
17
+ content: string;
18
+ imageSrc: string;
19
+ imageAlt: string;
20
+ imageCaption: string;
21
+ inverted: boolean;
22
+ render(): lit.TemplateResult<1>;
23
+ }
24
+
25
+ export { ContentBlock };
@@ -0,0 +1,11 @@
1
+ import {
2
+ ContentBlock
3
+ } from "../chunk-IMACP7HN.js";
4
+ import "../chunk-3JU3R22O.js";
5
+ import "../chunk-3VE6VFJ4.js";
6
+ import "../chunk-RHAOQ6K4.js";
7
+ import "../chunk-EUXUH3YW.js";
8
+ export {
9
+ ContentBlock
10
+ };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,33 @@
1
+ import * as lit from 'lit';
2
+ import { LitElement, nothing } from 'lit';
3
+
4
+ /**
5
+ * Fixed bottom consent bar. The source read/wrote consent through a React `UserContext`; here the
6
+ * element persists the choice itself in localStorage (`storage-key`, default the source's
7
+ * `sankhya_ui_cookie_consent`; storage errors are ignored) and renders nothing once a choice
8
+ * exists. Fires `cookie-consent-accept` / `cookie-consent-refuse` (detail `{ status }`). The
9
+ * default slot replaces the message text.
10
+ */
11
+ declare class CookieConsent extends LitElement {
12
+ static styles: lit.CSSResult;
13
+ message: string;
14
+ acceptButtonText: string;
15
+ refuseButtonText: string;
16
+ privacyPolicyLink: string;
17
+ privacyPolicyText: string;
18
+ storageKey: string;
19
+ /** The stored choice, or `null` while undecided (the bar is only shown then). */
20
+ private consent;
21
+ connectedCallback(): void;
22
+ private readStored;
23
+ private choose;
24
+ render(): lit.TemplateResult<1> | typeof nothing;
25
+ }
26
+
27
+ type CookieConsentStatus = 'accepted' | 'refused';
28
+ /** Detail of `cookie-consent-accept` / `cookie-consent-refuse` (source: `onAccept` / `onRefuse`). */
29
+ interface CookieConsentEventDetail {
30
+ status: CookieConsentStatus;
31
+ }
32
+
33
+ export { CookieConsent, type CookieConsentEventDetail, type CookieConsentStatus };
@@ -0,0 +1,9 @@
1
+ import {
2
+ CookieConsent
3
+ } from "../chunk-2VZFHTBC.js";
4
+ import "../chunk-RHAOQ6K4.js";
5
+ import "../chunk-EUXUH3YW.js";
6
+ export {
7
+ CookieConsent
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,89 @@
1
+ import * as lit from 'lit';
2
+ import { LitElement } from 'lit';
3
+
4
+ /**
5
+ * A labeled trigger + slotted dropdown panel — nav menus (typically holding an `st-menu-grid`),
6
+ * action menus, anything "click a trigger, show content under it". A 1:1 port of `SankhyaUI`'s
7
+ * React `Dropdown` (`SankhyaCMS/SankhyaUI/src/components/Dropdown`): same markup
8
+ * (`.menu` > `.menu-title` + `.menu-dropdown`), sizes, 0.3s slide/fade, and behavior —
9
+ *
10
+ * - only one dropdown is open at a time (the source's `DropdownProvider`, built in here, so no
11
+ * provider element is needed);
12
+ * - a mousedown outside, Escape, or a click inside the panel closes it;
13
+ * - an `href` trigger toggles the panel when it has content, and is a plain link when it doesn't;
14
+ * - `inline` opens the panel in the flow, the source's `.touch-device` layout.
15
+ *
16
+ * Colors and the panel's surface come from the suite theme (the source left those to the
17
+ * consumer's `className`/`itemGroupClassName` utility classes). Two source rules are left out
18
+ * because they break existing suite uses (`st-source-bar`'s site/library menus): the 100vw panel
19
+ * at <=768px (overflows the screen from wherever the trigger sits; the header uses `inline`
20
+ * instead) and `overflow: hidden` on slotted children (clips their focus rings). Suite additions
21
+ * kept on top: `align`, `active`, `disabled`, `inline`, and the `dropdown-toggle` event.
22
+ */
23
+ declare class Dropdown extends LitElement {
24
+ /** The open dropdown, if any — the source's `DropdownContext.activeDropdown`. */
25
+ private static openDropdown;
26
+ static styles: lit.CSSResult;
27
+ /** Trigger label text (source: `title`, renamed because `title` is the native tooltip
28
+ * attribute). Leave empty to show only `slot="icon"`. */
29
+ label: string;
30
+ /** Renders the trigger as an `<a href>`. With panel content the click toggles the panel (as in
31
+ * the source); with none it navigates. */
32
+ href: string;
33
+ iconPosition: 'left' | 'right';
34
+ /** Inline `width`/`height` of the `slot="icon"` wrapper (source: `iconSize`, default `1.2rem`). */
35
+ iconSize: string;
36
+ /** Inline `color` of the `slot="icon"` wrapper (source: `iconColor`). */
37
+ iconColor: string;
38
+ /** Which edge of the trigger the panel lines up with. */
39
+ align: 'left' | 'right';
40
+ /** `target` of an `href` trigger (source default `_self`). */
41
+ target: string;
42
+ /** Extra class(es) on the trigger (source: `className`; a `class` on `st-dropdown` styles the host). */
43
+ triggerClassName: string;
44
+ /** Extra class(es) on the panel (source: `itemGroupClassName`). */
45
+ itemGroupClassName: string;
46
+ /** Unused, as in the source (`itemClassName` is never read there); kept for prop parity. */
47
+ itemClassName: string;
48
+ disabled: boolean;
49
+ /** Highlights the trigger as the current section (e.g. the current page is one of its items). */
50
+ active: boolean;
51
+ /** Opens the panel in the flow under the trigger instead of floating over the page (see the
52
+ * styles). `st-header` sets this on its own menu's dropdowns while its hamburger panel shows. */
53
+ inline: boolean;
54
+ /** Whether the panel is showing. Follows user toggles; may also be set from outside. */
55
+ open: boolean;
56
+ /** Whether the default slot has content — the source's `children` check. */
57
+ private hasContent;
58
+ /** Whether `slot="icon"` has content. */
59
+ private hasIcon;
60
+ connectedCallback(): void;
61
+ disconnectedCallback(): void;
62
+ protected updated(changed: Map<string, unknown>): void;
63
+ private setOpen;
64
+ private closeOnOutsideMouseDown;
65
+ private closeOnEscape;
66
+ private trigger;
67
+ /** Keyboard-reachable entries in the panel, in order: menu items (they delegate focus to their
68
+ * own link) plus any plain links/buttons/tabbable elements a caller slots in. */
69
+ private panelItems;
70
+ /** Moves focus into the panel once it has become visible (it is `visibility: hidden` until the
71
+ * `show` class lands, and hidden elements can't take focus). */
72
+ private focusItem;
73
+ /** Enter/Space/ArrowDown open the panel and focus its first entry; ArrowUp its last. */
74
+ private onTitleKeyDown;
75
+ /** Arrow keys/Home/End move between the panel's entries; Tab closes the panel and moves on. */
76
+ private onPanelKeyDown;
77
+ private onTitleClick;
78
+ /** A click anywhere inside the panel closes it, as in the source. */
79
+ private onPanelClick;
80
+ private onContentSlotChange;
81
+ private onIconSlotChange;
82
+ render(): lit.TemplateResult<1>;
83
+ }
84
+
85
+ interface DropdownToggleEventDetail {
86
+ open: boolean;
87
+ }
88
+
89
+ export { Dropdown, type DropdownToggleEventDetail };
@@ -0,0 +1,9 @@
1
+ import {
2
+ Dropdown
3
+ } from "../chunk-RMIJVTFS.js";
4
+ import "../chunk-RHAOQ6K4.js";
5
+ import "../chunk-EUXUH3YW.js";
6
+ export {
7
+ Dropdown
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,38 @@
1
+ import * as lit from 'lit';
2
+ import { LitElement } from 'lit';
3
+
4
+ interface FeatureSplitItem {
5
+ /** Iconify icon name, e.g. `mdi:check`. */
6
+ icon?: string;
7
+ title: string;
8
+ /** Markdown. */
9
+ description: string;
10
+ }
11
+ type FeatureSplitImagePosition = 'left' | 'right' | 'top';
12
+ /** A title/markdown-subtitle/feature-list block beside (or under) an image. */
13
+ declare class FeatureSplit extends LitElement {
14
+ static styles: lit.CSSResult;
15
+ inverted: boolean;
16
+ title: string;
17
+ /** Markdown. */
18
+ subtitle: string;
19
+ items: FeatureSplitItem[];
20
+ imageSrc: string;
21
+ imageAlt: string;
22
+ imagePosition: FeatureSplitImagePosition;
23
+ actionLabel: string;
24
+ href: string;
25
+ private onAction;
26
+ render(): lit.TemplateResult<1>;
27
+ }
28
+
29
+ interface FeatureSplitActionEventDetail {
30
+ href: string;
31
+ }
32
+ declare global {
33
+ interface HTMLElementEventMap {
34
+ 'feature-split-action': CustomEvent<FeatureSplitActionEventDetail>;
35
+ }
36
+ }
37
+
38
+ export { FeatureSplit, type FeatureSplitActionEventDetail, type FeatureSplitImagePosition, type FeatureSplitItem };
@@ -0,0 +1,11 @@
1
+ import {
2
+ FeatureSplit
3
+ } from "../chunk-5REZSZCK.js";
4
+ import "../chunk-3JU3R22O.js";
5
+ import "../chunk-3VE6VFJ4.js";
6
+ import "../chunk-RHAOQ6K4.js";
7
+ import "../chunk-EUXUH3YW.js";
8
+ export {
9
+ FeatureSplit
10
+ };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,50 @@
1
+ import * as lit from 'lit';
2
+ import { LitElement } from 'lit';
3
+
4
+ /**
5
+ * One feature tile for `st-features-section`: optional icon, title, Markdown description and an
6
+ * optional "Learn more" link, rendered on an `st-card`. `icon` is an Iconify name (e.g.
7
+ * `mdi:rocket`). The link is a plain `<a>` (the source used react-router's `Link` for non-http
8
+ * hrefs; there is no Lit equivalent). The click is composed, so an SPA router can intercept it
9
+ * (e.g. via `event.composedPath()`) and navigate client-side; `http(s)` links open in a new tab.
10
+ */
11
+ declare class FeatureItem extends LitElement {
12
+ static styles: lit.CSSResult;
13
+ /** Iconify icon name, e.g. `mdi:rocket`. */
14
+ icon: string;
15
+ title: string;
16
+ /** Markdown. */
17
+ description: string;
18
+ href: string;
19
+ actionLabel: string;
20
+ inverted: boolean;
21
+ render(): lit.TemplateResult<1>;
22
+ }
23
+
24
+ /** Data for one tile when using the `items` property (mirrors `st-feature-item`'s properties). */
25
+ interface FeatureItemData {
26
+ icon?: string;
27
+ title: string;
28
+ description: string;
29
+ href?: string;
30
+ }
31
+ /**
32
+ * A titled grid of feature tiles. Ports `SankhyaUI`'s React `FeaturesSection`: tiles come from the
33
+ * `items` property, from slotted `st-feature-item` elements (the source's `children`), or both
34
+ * (slotted first). `columns` sets the grid width (default 2; one column below 768px). `inverted`
35
+ * is passed on to the `items` tiles; slotted tiles need their own `inverted` attribute.
36
+ */
37
+ declare class FeaturesSection extends LitElement {
38
+ static styles: lit.CSSResult;
39
+ title: string;
40
+ subtitle: string;
41
+ /** Applied to every tile built from `items`. */
42
+ actionLabel: string;
43
+ columns: number;
44
+ inverted: boolean;
45
+ /** Tiles to render (property only). */
46
+ items: FeatureItemData[];
47
+ render(): lit.TemplateResult<1>;
48
+ }
49
+
50
+ export { FeatureItem, type FeatureItemData, FeaturesSection };