@janga/norna 0.7.16 → 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 (342) hide show
  1. package/README.md +18 -9
  2. package/astro.config.mjs +35 -3
  3. package/bin/norna-cli.mjs +1 -1
  4. package/docs/README.md +16 -14
  5. package/docs/commands.md +2 -2
  6. package/docs/configuration.md +25 -2
  7. package/docs/content.md +92 -103
  8. package/docs/design/navigation-and-theme-plan.md +186 -0
  9. package/docs/design/norna-diagram-design.md +9 -9
  10. package/docs/design/site-examples-structure.md +15 -11
  11. package/docs/engine-development.md +19 -22
  12. package/docs/getting-started.md +21 -16
  13. package/docs/images-and-metadata.md +12 -9
  14. package/docs/pages.md +190 -0
  15. package/docs/public-files.md +49 -36
  16. package/docs/publishing.md +19 -3
  17. package/docs/site-files.md +46 -38
  18. package/docs/sitewide-content.md +20 -36
  19. package/docs/theme.md +109 -143
  20. package/docs/typography.md +19 -31
  21. package/examples/README.md +10 -4
  22. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +17 -41
  23. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +26 -67
  24. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +185 -88
  25. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -1
  26. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev-local.json +4 -4
  27. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +5 -5
  28. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +33 -23
  29. package/examples/complete-sites/dog-shelter-multi-page/README.md +1 -1
  30. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +8 -8
  31. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +20 -20
  32. package/examples/complete-sites/dog-shelter-multi-page/site/{content.md → pages/000-home/content.md} +3 -4
  33. package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/010-dogs/content.md +3 -4
  34. package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/020-adopt/content.md +3 -4
  35. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +2 -4
  36. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +17 -41
  37. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +26 -67
  38. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +185 -88
  39. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +1 -1
  40. package/examples/complete-sites/dog-shelter-single-page/.astro/dev-local.json +8 -0
  41. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +5 -5
  42. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +16 -12
  43. package/examples/complete-sites/dog-shelter-single-page/README.md +1 -1
  44. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +8 -8
  45. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +12 -12
  46. package/examples/complete-sites/dog-shelter-single-page/site/{content.md → pages/000-home/content.md} +5 -2
  47. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +2 -4
  48. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +17 -41
  49. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +26 -67
  50. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +180 -91
  51. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
  52. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +4 -14
  53. package/examples/feature-demos/media-and-surfaces/README.md +2 -2
  54. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +9 -9
  55. package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +16 -16
  56. package/examples/feature-demos/media-and-surfaces/site/{content.md → pages/000-home/content.md} +4 -7
  57. package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/010-media/content.md +6 -5
  58. package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/020-surfaces/content.md +9 -7
  59. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +2 -0
  60. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.yaml +0 -2
  61. package/examples/feature-demos/sitewide-content/README.md +3 -3
  62. package/examples/feature-demos/sitewide-content/site/pages/000-home/content.md +17 -0
  63. package/examples/feature-demos/sitewide-content/site/pages/010-logo-and-navigation/content.md +17 -0
  64. package/examples/feature-demos/sitewide-content/site/{routes → pages}/020-notices/content.md +7 -6
  65. package/examples/feature-demos/sitewide-content/site/{routes → pages}/030-footer/content.md +6 -5
  66. package/examples/feature-demos/sitewide-content/site/sitewide-content.yaml +4 -13
  67. package/examples/feature-demos/theme-preset-documentation/README.md +16 -0
  68. package/examples/feature-demos/theme-preset-documentation/site/.norna/generated-images.json +74 -0
  69. package/examples/feature-demos/{theme-presets/site/routes/020-documentation → theme-preset-documentation/site/pages/000-home}/content.md +4 -7
  70. package/examples/feature-demos/theme-preset-documentation/site/sitewide-content.yaml +3 -0
  71. package/examples/feature-demos/theme-preset-portfolio/README.md +16 -0
  72. package/examples/feature-demos/theme-preset-portfolio/site/.norna/generated-images.json +74 -0
  73. package/examples/feature-demos/theme-preset-portfolio/site/config.yaml +1 -0
  74. package/examples/feature-demos/{theme-presets/site/routes/010-portfolio → theme-preset-portfolio/site/pages/000-home}/content.md +4 -7
  75. package/examples/feature-demos/theme-preset-portfolio/site/public/robots.txt +2 -0
  76. package/examples/feature-demos/theme-preset-portfolio/site/sitewide-content.yaml +3 -0
  77. package/examples/feature-demos/theme-preset-project/README.md +16 -0
  78. package/examples/feature-demos/theme-preset-project/site/.norna/generated-images.json +74 -0
  79. package/examples/feature-demos/theme-preset-project/site/config.yaml +1 -0
  80. package/examples/feature-demos/{theme-presets/site/routes/030-project → theme-preset-project/site/pages/000-home}/content.md +4 -7
  81. package/examples/feature-demos/theme-preset-project/site/public/robots.txt +2 -0
  82. package/examples/feature-demos/theme-preset-project/site/sitewide-content.yaml +3 -0
  83. package/examples/feature-demos/theme-preset-statement/README.md +16 -0
  84. package/examples/feature-demos/theme-preset-statement/site/.norna/generated-images.json +74 -0
  85. package/examples/feature-demos/theme-preset-statement/site/config.yaml +1 -0
  86. package/examples/feature-demos/{theme-presets/site/routes/040-statement → theme-preset-statement/site/pages/000-home}/content.md +4 -7
  87. package/examples/feature-demos/theme-preset-statement/site/public/robots.txt +2 -0
  88. package/examples/feature-demos/theme-preset-statement/site/sitewide-content.yaml +3 -0
  89. package/fixtures/basic/site/{content.md → pages/000-home/content.md} +5 -6
  90. package/fixtures/basic/site/sitewide-content.yaml +1 -8
  91. package/fixtures/basic/site/theme.yaml +1 -8
  92. package/fixtures/content-model-v2/site/{content.md → pages/000-home/content.md} +11 -13
  93. package/fixtures/content-model-v2/site/pages/010-guide/content.md +18 -0
  94. package/fixtures/nested-pages/.astro/collections/site.schema.json +35 -0
  95. package/fixtures/nested-pages/.astro/collections/sitewide.schema.json +97 -0
  96. package/fixtures/nested-pages/.astro/collections/theme.schema.json +844 -0
  97. package/fixtures/nested-pages/.astro/content-assets.mjs +4 -0
  98. package/fixtures/nested-pages/.astro/content-modules.mjs +1 -0
  99. package/fixtures/nested-pages/.astro/content.d.ts +183 -0
  100. package/fixtures/nested-pages/.astro/data-store.json +1 -0
  101. package/fixtures/nested-pages/.astro/dev-local.json +8 -0
  102. package/fixtures/nested-pages/.astro/dev.log +1128 -0
  103. package/fixtures/nested-pages/.astro/settings.json +5 -0
  104. package/fixtures/nested-pages/.astro/types.d.ts +2 -0
  105. package/fixtures/nested-pages/node_modules/.vite/deps/_metadata.json +74 -0
  106. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  107. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  108. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  109. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  110. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  111. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  112. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  113. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  114. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  115. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  116. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  117. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  118. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  119. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  120. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  121. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  122. package/fixtures/nested-pages/node_modules/.vite/deps/package.json +3 -0
  123. package/fixtures/nested-pages/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  124. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  125. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  126. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  127. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  128. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  129. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  130. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  131. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  132. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  133. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  134. package/fixtures/nested-pages/site/.norna/generated-images.json +10 -0
  135. package/fixtures/nested-pages/site/config.yaml +3 -0
  136. package/fixtures/nested-pages/site/pages/000-home/content.md +15 -0
  137. package/fixtures/nested-pages/site/pages/010-guides/content.md +15 -0
  138. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/content.md +21 -0
  139. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/images/diagram.svg +21 -0
  140. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +18 -0
  141. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/theme.yaml +2 -0
  142. package/fixtures/nested-pages/site/pages/010-guides/pages/020-workflows/content.md +11 -0
  143. package/fixtures/nested-pages/site/pages/010-guides/pages/030-release-notes/content.md +9 -0
  144. package/fixtures/nested-pages/site/pages/010-guides/pages/040-configuration/content.md +3 -0
  145. package/fixtures/nested-pages/site/pages/010-guides/pages/050-content/content.md +3 -0
  146. package/fixtures/nested-pages/site/pages/010-guides/pages/060-themes/content.md +3 -0
  147. package/fixtures/nested-pages/site/pages/010-guides/pages/070-images/content.md +3 -0
  148. package/fixtures/nested-pages/site/pages/010-guides/pages/080-cards/content.md +3 -0
  149. package/fixtures/nested-pages/site/pages/010-guides/pages/090-notes/content.md +3 -0
  150. package/fixtures/nested-pages/site/pages/010-guides/pages/100-validation/content.md +3 -0
  151. package/fixtures/nested-pages/site/pages/010-guides/pages/110-synchronization/content.md +3 -0
  152. package/fixtures/nested-pages/site/pages/010-guides/pages/120-building/content.md +3 -0
  153. package/fixtures/nested-pages/site/pages/010-guides/pages/130-publishing/content.md +3 -0
  154. package/fixtures/nested-pages/site/pages/010-guides/pages/140-troubleshooting/content.md +3 -0
  155. package/fixtures/nested-pages/site/pages/010-guides/pages/150-migration/content.md +3 -0
  156. package/fixtures/nested-pages/site/pages/010-guides/pages/160-accessibility/content.md +3 -0
  157. package/fixtures/nested-pages/site/pages/010-guides/pages/170-performance/content.md +3 -0
  158. package/fixtures/nested-pages/site/pages/010-guides/pages/180-security/content.md +3 -0
  159. package/fixtures/nested-pages/site/pages/010-guides/pages/190-localization/content.md +3 -0
  160. package/fixtures/nested-pages/site/pages/010-guides/pages/200-upgrading/content.md +3 -0
  161. package/fixtures/nested-pages/site/pages/010-guides/pages/210-faq/content.md +3 -0
  162. package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +7 -0
  163. package/fixtures/nested-pages/site/pages/020-reference/content.md +10 -0
  164. package/fixtures/nested-pages/site/pages/020-reference/pages/010-installation/content.md +11 -0
  165. package/fixtures/nested-pages/site/theme.yaml +1 -0
  166. package/package.json +8 -4
  167. package/schemas/config.schema.json +46 -5
  168. package/schemas/content-frontmatter.schema.json +28 -63
  169. package/schemas/manifest.json +4 -2
  170. package/schemas/page-theme.schema.json +192 -0
  171. package/schemas/sitewide-content.schema.json +58 -132
  172. package/schemas/theme.schema.json +434 -152
  173. package/scripts/check-config.mjs +8 -6
  174. package/scripts/deploy-site.mjs +6 -8
  175. package/scripts/doctor.mjs +2 -2
  176. package/scripts/generate-images.mjs +15 -29
  177. package/scripts/generate-schemas.mjs +7 -218
  178. package/scripts/lib/base-path-redirect.mjs +9 -0
  179. package/scripts/lib/editor-language-service.mjs +125 -79
  180. package/scripts/lib/example-sites.mjs +15 -3
  181. package/scripts/lib/heading-ids.mjs +161 -0
  182. package/scripts/lib/navigation-model.mjs +51 -0
  183. package/scripts/lib/norna-markdown-blocks.mjs +3 -4
  184. package/scripts/lib/page-model.mjs +102 -0
  185. package/scripts/lib/presentation.mjs +25 -17
  186. package/scripts/lib/project-config.mjs +46 -8
  187. package/scripts/lib/schema-definitions.mjs +78 -55
  188. package/scripts/lib/schema-editor-metadata.mjs +519 -0
  189. package/scripts/lib/schema-value-definitions.mjs +20 -6
  190. package/scripts/lib/site-content.mjs +159 -97
  191. package/scripts/lib/site-conventions.mjs +1 -0
  192. package/scripts/lib/site-paths.mjs +11 -5
  193. package/scripts/lib/theme-config.mjs +12 -18
  194. package/scripts/lib/theme-presets.mjs +55 -14
  195. package/scripts/release.mjs +1 -1
  196. package/scripts/show-typography.mjs +4 -30
  197. package/scripts/sync-content-sections.mjs +107 -68
  198. package/scripts/{test-temporary-visibility.mjs → test-banner-visibility.mjs} +8 -25
  199. package/scripts/test-client-javascript.mjs +50 -46
  200. package/scripts/test-content-check.mjs +153 -69
  201. package/scripts/test-content-model-v2.mjs +566 -285
  202. package/scripts/test-documentation.mjs +10 -3
  203. package/scripts/test-editor-language-service.mjs +172 -25
  204. package/scripts/test-engine-commands.mjs +6 -5
  205. package/scripts/test-examples.mjs +30 -1
  206. package/scripts/test-heading-ids.mjs +68 -0
  207. package/scripts/test-navigation-model.mjs +63 -0
  208. package/scripts/test-navigation.mjs +11 -2
  209. package/scripts/test-nested-pages.mjs +125 -0
  210. package/scripts/test-package-check.mjs +55 -95
  211. package/scripts/test-page-model.mjs +108 -0
  212. package/scripts/test-project-config.mjs +22 -3
  213. package/scripts/test-schemas.mjs +82 -15
  214. package/scripts/test-theme-presets.mjs +57 -42
  215. package/src/components/NavigationPageTree.astro +157 -0
  216. package/src/components/PageContentsLinks.astro +40 -0
  217. package/src/components/SectionNavigationScript.astro +117 -5
  218. package/src/components/SiteBreadcrumbs.astro +32 -0
  219. package/src/components/SiteNavigation.astro +97 -68
  220. package/src/components/SitePage.astro +93 -55
  221. package/src/components/SiteSection.astro +29 -27
  222. package/src/components/SiteTreeNavigation.astro +35 -0
  223. package/src/components/TreeNavigationScript.astro +83 -0
  224. package/src/content.config.ts +8 -10
  225. package/src/layouts/BaseLayout.astro +21 -20
  226. package/src/lib/pageThemes.ts +44 -0
  227. package/src/lib/sectionContent.ts +106 -107
  228. package/src/lib/siteNavigation.ts +49 -0
  229. package/src/lib/sitePages.ts +96 -38
  230. package/src/pages/{[slug].astro → [...slug].astro} +2 -2
  231. package/src/pages/index.astro +2 -1
  232. package/src/styles/global.css +743 -57
  233. package/starters/basic/README.md +9 -11
  234. package/starters/basic/site/{content.md → pages/000-home/content.md} +7 -4
  235. package/starters/basic/site/sitewide-content.yaml +1 -10
  236. package/starters/basic/site/theme.yaml +1 -105
  237. package/starters/project/README.md +14 -14
  238. package/starters/project/site/{content.md → pages/000-home/content.md} +5 -4
  239. package/starters/project/site/{routes → pages}/010-guide/content.md +5 -4
  240. package/starters/project/site/sitewide-content.yaml +1 -10
  241. package/starters/project/site/theme.yaml +1 -31
  242. package/docs/routes.md +0 -121
  243. package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/theme.yaml +0 -3
  244. package/examples/feature-demos/sitewide-content/site/content.md +0 -16
  245. package/examples/feature-demos/sitewide-content/site/routes/010-identity/content.md +0 -20
  246. package/examples/feature-demos/theme-presets/README.md +0 -18
  247. package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +0 -290
  248. package/examples/feature-demos/theme-presets/site/content.md +0 -17
  249. package/examples/feature-demos/theme-presets/site/sitewide-content.yaml +0 -12
  250. package/examples/feature-demos/theme-presets/site/theme.yaml +0 -1
  251. package/fixtures/content-model-v2/site/routes/010-guide/content.md +0 -17
  252. package/scripts/lib/route-model.mjs +0 -17
  253. package/scripts/test-route-model.mjs +0 -32
  254. package/src/lib/routeThemes.ts +0 -41
  255. /package/examples/complete-sites/dog-shelter-multi-page/site/{images/intro → pages/000-home/images}/shelter-dog.jpg +0 -0
  256. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rex.jpg +0 -0
  257. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rover.jpg +0 -0
  258. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/020-adopt/images/adopt → pages/020-adopt/images}/adoption-dog.jpg +0 -0
  259. /package/examples/complete-sites/dog-shelter-single-page/site/{images/you-can-help → pages/000-home/images}/foster-dog.jpg +0 -0
  260. /package/examples/complete-sites/dog-shelter-single-page/site/{images/what-we-do → pages/000-home/images}/rescue-dog.jpg +0 -0
  261. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-carousel.svg +0 -0
  262. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-stack.svg +0 -0
  263. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-surfaces.svg +0 -0
  264. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-one.svg +0 -0
  265. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-three.svg +0 -0
  266. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-two.svg +0 -0
  267. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-one.svg +0 -0
  268. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-two.svg +0 -0
  269. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/config.yaml +0 -0
  270. /package/examples/feature-demos/{theme-presets/site/routes/020-documentation/images/documentation → theme-preset-documentation/site/pages/000-home/images}/black-schnauzer.jpg +0 -0
  271. /package/examples/feature-demos/{theme-presets/site/routes/020-documentation/images/documentation → theme-preset-documentation/site/pages/000-home/images}/retriever-portrait.jpg +0 -0
  272. /package/examples/feature-demos/{theme-presets/site/routes/020-documentation/images/documentation → theme-preset-documentation/site/pages/000-home/images}/schnauzer-portrait.jpg +0 -0
  273. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/public/robots.txt +0 -0
  274. /package/examples/feature-demos/{theme-presets/site/routes/020-documentation → theme-preset-documentation/site}/theme.yaml +0 -0
  275. /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio/images/portfolio → theme-preset-portfolio/site/pages/000-home/images}/puppy-portrait.jpg +0 -0
  276. /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio/images/portfolio → theme-preset-portfolio/site/pages/000-home/images}/shepherd-portrait.jpg +0 -0
  277. /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio/images/portfolio → theme-preset-portfolio/site/pages/000-home/images}/white-puppy.jpg +0 -0
  278. /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio → theme-preset-portfolio/site}/theme.yaml +0 -0
  279. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/routeTheme.schema.json +0 -0
  280. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/site.schema.json +0 -0
  281. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/sitewide.schema.json +0 -0
  282. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/theme.schema.json +0 -0
  283. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-assets.mjs +0 -0
  284. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-modules.mjs +0 -0
  285. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content.d.ts +0 -0
  286. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/data-store.json +0 -0
  287. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev-local.json +0 -0
  288. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.json +0 -0
  289. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.log +0 -0
  290. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/settings.json +0 -0
  291. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/types.d.ts +0 -0
  292. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/_metadata.json +0 -0
  293. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  294. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  295. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  296. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  297. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  298. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  299. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  300. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  301. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  302. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  303. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  304. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  305. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js +0 -0
  306. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
  307. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  308. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  309. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  310. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  311. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/package.json +0 -0
  312. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  313. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  314. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  315. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  316. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  317. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  318. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  319. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  320. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  321. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  322. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  323. /package/examples/feature-demos/{theme-presets/site/routes/030-project/images/project → theme-preset-project/site/pages/000-home/images}/boxer-portrait.jpg +0 -0
  324. /package/examples/feature-demos/{theme-presets/site/routes/030-project/images/project → theme-preset-project/site/pages/000-home/images}/grass-puppy.jpg +0 -0
  325. /package/examples/feature-demos/{theme-presets/site/routes/030-project/images/project → theme-preset-project/site/pages/000-home/images}/grey-street-dog.jpg +0 -0
  326. /package/examples/feature-demos/{theme-presets/site/routes/030-project → theme-preset-project/site}/theme.yaml +0 -0
  327. /package/examples/feature-demos/{theme-presets/site/routes/040-statement/images/statement → theme-preset-statement/site/pages/000-home/images}/black-pedigree.jpg +0 -0
  328. /package/examples/feature-demos/{theme-presets/site/routes/040-statement/images/statement → theme-preset-statement/site/pages/000-home/images}/sheepdog-grass.jpg +0 -0
  329. /package/examples/feature-demos/{theme-presets/site/routes/040-statement/images/statement → theme-preset-statement/site/pages/000-home/images}/sheepdog-wide.jpg +0 -0
  330. /package/examples/feature-demos/{theme-presets/site/routes/040-statement → theme-preset-statement/site}/theme.yaml +0 -0
  331. /package/fixtures/basic/site/{images/work → pages/000-home/images}/.gitkeep +0 -0
  332. /package/fixtures/content-model-v2/site/{images/card-section → pages/000-home/images}/adopt.svg +0 -0
  333. /package/fixtures/content-model-v2/site/{images/intro → pages/000-home/images}/detail.jpg +0 -0
  334. /package/fixtures/content-model-v2/site/{images/intro → pages/000-home/images}/duplicate.jpg +0 -0
  335. /package/fixtures/content-model-v2/site/{images/card-section → pages/000-home/images}/foster.svg +0 -0
  336. /package/fixtures/content-model-v2/site/{images/intro → pages/000-home/images}/hero.jpg +0 -0
  337. /package/fixtures/content-model-v2/site/{images/plain → pages/000-home/images}/image.jpg +0 -0
  338. /package/fixtures/content-model-v2/site/{images/timed → pages/000-home/images}/slide-one.jpg +0 -0
  339. /package/fixtures/content-model-v2/site/{images/timed → pages/000-home/images}/slide-three.jpg +0 -0
  340. /package/fixtures/content-model-v2/site/{images/timed → pages/000-home/images}/slide-two.jpg +0 -0
  341. /package/fixtures/content-model-v2/site/{routes/010-guide/images/intro → pages/010-guide/images}/duplicate.jpg +0 -0
  342. /package/starters/basic/site/{images/work → pages/000-home/images}/.gitkeep +0 -0
