@janga/norna 0.7.24 → 0.7.25

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 (43) hide show
  1. package/README.md +2 -2
  2. package/astro.config.mjs +2 -0
  3. package/package.json +14 -2
  4. package/schemas/category.schema.json +2 -2
  5. package/schemas/config.schema.json +56 -21
  6. package/schemas/content-frontmatter.schema.json +7 -7
  7. package/schemas/page-theme.schema.json +26 -26
  8. package/schemas/sitewide-content.schema.json +18 -18
  9. package/schemas/theme.schema.json +241 -241
  10. package/scripts/check-config.mjs +5 -1
  11. package/scripts/dev-local.mjs +106 -11
  12. package/scripts/init-site.mjs +2 -0
  13. package/scripts/lib/code-fence-metadata.mjs +11 -6
  14. package/scripts/lib/edit-source-link.mjs +53 -0
  15. package/scripts/lib/navigation-model.mjs +1 -1
  16. package/scripts/lib/norna-markdown-blocks.mjs +91 -0
  17. package/scripts/lib/project-config.mjs +42 -12
  18. package/scripts/lib/schema-definitions.mjs +10 -2
  19. package/scripts/lib/schema-editor-metadata.mjs +20 -3
  20. package/scripts/lib/schema-value-definitions.mjs +3 -0
  21. package/scripts/lib/site-paths.mjs +14 -2
  22. package/scripts/lib/table-render-plugin.mjs +33 -0
  23. package/src/components/CardList.astro +1 -0
  24. package/src/components/CodeBlockCopyScript.astro +2 -1
  25. package/src/components/ImageCarousel.astro +4 -1
  26. package/src/components/ImageStack.astro +34 -9
  27. package/src/components/ImageStackEnhancement.astro +331 -0
  28. package/src/components/PageContentsNavigation.astro +2 -3
  29. package/src/components/SectionNavigationScript.astro +45 -7
  30. package/src/components/SiteNavigation.astro +73 -49
  31. package/src/components/SitePage.astro +38 -23
  32. package/src/components/SiteTreeNavigation.astro +3 -0
  33. package/src/components/TableOverflowScript.astro +251 -0
  34. package/src/components/TreeNavigationScript.astro +78 -22
  35. package/src/layouts/BaseLayout.astro +31 -5
  36. package/src/lib/generatedImages.ts +18 -0
  37. package/src/lib/sectionContent.ts +4 -27
  38. package/src/lib/sitePages.ts +6 -3
  39. package/src/styles/content.css +298 -23
  40. package/src/styles/media.css +187 -3
  41. package/src/styles/navigation.css +168 -3
  42. package/src/styles/page-layout.css +48 -16
  43. package/src/styles/responsive.css +67 -20
@@ -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
 
@@ -430,6 +430,171 @@
430
430
  display: none;
431
431
  }
432
432
 
