@cogenta/theme-docs 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 +2 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/render/blocks/accordion.d.ts +8 -0
  6. package/dist/src/render/blocks/accordion.d.ts.map +1 -1
  7. package/dist/src/render/blocks/accordion.js +10 -10
  8. package/dist/src/render/blocks/accordion.js.map +1 -1
  9. package/dist/src/render/blocks/collection-list.d.ts +3 -11
  10. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  11. package/dist/src/render/blocks/collection-list.js +69 -68
  12. package/dist/src/render/blocks/collection-list.js.map +1 -1
  13. package/dist/src/render/blocks/cta.d.ts +6 -0
  14. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  15. package/dist/src/render/blocks/cta.js +9 -4
  16. package/dist/src/render/blocks/cta.js.map +1 -1
  17. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  18. package/dist/src/render/blocks/embed.js +14 -13
  19. package/dist/src/render/blocks/embed.js.map +1 -1
  20. package/dist/src/render/blocks/faq.d.ts +7 -0
  21. package/dist/src/render/blocks/faq.d.ts.map +1 -1
  22. package/dist/src/render/blocks/faq.js +10 -10
  23. package/dist/src/render/blocks/faq.js.map +1 -1
  24. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
  25. package/dist/src/render/blocks/feature-grid.js +19 -19
  26. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  27. package/dist/src/render/blocks/gallery.d.ts +8 -4
  28. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  29. package/dist/src/render/blocks/gallery.js +19 -13
  30. package/dist/src/render/blocks/gallery.js.map +1 -1
  31. package/dist/src/render/blocks/hero.d.ts +12 -9
  32. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  33. package/dist/src/render/blocks/hero.js +22 -20
  34. package/dist/src/render/blocks/hero.js.map +1 -1
  35. package/dist/src/render/blocks/logo-strip.d.ts +6 -0
  36. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
  37. package/dist/src/render/blocks/logo-strip.js +6 -10
  38. package/dist/src/render/blocks/logo-strip.js.map +1 -1
  39. package/dist/src/render/blocks/logos.d.ts +10 -0
  40. package/dist/src/render/blocks/logos.d.ts.map +1 -1
  41. package/dist/src/render/blocks/logos.js +20 -17
  42. package/dist/src/render/blocks/logos.js.map +1 -1
  43. package/dist/src/render/blocks/media-figure.d.ts +0 -6
  44. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  45. package/dist/src/render/blocks/media-figure.js +28 -16
  46. package/dist/src/render/blocks/media-figure.js.map +1 -1
  47. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  48. package/dist/src/render/blocks/pricing-table.js +16 -20
  49. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  50. package/dist/src/render/blocks/prose.d.ts +13 -1
  51. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  52. package/dist/src/render/blocks/prose.js +12 -31
  53. package/dist/src/render/blocks/prose.js.map +1 -1
  54. package/dist/src/render/blocks/quote.d.ts +5 -3
  55. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  56. package/dist/src/render/blocks/quote.js +10 -14
  57. package/dist/src/render/blocks/quote.js.map +1 -1
  58. package/dist/src/render/blocks/stat-counter.d.ts +5 -0
  59. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
  60. package/dist/src/render/blocks/stat-counter.js +6 -10
  61. package/dist/src/render/blocks/stat-counter.js.map +1 -1
  62. package/dist/src/render/blocks/stats.d.ts +10 -0
  63. package/dist/src/render/blocks/stats.d.ts.map +1 -1
  64. package/dist/src/render/blocks/stats.js +13 -8
  65. package/dist/src/render/blocks/stats.js.map +1 -1
  66. package/dist/src/render/blocks/testimonial.d.ts +4 -5
  67. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  68. package/dist/src/render/blocks/testimonial.js +9 -13
  69. package/dist/src/render/blocks/testimonial.js.map +1 -1
  70. package/dist/src/render/chrome.d.ts +36 -1
  71. package/dist/src/render/chrome.d.ts.map +1 -1
  72. package/dist/src/render/chrome.js +122 -80
  73. package/dist/src/render/chrome.js.map +1 -1
  74. package/dist/src/render/doc-index.d.ts +25 -0
  75. package/dist/src/render/doc-index.d.ts.map +1 -0
  76. package/dist/src/render/doc-index.js +49 -0
  77. package/dist/src/render/doc-index.js.map +1 -0
  78. package/dist/src/render/doc-page.d.ts +6 -0
  79. package/dist/src/render/doc-page.d.ts.map +1 -0
  80. package/dist/src/render/doc-page.js +127 -0
  81. package/dist/src/render/doc-page.js.map +1 -0
  82. package/dist/src/render/layout.d.ts +23 -0
  83. package/dist/src/render/layout.d.ts.map +1 -0
  84. package/dist/src/render/layout.js +40 -0
  85. package/dist/src/render/layout.js.map +1 -0
  86. package/dist/src/render/render-block.d.ts +9 -6
  87. package/dist/src/render/render-block.d.ts.map +1 -1
  88. package/dist/src/render/render-block.js +47 -100
  89. package/dist/src/render/render-block.js.map +1 -1
  90. package/dist/src/render/rich-text.d.ts +26 -0
  91. package/dist/src/render/rich-text.d.ts.map +1 -0
  92. package/dist/src/render/rich-text.js +325 -0
  93. package/dist/src/render/rich-text.js.map +1 -0
  94. package/dist/src/render/search.d.ts +15 -0
  95. package/dist/src/render/search.d.ts.map +1 -0
  96. package/dist/src/render/search.js +31 -0
  97. package/dist/src/render/search.js.map +1 -0
  98. package/dist/src/render/strings.d.ts +51 -0
  99. package/dist/src/render/strings.d.ts.map +1 -0
  100. package/dist/src/render/strings.js +60 -0
  101. package/dist/src/render/strings.js.map +1 -0
  102. package/dist/src/render/term-archive.d.ts +5 -5
  103. package/dist/src/render/term-archive.d.ts.map +1 -1
  104. package/dist/src/render/term-archive.js +27 -16
  105. package/dist/src/render/term-archive.js.map +1 -1
  106. package/dist/src/render/widget-areas.d.ts +22 -0
  107. package/dist/src/render/widget-areas.d.ts.map +1 -0
  108. package/dist/src/render/widget-areas.js +29 -0
  109. package/dist/src/render/widget-areas.js.map +1 -0
  110. package/package.json +4 -4
  111. package/src/index.ts +2 -0
  112. package/src/render/blocks/accordion.ts +31 -42
  113. package/src/render/blocks/collection-list.ts +132 -123
  114. package/src/render/blocks/cta.ts +23 -18
  115. package/src/render/blocks/embed.ts +37 -28
  116. package/src/render/blocks/faq.ts +26 -37
  117. package/src/render/blocks/feature-grid.ts +34 -42
  118. package/src/render/blocks/gallery.ts +33 -29
  119. package/src/render/blocks/hero.ts +41 -45
  120. package/src/render/blocks/logo-strip.ts +21 -21
  121. package/src/render/blocks/logos.ts +32 -42
  122. package/src/render/blocks/media-figure.ts +47 -25
  123. package/src/render/blocks/pricing-table.ts +34 -41
  124. package/src/render/blocks/prose.ts +25 -40
  125. package/src/render/blocks/quote.ts +25 -19
  126. package/src/render/blocks/stat-counter.ts +27 -29
  127. package/src/render/blocks/stats.ts +35 -32
  128. package/src/render/blocks/testimonial.ts +18 -19
  129. package/src/render/chrome.ts +170 -83
  130. package/src/render/doc-index.ts +65 -0
  131. package/src/render/doc-page.ts +303 -0
  132. package/src/render/layout.ts +73 -0
  133. package/src/render/render-block.ts +67 -191
  134. package/src/render/rich-text.ts +446 -0
  135. package/src/render/search.ts +41 -0
  136. package/src/render/strings.ts +67 -0
  137. package/src/render/term-archive.ts +62 -38
  138. package/src/render/widget-areas.ts +33 -0
  139. package/src/styles/archive.css +21 -27
  140. package/src/styles/base.css +438 -838
  141. package/src/styles/blocks.css +658 -916
  142. package/src/styles/chrome.css +439 -0
  143. package/src/styles/docs.css +404 -0
  144. package/src/styles/rich.css +337 -0
  145. package/src/styles/theme.css +28 -23
  146. package/src/styles/tokens.css +209 -215
  147. package/src/styles/widgets.css +890 -0
  148. package/tokens.json +15 -15
