@cogenta/theme-entreprise 1.1.3 → 1.4.0

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