@koehler8/cms 1.0.0-beta.5

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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/bin/cms-generate-public-assets.js +27 -0
  4. package/bin/cms-validate-extensions.js +18 -0
  5. package/bin/cms-validate-themes.js +7 -0
  6. package/extensions/manifest.schema.json +125 -0
  7. package/package.json +84 -0
  8. package/public/img/preloaders/preloader-black.svg +1 -0
  9. package/public/img/preloaders/preloader-white.svg +1 -0
  10. package/public/robots.txt +5 -0
  11. package/scripts/check-overflow.mjs +33 -0
  12. package/scripts/generate-public-assets.js +401 -0
  13. package/scripts/patch-lru-cache-tla.js +164 -0
  14. package/scripts/validate-extensions.mjs +392 -0
  15. package/scripts/validate-themes.mjs +64 -0
  16. package/src/App.vue +3 -0
  17. package/src/components/About.vue +481 -0
  18. package/src/components/AboutValue.vue +361 -0
  19. package/src/components/BackToTop.vue +42 -0
  20. package/src/components/ComingSoon.vue +411 -0
  21. package/src/components/ComingSoonModal.vue +230 -0
  22. package/src/components/Contact.vue +518 -0
  23. package/src/components/Footer.vue +65 -0
  24. package/src/components/FooterMinimal.vue +153 -0
  25. package/src/components/Header.vue +583 -0
  26. package/src/components/Hero.vue +327 -0
  27. package/src/components/Home.vue +144 -0
  28. package/src/components/Intro.vue +130 -0
  29. package/src/components/IntroGate.vue +444 -0
  30. package/src/components/Plan.vue +116 -0
  31. package/src/components/Portfolio.vue +459 -0
  32. package/src/components/Preloader.vue +20 -0
  33. package/src/components/Principles.vue +67 -0
  34. package/src/components/Spacer15.vue +9 -0
  35. package/src/components/Spacer30.vue +9 -0
  36. package/src/components/Spacer40.vue +9 -0
  37. package/src/components/Spacer60.vue +9 -0
  38. package/src/components/StickyCTA.vue +263 -0
  39. package/src/components/Team.vue +432 -0
  40. package/src/components/icons/IconLinkedIn.vue +22 -0
  41. package/src/components/icons/IconX.vue +22 -0
  42. package/src/components/ui/SbCard.vue +52 -0
  43. package/src/components/ui/SkeletonPulse.vue +117 -0
  44. package/src/components/ui/UnitChip.vue +69 -0
  45. package/src/composables/useComingSoonConfig.js +120 -0
  46. package/src/composables/useComingSoonInterstitial.js +27 -0
  47. package/src/composables/useComponentResolver.js +196 -0
  48. package/src/composables/useEngagementTracking.js +187 -0
  49. package/src/composables/useIntroGate.js +46 -0
  50. package/src/composables/useLazyImage.js +77 -0
  51. package/src/composables/usePageConfig.js +184 -0
  52. package/src/composables/usePageMeta.js +76 -0
  53. package/src/composables/usePromoBackgroundStyles.js +67 -0
  54. package/src/constants/locales.js +20 -0
  55. package/src/extensions/extensionLoader.js +512 -0
  56. package/src/main.js +175 -0
  57. package/src/router/index.js +112 -0
  58. package/src/styles/base.css +896 -0
  59. package/src/styles/layout.css +342 -0
  60. package/src/styles/theme-base.css +84 -0
  61. package/src/themes/themeLoader.js +124 -0
  62. package/src/themes/themeManager.js +257 -0
  63. package/src/themes/themeValidator.js +380 -0
  64. package/src/utils/analytics.js +100 -0
  65. package/src/utils/appInfo.js +9 -0
  66. package/src/utils/assetResolver.js +162 -0
  67. package/src/utils/componentRegistry.js +46 -0
  68. package/src/utils/contentRequirements.js +67 -0
  69. package/src/utils/cookieConsent.js +281 -0
  70. package/src/utils/ctaCopy.js +58 -0
  71. package/src/utils/formatNumber.js +115 -0
  72. package/src/utils/imageSources.js +179 -0
  73. package/src/utils/inflateFlatConfig.js +30 -0
  74. package/src/utils/loadConfig.js +271 -0
  75. package/src/utils/semver.js +49 -0
  76. package/src/utils/siteStyles.js +40 -0
  77. package/src/utils/themeColors.js +65 -0
  78. package/src/utils/trackingContext.js +142 -0
  79. package/src/utils/unwrapDefault.js +14 -0
  80. package/src/utils/useScrollReveal.js +48 -0
  81. package/templates/index.html +36 -0
  82. package/themes/base/README.md +23 -0
  83. package/themes/base/theme.config.js +214 -0
  84. package/vite-plugin.js +637 -0