@@ -0,0 +1,186 @@
1
+ # Navigation And Theme Plan
2
+
3
+ This document records the intended order of work for page hierarchy,
4
+ navigation, and theme presets. It is an implementation plan, not a description
5
+ of released behavior.
6
+
7
+ ## Goal
8
+
9
+ Norna should support sites with limited global navigation and a larger local
10
+ page hierarchy without making mobile navigation harder to understand. Theme
11
+ presets should provide a coherent visual system without changing the site's
12
+ information architecture.
13
+
14
+ ## Working Principles
15
+
16
+ - The file structure defines the page hierarchy and presentation order.
17
+ - Navigation behavior and navigation styling are separate concerns.
18
+ - Global site navigation, local page navigation, and headings on the current
19
+ page have distinct roles.
20
+ - Changing a theme preset must not change which pages are available or how the
21
+ page hierarchy is interpreted.
22
+ - Site-wide visual identity should remain coherent while individual pages may
23
+ vary where that does not disrupt navigation or orientation.
24
+ - Documentation and broad example migration should follow implementation and
25
+ manual evaluation, not precede them.
26
+
27
+ ## Order Of Work
28
+
29
+ ### 1. Stabilize The Page Tree - Complete
30
+
31
+ Finish and test nested page discovery independently of final navigation
32
+ presentation. Establish deterministic rules for:
33
+
34
+ - directory parsing, page ids, URL paths, and presentation order;
35
+ - parent and ancestor relationships;
36
+ - collisions and invalid nesting;
37
+ - page-local content, images, and themes;
38
+ - breadcrumbs and current-branch discovery.
39
+
40
+ Commit this foundation separately before broad theme or preset changes.
41
+
42
+ The page tree now supports nested pages with deterministic directory parsing,
43
+ URLs, ordering, ancestry, breadcrumbs, inherited page resources, and collision
44
+ diagnostics.
45
+
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:
69
+
70
+ - a small global navigation for the site's top-level areas;
71
+ - a larger local page tree for the selected area;
72
+ - breadcrumbs for location and ancestry;
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.
105
+
106
+ The contract should also define the fallback and override behavior for the
107
+ supported navigation modes. Structural behavior belongs to site-level engine
108
+ configuration or deterministic automatic selection, not to presentation
109
+ presets.
110
+
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
115
+
116
+ Implement and verify the navigation model in this order:
117
+
118
+ 1. page-tree data and validation;
119
+ 2. desktop global navigation, local tree, breadcrumbs, and `On this page`;
120
+ 3. unified mobile navigation;
121
+ 4. keyboard, focus, current-page, and progressive-enhancement behavior;
122
+ 5. visual evaluation at representative viewport sizes.
123
+
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.
126
+
127
+ ### 4. Refine Theme And Preset Responsibilities - Proof Of Concept
128
+
129
+ Presets should control visual presentation, including:
130
+
131
+ - color system;
132
+ - typography;
133
+ - spacing and density;
134
+ - page and content widths;
135
+ - the visual treatment of global navigation, local navigation, breadcrumbs,
136
+ and `On this page`.
137
+
138
+ Presets must not determine page hierarchy, link membership, or semantic
139
+ navigation structure. Those must remain stable when a preset changes.
140
+
141
+ Site-wide color, typography, and navigation treatment should normally remain
142
+ consistent. Page-local theme variation should be limited to properties such as
143
+ content width, density, and media presentation when variation does not weaken
144
+ site identity or navigation clarity.
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
+
167
+ ### 5. Migrate After Evaluation
168
+
169
+ After the page tree, navigation contract, and preset boundaries have been
170
+ manually evaluated:
171
+
172
+ - migrate fixtures and examples;
173
+ - update schemas and editor assistance;
174
+ - update Markdown reference documentation;
175
+ - update the rendered documentation site;
176
+ - remove obsolete navigation and preset behavior rather than retaining
177
+ compatibility layers.
178
+
179
+ Keep foundation, navigation, preset, migration, and documentation changes in
180
+ separate commits where practical.
181
+
182
+ ## Immediate Checkpoint
183
+
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.
@@ -54,9 +54,9 @@ the image, or in `docs/design/` when it is useful for future maintenance.
54
54
  - Keep arrows few and directional.
