@cogenta/theme-docs 0.3.2

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 (117) hide show
  1. package/LICENSE +373 -0
  2. package/dist/src/index.d.ts +21 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +21 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/render/blocks/accordion.d.ts +4 -0
  7. package/dist/src/render/blocks/accordion.d.ts.map +1 -0
  8. package/dist/src/render/blocks/accordion.js +15 -0
  9. package/dist/src/render/blocks/accordion.js.map +1 -0
  10. package/dist/src/render/blocks/collection-list.d.ts +14 -0
  11. package/dist/src/render/blocks/collection-list.d.ts.map +1 -0
  12. package/dist/src/render/blocks/collection-list.js +77 -0
  13. package/dist/src/render/blocks/collection-list.js.map +1 -0
  14. package/dist/src/render/blocks/cta.d.ts +4 -0
  15. package/dist/src/render/blocks/cta.d.ts.map +1 -0
  16. package/dist/src/render/blocks/cta.js +7 -0
  17. package/dist/src/render/blocks/cta.js.map +1 -0
  18. package/dist/src/render/blocks/embed.d.ts +4 -0
  19. package/dist/src/render/blocks/embed.d.ts.map +1 -0
  20. package/dist/src/render/blocks/embed.js +71 -0
  21. package/dist/src/render/blocks/embed.js.map +1 -0
  22. package/dist/src/render/blocks/faq.d.ts +4 -0
  23. package/dist/src/render/blocks/faq.d.ts.map +1 -0
  24. package/dist/src/render/blocks/faq.js +15 -0
  25. package/dist/src/render/blocks/faq.js.map +1 -0
  26. package/dist/src/render/blocks/feature-grid.d.ts +4 -0
  27. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -0
  28. package/dist/src/render/blocks/feature-grid.js +27 -0
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -0
  30. package/dist/src/render/blocks/gallery.d.ts +10 -0
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -0
  32. package/dist/src/render/blocks/gallery.js +19 -0
  33. package/dist/src/render/blocks/gallery.js.map +1 -0
  34. package/dist/src/render/blocks/hero.d.ts +16 -0
  35. package/dist/src/render/blocks/hero.d.ts.map +1 -0
  36. package/dist/src/render/blocks/hero.js +28 -0
  37. package/dist/src/render/blocks/hero.js.map +1 -0
  38. package/dist/src/render/blocks/logo-strip.d.ts +4 -0
  39. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -0
  40. package/dist/src/render/blocks/logo-strip.js +16 -0
  41. package/dist/src/render/blocks/logo-strip.js.map +1 -0
  42. package/dist/src/render/blocks/logos.d.ts +4 -0
  43. package/dist/src/render/blocks/logos.d.ts.map +1 -0
  44. package/dist/src/render/blocks/logos.js +22 -0
  45. package/dist/src/render/blocks/logos.js.map +1 -0
  46. package/dist/src/render/blocks/media-figure.d.ts +10 -0
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -0
  48. package/dist/src/render/blocks/media-figure.js +25 -0
  49. package/dist/src/render/blocks/media-figure.js.map +1 -0
  50. package/dist/src/render/blocks/pricing-table.d.ts +4 -0
  51. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -0
  52. package/dist/src/render/blocks/pricing-table.js +28 -0
  53. package/dist/src/render/blocks/pricing-table.js.map +1 -0
  54. package/dist/src/render/blocks/prose.d.ts +4 -0
  55. package/dist/src/render/blocks/prose.d.ts.map +1 -0
  56. package/dist/src/render/blocks/prose.js +36 -0
  57. package/dist/src/render/blocks/prose.js.map +1 -0
  58. package/dist/src/render/blocks/quote.d.ts +9 -0
  59. package/dist/src/render/blocks/quote.d.ts.map +1 -0
  60. package/dist/src/render/blocks/quote.js +22 -0
  61. package/dist/src/render/blocks/quote.js.map +1 -0
  62. package/dist/src/render/blocks/stat-counter.d.ts +4 -0
  63. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -0
  64. package/dist/src/render/blocks/stat-counter.js +15 -0
  65. package/dist/src/render/blocks/stat-counter.js.map +1 -0
  66. package/dist/src/render/blocks/stats.d.ts +4 -0
  67. package/dist/src/render/blocks/stats.d.ts.map +1 -0
  68. package/dist/src/render/blocks/stats.js +11 -0
  69. package/dist/src/render/blocks/stats.js.map +1 -0
  70. package/dist/src/render/blocks/testimonial.d.ts +11 -0
  71. package/dist/src/render/blocks/testimonial.d.ts.map +1 -0
  72. package/dist/src/render/blocks/testimonial.js +20 -0
  73. package/dist/src/render/blocks/testimonial.js.map +1 -0
  74. package/dist/src/render/chrome.d.ts +3 -0
  75. package/dist/src/render/chrome.d.ts.map +1 -0
  76. package/dist/src/render/chrome.js +94 -0
  77. package/dist/src/render/chrome.js.map +1 -0
  78. package/dist/src/render/render-block.d.ts +15 -0
  79. package/dist/src/render/render-block.d.ts.map +1 -0
  80. package/dist/src/render/render-block.js +176 -0
  81. package/dist/src/render/render-block.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +10 -0
  83. package/dist/src/render/term-archive.d.ts.map +1 -0
  84. package/dist/src/render/term-archive.js +32 -0
  85. package/dist/src/render/term-archive.js.map +1 -0
  86. package/dist/theme.config.d.ts +16 -0
  87. package/dist/theme.config.d.ts.map +1 -0
  88. package/dist/theme.config.js +46 -0
  89. package/dist/theme.config.js.map +1 -0
  90. package/package.json +57 -0
  91. package/src/index.ts +20 -0
  92. package/src/render/blocks/accordion.ts +51 -0
  93. package/src/render/blocks/collection-list.ts +170 -0
  94. package/src/render/blocks/cta.ts +25 -0
  95. package/src/render/blocks/embed.ts +94 -0
  96. package/src/render/blocks/faq.ts +46 -0
  97. package/src/render/blocks/feature-grid.ts +67 -0
  98. package/src/render/blocks/gallery.ts +39 -0
  99. package/src/render/blocks/hero.ts +61 -0
  100. package/src/render/blocks/logo-strip.ts +31 -0
  101. package/src/render/blocks/logos.ts +52 -0
  102. package/src/render/blocks/media-figure.ts +36 -0
  103. package/src/render/blocks/pricing-table.ts +72 -0
  104. package/src/render/blocks/prose.ts +49 -0
  105. package/src/render/blocks/quote.ts +35 -0
  106. package/src/render/blocks/stat-counter.ts +37 -0
  107. package/src/render/blocks/stats.ts +38 -0
  108. package/src/render/blocks/testimonial.ts +36 -0
  109. package/src/render/chrome.ts +124 -0
  110. package/src/render/render-block.ts +305 -0
  111. package/src/render/term-archive.ts +78 -0
  112. package/src/styles/archive.css +39 -0
  113. package/src/styles/base.css +1106 -0
  114. package/src/styles/blocks.css +1238 -0
  115. package/src/styles/theme.css +34 -0
  116. package/src/styles/tokens.css +307 -0
  117. package/tokens.json +36 -0
