@cogenta/theme-association 0.3.3 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/src/index.d.ts +6 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +9 -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 +13 -10
  7. package/dist/src/render/blocks/accordion.js.map +1 -1
  8. package/dist/src/render/blocks/breakdown.d.ts +14 -0
  9. package/dist/src/render/blocks/breakdown.d.ts.map +1 -0
  10. package/dist/src/render/blocks/breakdown.js +17 -0
  11. package/dist/src/render/blocks/breakdown.js.map +1 -0
  12. package/dist/src/render/blocks/collection-list.d.ts +4 -10
  13. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  14. package/dist/src/render/blocks/collection-list.js +89 -58
  15. package/dist/src/render/blocks/collection-list.js.map +1 -1
  16. package/dist/src/render/blocks/cta.d.ts +0 -5
  17. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  18. package/dist/src/render/blocks/cta.js +22 -10
  19. package/dist/src/render/blocks/cta.js.map +1 -1
  20. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  21. package/dist/src/render/blocks/embed.js +30 -22
  22. package/dist/src/render/blocks/embed.js.map +1 -1
  23. package/dist/src/render/blocks/faq.d.ts.map +1 -1
  24. package/dist/src/render/blocks/faq.js +11 -15
  25. package/dist/src/render/blocks/faq.js.map +1 -1
  26. package/dist/src/render/blocks/feature-grid.d.ts +6 -0
  27. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
  28. package/dist/src/render/blocks/feature-grid.js +42 -20
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  30. package/dist/src/render/blocks/gallery.d.ts +9 -7
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  32. package/dist/src/render/blocks/gallery.js +22 -16
  33. package/dist/src/render/blocks/gallery.js.map +1 -1
  34. package/dist/src/render/blocks/hero.d.ts +23 -9
  35. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  36. package/dist/src/render/blocks/hero.js +40 -23
  37. package/dist/src/render/blocks/hero.js.map +1 -1
  38. package/dist/src/render/blocks/logo-strip.d.ts +6 -0
  39. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
  40. package/dist/src/render/blocks/logo-strip.js +7 -9
  41. package/dist/src/render/blocks/logo-strip.js.map +1 -1
  42. package/dist/src/render/blocks/logos.d.ts +14 -0
  43. package/dist/src/render/blocks/logos.d.ts.map +1 -1
  44. package/dist/src/render/blocks/logos.js +30 -16
  45. package/dist/src/render/blocks/logos.js.map +1 -1
  46. package/dist/src/render/blocks/media-figure.d.ts +12 -5
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  48. package/dist/src/render/blocks/media-figure.js +32 -18
  49. package/dist/src/render/blocks/media-figure.js.map +1 -1
  50. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  51. package/dist/src/render/blocks/pricing-table.js +18 -20
  52. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  53. package/dist/src/render/blocks/prose.d.ts +9 -3
  54. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  55. package/dist/src/render/blocks/prose.js +11 -4
  56. package/dist/src/render/blocks/prose.js.map +1 -1
  57. package/dist/src/render/blocks/quote.d.ts +4 -7
  58. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  59. package/dist/src/render/blocks/quote.js +12 -17
  60. package/dist/src/render/blocks/quote.js.map +1 -1
  61. package/dist/src/render/blocks/stat-counter.d.ts +8 -1
  62. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
  63. package/dist/src/render/blocks/stat-counter.js +18 -10
  64. package/dist/src/render/blocks/stat-counter.js.map +1 -1
  65. package/dist/src/render/blocks/stats.d.ts +12 -1
  66. package/dist/src/render/blocks/stats.d.ts.map +1 -1
  67. package/dist/src/render/blocks/stats.js +24 -14
  68. package/dist/src/render/blocks/stats.js.map +1 -1
  69. package/dist/src/render/blocks/testimonial.d.ts +6 -5
  70. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  71. package/dist/src/render/blocks/testimonial.js +13 -11
  72. package/dist/src/render/blocks/testimonial.js.map +1 -1
  73. package/dist/src/render/chrome.d.ts +38 -1
  74. package/dist/src/render/chrome.d.ts.map +1 -1
  75. package/dist/src/render/chrome.js +117 -91
  76. package/dist/src/render/chrome.js.map +1 -1
  77. package/dist/src/render/details.d.ts +79 -0
  78. package/dist/src/render/details.d.ts.map +1 -0
  79. package/dist/src/render/details.js +221 -0
  80. package/dist/src/render/details.js.map +1 -0
  81. package/dist/src/render/figures.d.ts +29 -0
  82. package/dist/src/render/figures.d.ts.map +1 -0
  83. package/dist/src/render/figures.js +59 -0
  84. package/dist/src/render/figures.js.map +1 -0
  85. package/dist/src/render/layout.d.ts +31 -0
  86. package/dist/src/render/layout.d.ts.map +1 -0
  87. package/dist/src/render/layout.js +46 -0
  88. package/dist/src/render/layout.js.map +1 -0
  89. package/dist/src/render/page-head.d.ts +7 -0
  90. package/dist/src/render/page-head.d.ts.map +1 -0
  91. package/dist/src/render/page-head.js +95 -0
  92. package/dist/src/render/page-head.js.map +1 -0
  93. package/dist/src/render/render-block.d.ts +8 -12
  94. package/dist/src/render/render-block.d.ts.map +1 -1
  95. package/dist/src/render/render-block.js +40 -29
  96. package/dist/src/render/render-block.js.map +1 -1
  97. package/dist/src/render/strings.d.ts +15 -0
  98. package/dist/src/render/strings.d.ts.map +1 -0
  99. package/dist/src/render/strings.js +39 -0
  100. package/dist/src/render/strings.js.map +1 -0
  101. package/dist/src/render/term-archive.d.ts.map +1 -1
  102. package/dist/src/render/term-archive.js +33 -25
  103. package/dist/src/render/term-archive.js.map +1 -1
  104. package/dist/src/render/widget-areas.d.ts +14 -0
  105. package/dist/src/render/widget-areas.d.ts.map +1 -0
  106. package/dist/src/render/widget-areas.js +21 -0
  107. package/dist/src/render/widget-areas.js.map +1 -0
  108. package/dist/theme.config.d.ts +1 -1
  109. package/dist/theme.config.js +3 -3
  110. package/dist/theme.config.js.map +1 -1
  111. package/package.json +5 -5
  112. package/src/index.ts +9 -0
  113. package/src/render/blocks/accordion.ts +28 -22
  114. package/src/render/blocks/breakdown.ts +42 -0
  115. package/src/render/blocks/collection-list.ts +234 -103
  116. package/src/render/blocks/cta.ts +48 -19
  117. package/src/render/blocks/embed.ts +47 -29
  118. package/src/render/blocks/faq.ts +22 -31
  119. package/src/render/blocks/feature-grid.ts +73 -41
  120. package/src/render/blocks/gallery.ts +32 -26
  121. package/src/render/blocks/hero.ts +56 -43
  122. package/src/render/blocks/logo-strip.ts +23 -21
  123. package/src/render/blocks/logos.ts +45 -40
  124. package/src/render/blocks/media-figure.ts +49 -24
  125. package/src/render/blocks/pricing-table.ts +31 -40
  126. package/src/render/blocks/prose.ts +16 -6
  127. package/src/render/blocks/quote.ts +34 -27
  128. package/src/render/blocks/stat-counter.ts +35 -29
  129. package/src/render/blocks/stats.ts +46 -38
  130. package/src/render/blocks/testimonial.ts +29 -20
  131. package/src/render/chrome.ts +165 -91
  132. package/src/render/details.ts +276 -0
  133. package/src/render/figures.ts +68 -0
  134. package/src/render/layout.ts +78 -0
  135. package/src/render/page-head.ts +193 -0
  136. package/src/render/render-block.ts +45 -32
  137. package/src/render/strings.ts +74 -0
  138. package/src/render/term-archive.ts +94 -58
  139. package/src/render/widget-areas.ts +24 -0
  140. package/src/styles/archive.css +38 -102
  141. package/src/styles/base.css +503 -554
  142. package/src/styles/blocks.css +913 -666
  143. package/src/styles/chrome.css +506 -0
  144. package/src/styles/listings.css +591 -0
  145. package/src/styles/theme.css +25 -19
  146. package/src/styles/tokens.css +284 -234
  147. package/src/styles/widgets.css +1059 -0
  148. package/tokens.json +18 -18
