@janga/norna 0.7.17 → 0.7.18

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 (262) hide show
  1. package/README.md +15 -6
  2. package/bin/norna-cli.mjs +1 -1
  3. package/docs/README.md +11 -9
  4. package/docs/configuration.md +25 -2
  5. package/docs/content.md +21 -12
  6. package/docs/design/navigation-and-theme-plan.md +90 -19
  7. package/docs/design/site-examples-structure.md +7 -3
  8. package/docs/engine-development.md +19 -22
  9. package/docs/getting-started.md +3 -3
  10. package/docs/images-and-metadata.md +6 -4
  11. package/docs/pages.md +120 -64
  12. package/docs/public-files.md +1 -1
  13. package/docs/site-files.md +36 -29
  14. package/docs/sitewide-content.md +1 -1
  15. package/docs/theme.md +107 -141
  16. package/docs/typography.md +15 -27
  17. package/examples/README.md +8 -2
  18. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +5 -5
  19. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +10 -10
  20. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +35 -43
  21. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
  22. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/content.md +2 -1
  23. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +2 -3
  24. package/examples/feature-demos/theme-preset-documentation/README.md +16 -0
  25. package/examples/feature-demos/theme-preset-documentation/site/.norna/generated-images.json +74 -0
  26. package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/content.md +1 -1
  27. package/examples/feature-demos/theme-preset-portfolio/README.md +16 -0
  28. package/examples/feature-demos/theme-preset-portfolio/site/.norna/generated-images.json +74 -0
  29. package/examples/feature-demos/theme-preset-portfolio/site/config.yaml +1 -0
  30. package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/content.md +1 -1
  31. package/examples/feature-demos/theme-preset-portfolio/site/public/robots.txt +2 -0
  32. package/examples/feature-demos/theme-preset-portfolio/site/sitewide-content.yaml +3 -0
  33. package/examples/feature-demos/theme-preset-project/README.md +16 -0
  34. package/examples/feature-demos/theme-preset-project/site/.norna/generated-images.json +74 -0
  35. package/examples/feature-demos/theme-preset-project/site/config.yaml +1 -0
  36. package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/content.md +1 -1
  37. package/examples/feature-demos/theme-preset-project/site/public/robots.txt +2 -0
  38. package/examples/feature-demos/theme-preset-project/site/sitewide-content.yaml +3 -0
  39. package/examples/feature-demos/theme-preset-statement/README.md +16 -0
  40. package/examples/feature-demos/theme-preset-statement/site/.norna/generated-images.json +74 -0
  41. package/examples/feature-demos/theme-preset-statement/site/config.yaml +1 -0
  42. package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/content.md +1 -1
  43. package/examples/feature-demos/theme-preset-statement/site/public/robots.txt +2 -0
  44. package/examples/feature-demos/theme-preset-statement/site/sitewide-content.yaml +3 -0
  45. package/fixtures/basic/site/theme.yaml +1 -8
  46. package/fixtures/nested-pages/.astro/collections/site.schema.json +35 -0
  47. package/fixtures/nested-pages/.astro/collections/sitewide.schema.json +97 -0
  48. package/fixtures/nested-pages/.astro/collections/theme.schema.json +844 -0
  49. package/fixtures/nested-pages/.astro/content-assets.mjs +4 -0
  50. package/fixtures/nested-pages/.astro/content-modules.mjs +1 -0
  51. package/fixtures/nested-pages/.astro/content.d.ts +183 -0
  52. package/fixtures/nested-pages/.astro/data-store.json +1 -0
  53. package/fixtures/nested-pages/.astro/dev-local.json +8 -0
  54. package/fixtures/nested-pages/.astro/dev.log +1128 -0
  55. package/fixtures/nested-pages/.astro/settings.json +5 -0
  56. package/fixtures/nested-pages/.astro/types.d.ts +2 -0
  57. package/fixtures/nested-pages/node_modules/.vite/deps/_metadata.json +74 -0
  58. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  59. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  60. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  61. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  62. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  63. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  64. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  65. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  66. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  67. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  68. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  69. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  70. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  71. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  72. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  73. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  74. package/fixtures/nested-pages/node_modules/.vite/deps/package.json +3 -0
  75. package/fixtures/nested-pages/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  76. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  77. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  78. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  79. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  80. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  81. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  82. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  83. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  84. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  85. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  86. package/fixtures/nested-pages/site/config.yaml +2 -0
  87. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +4 -0
  88. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/theme.yaml +2 -0
  89. package/fixtures/nested-pages/site/pages/010-guides/pages/030-release-notes/content.md +9 -0
  90. package/fixtures/nested-pages/site/pages/010-guides/pages/040-configuration/content.md +3 -0
  91. package/fixtures/nested-pages/site/pages/010-guides/pages/050-content/content.md +3 -0
  92. package/fixtures/nested-pages/site/pages/010-guides/pages/060-themes/content.md +3 -0
  93. package/fixtures/nested-pages/site/pages/010-guides/pages/070-images/content.md +3 -0
  94. package/fixtures/nested-pages/site/pages/010-guides/pages/080-cards/content.md +3 -0
  95. package/fixtures/nested-pages/site/pages/010-guides/pages/090-notes/content.md +3 -0
  96. package/fixtures/nested-pages/site/pages/010-guides/pages/100-validation/content.md +3 -0
  97. package/fixtures/nested-pages/site/pages/010-guides/pages/110-synchronization/content.md +3 -0
  98. package/fixtures/nested-pages/site/pages/010-guides/pages/120-building/content.md +3 -0
  99. package/fixtures/nested-pages/site/pages/010-guides/pages/130-publishing/content.md +3 -0
  100. package/fixtures/nested-pages/site/pages/010-guides/pages/140-troubleshooting/content.md +3 -0
  101. package/fixtures/nested-pages/site/pages/010-guides/pages/150-migration/content.md +3 -0
  102. package/fixtures/nested-pages/site/pages/010-guides/pages/160-accessibility/content.md +3 -0
  103. package/fixtures/nested-pages/site/pages/010-guides/pages/170-performance/content.md +3 -0
  104. package/fixtures/nested-pages/site/pages/010-guides/pages/180-security/content.md +3 -0
  105. package/fixtures/nested-pages/site/pages/010-guides/pages/190-localization/content.md +3 -0
  106. package/fixtures/nested-pages/site/pages/010-guides/pages/200-upgrading/content.md +3 -0
  107. package/fixtures/nested-pages/site/pages/010-guides/pages/210-faq/content.md +3 -0
  108. package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +7 -3
  109. package/fixtures/nested-pages/site/theme.yaml +1 -3
  110. package/package.json +2 -1
  111. package/schemas/config.schema.json +45 -4
  112. package/schemas/content-frontmatter.schema.json +5 -5
  113. package/schemas/manifest.json +3 -2
  114. package/schemas/page-theme.schema.json +192 -0
  115. package/schemas/sitewide-content.schema.json +17 -17
  116. package/schemas/theme.schema.json +188 -216
  117. package/scripts/check-config.mjs +2 -1
  118. package/scripts/deploy-site.mjs +1 -1
  119. package/scripts/generate-images.mjs +7 -14
  120. package/scripts/generate-schemas.mjs +4 -1
  121. package/scripts/lib/editor-language-service.mjs +0 -14
  122. package/scripts/lib/example-sites.mjs +15 -3
  123. package/scripts/lib/page-model.mjs +26 -7
  124. package/scripts/lib/presentation.mjs +25 -17
  125. package/scripts/lib/project-config.mjs +26 -16
  126. package/scripts/lib/schema-definitions.mjs +42 -14
  127. package/scripts/lib/schema-editor-metadata.mjs +70 -26
  128. package/scripts/lib/schema-value-definitions.mjs +14 -0
  129. package/scripts/lib/site-content.mjs +50 -25
  130. package/scripts/lib/site-conventions.mjs +1 -0
  131. package/scripts/lib/site-paths.mjs +9 -3
  132. package/scripts/lib/theme-config.mjs +3 -2
  133. package/scripts/lib/theme-presets.mjs +54 -21
  134. package/scripts/show-typography.mjs +1 -33
  135. package/scripts/sync-content-sections.mjs +1 -3
  136. package/scripts/test-banner-visibility.mjs +2 -2
  137. package/scripts/test-client-javascript.mjs +11 -4
  138. package/scripts/test-content-check.mjs +25 -25
  139. package/scripts/test-content-model-v2.mjs +165 -101
  140. package/scripts/test-documentation.mjs +4 -2
  141. package/scripts/test-editor-language-service.mjs +11 -8
  142. package/scripts/test-engine-commands.mjs +5 -5
  143. package/scripts/test-examples.mjs +30 -1
  144. package/scripts/test-heading-ids.mjs +2 -2
  145. package/scripts/test-navigation.mjs +11 -2
  146. package/scripts/test-nested-pages.mjs +25 -10
  147. package/scripts/test-package-check.mjs +29 -60
  148. package/scripts/test-page-model.mjs +30 -2
  149. package/scripts/test-project-config.mjs +5 -10
  150. package/scripts/test-schemas.mjs +18 -3
  151. package/scripts/test-theme-presets.mjs +33 -27
  152. package/src/components/NavigationPageTree.astro +114 -25
  153. package/src/components/PageContentsLinks.astro +40 -0
  154. package/src/components/SectionNavigationScript.astro +12 -5
  155. package/src/components/SiteBreadcrumbs.astro +17 -14
  156. package/src/components/SiteNavigation.astro +45 -12
  157. package/src/components/SitePage.astro +37 -23
  158. package/src/components/SiteSection.astro +2 -7
  159. package/src/components/SiteTreeNavigation.astro +35 -0
  160. package/src/components/TreeNavigationScript.astro +83 -0
  161. package/src/content.config.ts +2 -8
  162. package/src/layouts/BaseLayout.astro +10 -0
  163. package/src/lib/pageThemes.ts +11 -9
  164. package/src/lib/sectionContent.ts +1 -5
  165. package/src/lib/siteNavigation.ts +2 -1
  166. package/src/lib/sitePages.ts +25 -14
  167. package/src/pages/index.astro +2 -1
  168. package/src/styles/global.css +411 -43
  169. package/starters/basic/README.md +7 -7
  170. package/starters/basic/site/theme.yaml +1 -105
  171. package/starters/project/README.md +8 -8
  172. package/starters/project/site/theme.yaml +1 -31
  173. package/examples/feature-demos/theme-presets/README.md +0 -18
  174. package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +0 -290
  175. package/examples/feature-demos/theme-presets/site/content.md +0 -14
  176. package/examples/feature-demos/theme-presets/site/theme.yaml +0 -1
  177. /package/examples/complete-sites/dog-shelter-multi-page/site/{content.md → pages/000-home/content.md} +0 -0
  178. /package/examples/complete-sites/dog-shelter-multi-page/site/{images → pages/000-home/images}/shelter-dog.jpg +0 -0
  179. /package/examples/complete-sites/dog-shelter-single-page/site/{content.md → pages/000-home/content.md} +0 -0
  180. /package/examples/complete-sites/dog-shelter-single-page/site/{images → pages/000-home/images}/foster-dog.jpg +0 -0
  181. /package/examples/complete-sites/dog-shelter-single-page/site/{images → pages/000-home/images}/rescue-dog.jpg +0 -0
  182. /package/examples/feature-demos/media-and-surfaces/site/{content.md → pages/000-home/content.md} +0 -0
  183. /package/examples/feature-demos/sitewide-content/site/{content.md → pages/000-home/content.md} +0 -0
  184. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/config.yaml +0 -0
  185. /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/images/black-schnauzer.jpg +0 -0
  186. /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/images/retriever-portrait.jpg +0 -0
  187. /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/images/schnauzer-portrait.jpg +0 -0
  188. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/public/robots.txt +0 -0
  189. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/sitewide-content.yaml +0 -0
  190. /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site}/theme.yaml +0 -0
  191. /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/images/puppy-portrait.jpg +0 -0
  192. /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/images/shepherd-portrait.jpg +0 -0
  193. /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/images/white-puppy.jpg +0 -0
  194. /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site}/theme.yaml +0 -0
  195. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/routeTheme.schema.json +0 -0
  196. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/site.schema.json +0 -0
  197. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/sitewide.schema.json +0 -0
  198. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/theme.schema.json +0 -0
  199. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-assets.mjs +0 -0
  200. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-modules.mjs +0 -0
  201. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content.d.ts +0 -0
  202. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/data-store.json +0 -0
  203. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev-local.json +0 -0
  204. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.json +0 -0
  205. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.log +0 -0
  206. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/settings.json +0 -0
  207. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/types.d.ts +0 -0
  208. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/_metadata.json +0 -0
  209. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  210. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  211. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  212. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  213. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  214. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  215. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  216. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  217. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  218. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  219. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  220. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  221. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js +0 -0
  222. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
  223. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  224. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  225. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  226. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  227. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/package.json +0 -0
  228. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  229. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  230. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  231. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  232. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  233. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  234. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  235. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  236. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  237. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  238. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  239. /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/images/boxer-portrait.jpg +0 -0
  240. /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/images/grass-puppy.jpg +0 -0
  241. /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/images/grey-street-dog.jpg +0 -0
  242. /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site}/theme.yaml +0 -0
  243. /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/images/black-pedigree.jpg +0 -0
  244. /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/images/sheepdog-grass.jpg +0 -0
  245. /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/images/sheepdog-wide.jpg +0 -0
  246. /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site}/theme.yaml +0 -0
  247. /package/fixtures/basic/site/{content.md → pages/000-home/content.md} +0 -0
  248. /package/fixtures/basic/site/{images → pages/000-home/images}/.gitkeep +0 -0
  249. /package/fixtures/content-model-v2/site/{content.md → pages/000-home/content.md} +0 -0
  250. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/adopt.svg +0 -0
  251. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/detail.jpg +0 -0
  252. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/duplicate.jpg +0 -0
  253. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/foster.svg +0 -0
  254. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/hero.jpg +0 -0
  255. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/image.jpg +0 -0
  256. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/slide-one.jpg +0 -0
  257. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/slide-three.jpg +0 -0
  258. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/slide-two.jpg +0 -0
  259. /package/fixtures/nested-pages/site/{content.md → pages/000-home/content.md} +0 -0
  260. /package/starters/basic/site/{content.md → pages/000-home/content.md} +0 -0
  261. /package/starters/basic/site/{images → pages/000-home/images}/.gitkeep +0 -0
  262. /package/starters/project/site/{content.md → pages/000-home/content.md} +0 -0
