@janga/norna 0.7.24 → 0.7.26

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 (142) hide show
  1. package/README.md +5 -4
  2. package/astro.config.mjs +27 -11
  3. package/bin/norna-cli.mjs +12 -0
  4. package/package.json +26 -5
  5. package/schemas/card-list.schema.json +121 -0
  6. package/schemas/category.schema.json +2 -2
  7. package/schemas/config.schema.json +342 -33
  8. package/schemas/content-frontmatter.schema.json +7 -7
  9. package/schemas/image-carousel.schema.json +43 -0
  10. package/schemas/image-stack.schema.json +43 -0
  11. package/schemas/manifest.json +6 -1
  12. package/schemas/page-theme.schema.json +26 -26
  13. package/schemas/sitewide-content.schema.json +18 -18
  14. package/schemas/theme.schema.json +237 -262
  15. package/scripts/check-config.mjs +5 -1
  16. package/scripts/dev-local.mjs +130 -13
  17. package/scripts/generate-schemas.mjs +15 -3
  18. package/scripts/init-site.mjs +2 -0
  19. package/scripts/lib/category-destinations.mjs +48 -0
  20. package/scripts/lib/code-fence-metadata.mjs +25 -43
  21. package/scripts/lib/content-tabs.mjs +155 -0
  22. package/scripts/lib/details-headings.mjs +58 -0
  23. package/scripts/lib/docusaurus-migration-audit.mjs +603 -0
  24. package/scripts/lib/edit-source-link.mjs +53 -0
  25. package/scripts/lib/editor-language-service.mjs +238 -116
  26. package/scripts/lib/locale-registry.mjs +597 -0
  27. package/scripts/lib/locales/az-Latn.mjs +78 -0
  28. package/scripts/lib/locales/be.mjs +78 -0
  29. package/scripts/lib/locales/bg.mjs +78 -0
  30. package/scripts/lib/locales/bs.mjs +78 -0
  31. package/scripts/lib/locales/ca.mjs +78 -0
  32. package/scripts/lib/locales/cnr.mjs +78 -0
  33. package/scripts/lib/locales/cs.mjs +78 -0
  34. package/scripts/lib/locales/da.mjs +78 -0
  35. package/scripts/lib/locales/de.mjs +78 -0
  36. package/scripts/lib/locales/el.mjs +78 -0
  37. package/scripts/lib/locales/en.mjs +78 -0
  38. package/scripts/lib/locales/es.mjs +78 -0
  39. package/scripts/lib/locales/et.mjs +78 -0
  40. package/scripts/lib/locales/fi.mjs +78 -0
  41. package/scripts/lib/locales/fil.mjs +78 -0
  42. package/scripts/lib/locales/fr.mjs +78 -0
  43. package/scripts/lib/locales/ga.mjs +78 -0
  44. package/scripts/lib/locales/ha.mjs +78 -0
  45. package/scripts/lib/locales/hr.mjs +78 -0
  46. package/scripts/lib/locales/hu.mjs +78 -0
  47. package/scripts/lib/locales/id.mjs +78 -0
  48. package/scripts/lib/locales/is.mjs +78 -0
  49. package/scripts/lib/locales/it.mjs +78 -0
  50. package/scripts/lib/locales/jv.mjs +78 -0
  51. package/scripts/lib/locales/lb.mjs +78 -0
  52. package/scripts/lib/locales/lt.mjs +78 -0
  53. package/scripts/lib/locales/lv.mjs +78 -0
  54. package/scripts/lib/locales/mk.mjs +78 -0
  55. package/scripts/lib/locales/mt.mjs +78 -0
  56. package/scripts/lib/locales/nb.mjs +78 -0
  57. package/scripts/lib/locales/nl.mjs +78 -0
  58. package/scripts/lib/locales/nn.mjs +78 -0
  59. package/scripts/lib/locales/pcm.mjs +78 -0
  60. package/scripts/lib/locales/pl.mjs +78 -0
  61. package/scripts/lib/locales/pt.mjs +78 -0
  62. package/scripts/lib/locales/ro.mjs +78 -0
  63. package/scripts/lib/locales/ru.mjs +78 -0
  64. package/scripts/lib/locales/sk.mjs +78 -0
  65. package/scripts/lib/locales/sl.mjs +78 -0
  66. package/scripts/lib/locales/sq.mjs +78 -0
  67. package/scripts/lib/locales/sr-Cyrl.mjs +78 -0
  68. package/scripts/lib/locales/sr-Latn.mjs +78 -0
  69. package/scripts/lib/locales/sv.mjs +78 -0
  70. package/scripts/lib/locales/sw.mjs +78 -0
  71. package/scripts/lib/locales/tr.mjs +78 -0
  72. package/scripts/lib/locales/uk.mjs +78 -0
  73. package/scripts/lib/locales/vi.mjs +78 -0
  74. package/scripts/lib/markdown-links.mjs +4 -25
  75. package/scripts/lib/markdown-notes-render-plugin.mjs +75 -0
  76. package/scripts/lib/markdown-notes.mjs +165 -0
  77. package/scripts/lib/navigation-model.mjs +1 -1
  78. package/scripts/lib/norna-markdown-blocks.mjs +123 -447
  79. package/scripts/lib/norna-markdown-render-plugin.mjs +4 -0
  80. package/scripts/lib/page-aliases.mjs +12 -1
  81. package/scripts/lib/page-markdown.mjs +63 -16
  82. package/scripts/lib/page-move-plan.mjs +22 -5
  83. package/scripts/lib/pagefind-translations.mjs +620 -0
  84. package/scripts/lib/presentation-contract.mjs +6 -1
  85. package/scripts/lib/presentation.mjs +29 -30
  86. package/scripts/lib/project-config.mjs +22 -163
  87. package/scripts/lib/schema-definitions.mjs +13 -12
  88. package/scripts/lib/schema-editor-metadata.mjs +42 -46
  89. package/scripts/lib/schema-value-definitions.mjs +7 -8
  90. package/scripts/lib/semantic-callouts.mjs +4 -2
  91. package/scripts/lib/site-content.mjs +4 -2
  92. package/scripts/lib/site-link-graph.mjs +16 -6
  93. package/scripts/lib/site-navigation-tree.mjs +0 -11
  94. package/scripts/lib/site-paths.mjs +14 -2
  95. package/scripts/lib/sitemap.mjs +5 -3
  96. package/scripts/lib/structured-blocks.mjs +108 -0
  97. package/scripts/lib/table-render-plugin.mjs +76 -0
  98. package/scripts/lib/table-row-headers.mjs +218 -0
  99. package/scripts/lib/theme-presets.mjs +3 -10
  100. package/scripts/lib/yaml-config.mjs +2 -6
  101. package/scripts/migrate-check.mjs +19 -0
  102. package/scripts/sync-content-sections.mjs +39 -10
  103. package/scripts/sync-site-public.mjs +7 -1
  104. package/src/components/CardList.astro +1 -0
  105. package/src/components/CodeBlockCopyScript.astro +49 -6
  106. package/src/components/ContentBlocks.astro +39 -0
  107. package/src/components/ContentTabsScript.astro +60 -0
  108. package/src/components/DisplaySettings.astro +17 -19
  109. package/src/components/ImageCarousel.astro +4 -1
  110. package/src/components/ImageStack.astro +34 -9
  111. package/src/components/ImageStackEnhancement.astro +331 -0
  112. package/src/components/NavigationPageTree.astro +1 -1
  113. package/src/components/NoteNavigationScript.astro +4 -0
  114. package/src/components/PageAliasRedirect.astro +5 -4
  115. package/src/components/PageContentsNavigation.astro +2 -3
  116. package/src/components/SearchNavigationScript.astro +4 -0
  117. package/src/components/SearchPage.astro +43 -2
  118. package/src/components/SectionNavigationScript.astro +86 -16
  119. package/src/components/SiteBreadcrumbs.astro +1 -1
  120. package/src/components/SiteNavigation.astro +98 -65
  121. package/src/components/SitePage.astro +73 -33
  122. package/src/components/SiteSection.astro +5 -81
  123. package/src/components/SiteTreeNavigation.astro +5 -2
  124. package/src/components/TableOverflowScript.astro +579 -0
  125. package/src/components/TopPageMenu.astro +47 -0
  126. package/src/components/TreeNavigationScript.astro +86 -23
  127. package/src/layouts/BaseLayout.astro +34 -12
  128. package/src/lib/generatedImages.ts +18 -0
  129. package/src/lib/navigationFollowing.ts +142 -0
  130. package/src/lib/noteNavigation.ts +50 -0
  131. package/src/lib/searchNavigation.ts +107 -0
  132. package/src/lib/sectionContent.ts +23 -116
  133. package/src/lib/siteNavigation.ts +0 -5
  134. package/src/lib/sitePages.ts +18 -4
  135. package/src/lib/table-sort-tooltip.ts +109 -0
  136. package/src/pages/[...slug].astro +16 -6
  137. package/src/styles/content.css +563 -26
  138. package/src/styles/foundations.css +9 -0
  139. package/src/styles/media.css +192 -3
  140. package/src/styles/navigation.css +214 -60
  141. package/src/styles/page-layout.css +55 -16
  142. package/src/styles/responsive.css +62 -20
