@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
@@ -11,62 +11,72 @@ convention.
11
11
 
12
12
  ## Navigation Logo
13
13
 
14
- Put exactly one navigation logo directly in `site/public/`. Its filename must
15
- be exactly one of:
14
+ To add a navigation logo, place exactly one supported logo file directly in
15
+ `site/public/`:
16
16
 
17
17
  - `logo.svg`
18
18
  - `logo.png`
19
19
  - `logo.jpg`
20
20
  - `logo.jpeg`
21
21
 
22
- Use lowercase letters and match the complete filename exactly. This is required
23
- for portability between case-sensitive and case-insensitive file systems.
22
+ Norna discovers the logo from its filename, so you do not configure a path or
23
+ enable it separately. Use the exact lowercase filename to keep the site
24
+ portable between case-sensitive and case-insensitive file systems.
24
25
 
25
- Norna discovers and displays the file automatically. No configuration path or
26
- enable switch is needed. Only one supported logo file may exist.
26
+ The logo links to the homepage. Its alternative text comes from the homepage
27
+ Markdown H1 in `site/pages/000-home/content.md`; no separate site name or logo alt text is
28
+ configured.
27
29
 
28
- The shared navigation label is configured separately:
30
+ Configure top-level `logo` in `site/sitewide-content.yaml` only when you need
31
+ to override the displayed height:
29
32
 
30
33
  ```yaml
31
- navigation:
32
- label: Example Site
34
+ logo:
35
+ height: 2rem
33
36
  ```
34
37
 
35
- Without a logo, `label` is shown as navigation text. With a logo, it becomes the
36
- image alternative text. If `label` is omitted, Norna uses the homepage title.
37
-
38
- Add the optional `logo` object only to override the displayed height:
39
-
40
- ```yaml
41
- navigation:
42
- label: Example Site
43
- logo:
44
- height: 2rem
45
- ```
46
-
47
- The width follows the logo's intrinsic aspect ratio. `navigation.logo` does not
48
- enable the logo or select a file.
38
+ The width follows the image's intrinsic aspect ratio. `logo` does
39
+ not enable the logo or select a file.
49
40
 
50
41
  `norna config:check` fails when it finds multiple supported logo files, or when
51
- `navigation.logo` is configured but no logo file exists. A site without a logo
52
- uses its text label; the check reports this fallback as a warning.
53
-
54
- ## Logos And Favicons
42
+ `logo` is configured but no logo file exists. A site without a logo uses its
43
+ ordinary page-title navigation; the check reports the missing logo as a
44
+ warning.
55
45
 
56
- A navigation logo is visible inside the website. A favicon identifies the site
57
- in browser tabs, bookmarks, and similar browser UI. They are independent and
58
- may coexist.
46
+ ## Browser Icons
59
47
 
60
- Norna recognizes these browser-icon filenames directly under `site/public/`:
48
+ To add browser icons, place one or more supported files directly in
49
+ `site/public/`:
61
50
 
62
51
  - `favicon.svg`
63
52
  - `favicon.ico`
64
53
  - `favicon.png`
65
54
  - `apple-touch-icon.png`
66
55
 
67
- These filenames must also match exactly and use lowercase letters. More than
68
- one format may be present. Norna emits links for every supported file and lets
69
- the browser choose the appropriate one.
56
+ Norna discovers these files from their filenames, so you do not configure paths
57
+ or enable them separately. Use the exact lowercase filenames to keep the site
58
+ portable between case-sensitive and case-insensitive file systems.
59
+
60
+ You may include several supported browser-icon files. Norna links every file it
61
+ finds and lets the browser select the appropriate format.
62
+
63
+ Browser icons are separate from the navigation logo. The logo appears inside
64
+ the website, while browser icons identify it in tabs, bookmarks, and similar
65
+ browser interfaces.
66
+
67
+ ## GitHub Pages Custom Domain
68
+
69
+ To use a custom domain with GitHub Pages, place a file named exactly `CNAME`
70
+ directly in `site/public/`. Write the domain name in the file without a protocol
71
+ or path:
72
+
73
+ ```text
74
+ www.example.com
75
+ ```
76
+
77
+ Norna does not discover or interpret `CNAME`; it copies the file to the root of
78
+ the generated website. GitHub Pages gives the filename its meaning. The public
79
+ `url` in `site/config.yaml` should use the same domain.
70
80
 
