@cogenta/theme-canonical 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/src/index.d.ts +21 -0
  2. package/dist/src/index.d.ts.map +1 -0
  3. package/dist/src/index.js +21 -0
  4. package/dist/src/index.js.map +1 -0
  5. package/dist/src/render/actions.d.ts +17 -0
  6. package/dist/src/render/actions.d.ts.map +1 -0
  7. package/dist/src/render/actions.js +43 -0
  8. package/dist/src/render/actions.js.map +1 -0
  9. package/dist/src/render/blocks/collection-list.d.ts +16 -0
  10. package/dist/src/render/blocks/collection-list.d.ts.map +1 -0
  11. package/dist/src/render/blocks/collection-list.js +54 -0
  12. package/dist/src/render/blocks/collection-list.js.map +1 -0
  13. package/dist/src/render/blocks/cta.d.ts +5 -0
  14. package/dist/src/render/blocks/cta.d.ts.map +1 -0
  15. package/dist/src/render/blocks/cta.js +10 -0
  16. package/dist/src/render/blocks/cta.js.map +1 -0
  17. package/dist/src/render/blocks/embed.d.ts +5 -0
  18. package/dist/src/render/blocks/embed.d.ts.map +1 -0
  19. package/dist/src/render/blocks/embed.js +88 -0
  20. package/dist/src/render/blocks/embed.js.map +1 -0
  21. package/dist/src/render/blocks/faq.d.ts +5 -0
  22. package/dist/src/render/blocks/faq.d.ts.map +1 -0
  23. package/dist/src/render/blocks/faq.js +21 -0
  24. package/dist/src/render/blocks/faq.js.map +1 -0
  25. package/dist/src/render/blocks/feature-grid.d.ts +5 -0
  26. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -0
  27. package/dist/src/render/blocks/feature-grid.js +27 -0
  28. package/dist/src/render/blocks/feature-grid.js.map +1 -0
  29. package/dist/src/render/blocks/gallery.d.ts +15 -0
  30. package/dist/src/render/blocks/gallery.d.ts.map +1 -0
  31. package/dist/src/render/blocks/gallery.js +28 -0
  32. package/dist/src/render/blocks/gallery.js.map +1 -0
  33. package/dist/src/render/blocks/hero.d.ts +12 -0
  34. package/dist/src/render/blocks/hero.d.ts.map +1 -0
  35. package/dist/src/render/blocks/hero.js +25 -0
  36. package/dist/src/render/blocks/hero.js.map +1 -0
  37. package/dist/src/render/blocks/logos.d.ts +5 -0
  38. package/dist/src/render/blocks/logos.d.ts.map +1 -0
  39. package/dist/src/render/blocks/logos.js +25 -0
  40. package/dist/src/render/blocks/logos.js.map +1 -0
  41. package/dist/src/render/blocks/media-figure.d.ts +15 -0
  42. package/dist/src/render/blocks/media-figure.d.ts.map +1 -0
  43. package/dist/src/render/blocks/media-figure.js +30 -0
  44. package/dist/src/render/blocks/media-figure.js.map +1 -0
  45. package/dist/src/render/blocks/prose.d.ts +10 -0
  46. package/dist/src/render/blocks/prose.d.ts.map +1 -0
  47. package/dist/src/render/blocks/prose.js +11 -0
  48. package/dist/src/render/blocks/prose.js.map +1 -0
  49. package/dist/src/render/blocks/quote.d.ts +14 -0
  50. package/dist/src/render/blocks/quote.d.ts.map +1 -0
  51. package/dist/src/render/blocks/quote.js +25 -0
  52. package/dist/src/render/blocks/quote.js.map +1 -0
  53. package/dist/src/render/blocks/stats.d.ts +5 -0
  54. package/dist/src/render/blocks/stats.d.ts.map +1 -0
  55. package/dist/src/render/blocks/stats.js +23 -0
  56. package/dist/src/render/blocks/stats.js.map +1 -0
  57. package/dist/src/render/entry.d.ts +7 -0
  58. package/dist/src/render/entry.d.ts.map +1 -0
  59. package/dist/src/render/entry.js +35 -0
  60. package/dist/src/render/entry.js.map +1 -0
  61. package/dist/src/render/heading.d.ts +14 -0
  62. package/dist/src/render/heading.d.ts.map +1 -0
  63. package/dist/src/render/heading.js +34 -0
  64. package/dist/src/render/heading.js.map +1 -0
  65. package/dist/src/render/html.d.ts +44 -0
  66. package/dist/src/render/html.d.ts.map +1 -0
  67. package/dist/src/render/html.js +96 -0
  68. package/dist/src/render/html.js.map +1 -0
  69. package/dist/src/render/media.d.ts +32 -0
  70. package/dist/src/render/media.d.ts.map +1 -0
  71. package/dist/src/render/media.js +42 -0
  72. package/dist/src/render/media.js.map +1 -0
  73. package/dist/src/render/render-block.d.ts +26 -0
  74. package/dist/src/render/render-block.d.ts.map +1 -0
  75. package/dist/src/render/render-block.js +66 -0
  76. package/dist/src/render/render-block.js.map +1 -0
  77. package/dist/src/render/rich-text.d.ts +5 -0
  78. package/dist/src/render/rich-text.d.ts.map +1 -0
  79. package/dist/src/render/rich-text.js +105 -0
  80. package/dist/src/render/rich-text.js.map +1 -0
  81. package/dist/src/theme-contract.d.ts +165 -0
  82. package/dist/src/theme-contract.d.ts.map +1 -0
  83. package/dist/src/theme-contract.js +21 -0
  84. package/dist/src/theme-contract.js.map +1 -0
  85. package/dist/theme.config.d.ts +31 -0
  86. package/dist/theme.config.d.ts.map +1 -0
  87. package/dist/theme.config.js +42 -0
  88. package/dist/theme.config.js.map +1 -0
  89. package/package.json +57 -0
  90. package/src/blocks/CollectionList.astro +20 -0
  91. package/src/blocks/Cta.astro +11 -0
  92. package/src/blocks/Embed.astro +18 -0
  93. package/src/blocks/Faq.astro +16 -0
  94. package/src/blocks/FeatureGrid.astro +11 -0
  95. package/src/blocks/Gallery.astro +17 -0
  96. package/src/blocks/Hero.astro +25 -0
  97. package/src/blocks/Logos.astro +11 -0
  98. package/src/blocks/MediaFigure.astro +11 -0
  99. package/src/blocks/Prose.astro +11 -0
  100. package/src/blocks/Quote.astro +11 -0
  101. package/src/blocks/Stats.astro +11 -0
  102. package/src/components/BlockZone.astro +62 -0
  103. package/src/index.ts +20 -0
  104. package/src/layouts/Base.astro +63 -0
  105. package/src/render/actions.ts +57 -0
  106. package/src/render/blocks/collection-list.ts +98 -0
  107. package/src/render/blocks/cta.ts +17 -0
  108. package/src/render/blocks/embed.ts +111 -0
  109. package/src/render/blocks/faq.ts +42 -0
  110. package/src/render/blocks/feature-grid.ts +54 -0
  111. package/src/render/blocks/gallery.ts +49 -0
  112. package/src/render/blocks/hero.ts +42 -0
  113. package/src/render/blocks/logos.ts +45 -0
  114. package/src/render/blocks/media-figure.ts +42 -0
  115. package/src/render/blocks/prose.ts +17 -0
  116. package/src/render/blocks/quote.ts +39 -0
  117. package/src/render/blocks/stats.ts +41 -0
  118. package/src/render/entry.ts +40 -0
  119. package/src/render/heading.ts +44 -0
  120. package/src/render/html.ts +122 -0
  121. package/src/render/media.ts +62 -0
  122. package/src/render/render-block.ts +97 -0
  123. package/src/render/rich-text.ts +150 -0
  124. package/src/styles/theme.css +606 -0
  125. package/src/theme-contract.ts +159 -0
  126. package/tokens.json +36 -0