@@ -1,8 +1,7 @@
1
1
  /*
2
- * Document, accessibility floor, page frame, chrome (header/footer/nav) and
3
- * the one control the theme ships (an action link). Everything here reads
4
- * the design system from `tokens.css`; nothing here reads a `--cogenta-*`
5
- * token directly.
2
+ * Document, accessibility floor, the grid, section titles, page titles,
3
+ * actions, and the utility pages the host renders (search, forms, comments).
4
+ * Everything reads `tokens.css`.
6
5
  */
7
6
 
8
7
  /* --------------------------------------------------------------------------
@@ -15,190 +14,228 @@
15
14
  box-sizing: border-box;
16
15
  }
17
16
 
17
+ html {
18
+ -webkit-text-size-adjust: 100%;
19
+ text-size-adjust: 100%;
20
+ scroll-padding-block-start: var(--ca-s6);
21
+ hanging-punctuation: first allow-end last;
22
+ }
23
+
18
24
  body {
19
25
  margin: 0;
20
- background: var(--cg-canvas);
21
- color: var(--cg-ink);
22
- font-family: var(--cogenta-font-sans);
23
- font-size: var(--cg-text-md);
24
- line-height: var(--cg-leading-normal);
26
+ background: var(--ca-canvas);
27
+ color: var(--ca-ink);
28
+ font-family: var(--ca-font-text);
29
+ font-size: var(--ca-text-md);
30
+ font-weight: var(--ca-weight-regular);
31
+ line-height: var(--ca-leading-text);
25
32
  font-kerning: normal;
26
33
  font-variant-ligatures: common-ligatures;
27
- text-underline-offset: 0.15em;
28
- text-decoration-thickness: from-font;
29
- -webkit-text-size-adjust: 100%;
30
- }
31
-
32
- h1,
33
- h2,
34
- h3,
35
- h4,
36
- h5,
37
- h6 {
38
- font-family: var(--cg-font-display);
39
- font-weight: var(--cg-weight-bold);
34
+ font-synthesis: none;
35
+ text-rendering: optimizeLegibility;
36
+ -webkit-font-smoothing: antialiased;
40
37
  }
41
38
 
42
39
  ::selection {
43
- background: var(--cg-accent-soft);
44
- color: var(--cg-accent-soft-fg);
40
+ background: var(--ca-green);
41
+ color: var(--ca-green-fg);
45
42
  }
46
43
 
47
44
  img,
48
45
  video,
49
46
  iframe {
50
- max-width: 100%;
51
- height: auto;
47
+ display: block;
48
+ max-inline-size: 100%;
49
+ block-size: auto;
52
50
  }
53
51
 
54
52
  img {
55
- display: block;
56
53
  object-fit: cover;
57
54
  }
58
55
 
56
+ :where(img, video) {
57
+ filter: brightness(var(--ca-image-brightness));
58
+ }
59
+
60
+ :where(h1, h2, h3, h4, h5, h6) {
61
+ margin: 0;
62
+ font-family: var(--ca-font-display);
63
+ font-optical-sizing: auto;
64
+ font-weight: var(--ca-weight-semibold);
65
+ line-height: var(--ca-leading-heading);
66
+ letter-spacing: var(--ca-tracking-heading);
67
+ text-wrap: balance;
68
+ }
69
+
70
+ :where(p, li, dd, figcaption, blockquote) {
71
+ text-wrap: pretty;
72
+ }
73
+
59
74
  :where(a) {
60
- color: var(--cg-accent);
61
- text-decoration-color: color-mix(in oklab, var(--cg-accent) 40%, transparent);
75
+ color: var(--ca-ink);
76
+ text-decoration-line: underline;
77
+ text-decoration-thickness: var(--ca-rule);
78
+ text-decoration-color: var(--ca-green);
79
+ text-underline-offset: 0.22em;
62
80
  transition:
63
- color var(--cg-duration-fast) var(--cg-ease),
64
- text-decoration-color var(--cg-duration-fast) var(--cg-ease);
81
+ color var(--ca-duration) var(--ca-ease),
82
+ text-decoration-color var(--ca-duration) var(--ca-ease);
65
83
  }
66
84
 
67
85
  :where(a:hover) {
68
- color: var(--cg-accent-hover);
69
- text-decoration-color: currentColor;
86
+ color: var(--ca-green);
70
87
  }
71
88
 
72
89
  :where(hr) {
73
- block-size: 1px;
90
+ block-size: var(--ca-rule);
74
91
  border: 0;
75
- margin-block: var(--cg-s10);
76
- background: var(--cg-line);
92
+ margin-block: var(--ca-s10);
93
+ background: var(--ca-line);
94
+ }
95
+
96
+ :where(code, kbd, samp, pre) {
97
+ font-family: var(--ca-font-code);
98
+ font-size: 0.88em;
99
+ }
100
+
101
+ :where(data, time) {
102
+ font-variant-numeric: lining-nums tabular-nums;
77
103
  }
78
104
 
79
- /* A visually hidden label — `renderSocialLinks` (`@cogenta/theme-kit`) needs
80
- this class to exist, and this is the standard clip-to-1px technique. */
81
105
  .cg-visually-hidden {
82
106
  position: absolute;
83
107
  inline-size: 1px;
84
108
  block-size: 1px;
109
+ margin: -1px;
110
+ padding: 0;
85
111
  overflow: hidden;
86
- clip: rect(0 0 0 0);
112
+ clip-path: inset(50%);
87
113
  white-space: nowrap;
114
+ border: 0;
88
115
  }
89
116
 
90
117
  /* --------------------------------------------------------------------------
91
- Focus, targets, motion
118
+ Focus, targets, motion. Motion is a colour or an underline changing, in
119
+ under 150 ms; nothing moves in space, nothing fades in on scroll.
92
120
  -------------------------------------------------------------------------- */
93
121
 