71
81
  ## Other Static Files
72
82
 
@@ -75,12 +85,16 @@ Other names are not restricted. For example:
75
85
  ```text
76
86
  site/public/
77
87
  |-- robots.txt
78
- |-- CNAME
79
88
  |-- verification.html
80
89
  `-- downloads/
81
90
  `-- project-overview.pdf
82
91
  ```
83
92
 
93
+ Except for the navigation logo and browser icons documented above, Norna does
94
+ not attach meaning to filenames or inspect their contents. It copies them
95
+ unchanged. Browsers, crawlers, hosting services, and verification providers may
96
+ still require their own exact filenames and locations.
97
+
84
98
  Norna preserves subdirectories while copying these files. A source file such
85
99
  as `site/public/downloads/project-overview.pdf` is published at
86
100
  `/downloads/project-overview.pdf`, prefixed with the site's configured base path
@@ -102,4 +116,3 @@ validated, synced, processed, and captioned. See
102
116
  `norna site:public` copies source files from `site/public/` to
103
117
  `site/.norna/public/`. The latter directory is generated build-preparation
104
118
  output and must not be edited or versioned.
105
-
@@ -9,7 +9,21 @@ want to deploy the documentation site.
9
9
 
10
10
  ## GitHub Pages Workflow
11
11
 
12
- Each site repository owns `.github/workflows/deploy.yml`. The starter workflow:
12
+ `norna init` creates the GitHub Pages workflow at exactly:
13
+
14
+ ```text
15
+ .github/workflows/deploy.yml
16
+ ```
17
+
18
+ The file belongs to the site repository. GitHub Actions runs its contents, while
19
+ Norna's deploy helpers use the filename to find and monitor the workflow. Keep
20
+ the default filename when using `norna deploy`.
21
+
22
+ GitHub Actions itself permits other workflow filenames. If the file is renamed,
23
+ `norna deploy:watch` can monitor it with `--workflow <name-or-file>`, but the
24
+ normal `norna deploy` command still expects `deploy.yml`.
25
+
26
+ The starter workflow:
13
27
 
14
28
  1. runs for the repository's default branch,
15
29
  2. checks out the site repository,
@@ -20,8 +34,10 @@ Each site repository owns `.github/workflows/deploy.yml`. The starter workflow:
20
34
  7. deploys the artifact to GitHub Pages.
21
35
 
22
36
  In the GitHub repository settings, set Pages to build from GitHub Actions.
23
- Site-specific public files such as `site/public/CNAME`, `robots.txt` and
24
- `sitemap.xml` belong in the site repository.
37
+ Site-specific public files such as `site/public/CNAME`, `robots.txt`, and
38
+ `sitemap.xml` belong in the site repository. Norna copies them, while GitHub
39
+ Pages, crawlers, and other external consumers give those filenames their
40
+ meaning. See [Public Files](public-files.md).
25
41
 
26
42
  For a project site without a custom domain, include the repository path in
27
43
  `site/config.yaml`:
@@ -2,7 +2,7 @@
2
2
 
3
3
  Norna expects a defined set of files and directories. Their names and locations
4
4
  are part of the site model: following the structure lets Norna find content,
5
- presentation, configuration, routes, and assets without path configuration.
5
+ presentation, configuration, pages, and assets without path configuration.
6
6
 
7
7
  The selected site directory is `site/` by default:
8
8
 
@@ -11,15 +11,19 @@ site/
11
11
  |-- config.yaml
12
12
  |-- theme.yaml
13
13
  |-- sitewide-content.yaml
14
- |-- content.md
15
- |-- images/
16
- | `-- <section-id>/
17
- |-- routes/
18
- | `-- <NNN-route-id>/
14
+ |-- pages/
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
- | `-- <section-id>/
22
+ | |-- images/
23
+ | | `-- image.jpg
24
+ | `-- pages/
25
+ | `-- 010-installation/
26
+ | `-- content.md
23
27
  |-- public/
24
28
  `-- .norna/
