@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/docs/pages.md CHANGED
@@ -1,32 +1,77 @@
1
1
  # Pages
2
2
 
3
- `site/content.md` is the homepage and builds to `/`. Optional additional pages live
4
- under `site/pages/<NNN-page-id>/content.md` and build to first-level
5
- URLs.
3
+ Every Norna page is a directory under `site/pages/` with its own `content.md`.
4
+ The same model is used for the homepage, top-level areas, and nested pages.
6
5
 
7
- Pages use the same H1 title, optional frontmatter, Norna-managed blocks, and
8
- Markdown section model as the homepage. See [Content](content.md) for the page
9
- and section model.
6
+ ```text
7
+ site/pages/
8
+ |-- 000-home/
9
+ | `-- content.md
10
+ |-- 010-guides/
11
+ | |-- content.md
12
+ | `-- pages/
13
+ | `-- 010-installation/
14
+ | `-- content.md
15
+ `-- 020-reference/
16
+ `-- content.md
17
+ ```
10
18
 
11
- Page directories can contain page content, page-local images, and
12
- an optional page-local `theme.yaml`. The page theme replaces the root visual
13
- theme for that page and can select any complete top-level theme preset. Page
14
- directories cannot contain `config.yaml` or `sitewide-content.yaml`; technical
15
- configuration and shared logo, banner, and footer settings remain at the
16
- selected site's top level.
19
+ Pages use the same Markdown H1, optional metadata, sections, Norna blocks, and
20
+ managed-image model. See [Content](content.md) for what belongs inside
21
+ `content.md`.
17
22
 
18
- ## Page Directory Format
23
+ ## Homepage And Top-Level Pages
19
24
 
20
- Page directories must use:
25
+ The homepage is required at:
21
26
 
22
27
  ```text
23
- NNN-page-id
28
+ site/pages/000-home/content.md
29
+ ```
30
+
31
+ It builds to `/`. The `000` prefix is reserved for `000-home`, and Home cannot
32
+ contain a nested `pages/` directory. Home is the site's front door, not the
33
+ parent of every page.
34
+
35
+ Other directories directly under `site/pages/` are top-level navigation roots.
36
+ For example, `site/pages/010-guides/content.md` builds to `/guides/`. Place
37
+ further pages under the nearest meaningful non-home page.
38
+
39
+ ## Nested Pages
40
+
41
+ A page may contain a `pages/` directory:
42
+
43
+ ```text
44
+ site/pages/010-guides/
45
+ |-- content.md
46
+ `-- pages/
47
+ `-- 020-workflows/
48
+ |-- content.md
49
+ `-- pages/
50
+ `-- 010-local/
51
+ `-- content.md
52
+ ```
53
+
54
+ This produces:
55
+
56
+ ```text
57
+ /guides/
58
+ /guides/workflows/
59
+ /guides/workflows/local/
24
60
  ```
25
61
 
26
- `NNN` is a three-digit presentation order from `001` through `999`.
27
- `page-id` becomes the page id and URL segment.
62
+ Each directory in the chain is a real page and therefore needs its own
63
+ `content.md`. Empty grouping directories are not part of the page model.
28
64
 
29
- Valid examples:
65
+ ## Directory Names, Order, And URLs
66
+
67
+ Page directories use:
68
+
69
+ ```text
70
+ NNN-page-id
71
+ ```
72
+
73
+ `NNN` is a three-digit sibling presentation order. `page-id` becomes that
74
+ page's URL segment. Valid ordinary page names include:
30
75
 
31
76
  ```text
32
77
  010-getting-started
@@ -34,11 +79,11 @@ Valid examples:
34
79
  120-api-reference
35
80
  ```
36
81
 
37
- Invalid examples:
82
+ Invalid names include:
38
83
 
39
84
  ```text
40
85
  10-about
41
- 000-home
86
+ 000-about
42
87
  010_About
43
88
  010-About
44
89
  010-about-
