@cogenta/theme-entreprise 1.1.3 → 1.3.3

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 (115) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +1 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/render/blocks/accordion.d.ts.map +1 -1
  6. package/dist/src/render/blocks/accordion.js +12 -15
  7. package/dist/src/render/blocks/accordion.js.map +1 -1
  8. package/dist/src/render/blocks/collection-list.d.ts +5 -7
  9. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  10. package/dist/src/render/blocks/collection-list.js +48 -32
  11. package/dist/src/render/blocks/collection-list.js.map +1 -1
  12. package/dist/src/render/blocks/cta.d.ts +6 -6
  13. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  14. package/dist/src/render/blocks/cta.js +12 -12
  15. package/dist/src/render/blocks/cta.js.map +1 -1
  16. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  17. package/dist/src/render/blocks/embed.js +22 -27
  18. package/dist/src/render/blocks/embed.js.map +1 -1
  19. package/dist/src/render/blocks/faq.d.ts.map +1 -1
  20. package/dist/src/render/blocks/faq.js +13 -16
  21. package/dist/src/render/blocks/faq.js.map +1 -1
  22. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
  23. package/dist/src/render/blocks/feature-grid.js +22 -22
  24. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  25. package/dist/src/render/blocks/gallery.d.ts +7 -8
  26. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  27. package/dist/src/render/blocks/gallery.js +16 -14
  28. package/dist/src/render/blocks/gallery.js.map +1 -1
  29. package/dist/src/render/blocks/hero.d.ts +13 -8
  30. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  31. package/dist/src/render/blocks/hero.js +27 -17
  32. package/dist/src/render/blocks/hero.js.map +1 -1
  33. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
  34. package/dist/src/render/blocks/logo-strip.js +14 -11
  35. package/dist/src/render/blocks/logo-strip.js.map +1 -1
  36. package/dist/src/render/blocks/logos.d.ts.map +1 -1
  37. package/dist/src/render/blocks/logos.js +21 -12
  38. package/dist/src/render/blocks/logos.js.map +1 -1
  39. package/dist/src/render/blocks/media-figure.d.ts +10 -6
  40. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  41. package/dist/src/render/blocks/media-figure.js +18 -13
  42. package/dist/src/render/blocks/media-figure.js.map +1 -1
  43. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  44. package/dist/src/render/blocks/pricing-table.js +15 -11
  45. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  46. package/dist/src/render/blocks/prose.d.ts +9 -3
  47. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  48. package/dist/src/render/blocks/prose.js +11 -4
  49. package/dist/src/render/blocks/prose.js.map +1 -1
  50. package/dist/src/render/blocks/quote.d.ts +10 -10
  51. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  52. package/dist/src/render/blocks/quote.js +14 -13
  53. package/dist/src/render/blocks/quote.js.map +1 -1
  54. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
  55. package/dist/src/render/blocks/stat-counter.js +11 -13
  56. package/dist/src/render/blocks/stat-counter.js.map +1 -1
  57. package/dist/src/render/blocks/stats.d.ts.map +1 -1
  58. package/dist/src/render/blocks/stats.js +12 -13
  59. package/dist/src/render/blocks/stats.js.map +1 -1
  60. package/dist/src/render/blocks/testimonial.d.ts +9 -9
  61. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  62. package/dist/src/render/blocks/testimonial.js +15 -14
  63. package/dist/src/render/blocks/testimonial.js.map +1 -1
  64. package/dist/src/render/chrome.d.ts +3 -1
  65. package/dist/src/render/chrome.d.ts.map +1 -1
  66. package/dist/src/render/chrome.js +71 -46
  67. package/dist/src/render/chrome.js.map +1 -1
  68. package/dist/src/render/layout.d.ts +26 -0
  69. package/dist/src/render/layout.d.ts.map +1 -0
  70. package/dist/src/render/layout.js +51 -0
  71. package/dist/src/render/layout.js.map +1 -0
  72. package/dist/src/render/render-block.d.ts.map +1 -1
  73. package/dist/src/render/render-block.js +23 -2
  74. package/dist/src/render/render-block.js.map +1 -1
  75. package/dist/src/render/term-archive.d.ts +8 -6
  76. package/dist/src/render/term-archive.d.ts.map +1 -1
  77. package/dist/src/render/term-archive.js +22 -16
  78. package/dist/src/render/term-archive.js.map +1 -1
  79. package/dist/src/render/widget-areas.d.ts +13 -0
  80. package/dist/src/render/widget-areas.d.ts.map +1 -0
  81. package/dist/src/render/widget-areas.js +20 -0
  82. package/dist/src/render/widget-areas.js.map +1 -0
  83. package/dist/theme.config.js +2 -2
  84. package/dist/theme.config.js.map +1 -1
  85. package/package.json +5 -5
  86. package/src/index.ts +1 -0
  87. package/src/render/blocks/accordion.ts +32 -27
  88. package/src/render/blocks/collection-list.ts +84 -53
  89. package/src/render/blocks/cta.ts +27 -28
  90. package/src/render/blocks/embed.ts +46 -43
  91. package/src/render/blocks/faq.ts +25 -21
  92. package/src/render/blocks/feature-grid.ts +42 -35
  93. package/src/render/blocks/gallery.ts +21 -16
  94. package/src/render/blocks/hero.ts +40 -28
  95. package/src/render/blocks/logo-strip.ts +26 -16
  96. package/src/render/blocks/logos.ts +33 -17
  97. package/src/render/blocks/media-figure.ts +22 -14
  98. package/src/render/blocks/pricing-table.ts +26 -15
  99. package/src/render/blocks/prose.ts +18 -4
  100. package/src/render/blocks/quote.ts +18 -14
  101. package/src/render/blocks/stat-counter.ts +25 -20
  102. package/src/render/blocks/stats.ts +31 -21
  103. package/src/render/blocks/testimonial.ts +22 -18
  104. package/src/render/chrome.ts +84 -49
  105. package/src/render/layout.ts +67 -0
  106. package/src/render/render-block.ts +24 -1
  107. package/src/render/term-archive.ts +54 -50
  108. package/src/render/widget-areas.ts +23 -0
  109. package/src/styles/archive.css +135 -38
  110. package/src/styles/base.css +553 -426
  111. package/src/styles/blocks.css +1192 -1000
  112. package/src/styles/theme.css +18 -24
  113. package/src/styles/tokens.css +162 -192
  114. package/src/styles/widgets.css +913 -0
  115. package/tokens.json +17 -17
@@ -1,143 +1,74 @@
1
1
  /*
2
- * The seventeen vocabulary blocks (`blocks@2.0`, RFC 0001) — this theme's
3
- * own layouts.
2
+ * The seventeen vocabulary blocks, each placed on the twelve-column grid.
4
3
  *
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.
4
+ * Breakpoints: 40rem (two columns become possible) and 64rem (the full
5
+ * twelve-column composition). Below 40rem every block is a single column
6
+ * with the same rhythm and the same hairlines.
8
7
  */
9
8
 
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 {
9
+ /* Shared resets for the lists and figures the blocks are built from, at zero
10
+ specificity: a figure that is also the grid container keeps its gutter. */
11
+ :where(.cg-section) :where(ul, ol, dl, figure, blockquote, dd) {
77
12
  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;
13
+ padding: 0;
83
14
  }
84
15
 
85
- @media (min-width: 60rem) {
86
- .cg-hero__title {
87
- font-size: calc(var(--cg-text-3xl) * 1.2);
88
- }
16
+ :where(.cg-section) :where(ul, ol) {
17
+ list-style: none;
89
18
  }
90
19
 
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;
20
+ /* Greyscale client marks: dark on paper, lifted on ink. */
21
+ .cg-logo-strip__logo,
22
+ .cg-clients__logo {
23
+ filter: grayscale(1);
24
+ opacity: 0.82;
98
25
  }
99
26
 
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);
27
+ @media (prefers-color-scheme: dark) {
28
+ :where(:root:not([data-theme="light"])) .cg-logo-strip__logo,
29
+ :where(:root:not([data-theme="light"])) .cg-clients__logo {
30
+ filter: grayscale(1) invert(1);
31
+ opacity: 0.78;
32
+ }
108
33
  }
109
34
 
110
- .cg-hero__media {
111
- inline-size: 100%;
112
- border-radius: var(--cg-radius-md);
35
+ :where(:root[data-theme="dark"]) .cg-logo-strip__logo,
36
+ :where(:root[data-theme="dark"]) .cg-clients__logo {
37
+ filter: grayscale(1) invert(1);
38
+ opacity: 0.78;
113
39
  }
114
40
 
115
- /* --- entry header (`renderEntryHeader`, `@cogenta/theme-kit`) ------------- */
41
+ /* --------------------------------------------------------------------------
42
+ Entry header (contract D `theme@1.4`): a service, a case study, a page.
43
+ -------------------------------------------------------------------------- */
116
44
 
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
45
  .cg-entry-header {
124
- max-inline-size: var(--cg-page);
46
+ display: grid;
47
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
48
+ column-gap: var(--cg-col-gap);
49
+ max-inline-size: calc(var(--cg-page) + var(--cg-gutter) * 2);
125
50
  margin-inline: auto;
126
- margin-block: var(--cg-section-y) var(--cg-s10);
127
- padding-inline: var(--cg-gutter);
51
+ /* No bottom padding: the section that follows brings its own half step. */
52
+ padding: calc(var(--cg-section) * 0.4) var(--cg-gutter) 0;
53
+ }
54
+
55
+ .cg-entry-header > * {
56
+ grid-column: 1 / -1;
57
+ min-inline-size: 0;
128
58
  }
129
59
 
130
60
  .cg-entry-header__terms {
131
61
  display: flex;
132
62
  flex-wrap: wrap;
133
- gap: var(--cg-s3);
134
- margin: 0 0 var(--cg-s4);
63
+ gap: var(--cg-s2) var(--cg-s5);
64
+ margin: 0 0 var(--cg-s6);
135
65
  padding: 0;
136
66
  list-style: none;
137
67
  font-size: var(--cg-text-xs);
138
- font-weight: var(--cg-weight-semibold);
139
- letter-spacing: var(--cg-tracking-wide);
68
+ font-weight: var(--cg-weight-medium);
69
+ letter-spacing: var(--cg-tracking-label);
140
70
  text-transform: uppercase;
71
+ color: var(--cg-ink-muted);
141
72
  }
142
73
 
143
74
  .cg-entry-header__terms a {
@@ -150,1284 +81,1545 @@
150
81
  }
151
82
 
152
83
  .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;
84
+ max-inline-size: 20ch;
85
+ font-size: var(--cg-size-display);
86
+ line-height: var(--cg-leading-display);
87
+ letter-spacing: var(--cg-tracking-display);
159
88
  }
160
89
 
161
90
  .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);