55
55
  - Avoid diagrams where every object connects to every other object.
56
56
  - Prefer multiple simple diagrams over one dense diagram.
57
- - Make route order, URL slugs, section ids, image folders, source files, and
57
+ - Make page order, URL slugs, section ids, image folders, source files, and
58
58
  generated output visually distinct when those ideas matter.
59
- - Do not show templates, components, custom rendering logic, route-level
59
+ - Do not show templates, components, custom rendering logic, page-level
60
60
  technical configuration, or hosting integrations that Norna does not support.
61
61
  - Do not show page layouts that Norna cannot actually render unless the diagram
62
62
  is clearly abstract and not a product capability example.
@@ -67,12 +67,12 @@ Diagrams must match the current Norna model:
67
67
 
68
68
  - A Norna site is described with site files, not arbitrary project structure.
69
69
  - `content.md` is the homepage content file.
70
- - `sitewide-content.yaml` contains shared site identity, banners, and footer
70
+ - `sitewide-content.yaml` contains shared logo settings, banners, and footer
71
71
  content.
72
- - Additional pages are route directories with `content.md`.
73
- - Route folder prefixes control route presentation order.
74
- - Route ids become default URL slugs.
75
- - Images belong under the image root for the page or route, usually grouped by
72
+ - Additional pages are page directories with `content.md`.
73
+ - Page folder prefixes control navigation order.
74
+ - Page ids become URL segments.
75
+ - Images belong under the image root for their page, usually grouped by
76
76
  section id.