@@ -46,89 +91,100 @@ Invalid examples:
46
91
  ```
47
92
 
48
93
  The page id may contain only lowercase `a-z`, numbers, and single hyphens
49
- between alphanumeric groups. The numeric prefix is not part of the page id or
50
- URL.
94
+ between alphanumeric groups. The numeric prefix is not part of the URL.
95
+ Renaming `030-contact/` to `015-contact/` changes its order among siblings but
96
+ keeps the URL segment `contact`.
51
97
 
52
- Renaming `030-contact/` to `015-contact/` changes navigation order but keeps
53
- the page id `contact` and URL `/contact/`.
98
+ Sibling page ids and numeric orders must be unique. Reusing the same id below a
99
+ different parent is valid because the complete URL remains different.
54
100
 
55
- ## Page File
56
-
57
- Add a first-level page by creating:
58
-
59
- ```text
60
- site/pages/010-about/content.md
61
- ```
101
+ ## Page Content
62
102
 
63
- Minimal additional page:
103
+ A minimal page is ordinary Markdown:
64
104
 
65
105
  ```md
66
106
  ---
67
107
  page:
68
- description: About this site.
108
+ description: Installation instructions.
69
109
  ---
70
110
 
71
- # About
111
+ # Installation
72
112
 
73
113
  Introductory text.
74
114
 
75
- ## Team {#team}
115
+ ## Requirements {#requirements}
76
116
 
77
117
  Text...
78
118
  ```
79
119
 
80
- The example above builds to `/about/`.
120
+ The H1 supplies the visible page title, document title, and navigation label.
121
+ `page.description` is optional metadata and is not rendered. H2 and H3 headings
122
+ provide page-local navigation according to the selected navigation model.
81
123
 
82
124
  ## Navigation
83
125
 
84
- Site navigation uses each page's Markdown H1 as its visible label and the
85
- page-directory prefix as its order. In a multi-page site, the homepage is the
86
- first navigation item and uses its own H1. An optional logo is a separate home
87
- link; it does not replace the homepage item or own a section menu.
126
+ Home and listed top-level pages appear in global navigation. Child pages appear
127
+ in the local hierarchy for their top-level area. Breadcrumbs show actual parent
128
+ pages; Home is not added as an artificial ancestor.
88
129
 
89
- `navigation` has one optional field:
90
-
91
- - `listed`: boolean. Defaults to `true`. Set it to `false` to keep the page
92
- public while excluding it from site navigation.
130
+ The numeric prefix controls order among siblings. Set `navigation.listed` to
131
+ `false` in a non-home page's frontmatter when the page should remain public but
132
+ not appear in generated navigation:
93
133
 
94
134
  ```yaml
95
135
  navigation:
96
136
  listed: false
97
137
  ```
98
138
 
99
- Page order comes from the directory prefix.
100
- The homepage is always listed before additional pages.
139
+ Home is always listed. By default, Norna chooses navigation from the site
140
+ structure:
101
141
 
102
- Current site navigation is intended for small sites. This guidance may change
103
- as navigation support matures, but the present model is:
142
+ - one listed page uses section navigation;
143
+ - a shallow hierarchy uses top navigation;
144
+ - deeper page or heading hierarchies use tree navigation.
104
145
 
105
- - A single-page site should normally use only section navigation.
106
- - A small multi-page site may use site navigation between pages plus section
107
- navigation on the current page.
108
- - If a site needs many pages, deeply nested pages, or several navigation
109
- levels, it has probably outgrown the current sticky-navigation model and may
110
- need a different site structure or navigation system.
146
+ The site-wide `navigation.mode` in `config.yaml` can explicitly select
147
+ `automatic`, `sections`, `top`, or `tree`. See
148
+ [Configuration](configuration.md#navigation).
111
149
 
112
150
  ## Page Images
113
151
 
114
- Page images live under the physical page directory:
152
+ Managed images belong directly to the page that references them:
115
153
 
116
154
  ```text
