@cogenta/theme-entreprise 1.1.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 +16 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +16 -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 +24 -0
  9. package/dist/src/render/blocks/accordion.js.map +1 -0
  10. package/dist/src/render/blocks/collection-list.d.ts +14 -0
  11. package/dist/src/render/blocks/collection-list.d.ts.map +1 -0
  12. package/dist/src/render/blocks/collection-list.js +55 -0
  13. package/dist/src/render/blocks/collection-list.js.map +1 -0
  14. package/dist/src/render/blocks/cta.d.ts +12 -0
  15. package/dist/src/render/blocks/cta.d.ts.map +1 -0
  16. package/dist/src/render/blocks/cta.js +19 -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 +92 -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 +25 -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 +33 -0
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -0
  30. package/dist/src/render/blocks/gallery.d.ts +15 -0
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -0
  32. package/dist/src/render/blocks/gallery.js +28 -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 +21 -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 +30 -0
  45. package/dist/src/render/blocks/logos.js.map +1 -0
  46. package/dist/src/render/blocks/media-figure.d.ts +13 -0
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -0
  48. package/dist/src/render/blocks/media-figure.js +28 -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 +33 -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 +18 -0
  59. package/dist/src/render/blocks/quote.d.ts.map +1 -0
  60. package/dist/src/render/blocks/quote.js +31 -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 +23 -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 +23 -0
  69. package/dist/src/render/blocks/stats.js.map +1 -0
  70. package/dist/src/render/blocks/testimonial.d.ts +16 -0
  71. package/dist/src/render/blocks/testimonial.d.ts.map +1 -0
  72. package/dist/src/render/blocks/testimonial.js +25 -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 +101 -0
  77. package/dist/src/render/chrome.js.map +1 -0
  78. package/dist/src/render/render-block.d.ts +24 -0
  79. package/dist/src/render/render-block.d.ts.map +1 -0
  80. package/dist/src/render/render-block.js +108 -0
  81. package/dist/src/render/render-block.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +12 -0
  83. package/dist/src/render/term-archive.d.ts.map +1 -0
  84. package/dist/src/render/term-archive.js +34 -0
  85. package/dist/src/render/term-archive.js.map +1 -0
  86. package/dist/theme.config.d.ts +16 -0
  87. package/dist/theme.config.d.ts.map +1 -0
  88. package/dist/theme.config.js +46 -0
  89. package/dist/theme.config.js.map +1 -0
  90. package/package.json +57 -0
  91. package/src/index.ts +15 -0
  92. package/src/render/blocks/accordion.ts +60 -0
  93. package/src/render/blocks/collection-list.ts +122 -0
  94. package/src/render/blocks/cta.ts +48 -0
  95. package/src/render/blocks/embed.ts +115 -0
  96. package/src/render/blocks/faq.ts +61 -0
  97. package/src/render/blocks/feature-grid.ts +73 -0
  98. package/src/render/blocks/gallery.ts +48 -0
  99. package/src/render/blocks/hero.ts +60 -0
  100. package/src/render/blocks/logo-strip.ts +36 -0
  101. package/src/render/blocks/logos.ts +60 -0
  102. package/src/render/blocks/media-figure.ts +43 -0
  103. package/src/render/blocks/pricing-table.ts +77 -0
  104. package/src/render/blocks/prose.ts +11 -0
  105. package/src/render/blocks/quote.ts +48 -0
  106. package/src/render/blocks/stat-counter.ts +45 -0
  107. package/src/render/blocks/stats.ts +50 -0
  108. package/src/render/blocks/testimonial.ts +41 -0
  109. package/src/render/chrome.ts +128 -0
  110. package/src/render/render-block.ts +144 -0
  111. package/src/render/term-archive.ts +80 -0
  112. package/src/styles/archive.css +68 -0
  113. package/src/styles/base.css +895 -0
  114. package/src/styles/blocks.css +1433 -0
  115. package/src/styles/theme.css +36 -0
  116. package/src/styles/tokens.css +326 -0
  117. package/tokens.json +36 -0
