codetrail-cli 1.4.1__py3-none-any.whl

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 (171) hide show
  1. codetrail/__init__.py +3 -0
  2. codetrail/__main__.py +5 -0
  3. codetrail/agents/__init__.py +4 -0
  4. codetrail/agents/convert.py +92 -0
  5. codetrail/agents/export.py +284 -0
  6. codetrail/agents/instructions.py +42 -0
  7. codetrail/agents/protocol.py +111 -0
  8. codetrail/agents/tools.py +185 -0
  9. codetrail/assistant/__init__.py +161 -0
  10. codetrail/assistant/claude_code.py +330 -0
  11. codetrail/assistant/codex.py +260 -0
  12. codetrail/assistant/environment.py +66 -0
  13. codetrail/assistant/estimate.py +225 -0
  14. codetrail/assistant/fake.py +74 -0
  15. codetrail/assistant/guard.py +80 -0
  16. codetrail/assistant/guard_hook.py +58 -0
  17. codetrail/assistant/local.py +245 -0
  18. codetrail/assistant/local_tools.py +177 -0
  19. codetrail/assistant/prompts.py +404 -0
  20. codetrail/assistant/routing.py +86 -0
  21. codetrail/assistant/runner.py +120 -0
  22. codetrail/assistant/status.py +186 -0
  23. codetrail/assistant/usage.py +93 -0
  24. codetrail/bridge.py +292 -0
  25. codetrail/cli.py +407 -0
  26. codetrail/config.py +485 -0
  27. codetrail/database/__init__.py +60 -0
  28. codetrail/database/migrations/0001_facts.sql +34 -0
  29. codetrail/database/migrations/0002_settings.sql +5 -0
  30. codetrail/database/migrations/0003_learning.sql +34 -0
  31. codetrail/database/migrations/0004_assistant_usage.sql +24 -0
  32. codetrail/database/migrations/0005_page_failures.sql +7 -0
  33. codetrail/database/migrations/0006_metric_values.sql +9 -0
  34. codetrail/errors.py +5 -0
  35. codetrail/extract/__init__.py +249 -0
  36. codetrail/extract/adr.py +98 -0
  37. codetrail/extract/github_actions.py +140 -0
  38. codetrail/extract/openapi.py +101 -0
  39. codetrail/extract/python.py +221 -0
  40. codetrail/extract/swift.py +204 -0
  41. codetrail/extract/terraform.py +166 -0
  42. codetrail/extract/typescript.py +464 -0
  43. codetrail/facts/__init__.py +112 -0
  44. codetrail/facts/store.py +209 -0
  45. codetrail/generate/__init__.py +1 -0
  46. codetrail/generate/failures.py +31 -0
  47. codetrail/generate/outline.py +159 -0
  48. codetrail/generate/revise.py +72 -0
  49. codetrail/generate/run.py +530 -0
  50. codetrail/generate/scope.py +135 -0
  51. codetrail/generate/validate.py +218 -0
  52. codetrail/guide/__init__.py +147 -0
  53. codetrail/learn/__init__.py +143 -0
  54. codetrail/learn/routes.py +139 -0
  55. codetrail/locales/ar/LC_MESSAGES/codetrail.mo +0 -0
  56. codetrail/locales/ar/LC_MESSAGES/codetrail.po +2236 -0
  57. codetrail/locales/codetrail.pot +1942 -0
  58. codetrail/lock.py +114 -0
  59. codetrail/metrics/__init__.py +6 -0
  60. codetrail/metrics/activity.py +96 -0
  61. codetrail/metrics/churn.py +156 -0
  62. codetrail/metrics/commits.py +45 -0
  63. codetrail/metrics/coverage.py +114 -0
  64. codetrail/metrics/decisions.py +77 -0
  65. codetrail/metrics/history.py +47 -0
  66. codetrail/metrics/inventory.py +63 -0
  67. codetrail/metrics/rationale.py +74 -0
  68. codetrail/metrics/releases.py +26 -0
  69. codetrail/metrics/report.py +111 -0
  70. codetrail/metrics/repository.py +128 -0
  71. codetrail/metrics/size.py +95 -0
  72. codetrail/py.typed +0 -0
  73. codetrail/remove.py +50 -0
  74. codetrail/repo/__init__.py +4 -0
  75. codetrail/repo/git.py +56 -0
  76. codetrail/repo/gitleaks.toml +6 -0
  77. codetrail/repo/history.py +262 -0
  78. codetrail/repo/mirror.py +137 -0
  79. codetrail/repo/refresh.py +41 -0
  80. codetrail/repo/rules.py +83 -0
  81. codetrail/repo/secrets.py +145 -0
  82. codetrail/repo/signal.py +65 -0
  83. codetrail/repo/source.py +166 -0
  84. codetrail/search.py +178 -0
  85. codetrail/server.py +45 -0
  86. codetrail/system.py +484 -0
  87. codetrail/update.py +276 -0
  88. codetrail/web/__init__.py +1 -0
  89. codetrail/web/app.py +897 -0
  90. codetrail/web/diagrams.py +414 -0
  91. codetrail/web/documentation.py +146 -0
  92. codetrail/web/i18n.py +44 -0
  93. codetrail/web/navigation.py +127 -0
  94. codetrail/web/render.py +126 -0
  95. codetrail/web/repository_view.py +230 -0
  96. codetrail/web/security.py +171 -0
  97. codetrail/web/static/brand/favicon.svg +1 -0
  98. codetrail/web/static/brand/mark.svg +1 -0
  99. codetrail/web/static/css/base.css +192 -0
  100. codetrail/web/static/css/components.css +2254 -0
  101. codetrail/web/static/css/content.css +310 -0
  102. codetrail/web/static/css/layout.css +410 -0
  103. codetrail/web/static/css/print.css +42 -0
  104. codetrail/web/static/css/tokens.css +228 -0
  105. codetrail/web/static/js/api.js +49 -0
  106. codetrail/web/static/js/ask.js +182 -0
  107. codetrail/web/static/js/d2-worker.js +34 -0
  108. codetrail/web/static/js/d2.js +28 -0
  109. codetrail/web/static/js/diagram.js +52 -0
  110. codetrail/web/static/js/documentation.js +24 -0
  111. codetrail/web/static/js/learning.js +47 -0
  112. codetrail/web/static/js/main.js +38 -0
  113. codetrail/web/static/js/outline.js +44 -0
  114. codetrail/web/static/js/palette.js +211 -0
  115. codetrail/web/static/js/repository.js +528 -0
  116. codetrail/web/static/js/resize.js +126 -0
  117. codetrail/web/static/js/shortcuts.js +87 -0
  118. codetrail/web/static/js/sidebar.js +194 -0
  119. codetrail/web/static/js/theme-init.js +27 -0
  120. codetrail/web/static/js/theme.js +42 -0
  121. codetrail/web/static/js/update.js +107 -0
  122. codetrail/web/static/vendor/d2/LICENSE +375 -0
  123. codetrail/web/static/vendor/d2/LICENSE-elk +263 -0
  124. codetrail/web/static/vendor/d2/LICENSE-wasm_exec +27 -0
  125. codetrail/web/static/vendor/d2/VERSION +12 -0
  126. codetrail/web/static/vendor/d2/d2.wasm +0 -0
  127. codetrail/web/static/vendor/d2/elk.js +105914 -0
  128. codetrail/web/static/vendor/d2/wasm_exec.js +656 -0
  129. codetrail/web/static/vendor/inter/InterVariable-Italic.woff2 +0 -0
  130. codetrail/web/static/vendor/inter/InterVariable.woff2 +0 -0
  131. codetrail/web/static/vendor/inter/LICENSE.txt +92 -0
  132. codetrail/web/static/vendor/inter/VERSION +6 -0
  133. codetrail/web/static/vendor/noto-sans-arabic/NotoSansArabic-wght.woff2 +0 -0
  134. codetrail/web/static/vendor/noto-sans-arabic/OFL.txt +93 -0
  135. codetrail/web/static/vendor/noto-sans-arabic/VERSION +12 -0
  136. codetrail/web/target_view.py +63 -0
  137. codetrail/web/templates/answers.html +25 -0
  138. codetrail/web/templates/area.html +46 -0
  139. codetrail/web/templates/base.html +37 -0
  140. codetrail/web/templates/decisions.html +30 -0
  141. codetrail/web/templates/diagram.html +10 -0
  142. codetrail/web/templates/digests.html +24 -0
  143. codetrail/web/templates/documentation.html +247 -0
  144. codetrail/web/templates/error.html +9 -0
  145. codetrail/web/templates/estimate.html +48 -0
  146. codetrail/web/templates/fact.html +29 -0
  147. codetrail/web/templates/home.html +196 -0
  148. codetrail/web/templates/layout/ask_panel.html +27 -0
  149. codetrail/web/templates/layout/header.html +32 -0
  150. codetrail/web/templates/layout/icons.html +27 -0
  151. codetrail/web/templates/layout/outline.html +4 -0
  152. codetrail/web/templates/layout/palette.html +27 -0
  153. codetrail/web/templates/layout/shortcuts.html +27 -0
  154. codetrail/web/templates/layout/sidebar.html +79 -0
  155. codetrail/web/templates/layout/update_dialog.html +18 -0
  156. codetrail/web/templates/macros.html +13 -0
  157. codetrail/web/templates/page.html +93 -0
  158. codetrail/web/templates/progress.html +46 -0
  159. codetrail/web/templates/repository.html +369 -0
  160. codetrail/web/templates/search.html +31 -0
  161. codetrail/web/templates/source.html +15 -0
  162. codetrail/web/templates/system.html +43 -0
  163. codetrail/web/templates/system_arrows.html +17 -0
  164. codetrail/web/templates/system_legend.html +9 -0
  165. codetrail/web/templates/update_log.html +30 -0
  166. codetrail/web/trend.py +22 -0
  167. codetrail_cli-1.4.1.dist-info/METADATA +372 -0
  168. codetrail_cli-1.4.1.dist-info/RECORD +171 -0
  169. codetrail_cli-1.4.1.dist-info/WHEEL +4 -0
  170. codetrail_cli-1.4.1.dist-info/entry_points.txt +3 -0
  171. codetrail_cli-1.4.1.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,2254 @@
