@janga/norna 0.7.16 → 0.7.17

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 (200) hide show
  1. package/README.md +6 -6
  2. package/astro.config.mjs +35 -3
  3. package/docs/README.md +10 -10
  4. package/docs/commands.md +2 -2
  5. package/docs/content.md +82 -102
  6. package/docs/design/navigation-and-theme-plan.md +115 -0
  7. package/docs/design/norna-diagram-design.md +9 -9
  8. package/docs/design/site-examples-structure.md +9 -9
  9. package/docs/engine-development.md +9 -9
  10. package/docs/getting-started.md +20 -15
  11. package/docs/images-and-metadata.md +10 -9
  12. package/docs/pages.md +134 -0
  13. package/docs/public-files.md +49 -36
  14. package/docs/publishing.md +19 -3
  15. package/docs/site-files.md +29 -28
  16. package/docs/sitewide-content.md +20 -36
  17. package/docs/theme.md +20 -20
  18. package/docs/typography.md +10 -10
  19. package/examples/README.md +2 -2
  20. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +17 -41
  21. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +26 -67
  22. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +185 -88
  23. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -1
  24. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev-local.json +4 -4
  25. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +5 -5
  26. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +33 -23
  27. package/examples/complete-sites/dog-shelter-multi-page/README.md +1 -1
  28. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +8 -8
  29. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +20 -20
  30. package/examples/complete-sites/dog-shelter-multi-page/site/content.md +3 -4
  31. package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/010-dogs/content.md +3 -4
  32. package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/020-adopt/content.md +3 -4
  33. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +2 -4
  34. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +17 -41
  35. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +26 -67
  36. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +185 -88
  37. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +1 -1
  38. package/examples/complete-sites/dog-shelter-single-page/.astro/dev-local.json +8 -0
  39. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +5 -5
  40. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +16 -12
  41. package/examples/complete-sites/dog-shelter-single-page/README.md +1 -1
  42. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +8 -8
  43. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +12 -12
  44. package/examples/complete-sites/dog-shelter-single-page/site/content.md +5 -2
  45. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +2 -4
  46. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +17 -41
  47. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +26 -67
  48. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +185 -88
  49. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
  50. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +4 -14
  51. package/examples/feature-demos/media-and-surfaces/README.md +2 -2
  52. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +9 -9
  53. package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +16 -16
  54. package/examples/feature-demos/media-and-surfaces/site/content.md +4 -7
  55. package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/010-media/content.md +6 -5
  56. package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/020-surfaces/content.md +7 -6
  57. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.yaml +0 -2
  58. package/examples/feature-demos/sitewide-content/README.md +3 -3
  59. package/examples/feature-demos/sitewide-content/site/content.md +8 -7
  60. package/examples/feature-demos/sitewide-content/site/pages/010-logo-and-navigation/content.md +17 -0
  61. package/examples/feature-demos/sitewide-content/site/{routes → pages}/020-notices/content.md +7 -6
  62. package/examples/feature-demos/sitewide-content/site/{routes → pages}/030-footer/content.md +6 -5
  63. package/examples/feature-demos/sitewide-content/site/sitewide-content.yaml +4 -13
  64. package/examples/feature-demos/theme-presets/README.md +1 -1
  65. package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +60 -60
  66. package/examples/feature-demos/theme-presets/site/content.md +4 -7
  67. package/examples/feature-demos/theme-presets/site/{routes → pages}/010-portfolio/content.md +4 -7
  68. package/examples/feature-demos/theme-presets/site/{routes → pages}/020-documentation/content.md +4 -7
  69. package/examples/feature-demos/theme-presets/site/{routes → pages}/030-project/content.md +4 -7
  70. package/examples/feature-demos/theme-presets/site/{routes → pages}/040-statement/content.md +4 -7
  71. package/examples/feature-demos/theme-presets/site/sitewide-content.yaml +1 -10
  72. package/fixtures/basic/site/content.md +5 -6
  73. package/fixtures/basic/site/sitewide-content.yaml +1 -8
  74. package/fixtures/content-model-v2/site/content.md +11 -13
  75. package/fixtures/content-model-v2/site/pages/010-guide/content.md +18 -0
  76. package/fixtures/nested-pages/site/.norna/generated-images.json +10 -0
  77. package/fixtures/nested-pages/site/config.yaml +1 -0
  78. package/fixtures/nested-pages/site/content.md +15 -0
  79. package/fixtures/nested-pages/site/pages/010-guides/content.md +15 -0
  80. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/content.md +21 -0
  81. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/images/diagram.svg +21 -0
  82. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +14 -0
  83. package/fixtures/nested-pages/site/pages/010-guides/pages/020-workflows/content.md +11 -0
  84. package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +3 -0
  85. package/fixtures/nested-pages/site/pages/020-reference/content.md +10 -0
  86. package/fixtures/nested-pages/site/pages/020-reference/pages/010-installation/content.md +11 -0
  87. package/fixtures/nested-pages/site/theme.yaml +3 -0
  88. package/package.json +7 -4
  89. package/schemas/config.schema.json +5 -5
  90. package/schemas/content-frontmatter.schema.json +28 -63
  91. package/schemas/manifest.json +1 -0
  92. package/schemas/sitewide-content.schema.json +58 -132
  93. package/schemas/theme.schema.json +396 -86
  94. package/scripts/check-config.mjs +6 -5
  95. package/scripts/deploy-site.mjs +6 -8
  96. package/scripts/doctor.mjs +2 -2
  97. package/scripts/generate-images.mjs +11 -18
  98. package/scripts/generate-schemas.mjs +3 -217
  99. package/scripts/lib/base-path-redirect.mjs +9 -0
  100. package/scripts/lib/editor-language-service.mjs +126 -66
  101. package/scripts/lib/heading-ids.mjs +161 -0
  102. package/scripts/lib/navigation-model.mjs +51 -0
  103. package/scripts/lib/norna-markdown-blocks.mjs +3 -4
  104. package/scripts/lib/page-model.mjs +83 -0
  105. package/scripts/lib/project-config.mjs +28 -0
  106. package/scripts/lib/schema-definitions.mjs +41 -46
  107. package/scripts/lib/schema-editor-metadata.mjs +475 -0
  108. package/scripts/lib/schema-value-definitions.mjs +6 -6
  109. package/scripts/lib/site-content.mjs +124 -87
  110. package/scripts/lib/site-paths.mjs +2 -2
  111. package/scripts/lib/theme-config.mjs +9 -16
  112. package/scripts/lib/theme-presets.mjs +9 -1
  113. package/scripts/release.mjs +1 -1
  114. package/scripts/show-typography.mjs +26 -20
  115. package/scripts/sync-content-sections.mjs +106 -65
  116. package/scripts/{test-temporary-visibility.mjs → test-banner-visibility.mjs} +7 -24
  117. package/scripts/test-client-javascript.mjs +39 -42
  118. package/scripts/test-content-check.mjs +138 -54
  119. package/scripts/test-content-model-v2.mjs +445 -228
  120. package/scripts/test-documentation.mjs +6 -1
  121. package/scripts/test-editor-language-service.mjs +168 -24
  122. package/scripts/test-engine-commands.mjs +2 -1
  123. package/scripts/test-heading-ids.mjs +68 -0
  124. package/scripts/test-navigation-model.mjs +63 -0
  125. package/scripts/test-nested-pages.mjs +110 -0
  126. package/scripts/test-package-check.mjs +31 -40
  127. package/scripts/test-page-model.mjs +80 -0
  128. package/scripts/test-project-config.mjs +25 -1
  129. package/scripts/test-schemas.mjs +66 -14
  130. package/scripts/test-theme-presets.mjs +33 -24
  131. package/src/components/NavigationPageTree.astro +68 -0
  132. package/src/components/SectionNavigationScript.astro +110 -5
  133. package/src/components/SiteBreadcrumbs.astro +29 -0
  134. package/src/components/SiteNavigation.astro +65 -69
  135. package/src/components/SitePage.astro +70 -46
  136. package/src/components/SiteSection.astro +27 -20
  137. package/src/content.config.ts +9 -5
  138. package/src/layouts/BaseLayout.astro +11 -20
  139. package/src/lib/pageThemes.ts +42 -0
  140. package/src/lib/sectionContent.ts +109 -106
  141. package/src/lib/siteNavigation.ts +48 -0
  142. package/src/lib/sitePages.ts +85 -38
  143. package/src/pages/{[slug].astro → [...slug].astro} +2 -2
  144. package/src/styles/global.css +373 -55
  145. package/starters/basic/README.md +5 -7
  146. package/starters/basic/site/content.md +7 -4
  147. package/starters/basic/site/sitewide-content.yaml +1 -10
  148. package/starters/project/README.md +8 -8
  149. package/starters/project/site/content.md +5 -4
  150. package/starters/project/site/{routes → pages}/010-guide/content.md +5 -4
  151. package/starters/project/site/sitewide-content.yaml +1 -10
  152. package/docs/routes.md +0 -121
  153. package/examples/feature-demos/sitewide-content/site/routes/010-identity/content.md +0 -20
  154. package/fixtures/content-model-v2/site/routes/010-guide/content.md +0 -17
  155. package/scripts/lib/route-model.mjs +0 -17
  156. package/scripts/test-route-model.mjs +0 -32
  157. package/src/lib/routeThemes.ts +0 -41
  158. /package/examples/complete-sites/dog-shelter-multi-page/site/images/{intro/shelter-dog.jpg → shelter-dog.jpg} +0 -0
  159. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rex.jpg +0 -0
  160. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rover.jpg +0 -0
  161. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/020-adopt/images/adopt → pages/020-adopt/images}/adoption-dog.jpg +0 -0
  162. /package/examples/complete-sites/dog-shelter-single-page/site/images/{you-can-help/foster-dog.jpg → foster-dog.jpg} +0 -0
  163. /package/examples/complete-sites/dog-shelter-single-page/site/images/{what-we-do/rescue-dog.jpg → rescue-dog.jpg} +0 -0
  164. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-carousel.svg +0 -0
  165. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-stack.svg +0 -0
  166. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-surfaces.svg +0 -0
  167. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-one.svg +0 -0
  168. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-three.svg +0 -0
  169. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-two.svg +0 -0
  170. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-one.svg +0 -0
  171. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-two.svg +0 -0
  172. /package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/020-surfaces/theme.yaml +0 -0
  173. /package/examples/feature-demos/theme-presets/site/{routes/010-portfolio/images/portfolio → pages/010-portfolio/images}/puppy-portrait.jpg +0 -0
  174. /package/examples/feature-demos/theme-presets/site/{routes/010-portfolio/images/portfolio → pages/010-portfolio/images}/shepherd-portrait.jpg +0 -0
  175. /package/examples/feature-demos/theme-presets/site/{routes/010-portfolio/images/portfolio → pages/010-portfolio/images}/white-puppy.jpg +0 -0
  176. /package/examples/feature-demos/theme-presets/site/{routes → pages}/010-portfolio/theme.yaml +0 -0
  177. /package/examples/feature-demos/theme-presets/site/{routes/020-documentation/images/documentation → pages/020-documentation/images}/black-schnauzer.jpg +0 -0
  178. /package/examples/feature-demos/theme-presets/site/{routes/020-documentation/images/documentation → pages/020-documentation/images}/retriever-portrait.jpg +0 -0
  179. /package/examples/feature-demos/theme-presets/site/{routes/020-documentation/images/documentation → pages/020-documentation/images}/schnauzer-portrait.jpg +0 -0
  180. /package/examples/feature-demos/theme-presets/site/{routes → pages}/020-documentation/theme.yaml +0 -0
  181. /package/examples/feature-demos/theme-presets/site/{routes/030-project/images/project → pages/030-project/images}/boxer-portrait.jpg +0 -0
  182. /package/examples/feature-demos/theme-presets/site/{routes/030-project/images/project → pages/030-project/images}/grass-puppy.jpg +0 -0
  183. /package/examples/feature-demos/theme-presets/site/{routes/030-project/images/project → pages/030-project/images}/grey-street-dog.jpg +0 -0
  184. /package/examples/feature-demos/theme-presets/site/{routes → pages}/030-project/theme.yaml +0 -0
  185. /package/examples/feature-demos/theme-presets/site/{routes/040-statement/images/statement → pages/040-statement/images}/black-pedigree.jpg +0 -0
  186. /package/examples/feature-demos/theme-presets/site/{routes/040-statement/images/statement → pages/040-statement/images}/sheepdog-grass.jpg +0 -0
  187. /package/examples/feature-demos/theme-presets/site/{routes/040-statement/images/statement → pages/040-statement/images}/sheepdog-wide.jpg +0 -0
  188. /package/examples/feature-demos/theme-presets/site/{routes → pages}/040-statement/theme.yaml +0 -0
  189. /package/fixtures/basic/site/images/{work/.gitkeep → .gitkeep} +0 -0
  190. /package/fixtures/content-model-v2/site/images/{card-section/adopt.svg → adopt.svg} +0 -0
  191. /package/fixtures/content-model-v2/site/images/{intro/detail.jpg → detail.jpg} +0 -0
  192. /package/fixtures/content-model-v2/site/images/{intro/duplicate.jpg → duplicate.jpg} +0 -0
  193. /package/fixtures/content-model-v2/site/images/{card-section/foster.svg → foster.svg} +0 -0
  194. /package/fixtures/content-model-v2/site/images/{intro/hero.jpg → hero.jpg} +0 -0
  195. /package/fixtures/content-model-v2/site/images/{plain/image.jpg → image.jpg} +0 -0
  196. /package/fixtures/content-model-v2/site/images/{timed/slide-one.jpg → slide-one.jpg} +0 -0
  197. /package/fixtures/content-model-v2/site/images/{timed/slide-three.jpg → slide-three.jpg} +0 -0
  198. /package/fixtures/content-model-v2/site/images/{timed/slide-two.jpg → slide-two.jpg} +0 -0
  199. /package/fixtures/content-model-v2/site/{routes/010-guide/images/intro → pages/010-guide/images}/duplicate.jpg +0 -0
  200. /package/starters/basic/site/images/{work/.gitkeep → .gitkeep} +0 -0
