@janga/norna 0.7.13 → 0.7.15

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 (146) hide show
  1. package/README.md +15 -9
  2. package/bin/norna-cli.mjs +11 -4
  3. package/docs/README.md +71 -43
  4. package/docs/commands.md +34 -20
  5. package/docs/configuration.md +43 -62
  6. package/docs/content.md +34 -7
  7. package/docs/design/command-organization.md +15 -8
  8. package/docs/design/norna-diagram-design.md +6 -6
  9. package/docs/design/site-examples-structure.md +1 -1
  10. package/docs/engine-development.md +22 -9
  11. package/docs/getting-started.md +29 -16
  12. package/docs/how-to/embedded-site.md +1 -1
  13. package/docs/images-and-metadata.md +3 -3
  14. package/docs/local-development.md +11 -3
  15. package/docs/public-files.md +105 -0
  16. package/docs/publishing.md +4 -8
  17. package/docs/routes.md +6 -7
  18. package/docs/site-files.md +144 -0
  19. package/docs/sitewide-content.md +47 -33
  20. package/docs/theme.md +37 -49
  21. package/docs/typography.md +25 -31
  22. package/examples/complete-sites/dog-shelter-multi-page/README.md +8 -0
  23. package/examples/complete-sites/{dog-shelter-single-page/site/config.md → dog-shelter-multi-page/site/config.yaml} +0 -2
  24. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +6 -0
  25. package/examples/complete-sites/dog-shelter-multi-page/site/{theme.md → theme.yaml} +0 -2
  26. package/examples/complete-sites/dog-shelter-single-page/README.md +8 -0
  27. package/examples/complete-sites/{dog-shelter-multi-page/site/config.md → dog-shelter-single-page/site/config.yaml} +0 -2
  28. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +6 -0
  29. package/examples/complete-sites/dog-shelter-single-page/site/{theme.md → theme.yaml} +0 -2
  30. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
  31. package/examples/feature-demos/media-and-surfaces/README.md +1 -1
  32. package/examples/feature-demos/media-and-surfaces/site/{config.md → config.yaml} +0 -2
  33. package/examples/feature-demos/media-and-surfaces/site/content.md +2 -2
  34. package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/{route-content.md → content.md} +3 -7
  35. package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/theme.yaml +3 -0
  36. package/examples/feature-demos/media-and-surfaces/site/{sitewide-content.md → sitewide-content.yaml} +1 -3
  37. package/examples/feature-demos/media-and-surfaces/site/{theme.md → theme.yaml} +0 -2
  38. package/examples/feature-demos/sitewide-content/README.md +8 -0
  39. package/examples/feature-demos/sitewide-content/site/{config.md → config.yaml} +0 -2
  40. package/examples/feature-demos/sitewide-content/site/routes/010-identity/{route-content.md → content.md} +3 -3
  41. package/examples/feature-demos/sitewide-content/site/routes/020-notices/{route-content.md → content.md} +1 -1
  42. package/examples/feature-demos/sitewide-content/site/routes/030-footer/{route-content.md → content.md} +1 -1
  43. package/examples/feature-demos/sitewide-content/site/{sitewide-content.md → sitewide-content.yaml} +1 -11
  44. package/examples/feature-demos/sitewide-content/site/{theme.md → theme.yaml} +0 -2
  45. package/examples/feature-demos/theme-presets/site/config.yaml +1 -0
  46. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/{theme.md → theme.yaml} +0 -2
  47. package/examples/feature-demos/theme-presets/site/routes/020-documentation/{theme.md → theme.yaml} +0 -2
  48. package/examples/feature-demos/theme-presets/site/routes/030-project/theme.yaml +1 -0
  49. package/examples/feature-demos/theme-presets/site/routes/040-statement/{route-content.md → content.md} +1 -1
  50. package/examples/feature-demos/theme-presets/site/routes/040-statement/{theme.md → theme.yaml} +0 -2
  51. package/examples/feature-demos/theme-presets/site/{sitewide-content.md → sitewide-content.yaml} +1 -3
  52. package/examples/feature-demos/theme-presets/site/theme.yaml +1 -0
  53. package/fixtures/basic/site/{config.md → config.yaml} +0 -2
  54. package/fixtures/basic/site/content.md +3 -3
  55. package/fixtures/basic/site/{sitewide-content.md → sitewide-content.yaml} +0 -2
  56. package/fixtures/basic/site/{theme.md → theme.yaml} +3 -6
  57. package/fixtures/content-model-v2/site/{config.md → config.yaml} +0 -2
  58. package/fixtures/content-model-v2/site/theme.yaml +4 -0
  59. package/package.json +10 -3
  60. package/schemas/config.schema.json +77 -0
  61. package/schemas/content-frontmatter.schema.json +81 -0
  62. package/schemas/manifest.json +9 -0
  63. package/schemas/sitewide-content.schema.json +215 -0
  64. package/schemas/theme.schema.json +1208 -0
  65. package/scripts/check-config.mjs +18 -11
  66. package/scripts/export-theme-preset.mjs +1 -1
  67. package/scripts/generate-schemas.mjs +283 -0
  68. package/scripts/init-site.mjs +22 -27
  69. package/scripts/lib/documentation-links.mjs +8 -0
  70. package/scripts/lib/editor-language-service.mjs +609 -0
  71. package/scripts/lib/example-sites.mjs +2 -2
  72. package/scripts/lib/git-status.mjs +7 -0
  73. package/scripts/lib/logo-assets.mjs +15 -10
  74. package/scripts/lib/norna-markdown-blocks.mjs +90 -11
  75. package/scripts/lib/presentation.mjs +23 -12
  76. package/scripts/lib/project-config.mjs +17 -41
  77. package/scripts/lib/public-asset-conventions.mjs +112 -0
  78. package/scripts/lib/schema-definitions.mjs +213 -0
  79. package/scripts/lib/schema-value-definitions.mjs +86 -0
  80. package/scripts/lib/site-content.mjs +24 -18
  81. package/scripts/lib/site-paths.mjs +4 -8
  82. package/scripts/lib/sitewide-content.mjs +24 -0
  83. package/scripts/lib/theme-config.mjs +15 -35
  84. package/scripts/lib/theme-presets.mjs +76 -66
  85. package/scripts/lib/typography.mjs +15 -15
  86. package/scripts/lib/yaml-config.mjs +50 -0
  87. package/scripts/list-theme-presets.mjs +15 -0
  88. package/scripts/release.mjs +84 -8
  89. package/scripts/show-typography.mjs +22 -46
  90. package/scripts/sync-content-sections.mjs +2 -2
  91. package/scripts/test-client-javascript.mjs +28 -28
  92. package/scripts/test-content-check.mjs +21 -26
  93. package/scripts/test-content-model-v2.mjs +72 -40
  94. package/scripts/test-documentation.mjs +70 -4
  95. package/scripts/test-editor-language-service.mjs +158 -0
  96. package/scripts/test-engine-commands.mjs +65 -34
  97. package/scripts/test-package-check.mjs +37 -30
  98. package/scripts/test-project-config.mjs +15 -20
  99. package/scripts/test-schemas.mjs +102 -0
  100. package/scripts/test-temporary-visibility.mjs +5 -13
  101. package/scripts/test-theme-presets.mjs +64 -37
  102. package/src/components/CardList.astro +2 -5
  103. package/src/components/ImageCarousel.astro +21 -21
  104. package/src/components/{GalleryGrid.astro → ImageStack.astro} +12 -12
  105. package/src/components/SectionNavigationScript.astro +28 -0
  106. package/src/components/SiteNavigation.astro +6 -5
  107. package/src/components/SitePage.astro +8 -8
  108. package/src/components/SiteSection.astro +18 -21
  109. package/src/content.config.ts +17 -209
  110. package/src/layouts/BaseLayout.astro +9 -9
  111. package/src/lib/{galleryImages.ts → imagePresentation.ts} +7 -7
  112. package/src/lib/routeThemes.ts +9 -29
  113. package/src/lib/sectionContent.ts +3 -3
  114. package/src/lib/sitePublicAssets.ts +5 -21
  115. package/src/styles/global.css +73 -73
  116. package/starters/basic/.github/workflows/deploy.yml +1 -1
  117. package/starters/basic/README.md +16 -13
  118. package/starters/basic/package.json +3 -2
  119. package/starters/basic/site/{config.md → config.yaml} +0 -2
  120. package/starters/basic/site/content.md +1 -1
  121. package/starters/basic/site/{sitewide-content.md → sitewide-content.yaml} +1 -3
  122. package/starters/basic/site/{theme.md → theme.yaml} +8 -15
  123. package/starters/project/.github/workflows/deploy.yml +1 -1
  124. package/starters/project/README.md +22 -15
  125. package/starters/project/package.json +3 -2
  126. package/starters/project/site/{config.md → config.yaml} +0 -2
  127. package/starters/project/site/{sitewide-content.md → sitewide-content.yaml} +1 -3
  128. package/starters/project/site/{theme.md → theme.yaml} +4 -8
  129. package/docs/site-structure.md +0 -98
  130. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.md +0 -16
  131. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.md +0 -16
  132. package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/theme.md +0 -8
  133. package/examples/feature-demos/theme-presets/site/config.md +0 -3
  134. package/examples/feature-demos/theme-presets/site/routes/030-project/theme.md +0 -3
  135. package/examples/feature-demos/theme-presets/site/theme.md +0 -3
  136. package/fixtures/content-model-v2/site/theme.md +0 -7
  137. package/scripts/lib/sitewide-config.mjs +0 -34
  138. package/src/components/MobileSectionNavigationScript.astro +0 -14
  139. /package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/{route-content.md → content.md} +0 -0
  140. /package/examples/complete-sites/dog-shelter-multi-page/site/routes/020-adopt/{route-content.md → content.md} +0 -0
  141. /package/examples/feature-demos/media-and-surfaces/site/routes/010-media/{route-content.md → content.md} +0 -0
  142. /package/examples/feature-demos/theme-presets/site/routes/010-portfolio/{route-content.md → content.md} +0 -0
  143. /package/examples/feature-demos/theme-presets/site/routes/020-documentation/{route-content.md → content.md} +0 -0
  144. /package/examples/feature-demos/theme-presets/site/routes/030-project/{route-content.md → content.md} +0 -0
  145. /package/fixtures/content-model-v2/site/routes/010-guide/{route-content.md → content.md} +0 -0
  146. /package/starters/project/site/routes/010-guide/{route-content.md → content.md} +0 -0