77
77
  - Markdown remains the primary writing format.
78
78
  - Norna blocks cover fixed site patterns such as image stacks,
@@ -108,7 +108,7 @@ over relying on horizontal scrolling.
108
108
  Store diagram SVG files as normal Norna managed image assets:
109
109
 
110
110
  ```text
111
- site/routes/<NNN-route-id>/images/<section-id>/<diagram-name>.svg
111
+ site/pages/<NNN-page-id>/images/<diagram-name>.svg
112
112
  ```
113
113
 
114
114
  Reference them with a Norna image block:
@@ -132,7 +132,7 @@ Before accepting a diagram:
132
132
 
133
133
  - The main message is obvious without reading the surrounding section.
134
134
  - The diagram does not imply unsupported Norna functionality.
135
- - URL, route, section, image, theme, config, and output terminology is
135
+ - URL, page, section, image, theme, config, and output terminology is
136
136
  consistent with documentation.
137
137
  - Text fits inside boxes at desktop and mobile widths.
138
138
  - Arrows clarify the relationship instead of adding noise.
@@ -26,7 +26,7 @@ site repository. It should not be a showcase for every feature.
26
26
 
27
27
  An example site is a runnable site that demonstrates one or more features.
28
28
 
29
- Examples can be richer than the starter. They may show routes, navigation,
29
+ Examples can be richer than the starter. They may show pages, navigation,
30
30
  complete theme presets, image stacks, image carousels, cards, notes, surfaces,
