@abreen/tada 1.17.1 → 1.18.1

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 (111) hide show
  1. package/README.md +38 -7
  2. package/assets/material-symbols/chevron_right_24px.svg +1 -0
  3. package/bin/tada.ts +16 -7
  4. package/bin/validators.ts +33 -0
  5. package/build/branding.ts +41 -0
  6. package/build/build-manifest.ts +9 -4
  7. package/build/{watch/compiler-types.d.ts → build-types.d.ts} +8 -5
  8. package/build/build-validation.ts +176 -0
  9. package/build/bundle.ts +75 -65
  10. package/build/config-loader.ts +3 -3
  11. package/build/custom-fonts.ts +8 -5
  12. package/build/generate-favicon.ts +7 -6
  13. package/build/generate-fonts.ts +8 -15
  14. package/build/generate-katex-assets.ts +19 -17
  15. package/build/generate-web-app-manifest.ts +3 -11
  16. package/build/lodash-template.ts +14 -0
  17. package/build/material-symbols.ts +7 -4
  18. package/build/output-publication.ts +238 -0
  19. package/build/pagefind.ts +49 -21
  20. package/build/pdf-text.ts +41 -1
  21. package/build/pipeline.ts +95 -101
  22. package/build/site-assets.ts +46 -0
  23. package/build/site-build.ts +267 -0
  24. package/build/source-model.ts +223 -244
  25. package/build/source-records.ts +69 -81
  26. package/build/template-globals.ts +3 -0
  27. package/build/templates.ts +5 -2
  28. package/build/toc-plugin.ts +21 -21
  29. package/build/types.d.ts +44 -38
  30. package/build/util.ts +0 -4
  31. package/build/utils/code.ts +38 -101
  32. package/build/utils/final-html.ts +171 -47
  33. package/build/utils/literate-java.ts +11 -7
  34. package/build/utils/markdown-partials.ts +4 -3
  35. package/build/utils/markdown.ts +6 -17
  36. package/build/utils/paths.ts +3 -0
  37. package/build/utils/plain-text.ts +18 -0
  38. package/build/utils/render.ts +227 -165
  39. package/build/utils/shiki-highlighter.ts +11 -0
  40. package/build/utils/source-template.ts +2 -2
  41. package/build/utils/trace-core.ts +8 -83
  42. package/build/utils/trace.ts +38 -95
  43. package/build/validate-config-links.ts +60 -20
  44. package/build/watch/build-incremental.ts +46 -103
  45. package/build/watch/compiler.ts +158 -37
  46. package/build/watch/engine.ts +207 -176
  47. package/build/watch/index.ts +9 -2
  48. package/build/watch/planner.ts +88 -144
  49. package/build/watch/runtime.ts +21 -34
  50. package/build/watch/types.d.ts +32 -64
  51. package/init/content/labs/00/VowelCounter.java.md +5 -2
  52. package/init/content/labs/00/index.md +3 -2
  53. package/init/content/labs/01/index.md +3 -2
  54. package/init/content/labs/02/index.md +3 -2
  55. package/init/content/lectures/01/index.md +3 -2
  56. package/init/content/lectures/02/index.md +3 -2
  57. package/package.json +4 -4
  58. package/schema/site.schema.json +18 -2
  59. package/src/_content.scss +463 -0
  60. package/src/_fonts.scss +90 -0
  61. package/src/_layout.scss +50 -35
  62. package/src/{material-symbols.scss → _material-symbols.scss} +7 -0
  63. package/src/appearance-picker/{style.scss → _index.scss} +1 -1
  64. package/src/code/{style.scss → _index.scss} +61 -0
  65. package/src/header/{_base.scss → _index.scss} +98 -6
  66. package/src/index.ts +1 -17
  67. package/src/navigate/{style.scss → _index.scss} +29 -3
  68. package/src/navigate/breadcrumbs.ts +129 -0
  69. package/src/navigate/eligible.ts +0 -40
  70. package/src/navigate/index.ts +38 -4
  71. package/src/navigate/lifecycle.ts +19 -2
  72. package/src/navigate/runtime.ts +57 -22
  73. package/src/page-update/index.ts +33 -20
  74. package/src/print/{style.scss → _index.scss} +3 -1
  75. package/src/search/index.ts +7 -0
  76. package/src/slides/{style.scss → _index.scss} +5 -0
  77. package/src/style.scss +24 -536
  78. package/src/toc/index.ts +2 -2
  79. package/templates/_author.html +2 -2
  80. package/templates/_download.html +1 -1
  81. package/templates/_footer.html +1 -1
  82. package/templates/_heading.html +17 -4
  83. package/templates/_nav.html +2 -2
  84. package/templates/_page-bottom.html +6 -0
  85. package/templates/_top.html +18 -14
  86. package/templates/code.html +22 -21
  87. package/templates/default.html +12 -11
  88. package/templates/literate.html +6 -5
  89. package/assets/material-symbols/south_east_20px.svg +0 -1
  90. package/build/copy.ts +0 -82
  91. package/build/generate-content-assets.ts +0 -121
  92. package/build/utils/content-files.ts +0 -170
  93. package/build/watch/assets.ts +0 -103
  94. package/build/watch/build-full.ts +0 -97
  95. package/build/watch/build-helpers.ts +0 -66
  96. package/build/watch/build-result.ts +0 -19
  97. package/build/watch/fs-commit.ts +0 -218
  98. package/build/watch/mutations.ts +0 -73
  99. package/build/watch/snapshot.ts +0 -201
  100. package/build/watch/validation.ts +0 -57
  101. package/src/code.scss +0 -60
  102. package/src/critical.scss +0 -5
  103. package/src/header/style.scss +0 -91
  104. /package/src/{literate.scss → _literate.scss} +0 -0
  105. /package/src/anchor/{style.scss → _index.scss} +0 -0
  106. /package/src/page-update/{style.scss → _index.scss} +0 -0
  107. /package/src/question/{style.scss → _index.scss} +0 -0
  108. /package/src/search/{style.scss → _index.scss} +0 -0
  109. /package/src/timezone/{style.scss → _index.scss} +0 -0
  110. /package/src/toc/{style.scss → _index.scss} +0 -0
  111. /package/src/trace/{style.scss → _index.scss} +0 -0
