@cogenta/theme-association 0.3.2

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 (117) hide show
  1. package/LICENSE +373 -0
  2. package/dist/src/index.d.ts +21 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +21 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/render/blocks/accordion.d.ts +4 -0
  7. package/dist/src/render/blocks/accordion.d.ts.map +1 -0
  8. package/dist/src/render/blocks/accordion.js +16 -0
  9. package/dist/src/render/blocks/accordion.js.map +1 -0
  10. package/dist/src/render/blocks/collection-list.d.ts +12 -0
  11. package/dist/src/render/blocks/collection-list.d.ts.map +1 -0
  12. package/dist/src/render/blocks/collection-list.js +64 -0
  13. package/dist/src/render/blocks/collection-list.js.map +1 -0
  14. package/dist/src/render/blocks/cta.d.ts +9 -0
  15. package/dist/src/render/blocks/cta.d.ts.map +1 -0
  16. package/dist/src/render/blocks/cta.js +16 -0
  17. package/dist/src/render/blocks/cta.js.map +1 -0
  18. package/dist/src/render/blocks/embed.d.ts +4 -0
  19. package/dist/src/render/blocks/embed.d.ts.map +1 -0
  20. package/dist/src/render/blocks/embed.js +76 -0
  21. package/dist/src/render/blocks/embed.js.map +1 -0
  22. package/dist/src/render/blocks/faq.d.ts +4 -0
  23. package/dist/src/render/blocks/faq.d.ts.map +1 -0
  24. package/dist/src/render/blocks/faq.js +21 -0
  25. package/dist/src/render/blocks/faq.js.map +1 -0
  26. package/dist/src/render/blocks/feature-grid.d.ts +4 -0
  27. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -0
  28. package/dist/src/render/blocks/feature-grid.js +27 -0
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -0
  30. package/dist/src/render/blocks/gallery.d.ts +14 -0
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -0
  32. package/dist/src/render/blocks/gallery.js +27 -0
  33. package/dist/src/render/blocks/gallery.js.map +1 -0
  34. package/dist/src/render/blocks/hero.d.ts +15 -0
  35. package/dist/src/render/blocks/hero.d.ts.map +1 -0
  36. package/dist/src/render/blocks/hero.js +31 -0
  37. package/dist/src/render/blocks/hero.js.map +1 -0
  38. package/dist/src/render/blocks/logo-strip.d.ts +4 -0
  39. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -0
  40. package/dist/src/render/blocks/logo-strip.js +16 -0
  41. package/dist/src/render/blocks/logo-strip.js.map +1 -0
  42. package/dist/src/render/blocks/logos.d.ts +4 -0
  43. package/dist/src/render/blocks/logos.d.ts.map +1 -0
  44. package/dist/src/render/blocks/logos.js +22 -0
  45. package/dist/src/render/blocks/logos.js.map +1 -0
  46. package/dist/src/render/blocks/media-figure.d.ts +12 -0
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -0
  48. package/dist/src/render/blocks/media-figure.js +27 -0
  49. package/dist/src/render/blocks/media-figure.js.map +1 -0
  50. package/dist/src/render/blocks/pricing-table.d.ts +4 -0
  51. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -0
  52. package/dist/src/render/blocks/pricing-table.js +29 -0
  53. package/dist/src/render/blocks/pricing-table.js.map +1 -0
  54. package/dist/src/render/blocks/prose.d.ts +9 -0
  55. package/dist/src/render/blocks/prose.d.ts.map +1 -0
  56. package/dist/src/render/blocks/prose.js +10 -0
  57. package/dist/src/render/blocks/prose.js.map +1 -0
  58. package/dist/src/render/blocks/quote.d.ts +13 -0
  59. package/dist/src/render/blocks/quote.d.ts.map +1 -0
  60. package/dist/src/render/blocks/quote.js +26 -0
  61. package/dist/src/render/blocks/quote.js.map +1 -0
  62. package/dist/src/render/blocks/stat-counter.d.ts +4 -0
  63. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -0
  64. package/dist/src/render/blocks/stat-counter.js +14 -0
  65. package/dist/src/render/blocks/stat-counter.js.map +1 -0
  66. package/dist/src/render/blocks/stats.d.ts +4 -0
  67. package/dist/src/render/blocks/stats.d.ts.map +1 -0
  68. package/dist/src/render/blocks/stats.js +18 -0
  69. package/dist/src/render/blocks/stats.js.map +1 -0
  70. package/dist/src/render/blocks/testimonial.d.ts +11 -0
  71. package/dist/src/render/blocks/testimonial.d.ts.map +1 -0
  72. package/dist/src/render/blocks/testimonial.js +20 -0
  73. package/dist/src/render/blocks/testimonial.js.map +1 -0
  74. package/dist/src/render/chrome.d.ts +3 -0
  75. package/dist/src/render/chrome.d.ts.map +1 -0
  76. package/dist/src/render/chrome.js +106 -0
  77. package/dist/src/render/chrome.js.map +1 -0
  78. package/dist/src/render/render-block.d.ts +21 -0
  79. package/dist/src/render/render-block.d.ts.map +1 -0
  80. package/dist/src/render/render-block.js +104 -0
  81. package/dist/src/render/render-block.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +3 -0
  83. package/dist/src/render/term-archive.d.ts.map +1 -0
  84. package/dist/src/render/term-archive.js +42 -0
  85. package/dist/src/render/term-archive.js.map +1 -0
  86. package/dist/theme.config.d.ts +15 -0
  87. package/dist/theme.config.d.ts.map +1 -0
  88. package/dist/theme.config.js +45 -0
  89. package/dist/theme.config.js.map +1 -0
  90. package/package.json +57 -0
  91. package/src/index.ts +20 -0
  92. package/src/render/blocks/accordion.ts +47 -0
  93. package/src/render/blocks/collection-list.ts +144 -0
  94. package/src/render/blocks/cta.ts +37 -0
  95. package/src/render/blocks/embed.ts +98 -0
  96. package/src/render/blocks/faq.ts +52 -0
  97. package/src/render/blocks/feature-grid.ts +67 -0
  98. package/src/render/blocks/gallery.ts +47 -0
  99. package/src/render/blocks/hero.ts +60 -0
  100. package/src/render/blocks/logo-strip.ts +31 -0
  101. package/src/render/blocks/logos.ts +52 -0
  102. package/src/render/blocks/media-figure.ts +38 -0
  103. package/src/render/blocks/pricing-table.ts +73 -0
  104. package/src/render/blocks/prose.ts +15 -0
  105. package/src/render/blocks/quote.ts +39 -0
  106. package/src/render/blocks/stat-counter.ts +36 -0
  107. package/src/render/blocks/stats.ts +45 -0
  108. package/src/render/blocks/testimonial.ts +36 -0
  109. package/src/render/chrome.ts +134 -0
  110. package/src/render/render-block.ts +140 -0
  111. package/src/render/term-archive.ts +92 -0
  112. package/src/styles/archive.css +129 -0
  113. package/src/styles/base.css +842 -0
  114. package/src/styles/blocks.css +1002 -0
  115. package/src/styles/theme.css +31 -0
  116. package/src/styles/tokens.css +332 -0
  117. package/tokens.json +36 -0