31
31
  and site-specific configuration choices.
32
32
 
@@ -35,8 +35,8 @@ and site-specific configuration choices.
35
35
  A documentation site is a runnable `norna` site that explains the product
36
36
  visually.
37
37
 
38
- It can use images, diagrams, screenshots, and route pages to explain concepts
39
- such as file structure, presentation inheritance, route navigation, and image
38
+ It can use images, diagrams, screenshots, and additional pages to explain concepts
39
+ such as file structure, presentation inheritance, site navigation, and image
40
40
  handling.
41
41
 
42
42
  ### Reference Documentation
@@ -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
  ```
@@ -73,22 +76,23 @@ examples/
73
76
  `complete-sites/` contains coherent sites that show how Norna files work
74
77
  together in a realistic project:
75
78
 
76
- - `dog-shelter-single-page/`: sections and managed images without routes.
77
- - `dog-shelter-multi-page/`: ordered routes with route-local content and
79
+ - `dog-shelter-single-page/`: sections and managed images without additional pages.
80
+ - `dog-shelter-multi-page/`: ordered pages with page-local content and
78
81
  images.
79
82
 
80
83
  `feature-demos/` contains focused visual test benches:
81
84
 
82
- - `theme-presets/`: one route 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
- - `sitewide-content/`: convention-based identity, navigation, banner stacks,
87
- dismissal and footer content shared across routes.
90
+ - `sitewide-content/`: convention-based logo handling, navigation, banner stacks,
91
+ dismissal and footer content shared across pages.
88
92
 
89
93
  The repository Pages workflow builds all examples and publishes them
90
94
  under `/norna/examples/`. The HTML documentation links to those rendered sites
91
- from its Examples route.
95
+ from its Examples page.
92
96
 
93
97
  The repository-local `site/` directory is reserved for the documentation site.
94
98
  `docs/` should remain for reference documentation. It should link to the
@@ -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 routes from
189
- `site/routes/<NNN-route-id>/content.md`.
190
-
191
- Navigation has two separate levels:
192
-
193
- - Site navigation moves between pages and routes. It uses normal page URLs and
194
- browser history.
195
- - Page 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 route support matures. For now,
200
- single-page sites should rely on page navigation only; small route-based sites
201
- may combine site navigation and page 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
- page-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,50 +69,55 @@ 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
  ---
76
- title: My first Norna site
77
- description: A website built from plain files.
76
+ page:
77
+ description: A website built from plain files.
78
78
  ---
79
79
 
80
- ## Welcome {#welcome}
80
+ # My first Norna site
81
81
 
82
82
  This page is written in Markdown. Norna provides its layout and navigation.
83
83
 
84
+ ## Welcome {#welcome}
85
+
86
+ This is the first section.
87
+
84
88
  ## Next {#next}
85
89
 
86
90
  Edit this file while the development server is running and the browser updates.
87
91
  ```
