@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,1002 @@
1
+ /*
2
+ * The seventeen vocabulary blocks (`blocks@2.0`, RFC 0001) — this theme's
3
+ * own layouts.
4
+ *
5
+ * Nothing here declares a colour, a size, a radius or a duration of its
6
+ * own: a block composes the design system from `tokens.css` and nothing
7
+ * else, which is what keeps a skin swap a whole-theme change.
8
+ */
9
+
10
+ /* --- hero: the cause, warm and centred on mobile, two columns from md --- */
11
+
12
+ .cg-hero {
13
+ display: grid;
14
+ gap: var(--cg-s10);
15
+ margin-block-start: var(--cg-s10);
16
+ text-align: center;
17
+ }
18
+
19
+ .cg-hero__copy {
20
+ display: flex;
21
+ flex-direction: column;
22
+ align-items: center;
23
+ }
24
+
25
+ .cg-hero__title {
26
+ margin: var(--cg-s4) 0 0;
27
+ font-size: var(--cg-text-3xl);
28
+ line-height: var(--cg-leading-tight);
29
+ letter-spacing: var(--cg-tracking-tight);
30
+ text-wrap: balance;
31
+ }
32
+
33
+ .cg-hero__subtitle {
34
+ margin: var(--cg-s5) 0 0;
35
+ max-inline-size: var(--cg-measure-narrow);
36
+ font-size: var(--cg-text-lg);
37
+ line-height: var(--cg-leading-relaxed);
38
+ color: var(--cg-ink-muted);
39
+ text-wrap: pretty;
40
+ }
41
+
42
+ .cg-hero__frame {
43
+ position: relative;
44
+ justify-self: center;
45
+ inline-size: 100%;
46
+ max-inline-size: 34rem;
47
+ }
48
+
49
+ /* A flat accent "mat" behind the photo, like coloured card stock peeking
50
+ out from under a framed print — never a blurred glow. */
51
+ .cg-hero__halo {
52
+ position: absolute;
53
+ inset: -12%;
54
+ z-index: 0;
55
+ border-radius: var(--cg-radius-xl);
56
+ background: var(--cg-accent-soft);
57
+ }
58
+
59
+ .cg-hero__media {
60
+ position: relative;
61
+ z-index: 1;
62
+ inline-size: 100%;
63
+ border-radius: var(--cg-radius-xl);
64
+ box-shadow: var(--cogenta-shadow-md);
65
+ }
66
+
67
+ @media (min-width: 60rem) {
68
+ .cg-hero {
69
+ grid-template-columns: 1fr 1fr;
70
+ align-items: center;
71
+ text-align: start;
72
+ gap: var(--cg-s16);
73
+ }
74
+
75
+ .cg-hero__copy {
76
+ align-items: flex-start;
77
+ }
78
+
79
+ .cg-hero__title {
80
+ font-size: calc(var(--cg-text-3xl) * 1.15);
81
+ }
82
+ }
83
+
84
+ /* --- prose ------------------------------------------------------------- */
85
+
86
+ .cg-prose {
87
+ max-inline-size: var(--cg-measure);
88
+ margin-inline: auto;
89
+ line-height: var(--cg-leading-relaxed);
90
+ }
91
+
92
+ .cg-prose > :first-child {
93
+ margin-block-start: 0;
94
+ }
95
+
96
+ .cg-prose > :last-child {
97
+ margin-block-end: 0;
98
+ }
99
+
100
+ .cg-prose h2,
101
+ .cg-prose h3,
102
+ .cg-prose h4 {
103
+ letter-spacing: var(--cg-tracking-snug);
104
+ line-height: var(--cg-leading-snug);
105
+ text-wrap: balance;
106
+ }
107
+
108
+ .cg-prose h2 {
109
+ margin-block: var(--cg-s12) var(--cg-s4);
110
+ font-size: var(--cg-text-xl);
111
+ }
112
+
113
+ .cg-prose h3 {
114
+ margin-block: var(--cg-s10) var(--cg-s3);
115
+ font-size: var(--cg-text-lg);
116
+ }
117
+
118
+ .cg-prose h4 {
119
+ margin-block: var(--cg-s8) var(--cg-s2);
120
+ font-size: var(--cg-text-md);
121
+ }
122
+
123
+ .cg-prose p {
124
+ margin-block: var(--cg-s5);
125
+ text-wrap: pretty;
126
+ }
127
+
128
+ .cg-prose ul,
129
+ .cg-prose ol {
130
+ margin-block: var(--cg-s5);
131
+ padding-inline-start: var(--cg-s6);
132
+ }
133
+
134
+ .cg-prose li {
135
+ margin-block: var(--cg-s2);
136
+ }
137
+
138
+ .cg-prose li::marker {
139
+ color: var(--cg-accent);
140
+ font-weight: var(--cg-weight-bold);
141
+ }
142
+
143
+ .cg-prose strong {
144
+ font-weight: var(--cg-weight-semibold);
145
+ color: var(--cg-ink);
146
+ }
147
+
148
+ .cg-prose blockquote {
149
+ margin-block: var(--cg-s8);
150
+ margin-inline: 0;
151
+ padding: var(--cg-s5) var(--cg-s6);
152
+ border-radius: var(--cg-radius-md);
153
+ background: var(--cg-surface-sunken);
154
+ color: var(--cg-ink-muted);
155
+ font-family: var(--cg-font-display);
156
+ font-size: var(--cg-text-lg);
157
+ font-style: italic;
158
+ }
159
+
160
+ .cg-prose blockquote > :first-child {
161
+ margin-block-start: 0;
162
+ }
163
+
164
+ .cg-prose blockquote > :last-child {
165
+ margin-block-end: 0;
166
+ }
167
+
168
+ .cg-prose code {
169
+ font-family: var(--cogenta-font-mono);
170
+ font-size: 0.875em;
171
+ background: var(--cg-surface-sunken);
172
+ border-radius: var(--cg-radius-xs);
173
+ padding: 0.15em 0.4em;
174
+ }
175
+
176
+ .cg-prose__figure {
177
+ margin-block: var(--cg-s8);
178
+ margin-inline: 0;
179
+ }
180
+
181
+ .cg-prose__figure img {
182
+ inline-size: 100%;
183
+ border-radius: var(--cg-radius-md);
184
+ box-shadow: var(--cogenta-shadow-sm);
185
+ }
186
+
187
+ .cg-prose__figure figcaption {
188
+ margin-block-start: var(--cg-s3);
189
+ color: var(--cg-ink-subtle);
190
+ font-size: var(--cg-text-sm);
191
+ }
192
+
193
+ /* --- mediaFigure --------------------------------------------------------- */
194
+
195
+ .cg-figure {
196
+ margin-inline: auto;
197
+ }
198
+
199
+ .cg-figure[data-align="start"],
200
+ .cg-figure[data-align="end"] {
201
+ max-inline-size: calc(var(--cg-measure) / 2);
202
+ }
203
+
204
+ .cg-figure[data-align="start"] {
205
+ float: inline-start;
206
+ margin-inline-end: var(--cg-s6);
207
+ }
208
+
209
+ .cg-figure[data-align="end"] {
210
+ float: inline-end;
211
+ margin-inline-start: var(--cg-s6);
212
+ }
213
+
214
+ .cg-figure[data-align="full"] {
215
+ max-inline-size: none;
216
+ padding-inline: 0;
217
+ }
218
+
219
+ .cg-figure__media {
220
+ inline-size: 100%;
221
+ aspect-ratio: var(--cg-ratio, auto);
222
+ border-radius: var(--cg-radius-xl);
223
+ box-shadow: var(--cogenta-shadow-md);
224
+ }
225
+
226
+ .cg-figure[data-align="full"] .cg-figure__media {
227
+ border-radius: 0;
228
+ box-shadow: none;
229
+ }
230
+
231
+ .cg-figure__caption {
232
+ margin-block-start: var(--cg-s4);
233
+ color: var(--cg-ink-subtle);
234
+ font-size: var(--cg-text-sm);
235
+ text-wrap: pretty;
236
+ }
237
+
238
+ .cg-figure[data-align="full"] .cg-figure__caption {
239
+ max-inline-size: var(--cg-measure);
240
+ margin-inline: auto;
241
+ padding-inline: var(--cg-gutter);
242
+ }
243
+
244
+ .cg-figure__credit {
245
+ color: var(--cg-ink-subtle);
246
+ }
247
+
248
+ .cg-figure__credit::before {
249
+ content: " — ";
250
+ }
251
+
252
+ /* --- featureGrid → "What we do": three rounded programme cards --------- */
253
+
254
+ .cg-features__items {
255
+ display: grid;
256
+ gap: var(--cg-s6);
257
+ grid-template-columns: 1fr;
258
+ }
259
+
260
+ @media (min-width: 42rem) {
261
+ .cg-features__items {
262
+ grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
263
+ }
264
+ }
265
+
266
+ .cg-feature {
267
+ padding: var(--cg-s8) var(--cg-s6);
268
+ background: var(--cg-surface-raised);
269
+ border-radius: var(--cg-radius-lg);
270
+ box-shadow: var(--cogenta-shadow-sm);
271
+ transition:
272
+ box-shadow var(--cg-duration) var(--cg-ease),
273
+ transform var(--cg-duration) var(--cg-ease);
274
+ }
275
+
276
+ .cg-feature:hover {
277
+ box-shadow: var(--cogenta-shadow-md);
278
+ transform: translateY(-2px);
279
+ }
280
+
281
+ .cg-feature__icon {
282
+ display: flex;
283
+ align-items: center;
284
+ justify-content: center;
285
+ inline-size: var(--cg-s10);
286
+ block-size: var(--cg-s10);
287
+ margin-block-end: var(--cg-s5);
288
+ background: var(--cg-accent-soft);
289
+ color: var(--cg-accent-soft-fg);
290
+ border-radius: var(--cg-radius-pill);
291
+ }
292
+
293
+ .cg-feature__icon svg {
294
+ inline-size: 1.4rem;
295
+ block-size: 1.4rem;
296
+ }
297
+
298
+ .cg-feature__title {
299
+ margin: 0 0 var(--cg-s2);
300
+ font-size: var(--cg-text-lg);
301
+ line-height: var(--cg-leading-snug);
302
+ }
303
+
304
+ .cg-feature__link {
305
+ color: inherit;
306
+ text-decoration: none;
307
+ }
308
+
309
+ .cg-feature:hover .cg-feature__link {
310
+ color: var(--cg-accent);
311
+ }
312
+
313
+ .cg-feature__text {
314
+ margin: 0;
315
+ color: var(--cg-ink-muted);
316
+ line-height: var(--cg-leading-relaxed);
317
+ text-wrap: pretty;
318
+ }
319
+
320
+ /* --- cta → the "every gift counts" donate band -------------------------- */
321
+
322
+ .cg-cta {
323
+ padding-block: var(--cg-s16);
324
+ border-radius: var(--cg-radius-xl);
325
+ background: var(--cg-accent);
326
+ color: var(--cg-accent-fg);
327
+ text-align: center;
328
+ }
329
+
330
+ .cg-cta__inner {
331
+ max-inline-size: var(--cg-measure-narrow);
332
+ margin-inline: auto;
333
+ padding-inline: var(--cg-gutter);
334
+ }
335
+
336
+ .cg-cta__title {
337
+ margin: 0;
338
+ font-size: var(--cg-text-2xl);
339
+ line-height: var(--cg-leading-tight);
340
+ text-wrap: balance;
341
+ }
342
+
343
+ .cg-cta__text {
344
+ margin: var(--cg-s4) 0 0;
345
+ opacity: 0.92;
346
+ text-wrap: pretty;
347
+ }
348
+
349
+ .cg-cta .cg-actions {
350
+ justify-content: center;
351
+ margin-block-start: var(--cg-s8);
352
+ }
353
+
354
+ .cg-cta .cg-action[data-emphasis="primary"] {
355
+ background: var(--cg-accent-fg);
356
+ color: var(--cg-accent);
357
+ }
358
+
359
+ .cg-cta .cg-action[data-emphasis="secondary"] {
360
+ background: transparent;
361
+ color: var(--cg-accent-fg);
362
+ box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--cg-accent-fg) 60%, transparent);
363
+ }
364
+
365
+ /* --- gallery: a warm contact sheet --------------------------------------- */
366
+
367
+ .cg-gallery__items {
368
+ display: grid;
369
+ gap: var(--cg-s4);
370
+ grid-template-columns: repeat(2, 1fr);
371
+ }
372
+
373
+ @media (min-width: 42rem) {
374
+ .cg-gallery__items {
375
+ grid-template-columns: repeat(3, 1fr);
376
+ }
377
+ }
378
+
379
+ .cg-gallery[data-layout="carousel"] .cg-gallery__items {
380
+ display: flex;
381
+ grid-template-columns: none;
382
+ }
383
+
384
+ .cg-gallery__item {
385
+ aspect-ratio: 4 / 3;
386
+ overflow: hidden;
387
+ border-radius: var(--cg-radius-md);
388
+ box-shadow: var(--cogenta-shadow-sm);
389
+ scroll-snap-align: start;
390
+ }
391
+
392
+ .cg-gallery[data-layout="carousel"] .cg-gallery__item {
393
+ flex: 0 0 15rem;
394
+ }
395
+
396
+ .cg-gallery__item img {
397
+ inline-size: 100%;
398
+ block-size: 100%;
399
+ object-fit: cover;
400
+ }
401
+
402
+ /* --- quote --------------------------------------------------------------- */
403
+
404
+ .cg-quote {
405
+ margin-inline: auto;
406
+ max-inline-size: var(--cg-measure);
407
+ padding: var(--cg-s10) var(--cg-s8);
408
+ background: var(--cg-surface-sunken);
409
+ border-radius: var(--cg-radius-lg);
410
+ }
411
+
412
+ .cg-quote__text p {
413
+ margin: 0;
414
+ font-family: var(--cg-font-display);
415
+ font-size: var(--cg-text-xl);
416
+ line-height: var(--cg-leading-snug);
417
+ text-wrap: balance;
418
+ }
419
+
420
+ .cg-quote__attribution {
421
+ display: flex;
422
+ align-items: center;
423
+ gap: var(--cg-s3);
424
+ margin-block-start: var(--cg-s5);
425
+ color: var(--cg-ink-muted);
426
+ font-size: var(--cg-text-sm);
427
+ }
428
+
429
+ .cg-quote__avatar {
430
+ inline-size: 2.5rem;
431
+ block-size: 2.5rem;
432
+ border-radius: var(--cg-radius-pill);
433
+ object-fit: cover;
434
+ }
435
+
436
+ .cg-quote__author {
437
+ font-weight: var(--cg-weight-semibold);
438
+ color: var(--cg-ink);
439
+ }
440
+
441
+ .cg-quote__author::after {
442
+ content: "";
443
+ }
444
+
445
+ .cg-quote__role::before {
446
+ content: " · ";
447
+ }
448
+
449
+ /* --- faq: rounded disclosure cards --------------------------------------- */
450
+
451
+ .cg-faq__item {
452
+ margin-block-end: var(--cg-s3);
453
+ }
454
+
455
+ .cg-faq__details {
456
+ border-radius: var(--cg-radius-md);
457
+ background: var(--cg-surface-raised);
458
+ box-shadow: var(--cg-ring);
459
+ overflow: hidden;
460
+ }
461
+
462
+ .cg-faq__question {
463
+ display: flex;
464
+ align-items: center;
465
+ justify-content: space-between;
466
+ gap: var(--cg-s4);
467
+ padding: var(--cg-s5) var(--cg-s6);
468
+ font-weight: var(--cg-weight-semibold);
469
+ cursor: pointer;
470
+ list-style: none;
471
+ }
472
+
473
+ .cg-faq__question::-webkit-details-marker {
474
+ display: none;
475
+ }
476
+
477
+ .cg-faq__question::after {
478
+ content: "+";
479
+ flex-shrink: 0;
480
+ color: var(--cg-accent);
481
+ font-size: var(--cg-text-lg);
482
+ transition: transform var(--cg-duration) var(--cg-ease);
483
+ }
484
+
485
+ .cg-faq__details[open] .cg-faq__question::after {
486
+ transform: rotate(45deg);
487
+ }
488
+
489
+ .cg-faq__answer {
490
+ padding: 0 var(--cg-s6) var(--cg-s6);
491
+ color: var(--cg-ink-muted);
492
+ line-height: var(--cg-leading-relaxed);
493
+ }
494
+
495
+ .cg-faq__answer p {
496
+ margin: 0;
497
+ }
498
+
499
+ /* --- stats → the impact band --------------------------------------------- */
500
+
501
+ .cg-impact__items {
502
+ display: grid;
503
+ gap: var(--cg-s8);
504
+ /* `auto-fit`, not a fixed column count: this block is also reused, with
505
+ only two items, for an event's own "When / Where" panel — a fixed
506
+ `repeat(4, 1fr)` at desktop widths left two ghost columns of empty
507
+ space beside those two items (seen live on an event's own page).
508
+ `auto-fit` collapses the tracks nothing was placed in, so two items
509
+ stretch to fill the row exactly as four items already did. */
510
+ grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
511
+ margin: 0;
512
+ padding: var(--cg-s10) var(--cg-s6);
513
+ background: var(--cg-surface-sunken);
514
+ border-radius: var(--cg-radius-xl);
515
+ text-align: center;
516
+ }
517
+
518
+ .cg-impact-stat {
519
+ display: flex;
520
+ flex-direction: column-reverse;
521
+ gap: var(--cg-s2);
522
+ }
523
+
524
+ .cg-impact-stat__value {
525
+ display: flex;
526
+ align-items: baseline;
527
+ justify-content: center;
528
+ gap: var(--cg-s1);
529
+ margin: 0;
530
+ color: var(--cg-tint);
531
+ font-family: var(--cg-font-display);
532
+ font-size: var(--cg-text-3xl);
533
+ font-weight: var(--cg-weight-bold);
534
+ line-height: var(--cg-leading-tight);
535
+ font-variant-numeric: tabular-nums;
536
+ }
537
+
538
+ .cg-impact-stat__unit {
539
+ font-size: var(--cg-text-md);
540
+ font-weight: var(--cg-weight-semibold);
541
+ color: var(--cg-ink-muted);
542
+ }
543
+
544
+ .cg-impact-stat__label {
545
+ color: var(--cg-ink-muted);
546
+ font-size: var(--cg-text-sm);
547
+ font-weight: var(--cg-weight-medium);
548
+ text-wrap: balance;
549
+ }
550
+
551
+ /* --- logos ---------------------------------------------------------------- */
552
+
553
+ .cg-logos__items {
554
+ display: flex;
555
+ flex-wrap: wrap;
556
+ align-items: center;
557
+ gap: var(--cg-s10);
558
+ }
559
+
560
+ .cg-logo {
561
+ opacity: 0.75;
562
+ transition: opacity var(--cg-duration) var(--cg-ease);
563
+ }
564
+
565
+ .cg-logo:hover {
566
+ opacity: 1;
567
+ }
568
+
569
+ .cg-logo__image {
570
+ block-size: 2rem;
571
+ inline-size: auto;
572
+ max-inline-size: 9rem;
573
+ object-fit: contain;
574
+ }
575
+
576
+ /* --- collectionList → "Upcoming events" dated cards ----------------------- */
577
+
578
+ .cg-list__title-heading {
579
+ margin-block-end: var(--cg-s8);
580
+ }
581
+
582
+ .cg-event-cards {
583
+ display: grid;
584
+ gap: var(--cg-s5);
585
+ grid-template-columns: 1fr;
586
+ }
587
+
588
+ @media (min-width: 46rem) {
589
+ .cg-event-cards {
590
+ grid-template-columns: repeat(2, 1fr);
591
+ }
592
+ }
593
+
594
+ .cg-list[data-layout="grid"] .cg-event-cards {
595
+ /* Never more than three across: the card below stacks its cover over a
596
+ date + text row, and a fourth column squeezed that row to a few
597
+ characters per line (seen live at 1280px, every word broken in two). */
598
+ grid-template-columns: repeat(auto-fit, minmax(min(18rem, 100%), 1fr));
599
+ }
600
+
601
+ @media (min-width: 64rem) {
602
+ .cg-list[data-layout="grid"] .cg-event-cards {
603
+ grid-template-columns: repeat(3, 1fr);
604
+ }
605
+ }
606
+
607
+ .cg-list[data-layout="carousel"] .cg-event-cards {
608
+ display: flex;
609
+ grid-template-columns: none;
610
+ }
611
+
612
+ /* A stacked card: the cover on top, then a row with the date block beside
613
+ the text. A single horizontal row (date | cover | text) only works on a
614
+ wide list; in a grid column it starved the text of width. */
615
+ .cg-event-card {
616
+ display: grid;
617
+ grid-template-columns: auto minmax(0, 1fr);
618
+ grid-template-areas:
619
+ "cover cover"
620
+ "date body";
621
+ gap: var(--cg-s4) var(--cg-s4);
622
+ padding: var(--cg-s5);
623
+ background: var(--cg-surface-raised);
624
+ border-radius: var(--cg-radius-lg);
625
+ box-shadow: var(--cogenta-shadow-sm);
626
+ transition:
627
+ box-shadow var(--cg-duration) var(--cg-ease),
628
+ transform var(--cg-duration) var(--cg-ease);
629
+ }
630
+
631
+ .cg-list[data-layout="carousel"] .cg-event-card {
632
+ flex: 0 0 18rem;
633
+ scroll-snap-align: start;
634
+ }
635
+
636
+ .cg-event-card:hover {
637
+ box-shadow: var(--cogenta-shadow-md);
638
+ transform: translateY(-2px);
639
+ }
640
+
641
+ .cg-event-card__date {
642
+ grid-area: date;
643
+ display: flex;
644
+ flex-direction: column;
645
+ align-items: center;
646
+ justify-content: center;
647
+ align-self: start;
648
+ inline-size: 4.5rem;
649
+ block-size: 4.5rem;
650
+ border-radius: var(--cg-radius-md);
651
+ background: var(--cg-accent-soft);
652
+ color: var(--cg-accent-soft-fg);
653
+ }
654
+
655
+ .cg-event-card__day {
656
+ font-family: var(--cg-font-display);
657
+ font-size: var(--cg-text-xl);
658
+ font-weight: var(--cg-weight-bold);
659
+ line-height: 1;
660
+ }
661
+
662
+ .cg-event-card__month {
663
+ font-size: var(--cg-text-xs);
664
+ font-weight: var(--cg-weight-bold);
665
+ letter-spacing: var(--cg-tracking-wide);
666
+ text-transform: uppercase;
667
+ }
668
+
669
+ .cg-event-card__time {
670
+ font-size: var(--cg-text-xs);
671
+ opacity: 0.85;
672
+ }
673
+
674
+ .cg-event-card__cover {
675
+ grid-area: cover;
676
+ aspect-ratio: 16 / 9;
677
+ overflow: hidden;
678
+ border-radius: var(--cg-radius-md);
679
+ }
680
+
681
+ .cg-event-card__cover img {
682
+ inline-size: 100%;
683
+ block-size: 100%;
684
+ object-fit: cover;
685
+ }
686
+
687
+ .cg-event-card__body {
688
+ grid-area: body;
689
+ min-inline-size: 0;
690
+ overflow-wrap: break-word;
691
+ hyphens: auto;
692
+ }
693
+
694
+ .cg-event-card__location {
695
+ margin: 0 0 var(--cg-s1);
696
+ color: var(--cg-ink-subtle);
697
+ font-size: var(--cg-text-xs);
698
+ font-weight: var(--cg-weight-semibold);
699
+ letter-spacing: var(--cg-tracking-wide);
700
+ text-transform: uppercase;
701
+ }
702
+
703
+ .cg-event-card__title {
704
+ margin: 0;
705
+ font-size: var(--cg-text-md);
706
+ line-height: var(--cg-leading-snug);
707
+ }
708
+
709
+ .cg-event-card__link {
710
+ color: var(--cg-ink);
711
+ text-decoration: none;
712
+ }
713
+
714
+ .cg-event-card__link:hover {
715
+ color: var(--cg-accent);
716
+ }
717
+
718
+ .cg-event-card__excerpt {
719
+ margin: var(--cg-s1) 0 0;
720
+ color: var(--cg-ink-muted);
721
+ font-size: var(--cg-text-sm);
722
+ line-height: var(--cg-leading-normal);
723
+ }
724
+
725
+ .cg-list__empty {
726
+ padding: var(--cg-s8);
727
+ color: var(--cg-ink-muted);
728
+ text-align: center;
729
+ background: var(--cg-surface-sunken);
730
+ border-radius: var(--cg-radius-md);
731
+ }
732
+
733
+ /* --- embed ----------------------------------------------------------------- */
734
+
735
+ .cg-embed {
736
+ aspect-ratio: var(--cg-ratio, 16 / 9);
737
+ border-radius: var(--cg-radius-lg);
738
+ overflow: hidden;
739
+ background: var(--cg-surface-sunken);
740
+ }
741
+
742
+ .cg-embed__frame {
743
+ inline-size: 100%;
744
+ block-size: 100%;
745
+ border: 0;
746
+ }
747
+
748
+ .cg-embed__placeholder {
749
+ display: flex;
750
+ flex-direction: column;
751
+ align-items: center;
752
+ justify-content: center;
753
+ gap: var(--cg-s4);
754
+ inline-size: 100%;
755
+ block-size: 100%;
756
+ padding: var(--cg-s6);
757
+ text-align: center;
758
+ }
759
+
760
+ .cg-embed__notice {
761
+ margin: 0;
762
+ color: var(--cg-ink-muted);
763
+ max-inline-size: var(--cg-measure-narrow);
764
+ }
765
+
766
+ .cg-embed__link {
767
+ padding: var(--cg-s2) var(--cg-s5);
768
+ border-radius: var(--cg-radius-pill);
769
+ background: var(--cg-accent);
770
+ color: var(--cg-accent-fg);
771
+ text-decoration: none;
772
+ font-weight: var(--cg-weight-semibold);
773
+ }
774
+
775
+ /* --- testimonial: a volunteer's own words --------------------------------- */
776
+
777
+ .cg-testimonial {
778
+ max-inline-size: var(--cg-measure);
779
+ margin-inline: auto;
780
+ padding: var(--cg-s10) var(--cg-s8);
781
+ background: var(--cg-surface-sunken);
782
+ border-radius: var(--cg-radius-lg);
783
+ text-align: center;
784
+ }
785
+
786
+ .cg-testimonial__quote blockquote {
787
+ margin: 0;
788
+ }
789
+
790
+ .cg-testimonial__quote p {
791
+ margin: 0;
792
+ font-family: var(--cg-font-display);
793
+ font-size: var(--cg-text-xl);
794
+ line-height: var(--cg-leading-snug);
795
+ text-wrap: balance;
796
+ }
797
+
798
+ .cg-testimonial__attribution {
799
+ display: flex;
800
+ flex-direction: column;
801
+ align-items: center;
802
+ gap: var(--cg-s3);
803
+ margin-block-start: var(--cg-s6);
804
+ }
805
+
806
+ .cg-testimonial__avatar {
807
+ inline-size: 3.5rem;
808
+ block-size: 3.5rem;
809
+ border-radius: var(--cg-radius-pill);
810
+ object-fit: cover;
811
+ }
812
+
813
+ .cg-testimonial__who {
814
+ display: flex;
815
+ flex-direction: column;
816
+ font-size: var(--cg-text-sm);
817
+ color: var(--cg-ink-muted);
818
+ }
819
+
820
+ .cg-testimonial__name {
821
+ font-weight: var(--cg-weight-bold);
822
+ color: var(--cg-ink);
823
+ }
824
+
825
+ /* --- pricingTable ------------------------------------------------------ */
826
+
827
+ .cg-pricing__tiers {
828
+ display: grid;
829
+ gap: var(--cg-s6);
830
+ grid-template-columns: 1fr;
831
+ }
832
+
833
+ @media (min-width: 46rem) {
834
+ .cg-pricing__tiers {
835
+ grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
836
+ }
837
+ }
838
+
839
+ .cg-pricing__tier {
840
+ padding: var(--cg-s8) var(--cg-s6);
841
+ background: var(--cg-surface-raised);
842
+ border-radius: var(--cg-radius-lg);
843
+ box-shadow: var(--cogenta-shadow-sm);
844
+ }
845
+
846
+ .cg-pricing__tier[data-highlighted="true"] {
847
+ background: var(--cg-accent);
848
+ color: var(--cg-accent-fg);
849
+ box-shadow: var(--cogenta-shadow-md);
850
+ }
851
+
852
+ .cg-pricing__name {
853
+ margin: 0 0 var(--cg-s3);
854
+ font-size: var(--cg-text-lg);
855
+ }
856
+
857
+ .cg-pricing__price {
858
+ display: flex;
859
+ align-items: baseline;
860
+ gap: var(--cg-s1);
861
+ margin: 0 0 var(--cg-s5);
862
+ }
863
+
864
+ .cg-pricing__amount {
865
+ font-family: var(--cg-font-display);
866
+ font-size: var(--cg-text-2xl);
867
+ font-weight: var(--cg-weight-bold);
868
+ }
869
+
870
+ .cg-pricing__interval {
871
+ opacity: 0.8;
872
+ font-size: var(--cg-text-sm);
873
+ }
874
+
875
+ .cg-pricing__features {
876
+ margin: 0 0 var(--cg-s6);
877
+ padding: 0;
878
+ list-style: none;
879
+ display: flex;
880
+ flex-direction: column;
881
+ gap: var(--cg-s2);
882
+ font-size: var(--cg-text-sm);
883
+ }
884
+
885
+ .cg-pricing__features li::before {
886
+ content: "✓ ";
887
+ color: var(--cg-tint);
888
+ font-weight: var(--cg-weight-bold);
889
+ }
890
+
891
+ .cg-pricing__tier[data-highlighted="true"] .cg-pricing__features li::before {
892
+ color: var(--cg-accent-fg);
893
+ }
894
+
895
+ .cg-pricing__action .cg-action {
896
+ inline-size: 100%;
897
+ }
898
+
899
+ /* --- accordion ------------------------------------------------------------ */
900
+
901
+ .cg-accordion__item {
902
+ margin-block-end: var(--cg-s3);
903
+ }
904
+
905
+ .cg-accordion__details {
906
+ border-radius: var(--cg-radius-md);
907
+ background: var(--cg-surface-raised);
908
+ box-shadow: var(--cg-ring);
909
+ overflow: hidden;
910
+ }
911
+
912
+ .cg-accordion__question {
913
+ display: flex;
914
+ align-items: center;
915
+ justify-content: space-between;
916
+ padding: var(--cg-s5) var(--cg-s6);
917
+ font-weight: var(--cg-weight-semibold);
918
+ cursor: pointer;
919
+ list-style: none;
920
+ }
921
+
922
+ .cg-accordion__question::-webkit-details-marker {
923
+ display: none;
924
+ }
925
+
926
+ .cg-accordion__question::after {
927
+ content: "+";
928
+ color: var(--cg-accent);
929
+ font-size: var(--cg-text-lg);
930
+ transition: transform var(--cg-duration) var(--cg-ease);
931
+ }
932
+
933
+ .cg-accordion__details[open] .cg-accordion__question::after {
934
+ transform: rotate(45deg);
935
+ }
936
+
937
+ .cg-accordion__answer {
938
+ padding: 0 var(--cg-s6) var(--cg-s6);
939
+ color: var(--cg-ink-muted);
940
+ line-height: var(--cg-leading-relaxed);
941
+ }
942
+
943
+ .cg-accordion__answer p {
944
+ margin: 0;
945
+ }
946
+
947
+ /* --- statCounter ------------------------------------------------------ */
948
+
949
+ .cg-stat-counters__items {
950
+ display: grid;
951
+ gap: var(--cg-s6);
952
+ grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
953
+ text-align: center;
954
+ }
955
+
956
+ .cg-stat-counter {
957
+ display: flex;
958
+ flex-direction: column-reverse;
959
+ gap: var(--cg-s1);
960
+ }
961
+
962
+ .cg-stat-counter__value {
963
+ margin: 0;
964
+ color: var(--cg-tint);
965
+ font-family: var(--cg-font-display);
966
+ font-size: var(--cg-text-2xl);
967
+ font-weight: var(--cg-weight-bold);
968
+ font-variant-numeric: tabular-nums;
969
+ }
970
+
971
+ .cg-stat-counter__label {
972
+ color: var(--cg-ink-muted);
973
+ font-size: var(--cg-text-sm);
974
+ }
975
+
976
+ /* --- logoStrip → "Our partners" ---------------------------------------- */
977
+
978
+ .cg-logo-band {
979
+ text-align: center;
980
+ }
981
+
982
+ .cg-logo-band__items {
983
+ display: flex;
984
+ flex-wrap: wrap;
985
+ align-items: center;
986
+ justify-content: center;
987
+ gap: var(--cg-s10);
988
+ }
989
+
990
+ .cg-logo-band__image {
991
+ block-size: 1.75rem;
992
+ inline-size: auto;
993
+ max-inline-size: 8rem;
994
+ object-fit: contain;
995
+ opacity: 0.7;
996
+ }
997
+
998
+ .cg-logo-band__caption {
999
+ margin-block-start: var(--cg-s6);
1000
+ color: var(--cg-ink-subtle);
1001
+ font-size: var(--cg-text-sm);
1002
+ }