@@ -18,14 +18,14 @@
18
18
  --font-serif: Georgia, 'Times New Roman', serif;
19
19
  --page-width: 1180px;
20
20
  --text-width: 680px;
21
- --gallery-width: 900px;
22
- --gallery-max-available-width-desktop: 100%;
23
- --gallery-max-available-width-mobile: 100%;
24
- --gallery-max-available-width: var(--gallery-max-available-width-desktop);
25
- --gallery-layout-width: min(var(--gallery-width), var(--gallery-max-available-width));
26
- --gallery-max-image-height-desktop: 74svh;
27
- --gallery-max-image-height-mobile: 68svh;
28
- --gallery-max-image-height: var(--gallery-max-image-height-desktop);
21
+ --image-width: 900px;
22
+ --image-max-available-width-desktop: 100%;
23
+ --image-max-available-width-mobile: 100%;
24
+ --image-max-available-width: var(--image-max-available-width-desktop);
25
+ --image-layout-width: min(var(--image-width), var(--image-max-available-width));
26
+ --image-max-height-desktop: 74svh;
27
+ --image-max-height-mobile: 68svh;
28
+ --image-max-height: var(--image-max-height-desktop);
29
29
  --nav-top-safety-inset: 0px;
30
30
 
31
31
  --space-nav-to-first-section-desktop: clamp(1.875rem, 3vw, 2.75rem);