@@ -0,0 +1,842 @@
1
+ /*
2
+ * Document, accessibility floor, page frame, chrome (header/footer/nav) and
3
+ * the one control the theme ships (an action link). Everything here reads
4
+ * the design system from `tokens.css`; nothing here reads a `--cogenta-*`
5
+ * token directly.
6
+ */
7
+
8
+ /* --------------------------------------------------------------------------
9
+ Document
10
+ -------------------------------------------------------------------------- */
11
+
12
+ *,
13
+ *::before,
14
+ *::after {
15
+ box-sizing: border-box;
16
+ }
17
+
18
+ body {
19
+ margin: 0;
20
+ background: var(--cg-canvas);
21
+ color: var(--cg-ink);
22
+ font-family: var(--cogenta-font-sans);
23
+ font-size: var(--cg-text-md);
24
+ line-height: var(--cg-leading-normal);
25
+ font-kerning: normal;
26
+ font-variant-ligatures: common-ligatures;
27
+ text-underline-offset: 0.15em;
28
+ text-decoration-thickness: from-font;
29
+ -webkit-text-size-adjust: 100%;
30
+ }
31
+
32
+ h1,
33
+ h2,
34
+ h3,
35
+ h4,
36
+ h5,
37
+ h6 {
38
+ font-family: var(--cg-font-display);
39
+ font-weight: var(--cg-weight-bold);
40
+ }
41
+
42
+ ::selection {
43
+ background: var(--cg-accent-soft);
44
+ color: var(--cg-accent-soft-fg);
45
+ }
46
+
47
+ img,
48
+ video,
49
+ iframe {
50
+ max-width: 100%;
51
+ height: auto;
52
+ }
53
+
54
+ img {
55
+ display: block;
56
+ object-fit: cover;
57
+ }
58
+
59
+ :where(a) {
60
+ color: var(--cg-accent);
61
+ text-decoration-color: color-mix(in oklab, var(--cg-accent) 40%, transparent);
62
+ transition:
63
+ color var(--cg-duration-fast) var(--cg-ease),
64
+ text-decoration-color var(--cg-duration-fast) var(--cg-ease);
65
+ }
66
+
67
+ :where(a:hover) {
68
+ color: var(--cg-accent-hover);
69
+ text-decoration-color: currentColor;
70
+ }
71
+
72
+ :where(hr) {
73
+ block-size: 1px;
74
+ border: 0;
75
+ margin-block: var(--cg-s10);
76
+ background: var(--cg-line);
77
+ }
78
+
79
+ /* A visually hidden label — `renderSocialLinks` (`@cogenta/theme-kit`) needs
80
+ this class to exist, and this is the standard clip-to-1px technique. */
81
+ .cg-visually-hidden {
82
+ position: absolute;
83
+ inline-size: 1px;
84
+ block-size: 1px;
85
+ overflow: hidden;
86
+ clip: rect(0 0 0 0);
87
+ white-space: nowrap;
88
+ }
89
+
90
+ /* --------------------------------------------------------------------------
91
+ Focus, targets, motion
92
+ -------------------------------------------------------------------------- */
93
+
94
+ :where(a, button, summary, [tabindex]):focus-visible {
95
+ outline: 2px solid var(--cg-accent);
96
+ outline-offset: 3px;
97
+ border-radius: var(--cg-radius-xs);
98
+ }
99
+
100
+ :where(.cg-action, .cg-faq__question, .cg-accordion__question, .cg-nav-toggle__button) {
101
+ min-block-size: 44px;
102
+ min-inline-size: 44px;
103
+ }
104
+
105
+ @supports (animation-timeline: view()) {
106
+ @media (prefers-reduced-motion: no-preference) {
107
+ @keyframes cg-settle {
108
+ from {
109
+ opacity: 0;
110
+ transform: translateY(var(--cg-s3));
111
+ }
112
+
113
+ to {
114
+ opacity: 1;
115
+ transform: none;
116
+ }
117
+ }
118
+
119
+ .cg-block {
120
+ animation: cg-settle linear both;
121
+ animation-timeline: view();
122
+ animation-range: entry 0% cover 20%;
123
+ }
124
+ }
125
+ }
126
+
127
+ @media (prefers-reduced-motion: reduce) {
128
+ *,
129
+ *::before,
130
+ *::after {
131
+ animation-duration: 1ms !important;
132
+ animation-iteration-count: 1 !important;
133
+ transition-duration: 1ms !important;
134
+ scroll-behavior: auto !important;
135
+ }
136
+ }
137
+
138
+ .cg-skip-link {
139
+ position: absolute;
140
+ inset-inline-start: var(--cg-s3);
141
+ inset-block-start: calc(var(--cg-s3) * -8);
142
+ z-index: 10;
143
+ padding: var(--cg-s2) var(--cg-s4);
144
+ background: var(--cg-ink);
145
+ color: var(--cg-canvas);
146
+ border-radius: var(--cg-radius-sm);
147
+ font-weight: var(--cg-weight-semibold);
148
+ text-decoration: none;
149
+ transition: inset-block-start var(--cg-duration) var(--cg-ease);
150
+ }
151
+
152
+ .cg-skip-link:focus-visible {
153
+ inset-block-start: var(--cg-s3);
154
+ outline-color: var(--cg-canvas);
155
+ }
156
+
157
+ /* --------------------------------------------------------------------------
158
+ Page frame
159
+ -------------------------------------------------------------------------- */
160
+
161
+ .cg-main {
162
+ display: flow-root;
163
+ /* Contains decorative bleed (the hero's own negative-inset halo) so it
164
+ never contributes to the document's horizontal scroll extent — found on
165
+ this theme's own scaffolded site at 360px. */
166
+ overflow-x: clip;
167
+ }
168
+
169
+ .cg-block {
170
+ max-inline-size: var(--cg-page);
171
+ margin-inline: auto;
172
+ margin-block: var(--cg-section-y);
173
+ padding-inline: var(--cg-gutter);
174
+ }
175
+
176
+ /* --- per-block visual variant (blocks@2.0, RFC 0002) ---------------------- */
177
+
178
+ [data-block][data-variant-background="muted"],
179
+ [data-block][data-variant-background="image"] {
180
+ padding-block: var(--cg-s10);
181
+ border-radius: var(--cg-radius-lg);
182
+ }
183
+
184
+ [data-block][data-variant-background="muted"] {
185
+ background: var(--cg-surface-sunken);
186
+ }
187
+
188
+ [data-block][data-variant-background="image"] {
189
+ background: var(--cg-surface-tinted);
190
+ }
191
+
192
+ [data-block][data-variant-spacing="compact"] {
193
+ margin-block: calc(var(--cg-section-y) / 2);
194
+ }
195
+
196
+ [data-block][data-variant-spacing="spacious"] {
197
+ margin-block: calc(var(--cg-section-y) * 1.6);
198
+ }
199
+
200
+ [data-block][data-variant-align="start"] {
201
+ text-align: start;
202
+ }
203
+
204
+ [data-block][data-variant-align="center"] {
205
+ text-align: center;
206
+ }
207
+
208
+ [data-block][data-variant-align="end"] {
209
+ text-align: end;
210
+ }
211
+
212
+ [data-block][data-variant-width="full"] {
213
+ max-inline-size: none;
214
+ padding-inline: 0;
215
+ }
216
+
217
+ .cg-page__title {
218
+ max-inline-size: var(--cg-page);
219
+ margin-inline: auto;
220
+ margin-block: var(--cg-section-y) var(--cg-s6);
221
+ padding-inline: var(--cg-gutter);
222
+ font-size: var(--cg-text-3xl);
223
+ line-height: var(--cg-leading-tight);
224
+ letter-spacing: var(--cg-tracking-tight);
225
+ text-wrap: balance;
226
+ }
227
+
228
+ /* --------------------------------------------------------------------------
229
+ Chrome — sticky header, pill nav, CSS-only mobile disclosure
230
+ -------------------------------------------------------------------------- */
231
+
232
+ .cg-site-header {
233
+ position: sticky;
234
+ inset-block-start: 0;
235
+ z-index: 5;
236
+ padding: var(--cg-s4) var(--cg-gutter);
237
+ /* Flat and fully opaque, not a frosted-glass blur: a sticky header reads
238
+ as a solid plane sitting above the page, with a hairline marking where
239
+ it ends. */
240
+ background: var(--cg-canvas);
241
+ border-block-end: 1px solid var(--cg-line-soft);
242
+ }
243
+
244
+ .cg-site-header__inner {
245
+ display: flex;
246
+ flex-wrap: wrap;
247
+ align-items: center;
248
+ gap: var(--cg-gap);
249
+ max-inline-size: var(--cg-page);
250
+ margin-inline: auto;
251
+ }
252
+
253
+ .cg-site-header__home {
254
+ display: flex;
255
+ align-items: center;
256
+ color: var(--cg-ink);
257
+ font-family: var(--cg-font-display);
258
+ font-weight: var(--cg-weight-bold);
259
+ font-size: var(--cg-text-lg);
260
+ text-decoration: none;
261
+ margin-inline-end: auto;
262
+ }
263
+
264
+ .cg-site-header__logo {
265
+ display: block;
266
+ block-size: 2.25rem;
267
+ inline-size: auto;
268
+ max-inline-size: 14rem;
269
+ object-fit: contain;
270
+ }
271
+
272
+ /* The desktop row is hidden by default (mobile-first) and shown from the
273
+ breakpoint the toggle disappears at — the two are never both visible, so
274
+ the hidden one drops out of the accessibility tree along with its
275
+ `display: none`. */
276
+ .cg-nav--desktop {
277
+ display: none;
278
+ }
279
+
280
+ .cg-nav__items {
281
+ display: flex;
282
+ flex-wrap: wrap;
283
+ align-items: center;
284
+ gap: var(--cg-s5);
285
+ margin: 0;
286
+ padding: 0;
287
+ list-style: none;
288
+ font-size: var(--cg-text-sm);
289
+ font-weight: var(--cg-weight-semibold);
290
+ }
291
+
292
+ .cg-nav__items a,
293
+ .cg-nav__items span {
294
+ color: var(--cg-ink-muted);
295
+ text-decoration: none;
296
+ border-radius: var(--cg-radius-pill);
297
+ padding: var(--cg-s2) var(--cg-s3);
298
+ transition:
299
+ background-color var(--cg-duration) var(--cg-ease),
300
+ color var(--cg-duration) var(--cg-ease);
301
+ }
302
+
303
+ .cg-nav__items a:hover {
304
+ color: var(--cg-ink);
305
+ background: var(--cg-surface-sunken);
306
+ }
307
+
308
+ /* The mobile disclosure — `<details>`/`<summary>`, zero JavaScript. */
309
+ .cg-nav-toggle {
310
+ position: relative;
311
+ }
312
+
313
+ .cg-nav-toggle__button {
314
+ display: flex;
315
+ align-items: center;
316
+ justify-content: center;
317
+ inline-size: 2.75rem;
318
+ block-size: 2.75rem;
319
+ border-radius: var(--cg-radius-pill);
320
+ background: var(--cg-surface-sunken);
321
+ color: var(--cg-ink);
322
+ cursor: pointer;
323
+ list-style: none;
324
+ }
325
+
326
+ .cg-nav-toggle__button::-webkit-details-marker {
327
+ display: none;
328
+ }
329
+
330
+ .cg-nav-toggle__icon {
331
+ inline-size: 1.25rem;
332
+ block-size: 1.25rem;
333
+ }
334
+
335
+ .cg-nav--mobile {
336
+ /* Explicit, not left to the browser's own closed-`<details>` suppression:
337
+ that suppression stops *painting* the content, but an absolutely
338
+ positioned panel this far off its own toggle can still be measured into
339
+ the document's horizontal extent, producing a real, scrollable overflow
340
+ with no visible cause — found on this theme's own scaffolded site at
341
+ 360px. `display: none` here removes the box outright; the toggle's own
342
+ `[open]` rule below is the only thing that ever shows it again. */
343
+ display: none;
344
+ position: absolute;
345
+ inset-inline-end: 0;
346
+ inset-block-start: calc(100% + var(--cg-s2));
347
+ z-index: 6;
348
+ min-inline-size: 13rem;
349
+ padding: var(--cg-s3);
350
+ background: var(--cg-surface-raised);
351
+ border-radius: var(--cg-radius-md);
352
+ box-shadow: var(--cogenta-shadow-md);
353
+ }
354
+
355
+ .cg-nav--mobile .cg-nav__items {
356
+ flex-direction: column;
357
+ align-items: stretch;
358
+ gap: var(--cg-s1);
359
+ }
360
+
361
+ .cg-nav-toggle[open] .cg-nav--mobile {
362
+ display: block;
363
+ }
364
+
365
+ .cg-nav--mobile .cg-nav__items a,
366
+ .cg-nav--mobile .cg-nav__items span {
367
+ display: block;
368
+ border-radius: var(--cg-radius-sm);
369
+ }
370
+
371
+ @media (min-width: 56rem) {
372
+ .cg-nav--desktop {
373
+ display: flex;
374
+ }
375
+
376
+ .cg-nav-toggle {
377
+ display: none;
378
+ }
379
+ }
380
+
381
+ .cg-site-header__action {
382
+ flex-shrink: 0;
383
+ }
384
+
385
+ /* The manual light/dark/system control (`renderThemeToggle`, `@cogenta/
386
+ theme-kit`) — a plain icon button matching this theme's own pill-shaped
387
+ mobile-menu button (`.cg-nav-toggle__button`) in size and treatment, so it
388
+ reads as this theme's own chrome rather than a borrowed control. */
389
+ .cg-theme-toggle {
390
+ display: inline-flex;
391
+ align-items: center;
392
+ justify-content: center;
393
+ flex-shrink: 0;
394
+ inline-size: 2.75rem;
395
+ block-size: 2.75rem;
396
+ border-radius: var(--cg-radius-pill);
397
+ border: 0;
398
+ background: var(--cg-surface-sunken);
399
+ color: var(--cg-ink);
400
+ cursor: pointer;
401
+ transition: background-color var(--cg-duration) var(--cg-ease);
402
+ }
403
+
404
+ .cg-theme-toggle:hover {
405
+ background: var(--cg-accent-soft);
406
+ color: var(--cg-accent-soft-fg);
407
+ }
408
+
409
+ .cg-theme-toggle__icon {
410
+ inline-size: 1.2rem;
411
+ block-size: 1.2rem;
412
+ }
413
+
414
+ .cg-theme-toggle__icon--moon {
415
+ display: none;
416
+ }
417
+
418
+ /* Icon reflects the *current* effective appearance — sun while light, moon
419
+ while dark — from the same `[data-theme]`/`prefers-color-scheme` signals
420
+ `tokens.css` already keys the whole palette on. */
421
+ @media (prefers-color-scheme: dark) {
422
+ :where(:root:not([data-theme="light"])) .cg-theme-toggle__icon--sun {
423
+ display: none;
424
+ }
425
+ :where(:root:not([data-theme="light"])) .cg-theme-toggle__icon--moon {
426
+ display: block;
427
+ }
428
+ }
429
+
430
+ :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--sun {
431
+ display: none;
432
+ }
433
+
434
+ :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--moon {
435
+ display: block;
436
+ }
437
+
438
+ /* --------------------------------------------------------------------------
439
+ Chrome — footer, four columns on a warm tinted band
440
+ -------------------------------------------------------------------------- */
441
+
442
+ .cg-site-footer {
443
+ padding: var(--cg-s16) var(--cg-gutter) var(--cg-s8);
444
+ background: var(--cg-surface-sunken);
445
+ color: var(--cg-ink-muted);
446
+ border-block-start: 1px solid var(--cg-line-soft);
447
+ font-size: var(--cg-text-sm);
448
+ }
449
+
450
+ .cg-site-footer__grid {
451
+ display: grid;
452
+ gap: var(--cg-gap-loose);
453
+ grid-template-columns: 1fr;
454
+ max-inline-size: var(--cg-page);
455
+ margin-inline: auto;
456
+ padding-block-end: var(--cg-s10);
457
+ border-block-end: 1px solid var(--cg-line-soft);
458
+ }
459
+
460
+ @media (min-width: 48rem) {
461
+ .cg-site-footer__grid {
462
+ grid-template-columns: 1.3fr 1fr 1fr 1fr;
463
+ align-items: start;
464
+ }
465
+ }
466
+
467
+ .cg-site-footer__brand-link {
468
+ color: var(--cg-ink);
469
+ font-family: var(--cg-font-display);
470
+ font-weight: var(--cg-weight-bold);
471
+ font-size: var(--cg-text-lg);
472
+ text-decoration: none;
473
+ }
474
+
475
+ .cg-site-footer__tagline {
476
+ margin: var(--cg-s2) 0 0;
477
+ }
478
+
479
+ .cg-site-footer__col {
480
+ min-inline-size: 0;
481
+ }
482
+
483
+ .cg-nav__items.cg-site-footer__nav .cg-nav__items,
484
+ .cg-site-footer__nav .cg-nav__items {
485
+ flex-direction: column;
486
+ align-items: flex-start;
487
+ gap: var(--cg-s3);
488
+ font-weight: var(--cg-weight-regular);
489
+ }
490
+
491
+ .cg-site-footer__nav .cg-nav__items a {
492
+ padding: 0;
493
+ border-radius: 0;
494
+ }
495
+
496
+ .cg-site-footer__social {
497
+ display: flex;
498
+ gap: var(--cg-s3);
499
+ margin: 0;
500
+ padding: 0;
501
+ list-style: none;
502
+ }
503
+
504
+ .cg-site-footer__social-item a {
505
+ display: flex;
506
+ align-items: center;
507
+ justify-content: center;
508
+ inline-size: 2.25rem;
509
+ block-size: 2.25rem;
510
+ border-radius: var(--cg-radius-pill);
511
+ background: var(--cg-surface-raised);
512
+ color: var(--cg-ink-muted);
513
+ box-shadow: var(--cg-ring);
514
+ }
515
+
516
+ .cg-site-footer__social-item a:hover {
517
+ color: var(--cg-accent);
518
+ }
519
+
520
+ .cg-social__icon {
521
+ inline-size: 1.1rem;
522
+ block-size: 1.1rem;
523
+ }
524
+
525
+ .cg-site-footer__note {
526
+ margin: 0;
527
+ }
528
+
529
+ .cg-site-footer__bottom {
530
+ display: flex;
531
+ flex-wrap: wrap;
532
+ align-items: center;
533
+ gap: var(--cg-s3);
534
+ max-inline-size: var(--cg-page);
535
+ margin-inline: auto;
536
+ padding-block-start: var(--cg-s6);
537
+ font-size: var(--cg-text-xs);
538
+ letter-spacing: var(--cg-tracking-wide);
539
+ text-transform: uppercase;
540
+ color: var(--cg-ink-subtle);
541
+ }
542
+
543
+ /* --------------------------------------------------------------------------
544
+ Actions — big, friendly, rounded buttons
545
+ -------------------------------------------------------------------------- */
546
+
547
+ .cg-actions {
548
+ display: flex;
549
+ flex-wrap: wrap;
550
+ gap: var(--cg-s3);
551
+ margin: var(--cg-s8) 0 0;
552
+ padding: 0;
553
+ list-style: none;
554
+ }
555
+
556
+ .cg-action {
557
+ display: inline-flex;
558
+ align-items: center;
559
+ justify-content: center;
560
+ gap: var(--cg-s2);
561
+ padding: var(--cg-s3) var(--cg-s6);
562
+ border: 0;
563
+ border-radius: var(--cg-radius-pill);
564
+ font-size: var(--cg-text-sm);
565
+ font-weight: var(--cg-weight-bold);
566
+ letter-spacing: var(--cg-tracking-snug);
567
+ line-height: var(--cg-leading-snug);
568
+ text-decoration: none;
569
+ white-space: nowrap;
570
+ transition:
571
+ background-color var(--cg-duration) var(--cg-ease),
572
+ color var(--cg-duration) var(--cg-ease),
573
+ box-shadow var(--cg-duration) var(--cg-ease),
574
+ transform var(--cg-duration-fast) var(--cg-ease);
575
+ }
576
+
577
+ .cg-action[data-emphasis="primary"] {
578
+ background: var(--cg-accent);
579
+ color: var(--cg-accent-fg);
580
+ box-shadow: var(--cogenta-shadow-sm);
581
+ }
582
+
583
+ .cg-action[data-emphasis="primary"]:hover {
584
+ background: var(--cg-accent-hover);
585
+ box-shadow: var(--cogenta-shadow-md);
586
+ transform: translateY(-1px);
587
+ }
588
+
589
+ .cg-action[data-emphasis="secondary"] {
590
+ background: var(--cg-surface-raised);
591
+ color: var(--cg-ink);
592
+ box-shadow: var(--cg-ring-strong);
593
+ }
594
+
595
+ .cg-action[data-emphasis="secondary"]:hover {
596
+ color: var(--cg-accent);
597
+ box-shadow: var(--cg-ring-accent);
598
+ }
599
+
600
+ .cg-action:active {
601
+ transform: translateY(0);
602
+ box-shadow: none;
603
+ }
604
+
605
+ /* The eyebrow pill (hero's "cause" tag). */
606
+ .cg-pill {
607
+ display: inline-flex;
608
+ align-items: center;
609
+ padding: var(--cg-s1) var(--cg-s4);
610
+ border-radius: var(--cg-radius-pill);
611
+ background: var(--cg-accent-soft);
612
+ color: var(--cg-accent-soft-fg);
613
+ font-size: var(--cg-text-xs);
614
+ font-weight: var(--cg-weight-bold);
615
+ letter-spacing: var(--cg-tracking-wide);
616
+ text-transform: uppercase;
617
+ }
618
+
619
+ /* --------------------------------------------------------------------------
620
+ Shared block furniture
621
+ -------------------------------------------------------------------------- */
622
+
623
+ .cg-features__title,
624
+ .cg-cta__title,
625
+ .cg-faq__title,
626
+ .cg-impact__title,
627
+ .cg-logos__title,
628
+ .cg-list__title-heading,
629
+ .cg-pricing__title,
630
+ .cg-accordion__title,
631
+ .cg-stat-counters__title {
632
+ margin: 0 0 var(--cg-s10);
633
+ font-size: var(--cg-text-2xl);
634
+ line-height: var(--cg-leading-snug);
635
+ letter-spacing: var(--cg-tracking-tight);
636
+ text-wrap: balance;
637
+ }
638
+
639
+ .cg-features__items,
640
+ .cg-logos__items,
641
+ .cg-gallery__items,
642
+ .cg-list__items,
643
+ .cg-faq__items,
644
+ .cg-accordion__items,
645
+ .cg-pricing__tiers {
646
+ margin: 0;
647
+ padding: 0;
648
+ list-style: none;
649
+ }
650
+
651
+ .cg-gallery__viewport,
652
+ .cg-list__viewport {
653
+ overflow-x: auto;
654
+ scroll-snap-type: x mandatory;
655
+ scroll-behavior: smooth;
656
+ overscroll-behavior-inline: contain;
657
+ scrollbar-width: thin;
658
+ scrollbar-color: var(--cg-line-strong) transparent;
659
+ padding-block: var(--cg-s2);
660
+ margin-block: calc(var(--cg-s2) * -1);
661
+ }
662
+
663
+ /* --------------------------------------------------------------------------
664
+ Search, forms, comments — public utility pages and post-content furniture.
665
+ -------------------------------------------------------------------------- */
666
+
667
+ .cg-search__form,
668
+ .cg-search__results,
669
+ .cg-search__empty,
670
+ .cg-search__error,
671
+ .cg-form,
672
+ .cg-form__confirmation,
673
+ .cg-comments {
674
+ max-inline-size: var(--cg-page);
675
+ margin-inline: auto;
676
+ padding-inline: var(--cg-gutter);
677
+ }
678
+
679
+ .cg-search__form {
680
+ display: flex;
681
+ flex-wrap: wrap;
682
+ align-items: end;
683
+ gap: var(--cg-s3);
684
+ margin-block-end: var(--cg-s8);
685
+ }
686
+
687
+ .cg-search__form label {
688
+ display: block;
689
+ font-size: var(--cg-text-sm);
690
+ font-weight: var(--cg-weight-semibold);
691
+ margin-block-end: var(--cg-s2);
692
+ }
693
+
694
+ .cg-search__form input[type="search"] {
695
+ flex: 1 1 16rem;
696
+ }
697
+
698
+ .cg-search__results {
699
+ margin: 0 auto;
700
+ padding-inline-start: var(--cg-gutter);
701
+ display: grid;
702
+ gap: var(--cg-s4);
703
+ font-size: var(--cg-text-lg);
704
+ }
705
+
706
+ .cg-search__empty,
707
+ .cg-comments__empty,
708
+ .cg-comments__closed {
709
+ color: var(--cg-ink-muted);
710
+ }
711
+
712
+ .cg-search__error,
713
+ .cg-form__error,
714
+ .cg-form__field-error {
715
+ color: var(--cg-ink);
716
+ font-weight: var(--cg-weight-bold);
717
+ }
718
+
719
+ .cg-search__form input,
720
+ .cg-form__field input,
721
+ .cg-form__field select,
722
+ .cg-form__field textarea,
723
+ .cg-comment__form input,
724
+ .cg-comment__form textarea {
725
+ inline-size: 100%;
726
+ padding: var(--cg-s3) var(--cg-s4);
727
+ border: 1px solid var(--cg-line);
728
+ border-radius: var(--cg-radius-sm);
729
+ background: var(--cg-surface);
730
+ color: var(--cg-ink);
731
+ font: inherit;
732
+ }
733
+
734
+ .cg-form__field input[aria-invalid="true"],
735
+ .cg-form__field select[aria-invalid="true"],
736
+ .cg-form__field textarea[aria-invalid="true"] {
737
+ border-width: 2px;
738
+ border-color: var(--cg-line-strong);
739
+ }
740
+
741
+ .cg-search__form button,
742
+ .cg-form button[type="submit"],
743
+ .cg-comment__form button[type="submit"] {
744
+ padding: var(--cg-s3) var(--cg-s6);
745
+ border: 0;
746
+ border-radius: var(--cg-radius-pill);
747
+ background: var(--cg-accent);
748
+ color: var(--cg-accent-fg);
749
+ font-weight: var(--cg-weight-bold);
750
+ cursor: pointer;
751
+ transition: background-color var(--cg-duration) var(--cg-ease);
752
+ }
753
+
754
+ .cg-search__form button:hover,
755
+ .cg-form button[type="submit"]:hover,
756
+ .cg-comment__form button[type="submit"]:hover {
757
+ background: var(--cg-accent-hover);
758
+ }
759
+
760
+ .cg-form__field,
761
+ .cg-comment__form p {
762
+ display: block;
763
+ margin-block-end: var(--cg-s5);
764
+ }
765
+
766
+ .cg-form__field label,
767
+ .cg-comment__form label {
768
+ display: block;
769
+ font-size: var(--cg-text-sm);
770
+ font-weight: var(--cg-weight-semibold);
771
+ margin-block-end: var(--cg-s2);
772
+ }
773
+
774
+ .cg-form__help {
775
+ margin: var(--cg-s2) 0 0;
776
+ font-size: var(--cg-text-sm);
777
+ color: var(--cg-ink-muted);
778
+ }
779
+
780
+ .cg-form__choice {
781
+ display: inline-flex;
782
+ align-items: center;
783
+ gap: var(--cg-s2);
784
+ margin-inline-end: var(--cg-s4);
785
+ font-weight: normal;
786
+ }
787
+
788
+ .cg-form__honeypot,
789
+ .cg-comment__honeypot {
790
+ position: absolute;
791
+ inline-size: 1px;
792
+ block-size: 1px;
793
+ overflow: hidden;
794
+ inset-inline-start: -9999px;
795
+ }
796
+
797
+ .cg-comments {
798
+ margin-block-start: var(--cg-section-y);
799
+ padding-block-start: var(--cg-s8);
800
+ padding-block-end: var(--cg-section-y);
801
+ border-block-start: 1px solid var(--cg-line-soft);
802
+ }
803
+
804
+ .cg-comments__list,
805
+ .cg-comment__replies {
806
+ margin: 0;
807
+ padding: 0;
808
+ list-style: none;
809
+ }
810
+
811
+ .cg-comment {
812
+ padding-block: var(--cg-s5);
813
+ border-block-end: 1px solid var(--cg-line-soft);
814
+ }
815
+
816
+ .cg-comment__replies {
817
+ padding-block-start: var(--cg-s5);
818
+ }
819
+
820
+ .cg-comment__replies .cg-comment {
821
+ padding-inline-start: var(--cg-s6);
822
+ border-inline-start: 2px solid var(--cg-line-soft);
823
+ border-block-end: 0;
824
+ }
825
+
826
+ .cg-comment__meta {
827
+ display: flex;
828
+ gap: var(--cg-s3);
829
+ align-items: baseline;
830
+ font-size: var(--cg-text-sm);
831
+ color: var(--cg-ink-muted);
832
+ margin-block-end: var(--cg-s2);
833
+ }
834
+
835
+ .cg-comment__author {
836
+ font-weight: var(--cg-weight-semibold);
837
+ color: var(--cg-ink);
838
+ }
839
+
840
+ .cg-comment__body {
841
+ margin: 0;
842
+ }