91
+ margin: var(--cg-s8) 0 0;
92
+ max-inline-size: 46ch;
93
+ font-size: var(--cg-size-lead);
94
+ line-height: 1.45;
166
95
  color: var(--cg-ink-muted);
167
- text-wrap: pretty;
168
96
  }
169
97
 
170
98
  .cg-entry-header__meta {
171
99
  display: flex;
172
100
  flex-wrap: wrap;
173
- align-items: center;
174
- gap: var(--cg-s4);
175
- margin: var(--cg-s6) 0 0;
101
+ gap: var(--cg-s2) var(--cg-s6);
102
+ margin: var(--cg-s10) 0 0;
176
103
  padding-block-start: var(--cg-s4);
177
- border-block-start: 1px solid var(--cg-line-soft);
104
+ border-block-start: var(--cg-rule) solid var(--cg-line);
178
105
  font-size: var(--cg-text-sm);
179
106
  color: var(--cg-ink-muted);
107
+ font-variant-numeric: lining-nums tabular-nums;
180
108
  }
181
109
 
182
110
  .cg-entry-header__author {
183
- font-weight: var(--cg-weight-semibold);
184
111
  color: var(--cg-ink);
185
112
  }
186
113
 
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
114
  .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);
115
+ margin: var(--cg-s12) 0 0;
198
116
  }
199
117
 
200
118
  .cg-entry-header__cover img,
201
119
  .cg-entry-header__cover video {
202
120
  inline-size: 100%;
203
- aspect-ratio: 16 / 9;
121
+ aspect-ratio: 3 / 2;
122
+ object-fit: cover;
204
123
  }
205
124
 
206
- /* --- prose --------------------------------------------------------------- */
125
+ @media (min-width: 64rem) {
126
+ .cg-entry-header__title {
127
+ grid-column: 1 / span 10;
128
+ }
207
129
 
208
- .cg-prose {
209
- max-inline-size: var(--cg-measure);
210
- margin-inline: auto;
211
- line-height: var(--cg-leading-relaxed);
212
- }
130
+ .cg-entry-header__excerpt {
131
+ grid-column: 1 / span 7;
132
+ }
213
133
 
214
- .cg-prose > :first-child {
215
- margin-block-start: 0;
134
+ .cg-entry-header__cover img,
135
+ .cg-entry-header__cover video {
136
+ aspect-ratio: 21 / 9;
137
+ }
216
138
  }
217
139
 
218
- .cg-prose > :last-child {
219
- margin-block-end: 0;
140
+ /* --------------------------------------------------------------------------
141
+ hero
142
+ -------------------------------------------------------------------------- */
143
+
144
+ .cg-hero__inner {
145
+ row-gap: var(--cg-s10);
220
146
  }
221
147
 
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);
148
+ .cg-hero__eyebrow {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: var(--cg-s3);
228
152
  text-wrap: balance;
153
+ margin: 0 0 var(--cg-s8);
154
+ font-size: var(--cg-text-xs);
155
+ font-weight: var(--cg-weight-medium);
156
+ letter-spacing: var(--cg-tracking-label);
157
+ text-transform: uppercase;
158
+ color: var(--cg-ink-muted);
229
159
  }
230
160
 
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);
161
+ .cg-hero__eyebrow::before {
162
+ content: "";
163
+ flex: none;
164
+ inline-size: var(--cg-s8);
165
+ block-size: var(--cg-rule);
166
+ background: var(--cg-accent);
237
167
  }
238
168
 