@@ -0,0 +1,1106 @@
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.
6
+ */
7
+
8
+ /* --------------------------------------------------------------------------
9
+ Document
10
+ -------------------------------------------------------------------------- */
11
+
12
+ *,
13
+ *::before,
14
+ *::after {
15
+ box-sizing: border-box;
16
+ }
17
+
18
+ body {
19
+ 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);
25
+ 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%;
30
+ }
31
+
32
+ ::selection {
33
+ background: var(--cg-accent-soft);
34
+ color: var(--cg-accent-soft-fg);
35
+ }
36
+
37
+ img,
38
+ video,
39
+ iframe {
40
+ max-width: 100%;
41
+ height: auto;
42
+ }
43
+
44
+ img {
45
+ display: block;
46
+ object-fit: cover;
47
+ }
48
+
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
+ }
56
+
57
+ :where(a:hover) {
58
+ color: var(--cg-accent-hover);
59
+ text-decoration-color: currentColor;
60
+ }
61
+
62
+ :where(hr) {
63
+ block-size: 1px;
64
+ border: 0;
65
+ margin-block: var(--cg-s10);
66
+ background: var(--cg-line);
67
+ }
68
+
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);
78
+ }
79
+
80
+ /* --------------------------------------------------------------------------
81
+ Focus, targets, motion
82
+ -------------------------------------------------------------------------- */
83
+
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);
88
+ }
89
+
90
+ :where(.cg-action, .cg-faq__question, .cg-panels__question, .cg-nav-toggle__button) {
91
+ 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
+ }
116
+
117
+ @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;
125
+ }
126
+ }
127
+
128
+ .cg-skip-link {
129
+ 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);
139
+ text-decoration: none;
140
+ transition: inset-block-start var(--cg-duration) var(--cg-ease);
141
+ }
142
+
143
+ .cg-skip-link:focus-visible {
144
+ inset-block-start: var(--cg-s3);
145
+ }
146
+
147
+ /* --------------------------------------------------------------------------
148
+ Page frame
149
+ -------------------------------------------------------------------------- */
150
+
151
+ .cg-main {
152
+ display: flow-root;
153
+ }
154
+
155
+ .cg-block {
156
+ max-inline-size: var(--cg-page);
157
+ margin-inline: auto;
158
+ margin-block: var(--cg-section-y);
159
+ padding-inline: var(--cg-gutter);
160
+ }
161
+
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);
170
+ }
171
+
172
+ [data-block][data-variant-background="image"] {
173
+ background: var(--cg-surface-tinted);
174
+ }
175
+
176
+ [data-block][data-variant-spacing="compact"] {
177
+ margin-block: calc(var(--cg-section-y) / 2);
178
+ }
179
+
180
+ [data-block][data-variant-spacing="spacious"] {
181
+ margin-block: calc(var(--cg-section-y) * 1.6);
182
+ }
183
+
184
+ [data-block][data-variant-align="start"] {
185
+ text-align: start;
186
+ }
187
+
188
+ [data-block][data-variant-align="center"] {
189
+ text-align: center;
190
+ }
191
+
192
+ [data-block][data-variant-align="end"] {
193
+ text-align: end;
194
+ }
195
+
196
+ [data-block][data-variant-width="full"] {
197
+ max-inline-size: none;
198
+ padding-inline: 0;
199
+ }
200
+
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;
211
+ }
212
+
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
+ }
220
+
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);
233
+ }
234
+
235
+ .cg-entry-header__terms a {
236
+ color: inherit;
237
+ text-decoration: none;
238
+ }
239
+
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);
244
+ }
245
+
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;
253
+ }
254
+
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;
260
+ }
261
+
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);
269
+ }
270
+
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
+ }
276
+
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;
283
+ }
284
+
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);
303
+ }
304
+
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;
312
+ }
313
+
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);
325
+ }
326
+
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;
333
+ }
334
+
335
+ .cg-site-header__nav {
336
+ margin-inline-end: auto;
337
+ }
338
+
339
+ .cg-menu {
340
+ display: flex;
341
+ flex-wrap: wrap;
342
+ align-items: center;
343
+ gap: var(--cg-s5);
344
+ margin: 0;
345
+ padding: 0;
346
+ list-style: none;
347
+ font-size: var(--cg-text-sm);
348
+ font-weight: var(--cg-weight-medium);
349
+ }
350
+
351
+ .cg-menu a,
352
+ .cg-menu span {
353
+ color: var(--cg-ink-muted);
354
+ text-decoration: none;
355
+ }
356
+
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;
373
+ align-items: center;
374
+ 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);
388
+ }
389
+
390
+ .cg-theme-toggle__icon {
391
+ block-size: 1.1rem;
392
+ inline-size: 1.1rem;
393
+ }
394
+
395
+ .cg-theme-toggle__icon--moon {
396
+ display: none;
397
+ }
398
+
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
+ }
409
+ }
410
+
411
+ :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--sun {
412
+ display: none;
413
+ }
414
+
415
+ :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--moon {
416
+ display: block;
417
+ }
418
+
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;
424
+ 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
+ display: block;
445
+ }
446
+
447
+ .cg-nav-toggle__panel {
448
+ 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
+ }
521
+ }
522
+
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);
555
+ 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;
580
+ }
581
+
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 {
597
+ opacity: 1;
598
+ }
599
+
600
+ .cg-site-footer__brand-logo {
601
+ display: block;
602
+ block-size: 25px;
603
+ inline-size: auto;
604
+ }
605
+
606
+ .cg-site-footer__version {
607
+ font-variant-numeric: tabular-nums;
608
+ font-size: 0.9em;
609
+ }
610
+
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);
619
+ }
620
+
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;
631
+ }
632
+
633
+ /* --------------------------------------------------------------------------
634
+ The doc page — two columns, CSS-only
635
+ -------------------------------------------------------------------------- */
636
+
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;
776
+ margin-inline: 0;
777
+ padding-inline: 0;
778
+ }
779
+
780
+ .cg-docs__content > .cg-block:first-child {
781
+ margin-block-start: 0;
782
+ }
783
+
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;
817
+ }
818
+
819
+ /* --------------------------------------------------------------------------
820
+ Actions — the theme's only control
821
+ -------------------------------------------------------------------------- */
822
+
823
+ .cg-actions {
824
+ display: flex;
825
+ 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);
869
+ }
870
+
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);
875
+ }
876
+
877
+ .cg-action:active {
878
+ transform: translateY(0);
879
+ box-shadow: var(--cg-elevation-1);
880
+ }
881
+
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;
901
+ }
902
+
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;
912
+ list-style: none;
913
+ }
914
+
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);
925
+ }
926
+
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);
941
+ }
942
+
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);
949
+ }
950
+
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);
956
+ }
957
+
958
+ .cg-search__form input[type="search"] {
959
+ flex: 1 1 16rem;
960
+ }
961
+
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);
968
+ }
969
+
970
+ .cg-search__empty,
971
+ .cg-comments__empty,
972
+ .cg-comments__closed {
973
+ color: var(--cg-ink-muted);
974
+ }
975
+
976
+ .cg-search__error,
977
+ .cg-form__error,
978
+ .cg-form__field-error {
979
+ color: var(--cg-ink);
980
+ font-weight: var(--cg-weight-bold);
981
+ }
982
+
983
+ .cg-search__form input,
984
+ .cg-form__field input,
985
+ .cg-form__field select,
986
+ .cg-form__field textarea,
987
+ .cg-comment__form input,
988
+ .cg-comment__form textarea {
989
+ 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;
996
+ }
997
+
998
+ .cg-form__field input[aria-invalid="true"],
999
+ .cg-form__field select[aria-invalid="true"],
1000
+ .cg-form__field textarea[aria-invalid="true"] {
1001
+ border-width: 2px;
1002
+ border-color: var(--cg-line-strong);
1003
+ }
1004
+
1005
+ .cg-search__form button,
1006
+ .cg-form button[type="submit"],
1007
+ .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);
1014
+ cursor: pointer;
1015
+ transition: background-color var(--cg-duration) var(--cg-ease);
1016
+ }
1017
+
1018
+ .cg-search__form button:hover,
1019
+ .cg-form button[type="submit"]:hover,
1020
+ .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);
1028
+ }
1029
+
1030
+ .cg-form__field label,
1031
+ .cg-comment__form label {
1032
+ display: block;
1033
+ font-size: var(--cg-text-sm);
1034
+ font-weight: var(--cg-weight-semibold);
1035
+ margin-block-end: var(--cg-s2);
1036
+ }
1037
+
1038
+ .cg-form__help {
1039
+ margin: var(--cg-s2) 0 0;
1040
+ font-size: var(--cg-text-sm);
1041
+ color: var(--cg-ink-muted);
1042
+ }
1043
+
1044
+ .cg-form__choice {
1045
+ display: inline-flex;
1046
+ align-items: center;
1047
+ gap: var(--cg-s2);
1048
+ margin-inline-end: var(--cg-s4);
1049
+ font-weight: normal;
1050
+ }
1051
+
1052
+ .cg-form__honeypot,
1053
+ .cg-comment__honeypot {
1054
+ position: absolute;
1055
+ inline-size: 1px;
1056
+ block-size: 1px;
1057
+ overflow: hidden;
1058
+ inset-inline-start: -9999px;
1059
+ }
1060
+
1061
+ .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);
1066
+ }
1067
+
1068
+ .cg-comments__list,
1069
+ .cg-comment__replies {
1070
+ margin: 0;
1071
+ padding: 0;
1072
+ list-style: none;
1073
+ }
1074
+
1075
+ .cg-comment {
1076
+ padding-block: var(--cg-s5);
1077
+ border-block-end: 1px solid var(--cg-line-soft);
1078
+ }
1079
+
1080
+ .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;
1088
+ }
1089
+
1090
+ .cg-comment__meta {
1091
+ 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);
1097
+ }
1098
+
1099
+ .cg-comment__author {
1100
+ font-weight: var(--cg-weight-semibold);
1101
+ color: var(--cg-ink);
1102
+ }
1103
+
1104
+ .cg-comment__body {
1105
+ margin: 0;
1106
+ }