@@ -1,8 +1,7 @@
1
1
  /*
2
- * Document, accessibility floor, page frame, chrome (header/footer/nav,
3
- * including the CSS-only mobile menu) and the two-column doc-page layout.
4
- * Everything here reads the design system from `tokens.css`; nothing here
5
- * reads a `--cogenta-*` token directly.
2
+ * Document, accessibility floor, the grid, section and page titles, the
3
+ * hairline frame, actions, the search field, and the utility pages the host
4
+ * renders (search results, forms, comments). Everything reads `tokens.css`.
6
5
  */
7
6
 
8
7
  /* --------------------------------------------------------------------------
@@ -15,969 +14,536 @@
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: calc(var(--cd-header-height) + var(--cd-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(--cd-canvas);
27
+ color: var(--cd-ink);
28
+ font-family: var(--cd-font-sans);
29
+ font-size: var(--cd-text-md);
30
+ font-weight: var(--cd-weight-regular);
31
+ line-height: var(--cd-leading-text);
25
32
  font-kerning: normal;
26
- font-variant-ligatures: common-ligatures;
27
- text-underline-offset: 0.15em;
28
- text-decoration-thickness: from-font;
29
- -webkit-text-size-adjust: 100%;
33
+ font-synthesis: none;
34
+ text-rendering: optimizeLegibility;
35
+ -webkit-font-smoothing: antialiased;
30
36
  }
31
37
 
32
38
  ::selection {
33
- background: var(--cg-accent-soft);
34
- color: var(--cg-accent-soft-fg);
39
+ background: var(--cd-accent);
40
+ color: var(--cd-accent-fg);
35
41
  }
36
42
 
37
43
  img,
38
44
  video,
39
45
  iframe {
40
- max-width: 100%;
41
- height: auto;
46
+ display: block;
47
+ max-inline-size: 100%;
48
+ block-size: auto;
42
49
  }
43
50
 
44
51
  img {
45
- display: block;
46
52
  object-fit: cover;
47
53
  }
48
54
 
49
- :where(a) {
50
- color: var(--cg-accent);
51
- text-decoration-color: color-mix(in oklab, var(--cg-accent) 40%, transparent);
52
- transition:
53
- color var(--cg-duration-fast) var(--cg-ease),
54
- text-decoration-color var(--cg-duration-fast) var(--cg-ease);
55
+ :where(img, video) {
56
+ filter: brightness(var(--cd-image-brightness));
57
+ }
58
+
59
+ :where(h1, h2, h3, h4, h5, h6) {
60
+ margin: 0;
61
+ font-family: var(--cd-font-sans);
62
+ font-weight: var(--cd-weight-semibold);
63
+ line-height: var(--cd-leading-heading);
64
+ letter-spacing: var(--cd-tracking-heading);
65
+ text-wrap: balance;
55
66
  }
56
67
 
57
- :where(a:hover) {
58
- color: var(--cg-accent-hover);
68
+ :where(p, li, dd, figcaption, blockquote) {
69
+ text-wrap: pretty;
70
+ }
71
+
72
+ :where(a) {
73
+ color: var(--cd-link);
74
+ text-decoration-line: underline;
75
+ text-decoration-thickness: var(--cd-rule);
59
76
  text-decoration-color: currentColor;
77
+ text-underline-offset: 0.22em;
78
+ transition:
79
+ color var(--cd-duration) var(--cd-ease),
80
+ text-decoration-color var(--cd-duration) var(--cd-ease);
60
81
  }
61
82
 
62
83
  :where(hr) {
63
- block-size: 1px;
84
+ block-size: var(--cd-rule);
64
85
  border: 0;
65
- margin-block: var(--cg-s10);
66
- background: var(--cg-line);
86
+ margin-block: var(--cd-s10);
87
+ background: var(--cd-line);
67
88
  }
68
89
 
69
- kbd {
70
- display: inline-block;
71
- padding: 0.1em 0.45em;
72
- font-family: var(--cogenta-font-mono);
73
- font-size: 0.85em;
74
- border-radius: var(--cg-radius-sm);
75
- background: var(--cg-surface-sunken);
76
- box-shadow: var(--cg-ring);
77
- color: var(--cg-ink-muted);
90
+ :where(code, kbd, samp, pre) {
91
+ font-family: var(--cd-font-mono);
92
+ }
93
+
94
+ :where(data, time) {
95
+ font-variant-numeric: tabular-nums;
96
+ }
97
+
98
+ .cg-visually-hidden {
99
+ position: absolute;
100
+ inline-size: 1px;
101
+ block-size: 1px;
102
+ margin: -1px;
103
+ padding: 0;
104
+ overflow: hidden;
105
+ clip-path: inset(50%);
106
+ white-space: nowrap;
107
+ border: 0;
78
108
  }
79
109
 
80
110
  /* --------------------------------------------------------------------------
81
- Focus, targets, motion
111
+ Focus, targets, motion. Motion is a colour or an underline changing, in
112
+ under 150 ms; nothing moves in space, nothing fades in on scroll.
82
113
  -------------------------------------------------------------------------- */
83
114
 
