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