88
92
 
89
- Each `##` heading is a page section. Its explicit `{#section-id}` gives the
90
- section a stable identity and is required by Norna.
93
+ The single `#` heading is the page title. Each `##` heading is a page section.
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.
91
96
 
92
97
  ### Checkpoint: Content And Navigation Update
93
98
 
94
99
  Return to the browser. The page should now contain `Welcome` and `Next`, and
95
- the single-page navigation should link to those two sections. You should not
100
+ the section navigation should link to those two sections. You should not
96
101
  need to restart the server.
97
102
 
98
- ## 3. Set The Shared Identity
103
+ ## 3. Set Shared Content
99
104
 
100
105
  Replace `site/sitewide-content.yaml` with:
101
106
 
102
107
  ```yaml
103
- navigation:
104
- label: My first Norna site
105
108
  footer:
106
109
  copyrightMessage: My first Norna site.
107
110
  ```
108
111
 
109
- The navigation label and footer are site-wide content rather than page
110
- sections. If you add routes later, they inherit these values.
112
+ The footer is site-wide content rather than a page section. If you add pages
113
+ later, they share it. The homepage H1 you set in the previous step already
114
+ names the homepage in navigation and becomes the alternative text if you add a
115
+ conventional navigation logo.
111
116
 
112
- ### Checkpoint: The Identity Is Shared
117
+ ### Checkpoint: The Footer Is Shared
113
118
 