@@ -0,0 +1,896 @@
1
+ :root {
2
+ --ui-card-padding: 24px;
3
+ --ui-card-gap: 24px;
4
+ --ui-gap-lg: 24px;
5
+ --ui-gap-md: 16px;
6
+ --ui-gap-tight: 8px;
7
+ --ui-space-4: 4px;
8
+ --ui-space-8: 8px;
9
+ --ui-space-12: 12px;
10
+ --ui-space-16: 16px;
11
+ --ui-space-24: 24px;
12
+ --ui-space-32: 32px;
13
+ --ui-space-40: 40px;
14
+ --ui-radius-card: var(--brand-card-radius, 24px);
15
+ --ui-shadow-card: var(--brand-surface-card-shadow, 0 8px 24px rgba(15, 23, 42, 0.12));
16
+ --ui-cta-height: 48px;
17
+ --ui-cta-padding-inline: 24px;
18
+ --ui-type-title: 1.75rem;
19
+ --ui-type-subheadline: 1.25rem;
20
+ --ui-type-value: 1.5rem;
21
+ --ui-type-body: 1rem;
22
+ --ui-type-caption: 0.8125rem;
23
+ --ui-font-heading: 'Space Grotesk', 'Inter', sans-serif;
24
+ --ui-font-body: 'Inter', 'Space Grotesk', sans-serif;
25
+ --ui-title-spacing: 20px;
26
+ --ui-header-shadow: 0 12px 24px rgba(0, 0, 0, 0.35);
27
+ --ui-field-radius: 14px;
28
+ --ui-field-padding: 16px;
29
+ --ui-field-font-size: 16px;
30
+ --ui-field-height: 48px;
31
+ --ui-field-addon-padding: 16px;
32
+ --footer-bg: #000000;
33
+ --ui-header-chip-bg: color-mix(in srgb, var(--brand-header-bg, #060212) 82%, transparent);
34
+ --ui-header-chip-border: color-mix(in srgb, var(--brand-header-text, #ffffff) 35%, transparent);
35
+ --ui-header-chip-color: var(--brand-header-text, #ffffff);
36
+ --ui-footer-bg: color-mix(in srgb, var(--brand-header-bg, #060212) 95%, #000000 5%);
37
+ --ui-footer-border: color-mix(in srgb, var(--brand-border-highlight, rgba(79, 108, 240, 0.28)) 55%, transparent);
38
+ --ui-footer-color: var(--brand-header-text, #ffffff);
39
+ --ui-footer-link: color-mix(in srgb, var(--brand-accent-electric, #4f6cf0) 70%, var(--ui-footer-color) 30%);
40
+ --ui-footer-link-hover: var(--brand-cta-text, #ffffff);
41
+ --ui-legal-bg: color-mix(in srgb, var(--brand-header-bg, #060212) 90%, #000000 10%);
42
+ --ui-legal-color: color-mix(in srgb, var(--brand-header-text, #ffffff) 90%, rgba(255, 255, 255, 0.9) 10%);
43
+ --ui-legal-link: color-mix(in srgb, var(--ui-footer-link) 85%, var(--ui-footer-color) 15%);
44
+ --ui-locale-menu-bg: color-mix(in srgb, var(--brand-header-bg, #060212) 88%, #09040f 12%);
45
+ --ui-locale-menu-color: var(--brand-header-text, #ffffff);
46
+ --ui-locale-menu-hover-bg: color-mix(in srgb, var(--brand-accent-electric, #4f6cf0) 35%, transparent);
47
+ --ui-locale-menu-hover-color: #ffffff;
48
+ --ui-spacer-size: 24px;
49
+ }
50
+
51
+ html {
52
+ margin: 0;
53
+ padding: 0;
54
+ min-height: 100%;
55
+ background: var(--theme-body-background, #ffffff);
56
+ }
57
+
58
+ body {
59
+ margin: 0;
60
+ padding: 0;
61
+ min-height: 100%;
62
+ font-family: var(--ui-font-body, 'Inter', 'Space Grotesk', sans-serif);
63
+ color: var(--ui-text-primary, var(--brand-fg-100, #f0eaf3));
64
+ background: inherit;
65
+ }
66
+
67
+ *, *::before, *::after {
68
+ box-sizing: border-box;
69
+ }
70
+
71
+ img, picture {
72
+ max-width: 100%;
73
+ height: auto;
74
+ display: block;
75
+ }
76
+
77
+ button,
78
+ input,
79
+ textarea,
80
+ select {
81
+ font: inherit;
82
+ color: inherit;
83
+ }
84
+
85
+ h1,
86
+ h2,
87
+ h3,
88
+ h4,
89
+ h5,
90
+ h6 {
91
+ font-family: var(--ui-font-heading, 'Space Grotesk', 'Inter', sans-serif);
92
+ font-weight: 600;
93
+ line-height: 1.25;
94
+ margin: 0 0 0.85rem;
95
+ color: var(--ui-text-primary, var(--brand-fg-100));
96
+ }
97
+
98
+ p,
99
+ ul,
100
+ ol {
101
+ margin: 0 0 1rem;
102
+ }
103
+
104
+ a {
105
+ color: var(--brand-cta-text, #ffffff);
106
+ text-decoration: none;
107
+ }
108
+
109
+ a:hover,
110
+ a:focus-visible {
111
+ text-decoration: underline;
112
+ }
113
+
114
+ .responsive-picture-shell {
115
+ position: relative;
116
+ width: 100%;
117
+ overflow: hidden;
118
+ background-color: var(
119
+ --responsive-picture-surface,
120
+ var(--about-image-surface, rgba(10, 10, 13, 0.94))
121
+ );
122
+ }
123
+
124
+ .responsive-picture {
125
+ display: block;
126
+ width: 100%;
127
+ height: 100%;
128
+ }
129
+
130
+ .responsive-picture__img {
131
+ width: 100%;
132
+ height: 100%;
133
+ object-fit: cover;
134
+ transition: opacity 0.3s ease;
135
+ }
136
+
137
+ .responsive-picture-placeholder {
138
+ width: 100%;
139
+ height: 100%;
140
+ background: var(
141
+ --responsive-picture-placeholder,
142
+ var(--about-image-placeholder, linear-gradient(135deg, rgba(20, 18, 22, 0.55), rgba(10, 10, 13, 0.75)))
143
+ );
144
+ background-size: cover;
145
+ animation: responsivePicturePulse 1.8s ease-in-out infinite;
146
+ filter: blur(0.5px);
147
+ }
148
+
149
+ @keyframes responsivePicturePulse {
150
+ 0% {
151
+ opacity: 0.6;
152
+ }
153
+ 50% {
154
+ opacity: 0.3;
155
+ }
156
+ 100% {
157
+ opacity: 0.6;
158
+ }
159
+ }
160
+
161
+ @keyframes fadeUpIn {
162
+ 0% {
163
+ opacity: 0;
164
+ transform: translate3d(0, 24px, 0);
165
+ }
166
+ 100% {
167
+ opacity: 1;
168
+ transform: translate3d(0, 0, 0);
169
+ }
170
+ }
171
+
172
+ @media (prefers-reduced-motion: reduce) {
173
+ .responsive-picture-placeholder {
174
+ animation: none;
175
+ }
176
+ }
177
+
178
+ .ui-visual-shell {
179
+ padding: 6px;
180
+ border-radius: 30px;
181
+ background: color-mix(in srgb, var(--brand-card-border, rgba(255, 255, 255, 0.08)) 100%, transparent);
182
+ }
183
+
184
+ .ui-visual-shell--circle {
185
+ border-radius: 50%;
186
+ display: inline-flex;
187
+ align-items: center;
188
+ justify-content: center;
189
+ }
190
+
191
+ .ui-visual-shell--circle > * {
192
+ border-radius: 50%;
193
+ }
194
+
195
+ .ui-card {
196
+ display: flex;
197
+ flex-direction: column;
198
+ gap: var(--ui-card-gap, 24px);
199
+ position: relative;
200
+ }
201
+
202
+ .ui-card-surface {
203
+ background: var(--ui-card-surface-bg, var(--brand-surface-card-bg, #ffffff));
204
+ border: 1px solid var(--ui-card-surface-border, var(--brand-surface-card-border, rgba(79, 108, 240, 0.16)));
205
+ border-radius: var(--ui-card-radius, var(--brand-card-radius, 24px));
206
+ box-shadow: var(--ui-card-surface-shadow, var(--brand-surface-card-shadow, 0 18px 40px rgba(15, 23, 42, 0.12)));
207
+ }
208
+
209
+ .brand-card {
210
+ position: relative;
211
+ display: flex;
212
+ flex-direction: column;
213
+ gap: var(--ui-gap-md, 20px);
214
+ padding: clamp(20px, 3vw, 24px);
215
+ border-radius: var(--brand-card-radius, 24px);
216
+ background: var(--brand-surface-card-bg, rgba(20, 18, 30, 0.72));
217
+ border: 1px solid color-mix(in srgb, var(--brand-surface-card-border, rgba(79, 108, 240, 0.16)) 100%, transparent);
218
+ box-shadow: var(--brand-surface-card-shadow, 0 18px 42px rgba(15, 23, 42, 0.22));
219
+ color: var(--brand-card-text, var(--ui-text-primary, #1f2a44));
220
+ }
221
+
222
+ .brand-card > :last-child {
223
+ margin-bottom: 0;
224
+ }
225
+
226
+ .primary-button {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ height: var(--ui-cta-height, 48px);
231
+ padding: 0 var(--ui-cta-padding-inline, 24px);
232
+ border-radius: var(--brand-button-radius, 14px);
233
+ border: var(--brand-primary-cta-border, 1px solid rgba(255, 255, 255, 0.18));
234
+ background: var(
235
+ --brand-primary-cta-gradient,
236
+ linear-gradient(135deg, #4f6cf0 0%, #243a80 100%)
237
+ );
238
+ color: var(--brand-primary-cta-text, #ffffff);
239
+ font-family: var(--ui-font-heading, 'Space Grotesk', 'Inter', sans-serif);
240
+ font-weight: 700;
241
+ letter-spacing: 0.12em;
242
+ text-transform: uppercase;
243
+ cursor: pointer;
244
+ box-shadow: var(--brand-primary-cta-shadow, 0 16px 32px rgba(32, 46, 104, 0.35));
245
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
246
+ text-align: center;
247
+ text-decoration: none;
248
+ }
249
+
250
+ .primary-button:hover,
251
+ .primary-button:focus-visible {
252
+ transform: var(--brand-primary-cta-hover-translate, translateY(-1px));
253
+ box-shadow: var(
254
+ --brand-primary-cta-hover-shadow,
255
+ 0 16px 32px color-mix(in srgb, var(--brand-accent-electric, #27f3ff) 35%, transparent)
256
+ );
257
+ text-decoration: none;
258
+ }
259
+
260
+ .primary-button:focus-visible {
261
+ outline: 2px solid var(--brand-accent-electric, #27f3ff);
262
+ outline-offset: 3px;
263
+ }
264
+
265
+ .primary-button:disabled {
266
+ opacity: 0.55;
267
+ cursor: not-allowed;
268
+ transform: none;
269
+ box-shadow: none;
270
+ }
271
+
272
+ .action-pill,
273
+ .action-pill--button {
274
+ display: inline-flex;
275
+ align-items: center;
276
+ justify-content: center;
277
+ min-width: 14rem;
278
+ height: auto;
279
+ padding: 18px 42px;
280
+ white-space: nowrap;
281
+ text-decoration: none;
282
+ text-transform: uppercase;
283
+ letter-spacing: 0.12em;
284
+ font-weight: 700;
285
+ font-family: var(--ui-font-heading, 'Space Grotesk', 'Inter', sans-serif);
286
+ border-radius: var(--brand-button-radius, 14px);
287
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease, color 0.2s ease;
288
+ }
289
+
290
+ .action-pill--button {
291
+ border: none;
292
+ background: none;
293
+ }
294
+
295
+ .action-pill:focus-visible,
296
+ .action-pill--button:focus-visible {
297
+ text-decoration: none;
298
+ }
299
+
300
+ .action-pill--secondary {
301
+ border: var(--action-pill-secondary-border, 1px solid rgba(255, 255, 255, 0.35));
302
+ background: var(
303
+ --action-pill-secondary-bg,
304
+ color-mix(in srgb, #ffffff 88%, rgba(12, 9, 35, 0.04))
305
+ );
306
+ color: var(--action-pill-secondary-color, #0f0d22);
307
+ box-shadow: var(--action-pill-secondary-shadow, 0 12px 26px rgba(8, 7, 18, 0.35));
308
+ cursor: pointer;
309
+ }
310
+
311
+ .action-pill--secondary:hover,
312
+ .action-pill--secondary:focus-visible {
313
+ background: var(
314
+ --action-pill-secondary-hover-bg,
315
+ color-mix(in srgb, #ffffff 92%, rgba(12, 9, 35, 0.08))
316
+ );
317
+ color: var(--action-pill-secondary-hover-color, #05030c);
318
+ transform: translateY(-1px);
319
+ box-shadow: var(
320
+ --action-pill-secondary-hover-shadow,
321
+ 0 18px 32px rgba(8, 7, 18, 0.45)
322
+ );
323
+ text-decoration: none;
324
+ }
325
+
326
+ .action-pill--secondary:focus-visible {
327
+ outline: 2px solid var(--action-pill-secondary-focus-ring, rgba(255, 255, 255, 0.7));
328
+ outline-offset: 3px;
329
+ }
330
+
331
+ .action-link {
332
+ color: var(
333
+ --action-link-color,
334
+ color-mix(in srgb, var(--brand-card-text, #ffffff) 70%, var(--ui-text-primary, #141216))
335
+ );
336
+ font-size: 13px;
337
+ letter-spacing: 0.06em;
338
+ text-transform: uppercase;
339
+ text-decoration: none;
340
+ transition: color 0.18s ease, text-decoration-color 0.18s ease, transform 0.18s ease;
341
+ padding: 6px 10px;
342
+ }
343
+
344
+ .action-link:hover {
345
+ color: var(
346
+ --action-link-hover-color,
347
+ color-mix(in srgb, var(--brand-card-text, #ffffff) 85%, var(--ui-text-primary, #141216))
348
+ );
349
+ text-decoration: underline;
350
+ text-decoration-color: var(
351
+ --action-link-hover-underline,
352
+ color-mix(in srgb, var(--brand-accent-electric, #27f3ff) 45%, transparent)
353
+ );
354
+ }
355
+
356
+ .action-link:focus-visible {
357
+ outline: 2px solid var(--action-link-focus-ring, rgba(39, 243, 255, 0.45));
358
+ outline-offset: 3px;
359
+ text-decoration: underline;
360
+ }
361
+
362
+ .action-pill,
363
+ .action-pill--button,
364
+ .action-link {
365
+ gap: 0.5rem;
366
+ }
367
+
368
+ @media (max-width: 480px) {
369
+ .action-pill,
370
+ .action-pill--button {
371
+ width: 100%;
372
+ min-width: 0;
373
+ }
374
+ }
375
+
376
+ .ui-alert {
377
+ position: relative;
378
+ padding: 16px 20px;
379
+ border-radius: 14px;
380
+ border-left: 4px solid transparent;
381
+ display: grid;
382
+ gap: 6px;
383
+ text-align: left;
384
+ background: var(--ui-alert-bg, color-mix(in srgb, var(--brand-bg-900, #141216) 78%, rgba(79, 108, 240, 0.35) 22%));
385
+ color: var(--ui-alert-color, var(--brand-fg-100));
386
+ box-shadow: var(--ui-alert-shadow, 0 16px 32px rgba(16, 20, 45, 0.35));
387
+ }
388
+
389
+ .ui-alert__title {
390
+ margin: 0;
391
+ font-family: var(--ui-font-heading, 'Space Grotesk', 'Inter', sans-serif);
392
+ text-transform: uppercase;
393
+ letter-spacing: 0.14em;
394
+ font-size: 0.78rem;
395
+ }
396
+
397
+ .ui-alert__message {
398
+ margin: 0;
399
+ font-family: var(--ui-font-body, 'Inter', sans-serif);
400
+ font-size: 0.92rem;
401
+ line-height: 1.5;
402
+ color: inherit;
403
+ }
404
+
405
+ .ui-alert__close {
406
+ position: absolute;
407
+ top: 12px;
408
+ right: 14px;
409
+ border: none;
410
+ background: transparent;
411
+ color: inherit;
412
+ font-size: 1.1rem;
413
+ line-height: 1;
414
+ cursor: pointer;
415
+ padding: 0;
416
+ }
417
+
418
+ .ui-alert__close:focus-visible {
419
+ outline: 2px solid color-mix(in srgb, currentColor 60%, transparent);
420
+ outline-offset: 2px;
421
+ }
422
+
423
+ .ui-alert--success {
424
+ border-left-color: var(--brand-status-success, #239c65);
425
+ background: color-mix(in srgb, var(--brand-status-success, #239c65) 22%, var(--brand-bg-900, #141216) 78%);
426
+ }
427
+
428
+ .ui-alert--error {
429
+ border-left-color: var(--brand-status-error, #d04f4f);
430
+ background: color-mix(in srgb, var(--brand-status-error, #d04f4f) 24%, var(--brand-bg-900, #141216) 76%);
431
+ }
432
+
433
+ .ui-alert--warning {
434
+ border-left-color: var(--brand-amber-heat, #f18f3b);
435
+ background: color-mix(in srgb, var(--brand-amber-heat, #f18f3b) 22%, var(--brand-bg-900, #141216) 78%);
436
+ }
437
+
438
+ .ui-alert--info {
439
+ border-left-color: var(--brand-accent-electric, #4f6cf0);
440
+ background: color-mix(in srgb, var(--brand-accent-electric, #4f6cf0) 22%, var(--brand-bg-900, #141216) 78%);
441
+ }
442
+
443
+ .ui-stack {
444
+ display: flex;
445
+ flex-direction: column;
446
+ gap: var(--ui-gap-md, 16px);
447
+ }
448
+
449
+ .ui-grid-sm-2 {
450
+ display: grid;
451
+ gap: var(--ui-gap-md, 16px);
452
+ grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr));
453
+ }
454
+
455
+ @media (max-width: 640px) {
456
+ .ui-grid-sm-2 {
457
+ grid-template-columns: 1fr;
458
+ }
459
+ }
460
+
461
+ .ui-section {
462
+ padding: 60px 0;
463
+ scroll-margin-top: clamp(94px, 17vh, 168px);
464
+ font-family: var(--ui-font-body, 'Inter', 'Space Grotesk', sans-serif);
465
+ }
466
+
467
+ .ui-section--stacked {
468
+ padding-top: clamp(48px, 12vw, 96px);
469
+ padding-bottom: clamp(32px, 10vw, 80px);
470
+ }
471
+
472
+ .ui-spacer {
473
+ width: 100%;
474
+ height: 0;
475
+ display: block;
476
+ pointer-events: none;
477
+ padding-top: var(--ui-spacer-size, 24px);
478
+ padding-bottom: var(--ui-spacer-size, 24px);
479
+ }
480
+
481
+ .ui-eyebrow {
482
+ font-size: var(--ui-type-caption, 0.8125rem);
483
+ letter-spacing: 0.28em;
484
+ text-transform: uppercase;
485
+ font-weight: 600;
486
+ font-family: var(--ui-font-heading, 'Space Grotesk', 'Inter', sans-serif);
487
+ color: var(--ui-text-muted, var(--brand-fg-300, #54627b));
488
+ }
489
+
490
+ .ui-title-md {
491
+ font-size: var(--ui-type-subheadline, 1.25rem);
492
+ font-weight: 600;
493
+ letter-spacing: 0.12em;
494
+ text-transform: uppercase;
495
+ font-family: var(--ui-font-heading, 'Space Grotesk', 'Inter', sans-serif);
496
+ line-height: 1.3;
497
+ color: var(--ui-text-primary, var(--brand-fg-100, #1f2a44));
498
+ }
499
+
500
+ .ui-title-sm {
501
+ font-size: var(--ui-type-body, 1rem);
502
+ font-weight: 600;
503
+ letter-spacing: 0.1em;
504
+ text-transform: uppercase;
505
+ font-family: var(--ui-font-heading, 'Space Grotesk', 'Inter', sans-serif);
506
+ line-height: 1.3;
507
+ color: var(--ui-text-primary, var(--brand-fg-100, #1f2a44));
508
+ }
509
+
510
+ .display-heading {
511
+ display: inline-flex;
512
+ flex-wrap: wrap;
513
+ justify-content: center;
514
+ gap: clamp(0.25em, 0.35em, 0.5em);
515
+ text-align: center;
516
+ line-height: 1.1;
517
+ text-transform: uppercase;
518
+ }
519
+
520
+ .display-heading__part {
521
+ display: inline-block;
522
+ }
523
+
524
+ .display-heading__part--nowrap {
525
+ white-space: nowrap;
526
+ }
527
+
528
+ .section-header {
529
+ max-width: min(680px, 92vw);
530
+ margin: 0 auto clamp(32px, 6vw, 64px);
531
+ }
532
+
533
+ .section-heading {
534
+ margin-bottom: 12px;
535
+ }
536
+
537
+ .section-divider {
538
+ display: block;
539
+ width: var(--section-divider-width, 72px);
540
+ height: var(--section-divider-height, var(--section-eyebrow-divider-width, 2px));
541
+ background: var(--section-divider-color, var(--brand-border-highlight, rgba(79, 108, 240, 0.28)));
542
+ margin: 12px auto 0;
543
+ border-radius: 999px;
544
+ }
545
+
546
+ .section-description {
547
+ margin-top: 12px;
548
+ margin-bottom: 0;
549
+ font-size: 1.1rem;
550
+ color: var(--section-description-color, var(--ui-text-muted, rgba(31, 42, 68, 0.72)));
551
+ }
552
+
553
+ .section-eyebrow-divider {
554
+ display: inline-block;
555
+ padding-bottom: var(--section-eyebrow-divider-spacing, 5px);
556
+ border-bottom: var(--section-eyebrow-divider-width, 2px) solid currentColor;
557
+ }
558
+
559
+ @media (max-width: 1024px) {
560
+ .display-heading__part--nowrap {
561
+ white-space: normal;
562
+ }
563
+ }
564
+
565
+ @media (max-width: 480px) {
566
+ .display-heading {
567
+ font-size: clamp(1.9rem, 6.8vw, 2.4rem);
568
+ flex-direction: column;
569
+ gap: 0.25em;
570
+ }
571
+ }
572
+
573
+ .ui-label-sm {
574
+ font-size: var(--ui-type-caption, 0.8125rem);
575
+ letter-spacing: 0.18em;
576
+ text-transform: uppercase;
577
+ font-family: var(--ui-font-body, 'Inter', 'Space Grotesk', sans-serif);
578
+ font-weight: 500;
579
+ line-height: 1.4;
580
+ color: var(--ui-text-muted, var(--brand-fg-300, #54627b));
581
+ }
582
+
583
+ .ui-value-lg {
584
+ font-size: var(--ui-type-value, 1.5rem);
585
+ font-weight: 600;
586
+ letter-spacing: 0.04em;
587
+ font-family: var(--ui-font-heading, 'Space Grotesk', 'Inter', sans-serif);
588
+ line-height: 1.25;
589
+ color: var(--ui-field-value, var(--brand-fg-100, #1f2a44));
590
+ white-space: nowrap;
591
+ overflow: hidden;
592
+ text-overflow: ellipsis;
593
+ font-variant-numeric: tabular-nums;
594
+ max-width: 100%;
595
+ }
596
+
597
+ .ui-card-grid {
598
+ display: grid;
599
+ gap: clamp(24px, 4vw, 36px);
600
+ grid-template-columns: repeat(auto-fit, minmax(min(420px, 100%), 1fr));
601
+ justify-content: center;
602
+ }
603
+
604
+ .ui-card-grid--left {
605
+ justify-content: flex-start;
606
+ }
607
+
608
+ .ui-card-grid__item {
609
+ display: flex;
610
+ justify-content: center;
611
+ width: min(460px, 100%);
612
+ }
613
+
614
+
615
+ .ui-card-grid--team {
616
+ --team-grid-gap: clamp(12px, 2.5vw, 24px);
617
+ --team-card-min-width: clamp(280px, 28vw, 320px);
618
+ display: flex;
619
+ flex-wrap: wrap;
620
+ gap: var(--team-grid-gap, clamp(12px, 2.5vw, 24px));
621
+ justify-content: center;
622
+ align-items: stretch;
623
+ }
624
+
625
+ .ui-card-grid--team .ui-card-grid__item {
626
+ flex: 0 1 var(--team-card-min-width, clamp(280px, 28vw, 320px));
627
+ max-width: min(var(--team-card-min-width, clamp(280px, 28vw, 320px)), 100%);
628
+ display: flex;
629
+ align-items: stretch;
630
+ }
631
+
632
+
633
+ .ui-form-control {
634
+ width: 100%;
635
+ border-radius: var(--ui-form-radius, var(--ui-field-radius, 18px));
636
+ border: 1px solid var(--ui-form-border, var(--brand-input-border, rgba(79, 108, 240, 0.25)));
637
+ background: var(--ui-form-bg, var(--brand-input-bg, #ffffff));
638
+ color: var(--ui-form-color, var(--ui-text-primary, #1f2a44));
639
+ padding: var(--ui-form-padding, 14px 18px);
640
+ font-size: 1rem;
641
+ line-height: 1.4;
642
+ transition: border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
643
+ }
644
+
645
+ .ui-form-control::placeholder {
646
+ color: var(--ui-form-placeholder, var(--brand-input-placeholder, rgba(84, 98, 123, 0.64)));
647
+ }
648
+
649
+ .ui-form-control:focus {
650
+ outline: 2px solid var(--ui-form-focus-outline, var(--brand-accent-electric, #4f6cf0));
651
+ outline-offset: 2px;
652
+ border-color: transparent;
653
+ box-shadow:
654
+ var(--brand-focus-ring, 0 0 0 2px rgba(79, 108, 240, 0.22)),
655
+ var(--brand-focus-glow, 0 0 22px rgba(79, 108, 240, 0.18));
656
+ background: var(--ui-form-bg-focused, var(--brand-input-bg, #ffffff));
657
+ }
658
+
659
+ .ui-form-textarea {
660
+ min-height: 160px;
661
+ resize: vertical;
662
+ }
663
+
664
+ .ui-input-group {
665
+ display: flex;
666
+ border-radius: var(--ui-form-radius, var(--ui-field-radius, 18px));
667
+ border: 1px solid var(--ui-form-border, var(--brand-input-border, rgba(79, 108, 240, 0.25)));
668
+ overflow: hidden;
669
+ background: var(--ui-form-bg, var(--brand-input-bg, #ffffff));
670
+ }
671
+
672
+ .ui-input-group__addon {
673
+ padding: 12px 16px;
674
+ white-space: nowrap;
675
+ background: var(--ui-input-group-addon-bg, rgba(79, 108, 240, 0.08));
676
+ color: var(--ui-input-group-addon-color, var(--ui-text-primary, #1f2a44));
677
+ font-weight: 600;
678
+ display: inline-flex;
679
+ align-items: center;
680
+ }
681
+
682
+ .ui-input-group__input {
683
+ border: none;
684
+ border-radius: 0;
685
+ flex: 1;
686
+ min-width: 0;
687
+ padding: var(--ui-form-padding, 14px 18px);
688
+ font-size: 1rem;
689
+ line-height: 1.4;
690
+ background: transparent;
691
+ color: var(--ui-form-color, var(--ui-text-primary, #1f2a44));
692
+ }
693
+
694
+ .ui-input-group__input::placeholder {
695
+ color: var(--ui-form-placeholder, var(--brand-input-placeholder, rgba(84, 98, 123, 0.64)));
696
+ }
697
+
698
+ .ui-input-group__input:focus {
699
+ outline: none;
700
+ }
701
+
702
+ .ui-form-hint {
703
+ display: block;
704
+ margin: 4px 0 10px;
705
+ color: var(--ui-form-hint-color, var(--ui-text-muted, rgba(31, 42, 68, 0.72)));
706
+ }
707
+
708
+ .ui-footer {
709
+ background: var(--ui-footer-bg);
710
+ color: var(--ui-footer-color);
711
+ border-top: 1px solid var(--ui-footer-border);
712
+ padding-top: clamp(40px, 11vw, 80px);
713
+ padding-bottom: clamp(32px, 8vw, 64px);
714
+ }
715
+
716
+ .ui-footer__grid {
717
+ display: flex;
718
+ flex-wrap: wrap;
719
+ gap: clamp(24px, 6vw, 48px);
720
+ justify-content: space-between;
721
+ }
722
+
723
+ .ui-footer__brand,
724
+ .ui-footer__links {
725
+ flex: 1 1 min(280px, 100%);
726
+ }
727
+
728
+ .ui-footer__logo {
729
+ display: inline-flex;
730
+ margin-bottom: 16px;
731
+ }
732
+
733
+ .ui-footer__text {
734
+ font-size: 0.78rem;
735
+ line-height: 1.5;
736
+ color: var(--ui-footer-color);
737
+ }
738
+
739
+ .ui-footer__heading {
740
+ margin-bottom: 12px;
741
+ color: var(--ui-footer-color);
742
+ }
743
+
744
+ .ui-footer__nav {
745
+ list-style: none;
746
+ padding: 0;
747
+ margin: 0;
748
+ display: grid;
749
+ gap: 10px;
750
+ }
751
+
752
+ .ui-footer__nav li {
753
+ border-bottom: 1px solid color-mix(in srgb, var(--ui-footer-border) 60%, transparent);
754
+ padding: 10px 0;
755
+ }
756
+
757
+ .ui-footer__link {
758
+ display: inline-flex;
759
+ align-items: center;
760
+ justify-content: space-between;
761
+ gap: 12px;
762
+ text-transform: uppercase;
763
+ font-size: 0.72rem;
764
+ letter-spacing: 0.14em;
765
+ color: var(--ui-footer-link);
766
+ transition: color 0.2s ease, transform 0.2s ease;
767
+ }
768
+
769
+ .ui-footer__link:hover,
770
+ .ui-footer__link:focus-visible {
771
+ color: var(--ui-footer-link-hover);
772
+ text-decoration: none;
773
+ transform: translateX(2px);
774
+ }
775
+
776
+ .ui-footer__link-icon {
777
+ font-size: 0.8rem;
778
+ transition: transform 0.2s ease;
779
+ }
780
+
781
+ .ui-footer__link:hover .ui-footer__link-icon,
782
+ .ui-footer__link:focus-visible .ui-footer__link-icon {
783
+ transform: translateX(4px);
784
+ }
785
+
786
+ .ui-legal {
787
+ background: var(--ui-legal-bg);
788
+ color: var(--ui-legal-color);
789
+ padding: 18px 0;
790
+ border-top: 1px solid color-mix(in srgb, var(--ui-footer-border) 60%, transparent);
791
+ font-size: 0.85rem;
792
+ }
793
+
794
+ .ui-legal__content {
795
+ display: flex;
796
+ flex-wrap: wrap;
797
+ justify-content: space-between;
798
+ align-items: center;
799
+ gap: 16px;
800
+ }
801
+
802
+ .ui-legal__links {
803
+ display: flex;
804
+ flex-wrap: wrap;
805
+ gap: 16px;
806
+ list-style: none;
807
+ padding: 0;
808
+ margin: 0;
809
+ }
810
+
811
+ .ui-legal__link {
812
+ color: var(--ui-legal-link);
813
+ text-transform: uppercase;
814
+ letter-spacing: 0.14em;
815
+ font-size: 0.78rem;
816
+ transition: color 0.2s ease;
817
+ }
818
+
819
+ .ui-legal__link:hover,
820
+ .ui-legal__link:focus-visible {
821
+ color: var(--ui-footer-link-hover);
822
+ text-decoration: none;
823
+ }
824
+
825
+ .ui-backtotop {
826
+ position: fixed;
827
+ bottom: clamp(16px, 3vw, 28px);
828
+ right: clamp(16px, 3vw, 28px);
829
+ width: 48px;
830
+ height: 48px;
831
+ border-radius: 999px;
832
+ border: 1px solid color-mix(in srgb, var(--brand-primary-cta-text, #ffffff) 35%, transparent);
833
+ background: var(--brand-primary-cta-gradient, linear-gradient(135deg, #4f6cf0 0%, #243a80 100%));
834
+ color: var(--brand-primary-cta-text, #ffffff);
835
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.35);
836
+ display: inline-flex;
837
+ align-items: center;
838
+ justify-content: center;
839
+ cursor: pointer;
840
+ opacity: 0;
841
+ transform: translate3d(0, 8px, 0);
842
+ pointer-events: none;
843
+ transition:
844
+ opacity 0.25s ease,
845
+ transform 0.25s ease;
846
+ z-index: 600;
847
+ }
848
+
849
+ .ui-backtotop--visible {
850
+ opacity: 1;
851
+ pointer-events: auto;
852
+ transform: translate3d(0, 0, 0);
853
+ }
854
+
855
+ .ui-backtotop__icon {
856
+ font-size: 1rem;
857
+ line-height: 1;
858
+ }
859
+
860
+ @media (prefers-reduced-motion: reduce) {
861
+ .ui-backtotop {
862
+ transition: none;
863
+ }
864
+ }
865
+
866
+ .fade-up-in {
867
+ opacity: 0;
868
+ transform: translate3d(0, 24px, 0);
869
+ animation: fadeUpIn 0.9s ease forwards;
870
+ animation-delay: var(--fade-up-delay, 0s);
871
+ animation-play-state: paused;
872
+ }
873
+
874
+ .fade-up-in[data-observed='true'] {
875
+ animation-play-state: running;
876
+ }
877
+
878
+ .fade-up-in:not([data-observed]),
879
+ .fade-up-in[data-observed='false'] {
880
+ opacity: 0;
881
+ transform: translate3d(0, 24px, 0);
882
+ }
883
+
884
+ [data-motion-pref='reduce'] .fade-up-in {
885
+ animation: none !important;
886
+ opacity: 1;
887
+ transform: none;
888
+ }
889
+
890
+ @media (prefers-reduced-motion: reduce) {
891
+ .fade-up-in {
892
+ animation: none !important;
893
+ opacity: 1;
894
+ transform: none;
895
+ }
896
+ }