@janga/norna 0.7.25 → 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 (131) hide show
  1. package/README.md +3 -2
  2. package/astro.config.mjs +26 -12
  3. package/bin/norna-cli.mjs +12 -0
  4. package/package.json +14 -5
  5. package/schemas/card-list.schema.json +121 -0
  6. package/schemas/category.schema.json +2 -2
  7. package/schemas/config.schema.json +306 -32
  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/dev-local.mjs +24 -2
  16. package/scripts/generate-schemas.mjs +15 -3
  17. package/scripts/lib/category-destinations.mjs +48 -0
  18. package/scripts/lib/code-fence-metadata.mjs +14 -37
  19. package/scripts/lib/content-tabs.mjs +155 -0
  20. package/scripts/lib/details-headings.mjs +58 -0
  21. package/scripts/lib/docusaurus-migration-audit.mjs +603 -0
  22. package/scripts/lib/editor-language-service.mjs +238 -116
  23. package/scripts/lib/locale-registry.mjs +597 -0
  24. package/scripts/lib/locales/az-Latn.mjs +78 -0
  25. package/scripts/lib/locales/be.mjs +78 -0
  26. package/scripts/lib/locales/bg.mjs +78 -0
  27. package/scripts/lib/locales/bs.mjs +78 -0
  28. package/scripts/lib/locales/ca.mjs +78 -0
  29. package/scripts/lib/locales/cnr.mjs +78 -0
  30. package/scripts/lib/locales/cs.mjs +78 -0
  31. package/scripts/lib/locales/da.mjs +78 -0
  32. package/scripts/lib/locales/de.mjs +78 -0
  33. package/scripts/lib/locales/el.mjs +78 -0
  34. package/scripts/lib/locales/en.mjs +78 -0
  35. package/scripts/lib/locales/es.mjs +78 -0
  36. package/scripts/lib/locales/et.mjs +78 -0
  37. package/scripts/lib/locales/fi.mjs +78 -0
  38. package/scripts/lib/locales/fil.mjs +78 -0
  39. package/scripts/lib/locales/fr.mjs +78 -0
  40. package/scripts/lib/locales/ga.mjs +78 -0
  41. package/scripts/lib/locales/ha.mjs +78 -0
  42. package/scripts/lib/locales/hr.mjs +78 -0
  43. package/scripts/lib/locales/hu.mjs +78 -0
  44. package/scripts/lib/locales/id.mjs +78 -0
  45. package/scripts/lib/locales/is.mjs +78 -0
  46. package/scripts/lib/locales/it.mjs +78 -0
  47. package/scripts/lib/locales/jv.mjs +78 -0
  48. package/scripts/lib/locales/lb.mjs +78 -0
  49. package/scripts/lib/locales/lt.mjs +78 -0
  50. package/scripts/lib/locales/lv.mjs +78 -0
  51. package/scripts/lib/locales/mk.mjs +78 -0
  52. package/scripts/lib/locales/mt.mjs +78 -0
  53. package/scripts/lib/locales/nb.mjs +78 -0
  54. package/scripts/lib/locales/nl.mjs +78 -0
  55. package/scripts/lib/locales/nn.mjs +78 -0
  56. package/scripts/lib/locales/pcm.mjs +78 -0
  57. package/scripts/lib/locales/pl.mjs +78 -0
  58. package/scripts/lib/locales/pt.mjs +78 -0
  59. package/scripts/lib/locales/ro.mjs +78 -0
  60. package/scripts/lib/locales/ru.mjs +78 -0
  61. package/scripts/lib/locales/sk.mjs +78 -0
  62. package/scripts/lib/locales/sl.mjs +78 -0
  63. package/scripts/lib/locales/sq.mjs +78 -0
  64. package/scripts/lib/locales/sr-Cyrl.mjs +78 -0
  65. package/scripts/lib/locales/sr-Latn.mjs +78 -0
  66. package/scripts/lib/locales/sv.mjs +78 -0
  67. package/scripts/lib/locales/sw.mjs +78 -0
  68. package/scripts/lib/locales/tr.mjs +78 -0
  69. package/scripts/lib/locales/uk.mjs +78 -0
  70. package/scripts/lib/locales/vi.mjs +78 -0
  71. package/scripts/lib/markdown-links.mjs +4 -25
  72. package/scripts/lib/markdown-notes-render-plugin.mjs +75 -0
  73. package/scripts/lib/markdown-notes.mjs +165 -0
  74. package/scripts/lib/norna-markdown-blocks.mjs +32 -447
  75. package/scripts/lib/norna-markdown-render-plugin.mjs +4 -0
  76. package/scripts/lib/page-aliases.mjs +12 -1
  77. package/scripts/lib/page-markdown.mjs +63 -16
  78. package/scripts/lib/page-move-plan.mjs +22 -5
  79. package/scripts/lib/pagefind-translations.mjs +620 -0
  80. package/scripts/lib/presentation-contract.mjs +6 -1
  81. package/scripts/lib/presentation.mjs +29 -30
  82. package/scripts/lib/project-config.mjs +2 -173
  83. package/scripts/lib/schema-definitions.mjs +3 -10
  84. package/scripts/lib/schema-editor-metadata.mjs +22 -43
  85. package/scripts/lib/schema-value-definitions.mjs +4 -8
  86. package/scripts/lib/semantic-callouts.mjs +4 -2
  87. package/scripts/lib/site-content.mjs +4 -2
  88. package/scripts/lib/site-link-graph.mjs +16 -6
  89. package/scripts/lib/site-navigation-tree.mjs +0 -11
  90. package/scripts/lib/sitemap.mjs +5 -3
  91. package/scripts/lib/structured-blocks.mjs +108 -0
  92. package/scripts/lib/table-render-plugin.mjs +46 -3
  93. package/scripts/lib/table-row-headers.mjs +218 -0
  94. package/scripts/lib/theme-presets.mjs +3 -10
  95. package/scripts/lib/yaml-config.mjs +2 -6
  96. package/scripts/migrate-check.mjs +19 -0
  97. package/scripts/sync-content-sections.mjs +39 -10
  98. package/scripts/sync-site-public.mjs +7 -1
  99. package/src/components/CodeBlockCopyScript.astro +47 -5
  100. package/src/components/ContentBlocks.astro +39 -0
  101. package/src/components/ContentTabsScript.astro +60 -0
  102. package/src/components/DisplaySettings.astro +17 -19
  103. package/src/components/NavigationPageTree.astro +1 -1
  104. package/src/components/NoteNavigationScript.astro +4 -0
  105. package/src/components/PageAliasRedirect.astro +5 -4
  106. package/src/components/SearchNavigationScript.astro +4 -0
  107. package/src/components/SearchPage.astro +43 -2
  108. package/src/components/SectionNavigationScript.astro +43 -11
  109. package/src/components/SiteBreadcrumbs.astro +1 -1
  110. package/src/components/SiteNavigation.astro +29 -20
  111. package/src/components/SitePage.astro +40 -15
  112. package/src/components/SiteSection.astro +5 -81
  113. package/src/components/SiteTreeNavigation.astro +2 -2
  114. package/src/components/TableOverflowScript.astro +386 -58
  115. package/src/components/TopPageMenu.astro +47 -0
  116. package/src/components/TreeNavigationScript.astro +10 -3
  117. package/src/layouts/BaseLayout.astro +8 -12
  118. package/src/lib/navigationFollowing.ts +142 -0
  119. package/src/lib/noteNavigation.ts +50 -0
  120. package/src/lib/searchNavigation.ts +107 -0
  121. package/src/lib/sectionContent.ts +20 -90
  122. package/src/lib/siteNavigation.ts +0 -5
  123. package/src/lib/sitePages.ts +13 -2
  124. package/src/lib/table-sort-tooltip.ts +109 -0
  125. package/src/pages/[...slug].astro +16 -6
  126. package/src/styles/content.css +394 -132
  127. package/src/styles/foundations.css +9 -0
  128. package/src/styles/media.css +5 -0
  129. package/src/styles/navigation.css +63 -74
  130. package/src/styles/page-layout.css +7 -0
  131. package/src/styles/responsive.css +2 -7
