@cogenta/theme-portfolio 1.1.3 → 1.3.4

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 (128) hide show
  1. package/dist/src/index.d.ts +9 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +10 -1
  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 +10 -18
  7. package/dist/src/render/blocks/accordion.js.map +1 -1
  8. package/dist/src/render/blocks/collection-list.d.ts +0 -20
  9. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  10. package/dist/src/render/blocks/collection-list.js +59 -66
  11. package/dist/src/render/blocks/collection-list.js.map +1 -1
  12. package/dist/src/render/blocks/cta.d.ts +4 -4
  13. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  14. package/dist/src/render/blocks/cta.js +15 -10
  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 +16 -31
  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 +12 -17
  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 +26 -23
  24. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  25. package/dist/src/render/blocks/gallery.d.ts +0 -14
  26. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  27. package/dist/src/render/blocks/gallery.js +29 -21
  28. package/dist/src/render/blocks/gallery.js.map +1 -1
  29. package/dist/src/render/blocks/hero.d.ts +8 -8
  30. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  31. package/dist/src/render/blocks/hero.js +17 -18
  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 +9 -14
  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 +14 -19
  38. package/dist/src/render/blocks/logos.js.map +1 -1
  39. package/dist/src/render/blocks/media-figure.d.ts +8 -12
  40. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  41. package/dist/src/render/blocks/media-figure.js +20 -20
  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 +17 -20
  45. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  46. package/dist/src/render/blocks/prose.d.ts +10 -9
  47. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  48. package/dist/src/render/blocks/prose.js +29 -10
  49. package/dist/src/render/blocks/prose.js.map +1 -1
  50. package/dist/src/render/blocks/quote.d.ts +5 -12
  51. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  52. package/dist/src/render/blocks/quote.js +9 -15
  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 +10 -12
  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 +7 -15
  59. package/dist/src/render/blocks/stats.js.map +1 -1
  60. package/dist/src/render/blocks/testimonial.d.ts +4 -14
  61. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  62. package/dist/src/render/blocks/testimonial.js +9 -18
  63. package/dist/src/render/blocks/testimonial.js.map +1 -1
  64. package/dist/src/render/chrome.d.ts.map +1 -1
  65. package/dist/src/render/chrome.js +93 -90
  66. package/dist/src/render/chrome.js.map +1 -1
  67. package/dist/src/render/layout.d.ts +61 -0
  68. package/dist/src/render/layout.d.ts.map +1 -0
  69. package/dist/src/render/layout.js +134 -0
  70. package/dist/src/render/layout.js.map +1 -0
  71. package/dist/src/render/project.d.ts +27 -0
  72. package/dist/src/render/project.d.ts.map +1 -0
  73. package/dist/src/render/project.js +82 -0
  74. package/dist/src/render/project.js.map +1 -0
  75. package/dist/src/render/render-block.d.ts +17 -7
  76. package/dist/src/render/render-block.d.ts.map +1 -1
  77. package/dist/src/render/render-block.js +47 -34
  78. package/dist/src/render/render-block.js.map +1 -1
  79. package/dist/src/render/term-archive.d.ts +0 -11
  80. package/dist/src/render/term-archive.d.ts.map +1 -1
  81. package/dist/src/render/term-archive.js +36 -24
  82. package/dist/src/render/term-archive.js.map +1 -1
  83. package/dist/src/render/widget-areas.d.ts +14 -0
  84. package/dist/src/render/widget-areas.d.ts.map +1 -0
  85. package/dist/src/render/widget-areas.js +21 -0
  86. package/dist/src/render/widget-areas.js.map +1 -0
  87. package/dist/src/render/work.d.ts +37 -0
  88. package/dist/src/render/work.d.ts.map +1 -0
  89. package/dist/src/render/work.js +49 -0
  90. package/dist/src/render/work.js.map +1 -0
  91. package/dist/theme.config.d.ts +4 -7
  92. package/dist/theme.config.d.ts.map +1 -1
  93. package/dist/theme.config.js +6 -9
  94. package/dist/theme.config.js.map +1 -1
  95. package/package.json +4 -4
  96. package/src/index.ts +10 -1
  97. package/src/render/blocks/accordion.ts +22 -42
  98. package/src/render/blocks/collection-list.ts +83 -137
  99. package/src/render/blocks/cta.ts +24 -12
  100. package/src/render/blocks/embed.ts +39 -47
  101. package/src/render/blocks/faq.ts +24 -33
  102. package/src/render/blocks/feature-grid.ts +38 -41
  103. package/src/render/blocks/gallery.ts +34 -28
  104. package/src/render/blocks/hero.ts +31 -28
  105. package/src/render/blocks/logo-strip.ts +18 -20
  106. package/src/render/blocks/logos.ts +22 -43
  107. package/src/render/blocks/media-figure.ts +28 -20
  108. package/src/render/blocks/pricing-table.ts +31 -32
  109. package/src/render/blocks/prose.ts +38 -13
  110. package/src/render/blocks/quote.ts +18 -18
  111. package/src/render/blocks/stat-counter.ts +19 -37
  112. package/src/render/blocks/stats.ts +18 -33
  113. package/src/render/blocks/testimonial.ts +16 -22
  114. package/src/render/chrome.ts +99 -97
  115. package/src/render/layout.ts +177 -0
  116. package/src/render/project.ts +140 -0
  117. package/src/render/render-block.ts +49 -45
  118. package/src/render/term-archive.ts +92 -70
  119. package/src/render/widget-areas.ts +25 -0
  120. package/src/render/work.ts +124 -0
  121. package/src/styles/archive.css +61 -21
  122. package/src/styles/base.css +763 -648
  123. package/src/styles/blocks.css +697 -1093
  124. package/src/styles/theme.css +22 -10
  125. package/src/styles/tokens.css +174 -252
  126. package/src/styles/widgets.css +948 -0
  127. package/src/styles/work.css +405 -0
  128. package/tokens.json +19 -19
@@ -1,1468 +1,1072 @@
1
1
  /*
2
- * The seventeen vocabulary blocks — brutalist-meets-editorial.
3
- *
4
- * Nothing here declares a colour, a size, a radius or a duration of its own:
5
- * a block composes the design system from `tokens.css` and nothing else.
2
+ * The other vocabulary blocks, in the studio's register: large type, small
3
+ * captions, hairlines, space. Every block sits on the twelve-column container
4
+ * from `base.css`; below the wide breakpoint every child takes the full row.
6
5
  */
7
6
 
8
- /* --- hero ------------------------------------------------------------------
9
- An asymmetric split with deliberate overlap: the media is pulled into the
10
- title's own negative margin on wide screens, so the two compete for the
11
- same strip rather than sitting in tidy, separate columns.
12
- ------------------------------------------------------------------------- */
7
+ /* --------------------------------------------------------------------------
8
+ hero: the statement
9
+ -------------------------------------------------------------------------- */
13
10
 