@@ -23,6 +23,9 @@
23
23
  --color-warning-accent: var(--palette-light-warning-accent, #7a5600);
24
24
  --color-warning-surface: var(--palette-light-warning-surface, #fff4c2);
25
25
  --color-warning-text: var(--palette-light-warning-text, #3b2b00);
26
+ --color-caution-accent: var(--palette-light-caution-accent, #a34b00);
27
+ --color-caution-surface: var(--palette-light-caution-surface, #ffead6);
28
+ --color-caution-text: var(--palette-light-caution-text, #542300);
26
29
  --color-error-accent: var(--palette-light-error-accent, #a12d2d);
27
30
  --color-error-surface: var(--palette-light-error-surface, #fce8e8);
28
31
  --color-error-text: var(--palette-light-error-text, #5f1616);
@@ -113,6 +116,9 @@
113
116
  --color-warning-accent: var(--palette-dark-warning-accent);
114
117
  --color-warning-surface: var(--palette-dark-warning-surface);
115
118
  --color-warning-text: var(--palette-dark-warning-text);
119
+ --color-caution-accent: var(--palette-dark-caution-accent);
120
+ --color-caution-surface: var(--palette-dark-caution-surface);
121
+ --color-caution-text: var(--palette-dark-caution-text);
116
122
  --color-error-accent: var(--palette-dark-error-accent);
117
123
  --color-error-surface: var(--palette-dark-error-surface);
118
124
  --color-error-text: var(--palette-dark-error-text);
@@ -158,6 +164,9 @@
158
164
  --color-warning-accent: var(--palette-dark-warning-accent);
159
165
  --color-warning-surface: var(--palette-dark-warning-surface);
160
166
  --color-warning-text: var(--palette-dark-warning-text);
167
+ --color-caution-accent: var(--palette-dark-caution-accent);
168
+ --color-caution-surface: var(--palette-dark-caution-surface);
169
+ --color-caution-text: var(--palette-dark-caution-text);
161
170
  --color-error-accent: var(--palette-dark-error-accent);
162
171
  --color-error-surface: var(--palette-dark-error-surface);
163
172
  --color-error-text: var(--palette-dark-error-text);
@@ -25,7 +25,7 @@
25
25
  margin-bottom: var(--space-content-block-gap);
26
26
  }
27
27
 
28
- .section-body > :is(.image-stack, .managed-images, .card-list) {
28
+ .content-block-note-lane-boundary {
29
29
  clear: both;
30
30
  }
31
31
 
@@ -191,6 +191,7 @@
191
191
 
192
192
  .card-list-content p:not(.card-list-badge) {
193
193
  margin: 0;
194
+ white-space: pre-line;
194
195
  font-size: calc(var(--section-body-font-size-desktop, 1rem) * var(--card-list-text-scale));
195
196
  line-height: var(--section-body-line-height, 1.5);
196
197
  }
@@ -215,7 +216,7 @@
215
216
  min-width: 0;
216
217
  }
217
218
 
218
- @media (min-width: 701px) {
219
+ @media (min-width: 961px) {
219
220
  :root[data-image-presentation='prose-aligned'] .site-page-layout-tree .section-body {
220
221
  grid-template-columns: minmax(0, var(--layout-reading-width)) minmax(0, 1fr);
221
222
  }
@@ -227,16 +228,44 @@
227
228
 
228
229
  .managed-image-item {
229
230
  display: grid;
230
- gap: 0.55rem;
231
+ gap: 0;
231
232
  align-content: start;
232
233
  margin: 0;
233
234
  }
234
235
 
236
+ .image-stack {
237
+ --image-caption-inline-gap: 0.75rem;
238
+ }
239
+
235
240
  .image-stack .managed-image-item {
236
241
  width: var(--layout-stack-item-width);
237
242
  margin-inline: var(--layout-inline-start-margin) var(--layout-inline-end-margin);
238
243
  }
239
244
 
245
+ @media (min-width: 1101px) {
246
+ .image-stack .managed-image-item[data-image-caption-placement='persistent'] {
247
+ position: relative;
248
+ padding-block-end: var(--image-persistent-caption-reserve, 0);
249
+ }
250
+
251
+ .image-stack .managed-image-item[data-image-caption-placement='persistent'] > .image-meta {
252
+ position: absolute;
253
+ inset-block-start: var(--image-persistent-caption-block-start, 0);
254
+ inset-block-end: var(--image-persistent-caption-block-end, 0);
255
+ inset-inline-start: var(--image-persistent-caption-inline-start);
256
+ width: var(--image-persistent-caption-width, var(--section-note-width, 12rem));
257
+ margin: 0;
258
+ text-align: start;
259
+ }
260
+
261
+ .image-stack .managed-image-item[data-image-caption-placement='persistent'] > .image-meta .image-details {
262
+ position: sticky;
263
+ top: calc(var(--site-top-anchor-offset) + 1rem);
264
+ display: block;
265
+ padding: 0;
266
+ }
267
+ }
268
+
240
269
  .managed-image-frame {
241
270
  display: grid;
242
271
  width: var(--layout-media-width);
@@ -246,6 +275,57 @@
246
275
  place-items: center;
247
276
  }
248
277
 
278
+ .managed-image-inspection-link {
279
+ position: relative;
280
+ display: grid;
281
+ width: min(100%, var(--managed-image-intrinsic-width, 100%));
282
+ max-width: 100%;
283
+ place-items: center;
284
+ color: inherit;
285
+ }
286
+
287
+ :root[data-image-presentation='centered-fit'] .managed-image-inspection-link {
288
+ width: min(
289
+ 100%,
290
+ var(--managed-image-intrinsic-width, 100%),
291
+ calc(var(--image-max-height) * var(--managed-image-aspect-ratio, 100))
292
+ );
293
+ }
294
+
295
+ .managed-image-inspection-link:focus-visible {
296
+ outline: var(--focus-indicator-width) solid var(--color-focus-ring);
297
+ outline-offset: 0.35rem;
298
+ box-shadow: 0 0 0 calc(var(--focus-indicator-width) * 2) var(--color-focus-ring-contrast);
299
+ }
300
+
301
+ .managed-image-inspection-link[data-image-inspection-available='true'] {
302
+ cursor: zoom-in;
303
+ }
304
+
305
+ .managed-image-inspection-affordance {
306
+ position: absolute;
307
+ top: 0.65rem;
308
+ right: 0.65rem;
309
+ display: none;
310
+ width: 2.25rem;
311
+ height: 2.25rem;
312
+ place-items: center;
313
+ border-radius: 999px;
314
+ background: var(--color-control-background);
315
+ box-shadow: 0 0.125rem 0.5rem rgb(0 0 0 / 18%);
316
+ color: var(--color-control-text);
317
+ pointer-events: none;
318
+ }
319
+
320
+ .managed-image-inspection-link[data-image-inspection-available='true'] .managed-image-inspection-affordance {
321
+ display: grid;
322
+ }
323
+
324
+ .managed-image-inspection-affordance svg {
325
+ width: 1.125rem;
326
+ height: 1.125rem;
327
+ }
328
+
249
329
  .managed-image {
250
330
  display: block;
251
331
  width: auto;
@@ -257,6 +337,111 @@
257
337
  object-fit: contain;
258
338
  }
259
339
 
340
+ :root[data-image-inspector-open='true'] {
341
+ overflow: hidden;
342
+ }
343
+
344
+ .image-inspector {
345
+ width: min(calc(100% - 2rem), 96rem);
346
+ height: calc(100svh - 2rem);
347
+ max-width: none;
348
+ max-height: none;
349
+ margin: auto;
350
+ border: 1px solid var(--color-border);
351
+ border-radius: var(--corner-radius-large, 8px);
352
+ padding: 0;
353
+ background: var(--color-page);
354
+ color: var(--color-primary-text);
355
+ box-shadow: 0 1rem 3rem rgb(0 0 0 / 28%);
356
+ overflow: hidden;
357
+ }
358
+
359
+ .image-inspector::backdrop {
360
+ background: rgb(0 0 0 / 62%);
361
+ }
362
+
363
+ .image-inspector-layout {
364
+ display: grid;
365
+ grid-template-rows: auto minmax(0, 1fr) auto;
366
+ gap: 0.75rem;
367
+ height: 100%;
368
+ padding: 0.75rem;
369
+ }
370
+
371
+ .image-inspector-controls {
372
+ display: flex;
373
+ justify-content: flex-end;
374
+ gap: 0.5rem;
375
+ }
376
+
377
+ .image-inspector-controls button {
378
+ display: grid;
379
+ width: 2.75rem;
380
+ height: 2.75rem;
381
+ place-items: center;
382
+ border: 1px solid var(--color-border);
383
+ border-radius: var(--corner-radius-small, 2px);
384
+ padding: 0;
385
+ background: var(--color-surface-soft-background);
386
+ color: var(--color-surface-soft-text);
387
+ cursor: pointer;
388
+ }
389
+
390
+ .image-inspector-controls button:hover,
391
+ .image-inspector-controls button:active {
392
+ background: var(--color-surface-emphasis-background);
393
+ color: var(--color-surface-emphasis-text);
394
+ }
395
+
396
+ .image-inspector-controls button:focus-visible {
397
+ outline: var(--focus-indicator-width) solid var(--color-focus-ring);
398
+ outline-offset: 2px;
399
+ box-shadow: 0 0 0 calc(var(--focus-indicator-width) * 2) var(--color-focus-ring-contrast);
400
+ }
401
+
402
+ .image-inspector-controls [hidden] {
403
+ display: none;
404
+ }
405
+
406
+ .image-inspector-media {
407
+ display: grid;
408
+ min-width: 0;
409
+ min-height: 0;
410
+ place-items: center;
411
+ overflow: auto;
412
+ overscroll-behavior: contain;
413
+ }
414
+
415
+ .image-inspector-media img {
416
+ display: block;
417
+ width: auto;
418
+ height: auto;
419
+ margin: auto;
420
+ }
421
+
422
+ .image-inspector-media[data-image-inspector-mode='fit'] img {
423
+ max-width: 100%;
424
+ max-height: 100%;
425
+ }
426
+
427
+ .image-inspector-media[data-image-inspector-mode='actual'] {
428
+ display: block;
429
+ }
430
+
431
+ .image-inspector-media[data-image-inspector-mode='actual'] img {
432
+ max-width: none;
433
+ max-height: none;
434
+ }
435
+
436
+ .image-inspector-caption {
437
+ max-width: 72ch;
438
+ margin: 0 auto;
439
+ color: var(--color-secondary-text);
440
+ font-size: 0.95rem;
441
+ line-height: 1.5;
442
+ text-align: center;
443
+ }
444
+
260
445
  .managed-image.managed-image-landscape {
261
446
  width: 100%;
262
447
  max-height: none;
@@ -490,6 +675,10 @@
490
675
  text-align: var(--section-caption-align-desktop, center);
491
676
  }
492
677
 
678
+ .image-meta .image-details > span {
679
+ white-space: pre-line;
680
+ }
681
+
493
682
  :root[data-image-presentation='prose-aligned'] .image-stack .image-meta {
494
683
  margin-inline: 0 auto;
495
684
  }
@@ -99,7 +99,7 @@
99
99
  transition: border-color 0.18s ease, background-color 0.18s ease;
100
100
  }
101
101
 
102
- :root[data-focus-reading='on'] .display-settings summary {
102
+ :root[data-reader-preferences-ready='true'][data-focus-reading='on'] .display-settings summary {
103
103
  grid-template-columns: auto auto;
104
104
  gap: 0.4rem;
105
105
  width: auto;
@@ -142,7 +142,7 @@
142
142
  white-space: nowrap;
143
143
  }
144
144
 
145
- :root[data-focus-reading='on'] .display-settings-focus-status {
145
+ :root[data-reader-preferences-ready='true'][data-focus-reading='on'] .display-settings-focus-status {
146
146
  display: block;
147
147
  }
148
148
 
@@ -277,8 +277,7 @@
277
277
  .site-brand,
278
278
  .site-nav a,
279
279
  .mobile-nav-menu summary,
280
- .mobile-nav-panel a,
281
- .site-nav-submenu a {
280
+ .mobile-nav-panel a {
282
281
  color: currentColor;
283
282
  text-decoration: none;
284
283
  }
@@ -321,8 +320,66 @@
321
320
 
322
321
  .site-nav-item {
323
322
  position: relative;
323
+ display: flex;
324
+ align-items: center;
325
+ }
326
+
327
+ .top-page-menu > summary {
328
+ display: flex;
329
+ align-items: center;
330
+ justify-content: center;
331
+ width: var(--target-size-minimum);
332
+ min-height: var(--target-size-minimum);
333
+ list-style: none;
334
+ cursor: pointer;
335
+ }
336
+
337
+ .top-page-menu > summary::-webkit-details-marker { display: none; }
338
+ .top-page-menu > summary svg { width: 1rem; height: 1rem; }
339
+ .top-page-menu[open] > summary svg { transform: rotate(180deg); }
340
+ .top-page-menu > summary:hover { color: var(--color-accent); }
341
+ .top-page-menu > summary:focus-visible { outline: 2px solid var(--color-focus-ring); }
342
+
343
+ .top-page-panel {
344
+ position: absolute;
345
+ inset-block-start: 100%;
346
+ inset-inline-end: 0;
347
+ z-index: 10;
348
+ width: max-content;
349
+ min-width: 12rem;
350
+ max-width: min(24rem, calc(100vw - (var(--content-gutter) * 2)));
351
+ max-height: calc(100svh - var(--site-top-anchor-offset, 8rem) - 1rem);
352
+ overflow: auto;
353
+ border: 1px solid var(--color-border);
354
+ padding: 0.75rem;
355
+ background: var(--site-top-background-color, var(--color-page));
356
+ box-shadow: 0 0.5rem 1.5rem rgb(0 0 0 / 0.16);
357
+ transform: translateX(var(--top-page-panel-shift, 0px));
358
+ }
359
+
360
+ .site-nav-item:first-child .top-page-panel {
361
+ inset-inline-start: 0;
362
+ inset-inline-end: auto;
363
+ }
364
+
365
+ .site-nav .top-page-panel a {
366
+ padding: 0.4rem;
367
+ font-size: 0.875rem;
368
+ letter-spacing: 0;
369
+ line-height: 1.4;
370
+ text-transform: none;
371
+ overflow-wrap: break-word;
324
372
  }
325
373
 
374
+ .top-page-panel a:is(:hover, :focus-visible, [aria-current='location']) {
375
+ text-decoration: underline;
376
+ text-underline-offset: 0.2em;
377
+ }
378
+
379
+ .top-page-children:not(:first-child) { border-top: 1px solid var(--color-border); margin-top: 0.5rem; }
380
+ .top-page-children > p { margin: 0.5rem 0; font-size: 0.75rem; }
381
+ .top-page-children .navigation-page-tree .navigation-page-tree { padding-inline-start: 1rem; }
382
+
326
383
  .site-nav a,
327
384
  .mobile-nav-panel a {
328
385
  display: block;
@@ -353,81 +410,178 @@
353
410
  text-underline-offset: 0.35em;
354
411
  }
355
412
 
356
- .site-nav-submenu {
357
- position: absolute;
358
- top: 100%;
359
- left: 50%;
360
- z-index: 10;
361
- width: max-content;
362
- max-width: min(24rem, calc(100vw - (var(--content-gutter) * 2)));
363
- min-width: 12rem;
364
- padding-top: 0.7rem;
365
- opacity: 0;
366
- visibility: hidden;
367
- pointer-events: none;
368
- transform: translate(-50%, -0.35rem);
369
- transition: opacity 0.16s ease, transform 0.16s ease, visibility 0.16s ease;
413
+
414
+ .mobile-nav-menu {
415
+ display: none;
370
416
  }
371
417
 
372
- .site-nav-submenu > nav {
373
- border: 1px solid color-mix(in srgb, currentColor 30%, transparent);
374
- padding: 0.8rem 1rem;
375
- background: var(--site-top-background-color, var(--color-page));
376
- box-shadow: 0 1rem 2.5rem rgb(0 0 0 / 0.22);
418
+ .mobile-nav-trigger-icon {
419
+ display: block;
420
+ width: 1rem;
421
+ height: 1rem;
422
+ stroke-width: 2;
377
423
  }
378
424
 
379
- .site-nav-submenu ul {
380
- display: grid;
381
- gap: 0.65rem;
425
+ .mobile-nav-trigger-close,
426
+ .mobile-nav-menu[open] .mobile-nav-trigger-open {
427
+ display: none;
382
428
  }
383
429
 
384
- .site-nav-submenu .navigation-page-tree-submenu {
385
- gap: 0.75rem;
430
+ .mobile-nav-menu[open] .mobile-nav-trigger-close {
431
+ display: block;
386
432
  }
387
433
 
388
- .site-nav-submenu .navigation-page-tree-submenu .navigation-page-tree-submenu {
389
- margin: 0.15rem 0 0 0.35rem;
390
- border-left: 1px solid color-mix(in srgb, currentColor 24%, transparent);
391
- padding-left: 0.75rem;
434
+ .mobile-nav-panel-actions {
435
+ position: sticky;
436
+ top: 0;
437
+ z-index: 5;
438
+ display: flex;
439
+ justify-content: flex-end;
440
+ width: min(100%, 32rem);
441
+ margin: 0 auto 0.5rem;
442
+ background: var(--site-top-background-color, var(--color-page));
392
443
  }
393
444
 
394
- .site-nav-submenu .navigation-page-link {
395
- font-weight: 650;
445
+ .mobile-nav-close {
446
+ display: grid;
447
+ width: 2.75rem;
448
+ height: 2.75rem;
449
+ place-items: center;
450
+ border: 1px solid currentColor;
451
+ border-radius: 50%;
452
+ padding: 0;
453
+ background: transparent;
454
+ color: currentColor;
455
+ cursor: pointer;
396
456
  }
397
457
 
398
- .site-nav-submenu a {
399
- font-size: 0.76rem;
400
- letter-spacing: 0.03em;
401
- line-height: 1.3;
402
- text-transform: none;
403
- white-space: normal;
458
+ .mobile-nav-close:hover,
459
+ .mobile-nav-close:focus-visible {
460
+ background: color-mix(in srgb, currentColor 9%, transparent);
404
461
  }
405
462
 
406
- .site-nav-submenu a:hover,
407
- .site-nav-submenu a:focus-visible,
408
- .site-nav-submenu a[aria-current='location'] {
409
- color: var(--site-top-text-color, var(--color-primary-text));
410
- text-decoration: underline;
411
- text-underline-offset: 0.25em;
463
+ .mobile-nav-close:focus-visible {
464
+ outline: var(--focus-indicator-width) solid var(--color-focus-ring);
465
+ outline-offset: 2px;
412
466
  }
413
467
 
414
- .site-nav-item:hover .site-nav-submenu,
415
- .site-nav-item:focus-within .site-nav-submenu {
416
- opacity: 1;
417
- visibility: visible;
418
- pointer-events: auto;
419
- transform: translate(-50%, 0);
468
+ .mobile-nav-close svg {
469
+ width: 1.1rem;
470
+ height: 1.1rem;
471
+ stroke-width: 2;
420
472
  }
421
473
 
422
- .site-nav-item[data-submenu-dismissed='true'] .site-nav-submenu {
423
- opacity: 0;
424
- visibility: hidden;
425
- pointer-events: none;
426
- transform: translate(-50%, -0.35rem);
474
+ .mobile-navigation-open {
475
+ overflow: hidden;
427
476
  }
428
477
 
429
- .mobile-nav-menu {
430
- display: none;
478
+ @media (min-width: 701px) {
479
+ .mobile-nav-menu {
480
+ position: relative;
481
+ flex: 0 0 auto;
482
+ margin-left: auto;
483
+ }
484
+
485
+ :root[data-reader-preferences-ready='true'][data-focus-reading='on'] .mobile-nav-menu {
486
+ display: block;
487
+ }
488
+
489
+ .mobile-nav-menu > summary {
490
+ display: flex;
491
+ align-items: center;
492
+ gap: 0.5rem;
493
+ min-height: 2.75rem;
494
+ border: 1px solid currentColor;
495
+ padding: 0.55rem 0.75rem;
496
+ color: var(--site-top-text-color, var(--color-primary-text));
497
+ font-size: 0.72rem;
498
+ font-weight: 700;
499
+ letter-spacing: 0.1em;
500
+ line-height: 1;
501
+ list-style: none;
502
+ text-transform: uppercase;
503
+ }
504
+
505
+ .mobile-nav-menu > summary::-webkit-details-marker {
506
+ display: none;
507
+ }
508
+
509
+ .mobile-nav-panel {
510
+ position: fixed;
511
+ top: var(--site-top-anchor-offset);
512
+ right: 0;
513
+ bottom: 0;
514
+ left: 0;
515
+ z-index: 20;
516
+ width: 100%;
517
+ max-height: none;
518
+ border-top: 1px solid color-mix(in srgb, currentColor 24%, transparent);
519
+ padding: clamp(1.25rem, 5vw, 2rem) var(--content-gutter) max(1.5rem, env(safe-area-inset-bottom));
520
+ background: var(--site-top-background-color, var(--color-page));
521
+ box-shadow: 0 1.5rem 3.5rem rgb(0 0 0 / 0.32);
522
+ color: var(--site-top-text-color, var(--color-text));
523
+ overflow-y: auto;
524
+ overscroll-behavior: contain;
525
+ }
526
+
527
+ .mobile-site-nav {
528
+ width: min(100%, 32rem);
529
+ margin: 0 auto;
530
+ }
531
+
532
+ .mobile-nav-panel h2 {
533
+ margin: 0 0 1.25rem;
534
+ font-size: 1.4rem;
535
+ font-weight: 650;
536
+ letter-spacing: 0;
537
+ line-height: 1.2;
538
+ text-transform: none;
539
+ }
540
+
541
+ .mobile-nav-panel .navigation-tree-controls {
542
+ position: static;
543
+ margin-bottom: 1rem;
544
+ padding-bottom: 1rem;
545
+ background: var(--site-top-background-color, var(--color-page));
546
+ }
547
+
548
+ .mobile-nav-panel a {
549
+ font-family: inherit;
550
+ font-size: 0.9rem;
551
+ letter-spacing: 0;
552
+ line-height: 1.4;
553
+ text-transform: none;
554
+ }
555
+
556
+ .navigation-page-tree-mobile .navigation-page-link {
557
+ display: block;
558
+ border-radius: var(--corner-radius-small, 2px);
559
+ padding: 0.45rem 0.3rem 0.45rem var(--tree-disclosure-offset);
560
+ color: var(--color-secondary-text);
561
+ text-decoration: none;
562
+ }
563
+
564
+ .navigation-page-tree-mobile .navigation-page-branch-content {
565
+ margin: 0.1rem 0 0.2rem 0.25rem;
566
+ border-left: 1px solid color-mix(in srgb, currentColor 16%, transparent);
567
+ padding-left: 0.75rem;
568
+ }
569
+
570
+ .navigation-page-tree-mobile .navigation-page-tree-mobile {
571
+ margin: 0.15rem 0;
572
+ border-left: 0;
573
+ padding-left: 0;
574
+ }
575
+ }
576
+
577
+ @media (min-width: 701px) and (max-width: 960px) {
578
+ .site-top[data-navigation-mode='tree'] .site-nav {
579
+ display: none;
580
+ }
581
+
582
+ .site-top[data-navigation-mode='tree'] .mobile-nav-menu {
583
+ display: block;
584
+ }
431
585
  }
432
586
 
433
587
  .page-nav {
@@ -440,7 +594,7 @@
440
594
 
441
595
  .page-nav-inner {
442
596
  display: flex;
443
- align-items: center;
597
+ align-items: baseline;
444
598
  justify-content: center;
445
599
  gap: clamp(1.1rem, 2.5vw, 2rem);
446
600
  width: min(calc(100% - (var(--content-gutter) * 2)), var(--page-width));