25
29
  |-- generated-images.json
@@ -36,8 +40,8 @@ case-insensitive file systems.
36
40
  | --- | --- | --- |
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
- | `sitewide-content.yaml` | No | Shared navigation identity, banners, and footer. |
40
- | `content.md` | Yes | Homepage metadata, sections, prose, and Norna blocks. |
43
+ | `sitewide-content.yaml` | No | Shared logo display settings, banners, and footer. |
44
+ | `pages/` | Yes | Homepage, top-level pages, and nested page hierarchies. |
41
45
 
42
46
  These responsibilities are deliberately separate:
43
47
 
@@ -47,43 +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 page file and remains ordinary
51
- Markdown with YAML frontmatter.
54
+ - [`pages/000-home/content.md`](content.md) is the required homepage and remains
55
+ ordinary Markdown. YAML frontmatter is optional.
52
56
 
53
- Routes cannot provide `config.yaml` or `sitewide-content.yaml`. Technical
54
- configuration and shared identity have one site-wide source.
57
+ Pages cannot provide `config.yaml` or `sitewide-content.yaml`. Technical
58
+ configuration and shared logo, banner, and footer settings have one site-wide
59
+ source.
55
60
 
56
- ## Images
61
+ ## Pages
57
62
 
58
- Managed homepage images belong in:
63
+ Every page is represented by a directory containing `content.md`. The homepage
64
+ is the one reserved page:
59
65
 
60
66
  ```text
61
- site/images/<section-id>/
67
+ site/pages/000-home/content.md
62
68
  ```
63
69
 
64
- The directory name must match an explicit level 2 Markdown section id in
65
- `content.md`. Markdown blocks refer to managed images by filename, not by path.
66
- See [Images and Metadata](images-and-metadata.md) for supported formats,
67
- generated variants, and syncing.
68
-
69
- ## Routes
70
-
71
- Each first-level route is one directory under `routes/`:
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:
72
73
 
73
74
  ```text
74
- site/routes/010-guide/
75
+ site/pages/010-guide/
75
76
  |-- content.md
76
77
  |-- theme.yaml
77
- `-- images/
78
- `-- intro/
78
+ |-- images/
79
+ | `-- image.jpg
80
+ `-- pages/
81
+ `-- 010-installation/
82
+ |-- content.md
83
+ `-- images/
84
+ `-- diagram.svg
79
85
  ```
80
86
 
81
- `content.md` is required for a route. The optional route `theme.yaml` replaces
82
- the root visual theme for that route. Route images follow the same
83
- `images/<section-id>/` convention as homepage images.
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.
84
91
 
85
- The three-digit route prefix controls navigation order and is not part of the
86
- URL. See [Routes](routes.md) for exact directory-name and route-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.
87
95
 
88
96
  ## Public Files
89
97
 
@@ -91,8 +99,9 @@ URL. See [Routes](routes.md) for exact directory-name and route-id rules.
91
99
  names are site-owned, but Norna recognizes a small set of exact conventional
92
100
  filenames for the navigation logo and browser icons.
93
101
 
94
- See [Public Files](public-files.md) for logo and favicon filenames, arbitrary
95
- static files, root-relative links, and publishing paths.
102
+ See [Public Files](public-files.md) for navigation-logo and browser-icon
103
+ filenames, GitHub Pages `CNAME`, arbitrary static files, root-relative links,
104
+ and publishing paths.
96
105
 
97
106
  ## Selecting The Site Directory
98
107
 
@@ -100,8 +109,8 @@ Use `NORNA_SITE_DIR` or `norna --site-dir <path>` to select a site directory
100
109
  explicitly.
101
110
 
102
111
  Without an explicit selection, Norna first accepts the current directory when
103
- it contains both `config.yaml` and `content.md`. Otherwise it walks upward until
104
- 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.
105
114
 
106
115
  ## Versioned Files
107
116
 
@@ -141,4 +150,3 @@ site:
141
150
  - `examples/`: complete sites and focused feature demonstrations;
142
151
  - `fixtures/`: engine regression input;
143
152
  - root `site/`: the Norna introduction and documentation site.
144
-
@@ -1,45 +1,37 @@
1
1
  # `sitewide-content.yaml`
2
2
 
3
3
  `site/sitewide-content.yaml` is optional. It contains editorial content and
4
- identity shared by every page: the navigation label, banners, and footer.
4
+ optional logo display settings shared by every page: banners, footer, and an
5
+ optional navigation-logo height override.
5
6
 
6
7
  The file contains plain YAML without Markdown frontmatter delimiters. Page
7
8
  sections do not belong here; they remain in each page's `content.md`.
8
9
 
9
- ## Navigation Identity
10
+ ## Navigation Logo
10
11
 
11
- Use the optional `navigation` object for identity shared by the homepage and
12
- all routes:
12
+ A logo file is discovered from `site/public/`; no path or site name is
13
+ configured here. The logo links to the homepage, and its alternative text
14
+ comes from the homepage Markdown H1 in `site/pages/000-home/content.md`.
13
15
 
14
- ```yaml
15
- navigation:
16
- label: Example Site
17
- ```
18
-
19
- Without a navigation logo, `label` is shown in the home link. With a logo,
20
- `label` becomes the image alternative text. If omitted, Norna uses the homepage
21
- title from `site/content.md`.
22
-
23
- A logo file is discovered from `site/public/`; no path is configured here. Add
24
- `logo` only to override its displayed height:
16
+ Add `logo` only to override the discovered file's displayed height:
25
17
 
26
18
  ```yaml
