explico 0.1.0

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 (113) hide show
  1. package/README.md +108 -0
  2. package/dist/analytics/AnalyticsEmitter.d.ts +22 -0
  3. package/dist/analytics/AnalyticsEmitter.js +5 -0
  4. package/dist/compiler/cli.d.ts +189 -0
  5. package/dist/compiler/cli.js +552 -0
  6. package/dist/compiler/collections.d.ts +70 -0
  7. package/dist/compiler/collections.js +383 -0
  8. package/dist/compiler/course-config.d.ts +31 -0
  9. package/dist/compiler/course-config.js +0 -0
  10. package/dist/compiler/lesson-derivation.d.ts +89 -0
  11. package/dist/compiler/lesson-derivation.js +91 -0
  12. package/dist/compiler/manifest.d.ts +178 -0
  13. package/dist/compiler/manifest.js +345 -0
  14. package/dist/compiler/resolution-report.d.ts +45 -0
  15. package/dist/compiler/resolution-report.js +97 -0
  16. package/dist/curriculum/validation.d.ts +76 -0
  17. package/dist/curriculum/validation.js +320 -0
  18. package/dist/progress/ProgressRepository.d.ts +53 -0
  19. package/dist/progress/ProgressRepository.js +12 -0
  20. package/dist/reference/base-library.mjs +27 -0
  21. package/dist/reference/citation-format.mjs +133 -0
  22. package/dist/reference/consistency.d.ts +64 -0
  23. package/dist/reference/consistency.js +234 -0
  24. package/dist/reference/curriculum-alignment.d.ts +7 -0
  25. package/dist/reference/curriculum-alignment.js +166 -0
  26. package/dist/reference/equations-validate.d.ts +50 -0
  27. package/dist/reference/equations-validate.js +90 -0
  28. package/dist/reference/equations.mjs +144 -0
  29. package/dist/reference/gate-math.d.ts +41 -0
  30. package/dist/reference/gate-math.js +151 -0
  31. package/dist/reference/katex-options.mjs +91 -0
  32. package/dist/reference/lab-math-scope.d.ts +21 -0
  33. package/dist/reference/lab-math-scope.js +28 -0
  34. package/dist/reference/label.d.ts +11 -0
  35. package/dist/reference/label.js +38 -0
  36. package/dist/reference/lint-ignore.d.ts +32 -0
  37. package/dist/reference/lint-ignore.js +39 -0
  38. package/dist/reference/math-glyphs.mjs +830 -0
  39. package/dist/reference/prose.d.ts +15 -0
  40. package/dist/reference/prose.js +12 -0
  41. package/dist/reference/references.d.ts +17 -0
  42. package/dist/reference/references.js +42 -0
  43. package/dist/reference/registry.d.ts +6 -0
  44. package/dist/reference/registry.js +548 -0
  45. package/dist/reference/rehype-fail-katex-errors.mjs +55 -0
  46. package/dist/reference/remark-citation.mjs +0 -0
  47. package/dist/reference/remark-notation.mjs +753 -0
  48. package/dist/reference/render-lab-math.d.ts +21 -0
  49. package/dist/reference/render-lab-math.js +58 -0
  50. package/dist/reference/types.d.ts +151 -0
  51. package/dist/reference/types.js +0 -0
  52. package/dist/reference/units-vocab.d.ts +26 -0
  53. package/dist/reference/units-vocab.js +119 -0
  54. package/dist/session/PreferenceStore.d.ts +28 -0
  55. package/dist/session/PreferenceStore.js +30 -0
  56. package/dist/session/user-context.d.ts +7 -0
  57. package/dist/session/user-context.js +10 -0
  58. package/dist/session/user.d.ts +21 -0
  59. package/dist/session/user.js +8 -0
  60. package/package.json +53 -0
  61. package/src/analytics/AnalyticsEmitter.ts +23 -0
  62. package/src/compiler/cli.ts +866 -0
  63. package/src/compiler/collections.ts +554 -0
  64. package/src/compiler/course-config.ts +32 -0
  65. package/src/compiler/lesson-derivation.ts +186 -0
  66. package/src/compiler/manifest.ts +601 -0
  67. package/src/compiler/resolution-report.ts +150 -0
  68. package/src/components/CurriculumMap.astro +208 -0
  69. package/src/components/HoverPanel.astro +67 -0
  70. package/src/components/assessments/AssessmentRunner.tsx +320 -0
  71. package/src/components/assessments/AssessmentSet.astro +54 -0
  72. package/src/components/citation/CitationLayer.astro +173 -0
  73. package/src/components/examples/CompactExample.astro +34 -0
  74. package/src/components/examples/CompactExamples.astro +253 -0
  75. package/src/components/hover-panel.ts +273 -0
  76. package/src/components/notation/NotationGlossary.astro +412 -0
  77. package/src/components/notation/NotationLayer.astro +594 -0
  78. package/src/components/notation/NotationMath.astro +24 -0
  79. package/src/components/notation/SafeMathNode.astro +23 -0
  80. package/src/components/notation/render-notation-math.ts +223 -0
  81. package/src/components/starlight/EquationEnhancer.astro +72 -0
  82. package/src/components/starlight/LayoutHeader.astro +102 -0
  83. package/src/components/starlight/LayoutPageSidebar.astro +33 -0
  84. package/src/components/starlight/LayoutSidebar.astro +29 -0
  85. package/src/components/starlight/LessonFooter.astro +58 -0
  86. package/src/content-config.ts +259 -0
  87. package/src/curriculum/validation.ts +481 -0
  88. package/src/progress/ProgressRepository.ts +64 -0
  89. package/src/reference/base-library.mjs +27 -0
  90. package/src/reference/citation-format.mjs +133 -0
  91. package/src/reference/consistency.ts +375 -0
  92. package/src/reference/curriculum-alignment.ts +228 -0
  93. package/src/reference/equations-validate.ts +167 -0
  94. package/src/reference/equations.mjs +144 -0
  95. package/src/reference/gate-math.ts +250 -0
  96. package/src/reference/katex-options.mjs +91 -0
  97. package/src/reference/lab-math-scope.ts +54 -0
  98. package/src/reference/label.ts +47 -0
  99. package/src/reference/lint-ignore.ts +75 -0
  100. package/src/reference/math-glyphs.mjs +830 -0
  101. package/src/reference/prose.ts +21 -0
  102. package/src/reference/references.ts +82 -0
  103. package/src/reference/registry.ts +723 -0
  104. package/src/reference/rehype-fail-katex-errors.mjs +55 -0
  105. package/src/reference/remark-citation.mjs +0 -0
  106. package/src/reference/remark-notation.mjs +753 -0
  107. package/src/reference/render-lab-math.ts +99 -0
  108. package/src/reference/types.ts +182 -0
  109. package/src/reference/units-vocab.ts +143 -0
  110. package/src/session/PreferenceStore.ts +54 -0
  111. package/src/session/user-context.ts +18 -0
  112. package/src/session/user.ts +24 -0
  113. package/src/styles/global.css +763 -0