433
+ .mobile-nav-trigger-icon {
434
+ display: block;
435
+ width: 1rem;
436
+ height: 1rem;
437
+ stroke-width: 2;
438
+ }
439
+
440
+ .mobile-nav-trigger-close,
441
+ .mobile-nav-menu[open] .mobile-nav-trigger-open {
442
+ display: none;
443
+ }
444
+
445
+ .mobile-nav-menu[open] .mobile-nav-trigger-close {
446
+ display: block;
447
+ }
448
+
449
+ .mobile-nav-panel-actions {
450
+ display: flex;
451
+ justify-content: flex-end;
452
+ width: min(100%, 32rem);
453
+ margin: 0 auto 0.5rem;
454
+ }
455
+
456
+ .mobile-nav-close {
457
+ display: grid;
458
+ width: 2.75rem;
459
+ height: 2.75rem;
460
+ place-items: center;
461
+ border: 1px solid currentColor;
462
+ border-radius: 50%;
463
+ padding: 0;
464
+ background: transparent;
465
+ color: currentColor;
466
+ cursor: pointer;
467
+ }
468
+
469
+ .mobile-nav-close:hover,
470
+ .mobile-nav-close:focus-visible {
471
+ background: color-mix(in srgb, currentColor 9%, transparent);
472
+ }
473
+
474
+ .mobile-nav-close:focus-visible {
475
+ outline: var(--focus-indicator-width) solid var(--color-focus-ring);
476
+ outline-offset: 2px;
477
+ }
478
+
479
+ .mobile-nav-close svg {
480
+ width: 1.1rem;
481
+ height: 1.1rem;
482
+ stroke-width: 2;
483
+ }
484
+
485
+ .mobile-navigation-open {
486
+ overflow: hidden;
487
+ }
488
+
489
+ @media (min-width: 701px) {
490
+ .mobile-nav-menu {
491
+ position: relative;
492
+ flex: 0 0 auto;
493
+ margin-left: auto;
494
+ }
495
+
496
+ :root[data-reader-preferences-ready='true'][data-focus-reading='on'] .mobile-nav-menu {
497
+ display: block;
498
+ }
499
+
500
+ .mobile-nav-menu > summary {
501
+ display: flex;
502
+ align-items: center;
503
+ gap: 0.5rem;
504
+ min-height: 2.75rem;
505
+ border: 1px solid currentColor;
506
+ padding: 0.55rem 0.75rem;
507
+ color: var(--site-top-text-color, var(--color-primary-text));
508
+ font-size: 0.72rem;
509
+ font-weight: 700;
510
+ letter-spacing: 0.1em;
511
+ line-height: 1;
512
+ list-style: none;
513
+ text-transform: uppercase;
514
+ }
515
+
516
+ .mobile-nav-menu > summary::-webkit-details-marker {
517
+ display: none;
518
+ }
519
+
520
+ .mobile-nav-panel {
521
+ position: fixed;
522
+ top: var(--site-top-anchor-offset);
523
+ right: 0;
524
+ bottom: 0;
525
+ left: 0;
526
+ z-index: 20;
527
+ width: 100%;
528
+ max-height: none;
529
+ border-top: 1px solid color-mix(in srgb, currentColor 24%, transparent);
530
+ padding: clamp(1.25rem, 5vw, 2rem) var(--content-gutter) max(1.5rem, env(safe-area-inset-bottom));
531
+ background: var(--site-top-background-color, var(--color-page));
532
+ box-shadow: 0 1.5rem 3.5rem rgb(0 0 0 / 0.32);
533
+ color: var(--site-top-text-color, var(--color-text));
534
+ overflow-y: auto;
535
+ overscroll-behavior: contain;
536
+ }
537
+
538
+ .mobile-site-nav {
539
+ width: min(100%, 32rem);
540
+ margin: 0 auto;
541
+ }
542
+
543
+ .mobile-nav-panel h2 {
544
+ margin: 0 0 1.25rem;
545
+ font-size: 1.4rem;
546
+ font-weight: 650;
547
+ letter-spacing: 0;
548
+ line-height: 1.2;
549
+ text-transform: none;
550
+ }
551
+
552
+ .mobile-nav-panel .navigation-tree-controls {
553
+ position: static;
554
+ margin-bottom: 1rem;
555
+ padding-bottom: 1rem;
556
+ background: var(--site-top-background-color, var(--color-page));
557
+ }
558
+
559
+ .mobile-nav-panel a {
560
+ font-family: inherit;
561
+ font-size: 0.9rem;
562
+ letter-spacing: 0;
563
+ line-height: 1.4;
564
+ text-transform: none;
565
+ }
566
+
567
+ .navigation-page-tree-mobile .navigation-page-link {
568
+ display: block;
569
+ border-radius: var(--corner-radius-small, 2px);
570
+ padding: 0.45rem 0.3rem 0.45rem var(--tree-disclosure-offset);
571
+ color: var(--color-secondary-text);
572
+ text-decoration: none;
573
+ }
574
+
575
+ .navigation-page-tree-mobile .navigation-page-branch-content {
576
+ margin: 0.1rem 0 0.2rem 0.25rem;
577
+ border-left: 1px solid color-mix(in srgb, currentColor 16%, transparent);
578
+ padding-left: 0.75rem;
579
+ }
580
+
581
+ .navigation-page-tree-mobile .navigation-page-tree-mobile {
582
+ margin: 0.15rem 0;
583
+ border-left: 0;
584
+ padding-left: 0;
585
+ }
586
+ }
587
+
588
+ @media (min-width: 701px) and (max-width: 960px) {
589
+ .site-top[data-navigation-mode='tree'] .site-nav {
590
+ display: none;
591
+ }
592
+
593
+ .site-top[data-navigation-mode='tree'] .mobile-nav-menu {
594
+ display: block;
595
+ }
596
+ }
597
+
433
598
  .page-nav {
434
599
  border-top: 1px solid color-mix(in srgb, currentColor 14%, transparent);
435
600
  }
@@ -440,7 +605,7 @@
440
605
 