27
- navigation:
28
- label: Example Site
29
- logo:
30
- height: 2.6rem
19
+ logo:
20
+ height: 2.6rem
31
21
  ```
32
22
 
33
23
  The logo width follows the file's intrinsic aspect ratio. See
34
24
  [Public Files: Navigation Logo](public-files.md#navigation-logo) for exact
35
25
  filenames, placement, portability, and validation rules.
36
26
 
37
- Routes inherit this identity and cannot replace it in route content or a route
38
- theme.
27
+ The logo is a separate home link and does not have a section menu. In a
28
+ multi-page site, the homepage remains the first ordinary navigation item, uses
29
+ its Markdown H1 as its label, and exposes its sections in the same way as
30
+ pages. Page content and page themes cannot replace the shared logo setting.
39
31
 
40
32
  ## Banners
41
33
 
42
- Use `banners` for short notices shown above page content on every route. List
34
+ Use `banners` for short notices shown above page content on every page. List
43
35
  order controls presentation order. Each banner needs a unique lowercase `id`,
44
36
  a title, and text:
45
37
 
@@ -54,9 +46,8 @@ banners:
54
46
  text: Not for production use.
55
47
  ```
56
48
 
57
- `tone` currently supports `warning`. `visible` is optional and uses the same
58
- date-window rules as temporary sections: `from` is inclusive and `until` is
59
- exclusive.
49
+ `tone` currently supports `warning`. `visible` is optional. `from` is inclusive
50
+ and `until` is exclusive; both use `YYYY-MM-DD`, and either may be omitted.
60
51
 
61
52
  Visitors can dismiss each active banner. Dismissal state is stored locally in
62
53
  the browser and tied to the banner content, so an edited banner can appear
@@ -71,19 +62,12 @@ information:
71
62
  ```yaml
72
63
  footer:
73
64
  copyrightMessage: (c) Example Owner.
74
- buildInfo:
75
- enabled: true
76
- text: Built
77
- dateTimeFormat:
78
- locale: en-GB
79
- timeZone: UTC
80
- dateStyle: short
81
- timeStyle: short
65
+ buildInfo: true
82
66
  ```
83
67
 
84
- `dateTimeFormat` uses `Intl.DateTimeFormat` values. `timeZone` must be a valid
85
- IANA time-zone name. If both copyright text and enabled build information are
86
- absent, no footer is rendered.
68
+ Set `buildInfo` to `true` to show the generated build date and time. Norna uses
69
+ the site's configured language, a compact format, and UTC. If both copyright
70
+ text and build information are absent, no footer is rendered.
87
71
 
88
72
  See [Site Files](site-files.md) for where this optional file belongs in the
89
73
  complete site model.