package/README.md CHANGED
@@ -52,15 +52,21 @@ site/
52
52
  |-- config.yaml
53
53
  |-- theme.yaml
54
54
  |-- sitewide-content.yaml
55
- |-- content.md
56
- |-- images/
57
55
  |-- pages/
56
+ | |-- 000-home/
57
+ | | |-- content.md
58
+ | | `-- images/
59
+ | `-- 010-guide/
60
+ | |-- content.md
61
+ | `-- pages/
62
+ | `-- 010-installation/
58
63
  `-- public/
59
64
  ```
60
65
 
61
- - `content.md` holds the homepage title, introduction, and sections.
62
- - `images/` holds the homepage's managed source images.
63
- - `pages/` adds pages, each with content and optional local images and theme.
66
+ - `pages/000-home/content.md` is the required homepage at `/`.
67
+ - Other top-level directories under `pages/` are global navigation roots.
68
+ - A page may contain local images, limited presentation settings, and nested
69
+ child pages under its own `pages/` directory.
64
70
  - `theme.yaml` normally selects one complete visual preset.
65
71
  - `sitewide-content.yaml` holds shared logo display settings, banners, and footer content.
66
72
  - `config.yaml` holds the public URL and optional language and scroll behavior.
@@ -89,7 +95,10 @@ documentation.
89
95
  | --- | --- | --- |