441
606
  .page-nav-inner {
442
607
  display: flex;
443
- align-items: center;
608
+ align-items: baseline;
444
609
  justify-content: center;
445
610
  gap: clamp(1.1rem, 2.5vw, 2rem);
446
611
  width: min(calc(100% - (var(--content-gutter) * 2)), var(--page-width));
@@ -40,7 +40,7 @@
40
40
  background-color: transparent;
41
41
  }
42
42
 
43
- @media (min-width: 701px) {
43
+ @media (min-width: 961px) {
44
44
  .site-page-layout-tree > .site-content {
45
45
  --layout-inline-start-margin: 0;
46
46
  --layout-inline-end-margin: auto;
@@ -48,7 +48,7 @@
48
48
  }
49
49
  }
50
50
 
51
- .tree-local-navigation {
51
+ :is(.tree-local-navigation, .mobile-site-nav, .page-contents-navigation) {
52
52
  --tree-disclosure-icon-width: 0.9rem;
53
53
  --tree-disclosure-gap: 0.6rem;
54
54
  --tree-disclosure-offset: calc(var(--tree-disclosure-icon-width) + var(--tree-disclosure-gap));
@@ -57,6 +57,9 @@
57
57
  var(--color-surface-soft-background) 58%,
58
58
  var(--color-page)
59
59
  );
60
+ }
61
+
62
+ .tree-local-navigation {
60
63
  position: sticky;
61
64
  top: calc(var(--site-top-anchor-offset) + 1.25rem);
62
65
  z-index: 3;
@@ -177,13 +180,23 @@
177
180
  display: none;
178
181
  }
179
182
 
180
- :root[data-appearance='dark'] .tree-local-navigation {
181
- --tree-current-item-background: var(--color-surface-soft-background);
183
+ :root[data-appearance='dark']
184
+ :is(.tree-local-navigation, .mobile-site-nav, .page-contents-navigation) {
185
+ --tree-current-item-background: color-mix(
186
+ in srgb,
187
+ var(--color-surface-emphasis-background) 64%,
188
+ var(--color-surface-soft-background)
189
+ );
182
190
  }
183
191
 
184
192
  @media (prefers-color-scheme: dark) {
185
- :root[data-appearance='system'] .tree-local-navigation {
186
- --tree-current-item-background: var(--color-surface-soft-background);
193
+ :root[data-appearance='system']
194
+ :is(.tree-local-navigation, .mobile-site-nav, .page-contents-navigation) {
195
+ --tree-current-item-background: color-mix(
196
+ in srgb,
197
+ var(--color-surface-emphasis-background) 64%,
198
+ var(--color-surface-soft-background)
199
+ );
187
200
  }
188
201
  }
189
202
 
@@ -204,14 +217,6 @@
204
217
  overscroll-behavior: contain;
205
218
  }
206
219
 
207
- .page-contents-navigation-inline {
208
- display: none;
209
- width: min(100%, var(--reader-text-width, var(--page-text-width, var(--text-width))));
210
- margin-inline: var(--layout-inline-start-margin) var(--layout-inline-end-margin);
211
- border-block: 1px solid var(--color-nav-separator);
212
- padding: 0.85rem 0;
213
- }
214
-
215
220
  .page-contents-navigation-label {
216
221
  margin: 0 0 0.65rem;
217
222
  color: var(--color-primary-text);
@@ -221,7 +226,7 @@
221
226
  line-height: 1.3;
222
227
  }
223
228
 
224
- @media (min-width: 701px) and (max-width: 1100px) {
229
+ @media (min-width: 961px) and (max-width: 1280px) {
225
230
  .site-page-layout-tree {
226
231
  --tree-layout-width: max(var(--page-width), 76rem);
227
232
  grid-template-columns: var(--tree-navigation-width) minmax(0, 1fr);
@@ -230,9 +235,30 @@
230
235
  .page-contents-navigation-rail {
231
236
  display: none;
232
237
  }
238
+ }
239
+
240
+ @media (min-width: 1281px) {
241
+ .site-page-layout-tree[data-page-contents-placement='contents-rail']
242
+ .tree-local-navigation .navigation-page-sections,
243
+ .site-page-layout-tree[data-page-contents-placement='contents-rail']
244
+ .tree-local-navigation .navigation-page-sections-disclosure {
245
+ display: none;
246
+ }
247
+ }
233
248
 
234
- .page-contents-navigation-inline {
249
+ @media (max-width: 960px) {
250
+ .site-page-layout-tree {
235
251
  display: block;
252
+ width: 100%;
253
+ }
254
+
255
+ .site-page-layout-tree > .site-content {
256
+ width: min(calc(100% - (var(--content-gutter) * 2)), var(--page-width));
257
+ }
258
+
259
+ .tree-local-navigation,
260
+ .page-contents-navigation {
261
+ display: none;
236
262
  }
237
263
  }
238
264
 
@@ -593,6 +619,12 @@
593
619
  text-underline-offset: 0.25em;
594
620
  }
595
621
 
622
+ .page-contents-navigation-rail .page-contents-links a[aria-current='location'] {
623
+ border-radius: var(--corner-radius-small, 2px);
624
+ background: var(--tree-current-item-background);
625
+ box-shadow: 0 0 0 0.2rem var(--tree-current-item-background);
626
+ }
627
+
596
628
  .page-contents-links a[aria-current='location']::before {
597
629
  position: absolute;
598
630
  top: 0.15em;
@@ -88,18 +88,6 @@
88
88
  text-transform: uppercase;
89
89
  }
90
90
 
91
- .mobile-nav-menu > summary::after {
92
- content: "☰";
93
- font-size: 1rem;
94
- line-height: 1;
95
- opacity: 0.86;
96
- }
97
-
98
- .mobile-nav-menu[open] > summary::after {
99
- content: "×";
100
- font-size: 1.25rem;
101
- }
102
-
103
91
  .mobile-nav-menu > summary::-webkit-details-marker {
104
92
  display: none;
105
93
  }
@@ -511,11 +499,21 @@
511
499
  gap: var(--space-image-item);
512
500
  }
513
501
 
514
- .image-details {
515
- padding: 0 0.25rem;
516
- font-size: 1rem;
502
+ .image-details {
503
+ padding: 0 0.25rem;
504
+ font-size: 1rem;
505
+ }
506
+
507
+ .image-inspector {
508
+ width: calc(100% - 1rem);
509
+ height: calc(100svh - 1rem);
510
+ }
511
+
512
+ .image-inspector-layout {
513
+ gap: 0.5rem;
514
+ padding: 0.5rem;
515
+ }
517
516
  }
518
- }
519
517
 
520
518
  @media (forced-colors: active) {
521
519
  :root,
@@ -571,10 +569,23 @@
571
569
  .card-list-item,
572
570
  .page-sequence-link,
573
571
  .image-carousel-button,
574
- .image-carousel-position {
575
- border: 1px solid CanvasText;
576
- box-shadow: none;
577
- }
572
+ .image-carousel-position {
573
+ border: 1px solid CanvasText;
574
+ box-shadow: none;
575
+ }
576
+
577
+ .image-inspector,
578
+ .image-inspector-controls button,
579
+ .norna-table-navigation button,
580
+ .managed-image-inspection-affordance {
581
+ border: 1px solid CanvasText;
582
+ box-shadow: none;
583
+ }
584
+
585
+ .norna-table-navigation button::before {
586
+ border: 0;
587
+ background: transparent;
588
+ }
578
589
 
579
590
  :is(.display-settings button, .display-settings-segmented span, .mobile-nav-menu > summary, .site-banner-dismiss) {
580
591
  border-color: ButtonText;
@@ -587,6 +598,42 @@
587
598
  background: Canvas !important;
588
599
  }
589
600
 
601
+ .norna-table-frame::before,
602
+ .norna-table-frame::after {
603
+ top: 50%;
604
+ bottom: auto;
605
+ width: 0.55rem;
606
+ height: 0.55rem;
607
+ border-block-start: 2px solid CanvasText;
608
+ border-inline-end: 2px solid CanvasText;
609
+ background: none;
610
+ }
611
+
612
+ .norna-table-sticky-heading,
613
+ .norna-table-sticky-heading-cell {
614
+ border-color: CanvasText;
615
+ background: Canvas;
616
+ color: CanvasText;
617
+ }
618
+
619
+ .norna-table-frame::before {
620
+ inset-inline-start: 0.4rem;
621
+ transform: translateY(-50%) rotate(-135deg);
622
+ }
623
+
624
+ .norna-table-frame::after {
625
+ inset-inline-end: 0.4rem;
626
+ transform: translateY(-50%) rotate(45deg);
627
+ }
628
+
629
+ .norna-table-frame:dir(rtl)::before {
630
+ transform: translateY(-50%) rotate(45deg);
631
+ }
632
+
633
+ .norna-table-frame:dir(rtl)::after {
634
+ transform: translateY(-50%) rotate(-135deg);
635
+ }
636
+
590
637
  :is(.display-settings-segmented input:checked + span, .image-carousel-button:hover:not(:disabled)) {
591
638
  background: Highlight;
592
639
  color: HighlightText;