@@ -1,288 +1,288 @@
1
1
  {
2
- "routes/010-portfolio/images/portfolio/puppy-portrait.jpg": {
2
+ "pages/010-portfolio/images/puppy-portrait.jpg": {
3
3
  "outputVersion": 2,
4
4
  "sourceHash": "0cb5126b86660785da62903393e43df7b6e361d3bd1a0492cc6f371159c5afb8",
5
5
  "width": 1200,
6
6
  "height": 800,
7
7
  "variants": [
8
8
  {
9
- "src": "/images/generated/routes/010-portfolio/images/portfolio/puppy-portrait-0cb5126b-480.webp",
9
+ "src": "/images/generated/pages/010-portfolio/images/puppy-portrait-0cb5126b-480.webp",
10
10
  "width": 480
11
11
  },
12
12
  {
13
- "src": "/images/generated/routes/010-portfolio/images/portfolio/puppy-portrait-0cb5126b-768.webp",
13
+ "src": "/images/generated/pages/010-portfolio/images/puppy-portrait-0cb5126b-768.webp",
14
14
  "width": 768
15
15
  },
16
16
  {
17
- "src": "/images/generated/routes/010-portfolio/images/portfolio/puppy-portrait-0cb5126b-1080.webp",
17
+ "src": "/images/generated/pages/010-portfolio/images/puppy-portrait-0cb5126b-1080.webp",
18
18
  "width": 1080
19
19
  },
20
20
  {
21
- "src": "/images/generated/routes/010-portfolio/images/portfolio/puppy-portrait-0cb5126b-1200.webp",
21
+ "src": "/images/generated/pages/010-portfolio/images/puppy-portrait-0cb5126b-1200.webp",
22
22
  "width": 1200
23
23
  }
24
24
  ]
25
25
  },
26
- "routes/010-portfolio/images/portfolio/shepherd-portrait.jpg": {
26
+ "pages/010-portfolio/images/shepherd-portrait.jpg": {
27
27
  "outputVersion": 2,
28
28
  "sourceHash": "604099036852fa40c2fecf8620a138405c8edcb0b92f120bb603742f9ee91154",
29
29
  "width": 1200,
30
30
  "height": 800,
31
31
  "variants": [
32
32
  {
33
- "src": "/images/generated/routes/010-portfolio/images/portfolio/shepherd-portrait-60409903-480.webp",
33
+ "src": "/images/generated/pages/010-portfolio/images/shepherd-portrait-60409903-480.webp",
34
34
  "width": 480
35
35
  },
36
36
  {
37
- "src": "/images/generated/routes/010-portfolio/images/portfolio/shepherd-portrait-60409903-768.webp",
37
+ "src": "/images/generated/pages/010-portfolio/images/shepherd-portrait-60409903-768.webp",
38
38
  "width": 768
39
39
  },
40
40
  {
41
- "src": "/images/generated/routes/010-portfolio/images/portfolio/shepherd-portrait-60409903-1080.webp",
41
+ "src": "/images/generated/pages/010-portfolio/images/shepherd-portrait-60409903-1080.webp",
42
42
  "width": 1080
43
43
  },
44
44
  {
45
- "src": "/images/generated/routes/010-portfolio/images/portfolio/shepherd-portrait-60409903-1200.webp",
45
+ "src": "/images/generated/pages/010-portfolio/images/shepherd-portrait-60409903-1200.webp",
46
46
  "width": 1200
47
47
  }
48
48
  ]
49
49
  },
50
- "routes/010-portfolio/images/portfolio/white-puppy.jpg": {
50
+ "pages/010-portfolio/images/white-puppy.jpg": {
51
51
  "outputVersion": 2,
52
52
  "sourceHash": "bcb834d00bb9b520dac475c32906f8578a03bd922c1639c7d86252ae1f1c433a",
53
53
  "width": 1200,
54
54
  "height": 800,
55
55
  "variants": [
56
56
  {
57
- "src": "/images/generated/routes/010-portfolio/images/portfolio/white-puppy-bcb834d0-480.webp",
57
+ "src": "/images/generated/pages/010-portfolio/images/white-puppy-bcb834d0-480.webp",
58
58
  "width": 480
59
59
  },
60
60
  {
61
- "src": "/images/generated/routes/010-portfolio/images/portfolio/white-puppy-bcb834d0-768.webp",
61
+ "src": "/images/generated/pages/010-portfolio/images/white-puppy-bcb834d0-768.webp",
62
62
  "width": 768
63
63
  },
64
64
  {
65
- "src": "/images/generated/routes/010-portfolio/images/portfolio/white-puppy-bcb834d0-1080.webp",
65
+ "src": "/images/generated/pages/010-portfolio/images/white-puppy-bcb834d0-1080.webp",
66
66
  "width": 1080
67
67
  },
68
68
  {
69
- "src": "/images/generated/routes/010-portfolio/images/portfolio/white-puppy-bcb834d0-1200.webp",
69
+ "src": "/images/generated/pages/010-portfolio/images/white-puppy-bcb834d0-1200.webp",
70
70
  "width": 1200
71
71
  }
72
72
  ]
73
73
  },
74
- "routes/020-documentation/images/documentation/black-schnauzer.jpg": {
74
+ "pages/020-documentation/images/black-schnauzer.jpg": {
75
75
  "outputVersion": 2,
76
76
  "sourceHash": "569922b4aa71096cc8e3a245f0ddccf74f941881b823084723854580078b50b0",
77
77
  "width": 1200,
78
78
  "height": 800,
79
79
  "variants": [
80
80
  {
81
- "src": "/images/generated/routes/020-documentation/images/documentation/black-schnauzer-569922b4-480.webp",
81
+ "src": "/images/generated/pages/020-documentation/images/black-schnauzer-569922b4-480.webp",
82
82
  "width": 480
83
83
  },
84
84
  {
85
- "src": "/images/generated/routes/020-documentation/images/documentation/black-schnauzer-569922b4-768.webp",
85
+ "src": "/images/generated/pages/020-documentation/images/black-schnauzer-569922b4-768.webp",
86
86
  "width": 768
87
87
  },
88
88
  {
89
- "src": "/images/generated/routes/020-documentation/images/documentation/black-schnauzer-569922b4-1080.webp",
89
+ "src": "/images/generated/pages/020-documentation/images/black-schnauzer-569922b4-1080.webp",
90
90
  "width": 1080
91
91
  },
92
92
  {
93
- "src": "/images/generated/routes/020-documentation/images/documentation/black-schnauzer-569922b4-1200.webp",
93
+ "src": "/images/generated/pages/020-documentation/images/black-schnauzer-569922b4-1200.webp",
94
94
  "width": 1200
95
95
  }
96
96
  ]
97
97
  },
98
- "routes/020-documentation/images/documentation/retriever-portrait.jpg": {
98
+ "pages/020-documentation/images/retriever-portrait.jpg": {
99
99
  "outputVersion": 2,
100
100
  "sourceHash": "c441ca2935debeb008a43e2a7fd510bfd6776682f84160151fd5c8605bfb8cae",
101
101
  "width": 1200,
102
102
  "height": 800,
103
103
  "variants": [
104
104
  {
105
- "src": "/images/generated/routes/020-documentation/images/documentation/retriever-portrait-c441ca29-480.webp",
105
+ "src": "/images/generated/pages/020-documentation/images/retriever-portrait-c441ca29-480.webp",
106
106
  "width": 480
107
107
  },
108
108
  {
109
- "src": "/images/generated/routes/020-documentation/images/documentation/retriever-portrait-c441ca29-768.webp",
109
+ "src": "/images/generated/pages/020-documentation/images/retriever-portrait-c441ca29-768.webp",
110
110
  "width": 768
111
111
  },
112
112
  {
113
- "src": "/images/generated/routes/020-documentation/images/documentation/retriever-portrait-c441ca29-1080.webp",
113
+ "src": "/images/generated/pages/020-documentation/images/retriever-portrait-c441ca29-1080.webp",
114
114
  "width": 1080
115
115
  },
116
116
  {
117
- "src": "/images/generated/routes/020-documentation/images/documentation/retriever-portrait-c441ca29-1200.webp",
117
+ "src": "/images/generated/pages/020-documentation/images/retriever-portrait-c441ca29-1200.webp",
118
118
  "width": 1200
119
119
  }
120
120
  ]
121
121
  },
122
- "routes/020-documentation/images/documentation/schnauzer-portrait.jpg": {
122
+ "pages/020-documentation/images/schnauzer-portrait.jpg": {
123
123
  "outputVersion": 2,
124
124
  "sourceHash": "545b0427b8e15846fe73656758da6eb3b8612dabf2b2879c31197986f8deb9b5",
125
125
  "width": 1200,
126
126
  "height": 900,
127
127
  "variants": [
128
128
  {
129
- "src": "/images/generated/routes/020-documentation/images/documentation/schnauzer-portrait-545b0427-480.webp",
129
+ "src": "/images/generated/pages/020-documentation/images/schnauzer-portrait-545b0427-480.webp",
130
130
  "width": 480
131
131
  },
132
132
  {
133
- "src": "/images/generated/routes/020-documentation/images/documentation/schnauzer-portrait-545b0427-768.webp",
133
+ "src": "/images/generated/pages/020-documentation/images/schnauzer-portrait-545b0427-768.webp",
134
134
  "width": 768
135
135
  },
136
136
  {
137
- "src": "/images/generated/routes/020-documentation/images/documentation/schnauzer-portrait-545b0427-1080.webp",
137
+ "src": "/images/generated/pages/020-documentation/images/schnauzer-portrait-545b0427-1080.webp",
138
138
  "width": 1080
139
139
  },
140
140
  {
141
- "src": "/images/generated/routes/020-documentation/images/documentation/schnauzer-portrait-545b0427-1200.webp",
141
+ "src": "/images/generated/pages/020-documentation/images/schnauzer-portrait-545b0427-1200.webp",
142
142
  "width": 1200
143
143
  }
144
144
  ]
145
145
  },
146
- "routes/030-project/images/project/boxer-portrait.jpg": {
146
+ "pages/030-project/images/boxer-portrait.jpg": {
147
147
  "outputVersion": 2,
148
148
  "sourceHash": "da764a5b71f2bfa610ae4978cad4660cd6ecfdcd5b7fcbd788b92c3f9ada42b1",
149
149
  "width": 1200,
150
150
  "height": 800,
151
151
  "variants": [
152
152
  {
153
- "src": "/images/generated/routes/030-project/images/project/boxer-portrait-da764a5b-480.webp",
153
+ "src": "/images/generated/pages/030-project/images/boxer-portrait-da764a5b-480.webp",
154
154
  "width": 480
155
155
  },
156
156
  {
157
- "src": "/images/generated/routes/030-project/images/project/boxer-portrait-da764a5b-768.webp",
157
+ "src": "/images/generated/pages/030-project/images/boxer-portrait-da764a5b-768.webp",
158
158
  "width": 768
159
159
  },
160
160
  {
161
- "src": "/images/generated/routes/030-project/images/project/boxer-portrait-da764a5b-1080.webp",
161
+ "src": "/images/generated/pages/030-project/images/boxer-portrait-da764a5b-1080.webp",
162
162
  "width": 1080
163
163
  },
164
164
  {
165
- "src": "/images/generated/routes/030-project/images/project/boxer-portrait-da764a5b-1200.webp",
165
+ "src": "/images/generated/pages/030-project/images/boxer-portrait-da764a5b-1200.webp",
166
166
  "width": 1200
167
167
  }
168
168
  ]
169
169
  },
170
- "routes/030-project/images/project/grass-puppy.jpg": {
170
+ "pages/030-project/images/grass-puppy.jpg": {
171
171
  "outputVersion": 2,
172
172
  "sourceHash": "519d663971223bdb1948db9087c637f1ed8b4d21d81c08e1fc10d5e2d904f230",
173
173
  "width": 1200,
174
174
  "height": 800,
175
175
  "variants": [
176
176
  {
177
- "src": "/images/generated/routes/030-project/images/project/grass-puppy-519d6639-480.webp",
177
+ "src": "/images/generated/pages/030-project/images/grass-puppy-519d6639-480.webp",
178
178
  "width": 480
179
179
  },
180
180
  {
181
- "src": "/images/generated/routes/030-project/images/project/grass-puppy-519d6639-768.webp",
181
+ "src": "/images/generated/pages/030-project/images/grass-puppy-519d6639-768.webp",
182
182
  "width": 768
183
183
  },
184
184
  {
185
- "src": "/images/generated/routes/030-project/images/project/grass-puppy-519d6639-1080.webp",
185
+ "src": "/images/generated/pages/030-project/images/grass-puppy-519d6639-1080.webp",
186
186
  "width": 1080
187
187
  },
188
188
  {
189
- "src": "/images/generated/routes/030-project/images/project/grass-puppy-519d6639-1200.webp",
189
+ "src": "/images/generated/pages/030-project/images/grass-puppy-519d6639-1200.webp",
190
190
  "width": 1200
191
191
  }
192
192
  ]
193
193
  },
194
- "routes/030-project/images/project/grey-street-dog.jpg": {
194
+ "pages/030-project/images/grey-street-dog.jpg": {
195
195
  "outputVersion": 2,
196
196
  "sourceHash": "08cab93ba9a2d1c3a72c471dd8724efa7d820f43dad447221b445c32ebe9ab28",
197
197
  "width": 1200,
198
198
  "height": 800,
199
199
  "variants": [
200
200
  {
201
- "src": "/images/generated/routes/030-project/images/project/grey-street-dog-08cab93b-480.webp",
201
+ "src": "/images/generated/pages/030-project/images/grey-street-dog-08cab93b-480.webp",
202
202
  "width": 480
203
203
  },
204
204
  {
205
- "src": "/images/generated/routes/030-project/images/project/grey-street-dog-08cab93b-768.webp",
205
+ "src": "/images/generated/pages/030-project/images/grey-street-dog-08cab93b-768.webp",
206
206
  "width": 768
207
207
  },
208
208
  {
209
- "src": "/images/generated/routes/030-project/images/project/grey-street-dog-08cab93b-1080.webp",
209
+ "src": "/images/generated/pages/030-project/images/grey-street-dog-08cab93b-1080.webp",
210
210
  "width": 1080
211
211
  },
212
212
  {
213
- "src": "/images/generated/routes/030-project/images/project/grey-street-dog-08cab93b-1200.webp",
213
+ "src": "/images/generated/pages/030-project/images/grey-street-dog-08cab93b-1200.webp",
214
214
  "width": 1200
215
215
  }
216
216
  ]
217
217
  },
218
- "routes/040-statement/images/statement/black-pedigree.jpg": {
218
+ "pages/040-statement/images/black-pedigree.jpg": {
219
219
  "outputVersion": 2,
220
220
  "sourceHash": "7d5e0be21d7889cb440b9dd6bab74d8f656e4f5159fdcd6cbe937fc7b9d4bd44",
221
221
  "width": 1200,
222
222
  "height": 800,
223
223
  "variants": [
224
224
  {
225
- "src": "/images/generated/routes/040-statement/images/statement/black-pedigree-7d5e0be2-480.webp",
225
+ "src": "/images/generated/pages/040-statement/images/black-pedigree-7d5e0be2-480.webp",
226
226
  "width": 480
227
227
  },
228
228
  {
229
- "src": "/images/generated/routes/040-statement/images/statement/black-pedigree-7d5e0be2-768.webp",
229
+ "src": "/images/generated/pages/040-statement/images/black-pedigree-7d5e0be2-768.webp",
230
230
  "width": 768
231
231
  },
232
232
  {
233
- "src": "/images/generated/routes/040-statement/images/statement/black-pedigree-7d5e0be2-1080.webp",
233
+ "src": "/images/generated/pages/040-statement/images/black-pedigree-7d5e0be2-1080.webp",
234
234
  "width": 1080
235
235
  },
236
236
  {
237
- "src": "/images/generated/routes/040-statement/images/statement/black-pedigree-7d5e0be2-1200.webp",
237
+ "src": "/images/generated/pages/040-statement/images/black-pedigree-7d5e0be2-1200.webp",
238
238
  "width": 1200
239
239
  }
240
240
  ]
241
241
  },
242
- "routes/040-statement/images/statement/sheepdog-grass.jpg": {
242
+ "pages/040-statement/images/sheepdog-grass.jpg": {
243
243
  "outputVersion": 2,
244
244
  "sourceHash": "b9396e00227dac3b290d6e29cc82758a4cf98f08bc9154c24c8fbf598563b69a",
245
245
  "width": 1200,
246
246
  "height": 800,
247
247
  "variants": [
248
248
  {
249
- "src": "/images/generated/routes/040-statement/images/statement/sheepdog-grass-b9396e00-480.webp",
249
+ "src": "/images/generated/pages/040-statement/images/sheepdog-grass-b9396e00-480.webp",
250
250
  "width": 480
251
251
  },
252
252
  {
253
- "src": "/images/generated/routes/040-statement/images/statement/sheepdog-grass-b9396e00-768.webp",
253
+ "src": "/images/generated/pages/040-statement/images/sheepdog-grass-b9396e00-768.webp",
254
254
  "width": 768
255
255
  },
256
256
  {
257
- "src": "/images/generated/routes/040-statement/images/statement/sheepdog-grass-b9396e00-1080.webp",
257
+ "src": "/images/generated/pages/040-statement/images/sheepdog-grass-b9396e00-1080.webp",
258
258
  "width": 1080
259
259
  },
260
260
  {
261
- "src": "/images/generated/routes/040-statement/images/statement/sheepdog-grass-b9396e00-1200.webp",
261
+ "src": "/images/generated/pages/040-statement/images/sheepdog-grass-b9396e00-1200.webp",
262
262
  "width": 1200
263
263
  }
264
264
  ]
265
265
  },
266
- "routes/040-statement/images/statement/sheepdog-wide.jpg": {
266
+ "pages/040-statement/images/sheepdog-wide.jpg": {
267
267
  "outputVersion": 2,
268
268
  "sourceHash": "5c8a6878d3d38549d41f8161b92ffb555f3bf5c2d3defbade15932c4d11b6dea",
269
269
  "width": 1200,
270
270
  "height": 667,
271
271
  "variants": [
272
272
  {
273
- "src": "/images/generated/routes/040-statement/images/statement/sheepdog-wide-5c8a6878-480.webp",
273
+ "src": "/images/generated/pages/040-statement/images/sheepdog-wide-5c8a6878-480.webp",
274
274
  "width": 480
275
275
  },
276
276
  {
277
- "src": "/images/generated/routes/040-statement/images/statement/sheepdog-wide-5c8a6878-768.webp",
277
+ "src": "/images/generated/pages/040-statement/images/sheepdog-wide-5c8a6878-768.webp",
278
278
  "width": 768
279
279
  },
280
280
  {
281
- "src": "/images/generated/routes/040-statement/images/statement/sheepdog-wide-5c8a6878-1080.webp",
281
+ "src": "/images/generated/pages/040-statement/images/sheepdog-wide-5c8a6878-1080.webp",
282
282
  "width": 1080
283
283
  },
284
284
  {
285
- "src": "/images/generated/routes/040-statement/images/statement/sheepdog-wide-5c8a6878-1200.webp",
285
+ "src": "/images/generated/pages/040-statement/images/sheepdog-wide-5c8a6878-1200.webp",
286
286
  "width": 1200
287
287
  }
288
288
  ]
@@ -1,13 +1,10 @@
1
1
  ---
2
- title: Theme Presets
3
- description: Compare Norna's complete built-in theme presets without overrides.
4
- navigation:
5
- label: Presets
2
+ page:
3
+ description: Compare Norna's complete built-in theme presets without overrides.
6
4
  ---
7
5
 
8
- ## Theme presets {#theme-presets}
9
-
10
- Each route selects one complete theme preset without overrides. The comparison
6
+ # Theme Presets
7
+ Each page selects one complete theme preset without overrides. The comparison
11
8
  therefore includes layout, typography, palette, section surfaces and managed
12
9
  image presentation:
13
10
 
@@ -1,13 +1,10 @@
1
1
  ---
2
- title: Portfolio
3
- description: A complete theme preset for image-led portfolios and presentations.
4
- navigation:
5
- label: Portfolio
2
+ page:
3
+ description: A complete theme preset for image-led portfolios and presentations.
6
4
  ---
7
5
 
8
- ## Portfolio {#portfolio}
9
-
10
- This route uses the complete `portfolio` preset without overrides. It gives
6
+ # Portfolio
7
+ This page uses the complete `portfolio` preset without overrides. It gives
11
8
  images a broad stage, keeps typography restrained and uses a dark palette for
12
9
  an image-led presentation.
13
10
 
@@ -1,13 +1,10 @@
1
1
  ---
2
- title: Documentation
3
- description: A complete theme preset for guides and explanatory writing.
4
- navigation:
5
- label: Documentation
2
+ page:
3
+ description: A complete theme preset for guides and explanatory writing.
6
4
  ---
7
5
 
8
- ## Documentation {#documentation}
9
-
10
- This route uses the complete `documentation` preset without overrides. It
6
+ # Documentation
7
+ This page uses the complete `documentation` preset without overrides. It
11
8
  favours readable explanatory text, compact vertical rhythm and restrained
12
9
  surface changes for longer guides.
13
10
 
@@ -1,13 +1,10 @@
1
1
  ---
2
- title: Project
3
- description: A complete theme preset for project and product websites.
4
- navigation:
5
- label: Project
2
+ page:
3
+ description: A complete theme preset for project and product websites.
6
4
  ---
7
5
 
8
- ## Project {#project}
9
-
10
- This route uses the complete `project` preset without overrides. It provides a
6
+ # Project
7
+ This page uses the complete `project` preset without overrides. It provides a
11
8
  compact, neutral presentation for project overviews, feature descriptions and
12
9
  practical documentation.
13
10
 
@@ -1,13 +1,10 @@
1
1
  ---
2
- title: Statement
3
- description: A stronger typography profile for short declarative content.
4
- navigation:
5
- label: Statement
2
+ page:
3
+ description: A stronger typography profile for short declarative content.
6
4
  ---
7
5
 
8
- ## Statement {#statement}
9
-
10
- This route uses the complete `statement` preset without overrides. Its airy
6
+ # Statement
7
+ This page uses the complete `statement` preset without overrides. Its airy
11
8
  layout, stronger typography and alternating surfaces suit short, declarative
12
9
  content with a more editorial voice.
13
10
 
@@ -1,12 +1,3 @@
1
- navigation:
2
- label: Theme Presets
3
1
  footer:
4
2
  copyrightMessage: Dog photos by Bicanski, CC0, via Pixnio.
5
- buildInfo:
6
- enabled: true
7
- text: Built
8
- dateTimeFormat:
9
- locale: en-GB
10
- timeZone: UTC
11
- dateStyle: short
12
- timeStyle: short
3
+ buildInfo: true
@@ -1,11 +1,10 @@
1
1
  ---
2
- title: Fixture Site
3
- description: Minimal Norna fixture site.
4
- sections:
5
- intro: {}
6
- work: {}
7
-
2
+ page:
3
+ description: Minimal Norna fixture site.
8
4
  ---
5
+
6
+ # Fixture Site
7
+
9
8
  ## Intro {#intro}
10
9
 
11
10
  This fixture validates the Norna engine against a stable page without managed images.
@@ -1,10 +1,3 @@
1
1
  footer:
2
2
  copyrightMessage: (c) Fixture Artist.
3
- buildInfo:
4
- enabled: true
5
- text: Built
6
- dateTimeFormat:
7
- locale: en-GB
8
- timeZone: UTC
9
- dateStyle: short
10
- timeStyle: short
3
+ buildInfo: true
@@ -1,18 +1,15 @@
1
1
  ---
2
- title: Content Model v2 Fixture
3
- description: Internal fixture for Markdown-authoritative Norna content.
4
- sections:
5
- intro: {}
6
- timed:
7
- visible:
8
- from: "2026-01-01"
9
- until: "2027-01-01"
2
+ page:
3
+ description: Internal fixture for Markdown-authoritative Norna content.
10
4
  ---
11
5
 
6
+ # Content Model v2 Fixture
7
+
8
+
12
9
  ## Intro {#intro}
13
10
 
14
- This fixture validates that Markdown defines sections and that section metadata
15
- is optional. It also checks **inline emphasis**.
11
+ This fixture validates that Markdown defines sections. It also checks **inline
12
+ emphasis**.
16
13
 
17
14
  ```norna-image-stack
18
15
  - image: hero.jpg
@@ -33,9 +30,10 @@ Text can continue after a Norna-managed image.
33
30
  caption: Dog portrait three: a white and brown border collie-type dog.
34
31
  ```
35
32
 
36
- ## Timed section {#timed}
33
+ ## Carousel section {#timed}
37
34
 
38
- This section uses frontmatter metadata without duplicating section order.
35
+ This section demonstrates an image carousel without duplicating section order
36
+ in frontmatter.
39
37
 
40
38
  ```norna-image-carousel
41
39
  - image: slide-one.jpg
@@ -51,7 +49,7 @@ This section uses frontmatter metadata without duplicating section order.
51
49
 
52
50
  ## Plain section {#plain}
53
51
 
54
- This section has no frontmatter metadata.
52
+ This section is defined entirely by Markdown.
55
53
 
56
54
  ```norna-image-stack
57
55
  - image: image.jpg
@@ -0,0 +1,18 @@
1
+ ---
2
+ page:
3
+ description: Internal page fixture for content model v2.
4
+ ---
5
+
6
+ # Guide
7
+
8
+
9
+ ## Intro {#intro}
10
+
11
+ Pages may use the same section id and image filename as other pages without
12
+ making the site invalid.
13
+
14
+ ```norna-image-stack
15
+ - image: duplicate.jpg
16
+ alt: A page-local duplicated filename.
17
+ caption: This file is resolved in the page image root.
18
+ ```
@@ -0,0 +1,10 @@
1
+ {
2
+ "pages/010-guides/pages/010-installation/images/diagram.svg": {
3
+ "kind": "static",
4
+ "outputVersion": 2,
5
+ "sourceHash": "5bf0dfcf8d4933ff5175143edfe95371bce44fb3b2e05db077dceb128500b948",
6
+ "src": "/images/original/pages/010-guides/pages/010-installation/images/diagram-5bf0dfcf.svg",
7
+ "width": 900,
8
+ "height": 240
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ url: http://localhost:4321/
@@ -0,0 +1,15 @@
1
+ ---
2
+ page:
3
+ description: A focused fixture for nested Norna pages.
4
+ ---
5
+
6
+ # Nested pages
7
+
8
+ ## Start here
9
+
10
+ This fixture shows how parent and child pages form paths and navigation.
11
+
12
+ ## What to inspect
13
+
14
+ Open Guides, Installation and macOS in sequence. Reference contains another
15
+ Installation page to verify that page ids only need to be unique among siblings.
@@ -0,0 +1,15 @@
1
+ ---
2
+ page:
3
+ description: The parent page for nested guides.
4
+ ---
5
+
6
+ # Guides
7
+
8
+ ## Guide overview
9
+
10
+ Guides is a top-level page and the parent of Installation and Workflows.
11
+
12
+ ## Inherited presentation
13
+
14
+ This page defines a local theme. Its descendants inherit that theme unless they
15
+ define their own.
@@ -0,0 +1,21 @@
1
+ ---
2
+ page:
3
+ description: A nested installation guide.
4
+ ---
5
+
6
+ # Installation
7
+
8
+ ## Installation details
9
+
10
+ This page should be available at `/guides/installation/` and inherit the Guides
11
+ theme.
12
+
13
+ ## Examples
14
+
15
+ The managed image belongs to this nested page and section.
16
+
17
+ ```norna-image-stack
18
+ - image: diagram.svg
19
+ alt: Three nested page levels connected in sequence.
20
+ caption: A managed SVG resolved from the nested page image directory.
21
+ ```