@@ -197,6 +197,90 @@ ul {
197
197
  font-size: clamp(0.96rem, 0.94rem + 0.08vw, 1rem);
198
198
  }
199
199
 
200
+ .content-tabs {
201
+ display: flow-root;
202
+ clear: both;
203
+ min-width: 0;
204
+ margin-block: var(--space-content-block-gap, 1.5rem);
205
+ }
206
+
207
+ .content-tabs-controls {
208
+ display: flex;
209
+ flex-wrap: wrap;
210
+ gap: 0.25rem;
211
+ width: var(--layout-reading-width);
212
+ margin-inline: var(--layout-inline-start-margin) var(--layout-inline-end-margin);
213
+ border-bottom: 1px solid var(--color-border);
214
+ margin-bottom: 1rem;
215
+ }
216
+
217
+ .content-tabs-controls[hidden],
218
+ .content-tab-panel[hidden] { display: none; }
219
+
220
+ .content-tabs-controls button {
221
+ font: inherit;
222
+ color: inherit;
223
+ background: transparent;
224
+ border: 0;
225
+ border-bottom: 2px solid transparent;
226
+ padding: 0.65rem 0.9rem;
227
+ min-height: 44px;
228
+ max-width: 100%;
229
+ overflow-wrap: anywhere;
230
+ cursor: pointer;
231
+ }
232
+
233
+ .content-tabs-controls button[aria-selected='true'] {
234
+ border-bottom-color: currentColor;
235
+ font-weight: 700;
236
+ background: color-mix(in srgb, currentColor 7%, transparent);
237
+ }
238
+
239
+ .content-tabs-controls button:hover { background: color-mix(in srgb, currentColor 10%, transparent); }
240
+ .content-tabs-controls button:focus-visible,
241
+ .content-tab-panel:focus-visible { outline: 2px solid var(--color-focus-ring); outline-offset: 3px; }
242
+ .content-tab-panel { display: flow-root; min-width: 0; }
243
+ .content-tab-label {
244
+ width: var(--layout-reading-width);
245
+ margin-inline: var(--layout-inline-start-margin) var(--layout-inline-end-margin);
246
+ font-weight: 700;
247
+ margin-block: 1.5rem 0.75rem;
248
+ }
249
+ [data-tabs-ready='true'] .content-tab-label { display: none; }
250
+ .content-tab-panel > :first-child + .section-markdown > :first-child { margin-top: 0; }
251
+
252
+ @media print {
253
+ .content-tabs-controls { display: none; }
254
+ .content-tabs .content-tab-panel[hidden] { display: flow-root; }
255
+ [data-tabs-ready='true'] .content-tab-label { display: block; }
256
+ }
257
+
258
+ .section-note-paragraph {
259
+ display: grid;
260
+ grid-template-columns: minmax(0, 1fr);
261
+ align-items: start;
262
+ gap: var(--section-body-paragraph-spacing, 0.85em) var(--layout-note-gap);
263
+ margin-block: 0 var(--section-body-paragraph-spacing, 1em);
264
+ }
265
+
266
+ .section-markdown .section-note-paragraph > p {
267
+ margin: 0;
268
+ min-width: 0;
269
+ }
270
+
271
+ .section-note-stack {
272
+ display: grid;
273
+ gap: 0.75rem;
274
+ min-width: 0;
275
+ }
276
+
277
+ .section-note-stack > .section-note {
278
+ float: none;
279
+ clear: none;
280
+ width: 100%;
281
+ margin: 0;
282
+ }
283
+
200
284
  .section-note {
201
285
  display: grid;
202
286
  grid-template-columns: auto minmax(0, 1fr);
@@ -221,6 +305,11 @@ ul {
221
305
  text-decoration: none;
222
306
  }
223
307
 
308
+ .section-note-number a {
309
+ color: inherit;
310
+ text-decoration: none;
311
+ }
312
+
224
313
  .section-note-ref {
225
314
  display: inline-block;
226
315
  margin-left: 0.03em;
@@ -237,12 +326,12 @@ ul {
237
326
  text-underline-offset: 0.15em;
238
327
  }
239
328
 
240
- .section-note:target {
329
+ .section-note:target,
330
+ .section-note.is-reference-highlighted {
241
331
  border-inline-start-color: currentColor;
242
332
  background: color-mix(in srgb, currentColor 6%, transparent);
243
333
  }
244
334
 
245
- .section-note-ref:has(+ .section-note:hover) a,
246
335
  .section-note-ref a:hover,
247
336
  .section-note-ref a:focus-visible {
248
337
  text-decoration-thickness: 0.16em;
@@ -250,6 +339,14 @@ ul {
250
339
 
251
340
  .section-note-content {
252
341
  min-width: 0;
342
+ overflow-wrap: anywhere;
343
+ }
344
+
345
+ @media print {
346
+ .section-note-paragraph {
347
+ grid-template-columns: minmax(0, 1fr) !important;
348
+ width: 100% !important;
349
+ }
253
350
  }
254
351
 
255
352
  .section-markdown {
@@ -359,25 +456,30 @@ ul {
359
456
  color: inherit;
360
457
  }
361
458
 
459
+ .section-markdown > :is(.norna-table-frame, .code-block) {
460
+ /* Width probes need final geometry, including with reduced-motion overrides. */
461
+ transition-property: none;
462
+ --wide-block-prose-width: 100%;
463
+ --wide-block-end-width: calc((100cqi + var(--layout-reading-width)) / 2);
464
+ --wide-block-canvas-width: 100cqi;
465
+ --wide-block-canvas-inline-offset: calc((var(--layout-reading-width) - 100cqi) / 2);
466
+ }
467
+
362
468
  .section-markdown > .norna-table-frame {
363
- --table-prose-width: 100%;
364
- --table-end-width: calc((100cqi + var(--layout-reading-width)) / 2);
365
- --table-canvas-width: 100cqi;
366
- --table-canvas-inline-offset: calc((var(--layout-reading-width) - 100cqi) / 2);
367
- width: var(--table-end-width);
469
+ width: var(--wide-block-end-width);
368
470
  }
369
471
 
370
- .section-markdown > .norna-table-frame[data-table-layout='prose'] {
371
- width: var(--table-prose-width);
472
+ .section-markdown > :is([data-table-layout='prose'], [data-code-layout='prose']) {
473
+ width: var(--wide-block-prose-width);
372
474
  }
373
475
 
374
- .section-markdown > .norna-table-frame[data-table-layout='end'] {
375
- width: var(--table-end-width);
476
+ .section-markdown > :is([data-table-layout='end'], [data-code-layout='end']) {
477
+ width: var(--wide-block-end-width);
376
478
  }
377
479
 
378
- .section-markdown > .norna-table-frame[data-table-layout='canvas'] {
379
- width: var(--table-canvas-width);
380
- margin-inline-start: var(--table-canvas-inline-offset);
480
+ .section-markdown > :is(.norna-table-frame[data-table-layout='canvas'], .code-block[data-code-layout='canvas']) {
481
+ width: var(--wide-block-canvas-width);
482
+ margin-inline-start: var(--wide-block-canvas-inline-offset);
381
483
  }
382
484
 
383
485
  .norna-table-scroll {
@@ -395,14 +497,45 @@ ul {
395
497
  outline-offset: 2px;
396
498
  }
397
499
 
398
- .norna-table-navigation {
500
+ .norna-table-frame[data-table-custom-scrollbars='true'] > .norna-table-scroll {
501
+ scrollbar-width: none;
502
+ scrollbar-gutter: auto;
503
+ }
504
+
505
+ .norna-table-frame[data-table-custom-scrollbars='true'] > .norna-table-scroll::-webkit-scrollbar {
506
+ display: none;
507
+ }
508
+
509
+ .norna-table-sort-tooltip {
510
+ position: fixed;
511
+ z-index: 100;
512
+ width: max-content;
513
+ max-width: calc(100vw - 1rem);
514
+ padding: 0.375rem 0.625rem;
515
+ border: 1px solid var(--color-border);
516
+ border-radius: var(--corner-radius-small, 2px);
517
+ background: var(--color-surface-emphasis-background);
518
+ color: var(--color-surface-emphasis-text);
519
+ font-size: 0.8125rem;
520
+ line-height: 1.4;
521
+ overflow-wrap: anywhere;
522
+ }
523
+
524
+ .norna-table-sort-tooltip[hidden] {
525
+ display: none;
526
+ }
527
+
528
+ .norna-table-sticky-context {
399
529
  position: sticky;
400
530
  top: var(--site-top-anchor-offset);
401
531
  z-index: 5;
532
+ background: var(--section-background-color, var(--color-page));
533
+ }
534
+
535
+ .norna-table-navigation {
536
+ position: relative;
402
537
  display: flex;
403
- min-height: 2.75rem;
404
538
  align-items: center;
405
- justify-content: flex-end;
406
539
  padding: 0;
407
540
  background: var(--section-background-color, var(--color-page));
408
541
  color: inherit;
@@ -413,76 +546,74 @@ ul {
413
546
  display: none;
414
547
  }
415
548
 
416
- .norna-table-navigation-buttons {
417
- display: flex;
418
- gap: 0.125rem;
419
- background: transparent;
420
- pointer-events: auto;
421
- }
422
-
423
- .norna-table-navigation button {
549
+ .norna-table-scrollbar {
424
550
  position: relative;
425
- display: grid;
426
- width: 2.75rem;
427
- height: 2.75rem;
428
- place-items: center;
429
- border: 0;
430
- border-radius: var(--corner-radius-small, 2px);
431
- padding: 0;
432
- background: transparent;
433
- color: var(--section-secondary-text-color, var(--color-secondary-text));
551
+ flex: 1;
552
+ min-width: 2.75rem;
553
+ height: 1.5rem;
554
+ pointer-events: auto;
555
+ touch-action: none;
556
+ user-select: none;
434
557
  cursor: pointer;
558
+ border-radius: var(--corner-radius-small, 2px);
435
559
  }
436
560
 
437
- .norna-table-navigation button::before {
561
+ .norna-table-scrollbar::before,
562
+ .norna-table-scrollbar-thumb::before {
438
563
  position: absolute;
439
- inset: 0.3rem;
440
- border: 1px solid color-mix(in srgb, var(--color-border) 72%, transparent);
441
- border-radius: var(--corner-radius-small, 2px);
442
- background: color-mix(
443
- in srgb,
444
- var(--color-surface-soft-background) 52%,
445
- var(--section-background-color, var(--color-page))
446
- );
564
+ left: 0;
565
+ right: 0;
566
+ top: calc(50% - 2px);
567
+ height: 4px;
568
+ border-radius: 2px;
447
569
  content: '';
448
570
  }
449
571
 
450
- .norna-table-navigation button svg {
451
- position: relative;
452
- z-index: 1;
572
+ .norna-table-scrollbar::before {
573
+ background: var(--color-surface-emphasis-background);
453
574
  }
454
575
 
455
- .norna-table-navigation button:hover:not(:disabled),
456
- .norna-table-navigation button:active:not(:disabled) {
457
- color: var(--color-surface-emphasis-text);
576
+ .norna-table-scrollbar-thumb {
577
+ position: absolute;
578
+ top: 0;
579
+ height: 100%;
580
+ cursor: grab;
458
581
  }
459
582
 
460
- .norna-table-navigation button:hover:not(:disabled)::before,
461
- .norna-table-navigation button:active:not(:disabled)::before {
462
- border-color: var(--color-border);
463
- background: var(--color-surface-emphasis-background);
583
+ .norna-table-scrollbar-thumb::before {
584
+ background: var(--section-secondary-text-color, var(--color-secondary-text));
464
585
  }
465
586
 
466
- .norna-table-navigation button:focus-visible {
467
- outline: var(--focus-indicator-width) solid var(--color-focus-ring);
468
- outline-offset: 2px;
469
- box-shadow: 0 0 0 calc(var(--focus-indicator-width) * 2) var(--color-focus-ring-contrast);
587
+ .norna-table-scrollbar:hover .norna-table-scrollbar-thumb::before,
588
+ .norna-table-scrollbar:focus-visible .norna-table-scrollbar-thumb::before {
589
+ background: var(--section-text-color, var(--color-text));
590
+ }
591
+
592
+ .norna-table-scrollbar[data-dragging='true'],
593
+ .norna-table-scrollbar[data-dragging='true'] .norna-table-scrollbar-thumb {
594
+ cursor: grabbing;
470
595
  }
471
596
 
472
- .norna-table-navigation button:disabled {
473
- cursor: not-allowed;
474
- opacity: 0.42;
597
+ .norna-table-scrollbar:focus-visible {
598
+ outline: var(--focus-indicator-width) solid var(--color-focus-ring);
599
+ outline-offset: 2px;
475
600
  }
476
601
 
477
- .norna-table-frame:dir(rtl) .norna-table-navigation button svg {
478
- transform: scaleX(-1);
602
+ @media (forced-colors: active) {
603
+ .norna-table-scrollbar::before {
604
+ background: Canvas;
605
+ border: 1px solid CanvasText;
606
+ }
607
+ .norna-table-scrollbar .norna-table-scrollbar-thumb::before {
608
+ background: ButtonText !important;
609
+ forced-color-adjust: none;
610
+ }
479
611
  }
480
612
 
481
613
  .norna-table-sticky-heading {
482
614
  display: none;
483
- position: sticky;
615
+ position: relative;
484
616
  z-index: 4;
485
- top: calc(var(--site-top-anchor-offset) + var(--table-navigation-height, 0px));
486
617
  width: 100%;
487
618
  height: var(--table-sticky-heading-height, 0px);
488
619
  overflow: hidden;
@@ -491,7 +622,7 @@ ul {
491
622
  }
492
623
 
493
624
  .norna-table-frame[data-table-overflow='true'][data-table-sticky-heading='true']
494
- > .norna-table-sticky-heading {
625
+ > .norna-table-sticky-context > .norna-table-sticky-heading {
495
626
  display: block;
496
627
  }
497
628
 
@@ -517,64 +648,36 @@ ul {
517
648
  color: inherit;
518
649
  }
519
650
 
520
- .norna-table-frame::before,
521
- .norna-table-frame::after {
522
- position: absolute;
523
- z-index: 3;
524
- top: var(--table-navigation-height, 0px);
525
- bottom: 0.75rem;
526
- width: 2rem;
527
- content: "";
528
- opacity: 0;
529
- pointer-events: none;
530
- transition: opacity 120ms ease;
531
- }
532
-
533
- .norna-table-frame::before {
534
- inset-inline-start: 0;
535
- background: linear-gradient(
536
- to right,
537
- color-mix(in srgb, var(--section-background-color, var(--color-page)) 98%, transparent),
538
- transparent
539
- );
540
- box-shadow: inset 0.5rem 0 0.7rem -0.65rem color-mix(in srgb, currentColor 62%, transparent);
541
- }
542
-
543
- .norna-table-frame::after {
544
- inset-inline-end: 0;
545
- background: linear-gradient(
546
- to left,
547
- color-mix(in srgb, var(--section-background-color, var(--color-page)) 98%, transparent),
548
- transparent
549
- );
550
- box-shadow: inset -0.5rem 0 0.7rem -0.65rem color-mix(in srgb, currentColor 62%, transparent);
651
+ .norna-table-frame[data-table-row-headers='true'] table {
652
+ --table-row-header-min-width: min(12ch, 40vw);
653
+ --table-row-header-max-width: min(18rem, 55vw);
551
654
  }
552
655
 
553
- .norna-table-frame:dir(rtl)::before {
554
- background: linear-gradient(
555
- to left,
556
- color-mix(in srgb, var(--section-background-color, var(--color-page)) 98%, transparent),
557
- transparent
558
- );
559
- box-shadow: inset -0.5rem 0 0.7rem -0.65rem color-mix(in srgb, currentColor 62%, transparent);
560
- }
561
-
562
- .norna-table-frame:dir(rtl)::after {
563
- background: linear-gradient(
564
- to right,
565
- color-mix(in srgb, var(--section-background-color, var(--color-page)) 98%, transparent),
566
- transparent
567
- );
568
- box-shadow: inset 0.5rem 0 0.7rem -0.65rem color-mix(in srgb, currentColor 62%, transparent);
656
+ .norna-table-frame[data-table-row-headers='true'] :is(
657
+ thead th:first-child,
658
+ tbody th[scope='row'],
659
+ .norna-table-sticky-heading-cell-row-header
660
+ ) {
661
+ min-width: var(--table-row-header-min-width);
662
+ max-width: var(--table-row-header-max-width);
663
+ border-inline-end: 1px solid color-mix(in srgb, currentColor 38%, transparent);
664
+ background: var(--section-background-color, var(--color-page));
665
+ overflow-wrap: break-word;
666
+ text-align: start;
569
667
  }
570
668
 
571
- .norna-table-frame[data-table-at-end='true']::after {
572
- opacity: 0;
669
+ .section-markdown > .norna-table-frame[data-table-row-headers='true'] :is(
670
+ thead th:first-child,
671
+ tbody th[scope='row']
672
+ ) {
673
+ position: sticky;
674
+ inset-inline-start: 0;
675
+ z-index: 2;
573
676
  }
574
677
 
575
- .norna-table-frame[data-table-overflow='true'][data-table-at-end='false']::after,
576
- .norna-table-frame[data-table-overflow='true'][data-table-at-start='false']::before {
577
- opacity: 1;
678
+ .section-markdown > .norna-table-frame[data-table-row-headers='true'] thead th:first-child,
679
+ .norna-table-sticky-heading-cell-row-header {
680
+ z-index: 3;
578
681
  }
579
682
 
580
683
  .norna-table-frame table {
@@ -604,6 +707,59 @@ ul {
604
707
  background: var(--section-background-color, var(--color-page));
605
708
  }
606
709
 
710
+ .norna-table-sort-button {
711
+ display: flex;
712
+ width: 100%;
713
+ min-height: 1.5rem;
714
+ align-items: flex-start;
715
+ justify-content: space-between;
716
+ gap: 0.6rem;
717
+ margin: -0.55rem -0.65rem;
718
+ border: 0;
719
+ padding: 0.55rem 0.65rem;
720
+ background: transparent;
721
+ color: inherit;
722
+ font: inherit;
723
+ font-weight: inherit;
724
+ text-align: inherit;
725
+ cursor: pointer;
726
+ }
727
+
728
+ .norna-table-sort-button:hover {
729
+ background: color-mix(in srgb, var(--color-surface-soft-background) 64%, transparent);
730
+ }
731
+
732
+ .norna-table-sort-button:focus-visible {
733
+ outline: var(--focus-indicator-width) solid var(--color-focus-ring);
734
+ outline-offset: -2px;
735
+ }
736
+
737
+ .norna-table-sticky-heading:not([inert]) .norna-table-sort-button {
738
+ pointer-events: auto;
739
+ }
740
+
741
+ .norna-table-sort-indicator {
742
+ display: inline-grid;
743
+ flex: 0 0 auto;
744
+ width: 0.95rem;
745
+ height: 0.95rem;
746
+ /* Center on the first text line, not the full wrapped heading. */
747
+ margin-block-start: calc((1lh - 0.95rem) / 2);
748
+ place-items: center;
749
+ color: var(--section-secondary-text-color, var(--color-secondary-text));
750
+ }
751
+
752
+ .norna-table-sort-indicator > span {
753
+ display: none;
754
+ grid-area: 1 / 1;
755
+ }
756
+
757
+ .norna-table-sort-button[data-table-sort-state='unsorted'] .norna-table-sort-indicator > [data-table-sort-icon='unsorted'],
758
+ .norna-table-sort-button[data-table-sort-state='ascending'] .norna-table-sort-indicator > [data-table-sort-icon='ascending'],
759
+ .norna-table-sort-button[data-table-sort-state='descending'] .norna-table-sort-indicator > [data-table-sort-icon='descending'] {
760
+ display: inline-flex;
761
+ }
762
+
607
763
  .section-markdown > .norna-table-frame[data-table-overflow='false'] .norna-table-scroll {
608
764
  overflow: visible;
609
765
  }
@@ -615,37 +771,37 @@ ul {
615
771
  }
616
772
 
617
773
  @media (min-width: 961px) {
618
- .site-page-layout-tree .section-markdown > .norna-table-frame {
619
- --table-end-width: 100cqi;
620
- --table-canvas-width: var(--table-end-width);
621
- --table-canvas-inline-offset: 0px;
774
+ .site-page-layout-tree .section-markdown > :is(.norna-table-frame, .code-block) {
775
+ --wide-block-end-width: 100cqi;
776
+ --wide-block-canvas-width: var(--wide-block-end-width);
777
+ --wide-block-canvas-inline-offset: 0px;
622
778
  }
623
779
 
624
780
  :root[data-reader-preferences-ready='true'][data-focus-reading='on']
625
- .site-page-layout-tree .section-markdown > .norna-table-frame {
626
- --table-canvas-width: calc(100cqi + var(--tree-navigation-width) + var(--tree-layout-gap));
627
- --table-canvas-inline-offset: calc(0px - var(--tree-navigation-width) - var(--tree-layout-gap));
781
+ .site-page-layout-tree .section-markdown > :is(.norna-table-frame, .code-block) {
782
+ --wide-block-canvas-width: calc(100cqi + var(--tree-navigation-width) + var(--tree-layout-gap));
783
+ --wide-block-canvas-inline-offset: calc(0px - var(--tree-navigation-width) - var(--tree-layout-gap));
628
784
  }
629
785
  }
630
786
 
631
787
  @media (min-width: 1101px) {
632
788
  :root[data-reader-preferences-ready='true'][data-focus-reading='on']
633
- .site-page-layout-tree .section-markdown > .norna-table-frame {
634
- --table-end-width: calc(100cqi + var(--contents-navigation-width) + var(--tree-layout-gap));
635
- --table-canvas-width: calc(
789
+ .site-page-layout-tree .section-markdown > :is(.norna-table-frame, .code-block) {
790
+ --wide-block-end-width: calc(100cqi + var(--contents-navigation-width) + var(--tree-layout-gap));
791
+ --wide-block-canvas-width: calc(
636
792
  100cqi
637
793
  + var(--tree-navigation-width)
638
794
  + var(--contents-navigation-width)
639
795
  + (var(--tree-layout-gap) * 2)
640
796
  );
641
- --table-canvas-inline-offset: calc(0px - var(--tree-navigation-width) - var(--tree-layout-gap));
797
+ --wide-block-canvas-inline-offset: calc(0px - var(--tree-navigation-width) - var(--tree-layout-gap));
642
798
  }
643
799
  }
644
800
 
645
801
  @media (min-width: 1281px) {
646
- .site-page-layout-tree:not(.site-page-layout-contents) .section-markdown > .norna-table-frame {
647
- --table-end-width: calc(100cqi + var(--contents-navigation-width) + var(--tree-layout-gap));
648
- --table-canvas-width: var(--table-end-width);
802
+ .site-page-layout-tree:not(.site-page-layout-contents) .section-markdown > :is(.norna-table-frame, .code-block) {
803
+ --wide-block-end-width: calc(100cqi + var(--contents-navigation-width) + var(--tree-layout-gap));
804
+ --wide-block-canvas-width: var(--wide-block-end-width);
649
805
  }
650
806
  }
651
807
 
@@ -704,6 +860,61 @@ ul {
704
860
  margin-bottom: 0;
705
861
  }
706
862
 
863
+ .section-markdown details {
864
+ margin: 0 0 var(--section-body-paragraph-spacing, 1em);
865
+ border: 1px solid color-mix(in srgb, var(--color-accent) 34%, transparent);
866
+ border-inline-start: 0.3rem solid var(--color-accent);
867
+ border-radius: var(--corner-radius-medium, 6px);
868
+ background: var(--color-surface-soft-background);
869
+ color: var(--color-surface-soft-text);
870
+ contain: paint;
871
+ }
872
+
873
+ .section-markdown details > summary {
874
+ position: relative;
875
+ padding: 0.7rem 1rem 0.65rem 1.45rem;
876
+ color: inherit;
877
+ font-family: var(--font-sans);
878
+ font-size: 0.82rem;
879
+ font-weight: 700;
880
+ line-height: 1.35;
881
+ cursor: pointer;
882
+ list-style: none;
883
+ }
884
+
885
+ .section-markdown details > summary::-webkit-details-marker {
886
+ display: none;
887
+ }
888
+
889
+ .section-markdown details > summary::before {
890
+ position: absolute;
891
+ left: 0.4rem;
892
+ top: 0.9rem;
893
+ width: 0;
894
+ height: 0;
895
+ border-top: 0.3rem solid transparent;
896
+ border-bottom: 0.3rem solid transparent;
897
+ border-left: 0.4rem solid var(--color-accent);
898
+ content: '';
899
+ transition: transform 0.15s ease;
900
+ }
901
+
902
+ .section-markdown details[open] > summary::before {
903
+ transform: rotate(90deg);
904
+ }
905
+
906
+ .section-markdown details > summary::marker {
907
+ color: var(--color-accent);
908
+ }
909
+
910
+ .section-markdown details > :not(summary) {
911
+ margin-inline: 1rem;
912
+ }
913
+
914
+ .section-markdown details > :last-child {
915
+ margin-bottom: 1rem;
916
+ }
917
+
707
918
  .section-markdown .norna-callout {
708
919
  --callout-accent: var(--color-accent);
709
920
  --callout-background: var(--color-surface-soft-background);
@@ -729,12 +940,18 @@ ul {
729
940
  --callout-text: var(--color-success-text);
730
941
  }
731
942
 
732
- .section-markdown :is(.norna-callout-warning, .norna-callout-caution) {
943
+ .section-markdown .norna-callout-warning {
733
944
  --callout-accent: var(--color-warning-accent);
734
945
  --callout-background: var(--color-warning-surface);
735
946
  --callout-text: var(--color-warning-text);
736
947
  }
737
948
 
949
+ .section-markdown .norna-callout-caution {
950
+ --callout-accent: var(--color-caution-accent);
951
+ --callout-background: var(--color-caution-surface);
952
+ --callout-text: var(--color-caution-text);
953
+ }
954
+
738
955
  .section-markdown .norna-callout-danger {
739
956
  --callout-accent: var(--color-error-accent);
740
957
  --callout-background: var(--color-error-surface);
@@ -773,9 +990,19 @@ ul {
773
990
 
774
991
  .section-markdown .code-block {
775
992
  position: relative;
993
+ clear: both;
776
994
  margin: 0 0 var(--section-body-paragraph-spacing, 1em);
777
995
  }
778
996
 
997
+ .code-block[data-code-overflow='true'] > pre {
998
+ border-inline-end: 3px solid var(--color-code-text);
999
+ }
1000
+
1001
+ .code-block > pre:focus-visible {
1002
+ outline: var(--focus-indicator-width) solid var(--color-focus-ring);
1003
+ outline-offset: 2px;
1004
+ }
1005
+
779
1006
  .section-markdown .norna-code-example {
780
1007
  margin: 0 0 var(--section-body-paragraph-spacing, 1em);
781
1008
  border: 1px solid color-mix(in srgb, var(--color-code-text) 18%, transparent);
@@ -866,6 +1093,41 @@ ul {
866
1093
  display: none;
867
1094
  }
868
1095
 
1096
+ .code-block-copy-status {
1097
+ position: absolute;
1098
+ top: 50%;
1099
+ inset-inline-end: calc(100% + 0.45rem);
1100
+ inline-size: max-content;
1101
+ max-inline-size: min(16rem, calc(100vw - 5.5rem));
1102
+ padding: 0.25rem 0.45rem;
1103
+ border: 1px solid currentColor;
1104
+ border-radius: var(--corner-radius-small, 2px);
1105
+ font-family: var(--font-sans);
1106
+ font-size: 0.75rem;
1107
+ font-weight: 650;
1108
+ line-height: 1.25;
1109
+ text-align: start;
1110
+ transform: translateY(-50%);
1111
+ white-space: normal;
1112
+ pointer-events: none;
1113
+ }
1114
+
1115
+ .code-block-copy:not([data-copy-state='failed']) .code-block-copy-status {
1116
+ inline-size: 1px;
1117
+ block-size: 1px;
1118
+ padding: 0;
1119
+ border: 0;
1120
+ overflow: hidden;
1121
+ clip-path: inset(50%);
1122
+ white-space: nowrap;
1123
+ }
1124
+
1125
+ .code-block-copy[data-copy-state='failed'] .code-block-copy-status {
1126
+ border-color: var(--color-error-accent);
1127
+ background: var(--color-error-surface);
1128
+ color: var(--color-error-text);
1129
+ }
1130
+
869
1131
  .section-markdown pre.astro-code code {
870
1132
  font: inherit;
871
1133
  }