@@ -0,0 +1,1433 @@
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 ------------------------------------------------------------- */
11
+
12
+ /* A single column below the breakpoint — `auto 1fr` (the desktop two-column
13
+ shape, introduced at `60rem` below) squeezed `.cg-hero__frame` to nothing
14
+ on a narrow screen: the intro's own max-content width claimed the whole
15
+ `auto` track, leaving the media frame with no room at all. Found by
16
+ looking at a real 360px screenshot, not by reading the rule. */
17
+ .cg-hero {
18
+ display: grid;
19
+ grid-template-columns: 1fr;
20
+ gap: var(--cg-s6);
21
+ margin-block-start: var(--cg-s12);
22
+ }
23
+
24
+ .cg-hero__mark {
25
+ display: none;
26
+ }
27
+
28
+ @media (min-width: 60rem) {
29
+ .cg-hero {
30
+ grid-template-columns: 1.1fr 0.9fr;
31
+ align-items: center;
32
+ gap: var(--cg-s20);
33
+ }
34
+
35
+ /* A single vertical accent rule beside the copy, standing in for the
36
+ decorative wash a marketing hero would use — a report cover's spine,
37
+ not a gradient. */
38
+ .cg-hero__mark {
39
+ display: block;
40
+ grid-row: 1;
41
+ inline-size: 3px;
42
+ block-size: 100%;
43
+ min-block-size: var(--cg-s20);
44
+ background: var(--cg-accent);
45
+ justify-self: start;
46
+ }
47
+
48
+ .cg-hero__intro {
49
+ grid-column: 1;
50
+ display: grid;
51
+ grid-template-columns: var(--cg-s6) 1fr;
52
+ gap: var(--cg-s10);
53
+ }
54
+
55
+ .cg-hero__frame {
56
+ grid-column: 2;
57
+ grid-row: 1;
58
+ }
59
+ }
60
+
61
+ .cg-hero__eyebrow {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ gap: var(--cg-s2);
65
+ margin: 0 0 var(--cg-s5);
66
+ padding: var(--cg-s1) var(--cg-s3);
67
+ border: 1px solid var(--cg-line-strong);
68
+ border-radius: var(--cg-radius-pill);
69
+ color: var(--cg-ink-muted);
70
+ font-size: var(--cg-text-xs);
71
+ font-weight: var(--cg-weight-semibold);
72
+ letter-spacing: var(--cg-tracking-wide);
73
+ text-transform: uppercase;
74
+ }
75
+
76
+ .cg-hero__title {
77
+ margin: 0;
78
+ font-size: var(--cg-text-3xl);
79
+ line-height: var(--cg-leading-tight);
80
+ letter-spacing: var(--cg-tracking-tight);
81
+ font-weight: var(--cg-weight-bold);
82
+ text-wrap: balance;
83
+ }
84
+
85
+ @media (min-width: 60rem) {
86
+ .cg-hero__title {
87
+ font-size: calc(var(--cg-text-3xl) * 1.2);
88
+ }
89
+ }
90
+
91
+ .cg-hero__subtitle {
92
+ margin: var(--cg-s5) 0 0;
93
+ max-inline-size: var(--cg-measure-narrow);
94
+ font-size: var(--cg-text-lg);
95
+ line-height: var(--cg-leading-relaxed);
96
+ color: var(--cg-ink-muted);
97
+ text-wrap: pretty;
98
+ }
99
+
100
+ .cg-hero__frame {
101
+ padding: var(--cg-s2);
102
+ border: 1px solid var(--cg-line);
103
+ border-radius: var(--cg-radius-lg);
104
+ background: var(--cg-surface-sunken);
105
+ /* A flat frame, one soft shadow for lift — never a gradient wash behind
106
+ the media. */
107
+ box-shadow: var(--cogenta-shadow-md);
108
+ }
109
+
110
+ .cg-hero__media {
111
+ inline-size: 100%;
112
+ border-radius: var(--cg-radius-md);
113
+ }
114
+
115
+ /* --- entry header (`renderEntryHeader`, `@cogenta/theme-kit`) ------------- */
116
+
117
+ /* Drawn for a `service` (or any routed entry) that has no `hero` of its
118
+ own — the eyebrow/title/excerpt/meta/cover furniture `theme@1.4` hands
119
+ every theme, in this theme's own structured register: a taxonomy eyebrow
120
+ in the same uppercase mono-caps language `hero`'s own eyebrow uses, a
121
+ bold display title, and a hairline-divided meta row rather than a
122
+ floating byline. */
123
+ .cg-entry-header {
124
+ max-inline-size: var(--cg-page);
125
+ margin-inline: auto;
126
+ margin-block: var(--cg-section-y) var(--cg-s10);
127
+ padding-inline: var(--cg-gutter);
128
+ }
129
+
130
+ .cg-entry-header__terms {
131
+ display: flex;
132
+ flex-wrap: wrap;
133
+ gap: var(--cg-s3);
134
+ margin: 0 0 var(--cg-s4);
135
+ padding: 0;
136
+ list-style: none;
137
+ font-size: var(--cg-text-xs);
138
+ font-weight: var(--cg-weight-semibold);
139
+ letter-spacing: var(--cg-tracking-wide);
140
+ text-transform: uppercase;
141
+ }
142
+
143
+ .cg-entry-header__terms a {
144
+ color: var(--cg-accent);
145
+ text-decoration: none;
146
+ }
147
+
148
+ .cg-entry-header__terms a:hover {
149
+ text-decoration: underline;
150
+ }
151
+
152
+ .cg-entry-header__title {
153
+ margin: 0;
154
+ font-size: var(--cg-text-3xl);
155
+ line-height: var(--cg-leading-tight);
156
+ letter-spacing: var(--cg-tracking-tight);
157
+ font-weight: var(--cg-weight-bold);
158
+ text-wrap: balance;
159
+ }
160
+
161
+ .cg-entry-header__excerpt {
162
+ margin: var(--cg-s5) 0 0;
163
+ max-inline-size: var(--cg-measure-narrow);
164
+ font-size: var(--cg-text-lg);
165
+ line-height: var(--cg-leading-relaxed);
166
+ color: var(--cg-ink-muted);
167
+ text-wrap: pretty;
168
+ }
169
+
170
+ .cg-entry-header__meta {
171
+ display: flex;
172
+ flex-wrap: wrap;
173
+ align-items: center;
174
+ gap: var(--cg-s4);
175
+ margin: var(--cg-s6) 0 0;
176
+ padding-block-start: var(--cg-s4);
177
+ border-block-start: 1px solid var(--cg-line-soft);
178
+ font-size: var(--cg-text-sm);
179
+ color: var(--cg-ink-muted);
180
+ }
181
+
182
+ .cg-entry-header__author {
183
+ font-weight: var(--cg-weight-semibold);
184
+ color: var(--cg-ink);
185
+ }
186
+
187
+ .cg-entry-header__reading-time::before {
188
+ content: "·";
189
+ margin-inline-end: var(--cg-s4);
190
+ color: var(--cg-ink-subtle);
191
+ }
192
+
193
+ .cg-entry-header__cover {
194
+ margin: var(--cg-s8) 0 0;
195
+ overflow: hidden;
196
+ border: 1px solid var(--cg-line);
197
+ border-radius: var(--cg-radius-md);
198
+ }
199
+
200
+ .cg-entry-header__cover img,
201
+ .cg-entry-header__cover video {
202
+ inline-size: 100%;
203
+ aspect-ratio: 16 / 9;
204
+ }
205
+
206
+ /* --- prose --------------------------------------------------------------- */
207
+
208
+ .cg-prose {
209
+ max-inline-size: var(--cg-measure);
210
+ margin-inline: auto;
211
+ line-height: var(--cg-leading-relaxed);
212
+ }
213
+
214
+ .cg-prose > :first-child {
215
+ margin-block-start: 0;
216
+ }
217
+
218
+ .cg-prose > :last-child {
219
+ margin-block-end: 0;
220
+ }
221
+
222
+ .cg-prose h2,
223
+ .cg-prose h3,
224
+ .cg-prose h4 {
225
+ letter-spacing: var(--cg-tracking-snug);
226
+ line-height: var(--cg-leading-snug);
227
+ font-weight: var(--cg-weight-bold);
228
+ text-wrap: balance;
229
+ }
230
+
231
+ .cg-prose h2 {
232
+ margin-block: var(--cg-s12) var(--cg-s4);
233
+ padding-block-start: var(--cg-s6);
234
+ border-block-start: 1px solid var(--cg-line-soft);
235
+ font-size: var(--cg-text-xl);
236
+ letter-spacing: var(--cg-tracking-tight);
237
+ }
238
+
239
+ .cg-prose h3 {
240
+ margin-block: var(--cg-s10) var(--cg-s3);
241
+ font-size: var(--cg-text-lg);
242
+ }
243
+
244
+ .cg-prose h4 {
245
+ margin-block: var(--cg-s8) var(--cg-s2);
246
+ font-size: var(--cg-text-md);
247
+ }
248
+
249
+ .cg-prose p {
250
+ margin-block: var(--cg-s5);
251
+ text-wrap: pretty;
252
+ }
253
+
254
+ .cg-prose ul,
255
+ .cg-prose ol {
256
+ margin-block: var(--cg-s5);
257
+ padding-inline-start: var(--cg-s6);
258
+ }
259
+
260
+ .cg-prose li {
261
+ margin-block: var(--cg-s2);
262
+ padding-inline-start: var(--cg-s1);
263
+ }
264
+
265
+ .cg-prose li::marker {
266
+ color: var(--cg-accent);
267
+ font-weight: var(--cg-weight-bold);
268
+ }
269
+
270
+ .cg-prose strong {
271
+ font-weight: var(--cg-weight-semibold);
272
+ color: var(--cg-ink);
273
+ }
274
+
275
+ .cg-prose blockquote {
276
+ margin-block: var(--cg-s8);
277
+ margin-inline: 0;
278
+ padding: var(--cg-s5) var(--cg-s6);
279
+ border-inline-start: 3px solid var(--cg-accent);
280
+ background: var(--cg-surface-sunken);
281
+ color: var(--cg-ink-muted);
282
+ font-family: var(--cogenta-font-serif);
283
+ font-size: var(--cg-text-lg);
284
+ line-height: var(--cg-leading-normal);
285
+ font-style: italic;
286
+ }
287
+
288
+ .cg-prose blockquote > :first-child {
289
+ margin-block-start: 0;
290
+ }
291
+
292
+ .cg-prose blockquote > :last-child {
293
+ margin-block-end: 0;
294
+ }
295
+
296
+ .cg-prose code {
297
+ font-family: var(--cogenta-font-mono);
298
+ font-size: 0.875em;
299
+ background: var(--cg-surface-sunken);
300
+ border-radius: var(--cg-radius-xs);
301
+ box-shadow: var(--cg-ring);
302
+ padding: 0.15em 0.4em;
303
+ }
304
+
305
+ .cg-prose__figure {
306
+ margin-block: var(--cg-s8);
307
+ margin-inline: 0;
308
+ }
309
+
310
+ .cg-prose__figure img {
311
+ inline-size: 100%;
312
+ border-radius: var(--cg-radius-md);
313
+ box-shadow: var(--cg-ring);
314
+ }
315
+
316
+ .cg-prose__figure figcaption {
317
+ margin-block-start: var(--cg-s3);
318
+ color: var(--cg-ink-subtle);
319
+ font-size: var(--cg-text-sm);
320
+ line-height: var(--cg-leading-normal);
321
+ }
322
+
323
+ /* --- mediaFigure ----------------------------------------------------- */
324
+
325
+ .cg-figure {
326
+ margin-inline: auto;
327
+ }
328
+
329
+ .cg-figure[data-align="start"],
330
+ .cg-figure[data-align="end"] {
331
+ max-inline-size: calc(var(--cg-measure) / 2);
332
+ }
333
+
334
+ .cg-figure[data-align="start"] {
335
+ float: inline-start;
336
+ margin-inline-end: var(--cg-s6);
337
+ }
338
+
339
+ .cg-figure[data-align="end"] {
340
+ float: inline-end;
341
+ margin-inline-start: var(--cg-s6);
342
+ }
343
+
344
+ .cg-figure[data-align="full"] {
345
+ max-inline-size: none;
346
+ padding-inline: 0;
347
+ }
348
+
349
+ /* A frame plate rather than a floating rounded image: a thin border sits
350
+ just outside the picture, the same "bordered plate" language `hero` and
351
+ `embed` use. */
352
+ .cg-figure__frame {
353
+ padding: var(--cg-s2);
354
+ border: 1px solid var(--cg-line);
355
+ border-radius: var(--cg-radius-md);
356
+ background: var(--cg-surface);
357
+ }
358
+
359
+ .cg-figure[data-align="full"] .cg-figure__frame {
360
+ padding: 0;
361
+ border: 0;
362
+ border-radius: 0;
363
+ }
364
+
365
+ .cg-figure__media {
366
+ inline-size: 100%;
367
+ aspect-ratio: var(--cg-ratio, auto);
368
+ border-radius: var(--cg-radius-sm);
369
+ }
370
+
371
+ .cg-figure[data-align="full"] .cg-figure__media {
372
+ border-radius: 0;
373
+ }
374
+
375
+ .cg-figure__caption {
376
+ margin-block-start: var(--cg-s4);
377
+ color: var(--cg-ink-subtle);
378
+ font-size: var(--cg-text-sm);
379
+ line-height: var(--cg-leading-normal);
380
+ text-wrap: pretty;
381
+ }
382
+
383
+ .cg-figure[data-align="full"] .cg-figure__caption {
384
+ max-inline-size: var(--cg-measure);
385
+ margin-inline: auto;
386
+ padding-inline: var(--cg-gutter);
387
+ }
388
+
389
+ .cg-figure__credit {
390
+ color: var(--cg-ink-subtle);
391
+ }
392
+
393
+ .cg-figure__credit::before {
394
+ content: " — ";
395
+ }
396
+
397
+ /* --- featureGrid → "our services" ------------------------------------ */
398
+
399
+ .cg-services__items {
400
+ display: grid;
401
+ gap: var(--cg-gap);
402
+ grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
403
+ margin: 0;
404
+ padding: 0;
405
+ list-style: none;
406
+ }
407
+
408
+ /* Capped at three columns: with `auto-fit` alone a six-service grid became
409
+ four columns plus two orphans on a wide screen — a 3×2 grid is the shape
410
+ a services page is designed as. */
411
+ @media (min-width: 64rem) {
412
+ .cg-services__items {
413
+ grid-template-columns: repeat(3, 1fr);
414
+ }
415
+ }
416
+
417
+ .cg-service {
418
+ padding: var(--cg-s8);
419
+ border: 1px solid var(--cg-line);
420
+ border-radius: var(--cg-radius-md);
421
+ background: var(--cg-surface);
422
+ transition:
423
+ border-color var(--cg-duration) var(--cg-ease),
424
+ box-shadow var(--cg-duration) var(--cg-ease);
425
+ }
426
+
427
+ .cg-service:hover {
428
+ border-color: color-mix(in oklab, var(--cg-accent) 45%, var(--cg-line));
429
+ box-shadow: var(--cogenta-shadow-sm);
430
+ }
431
+
432
+ /* A flat, accent-tinted square rather than a shadowed disc: the same
433
+ restrained "hairline and fill" language `stats`/`pricingTable` use — a
434
+ real icon, never a decorative gradient chip. */
435
+ .cg-service__icon {
436
+ display: inline-flex;
437
+ align-items: center;
438
+ justify-content: center;
439
+ inline-size: var(--cg-s10);
440
+ block-size: var(--cg-s10);
441
+ margin-block-end: var(--cg-s5);
442
+ background: var(--cg-accent-soft);
443
+ color: var(--cg-accent);
444
+ border-radius: var(--cg-radius-sm);
445
+ }
446
+
447
+ .cg-service__icon svg {
448
+ inline-size: 1.35rem;
449
+ block-size: 1.35rem;
450
+ }
451
+
452
+ .cg-service__title {
453
+ margin: 0 0 var(--cg-s2);
454
+ font-size: var(--cg-text-lg);
455
+ font-weight: var(--cg-weight-semibold);
456
+ line-height: var(--cg-leading-snug);
457
+ letter-spacing: var(--cg-tracking-snug);
458
+ }
459
+
460
+ .cg-service__link {
461
+ color: inherit;
462
+ text-decoration: none;
463
+ }
464
+
465
+ .cg-service:hover .cg-service__link {
466
+ color: var(--cg-accent);
467
+ }
468
+
469
+ .cg-service__text {
470
+ margin: 0;
471
+ color: var(--cg-ink-muted);
472
+ line-height: var(--cg-leading-relaxed);
473
+ text-wrap: pretty;
474
+ }
475
+
476
+ /* --- cta → premium banner ---------------------------------------------- */
477
+
478
+ /* A full-width flat band, not a card sitting in the page column — same
479
+ discipline as `.cg-metrics`, this block's other "confident, edge to
480
+ edge" moment. `.cg-banner__inner` re-centres the ask/action pair to the
481
+ page's own measure. */
482
+ .cg-banner {
483
+ max-inline-size: none;
484
+ padding: var(--cg-s12) var(--cg-gutter);
485
+ background: var(--cg-surface-tinted);
486
+ border-block: 1px solid var(--cg-line);
487
+ }
488
+
489
+ .cg-banner__inner {
490
+ display: grid;
491
+ gap: var(--cg-s8);
492
+ max-inline-size: var(--cg-page);
493
+ margin-inline: auto;
494
+ }
495
+
496
+ @media (min-width: 52rem) {
497
+ .cg-banner__inner {
498
+ grid-template-columns: 1fr auto;
499
+ align-items: center;
500
+ gap: var(--cg-s12);
501
+ }
502
+
503
+ .cg-banner__content {
504
+ padding-inline-end: var(--cg-s12);
505
+ border-inline-end: 1px solid var(--cg-line);
506
+ }
507
+ }
508
+
509
+ .cg-banner__title {
510
+ margin: 0;
511
+ font-size: var(--cg-text-2xl);
512
+ line-height: var(--cg-leading-snug);
513
+ letter-spacing: var(--cg-tracking-tight);
514
+ font-weight: var(--cg-weight-bold);
515
+ text-wrap: balance;
516
+ }
517
+
518
+ .cg-banner__text {
519
+ margin: var(--cg-s4) 0 0;
520
+ max-inline-size: var(--cg-measure-narrow);
521
+ color: var(--cg-ink-muted);
522
+ font-size: var(--cg-text-lg);
523
+ line-height: var(--cg-leading-relaxed);
524
+ text-wrap: pretty;
525
+ }
526
+
527
+ .cg-banner__actions .cg-actions {
528
+ margin-block-start: 0;
529
+ }
530
+
531
+ /* --- gallery ----------------------------------------------------------- */
532
+
533
+ .cg-gallery__items {
534
+ display: grid;
535
+ gap: var(--cg-gap-tight);
536
+ grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
537
+ }
538
+
539
+ .cg-gallery__item {
540
+ overflow: hidden;
541
+ border: 1px solid var(--cg-line);
542
+ border-radius: var(--cg-radius-sm);
543
+ }
544
+
545
+ .cg-gallery__item img {
546
+ inline-size: 100%;
547
+ block-size: 100%;
548
+ transition: transform var(--cg-duration-slow) var(--cg-ease);
549
+ }
550
+
551
+ .cg-gallery__item:hover img {
552
+ transform: scale(1.03);
553
+ }
554
+
555
+ .cg-gallery:not([data-layout="masonry"]) .cg-gallery__item img {
556
+ aspect-ratio: 3 / 2;
557
+ }
558
+
559
+ .cg-gallery[data-layout="masonry"] .cg-gallery__items {
560
+ display: block;
561
+ columns: 3 15rem;
562
+ column-gap: var(--cg-gap-tight);
563
+ }
564
+
565
+ .cg-gallery[data-layout="masonry"] .cg-gallery__item {
566
+ break-inside: avoid;
567
+ margin-block-end: var(--cg-gap-tight);
568
+ }
569
+
570
+ .cg-gallery[data-layout="carousel"] .cg-gallery__items {
571
+ display: grid;
572
+ grid-auto-flow: column;
573
+ grid-auto-columns: minmax(17rem, 42%);
574
+ }
575
+
576
+ .cg-gallery[data-layout="carousel"] .cg-gallery__item {
577
+ scroll-snap-align: start;
578
+ }
579
+
580
+ /* --- quote → testimonial card ------------------------------------------- */
581
+
582
+ .cg-quote {
583
+ max-inline-size: var(--cg-page-narrow);
584
+ margin-inline: auto;
585
+ padding: var(--cg-s10) var(--cg-s10) var(--cg-s10) var(--cg-s8);
586
+ border-inline-start: 3px solid var(--cg-accent);
587
+ border-block: 1px solid var(--cg-line);
588
+ border-inline-end: 1px solid var(--cg-line);
589
+ border-radius: 0 var(--cg-radius-md) var(--cg-radius-md) 0;
590
+ background: var(--cg-surface-sunken);
591
+ }
592
+
593
+ .cg-quote__text {
594
+ margin: 0;
595
+ font-family: var(--cogenta-font-serif);
596
+ font-size: var(--cg-text-xl);
597
+ font-style: italic;
598
+ line-height: var(--cg-leading-snug);
599
+ letter-spacing: var(--cg-tracking-snug);
600
+ text-wrap: balance;
601
+ }
602
+
603
+ .cg-quote__attribution {
604
+ display: flex;
605
+ align-items: center;
606
+ gap: var(--cg-s3);
607
+ margin-block-start: var(--cg-s8);
608
+ padding-block-start: var(--cg-s6);
609
+ border-block-start: 1px solid var(--cg-line-soft);
610
+ color: var(--cg-ink-subtle);
611
+ font-size: var(--cg-text-sm);
612
+ font-style: normal;
613
+ }
614
+
615
+ .cg-quote__avatar {
616
+ inline-size: var(--cg-s10);
617
+ block-size: var(--cg-s10);
618
+ border-radius: var(--cg-radius-pill);
619
+ box-shadow: var(--cg-ring);
620
+ }
621
+
622
+ .cg-quote__who {
623
+ display: flex;
624
+ flex-direction: column;
625
+ }
626
+
627
+ .cg-quote__author {
628
+ font-weight: var(--cg-weight-semibold);
629
+ color: var(--cg-ink);
630
+ }
631
+
632
+ /* --- faq → numbered accordion ------------------------------------------- */
633
+
634
+ .cg-faq {
635
+ max-inline-size: var(--cg-page-narrow);
636
+ margin-inline: auto;
637
+ }
638
+
639
+ .cg-faq__item {
640
+ border-block-start: 1px solid var(--cg-line-soft);
641
+ }
642
+
643
+ .cg-faq__item:last-child {
644
+ border-block-end: 1px solid var(--cg-line-soft);
645
+ }
646
+
647
+ .cg-faq__question {
648
+ display: flex;
649
+ align-items: baseline;
650
+ gap: var(--cg-s5);
651
+ padding: var(--cg-s6) var(--cg-s2);
652
+ font-weight: var(--cg-weight-semibold);
653
+ cursor: pointer;
654
+ list-style: none;
655
+ transition: color var(--cg-duration) var(--cg-ease);
656
+ }
657
+
658
+ .cg-faq__question::-webkit-details-marker {
659
+ display: none;
660
+ }
661
+
662
+ .cg-faq__index {
663
+ font-family: var(--cogenta-font-serif);
664
+ font-style: italic;
665
+ font-weight: var(--cg-weight-regular);
666
+ color: var(--cg-ink-subtle);
667
+ min-inline-size: 2.2ch;
668
+ }
669
+
670
+ .cg-faq__question-text {
671
+ flex: 1;
672
+ }
673
+
674
+ .cg-faq__question:hover,
675
+ .cg-faq__details[open] .cg-faq__question {
676
+ color: var(--cg-accent);
677
+ }
678
+
679
+ /* A plus mark clipped flat from a solid fill — no gradient, no icon font,
680
+ no glyph a font might not ship. */
681
+ .cg-faq__question::before {
682
+ content: "";
683
+ flex: none;
684
+ margin-inline-start: auto;
685
+ inline-size: 0.9em;
686
+ block-size: 0.9em;
687
+ background: currentColor;
688
+ clip-path: polygon(
689
+ 43% 0%,
690
+ 57% 0%,
691
+ 57% 43%,
692
+ 100% 43%,
693
+ 100% 57%,
694
+ 57% 57%,
695
+ 57% 100%,
696
+ 43% 100%,
697
+ 43% 57%,
698
+ 0% 57%,
699
+ 0% 43%,
700
+ 43% 43%
701
+ );
702
+ transition: transform var(--cg-duration) var(--cg-ease);
703
+ }
704
+
705
+ .cg-faq__details[open] .cg-faq__question::before {
706
+ transform: rotate(90deg);
707
+ }
708
+
709
+ .cg-faq__answer {
710
+ padding: 0 var(--cg-s2) var(--cg-s6) calc(2.2ch + var(--cg-s5));
711
+ color: var(--cg-ink-muted);
712
+ line-height: var(--cg-leading-relaxed);
713
+ }
714
+
715
+ .cg-faq__answer > :first-child {
716
+ margin-block-start: 0;
717
+ }
718
+
719
+ .cg-faq__answer > :last-child {
720
+ margin-block-end: 0;
721
+ }
722
+
723
+ /* --- stats → full-width KPI band ------------------------------------------
724
+ A confident, edge-to-edge accent band rather than a bordered strip inside
725
+ the page column — the "real KPI section" read the aesthetic direction
726
+ asks for. `data-variant-width` is unaffected: this block opts itself into
727
+ full width by its own rule rather than requiring an author to set one. */
728
+
729
+ .cg-metrics {
730
+ /* A genuine full-width band, not a card sitting in the page column —
731
+ the one block on this theme's page that reads as edge to edge by
732
+ default, overriding the `:where()` container rule (`base.css`) that
733
+ every other block relies on. `.cg-metrics__items` below re-centres the
734
+ actual figures to the page's own measure so only the accent fill goes
735
+ edge to edge. */
736
+ max-inline-size: none;
737
+ padding: var(--cg-s12) var(--cg-gutter);
738
+ background: var(--cg-accent);
739
+ color: var(--cg-accent-fg);
740
+ }
741
+
742
+ .cg-metrics__title {
743
+ color: var(--cg-accent-fg);
744
+ }
745
+
746
+ .cg-metrics__items {
747
+ display: grid;
748
+ grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
749
+ gap: var(--cg-s8);
750
+ margin: 0;
751
+ max-inline-size: var(--cg-page);
752
+ margin-inline: auto;
753
+ }
754
+
755
+ .cg-metric {
756
+ display: flex;
757
+ flex-direction: column;
758
+ gap: var(--cg-s2);
759
+ }
760
+
761
+ .cg-metric__label {
762
+ order: 1;
763
+ font-size: var(--cg-text-xs);
764
+ font-weight: var(--cg-weight-semibold);
765
+ letter-spacing: var(--cg-tracking-wide);
766
+ text-transform: uppercase;
767
+ opacity: 0.82;
768
+ }
769
+
770
+ .cg-metric__value {
771
+ order: 2;
772
+ display: flex;
773
+ align-items: baseline;
774
+ gap: var(--cg-s1);
775
+ margin: 0;
776
+ font-size: var(--cg-text-3xl);
777
+ font-weight: var(--cg-weight-bold);
778
+ line-height: var(--cg-leading-tight);
779
+ letter-spacing: var(--cg-tracking-tight);
780
+ font-variant-numeric: tabular-nums;
781
+ }
782
+
783
+ @media (min-width: 60rem) {
784
+ .cg-metric__value {
785
+ font-size: calc(var(--cg-text-3xl) * 1.15);
786
+ }
787
+ }
788
+
789
+ .cg-metric__unit {
790
+ font-size: var(--cg-text-lg);
791
+ font-weight: var(--cg-weight-medium);
792
+ opacity: 0.82;
793
+ }
794
+
795
+ /* --- logos → "trusted by" strip ------------------------------------------ */
796
+
797
+ .cg-clients__items {
798
+ display: grid;
799
+ grid-template-columns: repeat(auto-fit, minmax(8.5rem, 1fr));
800
+ gap: var(--cg-gap);
801
+ align-items: center;
802
+ }
803
+
804
+ .cg-clients__item {
805
+ display: flex;
806
+ align-items: center;
807
+ justify-content: center;
808
+ padding: var(--cg-s4);
809
+ }
810
+
811
+ .cg-clients__logo {
812
+ block-size: var(--cg-s10);
813
+ inline-size: auto;
814
+ max-inline-size: 100%;
815
+ object-fit: contain;
816
+ /* Grayscale, held back until hovered — the restrained "held-back until
817
+ proven" treatment the aesthetic direction calls for. A `filter`, never
818
+ a re-encoded asset: the real logo is one hover away. */
819
+ filter: grayscale(1);
820
+ opacity: 0.65;
821
+ transition:
822
+ filter var(--cg-duration) var(--cg-ease),
823
+ opacity var(--cg-duration) var(--cg-ease);
824
+ }
825
+
826
+ .cg-clients__link {
827
+ display: inline-flex;
828
+ align-items: center;
829
+ justify-content: center;
830
+ inline-size: 100%;
831
+ border-radius: var(--cg-radius-xs);
832
+ }
833
+
834
+ .cg-clients__item:hover .cg-clients__logo,
835
+ .cg-clients__link:focus-visible .cg-clients__logo {
836
+ filter: grayscale(0);
837
+ opacity: 1;
838
+ }
839
+
840
+ /* --- collectionList → services/insights cards ---------------------------- */
841
+
842
+ .cg-list__items {
843
+ display: grid;
844
+ }
845
+
846
+ .cg-list[data-layout="list"] .cg-list__items {
847
+ gap: var(--cg-s6);
848
+ }
849
+
850
+ .cg-list[data-layout="list"] .cg-list__row {
851
+ display: flex;
852
+ align-items: flex-start;
853
+ gap: var(--cg-s6);
854
+ padding-block: var(--cg-s6);
855
+ border-block-start: 1px solid var(--cg-line-soft);
856
+ }
857
+
858
+ .cg-list[data-layout="list"] .cg-list__row:last-child {
859
+ border-block-end: 1px solid var(--cg-line-soft);
860
+ }
861
+
862
+ /* The 16:9 cover — `entryImage`'s resolved picture, when the entry has one.
863
+ `object-fit: cover` (inherited from `img` in `base.css`) crops rather than
864
+ letterboxes, and the picture is loaded lazily (a listed entry, never the
865
+ hero) with a real intrinsic aspect ratio so nothing shifts once it loads.
866
+ Declared here, ahead of the `[data-layout="list"]` override just below,
867
+ so the cascade reads in ascending specificity order. */
868
+ .cg-list__cover {
869
+ display: block;
870
+ aspect-ratio: 16 / 9;
871
+ overflow: hidden;
872
+ border-radius: var(--cg-radius-sm);
873
+ }
874
+
875
+ .cg-list__cover-image {
876
+ inline-size: 100%;
877
+ block-size: 100%;
878
+ }
879
+
880
+ .cg-list[data-layout="list"] .cg-list__cover {
881
+ flex: none;
882
+ inline-size: 9rem;
883
+ }
884
+
885
+ .cg-list[data-layout="grid"] .cg-list__items,
886
+ .cg-list[data-layout="carousel"] .cg-list__items {
887
+ display: grid;
888
+ gap: var(--cg-gap);
889
+ }
890
+
891
+ .cg-list[data-layout="grid"] .cg-list__items {
892
+ grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
893
+ }
894
+
895
+ .cg-list[data-layout="carousel"] .cg-list__items {
896
+ grid-auto-flow: column;
897
+ grid-auto-columns: minmax(17rem, 45%);
898
+ }
899
+
900
+ .cg-list[data-layout="grid"] .cg-list__row,
901
+ .cg-list[data-layout="carousel"] .cg-list__row {
902
+ display: flex;
903
+ flex-direction: column;
904
+ gap: var(--cg-s4);
905
+ padding: var(--cg-s6);
906
+ border: 1px solid var(--cg-line);
907
+ border-radius: var(--cg-radius-md);
908
+ background: var(--cg-surface);
909
+ transition: border-color var(--cg-duration) var(--cg-ease);
910
+ }
911
+
912
+ .cg-list[data-layout="grid"] .cg-list__row:hover,
913
+ .cg-list[data-layout="carousel"] .cg-list__row:hover {
914
+ border-color: var(--cg-accent);
915
+ }
916
+
917
+ .cg-list[data-layout="carousel"] .cg-list__row {
918
+ scroll-snap-align: start;
919
+ }
920
+
921
+ .cg-list__date {
922
+ color: var(--cg-ink-subtle);
923
+ font-size: var(--cg-text-xs);
924
+ font-weight: var(--cg-weight-semibold);
925
+ letter-spacing: var(--cg-tracking-wide);
926
+ text-transform: uppercase;
927
+ }
928
+
929
+ .cg-list__body {
930
+ display: flex;
931
+ flex-direction: column;
932
+ gap: var(--cg-s2);
933
+ }
934
+
935
+ .cg-list__title {
936
+ margin: 0;
937
+ font-size: var(--cg-text-lg);
938
+ font-weight: var(--cg-weight-semibold);
939
+ line-height: var(--cg-leading-snug);
940
+ letter-spacing: var(--cg-tracking-snug);
941
+ text-wrap: balance;
942
+ }
943
+
944
+ .cg-list__link {
945
+ color: inherit;
946
+ text-decoration: none;
947
+ }
948
+
949
+ .cg-list__row:hover .cg-list__link {
950
+ color: var(--cg-accent);
951
+ }
952
+
953
+ .cg-list__excerpt {
954
+ margin: 0;
955
+ color: var(--cg-ink-muted);
956
+ font-size: var(--cg-text-sm);
957
+ line-height: var(--cg-leading-relaxed);
958
+ display: -webkit-box;
959
+ -webkit-box-orient: vertical;
960
+ -webkit-line-clamp: 3;
961
+ line-clamp: 3;
962
+ overflow: hidden;
963
+ }
964
+
965
+ .cg-list__empty {
966
+ padding: var(--cg-s8);
967
+ border: 1px dashed var(--cg-line-strong);
968
+ border-radius: var(--cg-radius-md);
969
+ color: var(--cg-ink-subtle);
970
+ text-align: center;
971
+ }
972
+
973
+ /* --- embed --------------------------------------------------------------- */
974
+
975
+ .cg-embed {
976
+ aspect-ratio: var(--cg-ratio, 16 / 9);
977
+ max-inline-size: var(--cg-measure);
978
+ margin-inline: auto;
979
+ border: 1px solid var(--cg-line);
980
+ border-radius: var(--cg-radius-md);
981
+ overflow: hidden;
982
+ }
983
+
984
+ .cg-embed__frame {
985
+ inline-size: 100%;
986
+ block-size: 100%;
987
+ border: 0;
988
+ }
989
+
990
+ .cg-embed__placeholder {
991
+ display: flex;
992
+ flex-direction: column;
993
+ align-items: center;
994
+ justify-content: center;
995
+ gap: var(--cg-s4);
996
+ block-size: 100%;
997
+ padding: var(--cg-s8);
998
+ background: var(--cg-surface-sunken);
999
+ color: var(--cg-ink-muted);
1000
+ text-align: center;
1001
+ }
1002
+
1003
+ .cg-embed__provider {
1004
+ margin: 0;
1005
+ padding: var(--cg-s1) var(--cg-s3);
1006
+ border: 1px solid var(--cg-line-strong);
1007
+ border-radius: var(--cg-radius-pill);
1008
+ font-size: var(--cg-text-xs);
1009
+ font-weight: var(--cg-weight-semibold);
1010
+ letter-spacing: var(--cg-tracking-wide);
1011
+ text-transform: uppercase;
1012
+ }
1013
+
1014
+ .cg-embed__notice {
1015
+ margin: 0;
1016
+ max-inline-size: var(--cg-measure-narrow);
1017
+ line-height: var(--cg-leading-relaxed);
1018
+ text-wrap: pretty;
1019
+ }
1020
+
1021
+ .cg-embed__link {
1022
+ display: inline-flex;
1023
+ align-items: center;
1024
+ min-block-size: 44px;
1025
+ padding: var(--cg-s3) var(--cg-s6);
1026
+ background: var(--cg-surface-raised);
1027
+ color: var(--cg-accent);
1028
+ border: 1px solid var(--cg-line-strong);
1029
+ border-radius: var(--cg-radius-sm);
1030
+ font-size: var(--cg-text-sm);
1031
+ font-weight: var(--cg-weight-semibold);
1032
+ text-decoration: none;
1033
+ transition:
1034
+ background-color var(--cg-duration) var(--cg-ease),
1035
+ color var(--cg-duration) var(--cg-ease);
1036
+ }
1037
+
1038
+ .cg-embed__link:hover {
1039
+ background: var(--cg-accent);
1040
+ color: var(--cg-accent-fg);
1041
+ border-color: var(--cg-accent);
1042
+ }
1043
+
1044
+ /* --- testimonial → client outcome panel (blocks@2.0, RFC 0001) ----------- */
1045
+
1046
+ /* Mirrors `quote`'s bordered-plate language but reversed and widened: the
1047
+ accent rule sits on the trailing edge and the attribution moves beside
1048
+ the quote on wide screens rather than below it — a "client outcome"
1049
+ callout is read as heavier evidence than a short pull-quote, so it earns
1050
+ more width and its own two-column shape. */
1051
+ .cg-testimonial {
1052
+ display: grid;
1053
+ gap: var(--cg-s6);
1054
+ max-inline-size: var(--cg-page-narrow);
1055
+ margin-inline: auto;
1056
+ padding: var(--cg-s10);
1057
+ border-inline-end: 3px solid var(--cg-accent);
1058
+ border-block: 1px solid var(--cg-line);
1059
+ border-inline-start: 1px solid var(--cg-line);
1060
+ border-radius: var(--cg-radius-md) 0 0 var(--cg-radius-md);
1061
+ background: var(--cg-surface-sunken);
1062
+ }
1063
+
1064
+ @media (min-width: 56rem) {
1065
+ .cg-testimonial {
1066
+ grid-template-columns: 1fr auto;
1067
+ align-items: center;
1068
+ gap: var(--cg-s10);
1069
+ }
1070
+
1071
+ .cg-testimonial__attribution {
1072
+ flex-direction: column;
1073
+ align-items: flex-start;
1074
+ min-inline-size: 14rem;
1075
+ padding-inline-start: var(--cg-s8);
1076
+ border-inline-start: 1px solid var(--cg-line-soft);
1077
+ }
1078
+ }
1079
+
1080
+ .cg-testimonial__quote {
1081
+ margin: 0;
1082
+ font-family: var(--cogenta-font-serif);
1083
+ font-size: var(--cg-text-xl);
1084
+ font-style: italic;
1085
+ line-height: var(--cg-leading-snug);
1086
+ letter-spacing: var(--cg-tracking-snug);
1087
+ text-wrap: balance;
1088
+ }
1089
+
1090
+ .cg-testimonial__quote p {
1091
+ margin: 0;
1092
+ }
1093
+
1094
+ .cg-testimonial__quote p + p {
1095
+ margin-block-start: var(--cg-s4);
1096
+ }
1097
+
1098
+ .cg-testimonial__attribution {
1099
+ display: flex;
1100
+ align-items: center;
1101
+ gap: var(--cg-s3);
1102
+ margin-block-start: var(--cg-s2);
1103
+ font-style: normal;
1104
+ }
1105
+
1106
+ .cg-testimonial__avatar {
1107
+ inline-size: var(--cg-s10);
1108
+ block-size: var(--cg-s10);
1109
+ border-radius: var(--cg-radius-pill);
1110
+ box-shadow: var(--cg-ring);
1111
+ }
1112
+
1113
+ .cg-testimonial__who {
1114
+ display: flex;
1115
+ flex-direction: column;
1116
+ gap: var(--cg-s1);
1117
+ font-size: var(--cg-text-sm);
1118
+ color: var(--cg-ink-subtle);
1119
+ }
1120
+
1121
+ .cg-testimonial__name {
1122
+ font-weight: var(--cg-weight-semibold);
1123
+ color: var(--cg-ink);
1124
+ }
1125
+
1126
+ /* --- pricingTable → plan comparison (blocks@2.0, RFC 0001) --------------- */
1127
+
1128
+ .cg-pricing__title {
1129
+ margin: 0 0 var(--cg-s8);
1130
+ font-size: var(--cg-text-2xl);
1131
+ line-height: var(--cg-leading-snug);
1132
+ letter-spacing: var(--cg-tracking-tight);
1133
+ font-weight: var(--cg-weight-bold);
1134
+ text-wrap: balance;
1135
+ }
1136
+
1137
+ .cg-pricing__tiers {
1138
+ display: grid;
1139
+ gap: var(--cg-s6);
1140
+ margin: 0;
1141
+ }
1142
+
1143
+ @media (min-width: 48rem) {
1144
+ .cg-pricing__tiers {
1145
+ grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
1146
+ align-items: start;
1147
+ }
1148
+ }
1149
+
1150
+ .cg-pricing__tier {
1151
+ display: flex;
1152
+ flex-direction: column;
1153
+ gap: var(--cg-s5);
1154
+ padding: var(--cg-s8);
1155
+ border: 1px solid var(--cg-line);
1156
+ border-radius: var(--cg-radius-lg);
1157
+ background: var(--cg-surface);
1158
+ box-shadow: var(--cg-elevation-1);
1159
+ }
1160
+
1161
+ /* The one visual cue emphasis earns: a lifted border and a shadow, never a
1162
+ fill — this theme spends colour sparingly and reserves a solid accent
1163
+ surface for `statCounter`'s own "impact" band. */
1164
+ .cg-pricing__tier[data-highlighted="true"] {
1165
+ border-color: var(--cg-accent);
1166
+ box-shadow: var(--cg-elevation-3);
1167
+ }
1168
+
1169
+ .cg-pricing__name {
1170
+ margin: 0;
1171
+ font-size: var(--cg-text-lg);
1172
+ font-weight: var(--cg-weight-semibold);
1173
+ letter-spacing: var(--cg-tracking-snug);
1174
+ }
1175
+
1176
+ .cg-pricing__price {
1177
+ display: flex;
1178
+ align-items: baseline;
1179
+ gap: var(--cg-s1);
1180
+ margin: 0;
1181
+ }
1182
+
1183
+ .cg-pricing__amount {
1184
+ font-size: var(--cg-text-3xl);
1185
+ font-weight: var(--cg-weight-bold);
1186
+ letter-spacing: var(--cg-tracking-tight);
1187
+ color: var(--cg-accent);
1188
+ font-variant-numeric: tabular-nums;
1189
+ }
1190
+
1191
+ .cg-pricing__interval {
1192
+ color: var(--cg-ink-muted);
1193
+ font-size: var(--cg-text-sm);
1194
+ }
1195
+
1196
+ .cg-pricing__features {
1197
+ display: flex;
1198
+ flex-direction: column;
1199
+ gap: var(--cg-s3);
1200
+ margin: 0;
1201
+ padding: var(--cg-s5) 0 0;
1202
+ border-block-start: 1px solid var(--cg-line-soft);
1203
+ list-style: none;
1204
+ color: var(--cg-ink-muted);
1205
+ font-size: var(--cg-text-sm);
1206
+ line-height: var(--cg-leading-normal);
1207
+ }
1208
+
1209
+ .cg-pricing__feature {
1210
+ padding-inline-start: var(--cg-s5);
1211
+ position: relative;
1212
+ }
1213
+
1214
+ /* A hairline check mark drawn from two borders, matching `faq`'s own
1215
+ no-icon-font discipline. */
1216
+ .cg-pricing__feature::before {
1217
+ content: "";
1218
+ position: absolute;
1219
+ inset-inline-start: 0;
1220
+ inset-block-start: 0.5em;
1221
+ inline-size: 0.55em;
1222
+ block-size: 0.3em;
1223
+ border-inline-start: 2px solid var(--cg-accent);
1224
+ border-block-end: 2px solid var(--cg-accent);
1225
+ transform: translateY(-60%) rotate(-45deg);
1226
+ }
1227
+
1228
+ .cg-pricing__action {
1229
+ margin-block-start: auto;
1230
+ padding-block-start: var(--cg-s2);
1231
+ }
1232
+
1233
+ .cg-pricing__action .cg-action {
1234
+ inline-size: 100%;
1235
+ justify-content: center;
1236
+ }
1237
+
1238
+ /* --- accordion → specification panels (blocks@2.0, RFC 0001) ------------- */
1239
+
1240
+ .cg-panels {
1241
+ max-inline-size: var(--cg-page-narrow);
1242
+ margin-inline: auto;
1243
+ }
1244
+
1245
+ .cg-panels__title {
1246
+ margin: 0 0 var(--cg-s6);
1247
+ font-size: var(--cg-text-2xl);
1248
+ line-height: var(--cg-leading-snug);
1249
+ letter-spacing: var(--cg-tracking-tight);
1250
+ font-weight: var(--cg-weight-bold);
1251
+ text-wrap: balance;
1252
+ }
1253
+
1254
+ .cg-panels__items {
1255
+ display: flex;
1256
+ flex-direction: column;
1257
+ gap: var(--cg-s3);
1258
+ margin: 0;
1259
+ }
1260
+
1261
+ .cg-panels__item {
1262
+ border: 1px solid var(--cg-line);
1263
+ border-radius: var(--cg-radius-md);
1264
+ background: var(--cg-surface);
1265
+ transition: border-color var(--cg-duration) var(--cg-ease);
1266
+ }
1267
+
1268
+ .cg-panels__item:has(.cg-panels__details[open]) {
1269
+ border-color: var(--cg-line-strong);
1270
+ }
1271
+
1272
+ .cg-panels__question {
1273
+ display: flex;
1274
+ align-items: center;
1275
+ gap: var(--cg-s4);
1276
+ padding: var(--cg-s5) var(--cg-s6);
1277
+ font-weight: var(--cg-weight-semibold);
1278
+ cursor: pointer;
1279
+ list-style: none;
1280
+ }
1281
+
1282
+ .cg-panels__question::-webkit-details-marker {
1283
+ display: none;
1284
+ }
1285
+
1286
+ .cg-panels__question-text {
1287
+ flex: 1;
1288
+ }
1289
+
1290
+ .cg-panels__details[open] .cg-panels__question {
1291
+ color: var(--cg-accent);
1292
+ }
1293
+
1294
+ /* A chevron drawn from two borders, rotating open — distinct from `faq`'s
1295
+ plus/minus mark so the two disclosure widgets read as their own things. */
1296
+ .cg-panels__chevron {
1297
+ flex: none;
1298
+ inline-size: 0.6em;
1299
+ block-size: 0.6em;
1300
+ border-inline-end: 2px solid currentColor;
1301
+ border-block-end: 2px solid currentColor;
1302
+ transform: rotate(45deg);
1303
+ transition: transform var(--cg-duration) var(--cg-ease);
1304
+ }
1305
+
1306
+ .cg-panels__details[open] .cg-panels__chevron {
1307
+ transform: rotate(-135deg);
1308
+ }
1309
+
1310
+ .cg-panels__answer {
1311
+ padding: 0 var(--cg-s6) var(--cg-s6);
1312
+ color: var(--cg-ink-muted);
1313
+ line-height: var(--cg-leading-relaxed);
1314
+ }
1315
+
1316
+ .cg-panels__answer > :first-child {
1317
+ margin-block-start: 0;
1318
+ }
1319
+
1320
+ .cg-panels__answer > :last-child {
1321
+ margin-block-end: 0;
1322
+ }
1323
+
1324
+ /* --- statCounter → impact band (blocks@2.0, RFC 0001) -------------------- */
1325
+
1326
+ /* The one block that spends a solid accent fill rather than this theme's
1327
+ usual hairline-and-white restraint: a narrower, single-figure counter is
1328
+ meant to read as a confident headline claim, not a quiet ledger entry —
1329
+ `stats` already gives that quieter treatment its own place. */
1330
+ .cg-kpis {
1331
+ padding: var(--cg-s10) var(--cg-s8);
1332
+ border-radius: var(--cg-radius-lg);
1333
+ background: var(--cg-accent);
1334
+ color: var(--cg-accent-fg);
1335
+ }
1336
+
1337
+ .cg-kpis__title {
1338
+ margin: 0 0 var(--cg-s8);
1339
+ font-size: var(--cg-text-xl);
1340
+ line-height: var(--cg-leading-snug);
1341
+ letter-spacing: var(--cg-tracking-tight);
1342
+ font-weight: var(--cg-weight-bold);
1343
+ text-wrap: balance;
1344
+ }
1345
+
1346
+ .cg-kpis__items {
1347
+ display: grid;
1348
+ grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
1349
+ gap: var(--cg-s8);
1350
+ margin: 0;
1351
+ }
1352
+
1353
+ .cg-kpi {
1354
+ display: flex;
1355
+ flex-direction: column;
1356
+ gap: var(--cg-s2);
1357
+ }
1358
+
1359
+ .cg-kpi__label {
1360
+ order: 2;
1361
+ font-size: var(--cg-text-xs);
1362
+ font-weight: var(--cg-weight-semibold);
1363
+ letter-spacing: var(--cg-tracking-wide);
1364
+ text-transform: uppercase;
1365
+ opacity: 0.82;
1366
+ }
1367
+
1368
+ .cg-kpi__value {
1369
+ order: 1;
1370
+ margin: 0;
1371
+ font-size: var(--cg-text-3xl);
1372
+ font-weight: var(--cg-weight-bold);
1373
+ line-height: var(--cg-leading-tight);
1374
+ letter-spacing: var(--cg-tracking-tight);
1375
+ font-variant-numeric: tabular-nums;
1376
+ }
1377
+
1378
+ /* --- logoStrip → trust band (blocks@2.0, RFC 0001) ------------------------ */
1379
+
1380
+ /* Denser and full-colour, unlike `logos`'s held-back grayscale client
1381
+ cards: a press/"trusted by" strip reads as a fact, not an invitation to
1382
+ click, so nothing here dims until interaction. A tinted, full-width band
1383
+ (the same flat surface `[data-variant-background="muted"]` composes
1384
+ elsewhere) is what turns this into a "trust band" placed right under the
1385
+ hero rather than a bare row of marks floating on the page canvas. */
1386
+ .cg-logo-band {
1387
+ max-inline-size: none;
1388
+ margin: 0;
1389
+ padding: var(--cg-s8) var(--cg-gutter);
1390
+ background: var(--cg-surface-sunken);
1391
+ border-block: 1px solid var(--cg-line-soft);
1392
+ }
1393
+
1394
+ .cg-logo-band__items {
1395
+ display: flex;
1396
+ flex-wrap: wrap;
1397
+ align-items: center;
1398
+ justify-content: center;
1399
+ gap: 0;
1400
+ margin-inline: auto;
1401
+ padding: 0;
1402
+ max-inline-size: var(--cg-page);
1403
+ list-style: none;
1404
+ }
1405
+
1406
+ .cg-logo-band__item {
1407
+ display: flex;
1408
+ align-items: center;
1409
+ justify-content: center;
1410
+ padding: var(--cg-s3) var(--cg-s6);
1411
+ border-inline-start: 1px solid var(--cg-line-soft);
1412
+ }
1413
+
1414
+ .cg-logo-band__item:first-child {
1415
+ border-inline-start: 0;
1416
+ }
1417
+
1418
+ .cg-logo-band__image {
1419
+ block-size: var(--cg-s8);
1420
+ inline-size: auto;
1421
+ max-inline-size: 100%;
1422
+ object-fit: contain;
1423
+ }
1424
+
1425
+ .cg-logo-band__caption {
1426
+ margin-block-start: var(--cg-s5);
1427
+ color: var(--cg-ink-subtle);
1428
+ font-size: var(--cg-text-xs);
1429
+ font-weight: var(--cg-weight-semibold);
1430
+ letter-spacing: var(--cg-tracking-wide);
1431
+ text-transform: uppercase;
1432
+ text-align: center;
1433
+ }