114
- The navigation should now display `My first Norna site`. The footer should show
115
- the new message.
119
+ The navigation should use `My first Norna site` from `content.md`. The footer
120
+ should show the new message.
116
121
 
117
122
  ## 4. Choose A Complete Theme
118
123
 
@@ -158,7 +163,7 @@ build.
158
163
  ## What To Do Next
159
164
 
160
165
  - [Add and manage images](content.md#norna-blocks)
161
- - [Add another page](routes.md)
166
+ - [Add another page](pages.md)
162
167
  - [Inspect and adjust the theme](theme.md)
163
168
  - [Configure the public URL](configuration.md)
164
169
  - [Publish with GitHub Pages](publishing.md)
@@ -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/<section-id>/
15
+ site/pages/000-home/images/
16
16
  ```
17
17
 
18
- Route source images live under:
18
+ Images for any page, including nested pages, live directly under that page:
19
19
 
20
20
  ```text
21
- site/routes/<NNN-route-id>/images/<section-id>/
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`
@@ -52,11 +54,12 @@ prompt: Short prompt or editing note.
52
54
  -->
53
55
  ```
54
56
 
55
- Filenames do not have to be globally unique for the site to be valid.
56
- Automatic sync only moves misplaced files when the filename identifies exactly
57
- one source candidate across the site's page and route image roots, and when the
58
- move will not break another reference. If the move crosses page or route image
59
- roots, `content:sync` requires a clean Git working tree before writing.
57
+ Each filename identifies one managed source image within its page. The same
58
+ filename may be used by another page. Automatic sync only moves misplaced
59
+ files when the filename identifies exactly one source candidate across all
60
+ page image roots, and when the move will not break another reference. If the
61
+ move crosses page image roots, `content:sync` requires a clean Git working tree
62
+ before writing.
60
63
 
61
64
  ## Markdown Images
62
65
 
@@ -139,7 +142,7 @@ copyright metadata.
139
142
  Generated WebP files are created with ImageMagick using `-strip`, so embedded
140
143
  metadata is not a publication mechanism for generated variants. Keep licensing,
141
144
  credits, copyright notices, alt text, and captions in site-owned files such as
142
- `site/content.md`, route content files, `COPYRIGHT.md`, or other site
145
+ `site/pages/000-home/content.md`, page content files, `COPYRIGHT.md`, or other site
143
146
  documentation.
144
147
 
145
148
  If a site wants embedded metadata in original source files, that process is
package/docs/pages.md ADDED
@@ -0,0 +1,190 @@
1
+ # Pages
2
+
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.
5
+
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
+ ```
18
+
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`.
22
+
23
+ ## Homepage And Top-Level Pages
24
+
25
+ The homepage is required at:
26
+
27
+ ```text
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/
60
+ ```
61
+
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.
64
+
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:
75
+
76
+ ```text
77
+ 010-getting-started
78
+ 020-concepts
79
+ 120-api-reference
80
+ ```
81
+
82
+ Invalid names include:
83
+
84
+ ```text
85
+ 10-about
86
+ 000-about
87
+ 010_About
88
+ 010-About
89
+ 010-about-
90
+ 010-about--team
91
+ ```
92
+
93
+ The page id may contain only lowercase `a-z`, numbers, and single hyphens
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`.
97
+
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.
100
+
101
+ ## Page Content
102
+
103
+ A minimal page is ordinary Markdown:
104
+
105
+ ```md
106
+ ---
107
+ page:
108
+ description: Installation instructions.
109
+ ---
110
+
111
+ # Installation
112
+
113
+ Introductory text.
114
+
115
+ ## Requirements {#requirements}
116
+
117
+ Text...
118
+ ```
119
+
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.
123
+
124
+ ## Navigation
125
+
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.
129
+
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:
133
+
134
+ ```yaml
135
+ navigation:
136
+ listed: false
137
+ ```
138
+
139
+ Home is always listed. By default, Norna chooses navigation from the site
140
+ structure:
141
+
142
+ - one listed page uses section navigation;
143
+ - a shallow hierarchy uses top navigation;
144
+ - deeper page or heading hierarchies use tree navigation.
145
+
146
+ The site-wide `navigation.mode` in `config.yaml` can explicitly select
147
+ `automatic`, `sections`, `top`, or `tree`. See
148
+ [Configuration](configuration.md#navigation).
149
+
150
+ ## Page Images
151
+
152
+ Managed images belong directly to the page that references them:
153
+
154
+ ```text
155
+ site/pages/010-guides/pages/020-workflows/images/diagram.svg
156
+ ```
157
+
158
+ The Markdown block still uses only the filename:
159
+
160
+ ````md
161
+ ```norna-image-stack
162
+ - image: diagram.svg
163
+ alt: The local workflow.
164
+ ```
165
+ ````
166
+
167
+ Run `norna content:check` to find missing or misplaced images and
168
+ `norna content:sync` to move unambiguous files into the expected page image
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.