@@ -38,9 +38,9 @@
38
38
  --space-heading-to-block-desktop: 0.75em;
39
39
  --space-heading-to-block-mobile: 0.7em;
40
40
  --space-heading-to-block: var(--space-heading-to-block-desktop);
41
- --space-gallery-item-desktop: clamp(1.5rem, 3.5vw, 2.75rem);
42
- --space-gallery-item-mobile: 2.75rem;
43
- --space-gallery-item: var(--space-gallery-item-desktop);
41
+ --space-image-item-desktop: clamp(1.5rem, 3.5vw, 2.75rem);
42
+ --space-image-item-mobile: 2.75rem;
43
+ --space-image-item: var(--space-image-item-desktop);
44
44
  --space-section-to-section-desktop: clamp(2.55rem, 4.2vw, 3.9rem);
45
45
  --space-section-to-section-mobile: 2.25rem;
46
46
  --space-section-to-section: var(--space-section-to-section-desktop);
@@ -625,7 +625,7 @@ ul {
625
625
  }
626
626
 
627
627
  .section-markdown > :last-child,
628
- .gallery-meta :last-child {
628
+ .image-meta :last-child {
629
629
  margin-bottom: 0;
630
630
  }
631
631
 
@@ -683,10 +683,10 @@ ul {
683
683
  display: grid;
684
684
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
685
685
  gap: var(--card-list-gap, clamp(0.9rem, 2vw, 1.25rem));
686
- width: min(100%, var(--card-list-width, var(--gallery-layout-width)));
686
+ width: min(100%, var(--card-list-width, min(56rem, var(--page-width))));
687
687
  margin: 0 auto;
688
688
  text-align: left;
689
- --card-list-width: var(--gallery-layout-width);
689
+ --card-list-width: min(56rem, var(--page-width));
690
690
  --card-list-gap: clamp(0.9rem, 2vw, 1.25rem);
691
691
  --card-list-item-gap: 0.85rem;
692
692
  --card-list-padding: clamp(0.9rem, 2vw, 1.15rem);
@@ -699,7 +699,7 @@ ul {
699
699
 
700
700
  .section-body > .section-reading-layout:not(:last-child),
701
701
  .section-body > .section-markdown:not(:last-child),
702
- .section-body > .gallery:not(:last-child) {
702
+ .section-body > :is(.image-stack, .managed-images):not(:last-child) {
703
703
  margin-bottom: var(--space-content-block-gap);
704
704
  }
705
705
 
@@ -739,7 +739,7 @@ ul {
739
739
  }
740
740
 
741
741
  .card-list-width-narrow {
742
- --card-list-width: min(48rem, var(--gallery-layout-width));
742
+ --card-list-width: min(48rem, var(--page-width));
743
743
  }
744
744
 
745
745
  .card-list-width-wide {
@@ -892,120 +892,120 @@ ul {
892
892
  line-height: var(--section-body-line-height, 1.5);
893
893
  }
894
894
 
895
- .gallery {
895
+ :is(.image-stack, .managed-images) {
896
896
  display: grid;
897
- gap: var(--space-gallery-item);
897
+ gap: var(--space-image-item);
898
898
  margin-top: 0;
899
899
  }
900
900
 
901
- .gallery-item {
901
+ .managed-image-item {
902
902
  display: grid;
903
903
  gap: 0.55rem;
904
904
  align-content: start;
905
905
  margin: 0;
906
906
  }
907
907
 
908
- .gallery-image-frame {
908
+ .managed-image-frame {
909
909
  display: grid;
910
- width: min(100%, var(--gallery-layout-width));
910
+ width: min(100%, var(--image-layout-width));
911
911
  margin: 0 auto;
912
912
  background: transparent;
913
913
  place-items: center;
914
914
  }
915
915
 
916
- .gallery-image {
916
+ .managed-image {
917
917
  display: block;
918
918
  width: auto;
919
919
  margin: 0 auto;
920
920
  background: transparent;
921
921
  height: auto;
922
922
  max-width: 100%;
923
- max-height: var(--gallery-max-image-height);
923
+ max-height: var(--image-max-height);
924
924
  object-fit: contain;
925
925
  }
926
926
 
927
- .gallery-image.gallery-image-landscape {
927
+ .managed-image.managed-image-landscape {
928
928
  width: 100%;
929
929
  max-height: none;
930
930
  }
931
931
 
932
- .gallery-carousel {
932
+ .image-carousel {
933
933
  position: relative;
934
934
  outline: none;
935
935
  }
936
936
 
937
- .gallery-carousel:focus-visible {
937
+ .image-carousel:focus-visible {
938
938
  outline: 2px solid currentColor;
939
939
  outline-offset: 0.5rem;
940
940
  }
941
941
 
942
- .gallery-carousel-slide {
942
+ .image-carousel-slide {
943
943
  flex: 0 0 100%;
944
944
  min-width: 0;
945
945
  margin: 0;
946
946
  }
947
947
 
948
- .gallery-carousel-stage {
948
+ .image-carousel-stage {
949
949
  position: relative;
950
950
  display: grid;
951
- width: min(100%, var(--gallery-layout-width));
952
- max-height: var(--gallery-max-image-height);
951
+ width: min(100%, var(--image-layout-width));
952
+ max-height: var(--image-max-height);
953
953
  margin: 0 auto;
954
- aspect-ratio: var(--gallery-carousel-aspect-ratio, auto);
954
+ aspect-ratio: var(--image-carousel-aspect-ratio, auto);
955
955
  }
956
956
 
957
- .gallery-carousel-viewport {
957
+ .image-carousel-viewport {
958
958
  height: 100%;
959
959
  }
960
960
 
961
- .gallery-carousel-image-frame {
961
+ .image-carousel-frame {
962
962
  display: grid;
963
963
  width: 100%;
964
964
  height: 100%;
965
965
  place-items: center;
966
966
  }
967
967
 
968
- .gallery-carousel[data-carousel-ready='true'] .gallery-carousel-viewport {
968
+ .image-carousel[data-carousel-ready='true'] .image-carousel-viewport {
969
969
  overflow: hidden;
970
970
  }
971
971
 
972
- .gallery-carousel[data-carousel-ready='true'] .gallery-carousel-slides {
972
+ .image-carousel[data-carousel-ready='true'] .image-carousel-slides {
973
973
  display: flex;
974
974
  height: 100%;
975
975
  touch-action: pan-y pinch-zoom;
976
976
  }
977
977
 
978
- .gallery-carousel[data-carousel-ready='true'] .gallery-carousel-slide {
978
+ .image-carousel[data-carousel-ready='true'] .image-carousel-slide {
979
979
  display: grid;
980
980
  height: 100%;
981
981
  align-content: start;
982
982
  }
983
983
 
984
- .gallery-carousel-image-frame .gallery-image.gallery-image-landscape {
984
+ .image-carousel-frame .managed-image.managed-image-landscape {
985
985
  width: 100%;
986
986
  height: auto;
987
987
  max-width: 100%;
988
988
  max-height: 100%;
989
989
  }
990
990
 
991
- .gallery-carousel-image-frame .gallery-image:not(.gallery-image-landscape) {
991
+ .image-carousel-frame .managed-image:not(.managed-image-landscape) {
992
992
  width: auto;
993
993
  height: 100%;
994
994
  max-width: 100%;
995
995
  max-height: 100%;
996
996
  }
997
997
 
998
- .gallery-carousel-button,
999
- .gallery-carousel-position {
998
+ .image-carousel-button,
999
+ .image-carousel-position {
1000
1000
  display: none;
1001
1001
  }
1002
1002
 
1003
- .gallery-carousel[data-carousel-ready='true'] .gallery-carousel-button,
1004
- .gallery-carousel[data-carousel-ready='true'] .gallery-carousel-position {
1003
+ .image-carousel[data-carousel-ready='true'] .image-carousel-button,
1004
+ .image-carousel[data-carousel-ready='true'] .image-carousel-position {
1005
1005
  display: grid;
1006
1006
  }
1007
1007
 
1008
- .gallery-carousel-button {
1008
+ .image-carousel-button {
1009
1009
  position: absolute;
1010
1010
  top: 50%;
1011
1011
  z-index: 2;
@@ -1026,28 +1026,28 @@ ul {
1026
1026
  transform: translateY(-50%);
1027
1027
  }
1028
1028
 
1029
- .gallery-carousel-button:hover:not(:disabled),
1030
- .gallery-carousel-button:focus-visible:not(:disabled) {
1029
+ .image-carousel-button:hover:not(:disabled),
1030
+ .image-carousel-button:focus-visible:not(:disabled) {
1031
1031
  background: currentColor;
1032
1032
  color: var(--section-background-color, var(--color-page));
1033
1033
  opacity: 1;
1034
1034
  }
1035
1035
 
1036
- .gallery-carousel-button:disabled {
1036
+ .image-carousel-button:disabled {
1037
1037
  cursor: default;
1038
1038
  opacity: 0;
1039
1039
  pointer-events: none;
1040
1040
  }
1041
1041
 
1042
- .gallery-carousel-button-previous {
1042
+ .image-carousel-button-previous {
1043
1043
  left: 0.75rem;
1044
1044
  }
1045
1045
 
1046
- .gallery-carousel-button-next {
1046
+ .image-carousel-button-next {
1047
1047
  right: 0.75rem;
1048
1048
  }
1049
1049
 
1050
- .gallery-carousel-position {
1050
+ .image-carousel-position {
1051
1051
  position: absolute;
1052
1052
  right: 0.75rem;
1053
1053
  bottom: 0.75rem;
@@ -1063,38 +1063,38 @@ ul {
1063
1063
  text-align: center;
1064
1064
  }
1065
1065
 
1066
- .gallery-carousel-captions {
1067
- width: min(100%, var(--gallery-layout-width), 72ch);
1066
+ .image-carousel-captions {
1067
+ width: min(100%, var(--image-layout-width), 72ch);
1068
1068
  margin: 0 auto;
1069
1069
  }
1070
1070
 
1071
- .gallery-carousel-caption {
1071
+ .image-carousel-caption {
1072
1072
  margin-bottom: 0;
1073
1073
  }
1074
1074
 
1075
- .gallery-carousel[data-carousel-ready='true'] .gallery-carousel-captions {
1075
+ .image-carousel[data-carousel-ready='true'] .image-carousel-captions {
1076
1076
  display: grid;
1077
1077
  }
1078
1078
 
1079
- .gallery-carousel[data-carousel-ready='true'] .gallery-carousel-caption {
1079
+ .image-carousel[data-carousel-ready='true'] .image-carousel-caption {
1080
1080
  grid-area: 1 / 1;
1081
1081
  visibility: hidden;
1082
1082
  pointer-events: none;
1083
1083
  }
1084
1084
 
1085
- .gallery-carousel[data-carousel-ready='true'] .gallery-carousel-caption.is-active {
1085
+ .image-carousel[data-carousel-ready='true'] .image-carousel-caption.is-active {
1086
1086
  visibility: visible;
1087
1087
  pointer-events: auto;
1088
1088
  }
1089
1089
 
1090
- .gallery-meta {
1091
- width: min(100%, var(--gallery-layout-width), 72ch);
1090
+ .image-meta {
1091
+ width: min(100%, var(--image-layout-width), 72ch);
1092
1092
  margin: var(--section-caption-spacing-before, 0.5em) auto 0;
1093
1093
  font-size: var(--section-caption-font-size-desktop, 0.95rem);
1094
1094
  text-align: var(--section-caption-align-desktop, center);
1095
1095
  }
1096
1096
 
1097
- .gallery-details {
1097
+ .image-details {
1098
1098
  display: flex;
1099
1099
  flex-wrap: wrap;
1100
1100
  align-items: baseline;
@@ -1113,12 +1113,12 @@ ul {
1113
1113
  --space-nav-to-first-section: var(--space-nav-to-first-section-mobile);
1114
1114
  --space-content-block-gap: var(--space-content-block-gap-mobile);
1115
1115
  --space-heading-to-block: var(--space-heading-to-block-mobile);
1116
- --space-gallery-item: var(--space-gallery-item-mobile);
1116
+ --space-image-item: var(--space-image-item-mobile);
1117
1117
  --space-section-to-section: var(--space-section-to-section-mobile);
1118
1118
  --space-final-section-bottom: var(--space-final-section-bottom-mobile);
1119
1119
  --content-gutter: var(--content-gutter-mobile);
1120
- --gallery-max-available-width: var(--gallery-max-available-width-mobile);
1121
- --gallery-max-image-height: var(--gallery-max-image-height-mobile);
1120
+ --image-max-available-width: var(--image-max-available-width-mobile);
1121
+ --image-max-height: var(--image-max-height-mobile);
1122
1122
  --site-top-anchor-offset: 6.25rem;
1123
1123
  }
1124
1124
 
@@ -1286,12 +1286,12 @@ ul {
1286
1286
  text-align: var(--section-body-align-mobile, var(--section-body-align-desktop, left));
1287
1287
  }
1288
1288
 
1289
- .gallery-meta {
1289
+ .image-meta {
1290
1290
  font-size: var(--section-caption-font-size-mobile, var(--section-caption-font-size-desktop, 0.95rem));
1291
1291
  text-align: var(--section-caption-align-mobile, var(--section-caption-align-desktop, center));
1292
1292
  }
1293
1293
 
1294
- .gallery-details {
1294
+ .image-details {
1295
1295
  justify-content: var(--section-caption-justify-mobile, var(--section-caption-justify-desktop, center));
1296
1296
  }
1297
1297
 
@@ -1321,25 +1321,25 @@ ul {
1321
1321
  display: block;
1322
1322
  }
1323
1323
 
1324
- .gallery-item img {
1325
- max-height: var(--gallery-max-image-height);
1324
+ .managed-image-item img {
1325
+ max-height: var(--image-max-height);
1326
1326
  }
1327
1327
 
1328
- .gallery-carousel-stage {
1328
+ .image-carousel-stage {
1329
1329
  aspect-ratio: auto;
1330
1330
  }
1331
1331
 
1332
- .gallery-carousel-viewport {
1332
+ .image-carousel-viewport {
1333
1333
  width: 100%;
1334
1334
  height: auto;
1335
- aspect-ratio: var(--gallery-carousel-aspect-ratio, auto);
1335
+ aspect-ratio: var(--image-carousel-aspect-ratio, auto);
1336
1336
  }
1337
1337
 
1338
- .gallery-carousel[data-carousel-ready='true'] .gallery-carousel-button {
1338
+ .image-carousel[data-carousel-ready='true'] .image-carousel-button {
1339
1339
  display: none;
1340
1340
  }
1341
1341
 
1342
- .gallery-carousel-position {
1342
+ .image-carousel-position {
1343
1343
  position: absolute;
1344
1344
  right: 0.5rem;
1345
1345
  bottom: 0.5rem;
@@ -1350,11 +1350,11 @@ ul {
1350
1350
  opacity: 0.88;
1351
1351
  }
1352
1352
 
1353
- .gallery {
1354
- gap: var(--space-gallery-item);
1353
+ :is(.image-stack, .managed-images) {
1354
+ gap: var(--space-image-item);
1355
1355
  }
1356
1356
 
1357
- .gallery-details {
1357
+ .image-details {
1358
1358
  padding: 0 0.25rem;
1359
1359
  font-size: 1rem;
1360
1360
  }
@@ -42,7 +42,7 @@ jobs:
42
42
  run: npm ci
43
43
 
44
44
  - name: Check and build
45
- run: npm run build
45
+ run: npm run norna:build
46
46
 
47
47
  - name: Configure Pages
48
48
  uses: actions/configure-pages@v5
@@ -6,19 +6,20 @@ This is a minimal site repository starter for `@janga/norna`.
6
6
 
7
7
  ```sh
8
8
  npm install
9
- npm run dev
9
+ npm run norna:dev
10
10
  ```
11
11
 
12
12
  If the standard local port is blocked, start with:
13
13
 
14
14
  ```sh
15
- npm run dev -- --kill
15
+ npm run norna:dev -- --kill
16
16
  ```
17
17
 
18
- Edit shared brand, logo, banners and footer in `site/sitewide-content.md`,
19
- site-wide visual defaults in `site/theme.md`, homepage content and section
18
+ Edit the shared navigation label, logo settings, banners, and footer in
19
+ `site/sitewide-content.yaml`,
20
+ site-wide visual defaults in `site/theme.yaml`, homepage content and section
20
21
  metadata in `site/content.md`, and technical settings such as URL and locale
21
- in `site/config.md`. Keep source images under `site/images/<section-id>/`
22
+ in `site/config.yaml`. Keep source images under `site/images/<section-id>/`
22
23
  and static public files under `site/public/`. The image folder name should
23
24
  match the section id in Markdown, for example `## Work {#work}` uses
24
25
  `site/images/work/`.
@@ -27,9 +28,7 @@ For a GitHub Pages project site without a custom domain, include the repository
27
28
  path in the public URL:
28
29
 
29
30
  ```yaml
30
- ---
31
31
  url: https://owner.github.io/repository-name/
32
- ---
33
32
  ```
34
33
 
35
34
  Norna derives `/repository-name/` as the base path. Use a root URL such as
@@ -39,8 +38,8 @@ In GitHub repository settings, configure Pages to build from GitHub Actions.
39
38
 
40
39
  Page width, side gutters, layout density, typography rhythm, image width, image
41
40
  height limits, font, palettes, section surfaces, and site-wide typography are
42
- configured in `site/theme.md`. A route may replace that visual theme with its
43
- own `theme.md`.
41
+ configured in `site/theme.yaml`. A route may replace that visual theme with its
42
+ own `theme.yaml`.
44
43
 
45
44
  Commit `package-lock.json` after the first install so GitHub Actions can use
46
45
  `npm ci`.
@@ -50,15 +49,18 @@ Use `norna:*` scripts for norna-specific work:
50
49
  ```sh
51
50
  npm run norna:content:check
52
51
  npm run norna:sync
53
- npm run norna:typography:presets
52
+ npm run norna:typography:profiles
54
53
  npm run norna:typography:show
55
54
  npm run norna:build
56
55
  ```
57
56
 
58
57
  This keeps Norna commands separate from repository-specific build or publishing
59
58
  commands in projects that embed a Norna site inside a larger GitHub project.
60
- This pure starter also keeps `npm run build` as an alias for
61
- `npm run norna:build`.
59
+ This standalone starter also keeps `npm run dev` and `npm run build` as aliases.
60
+
61
+ For direct `norna dev`, `norna check`, and `norna build` commands, install the
62
+ launcher globally with `npm install --global @janga/norna@latest`. The launcher
63
+ still selects this project's locally installed Norna version.
62
64
 
63
65
  Use `npm run norna:engine:version` to inspect the installed engine and
64
66
  `npm run norna:engine:update` to update it.
@@ -66,7 +68,8 @@ Use `npm run norna:engine:version` to inspect the installed engine and
66
68
  Generic documentation lives in the `norna` repository:
67
69
 
68
70
  - `docs/getting-started.md`
69
- - `docs/site-structure.md`
71
+ - `docs/site-files.md`
72
+ - `docs/public-files.md`
70
73
  - `docs/content.md`
71
74
  - `docs/theme.md`
72
75
  - `docs/typography.md`
@@ -10,12 +10,13 @@
10
10
  "norna:dev:status": "norna dev:status",
11
11
  "norna:dev:logs": "norna dev:logs",
12
12
  "norna:dev:stop": "norna dev:stop",
13
- "norna:check": "npm run norna:config:check && npm run norna:content:check",
13
+ "norna:check": "norna check",
14
14
  "norna:config:check": "norna config:check",
15
15
  "norna:content:check": "norna content:check",
16
16
  "norna:sync": "norna content:sync",
17
+ "norna:theme:presets": "norna theme:presets",
17
18
  "norna:theme:export": "norna theme:export",
18
- "norna:typography:presets": "norna typography presets",
19
+ "norna:typography:profiles": "norna typography profiles",
19
20
  "norna:typography:show": "norna typography show",
20
21
  "norna:public": "norna site:public",
21
22
  "norna:images": "norna images",
@@ -1,3 +1 @@
1
- ---
2
1
  url: https://example.com/
3
- ---
@@ -9,7 +9,7 @@ routes defined, the navigation menu will be a sticky bar with anchor links for
9
9
  ease of use on phones etc. **Highlighted inline text** when a short
10
10
  phrase needs emphasis
11
11
  ## Work {#work}
12
- Add Norna managed media blocks in Markdown where the media should appear. Put
12
+ Add Norna image blocks in Markdown where the images should appear. Put
13
13
  matching source images under `images/work/`.
14
14
 
15
15
  ````
@@ -1,6 +1,5 @@
1
- ---
2
1
  navigation:
3
- brand: Example Site
2
+ label: Example Site
4
3
  footer:
5
4
  copyrightMessage: (c) Example Owner.
6
5
  buildInfo:
@@ -11,4 +10,3 @@ footer:
11
10
  timeZone: UTC
12
11
  dateStyle: short
13
12
  timeStyle: short
14
- ---
@@ -1,4 +1,3 @@
1
- ---
2
1
  # norna:start theme-help
3
2
  # Site-wide visual defaults. Remove a value to use the engine default.
4
3
  # Active values below are ordinary YAML; this marked comment block is only help text.
@@ -29,7 +28,7 @@
29
28
  # imageGap:
30
29
  # desktop: CSS length or clamp(), e.g. clamp(1.25rem, 2.8vw, 2rem)
31
30
  # mobile: CSS length, e.g. 1.5rem
32
- # gallery:
31
+ # images:
33
32
  # width: CSS length, e.g. 900px
34
33
  # maxAvailableWidthPercent:
35
34
  # desktop: number from 1 through 100
@@ -39,7 +38,7 @@
39
38
  # mobile: number from 1 through 100
40
39
  # typography:
41
40
  # fontFamily: CSS font-family stack
42
- # preset: quiet-gallery | compact-gallery | text-forward | statement
41
+ # profile: restrained | dense | reading | statement
43
42
  # rhythm: compact | normal | airy
44
43
  # overrides:
45
44
  # headings:
@@ -81,11 +80,8 @@
81
80
  # size: small | medium | large | xlarge
82
81
  # lineHeight: number from 1 through 3
83
82
  # spacingBefore: CSS length, e.g. 0.5em
84
- # presentation:
85
- # palette: dark # Alternatives: light, paper
86
- # sectionSurfaces:
87
- # mode: none | cycle
88
- # sequence: [base, soft, emphasis]
83
+ # palette: dark # Alternatives: light, paper
84
+ # sectionSurfaces: [base, soft, emphasis]
89
85
  # norna:end theme-help
90
86
  layout:
91
87
  density: normal
@@ -93,7 +89,7 @@ layout:
93
89
  gutter:
94
90
  desktop: clamp(1.25rem, 4vw, 3rem)
95
91
  mobile: 1rem
96
- gallery:
92
+ images:
97
93
  width: 900px
98
94
  maxAvailableWidthPercent:
99
95
  desktop: 100
@@ -103,10 +99,7 @@ gallery:
103
99
  mobile: 68
104
100
  typography:
105
101
  fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
106
- preset: quiet-gallery
102
+ profile: restrained
107
103
  rhythm: normal
108
- presentation:
109
- palette: dark # Alternatives: light, paper
110
- sectionSurfaces:
111
- mode: cycle
112
- ---
104
+ palette: dark # Alternatives: light, paper
105
+ sectionSurfaces: [base, soft, emphasis]
@@ -42,7 +42,7 @@ jobs:
42
42
  run: npm ci
43
43
 
44
44
  - name: Check and build
45
- run: npm run build
45
+ run: npm run norna:build
46
46
 
47
47
  - name: Configure Pages
48
48
  uses: actions/configure-pages@v5
@@ -7,25 +7,25 @@ libraries, and similar project sites.
7
7
 
8
8
  ```sh
9
9
  npm install
10
- npm run dev
10
+ npm run norna:dev
11
11
  ```
12
12
 
13
13
  If the standard local port is blocked, start with:
14
14
 
15
15
  ```sh
16
- npm run dev -- --kill
16
+ npm run norna:dev -- --kill
17
17
  ```
18
18
 
19
19
  ## Files
20
20
 
21
- - `site/config.md`: public URL and optional language and smooth scrolling.
22
- - `site/sitewide-content.md`: shared brand or logo, banners and footer content.
23
- - `site/theme.md`: site-wide visual settings such as layout density, typography
21
+ - `site/config.yaml`: public URL and optional language and smooth scrolling.
22
+ - `site/sitewide-content.yaml`: shared navigation identity, banners, and footer.
23
+ - `site/theme.yaml`: site-wide visual settings such as layout density, typography
24
24
  rhythm, palettes, section surfaces, and typography.
25
25
  - `site/content.md`: homepage title, sections, placeholders, project summary,
26
- links, install command, example usage, benefits, next steps, managed media
27
- blocks, and license.
28
- - `site/routes/010-guide/route-content.md`: short secondary page with realistic
26
+ links, install command, example usage, benefits, next steps, Norna blocks,
27
+ and license.
28
+ - `site/routes/010-guide/content.md`: short secondary page with realistic
29
29
  project guide content.
30
30
  - `site/public/robots.txt`: static public file copied into the built site.
31
31
 
@@ -37,14 +37,15 @@ GitHub Pages workflow uses `npm ci`.
37
37
 
38
38
  1. Replace the project name, tagline, links, install command, example usage,
39
39
  benefits, use cases, and license in `site/content.md`.
40
- 2. Replace the guide examples in `site/routes/010-guide/route-content.md`, or
40
+ 2. Replace the guide examples in `site/routes/010-guide/content.md`, or
41
41
  delete the route if the homepage is enough.
42
- 3. Edit `site/sitewide-content.md` for the brand or logo, banners and footer.
43
- 4. Edit `site/theme.md` for layout density, typography rhythm, palette, section
42
+ 3. Edit `site/sitewide-content.yaml` for the navigation label, logo display,
43
+ banners, and footer.
44
+ 4. Edit `site/theme.yaml` for layout density, typography rhythm, palette, section
44
45
  surfaces, and typography.
45
46
  5. Put any local source images in the image folder for the Markdown section
46
47
  that references them, for example `site/images/intro/`.
47
- 6. Edit `site/config.md` for the public URL and, when needed, language or smooth
48
+ 6. Edit `site/config.yaml` for the public URL and, when needed, language or smooth
48
49
  scrolling. Deploy commands discover the GitHub repository and default branch.
49
50
  7. Update `package.json` with the site's package name and keep
50
51
  `package-lock.json` committed.
@@ -55,20 +56,26 @@ GitHub Pages workflow uses `npm ci`.
55
56
  npm run norna:check
56
57
  npm run norna:sync
57
58
  npm run norna:typography:show
58
- npm run build
59
+ npm run norna:build
59
60
  ```
60
61
 
62
+ The standalone aliases `npm run dev` and `npm run build` are also available.
63
+ For direct `norna dev`, `norna check`, and `norna build` commands, install the
64
+ launcher globally with `npm install --global @janga/norna@latest`; it delegates
65
+ to this project's locally installed Norna version.
66
+
61
67
  To verify the same install path used by GitHub Pages:
62
68
 
63
69
  ```sh
64
70
  npm ci
65
- npm run build
71
+ npm run norna:build
66
72
  ```
67
73
 
68
74
  Generic Norna documentation lives in the Norna repository:
69
75
 
70
76
  - `docs/getting-started.md`
71
- - `docs/site-structure.md`
77
+ - `docs/site-files.md`
78
+ - `docs/public-files.md`
72
79
  - `docs/content.md`
73
80
  - `docs/theme.md`
74
81
  - `docs/typography.md`