@@ -0,0 +1,463 @@
1
+ @use 'mixins' as *;
2
+
3
+ ::selection {
4
+ color: var(--bg-color);
5
+ background: var(--fg-color);
6
+ }
7
+
8
+ :focus-visible {
9
+ outline: 2px solid var(--theme-color);
10
+ outline-offset: 1px;
11
+ }
12
+
13
+ a.disabled {
14
+ color: var(--fg-color-translucent);
15
+ text-decoration-color: var(--fg-color-translucent);
16
+ cursor: not-allowed;
17
+
18
+ @media (hover: hover) {
19
+ &:hover {
20
+ color: var(--fg-color-translucent);
21
+ text-decoration-line: none;
22
+ }
23
+ }
24
+ }
25
+
26
+ .external-link-tail {
27
+ white-space: nowrap;
28
+ }
29
+
30
+ .external-link-tail::after,
31
+ a.external:not(:has(.external-link-tail))::after {
32
+ vertical-align: text-top;
33
+
34
+ @include contained-mask(var(--icon-external-link));
35
+ }
36
+
37
+ .external-link-tail::after {
38
+ display: inline;
39
+
40
+ // With zero font metrics, block-end padding paints down from text-top.
41
+ padding-block-end: var(--icon-external-link-size);
42
+ padding-inline-start: var(--icon-external-link-size);
43
+ font-size: 0;
44
+ line-height: 0;
45
+ content: '\2060' / '';
46
+ }
47
+
48
+ a.external:not(:has(.external-link-tail))::after {
49
+ display: inline-block;
50
+ width: var(--icon-external-link-size);
51
+ height: var(--icon-external-link-size);
52
+ content: '';
53
+ }
54
+
55
+ .footnotes {
56
+ padding-top: 32px;
57
+ margin-top: calc(var(--thematic-break-margin) / 2);
58
+ font-size: 0.9em;
59
+ border-top: 3px solid var(--bg2-color);
60
+ }
61
+
62
+ .footnotes .title {
63
+ @include user-select(none);
64
+
65
+ font-size: larger;
66
+ font-weight: 700;
67
+ }
68
+
69
+ .footnotes p {
70
+ margin: 0;
71
+ }
72
+
73
+ .footnotes li {
74
+ margin-bottom: 8px;
75
+ }
76
+
77
+ a.footnote-ref {
78
+ font-size: 0.8em;
79
+ vertical-align: super;
80
+ border-bottom: none;
81
+ }
82
+
83
+ .footnote-item {
84
+ &:target {
85
+ outline: 2px solid var(--theme-color);
86
+ outline-offset: 1px;
87
+ }
88
+ }
89
+
90
+ a.footnote-ref,
91
+ .footnotes .footnote-backref {
92
+ display: inline-block;
93
+
94
+ @include user-select(none);
95
+ }
96
+
97
+ hr {
98
+ display: flex;
99
+ align-items: center;
100
+ justify-content: center;
101
+ height: 32px;
102
+ margin: var(--section-padding) 0;
103
+ border: none;
104
+ }
105
+
106
+ hr::after {
107
+ display: block;
108
+ width: 160px;
109
+ height: 12px;
110
+ content: '';
111
+ background-color: var(--fg2-color);
112
+ mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 12'><rect x='0' y='5.5' width='96' height='1' fill='black'/><path d='M 64,6 C 71,6 80,4.5 80,1 C 80,4.5 89,6 96,6 C 89,6 80,7.5 80,11 C 80,7.5 71,6 64,6 Z' fill='black'/><rect x='64' y='5.5' width='96' height='1' fill='black'/></svg>");
113
+ mask-repeat: no-repeat;
114
+ mask-size: 100% 100%;
115
+ }
116
+
117
+ button,
118
+ a.button,
119
+ input[type='submit'] {
120
+ padding: 0.25em 0.66em;
121
+ font-family: var(--font);
122
+ font-size: var(--font-size-small);
123
+ font-weight: 500;
124
+ color: var(--fg-color);
125
+ text-decoration: none;
126
+ background: var(--bg-color);
127
+ border: var(--control-border-width) solid var(--fg2-color);
128
+ border-radius: var(--border-radius);
129
+ }
130
+
131
+ button:disabled,
132
+ input[type='submit']:disabled {
133
+ cursor: not-allowed;
134
+ opacity: 0.4;
135
+ }
136
+
137
+ button:active:not(:disabled),
138
+ a.button:not(.disabled):active,
139
+ input[type='submit']:active:not(:disabled) {
140
+ color: var(--bg-color) !important;
141
+ background: var(--link-active-color) !important;
142
+ }
143
+
144
+ @media (hover: hover) {
145
+ button:hover:not(:disabled),
146
+ a.button:not(.disabled):hover,
147
+ input[type='submit']:hover:not(:disabled) {
148
+ cursor: pointer;
149
+ background: var(--bg2-color);
150
+ }
151
+ }
152
+
153
+ button:focus,
154
+ a.button:focus,
155
+ input[type='submit']:focus,
156
+ input[type='text']:focus,
157
+ input[type='search']:focus,
158
+ select:focus {
159
+ outline: 2px solid var(--theme-color);
160
+ outline-offset: 1px;
161
+ background-color: var(--bg2-color);
162
+ border-color: var(--fg-color);
163
+ }
164
+
165
+ button.icon-button {
166
+ display: inline-flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ width: 30px;
170
+ height: 30px;
171
+ padding: 0;
172
+ font-style: normal;
173
+ font-weight: 400;
174
+ vertical-align: top;
175
+ border: none;
176
+ border-radius: 999px;
177
+ }
178
+
179
+ button.icon-button:focus {
180
+ background-color: var(--bg2-color);
181
+ }
182
+
183
+ ol.styled-list,
184
+ ul.styled-list {
185
+ font-weight: 700;
186
+ color: var(--theme-color-text);
187
+ }
188
+
189
+ ul.styled-list {
190
+ // Make bullet points slightly bigger
191
+ font-size: 1.2em;
192
+ }
193
+
194
+ ol li .styled-list-item {
195
+ font-size: 1em;
196
+ font-weight: var(--font-weight);
197
+ color: var(--fg-color);
198
+ }
199
+
200
+ ul li .styled-list-item {
201
+ font-size: 0.8333em;
202
+ font-weight: var(--font-weight);
203
+ color: var(--fg-color);
204
+ }
205
+
206
+ ul {
207
+ list-style-type: square;
208
+ }
209
+
210
+ ul ul {
211
+ list-style-type: disc;
212
+ }
213
+
214
+ ul ul ul {
215
+ list-style-type: circle;
216
+ }
217
+
218
+ ul ul ul ul {
219
+ list-style-type: square;
220
+ }
221
+
222
+ ol {
223
+ list-style-type: decimal;
224
+ }
225
+
226
+ :root[data-font-preference='serif'] ol > li::marker {
227
+ font-variant-numeric: oldstyle-nums;
228
+ }
229
+
230
+ ol ol {
231
+ list-style-type: lower-alpha;
232
+ }
233
+
234
+ ol ol ol {
235
+ list-style-type: lower-roman;
236
+ }
237
+
238
+ ol ol ol ol {
239
+ list-style-type: decimal;
240
+ }
241
+
242
+ ol ol ol ol ol {
243
+ list-style-type: lower-alpha;
244
+ }
245
+
246
+ table {
247
+ margin: 1rem 0;
248
+ overflow: scroll;
249
+ font-size: var(--font-size-smaller);
250
+ border-collapse: collapse;
251
+ }
252
+
253
+ thead {
254
+ text-align: left;
255
+ }
256
+
257
+ th,
258
+ td {
259
+ border-bottom: 1px solid var(--fg-color);
260
+ }
261
+
262
+ th {
263
+ font-weight: 600;
264
+ color: var(--theme-color-text);
265
+ }
266
+
267
+ th,
268
+ td {
269
+ padding: var(--table-padding) var(--table-padding) var(--table-padding) 0;
270
+ vertical-align: top;
271
+ text-align: left;
272
+ }
273
+
274
+ tbody tr:last-child td {
275
+ border-bottom: none;
276
+ }
277
+
278
+ section {
279
+ padding: calc(5 * var(--gap)) calc(2 * var(--gap));
280
+ margin: 0 calc(-1 * var(--gap)) 2rem;
281
+ background: linear-gradient(
282
+ 0deg,
283
+ transparent 0,
284
+ var(--bg2-color) 3rem,
285
+ var(--bg2-color) calc(100% - 3rem),
286
+ transparent 100%
287
+ );
288
+
289
+ .alert {
290
+ background: var(--bg-color);
291
+ }
292
+ }
293
+
294
+ section h2:first-child,
295
+ section h3:first-child,
296
+ section h4:first-child,
297
+ section h5:first-child,
298
+ section h6:first-child {
299
+ font-style: italic;
300
+ font-weight: 600;
301
+ }
302
+
303
+ section > p:last-child,
304
+ section > div:last-child {
305
+ margin-bottom: 0;
306
+ }
307
+
308
+ section > h2 + p {
309
+ margin-top: 16px;
310
+ }
311
+
312
+ blockquote {
313
+ font-size: 1.2em;
314
+ font-style: italic;
315
+ color: var(--fg-color);
316
+ }
317
+
318
+ .heading-subtitle {
319
+ font-style: italic;
320
+ }
321
+
322
+ h1 .heading-subtitle,
323
+ h2 .heading-subtitle,
324
+ h3 .heading-subtitle,
325
+ h4 .heading-subtitle,
326
+ h5 .heading-subtitle,
327
+ h6 .heading-subtitle {
328
+ margin-left: 1rem;
329
+ font-weight: 400;
330
+ }
331
+
332
+ h3.has-subtitle,
333
+ h4.has-subtitle,
334
+ h5.has-subtitle,
335
+ h6.has-subtitle {
336
+ padding-bottom: 0.5em;
337
+ margin-top: 6rem;
338
+ margin-bottom: 0.5em;
339
+ border-bottom: 1px solid var(--fg-color);
340
+ }
341
+
342
+ .small-caps {
343
+ margin-right: -0.05em;
344
+ font-variant-caps: all-small-caps;
345
+ font-synthesis-small-caps: none;
346
+ text-transform: uppercase;
347
+ letter-spacing: 0.05em;
348
+ }
349
+
350
+ dl {
351
+ dt {
352
+ font-weight: 600;
353
+ color: var(--theme-color-text);
354
+ }
355
+
356
+ dd > *:first-child {
357
+ margin-top: 0;
358
+ }
359
+ }
360
+
361
+ dfn {
362
+ font-style: italic;
363
+ font-weight: 500;
364
+ color: var(--theme-color-text);
365
+ }
366
+
367
+ .breadcrumbs {
368
+ ol {
369
+ display: flex;
370
+ flex-wrap: wrap;
371
+ gap: 0.25em;
372
+ padding: 0;
373
+ margin: 0;
374
+ list-style: none;
375
+ }
376
+
377
+ li {
378
+ display: flex;
379
+ gap: 0.25em;
380
+ align-items: center;
381
+ min-width: 0;
382
+ overflow-wrap: anywhere;
383
+ }
384
+
385
+ a {
386
+ @include subdued-link;
387
+ }
388
+
389
+ [aria-current='page'] {
390
+ font-style: italic;
391
+ }
392
+
393
+ .material-symbol-icon {
394
+ flex-shrink: 0;
395
+ }
396
+ }
397
+
398
+ img {
399
+ max-width: 100%;
400
+ }
401
+
402
+ .avatar {
403
+ max-width: 100px;
404
+ aspect-ratio: 1 / 1;
405
+ object-fit: cover;
406
+ border-radius: 999px;
407
+ }
408
+
409
+ figure.bio {
410
+ float: left;
411
+ max-width: 125px;
412
+ margin: 1rem 1rem 1rem 0;
413
+
414
+ @media (width > 540px) {
415
+ max-width: 200px;
416
+ }
417
+
418
+ .avatar {
419
+ display: block;
420
+ width: 100%;
421
+ max-width: 100%;
422
+ }
423
+
424
+ figcaption {
425
+ margin-top: var(--gap);
426
+ font-style: italic;
427
+ text-align: center;
428
+ }
429
+ }
430
+
431
+ kbd {
432
+ display: inline-block;
433
+ padding: 1px 5px;
434
+ font-family: var(--font);
435
+ font-size: var(--font-size-small);
436
+ font-weight: 500;
437
+ border: 1px solid var(--fg-color);
438
+ border-radius: 4px;
439
+ box-shadow: 0 2px 0 var(--fg-color);
440
+ }
441
+
442
+ select {
443
+ position: relative;
444
+ padding: 4px;
445
+ font-family: var(--font);
446
+ font-size: inherit;
447
+ color: var(--fg-color);
448
+ background: var(--bg-color);
449
+ border: var(--control-border-width) solid var(--fg2-color);
450
+ border-radius: var(--border-radius);
451
+ }
452
+
453
+ // Shiki dual-theme support (defaultColor: false, CSS custom properties only,
454
+ // no inline color/background-color, so no !important needed)
455
+ .shiki span {
456
+ color: var(--shiki-light);
457
+ }
458
+
459
+ @media (prefers-color-scheme: dark) {
460
+ .shiki span {
461
+ color: var(--shiki-dark);
462
+ }
463
+ }
@@ -0,0 +1,90 @@
1
+ @use 'config/theme';
2
+ @include theme.custom-font-faces;
3
+ @include theme.custom-font-tuning;
4
+
5
+ @font-face {
6
+ font-family: Inter;
7
+ font-style: normal;
8
+ font-weight: 100 900;
9
+ src: url('inter/InterVariable.woff2') format('woff2');
10
+ font-display: swap;
11
+ }
12
+
13
+ @font-face {
14
+ font-family: Inter;
15
+ font-style: italic;
16
+ font-weight: 100 900;
17
+ src: url('inter/InterVariable-Italic.woff2') format('woff2');
18
+ font-display: swap;
19
+ }
20
+
21
+ @font-face {
22
+ font-family: 'Google Sans Code';
23
+ font-style: normal;
24
+ font-weight: 300 800;
25
+ src: url('google-sans-code/GoogleSansCodeVariable.woff2') format('woff2');
26
+ font-display: swap;
27
+ }
28
+
29
+ @font-face {
30
+ font-family: 'Google Sans Code';
31
+ font-style: italic;
32
+ font-weight: 300 800;
33
+ src: url('google-sans-code/GoogleSansCodeVariable-Italic.woff2')
34
+ format('woff2');
35
+ font-display: swap;
36
+ }
37
+
38
+ @font-face {
39
+ font-family: 'Source Serif 4';
40
+ font-style: normal;
41
+ font-weight: 200 900;
42
+ src: url('source-serif-4/SourceSerif4-VariableFont_opsz,wght.woff2')
43
+ format('woff2');
44
+ font-display: swap;
45
+ }
46
+
47
+ @font-face {
48
+ font-family: 'Source Serif 4';
49
+ font-style: italic;
50
+ font-weight: 200 900;
51
+ src: url('source-serif-4/SourceSerif4-Italic-VariableFont_opsz,wght.woff2')
52
+ format('woff2');
53
+ font-display: swap;
54
+ }
55
+
56
+ @font-face {
57
+ font-family: 'Courier Prime';
58
+ font-style: normal;
59
+ font-weight: 400;
60
+ src: url('courier-prime/CourierPrime-Regular.woff2') format('woff2');
61
+ font-display: swap;
62
+ size-adjust: 106.383%;
63
+ }
64
+
65
+ @font-face {
66
+ font-family: 'Courier Prime';
67
+ font-style: italic;
68
+ font-weight: 400;
69
+ src: url('courier-prime/CourierPrime-Italic.woff2') format('woff2');
70
+ font-display: swap;
71
+ size-adjust: 106.383%;
72
+ }
73
+
74
+ @font-face {
75
+ font-family: 'Courier Prime';
76
+ font-style: normal;
77
+ font-weight: 700;
78
+ src: url('courier-prime/CourierPrime-Bold.woff2') format('woff2');
79
+ font-display: swap;
80
+ size-adjust: 106.383%;
81
+ }
82
+
83
+ @font-face {
84
+ font-family: 'Courier Prime';
85
+ font-style: italic;
86
+ font-weight: 700;
87
+ src: url('courier-prime/CourierPrime-BoldItalic.woff2') format('woff2');
88
+ font-display: swap;
89
+ size-adjust: 106.383%;
90
+ }
package/src/_layout.scss CHANGED
@@ -18,14 +18,53 @@ body {
18
18
 
19
19
  body > .container {
20
20
  position: relative;
21
+ box-sizing: border-box;
22
+ display: flex;
23
+ flex-direction: column;
24
+ min-height: calc(100dvh - var(--header-collapsed-height) - var(--gap));
21
25
  padding: 0 var(--gap);
22
26
  margin-top: calc(var(--header-collapsed-height) + var(--gap));
23
27
  }
24
28
 
29
+ .main-content {
30
+ display: grid;
31
+ flex: 1;
32
+ grid-template-areas: 'heading' 'toc' 'body';
33
+ grid-template-rows: auto auto 1fr;
34
+ width: 100%;
35
+ }
36
+
37
+ .main-content > .title-and-info {
38
+ grid-area: heading;
39
+ }
40
+
41
+ .main-content > nav.toc {
42
+ grid-area: toc;
43
+ }
44
+
25
45
  .body {
46
+ display: flex;
47
+ flex-direction: column;
48
+ grid-area: body;
49
+ gap: 6em;
50
+ min-width: 0;
26
51
  padding-bottom: 2rem;
27
52
  }
28
53
 
54
+ .page-content {
55
+ display: flow-root;
56
+ flex-shrink: 0;
57
+ min-width: 0;
58
+ }
59
+
60
+ .page-bottom {
61
+ display: flex;
62
+ flex-shrink: 0;
63
+ flex-direction: column;
64
+ gap: 1rem;
65
+ margin-top: auto;
66
+ }
67
+
29
68
  body.default .title-and-info,
30
69
  body.default nav.toc,
31
70
  body.literate .title-and-info,
@@ -45,7 +84,7 @@ body.default .title-and-info {
45
84
  border-bottom: 1px solid var(--fg2-color);
46
85
  }
47
86
 
48
- body.default main > *:first-child {
87
+ body.default .page-content > *:first-child {
49
88
  margin-top: 0;
50
89
  }
51
90
 
@@ -55,23 +94,6 @@ body.literate main table {
55
94
  }
56
95
 
57
96
  @media (width < 900px) {
58
- .toc-is-active .main-content {
59
- display: flex;
60
- flex-direction: column;
61
- }
62
-
63
- .toc-is-active .main-content > .title-and-info {
64
- order: 0;
65
- }
66
-
67
- .toc-is-active .main-content > nav.toc {
68
- order: 1;
69
- }
70
-
71
- .toc-is-active .main-content > .body {
72
- order: 2;
73
- }
74
-
75
97
  body.default.toc-is-active nav.toc,
76
98
  body.literate.toc-is-active nav.toc {
77
99
  padding: var(--gap);
@@ -97,36 +119,26 @@ body.literate main table {
97
119
  }
98
120
 
99
121
  .toc-is-active .main-content {
100
- display: flex;
101
- flex-wrap: wrap;
122
+ grid-template:
123
+ 'heading heading' auto
124
+ 'toc body' 1fr / var(--toc-width) minmax(0, 1fr);
102
125
  gap: 0 var(--gap);
103
126
  }
104
127
 
105
- .toc-is-active .main-content > .title-and-info {
106
- flex: 0 0 100%;
107
- }
108
-
109
- .toc-is-active .main-content > .body {
110
- flex: 1;
111
- order: 1;
112
- min-width: 0;
113
- }
114
-
115
128
  body.toc-is-active nav.toc {
116
129
  position: sticky;
117
130
  top: var(--header-collapsed-height);
118
131
  box-sizing: border-box;
119
- flex-shrink: 0;
120
- align-self: flex-start;
132
+ align-self: start;
121
133
  width: var(--toc-width);
122
- height: calc(100vh - var(--header-collapsed-height));
134
+ max-height: calc(100vh - var(--header-collapsed-height));
123
135
  margin-bottom: 0;
124
136
  overflow-y: auto;
125
137
  }
126
138
 
127
139
  body.code.toc-is-active nav.toc {
128
140
  top: calc(var(--header-collapsed-height) + var(--gap));
129
- height: calc(100vh - var(--header-collapsed-height) - var(--gap));
141
+ max-height: calc(100vh - var(--header-collapsed-height) - var(--gap));
130
142
  }
131
143
  }
132
144
 
@@ -203,10 +215,13 @@ body.literate main table {
203
215
  footer {
204
216
  @include user-select(none);
205
217
 
206
- padding: 2rem 0 1rem;
207
218
  color: var(--fg2-color);
208
219
  text-align: center;
209
220
 
221
+ p {
222
+ margin: 0;
223
+ }
224
+
210
225
  a {
211
226
  color: var(--fg2-color);
212
227
  text-decoration: none;
@@ -22,3 +22,10 @@
22
22
  --material-symbol-icon: var(--icon-contrast-high);
23
23
  --material-symbol-icon-size: var(--icon-contrast-high-size);
24
24
  }
25
+
26
+ .material-symbol-icon-breadcrumb-separator {
27
+ --material-symbol-icon: var(--icon-breadcrumb-separator);
28
+ --material-symbol-icon-size: var(--icon-breadcrumb-separator-size);
29
+
30
+ color: var(--fg2-color);
31
+ }
@@ -4,7 +4,7 @@
4
4
  display: flex;
5
5
  gap: 0.5rem;
6
6
  justify-content: center;
7
- margin: 2rem auto 1rem;
7
+ margin: 0;
8
8
  }
9
9
 
10
10
  .preference-picker {