117
- site/pages/010-about/images/image.jpg
155
+ site/pages/010-guides/pages/020-workflows/images/diagram.svg
118
156
  ```
119
157
 
120
- Image references in page content still use only the filename:
158
+ The Markdown block still uses only the filename:
121
159
 
122
160
  ````md
123
161
  ```norna-image-stack
124
- - image: image.jpg
125
- alt: Intro image.
162
+ - image: diagram.svg
163
+ alt: The local workflow.
126
164
  ```
127
165
  ````
128
166
 
129
- All managed images used by the page share this one `images/` directory. Run
130
- `norna content:check` to find missing or misplaced images and
167
+ Run `norna content:check` to find missing or misplaced images and
131
168
  `norna content:sync` to move unambiguous files into the expected page image
132
- root. `content:sync` can move images between page image roots when the filename
133
- is unambiguous across the site and the move will not break another reference;
134
- these cross-page writes require a clean Git working tree.
169
+ root. Cross-page writes require a clean Git working tree and never guess when a
170
+ filename has multiple possible sources.
171
+
172
+ ## Page Themes
173
+
174
+ The root `site/theme.yaml` owns the site's visual identity: preset, palette,
175
+ shape, typography, page frame, and navigation presentation.
176
+
177
+ An optional page-local `theme.yaml` may adjust only:
178
+
179
+ - `layout.textWidth`
180
+ - `layout.contentSpacing`
181
+ - managed-image sizing under `images`
182
+ - `sections.backgroundPattern`
183
+
184
+ These values are inherited by descendant pages and merged with more local page
185
+ settings. Page themes cannot select presets or change site colors, fonts,
186
+ shape, page width, gutters, or navigation. See [Theme](theme.md#page-themes).
187
+
188
+ Page directories also cannot contain `config.yaml` or
189
+ `sitewide-content.yaml`; technical configuration and shared editorial content
190
+ remain at the selected site's top level.
@@ -24,7 +24,7 @@ enable it separately. Use the exact lowercase filename to keep the site
24
24
  portable between case-sensitive and case-insensitive file systems.
25
25
 
26
26
  The logo links to the homepage. Its alternative text comes from the homepage
27
- Markdown H1 in `site/content.md`; no separate site name or logo alt text is
27
+ Markdown H1 in `site/pages/000-home/content.md`; no separate site name or logo alt text is
28
28
  configured.
29
29
 
30
30
  Configure top-level `logo` in `site/sitewide-content.yaml` only when you need
@@ -11,15 +11,19 @@ site/
11
11
  |-- config.yaml
12
12
  |-- theme.yaml
13
13
  |-- sitewide-content.yaml
14
- |-- content.md
15
- |-- images/
16
- | `-- image.jpg
17
14
  |-- pages/
18
- | `-- <NNN-page-id>/
15
+ | |-- 000-home/
16
+ | | |-- content.md
17
+ | | `-- images/
18
+ | | `-- image.jpg
19
+ | `-- 010-guide/
19
20
  | |-- content.md
20
21
  | |-- theme.yaml
21
- | `-- images/
22
- | `-- image.jpg
22
+ | |-- images/
23
+ | | `-- image.jpg
24
+ | `-- pages/
25
+ | `-- 010-installation/
26
+ | `-- content.md
23
27
  |-- public/