90
96
  | Dog shelter, single page | [Open demo](https://janga.github.io/norna/examples/complete-sites/dog-shelter-single-page/) | [View files](examples/complete-sites/dog-shelter-single-page/) |
91
97
  | Dog shelter, multi-page | [Open demo](https://janga.github.io/norna/examples/complete-sites/dog-shelter-multi-page/) | [View files](examples/complete-sites/dog-shelter-multi-page/) |
92
- | Theme presets | [Open demo](https://janga.github.io/norna/examples/feature-demos/theme-presets/) | [View files](examples/feature-demos/theme-presets/) |
98
+ | Portfolio preset | [Open demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-portfolio/) | [View files](examples/feature-demos/theme-preset-portfolio/) |
99
+ | Documentation preset | [Open demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-documentation/) | [View files](examples/feature-demos/theme-preset-documentation/) |
100
+ | Project preset | [Open demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-project/) | [View files](examples/feature-demos/theme-preset-project/) |
101
+ | Statement preset | [Open demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-statement/) | [View files](examples/feature-demos/theme-preset-statement/) |
93
102
  | Media and surfaces | [Open demo](https://janga.github.io/norna/examples/feature-demos/media-and-surfaces/) | [View files](examples/feature-demos/media-and-surfaces/) |
94
103
  | Sitewide content | [Open demo](https://janga.github.io/norna/examples/feature-demos/sitewide-content/) | [View files](examples/feature-demos/sitewide-content/) |
95
104
 
package/bin/norna-cli.mjs CHANGED
@@ -16,7 +16,7 @@ Commands:
16
16
  dev:stop Stop local dev server
17
17
  check Validate configuration and content
18
18
  config:check Validate site/config.yaml
19
- content:check Validate site/content.md and image references
19
+ content:check Validate page content and managed image references
20
20
  content:sync Move misplaced Norna-managed images and refresh generated images
21
21
  theme:presets List available theme presets and their intended uses
22
22
  theme:export Export a commented theme preset reference
package/docs/README.md CHANGED
@@ -27,9 +27,12 @@ site/
27
27
  |-- config.yaml
28
28
  |-- theme.yaml
29
29
  |-- sitewide-content.yaml
30
- |-- content.md
31
- |-- images/
32
30
  |-- pages/
31
+ | |-- 000-home/
32
+ | | |-- content.md
33
+ | | `-- images/
34
+ | `-- 010-guide/
35
+ | `-- content.md
33
36
  `-- public/
34
37
  ```
35
38
 
@@ -39,12 +42,11 @@ site/
39
42
  overrides.
40
43
  - [`sitewide-content.yaml`](sitewide-content.md): shared logo display settings,
41
44
  banners, and footer.
42
- - [`content.md`](content.md): Markdown page title, optional metadata, sections,
43
- prose, notes, and Norna blocks.
44
- - [`images/`](images-and-metadata.md): managed source formats, variants, sync,
45
- and generated image state.
46
- - [`pages/`](pages.md): additional pages, ordering, URLs, page themes, and
47
- page-local images.
45
+ - [`pages/`](pages.md): Home, top-level areas, nested pages, ordering, and URLs.
46
+ - [`content.md`](content.md): the content file inside every page directory,
47
+ containing its title, optional metadata, sections, prose, notes, and blocks.
48
+ - [`images/`](images-and-metadata.md): managed images kept inside the page that
49
+ references them, plus variants, sync, and generated image state.
48
50
  - [`public/`](public-files.md): navigation logos, favicons, and other static
49
51
  files copied without managed-image processing.
50
52
  - [Generated files](site-files.md#generated-files): `site/.norna/public/`,
@@ -82,7 +84,7 @@ required, optional, convention-discovered, versioned, or generated.
82
84
 
83
85
  - [Choose a complete theme preset](theme.md#theme-presets)
84
86
  - [Inspect and override a preset](theme.md#overrides)
85
- - [Give a page a different theme](theme.md#page-themes)
87
+ - [Adjust limited presentation for a page subtree](theme.md#page-themes)
86
88
  - [Adjust typography](typography.md)
87
89
 
88
90
  ### Check, Build, And Publish
@@ -13,7 +13,7 @@ url: https://example.com/
13
13
  Norna deliberately keeps this file small. Visual choices belong in
14
14
  [`theme.yaml`](theme.md), shared editorial content belongs in
15
15
  [`sitewide-content.yaml`](sitewide-content.md), and page content belongs in
16
- [`content.md`](content.md).
16
+ [`pages/*/content.md`](content.md).
17
17
 
18
18
  ## `url`
19
19
 
@@ -58,6 +58,26 @@ would be misleading.
58
58
  Interface labels are part of the engine and are not configured individually.
59
59
  Editorial text remains in page content and `sitewide-content.yaml`.
60
60
 
61
+ ## `navigation`
62
+
63
+ `navigation.mode` selects the site-wide navigation model:
64
+
65
+ - `automatic`: choose from the discovered page and heading structure. This is
66
+ the default.
67
+ - `sections`: navigate headings on a single page.
68
+ - `top`: use the sticky top navigation for a shallow multi-page site.
69
+ - `tree`: combine global top-level navigation with a local page hierarchy.
70
+
71
+ ```yaml
72
+ url: https://example.com/
73
+ navigation:
74
+ mode: automatic
75
+ ```
76
+
77
+ Navigation behavior is technical and site-wide. It cannot be configured in
78
+ `theme.yaml` or in an individual page. See [Pages](pages.md#navigation) for the
79
+ relationship between Home, top-level pages, child pages, and headings.
80
+
61
81
  ## `scrollBehavior`
62
82
 
63
83
  - Purpose: select native same-page anchor movement.
@@ -80,6 +100,8 @@ requests reduced motion always get immediate anchor movement.
80
100
  ```yaml
81
101
  url: https://example.com/
82
102
  language: en-GB
103
+ navigation:
104
+ mode: automatic
83
105
  scrollBehavior: instant
84
106
  ```
85
107
 
@@ -110,7 +132,8 @@ norna --site-dir presentation build
110
132
 
111
133
  If `NORNA_SITE_DIR` is set to an empty value, commands fail. Relative site
112
134
  directories are resolved by walking upward from the invocation directory until
113
- the selected directory contains `config.yaml` and `content.md`.
135
+ the selected directory contains `config.yaml` and
136
+ `pages/000-home/content.md`.
114
137
 
115
138
  Without an explicit selection, the current directory itself can be the site
116
139
  directory when it contains those two files. Otherwise Norna walks upward for a
package/docs/content.md CHANGED
@@ -1,11 +1,10 @@
1
1
  # Content
2
2
 
3
- `site/content.md` is the homepage file for a Norna site. Its Markdown H1 is
3
+ `site/pages/000-home/content.md` is the homepage file for a Norna site. Its Markdown H1 is
4
4
  the page title. Optional page metadata can be added in YAML frontmatter.
5
5
 
6
- Additional pages use the same page model in
7
- `site/pages/<NNN-page-id>/content.md`. See [Pages](pages.md) for the
8
- page-specific rules.
6
+ Additional and nested pages use the same page model in a page directory under
7
+ `site/pages/`. See [Pages](pages.md) for the directory and nesting rules.
9
8
 
10
9
  Site-wide visual defaults belong in [Theme](theme.md). Typography profiles and
11
10
  overrides are described in [Typography](typography.md). Technical site settings
@@ -79,15 +78,25 @@ Markdown level 2 headings define the page sections and their order:
79
78
  ...
80
79
  ```
81
80
 
82
- Every section heading must have an explicit id:
81
+ Norna derives a stable lowercase id from the heading text when no explicit id
82
+ is present:
83
+
84
+ ```md
85
+ ## Work
86
+ ```
87
+
88
+ Add an explicit id when a public anchor must remain stable even if the heading
89
+ text changes:
83
90
 
84
91
  ```md
85
92
  ## Work {#work}
86
93
  ```
87
94
 
88
- The id must match `^[a-z0-9-]+$`. It is used for anchors and section
89
- navigation. The visible section navigation label comes from the Markdown
90
- heading text.
95
+ Explicit ids must match `^[a-z0-9-]+$`. Derived and explicit ids are used for
96
+ anchors and section navigation; the visible label still comes from the heading
97
+ text. H3 headings use the same derivation for deeper local navigation. If two
98
+ headings on one page resolve to the same id, `content:check` reports the page
99
+ and both headings instead of guessing.
91
100
 
92
101
  Markdown section content starts at the level 2 heading and continues until the
93
102
  next level 2 heading. `###` and `####` headings are body subheadings within the
@@ -207,13 +216,13 @@ sizing is less predictable.
207
216
  Homepage images live under:
208
217
 
209
218
  ```text
210
- site/images/
219
+ site/pages/000-home/images/
211
220
  ```
212
221
 
213
- Page images live under:
222
+ Images for any page live directly under that page directory. For example:
214
223
 
215
224
  ```text
216
- site/pages/<NNN-page-id>/images/
225
+ site/pages/010-guide/pages/020-installation/images/
217
226
  ```
218
227
 
219
228
  Image references in Norna managed image blocks use only the filename:
@@ -225,7 +234,7 @@ Image references in Norna managed image blocks use only the filename:
225
234
  ````
226
235
 
227
236
  If `portrait.jpg` is referenced anywhere on the homepage, its expected
228
- location is `site/images/portrait.jpg`. The same file may be referenced from
237
+ location is `site/pages/000-home/images/portrait.jpg`. The same file may be referenced from
229
238
  more than one section on that page.
230
239
 
231
240
  Filenames must be unique within one page's image directory, but do not have to
@@ -26,7 +26,7 @@ information architecture.
26
26
 
27
27
  ## Order Of Work
28
28
 
29
- ### 1. Stabilize The Page Tree
29
+ ### 1. Stabilize The Page Tree - Complete
30
30
 
31
31
  Finish and test nested page discovery independently of final navigation
32
32
  presentation. Establish deterministic rules for:
@@ -39,30 +39,79 @@ presentation. Establish deterministic rules for:
39
39
 
40
40
  Commit this foundation separately before broad theme or preset changes.
41
41
 
42
- ### 2. Define The Navigation Contract
42
+ The page tree now supports nested pages with deterministic directory parsing,
43
+ URLs, ordering, ancestry, breadcrumbs, inherited page resources, and collision
44
+ diagnostics.
43
45
 
44
- The intended information architecture is:
46
+ The current breaking page-container proof of concept removes the special root
47
+ page. Every page now uses the same physical model:
48
+
49
+ ```text
50
+ site/pages/NNN-page-id/
51
+ content.md
52
+ theme.yaml # optional page-local presentation
53
+ images/ # optional managed page images
54
+ pages/ # optional child pages
55
+ ```
56
+
57
+ `site/pages/000-home/content.md` is required and maps to `/`. The `000` prefix
58
+ is reserved for this page. Other top-level page directories are its siblings,
59
+ not its children. The homepage cannot contain a `pages/` hierarchy; place each
60
+ top-level area beside `000-home` and nest further pages below that area.
61
+
62
+ The root `site/` directory now contains only site-wide files and the page
63
+ container. Removed root-level page and image locations produce a migration
64
+ error instead of being interpreted as a second page model.
65
+
66
+ ### 2. Define The Navigation Contract - Complete
67
+
68
+ The accepted information architecture is:
45
69
 
46
70
  - a small global navigation for the site's top-level areas;
47
71
  - a larger local page tree for the selected area;
48
- - a separate `On this page` list for headings on the current page;
49
72
  - breadcrumbs for location and ancestry;
50
- - one unified mobile navigation containing the whole page hierarchy, with the
51
- current branch expanded and current page marked.
52
-
53
- The exact contract is potentially difficult to evaluate at an abstract level.
54
- The maintainer therefore expects this phase to use executable test sites,
55
- focused automated tests, or clear illustrative examples. These artifacts
56
- should demonstrate short single-page sites, ordinary two-level sites, and
57
- deeper documentation-style hierarchies on both desktop and mobile before the
58
- contract is considered stable.
73
+ - headings for the current page integrated below that page in the local tree;
74
+ - one unified mobile navigation containing the whole page hierarchy and the
75
+ current page headings.
76
+
77
+ Navigation modes follow the site structure:
78
+
79
+ - a single-page site uses section navigation;
80
+ - an ordinary shallow multi-page site uses top navigation;
81
+ - a deeper documentation-style hierarchy uses tree navigation.
82
+
83
+ The tree contract is:
84
+
85
+ - top-level areas remain available in the sticky global navigation;
86
+ - the selected top-level area supplies the desktop local tree;
87
+ - breadcrumbs show page ancestry without changing the vertical position of
88
+ the page heading;
89
+ - a closed expandable page title expands the node without navigating;
90
+ - an open expandable page title links to that page, while its chevron can
91
+ collapse the node;
92
+ - a page without headings or child pages is always a direct link;
93
+ - headings on the current page appear under its page node rather than in a
94
+ separate `On this page` region;
95
+ - opening one branch does not implicitly close another branch;
96
+ - long desktop trees scroll independently of short page content;
97
+ - mobile uses one drawer for the complete hierarchy instead of requiring a
98
+ separate page-selection and section-selection sequence.
99
+
100
+ Real links and native disclosure elements provide the fallback. JavaScript
101
+ preserves explicitly opened branches, restores navigation scroll position,
102
+ enhances focus handling, and keeps measured sticky offsets stable. Without
103
+ JavaScript, navigation remains usable but manually opened branches are not
104
+ preserved across page loads.
59
105
 
60
106
  The contract should also define the fallback and override behavior for the
61
107
  supported navigation modes. Structural behavior belongs to site-level engine
62
108
  configuration or deterministic automatic selection, not to presentation
63
109
  presets.
64
110
 
65
- ### 3. Implement Navigation In Layers
111
+ The contract was evaluated with the nested-pages fixture and focused desktop,
112
+ mobile, no-JavaScript, spatial-stability, and long-navigation tests.
113
+
114
+ ### 3. Implement Navigation In Layers - Complete
66
115
 
67
116
  Implement and verify the navigation model in this order:
68
117
 
@@ -72,10 +121,10 @@ Implement and verify the navigation model in this order:
72
121
  4. keyboard, focus, current-page, and progressive-enhancement behavior;
73
122
  5. visual evaluation at representative viewport sizes.
74
123
 
75
- Keep real links as the foundation. Client-side JavaScript should only enhance
76
- interaction that cannot be expressed adequately with HTML and CSS.
124
+ Real links remain the foundation. Client-side JavaScript is limited to
125
+ interaction and state that cannot be retained adequately with HTML and CSS.
77
126
 
78
- ### 4. Refine Theme And Preset Responsibilities
127
+ ### 4. Refine Theme And Preset Responsibilities - Proof Of Concept
79
128
 
80
129
  Presets should control visual presentation, including:
81
130
 
@@ -94,6 +143,27 @@ consistent. Page-local theme variation should be limited to properties such as
94
143
  content width, density, and media presentation when variation does not weaken
95
144
  site identity or navigation clarity.
96
145
 
146
+ The proof-of-concept contract is:
147
+
148
+ - `config.yaml` owns the site-wide navigation mode;
149
+ - the root `theme.yaml` owns presets, palette, shape, typography, the page
150
+ frame, global spacing primitives, and default page presentation;
151
+ - a page-local `theme.yaml` may set only `layout.textWidth`,
152
+ `layout.contentSpacing`, managed-image sizing, and
153
+ `sections.backgroundPattern`;
154
+ - page-local values are inherited by descendant pages and merged field by
155
+ field, while global visual identity is never replaced;
156
+ - `layout.contentSpacing` replaces the ambiguous `layout.density` name;
157
+ - `sections.backgroundPattern` replaces the low-level `sectionSurfaces` list
158
+ with `uniform`, `alternating`, and `cycling` choices;
159
+ - custom presets and custom font definitions are deferred until the built-in
160
+ contract has been tested in real sites.
161
+
162
+ The nested-pages fixture is the current proof of concept. The engine-owned
163
+ basic init starter follows the new page contract so newly created sites remain
164
+ valid. Documentation, other starters, and broad examples should be migrated
165
+ only after manual approval.
166
+
97
167
  ### 5. Migrate After Evaluation
98
168
 
99
169
  After the page tree, navigation contract, and preset boundaries have been
@@ -111,5 +181,6 @@ separate commits where practical.
111
181
 
112
182
  ## Immediate Checkpoint
113
183
 
114
- The current nested-page implementation should be reviewed, tested, and secured
115
- before work continues on the final navigation contract or preset model.
184
+ The nested navigation contract has been evaluated and committed. The unified
185
+ page-container and theme-scope proof of concepts are now ready for manual
186
+ evaluation against the nested-pages fixture before broad migration begins.
@@ -65,7 +65,10 @@ examples/
65
65
  dog-shelter-single-page/
66
66
  dog-shelter-multi-page/
67
67
  feature-demos/
68
- theme-presets/
68
+ theme-preset-portfolio/
69
+ theme-preset-documentation/
70
+ theme-preset-project/
71
+ theme-preset-statement/
69
72
  media-and-surfaces/
70
73
  sitewide-content/
71
74
  ```
@@ -79,8 +82,9 @@ together in a realistic project:
79
82
 
80
83
  `feature-demos/` contains focused visual test benches:
81
84
 
82
- - `theme-presets/`: one page per complete built-in theme preset, without
83
- overrides.
85
+ - `theme-preset-*/`: one independent site per complete built-in preset, without
86
+ overrides. Presets are site-wide, so comparing them must not rely on
87
+ page-local preset changes.
84
88
  - `media-and-surfaces/`: image and card blocks, notes, palettes and section
85
89
  surfaces. This is also the broad demo-build and navigation-test target.
86
90
  - `sitewide-content/`: convention-based logo handling, navigation, banner stacks,
@@ -185,28 +185,25 @@ and commit their updated `package-lock.json`.
185
185
 
186
186
  ## Rendering Notes
187
187
 
188
- The renderer builds the homepage at `/` and optional first-level pages from
189
- `site/pages/<NNN-page-id>/content.md`.
190
-
191
- Navigation has two separate levels:
192
-
193
- - Site navigation moves between the homepage and additional pages. It uses
194
- normal page URLs and browser history.
195
- - Section navigation moves between sections on the current page. It uses real
196
- `href="#section-id"` links so anchors work without JavaScript.
197
-
198
- The current navigation model is deliberately scoped to single-page and small
199
- multi-page sites. That scope may change as navigation support matures. For now,
200
- single-page sites should rely on section navigation only; small multi-page sites
201
- may combine site navigation and section navigation; larger information
202
- architectures should not be forced into the sticky-navigation model without a
203
- separate design decision.
204
-
205
- The JavaScript enhancement keeps the URL hash as the source of truth for active
206
- section-navigation state. A section-link click pushes one hash entry into browser
207
- history, back/forward moves between hash entries, and returning to the same page
208
- without a hash restores the first section as active. The enhancement does not
209
- derive active section state from free manual scrolling.
188
+ The renderer discovers a required homepage at
189
+ `site/pages/000-home/content.md`, top-level navigation roots beside Home, and
190
+ nested child pages under each non-home page's `pages/` directory.
191
+
192
+ Navigation has two related levels:
193
+
194
+ - Global navigation moves between Home and top-level page areas.
195
+ - Local navigation follows nested pages and headings within the active area.
196
+ Section links use real `href="#section-id"` anchors so they work without
197
+ JavaScript.
198
+
199
+ Automatic navigation selects section navigation for one-page sites, top
200
+ navigation for shallow page structures, and tree navigation for deeper page or
201
+ heading hierarchies. `config.yaml` may choose a mode explicitly. Home is a
202
+ standalone front door and cannot contain child pages.
203
+
204
+ The optional JavaScript enhancement manages menu interaction and active local
205
+ navigation while retaining normal links and browser history. The rendered page
206
+ tree and anchor navigation remain usable without client-side JavaScript.
210
207
 
211
208
  The sticky navigation updates a root scroll-offset variable so direct hash
212
209
  links and clicked links remain visible below the fixed header. The browser owns
@@ -69,7 +69,7 @@ Leave the development server running while you complete the next steps.
69
69
 
70
70
  ## 2. Replace The Homepage Content
71
71
 
72
- Replace `site/content.md` with:
72
+ Replace `site/pages/000-home/content.md` with:
73
73
 
74
74
  ```md
75
75
  ---
@@ -91,8 +91,8 @@ Edit this file while the development server is running and the browser updates.
91
91
  ```
92
92
 
93
93
  The single `#` heading is the page title. Each `##` heading is a page section.
94
- Its explicit `{#section-id}` gives the section a stable identity and is
95
- required by Norna.
94
+ Norna derives section anchors from heading text. The explicit ids in this
95
+ example keep those public anchors stable if the visible headings are renamed.
96
96
 
97
97
  ### Checkpoint: Content And Navigation Update
98
98
 
@@ -12,15 +12,17 @@ Norna-managed local images are referenced from Markdown with
12
12
  Homepage source images live under:
13
13
 
14
14
  ```text
15
- site/images/
15
+ site/pages/000-home/images/
16
16
  ```
17
17
 
18
- Page source images live under:
18
+ Images for any page, including nested pages, live directly under that page:
19
19
 
20
20
  ```text
21
- site/pages/<NNN-page-id>/images/
21
+ site/pages/<NNN-page-id>/pages/<NNN-page-id>/images/
22
22
  ```
23
23
 
24
+ The number of nested `pages/` segments follows the page hierarchy.
25
+
24
26
  Supported source extensions:
25
27
 
26
28
  - `.jpg`
@@ -140,7 +142,7 @@ copyright metadata.
140
142
  Generated WebP files are created with ImageMagick using `-strip`, so embedded
141
143
  metadata is not a publication mechanism for generated variants. Keep licensing,
142
144
  credits, copyright notices, alt text, and captions in site-owned files such as
143
- `site/content.md`, page content files, `COPYRIGHT.md`, or other site
145
+ `site/pages/000-home/content.md`, page content files, `COPYRIGHT.md`, or other site
144
146
  documentation.
145
147
 
146
148
  If a site wants embedded metadata in original source files, that process is