84
- :where(a, button, summary, [tabindex]):focus-visible {
85
- outline: 2px solid var(--cg-accent);
86
- outline-offset: 3px;
87
- border-radius: var(--cg-radius-xs);
115
+ :where(a, button, summary, input, select, textarea, [tabindex]):focus-visible {
116
+ outline: var(--cd-rule-strong) solid var(--cd-accent);
117
+ outline-offset: 2px;
88
118
  }
89
119
 
90
- :where(.cg-action, .cg-faq__question, .cg-panels__question, .cg-nav-toggle__button) {
120
+ :where(.cg-action, .cg-theme-toggle, summary) {
91
121
  min-block-size: 44px;
92
- min-inline-size: 44px;
93
- }
94
-
95
- @supports (animation-timeline: view()) {
96
- @media (prefers-reduced-motion: no-preference) {
97
- @keyframes cg-settle {
98
- from {
99
- opacity: 0;
100
- transform: translateY(var(--cg-s3));
101
- }
102
-
103
- to {
104
- opacity: 1;
105
- transform: none;
106
- }
107
- }
108
-
109
- .cg-block {
110
- animation: cg-settle linear both;
111
- animation-timeline: view();
112
- animation-range: entry 0% cover 20%;
113
- }
114
- }
115
122
  }
116
123
 
124
+ /* Every transition in this theme reads `--cd-duration`, so reduced motion is
125
+ one declaration rather than an `!important` sweep over every element. */
117
126
  @media (prefers-reduced-motion: reduce) {
118
- *,
119
- *::before,
120
- *::after {
121
- animation-duration: 1ms !important;
122
- animation-iteration-count: 1 !important;
123
- transition-duration: 1ms !important;
124
- scroll-behavior: auto !important;
127
+ :root {
128
+ --cd-duration: 0ms;
125
129
  }
126
130
  }
127
131
 
128
132
  .cg-skip-link {
129
133
  position: absolute;
130
- inset-inline-start: var(--cg-s3);
131
- inset-block-start: calc(var(--cg-s3) * -8);
132
- z-index: 20;
133
- padding: var(--cg-s2) var(--cg-s4);
134
- background: var(--cg-accent);
135
- color: var(--cg-accent-fg);
136
- border-radius: var(--cg-radius-md);
137
- box-shadow: var(--cg-elevation-2);
138
- font-weight: var(--cg-weight-semibold);
134
+ inset-inline-start: var(--cd-s3);
135
+ inset-block-start: calc(var(--cd-s16) * -1);
136
+ z-index: 60;
137
+ padding: var(--cd-s2) var(--cd-s4);
138
+ border-radius: var(--cd-radius-control);
139
+ background: var(--cd-ink);
140
+ color: var(--cd-canvas);
141
+ font-size: var(--cd-text-ui);
142
+ font-weight: var(--cd-weight-medium);
139
143
  text-decoration: none;
140
- transition: inset-block-start var(--cg-duration) var(--cg-ease);
141
144
  }
142
145
 
143
146
  .cg-skip-link:focus-visible {
144
- inset-block-start: var(--cg-s3);
147
+ inset-block-start: var(--cd-s3);
145
148
  }
146
149
 
147
150
  /* --------------------------------------------------------------------------
148
- Page frame
151
+ The grid. Every block outside a documentation page is a section around a
152
+ twelve-column container; the section rhythm is one variable.
149
153
  -------------------------------------------------------------------------- */
150
154
 
151
- .cg-main {
155
+ .cd-main {
152
156
  display: flow-root;
157
+ overflow-x: clip;
158
+ padding-block-end: calc(var(--cd-section) / 2);
153
159
  }
154
160
 
155
- .cg-block {
156
- max-inline-size: var(--cg-page);
161
+ .cd-container {
162
+ display: grid;
163
+ grid-template-columns: repeat(var(--cd-columns), minmax(0, 1fr));
164
+ column-gap: var(--cd-col-gap);
165
+ align-items: start;
166
+ inline-size: 100%;
167
+ max-inline-size: calc(var(--cd-page) + var(--cd-gutter) * 2);
157
168
  margin-inline: auto;
158
- margin-block: var(--cg-section-y);
159
- padding-inline: var(--cg-gutter);
169
+ padding-inline: var(--cd-gutter);
160
170
  }
161
171
 
162
- [data-block][data-variant-background="muted"],
163
- [data-block][data-variant-background="image"] {
164
- padding-block: var(--cg-s10);
165
- border-radius: var(--cg-radius-lg);
166
- }
167
-
168
- [data-block][data-variant-background="muted"] {
169
- background: var(--cg-surface-sunken);
172
+ /* Below the wide breakpoint twelve columns only make slivers: every child
173
+ takes the full row, and each block redistributes from there. */
174
+ .cd-container > * {
175
+ grid-column: 1 / -1;
176
+ min-inline-size: 0;
170
177
  }
171
178
 
172
- [data-block][data-variant-background="image"] {
173
- background: var(--cg-surface-tinted);
179
+ .cd-section {
180
+ padding-block: calc(var(--cd-section) / 2);
174
181
  }
175
182
 
176
- [data-block][data-variant-spacing="compact"] {
177
- margin-block: calc(var(--cg-section-y) / 2);
178
- }
183
+ /* --- section titles ----------------------------------------------------------
184
+ A titled block names itself from the first column, with the same space
185
+ under it everywhere, and a hairline above it so a long home page reads as
186
+ chapters. */
179
187
 
180
- [data-block][data-variant-spacing="spacious"] {
181
- margin-block: calc(var(--cg-section-y) * 1.6);
188
+ .cd-head {
189
+ display: grid;
190
+ gap: var(--cd-s2);
191
+ margin-block-end: var(--cd-s8);
182
192
  }
183
193
 
184
- [data-block][data-variant-align="start"] {
185
- text-align: start;
194
+ .cd-head__title {
195
+ max-inline-size: 30ch;
196
+ font-size: var(--cd-size-section);
197
+ font-weight: var(--cd-weight-semibold);
198
+ line-height: var(--cd-leading-heading);
199
+ letter-spacing: var(--cd-tracking-display);
186
200
  }
187
201
 
188
- [data-block][data-variant-align="center"] {
189
- text-align: center;
202
+ .cd-empty {
203
+ margin: 0;
204
+ padding-block: var(--cd-s6);
205
+ border-block: var(--cd-rule) solid var(--cd-line);
206
+ color: var(--cd-ink-muted);
207
+ font-size: var(--cd-text-ui);
190
208
  }
191
209
 
192
- [data-block][data-variant-align="end"] {
193
- text-align: end;
194
- }
210
+ /* --- the hairline frame ------------------------------------------------------
211
+ Every diagram, screenshot, photograph and embedded player wears the same
212
+ frame: one hairline, a hair of softening on the corners, the raised grey
213
+ behind an image that has not loaded yet. No shadow, no tilt. */
195
214
 
196
- [data-block][data-variant-width="full"] {
197
- max-inline-size: none;
198
- padding-inline: 0;
215
+ .cd-frame {
216
+ display: block;
217
+ overflow: hidden;
218
+ margin: 0;
219
+ border: var(--cd-rule) solid var(--cd-line);
220
+ border-radius: var(--cd-radius-frame);
221
+ background: var(--cd-raised);
199
222
  }
200
223
 
201
- .cg-page__title {
202
- max-inline-size: var(--cg-page);
203
- margin-inline: auto;
204
- margin-block: var(--cg-section-y) var(--cg-s6);
205
- padding-inline: var(--cg-gutter);
206
- font-size: var(--cg-text-3xl);
207
- line-height: var(--cg-leading-tight);
208
- letter-spacing: var(--cg-tracking-tight);
209
- font-weight: var(--cg-weight-bold);
210
- text-wrap: balance;
224
+ .cd-frame__image {
225
+ inline-size: 100%;
226
+ block-size: 100%;
211
227
  }
212
228
 
213
- /* --------------------------------------------------------------------------
214
- Entry header (`renderEntryHeader`, `@cogenta/theme-kit`, `theme@1.4`)
215
- -------------------------------------------------------------------------- */
216
-
217
- .cg-entry-header {
218
- margin: 0 0 var(--cg-s6);
219
- }
229
+ /* --- per-block variants (blocks@2.0, RFC 0002) --------------------------- */
220
230
 
221
- .cg-entry-header__terms {
222
- display: flex;
223
- flex-wrap: wrap;
224
- gap: var(--cg-s2);
225
- margin: 0 0 var(--cg-s3);
226
- padding: 0;
227
- list-style: none;
228
- font-size: var(--cg-text-sm);
229
- font-weight: var(--cg-weight-semibold);
230
- letter-spacing: var(--cg-tracking-wide);
231
- text-transform: uppercase;
232
- color: var(--cg-accent);
231
+ [data-block][data-variant-background="muted"],
232
+ [data-block][data-variant-background="image"] {
233
+ background: var(--cd-surface);
234
+ border-block: var(--cd-rule) solid var(--cd-line);
233
235
  }
234
236
 
235
- .cg-entry-header__terms a {
236
- color: inherit;
237
- text-decoration: none;
237
+ [data-block][data-variant-spacing="compact"] {
238
+ padding-block: calc(var(--cd-section) / 4);
238
239
  }
239
240
 
240
- .cg-entry-header__terms li:not(:last-child)::after {
241
- content: "·";
242
- margin-inline-start: var(--cg-s2);
243
- color: var(--cg-ink-muted);
241
+ [data-block][data-variant-spacing="spacious"] {
242
+ padding-block: calc(var(--cd-section) * 0.8);
244
243
  }
245
244
 
246
- .cg-entry-header__title {
247
- margin: 0 0 var(--cg-s3);
248
- font-size: var(--cg-text-3xl);
249
- line-height: var(--cg-leading-tight);
250
- letter-spacing: var(--cg-tracking-tight);
251
- font-weight: var(--cg-weight-bold);
252
- text-wrap: balance;
245
+ [data-block][data-variant-align="center"] {
246
+ text-align: center;
253
247
  }
254
248
 
255
- .cg-entry-header__excerpt {
256
- margin: 0 0 var(--cg-s4);
257
- font-size: var(--cg-text-lg);
258
- color: var(--cg-ink-muted);
259
- text-wrap: pretty;
249
+ [data-block][data-variant-align="end"] {
250
+ text-align: end;
260
251
  }
261
252
 
262
- .cg-entry-header__meta {
263
- display: flex;
264
- flex-wrap: wrap;
265
- gap: var(--cg-s3);
266
- margin: 0 0 var(--cg-s5);
267
- font-size: var(--cg-text-sm);
268
- color: var(--cg-ink-muted);
253
+ [data-block][data-variant-width="full"] > .cd-container {
254
+ max-inline-size: none;
269
255
  }
270
256
 
271
- .cg-entry-header__meta > :not(:last-child)::after {
272
- content: "·";
273
- margin-inline-start: var(--cg-s3);
274
- color: var(--cg-line-strong);
275
- }
257
+ /* --- the title of any page outside the documentation that has no hero ---- */
276
258
 
277
- .cg-entry-header__cover img,
278
- .cg-entry-header__cover video {
279
- inline-size: 100%;
280
- aspect-ratio: 16 / 9;
281
- border-radius: var(--cg-radius-lg);
282
- object-fit: cover;
259
+ .cd-page-head {
260
+ padding-block: calc(var(--cd-section) * 0.6) calc(var(--cd-section) * 0.1);
283
261
  }
284
262
 
285
- /* --------------------------------------------------------------------------
286
- Chrome — header (sticky, brand mark, desktop nav, header action, and a
287
- CSS-only mobile menu — a <details> disclosure, never a script)
288
- -------------------------------------------------------------------------- */
289
-
290
- .cg-site-header {
291
- position: sticky;
292
- inset-block-start: 0;
293
- z-index: 5;
294
- block-size: var(--cg-header-height);
295
- display: flex;
296
- align-items: center;
297
- padding-inline: var(--cg-gutter);
298
- /* Flat and fully opaque, not a frosted-glass blur: a sticky header reads
299
- as a solid plane sitting above the page, with a hairline marking where
300
- it ends. */
301
- background: var(--cg-canvas);
302
- border-block-end: 1px solid var(--cg-line-soft);
263
+ .cd-page-head__inner {
264
+ row-gap: var(--cd-s4);
303
265
  }
304
266
 
305
- .cg-site-header__inner {
306
- display: flex;
307
- align-items: center;
308
- gap: var(--cg-gap);
309
- inline-size: 100%;
310
- max-inline-size: var(--cg-page);
311
- margin-inline: auto;
267
+ .cd-page-head__title {
268
+ max-inline-size: 26ch;
269
+ font-size: var(--cd-size-title);
270
+ line-height: var(--cd-leading-display);
271
+ letter-spacing: var(--cd-tracking-display);
312
272
  }
313
273
 
314
- .cg-site-header__home {
315
- display: flex;
316
- align-items: center;
317
- flex-shrink: 0;
318
- color: var(--cg-ink);
319
- font-weight: var(--cg-weight-bold);
320
- font-size: var(--cg-text-lg);
321
- letter-spacing: var(--cg-tracking-tight);
322
- text-decoration: none;
323
- white-space: nowrap;
324
- margin-inline-end: var(--cg-s6);
274
+ .cd-page-head__lead {
275
+ margin: 0;
276
+ max-inline-size: 60ch;
277
+ color: var(--cd-ink-muted);
278
+ font-size: var(--cd-size-lead);
279
+ line-height: var(--cd-leading-lead);
325
280
  }
326
281
 
327
- .cg-site-header__logo {
328
- display: block;
329
- block-size: 1.75rem;
330
- inline-size: auto;
331
- max-inline-size: 12rem;
332
- object-fit: contain;
282
+ .cd-page-head__meta {
283
+ margin: 0;
284
+ color: var(--cd-ink-muted);
285
+ font-size: var(--cd-text-label);
286
+ font-variant-numeric: tabular-nums;
333
287
  }
334
288
 
335
- .cg-site-header__nav {
336
- margin-inline-end: auto;
337
- }
289
+ /* --------------------------------------------------------------------------
290
+ Actions: a small filled teal control for the primary intent, and for the
291
+ rest the words underlined with an arrow after them. No lift, no shadow.
292
+ -------------------------------------------------------------------------- */
338
293
 
339
- .cg-menu {
294
+ .cg-actions {
340
295
  display: flex;
341
296
  flex-wrap: wrap;
342
297
  align-items: center;
343
- gap: var(--cg-s5);
298
+ gap: var(--cd-s3) var(--cd-s8);
344
299
  margin: 0;
345
300
  padding: 0;
346
301
  list-style: none;
347
- font-size: var(--cg-text-sm);
348
- font-weight: var(--cg-weight-medium);
349
302
  }
350
303
 
351
- .cg-menu a,
352
- .cg-menu span {
353
- color: var(--cg-ink-muted);
304
+ .cg-action {
305
+ font-family: var(--cd-font-sans);
306
+ font-size: var(--cd-text-ui);
307
+ font-weight: var(--cd-weight-medium);
308
+ line-height: 1.2;
354
309
  text-decoration: none;
310
+ transition:
311
+ background-color var(--cd-duration) var(--cd-ease),
312
+ color var(--cd-duration) var(--cd-ease),
313
+ border-color var(--cd-duration) var(--cd-ease),
314
+ text-decoration-color var(--cd-duration) var(--cd-ease);
355
315
  }
356
316
 
357
- .cg-menu a:hover {
358
- color: var(--cg-ink);
359
- }
360
-
361
- .cg-site-header__action {
362
- margin-inline-start: var(--cg-s3);
363
- white-space: nowrap;
364
- }
365
-
366
- /* The manual light/dark/system control (`renderThemeToggle`, `@cogenta/
367
- theme-kit`) — a plain icon button matching `.cg-nav-toggle__button`'s own
368
- sizing and radius, not `.cg-action`'s call-to-action look, so it never
369
- competes visually with the header action. Always visible, at every
370
- viewport width — unlike the nav links, it needs no mobile disclosure. */
371
- .cg-theme-toggle {
372
- display: flex;
317
+ .cg-action[data-emphasis="primary"] {
318
+ display: inline-flex;
373
319
  align-items: center;
374
320
  justify-content: center;
375
- block-size: 2.25rem;
376
- inline-size: 2.25rem;
377
- flex-shrink: 0;
378
- margin-inline-start: var(--cg-s2);
379
- border-radius: var(--cg-radius-md);
380
- border: 1px solid var(--cg-line-soft);
381
- background: transparent;
382
- color: var(--cg-ink);
383
- cursor: pointer;
384
- }
385
-
386
- .cg-theme-toggle:hover {
387
- background: var(--cg-surface-sunken);
321
+ padding: var(--cd-s3) var(--cd-s5);
322
+ border: var(--cd-rule) solid var(--cd-accent);
323
+ border-radius: var(--cd-radius-control);
324
+ background: var(--cd-accent);
325
+ color: var(--cd-accent-fg);
326
+ white-space: nowrap;
388
327
  }
389
328
 
390
- .cg-theme-toggle__icon {
391
- block-size: 1.1rem;
392
- inline-size: 1.1rem;
329
+ .cg-action[data-emphasis="primary"]:hover {
330
+ border-color: var(--cd-accent-hover);
331
+ background: var(--cd-accent-hover);
332
+ color: var(--cd-accent-fg);
333
+ }
334
+
335
+ /* A text link with an arrow after it. Not a flex container: in one, the words
336
+ and the arrow are two flex items and each gets its own underline. As inline
337
+ content the words carry one continuous underline, and the arrow, an
338
+ inline-block, inherits none (decorations do not propagate to atomic
339
+ inlines). The same rule draws every arrow link of the theme, so a lone
340
+ arrow cannot exist anywhere. */
341
+ .cg-action[data-emphasis="secondary"],
342
+ .cd-arrow-link {
343
+ display: inline-block;
344
+ color: var(--cd-ink);
345
+ font-weight: var(--cd-weight-medium);
346
+ text-decoration-line: underline;
347
+ text-decoration-thickness: var(--cd-rule);
348
+ text-decoration-color: var(--cd-line-strong);
349
+ text-decoration-skip-ink: auto;
350
+ text-underline-offset: 0.3em;
393
351
  }
394
352
 
395
- .cg-theme-toggle__icon--moon {
396
- display: none;
353
+ .cg-action[data-emphasis="secondary"] {
354
+ padding-block: var(--cd-s3);
397
355
  }
398
356
 
399
- /* Icon reflects the *current* effective appearance — sun while light, moon
400
- while dark — from the same `[data-theme]`/`prefers-color-scheme` signals
401
- `tokens.css` already keys the whole palette on. */
402
- @media (prefers-color-scheme: dark) {
403
- :where(:root:not([data-theme="light"])) .cg-theme-toggle__icon--sun {
404
- display: none;
405
- }
406
- :where(:root:not([data-theme="light"])) .cg-theme-toggle__icon--moon {
407
- display: block;
408
- }
357
+ .cg-action[data-emphasis="secondary"]::after,
358
+ .cd-arrow-link::after {
359
+ content: "\2192" / "";
360
+ display: inline-block;
361
+ margin-inline-start: 0.35em;
409
362
  }
410
363
 
411
- :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--sun {
412
- display: none;
364
+ .cg-action[data-emphasis="secondary"]:hover,
365
+ .cd-arrow-link:hover {
366
+ color: var(--cd-ink);
367
+ text-decoration-color: currentColor;
413
368
  }
414
369
 
415
- :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--moon {
416
- display: block;
417
- }
370
+ /* --------------------------------------------------------------------------
371
+ The search field. A real form: `GET /search?q=`, answered by the host. In
372
+ the header it is compact; on the home page it is the first thing a reader
373
+ reaches for.
374
+ -------------------------------------------------------------------------- */
418
375
 
419
- /* The mobile disclosure — hidden entirely above the sidebar breakpoint, so
420
- its (duplicate) links never enter the accessibility tree on a wide
421
- viewport, exactly the reasoning `chrome.ts`'s own comment gives. */
422
- .cg-nav-toggle {
423
- display: none;
376
+ .cd-search {
424
377
  position: relative;
425
- margin-inline-start: var(--cg-s2);
426
- }
427
-
428
- .cg-nav-toggle__button {
429
- display: flex;
430
- align-items: center;
431
- justify-content: center;
432
- padding: var(--cg-s2);
433
- border-radius: var(--cg-radius-md);
434
- cursor: pointer;
435
- list-style: none;
436
- color: var(--cg-ink);
437
- }
438
-
439
- .cg-nav-toggle__button::-webkit-details-marker {
440
- display: none;
441
- }
442
-
443
- .cg-nav-toggle__icon {
444
378
  display: block;
379
+ margin: 0;
445
380
  }
446
381
 
447
- .cg-nav-toggle__panel {
382
+ .cd-search__icon {
448
383
  position: absolute;
449
- inset-inline-end: 0;
450
- inset-block-start: calc(100% + var(--cg-s2));
451
- z-index: 10;
452
- display: flex;
453
- flex-direction: column;
454
- gap: var(--cg-s4);
455
- min-inline-size: 14rem;
456
- padding: var(--cg-s4);
457
- background: var(--cg-surface-raised);
458
- border-radius: var(--cg-radius-md);
459
- box-shadow: var(--cg-elevation-3);
460
- }
461
-
462
- .cg-nav-toggle__panel .cg-menu {
463
- flex-direction: column;
464
- align-items: flex-start;
465
- gap: var(--cg-s3);
466
- }
467
-
468
- .cg-nav-toggle__action {
469
- align-self: flex-start;
470
- }
471
-
472
- @media (max-width: 56rem) {
473
- .cg-site-header__nav {
474
- display: none;
475
- }
476
-
477
- /* Equal-specificity `.cg-action { display: inline-flex }` (Actions,
478
- below) is declared later in this file, so a bare `.cg-site-header__
479
- action` selector here would lose the cascade tie despite the narrower
480
- viewport matching — the desktop action stayed visible next to the
481
- hamburger's own copy, cramping the site name into wrapping onto the
482
- sticky header and overlapping the page content beneath it. Chaining the
483
- parent class raises specificity above `.cg-action`'s, independent of
484
- source order. */
485
- .cg-site-header__inner .cg-site-header__action {
486
- display: none;
487
- }
488
-
489
- .cg-nav-toggle {
490
- display: block;
491
- }
492
- }
493
-
494
- /* --------------------------------------------------------------------------
495
- Chrome — footer, a real multi-column layout
496
- -------------------------------------------------------------------------- */
497
-
498
- .cg-site-footer {
499
- padding: var(--cg-s16) var(--cg-gutter) var(--cg-s8);
500
- background: var(--cg-surface-sunken);
501
- color: var(--cg-ink-muted);
502
- border-block-start: 1px solid var(--cg-line-soft);
503
- font-size: var(--cg-text-sm);
504
- }
505
-
506
- .cg-site-footer__grid {
507
- display: grid;
508
- gap: var(--cg-gap-loose);
509
- grid-template-columns: 1fr;
510
- max-inline-size: var(--cg-page);
511
- margin-inline: auto;
512
- padding-block-end: var(--cg-s10);
513
- border-block-end: 1px solid var(--cg-line-soft);
514
- }
515
-
516
- @media (min-width: 48rem) {
517
- .cg-site-footer__grid {
518
- grid-template-columns: 1.2fr 1fr 1fr;
519
- align-items: start;
520
- }
384
+ inset-block-start: 50%;
385
+ inset-inline-start: var(--cd-s3);
386
+ inline-size: 1rem;
387
+ block-size: 1rem;
388
+ margin-block-start: -0.5rem;
389
+ color: var(--cd-ink-muted);
390
+ pointer-events: none;
521
391
  }
522
392
 
523
- .cg-site-footer__brand a {
524
- color: var(--cg-ink);
525
- font-weight: var(--cg-weight-bold);
526
- font-size: var(--cg-text-lg);
527
- letter-spacing: var(--cg-tracking-tight);
528
- text-decoration: none;
529
- }
530
-
531
- .cg-site-footer__tagline {
532
- margin: var(--cg-s2) 0 0;
533
- max-inline-size: 26rem;
534
- }
535
-
536
- .cg-site-footer__social {
537
- display: flex;
538
- flex-wrap: wrap;
539
- gap: var(--cg-s3);
540
- margin: var(--cg-s4) 0 0;
541
- padding: 0;
542
- list-style: none;
543
- }
544
-
545
- .cg-site-footer__social-item a {
546
- display: flex;
547
- align-items: center;
548
- justify-content: center;
549
- inline-size: 2.1rem;
550
- block-size: 2.1rem;
551
- border-radius: var(--cg-radius-md);
552
- color: var(--cg-ink-muted);
553
- background: var(--cg-surface);
554
- box-shadow: var(--cg-ring);
393
+ .cd-search__input {
394
+ inline-size: 100%;
395
+ min-block-size: 2.375rem;
396
+ padding: var(--cd-s2) var(--cd-s3) var(--cd-s2) calc(var(--cd-s3) + 1.5rem);
397
+ border: var(--cd-rule) solid var(--cd-line);
398
+ border-radius: var(--cd-radius-control);
399
+ background: var(--cd-surface);
400
+ color: var(--cd-ink);
401
+ font-family: var(--cd-font-sans);
402
+ font-size: var(--cd-text-ui);
403
+ line-height: var(--cd-leading-ui);
404
+ appearance: none;
555
405
  transition:
556
- color var(--cg-duration-fast) var(--cg-ease),
557
- background-color var(--cg-duration-fast) var(--cg-ease);
558
- }
559
-
560
- .cg-site-footer__social-item a:hover,
561
- .cg-site-footer__social-item a:focus-visible {
562
- color: var(--cg-accent-fg);
563
- background: var(--cg-accent);
564
- }
565
-
566
- .cg-social__icon {
567
- inline-size: 1.05rem;
568
- block-size: 1.05rem;
569
- }
570
-
571
- .cg-site-footer__nav-col .cg-menu {
572
- flex-direction: column;
573
- align-items: flex-start;
574
- gap: var(--cg-s3);
575
- }
576
-
577
- .cg-site-footer__note {
578
- margin: 0 0 var(--cg-s5);
579
- max-inline-size: 24rem;
406
+ border-color var(--cd-duration) var(--cd-ease),
407
+ background-color var(--cd-duration) var(--cd-ease);
580
408
  }
581
409
 
582
- .cg-site-footer__branding {
583
- display: flex;
584
- align-items: center;
585
- }
586
-
587
- .cg-site-footer__branding a {
588
- display: flex;
589
- align-items: center;
590
- gap: 0.4em;
591
- opacity: 0.75;
592
- transition: opacity var(--cg-duration) var(--cg-ease);
593
- }
594
-
595
- .cg-site-footer__branding a:hover,
596
- .cg-site-footer__branding a:focus-visible {
410
+ .cd-search__input::placeholder {
411
+ color: var(--cd-ink-muted);
597
412
  opacity: 1;
598
413
  }
599
414
 
600
- .cg-site-footer__brand-logo {
601
- display: block;
602
- block-size: 25px;
603
- inline-size: auto;
415
+ .cd-search__input:hover {
416
+ border-color: var(--cd-line-strong);
604
417
  }
605
418
 
606
- .cg-site-footer__version {
607
- font-variant-numeric: tabular-nums;
608
- font-size: 0.9em;
419
+ .cd-search__input:focus-visible {
420
+ border-color: var(--cd-accent);
421
+ outline: var(--cd-rule) solid var(--cd-accent);
422
+ outline-offset: 0;
423
+ background-color: var(--cd-canvas);
609
424
  }
610
425
 
611
- .cg-site-footer__bottom {
612
- max-inline-size: var(--cg-page);
613
- margin-inline: auto;
614
- padding-block-start: var(--cg-s6);
615
- font-size: var(--cg-text-xs);
616
- letter-spacing: var(--cg-tracking-wide);
617
- text-transform: uppercase;
618
- color: var(--cg-ink-subtle);
426
+ .cd-search--large .cd-search__icon {
427
+ inset-inline-start: var(--cd-s4);
428
+ inline-size: 1.25rem;
429
+ block-size: 1.25rem;
430
+ margin-block-start: -0.625rem;
619
431
  }
620
432
 
621
- .cg-visually-hidden {
622
- position: absolute;
623
- inline-size: 1px;
624
- block-size: 1px;
625
- padding: 0;
626
- margin: -1px;
627
- overflow: hidden;
628
- clip: rect(0, 0, 0, 0);
629
- white-space: nowrap;
630
- border: 0;
433
+ .cd-search--large .cd-search__input {
434
+ min-block-size: 3.25rem;
435
+ padding-inline: calc(var(--cd-s4) + 2rem) var(--cd-s4);
436
+ border-color: var(--cd-line-strong);
437
+ background: var(--cd-canvas);
438
+ font-size: var(--cd-text-md);
631
439
  }
632
440
 
633
441
  /* --------------------------------------------------------------------------
634
- The doc page — two columns, CSS-only
442
+ Search results, forms and comments: the utility pages the host renders, in
443
+ the same register. The host sets them in a bare `<main class="cg-main">`.
635
444
  -------------------------------------------------------------------------- */
636
445
 
637
- .cg-docs {
638
- display: block;
639
- max-inline-size: var(--cg-page);
640
- margin-inline: auto;
641
- padding-inline: var(--cg-gutter);
642
- padding-block: var(--cg-s8) var(--cg-section-y);
643
- }
644
-
645
- @media (min-width: 64rem) {
646
- .cg-docs {
647
- display: grid;
648
- grid-template-columns: var(--cg-sidebar-width) 1fr;
649
- gap: var(--cg-s10);
650
- align-items: start;
651
- }
652
- }
653
-
654
- /* The sidebar, in two copies (`render-block.ts`'s `renderSidebar`/
655
- `renderSidebarMobile`) — not one `<details>` toggled by breakpoint.
656
- Chrome (and every engine following the current HTML rendering rules)
657
- hides a closed `<details>`'s non-summary content through its own internal
658
- `::details-content` box, not through plain CSS `display: none`; a
659
- stylesheet rule forcing that content's `display: block` back on does not
660
- reliably win against the closed state, verified live (an earlier build
661
- with a single shared `<details>` rendered an empty sidebar column at
662
- 1280px in a real Chrome tab). So `.cg-docs__nav-desktop` is a plain
663
- `<div>` — nothing for the browser to collapse — shown only at the
664
- two-column breakpoint, and `.cg-docs__nav-mobile` is a **separate**
665
- `<details>` disclosure, shown only below it. Exactly one of the two is
666
- ever `display: block` at a given width, so a screen reader is never
667
- offered two "Documentation" navigations at once. */
668
- .cg-docs__nav {
669
- margin: 0 0 var(--cg-s6);
670
- }
671
-
672
- .cg-docs__nav-desktop {
673
- display: none;
674
- }
675
-
676
- .cg-docs__nav-toggle {
677
- display: flex;
678
- align-items: center;
679
- justify-content: space-between;
680
- padding: var(--cg-s3) var(--cg-s4);
681
- border-radius: var(--cg-radius-md);
682
- box-shadow: var(--cg-ring);
683
- cursor: pointer;
684
- font-weight: var(--cg-weight-semibold);
685
- list-style: none;
686
- }
687
-
688
- .cg-docs__nav-toggle::-webkit-details-marker {
689
- display: none;
690
- }
691
-
692
- .cg-docs__nav-toggle::after {
693
- content: "";
694
- inline-size: 0.5rem;
695
- block-size: 0.5rem;
696
- border-inline-end: 2px solid currentColor;
697
- border-block-end: 2px solid currentColor;
698
- transform: rotate(45deg);
699
- transition: transform var(--cg-duration) var(--cg-ease);
700
- }
701
-
702
- .cg-docs__nav-mobile[open] .cg-docs__nav-toggle::after {
703
- transform: rotate(225deg);
704
- }
705
-
706
- .cg-docs__nav-panel {
707
- padding-block-start: var(--cg-s3);
708
- }
709
-
710
- @media (min-width: 64rem) {
711
- .cg-docs__nav-mobile {
712
- display: none;
713
- }
714
-
715
- .cg-docs__nav-desktop {
716
- display: block;
717
- position: sticky;
718
- inset-block-start: calc(var(--cg-header-height) + var(--cg-s6));
719
- max-block-size: calc(100vh - var(--cg-header-height) - var(--cg-s10));
720
- overflow-y: auto;
721
- }
722
-
723
- .cg-docs__nav-desktop .cg-docs__nav-panel {
724
- padding-block-start: 0;
725
- }
726
- }
727
-
728
- .cg-docs__nav-group {
729
- margin: 0 0 var(--cg-s6);
730
- }
731
-
732
- .cg-docs__nav-heading {
733
- margin: 0 0 var(--cg-s2);
734
- font-size: var(--cg-text-xs);
735
- font-weight: var(--cg-weight-bold);
736
- letter-spacing: var(--cg-tracking-wide);
737
- text-transform: uppercase;
738
- color: var(--cg-ink-subtle);
739
- }
740
-
741
- .cg-docs__nav-items {
742
- margin: 0;
743
- padding: 0;
744
- list-style: none;
745
- border-inline-start: 1px solid var(--cg-line-soft);
746
- }
747
-
748
- .cg-docs__nav-link {
749
- display: block;
750
- padding: var(--cg-s1) var(--cg-s3);
751
- margin-inline-start: -1px;
752
- border-inline-start: 2px solid transparent;
753
- font-size: var(--cg-text-sm);
754
- color: var(--cg-ink-muted);
755
- text-decoration: none;
756
- }
757
-
758
- .cg-docs__nav-link:hover {
759
- color: var(--cg-ink);
760
- }
761
-
762
- .cg-docs__nav-link[aria-current="page"] {
763
- border-inline-start-color: var(--cg-accent);
764
- color: var(--cg-accent);
765
- font-weight: var(--cg-weight-semibold);
766
- }
767
-
768
- .cg-docs__content {
769
- max-inline-size: var(--cg-measure);
770
- min-inline-size: 0;
771
- }
772
-
773
- .cg-docs__content > .cg-block,
774
- .cg-docs__content > .cg-entry-header {
775
- max-inline-size: none;
446
+ /* Left-aligned on the page edge the wordmark starts from, like every other
447
+ page of the site, and held to a reading width. */
448
+ :is(.cg-main, .cg-sidebar-layout__content) > .cg-page__title,
449
+ .cg-search__form,
450
+ .cg-search__results,
451
+ .cg-search__empty,
452
+ .cg-search__error,
453
+ .cg-form,
454
+ .cg-form__confirmation {
455
+ --cd-edge: max(var(--cd-gutter), calc((100% - var(--cd-page)) / 2));
456
+ inline-size: 100%;
776
457
  margin-inline: 0;
777
- padding-inline: 0;
778
- }
779
-
780
- .cg-docs__content > .cg-block:first-child {
781
- margin-block-start: 0;
458
+ padding-inline: var(--cd-edge) max(var(--cd-gutter), calc(100% - var(--cd-edge) - 52rem));
782
459
  }
783
460
 
784
- .cg-docs__breadcrumb {
785
- margin: 0 0 var(--cg-s4);
786
- font-size: var(--cg-text-sm);
787
- color: var(--cg-ink-muted);
788
- }
789
-
790
- .cg-docs__breadcrumb ol {
791
- display: flex;
792
- flex-wrap: wrap;
793
- gap: var(--cg-s2);
794
- margin: 0;
795
- padding: 0;
796
- list-style: none;
797
- }
798
-
799
- .cg-docs__breadcrumb li:not(:last-child)::after {
800
- content: "›";
801
- margin-inline-start: var(--cg-s2);
802
- color: var(--cg-line-strong);
803
- }
804
-
805
- .cg-docs__breadcrumb li[aria-current="page"] {
806
- color: var(--cg-ink);
807
- font-weight: var(--cg-weight-medium);
808
- }
809
-
810
- .cg-docs__title {
811
- margin: 0 0 var(--cg-s6);
812
- font-size: var(--cg-text-3xl);
813
- line-height: var(--cg-leading-tight);
814
- letter-spacing: var(--cg-tracking-tight);
815
- font-weight: var(--cg-weight-bold);
816
- text-wrap: balance;
461
+ :is(.cg-main, .cg-sidebar-layout__content) > .cg-page__title {
462
+ padding-block: calc(var(--cd-section) * 0.5) var(--cd-s6);
463
+ font-size: var(--cd-size-title);
464
+ line-height: var(--cd-leading-display);
465
+ letter-spacing: var(--cd-tracking-display);
817
466
  }
818
467
 
819
- /* --------------------------------------------------------------------------
820
- Actions — the theme's only control
821
- -------------------------------------------------------------------------- */
822
-
823
- .cg-actions {
468
+ .cg-search__form {
824
469
  display: flex;
825
470
  flex-wrap: wrap;
826
- gap: var(--cg-s3);
827
- margin: var(--cg-s6) 0 0;
828
- padding: 0;
829
- list-style: none;
830
- }
831
-
832
- .cg-action {
833
- display: inline-flex;
834
- align-items: center;
835
- justify-content: center;
836
- gap: var(--cg-s2);
837
- padding: var(--cg-s3) var(--cg-s5);
838
- border: 0;
839
- border-radius: var(--cg-radius-md);
840
- font-size: var(--cg-text-sm);
841
- font-weight: var(--cg-weight-semibold);
842
- letter-spacing: var(--cg-tracking-snug);
843
- line-height: var(--cg-leading-snug);
844
- text-decoration: none;
845
- white-space: nowrap;
846
- transition:
847
- background-color var(--cg-duration) var(--cg-ease),
848
- color var(--cg-duration) var(--cg-ease),
849
- box-shadow var(--cg-duration) var(--cg-ease),
850
- transform var(--cg-duration-fast) var(--cg-ease);
851
- }
852
-
853
- .cg-action[data-emphasis="primary"] {
854
- background: var(--cg-accent);
855
- color: var(--cg-accent-fg);
856
- box-shadow: var(--cg-elevation-1);
857
- }
858
-
859
- .cg-action[data-emphasis="primary"]:hover {
860
- background: var(--cg-accent-hover);
861
- box-shadow: var(--cg-elevation-2);
862
- transform: translateY(-1px);
863
- }
864
-
865
- .cg-action[data-emphasis="secondary"] {
866
- background: var(--cg-surface);
867
- color: var(--cg-ink);
868
- box-shadow: var(--cg-ring);
471
+ align-items: end;
472
+ gap: var(--cd-s3);
473
+ margin-block: 0 var(--cd-s10);
869
474
  }
870
475
 
871
- .cg-action[data-emphasis="secondary"]:hover {
872
- background: var(--cg-accent-soft);
873
- color: var(--cg-accent-soft-fg);
874
- box-shadow: var(--cg-ring-accent);
476
+ .cg-search__form label,
477
+ .cg-form__field label,
478
+ .cg-comment__form label {
479
+ display: block;
480
+ margin-block-end: var(--cd-s2);
481
+ color: var(--cd-ink);
482
+ font-size: var(--cd-text-ui);
483
+ font-weight: var(--cd-weight-medium);
875
484
  }
876
485
 
877
- .cg-action:active {
878
- transform: translateY(0);
879
- box-shadow: var(--cg-elevation-1);
486
+ .cg-search__form label {
487
+ flex-basis: 100%;
488
+ margin: 0;
880
489
  }
881
490
 
882
- /* --------------------------------------------------------------------------
883
- Shared block furniture
884
- -------------------------------------------------------------------------- */
885
-
886
- .cg-features__title,
887
- .cg-cta__title,
888
- .cg-faq__title,
889
- .cg-panels__title,
890
- .cg-stats__title,
891
- .cg-kpis__title,
892
- .cg-logos__title,
893
- .cg-list__title-heading,
894
- .cg-pricing__title {
895
- margin: 0 0 var(--cg-s8);
896
- font-size: var(--cg-text-xl);
897
- line-height: var(--cg-leading-snug);
898
- letter-spacing: var(--cg-tracking-tight);
899
- font-weight: var(--cg-weight-bold);
900
- text-wrap: balance;
491
+ .cg-search__form input[type="search"] {
492
+ flex: 1 1 18rem;
901
493
  }
902
494
 
903
- .cg-features__items,
904
- .cg-logos__items,
905
- .cg-gallery__items,
906
- .cg-list__items,
907
- .cg-faq__items,
908
- .cg-panels__items,
909
- .cg-pricing__tiers {
910
- margin: 0;
911
- padding: 0;
495
+ .cg-search__results {
496
+ display: grid;
497
+ margin-block: 0 var(--cd-section);
912
498
  list-style: none;
499
+ counter-reset: cd-result;
913
500
  }
914
501
 
915
- .cg-gallery__viewport,
916
- .cg-list__viewport {
917
- overflow-x: auto;
918
- scroll-snap-type: x mandatory;
919
- scroll-behavior: smooth;
920
- overscroll-behavior-inline: contain;
921
- scrollbar-width: thin;
922
- scrollbar-color: var(--cg-line-strong) transparent;
923
- padding-block: var(--cg-s2);
924
- margin-block: calc(var(--cg-s2) * -1);
502
+ .cg-search__results > li {
503
+ padding-block: var(--cd-s4);
504
+ border-block-start: var(--cd-rule) solid var(--cd-line);
505
+ font-size: var(--cd-text-lg);
506
+ font-weight: var(--cd-weight-medium);
925
507
  }
926
508
 
927
- /* --------------------------------------------------------------------------
928
- Search, forms, comments — public utility pages and post-content furniture
929
- -------------------------------------------------------------------------- */
930
-
931
- .cg-search__form,
932
- .cg-search__results,
933
- .cg-search__empty,
934
- .cg-search__error,
935
- .cg-form,
936
- .cg-form__confirmation,
937
- .cg-comments {
938
- max-inline-size: var(--cg-page);
939
- margin-inline: auto;
940
- padding-inline: var(--cg-gutter);
509
+ .cg-search__results > li:last-child {
510
+ border-block-end: var(--cd-rule) solid var(--cd-line);
941
511
  }
942
512
 
943
- .cg-search__form {
944
- display: flex;
945
- flex-wrap: wrap;
946
- align-items: end;
947
- gap: var(--cg-s3);
948
- margin-block-end: var(--cg-s8);
513
+ /* The summary under a result and the count beside the title: the host's
514
+ floor reads the raw skin grey, which is too faint on the dark ground, so
515
+ both take this theme's own muted ink. */
516
+ .cg-search__count {
517
+ color: var(--cd-ink-muted);
949
518
  }
950
519
 
951
- .cg-search__form label {
952
- display: block;
953
- font-size: var(--cg-text-sm);
954
- font-weight: var(--cg-weight-semibold);
955
- margin-block-end: var(--cg-s2);
520
+ .cg-search__excerpt {
521
+ color: var(--cd-ink-muted);
522
+ font-size: var(--cd-text-ui);
523
+ font-weight: var(--cd-weight-regular);
524
+ line-height: var(--cd-leading-ui);
956
525
  }
957
526
 
958
- .cg-search__form input[type="search"] {
959
- flex: 1 1 16rem;
527
+ .cg-search__results a {
528
+ text-decoration-color: var(--cd-line-strong);
960
529
  }
961
530
 
962
- .cg-search__results {
963
- margin: 0 auto;
964
- padding-inline-start: var(--cg-gutter);
965
- display: grid;
966
- gap: var(--cg-s4);
967
- font-size: var(--cg-text-lg);
531
+ .cg-search__results a:hover {
532
+ text-decoration-color: currentColor;
968
533
  }
969
534
 
970
535
  .cg-search__empty,
971
536
  .cg-comments__empty,
972
- .cg-comments__closed {
973
- color: var(--cg-ink-muted);
537
+ .cg-comments__closed,
538
+ .cg-form__help {
539
+ color: var(--cd-ink-muted);
974
540
  }
975
541
 
976
542
  .cg-search__error,
977
543
  .cg-form__error,
978
544
  .cg-form__field-error {
979
- color: var(--cg-ink);
980
- font-weight: var(--cg-weight-bold);
545
+ color: var(--cd-ink);
546
+ font-weight: var(--cd-weight-semibold);
981
547
  }
982
548
 
983
549
  .cg-search__form input,
@@ -987,66 +553,79 @@ kbd {
987
553
  .cg-comment__form input,
988
554
  .cg-comment__form textarea {
989
555
  inline-size: 100%;
990
- padding: var(--cg-s3) var(--cg-s4);
991
- border: 1px solid var(--cg-line);
992
- border-radius: var(--cg-radius-md);
993
- background: var(--cg-surface);
994
- color: var(--cg-ink);
995
- font: inherit;
556
+ min-block-size: 44px;
557
+ padding: var(--cd-s2) var(--cd-s3);
558
+ border: var(--cd-rule) solid var(--cd-line-strong);
559
+ border-radius: var(--cd-radius-control);
560
+ background: var(--cd-canvas);
561
+ color: var(--cd-ink);
562
+ font-family: var(--cd-font-sans);
563
+ font-size: var(--cd-text-md);
564
+ line-height: var(--cd-leading-ui);
565
+ transition: border-color var(--cd-duration) var(--cd-ease);
566
+ }
567
+
568
+ .cg-form__field textarea,
569
+ .cg-comment__form textarea {
570
+ resize: vertical;
571
+ }
572
+
573
+ .cg-search__form input:focus-visible,
574
+ .cg-form__field :is(input, select, textarea):focus-visible,
575
+ .cg-comment__form :is(input, textarea):focus-visible {
576
+ border-color: var(--cd-accent);
577
+ outline: var(--cd-rule) solid var(--cd-accent);
578
+ outline-offset: 0;
996
579
  }
997
580
 
998
581
  .cg-form__field input[aria-invalid="true"],
999
582
  .cg-form__field select[aria-invalid="true"],
1000
583
  .cg-form__field textarea[aria-invalid="true"] {
1001
- border-width: 2px;
1002
- border-color: var(--cg-line-strong);
584
+ border-color: var(--cd-ink);
585
+ border-width: var(--cd-rule-strong);
1003
586
  }
1004
587
 
1005
588
  .cg-search__form button,
1006
589
  .cg-form button[type="submit"],
1007
590
  .cg-comment__form button[type="submit"] {
1008
- padding: var(--cg-s3) var(--cg-s6);
1009
- border: 0;
1010
- border-radius: var(--cg-radius-md);
1011
- background: var(--cg-accent);
1012
- color: var(--cg-accent-fg);
1013
- font-weight: var(--cg-weight-semibold);
591
+ min-block-size: 44px;
592
+ padding: var(--cd-s3) var(--cd-s5);
593
+ border: var(--cd-rule) solid var(--cd-accent);
594
+ border-radius: var(--cd-radius-control);
595
+ background: var(--cd-accent);
596
+ color: var(--cd-accent-fg);
597
+ font-family: var(--cd-font-sans);
598
+ font-size: var(--cd-text-ui);
599
+ font-weight: var(--cd-weight-medium);
1014
600
  cursor: pointer;
1015
- transition: background-color var(--cg-duration) var(--cg-ease);
601
+ transition:
602
+ background-color var(--cd-duration) var(--cd-ease),
603
+ border-color var(--cd-duration) var(--cd-ease);
1016
604
  }
1017
605
 
1018
606
  .cg-search__form button:hover,
1019
607
  .cg-form button[type="submit"]:hover,
1020
608
  .cg-comment__form button[type="submit"]:hover {
1021
- background: var(--cg-accent-hover);
1022
- }
1023
-
1024
- .cg-form__field,
1025
- .cg-comment__form p {
1026
- display: block;
1027
- margin-block-end: var(--cg-s5);
609
+ border-color: var(--cd-accent-hover);
610
+ background: var(--cd-accent-hover);
1028
611
  }
1029
612
 
1030
- .cg-form__field label,
1031
- .cg-comment__form label {
613
+ .cg-form__field {
1032
614
  display: block;
1033
- font-size: var(--cg-text-sm);
1034
- font-weight: var(--cg-weight-semibold);
1035
- margin-block-end: var(--cg-s2);
615
+ margin-block-end: var(--cd-s6);
1036
616
  }
1037
617
 
1038
618
  .cg-form__help {
1039
- margin: var(--cg-s2) 0 0;
1040
- font-size: var(--cg-text-sm);
1041
- color: var(--cg-ink-muted);
619
+ margin: var(--cd-s2) 0 0;
620
+ font-size: var(--cd-text-label);
1042
621
  }
1043
622
 
1044
623
  .cg-form__choice {
1045
624
  display: inline-flex;
1046
625
  align-items: center;
1047
- gap: var(--cg-s2);
1048
- margin-inline-end: var(--cg-s4);
1049
- font-weight: normal;
626
+ gap: var(--cd-s2);
627
+ margin-inline-end: var(--cd-s4);
628
+ font-weight: var(--cd-weight-regular);
1050
629
  }
1051
630
 
1052
631
  .cg-form__honeypot,
@@ -1058,11 +637,18 @@ kbd {
1058
637
  inset-inline-start: -9999px;
1059
638
  }
1060
639
 
640
+ /* Comments, when a site turns them on, sit on the reading column. */
1061
641
  .cg-comments {
1062
- margin-block-start: var(--cg-section-y);
1063
- padding-block-start: var(--cg-s8);
1064
- padding-block-end: var(--cg-section-y);
1065
- border-block-start: 1px solid var(--cg-line-soft);
642
+ max-inline-size: calc(52rem + var(--cd-gutter) * 2);
643
+ margin: 0 auto var(--cd-section);
644
+ padding: 0 var(--cd-gutter);
645
+ }
646
+
647
+ .cg-comments > h2 {
648
+ padding-block-start: var(--cd-s5);
649
+ border-block-start: var(--cd-rule) solid var(--cd-line);
650
+ margin-block-end: var(--cd-s5);
651
+ font-size: var(--cd-text-xl);
1066
652
  }
1067
653
 
1068
654
  .cg-comments__list,
@@ -1073,34 +659,48 @@ kbd {
1073
659
  }
1074
660
 
1075
661
  .cg-comment {
1076
- padding-block: var(--cg-s5);
1077
- border-block-end: 1px solid var(--cg-line-soft);
662
+ padding-block: var(--cd-s5);
663
+ border-block-start: var(--cd-rule) solid var(--cd-line);
1078
664
  }
1079
665
 
1080
666
  .cg-comment__replies {
1081
- padding-block-start: var(--cg-s5);
1082
- }
1083
-
1084
- .cg-comment__replies .cg-comment {
1085
- padding-inline-start: var(--cg-s6);
1086
- border-inline-start: 2px solid var(--cg-line-soft);
1087
- border-block-end: 0;
667
+ margin-block-start: var(--cd-s4);
668
+ padding-inline-start: var(--cd-s6);
669
+ border-inline-start: var(--cd-rule) solid var(--cd-line);
1088
670
  }
1089
671
 
1090
672
  .cg-comment__meta {
1091
673
  display: flex;
1092
- gap: var(--cg-s3);
1093
- align-items: baseline;
1094
- font-size: var(--cg-text-sm);
1095
- color: var(--cg-ink-muted);
1096
- margin-block-end: var(--cg-s2);
674
+ flex-wrap: wrap;
675
+ gap: var(--cd-s1) var(--cd-s3);
676
+ margin: 0 0 var(--cd-s2);
677
+ font-size: var(--cd-text-label);
1097
678
  }
1098
679
 
1099
680
  .cg-comment__author {
1100
- font-weight: var(--cg-weight-semibold);
1101
- color: var(--cg-ink);
681
+ color: var(--cd-ink);
682
+ font-weight: var(--cd-weight-semibold);
1102
683
  }
1103
684
 
1104
- .cg-comment__body {
685
+ .cg-comment__date {
686
+ color: var(--cd-ink-muted);
687
+ font-variant-numeric: tabular-nums;
688
+ }
689
+
690
+ .cg-comment__body p {
1105
691
  margin: 0;
1106
692
  }
693
+
694
+ .cg-comment__form {
695
+ display: grid;
696
+ gap: var(--cd-s3);
697
+ margin-block-start: var(--cd-s6);
698
+ }
699
+
700
+ .cg-comment__form > * {
701
+ margin: 0;
702
+ }
703
+
704
+ .cg-comment__form button[type="submit"] {
705
+ justify-self: start;
706
+ }