24
28
  `-- .norna/
25
29
  |-- generated-images.json
@@ -37,7 +41,7 @@ case-insensitive file systems.
37
41
  | `config.yaml` | Yes | Public URL, language, and browser scroll behavior. |
38
42
  | `theme.yaml` | Yes | Complete visual preset and optional focused overrides. |
39
43
  | `sitewide-content.yaml` | No | Shared logo display settings, banners, and footer. |
40
- | `content.md` | Yes | Homepage title, optional metadata, sections, prose, and Norna blocks. |
44
+ | `pages/` | Yes | Homepage, top-level pages, and nested page hierarchies. |
41
45
 
42
46
  These responsibilities are deliberately separate:
43
47
 
@@ -47,44 +51,47 @@ These responsibilities are deliberately separate:
47
51
  only a preset selection.
48
52
  - [`sitewide-content.yaml`](sitewide-content.md) contains editorial material
49
53
  shared by every page.
50
- - [`content.md`](content.md) is the homepage file and remains ordinary
51
- Markdown. YAML frontmatter is optional.
54
+ - [`pages/000-home/content.md`](content.md) is the required homepage and remains
55
+ ordinary Markdown. YAML frontmatter is optional.
52
56
 
53
57
  Pages cannot provide `config.yaml` or `sitewide-content.yaml`. Technical
54
58
  configuration and shared logo, banner, and footer settings have one site-wide
55
59
  source.
56
60
 
57
- ## Images
61
+ ## Pages
58
62
 
59
- Managed homepage images belong in:
63
+ Every page is represented by a directory containing `content.md`. The homepage
64
+ is the one reserved page:
60
65
 
61
66
  ```text
62
- site/images/
67
+ site/pages/000-home/content.md
63
68
  ```
64
69
 
65
- All managed images used by the homepage share this directory. Markdown blocks
66
- refer to managed images by filename, not by path. See
67
- [Images and Metadata](images-and-metadata.md) for supported formats, generated
68
- variants, and syncing.
69
-
70
- ## Pages
71
-
72
- Each first-level page is one directory under `pages/`:
70
+ It maps to `/`, cannot contain child pages, and appears first in global
71
+ navigation. Other directories directly under `site/pages/` are top-level page
72
+ roots:
73
73
 
74
74
  ```text
75
75
  site/pages/010-guide/
76
76
  |-- content.md
77
77
  |-- theme.yaml
78
- `-- images/
79
- `-- image.jpg
78
+ |-- images/
79
+ | `-- image.jpg
80
+ `-- pages/
81
+ `-- 010-installation/
82
+ |-- content.md
83
+ `-- images/
84
+ `-- diagram.svg
80
85
  ```
81
86
 
82
- `content.md` is required for a page. The optional page `theme.yaml` replaces
83
- the root visual theme for that page. Page images live directly in that page's
84
- `images/` directory.
87
+ Nested `pages/` directories create child pages and may continue to further
88
+ depths. Each page owns its optional `images/` directory. A page-local
89
+ `theme.yaml` may adjust a limited set of presentation properties and is inherited
90
+ by descendants; site colors, typography, shape, and navigation remain global.
85
91
 
86
- The three-digit page prefix controls navigation order and is not part of the
87
- URL. See [Pages](pages.md) for exact directory-name and page-id rules.
92
+ The three-digit page prefix controls sibling navigation order and is not part
93
+ of the URL. See [Pages](pages.md) for hierarchy, URL, navigation, and page-theme
94
+ rules. See [Images and Metadata](images-and-metadata.md) for managed files.
88
95
 
89
96
  ## Public Files
90
97
 
@@ -102,8 +109,8 @@ Use `NORNA_SITE_DIR` or `norna --site-dir <path>` to select a site directory
102
109
  explicitly.
103
110
 
104
111
  Without an explicit selection, Norna first accepts the current directory when
105
- it contains both `config.yaml` and `content.md`. Otherwise it walks upward until
106
- it finds a default `site/` directory containing those two files.
112
+ it contains `config.yaml` and `pages/000-home/content.md`. Otherwise it walks
113
+ upward until it finds a default `site/` directory containing those markers.
107
114
 
108
115
  ## Versioned Files
109
116
 
@@ -11,7 +11,7 @@ sections do not belong here; they remain in each page's `content.md`.
11
11
 
12
12
  A logo file is discovered from `site/public/`; no path or site name is
13
13
  configured here. The logo links to the homepage, and its alternative text
14
- comes from the homepage Markdown H1 in `site/content.md`.
14
+ comes from the homepage Markdown H1 in `site/pages/000-home/content.md`.
15
15
 
16
16
  Add `logo` only to override the discovered file's displayed height:
17
17