1
+ /* Components: buttons, the search box, the sidebar, cards, progress, the palette, dialogs and the Ask panel. */
2
+
3
+ .button {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ gap: var(--space-2);
8
+ min-block-size: 36px;
9
+ padding: 0 var(--space-4);
10
+ border: 1px solid var(--line-strong);
11
+ border-radius: var(--radius);
12
+ background: var(--raised);
13
+ color: var(--text);
14
+ font-size: 0.9rem;
15
+ font-weight: 500;
16
+ line-height: 1;
17
+ white-space: nowrap;
18
+ cursor: pointer;
19
+ transition: background var(--duration) var(--ease), border-color var(--duration) var(--ease);
20
+ }
21
+
22
+ .button:hover {
23
+ background: var(--hover);
24
+ text-decoration: none;
25
+ }
26
+
27
+ .button:disabled {
28
+ cursor: progress;
29
+ opacity: 0.6;
30
+ }
31
+
32
+ .button.primary {
33
+ border-color: var(--accent);
34
+ background: var(--accent);
35
+ color: var(--on-accent);
36
+ }
37
+
38
+ .button.primary:hover {
39
+ border-color: var(--accent-hover);
40
+ background: var(--accent-hover);
41
+ }
42
+
43
+ .button.small {
44
+ min-block-size: 30px;
45
+ padding: 0 var(--space-3);
46
+ font-size: 0.85rem;
47
+ }
48
+
49
+ .button .cost {
50
+ color: inherit;
51
+ font-weight: 400;
52
+ opacity: 0.85;
53
+ }
54
+
55
+ .icon-button {
56
+ display: inline-flex;
57
+ align-items: center;
58
+ justify-content: center;
59
+ inline-size: 36px;
60
+ block-size: 36px;
61
+ padding: 0;
62
+ border: 1px solid transparent;
63
+ border-radius: var(--radius);
64
+ background: transparent;
65
+ color: var(--text-muted);
66
+ cursor: pointer;
67
+ }
68
+
69
+ .icon-button:hover {
70
+ background: var(--hover);
71
+ color: var(--text);
72
+ }
73
+
74
+ .icon {
75
+ inline-size: 18px;
76
+ block-size: 18px;
77
+ flex: none;
78
+ fill: none;
79
+ stroke: currentColor;
80
+ stroke-width: 1.8;
81
+ stroke-linecap: round;
82
+ stroke-linejoin: round;
83
+ }
84
+
85
+ .cost {
86
+ color: var(--text-faint);
87
+ font-size: 0.8em;
88
+ font-weight: 400;
89
+ }
90
+
91
+ /* The header's search box: a form that opens the palette when the script runs. */
92
+ .search-box {
93
+ display: flex;
94
+ align-items: center;
95
+ gap: var(--space-2);
96
+ inline-size: min(100%, 420px);
97
+ block-size: 38px;
98
+ padding-inline: var(--space-3);
99
+ border: 1px solid var(--line-strong);
100
+ border-radius: var(--radius);
101
+ background: var(--card);
102
+ color: var(--text-faint);
103
+ }
104
+
105
+ .search-box.full {
106
+ inline-size: 100%;
107
+ }
108
+
109
+ .search-box:focus-within {
110
+ border-color: var(--accent);
111
+ box-shadow: var(--focus);
112
+ }
113
+
114
+ .search-box input {
115
+ flex: 1;
116
+ min-inline-size: 0;
117
+ border: 0;
118
+ background: transparent;
119
+ color: var(--text);
120
+ outline: none;
121
+ }
122
+
123
+ .search-box input::placeholder {
124
+ color: var(--text-faint);
125
+ }
126
+
127
+ .language select {
128
+ block-size: 36px;
129
+ padding-inline: var(--space-2);
130
+ border: 1px solid var(--line-strong);
131
+ border-radius: var(--radius);
132
+ background: var(--raised);
133
+ font-size: 0.85rem;
134
+ }
135
+
136
+ /* The sidebar. */
137
+ .nav-list {
138
+ list-style: none;
139
+ margin: 0;
140
+ padding: 0;
141
+ }
142
+
143
+ .nav-heading {
144
+ margin-block: var(--space-4) var(--space-1);
145
+ color: var(--text-faint);
146
+ font-size: 0.72rem;
147
+ font-weight: 600;
148
+ letter-spacing: 0.06em;
149
+ text-transform: uppercase;
150
+ }
151
+
152
+ /* A section's heading folds it (design section 22.3); the chevron points down while it's open. */
153
+ .nav-fold {
154
+ display: flex;
155
+ align-items: center;
156
+ gap: var(--space-1);
157
+ inline-size: 100%;
158
+ padding: 2px var(--space-2);
159
+ border: 0;
160
+ border-radius: 6px;
161
+ background: transparent;
162
+ color: inherit;
163
+ font: inherit;
164
+ letter-spacing: inherit;
165
+ text-transform: inherit;
166
+ cursor: pointer;
167
+ }
168
+
169
+ .nav-fold:hover {
170
+ color: var(--text-muted);
171
+ }
172
+
173
+ .nav-fold .icon {
174
+ inline-size: 12px;
175
+ block-size: 12px;
176
+ transition: transform var(--duration) var(--ease);
177
+ }
178
+
179
+ .nav-fold[aria-expanded="true"] .icon {
180
+ transform: rotate(90deg);
181
+ }
182
+
183
+ .nav-fold[aria-expanded="false"] .icon:dir(rtl) {
184
+ transform: scaleX(-1);
185
+ }
186
+
187
+ .nav-fold .count {
188
+ margin-inline-start: auto;
189
+ font-weight: 500;
190
+ letter-spacing: 0;
191
+ }
192
+
193
+ /* A folded section keeps only the current page's row, so the reader never loses their place. */
194
+ :root[data-folded~="paths"] #nav-paths > li:not(:has([aria-current="page"])),
195
+ :root[data-folded~="areas"] #nav-areas > li:not(:has([aria-current="page"])),
196
+ :root[data-folded~="concepts"] #nav-concepts > li:not(:has([aria-current="page"])),
197
+ :root[data-folded~="answers"] #nav-answers > li:not(:has([aria-current="page"])),
198
+ :root[data-folded~="more"] #nav-more > li:not(:has([aria-current="page"])) {
199
+ display: none;
200
+ }
201
+
202
+ .nav-link {
203
+ display: flex;
204
+ align-items: center;
205
+ gap: var(--space-2);
206
+ min-block-size: 30px;
207
+ padding: 4px var(--space-3);
208
+ border-radius: 8px;
209
+ color: var(--text-muted);
210
+ font-size: 0.9rem;
211
+ line-height: 1.35;
212
+ }
213
+
214
+ .nav-link:hover {
215
+ background: color-mix(in srgb, var(--raised) 70%, transparent);
216
+ color: var(--text);
217
+ text-decoration: none;
218
+ }
219
+
220
+ .nav-link[aria-current="page"] {
221
+ background: var(--raised);
222
+ color: var(--accent-text);
223
+ font-weight: 500;
224
+ box-shadow: var(--shadow-pill);
225
+ }
226
+
227
+ /* A pinnable row's pin button sits at its end, shown on hover or focus (design section 22.3). */
228
+ .nav-row {
229
+ position: relative;
230
+ }
231
+
232
+ .nav-pin {
233
+ position: absolute;
234
+ inset-block-start: 50%;
235
+ inset-inline-end: var(--space-1);
236
+ display: grid;
237
+ place-items: center;
238
+ inline-size: 24px;
239
+ block-size: 24px;
240
+ padding: 0;
241
+ border: 0;
242
+ border-radius: 6px;
243
+ background: var(--raised);
244
+ color: var(--text-faint);
245
+ opacity: 0;
246
+ transform: translateY(-50%);
247
+ cursor: pointer;
248
+ }
249
+
250
+ .nav-pin .icon {
251
+ inline-size: 14px;
252
+ block-size: 14px;
253
+ }
254
+
255
+ .nav-row:is(:hover, :focus-within) .nav-pin {
256
+ opacity: 1;
257
+ }
258
+
259
+ .nav-pin[aria-pressed="true"] {
260
+ color: var(--accent-text);
261
+ }
262
+
263
+ .nav-pin:disabled {
264
+ cursor: not-allowed;
265
+ }
266
+
267
+ .nav-row:is(:hover, :focus-within) .nav-pin:disabled {
268
+ opacity: 0.5;
269
+ }
270
+
271
+ .nav-row:has(.nav-pin:not([hidden])):is(:hover, :focus-within) .nav-link > :is(.count, .check, .dot) {
272
+ visibility: hidden;
273
+ }
274
+
275
+ /* Pinned pages as tiles of initials, three across (design section 22.2). */
276
+ .pins {
277
+ display: grid;
278
+ grid-template-columns: repeat(3, minmax(0, 1fr));
279
+ gap: var(--space-1);
280
+ margin: 0 0 var(--space-3);
281
+ padding: 0;
282
+ list-style: none;
283
+ }
284
+
285
+ .pin-item {
286
+ position: relative;
287
+ }
288
+
289
+ .pin {
290
+ display: flex;
291
+ align-items: center;
292
+ justify-content: center;
293
+ block-size: 36px;
294
+ border-radius: 9px;
295
+ background: color-mix(in srgb, var(--raised) 60%, transparent);
296
+ box-shadow: 0 0 0 1px var(--line);
297
+ color: var(--text-muted);
298
+ font-size: 0.8rem;
299
+ font-weight: 600;
300
+ letter-spacing: 0.02em;
301
+ }
302
+
303
+ .pin:hover {
304
+ background: var(--raised);
305
+ color: var(--text);
306
+ text-decoration: none;
307
+ }
308
+
309
+ .pin[aria-current="page"] {
310
+ background: var(--raised);
311
+ color: var(--accent-text);
312
+ box-shadow: var(--shadow-pill);
313
+ }
314
+
315
+ .pin-remove {
316
+ position: absolute;
317
+ inset-block-start: -5px;
318
+ inset-inline-end: -5px;
319
+ display: grid;
320
+ place-items: center;
321
+ inline-size: 18px;
322
+ block-size: 18px;
323
+ padding: 0;
324
+ border: 1px solid var(--line);
325
+ border-radius: 50%;
326
+ background: var(--raised);
327
+ color: var(--text-muted);
328
+ opacity: 0;
329
+ cursor: pointer;
330
+ }
331
+
332
+ .pin-remove .icon {
333
+ inline-size: 10px;
334
+ block-size: 10px;
335
+ }
336
+
337
+ .pin-item:hover .pin-remove,
338
+ .pin-item:focus-within .pin-remove {
339
+ opacity: 1;
340
+ }
341
+
342
+ .nav-link .label {
343
+ flex: 1;
344
+ min-inline-size: 0;
345
+ overflow: hidden;
346
+ text-overflow: ellipsis;
347
+ white-space: nowrap;
348
+ }
349
+
350
+ .nav-link .count {
351
+ color: var(--text-faint);
352
+ font-size: 0.75rem;
353
+ font-variant-numeric: tabular-nums;
354
+ }
355
+
356
+ .nav-link .check {
357
+ color: var(--learned);
358
+ }
359
+
360
+ .nav-link .dot {
361
+ inline-size: 7px;
362
+ block-size: 7px;
363
+ border-radius: 50%;
364
+ background: var(--accent);
365
+ flex: none;
366
+ }
367
+
368
+ .nav-path .bar {
369
+ margin-block-start: 5px;
370
+ }
371
+
372
+ .nav-empty {
373
+ padding: 4px var(--space-3);
374
+ color: var(--text-faint);
375
+ font-size: 0.82rem;
376
+ }
377
+
378
+ /* Progress bars, drawn by native progress elements. */
379
+ .bar {
380
+ display: block;
381
+ inline-size: 100%;
382
+ block-size: 6px;
383
+ overflow: hidden;
384
+ border: 0;
385
+ border-radius: 3px;
386
+ background: var(--line);
387
+ appearance: none;
388
+ }
389
+
390
+ .bar::-webkit-progress-bar {
391
+ border-radius: 3px;
392
+ background: var(--line);
393
+ }
394
+
395
+ .bar::-webkit-progress-value {
396
+ border-radius: 3px;
397
+ background: var(--accent);
398
+ }
399
+
400
+ .bar::-moz-progress-bar {
401
+ border-radius: 3px;
402
+ background: var(--accent);
403
+ }
404
+
405
+ .nav-path .bar {
406
+ block-size: 3px;
407
+ }
408
+
409
+ .pill {
410
+ display: inline-flex;
411
+ align-items: center;
412
+ gap: 6px;
413
+ padding: 2px 10px;
414
+ border-radius: 999px;
415
+ background: var(--card);
416
+ color: var(--text-muted);
417
+ font-size: 0.8rem;
418
+ font-weight: 500;
419
+ white-space: nowrap;
420
+ }
421
+
422
+ .pill-learned {
423
+ background: var(--learned-tint);
424
+ color: var(--learned);
425
+ }
426
+
427
+ .pill-stale,
428
+ .pill-changed {
429
+ background: var(--inferred-tint);
430
+ color: var(--inferred-text);
431
+ }
432
+
433
+ .pill-read {
434
+ background: var(--accent-tint);
435
+ color: var(--accent-text);
436
+ }
437
+
438
+ /* Cards and the home page. */
439
+ .card {
440
+ padding: var(--space-5);
441
+ border: 1px solid var(--line);
442
+ border-radius: var(--radius-card);
443
+ background: var(--raised);
444
+ }
445
+
446
+ .card + .card {
447
+ margin-block-start: var(--space-3);
448
+ }
449
+
450
+ .card-accent {
451
+ border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
452
+ background: color-mix(in srgb, var(--accent-tint) 55%, var(--raised));
453
+ }
454
+
455
+ .card-label {
456
+ margin: 0 0 var(--space-1);
457
+ color: var(--text-faint);
458
+ font-size: 0.78rem;
459
+ font-weight: 500;
460
+ }
461
+
462
+ .card-title {
463
+ margin: 0 0 var(--space-3);
464
+ font-size: 1.15rem;
465
+ font-weight: 600;
466
+ }
467
+
468
+ .page-head {
469
+ margin-block-end: var(--space-8);
470
+ }
471
+
472
+ .page-head .meta {
473
+ color: var(--text-faint);
474
+ font-family: var(--font-mono);
475
+ font-size: 0.82rem;
476
+ }
477
+
478
+ .eyebrow {
479
+ margin: 0 0 var(--space-2);
480
+ color: var(--accent-text);
481
+ font-size: 0.8rem;
482
+ font-weight: 600;
483
+ }
484
+
485
+ .stats {
486
+ display: grid;
487
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
488
+ gap: var(--space-3);
489
+ margin-block: var(--space-4) var(--space-8);
490
+ }
491
+
492
+ .stat {
493
+ display: flex;
494
+ flex-direction: column;
495
+ gap: var(--space-1);
496
+ padding: var(--space-4) var(--space-5);
497
+ border: 1px solid var(--line);
498
+ border-radius: var(--radius-card);
499
+ background: var(--card);
500
+ }
501
+
502
+ .stat-value {
503
+ font-size: 1.45rem;
504
+ font-weight: 600;
505
+ letter-spacing: -0.02em;
506
+ font-variant-numeric: tabular-nums;
507
+ }
508
+
509
+ .stat-link {
510
+ font-size: 1.05rem;
511
+ font-weight: 600;
512
+ line-height: 1.35;
513
+ }
514
+
515
+ .stat-note {
516
+ color: var(--text-muted);
517
+ font-size: 0.82rem;
518
+ }
519
+
520
+ .stat .button {
521
+ align-self: flex-start;
522
+ margin-block-start: var(--space-2);
523
+ }
524
+
525
+ .grid {
526
+ display: grid;
527
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
528
+ gap: var(--space-3);
529
+ padding: 0;
530
+ list-style: none;
531
+ }
532
+
533
+ .tile {
534
+ display: flex;
535
+ flex-direction: column;
536
+ gap: var(--space-1);
537
+ block-size: 100%;
538
+ padding: var(--space-4);
539
+ border: 1px solid var(--line);
540
+ border-radius: var(--radius-card);
541
+ background: var(--raised);
542
+ color: var(--text);
543
+ transition: border-color var(--duration) var(--ease), transform var(--duration) var(--ease);
544
+ }
545
+
546
+ .tile:hover {
547
+ border-color: var(--accent);
548
+ text-decoration: none;
549
+ }
550
+
551
+ .tile-title {
552
+ font-weight: 600;
553
+ line-height: 1.35;
554
+ }
555
+
556
+ .list {
557
+ margin: 0;
558
+ padding: 0;
559
+ list-style: none;
560
+ border: 1px solid var(--line);
561
+ border-radius: var(--radius-card);
562
+ overflow: hidden;
563
+ }
564
+
565
+ .list.spaced {
566
+ margin-block-start: var(--space-4);
567
+ }
568
+
569
+ .list > li {
570
+ display: flex;
571
+ flex-wrap: wrap;
572
+ align-items: baseline;
573
+ gap: var(--space-1) var(--space-3);
574
+ padding: var(--space-3) var(--space-4);
575
+ border-block-end: 1px solid var(--line);
576
+ background: var(--raised);
577
+ }
578
+
579
+ .list > li:last-child {
580
+ border-block-end: 0;
581
+ }
582
+
583
+ .list .grow {
584
+ flex: 1;
585
+ min-inline-size: 12rem;
586
+ }
587
+
588
+ .section-head {
589
+ display: flex;
590
+ align-items: baseline;
591
+ justify-content: space-between;
592
+ gap: var(--space-3);
593
+ }
594
+
595
+ .empty {
596
+ padding: var(--space-8) var(--space-6);
597
+ border: 1px dashed var(--line-strong);
598
+ border-radius: var(--radius-card);
599
+ text-align: center;
600
+ }
601
+
602
+ .empty h2,
603
+ .empty h3 {
604
+ margin-block-start: 0;
605
+ }
606
+
607
+ .empty p {
608
+ max-inline-size: 46ch;
609
+ margin-inline: auto;
610
+ color: var(--text-muted);
611
+ }
612
+
613
+ /* The home page (design section 16.1): a learning column, and beside it a rail of the repository's state, which
614
+ drops below once the page is too narrow for both. The page, not the window, decides: the sidebar and the Ask
615
+ panel take their share of the width. */
616
+ .home {
617
+ container-type: inline-size;
618
+ }
619
+
620
+ .home-head {
621
+ display: flex;
622
+ flex-wrap: wrap;
623
+ align-items: baseline;
624
+ gap: var(--space-1) var(--space-4);
625
+ margin-block-end: var(--space-5);
626
+ }
627
+
628
+ .home-head h1 {
629
+ margin: 0;
630
+ }
631
+
632
+ .home-head .meta {
633
+ margin: 0;
634
+ color: var(--text-faint);
635
+ font-family: var(--font-mono);
636
+ font-size: 0.82rem;
637
+ }
638
+
639
+ .home-columns {
640
+ display: grid;
641
+ gap: var(--space-5);
642
+ align-items: start;
643
+ }
644
+
645
+ @container (min-width: 56rem) {
646
+ .home-columns {
647
+ grid-template-columns: minmax(0, 1fr) 20rem;
648
+ }
649
+ }
650
+
651
+ .home-main,
652
+ .home-rail {
653
+ display: grid;
654
+ gap: var(--space-3);
655
+ min-inline-size: 0;
656
+ }
657
+
658
+ .home .card + .card {
659
+ margin-block-start: 0;
660
+ }
661
+
662
+ .home h2 {
663
+ margin-block: var(--space-3) var(--space-3);
664
+ font-size: 1.05rem;
665
+ }
666
+
667
+ .home .section-head h2 {
668
+ margin: 0;
669
+ }
670
+
671
+ .home .section-head {
672
+ margin-block-end: var(--space-3);
673
+ }
674
+
675
+ .home .card-label,
676
+ .home .card-title,
677
+ .home .stat-note {
678
+ margin-block: 0;
679
+ }
680
+
681
+ .continue {
682
+ display: flex;
683
+ flex-wrap: wrap;
684
+ align-items: center;
685
+ gap: var(--space-3) var(--space-4);
686
+ }
687
+
688
+ .continue .grow {
689
+ flex: 1;
690
+ min-inline-size: 12rem;
691
+ }
692
+
693
+ .continue-path {
694
+ margin: 0;
695
+ color: var(--text-muted);
696
+ font-size: 0.85rem;
697
+ }
698
+
699
+ .continue .faint {
700
+ margin: var(--space-1) 0 0;
701
+ font-size: 0.8rem;
702
+ }
703
+
704
+ .ring {
705
+ inline-size: 48px;
706
+ block-size: 48px;
707
+ flex: none;
708
+ fill: none;
709
+ stroke-width: 5;
710
+ }
711
+
712
+ .ring-track {
713
+ stroke: var(--line);
714
+ }
715
+
716
+ .ring-value {
717
+ stroke: var(--learned);
718
+ stroke-linecap: round;
719
+ transform: rotate(-90deg);
720
+ transform-origin: center;
721
+ }
722
+
723
+ .path-rows {
724
+ display: grid;
725
+ gap: var(--space-2);
726
+ margin: 0;
727
+ padding: 0;
728
+ list-style: none;
729
+ }
730
+
731
+ .path-rows li {
732
+ display: grid;
733
+ grid-template-columns: minmax(0, 1fr) minmax(4rem, 8rem) 2.5rem;
734
+ align-items: center;
735
+ gap: var(--space-3);
736
+ font-size: 0.9rem;
737
+ }
738
+
739
+ .path-rows a {
740
+ overflow: hidden;
741
+ color: var(--text);
742
+ text-overflow: ellipsis;
743
+ white-space: nowrap;
744
+ }
745
+
746
+ .path-rows .faint {
747
+ font-size: 0.8rem;
748
+ font-variant-numeric: tabular-nums;
749
+ text-align: end;
750
+ }
751
+
752
+ /* Progress toward learning is green, wherever it's drawn on the page. */
753
+ .path-rows .bar::-webkit-progress-value {
754
+ background: var(--learned);
755
+ }
756
+
757
+ .path-rows .bar::-moz-progress-bar {
758
+ background: var(--learned);
759
+ }
760
+
761
+ .area-grid {
762
+ margin: 0;
763
+ gap: var(--space-2);
764
+ }
765
+
766
+ .area-tile {
767
+ gap: var(--space-2);
768
+ align-items: flex-start;
769
+ padding: var(--space-3);
770
+ border-inline-start: 4px solid var(--line-strong);
771
+ }
772
+
773
+ .area-tile[data-status="learned"] {
774
+ border-inline-start-color: var(--learned);
775
+ }
776
+
777
+ .area-tile[data-status="stale"] {
778
+ border-inline-start-color: var(--inferred);
779
+ }
780
+
781
+ .area-tile[data-status="read"] {
782
+ border-inline-start-color: var(--accent);
783
+ }
784
+
785
+ .area-tile .tile-title {
786
+ font-size: 0.9rem;
787
+ }
788
+
789
+ .area-tile .pill {
790
+ padding: 0 var(--space-2);
791
+ font-size: 0.74rem;
792
+ }
793
+
794
+ .rail-card {
795
+ display: grid;
796
+ gap: var(--space-1);
797
+ padding: var(--space-4);
798
+ }
799
+
800
+ .rail-row {
801
+ display: flex;
802
+ flex-wrap: wrap;
803
+ align-items: center;
804
+ justify-content: space-between;
805
+ gap: var(--space-2);
806
+ margin-block: var(--space-1);
807
+ }
808
+
809
+ .chip {
810
+ display: inline-flex;
811
+ padding: 2px 10px;
812
+ border-radius: 999px;
813
+ background: var(--card);
814
+ color: var(--text-muted);
815
+ font-size: 0.85rem;
816
+ font-weight: 600;
817
+ }
818
+
819
+ .chip-ok {
820
+ background: var(--learned-tint);
821
+ color: var(--learned);
822
+ }
823
+
824
+ .chip-behind {
825
+ background: var(--inferred-tint);
826
+ color: var(--inferred-text);
827
+ }
828
+
829
+ /* A metric card's colour is its kind: the system blue, documentation indigo, the repository pink (section 16.2). */
830
+ .metric-card {
831
+ display: flex;
832
+ align-items: flex-start;
833
+ gap: var(--space-3);
834
+ }
835
+
836
+ .metric-card > div {
837
+ display: grid;
838
+ gap: var(--space-1);
839
+ min-inline-size: 0;
840
+ }
841
+
842
+ .metric-card .grow {
843
+ flex: 1;
844
+ }
845
+
846
+ .hue {
847
+ display: grid;
848
+ place-items: center;
849
+ inline-size: 34px;
850
+ block-size: 34px;
851
+ flex: none;
852
+ border-radius: 9px;
853
+ }
854
+
855
+ .metric-figure {
856
+ margin: 0;
857
+ font-weight: 600;
858
+ line-height: 1.35;
859
+ }
860
+
861
+ .metric-card[data-hue="system"] .hue {
862
+ background: color-mix(in srgb, var(--system) 16%, var(--raised));
863
+ color: var(--system-text);
864
+ }
865
+
866
+ .metric-card[data-hue="system"] .metric-figure {
867
+ color: var(--system-text);
868
+ }
869
+
870
+ .metric-card[data-hue="documented"] .hue {
871
+ background: var(--accent-tint);
872
+ color: var(--accent-text);
873
+ }
874
+
875
+ .metric-card[data-hue="documented"] .metric-figure {
876
+ color: var(--accent-text);
877
+ }
878
+
879
+ .metric-card[data-hue="repository"] .hue {
880
+ background: color-mix(in srgb, var(--repository) 16%, var(--raised));
881
+ color: var(--repository-text);
882
+ }
883
+
884
+ .metric-card[data-hue="repository"] .metric-figure {
885
+ color: var(--repository-text);
886
+ }
887
+
888
+ .rail-list {
889
+ display: grid;
890
+ gap: var(--space-2);
891
+ margin: var(--space-1) 0 0;
892
+ padding: 0;
893
+ list-style: none;
894
+ font-size: 0.88rem;
895
+ }
896
+
897
+ .folder-chips {
898
+ display: flex;
899
+ flex-wrap: wrap;
900
+ gap: var(--space-2);
901
+ margin: var(--space-1) 0 var(--space-2);
902
+ padding: 0;
903
+ list-style: none;
904
+ }
905
+
906
+ .folder-chip {
907
+ display: inline-flex;
908
+ align-items: center;
909
+ gap: var(--space-1);
910
+ padding: 2px 10px;
911
+ border: 1px solid var(--line);
912
+ border-radius: 999px;
913
+ background: var(--card);
914
+ color: var(--text);
915
+ font-size: 0.8rem;
916
+ }
917
+
918
+ .folder-chip:hover {
919
+ border-color: var(--accent);
920
+ text-decoration: none;
921
+ }
922
+
923
+ .folder-chip .icon {
924
+ inline-size: 14px;
925
+ block-size: 14px;
926
+ }
927
+
928
+ .notice {
929
+ padding: var(--space-3) var(--space-4);
930
+ border: 1px solid color-mix(in srgb, var(--inferred) 40%, var(--line));
931
+ border-radius: var(--radius);
932
+ background: var(--inferred-tint);
933
+ color: var(--text);
934
+ }
935
+
936
+ .breadcrumbs {
937
+ display: flex;
938
+ flex-wrap: wrap;
939
+ gap: var(--space-2);
940
+ margin: 0 0 var(--space-3);
941
+ padding: 0;
942
+ list-style: none;
943
+ color: var(--text-faint);
944
+ font-size: 0.85rem;
945
+ }
946
+
947
+ .breadcrumbs li + li::before {
948
+ content: "/";
949
+ margin-inline-end: var(--space-2);
950
+ color: var(--line-strong);
951
+ }
952
+
953
+ .page-status {
954
+ display: flex;
955
+ flex-wrap: wrap;
956
+ align-items: center;
957
+ gap: var(--space-3);
958
+ margin-block-end: var(--space-6);
959
+ }
960
+
961
+ .pager {
962
+ display: grid;
963
+ grid-template-columns: 1fr 1fr;
964
+ gap: var(--space-3);
965
+ margin-block-start: var(--space-12);
966
+ }
967
+
968
+ .pager a {
969
+ display: flex;
970
+ flex-direction: column;
971
+ gap: 2px;
972
+ padding: var(--space-3) var(--space-4);
973
+ border: 1px solid var(--line);
974
+ border-radius: var(--radius-card);
975
+ }
976
+
977
+ .pager a:hover {
978
+ border-color: var(--accent);
979
+ text-decoration: none;
980
+ }
981
+
982
+ .pager .next {
983
+ grid-column: 2;
984
+ text-align: end;
985
+ }
986
+
987
+ .pager small {
988
+ color: var(--text-faint);
989
+ }
990
+
991
+ /* Search results. */
992
+ .results {
993
+ margin: 0;
994
+ padding: 0;
995
+ list-style: none;
996
+ }
997
+
998
+ .results li {
999
+ padding-block: var(--space-4);
1000
+ border-block-end: 1px solid var(--line);
1001
+ }
1002
+
1003
+ .results .snippet {
1004
+ margin: var(--space-1) 0 0;
1005
+ color: var(--text-muted);
1006
+ font-size: 0.92rem;
1007
+ }
1008
+
1009
+ .kind {
1010
+ display: inline-block;
1011
+ padding: 0 7px;
1012
+ border-radius: 5px;
1013
+ background: var(--card);
1014
+ color: var(--text-faint);
1015
+ font-size: 0.72rem;
1016
+ font-weight: 500;
1017
+ vertical-align: 1px;
1018
+ }
1019
+
1020
+ /* Dialogs: the palette, the shortcuts and the update's estimate. */
1021
+ dialog {
1022
+ padding: 0;
1023
+ border: 1px solid var(--line);
1024
+ border-radius: var(--radius-card);
1025
+ background: var(--raised);
1026
+ color: var(--text);
1027
+ box-shadow: var(--shadow-float);
1028
+ }
1029
+
1030
+ dialog::backdrop {
1031
+ background: rgb(10 14 30 / 0.4);
1032
+ backdrop-filter: blur(2px);
1033
+ }
1034
+
1035
+ dialog[open] {
1036
+ animation: rise var(--duration) var(--ease);
1037
+ }
1038
+
1039
+ @keyframes rise {
1040
+ from {
1041
+ opacity: 0;
1042
+ transform: translateY(6px) scale(0.99);
1043
+ }
1044
+ }
1045
+
1046
+ .dialog-body {
1047
+ padding: var(--space-6);
1048
+ }
1049
+
1050
+ .dialog-body h2 {
1051
+ margin-block-start: 0;
1052
+ }
1053
+
1054
+ .dialog-actions {
1055
+ display: flex;
1056
+ justify-content: flex-end;
1057
+ gap: var(--space-3);
1058
+ padding: var(--space-4) var(--space-6);
1059
+ border-block-start: 1px solid var(--line);
1060
+ background: var(--card);
1061
+ }
1062
+
1063
+ .estimate-dialog {
1064
+ inline-size: min(46rem, 94vw);
1065
+ }
1066
+
1067
+ .estimate-dialog table {
1068
+ font-size: 0.88rem;
1069
+ }
1070
+
1071
+ .estimate-notes {
1072
+ color: var(--text-muted);
1073
+ font-size: 0.88rem;
1074
+ }
1075
+
1076
+ .palette {
1077
+ inline-size: min(640px, 94vw);
1078
+ margin-block-start: 12vh;
1079
+ }
1080
+
1081
+ .palette-field {
1082
+ display: flex;
1083
+ align-items: center;
1084
+ gap: var(--space-3);
1085
+ padding: var(--space-4) var(--space-5);
1086
+ border-block-end: 1px solid var(--line);
1087
+ color: var(--text-faint);
1088
+ }
1089
+
1090
+ .palette-field input {
1091
+ flex: 1;
1092
+ border: 0;
1093
+ background: transparent;
1094
+ color: var(--text);
1095
+ font-size: 1.05rem;
1096
+ outline: none;
1097
+ }
1098
+
1099
+ .palette-list {
1100
+ max-block-size: min(60vh, 460px);
1101
+ margin: 0;
1102
+ padding: var(--space-2);
1103
+ overflow-y: auto;
1104
+ list-style: none;
1105
+ }
1106
+
1107
+ .palette-group {
1108
+ padding: var(--space-3) var(--space-3) var(--space-1);
1109
+ color: var(--text-faint);
1110
+ font-size: 0.72rem;
1111
+ font-weight: 600;
1112
+ letter-spacing: 0.06em;
1113
+ text-transform: uppercase;
1114
+ }
1115
+
1116
+ .palette-option {
1117
+ display: flex;
1118
+ flex-direction: column;
1119
+ gap: 2px;
1120
+ padding: var(--space-2) var(--space-3);
1121
+ border-radius: var(--radius);
1122
+ cursor: pointer;
1123
+ }
1124
+
1125
+ .palette-option[aria-selected="true"] {
1126
+ background: var(--accent-tint);
1127
+ }
1128
+
1129
+ .palette-option .title {
1130
+ display: flex;
1131
+ align-items: center;
1132
+ gap: var(--space-2);
1133
+ font-weight: 500;
1134
+ }
1135
+
1136
+ .palette-option .snippet {
1137
+ color: var(--text-muted);
1138
+ font-size: 0.85rem;
1139
+ overflow: hidden;
1140
+ text-overflow: ellipsis;
1141
+ white-space: nowrap;
1142
+ }
1143
+
1144
+ .palette-status {
1145
+ margin: 0;
1146
+ padding: var(--space-3) var(--space-5);
1147
+ color: var(--text-faint);
1148
+ font-size: 0.85rem;
1149
+ }
1150
+
1151
+ .palette-footer {
1152
+ display: flex;
1153
+ flex-wrap: wrap;
1154
+ gap: var(--space-4);
1155
+ padding: var(--space-3) var(--space-5);
1156
+ border-block-start: 1px solid var(--line);
1157
+ background: var(--card);
1158
+ color: var(--text-faint);
1159
+ font-size: 0.78rem;
1160
+ }
1161
+
1162
+ .shortcuts-dialog {
1163
+ inline-size: min(34rem, 94vw);
1164
+ }
1165
+
1166
+ .shortcuts-dialog td:first-child {
1167
+ white-space: nowrap;
1168
+ }
1169
+
1170
+ /* The Ask panel, and the update panel, which takes the same place above it while an update runs. */
1171
+ .ask-panel,
1172
+ .update-panel {
1173
+ position: fixed;
1174
+ inset-block: var(--header-height) 0;
1175
+ inset-inline-end: 0;
1176
+ z-index: 20;
1177
+ display: flex;
1178
+ flex-direction: column;
1179
+ inline-size: min(var(--panel-width), 100vw);
1180
+ border-inline-start: 1px solid var(--line);
1181
+ background: var(--raised);
1182
+ box-shadow: var(--shadow-float);
1183
+ animation: slide var(--duration) var(--ease);
1184
+ }
1185
+
1186
+ @keyframes slide {
1187
+ from {
1188
+ opacity: 0;
1189
+ transform: translateX(16px);
1190
+ }
1191
+ }
1192
+
1193
+ /* Right to left, the panels sit on the left, so they slide in from there. */
1194
+ [dir="rtl"] :is(.ask-panel, .update-panel) {
1195
+ animation-name: slide-from-start;
1196
+ }
1197
+
1198
+ @keyframes slide-from-start {
1199
+ from {
1200
+ opacity: 0;
1201
+ transform: translateX(-16px);
1202
+ }
1203
+ }
1204
+
1205
+ .ask-head {
1206
+ display: flex;
1207
+ align-items: center;
1208
+ justify-content: space-between;
1209
+ gap: var(--space-3);
1210
+ padding-block: var(--space-3);
1211
+ padding-inline: var(--space-5) var(--space-4);
1212
+ border-block-end: 1px solid var(--line);
1213
+ }
1214
+
1215
+ .ask-head h2 {
1216
+ margin: 0;
1217
+ font-size: 1rem;
1218
+ }
1219
+
1220
+ .ask-thread {
1221
+ flex: 1;
1222
+ overflow-y: auto;
1223
+ padding: var(--space-4) var(--space-5);
1224
+ }
1225
+
1226
+ .ask-intro {
1227
+ color: var(--text-muted);
1228
+ font-size: 0.92rem;
1229
+ }
1230
+
1231
+ .ask-item {
1232
+ margin-block-end: var(--space-6);
1233
+ }
1234
+
1235
+ .ask-question {
1236
+ margin: 0 0 var(--space-2);
1237
+ padding: var(--space-2) var(--space-3);
1238
+ border-radius: var(--radius);
1239
+ background: var(--accent-tint);
1240
+ color: var(--text);
1241
+ font-weight: 500;
1242
+ white-space: pre-wrap;
1243
+ }
1244
+
1245
+ .ask-answer {
1246
+ font-size: 0.94rem;
1247
+ white-space: pre-wrap;
1248
+ }
1249
+
1250
+ .ask-answer:has(p, ul, ol, h1, h2, h3, pre, table) {
1251
+ white-space: normal;
1252
+ }
1253
+
1254
+ .ask-answer pre {
1255
+ padding: var(--space-3);
1256
+ border-radius: var(--radius);
1257
+ background: var(--card);
1258
+ }
1259
+
1260
+ .ask-actions {
1261
+ display: flex;
1262
+ flex-wrap: wrap;
1263
+ align-items: center;
1264
+ gap: var(--space-3);
1265
+ color: var(--text-faint);
1266
+ font-size: 0.82rem;
1267
+ }
1268
+
1269
+ .ask-form {
1270
+ display: grid;
1271
+ gap: var(--space-2);
1272
+ padding: var(--space-4) var(--space-5);
1273
+ border-block-start: 1px solid var(--line);
1274
+ background: var(--card);
1275
+ }
1276
+
1277
+ .ask-form textarea,
1278
+ .check textarea {
1279
+ inline-size: 100%;
1280
+ min-block-size: 84px;
1281
+ padding: var(--space-3);
1282
+ border: 1px solid var(--line-strong);
1283
+ border-radius: var(--radius);
1284
+ background: var(--raised);
1285
+ resize: vertical;
1286
+ }
1287
+
1288
+ .ask-form textarea:focus,
1289
+ .check textarea:focus {
1290
+ border-color: var(--accent);
1291
+ box-shadow: var(--focus);
1292
+ outline: none;
1293
+ }
1294
+
1295
+ .ask-form-row {
1296
+ display: flex;
1297
+ align-items: center;
1298
+ justify-content: space-between;
1299
+ gap: var(--space-3);
1300
+ }
1301
+
1302
+ .ask-status {
1303
+ margin: 0;
1304
+ color: var(--text-faint);
1305
+ font-size: 0.82rem;
1306
+ }
1307
+
1308
+ .update-panel {
1309
+ z-index: 25;
1310
+ }
1311
+
1312
+ .update-log {
1313
+ flex: 1;
1314
+ overflow-y: auto;
1315
+ margin: 0;
1316
+ padding: var(--space-4) var(--space-5);
1317
+ list-style: none;
1318
+ font-size: 0.9rem;
1319
+ }
1320
+
1321
+ .update-line {
1322
+ padding-block: var(--space-1);
1323
+ overflow-wrap: anywhere;
1324
+ }
1325
+
1326
+ .update-line.done::before {
1327
+ content: "✓ ";
1328
+ color: var(--accent);
1329
+ }
1330
+
1331
+ .update-line.failed,
1332
+ .update-state.failed {
1333
+ color: var(--danger);
1334
+ }
1335
+
1336
+ .update-state {
1337
+ margin: 0;
1338
+ padding: var(--space-3) var(--space-5);
1339
+ border-block-start: 1px solid var(--line);
1340
+ background: var(--card);
1341
+ font-size: 0.86rem;
1342
+ }
1343
+
1344
+ .update-state:empty {
1345
+ display: none;
1346
+ }
1347
+
1348
+ @media (max-width: 900px) {
1349
+ .ask-panel,
1350
+ .update-panel {
1351
+ inset-block-start: 0;
1352
+ z-index: 35;
1353
+ inline-size: 100vw;
1354
+ }
1355
+
1356
+ .update-panel {
1357
+ z-index: 36;
1358
+ }
1359
+ }
1360
+
1361
+ /* The Documentation page (design section 18.4). */
1362
+ .stat.metric .trend {
1363
+ inline-size: 100%;
1364
+ max-inline-size: 160px;
1365
+ block-size: 32px;
1366
+ margin-block-start: var(--space-2);
1367
+ }
1368
+
1369
+ .trend polyline {
1370
+ fill: none;
1371
+ stroke: var(--documented);
1372
+ stroke-width: 2;
1373
+ stroke-linejoin: round;
1374
+ stroke-linecap: round;
1375
+ }
1376
+
1377
+ /* The Documentation page's layout (design section 21): the overview beside its folding sections. */
1378
+ .doc-layout {
1379
+ display: grid;
1380
+ grid-template-columns: 15rem minmax(0, 1fr);
1381
+ align-items: start;
1382
+ gap: var(--space-6);
1383
+ }
1384
+
1385
+ /* Taller than a short screen, it scrolls on its own rather than pinning its last tile out of reach. */
1386
+ .doc-overview {
1387
+ position: sticky;
1388
+ inset-block-start: calc(var(--header-height) + var(--space-4));
1389
+ display: grid;
1390
+ gap: var(--space-3);
1391
+ max-block-size: calc(100vh - var(--header-height) - var(--space-8));
1392
+ overflow-y: auto;
1393
+ }
1394
+
1395
+ .doc-fold {
1396
+ margin-block-end: var(--space-3);
1397
+ border: 1px solid var(--line);
1398
+ border-radius: var(--radius-card);
1399
+ background: var(--page);
1400
+ }
1401
+
1402
+ .doc-fold > summary {
1403
+ display: flex;
1404
+ flex-wrap: wrap;
1405
+ align-items: baseline;
1406
+ justify-content: space-between;
1407
+ gap: var(--space-1) var(--space-4);
1408
+ padding: var(--space-3) var(--space-4);
1409
+ border-radius: var(--radius-card);
1410
+ list-style: none;
1411
+ cursor: pointer;
1412
+ }
1413
+
1414
+ .doc-fold > summary::-webkit-details-marker {
1415
+ display: none;
1416
+ }
1417
+
1418
+ .doc-overview:focus-visible,
1419
+ .doc-fold > summary:focus-visible {
1420
+ box-shadow: var(--focus);
1421
+ outline: none;
1422
+ }
1423
+
1424
+ .doc-fold > summary h2 {
1425
+ display: flex;
1426
+ align-items: center;
1427
+ gap: var(--space-1);
1428
+ margin: 0;
1429
+ font-size: 1.05rem;
1430
+ }
1431
+
1432
+ /* The sidebar's chevron, centred on the heading's text: it points down while the section is open. */
1433
+ .doc-fold > summary h2 .icon {
1434
+ flex: none;
1435
+ inline-size: 16px;
1436
+ block-size: 16px;
1437
+ color: var(--text-faint);
1438
+ transition: transform var(--duration) var(--ease);
1439
+ }
1440
+
1441
+ .doc-fold[open] > summary h2 .icon {
1442
+ transform: rotate(90deg);
1443
+ }
1444
+
1445
+ .doc-fold:not([open]) > summary h2 .icon:dir(rtl) {
1446
+ transform: scaleX(-1);
1447
+ }
1448
+
1449
+ .doc-todo {
1450
+ color: var(--text-muted);
1451
+ font-size: 0.85rem;
1452
+ }
1453
+
1454
+ .doc-body {
1455
+ padding: 0 var(--space-4) var(--space-4);
1456
+ border-block-start: 1px solid var(--line);
1457
+ }
1458
+
1459
+ .doc-about > summary {
1460
+ margin-block: var(--space-3);
1461
+ color: var(--text-faint);
1462
+ font-size: 0.82rem;
1463
+ cursor: pointer;
1464
+ }
1465
+
1466
+ .doc-columns {
1467
+ display: grid;
1468
+ grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
1469
+ gap: var(--space-4);
1470
+ }
1471
+
1472
+ .hbars.page-bars li,
1473
+ .hbars.coverage-bars li {
1474
+ grid-template-columns: minmax(6rem, 12rem) minmax(0, 1fr) 5rem;
1475
+ }
1476
+
1477
+ .hbars.page-bars .hbar-label,
1478
+ .hbars.coverage-bars .hbar-label {
1479
+ overflow: hidden;
1480
+ font-family: inherit;
1481
+ text-overflow: ellipsis;
1482
+ white-space: nowrap;
1483
+ }
1484
+
1485
+ .filter-chips {
1486
+ margin-block-end: var(--space-2);
1487
+ }
1488
+
1489
+ .tone-documented { background: var(--documented); fill: var(--documented); }
1490
+ .tone-inferred { background: var(--inferred); fill: var(--inferred); }
1491
+ .tone-other { background: var(--series-other); fill: var(--series-other); }
1492
+ .tone-quiet { background: var(--line-strong); fill: var(--line-strong); }
1493
+
1494
+ @media (max-width: 60rem) {
1495
+ .doc-layout {
1496
+ grid-template-columns: minmax(0, 1fr);
1497
+ }
1498
+
1499
+ .doc-overview {
1500
+ position: static;
1501
+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
1502
+ max-block-size: none;
1503
+ overflow-y: visible;
1504
+ }
1505
+ }
1506
+
1507
+ /* The Repository page and its charts (design sections 19.5 and 20). Charts draw left to right in every language. */
1508
+ .repository-head {
1509
+ display: flex;
1510
+ flex-wrap: wrap;
1511
+ align-items: flex-end;
1512
+ justify-content: space-between;
1513
+ gap: var(--space-4);
1514
+ }
1515
+
1516
+ .segmented {
1517
+ display: inline-flex;
1518
+ gap: var(--space-1);
1519
+ padding: 3px;
1520
+ border: 1px solid var(--line);
1521
+ border-radius: 9px;
1522
+ background: var(--card);
1523
+ }
1524
+
1525
+ .segmented button {
1526
+ border: 0;
1527
+ border-radius: 7px;
1528
+ padding: var(--space-1) var(--space-3);
1529
+ background: transparent;
1530
+ color: var(--text-muted);
1531
+ font: inherit;
1532
+ font-size: 0.85rem;
1533
+ font-weight: 500;
1534
+ cursor: pointer;
1535
+ }
1536
+
1537
+ .segmented button[aria-pressed="true"] {
1538
+ background: var(--accent);
1539
+ color: var(--on-accent);
1540
+ }
1541
+
1542
+ .chart-head {
1543
+ display: flex;
1544
+ flex-wrap: wrap;
1545
+ align-items: center;
1546
+ justify-content: space-between;
1547
+ gap: var(--space-3);
1548
+ margin-block: var(--space-3);
1549
+ }
1550
+
1551
+ .chart-window {
1552
+ margin: 0;
1553
+ color: var(--text-muted);
1554
+ font-size: 0.85rem;
1555
+ }
1556
+
1557
+ .chart-pan {
1558
+ display: inline-flex;
1559
+ gap: var(--space-1);
1560
+ }
1561
+
1562
+ .chart-pan button:disabled {
1563
+ opacity: 0.4;
1564
+ cursor: default;
1565
+ }
1566
+
1567
+ .chart-status {
1568
+ min-block-size: 1.4em;
1569
+ margin-block: var(--space-1) 0;
1570
+ font-size: 0.82rem;
1571
+ }
1572
+
1573
+ .timeline {
1574
+ display: grid;
1575
+ grid-template-columns: 7.5rem minmax(0, 1fr);
1576
+ gap: var(--space-2) var(--space-3);
1577
+ align-items: center;
1578
+ }
1579
+
1580
+ .timeline-label {
1581
+ color: var(--text-muted);
1582
+ font-size: 0.78rem;
1583
+ }
1584
+
1585
+ .timeline-plot,
1586
+ .timeline-lane,
1587
+ .timeline-axis,
1588
+ .timeline-mini {
1589
+ position: relative;
1590
+ }
1591
+
1592
+ .timeline-plot {
1593
+ block-size: 180px;
1594
+ border-block-end: 1px solid var(--line);
1595
+ }
1596
+
1597
+ .timeline-plot svg,
1598
+ .timeline-mini svg {
1599
+ display: block;
1600
+ inline-size: 100%;
1601
+ block-size: 100%;
1602
+ }
1603
+
1604
+ .timeline-plot .gridline {
1605
+ stroke: var(--line);
1606
+ stroke-dasharray: 3 3;
1607
+ }
1608
+
1609
+ .timeline-bar {
1610
+ fill: var(--series-1);
1611
+ }
1612
+
1613
+ .timeline-bar.is-active {
1614
+ fill: var(--accent-hover);
1615
+ }
1616
+
1617
+ .timeline-hit {
1618
+ fill: transparent;
1619
+ cursor: default;
1620
+ }
1621
+
1622
+ .timeline-hit:focus-visible {
1623
+ outline: none;
1624
+ fill: var(--chart-band);
1625
+ }
1626
+
1627
+ .timeline-axis {
1628
+ block-size: 1.2em;
1629
+ color: var(--text-faint);
1630
+ font-size: 0.72rem;
1631
+ }
1632
+
1633
+ .timeline-axis span,
1634
+ .timeline-lane .lane-mark,
1635
+ .timeline-tip {
1636
+ position: absolute;
1637
+ }
1638
+
1639
+ .timeline-axis span {
1640
+ white-space: nowrap;
1641
+ }
1642
+
1643
+ .timeline-lane {
1644
+ block-size: 30px;
1645
+ border: 1px solid var(--line);
1646
+ border-radius: 6px;
1647
+ background: var(--page);
1648
+ overflow: hidden;
1649
+ }
1650
+
1651
+ .timeline-lane .lane-empty {
1652
+ margin: 0;
1653
+ padding-inline-start: var(--space-2);
1654
+ color: var(--text-faint);
1655
+ font-size: 0.72rem;
1656
+ line-height: 28px;
1657
+ }
1658
+
1659
+ .lane-watch {
1660
+ position: absolute;
1661
+ inset-block: 0;
1662
+ inset-inline-end: 0;
1663
+ background: var(--chart-band);
1664
+ border-inline-start: 1px dashed var(--accent);
1665
+ color: var(--text-faint);
1666
+ font-size: 0.7rem;
1667
+ white-space: nowrap;
1668
+ overflow: hidden;
1669
+ }
1670
+
1671
+ .lane-watch-label {
1672
+ display: block;
1673
+ padding-inline: var(--space-1);
1674
+ line-height: 28px;
1675
+ }
1676
+
1677
+ /* Too narrow for its label: the label sits just before the band's dashed edge, inside the lane. */
1678
+ .lane-watch.narrow {
1679
+ overflow: visible;
1680
+ }
1681
+
1682
+ .lane-watch.narrow .lane-watch-label {
1683
+ position: absolute;
1684
+ inset-inline-end: 100%;
1685
+ }
1686
+
1687
+ .release-mark {
1688
+ inset-block-start: 3px;
1689
+ display: inline-flex;
1690
+ align-items: center;
1691
+ gap: var(--space-1);
1692
+ block-size: 22px;
1693
+ padding-inline: 2px 4px;
1694
+ border: 0;
1695
+ border-radius: 4px;
1696
+ background: transparent;
1697
+ color: var(--text);
1698
+ font: inherit;
1699
+ font-size: 0.72rem;
1700
+ font-weight: 500;
1701
+ white-space: nowrap;
1702
+ cursor: pointer;
1703
+ }
1704
+
1705
+ .release-mark::before {
1706
+ content: "";
1707
+ inline-size: 8px;
1708
+ block-size: 8px;
1709
+ border-radius: 2px;
1710
+ background: var(--text);
1711
+ transform: rotate(45deg);
1712
+ }
1713
+
1714
+ .release-mark[aria-pressed="true"] {
1715
+ box-shadow: inset 0 0 0 2px var(--accent);
1716
+ }
1717
+
1718
+ .release-mark[aria-pressed="true"]::before {
1719
+ background: var(--accent);
1720
+ }
1721
+
1722
+ .dep-mark {
1723
+ inset-block-end: 6px;
1724
+ inline-size: 14px;
1725
+ block-size: 14px;
1726
+ border-radius: 4px;
1727
+ color: #ffffff;
1728
+ font-size: 0.7rem;
1729
+ font-weight: 600;
1730
+ line-height: 14px;
1731
+ text-align: center;
1732
+ }
1733
+
1734
+ .dep-mark.arrived {
1735
+ background: var(--series-4);
1736
+ }
1737
+
1738
+ .dep-mark.left {
1739
+ background: var(--series-2);
1740
+ }
1741
+
1742
+ .timeline-mini {
1743
+ block-size: 34px;
1744
+ }
1745
+
1746
+ .timeline-mini rect {
1747
+ fill: var(--text-faint);
1748
+ opacity: 0.45;
1749
+ }
1750
+
1751
+ .timeline-mini .mini-window {
1752
+ fill: var(--chart-band);
1753
+ stroke: var(--accent);
1754
+ stroke-width: 2;
1755
+ opacity: 1;
1756
+ vector-effect: non-scaling-stroke;
1757
+ }
1758
+
1759
+ .timeline-tip {
1760
+ inset-block-start: 4px;
1761
+ z-index: 2;
1762
+ min-inline-size: 9rem;
1763
+ padding: var(--space-2) var(--space-3);
1764
+ border: 1px solid var(--line);
1765
+ border-radius: var(--radius);
1766
+ background: var(--raised);
1767
+ box-shadow: var(--shadow-float);
1768
+ font-size: 0.78rem;
1769
+ pointer-events: none;
1770
+ }
1771
+
1772
+ .timeline-tip strong {
1773
+ display: block;
1774
+ }
1775
+
1776
+ .chart-fallback {
1777
+ grid-column: 1 / -1;
1778
+ margin: 0;
1779
+ }
1780
+
1781
+ .release-panel {
1782
+ display: grid;
1783
+ grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
1784
+ gap: var(--space-4);
1785
+ margin-block: var(--space-4);
1786
+ padding: var(--space-3) var(--space-4);
1787
+ border: 1px solid var(--line);
1788
+ border-radius: 10px;
1789
+ background: var(--page);
1790
+ }
1791
+
1792
+ .release-panel p {
1793
+ margin: 0;
1794
+ }
1795
+
1796
+ .release-name {
1797
+ font-size: 1.05rem;
1798
+ font-weight: 600;
1799
+ }
1800
+
1801
+ .calendar-layout {
1802
+ display: flex;
1803
+ flex-wrap: wrap;
1804
+ gap: var(--space-6);
1805
+ align-items: flex-start;
1806
+ }
1807
+
1808
+ .calendar {
1809
+ max-inline-size: 100%;
1810
+ overflow-x: auto;
1811
+ }
1812
+
1813
+ .calendar svg {
1814
+ display: block;
1815
+ }
1816
+
1817
+ .calendar text {
1818
+ fill: var(--text-faint);
1819
+ font-size: 10px;
1820
+ }
1821
+
1822
+ .calendar .day:hover,
1823
+ .calendar .day:focus-visible {
1824
+ outline: none;
1825
+ stroke: var(--text);
1826
+ stroke-width: 1.5;
1827
+ }
1828
+
1829
+ .chart-facts {
1830
+ display: grid;
1831
+ grid-template-columns: auto auto;
1832
+ gap: var(--space-2) var(--space-4);
1833
+ margin: 0;
1834
+ font-size: 0.9rem;
1835
+ }
1836
+
1837
+ .chart-facts dt {
1838
+ color: var(--text-muted);
1839
+ }
1840
+
1841
+ .chart-facts dd {
1842
+ margin: 0;
1843
+ font-weight: 600;
1844
+ }
1845
+
1846
+ .ramp-legend {
1847
+ display: flex;
1848
+ flex-wrap: wrap;
1849
+ align-items: center;
1850
+ gap: var(--space-1);
1851
+ margin-block-start: var(--space-2);
1852
+ color: var(--text-muted);
1853
+ font-size: 0.75rem;
1854
+ }
1855
+
1856
+ .ramp-swatch {
1857
+ inline-size: 14px;
1858
+ block-size: 10px;
1859
+ border-radius: 2px;
1860
+ }
1861
+
1862
+ .inferred-mark {
1863
+ inline-size: 0;
1864
+ block-size: 0;
1865
+ margin-inline-start: var(--space-3);
1866
+ border-block-start: 11px solid var(--inferred);
1867
+ border-inline-start: 11px solid transparent;
1868
+ }
1869
+
1870
+ .heat-0 { background: var(--heat-0); color: var(--heat-ink-0); fill: var(--heat-0); }
1871
+ .heat-1 { background: var(--heat-1); color: var(--heat-ink-1); fill: var(--heat-1); }
1872
+ .heat-2 { background: var(--heat-2); color: var(--heat-ink-2); fill: var(--heat-2); }
1873
+ .heat-3 { background: var(--heat-3); color: var(--heat-ink-3); fill: var(--heat-3); }
1874
+ .heat-4 { background: var(--heat-4); color: var(--heat-ink-4); fill: var(--heat-4); }
1875
+
1876
+ .heatmap-layout {
1877
+ display: flex;
1878
+ flex-wrap: wrap;
1879
+ gap: var(--space-4);
1880
+ }
1881
+
1882
+ .heatmap-main {
1883
+ flex: 999 1 32rem;
1884
+ min-inline-size: 0;
1885
+ }
1886
+
1887
+ .heatmap {
1888
+ position: relative;
1889
+ block-size: 430px;
1890
+ border-radius: 10px;
1891
+ overflow: hidden;
1892
+ background: var(--page);
1893
+ }
1894
+
1895
+ .heat-tile {
1896
+ position: absolute;
1897
+ box-sizing: border-box;
1898
+ padding: 1px;
1899
+ }
1900
+
1901
+ .heat-tile button {
1902
+ position: relative;
1903
+ display: flex;
1904
+ flex-direction: column;
1905
+ justify-content: flex-start;
1906
+ align-items: flex-start;
1907
+ inline-size: 100%;
1908
+ block-size: 100%;
1909
+ padding: var(--space-2) var(--space-2);
1910
+ border: 0;
1911
+ border-radius: 4px;
1912
+ text-align: start;
1913
+ font: inherit;
1914
+ overflow: hidden;
1915
+ cursor: pointer;
1916
+ }
1917
+
1918
+ .heat-tile button[aria-pressed="true"] {
1919
+ box-shadow: inset 0 0 0 2px var(--text);
1920
+ }
1921
+
1922
+ .heat-tile button:focus-visible {
1923
+ outline: 2px solid var(--accent);
1924
+ outline-offset: -2px;
1925
+ }
1926
+
1927
+ .heat-tile-name {
1928
+ display: block;
1929
+ overflow: hidden;
1930
+ font-size: 0.8rem;
1931
+ font-weight: 600;
1932
+ line-height: 1.25;
1933
+ text-overflow: ellipsis;
1934
+ white-space: nowrap;
1935
+ }
1936
+
1937
+ .heat-tile-sub {
1938
+ display: block;
1939
+ font-size: 0.7rem;
1940
+ opacity: 0.85;
1941
+ }
1942
+
1943
+ .heat-tile .inferred-mark {
1944
+ position: absolute;
1945
+ inset-block-start: 5px;
1946
+ inset-inline-end: 5px;
1947
+ margin: 0;
1948
+ }
1949
+
1950
+ .heat-panel {
1951
+ display: flex;
1952
+ flex: 1 1 16rem;
1953
+ flex-direction: column;
1954
+ gap: var(--space-2);
1955
+ max-inline-size: 21rem;
1956
+ padding: var(--space-4);
1957
+ border: 1px solid var(--line);
1958
+ border-radius: 10px;
1959
+ background: var(--page);
1960
+ }
1961
+
1962
+ .heat-panel p {
1963
+ margin: 0;
1964
+ }
1965
+
1966
+ .heat-panel-name {
1967
+ font-size: 1.05rem;
1968
+ font-weight: 600;
1969
+ overflow-wrap: anywhere;
1970
+ }
1971
+
1972
+ .heat-panel-path {
1973
+ color: var(--text-muted);
1974
+ font-family: var(--font-mono);
1975
+ font-size: 0.75rem;
1976
+ overflow-wrap: anywhere;
1977
+ }
1978
+
1979
+ .heat-panel-numbers {
1980
+ display: grid;
1981
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1982
+ gap: var(--space-2);
1983
+ }
1984
+
1985
+ .heat-panel-numbers div {
1986
+ display: flex;
1987
+ flex-direction: column;
1988
+ }
1989
+
1990
+ .split-bar {
1991
+ display: flex;
1992
+ gap: 2px;
1993
+ block-size: 10px;
1994
+ margin-block-start: var(--space-1);
1995
+ border-radius: 5px;
1996
+ overflow: hidden;
1997
+ }
1998
+
1999
+ .split-documented {
2000
+ background: var(--documented);
2001
+ }
2002
+
2003
+ .split-inferred {
2004
+ background: var(--inferred);
2005
+ }
2006
+
2007
+ .split-legend {
2008
+ display: flex;
2009
+ justify-content: space-between;
2010
+ font-size: 0.75rem;
2011
+ }
2012
+
2013
+ .documented-text {
2014
+ color: var(--accent-text);
2015
+ }
2016
+
2017
+ .inferred-text {
2018
+ color: var(--inferred-text);
2019
+ }
2020
+
2021
+ .grid-scroll {
2022
+ overflow-x: auto;
2023
+ }
2024
+
2025
+ .heat-grid {
2026
+ inline-size: 100%;
2027
+ min-inline-size: 36rem;
2028
+ border-collapse: separate;
2029
+ border-spacing: 3px;
2030
+ font-size: 0.75rem;
2031
+ }
2032
+
2033
+ .heat-grid th {
2034
+ color: var(--text-faint);
2035
+ font-weight: 500;
2036
+ text-align: center;
2037
+ }
2038
+
2039
+ .heat-grid th[scope="row"] {
2040
+ max-inline-size: 10rem;
2041
+ overflow: hidden;
2042
+ color: var(--text);
2043
+ text-align: start;
2044
+ text-overflow: ellipsis;
2045
+ white-space: nowrap;
2046
+ }
2047
+
2048
+ .heat-grid td {
2049
+ block-size: 26px;
2050
+ border-radius: 3px;
2051
+ text-align: center;
2052
+ font-variant-numeric: tabular-nums;
2053
+ }
2054
+
2055
+ .heat-grid td:hover {
2056
+ outline: 1.5px solid var(--text);
2057
+ outline-offset: -1px;
2058
+ }
2059
+
2060
+ .heat-unread {
2061
+ background: var(--card);
2062
+ color: var(--text-faint);
2063
+ }
2064
+
2065
+ .change-extras {
2066
+ display: grid;
2067
+ grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
2068
+ gap: var(--space-4);
2069
+ }
2070
+
2071
+ .histogram {
2072
+ display: flex;
2073
+ align-items: flex-end;
2074
+ gap: var(--space-2);
2075
+ margin: 0;
2076
+ }
2077
+
2078
+ .histogram-column {
2079
+ display: flex;
2080
+ flex: 1;
2081
+ flex-direction: column;
2082
+ align-items: center;
2083
+ gap: var(--space-1);
2084
+ }
2085
+
2086
+ .histogram-bar {
2087
+ inline-size: 100%;
2088
+ block-size: 64px;
2089
+ }
2090
+
2091
+ .histogram-count,
2092
+ .histogram-label {
2093
+ color: var(--text-muted);
2094
+ font-size: 0.7rem;
2095
+ }
2096
+
2097
+ .series-fill-1 { fill: var(--series-1); }
2098
+ .series-fill-2 { fill: var(--series-2); }
2099
+ .series-fill-3 { fill: var(--series-3); }
2100
+ .series-fill-4 { fill: var(--series-4); }
2101
+ .series-fill-5 { fill: var(--series-other); }
2102
+ .series-1 { background: var(--series-1); }
2103
+ .series-2 { background: var(--series-2); }
2104
+ .series-3 { background: var(--series-3); }
2105
+ .series-4 { background: var(--series-4); }
2106
+ .series-5 { background: var(--series-other); }
2107
+
2108
+ .stack-bar svg,
2109
+ .share-bar svg {
2110
+ display: block;
2111
+ inline-size: 100%;
2112
+ }
2113
+
2114
+ .stack-bar svg {
2115
+ block-size: 22px;
2116
+ border-radius: 6px;
2117
+ }
2118
+
2119
+ .share-bar {
2120
+ margin-block: var(--space-3);
2121
+ border: 1px solid var(--line);
2122
+ border-radius: 5px;
2123
+ background: var(--page);
2124
+ overflow: hidden;
2125
+ }
2126
+
2127
+ .share-bar svg {
2128
+ block-size: 10px;
2129
+ }
2130
+
2131
+ .stack-legend {
2132
+ display: grid;
2133
+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
2134
+ gap: var(--space-2) var(--space-4);
2135
+ margin: var(--space-3) 0;
2136
+ padding: 0;
2137
+ list-style: none;
2138
+ font-size: 0.85rem;
2139
+ }
2140
+
2141
+ .stack-legend li {
2142
+ display: flex;
2143
+ align-items: center;
2144
+ gap: var(--space-2);
2145
+ }
2146
+
2147
+ .stack-legend .faint {
2148
+ margin-inline-start: auto;
2149
+ }
2150
+
2151
+ .swatch {
2152
+ flex: none;
2153
+ inline-size: 10px;
2154
+ block-size: 10px;
2155
+ border-radius: 3px;
2156
+ }
2157
+
2158
+ .hbars {
2159
+ display: flex;
2160
+ flex-direction: column;
2161
+ gap: var(--space-2);
2162
+ margin: 0;
2163
+ padding: 0;
2164
+ list-style: none;
2165
+ }
2166
+
2167
+ .hbars li {
2168
+ display: grid;
2169
+ grid-template-columns: 5rem minmax(0, 1fr) 3rem;
2170
+ align-items: center;
2171
+ gap: var(--space-3);
2172
+ font-size: 0.85rem;
2173
+ }
2174
+
2175
+ .hbar-label {
2176
+ font-family: var(--font-mono);
2177
+ }
2178
+
2179
+ .hbar-track {
2180
+ display: block;
2181
+ inline-size: 100%;
2182
+ block-size: 12px;
2183
+ }
2184
+
2185
+ .hbar-value {
2186
+ color: var(--text-muted);
2187
+ text-align: end;
2188
+ font-variant-numeric: tabular-nums;
2189
+ }
2190
+
2191
+ .fact-cards {
2192
+ display: grid;
2193
+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
2194
+ gap: var(--space-3);
2195
+ margin: 0 0 var(--space-4);
2196
+ padding: 0;
2197
+ list-style: none;
2198
+ }
2199
+
2200
+ .fact-card {
2201
+ display: flex;
2202
+ flex-direction: column;
2203
+ gap: var(--space-1);
2204
+ padding: var(--space-3) var(--space-4);
2205
+ border: 1px solid var(--line);
2206
+ border-radius: 10px;
2207
+ background: var(--page);
2208
+ }
2209
+
2210
+ .spark svg {
2211
+ display: block;
2212
+ inline-size: 100%;
2213
+ block-size: 24px;
2214
+ }
2215
+
2216
+ @media (prefers-reduced-motion: no-preference) {
2217
+ .timeline-bar,
2218
+ .heat-tile button {
2219
+ transition: fill var(--duration) var(--ease), filter var(--duration) var(--ease);
2220
+ }
2221
+ }
2222
+
2223
+ .nowrap {
2224
+ white-space: nowrap;
2225
+ }
2226
+
2227
+ .release-notes {
2228
+ white-space: pre-wrap;
2229
+ overflow-wrap: anywhere;
2230
+ }
2231
+
2232
+ .pills {
2233
+ display: flex;
2234
+ flex-wrap: wrap;
2235
+ gap: var(--space-2);
2236
+ padding: 0;
2237
+ list-style: none;
2238
+ }
2239
+
2240
+ .pill-documented {
2241
+ background: var(--documented-tint);
2242
+ color: var(--accent-text);
2243
+ }
2244
+
2245
+ .metric-table td:not(:first-child),
2246
+ .metric-table th:not(:first-child) {
2247
+ text-align: end;
2248
+ font-variant-numeric: tabular-nums;
2249
+ }
2250
+
2251
+ details.more > summary {
2252
+ color: var(--text-muted);
2253
+ cursor: pointer;
2254
+ }