14
- .cg-hero {
15
- position: relative;
16
- display: grid;
17
- gap: var(--cg-gap-loose);
18
- margin-block-start: var(--cg-s10);
19
- }
20
-
21
- .cg-hero__frame {
22
- display: flex;
23
- flex-direction: column;
24
- align-items: flex-start;
25
- }
26
-
27
- @media (min-width: 64rem) {
28
- .cg-hero {
29
- grid-template-columns: 1.1fr 0.9fr;
30
- align-items: center;
31
- }
32
-
33
- .cg-hero__media {
34
- margin-inline-start: calc(var(--cg-gap-loose) * -1.4);
35
- }
11
+ .cg-statement__inner {
12
+ row-gap: 0;
36
13
  }
37
14
 
38
- .cg-hero__eyebrow {
39
- display: inline-flex;
40
- align-items: center;
15
+ .cg-statement__eyebrow {
41
16
  margin: 0 0 var(--cg-s6);
42
- padding-inline-start: var(--cg-s5);
43
- position: relative;
44
17
  color: var(--cg-ink-muted);
45
- font-family: var(--cogenta-font-mono);
46
- font-size: var(--cg-text-xs);
18
+ font-size: var(--cg-text-caption);
47
19
  font-weight: var(--cg-weight-medium);
48
- letter-spacing: var(--cg-tracking-wider);
49
- text-transform: uppercase;
20
+ line-height: var(--cg-leading-ui);
50
21
  }
51
22
 
52
- .cg-hero__eyebrow::before {
53
- content: "";
54
- position: absolute;
55
- inset-inline-start: 0;
56
- inset-block: 0.35em;
57
- inline-size: var(--cg-s3);
58
- border-block-start: 1px solid var(--cg-accent);
23
+ .cg-statement__title {
24
+ font-size: var(--cg-size-statement);
25
+ font-stretch: var(--cg-width-display);
26
+ font-weight: var(--cg-weight-medium);
27
+ line-height: var(--cg-leading-display);
28
+ letter-spacing: var(--cg-tracking-display);
29
+ text-wrap: balance;
59
30
  }
60
31
 
61
- .cg-hero__title {
62
- margin: 0;
63
- font-family: var(--cogenta-font-sans);
64
- font-size: var(--cg-text-hero);
65
- line-height: var(--cg-leading-tight);
66
- letter-spacing: var(--cg-tracking-tighter);
67
- font-weight: var(--cg-weight-black);
68
- text-wrap: balance;
32
+ .cg-statement__aside {
33
+ display: grid;
34
+ gap: var(--cg-s8);
35
+ margin-block-start: var(--cg-s10);
69
36
  }
70
37
 
71
- .cg-hero__subtitle {
72
- margin: var(--cg-s6) 0 0;
73
- max-inline-size: var(--cg-measure-narrow);
74
- font-size: var(--cg-text-lg);
75
- line-height: var(--cg-leading-relaxed);
76
- color: var(--cg-ink-muted);
77
- text-wrap: pretty;
38
+ .cg-statement__subtitle {
39
+ margin: 0;
40
+ max-inline-size: 38ch;
41
+ color: var(--cg-ink);
42
+ font-size: var(--cg-size-lead);
43
+ line-height: var(--cg-leading-lead);
44
+ letter-spacing: -0.006em;
78
45
  }
79
46
 
80
- .cg-hero__media {
81
- position: relative;
47
+ .cg-statement__media {
48
+ margin-block-start: calc(var(--cg-section) * 0.5);
49
+ aspect-ratio: 16 / 9;
50
+ overflow: hidden;
51
+ background: var(--cg-surface-sunken);
82
52
  }
83
53
 
84
- .cg-hero__image {
54
+ .cg-statement__image {
85
55
  inline-size: 100%;
86
- border-radius: var(--cg-radius-md);
87
- box-shadow: var(--cg-elevation-3);
56
+ block-size: 100%;
57
+ object-fit: cover;
88
58
  }
89
59
 
90
- /* --- prose -------------------------------------------------------------- */
60
+ @media (min-width: 64rem) {
61
+ .cg-statement__eyebrow,
62
+ .cg-statement__title {
63
+ grid-column: 1 / span 11;
64
+ }
91
65
 
92
- .cg-prose {
93
- max-inline-size: var(--cg-measure);
94
- margin-inline: auto;
95
- line-height: var(--cg-leading-relaxed);
66
+ .cg-statement__aside {
67
+ grid-column: 7 / span 6;
68
+ margin-block-start: var(--cg-s16);
69
+ }
96
70
  }
97
71
 
98
- .cg-prose > :first-child {
99
- margin-block-start: 0;
100
- }
72
+ /* --------------------------------------------------------------------------
73
+ prose: running text, its opening subhead set as a label
74
+ -------------------------------------------------------------------------- */
101
75
 
102
- .cg-prose > :last-child {
103
- margin-block-end: 0;
76
+ .cg-prose__inner {
77
+ row-gap: var(--cg-s6);
104
78
  }
105
79
 
106
- /* The first paragraph of a prose block opens on a dropped capital — the
107
- editorial signal that this is the start of a piece, not mid-flow. */
108
- .cg-prose > p:first-child::first-letter {
109
- float: inline-start;
110
- padding: 0.02em var(--cg-s2) 0 0;
111
- font-family: var(--cogenta-font-serif);
112
- font-weight: var(--cg-weight-semibold);
113
- font-size: 3.4em;
114
- line-height: 0.82;
115
- color: var(--cg-accent);
116
- }
117
-
118
- /* Found by looking at a real screenshot: the portfolio blueprint's own
119
- auto-built "Role / Year" panel (a `prose` block with `variant.background:
120
- "muted"`, `@cogenta/create-cogenta`'s `portfolio.ts`) inherited this same
121
- editorial drop cap on its own first word ("Role"), reading as a giant "R"
122
- rather than a small spec-sheet label. A `prose` block given a background
123
- variant is a utility panel, not a piece of body copy, so it opts out of
124
- the editorial capital — same reasoning as the two-value list below.
125
- `[data-variant-background]` covers both "muted" and "image". */
126
- .cg-prose[data-variant-background] > p:first-child::first-letter {
127
- float: none;
128
- padding: 0;
129
- font: inherit;
130
- color: inherit;
80
+ .cg-prose__label h2 {
81
+ padding-block-start: var(--cg-s4);
82
+ border-block-start: var(--cg-rule) solid var(--cg-line-ink);
83
+ font-size: var(--cg-text-caption);
84
+ font-weight: var(--cg-weight-medium);
85
+ line-height: var(--cg-leading-ui);
86
+ letter-spacing: var(--cg-tracking-caption);
131
87
  }
132
88
 
133
- .cg-prose h2,
134
- .cg-prose h3,
135
- .cg-prose h4 {
136
- font-family: var(--cogenta-font-sans);
137
- letter-spacing: var(--cg-tracking-tight);
138
- line-height: var(--cg-leading-snug);
139
- font-weight: var(--cg-weight-black);
140
- text-wrap: balance;
89
+ .cg-prose__body {
90
+ font-size: var(--cg-text-reading);
91
+ line-height: var(--cg-leading-text);
141
92
  }
142
93
 
143
- .cg-prose h2 {
144
- margin-block: var(--cg-s16) var(--cg-s5);
145
- font-size: var(--cg-text-2xl);
94
+ .cg-prose__body > * {
95
+ max-inline-size: var(--cg-measure);
96
+ margin-block: 0;
146
97
  }
147
98
 
148
- .cg-prose h3 {
149
- margin-block: var(--cg-s12) var(--cg-s3);
150
- font-size: var(--cg-text-xl);
99
+ .cg-prose__body > * + * {
100
+ margin-block-start: 1em;
151
101
  }
152
102
 
153
- .cg-prose h4 {
154
- margin-block: var(--cg-s8) var(--cg-s2);
155
- font-size: var(--cg-text-md);
156
- text-transform: uppercase;
157
- letter-spacing: var(--cg-tracking-wide);
103
+ .cg-prose__body :where(h2) {
104
+ margin-block-start: 1.8em;
105
+ font-size: var(--cg-size-heading);
106
+ font-stretch: var(--cg-width-display);
107
+ line-height: var(--cg-leading-heading);
158
108
  }
159
109
 
160
- .cg-prose p {
161
- margin-block: var(--cg-s5);
162
- text-wrap: pretty;
110
+ .cg-prose__body :where(h3) {
111
+ margin-block-start: 1.6em;
112
+ font-size: var(--cg-text-lg);
113
+ line-height: var(--cg-leading-heading);
163
114
  }
164
115
 
165
- .cg-prose ul,
166
- .cg-prose ol {
167
- margin-block: var(--cg-s5);
168
- padding-inline-start: var(--cg-s6);
116
+ .cg-prose__body :where(h4, h5, h6) {
117
+ margin-block-start: 1.4em;
118
+ font-size: var(--cg-text-md);
119
+ font-weight: var(--cg-weight-semibold);
169
120
  }
170
121
 
171
- .cg-prose li {
172
- margin-block: var(--cg-s2);
173
- padding-inline-start: var(--cg-s1);
122
+ .cg-prose__body :where(ul, ol) {
123
+ padding-inline-start: 1.2em;
174
124
  }
175
125
 
176
- .cg-prose li::marker {
177
- color: var(--cg-accent);
178
- font-family: var(--cogenta-font-mono);
126
+ .cg-prose__body :where(li + li) {
127
+ margin-block-start: 0.35em;
179
128
  }
180
129
 
181
- .cg-prose strong {
182
- font-weight: var(--cg-weight-bold);
183
- color: var(--cg-ink);
130
+ .cg-prose__body :where(strong) {
131
+ font-weight: var(--cg-weight-semibold);
184
132
  }
185
133
 
186
- .cg-prose blockquote {
187
- margin-block: var(--cg-s10);
134
+ .cg-prose__body blockquote {
188
135
  margin-inline: 0;
189
- padding: var(--cg-s6) var(--cg-s6) var(--cg-s6) var(--cg-s8);
190
- border-inline-start: 3px solid var(--cg-accent);
191
- background: var(--cg-surface-sunken);
192
- color: var(--cg-ink);
193
- font-family: var(--cogenta-font-serif);
194
- font-style: italic;
136
+ padding-inline-start: var(--cg-s6);
137
+ border-inline-start: var(--cg-rule-strong) solid var(--cg-line-ink);
195
138
  font-size: var(--cg-text-lg);
196
- line-height: var(--cg-leading-normal);
197
- }
198
-
199
- .cg-prose blockquote > :first-child {
200
- margin-block-start: 0;
139
+ line-height: var(--cg-leading-lead);
201
140
  }
202
141
 
203
- .cg-prose blockquote > :last-child {
204
- margin-block-end: 0;
205
- }
206
-
207
- .cg-prose code {
208
- font-family: var(--cogenta-font-mono);
209
- font-size: 0.875em;
210
- background: var(--cg-surface-sunken);
211
- border-radius: var(--cg-radius-xs);
212
- box-shadow: var(--cg-ring);
213
- padding: 0.15em 0.4em;
142
+ .cg-prose__body :where(blockquote) p {
143
+ margin: 0;
214
144
  }
215
145
 
216
146
  .cg-prose__figure {
217
- margin-block: var(--cg-s10);
218
147
  margin-inline: 0;
219
148
  }
220
149
 
221
150
  .cg-prose__figure img {
222
151
  inline-size: 100%;
223
- border-radius: var(--cg-radius-md);
224
- box-shadow: var(--cg-elevation-2);
225
152
  }
226
153
 
227
154
  .cg-prose__figure figcaption {
228
- margin-block-start: var(--cg-s3);
229
- color: var(--cg-ink-subtle);
230
- font-family: var(--cogenta-font-mono);
231
- font-size: var(--cg-text-xs);
232
- letter-spacing: var(--cg-tracking-wide);
233
- line-height: var(--cg-leading-normal);
155
+ margin-block-start: var(--cg-s2);
156
+ color: var(--cg-ink-muted);
157
+ font-size: var(--cg-text-caption);
234
158
  }
235
159
 
236
- /* --- mediaFigure ----------------------------------------------------------
237
- A museum-plate treatment: a numbered tag drawn from a page-wide CSS
238
- counter precedes the caption, so figures number themselves in document
239
- order without this package tracking an index anywhere.
240
- ------------------------------------------------------------------------- */
160
+ @media (min-width: 64rem) {
161
+ .cg-prose__inner {
162
+ row-gap: 0;
163
+ }
241
164
 
242
- .cg-figure {
243
- margin-inline: auto;
244
- counter-increment: cg-figure;
245
- }
165
+ .cg-prose__label {
166
+ grid-column: 1 / span 3;
167
+ }
246
168
 
247
- .cg-figure[data-align="start"],
248
- .cg-figure[data-align="end"] {
249
- max-inline-size: calc(var(--cg-measure) / 2);
250
- }
169
+ .cg-prose__body {
170
+ grid-column: 4 / span 7;
171
+ }
251
172
 
252
- .cg-figure[data-align="start"] {
253
- float: inline-start;
254
- margin-inline-end: var(--cg-s6);
255
- }
173
+ /* The rule over a labelled text runs to the edge of the grid, like every
174
+ other label's; the text itself keeps its measure. */
175
+ .cg-prose[data-label="true"] .cg-prose__body {
176
+ grid-column: 4 / -1;
177
+ padding-block-start: var(--cg-s4);
178
+ border-block-start: var(--cg-rule) solid var(--cg-line-ink);
179
+ }
256
180
 
257
- .cg-figure[data-align="end"] {
258
- float: inline-end;
259
- margin-inline-start: var(--cg-s6);
181
+ .cg-prose[data-label="true"] .cg-prose__body > :first-child {
182
+ margin-block-start: 0;
183
+ }
260
184
  }
261
185
 
262
- .cg-figure[data-align="full"] {
263
- max-inline-size: none;
264
- padding-inline: 0;
186
+ /* --------------------------------------------------------------------------
187
+ mediaFigure: an image on the grid
188
+ -------------------------------------------------------------------------- */
189
+
190
+ .cg-figure__inner {
191
+ margin-block: 0;
265
192
  }
266
193
 
267
194
  .cg-figure__frame {
268
- position: relative;
269
- border: 1px solid var(--cg-line);
195
+ overflow: hidden;
196
+ background: var(--cg-surface-sunken);
270
197
  }
271
198
 
272
- .cg-figure__media {
273
- display: block;
274
- inline-size: 100%;
199
+ .cg-figure[style] .cg-figure__frame {
275
200
  aspect-ratio: var(--cg-ratio, auto);
276
201
  }
277
202
 
278
- .cg-figure[data-align="full"] .cg-figure__frame {
279
- border-inline: 0;
203
+ .cg-figure__image {
204
+ inline-size: 100%;
205
+ block-size: auto;
206
+ }
207
+
208
+ .cg-figure[style] .cg-figure__image {
209
+ block-size: 100%;
210
+ object-fit: cover;
280
211
  }
281
212
 
282
213
  .cg-figure__caption {
283
214
  display: flex;
284
- align-items: baseline;
285
- gap: var(--cg-s3);
215
+ flex-wrap: wrap;
216
+ gap: 0 var(--cg-s4);
286
217
  margin-block-start: var(--cg-s3);
287
- color: var(--cg-ink-subtle);
288
- font-size: var(--cg-text-sm);
289
- line-height: var(--cg-leading-normal);
290
- text-wrap: pretty;
291
- }
292
-
293
- .cg-figure[data-align="full"] .cg-figure__caption {
294
- max-inline-size: var(--cg-measure);
295
- margin-inline: auto;
296
- padding-inline: var(--cg-gutter);
218
+ color: var(--cg-ink-muted);
219
+ font-size: var(--cg-text-caption);
220
+ line-height: var(--cg-leading-ui);
297
221
  }
298
222
 
299
- .cg-figure__plate {
300
- flex: none;
223
+ .cg-figure__caption-text {
301
224
  color: var(--cg-ink);
302
225
  }
303
226
 
304
- .cg-figure__plate::before {
305
- content: "Fig. " counter(cg-figure, decimal-leading-zero) " — ";
306
- color: var(--cg-accent);
307
- font-family: var(--cogenta-font-mono);
308
- font-weight: var(--cg-weight-medium);
227
+ .cg-figure[data-align="full"] .cg-figure__frame {
228
+ margin-inline: calc(var(--cg-gutter) * -1);
309
229
  }
310
230
 
311
- .cg-figure__credit {
312
- color: var(--cg-ink-subtle);
313
- font-family: var(--cogenta-font-mono);
314
- font-size: 0.9em;
315
- }
231
+ @media (min-width: 64rem) {
232
+ .cg-figure[data-align="center"] .cg-container > * {
233
+ grid-column: 3 / span 8;
234
+ }
316
235
 
317
- .cg-figure__credit::before {
318
- content: "— ";
319
- }
236
+ .cg-figure[data-align="start"] .cg-container > * {
237
+ grid-column: 1 / span 7;
238
+ }
320
239
 
321
- /* --- featureGrid ------------------------------------------------------- */
240
+ .cg-figure[data-align="end"] .cg-container > * {
241
+ grid-column: 6 / span 7;
242
+ }
322
243
 
323
- .cg-features__items {
324
- display: grid;
325
- gap: 1px;
326
- background: var(--cg-line);
327
- border: 1px solid var(--cg-line);
328
- grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
329
- counter-reset: cg-feature;
244
+ .cg-figure[data-align="full"] .cg-figure__frame {
245
+ margin-inline: calc((100vw - 100%) / -2);
246
+ }
330
247
  }
331
248
 
332
- .cg-feature {
333
- position: relative;
334
- counter-increment: cg-feature;
335
- padding: var(--cg-s8) var(--cg-s6) var(--cg-s6);
336
- background: var(--cg-surface);
337
- transition: background-color var(--cg-duration) var(--cg-ease);
338
- }
249
+ /* --------------------------------------------------------------------------
250
+ featureGrid: services as rows, clients as names
251
+ -------------------------------------------------------------------------- */
339
252
 
340
- .cg-feature:hover {
341
- background: var(--cg-surface-tinted);
253
+ .cg-list__items {
254
+ margin: 0;
255
+ padding: 0;
256
+ list-style: none;
342
257
  }
343
258
 
344
- .cg-feature__link::after {
345
- content: "";
346
- position: absolute;
347
- inset: 0;
259
+ .cg-list[data-form="rows"] .cg-list__item {
260
+ display: grid;
261
+ gap: var(--cg-s2) var(--cg-col-gap);
262
+ padding-block: var(--cg-s5) var(--cg-s6);
263
+ border-block-end: var(--cg-rule) solid var(--cg-line);
348
264
  }
349
265
 
350
- .cg-feature__link {
351
- color: inherit;
352
- text-decoration: none;
266
+ .cg-list[data-form="rows"] .cg-list__item:first-child {
267
+ padding-block-start: 0;
353
268
  }
354
269
 
355
- .cg-feature:hover .cg-feature__link {
356
- color: var(--cg-accent);
270
+ .cg-list[data-form="rows"] .cg-list__name {
271
+ font-size: var(--cg-size-heading);
272
+ font-stretch: var(--cg-width-display);
273
+ font-weight: var(--cg-weight-medium);
274
+ line-height: var(--cg-leading-heading);
275
+ letter-spacing: var(--cg-tracking-heading);
357
276
  }
358
277
 
359
- .cg-feature__icon {
360
- display: block;
361
- margin-block-end: var(--cg-s4);
362
- color: var(--cg-accent);
278
+ .cg-list__text {
279
+ margin: 0;
280
+ max-inline-size: var(--cg-measure-short);
281
+ color: var(--cg-ink-muted);
282
+ font-size: var(--cg-text-md);
283
+ line-height: var(--cg-leading-text);
363
284
  }
364
285
 
365
- .cg-feature__index {
366
- display: block;
367
- margin-block-end: var(--cg-s6);
368
- color: var(--cg-line-strong);
369
- font-family: var(--cogenta-font-mono);
370
- font-size: var(--cg-text-xl);
371
- font-weight: var(--cg-weight-medium);
372
- transition: color var(--cg-duration) var(--cg-ease);
286
+ .cg-list[data-form="names"] .cg-list__items {
287
+ columns: 2;
288
+ column-gap: var(--cg-col-gap);
373
289
  }
374
290
 
375
- .cg-feature__index::before {
376
- content: counter(cg-feature, decimal-leading-zero);
291
+ .cg-list[data-form="names"] .cg-list__item {
292
+ break-inside: avoid;
293
+ padding-block: var(--cg-s2);
294
+ font-size: var(--cg-text-md);
295
+ line-height: var(--cg-leading-heading);
377
296
  }
378
297
 
379
- .cg-feature:hover .cg-feature__index {
380
- color: var(--cg-accent);
381
- }
298
+ @media (min-width: 48rem) {
299
+ .cg-list[data-form="rows"] .cg-list__item {
300
+ grid-template-columns: minmax(0, 5fr) minmax(0, 4fr);
301
+ align-items: baseline;
302
+ }
382
303
 
383
- .cg-feature__title {
384
- position: relative;
385
- margin: 0 0 var(--cg-s2);
386
- font-family: var(--cogenta-font-sans);
387
- font-size: var(--cg-text-lg);
388
- font-weight: var(--cg-weight-bold);
389
- line-height: var(--cg-leading-snug);
390
- letter-spacing: var(--cg-tracking-snug);
391
- text-wrap: balance;
392
- }
304
+ .cg-list[data-form="names"] .cg-list__items {
305
+ columns: 3;
306
+ }
393
307
 
394
- .cg-feature__text {
395
- margin: 0;
396
- color: var(--cg-ink-muted);
397
- line-height: var(--cg-leading-relaxed);
398
- text-wrap: pretty;
308
+ .cg-list[data-form="names"] .cg-list__item {
309
+ font-size: var(--cg-text-lg);
310
+ }
399
311
  }
400
312
 
401
- /* --- cta --------------------------------------------------------------- */
313
+ /* --------------------------------------------------------------------------
314
+ cta: the contact line
315
+ -------------------------------------------------------------------------- */
402
316
 
403
- .cg-cta {
404
- background: var(--cg-surface-inverted);
405
- color: var(--cg-surface-inverted-fg);
317
+ .cg-contact__inner {
318
+ row-gap: var(--cg-s6);
406
319
  }
407
320
 
408
- .cg-cta__frame {
409
- padding: var(--cg-s20) var(--cg-s8);
410
- text-align: center;
321
+ .cg-contact .cg-actions {
322
+ gap: var(--cg-s2) var(--cg-s8);
411
323
  }
412
324
 
413
- .cg-cta__title {
414
- margin: 0;
415
- font-family: var(--cogenta-font-sans);
416
- font-size: var(--cg-text-cta);
417
- line-height: var(--cg-leading-tight);
418
- letter-spacing: var(--cg-tracking-tighter);
419
- font-weight: var(--cg-weight-black);
420
- text-wrap: balance;
325
+ .cg-contact__copy {
326
+ display: grid;
327
+ gap: var(--cg-s3);
328
+ padding-block-start: var(--cg-s4);
329
+ border-block-start: var(--cg-rule) solid var(--cg-line-ink);
421
330
  }
422
331
 
423
- .cg-cta__text {
424
- margin: var(--cg-s5) auto 0;
425
- max-inline-size: var(--cg-measure-narrow);
426
- color: color-mix(in oklab, var(--cg-surface-inverted-fg) 78%, transparent);
427
- font-size: var(--cg-text-lg);
428
- line-height: var(--cg-leading-relaxed);
429
- text-wrap: pretty;
332
+ .cg-contact__title {
333
+ font-size: var(--cg-text-caption);
334
+ font-weight: var(--cg-weight-medium);
335
+ line-height: var(--cg-leading-ui);
336
+ letter-spacing: var(--cg-tracking-caption);
430
337
  }
431
338
 
432
- .cg-cta .cg-actions {
433
- justify-content: center;
339
+ .cg-contact__text {
340
+ margin: 0;
341
+ max-inline-size: 36ch;
342
+ color: var(--cg-ink-muted);
343
+ font-size: var(--cg-text-md);
344
+ line-height: var(--cg-leading-text);
434
345
  }
435
346
 
436
- .cg-cta .cg-action[data-emphasis="primary"] {
437
- background: var(--cg-accent);
438
- color: var(--cg-accent-fg);
347
+ .cg-contact__lead {
348
+ margin: 0;
439
349
  }
440
350
 
441
- .cg-cta .cg-action[data-emphasis="secondary"] {
442
- border-color: currentColor;
443
- color: inherit;
351
+ /* The one place the signal is seen at size: the underline of the studio's
352
+ address. The words stay in ink. */
353
+ .cg-action.cg-contact__link {
354
+ display: inline;
355
+ padding: 0;
356
+ border: 0;
357
+ background: none;
358
+ color: var(--cg-ink);
359
+ font-size: var(--cg-size-contact);
360
+ font-stretch: var(--cg-width-display);
361
+ font-weight: var(--cg-weight-medium);
362
+ line-height: var(--cg-leading-title);
363
+ letter-spacing: var(--cg-tracking-display);
364
+ white-space: normal;
365
+ overflow-wrap: anywhere;
366
+ text-decoration-line: underline;
367
+ text-decoration-thickness: max(3px, 0.05em);
368
+ text-decoration-color: var(--cg-signal);
369
+ text-decoration-skip-ink: none;
370
+ text-underline-offset: 0.12em;
371
+ }
372
+
373
+ .cg-action.cg-contact__link:hover {
374
+ background: none;
375
+ color: var(--cg-ink);
376
+ text-decoration-color: currentColor;
444
377
  }
445
378
 
446
- .cg-cta .cg-action[data-emphasis="secondary"]:hover {
447
- background: var(--cg-surface-inverted-fg);
448
- color: var(--cg-surface-inverted);
449
- border-color: var(--cg-surface-inverted-fg);
450
- }
379
+ @media (min-width: 64rem) {
380
+ /* The copy spans both rows, so the other actions sit right under the
381
+ address instead of waiting for the end of the paragraph beside it. A
382
+ spanning item only reaches a flexible track, so the first row keeps the
383
+ height of the address alone. */
384
+ .cg-contact__inner {
385
+ grid-template-rows: auto 1fr;
386
+ }
451
387
 
452
- /* --- gallery ------------------------------------------------------------- */
388
+ .cg-contact__copy {
389
+ grid-column: 1 / span 3;
390
+ grid-row: 1 / span 2;
391
+ align-self: start;
392
+ }
453
393
 
454
- .cg-gallery__items {
455
- display: grid;
456
- gap: 1px;
457
- background: var(--cg-line);
458
- grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
459
- counter-reset: cg-gallery;
460
- }
394
+ .cg-contact .cg-actions {
395
+ grid-row: 2;
396
+ align-self: start;
397
+ }
461
398
 
462
- .cg-gallery__item {
463
- position: relative;
464
- overflow: hidden;
465
- background: var(--cg-surface);
466
- counter-increment: cg-gallery;
467
- }
399
+ .cg-contact__lead,
400
+ .cg-contact .cg-actions {
401
+ grid-column: 4 / -1;
402
+ }
468
403
 
469
- .cg-gallery__index {
470
- position: absolute;
471
- inset-block-start: var(--cg-s3);
472
- inset-inline-start: var(--cg-s3);
473
- z-index: 1;
474
- padding: 0.15em 0.5em;
475
- background: var(--cg-surface-inverted);
476
- color: var(--cg-surface-inverted-fg);
477
- font-family: var(--cogenta-font-mono);
478
- font-size: var(--cg-text-xs);
479
- opacity: 0;
480
- transform: translateY(-4px);
481
- transition:
482
- opacity var(--cg-duration) var(--cg-ease),
483
- transform var(--cg-duration) var(--cg-ease);
404
+ .cg-contact__lead {
405
+ grid-row: 1;
406
+ padding-block-start: var(--cg-s4);
407
+ border-block-start: var(--cg-rule) solid var(--cg-line-ink);
408
+ }
484
409
  }
485
410
 
486
- .cg-gallery__index::before {
487
- content: counter(cg-gallery, decimal-leading-zero);
488
- }
411
+ /* --------------------------------------------------------------------------
412
+ gallery: pictures in sequence, each at its own shape
413
+ -------------------------------------------------------------------------- */
489
414
 
490
- .cg-gallery__item:hover .cg-gallery__index,
491
- .cg-gallery__item:focus-within .cg-gallery__index {
492
- opacity: 1;
493
- transform: translateY(0);
415
+ .cg-pictures__items {
416
+ display: grid;
417
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
418
+ gap: var(--cg-col-gap);
419
+ margin: 0;
420
+ padding: 0;
421
+ list-style: none;
494
422
  }
495
423
 
496
- .cg-gallery__image {
497
- inline-size: 100%;
498
- block-size: 100%;
499
- filter: grayscale(45%) contrast(1.02);
500
- transition:
501
- transform var(--cg-duration-slow) var(--cg-ease),
502
- filter var(--cg-duration-slow) var(--cg-ease);
424
+ .cg-pictures__item {
425
+ grid-column: 1 / -1;
426
+ min-inline-size: 0;
427
+ background: var(--cg-surface-sunken);
503
428
  }
504
429
 
505
- .cg-gallery__item:hover .cg-gallery__image {
506
- transform: scale(1.05);
507
- filter: grayscale(0%) contrast(1.02);
430
+ .cg-pictures__image {
431
+ inline-size: 100%;
432
+ block-size: auto;
508
433
  }
509
434
 
510
- .cg-gallery:not([data-layout="masonry"]) .cg-gallery__image {
511
- aspect-ratio: 4 / 3;
512
- }
435
+ @media (min-width: 48rem) {
436
+ .cg-pictures[data-layout="grid"] .cg-pictures__items {
437
+ align-items: end;
438
+ row-gap: calc(var(--cg-col-gap) * 2);
439
+ }
513
440
 
514
- .cg-gallery[data-layout="masonry"] .cg-gallery__items {
515
- display: block;
516
- columns: 3 14rem;
517
- column-gap: 1px;
518
- background: none;
519
- }
441
+ .cg-pictures[data-layout="grid"] .cg-pictures__item[data-place="1"] {
442
+ grid-column: 1 / span 7;
443
+ }
520
444
 
521
- .cg-gallery[data-layout="masonry"] .cg-gallery__item {
522
- break-inside: avoid;
523
- margin-block-end: 1px;
524
- }
445
+ .cg-pictures[data-layout="grid"] .cg-pictures__item[data-place="2"] {
446
+ grid-column: 8 / span 5;
447
+ }
525
448
 
526
- .cg-gallery[data-layout="carousel"] .cg-gallery__items {
527
- grid-auto-flow: column;
528
- grid-auto-columns: minmax(16rem, 40%);
449
+ .cg-pictures[data-layout="grid"] .cg-pictures__items[data-count="1"] .cg-pictures__item {
450
+ grid-column: 1 / -1;
451
+ }
529
452
  }
530
453
 
531
- .cg-gallery[data-layout="carousel"] .cg-gallery__item {
532
- scroll-snap-align: start;
454
+ .cg-pictures[data-layout="masonry"] .cg-pictures__items {
455
+ display: block;
456
+ columns: 2;
457
+ column-gap: var(--cg-col-gap);
533
458
  }
534
459
 
535
- /* --- quote ----------------------------------------------------------------
536
- Left-aligned at display scale, the way a feature breaks a quote out of the
537
- column rather than centring it as an aside.
538
- ------------------------------------------------------------------------- */
539
-
540
- .cg-quote {
541
- max-inline-size: var(--cg-page-narrow);
542
- margin-inline: auto;
460
+ .cg-pictures[data-layout="masonry"] .cg-pictures__item {
461
+ break-inside: avoid;
462
+ margin-block-end: var(--cg-col-gap);
543
463
  }
544
464
 
545
- .cg-quote::before {
546
- content: "\201C" / "";
547
- display: block;
548
- margin-block-end: calc(var(--cg-s6) * -1);
549
- color: var(--cg-accent);
550
- font-family: var(--cogenta-font-serif);
551
- font-size: calc(var(--cg-text-quote) * 1.6);
552
- line-height: 1;
465
+ @media (min-width: 64rem) {
466
+ .cg-pictures[data-layout="masonry"] .cg-pictures__items {
467
+ columns: 3;
468
+ }
553
469
  }
554
470
 
555
- .cg-quote__text {
556
- margin: 0;
557
- font-family: var(--cogenta-font-serif);
558
- font-size: var(--cg-text-quote);
559
- line-height: var(--cg-leading-snug);
560
- letter-spacing: var(--cg-tracking-snug);
561
- text-wrap: balance;
471
+ .cg-pictures__viewport {
472
+ overflow-x: auto;
473
+ overscroll-behavior-inline: contain;
474
+ scroll-snap-type: x mandatory;
475
+ scroll-padding-inline: var(--cg-gutter);
476
+ margin-inline: calc(var(--cg-gutter) * -1);
477
+ padding-inline: var(--cg-gutter);
562
478
  }
563
479
 
564
- .cg-quote__attribution {
480
+ .cg-pictures[data-layout="carousel"] .cg-pictures__items {
565
481
  display: flex;
566
- align-items: center;
567
- gap: var(--cg-s3);
568
- margin-block-start: var(--cg-s8);
569
- padding-block-start: var(--cg-s5);
570
- border-block-start: 1px solid var(--cg-line);
571
- color: var(--cg-ink-muted);
572
- font-family: var(--cogenta-font-mono);
573
- font-size: var(--cg-text-sm);
482
+ gap: var(--cg-col-gap);
483
+ padding-block-end: var(--cg-s4);
574
484
  }
575
485
 
576
- .cg-quote__avatar {
577
- inline-size: var(--cg-s12);
578
- block-size: var(--cg-s12);
579
- border-radius: var(--cg-radius-pill);
580
- box-shadow: var(--cg-ring);
486
+ .cg-pictures[data-layout="carousel"] .cg-pictures__item {
487
+ flex: none;
488
+ scroll-snap-align: start;
489
+ background: none;
581
490
  }
582
491
 
583
- .cg-quote__names {
584
- display: flex;
585
- flex-wrap: wrap;
586
- align-items: baseline;
587
- gap: var(--cg-s2);
492
+ .cg-pictures[data-layout="carousel"] .cg-pictures__image {
493
+ inline-size: auto;
494
+ block-size: clamp(16rem, 38vw, 34rem);
495
+ max-inline-size: 85vw;
496
+ object-fit: cover;
588
497
  }
589
498
 
590
- .cg-quote__author {
591
- font-weight: var(--cg-weight-semibold);
592
- color: var(--cg-ink);
593
- text-transform: uppercase;
594
- letter-spacing: var(--cg-tracking-wide);
595
- }
499
+ /* --------------------------------------------------------------------------
500
+ quote: a client's words, large
501
+ -------------------------------------------------------------------------- */
596
502
 
597
- .cg-quote__role::before {
598
- content: "— ";
503
+ .cg-quote__inner {
504
+ margin-block: 0;
505
+ row-gap: var(--cg-s8);
599
506
  }
600
507
 
601
- /* --- faq ------------------------------------------------------------------
602
- A plus mark drawn from two rotated bars, replacing the native marker;
603
- `[open]` rotates it into a cross.
604
- ------------------------------------------------------------------------- */
508
+ .cg-quote__quote {
509
+ margin: 0;
510
+ quotes: "\201C" "\201D" "\2018" "\2019";
511
+ }
605
512
 
606
- .cg-faq {
607
- max-inline-size: var(--cg-page-narrow);
608
- margin-inline: auto;
513
+ .cg-quote__text {
514
+ margin: 0;
515
+ font-size: var(--cg-size-lead);
516
+ font-stretch: var(--cg-width-display);
517
+ font-weight: var(--cg-weight-regular);
518
+ line-height: var(--cg-leading-lead);
519
+ letter-spacing: -0.01em;
520
+ text-wrap: pretty;
609
521
  }
610
522
 
611
- .cg-faq__items {
612
- border-block-start: 1px solid var(--cg-line);
523
+ .cg-quote__text::before {
524
+ content: open-quote;
613
525
  }
614
526
 
615
- .cg-faq__item {
616
- border-block-end: 1px solid var(--cg-line);
527
+ .cg-quote__text::after {
528
+ content: close-quote;
617
529
  }
618
530
 
619
- .cg-faq__question {
531
+ .cg-quote__attribution,
532
+ .cg-word__attribution {
620
533
  display: flex;
621
534
  align-items: center;
622
- justify-content: space-between;
623
535
  gap: var(--cg-s4);
624
- padding: var(--cg-s6) 0;
625
- font-family: var(--cogenta-font-sans);
626
- font-size: var(--cg-text-lg);
627
- font-weight: var(--cg-weight-bold);
628
- cursor: pointer;
629
- list-style: none;
630
- transition: color var(--cg-duration) var(--cg-ease);
536
+ font-size: var(--cg-text-caption);
537
+ line-height: var(--cg-leading-ui);
631
538
  }
632
539
 
633
- .cg-faq__question::-webkit-details-marker {
634
- display: none;
540
+ .cg-quote__who,
541
+ .cg-word__who {
542
+ display: grid;
635
543
  }
636
544
 
637
- .cg-faq__question:hover {
638
- color: var(--cg-accent);
545
+ .cg-quote__author,
546
+ .cg-word__name {
547
+ color: var(--cg-ink);
548
+ font-weight: var(--cg-weight-medium);
639
549
  }
640
550
 
641
- /* The plus/cross itself, clipped flat from a solid fill on the trailing
642
- pseudo-element's own box rather than drawn from borders or a gradient, so
643
- it stays perfectly centred at any font size. */
644
- .cg-faq__question::after {
645
- content: "";
646
- flex: none;
647
- inline-size: 0.9em;
648
- block-size: 0.9em;
649
- background: currentColor;
650
- clip-path: polygon(
651
- 43% 0%,
652
- 57% 0%,
653
- 57% 43%,
654
- 100% 43%,
655
- 100% 57%,
656
- 57% 57%,
657
- 57% 100%,
658
- 43% 100%,
659
- 43% 57%,
660
- 0% 57%,
661
- 0% 43%,
662
- 43% 43%
663
- );
664
- transition: transform var(--cg-duration) var(--cg-ease);
665
- }
666
-
667
- .cg-faq__details[open] .cg-faq__question::after {
668
- transform: rotate(90deg);
669
- }
670
-
671
- .cg-faq__details[open] .cg-faq__question {
672
- color: var(--cg-accent);
673
- }
674
-
675
- .cg-faq__answer {
676
- padding: 0 0 var(--cg-s6);
677
- max-inline-size: var(--cg-measure-narrow);
551
+ .cg-quote__role,
552
+ .cg-word__role {
678
553
  color: var(--cg-ink-muted);
679
- line-height: var(--cg-leading-relaxed);
680
- }
681
-
682
- .cg-faq__answer > :first-child {
683
- margin-block-start: 0;
684
554
  }
685
555
 
686
- .cg-faq__answer > :last-child {
687
- margin-block-end: 0;
556
+ .cg-quote__avatar,
557
+ .cg-word__avatar {
558
+ inline-size: 3rem;
559
+ block-size: 3rem;
560
+ border-radius: var(--cg-radius);
561
+ object-fit: cover;
688
562
  }
689
563
 
690
- /* --- stats --------------------------------------------------------------- */
564
+ @media (min-width: 64rem) {
565
+ .cg-quote .cg-container > * {
566
+ grid-column: 4 / span 8;
567
+ }
691
568
 
692
- .cg-stats__items {
693
- display: grid;
694
- gap: 1px;
695
- background: var(--cg-line);
696
- border: 1px solid var(--cg-line);
697
- grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
698
- margin: 0;
569
+ .cg-quote__text {
570
+ font-size: clamp(var(--cg-text-xl), calc(0.8rem + 1.9vw), var(--cg-text-4xl));
571
+ }
699
572
  }
700
573
 
701
- .cg-stat {
702
- display: flex;
703
- flex-direction: column-reverse;
704
- gap: var(--cg-s2);
705
- padding: var(--cg-s6);
706
- background: var(--cg-surface);
707
- }
574
+ /* --------------------------------------------------------------------------
575
+ testimonial: a paragraph from a client
576
+ -------------------------------------------------------------------------- */
708
577
 
709
- .cg-stat__value {
710
- display: flex;
711
- align-items: baseline;
712
- gap: var(--cg-s1);
713
- margin: 0;
714
- color: var(--cg-ink);
715
- font-family: var(--cogenta-font-sans);
716
- font-size: var(--cg-text-stat);
717
- font-weight: var(--cg-weight-black);
718
- line-height: var(--cg-leading-tight);
719
- letter-spacing: var(--cg-tracking-tight);
720
- font-variant-numeric: tabular-nums;
578
+ .cg-word__inner {
579
+ margin-block: 0;
580
+ row-gap: var(--cg-s6);
721
581
  }
722
582
 
723
- .cg-stat__unit {
724
- color: var(--cg-accent);
725
- font-family: var(--cogenta-font-mono);
726
- font-size: var(--cg-text-md);
727
- font-weight: var(--cg-weight-medium);
583
+ .cg-word__quote {
584
+ margin: 0;
585
+ padding-block-start: var(--cg-s5);
586
+ border-block-start: var(--cg-rule) solid var(--cg-line-ink);
587
+ font-size: var(--cg-text-lg);
588
+ line-height: var(--cg-leading-lead);
728
589
  }
729
590
 
730
- .cg-stat__label {
731
- color: var(--cg-ink-muted);
732
- font-family: var(--cogenta-font-mono);
733
- font-size: var(--cg-text-xs);
734
- font-weight: var(--cg-weight-medium);
735
- letter-spacing: var(--cg-tracking-wide);
736
- text-transform: uppercase;
591
+ .cg-word__quote p {
592
+ margin: 0;
593
+ max-inline-size: 52ch;
737
594
  }
738
595
 
739
- /* --- logos ----------------------------------------------------------------
740
- A single-row ledger: a running index beside each mark, desaturated until
741
- hover or focus resolves it to full ink.
742
- ------------------------------------------------------------------------- */
743
-
744
- .cg-logos__items {
745
- display: flex;
746
- flex-wrap: wrap;
747
- gap: 0;
748
- border-block-start: 1px solid var(--cg-line);
596
+ .cg-word__quote p + p {
597
+ margin-block-start: 0.8em;
749
598
  }
750
599
 
751
- .cg-logo {
752
- display: flex;
753
- align-items: center;
754
- gap: var(--cg-s3);
755
- padding: var(--cg-s5) var(--cg-s6);
756
- flex: 1 1 12rem;
757
- border-block-end: 1px solid var(--cg-line);
758
- border-inline-end: 1px solid var(--cg-line);
600
+ @media (min-width: 64rem) {
601
+ .cg-word .cg-container > * {
602
+ grid-column: 4 / -1;
603
+ }
759
604
  }
760
605
 
761
- .cg-logo__index {
762
- flex: none;
763
- color: var(--cg-line-strong);
764
- font-family: var(--cogenta-font-mono);
765
- font-size: var(--cg-text-xs);
766
- }
606
+ /* --------------------------------------------------------------------------
607
+ faq: answers, set open
608
+ -------------------------------------------------------------------------- */
767
609
 
768
- .cg-logo__image {
769
- block-size: var(--cg-s10);
770
- inline-size: auto;
771
- max-inline-size: 100%;
772
- object-fit: contain;
773
- filter: grayscale(100%);
774
- opacity: 0.65;
775
- transition:
776
- opacity var(--cg-duration) var(--cg-ease),
777
- filter var(--cg-duration) var(--cg-ease);
610
+ .cg-answers__item {
611
+ display: grid;
612
+ gap: var(--cg-s3) var(--cg-col-gap);
613
+ padding-block: var(--cg-s5) var(--cg-s6);
614
+ border-block-end: var(--cg-rule) solid var(--cg-line);
778
615
  }
779
616
 
780
- .cg-logo__link {
781
- display: inline-flex;
782
- align-items: center;
783
- justify-content: center;
617
+ .cg-answers__item:first-child {
618
+ padding-block-start: 0;
784
619
  }
785
620
 
786
- .cg-logo:hover .cg-logo__image,
787
- .cg-logo__link:focus-visible .cg-logo__image {
788
- opacity: 1;
789
- filter: grayscale(0%);
621
+ .cg-answers__question {
622
+ font-size: var(--cg-text-lg);
623
+ font-weight: var(--cg-weight-medium);
624
+ line-height: var(--cg-leading-heading);
790
625
  }
791
626
 
792
- .cg-logo:hover .cg-logo__index {
793
- color: var(--cg-accent);
627
+ .cg-answers__answer {
628
+ color: var(--cg-ink-muted);
629
+ line-height: var(--cg-leading-text);
794
630
  }
795
631
 
796
- /* --- collectionList ---------------------------------------------------
797
- An editorial index: numbered rows, the title set big, the date pushed to
798
- the far edge. `data-layout="grid"`/`"carousel"` retile the same rows.
799
- ------------------------------------------------------------------------- */
800
-
801
- .cg-collection__items {
632
+ .cg-answers__answer p {
802
633
  margin: 0;
803
- padding: 0;
804
- /* Found by looking at a real screenshot: without this, the browser's own
805
- `<ol>` decimal marker ("1.") sat right beside this theme's own
806
- `.cg-entry__index` badge ("01") — two numbering systems stacked, on
807
- every layout, since this rule predates L25. */
808
- list-style: none;
809
- border-block-start: 1px solid var(--cg-line);
810
- }
811
-
812
- .cg-entry {
813
- position: relative;
814
- border-block-end: 1px solid var(--cg-line);
815
- }
816
-
817
- .cg-entry__body {
818
- display: grid;
819
- grid-template-columns: auto 1fr auto;
820
- align-items: baseline;
821
- column-gap: var(--cg-s5);
822
- padding-block: var(--cg-s6);
823
- transition: background-color var(--cg-duration) var(--cg-ease);
634
+ max-inline-size: var(--cg-measure-short);
824
635
  }
825
636
 
826
- .cg-entry:hover .cg-entry__body {
827
- background: var(--cg-surface-tinted);
637
+ .cg-answers__answer p + p {
638
+ margin-block-start: 0.8em;
828
639
  }
829
640
 
830
- .cg-entry__index {
831
- grid-column: 1;
832
- color: var(--cg-line-strong);
833
- font-family: var(--cogenta-font-mono);
834
- font-size: var(--cg-text-sm);
835
- transition: color var(--cg-duration) var(--cg-ease);
641
+ @media (min-width: 48rem) {
642
+ .cg-answers__item {
643
+ grid-template-columns: minmax(0, 4fr) minmax(0, 5fr);
644
+ align-items: baseline;
645
+ }
836
646
  }
837
647
 
838
- .cg-entry:hover .cg-entry__index {
839
- color: var(--cg-accent);
840
- }
648
+ /* --------------------------------------------------------------------------
649
+ stats: figures side by side
650
+ -------------------------------------------------------------------------- */
841
651
 
842
- .cg-entry__title {
843
- grid-column: 2;
652
+ .cg-figures__items {
653
+ display: grid;
654
+ grid-template-columns: repeat(2, minmax(0, 1fr));
655
+ gap: var(--cg-s10) var(--cg-col-gap);
844
656
  margin: 0;
845
- font-family: var(--cogenta-font-sans);
846
- font-size: var(--cg-text-xl);
847
- font-weight: var(--cg-weight-bold);
848
- line-height: var(--cg-leading-snug);
849
- letter-spacing: var(--cg-tracking-snug);
850
- text-wrap: balance;
851
657
  }
852
658
 
853
- .cg-entry__link {
854
- color: inherit;
855
- text-decoration: none;
659
+ .cg-figures__item {
660
+ padding-block-start: var(--cg-s4);
661
+ border-block-start: var(--cg-rule) solid var(--cg-line-ink);
856
662
  }
857
663
 
858
- .cg-entry__link::after {
859
- content: "";
860
- position: absolute;
861
- inset: 0;
664
+ .cg-figures__figure {
665
+ display: flex;
666
+ align-items: baseline;
667
+ gap: 0.2em;
862
668
  }
863
669
 
864
- .cg-entry:hover .cg-entry__link {
865
- color: var(--cg-accent);
670
+ .cg-figures__value {
671
+ font-size: var(--cg-size-figure);
672
+ font-stretch: var(--cg-width-display);
673
+ font-weight: var(--cg-weight-regular);
674
+ line-height: var(--cg-leading-display);
675
+ letter-spacing: var(--cg-tracking-display);
676
+ font-variant-numeric: lining-nums tabular-nums;
866
677
  }
867
678
 
868
- .cg-entry__date {
869
- grid-column: 3;
870
- color: var(--cg-ink-subtle);
871
- font-family: var(--cogenta-font-mono);
872
- font-size: var(--cg-text-xs);
873
- letter-spacing: var(--cg-tracking-wide);
874
- text-transform: uppercase;
875
- white-space: nowrap;
679
+ .cg-figures__unit {
680
+ font-size: var(--cg-text-lg);
681
+ font-weight: var(--cg-weight-medium);
876
682
  }
877
683
 
878
- .cg-entry__excerpt {
879
- grid-column: 2 / span 1;
880
- margin: var(--cg-s2) 0 0;
684
+ .cg-figures__label {
685
+ margin: var(--cg-s3) 0 0;
686
+ max-inline-size: 24ch;
881
687
  color: var(--cg-ink-muted);
882
- font-size: var(--cg-text-sm);
883
- line-height: var(--cg-leading-relaxed);
884
- display: -webkit-box;
885
- -webkit-box-orient: vertical;
886
- -webkit-line-clamp: 2;
887
- line-clamp: 2;
888
- overflow: hidden;
889
- }
890
-
891
- .cg-collection__empty {
892
- padding: var(--cg-s10);
893
- border: 1px dashed var(--cg-line-strong);
894
- color: var(--cg-ink-subtle);
895
- text-align: center;
688
+ font-size: var(--cg-text-caption);
689
+ line-height: var(--cg-leading-ui);
896
690
  }
897
691
 
898
- /* Tiled layouts (`grid`/`carousel`) retile the same entries into full-bleed
899
- project cards — a cover, the index, the title in display type, and the
900
- entry's own raw `role`/`year` meta line when the collection behind it has
901
- them. `grid`: one column at 360, two full-bleed columns from 1280
902
- (`--cg-page` is wide enough that "full-bleed" here means "no gutter
903
- between the two", not "past the viewport edge"). `carousel`: the same
904
- card, horizontally scroll-snapped. */
905
- .cg-collection[data-layout="grid"] .cg-collection__items,
906
- .cg-collection[data-layout="carousel"] .cg-collection__items {
907
- display: grid;
908
- gap: var(--cg-gap-loose);
692
+ .cg-figures .cg-head {
909
693
  border-block-start: 0;
694
+ padding-block-start: 0;
695
+ margin-block-end: var(--cg-s6);
910
696
  }
911
697
 
912
- .cg-collection[data-layout="grid"] .cg-collection__items {
913
- grid-template-columns: 1fr;
914
- }
698
+ @media (min-width: 64rem) {
699
+ .cg-figures__items {
700
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
701
+ }
915
702
 
916
- @media (min-width: 80rem) {
917
- .cg-collection[data-layout="grid"] .cg-collection__items {
918
- grid-template-columns: 1fr 1fr;
703
+ .cg-figures__item {
704
+ grid-column: span 3;
919
705
  }
920
- }
921
706
 
922
- .cg-collection[data-layout="carousel"] .cg-collection__items {
923
- grid-auto-flow: column;
924
- grid-auto-columns: minmax(20rem, 80%);
925
- }
707
+ .cg-figures[data-count="2"] .cg-figures__item {
708
+ grid-column: span 6;
709
+ }
926
710
 
927
- @media (min-width: 48rem) {
928
- .cg-collection[data-layout="carousel"] .cg-collection__items {
929
- grid-auto-columns: minmax(22rem, 45%);
711
+ .cg-figures[data-count="3"] .cg-figures__item {
712
+ grid-column: span 4;
930
713
  }
931
714
  }
932
715
 
933
- .cg-collection[data-layout="carousel"] .cg-entry {
934
- scroll-snap-align: start;
935
- }
716
+ /* --------------------------------------------------------------------------
717
+ logos: marks on light plates
718
+ -------------------------------------------------------------------------- */
936
719
 
937
- .cg-entry--card {
938
- border-block-end: 0;
720
+ .cg-marks__items {
721
+ display: grid;
722
+ grid-template-columns: repeat(2, minmax(0, 1fr));
723
+ gap: var(--cg-s8) var(--cg-col-gap);
724
+ margin: 0;
725
+ padding: 0;
726
+ list-style: none;
939
727
  }
940
728
 
941
- .cg-entry--card .cg-entry__body {
942
- display: block;
943
- padding-block: 0;
729
+ .cg-marks__plate {
730
+ display: flex;
731
+ align-items: center;
732
+ justify-content: center;
733
+ aspect-ratio: 3 / 2;
734
+ padding: 18%;
735
+ background: var(--cg-plate);
944
736
  }
945
737
 
946
- /* A flat offset shadow on hover/focus, never a blur — `translate` is the
947
- only motion, gated by `prefers-reduced-motion` in `base.css`'s global
948
- rule. */
949
- .cg-entry--card .cg-entry__cover-link {
950
- display: block;
951
- position: relative;
952
- margin-block-end: var(--cg-s5);
953
- border: 1px solid var(--cg-line);
954
- transition:
955
- transform var(--cg-duration) var(--cg-ease),
956
- box-shadow var(--cg-duration) var(--cg-ease);
738
+ .cg-marks__image {
739
+ inline-size: 100%;
740
+ block-size: 100%;
741
+ object-fit: contain;
742
+ filter: none;
957
743
  }
958
744
 
959
- .cg-entry--card:hover .cg-entry__cover-link,
960
- .cg-entry--card:focus-within .cg-entry__cover-link {
961
- transform: translate(-0.3rem, -0.3rem);
962
- box-shadow: var(--cg-elevation-2);
745
+ .cg-marks__name {
746
+ margin: var(--cg-s3) 0 0;
747
+ color: var(--cg-ink-muted);
748
+ font-size: var(--cg-text-caption);
963
749
  }
964
750
 
965
- .cg-entry__cover,
966
- .cg-entry__cover-empty {
967
- display: block;
968
- inline-size: 100%;
969
- aspect-ratio: 4 / 3;
970
- object-fit: cover;
751
+ @media (min-width: 64rem) {
752
+ .cg-marks__items {
753
+ grid-template-columns: repeat(4, minmax(0, 1fr));
754
+ }
971
755
  }
972
756
 
973
- .cg-entry__cover-empty {
974
- background: var(--cg-surface-tinted);
757
+ /* --------------------------------------------------------------------------
758
+ logoStrip: a line of marks between hairlines
759
+ -------------------------------------------------------------------------- */
760
+
761
+ .cg-credits__inner {
762
+ row-gap: var(--cg-s6);
763
+ align-items: center;
764
+ padding-block: var(--cg-s6);
975
765
  }
976
766
 
977
- .cg-entry--card .cg-entry__index {
978
- display: block;
979
- margin-block-end: var(--cg-s2);
767
+ .cg-credits__inner::before,
768
+ .cg-credits__inner::after {
769
+ content: "";
770
+ grid-column: 1 / -1;
771
+ block-size: var(--cg-rule);
772
+ background: var(--cg-line);
980
773
  }
981
774
 
982
- .cg-entry--card .cg-entry__title {
983
- font-size: var(--cg-text-2xl);
775
+ .cg-credits__caption {
776
+ margin: 0;
777
+ color: var(--cg-ink-muted);
778
+ font-size: var(--cg-text-caption);
984
779
  }
985
780
 
986
- .cg-entry--card .cg-entry__link::after {
987
- /* The card link target is the cover, not this second copy of `::after` —
988
- the base rule would otherwise stretch a second full-card hit target on
989
- top of it and swallow the cover's own link. */
990
- content: none;
781
+ .cg-credits__items {
782
+ display: flex;
783
+ flex-wrap: wrap;
784
+ align-items: center;
785
+ gap: var(--cg-s6) var(--cg-s12);
786
+ margin: 0;
787
+ padding: 0;
788
+ list-style: none;
991
789
  }
992
790
 
993
- .cg-collection__meta {
791
+ .cg-credits__item {
994
792
  display: flex;
995
- gap: var(--cg-s3);
996
- margin: var(--cg-s2) 0 0;
997
- color: var(--cg-ink-subtle);
998
- font-family: var(--cogenta-font-mono);
999
- font-size: var(--cg-text-xs);
1000
- letter-spacing: var(--cg-tracking-wide);
1001
- text-transform: uppercase;
793
+ align-items: center;
794
+ padding: var(--cg-s2) var(--cg-s3);
795
+ background: var(--cg-plate);
1002
796
  }
1003
797
 
1004
- .cg-collection__meta-role::after {
1005
- content: "·";
1006
- margin-inline-start: var(--cg-s3);
1007
- color: var(--cg-line-strong);
798
+ .cg-credits__image {
799
+ block-size: 2.25rem;
800
+ inline-size: auto;
801
+ max-inline-size: 9rem;
802
+ object-fit: contain;
803
+ filter: none;
1008
804
  }
1009
805
 
1010
- .cg-collection[data-layout="grid"] .cg-entry__date,
1011
- .cg-collection[data-layout="carousel"] .cg-entry__date {
1012
- order: -1;
1013
- margin-block-end: var(--cg-s2);
806
+ @media (min-width: 64rem) {
807
+ .cg-credits__caption {
808
+ grid-column: 1 / span 3;
809
+ }
810
+
811
+ .cg-credits[data-captioned="true"] .cg-credits__items {
812
+ grid-column: 4 / -1;
813
+ }
1014
814
  }
1015
815
 
1016
- /* --- embed ------------------------------------------------------------- */
816
+ /* --------------------------------------------------------------------------
817
+ embed: a film at the size of an image
818
+ -------------------------------------------------------------------------- */
1017
819
 
1018
- .cg-embed {
820
+ .cg-embed__frame {
821
+ position: relative;
1019
822
  aspect-ratio: var(--cg-ratio, 16 / 9);
1020
- max-inline-size: var(--cg-measure);
1021
- margin-inline: auto;
1022
- border: 1px solid var(--cg-line);
823
+ background: var(--cg-surface-sunken);
1023
824
  }
1024
825
 
1025
- .cg-embed__frame {
826
+ .cg-embed__player {
827
+ position: absolute;
828
+ inset: 0;
1026
829
  inline-size: 100%;
1027
830
  block-size: 100%;
1028
831
  border: 0;
1029
832
  }
1030
833
 
1031
- .cg-embed__placeholder {
834
+ .cg-embed__notice {
835
+ position: absolute;
836
+ inset: 0;
1032
837
  display: flex;
1033
838
  flex-direction: column;
1034
- align-items: center;
1035
- justify-content: center;
1036
- gap: var(--cg-s4);
1037
- block-size: 100%;
839
+ justify-content: flex-end;
840
+ gap: var(--cg-s2);
1038
841
  padding: var(--cg-s8);
1039
- background: var(--cg-surface-sunken);
1040
- color: var(--cg-ink-muted);
1041
- text-align: center;
1042
- }
1043
-
1044
- .cg-embed__tag {
1045
- color: var(--cg-accent);
1046
- font-family: var(--cogenta-font-mono);
1047
- font-size: var(--cg-text-xs);
1048
- letter-spacing: var(--cg-tracking-wide);
1049
- text-transform: uppercase;
842
+ border: var(--cg-rule) solid var(--cg-line);
1050
843
  }
1051
844
 
1052
- .cg-embed__notice {
845
+ .cg-embed__label {
1053
846
  margin: 0;
1054
- max-inline-size: var(--cg-measure-narrow);
1055
- line-height: var(--cg-leading-relaxed);
1056
- text-wrap: pretty;
1057
- }
1058
-
1059
- .cg-embed__link {
1060
- display: inline-flex;
1061
- align-items: center;
1062
- min-block-size: 44px;
1063
- padding: var(--cg-s3) var(--cg-s6);
1064
- border: 1px solid var(--cg-ink);
1065
- color: var(--cg-ink);
1066
- font-family: var(--cogenta-font-mono);
1067
- font-size: var(--cg-text-sm);
1068
- font-weight: var(--cg-weight-medium);
1069
- text-decoration: none;
1070
- transition:
1071
- background-color var(--cg-duration) var(--cg-ease),
1072
- color var(--cg-duration) var(--cg-ease),
1073
- border-color var(--cg-duration) var(--cg-ease);
1074
- }
1075
-
1076
- .cg-embed__link:hover {
1077
- background: var(--cg-accent);
1078
- border-color: var(--cg-accent);
1079
- color: var(--cg-accent-fg);
1080
- }
1081
-
1082
- /* --- testimonial (blocks@2.0, RFC 0001) ------------------------------------
1083
- A bordered card rather than `quote`'s own full-bleed pull quote — this is
1084
- the shape that survives sitting several-up in a wall, at a quieter scale.
1085
- ------------------------------------------------------------------------- */
1086
-
1087
- .cg-testimonial {
1088
- max-inline-size: var(--cg-page-narrow);
1089
- margin-inline: auto;
1090
- padding: var(--cg-s8) var(--cg-s8) var(--cg-s6);
1091
- border: 1px solid var(--cg-line);
1092
- background: var(--cg-surface);
847
+ color: var(--cg-ink-muted);
848
+ font-size: var(--cg-text-caption);
1093
849
  }
1094
850
 
1095
- .cg-testimonial__quote {
1096
- position: relative;
851
+ .cg-embed__reason {
1097
852
  margin: 0;
1098
- padding-inline-start: var(--cg-s6);
1099
- font-family: var(--cogenta-font-serif);
853
+ max-inline-size: 40ch;
1100
854
  font-size: var(--cg-text-lg);
1101
- line-height: var(--cg-leading-relaxed);
1102
- text-wrap: pretty;
1103
- }
1104
-
1105
- .cg-testimonial__quote::before {
1106
- content: "\201C";
1107
- position: absolute;
1108
- inset-inline-start: 0;
1109
- inset-block-start: -0.1em;
1110
- color: var(--cg-accent);
1111
- font-family: var(--cogenta-font-serif);
1112
- font-size: 1.6em;
1113
- line-height: 1;
1114
- }
1115
-
1116
- .cg-testimonial__quote > :first-child {
1117
- margin-block-start: 0;
1118
- }
1119
-
1120
- .cg-testimonial__quote > :last-child {
1121
- margin-block-end: 0;
855
+ line-height: var(--cg-leading-lead);
1122
856
  }
1123
857
 
1124
- .cg-testimonial__attribution {
1125
- display: flex;
1126
- align-items: center;
1127
- gap: var(--cg-s3);
1128
- margin-block-start: var(--cg-s6);
1129
- padding-block-start: var(--cg-s5);
1130
- border-block-start: 1px solid var(--cg-line);
1131
- color: var(--cg-ink-muted);
1132
- font-family: var(--cogenta-font-mono);
1133
- font-size: var(--cg-text-sm);
1134
- }
1135
-
1136
- .cg-testimonial__avatar {
1137
- inline-size: var(--cg-s10);
1138
- block-size: var(--cg-s10);
1139
- border-radius: var(--cg-radius-pill);
1140
- box-shadow: var(--cg-ring);
1141
- }
1142
-
1143
- .cg-testimonial__names {
1144
- display: flex;
1145
- flex-wrap: wrap;
1146
- align-items: baseline;
1147
- gap: var(--cg-s2);
1148
- }
1149
-
1150
- .cg-testimonial__name {
1151
- font-weight: var(--cg-weight-semibold);
1152
- color: var(--cg-ink);
1153
- text-transform: uppercase;
1154
- letter-spacing: var(--cg-tracking-wide);
858
+ .cg-embed__link {
859
+ justify-self: start;
860
+ align-self: flex-start;
861
+ padding-block: var(--cg-s2);
1155
862
  }
1156
863
 
1157
- .cg-testimonial__role::before {
1158
- content: "— ";
864
+ @media (min-width: 64rem) {
865
+ .cg-embed .cg-container > * {
866
+ grid-column: 3 / span 8;
867
+ }
1159
868
  }
1160
869
 
1161
- /* --- pricingTable (blocks@2.0, RFC 0001) -----------------------------------
1162
- Tiers as bordered columns, the same "cut paper" grid `featureGrid` and
1163
- `stats` use. The highlighted tier is signalled entirely through the frame
1164
- (a heavier, accent-coloured border and a slight lift) — never a filled
1165
- colour block, so the emphasis reads as structural rather than decorative.
1166
- ------------------------------------------------------------------------- */
870
+ /* --------------------------------------------------------------------------
871
+ pricingTable: fees as the columns of a ruled table
872
+ -------------------------------------------------------------------------- */
1167
873
 
1168
- .cg-pricing__title {
1169
- margin: 0 0 var(--cg-s8);
1170
- font-family: var(--cogenta-font-sans);
1171
- font-size: var(--cg-text-2xl);
1172
- font-weight: var(--cg-weight-black);
1173
- letter-spacing: var(--cg-tracking-tight);
1174
- text-wrap: balance;
1175
- }
1176
-
1177
- .cg-pricing__tiers {
874
+ .cg-fees__tiers {
1178
875
  display: grid;
1179
- gap: var(--cg-s5);
876
+ gap: var(--cg-s10) var(--cg-col-gap);
1180
877
  margin: 0;
1181
878
  padding: 0;
1182
879
  list-style: none;
1183
- grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
1184
880
  }
1185
881
 
1186
- .cg-pricing__tier {
882
+ .cg-fees__tier {
1187
883
  display: flex;
1188
884
  flex-direction: column;
1189
- padding: var(--cg-s8) var(--cg-s6);
1190
- border: 1px solid var(--cg-line);
1191
- background: var(--cg-surface);
1192
- }
1193
-
1194
- .cg-pricing__tier[data-highlighted="true"] {
1195
- border-color: var(--cg-accent);
1196
- border-width: 2px;
1197
- padding: calc(var(--cg-s8) - 1px) calc(var(--cg-s6) - 1px);
1198
- box-shadow: var(--cg-elevation-2);
885
+ gap: var(--cg-s4);
886
+ padding-block-start: var(--cg-s4);
887
+ border-block-start: var(--cg-rule) solid var(--cg-line-strong);
1199
888
  }
1200
889
 
1201
- .cg-pricing__name {
1202
- margin: 0 0 var(--cg-s3);
1203
- font-family: var(--cogenta-font-mono);
1204
- font-size: var(--cg-text-xs);
1205
- font-weight: var(--cg-weight-semibold);
1206
- letter-spacing: var(--cg-tracking-wider);
1207
- text-transform: uppercase;
1208
- color: var(--cg-ink-muted);
890
+ .cg-fees__tier[data-highlighted="true"] {
891
+ border-block-start: var(--cg-rule-heavy) solid var(--cg-line-ink);
892
+ padding-block-start: calc(var(--cg-s4) - var(--cg-rule-heavy) + var(--cg-rule));
1209
893
  }
1210
894
 
1211
- .cg-pricing__tier[data-highlighted="true"] .cg-pricing__name {
1212
- color: var(--cg-accent);
895
+ .cg-fees__name {
896
+ font-size: var(--cg-text-caption);
897
+ font-weight: var(--cg-weight-medium);
898
+ line-height: var(--cg-leading-ui);
1213
899
  }
1214
900
 
1215
- .cg-pricing__price {
901
+ .cg-fees__price {
1216
902
  display: flex;
903
+ flex-wrap: wrap;
1217
904
  align-items: baseline;
1218
- gap: var(--cg-s1);
1219
- margin: 0 0 var(--cg-s6);
1220
- color: var(--cg-ink);
1221
- font-family: var(--cogenta-font-sans);
1222
- font-size: var(--cg-text-2xl);
1223
- font-weight: var(--cg-weight-black);
1224
- letter-spacing: var(--cg-tracking-tight);
1225
- font-variant-numeric: tabular-nums;
905
+ gap: 0.3em;
906
+ margin: 0;
907
+ }
908
+
909
+ .cg-fees__amount {
910
+ font-size: var(--cg-size-figure);
911
+ font-stretch: var(--cg-width-display);
912
+ line-height: var(--cg-leading-display);
913
+ letter-spacing: var(--cg-tracking-display);
914
+ font-variant-numeric: lining-nums tabular-nums;
1226
915
  }
1227
916
 
1228
- .cg-pricing__interval {
917
+ .cg-fees__interval {
1229
918
  color: var(--cg-ink-muted);
1230
- font-family: var(--cogenta-font-mono);
1231
- font-size: var(--cg-text-sm);
1232
- font-weight: var(--cg-weight-medium);
919
+ font-size: var(--cg-text-md);
1233
920
  }
1234
921
 
1235
- .cg-pricing__features {
1236
- flex: 1;
1237
- margin: 0 0 var(--cg-s6);
922
+ .cg-fees__features {
923
+ margin: 0;
1238
924
  padding: 0;
1239
925
  list-style: none;
1240
- border-block-start: 1px solid var(--cg-line-soft);
926
+ font-size: var(--cg-text-md);
1241
927
  }
1242
928
 
1243
- .cg-pricing__features li {
1244
- padding: var(--cg-s3) 0;
1245
- border-block-end: 1px solid var(--cg-line-soft);
1246
- color: var(--cg-ink-muted);
1247
- font-size: var(--cg-text-sm);
1248
- line-height: var(--cg-leading-normal);
929
+ .cg-fees__feature {
930
+ padding-block: var(--cg-s2);
931
+ border-block-end: var(--cg-rule) solid var(--cg-line);
1249
932
  }
1250
933
 
1251
- .cg-pricing__action .cg-action {
1252
- inline-size: 100%;
1253
- justify-content: center;
934
+ .cg-fees__action {
935
+ margin-block-start: auto;
936
+ padding-block-start: var(--cg-s2);
1254
937
  }
1255
938
 
1256
- /* --- accordion (blocks@2.0, RFC 0001) --------------------------------------
1257
- `faq`'s own zero-JS mechanism, reused, but drawn as a numbered ledger
1258
- rather than a wall of questions: a plain rotating caret, not the plus/cross
1259
- `faq.ts` uses, so the two never look like restatements of one another.
1260
- ------------------------------------------------------------------------- */
1261
-
1262
- .cg-accordion {
1263
- max-inline-size: var(--cg-page-narrow);
1264
- margin-inline: auto;
939
+ @media (min-width: 48rem) {
940
+ .cg-fees__tiers {
941
+ grid-template-columns: repeat(2, minmax(0, 1fr));
942
+ }
1265
943
  }
1266
944
 
1267
- .cg-accordion__title {
1268
- margin: 0 0 var(--cg-s2);
1269
- font-family: var(--cogenta-font-sans);
1270
- font-size: var(--cg-text-2xl);
1271
- font-weight: var(--cg-weight-black);
1272
- letter-spacing: var(--cg-tracking-tight);
1273
- text-wrap: balance;
945
+ @media (min-width: 64rem) {
946
+ .cg-fees[data-count="3"] .cg-fees__tiers {
947
+ grid-template-columns: repeat(3, minmax(0, 1fr));
948
+ }
949
+
950
+ .cg-fees[data-count="4"] .cg-fees__tiers {
951
+ grid-template-columns: repeat(4, minmax(0, 1fr));
952
+ }
1274
953
  }
1275
954
 
1276
- .cg-accordion__items {
955
+ /* --------------------------------------------------------------------------
956
+ accordion: collapsible notes
957
+ -------------------------------------------------------------------------- */
958
+
959
+ .cg-notes__items {
1277
960
  margin: 0;
1278
961
  padding: 0;
1279
962
  list-style: none;
1280
- border-block-start: 1px solid var(--cg-line);
1281
963
  }
1282
964
 
1283
- .cg-accordion__item {
1284
- border-block-end: 1px solid var(--cg-line);
965
+ .cg-notes__item {
966
+ border-block-end: var(--cg-rule) solid var(--cg-line);
1285
967
  }
1286
968
 
1287
- .cg-accordion__question {
969
+ .cg-notes__question {
1288
970
  display: flex;
1289
971
  align-items: center;
1290
- gap: var(--cg-s4);
1291
- padding: var(--cg-s5) 0;
972
+ justify-content: space-between;
973
+ gap: var(--cg-s6);
974
+ padding-block: var(--cg-s4);
1292
975
  cursor: pointer;
1293
976
  list-style: none;
1294
- transition: color var(--cg-duration) var(--cg-ease);
977
+ font-size: var(--cg-text-lg);
978
+ font-weight: var(--cg-weight-medium);
979
+ line-height: var(--cg-leading-heading);
1295
980
  }
1296
981
 
1297
- .cg-accordion__question::-webkit-details-marker {
1298
- display: none;
982
+ .cg-notes__item:first-child .cg-notes__question {
983
+ padding-block-start: 0;
1299
984
  }
1300
985
 
1301
- .cg-accordion__question::after {
1302
- content: "";
1303
- order: 1;
1304
- margin-inline-start: auto;
1305
- flex: none;
1306
- inline-size: 0.7em;
1307
- block-size: 0.7em;
1308
- border-inline-end: 2px solid currentColor;
1309
- border-block-end: 2px solid currentColor;
1310
- transform: rotate(45deg);
1311
- transition: transform var(--cg-duration) var(--cg-ease);
986
+ .cg-notes__question::-webkit-details-marker {
987
+ display: none;
1312
988
  }
1313
989
 
1314
- .cg-accordion__details[open] .cg-accordion__question::after {
1315
- transform: rotate(225deg);
990
+ .cg-notes__mark {
991
+ position: relative;
992
+ flex: none;
993
+ inline-size: 0.9rem;
994
+ block-size: 0.9rem;
1316
995
  }
1317
996
 
1318
- .cg-accordion__details[open] .cg-accordion__question {
1319
- color: var(--cg-accent);
997
+ .cg-notes__mark::before,
998
+ .cg-notes__mark::after {
999
+ content: "";
1000
+ position: absolute;
1001
+ inset-inline: 0;
1002
+ inset-block-start: calc(50% - 1px);
1003
+ block-size: 2px;
1004
+ background: var(--cg-ink);
1320
1005
  }
1321
1006
 
1322
- .cg-accordion__index {
1323
- flex: none;
1324
- color: var(--cg-line-strong);
1325
- font-family: var(--cogenta-font-mono);
1326
- font-size: var(--cg-text-xs);
1327
- transition: color var(--cg-duration) var(--cg-ease);
1007
+ .cg-notes__mark::after {
1008
+ inset-inline: calc(50% - 1px);
1009
+ inset-block: 0;
1010
+ inline-size: 2px;
1011
+ block-size: auto;
1328
1012
  }
1329
1013
 
1330
- .cg-accordion__details[open] .cg-accordion__index {
1331
- color: var(--cg-accent);
1014
+ .cg-notes__details[open] .cg-notes__mark::after {
1015
+ display: none;
1332
1016
  }
1333
1017
 
1334
- .cg-accordion__label {
1335
- font-family: var(--cogenta-font-sans);
1336
- font-size: var(--cg-text-lg);
1337
- font-weight: var(--cg-weight-bold);
1338
- line-height: var(--cg-leading-snug);
1018
+ .cg-notes__question:hover .cg-notes__question-text {
1019
+ text-decoration-line: underline;
1020
+ text-decoration-thickness: var(--cg-rule);
1021
+ text-underline-offset: 0.25em;
1339
1022
  }
1340
1023
 
1341
- .cg-accordion__answer {
1342
- padding: 0 0 var(--cg-s6) calc(var(--cg-s4) + 2ch);
1343
- max-inline-size: var(--cg-measure-narrow);
1024
+ .cg-notes__answer {
1025
+ padding-block-end: var(--cg-s6);
1344
1026
  color: var(--cg-ink-muted);
1345
- line-height: var(--cg-leading-relaxed);
1346
1027
  }
1347
1028
 
1348
- .cg-accordion__answer > :first-child {
1349
- margin-block-start: 0;
1029
+ .cg-notes__answer p {
1030
+ margin: 0;
1031
+ max-inline-size: var(--cg-measure);
1350
1032
  }
1351
1033
 
1352
- .cg-accordion__answer > :last-child {
1353
- margin-block-end: 0;
1034
+ .cg-notes__answer p + p {
1035
+ margin-block-start: 0.8em;
1354
1036
  }
1355
1037
 
1356
- /* --- statCounter (blocks@2.0, RFC 0001) ------------------------------------
1357
- A running strip of oversized digits, separated by hairlines — a spec
1358
- sheet's masthead figures, not `stats`'s own boxed grid of labelled cards.
1359
- ------------------------------------------------------------------------- */
1360
-
1361
- .cg-counter__title {
1362
- margin: 0 0 var(--cg-s8);
1363
- font-family: var(--cogenta-font-sans);
1364
- font-size: var(--cg-text-2xl);
1365
- font-weight: var(--cg-weight-black);
1366
- letter-spacing: var(--cg-tracking-tight);
1367
- text-wrap: balance;
1368
- }
1038
+ /* --------------------------------------------------------------------------
1039
+ statCounter: a ruled table of figures
1040
+ -------------------------------------------------------------------------- */
1369
1041
 
1370
- .cg-counter__items {
1371
- display: flex;
1372
- flex-wrap: wrap;
1042
+ .cg-tally__rows {
1373
1043
  margin: 0;
1374
- padding: 0;
1375
- list-style: none;
1376
- border-inline-start: 1px solid var(--cg-line);
1377
- }
1378
-
1379
- .cg-counter__item {
1380
- position: relative;
1381
- flex: 1 1 10rem;
1382
- padding: 0 var(--cg-s6) var(--cg-s2);
1383
- border-inline-end: 1px solid var(--cg-line);
1384
1044
  }
1385
1045
 
1386
- .cg-counter__index {
1387
- display: block;
1388
- margin-block-end: var(--cg-s3);
1389
- color: var(--cg-line-strong);
1390
- font-family: var(--cogenta-font-mono);
1391
- font-size: var(--cg-text-xs);
1046
+ .cg-tally__row {
1047
+ display: grid;
1048
+ grid-template-columns: minmax(0, 1fr) auto;
1049
+ align-items: baseline;
1050
+ gap: var(--cg-col-gap);
1051
+ padding-block: var(--cg-s3) var(--cg-s4);
1052
+ border-block-end: var(--cg-rule) solid var(--cg-line);
1392
1053
  }
1393
1054
 
1394
- .cg-counter__value {
1395
- display: block;
1396
- color: var(--cg-ink);
1397
- font-family: var(--cogenta-font-sans);
1398
- font-size: var(--cg-text-stat);
1399
- font-weight: var(--cg-weight-black);
1400
- line-height: var(--cg-leading-tight);
1401
- letter-spacing: var(--cg-tracking-tight);
1402
- font-variant-numeric: tabular-nums;
1055
+ .cg-tally__row:first-child {
1056
+ padding-block-start: 0;
1403
1057
  }
1404
1058
 
1405
- .cg-counter__label {
1406
- display: block;
1407
- margin-block-start: var(--cg-s2);
1059
+ .cg-tally__label {
1408
1060
  color: var(--cg-ink-muted);
1409
- font-family: var(--cogenta-font-mono);
1410
- font-size: var(--cg-text-xs);
1411
- font-weight: var(--cg-weight-medium);
1412
- letter-spacing: var(--cg-tracking-wide);
1413
- text-transform: uppercase;
1061
+ font-size: var(--cg-text-md);
1414
1062
  }
1415
1063
 
1416
- /* --- logoStrip (blocks@2.0, RFC 0001) --------------------------------------
1417
- The lighter "as seen in" row: marks set edge to edge with no dividers and
1418
- no index, unlike `logos`'s own numbered ledger — there is no name or link
1419
- here to number.
1420
- ------------------------------------------------------------------------- */
1421
-
1422
- .cg-logostrip {
1064
+ .cg-tally__value {
1423
1065
  margin: 0;
1424
- }
1425
-
1426
- .cg-logostrip__items {
1427
- display: flex;
1428
- flex-wrap: wrap;
1429
- align-items: center;
1430
- justify-content: center;
1431
- gap: var(--cg-s8) var(--cg-s10);
1432
- margin: 0;
1433
- padding: 0;
1434
- list-style: none;
1435
- }
1436
-
1437
- .cg-logostrip__item {
1438
- display: flex;
1439
- align-items: center;
1440
- }
1441
-
1442
- .cg-logostrip__image {
1443
- block-size: var(--cg-s8);
1444
- inline-size: auto;
1445
- max-inline-size: 100%;
1446
- object-fit: contain;
1447
- filter: grayscale(100%);
1448
- opacity: 0.6;
1449
- transition:
1450
- opacity var(--cg-duration) var(--cg-ease),
1451
- filter var(--cg-duration) var(--cg-ease);
1452
- }
1453
-
1454
- .cg-logostrip__item:hover .cg-logostrip__image {
1455
- opacity: 1;
1456
- filter: grayscale(0%);
1457
- }
1458
-
1459
- .cg-logostrip__caption {
1460
- margin-block-start: var(--cg-s6);
1461
- color: var(--cg-ink-subtle);
1462
- font-family: var(--cogenta-font-mono);
1463
- font-size: var(--cg-text-xs);
1066
+ font-size: var(--cg-size-heading);
1067
+ font-stretch: var(--cg-width-display);
1464
1068
  font-weight: var(--cg-weight-medium);
1465
- letter-spacing: var(--cg-tracking-wide);
1466
- text-transform: uppercase;
1467
- text-align: center;
1069
+ line-height: var(--cg-leading-heading);
1070
+ font-variant-numeric: lining-nums tabular-nums;
1071
+ text-align: end;
1468
1072
  }