94
- :where(a, button, summary, [tabindex]):focus-visible {
95
- outline: 2px solid var(--cg-accent);
122
+ :where(a, button, summary, input, select, textarea, [tabindex]):focus-visible {
123
+ outline: var(--ca-rule-strong) solid var(--ca-green);
96
124
  outline-offset: 3px;
97
- border-radius: var(--cg-radius-xs);
98
125
  }
99
126
 
100
- :where(.cg-action, .cg-faq__question, .cg-accordion__question, .cg-nav-toggle__button) {
127
+ :where(.cg-action, .ca-nav-toggle-label, .cg-theme-toggle, summary) {
101
128
  min-block-size: 44px;
102
- min-inline-size: 44px;
103
- }
104
-
105
- @supports (animation-timeline: view()) {
106
- @media (prefers-reduced-motion: no-preference) {
107
- @keyframes cg-settle {
108
- from {
109
- opacity: 0;
110
- transform: translateY(var(--cg-s3));
111
- }
112
-
113
- to {
114
- opacity: 1;
115
- transform: none;
116
- }
117
- }
118
-
119
- .cg-block {
120
- animation: cg-settle linear both;
121
- animation-timeline: view();
122
- animation-range: entry 0% cover 20%;
123
- }
124
- }
125
129
  }
126
130
 
131
+ /* Every transition in this theme reads `--ca-duration`, so reduced motion is
132
+ one declaration rather than an `!important` sweep over every element. */
127
133
  @media (prefers-reduced-motion: reduce) {
128
- *,
129
- *::before,
130
- *::after {
131
- animation-duration: 1ms !important;
132
- animation-iteration-count: 1 !important;
133
- transition-duration: 1ms !important;
134
- scroll-behavior: auto !important;
134
+ :root {
135
+ --ca-duration: 0ms;
135
136
  }
136
137
  }
137
138
 
138
139
  .cg-skip-link {
139
140
  position: absolute;
140
- inset-inline-start: var(--cg-s3);
141
- inset-block-start: calc(var(--cg-s3) * -8);
142
- z-index: 10;
143
- padding: var(--cg-s2) var(--cg-s4);
144
- background: var(--cg-ink);
145
- color: var(--cg-canvas);
146
- border-radius: var(--cg-radius-sm);
147
- font-weight: var(--cg-weight-semibold);
141
+ inset-inline-start: var(--ca-s3);
142
+ inset-block-start: calc(var(--ca-s16) * -1);
143
+ z-index: 40;
144
+ padding: var(--ca-s2) var(--ca-s4);
145
+ background: var(--ca-action);
146
+ color: var(--ca-action-fg);
147
+ font-size: var(--ca-text-caption);
148
+ font-weight: var(--ca-weight-semibold);
148
149
  text-decoration: none;
149
- transition: inset-block-start var(--cg-duration) var(--cg-ease);
150
150
  }
151
151
 
152
152
  .cg-skip-link:focus-visible {
153
- inset-block-start: var(--cg-s3);
154
- outline-color: var(--cg-canvas);
153
+ inset-block-start: var(--ca-s3);
155
154
  }
156
155
 
157
156
  /* --------------------------------------------------------------------------
158
- Page frame
157
+ The grid. Every block is a section around a twelve-column container; the
158
+ section rhythm is one variable, applied to all of them.
159
159
  -------------------------------------------------------------------------- */
160
160
 
161
- .cg-main {
161
+ .ca-main {
162
162
  display: flow-root;
163
- /* Contains decorative bleed (the hero's own negative-inset halo) so it
164
- never contributes to the document's horizontal scroll extent — found on
165
- this theme's own scaffolded site at 360px. */
166
163
  overflow-x: clip;
164
+ padding-block-end: calc(var(--ca-section) / 2);
167
165
  }
168
166
 
169
- .cg-block {
170
- max-inline-size: var(--cg-page);
167
+ .ca-container {
168
+ display: grid;
169
+ grid-template-columns: repeat(var(--ca-columns), minmax(0, 1fr));
170
+ column-gap: var(--ca-col-gap);
171
+ align-items: start;
172
+ inline-size: 100%;
173
+ max-inline-size: calc(var(--ca-page) + var(--ca-gutter) * 2);
171
174
  margin-inline: auto;
172
- margin-block: var(--cg-section-y);
173
- padding-inline: var(--cg-gutter);
175
+ padding-inline: var(--ca-gutter);
174
176
  }
175
177
 
176
- /* --- per-block visual variant (blocks@2.0, RFC 0002) ---------------------- */
178
+ /* Below the wide breakpoint twelve columns only make slivers: every child
179
+ takes the full row, and each block redistributes from there. */
180
+ .ca-container > * {
181
+ grid-column: 1 / -1;
182
+ min-inline-size: 0;
183
+ }
177
184
 
178
- [data-block][data-variant-background="muted"],
179
- [data-block][data-variant-background="image"] {
180
- padding-block: var(--cg-s10);
181
- border-radius: var(--cg-radius-lg);
185
+ .ca-section {
186
+ padding-block: calc(var(--ca-section) / 2);
182
187
  }
183
188
 
184
- [data-block][data-variant-background="muted"] {
185
- background: var(--cg-surface-sunken);
189
+ /* A page that ends on a band ends on it: no strip of paper between the band
190
+ and the footer. */
191
+ .ca-main:has(> .ca-section[data-band]:last-child),
192
+ .ca-main:has(> [data-variant-background]:last-child) {
193
+ padding-block-end: 0;
186
194
  }
187
195
 
196
+ /* --- section titles ----------------------------------------------------------
197
+ A titled block names itself in the display face, on the first column, with
198
+ the same space under it everywhere. */
199
+
200
+ .ca-head {
201
+ margin-block-end: var(--ca-s10);
202
+ }
203
+
204
+ .ca-head__title {
205
+ max-inline-size: 22ch;
206
+ font-size: var(--ca-size-section);
207
+ font-weight: var(--ca-weight-semibold);
208
+ font-stretch: var(--ca-stretch-display);
209
+ line-height: var(--ca-leading-heading);
210
+ letter-spacing: var(--ca-tracking-display);
211
+ }
212
+
213
+ .ca-empty {
214
+ margin: 0;
215
+ padding: var(--ca-s6) 0;
216
+ border-block: var(--ca-rule) solid var(--ca-line);
217
+ color: var(--ca-ink-muted);
218
+ font-size: var(--ca-text-md);
219
+ }
220
+
221
+ /* --- per-block variants (blocks@2.0, RFC 0002) --------------------------- */
222
+
223
+ [data-block][data-variant-background="muted"],
188
224
  [data-block][data-variant-background="image"] {
189
- background: var(--cg-surface-tinted);
225
+ background: var(--ca-band);
226
+ padding-block: calc(var(--ca-section) * 0.7);
190
227
  }
191
228
 
192
- [data-block][data-variant-spacing="compact"] {
193
- margin-block: calc(var(--cg-section-y) / 2);
229
+ [data-block][data-variant-background] + [data-block][data-variant-background] {
230
+ margin-block-start: calc(var(--ca-section) / 2);
194
231
  }
195
232
 
196
- [data-block][data-variant-spacing="spacious"] {
197
- margin-block: calc(var(--cg-section-y) * 1.6);
233
+ [data-block][data-variant-spacing="compact"] {
234
+ padding-block: calc(var(--ca-section) / 4);
198
235
  }
199
236
 
200
- [data-block][data-variant-align="start"] {
201
- text-align: start;
237
+ [data-block][data-variant-spacing="spacious"] {
238
+ padding-block: calc(var(--ca-section) * 0.85);
202
239
  }
203
240
 
204
241
  [data-block][data-variant-align="center"] {
@@ -209,513 +246,369 @@ img {
209
246
  text-align: end;
210
247
  }
211
248
 
212
- [data-block][data-variant-width="full"] {
249
+ [data-block][data-variant-width="full"] > .ca-container {
213
250
  max-inline-size: none;
214
- padding-inline: 0;
215
251
  }
216
252
 
217
- .cg-page__title {
218
- max-inline-size: var(--cg-page);
219
- margin-inline: auto;
220
- margin-block: var(--cg-section-y) var(--cg-s6);
221
- padding-inline: var(--cg-gutter);
222
- font-size: var(--cg-text-3xl);
223
- line-height: var(--cg-leading-tight);
224
- letter-spacing: var(--cg-tracking-tight);
225
- text-wrap: balance;
253
+ /* --- the kicker: a short line above a title, in the organisation's green -- */
254
+
255
+ .ca-kicker {
256
+ margin: 0;
257
+ color: var(--ca-green);
258
+ font-family: var(--ca-font-text);
259
+ font-size: var(--ca-text-caption);
260
+ font-weight: var(--ca-weight-semibold);
261
+ line-height: var(--ca-leading-ui);
226
262
  }
227
263
 
228
- /* --------------------------------------------------------------------------
229
- Chrome — sticky header, pill nav, CSS-only mobile disclosure
230
- -------------------------------------------------------------------------- */
264
+ /* --- the title of any page that has no hero and is not an event ------------ */
231
265
 
232
- .cg-site-header {
233
- position: sticky;
234
- inset-block-start: 0;
235
- z-index: 5;
236
- padding: var(--cg-s4) var(--cg-gutter);
237
- /* Flat and fully opaque, not a frosted-glass blur: a sticky header reads
238
- as a solid plane sitting above the page, with a hairline marking where
239
- it ends. */
240
- background: var(--cg-canvas);
241
- border-block-end: 1px solid var(--cg-line-soft);
266
+ .ca-page-head {
267
+ padding-block: calc(var(--ca-section) * 0.55) calc(var(--ca-section) * 0.2);
242
268
  }
243
269
 
244
- .cg-site-header__inner {
245
- display: flex;
246
- flex-wrap: wrap;
247
- align-items: center;
248
- gap: var(--cg-gap);
249
- max-inline-size: var(--cg-page);
250
- margin-inline: auto;
270
+ .ca-page-head__inner {
271
+ row-gap: var(--ca-s5);
251
272
  }
252
273
 
253
- .cg-site-header__home {
254
- display: flex;
255
- align-items: center;
256
- color: var(--cg-ink);
257
- font-family: var(--cg-font-display);
258
- font-weight: var(--cg-weight-bold);
259
- font-size: var(--cg-text-lg);
260
- text-decoration: none;
261
- margin-inline-end: auto;
274
+ /* Text that opens a page under its title follows the title at a heading's
275
+ distance, not a section's. */
276
+ .ca-page-head + .ca-section {
277
+ padding-block-start: var(--ca-s6);
262
278
  }
263
279
 
264
- .cg-site-header__logo {
265
- display: block;
266
- block-size: 2.25rem;
267
- inline-size: auto;
268
- max-inline-size: 14rem;
269
- object-fit: contain;
280
+ .ca-page-head__title {
281
+ max-inline-size: 20ch;
282
+ font-size: var(--ca-size-title);
283
+ font-weight: var(--ca-weight-bold);
284
+ font-stretch: var(--ca-stretch-display);
285
+ line-height: var(--ca-leading-display);
286
+ letter-spacing: var(--ca-tracking-display);
270
287
  }
271
288
 
272
- /* The desktop row is hidden by default (mobile-first) and shown from the
273
- breakpoint the toggle disappears at — the two are never both visible, so
274
- the hidden one drops out of the accessibility tree along with its
275
- `display: none`. */
276
- .cg-nav--desktop {
277
- display: none;
289
+ .ca-page-head__lead {
290
+ margin: 0;
291
+ max-inline-size: 48ch;
292
+ color: var(--ca-ink-muted);
293
+ font-size: var(--ca-size-lead);
294
+ line-height: var(--ca-leading-lead);
278
295
  }
279
296
 
280
- .cg-nav__items {
297
+ .ca-page-head__meta {
281
298
  display: flex;
282
299
  flex-wrap: wrap;
283
- align-items: center;
284
- gap: var(--cg-s5);
300
+ gap: var(--ca-s1) var(--ca-s5);
285
301
  margin: 0;
286
- padding: 0;
287
- list-style: none;
288
- font-size: var(--cg-text-sm);
289
- font-weight: var(--cg-weight-semibold);
302
+ color: var(--ca-ink-muted);
303
+ font-size: var(--ca-text-caption);
304
+ font-variant-numeric: lining-nums tabular-nums;
290
305
  }
291
306
 
292
- .cg-nav__items a,
293
- .cg-nav__items span {
294
- color: var(--cg-ink-muted);
295
- text-decoration: none;
296
- border-radius: var(--cg-radius-pill);
297
- padding: var(--cg-s2) var(--cg-s3);
298
- transition:
299
- background-color var(--cg-duration) var(--cg-ease),
300
- color var(--cg-duration) var(--cg-ease);
301
- }
302
-
303
- .cg-nav__items a:hover {
304
- color: var(--cg-ink);
305
- background: var(--cg-surface-sunken);
306
- }
307
-
308
- /* The mobile disclosure — `<details>`/`<summary>`, zero JavaScript. */
309
- .cg-nav-toggle {
310
- position: relative;
311
- }
312
-
313
- .cg-nav-toggle__button {
307
+ .ca-page-head__terms {
314
308
  display: flex;
315
- align-items: center;
316
- justify-content: center;
317
- inline-size: 2.75rem;
318
- block-size: 2.75rem;
319
- border-radius: var(--cg-radius-pill);
320
- background: var(--cg-surface-sunken);
321
- color: var(--cg-ink);
322
- cursor: pointer;
309
+ flex-wrap: wrap;
310
+ gap: var(--ca-s1) var(--ca-s4);
311
+ margin: 0;
312
+ padding: 0;
323
313
  list-style: none;
314
+ font-size: var(--ca-text-caption);
315
+ font-weight: var(--ca-weight-semibold);
324
316
  }
325
317
 
326
- .cg-nav-toggle__button::-webkit-details-marker {
327
- display: none;
328
- }
329
-
330
- .cg-nav-toggle__icon {
331
- inline-size: 1.25rem;
332
- block-size: 1.25rem;
318
+ .ca-page-head__terms a {
319
+ color: var(--ca-green);
320
+ text-decoration-color: transparent;
333
321
  }
334
322
 
335
- .cg-nav--mobile {
336
- /* Explicit, not left to the browser's own closed-`<details>` suppression:
337
- that suppression stops *painting* the content, but an absolutely
338
- positioned panel this far off its own toggle can still be measured into
339
- the document's horizontal extent, producing a real, scrollable overflow
340
- with no visible cause — found on this theme's own scaffolded site at
341
- 360px. `display: none` here removes the box outright; the toggle's own
342
- `[open]` rule below is the only thing that ever shows it again. */
343
- display: none;
344
- position: absolute;
345
- inset-inline-end: 0;
346
- inset-block-start: calc(100% + var(--cg-s2));
347
- z-index: 6;
348
- min-inline-size: 13rem;
349
- padding: var(--cg-s3);
350
- background: var(--cg-surface-raised);
351
- border-radius: var(--cg-radius-md);
352
- box-shadow: var(--cogenta-shadow-md);
353
- }
354
-
355
- .cg-nav--mobile .cg-nav__items {
356
- flex-direction: column;
357
- align-items: stretch;
358
- gap: var(--cg-s1);
323
+ .ca-page-head__terms a:hover {
324
+ text-decoration-color: currentColor;
359
325
  }
360
326
 
361
- .cg-nav-toggle[open] .cg-nav--mobile {
362
- display: block;
327
+ .ca-page-head__cover {
328
+ margin: var(--ca-s6) 0 0;
363
329
  }
364
330
 
365
- .cg-nav--mobile .cg-nav__items a,
366
- .cg-nav--mobile .cg-nav__items span {
367
- display: block;
368
- border-radius: var(--cg-radius-sm);
331
+ .ca-page-head__image {
332
+ inline-size: 100%;
333
+ aspect-ratio: 16 / 9;
334
+ background: var(--ca-band);
369
335
  }
370
336
 
371
- @media (min-width: 56rem) {
372
- .cg-nav--desktop {
373
- display: flex;
337
+ @media (min-width: 64rem) {
338
+ .ca-page-head__title,
339
+ .ca-page-head__meta,
340
+ .ca-page-head__terms {
341
+ grid-column: 1 / span 9;
374
342
  }
375
343
 
376
- .cg-nav-toggle {
377
- display: none;
344
+ .ca-page-head__lead {
345
+ grid-column: 1 / span 7;
378
346
  }
379
347
  }
380
348
 
381
- .cg-site-header__action {
382
- flex-shrink: 0;
383
- }
349
+ /* --------------------------------------------------------------------------
350
+ Actions: a filled green rectangle for the primary intent, and for the rest
351
+ the words underlined with an arrow after them. No lift, no shadow. The
352
+ yellow belongs to the donation ask, set by the blocks that carry it.
353
+ -------------------------------------------------------------------------- */
384
354
 
385
- /* The manual light/dark/system control (`renderThemeToggle`, `@cogenta/
386
- theme-kit`) — a plain icon button matching this theme's own pill-shaped
387
- mobile-menu button (`.cg-nav-toggle__button`) in size and treatment, so it
388
- reads as this theme's own chrome rather than a borrowed control. */
389
- .cg-theme-toggle {
390
- display: inline-flex;
355
+ .cg-actions {
356
+ display: flex;
357
+ flex-wrap: wrap;
391
358
  align-items: center;
392
- justify-content: center;
393
- flex-shrink: 0;
394
- inline-size: 2.75rem;
395
- block-size: 2.75rem;
396
- border-radius: var(--cg-radius-pill);
397
- border: 0;
398
- background: var(--cg-surface-sunken);
399
- color: var(--cg-ink);
400
- cursor: pointer;
401
- transition: background-color var(--cg-duration) var(--cg-ease);
402
- }
403
-
404
- .cg-theme-toggle:hover {
405
- background: var(--cg-accent-soft);
406
- color: var(--cg-accent-soft-fg);
407
- }
408
-
409
- .cg-theme-toggle__icon {
410
- inline-size: 1.2rem;
411
- block-size: 1.2rem;
412
- }
413
-
414
- .cg-theme-toggle__icon--moon {
415
- display: none;
359
+ gap: var(--ca-s4) var(--ca-s8);
360
+ margin: 0;
361
+ padding: 0;
362
+ list-style: none;
416
363
  }
417
364
 
418
- /* Icon reflects the *current* effective appearance — sun while light, moon
419
- while dark — from the same `[data-theme]`/`prefers-color-scheme` signals
420
- `tokens.css` already keys the whole palette on. */
421
- @media (prefers-color-scheme: dark) {
422
- :where(:root:not([data-theme="light"])) .cg-theme-toggle__icon--sun {
423
- display: none;
424
- }
425
- :where(:root:not([data-theme="light"])) .cg-theme-toggle__icon--moon {
426
- display: block;
427
- }
365
+ .cg-action {
366
+ font-family: var(--ca-font-text);
367
+ font-size: var(--ca-text-md);
368
+ font-weight: var(--ca-weight-semibold);
369
+ line-height: 1.2;
370
+ text-decoration: none;
371
+ transition:
372
+ background-color var(--ca-duration) var(--ca-ease),
373
+ color var(--ca-duration) var(--ca-ease),
374
+ border-color var(--ca-duration) var(--ca-ease),
375
+ text-decoration-color var(--ca-duration) var(--ca-ease);
428
376
  }
429
377
 
430
- :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--sun {
431
- display: none;
378
+ .cg-action[data-emphasis="primary"] {
379
+ display: inline-flex;
380
+ align-items: center;
381
+ justify-content: center;
382
+ padding: var(--ca-s3) var(--ca-s6);
383
+ border: var(--ca-rule) solid var(--ca-action);
384
+ border-radius: var(--ca-radius-control);
385
+ background: var(--ca-action);
386
+ color: var(--ca-action-fg);
387
+ white-space: nowrap;
432
388
  }
433
389
 
434
- :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--moon {
435
- display: block;
390
+ .cg-action[data-emphasis="primary"]:hover {
391
+ background: var(--ca-action-hover);
392
+ border-color: var(--ca-action-hover);
393
+ color: var(--ca-action-hover-fg);
436
394
  }
437
395
 
438
- /* --------------------------------------------------------------------------
439
- Chrome — footer, four columns on a warm tinted band
440
- -------------------------------------------------------------------------- */
441
-
442
- .cg-site-footer {
443
- padding: var(--cg-s16) var(--cg-gutter) var(--cg-s8);
444
- background: var(--cg-surface-sunken);
445
- color: var(--cg-ink-muted);
446
- border-block-start: 1px solid var(--cg-line-soft);
447
- font-size: var(--cg-text-sm);
396
+ /* A text link with an arrow after it. Not a flex container: in one, the
397
+ words and the arrow are two flex items and each gets its own underline.
398
+ As inline content the words carry one continuous underline, and the
399
+ arrow, an inline-block, inherits none (CSS Text Decoration: decorations do
400
+ not propagate to atomic inlines). The same rules draw every arrow link of
401
+ the theme. The link itself is inline, so a long label wraps like text. */
402
+ .cg-action[data-emphasis="secondary"] {
403
+ display: inline-block;
448
404
  }
449
405
 
450
- .cg-site-footer__grid {
451
- display: grid;
452
- gap: var(--cg-gap-loose);
453
- grid-template-columns: 1fr;
454
- max-inline-size: var(--cg-page);
455
- margin-inline: auto;
456
- padding-block-end: var(--cg-s10);
457
- border-block-end: 1px solid var(--cg-line-soft);
406
+ .cg-action[data-emphasis="secondary"],
407
+ .ca-arrow-link {
408
+ color: var(--ca-ink);
409
+ font-weight: var(--ca-weight-semibold);
410
+ text-decoration-line: underline;
411
+ text-decoration-thickness: var(--ca-rule-strong);
412
+ text-decoration-color: var(--ca-green);
413
+ text-decoration-skip-ink: auto;
414
+ text-underline-offset: 0.28em;
458
415
  }
459
416
 
460
- @media (min-width: 48rem) {
461
- .cg-site-footer__grid {
462
- grid-template-columns: 1.3fr 1fr 1fr 1fr;
463
- align-items: start;
464
- }
417
+ /* An action's label is a few words: it stays on one line with its arrow. */
418
+ .cg-action[data-emphasis="secondary"] {
419
+ padding-block: var(--ca-s3);
420
+ white-space: nowrap;
465
421
  }
466
422
 
467
- .cg-site-footer__brand-link {
468
- color: var(--cg-ink);
469
- font-family: var(--cg-font-display);
470
- font-weight: var(--cg-weight-bold);
471
- font-size: var(--cg-text-lg);
472
- text-decoration: none;
423
+ /* The arrow rides on the last word of the link (`arrowWords`), which cannot
424
+ break, so the arrow is never alone at the start of a line. */
425
+ .ca-arrow-link__end,
426
+ .ca-arrow-link__start {
427
+ white-space: nowrap;
473
428
  }
474
429
 
475
- .cg-site-footer__tagline {
476
- margin: var(--cg-s2) 0 0;
430
+ .cg-action[data-emphasis="secondary"]::after,
431
+ .ca-arrow-link__end::after {
432
+ content: "\2192" / "";
433
+ display: inline-block;
434
+ margin-inline-start: 0.35em;
477
435
  }
478
436
 
479
- .cg-site-footer__col {
480
- min-inline-size: 0;
437
+ .ca-arrow-link__start::before {
438
+ content: "\2190" / "";
439
+ display: inline-block;
440
+ margin-inline-end: 0.35em;
481
441
  }
482
442
 
483
- .cg-nav__items.cg-site-footer__nav .cg-nav__items,
484
- .cg-site-footer__nav .cg-nav__items {
485
- flex-direction: column;
486
- align-items: flex-start;
487
- gap: var(--cg-s3);
488
- font-weight: var(--cg-weight-regular);
443
+ .cg-action[data-emphasis="secondary"]:hover,
444
+ .ca-arrow-link:hover {
445
+ color: var(--ca-green);
446
+ text-decoration-color: currentColor;
489
447
  }
490
448
 
491
- .cg-site-footer__nav .cg-nav__items a {
492
- padding: 0;
493
- border-radius: 0;
449
+ /* The donation ask: ink words on the signal yellow. */
450
+ .ca-ask .cg-action[data-emphasis="primary"],
451
+ .ca-header__action {
452
+ border-color: var(--ca-signal);
453
+ background: var(--ca-signal);
454
+ color: var(--ca-signal-ink);
494
455
  }
495
456
 
496
- .cg-site-footer__social {
497
- display: flex;
498
- gap: var(--cg-s3);
499
- margin: 0;
500
- padding: 0;
501
- list-style: none;
457
+ .ca-ask .cg-action[data-emphasis="primary"]:hover,
458
+ .ca-header__action:hover {
459
+ border-color: var(--ca-signal-hover);
460
+ background: var(--ca-signal-hover);
461
+ color: var(--ca-signal-ink);
502
462
  }
503
463
 
504
- .cg-site-footer__social-item a {
505
- display: flex;
506
- align-items: center;
507
- justify-content: center;
508
- inline-size: 2.25rem;
509
- block-size: 2.25rem;
510
- border-radius: var(--cg-radius-pill);
511
- background: var(--cg-surface-raised);
512
- color: var(--cg-ink-muted);
513
- box-shadow: var(--cg-ring);
514
- }
464
+ /* --------------------------------------------------------------------------
465
+ Search, forms and comments: the utility pages the host renders, in the
466
+ same register. The host sets them in a bare `<main class="cg-main">`.
467
+ -------------------------------------------------------------------------- */
515
468
 
516
- .cg-site-footer__social-item a:hover {
517
- color: var(--cg-accent);
469
+ :is(.cg-main, .cg-sidebar-layout__content) > .cg-page__title,
470
+ .cg-search__form,
471
+ .cg-search__results,
472
+ .cg-search__empty,
473
+ .cg-search__error,
474
+ .cg-form,
475
+ .cg-form__confirmation {
476
+ inline-size: 100%;
477
+ max-inline-size: calc(var(--ca-page) + var(--ca-gutter) * 2);
478
+ margin-inline: auto;
479
+ padding-inline: var(--ca-gutter);
518
480
  }
519
481
 
520
- .cg-social__icon {
521
- inline-size: 1.1rem;
522
- block-size: 1.1rem;
482
+ :is(.cg-main, .cg-sidebar-layout__content) > .cg-page__title {
483
+ padding-block: calc(var(--ca-section) * 0.55) var(--ca-s8);
484
+ font-size: var(--ca-size-title);
485
+ font-weight: var(--ca-weight-bold);
486
+ font-stretch: var(--ca-stretch-display);
487
+ line-height: var(--ca-leading-display);
488
+ letter-spacing: var(--ca-tracking-display);
523
489
  }
524
490
 
525
- .cg-site-footer__note {
526
- margin: 0;
491
+ .cg-search__form > *,
492
+ .cg-form > * {
493
+ max-inline-size: 44rem;
527
494
  }
528
495
 
529
- .cg-site-footer__bottom {
496
+ .cg-search__form {
530
497
  display: flex;
531
498
  flex-wrap: wrap;
532
- align-items: center;
533
- gap: var(--cg-s3);
534
- max-inline-size: var(--cg-page);
535
- margin-inline: auto;
536
- padding-block-start: var(--cg-s6);
537
- font-size: var(--cg-text-xs);
538
- letter-spacing: var(--cg-tracking-wide);
539
- text-transform: uppercase;
540
- color: var(--cg-ink-subtle);
499
+ /* The field and its button share one height on their line. */
500
+ align-items: stretch;
501
+ gap: var(--ca-s3) var(--ca-s4);
502
+ margin-block: 0 var(--ca-s10);
541
503
  }
542
504
 
543
- /* --------------------------------------------------------------------------
544
- Actions — big, friendly, rounded buttons
545
- -------------------------------------------------------------------------- */
546
-
547
- .cg-actions {
548
- display: flex;
549
- flex-wrap: wrap;
550
- gap: var(--cg-s3);
551
- margin: var(--cg-s8) 0 0;
552
- padding: 0;
553
- list-style: none;
505
+ .cg-search__form label,
506
+ .cg-form__field label,
507
+ .cg-comment__form label {
508
+ display: block;
509
+ margin-block-end: var(--ca-s2);
510
+ color: var(--ca-ink);
511
+ font-size: var(--ca-text-caption);
512
+ font-weight: var(--ca-weight-semibold);
554
513
  }
555
514
 
556
- .cg-action {
557
- display: inline-flex;
558
- align-items: center;
559
- justify-content: center;
560
- gap: var(--cg-s2);
561
- padding: var(--cg-s3) var(--cg-s6);
562
- border: 0;
563
- border-radius: var(--cg-radius-pill);
564
- font-size: var(--cg-text-sm);
565
- font-weight: var(--cg-weight-bold);
566
- letter-spacing: var(--cg-tracking-snug);
567
- line-height: var(--cg-leading-snug);
568
- text-decoration: none;
569
- white-space: nowrap;
570
- transition:
571
- background-color var(--cg-duration) var(--cg-ease),
572
- color var(--cg-duration) var(--cg-ease),
573
- box-shadow var(--cg-duration) var(--cg-ease),
574
- transform var(--cg-duration-fast) var(--cg-ease);
515
+ .cg-search__form label {
516
+ flex-basis: 100%;
517
+ margin: 0;
575
518
  }
576
519
 
577
- .cg-action[data-emphasis="primary"] {
578
- background: var(--cg-accent);
579
- color: var(--cg-accent-fg);
580
- box-shadow: var(--cogenta-shadow-sm);
520
+ .cg-search__form input[type="search"] {
521
+ flex: 1 1 18rem;
581
522
  }
582
523
 
583
- .cg-action[data-emphasis="primary"]:hover {
584
- background: var(--cg-accent-hover);
585
- box-shadow: var(--cogenta-shadow-md);
586
- transform: translateY(-1px);
524
+ .cg-search__results {
525
+ display: grid;
526
+ margin-block: 0 var(--ca-section);
527
+ list-style: none;
528
+ font-family: var(--ca-font-display);
529
+ font-size: var(--ca-text-xl);
530
+ font-weight: var(--ca-weight-semibold);
587
531
  }
588
532
 
589
- .cg-action[data-emphasis="secondary"] {
590
- background: var(--cg-surface-raised);
591
- color: var(--cg-ink);
592
- box-shadow: var(--cg-ring-strong);
533
+ .cg-search__results > * {
534
+ padding-block: var(--ca-s5);
535
+ border-block-start: var(--ca-rule) solid var(--ca-line);
593
536
  }
594
537
 
595
- .cg-action[data-emphasis="secondary"]:hover {
596
- color: var(--cg-accent);
597
- box-shadow: var(--cg-ring-accent);
538
+ /* A result reads like a row of the calendar: the title in the display face,
539
+ the green underline on hover, the summary in the text face under it. */
540
+ .cg-search__results > :first-child {
541
+ border-block-start: var(--ca-rule-strong) solid var(--ca-line-ink);
598
542
  }
599
543
 
600
- .cg-action:active {
601
- transform: translateY(0);
602
- box-shadow: none;
544
+ .cg-search__hit {
545
+ line-height: var(--ca-leading-heading);
603
546
  }
604
547
 
605
- /* The eyebrow pill (hero's "cause" tag). */
606
- .cg-pill {
607
- display: inline-flex;
608
- align-items: center;
609
- padding: var(--cg-s1) var(--cg-s4);
610
- border-radius: var(--cg-radius-pill);
611
- background: var(--cg-accent-soft);
612
- color: var(--cg-accent-soft-fg);
613
- font-size: var(--cg-text-xs);
614
- font-weight: var(--cg-weight-bold);
615
- letter-spacing: var(--cg-tracking-wide);
616
- text-transform: uppercase;
548
+ .cg-search__title {
549
+ font-stretch: var(--ca-stretch-display);
550
+ letter-spacing: var(--ca-tracking-heading);
617
551
  }
618
552
 
619
- /* --------------------------------------------------------------------------
620
- Shared block furniture
621
- -------------------------------------------------------------------------- */
622
-
623
- .cg-features__title,
624
- .cg-cta__title,
625
- .cg-faq__title,
626
- .cg-impact__title,
627
- .cg-logos__title,
628
- .cg-list__title-heading,
629
- .cg-pricing__title,
630
- .cg-accordion__title,
631
- .cg-stat-counters__title {
632
- margin: 0 0 var(--cg-s10);
633
- font-size: var(--cg-text-2xl);
634
- line-height: var(--cg-leading-snug);
635
- letter-spacing: var(--cg-tracking-tight);
636
- text-wrap: balance;
553
+ a.cg-search__title {
554
+ color: var(--ca-ink);
555
+ text-decoration-thickness: var(--ca-rule-strong);
556
+ text-decoration-color: transparent;
557
+ text-underline-offset: 0.16em;
637
558
  }
638
559
 
639
- .cg-features__items,
640
- .cg-logos__items,
641
- .cg-gallery__items,
642
- .cg-list__items,
643
- .cg-faq__items,
644
- .cg-accordion__items,
645
- .cg-pricing__tiers {
646
- margin: 0;
647
- padding: 0;
648
- list-style: none;
560
+ a.cg-search__title:hover {
561
+ color: var(--ca-ink);
562
+ text-decoration-color: var(--ca-green);
649
563
  }
650
564
 
651
- .cg-gallery__viewport,
652
- .cg-list__viewport {
653
- overflow-x: auto;
654
- scroll-snap-type: x mandatory;
655
- scroll-behavior: smooth;
656
- overscroll-behavior-inline: contain;
657
- scrollbar-width: thin;
658
- scrollbar-color: var(--cg-line-strong) transparent;
659
- padding-block: var(--cg-s2);
660
- margin-block: calc(var(--cg-s2) * -1);
565
+ .cg-search__excerpt,
566
+ .cg-search__meta,
567
+ .cg-search__count {
568
+ font-family: var(--ca-font-text);
569
+ font-weight: var(--ca-weight-regular);
570
+ letter-spacing: 0;
661
571
  }
662
572
 
663
- /* --------------------------------------------------------------------------
664
- Search, forms, comments — public utility pages and post-content furniture.
665
- -------------------------------------------------------------------------- */
666
-
667
- .cg-search__form,
668
- .cg-search__results,
669
- .cg-search__empty,
670
- .cg-search__error,
671
- .cg-form,
672
- .cg-form__confirmation,
673
- .cg-comments {
674
- max-inline-size: var(--cg-page);
675
- margin-inline: auto;
676
- padding-inline: var(--cg-gutter);
573
+ .cg-search__excerpt {
574
+ margin: var(--ca-s2) 0 0;
575
+ max-inline-size: 64ch;
576
+ color: var(--ca-ink-muted);
577
+ font-size: var(--ca-text-md);
578
+ line-height: var(--ca-leading-text);
677
579
  }
678
580
 
679
- .cg-search__form {
680
- display: flex;
681
- flex-wrap: wrap;
682
- align-items: end;
683
- gap: var(--cg-s3);
684
- margin-block-end: var(--cg-s8);
581
+ .cg-search__meta {
582
+ margin: var(--ca-s2) 0 0;
583
+ color: var(--ca-green);
584
+ font-size: var(--ca-text-caption);
585
+ font-weight: var(--ca-weight-semibold);
685
586
  }
686
587
 
687
- .cg-search__form label {
588
+ .cg-search__count {
688
589
  display: block;
689
- font-size: var(--cg-text-sm);
690
- font-weight: var(--cg-weight-semibold);
691
- margin-block-end: var(--cg-s2);
692
- }
693
-
694
- .cg-search__form input[type="search"] {
695
- flex: 1 1 16rem;
696
- }
697
-
698
- .cg-search__results {
699
- margin: 0 auto;
700
- padding-inline-start: var(--cg-gutter);
701
- display: grid;
702
- gap: var(--cg-s4);
703
- font-size: var(--cg-text-lg);
590
+ margin-block-start: var(--ca-s3);
591
+ color: var(--ca-ink-muted);
592
+ font-size: var(--ca-text-md);
593
+ line-height: var(--ca-leading-ui);
704
594
  }
705
595
 
706
596
  .cg-search__empty,
707
597
  .cg-comments__empty,
708
- .cg-comments__closed {
709
- color: var(--cg-ink-muted);
598
+ .cg-comments__closed,
599
+ .cg-form__help {
600
+ color: var(--ca-ink-muted);
710
601
  }
711
602
 
712
603
  .cg-search__error,
713
604
  .cg-form__error,
714
605
  .cg-form__field-error {
715
- color: var(--cg-ink);
716
- font-weight: var(--cg-weight-bold);
606
+ color: var(--ca-ink);
607
+ font-weight: var(--ca-weight-semibold);
717
608
  }
718
609
 
610
+ /* Fields are a box with a real edge: a form a neighbour fills in once a
611
+ year must look like one. */
719
612
  .cg-search__form input,
720
613
  .cg-form__field input,
721
614
  .cg-form__field select,
@@ -723,66 +616,82 @@ img {
723
616
  .cg-comment__form input,
724
617
  .cg-comment__form textarea {
725
618
  inline-size: 100%;
726
- padding: var(--cg-s3) var(--cg-s4);
727
- border: 1px solid var(--cg-line);
728
- border-radius: var(--cg-radius-sm);
729
- background: var(--cg-surface);
730
- color: var(--cg-ink);
731
- font: inherit;
619
+ min-block-size: 44px;
620
+ padding: var(--ca-s2) var(--ca-s3);
621
+ border: var(--ca-rule) solid var(--ca-line-strong);
622
+ border-radius: var(--ca-radius-control);
623
+ background: var(--ca-canvas);
624
+ color: var(--ca-ink);
625
+ font-family: var(--ca-font-text);
626
+ font-size: var(--ca-text-md);
627
+ line-height: var(--ca-leading-ui);
628
+ transition: border-color var(--ca-duration) var(--ca-ease);
629
+ }
630
+
631
+ .cg-form__field textarea,
632
+ .cg-comment__form textarea {
633
+ padding: var(--ca-s3);
634
+ resize: vertical;
635
+ }
636
+
637
+ .cg-search__form input:focus-visible,
638
+ .cg-form__field :is(input, select, textarea):focus-visible,
639
+ .cg-comment__form :is(input, textarea):focus-visible {
640
+ outline: var(--ca-rule-strong) solid var(--ca-green);
641
+ outline-offset: 1px;
642
+ border-color: var(--ca-green);
732
643
  }
733
644
 
734
645
  .cg-form__field input[aria-invalid="true"],
735
646
  .cg-form__field select[aria-invalid="true"],
736
647
  .cg-form__field textarea[aria-invalid="true"] {
737
- border-width: 2px;
738
- border-color: var(--cg-line-strong);
648
+ border-color: var(--ca-ink);
649
+ border-width: var(--ca-rule-strong);
739
650
  }
740
651
 
741
652
  .cg-search__form button,
742
653
  .cg-form button[type="submit"],
743
654
  .cg-comment__form button[type="submit"] {
744
- padding: var(--cg-s3) var(--cg-s6);
745
- border: 0;
746
- border-radius: var(--cg-radius-pill);
747
- background: var(--cg-accent);
748
- color: var(--cg-accent-fg);
749
- font-weight: var(--cg-weight-bold);
655
+ min-block-size: 44px;
656
+ padding: var(--ca-s3) var(--ca-s6);
657
+ border: var(--ca-rule) solid var(--ca-action);
658
+ border-radius: var(--ca-radius-control);
659
+ background: var(--ca-action);
660
+ color: var(--ca-action-fg);
661
+ font-family: var(--ca-font-text);
662
+ font-size: var(--ca-text-md);
663
+ font-weight: var(--ca-weight-semibold);
750
664
  cursor: pointer;
751
- transition: background-color var(--cg-duration) var(--cg-ease);
665
+ transition:
666
+ background-color var(--ca-duration) var(--ca-ease),
667
+ border-color var(--ca-duration) var(--ca-ease),
668
+ color var(--ca-duration) var(--ca-ease);
752
669
  }
753
670
 
754
671
  .cg-search__form button:hover,
755
672
  .cg-form button[type="submit"]:hover,
756
673
  .cg-comment__form button[type="submit"]:hover {
757
- background: var(--cg-accent-hover);
758
- }
759
-
760
- .cg-form__field,
761
- .cg-comment__form p {
762
- display: block;
763
- margin-block-end: var(--cg-s5);
674
+ background: var(--ca-action-hover);
675
+ border-color: var(--ca-action-hover);
676
+ color: var(--ca-action-hover-fg);
764
677
  }
765
678
 
766
- .cg-form__field label,
767
- .cg-comment__form label {
679
+ .cg-form__field {
768
680
  display: block;
769
- font-size: var(--cg-text-sm);
770
- font-weight: var(--cg-weight-semibold);
771
- margin-block-end: var(--cg-s2);
681
+ margin-block-end: var(--ca-s6);
772
682
  }
773
683
 
774
684
  .cg-form__help {
775
- margin: var(--cg-s2) 0 0;
776
- font-size: var(--cg-text-sm);
777
- color: var(--cg-ink-muted);
685
+ margin: var(--ca-s2) 0 0;
686
+ font-size: var(--ca-text-sm);
778
687
  }
779
688
 
780
689
  .cg-form__choice {
781
690
  display: inline-flex;
782
691
  align-items: center;
783
- gap: var(--cg-s2);
784
- margin-inline-end: var(--cg-s4);
785
- font-weight: normal;
692
+ gap: var(--ca-s2);
693
+ margin-inline-end: var(--ca-s4);
694
+ font-weight: var(--ca-weight-regular);
786
695
  }
787
696
 
788
697
  .cg-form__honeypot,
@@ -794,11 +703,33 @@ img {
794
703
  inset-inline-start: -9999px;
795
704
  }
796
705
 
706
+ /* Comments sit on the reading column of the text above them. */
797
707
  .cg-comments {
798
- margin-block-start: var(--cg-section-y);
799
- padding-block-start: var(--cg-s8);
800
- padding-block-end: var(--cg-section-y);
801
- border-block-start: 1px solid var(--cg-line-soft);
708
+ display: grid;
709
+ grid-template-columns: repeat(var(--ca-columns), minmax(0, 1fr));
710
+ column-gap: var(--ca-col-gap);
711
+ max-inline-size: calc(var(--ca-page) + var(--ca-gutter) * 2);
712
+ margin: 0 auto var(--ca-section);
713
+ padding: 0 var(--ca-gutter);
714
+ }
715
+
716
+ .cg-comments > * {
717
+ grid-column: 1 / -1;
718
+ min-inline-size: 0;
719
+ }
720
+
721
+ @media (min-width: 64rem) {
722
+ .cg-comments > * {
723
+ grid-column: 1 / span 8;
724
+ }
725
+ }
726
+
727
+ .cg-comments > h2 {
728
+ padding-block-start: var(--ca-s5);
729
+ border-block-start: var(--ca-rule-strong) solid var(--ca-line-ink);
730
+ margin-block-end: var(--ca-s5);
731
+ font-size: var(--ca-size-section);
732
+ font-stretch: var(--ca-stretch-display);
802
733
  }
803
734
 
804
735
  .cg-comments__list,
@@ -809,34 +740,52 @@ img {
809
740
  }
810
741
 
811
742
  .cg-comment {
812
- padding-block: var(--cg-s5);
813
- border-block-end: 1px solid var(--cg-line-soft);
743
+ padding-block: var(--ca-s5);
744
+ border-block-start: var(--ca-rule) solid var(--ca-line);
814
745
  }
815
746
 
816
747
  .cg-comment__replies {
817
- padding-block-start: var(--cg-s5);
818
- }
819
-
820
- .cg-comment__replies .cg-comment {
821
- padding-inline-start: var(--cg-s6);
822
- border-inline-start: 2px solid var(--cg-line-soft);
823
- border-block-end: 0;
748
+ margin-block-start: var(--ca-s4);
749
+ padding-inline-start: var(--ca-s6);
750
+ border-inline-start: var(--ca-rule) solid var(--ca-line);
824
751
  }
825
752
 
826
753
  .cg-comment__meta {
827
754
  display: flex;
828
- gap: var(--cg-s3);
829
- align-items: baseline;
830
- font-size: var(--cg-text-sm);
831
- color: var(--cg-ink-muted);
832
- margin-block-end: var(--cg-s2);
755
+ flex-wrap: wrap;
756
+ gap: var(--ca-s1) var(--ca-s3);
757
+ margin: 0 0 var(--ca-s2);
758
+ font-size: var(--ca-text-sm);
833
759
  }
834
760
 
835
761
  .cg-comment__author {
836
- font-weight: var(--cg-weight-semibold);
837
- color: var(--cg-ink);
762
+ color: var(--ca-ink);
763
+ font-weight: var(--ca-weight-semibold);
764
+ }
765
+
766
+ .cg-comment__date {
767
+ color: var(--ca-ink-muted);
768
+ font-variant-numeric: lining-nums tabular-nums;
838
769
  }
839
770
 
840
- .cg-comment__body {
771
+ .cg-comment__body p {
841
772
  margin: 0;
842
773
  }
774
+
775
+ .cg-comment__body p + p {
776
+ margin-block-start: var(--ca-s3);
777
+ }
778
+
779
+ .cg-comment__form {
780
+ display: grid;
781
+ gap: var(--ca-s3);
782
+ margin-block-start: var(--ca-s6);
783
+ }
784
+
785
+ .cg-comment__form > * {
786
+ margin: 0;
787
+ }
788
+
789
+ .cg-comment__form button[type="submit"] {
790
+ justify-self: start;
791
+ }