239
- .cg-prose h3 {
240
- margin-block: var(--cg-s10) var(--cg-s3);
241
- font-size: var(--cg-text-lg);
169
+ .cg-hero__title {
170
+ max-inline-size: 17ch;
171
+ font-size: var(--cg-size-display);
172
+ font-weight: var(--cg-weight-regular);
173
+ line-height: var(--cg-leading-display);
174
+ letter-spacing: var(--cg-tracking-display);
242
175
  }
243
176
 
244
- .cg-prose h4 {
245
- margin-block: var(--cg-s8) var(--cg-s2);
246
- font-size: var(--cg-text-md);
177
+ .cg-hero__subtitle {
178
+ margin: 0;
179
+ max-inline-size: 38ch;
180
+ font-size: var(--cg-size-lead);
181
+ line-height: 1.45;
182
+ color: var(--cg-ink-muted);
247
183
  }
248
184
 
249
- .cg-prose p {
250
- margin-block: var(--cg-s5);
251
- text-wrap: pretty;
185
+ .cg-hero__aside .cg-actions {
186
+ margin-block-start: var(--cg-s8);
252
187
  }
253
188
 
254
- .cg-prose ul,
255
- .cg-prose ol {
256
- margin-block: var(--cg-s5);
257
- padding-inline-start: var(--cg-s6);
189
+ .cg-hero__image {
190
+ inline-size: 100%;
191
+ aspect-ratio: 4 / 3;
192
+ object-fit: cover;
258
193
  }
259
194
 
260
- .cg-prose li {
261
- margin-block: var(--cg-s2);
262
- padding-inline-start: var(--cg-s1);
263
- }
195
+ @media (min-width: 64rem) {
196
+ .cg-hero__inner {
197
+ row-gap: var(--cg-s16);
198
+ }
264
199
 
265
- .cg-prose li::marker {
266
- color: var(--cg-accent);
267
- font-weight: var(--cg-weight-bold);
268
- }
200
+ .cg-hero__intro {
201
+ grid-column: 1 / span 11;
202
+ }
269
203
 
270
- .cg-prose strong {
271
- font-weight: var(--cg-weight-semibold);
272
- color: var(--cg-ink);
273
- }
204
+ .cg-hero__aside {
205
+ grid-column: 1 / span 4;
206
+ grid-row: 2;
207
+ }
274
208
 
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
- }
209
+ .cg-hero__media {
210
+ grid-column: 6 / -1;
211
+ grid-row: 2;
212
+ }
287
213
 
288
- .cg-prose blockquote > :first-child {
289
- margin-block-start: 0;
290
- }
214
+ .cg-hero__image {
215
+ aspect-ratio: 3 / 2;
216
+ }
291
217
 
292
- .cg-prose blockquote > :last-child {
293
- margin-block-end: 0;
218
+ .cg-hero[data-media="none"] .cg-hero__aside {
219
+ grid-column: 6 / span 6;
220
+ align-self: start;
221
+ }
294
222
  }
295
223
 
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
- }
224
+ /* --------------------------------------------------------------------------
225
+ logoStrip: a label, then one even row of marks, between hairlines.
226
+ -------------------------------------------------------------------------- */
304
227
 
305
- .cg-prose__figure {
306
- margin-block: var(--cg-s8);
307
- margin-inline: 0;
228
+ .cg-logo-strip {
229
+ padding-block: calc(var(--cg-section) / 4) calc(var(--cg-section) / 2);
308
230
  }
309
231
 
310
- .cg-prose__figure img {
311
- inline-size: 100%;
312
- border-radius: var(--cg-radius-md);
313
- box-shadow: var(--cg-ring);
232
+ .cg-logo-strip__inner {
233
+ row-gap: 0;
314
234
  }
315
235
 
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);
236
+ .cg-logo-strip__inner::before,
237
+ .cg-logo-strip__inner::after {
238
+ content: "";
239
+ grid-column: 1 / -1;
240
+ block-size: var(--cg-rule);
241
+ background: var(--cg-line);
321
242
  }
322
243
 
323
- /* --- mediaFigure ----------------------------------------------------- */
324
-
325
- .cg-figure {
326
- margin-inline: auto;
244
+ .cg-logo-strip__caption {
245
+ padding-block: var(--cg-s6) 0;
246
+ font-size: var(--cg-text-xs);
247
+ font-weight: var(--cg-weight-medium);
248
+ letter-spacing: var(--cg-tracking-label);
249
+ text-transform: uppercase;
250
+ color: var(--cg-ink-muted);
327
251
  }
328
252
 
329
- .cg-figure[data-align="start"],
330
- .cg-figure[data-align="end"] {
331
- max-inline-size: calc(var(--cg-measure) / 2);
253
+ .cg-logo-strip__items {
254
+ display: grid;
255
+ grid-template-columns: repeat(3, minmax(0, 1fr));
256
+ align-items: center;
257
+ gap: var(--cg-s4) var(--cg-col-gap);
258
+ padding-block: var(--cg-s6);
332
259
  }
333
260
 
334
- .cg-figure[data-align="start"] {
335
- float: inline-start;
336
- margin-inline-end: var(--cg-s6);
261
+ .cg-logo-strip__logo {
262
+ inline-size: 100%;
263
+ block-size: clamp(2.5rem, 4vw, 3.5rem);
264
+ object-fit: contain;
337
265
  }
338
266
 
339
- .cg-figure[data-align="end"] {
340
- float: inline-end;
341
- margin-inline-start: var(--cg-s6);
267
+ @media (min-width: 64rem) {
268
+ .cg-logo-strip__caption {
269
+ grid-column: 1 / span 2;
270
+ grid-row: 2;
271
+ align-self: center;
272
+ padding-block: 0;
273
+ max-inline-size: 12ch;
274
+ }
275
+
276
+ .cg-logo-strip__items {
277
+ grid-column: 3 / -1;
278
+ grid-row: 2;
279
+ grid-template-columns: none;
280
+ grid-auto-flow: column;
281
+ grid-auto-columns: minmax(0, 1fr);
282
+ padding-block: var(--cg-s8);
283
+ }
342
284
  }
343
285
 
344
- .cg-figure[data-align="full"] {
345
- max-inline-size: none;
346
- padding-inline: 0;
286
+ /* --------------------------------------------------------------------------
287
+ featureGrid: numbered practices between hairlines.
288
+ -------------------------------------------------------------------------- */
289
+
290
+ .cg-practices__items {
291
+ border-block-start: var(--cg-rule) solid var(--cg-line);
347
292
  }
348
293
 
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);
294
+ .cg-practice {
295
+ position: relative;
296
+ display: grid;
297
+ grid-template-columns: var(--cg-s10) minmax(0, 1fr);
298
+ column-gap: var(--cg-s3);
299
+ row-gap: var(--cg-s3);
300
+ padding-block: var(--cg-s6) var(--cg-s8);
301
+ border-block-end: var(--cg-rule) solid var(--cg-line);
357
302
  }
358
303
 
359
- .cg-figure[data-align="full"] .cg-figure__frame {
360
- padding: 0;
361
- border: 0;
362
- border-radius: 0;
304
+ .cg-practice__index {
305
+ grid-row: 1 / span 2;
306
+ padding-block-start: 0.5em;
307
+ font-size: var(--cg-text-xs);
308
+ font-weight: var(--cg-weight-medium);
309
+ letter-spacing: 0.04em;
310
+ font-variant-numeric: lining-nums tabular-nums;
311
+ color: var(--cg-ink-subtle);
363
312
  }
364
313
 
365
- .cg-figure__media {
366
- inline-size: 100%;
367
- aspect-ratio: var(--cg-ratio, auto);
368
- border-radius: var(--cg-radius-sm);
314
+ .cg-practice__title {
315
+ font-size: var(--cg-size-subheading);
316
+ line-height: 1.15;
369
317
  }
370
318
 
371
- .cg-figure[data-align="full"] .cg-figure__media {
372
- border-radius: 0;
319
+ .cg-practice__link {
320
+ color: var(--cg-ink);
321
+ text-decoration: none;
373
322
  }
374
323
 
375
- .cg-figure__caption {
376
- margin-block-start: var(--cg-s4);
324
+ .cg-practice__link .cg-arrow {
325
+ margin-inline-start: 0.35em;
326
+ inline-size: 0.7em;
327
+ block-size: 0.7em;
328
+ vertical-align: 0.02em;
377
329
  color: var(--cg-ink-subtle);
378
- font-size: var(--cg-text-sm);
379
- line-height: var(--cg-leading-normal);
380
- text-wrap: pretty;
330
+ transition: color var(--cg-duration) var(--cg-ease);
381
331
  }
382
332
 
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);
333
+ .cg-practice__link::after {
334
+ content: "";
335
+ position: absolute;
336
+ inset: 0;
387
337
  }
388
338
 
389
- .cg-figure__credit {
390
- color: var(--cg-ink-subtle);
339
+ .cg-practice[data-linked="true"]:hover .cg-practice__link,
340
+ .cg-practice[data-linked="true"]:hover .cg-arrow {
341
+ color: var(--cg-accent);
391
342
  }
392
343
 
393
- .cg-figure__credit::before {
394
- content: " — ";
344
+ .cg-practice__text {
345
+ grid-column: 2;
346
+ margin: 0;
347
+ max-inline-size: 52ch;
348
+ color: var(--cg-ink-muted);
395
349
  }
396
350
 
397
- /* --- featureGrid → "our services" ------------------------------------ */
351
+ @media (min-width: 40rem) {
352
+ .cg-practice {
353
+ grid-template-columns: var(--cg-s12) minmax(0, 5fr) minmax(0, 6fr);
354
+ column-gap: var(--cg-col-gap);
355
+ }
398
356
 
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;
357
+ .cg-practice__index {
358
+ grid-row: auto;
359
+ }
360
+
361
+ .cg-practice__text {
362
+ grid-column: 3;
363
+ }
406
364
  }
407
365
 
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
366
  @media (min-width: 64rem) {
412
- .cg-services__items {
413
- grid-template-columns: repeat(3, 1fr);
367
+ .cg-practices[data-titled="true"] .cg-practices__items {
368
+ grid-column: 5 / -1;
414
369
  }
415
370
  }
416
371
 
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);
372
+ /* --------------------------------------------------------------------------
373
+ stats: one typographic row between vertical rules.
374
+ -------------------------------------------------------------------------- */
375
+
376
+ .cg-stats .cg-head {
377
+ margin-block-end: var(--cg-s8);
425
378
  }
426
379
 
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);
380
+ .cg-stats__items {
381
+ display: grid;
382
+ grid-template-columns: repeat(2, minmax(0, 1fr));
383
+ border-block-end: var(--cg-rule) solid var(--cg-line);
430
384
  }
431
385
 
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);
386
+ .cg-stats__items:first-child {
387
+ border-block-start: var(--cg-rule) solid var(--cg-line);
445
388
  }
446
389
 
447
- .cg-service__icon svg {
448
- inline-size: 1.35rem;
449
- block-size: 1.35rem;
390
+ .cg-stat {
391
+ display: flex;
392
+ flex-direction: column-reverse;
393
+ justify-content: flex-end;
394
+ gap: var(--cg-s3);
395
+ padding: var(--cg-s6) var(--cg-s4) var(--cg-s8);
396
+ border-inline-start: var(--cg-rule) solid var(--cg-line);
450
397
  }
451
398
 
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);
399
+ .cg-stat:nth-child(odd) {
400
+ padding-inline-start: 0;
401
+ border-inline-start: 0;
458
402
  }
459
403
 
460
- .cg-service__link {
461
- color: inherit;
462
- text-decoration: none;
404
+ .cg-stat:nth-child(n + 3) {
405
+ border-block-start: var(--cg-rule) solid var(--cg-line);
463
406
  }
464
407
 
465
- .cg-service:hover .cg-service__link {
466
- color: var(--cg-accent);
408
+ .cg-stat__value {
409
+ font-family: var(--cg-font-display);
410
+ font-size: var(--cg-size-figure);
411
+ font-weight: var(--cg-weight-light);
412
+ line-height: 1;
413
+ letter-spacing: -0.02em;
414
+ font-variant-numeric: lining-nums tabular-nums;
415
+ color: var(--cg-ink);
467
416
  }
468
417
 
469
- .cg-service__text {
470
- margin: 0;
418
+ .cg-stat__unit {
419
+ margin-inline-start: 0.06em;
420
+ font-size: 0.62em;
421
+ letter-spacing: 0;
422
+ }
423
+
424
+ .cg-stat__label {
425
+ max-inline-size: 24ch;
426
+ font-size: var(--cg-text-sm);
427
+ line-height: 1.45;
471
428
  color: var(--cg-ink-muted);
472
- line-height: var(--cg-leading-relaxed);
473
- text-wrap: pretty;
474
429
  }
475
430
 
476
- /* --- cta → premium banner ---------------------------------------------- */
431
+ @media (min-width: 64rem) {
432
+ .cg-stats__items {
433
+ grid-template-columns: none;
434
+ grid-auto-flow: column;
435
+ grid-auto-columns: minmax(0, 1fr);
436
+ }
437
+
438
+ .cg-stat,
439
+ .cg-stat:nth-child(odd) {
440
+ padding: var(--cg-s8) var(--cg-col-gap) var(--cg-s10);
441
+ border-inline-start: var(--cg-rule) solid var(--cg-line);
442
+ }
477
443
 
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);
444
+ .cg-stat:first-child {
445
+ padding-inline-start: 0;
446
+ border-inline-start: 0;
447
+ }
448
+
449
+ .cg-stat:nth-child(n + 3) {
450
+ border-block-start: 0;
451
+ }
487
452
  }
488
453
 
489
- .cg-banner__inner {
454
+ /* --------------------------------------------------------------------------
455
+ statCounter: a ruled two-by-two table beside its title.
456
+ -------------------------------------------------------------------------- */
457
+
458
+ .cg-counters__items {
490
459
  display: grid;
491
- gap: var(--cg-s8);
492
- max-inline-size: var(--cg-page);
493
- margin-inline: auto;
460
+ grid-template-columns: repeat(2, minmax(0, 1fr));
461
+ column-gap: var(--cg-col-gap);
494
462
  }
495
463
 
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
- }
464
+ .cg-counter {
465
+ display: flex;
466
+ flex-direction: column-reverse;
467
+ justify-content: flex-end;
468
+ gap: var(--cg-s2);
469
+ padding-block: var(--cg-s5) var(--cg-s10);
470
+ border-block-start: var(--cg-rule) solid var(--cg-line);
507
471
  }
508
472
 
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;
473
+ .cg-counter__value {
474
+ font-family: var(--cg-font-display);
475
+ font-size: var(--cg-size-figure);
476
+ font-weight: var(--cg-weight-light);
477
+ line-height: 1;
478
+ letter-spacing: -0.02em;
479
+ font-variant-numeric: lining-nums tabular-nums;
516
480
  }
517
481
 
518
- .cg-banner__text {
519
- margin: var(--cg-s4) 0 0;
520
- max-inline-size: var(--cg-measure-narrow);
482
+ .cg-counter__label {
483
+ max-inline-size: 28ch;
484
+ font-size: var(--cg-text-sm);
521
485
  color: var(--cg-ink-muted);
522
- font-size: var(--cg-text-lg);
523
- line-height: var(--cg-leading-relaxed);
524
- text-wrap: pretty;
525
486
  }
526
487
 
527
- .cg-banner__actions .cg-actions {
528
- margin-block-start: 0;
488
+ @media (min-width: 64rem) {
489
+ .cg-counters[data-titled="true"] .cg-counters__items {
490
+ grid-column: 5 / -1;
491
+ }
529
492
  }
530
493
 
531
- /* --- gallery ----------------------------------------------------------- */
494
+ /* --------------------------------------------------------------------------
495
+ collectionList
496
+ -------------------------------------------------------------------------- */
532
497
 
533
- .cg-gallery__items {
534
- display: grid;
535
- gap: var(--cg-gap-tight);
536
- grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
498
+ .cg-entry {
499
+ position: relative;
537
500
  }
538
501
 
539
- .cg-gallery__item {
540
- overflow: hidden;
541
- border: 1px solid var(--cg-line);
542
- border-radius: var(--cg-radius-sm);
502
+ .cg-entry__media {
503
+ display: block;
543
504
  }
544
505
 
545
- .cg-gallery__item img {
506
+ .cg-entry__image {
546
507
  inline-size: 100%;
547
- block-size: 100%;
548
- transition: transform var(--cg-duration-slow) var(--cg-ease);
508
+ aspect-ratio: 3 / 2;
509
+ object-fit: cover;
549
510
  }
550
511
 
551
- .cg-gallery__item:hover img {
552
- transform: scale(1.03);
512
+ .cg-entry__body {
513
+ padding-block-start: var(--cg-s4);
514
+ border-block-start: var(--cg-rule) solid var(--cg-line);
553
515
  }
554
516
 
555
- .cg-gallery:not([data-layout="masonry"]) .cg-gallery__item img {
556
- aspect-ratio: 3 / 2;
517
+ .cg-entry__meta {
518
+ display: flex;
519
+ gap: var(--cg-s4);
520
+ margin: 0 0 var(--cg-s3);
521
+ font-size: var(--cg-text-xs);
522
+ font-weight: var(--cg-weight-medium);
523
+ letter-spacing: var(--cg-tracking-label);
524
+ text-transform: uppercase;
525
+ font-variant-numeric: lining-nums tabular-nums;
526
+ color: var(--cg-ink-subtle);
557
527
  }
558
528
 
559
- .cg-gallery[data-layout="masonry"] .cg-gallery__items {
560
- display: block;
561
- columns: 3 15rem;
562
- column-gap: var(--cg-gap-tight);
529
+ .cg-entry__title {
530
+ font-size: var(--cg-text-xl);
531
+ line-height: 1.18;
563
532
  }
564
533
 
565
- .cg-gallery[data-layout="masonry"] .cg-gallery__item {
566
- break-inside: avoid;
567
- margin-block-end: var(--cg-gap-tight);
534
+ .cg-entry__link {
535
+ color: var(--cg-ink);
536
+ text-decoration-line: underline;
537
+ text-decoration-thickness: var(--cg-rule);
538
+ text-decoration-color: transparent;
539
+ text-underline-offset: 0.18em;
540
+ transition:
541
+ color var(--cg-duration) var(--cg-ease),
542
+ text-decoration-color var(--cg-duration) var(--cg-ease);
568
543
  }
569
544
 
570
- .cg-gallery[data-layout="carousel"] .cg-gallery__items {
571
- display: grid;
572
- grid-auto-flow: column;
573
- grid-auto-columns: minmax(17rem, 42%);
545
+ .cg-entry__link::after {
546
+ content: "";
547
+ position: absolute;
548
+ inset: 0;
574
549
  }
575
550
 
576
- .cg-gallery[data-layout="carousel"] .cg-gallery__item {
577
- scroll-snap-align: start;
551
+ .cg-entry:hover .cg-entry__link,
552
+ .cg-entry__link:focus-visible {
553
+ color: var(--cg-accent);
554
+ text-decoration-color: currentColor;
578
555
  }
579
556
 
580
- /* --- quote → testimonial card ------------------------------------------- */
557
+ .cg-entry__excerpt {
558
+ margin: var(--cg-s3) 0 0;
559
+ max-inline-size: 46ch;
560
+ color: var(--cg-ink-muted);
561
+ }
581
562
 
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);
563
+ /* The arrow sits after the title's last word, inside the same link. As an
564
+ inline-block it does not inherit the title's underline. */
565
+ .cg-entry__arrow {
566
+ display: inline-block;
567
+ margin-inline-start: 0.3em;
568
+ font-size: 0.72em;
569
+ vertical-align: 0.05em;
570
+ color: var(--cg-ink-subtle);
571
+ transition: color var(--cg-duration) var(--cg-ease);
591
572
  }
592
573
 
593
- .cg-quote__text {
574
+ .cg-entry__arrow .cg-arrow {
575
+ vertical-align: baseline;
576
+ }
577
+
578
+ .cg-entry:hover .cg-entry__arrow {
579
+ color: var(--cg-accent);
580
+ }
581
+
582
+ .cg-collection__empty {
594
583
  margin: 0;
595
- font-family: var(--cogenta-font-serif);
584
+ padding-block: var(--cg-s10);
585
+ border-block: var(--cg-rule) solid var(--cg-line);
586
+ font-family: var(--cg-font-display);
596
587
  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;
588
+ color: var(--cg-ink-muted);
601
589
  }
602
590
 
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;
591
+ /* list: alternating case-study rows. */
592
+ .cg-collection[data-layout="list"] .cg-collection__items {
593
+ display: grid;
594
+ row-gap: var(--cg-s16);
613
595
  }
614
596
 
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);
597
+ .cg-collection[data-layout="list"] .cg-entry {
598
+ display: grid;
599
+ gap: var(--cg-s5);
620
600
  }
621
601
 
622
- .cg-quote__who {
623
- display: flex;
624
- flex-direction: column;
602
+ .cg-collection[data-layout="list"] .cg-entry__title {
603
+ font-size: var(--cg-size-subheading);
625
604
  }
626
605
 
627
- .cg-quote__author {
628
- font-weight: var(--cg-weight-semibold);
629
- color: var(--cg-ink);
630
- }
606
+ @media (min-width: 64rem) {
607
+ .cg-collection[data-layout="list"] .cg-collection__items {
608
+ row-gap: calc(var(--cg-section) * 0.6);
609
+ }
631
610
 
632
- /* --- faq → numbered accordion ------------------------------------------- */
611
+ .cg-collection[data-layout="list"] .cg-entry {
612
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
613
+ column-gap: var(--cg-col-gap);
614
+ align-items: start;
615
+ }
633
616
 
634
- .cg-faq {
635
- max-inline-size: var(--cg-page-narrow);
636
- margin-inline: auto;
637
- }
617
+ .cg-collection[data-layout="list"] .cg-entry__media {
618
+ grid-column: 1 / span 7;
619
+ grid-row: 1;
620
+ }
621
+
622
+ .cg-collection[data-layout="list"] .cg-entry__body {
623
+ grid-column: 9 / span 4;
624
+ grid-row: 1;
625
+ }
626
+
627
+ .cg-collection[data-layout="list"] .cg-entry:nth-child(even) .cg-entry__media {
628
+ grid-column: 6 / span 7;
629
+ }
630
+
631
+ .cg-collection[data-layout="list"] .cg-entry:nth-child(even) .cg-entry__body {
632
+ grid-column: 1 / span 4;
633
+ }
638
634
 
639
- .cg-faq__item {
640
- border-block-start: 1px solid var(--cg-line-soft);
635
+ /* No picture: a typographic row, title on the left, summary on the right. */
636
+ .cg-collection[data-layout="list"] .cg-entry[data-media="none"] .cg-entry__body,
637
+ .cg-collection[data-layout="list"] .cg-entry[data-media="none"]:nth-child(even) .cg-entry__body {
638
+ grid-column: 1 / -1;
639
+ display: grid;
640
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
641
+ column-gap: var(--cg-col-gap);
642
+ align-items: start;
643
+ }
644
+
645
+ .cg-collection[data-layout="list"] .cg-entry[data-media="none"] .cg-entry__meta {
646
+ grid-column: 1 / span 2;
647
+ grid-row: 1 / span 2;
648
+ padding-block-start: 0.6em;
649
+ }
650
+
651
+ .cg-collection[data-layout="list"] .cg-entry[data-media="none"] .cg-entry__title {
652
+ grid-column: 3 / span 5;
653
+ grid-row: 1 / span 2;
654
+ }
655
+
656
+ .cg-collection[data-layout="list"] .cg-entry[data-media="none"] .cg-entry__excerpt {
657
+ grid-column: 8 / span 4;
658
+ margin: 0;
659
+ }
641
660
  }
642
661
 
643
- .cg-faq__item:last-child {
644
- border-block-end: 1px solid var(--cg-line-soft);
662
+ /* grid: an editorial index in three columns. */
663
+ .cg-collection[data-layout="grid"] .cg-collection__items {
664
+ display: grid;
665
+ grid-template-columns: minmax(0, 1fr);
666
+ gap: var(--cg-s12) var(--cg-col-gap);
645
667
  }
646
668
 
647
- .cg-faq__question {
669
+ .cg-collection[data-layout="grid"] .cg-entry,
670
+ .cg-collection[data-layout="carousel"] .cg-entry {
648
671
  display: flex;
649
- align-items: baseline;
672
+ flex-direction: column;
650
673
  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
674
  }
657
675
 
658
- .cg-faq__question::-webkit-details-marker {
659
- display: none;
676
+ @media (min-width: 40rem) {
677
+ .cg-collection[data-layout="grid"] .cg-collection__items {
678
+ grid-template-columns: repeat(2, minmax(0, 1fr));
679
+ }
660
680
  }
661
681
 
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;
682
+ @media (min-width: 64rem) {
683
+ .cg-collection[data-layout="grid"] .cg-collection__items {
684
+ grid-template-columns: repeat(3, minmax(0, 1fr));
685
+ }
686
+
687
+ .cg-collection[data-layout="grid"] .cg-collection__items[data-count="2"],
688
+ .cg-collection[data-layout="grid"] .cg-collection__items[data-count="4"] {
689
+ grid-template-columns: repeat(2, minmax(0, 1fr));
690
+ }
668
691
  }
669
692
 
670
- .cg-faq__question-text {
671
- flex: 1;
693
+ /* In a row mixing entries with and without a picture, every text block starts
694
+ on the same line: each entry spans two shared rows (picture, text), and an
695
+ entry with no picture leaves the first one empty rather than pulling its
696
+ text up beside its neighbours' photographs. */
697
+ @supports (grid-template-rows: subgrid) {
698
+ @media (min-width: 40rem) {
699
+ .cg-collection[data-layout="grid"] .cg-entry {
700
+ display: grid;
701
+ grid-row: span 2;
702
+ grid-template-rows: subgrid;
703
+ row-gap: var(--cg-s5);
704
+ }
705
+
706
+ .cg-collection[data-layout="grid"] .cg-entry__body {
707
+ grid-row: 2;
708
+ }
709
+ }
672
710
  }
673
711
 
674
- .cg-faq__question:hover,
675
- .cg-faq__details[open] .cg-faq__question {
676
- color: var(--cg-accent);
712
+ /* carousel: the grid's item, in a scroll-snapping row. */
713
+ .cg-collection__viewport,
714
+ .cg-gallery__viewport {
715
+ overflow-x: auto;
716
+ overscroll-behavior-inline: contain;
717
+ scroll-snap-type: x mandatory;
718
+ scrollbar-width: thin;
719
+ scrollbar-color: var(--cg-line-strong) transparent;
720
+ padding-block-end: var(--cg-s6);
677
721
  }
678
722
 
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);
723
+ .cg-collection[data-layout="carousel"] .cg-collection__items {
724
+ display: grid;
725
+ grid-auto-flow: column;
726
+ grid-auto-columns: min(82%, 26rem);
727
+ gap: var(--cg-col-gap);
707
728
  }
708
729
 
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);
730
+ .cg-collection[data-layout="carousel"] .cg-entry {
731
+ scroll-snap-align: start;
713
732
  }
714
733
 
715
- .cg-faq__answer > :first-child {
716
- margin-block-start: 0;
734
+ /* --------------------------------------------------------------------------
735
+ testimonial: the large pull quote.
736
+ -------------------------------------------------------------------------- */
737
+
738
+ .cg-pullquote__inner {
739
+ row-gap: var(--cg-s10);
717
740
  }
718
741
 
719
- .cg-faq__answer > :last-child {
720
- margin-block-end: 0;
742
+ .cg-pullquote__quote {
743
+ font-family: var(--cg-font-display);
744
+ font-size: var(--cg-size-quote);
745
+ font-weight: var(--cg-weight-light);
746
+ line-height: 1.18;
747
+ letter-spacing: -0.012em;
748
+ color: var(--cg-ink);
749
+ quotes: "\201C" "\201D" "\2018" "\2019";
721
750
  }
722
751
 
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. */
752
+ .cg-pullquote__quote p {
753
+ margin: 0;
754
+ max-inline-size: 34ch;
755
+ }
728
756
 
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);
757
+ .cg-pullquote__quote p + p {
758
+ margin-block-start: 0.6em;
740
759
  }
741
760
 
742
- .cg-metrics__title {
743
- color: var(--cg-accent-fg);
761
+ .cg-pullquote__quote > p:first-child::before {
762
+ content: open-quote;
744
763
  }
745
764
 
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;
765
+ .cg-pullquote__quote > p:last-child::after {
766
+ content: close-quote;
753
767
  }
754
768
 
755
- .cg-metric {
769
+ .cg-pullquote__cite {
756
770
  display: flex;
757
- flex-direction: column;
758
- gap: var(--cg-s2);
771
+ align-items: center;
772
+ gap: var(--cg-s4);
773
+ font-size: var(--cg-text-sm);
774
+ line-height: 1.45;
759
775
  }
760
776
 
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;
777
+ .cg-pullquote__portrait {
778
+ flex: none;
779
+ inline-size: var(--cg-s16);
780
+ block-size: var(--cg-s16);
781
+ object-fit: cover;
782
+ border-radius: var(--cg-radius-portrait);
768
783
  }
769
784
 
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;
785
+ /* Portraits are set in black and white, as a firm prints its people: a row
786
+ of attributions photographed against different backgrounds still reads as
787
+ one set, and no portrait competes with the single accent colour. */
788
+ .cg-pullquote__portrait,
789
+ .cg-quote__portrait {
790
+ filter: grayscale(1);
781
791
  }
782
792
 
783
- @media (min-width: 60rem) {
784
- .cg-metric__value {
785
- font-size: calc(var(--cg-text-3xl) * 1.15);
786
- }
793
+ .cg-pullquote__who,
794
+ .cg-quote__who {
795
+ display: flex;
796
+ flex-direction: column;
787
797
  }
788
798
 
789
- .cg-metric__unit {
790
- font-size: var(--cg-text-lg);
799
+ .cg-pullquote__name,
800
+ .cg-quote__author {
791
801
  font-weight: var(--cg-weight-medium);
792
- opacity: 0.82;
802
+ color: var(--cg-ink);
803
+ }
804
+
805
+ .cg-pullquote__role,
806
+ .cg-quote__role {
807
+ color: var(--cg-ink-muted);
793
808
  }
794
809
 
795
- /* --- logos → "trusted by" strip ------------------------------------------ */
810
+ @media (min-width: 64rem) {
811
+ .cg-pullquote__quote,
812
+ .cg-pullquote__cite {
813
+ grid-column: 3 / span 9;
814
+ }
796
815
 
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;
816
+ /* The opening mark hangs in the margin, so the text itself aligns. */
817
+ .cg-pullquote__quote > p:first-child {
818
+ text-indent: -0.42em;
819
+ }
802
820
  }
803
821
 
804
- .cg-clients__item {
805
- display: flex;
806
- align-items: center;
807
- justify-content: center;
808
- padding: var(--cg-s4);
822
+ /* --------------------------------------------------------------------------
823
+ quote: an editorial quotation in the reading column.
824
+ -------------------------------------------------------------------------- */
825
+
826
+ .cg-quote__text {
827
+ padding-block-start: var(--cg-s6);
828
+ border-block-start: var(--cg-rule) solid var(--cg-ink);
829
+ font-family: var(--cg-font-display);
830
+ font-size: var(--cg-size-subheading);
831
+ font-style: italic;
832
+ line-height: 1.3;
833
+ quotes: "\201C" "\201D" "\2018" "\2019";
809
834
  }
810
835
 
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);
836
+ .cg-quote__text p {
837
+ margin: 0;
838
+ max-inline-size: 44ch;
824
839
  }
825
840
 
826
- .cg-clients__link {
827
- display: inline-flex;
841
+ .cg-quote__text p::before {
842
+ content: open-quote;
843
+ }
844
+
845
+ .cg-quote__text p::after {
846
+ content: close-quote;
847
+ }
848
+
849
+ .cg-quote__cite {
850
+ display: flex;
828
851
  align-items: center;
829
- justify-content: center;
830
- inline-size: 100%;
831
- border-radius: var(--cg-radius-xs);
852
+ gap: var(--cg-s3);
853
+ margin-block-start: var(--cg-s6);
854
+ font-size: var(--cg-text-sm);
855
+ line-height: 1.45;
832
856
  }
833
857
 
834
- .cg-clients__item:hover .cg-clients__logo,
835
- .cg-clients__link:focus-visible .cg-clients__logo {
836
- filter: grayscale(0);
837
- opacity: 1;
858
+ .cg-quote__portrait {
859
+ flex: none;
860
+ inline-size: var(--cg-s12);
861
+ block-size: var(--cg-s12);
862
+ object-fit: cover;
863
+ border-radius: var(--cg-radius-portrait);
838
864
  }
839
865
 
840
- /* --- collectionList → services/insights cards ---------------------------- */
866
+ @media (min-width: 64rem) {
867
+ .cg-quote__text,
868
+ .cg-quote__cite {
869
+ grid-column: 5 / span 7;
870
+ }
871
+ }
841
872
 
842
- .cg-list__items {
843
- display: grid;
873
+ /* --------------------------------------------------------------------------
874
+ faq and accordion: disclosure rows between hairlines.
875
+ -------------------------------------------------------------------------- */
876
+
877
+ .cg-faq__items,
878
+ .cg-accordion__items {
879
+ border-block-start: var(--cg-rule) solid var(--cg-line);
844
880
  }
845
881
 
846
- .cg-list[data-layout="list"] .cg-list__items {
847
- gap: var(--cg-s6);
882
+ .cg-faq__item,
883
+ .cg-accordion__item {
884
+ border-block-end: var(--cg-rule) solid var(--cg-line);
848
885
  }
849
886
 
850
- .cg-list[data-layout="list"] .cg-list__row {
887
+ .cg-faq__question,
888
+ .cg-accordion__question {
851
889
  display: flex;
852
- align-items: flex-start;
890
+ align-items: center;
891
+ justify-content: space-between;
853
892
  gap: var(--cg-s6);
854
- padding-block: var(--cg-s6);
855
- border-block-start: 1px solid var(--cg-line-soft);
893
+ padding-block: var(--cg-s5);
894
+ cursor: pointer;
895
+ list-style: none;
896
+ color: var(--cg-ink);
897
+ transition: color var(--cg-duration) var(--cg-ease);
856
898
  }
857
899
 
858
- .cg-list[data-layout="list"] .cg-list__row:last-child {
859
- border-block-end: 1px solid var(--cg-line-soft);
900
+ .cg-faq__question::-webkit-details-marker,
901
+ .cg-accordion__question::-webkit-details-marker {
902
+ display: none;
860
903
  }
861
904
 
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);
905
+ .cg-faq__question:hover,
906
+ .cg-accordion__question:hover {
907
+ color: var(--cg-accent);
873
908
  }
874
909
 
875
- .cg-list__cover-image {
876
- inline-size: 100%;
877
- block-size: 100%;
910
+ .cg-faq__question-text {
911
+ font-size: var(--cg-text-lg);
912
+ line-height: var(--cg-leading-snug);
878
913
  }
879
914
 
880
- .cg-list[data-layout="list"] .cg-list__cover {
915
+ .cg-toggle-mark {
916
+ position: relative;
881
917
  flex: none;
882
- inline-size: 9rem;
918
+ inline-size: 0.875rem;
919
+ block-size: 0.875rem;
883
920
  }
884
921
 
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);
922
+ .cg-toggle-mark::before,
923
+ .cg-toggle-mark::after {
924
+ content: "";
925
+ position: absolute;
926
+ inset-inline: 0;
927
+ inset-block-start: calc(50% - 0.75px);
928
+ block-size: 1.5px;
929
+ background: currentColor;
889
930
  }
890
931
 
891
- .cg-list[data-layout="grid"] .cg-list__items {
892
- grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
932
+ .cg-toggle-mark::after {
933
+ transform: rotate(90deg);
893
934
  }
894
935
 
895
- .cg-list[data-layout="carousel"] .cg-list__items {
896
- grid-auto-flow: column;
897
- grid-auto-columns: minmax(17rem, 45%);
936
+ details[open] > summary .cg-toggle-mark::after {
937
+ transform: none;
898
938
  }
899
939
 
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);
940
+ .cg-faq__answer,
941
+ .cg-accordion__answer {
942
+ padding-block-end: var(--cg-s8);
943
+ color: var(--cg-ink-muted);
910
944
  }
911
945
 
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);
946
+ .cg-faq__answer > *,
947
+ .cg-accordion__answer > * {
948
+ margin: 0;
949
+ max-inline-size: 62ch;
915
950
  }
916
951
 
917
- .cg-list[data-layout="carousel"] .cg-list__row {
918
- scroll-snap-align: start;
952
+ .cg-faq__answer > * + *,
953
+ .cg-accordion__answer > * + * {
954
+ margin-block-start: 0.8em;
919
955
  }
920
956
 
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;
957
+ @media (min-width: 64rem) {
958
+ .cg-faq[data-titled="true"] .cg-faq__items {
959
+ grid-column: 5 / -1;
960
+ }
927
961
  }
928
962
 
929
- .cg-list__body {
930
- display: flex;
931
- flex-direction: column;
932
- gap: var(--cg-s2);
963
+ .cg-accordion__question {
964
+ display: grid;
965
+ grid-template-columns: var(--cg-s10) minmax(0, 1fr) auto;
966
+ gap: var(--cg-s3);
967
+ padding-block: var(--cg-s6);
933
968
  }
934
969
 
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;
970
+ .cg-accordion__index {
971
+ font-size: var(--cg-text-xs);
972
+ font-weight: var(--cg-weight-medium);
973
+ letter-spacing: 0.04em;
974
+ font-variant-numeric: lining-nums tabular-nums;
975
+ color: var(--cg-ink-subtle);
942
976
  }
943
977
 
944
- .cg-list__link {
945
- color: inherit;
946
- text-decoration: none;
978
+ .cg-accordion__question-text {
979
+ font-family: var(--cg-font-display);
980
+ font-size: var(--cg-text-xl);
981
+ line-height: 1.2;
947
982
  }
948
983
 
949
- .cg-list__row:hover .cg-list__link {
950
- color: var(--cg-accent);
984
+ .cg-accordion__answer {
985
+ padding-inline-start: calc(var(--cg-s10) + var(--cg-s3));
951
986
  }
952
987
 
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;
988
+ @media (min-width: 40rem) {
989
+ .cg-accordion__question {
990
+ grid-template-columns: var(--cg-s12) minmax(0, 1fr) auto;
991
+ column-gap: var(--cg-col-gap);
992
+ }
993
+
994
+ .cg-accordion__answer {
995
+ padding-inline-start: calc(var(--cg-s12) + var(--cg-col-gap));
996
+ }
971
997
  }
972
998
 
973
- /* --- embed --------------------------------------------------------------- */
999
+ /* --------------------------------------------------------------------------
1000
+ cta: the ink band.
1001
+ -------------------------------------------------------------------------- */
974
1002
 
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;
1003
+ .cg-cta {
1004
+ padding-block: calc(var(--cg-section) * 0.8);
1005
+ background: var(--cg-band);
1006
+ color: var(--cg-band-ink);
982
1007
  }
983
1008
 
984
- .cg-embed__frame {
985
- inline-size: 100%;
986
- block-size: 100%;
987
- border: 0;
1009
+ :is(.cg-main, .cg-sidebar-layout__content) > .cg-cta:last-child {
1010
+ margin-block-end: calc(var(--cg-section) / -2);
988
1011
  }
989
1012
 
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;
1013
+ .cg-cta + .cg-section {
1014
+ margin-block-start: calc(var(--cg-section) / 2);
1001
1015
  }
1002
1016
 
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;
1017
+ .cg-cta__inner {
1018
+ row-gap: var(--cg-s10);
1012
1019
  }
1013
1020
 
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;
1021
+ .cg-cta__title {
1022
+ max-inline-size: 20ch;
1023
+ font-size: var(--cg-size-heading);
1024
+ color: var(--cg-band-ink);
1019
1025
  }
1020
1026
 
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);
1027
+ .cg-cta__text {
1028
+ margin: var(--cg-s6) 0 0;
1029
+ max-inline-size: 46ch;
1030
+ font-size: var(--cg-size-lead);
1031
+ line-height: 1.45;
1032
+ color: var(--cg-band-muted);
1036
1033
  }
1037
1034
 
1038
- .cg-embed__link:hover {
1039
- background: var(--cg-accent);
1040
- color: var(--cg-accent-fg);
1041
- border-color: var(--cg-accent);
1035
+ .cg-cta .cg-action[data-emphasis="primary"] {
1036
+ background: var(--cg-band-ink);
1037
+ border-color: var(--cg-band-ink);
1038
+ color: var(--cg-band);
1042
1039
  }
1043
1040
 
1044
- /* --- testimonial → client outcome panel (blocks@2.0, RFC 0001) ----------- */
1041
+ .cg-cta .cg-action[data-emphasis="primary"]:hover {
1042
+ background: var(--cg-band-muted);
1043
+ border-color: var(--cg-band-muted);
1044
+ color: var(--cg-band);
1045
+ }
1045
1046
 
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);
1047
+ .cg-cta .cg-action[data-emphasis="secondary"] {
1048
+ color: var(--cg-band-ink);
1049
+ text-decoration-color: var(--cg-band-line);
1062
1050
  }
1063
1051
 
1064
- @media (min-width: 56rem) {
1065
- .cg-testimonial {
1066
- grid-template-columns: 1fr auto;
1067
- align-items: center;
1068
- gap: var(--cg-s10);
1069
- }
1052
+ .cg-cta .cg-action[data-emphasis="secondary"]:hover {
1053
+ color: var(--cg-band-ink);
1054
+ text-decoration-color: currentColor;
1055
+ }
1056
+
1057
+ .cg-cta :focus-visible {
1058
+ outline-color: var(--cg-band-ink);
1059
+ }
1060
+
1061
+ @media (min-width: 64rem) {
1062
+ .cg-cta__copy {
1063
+ grid-column: 1 / span 8;
1064
+ }
1070
1065
 
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);
1066
+ .cg-cta__actions {
1067
+ grid-column: 9 / -1;
1068
+ align-self: end;
1069
+ justify-self: end;
1077
1070
  }
1078
1071
  }
1079
1072
 
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;
1073
+ @media (prefers-color-scheme: dark) {
1074
+ :where(:root:not([data-theme="light"])) .cg-cta {
1075
+ border-block: var(--cg-rule) solid var(--cg-band-line);
1076
+ }
1077
+ }
1078
+
1079
+ :where(:root[data-theme="dark"]) .cg-cta {
1080
+ border-block: var(--cg-rule) solid var(--cg-band-line);
1081
+ }
1082
+
1083
+ /* --------------------------------------------------------------------------
1084
+ prose: a reading column with its section titles in the margin.
1085
+ -------------------------------------------------------------------------- */
1086
+
1087
+ .cg-prose {
1088
+ display: flow-root;
1089
+ color: var(--cg-ink);
1088
1090
  }
1089
1091
 
1090
- .cg-testimonial__quote p {
1092
+ .cg-prose > * {
1091
1093
  margin: 0;
1094
+ max-inline-size: var(--cg-measure);
1095
+ }
1096
+
1097
+ .cg-prose > * + * {
1098
+ margin-block-start: 1.05em;
1099
+ }
1100
+
1101
+ /* A page's opening paragraph reads as its standfirst, unless the entry
1102
+ header above has already set one (its excerpt). */
1103
+ .cg-prose > p:first-child {
1104
+ font-size: var(--cg-size-lead);
1105
+ line-height: 1.5;
1106
+ }
1107
+
1108
+ .cg-entry-header:has(.cg-entry-header__excerpt) + .cg-text .cg-prose > p:first-child {
1109
+ font-size: var(--cg-text-md);
1110
+ line-height: var(--cg-leading-text);
1111
+ }
1112
+
1113
+ .cg-prose h2 {
1114
+ font-size: var(--cg-size-subheading);
1115
+ line-height: 1.15;
1116
+ }
1117
+
1118
+ .cg-prose > * + h2 {
1119
+ margin-block-start: var(--cg-s16);
1092
1120
  }
1093
1121
 
1094
- .cg-testimonial__quote p + p {
1122
+ .cg-prose > h2 + * {
1095
1123
  margin-block-start: var(--cg-s4);
1096
1124
  }
1097
1125
 
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;
1126
+ .cg-prose h3 {
1127
+ font-size: var(--cg-text-xl);
1128
+ line-height: 1.2;
1104
1129
  }
1105
1130
 
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);
1131
+ .cg-prose > * + h3 {
1132
+ margin-block-start: var(--cg-s10);
1111
1133
  }
1112
1134
 
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);
1135
+ .cg-prose > h3 + * {
1136
+ margin-block-start: var(--cg-s3);
1119
1137
  }
1120
1138
 
1121
- .cg-testimonial__name {
1139
+ .cg-prose h4 {
1140
+ font-family: var(--cg-font-text);
1141
+ font-size: var(--cg-text-md);
1122
1142
  font-weight: var(--cg-weight-semibold);
1123
- color: var(--cg-ink);
1143
+ letter-spacing: 0;
1124
1144
  }
1125
1145
 
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;
1146
+ .cg-prose :where(ul, ol) {
1147
+ padding-inline-start: 1.25em;
1135
1148
  }
1136
1149
 
1137
- .cg-pricing__tiers {
1138
- display: grid;
1139
- gap: var(--cg-s6);
1140
- margin: 0;
1150
+ .cg-prose ul {
1151
+ list-style: square;
1141
1152
  }
1142
1153
 
1143
- @media (min-width: 48rem) {
1144
- .cg-pricing__tiers {
1145
- grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
1146
- align-items: start;
1147
- }
1154
+ .cg-prose ol {
1155
+ list-style: decimal;
1148
1156
  }
1149
1157
 
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);
1158
+ .cg-prose li + li {
1159
+ margin-block-start: 0.4em;
1159
1160
  }
1160
1161
 
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);
1162
+ .cg-prose li::marker {
1163
+ color: var(--cg-ink-subtle);
1164
+ font-variant-numeric: tabular-nums;
1167
1165
  }
1168
1166
 
1169
- .cg-pricing__name {
1170
- margin: 0;
1171
- font-size: var(--cg-text-lg);
1167
+ .cg-prose strong {
1172
1168
  font-weight: var(--cg-weight-semibold);
1173
- letter-spacing: var(--cg-tracking-snug);
1174
1169
  }
1175
1170
 
1176
- .cg-pricing__price {
1177
- display: flex;
1178
- align-items: baseline;
1179
- gap: var(--cg-s1);
1171
+ .cg-prose blockquote {
1172
+ margin-block: var(--cg-s10);
1173
+ padding-block: var(--cg-s5);
1174
+ border-block: var(--cg-rule) solid var(--cg-line);
1175
+ font-family: var(--cg-font-display);
1176
+ font-size: var(--cg-size-subheading);
1177
+ font-style: italic;
1178
+ line-height: 1.3;
1179
+ }
1180
+
1181
+ .cg-prose blockquote p {
1180
1182
  margin: 0;
1181
1183
  }
1182
1184
 
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;
1185
+ .cg-prose__figure {
1186
+ margin-block: var(--cg-s10);
1189
1187
  }
1190
1188
 
1191
- .cg-pricing__interval {
1192
- color: var(--cg-ink-muted);
1189
+ .cg-prose__figure img {
1190
+ inline-size: 100%;
1191
+ }
1192
+
1193
+ .cg-prose__figure figcaption {
1194
+ margin-block-start: var(--cg-s3);
1193
1195
  font-size: var(--cg-text-sm);
1196
+ color: var(--cg-ink-muted);
1194
1197
  }
1195
1198
 
1196
- .cg-pricing__features {
1199
+ .cg-prose__rule {
1200
+ margin-block: var(--cg-s12);
1201
+ }
1202
+
1203
+ @media (min-width: 64rem) {
1204
+ .cg-text .cg-prose {
1205
+ grid-column: 5 / span 7;
1206
+ }
1207
+
1208
+ /* A second-level heading hangs in the four columns to the left of the
1209
+ text. As a float with a negative margin it takes no room in the text
1210
+ column, and its top aligns with the paragraph that follows it. */
1211
+ .cg-text .cg-prose > h2 {
1212
+ float: inline-start;
1213
+ clear: both;
1214
+ inline-size: calc(var(--cg-col) * 3 + var(--cg-col-gap) * 2);
1215
+ margin-inline-start: calc((var(--cg-col) + var(--cg-col-gap)) * -4);
1216
+ font-size: var(--cg-size-subheading);
1217
+ }
1218
+
1219
+ .cg-text .cg-prose > h2 + * {
1220
+ margin-block-start: var(--cg-s16);
1221
+ }
1222
+
1223
+ .cg-text .cg-prose > h2:first-child,
1224
+ .cg-text .cg-prose > h2:first-child + * {
1225
+ margin-block-start: 0;
1226
+ }
1227
+ }
1228
+
1229
+ /* --------------------------------------------------------------------------
1230
+ mediaFigure
1231
+ -------------------------------------------------------------------------- */
1232
+
1233
+ .cg-figure__inner {
1234
+ row-gap: var(--cg-s4);
1235
+ }
1236
+
1237
+ /* A figure right after a passage of text belongs to it: an exhibit under
1238
+ the paragraphs that introduce it, a photograph inside a story. */
1239
+ .cg-text + .cg-figure {
1240
+ padding-block-start: 0;
1241
+ }
1242
+
1243
+ .cg-figure__image {
1244
+ inline-size: 100%;
1245
+ aspect-ratio: var(--cg-ratio, auto);
1246
+ object-fit: cover;
1247
+ }
1248
+
1249
+ .cg-figure__caption {
1197
1250
  display: flex;
1198
1251
  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);
1252
+ gap: var(--cg-s1);
1253
+ max-inline-size: 60ch;
1205
1254
  font-size: var(--cg-text-sm);
1206
- line-height: var(--cg-leading-normal);
1255
+ line-height: 1.5;
1256
+ color: var(--cg-ink-muted);
1207
1257
  }
1208
1258
 
1209
- .cg-pricing__feature {
1210
- padding-inline-start: var(--cg-s5);
1211
- position: relative;
1259
+ .cg-figure__credit {
1260
+ font-size: var(--cg-text-xs);
1261
+ letter-spacing: 0.02em;
1262
+ color: var(--cg-ink-subtle);
1212
1263
  }
1213
1264
 
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);
1265
+ .cg-figure[data-align="full"] > .cg-container {
1266
+ max-inline-size: none;
1267
+ padding-inline: 0;
1226
1268
  }
1227
1269
 
1228
- .cg-pricing__action {
1229
- margin-block-start: auto;
1230
- padding-block-start: var(--cg-s2);
1270
+ /* The caption of a full-bleed picture still lines up with the page's text. */
1271
+ .cg-figure[data-align="full"] .cg-figure__caption {
1272
+ box-sizing: content-box;
1273
+ padding-inline: max(var(--cg-gutter), calc((100% - var(--cg-page)) / 2));
1231
1274
  }
1232
1275
 
1233
- .cg-pricing__action .cg-action {
1234
- inline-size: 100%;
1235
- justify-content: center;
1276
+ @media (min-width: 64rem) {
1277
+ .cg-figure[data-align="center"] .cg-figure__media,
1278
+ .cg-figure[data-align="center"] .cg-figure__caption {
1279
+ grid-column: 3 / span 8;
1280
+ }
1281
+
1282
+ .cg-figure[data-align="wide"] .cg-figure__media {
1283
+ grid-column: 1 / span 9;
1284
+ grid-row: 1;
1285
+ }
1286
+
1287
+ .cg-figure[data-align="start"] .cg-figure__media {
1288
+ grid-column: 1 / span 7;
1289
+ grid-row: 1;
1290
+ }
1291
+
1292
+ .cg-figure[data-align="end"] .cg-figure__media {
1293
+ grid-column: 6 / -1;
1294
+ grid-row: 1;
1295
+ }
1296
+
1297
+ .cg-figure[data-align="wide"] .cg-figure__caption,
1298
+ .cg-figure[data-align="start"] .cg-figure__caption,
1299
+ .cg-figure[data-align="end"] .cg-figure__caption {
1300
+ grid-row: 1;
1301
+ align-self: end;
1302
+ padding-block-start: var(--cg-s4);
1303
+ border-block-start: var(--cg-rule) solid var(--cg-line);
1304
+ }
1305
+
1306
+ .cg-figure[data-align="wide"] .cg-figure__caption {
1307
+ grid-column: 10 / -1;
1308
+ }
1309
+
1310
+ .cg-figure[data-align="start"] .cg-figure__caption {
1311
+ grid-column: 8 / span 3;
1312
+ }
1313
+
1314
+ .cg-figure[data-align="end"] .cg-figure__caption {
1315
+ grid-column: 2 / span 3;
1316
+ }
1236
1317
  }
1237
1318
 
1238
- /* --- accordion → specification panels (blocks@2.0, RFC 0001) ------------- */
1319
+ /* --------------------------------------------------------------------------
1320
+ gallery
1321
+ -------------------------------------------------------------------------- */
1239
1322
 
1240
- .cg-panels {
1241
- max-inline-size: var(--cg-page-narrow);
1242
- margin-inline: auto;
1323
+ .cg-gallery__items {
1324
+ display: grid;
1325
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1326
+ gap: var(--cg-col-gap);
1243
1327
  }
1244
1328
 
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;
1329
+ .cg-gallery__image {
1330
+ inline-size: 100%;
1331
+ aspect-ratio: 4 / 3;
1332
+ object-fit: cover;
1252
1333
  }
1253
1334
 
1254
- .cg-panels__items {
1255
- display: flex;
1256
- flex-direction: column;
1257
- gap: var(--cg-s3);
1258
- margin: 0;
1335
+ .cg-gallery__items[data-count="1"] {
1336
+ grid-template-columns: minmax(0, 1fr);
1259
1337
  }
1260
1338
 
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);
1339
+ @media (min-width: 64rem) {
1340
+ .cg-gallery__items {
1341
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1342
+ }
1343
+
1344
+ .cg-gallery__items[data-count="2"],
1345
+ .cg-gallery__items[data-count="4"] {
1346
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1347
+ }
1348
+
1349
+ .cg-gallery__items[data-count="1"] {
1350
+ grid-template-columns: minmax(0, 1fr);
1351
+ }
1266
1352
  }
1267
1353
 
1268
- .cg-panels__item:has(.cg-panels__details[open]) {
1269
- border-color: var(--cg-line-strong);
1354
+ .cg-gallery[data-layout="masonry"] .cg-gallery__items {
1355
+ display: block;
1356
+ columns: 2;
1357
+ column-gap: var(--cg-col-gap);
1270
1358
  }
1271
1359
 
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;
1360
+ .cg-gallery[data-layout="masonry"] .cg-gallery__item {
1361
+ margin-block-end: var(--cg-col-gap);
1362
+ break-inside: avoid;
1280
1363
  }
1281
1364
 
1282
- .cg-panels__question::-webkit-details-marker {
1283
- display: none;
1365
+ .cg-gallery[data-layout="masonry"] .cg-gallery__image {
1366
+ aspect-ratio: auto;
1284
1367
  }
1285
1368
 
1286
- .cg-panels__question-text {
1287
- flex: 1;
1369
+ @media (min-width: 64rem) {
1370
+ .cg-gallery[data-layout="masonry"] .cg-gallery__items {
1371
+ columns: 3;
1372
+ }
1288
1373
  }
1289
1374
 
1290
- .cg-panels__details[open] .cg-panels__question {
1291
- color: var(--cg-accent);
1375
+ /* carousel: the same 4:3 pictures in a scroll-snapping row. */
1376
+ .cg-gallery[data-layout="carousel"] .cg-gallery__items,
1377
+ .cg-gallery[data-layout="carousel"] .cg-gallery__items[data-count] {
1378
+ grid-template-columns: none;
1379
+ grid-auto-flow: column;
1380
+ grid-auto-columns: min(82%, 30rem);
1292
1381
  }
1293
1382
 
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);
1383
+ .cg-gallery[data-layout="carousel"] .cg-gallery__item {
1384
+ scroll-snap-align: start;
1304
1385
  }
1305
1386
 
1306
- .cg-panels__details[open] .cg-panels__chevron {
1307
- transform: rotate(-135deg);
1387
+ /* --------------------------------------------------------------------------
1388
+ logos: a ruled register of client marks.
1389
+ -------------------------------------------------------------------------- */
1390
+
1391
+ .cg-clients__items {
1392
+ display: grid;
1393
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1394
+ border-block-start: var(--cg-rule) solid var(--cg-line);
1308
1395
  }
1309
1396
 
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);
1397
+ .cg-clients__item {
1398
+ display: flex;
1399
+ align-items: center;
1400
+ justify-content: center;
1401
+ min-block-size: 8rem;
1402
+ padding: var(--cg-s6);
1403
+ border-block-end: var(--cg-rule) solid var(--cg-line);
1314
1404
  }
1315
1405
 
1316
- .cg-panels__answer > :first-child {
1317
- margin-block-start: 0;
1406
+ .cg-clients__item:nth-child(odd) {
1407
+ border-inline-end: var(--cg-rule) solid var(--cg-line);
1318
1408
  }
1319
1409
 
1320
- .cg-panels__answer > :last-child {
1321
- margin-block-end: 0;
1410
+ .cg-clients__link {
1411
+ display: flex;
1412
+ align-items: center;
1413
+ justify-content: center;
1414
+ inline-size: 100%;
1415
+ min-block-size: 44px;
1322
1416
  }
1323
1417
 
1324
- /* --- statCounter → impact band (blocks@2.0, RFC 0001) -------------------- */
1418
+ .cg-clients__logo {
1419
+ inline-size: 100%;
1420
+ max-inline-size: 11rem;
1421
+ block-size: 3rem;
1422
+ object-fit: contain;
1423
+ }
1325
1424
 
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);
1425
+ .cg-clients__link:hover .cg-clients__logo {
1426
+ opacity: 1;
1335
1427
  }
1336
1428
 
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;
1429
+ @media (min-width: 64rem) {
1430
+ .cg-clients__items {
1431
+ grid-template-columns: repeat(var(--cg-client-columns, 3), minmax(0, 1fr));
1432
+ }
1433
+
1434
+ .cg-clients__items[data-columns="1"] {
1435
+ --cg-client-columns: 1;
1436
+ }
1437
+
1438
+ .cg-clients__items[data-columns="2"] {
1439
+ --cg-client-columns: 2;
1440
+ }
1441
+
1442
+ .cg-clients__items[data-columns="4"] {
1443
+ --cg-client-columns: 4;
1444
+ }
1445
+
1446
+ .cg-clients__item,
1447
+ .cg-clients__item:nth-child(odd) {
1448
+ border-inline-end: var(--cg-rule) solid var(--cg-line);
1449
+ }
1450
+
1451
+ .cg-clients__items[data-columns="3"] .cg-clients__item:nth-child(3n),
1452
+ .cg-clients__items[data-columns="4"] .cg-clients__item:nth-child(4n),
1453
+ .cg-clients__items[data-columns="2"] .cg-clients__item:nth-child(2n),
1454
+ .cg-clients__items .cg-clients__item:last-child {
1455
+ border-inline-end: 0;
1456
+ }
1344
1457
  }
1345
1458
 
1346
- .cg-kpis__items {
1459
+ /* --------------------------------------------------------------------------
1460
+ pricingTable: tiers as the columns of a ruled table.
1461
+ -------------------------------------------------------------------------- */
1462
+
1463
+ .cg-pricing__tiers {
1347
1464
  display: grid;
1348
- grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
1349
- gap: var(--cg-s8);
1350
- margin: 0;
1465
+ grid-template-columns: minmax(0, 1fr);
1466
+ border-block-start: var(--cg-rule) solid var(--cg-line);
1351
1467
  }
1352
1468
 
1353
- .cg-kpi {
1469
+ .cg-pricing__tier {
1354
1470
  display: flex;
1355
1471
  flex-direction: column;
1356
- gap: var(--cg-s2);
1472
+ gap: var(--cg-s5);
1473
+ padding-block: var(--cg-s8);
1474
+ border-block-end: var(--cg-rule) solid var(--cg-line);
1357
1475
  }
1358
1476
 
1359
- .cg-kpi__label {
1360
- order: 2;
1477
+ .cg-pricing__tier[data-highlighted="true"] {
1478
+ box-shadow: inset 0 var(--cg-rule-strong) 0 var(--cg-ink);
1479
+ }
1480
+
1481
+ .cg-pricing__name {
1482
+ font-family: var(--cg-font-text);
1361
1483
  font-size: var(--cg-text-xs);
1362
- font-weight: var(--cg-weight-semibold);
1363
- letter-spacing: var(--cg-tracking-wide);
1484
+ font-weight: var(--cg-weight-medium);
1485
+ letter-spacing: var(--cg-tracking-label);
1364
1486
  text-transform: uppercase;
1365
- opacity: 0.82;
1487
+ color: var(--cg-ink);
1366
1488
  }
1367
1489
 
1368
- .cg-kpi__value {
1369
- order: 1;
1490
+ .cg-pricing__price {
1491
+ display: flex;
1492
+ flex-wrap: wrap;
1493
+ align-items: baseline;
1494
+ gap: var(--cg-s2);
1370
1495
  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
1496
  }
1377
1497
 
1378
- /* --- logoStrip → trust band (blocks@2.0, RFC 0001) ------------------------ */
1498
+ .cg-pricing__amount {
1499
+ font-family: var(--cg-font-display);
1500
+ font-size: var(--cg-size-heading);
1501
+ font-weight: var(--cg-weight-light);
1502
+ line-height: 1;
1503
+ letter-spacing: -0.02em;
1504
+ font-variant-numeric: lining-nums tabular-nums;
1505
+ }
1379
1506
 
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);
1507
+ .cg-pricing__interval {
1508
+ font-size: var(--cg-text-sm);
1509
+ color: var(--cg-ink-muted);
1510
+ }
1511
+
1512
+ .cg-pricing__features {
1513
+ border-block-start: var(--cg-rule) solid var(--cg-line-soft);
1514
+ }
1515
+
1516
+ .cg-pricing__feature {
1517
+ padding-block: var(--cg-s3);
1518
+ border-block-end: var(--cg-rule) solid var(--cg-line-soft);
1519
+ font-size: var(--cg-text-sm);
1520
+ }
1521
+
1522
+ .cg-pricing__action {
1523
+ margin-block-start: auto;
1524
+ padding-block-start: var(--cg-s4);
1525
+ }
1526
+
1527
+ @media (min-width: 40rem) {
1528
+ .cg-pricing__tiers {
1529
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1530
+ column-gap: var(--cg-col-gap);
1531
+ }
1532
+
1533
+ .cg-pricing__tiers[data-count="1"] {
1534
+ grid-template-columns: minmax(0, 1fr);
1535
+ }
1536
+ }
1537
+
1538
+ @media (min-width: 64rem) {
1539
+ .cg-pricing__tiers {
1540
+ column-gap: 0;
1541
+ }
1542
+
1543
+ .cg-pricing__tiers[data-count="3"] {
1544
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1545
+ }
1546
+
1547
+ .cg-pricing__tiers[data-count="4"] {
1548
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1549
+ }
1550
+
1551
+ .cg-pricing__tier {
1552
+ padding-inline: var(--cg-col-gap);
1553
+ border-block-end: 0;
1554
+ border-inline-start: var(--cg-rule) solid var(--cg-line);
1555
+ }
1556
+
1557
+ .cg-pricing__tier:first-child {
1558
+ padding-inline-start: 0;
1559
+ border-inline-start: 0;
1560
+ }
1561
+ }
1562
+
1563
+ /* --------------------------------------------------------------------------
1564
+ embed
1565
+ -------------------------------------------------------------------------- */
1566
+
1567
+ .cg-embed__frame-box {
1568
+ aspect-ratio: var(--cg-ratio, 16 / 9);
1390
1569
  background: var(--cg-surface-sunken);
1391
- border-block: 1px solid var(--cg-line-soft);
1392
1570
  }
1393
1571
 
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;
1572
+ .cg-embed[data-consent="required"] .cg-embed__frame-box,
1573
+ .cg-embed__frame-box:has(.cg-embed__notice) {
1574
+ aspect-ratio: auto;
1575
+ min-block-size: 16rem;
1576
+ background: transparent;
1404
1577
  }
1405
1578
 
1406
- .cg-logo-band__item {
1579
+ .cg-embed__frame {
1580
+ display: block;
1581
+ inline-size: 100%;
1582
+ block-size: 100%;
1583
+ border: 0;
1584
+ }
1585
+
1586
+ .cg-embed__notice {
1407
1587
  display: flex;
1408
- align-items: center;
1588
+ flex-direction: column;
1409
1589
  justify-content: center;
1410
- padding: var(--cg-s3) var(--cg-s6);
1411
- border-inline-start: 1px solid var(--cg-line-soft);
1590
+ align-items: flex-start;
1591
+ gap: var(--cg-s4);
1592
+ block-size: 100%;
1593
+ min-block-size: 16rem;
1594
+ padding: var(--cg-s10) var(--cg-s8);
1595
+ border-block: var(--cg-rule) solid var(--cg-line);
1412
1596
  }
1413
1597
 
1414
- .cg-logo-band__item:first-child {
1415
- border-inline-start: 0;
1598
+ .cg-embed__provider {
1599
+ margin: 0;
1600
+ font-size: var(--cg-text-xs);
1601
+ font-weight: var(--cg-weight-medium);
1602
+ letter-spacing: var(--cg-tracking-label);
1603
+ text-transform: uppercase;
1604
+ color: var(--cg-ink-muted);
1416
1605
  }
1417
1606
 
1418
- .cg-logo-band__image {
1419
- block-size: var(--cg-s8);
1420
- inline-size: auto;
1421
- max-inline-size: 100%;
1422
- object-fit: contain;
1607
+ .cg-embed__reason {
1608
+ margin: 0;
1609
+ max-inline-size: 32ch;
1610
+ font-family: var(--cg-font-display);
1611
+ font-size: var(--cg-text-xl);
1612
+ line-height: 1.25;
1423
1613
  }
1424
1614
 
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;
1615
+ .cg-embed__link {
1616
+ font-size: var(--cg-text-ui);
1617
+ color: var(--cg-ink);
1618
+ text-decoration-color: var(--cg-line-strong);
1619
+ }
1620
+
1621
+ @media (min-width: 64rem) {
1622
+ .cg-embed__frame-box {
1623
+ grid-column: 3 / span 8;
1624
+ }
1433
1625
  }