@@ -0,0 +1,763 @@
1
+ @import 'katex/dist/katex.min.css';
2
+
3
+ :root {
4
+ --sl-color-accent-low: #132f2a;
5
+ --sl-color-accent: #31b48d;
6
+ --sl-color-accent-high: #b8f2df;
7
+ --sl-content-width: 52rem;
8
+ }
9
+
10
+ :root[data-theme='light'] {
11
+ --sl-color-accent-low: #d9f4e9;
12
+ --sl-color-accent: #08775b;
13
+ --sl-color-accent-high: #123c32;
14
+ }
15
+
16
+ .lab-shell {
17
+ margin-block: 1.5rem;
18
+ padding: clamp(1rem, 3vw, 1.5rem);
19
+ border: 1px solid var(--sl-color-gray-5);
20
+ border-radius: 0.75rem;
21
+ background: var(--sl-color-gray-7);
22
+ }
23
+
24
+ .lab-shell label,
25
+ .lab-shell output {
26
+ font-variant-numeric: tabular-nums;
27
+ }
28
+
29
+ .lab-shell input,
30
+ .lab-shell select {
31
+ font: inherit;
32
+ }
33
+
34
+ .lab-shell input[type='number'],
35
+ .lab-shell select {
36
+ min-height: 2.5rem;
37
+ padding-inline: 0.5rem;
38
+ color: var(--sl-color-text);
39
+ border: 1px solid var(--sl-color-gray-4);
40
+ border-radius: 0.35rem;
41
+ background: var(--sl-color-bg);
42
+ }
43
+
44
+ .lab-shell input[type='range'] {
45
+ width: 100%;
46
+ min-height: 2.5rem;
47
+ accent-color: var(--sl-color-accent);
48
+ }
49
+
50
+ .lab-shell :focus-visible {
51
+ outline: 3px solid var(--sl-color-accent);
52
+ outline-offset: 2px;
53
+ }
54
+
55
+ .lab-control label {
56
+ display: flex;
57
+ flex-wrap: wrap;
58
+ justify-content: space-between;
59
+ gap: 0.25rem 1rem;
60
+ }
61
+
62
+ .lab-field-value {
63
+ font-weight: 600;
64
+ font-variant-numeric: tabular-nums;
65
+ color: var(--sl-color-text);
66
+ }
67
+
68
+ /* Clip only the inline axis: `overflow-x: auto` alone makes the block axis
69
+ compute to `auto` too, which adds a spurious vertical scrollbar around
70
+ display math. */
71
+ .lab-math {
72
+ margin-block: 1.25rem;
73
+ padding-block: 0.15rem;
74
+ overflow-x: auto;
75
+ overflow-y: hidden;
76
+ }
77
+
78
+ .lab-math .katex-display {
79
+ margin-block: 0;
80
+ text-align: start;
81
+ }
82
+
83
+ /* Long lesson equations must scroll inside the content column instead of
84
+ widening the entire page. This also contains KaTeX's visually hidden MathML
85
+ tree, whose intrinsic width can otherwise affect narrow viewports. */
86
+ .sl-markdown-content .katex-display {
87
+ max-width: 100%;
88
+ overflow-x: auto;
89
+ overflow-y: hidden;
90
+ }
91
+
92
+ .lab-chart-figure {
93
+ margin: 1.25rem 0;
94
+ }
95
+
96
+ .lab-chart-figure figcaption {
97
+ margin-top: 0.5rem;
98
+ font-size: 0.85rem;
99
+ color: var(--sl-color-gray-2);
100
+ }
101
+
102
+ .lab-controls {
103
+ display: grid;
104
+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
105
+ gap: 1rem;
106
+ }
107
+
108
+ .lab-control {
109
+ display: grid;
110
+ gap: 0.35rem;
111
+ }
112
+
113
+ .lab-result {
114
+ margin-block: 1.25rem;
115
+ padding: 1rem;
116
+ border-left: 0.3rem solid var(--sl-color-accent);
117
+ background: var(--sl-color-bg);
118
+ }
119
+
120
+ .lab-metric-grid {
121
+ display: grid;
122
+ grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
123
+ gap: 0.85rem 1.25rem;
124
+ margin: 0;
125
+ }
126
+
127
+ .lab-metric-grid div {
128
+ min-width: 0;
129
+ }
130
+
131
+ .lab-metric-grid dt {
132
+ color: var(--sl-color-gray-2);
133
+ font-size: var(--sl-text-sm);
134
+ }
135
+
136
+ .lab-metric-grid dd {
137
+ margin: 0.2rem 0 0;
138
+ font-weight: 700;
139
+ font-variant-numeric: tabular-nums;
140
+ }
141
+
142
+ .lab-checkbox-control {
143
+ align-content: center;
144
+ }
145
+
146
+ .lab-checkbox-control label {
147
+ justify-content: flex-start;
148
+ align-items: center;
149
+ }
150
+
151
+ .lab-checkbox-control input {
152
+ inline-size: 1.2rem;
153
+ block-size: 1.2rem;
154
+ flex: none;
155
+ accent-color: var(--sl-color-accent);
156
+ }
157
+
158
+ .lab-model-note {
159
+ margin-block: 1rem;
160
+ padding: 0.85rem 1rem;
161
+ border: 1px solid var(--sl-color-gray-5);
162
+ border-radius: 0.5rem;
163
+ background: var(--sl-color-bg);
164
+ }
165
+
166
+ .lab-model-note h4 {
167
+ margin-block-start: 0;
168
+ }
169
+
170
+ .lab-chart {
171
+ overflow-x: auto;
172
+ min-height: 18rem;
173
+ }
174
+
175
+ .lab-chart svg {
176
+ max-width: 100%;
177
+ height: auto;
178
+ color: var(--sl-color-text);
179
+ background: var(--sl-color-bg);
180
+ }
181
+
182
+ .cds-leg-chart:empty {
183
+ display: none;
184
+ }
185
+
186
+ .lab-table-scroll {
187
+ max-width: 100%;
188
+ overflow-x: auto;
189
+ border: 1px solid var(--sl-color-gray-5);
190
+ border-radius: 0.5rem;
191
+ }
192
+
193
+ .lab-table-scroll:focus-visible {
194
+ outline: 3px solid var(--sl-color-accent);
195
+ outline-offset: 2px;
196
+ }
197
+
198
+ .lab-data-table {
199
+ width: 100%;
200
+ font-variant-numeric: tabular-nums;
201
+ }
202
+
203
+ .lab-table-scroll .lab-data-table {
204
+ min-width: 64rem;
205
+ margin: 0;
206
+ }
207
+
208
+ .assessment-shell {
209
+ margin-block: 1.5rem;
210
+ padding: clamp(1rem, 3vw, 1.5rem);
211
+ border: 1px solid var(--sl-color-gray-5);
212
+ border-radius: 0.75rem;
213
+ background: var(--sl-color-gray-7);
214
+ }
215
+
216
+ .assessment-shell :focus-visible {
217
+ outline: 3px solid var(--sl-color-accent);
218
+ outline-offset: 2px;
219
+ }
220
+
221
+ .assessment-header {
222
+ display: flex;
223
+ flex-wrap: wrap;
224
+ align-items: baseline;
225
+ justify-content: space-between;
226
+ gap: 0.5rem 1rem;
227
+ margin-bottom: 1rem;
228
+ }
229
+
230
+ .assessment-header h3 {
231
+ margin: 0;
232
+ }
233
+
234
+ .assessment-progress {
235
+ margin: 0;
236
+ font-size: 0.85rem;
237
+ font-variant-numeric: tabular-nums;
238
+ color: var(--sl-color-gray-2);
239
+ }
240
+
241
+ .assessment-list {
242
+ list-style: none;
243
+ margin: 0;
244
+ padding: 0;
245
+ display: grid;
246
+ gap: 0.75rem;
247
+ }
248
+
249
+ .assessment-item {
250
+ border: 1px solid var(--sl-color-gray-5);
251
+ border-radius: 0.5rem;
252
+ background: var(--sl-color-bg);
253
+ }
254
+
255
+ .assessment-item-heading {
256
+ margin: 0;
257
+ font-size: 1rem;
258
+ font-weight: 400;
259
+ line-height: 1.4;
260
+ }
261
+
262
+ .assessment-disclosure {
263
+ display: flex;
264
+ align-items: center;
265
+ gap: 0.6rem;
266
+ width: 100%;
267
+ padding: 0.75rem 1rem;
268
+ font: inherit;
269
+ text-align: start;
270
+ color: var(--sl-color-text);
271
+ background: none;
272
+ border: 0;
273
+ border-radius: 0.5rem;
274
+ cursor: pointer;
275
+ }
276
+
277
+ .assessment-item-title {
278
+ font-weight: 600;
279
+ }
280
+
281
+ .assessment-status {
282
+ margin-inline-start: auto;
283
+ font-size: 0.78rem;
284
+ font-weight: 600;
285
+ color: var(--sl-color-gray-2);
286
+ }
287
+
288
+ .assessment-status.is-correct {
289
+ color: var(--sl-color-accent);
290
+ }
291
+
292
+ .assessment-chevron {
293
+ flex: none;
294
+ transition: transform 0.15s ease;
295
+ }
296
+
297
+ .assessment-disclosure[aria-expanded='true'] .assessment-chevron {
298
+ transform: rotate(180deg);
299
+ }
300
+
301
+ .assessment-panel {
302
+ padding: 0 1rem 1rem;
303
+ border-top: 1px solid var(--sl-color-gray-5);
304
+ }
305
+
306
+ .assessment-prompt {
307
+ margin-block: 0.85rem 1rem;
308
+ font-weight: 600;
309
+ }
310
+
311
+ .assessment-choices {
312
+ margin: 0;
313
+ padding: 0;
314
+ border: 0;
315
+ }
316
+
317
+ .assessment-option {
318
+ display: flex;
319
+ gap: 0.5rem;
320
+ align-items: baseline;
321
+ padding: 0.35rem 0;
322
+ }
323
+
324
+ .assessment-numeric {
325
+ display: grid;
326
+ gap: 0.5rem;
327
+ }
328
+
329
+ .assessment-numeric input[type='number'] {
330
+ font: inherit;
331
+ min-height: 2.5rem;
332
+ max-width: 12rem;
333
+ padding-inline: 0.5rem;
334
+ color: var(--sl-color-text);
335
+ border: 1px solid var(--sl-color-gray-4);
336
+ border-radius: 0.35rem;
337
+ background: var(--sl-color-bg);
338
+ }
339
+
340
+ .assessment-actions {
341
+ display: flex;
342
+ gap: 0.75rem;
343
+ margin-top: 0.85rem;
344
+ }
345
+
346
+ .assessment-actions button {
347
+ font: inherit;
348
+ min-height: 2.5rem;
349
+ padding-inline: 1rem;
350
+ color: var(--sl-color-text);
351
+ border: 1px solid var(--sl-color-gray-4);
352
+ border-radius: 0.35rem;
353
+ background: var(--sl-color-bg);
354
+ cursor: pointer;
355
+ }
356
+
357
+ .assessment-actions button:disabled {
358
+ opacity: 0.55;
359
+ cursor: not-allowed;
360
+ }
361
+
362
+ /* A placeholder line holds this slot open before checking so revealing the
363
+ result mostly fills it in place rather than pushing the collapsed questions
364
+ below it down. A long explanation can still add a line. */
365
+ .assessment-feedback {
366
+ min-height: 3.25rem;
367
+ margin-top: 0.85rem;
368
+ padding: 0.75rem 1rem;
369
+ border-left: 0.3rem solid transparent;
370
+ }
371
+
372
+ .assessment-feedback.is-idle {
373
+ color: var(--sl-color-gray-3);
374
+ font-style: italic;
375
+ }
376
+
377
+ .assessment-feedback.is-correct {
378
+ border-left-color: var(--sl-color-accent);
379
+ background: var(--sl-color-gray-7);
380
+ }
381
+
382
+ .assessment-feedback.is-incorrect {
383
+ border-left-color: var(--sl-color-gray-3);
384
+ background: var(--sl-color-gray-7);
385
+ }
386
+
387
+ /* Reader-controlled desktop layout. Collapsed panels remain as narrow edge
388
+ rails and preview over the article on pointer hover. Keyboard users restore
389
+ them with the focused edge button. Mobile navigation and the mobile table
390
+ of contents ignore these preferences. */
391
+ .layout-edge-toggle {
392
+ display: none;
393
+ }
394
+
395
+ .layout-edge-toggle[hidden] {
396
+ display: none !important;
397
+ }
398
+
399
+ @media (min-width: 50rem) {
400
+ :root {
401
+ --layout-edge-rail-width: 2.5rem;
402
+ --layout-edge-toggle-size: 2rem;
403
+ }
404
+
405
+ .layout-edge-toggle:not([hidden]) {
406
+ display: grid;
407
+ place-items: center;
408
+ width: var(--layout-edge-toggle-size);
409
+ height: var(--layout-edge-toggle-size);
410
+ border: 1px solid var(--sl-color-gray-5);
411
+ border-radius: 999px;
412
+ padding: 0;
413
+ color: var(--sl-color-text-accent);
414
+ background: var(--sl-color-bg-nav);
415
+ box-shadow: var(--sl-shadow-sm);
416
+ font: inherit;
417
+ line-height: 1;
418
+ cursor: pointer;
419
+ }
420
+
421
+ .layout-edge-toggle .layout-edge-icon {
422
+ display: block;
423
+ flex: none;
424
+ width: 1rem;
425
+ height: 1rem;
426
+ }
427
+
428
+ .layout-edge-toggle:hover {
429
+ border-color: var(--sl-color-accent);
430
+ background: var(--sl-color-accent-low);
431
+ }
432
+
433
+ .layout-edge-toggle:focus-visible {
434
+ outline: 3px solid var(--sl-color-accent-high);
435
+ outline-offset: 2px;
436
+ }
437
+
438
+ .layout-edge-toggle .layout-edge-icon-restore,
439
+ .layout-edge-toggle[aria-expanded='false'] .layout-edge-icon-hide {
440
+ display: none;
441
+ }
442
+
443
+ .layout-edge-toggle[aria-expanded='false'] .layout-edge-icon-restore {
444
+ display: block;
445
+ }
446
+
447
+ .layout-navigation-panel {
448
+ min-height: 100%;
449
+ }
450
+
451
+ .layout-navigation-toggle {
452
+ position: fixed;
453
+ z-index: calc(var(--sl-z-index-menu) + 1);
454
+ inset-block-start: calc(var(--sl-nav-height) + 0.75rem);
455
+ inset-inline-start: calc(
456
+ var(--sl-sidebar-width) - var(--layout-edge-toggle-size) - 0.35rem
457
+ );
458
+ }
459
+
460
+ html[data-navigation-hidden] {
461
+ --sl-content-inline-start: var(--layout-edge-rail-width);
462
+ }
463
+
464
+ html[data-navigation-hidden] .sidebar-pane {
465
+ width: var(--layout-edge-rail-width);
466
+ overflow: hidden;
467
+ transition: width 140ms ease;
468
+ }
469
+
470
+ html[data-navigation-hidden] .layout-navigation-toggle {
471
+ inset-inline-start: calc(
472
+ (var(--layout-edge-rail-width) - var(--layout-edge-toggle-size)) / 2
473
+ );
474
+ }
475
+
476
+ html[data-navigation-hidden] .layout-navigation-content {
477
+ visibility: hidden;
478
+ opacity: 0;
479
+ pointer-events: none;
480
+ transition: opacity 100ms ease;
481
+ }
482
+
483
+ html[data-navigation-hidden]:not([data-navigation-peek-suppressed])
484
+ .sidebar-pane:hover {
485
+ width: var(--sl-sidebar-width);
486
+ overflow-y: auto;
487
+ background: var(--sl-color-bg-sidebar);
488
+ box-shadow: var(--sl-shadow-lg);
489
+ }
490
+
491
+ html[data-navigation-hidden]:not([data-navigation-peek-suppressed])
492
+ .sidebar-pane:hover
493
+ .layout-navigation-content {
494
+ visibility: visible;
495
+ opacity: 1;
496
+ pointer-events: auto;
497
+ }
498
+ }
499
+
500
+ @media (min-width: 72rem) {
501
+ :root {
502
+ /* Mirrors Starlight's responsive right-column allocation. The main frame
503
+ is the viewport minus the current navigation width, which can itself be
504
+ the collapsed edge rail. */
505
+ --layout-page-sidebar-open-width: max(
506
+ var(--sl-sidebar-width),
507
+ calc(
508
+ var(--sl-sidebar-width) +
509
+ (
510
+ 100vw - var(--sl-content-inline-start, 0rem) -
511
+ var(--sl-content-width) - var(--sl-sidebar-width)
512
+ ) /
513
+ 2
514
+ )
515
+ );
516
+ }
517
+
518
+ .right-sidebar {
519
+ background-color: var(--sl-color-bg);
520
+ }
521
+
522
+ .layout-page-sidebar {
523
+ position: relative;
524
+ min-height: 100%;
525
+ padding-block-start: 2.75rem;
526
+ }
527
+
528
+ .layout-contents-toggle {
529
+ position: absolute;
530
+ z-index: 1;
531
+ inset-block-start: 0.5rem;
532
+ inset-inline-start: 0.35rem;
533
+ }
534
+
535
+ html[data-page-sidebar-hidden] {
536
+ --__toc-width: var(--layout-edge-rail-width);
537
+ }
538
+
539
+ html[data-page-sidebar-hidden] .right-sidebar-container {
540
+ width: var(--layout-edge-rail-width);
541
+ }
542
+
543
+ html[data-page-sidebar-hidden] .layout-contents-toggle {
544
+ position: fixed;
545
+ inset-block-start: calc(var(--sl-nav-height) + 0.5rem);
546
+ inset-inline-start: auto;
547
+ inset-inline-end: calc(
548
+ (var(--layout-edge-rail-width) - var(--layout-edge-toggle-size)) / 2
549
+ );
550
+ }
551
+
552
+ html[data-page-sidebar-hidden] .right-sidebar {
553
+ z-index: var(--sl-z-index-toc);
554
+ inset-inline-start: auto;
555
+ inset-inline-end: 0;
556
+ width: var(--layout-edge-rail-width);
557
+ overflow: hidden;
558
+ transition: width 140ms ease;
559
+ }
560
+
561
+ html[data-page-sidebar-hidden] .main-pane {
562
+ --sl-content-margin-inline: auto;
563
+ width: calc(100% - var(--layout-edge-rail-width));
564
+ }
565
+
566
+ html[data-page-sidebar-hidden] .layout-page-sidebar-content {
567
+ visibility: hidden;
568
+ opacity: 0;
569
+ pointer-events: none;
570
+ transition: opacity 100ms ease;
571
+ }
572
+
573
+ html[data-page-sidebar-hidden]:not([data-page-sidebar-peek-suppressed])
574
+ .right-sidebar:hover {
575
+ width: var(--layout-page-sidebar-open-width);
576
+ overflow-y: auto;
577
+ box-shadow: var(--sl-shadow-lg);
578
+ }
579
+
580
+ html[data-page-sidebar-hidden]:not([data-page-sidebar-peek-suppressed])
581
+ .right-sidebar:hover
582
+ .layout-page-sidebar-content {
583
+ visibility: visible;
584
+ opacity: 1;
585
+ pointer-events: auto;
586
+ }
587
+ }
588
+
589
+ @media (prefers-reduced-motion: reduce) {
590
+ html[data-navigation-hidden] .sidebar-pane,
591
+ html[data-page-sidebar-hidden] .right-sidebar,
592
+ html[data-navigation-hidden] .layout-navigation-content,
593
+ html[data-page-sidebar-hidden] .layout-page-sidebar-content {
594
+ transition: none;
595
+ }
596
+ }
597
+
598
+ /* Source citations: inline `[n]` markers and the end-of-page reference list
599
+ emitted by the remark-citation adapter. The hover/pin panel is styled in
600
+ the CitationLayer island. */
601
+ .sl-markdown-content a.citation-ref {
602
+ font-size: 0.7em;
603
+ font-weight: 600;
604
+ line-height: 0;
605
+ vertical-align: super;
606
+ text-decoration: underline;
607
+ text-underline-offset: 0.15em;
608
+ padding-inline: 0.1em;
609
+ border-radius: 0.2em;
610
+ color: var(--sl-color-text-accent);
611
+ white-space: nowrap;
612
+ }
613
+
614
+ .sl-markdown-content a.citation-ref:hover,
615
+ .sl-markdown-content a.citation-ref:focus-visible {
616
+ background: var(--sl-color-accent-low);
617
+ }
618
+
619
+ .sl-markdown-content .citations-heading {
620
+ margin-block-start: 2.5rem;
621
+ font-size: var(--sl-text-lg);
622
+ }
623
+
624
+ .sl-markdown-content ol.citations-list {
625
+ display: grid;
626
+ gap: 0.6rem;
627
+ font-size: var(--sl-text-sm);
628
+ color: var(--sl-color-gray-2);
629
+ }
630
+
631
+ .sl-markdown-content ol.citations-list li {
632
+ scroll-margin-block-start: 5rem;
633
+ }
634
+
635
+ .sl-markdown-content ol.citations-list a {
636
+ text-decoration: underline;
637
+ }
638
+
639
+ .sl-markdown-content ol.citations-list li:target {
640
+ background: var(--sl-color-accent-low);
641
+ border-radius: 0.3rem;
642
+ }
643
+
644
+ .sl-markdown-content .citation-url {
645
+ overflow-wrap: anywhere;
646
+ }
647
+
648
+ .sl-markdown-content .citation-status {
649
+ padding-inline: 0.4em;
650
+ border: 1px solid var(--sl-color-gray-5);
651
+ border-radius: 999px;
652
+ font-size: var(--sl-text-xs);
653
+ text-transform: lowercase;
654
+ }
655
+
656
+ .sl-markdown-content .citation-backref {
657
+ margin-inline-start: 0.15rem;
658
+ }
659
+
660
+ @media (forced-colors: active) {
661
+ .sl-markdown-content a.citation-ref:hover,
662
+ .sl-markdown-content a.citation-ref:focus-visible {
663
+ outline: 2px solid Highlight;
664
+ }
665
+ }
666
+
667
+ /* Equation identity (D7): a keyed `$$…$$` is wrapped by the remark adapter in
668
+ `.keyed-equation` with an `id="eq-<key>"`, a `data-eq-number`, and a
669
+ focusable number link. Prose refers to it with `[[eq:key]]` →
670
+ `a.equation-ref`. The deep-link highlight is a pure-CSS `:target` animation
671
+ with a reduced-motion fallback; `EquationEnhancer.astro` only re-triggers it
672
+ on a repeated activation and moves focus. */
673
+ .sl-markdown-content .keyed-equation {
674
+ position: relative;
675
+ scroll-margin-block-start: 5rem;
676
+ padding-inline-end: 3.5rem;
677
+ border-radius: 0.3rem;
678
+ }
679
+
680
+ .sl-markdown-content .keyed-equation > .katex-display {
681
+ margin-block: 0;
682
+ }
683
+
684
+ .sl-markdown-content a.keyed-equation__number {
685
+ position: absolute;
686
+ inset-inline-end: 0.25rem;
687
+ inset-block-start: 50%;
688
+ transform: translateY(-50%);
689
+ font-variant-numeric: tabular-nums;
690
+ font-size: var(--sl-text-sm);
691
+ color: var(--sl-color-text-accent);
692
+ text-decoration: none;
693
+ }
694
+
695
+ .sl-markdown-content a.keyed-equation__number:hover,
696
+ .sl-markdown-content a.keyed-equation__number:focus-visible {
697
+ text-decoration: underline;
698
+ }
699
+
700
+ .sl-markdown-content a.equation-ref {
701
+ font-variant-numeric: tabular-nums;
702
+ font-weight: 600;
703
+ text-decoration: underline;
704
+ text-underline-offset: 0.15em;
705
+ padding-inline: 0.1em;
706
+ border-radius: 0.2em;
707
+ color: var(--sl-color-text-accent);
708
+ white-space: nowrap;
709
+ }
710
+
711
+ .sl-markdown-content a.equation-ref:hover,
712
+ .sl-markdown-content a.equation-ref:focus-visible {
713
+ background: var(--sl-color-accent-low);
714
+ }
715
+
716
+ @keyframes eq-flash {
717
+ from {
718
+ background: var(--sl-color-accent-low);
719
+ box-shadow: 0 0 0 0.35rem var(--sl-color-accent-low);
720
+ }
721
+ to {
722
+ background: transparent;
723
+ box-shadow: 0 0 0 0.35rem transparent;
724
+ }
725
+ }
726
+
727
+ .sl-markdown-content .keyed-equation:target {
728
+ animation: eq-flash 3s ease-out both;
729
+ }
730
+
731
+ @media (prefers-reduced-motion: reduce) {
732
+ .sl-markdown-content .keyed-equation:target {
733
+ animation: none;
734
+ background: var(--sl-color-accent-low);
735
+ outline: 2px solid var(--sl-color-accent);
736
+ outline-offset: 0.2rem;
737
+ }
738
+ }
739
+
740
+ @media (forced-colors: active) {
741
+ .sl-markdown-content .keyed-equation:target {
742
+ animation: none;
743
+ outline: 2px solid Highlight;
744
+ outline-offset: 0.2rem;
745
+ }
746
+ .sl-markdown-content a.equation-ref:hover,
747
+ .sl-markdown-content a.equation-ref:focus-visible {
748
+ outline: 2px solid Highlight;
749
+ }
750
+ }
751
+
752
+ @media print {
753
+ .sl-markdown-content a.keyed-equation__number {
754
+ position: static;
755
+ display: block;
756
+ transform: none;
757
+ text-align: end;
758
+ color: inherit;
759
+ }
760
+ .sl-markdown-content .keyed-equation {
761
+ padding-inline-end: 0;
762
+ }
763
+ }