@@ -0,0 +1,606 @@
1
+ /*
2
+ * The canonical theme's stylesheet.
3
+ *
4
+ * Not one colour, font, radius, duration or shadow is written literally here:
5
+ * every value comes from a `--cogenta-<group>-<name>` custom property produced
6
+ * from the skin's tokens. That is what makes changing skin a rewrite of one
7
+ * generated file with no build (L3, "Skins et changement à chaud"). A single
8
+ * hard-coded hex in this file would be a colour no skin can change.
9
+ *
10
+ * The derived `--cg-*` properties below are *composed* from tokens — a spacing
11
+ * step is a multiple of `space.unit`, a type step is a power of `font.scale` —
12
+ * so they follow the skin instead of freezing a second scale beside it.
13
+ */
14
+
15
+ :where(:root) {
16
+ --cg-density: 1;
17
+
18
+ --cg-s1: calc(var(--cogenta-space-unit) * 1 * var(--cg-density));
19
+ --cg-s2: calc(var(--cogenta-space-unit) * 2 * var(--cg-density));
20
+ --cg-s3: calc(var(--cogenta-space-unit) * 3 * var(--cg-density));
21
+ --cg-s4: calc(var(--cogenta-space-unit) * 4 * var(--cg-density));
22
+ --cg-s6: calc(var(--cogenta-space-unit) * 6 * var(--cg-density));
23
+ --cg-s8: calc(var(--cogenta-space-unit) * 8 * var(--cg-density));
24
+ --cg-s12: calc(var(--cogenta-space-unit) * 12 * var(--cg-density));
25
+ --cg-s16: calc(var(--cogenta-space-unit) * 16 * var(--cg-density));
26
+
27
+ /* A monotone increasing scale, by construction: each step multiplies the one
28
+ below it by `font.scale`, which the skin validator already checks is > 1. */
29
+ --cg-text-sm: calc(var(--cogenta-font-baseSize) / var(--cogenta-font-scale));
30
+ --cg-text-base: var(--cogenta-font-baseSize);
31
+ --cg-text-md: calc(var(--cogenta-font-baseSize) * var(--cogenta-font-scale));
32
+ --cg-text-lg: calc(var(--cg-text-md) * var(--cogenta-font-scale));
33
+ --cg-text-xl: calc(var(--cg-text-lg) * var(--cogenta-font-scale));
34
+ --cg-text-2xl: calc(var(--cg-text-xl) * var(--cogenta-font-scale));
35
+
36
+ --cg-measure: 68ch;
37
+ --cg-page: 76rem;
38
+ }
39
+
40
+ /* `space.density` is a token the render layer stamps as an attribute, because
41
+ CSS cannot branch on the *value* of a custom property portably yet. The
42
+ default above stands until it does. */
43
+ :where([data-density="compact"]) {
44
+ --cg-density: 0.75;
45
+ }
46
+
47
+ :where([data-density="spacious"]) {
48
+ --cg-density: 1.35;
49
+ }
50
+
51
+ /* --------------------------------------------------------------------------
52
+ Document
53
+ -------------------------------------------------------------------------- */
54
+
55
+ *,
56
+ *::before,
57
+ *::after {
58
+ box-sizing: border-box;
59
+ }
60
+
61
+ body {
62
+ margin: 0;
63
+ background: var(--cogenta-color-bg);
64
+ color: var(--cogenta-color-fg);
65
+ font-family: var(--cogenta-font-sans);
66
+ font-size: var(--cg-text-base);
67
+ /* Unitless, so it scales with each element's own font size instead of being
68
+ inherited as a fixed pixel height — the classic cause of clipped text at
69
+ 200% zoom (WCAG 1.4.4). */
70
+ line-height: 1.6;
71
+ text-underline-offset: 0.15em;
72
+ }
73
+
74
+ img,
75
+ video,
76
+ iframe {
77
+ max-width: 100%;
78
+ height: auto;
79
+ }
80
+
81
+ img {
82
+ display: block;
83
+ object-fit: cover;
84
+ }
85
+
86
+ /* --------------------------------------------------------------------------
87
+ Focus, targets, motion — the three that decide whether AA holds
88
+ -------------------------------------------------------------------------- */
89
+
90
+ :where(a, button, summary, [tabindex]):focus-visible {
91
+ /* Two solid pixels against the page, offset so it never sits on the glyphs.
92
+ `outline`, not `box-shadow`: it survives forced-colors mode. */
93
+ outline: 2px solid var(--cogenta-color-accent);
94
+ outline-offset: 2px;
95
+ border-radius: var(--cogenta-radius-sm);
96
+ }
97
+
98
+ /* WCAG 2.2 asks 24×24 minimum (2.5.8); 44×44 is the comfortable target and
99
+ costs nothing here. Applied to the theme's own controls only — an inline link
100
+ inside a paragraph is exempt, and padding it would break the text flow. */
101
+ :where(.cg-action, .cg-faq__question, .cg-logo__link) {
102
+ min-block-size: 44px;
103
+ min-inline-size: 44px;
104
+ }
105
+
106
+ @media (prefers-reduced-motion: reduce) {
107
+ /* The `motion.reduced` token says the skin's motion may be removed. Nothing
108
+ in this theme conveys meaning through movement, so removing all of it is
109
+ safe — including the smooth scroll of the carousel, which is the one people
110
+ forget and which triggers vestibular symptoms. */
111
+ *,
112
+ *::before,
113
+ *::after {
114
+ animation-duration: 1ms !important;
115
+ animation-iteration-count: 1 !important;
116
+ transition-duration: 1ms !important;
117
+ scroll-behavior: auto !important;
118
+ }
119
+ }
120
+
121
+ .cg-skip-link {
122
+ position: absolute;
123
+ inset-inline-start: var(--cg-s2);
124
+ inset-block-start: calc(var(--cg-s2) * -8);
125
+ z-index: 10;
126
+ padding: var(--cg-s2) var(--cg-s4);
127
+ background: var(--cogenta-color-accent);
128
+ color: var(--cogenta-color-accentFg);
129
+ border-radius: var(--cogenta-radius-md);
130
+ /* Moved, never hidden: `display:none` would take it out of the tab order,
131
+ which is the whole point of a skip link (WCAG 2.4.1). */
132
+ transition: inset-block-start var(--cogenta-motion-duration) var(--cogenta-motion-easing);
133
+ }
134
+
135
+ .cg-skip-link:focus-visible {
136
+ inset-block-start: var(--cg-s2);
137
+ }
138
+
139
+ /* --------------------------------------------------------------------------
140
+ Layout
141
+ -------------------------------------------------------------------------- */
142
+
143
+ .cg-main {
144
+ display: flow-root;
145
+ }
146
+
147
+ .cg-block {
148
+ max-inline-size: var(--cg-page);
149
+ margin-inline: auto;
150
+ margin-block: var(--cg-s12);
151
+ padding-inline: var(--cg-s4);
152
+ }
153
+
154
+ .cg-page__title {
155
+ max-inline-size: var(--cg-page);
156
+ margin-inline: auto;
157
+ margin-block: var(--cg-s12) var(--cg-s6);
158
+ padding-inline: var(--cg-s4);
159
+ font-size: var(--cg-text-2xl);
160
+ line-height: 1.15;
161
+ }
162
+
163
+ .cg-site-header,
164
+ .cg-site-footer {
165
+ padding: var(--cg-s6) var(--cg-s4);
166
+ color: var(--cogenta-color-mutedFg);
167
+ background: var(--cogenta-color-muted);
168
+ }
169
+
170
+ .cg-site-header__inner,
171
+ .cg-site-footer__inner {
172
+ max-inline-size: var(--cg-page);
173
+ margin-inline: auto;
174
+ }
175
+
176
+ /* --------------------------------------------------------------------------
177
+ Actions
178
+ -------------------------------------------------------------------------- */
179
+
180
+ .cg-actions {
181
+ display: flex;
182
+ flex-wrap: wrap;
183
+ gap: var(--cg-s3);
184
+ margin: var(--cg-s6) 0 0;
185
+ padding: 0;
186
+ list-style: none;
187
+ }
188
+
189
+ .cg-action {
190
+ display: inline-flex;
191
+ align-items: center;
192
+ justify-content: center;
193
+ padding: var(--cg-s2) var(--cg-s6);
194
+ border: 1px solid var(--cogenta-color-accent);
195
+ border-radius: var(--cogenta-radius-md);
196
+ font-weight: 600;
197
+ text-decoration: none;
198
+ transition: opacity var(--cogenta-motion-duration) var(--cogenta-motion-easing);
199
+ }
200
+
201
+ .cg-action[data-emphasis="primary"] {
202
+ background: var(--cogenta-color-accent);
203
+ color: var(--cogenta-color-accentFg);
204
+ }
205
+
206
+ .cg-action[data-emphasis="secondary"] {
207
+ background: transparent;
208
+ color: var(--cogenta-color-accent);
209
+ }
210
+
211
+ .cg-action:hover {
212
+ opacity: 0.9;
213
+ }
214
+
215
+ /* --------------------------------------------------------------------------
216
+ Blocks
217
+ -------------------------------------------------------------------------- */
218
+
219
+ .cg-hero {
220
+ display: grid;
221
+ gap: var(--cg-s8);
222
+ align-items: center;
223
+ }
224
+
225
+ @media (min-width: 60rem) {
226
+ .cg-hero {
227
+ grid-template-columns: 1fr 1fr;
228
+ }
229
+ }
230
+
231
+ .cg-hero__eyebrow {
232
+ margin: 0 0 var(--cg-s2);
233
+ color: var(--cogenta-color-mutedFg);
234
+ font-size: var(--cg-text-sm);
235
+ letter-spacing: 0.08em;
236
+ text-transform: uppercase;
237
+ }
238
+
239
+ .cg-hero__title {
240
+ margin: 0;
241
+ font-size: var(--cg-text-2xl);
242
+ line-height: 1.1;
243
+ }
244
+
245
+ .cg-hero__subtitle {
246
+ margin: var(--cg-s4) 0 0;
247
+ max-inline-size: var(--cg-measure);
248
+ font-size: var(--cg-text-md);
249
+ color: var(--cogenta-color-mutedFg);
250
+ }
251
+
252
+ .cg-hero__media img {
253
+ inline-size: 100%;
254
+ border-radius: var(--cogenta-radius-lg);
255
+ box-shadow: var(--cogenta-shadow-md);
256
+ }
257
+
258
+ .cg-prose {
259
+ max-inline-size: var(--cg-measure);
260
+ margin-inline: auto;
261
+ }
262
+
263
+ .cg-prose h2 {
264
+ margin-block: var(--cg-s12) var(--cg-s3);
265
+ font-size: var(--cg-text-xl);
266
+ line-height: 1.2;
267
+ }
268
+
269
+ .cg-prose h3 {
270
+ margin-block: var(--cg-s8) var(--cg-s2);
271
+ font-size: var(--cg-text-lg);
272
+ }
273
+
274
+ .cg-prose h4 {
275
+ margin-block: var(--cg-s6) var(--cg-s2);
276
+ font-size: var(--cg-text-md);
277
+ }
278
+
279
+ .cg-prose p,
280
+ .cg-prose ul,
281
+ .cg-prose ol {
282
+ margin-block: var(--cg-s4);
283
+ }
284
+
285
+ .cg-prose blockquote {
286
+ margin-inline: 0;
287
+ padding-inline-start: var(--cg-s4);
288
+ border-inline-start: 3px solid var(--cogenta-color-accent);
289
+ color: var(--cogenta-color-mutedFg);
290
+ font-family: var(--cogenta-font-serif);
291
+ }
292
+
293
+ .cg-prose code {
294
+ font-family: var(--cogenta-font-mono);
295
+ font-size: var(--cg-text-sm);
296
+ background: var(--cogenta-color-muted);
297
+ border-radius: var(--cogenta-radius-sm);
298
+ padding: 0.1em 0.3em;
299
+ }
300
+
301
+ .cg-prose__figure {
302
+ margin-inline: 0;
303
+ }
304
+
305
+ .cg-figure {
306
+ margin-inline: auto;
307
+ }
308
+
309
+ .cg-figure[data-align="start"],
310
+ .cg-figure[data-align="end"] {
311
+ max-inline-size: calc(var(--cg-measure) / 2);
312
+ }
313
+
314
+ .cg-figure[data-align="start"] {
315
+ float: inline-start;
316
+ margin-inline-end: var(--cg-s6);
317
+ }
318
+
319
+ .cg-figure[data-align="end"] {
320
+ float: inline-end;
321
+ margin-inline-start: var(--cg-s6);
322
+ }
323
+
324
+ .cg-figure[data-align="full"] {
325
+ max-inline-size: none;
326
+ padding-inline: 0;
327
+ }
328
+
329
+ .cg-figure__media {
330
+ inline-size: 100%;
331
+ aspect-ratio: var(--cg-ratio, auto);
332
+ border-radius: var(--cogenta-radius-md);
333
+ }
334
+
335
+ .cg-figure__caption {
336
+ margin-block-start: var(--cg-s2);
337
+ color: var(--cogenta-color-mutedFg);
338
+ font-size: var(--cg-text-sm);
339
+ }
340
+
341
+ .cg-figure__credit::before {
342
+ content: " — ";
343
+ }
344
+
345
+ .cg-features__items,
346
+ .cg-logos__items,
347
+ .cg-gallery__items,
348
+ .cg-collection__items,
349
+ .cg-faq__items {
350
+ margin: 0;
351
+ padding: 0;
352
+ list-style: none;
353
+ }
354
+
355
+ .cg-features__items {
356
+ display: grid;
357
+ gap: var(--cg-s8);
358
+ grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
359
+ }
360
+
361
+ .cg-feature__title {
362
+ margin: var(--cg-s2) 0;
363
+ font-size: var(--cg-text-md);
364
+ }
365
+
366
+ .cg-feature__text {
367
+ margin: 0;
368
+ color: var(--cogenta-color-mutedFg);
369
+ }
370
+
371
+ .cg-cta {
372
+ padding-block: var(--cg-s12);
373
+ background: var(--cogenta-color-muted);
374
+ border-radius: var(--cogenta-radius-lg);
375
+ text-align: center;
376
+ }
377
+
378
+ .cg-cta__title {
379
+ margin: 0;
380
+ font-size: var(--cg-text-xl);
381
+ }
382
+
383
+ .cg-cta__text {
384
+ margin: var(--cg-s3) auto 0;
385
+ max-inline-size: var(--cg-measure);
386
+ color: var(--cogenta-color-mutedFg);
387
+ }
388
+
389
+ .cg-cta .cg-actions {
390
+ justify-content: center;
391
+ }
392
+
393
+ .cg-gallery__items {
394
+ display: grid;
395
+ gap: var(--cg-s3);
396
+ grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
397
+ }
398
+
399
+ .cg-gallery[data-layout="masonry"] .cg-gallery__items {
400
+ display: block;
401
+ columns: 3 14rem;
402
+ column-gap: var(--cg-s3);
403
+ }
404
+
405
+ .cg-gallery[data-layout="masonry"] .cg-gallery__item {
406
+ break-inside: avoid;
407
+ margin-block-end: var(--cg-s3);
408
+ }
409
+
410
+ /* The whole carousel: a scroll-snapping row. No script, no auto-advance, and
411
+ the container is focusable so it can be scrolled from the keyboard. */
412
+ .cg-gallery__viewport {
413
+ overflow-x: auto;
414
+ scroll-snap-type: x mandatory;
415
+ scroll-behavior: smooth;
416
+ overscroll-behavior-inline: contain;
417
+ }
418
+
419
+ .cg-gallery[data-layout="carousel"] .cg-gallery__items {
420
+ display: grid;
421
+ grid-auto-flow: column;
422
+ grid-auto-columns: minmax(16rem, 40%);
423
+ }
424
+
425
+ .cg-gallery[data-layout="carousel"] .cg-gallery__item {
426
+ scroll-snap-align: start;
427
+ }
428
+
429
+ .cg-gallery__item img,
430
+ .cg-collection img {
431
+ inline-size: 100%;
432
+ border-radius: var(--cogenta-radius-md);
433
+ }
434
+
435
+ .cg-quote {
436
+ max-inline-size: var(--cg-measure);
437
+ margin-inline: auto;
438
+ }
439
+
440
+ .cg-quote__text {
441
+ margin: 0;
442
+ font-family: var(--cogenta-font-serif);
443
+ font-size: var(--cg-text-lg);
444
+ line-height: 1.35;
445
+ }
446
+
447
+ .cg-quote__attribution {
448
+ display: flex;
449
+ align-items: center;
450
+ gap: var(--cg-s3);
451
+ margin-block-start: var(--cg-s4);
452
+ color: var(--cogenta-color-mutedFg);
453
+ font-size: var(--cg-text-sm);
454
+ }
455
+
456
+ .cg-quote__avatar {
457
+ inline-size: 3rem;
458
+ block-size: 3rem;
459
+ border-radius: 50%;
460
+ }
461
+
462
+ .cg-quote__author {
463
+ font-weight: 600;
464
+ color: var(--cogenta-color-fg);
465
+ }
466
+
467
+ .cg-faq__items {
468
+ border-block-start: 1px solid var(--cogenta-color-border);
469
+ }
470
+
471
+ .cg-faq__item {
472
+ border-block-end: 1px solid var(--cogenta-color-border);
473
+ }
474
+
475
+ .cg-faq__question {
476
+ display: flex;
477
+ align-items: center;
478
+ padding-block: var(--cg-s3);
479
+ font-weight: 600;
480
+ cursor: pointer;
481
+ }
482
+
483
+ .cg-faq__answer {
484
+ padding-block-end: var(--cg-s3);
485
+ color: var(--cogenta-color-mutedFg);
486
+ }
487
+
488
+ .cg-stats__items {
489
+ display: grid;
490
+ gap: var(--cg-s8);
491
+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
492
+ margin: 0;
493
+ }
494
+
495
+ /* Reading order is label then figure; the skin shows the figure first. The
496
+ markup is what a screen reader follows, so the two must not be conflated. */
497
+ .cg-stat {
498
+ display: flex;
499
+ flex-direction: column-reverse;
500
+ gap: var(--cg-s1);
501
+ }
502
+
503
+ .cg-stat__value {
504
+ margin: 0;
505
+ font-size: var(--cg-text-2xl);
506
+ line-height: 1.1;
507
+ font-variant-numeric: tabular-nums;
508
+ }
509
+
510
+ .cg-stat__unit {
511
+ font-size: var(--cg-text-md);
512
+ color: var(--cogenta-color-mutedFg);
513
+ }
514
+
515
+ .cg-stat__label {
516
+ color: var(--cogenta-color-mutedFg);
517
+ font-size: var(--cg-text-sm);
518
+ }
519
+
520
+ .cg-logos__items {
521
+ display: flex;
522
+ flex-wrap: wrap;
523
+ align-items: center;
524
+ gap: var(--cg-s8);
525
+ }
526
+
527
+ .cg-logo__image {
528
+ block-size: 2.5rem;
529
+ inline-size: auto;
530
+ object-fit: contain;
531
+ }
532
+
533
+ .cg-logo__link {
534
+ display: inline-flex;
535
+ align-items: center;
536
+ }
537
+
538
+ .cg-collection__items {
539
+ display: grid;
540
+ gap: var(--cg-s8);
541
+ }
542
+
543
+ .cg-collection[data-layout="grid"] .cg-collection__items {
544
+ grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
545
+ }
546
+
547
+ .cg-collection[data-layout="carousel"] .cg-collection__items {
548
+ grid-auto-flow: column;
549
+ grid-auto-columns: minmax(18rem, 45%);
550
+ }
551
+
552
+ .cg-collection__viewport {
553
+ overflow-x: auto;
554
+ scroll-snap-type: x mandatory;
555
+ scroll-behavior: smooth;
556
+ overscroll-behavior-inline: contain;
557
+ }
558
+
559
+ .cg-entry__title {
560
+ margin: 0 0 var(--cg-s1);
561
+ font-size: var(--cg-text-md);
562
+ }
563
+
564
+ .cg-entry__date,
565
+ .cg-entry__excerpt {
566
+ color: var(--cogenta-color-mutedFg);
567
+ font-size: var(--cg-text-sm);
568
+ }
569
+
570
+ .cg-embed {
571
+ aspect-ratio: var(--cg-ratio, 16 / 9);
572
+ max-inline-size: var(--cg-measure);
573
+ margin-inline: auto;
574
+ }
575
+
576
+ .cg-embed__frame {
577
+ inline-size: 100%;
578
+ block-size: 100%;
579
+ border: 0;
580
+ border-radius: var(--cogenta-radius-md);
581
+ }
582
+
583
+ /* The consent placeholder is a real card, not a grey box: it says what would be
584
+ loaded and offers a way out to the source. It requests nothing third-party. */
585
+ .cg-embed__placeholder {
586
+ display: flex;
587
+ flex-direction: column;
588
+ align-items: center;
589
+ justify-content: center;
590
+ gap: var(--cg-s3);
591
+ block-size: 100%;
592
+ padding: var(--cg-s6);
593
+ background: var(--cogenta-color-muted);
594
+ color: var(--cogenta-color-mutedFg);
595
+ border: 1px dashed var(--cogenta-color-border);
596
+ border-radius: var(--cogenta-radius-md);
597
+ text-align: center;
598
+ }
599
+
600
+ .cg-embed__notice {
601
+ margin: 0;
602
+ }
603
+
604
+ .cg-embed__link {
605
+ color: var(--cogenta-color-accent);
606
+ }