@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
package/docs/theme.md CHANGED
@@ -1,16 +1,20 @@
1
1
  # Theme
2
2
 
3
- `site/theme.yaml` defines the site-wide visual theme for a Norna site. It is a
4
- required plain YAML file. The normal setup selects one complete theme preset
5
- and adds only focused overrides when needed.
3
+ `site/theme.yaml` defines the visual identity and default presentation for the
4
+ whole Norna site. It is a required plain YAML file. The normal setup selects one
5
+ complete preset and adds only focused overrides when they are needed:
6
6
 
7
- An optional `theme.yaml` inside a route directory replaces the root visual
8
- theme for that route. Shared identity such as the navigation label and logo
9
- remains site-wide and belongs in `sitewide-content.yaml`.
7
+ ```yaml
8
+ preset: documentation
9
+ ```
10
+
11
+ The root theme owns site-wide colors, shapes, typography, page frame, and
12
+ navigation presentation. An optional page-local `theme.yaml` has a deliberately
13
+ smaller role described under [Page Themes](#page-themes).
10
14
 
11
15
  ## Theme Presets
12
16
 
13
- Available complete theme presets are:
17
+ Available complete presets are:
14
18
 
15
19
  - `portfolio`: restrained typography and a broad image area for image-led
16
20
  presentation.
@@ -21,27 +25,21 @@ Available complete theme presets are:
21
25
  - `statement`: airy spacing and stronger typography for short editorial
22
26
  content.
23
27
 
24
- A normal `theme.yaml` can be only:
28
+ Each preset coordinates:
25
29
 
26
- ```yaml
27
- preset: documentation
28
- ```
30
+ - colors, shape, and typography
31
+ - page width, gutters, text width, and content spacing
32
+ - navigation spacing and visual treatment
33
+ - managed-image sizing
34
+ - section background sequence
29
35
 
30
- Each preset supplies coordinated values for:
31
-
32
- - layout density, page width, and gutters
33
- - managed image sizing
34
- - font family, typography profile, and typography rhythm
35
- - palette and section-surface behaviour
36
-
37
- The nested `typography.profile` setting documented below is a lower-level
38
- typography choice. A top-level theme `preset` selects the complete visual
39
- system, including that typography choice.
36
+ These coordinated values keep the site's identity consistent. Page themes
37
+ cannot select another preset.
40
38
 
41
39
  ## Overrides
42
40
 
43
- Values written beside the top-level preset override only that part of the
44
- preset. Other preset values remain active:
41
+ Values beside the root preset override only that part of the preset. Other
42
+ preset values remain active:
45
43
 
46
44
  ```yaml
47
45
  preset: documentation
@@ -50,112 +48,89 @@ layout:
50
48
  palette: dark
51
49
  ```
52
50
 
53
- Nested objects are merged by key. `sectionSurfaces` replaces the preset array
54
- when it is specified.
55
-
56
- It is still valid to omit the top-level preset and define the visual settings
57
- explicitly. Omitted explicit settings then use engine defaults. This is useful
58
- for focused testing, but selecting a complete preset is the simpler normal
59
- workflow.
51
+ Nested objects are merged by key. It is valid to omit `preset` and define root
52
+ settings explicitly, but a complete preset is the simpler normal workflow.
60
53
 
61
54
  ## Export A Preset
62
55
 
63
- Export the installed definition of a preset before choosing overrides:
56
+ Export the installed definition before choosing overrides:
64
57
 
65
58
  ```sh
66
59
  norna theme:export documentation
67
60
  ```
68
61
 
69
- In a generated site, the equivalent npm command is:
62
+ In a generated site, use:
70
63
 
71
64
  ```sh
72
65
  npm run norna:theme:export -- documentation
73
66
  ```
74
67
 
75
- The command creates `site/orig-documentation-theme.yaml`, or the corresponding
76
- path under the selected site directory. The file contains the preset values,
77
- comments describing accepted alternatives, and an example of a fine-grained
78
- typography override.
68
+ The command creates `site/orig-documentation-theme.yaml`. The file contains the
69
+ preset values, accepted alternatives, and example overrides. Norna never loads
70
+ `orig-*-theme.yaml`; only `theme.yaml` is active. The command refuses to
71
+ overwrite an existing reference file.
79
72
 
80
- Norna never loads `orig-*-theme.yaml`; only `theme.yaml` is active. The export
81
- command refuses to overwrite an existing reference file.
82
-
83
- Site identity is not part of the visual theme. Define the optional navigation
84
- label and logo display settings in `site/sitewide-content.yaml`; see
85
- [Sitewide Content](sitewide-content.md).
73
+ Page titles and site-wide editorial content are not part of the visual theme.
74
+ Optional logo display settings, banners, and the footer belong in
75
+ [`sitewide-content.yaml`](sitewide-content.md).
86
76
 
87
77
  ## Layout
88
78
 
89
- `layout` is optional. It controls the outer page geometry:
79
+ Root `layout` settings control the site frame and default content geometry:
90
80
 
91
- - `pageWidth`: maximum width of the main page content area.
92
- - `gutter`: side margin removed from the viewport before available content
93
- width is calculated. Use either one CSS length for all viewports or
94
- `desktop` / `mobile` values.
95
- - `density`: default structural spacing profile. Allowed values are `compact`,
96
- `normal`, and `airy`.
97
- - `spacing`: optional spacing overrides for sections and content blocks. Every
98
- spacing value accepts either one CSS length for all viewports or `desktop` /
99
- `mobile` values.
81
+ - `pageWidth`: maximum width of the full site layout, including local tree
82
+ navigation where present.
83
+ - `gutter`: horizontal viewport gutter, either one CSS length or separate
84
+ `desktop` and `mobile` values.
85
+ - `textWidth`: body-text line length: `narrow`, `normal`, or `wide`.
86
+ - `contentSpacing`: vertical spacing between sections and structured blocks:
87
+ `compact`, `normal`, or `spacious`.
88
+ - `spacing`: fine-grained structural spacing overrides.
100
89
 
101
90
  Example:
102
91
 
103
92
  ```yaml
93
+ preset: documentation
104
94
  layout:
105
- density: normal
106
- pageWidth: 1180px
95
+ pageWidth: 1320px
107
96
  gutter:
108
97
  desktop: clamp(1.25rem, 4vw, 3rem)
109
98
  mobile: 1rem
99
+ textWidth: narrow
100
+ contentSpacing: compact
110
101
  spacing:
111
- firstSectionTop:
112
- desktop: clamp(1.875rem, 3vw, 2.75rem)
113
- mobile: 1.375rem
102
+ firstSectionTop: 1.5rem
114
103
  sectionGap:
115
- desktop: clamp(1.4rem, 3vw, 2.75rem)
104
+ desktop: 2.5rem
116
105
  mobile: 1.5rem
117
- headingToBlock:
118
- desktop: 0.75em
119
- mobile: 0.7em
120
- blockGap:
121
- desktop: 1.5em
122
- mobile: 1.25em
106
+ headingToBlock: 0.75em
107
+ blockGap: 1.5em
123
108
  ```
124
109
 
125
- If omitted, Norna uses `1180px` for `pageWidth`, desktop
126
- `clamp(1.25rem, 4vw, 3rem)` for `gutter`, mobile `1rem`, and `normal` layout
127
- density.
128
-
129
- Spacing keys:
110
+ Spacing keys are:
130
111
 
131
112
  - `firstSectionTop`: space above the first section heading.
132
113
  - `sectionGap`: space above each following section.
133
114
  - `finalSectionBottom`: space below the final section.
134
- - `headingToBlock`: space between a section heading and its first visual content
115
+ - `headingToBlock`: space between a section heading and its first structured
135
116
  block, such as an image stack, carousel, or card list.
136
- - `blockGap`: space between content blocks in a section. It applies between
137
- Markdown, image, carousel, and card-list blocks, but not after the final block.
138
- - `imageGap`: space between stacked images or carousel blocks.
117
+ - `blockGap`: space between structured content blocks.
118
+ - `imageGap`: space between images in an image stack.
139
119
 
140
- The default `compact`, `normal`, and `airy` density profiles provide values for
141
- these spacing keys. The `em` values for `headingToBlock` and `blockGap` are
142
- relative to the relevant text size, so the rhythm follows typography changes.
143
- Use `sectionGap` and the other structural keys when the distance should describe
144
- the page layout rather than the size of nearby text.
120
+ The `contentSpacing` profiles supply coordinated defaults for these values.
121
+ Text-near spacing inside Markdown, including paragraph and subheading spacing,
122
+ belongs to typography rhythm.
145
123
 
146
- Text-near spacing inside Markdown, such as spacing after headings, spacing
147
- before Markdown subheadings, paragraph spacing, and caption spacing, belongs to
148
- `typography.rhythm` and typography overrides.
124
+ The horizontal gap between tree navigation and page content is coordinated by
125
+ the selected preset. It is intentionally not a separate public override.
149
126
 
150
127
  ## Image Sizing
151
128
 
152
- `images` is optional. It controls managed image sizing:
129
+ `images` controls managed image sizing:
153
130
 
154
- - `width`: hard maximum rendered image area width for images, captions, and
155
- aligned text.
156
- - `maxAvailableWidthPercent`: maximum share of available width after gutters.
157
- - `maxAvailableHeightPercent`: maximum share of viewport height used by
158
- images.
131
+ - `width`: maximum rendered image-area width.
132
+ - `maxAvailableWidthPercent`: maximum share of available horizontal space.
133
+ - `maxAvailableHeightPercent`: maximum share of viewport height.
159
134
 
160
135
  Example:
161
136
 
@@ -170,18 +145,16 @@ images:
170
145
  mobile: 68
171
146
  ```
172
147
 
173
- If omitted, Norna uses `900px`, full available width, and image height limits of
174
- desktop `74` / mobile `68`.
148
+ Each responsive percentage may also be a single number.
175
149
 
176
150
  ## Typography
177
151
 
178
- Top-level `typography` is the site-wide typographic base. It supports:
152
+ Root `typography` is site-wide. It supports:
179
153
 
180
154
  - `fontFamily`: global CSS font-family stack.
181
- - `profile`: built-in typography profile.
182
- - `rhythm`: text-near spacing profile. Allowed values are `compact`,
183
- `normal`, and `airy`.
184
- - `overrides`: focused changes to preset values.
155
+ - `profile`: `restrained`, `dense`, `reading`, or `statement`.
156
+ - `rhythm`: `compact`, `normal`, or `airy`.
157
+ - `overrides`: focused changes to headings, body text, and captions.
185
158
 
186
159
  Example:
187
160
 
@@ -196,76 +169,69 @@ typography:
196
169
  size: medium
197
170
  weight: 600
198
171
  spacingAfter: 0.55em
199
- h3:
200
- size: medium
201
- spacingBefore: 1.5em
202
- spacingAfter: 0.5em
203
172
  body:
204
- width: narrow
173
+ size: medium
205
174
  lineHeight: 1.55
206
175
  ```
207
176
 
208
- Use `norna typography profiles` to inspect built-in profile and rhythm values,
209
- and `norna typography show` to inspect the resolved typography for the
210
- selected site. See [Typography](typography.md).
177
+ Use `norna typography profiles` to inspect built-in values and
178
+ `norna typography show` to inspect the resolved site typography. See
179
+ [Typography](typography.md) for every override field.
211
180
 
212
181
  ## Palette And Section Surfaces
213
182
 
214
- `palette` and `sectionSurfaces` are optional top-level theme settings:
183
+ These root settings are site-wide:
215
184
 
216
- - `palette`: `dark`, `light`, or `paper`. It coordinates page, navigation,
217
- footer, and section colors.
218
- - `sectionSurfaces`: one to three unique values chosen from `base`, `soft`, and
219
- `emphasis`. One value gives every section the same surface. Multiple values
220
- cycle in the listed order.
185
+ - `palette`: `dark`, `light`, or `paper`.
186
+ - `shape`: `square` or `soft`.
187
+ - `sections.backgroundPattern`: `uniform`, `alternating`, or `cycling`.
221
188
 
222
189
  Example:
223
190
 
224
191
  ```yaml
225
- palette: paper # Alternatives: dark, light
226
- sectionSurfaces: [base, soft, emphasis]
192
+ preset: project
193
+ palette: paper
194
+ shape: soft
195
+ sections:
196
+ backgroundPattern: cycling
227
197
  ```
228
198
 
229
- ## Route Themes
230
-
231
- Add `theme.yaml` to a route directory when that route should have a different
232
- visual expression:
199
+ The background pattern uses coordinated surfaces from the active palette. It
200
+ does not let individual sections select arbitrary colors.
233
201
 
234
- ```text
235
- site/routes/010-guide/theme.yaml
236
- ```
202
+ ## Page Themes
237
203
 
238
- The route theme uses the same visual schema and complete presets as the root
239
- theme. A route can therefore select a different expression without repeating a
240
- large configuration:
204
+ Add `theme.yaml` to a non-home page directory only when that page or one of its
205
+ descendants needs a narrower presentation adjustment:
241
206
 
242
- ```yaml
243
- preset: statement
207
+ ```text
208
+ site/pages/010-guide/theme.yaml
244
209
  ```
245
210
 
246
- It completely replaces the root visual theme for that route. If the route
247
- theme selects no top-level preset, omitted values use engine defaults rather
248
- than values from the root theme. It cannot define navigation identity or
249
- technical configuration.
250
-
251
- Section surfaces render as full-width horizontal bands while the section
252
- content keeps the normal page and image widths. Links keep the palette's global
253
- accent color.
211
+ A page theme may set only:
254
212
 
255
- ## Common Questions
213
+ - `layout.textWidth`
214
+ - `layout.contentSpacing`
215
+ - managed-image sizing under `images`
216
+ - `sections.backgroundPattern`
256
217
 
257
- ### Should every route select its own preset?
218
+ For example:
258
219
 
259
- No. A route without its own `theme.yaml` inherits the root theme, which is the
260
- normal choice when the site should keep one visual expression.
220
+ ```yaml
221
+ layout:
222
+ textWidth: narrow
223
+ contentSpacing: compact
224
+ images:
225
+ width: 760px
226
+ sections:
227
+ backgroundPattern: uniform
228
+ ```
261
229
 
262
- Add a route theme only when the route should intentionally look different. If
263
- the route should keep the same preset but demonstrate a focused change, repeat
264
- the root preset in the route theme and override only that setting. This is
265
- necessary because a route theme replaces the root visual theme rather than
266
- merging with it.
230
+ Page settings are merged with the root theme and inherited by descendant pages.
231
+ A more local page theme may override the same limited fields. Site colors,
232
+ shape, typography, page width, gutters, and navigation remain constant.
267
233
 
268
- For example, a route demonstrating section surfaces may keep `preset: project`
269
- and change only `sectionSurfaces`. A route demonstrating image or content
270
- blocks should normally inherit the root preset so that the blocks remain the
271
- only variable being compared.
234
+ Page themes cannot define `preset`, `palette`, `shape`, `typography`,
235
+ `navigation`, `config.yaml`, or site-wide content. This boundary keeps one
236
+ recognisable site while still allowing a guide, gallery, or reference area to
237
+ use an appropriate reading width and media presentation.
@@ -12,7 +12,7 @@ preset: documentation
12
12
 
13
13
  Use the nested `typography` block only when those typographic choices need to
14
14
  differ from the selected theme preset. Typography is configured at root-theme
15
- or route-theme level, not in page or section content.
15
+ or page-theme level, not in page or section content.
16
16
 
17
17
  ## Typography Profiles
18
18
 
@@ -25,7 +25,7 @@ Available profiles:
25
25
  - `reading`: more generous body text for pages where longer text carries
26
26
  more of the experience.
27
27
  - `statement`: tighter, more declarative line-height for short programmatic
28
- statements. Use it sparingly, usually as a route-level exception.
28
+ statements. Use it sparingly, usually as a page-level exception.
29
29
 
30
30
  If a complete top-level theme preset is selected, that preset supplies the
31
31
  typography choice. If both the top-level preset and nested typography are
@@ -65,7 +65,7 @@ profiles, rhythms, and overrides have been applied:
65
65
  norna typography show
66
66
  ```
67
67
 
68
- The output includes the site theme, every page route, and every section. Each
68
+ The output includes the site theme, every page, and every section. Each
69
69
  resolved value shows its `source`; values inherited by a page or section are
70
70
  also marked with `inherited: true`.
71
71
 
@@ -125,9 +125,9 @@ follows the Markdown level the user wrote: `##` uses `headings.h2`.
125
125
  `1rem`, or `12px`. Use `em` for spacing that should track the text size.
126
126
 
127
127
  `weight` is a controlled heading weight. Allowed values are `400`, `500`,
128
- `600`, and `700`. `body.width` is the readable text width and accepts
129
- `narrow`, `normal`, or `wide`. It controls the prose column, not the page's
130
- maximum width or the width of image blocks.
128
+ `600`, and `700`. Configure readable line length with `layout.textWidth` in the
129
+ root or page theme; it controls the prose column, not the page's maximum width
130
+ or the width of image blocks.
131
131
 
132
132
  Supported override fields:
133
133
 
@@ -143,38 +143,26 @@ Supported override fields:
143
143
  - `headings.h4.align`, `headings.h4.size`, `headings.h4.weight`,
144
144
  `headings.h4.lineHeight`,
145
145
  `headings.h4.spacingBefore`, `headings.h4.spacingAfter`
146
- - `body.align`, `body.size`, `body.width`, `body.lineHeight`,
146
+ - `body.align`, `body.size`, `body.lineHeight`,
147
147
  `body.paragraphSpacing`
148
148
  - `caption.align`, `caption.size`, `caption.lineHeight`,
149
149
  `caption.spacingBefore`
150
150
 
151
- ## Route Themes
151
+ ## Page Text Width
152
152
 
153
- The simplest route-specific typography change is to select a complete theme
154
- preset:
153
+ Typography itself remains site-wide so pages keep the same font, heading
154
+ hierarchy, and typographic character. A page-local `theme.yaml` may adjust the
155
+ body-text line length when a particular page or subtree needs a narrower or
156
+ wider reading column:
155
157
 
156
158
  ```yaml
157
- # site/routes/010-introduction/theme.yaml
158
- preset: statement
159
+ # site/pages/010-introduction/theme.yaml
160
+ layout:
161
+ textWidth: narrow
159
162
  ```
160
163
 
161
- A route-local `theme.yaml` replaces the root visual theme rather than inheriting
162
- from it. The complete preset supplies a coherent route theme without repeating
163
- the root values.
164
+ The page setting is inherited by descendant pages. Page themes cannot select a
165
+ typography profile, rhythm, font family, or heading override.
164
166
 
165
- Use a nested typography choice when only the typographic character needs to be
166
- specified explicitly:
167
-
168
- ```yaml
169
- # site/routes/010-introduction/theme.yaml
170
- typography:
171
- profile: statement
172
- rhythm: normal
173
- ```
174
-
175
- Without a top-level theme preset, other omitted route-theme values use engine
176
- defaults rather than values from the root theme.
177
-
178
- The `body.width` value controls the prose column independently of the page and
179
- image widths. Captions are normally centered, but `reading` uses
180
- left-aligned captions to support longer explanatory text.
167
+ Captions are normally centered, but `reading` uses left-aligned captions to
168
+ support longer explanatory text.
@@ -7,10 +7,13 @@ documentation workflow.
7
7
  | Example | Purpose | Live demo | Source |
8
8
  | --- | --- | --- | --- |
9
9
  | Dog shelter, single page | A coherent homepage made from sections | [Open site](https://janga.github.io/norna/examples/complete-sites/dog-shelter-single-page/) | [View files](complete-sites/dog-shelter-single-page/) |
10
- | Dog shelter, multi-page | A coherent site with ordered routes and route-local images | [Open site](https://janga.github.io/norna/examples/complete-sites/dog-shelter-multi-page/) | [View files](complete-sites/dog-shelter-multi-page/) |
11
- | Theme presets | All complete presets without overrides | [Open site](https://janga.github.io/norna/examples/feature-demos/theme-presets/) | [View files](feature-demos/theme-presets/) |
10
+ | Dog shelter, multi-page | A coherent site with ordered pages and page-local images | [Open site](https://janga.github.io/norna/examples/complete-sites/dog-shelter-multi-page/) | [View files](complete-sites/dog-shelter-multi-page/) |
11
+ | Portfolio preset | Complete `portfolio` preset without overrides | [Open site](https://janga.github.io/norna/examples/feature-demos/theme-preset-portfolio/) | [View files](feature-demos/theme-preset-portfolio/) |
12
+ | Documentation preset | Complete `documentation` preset without overrides | [Open site](https://janga.github.io/norna/examples/feature-demos/theme-preset-documentation/) | [View files](feature-demos/theme-preset-documentation/) |
13
+ | Project preset | Complete `project` preset without overrides | [Open site](https://janga.github.io/norna/examples/feature-demos/theme-preset-project/) | [View files](feature-demos/theme-preset-project/) |
14
+ | Statement preset | Complete `statement` preset without overrides | [Open site](https://janga.github.io/norna/examples/feature-demos/theme-preset-statement/) | [View files](feature-demos/theme-preset-statement/) |
12
15
  | Media and surfaces | Image blocks, cards, notes, palettes, and section surfaces | [Open site](https://janga.github.io/norna/examples/feature-demos/media-and-surfaces/) | [View files](feature-demos/media-and-surfaces/) |
13
- | Sitewide content | Shared identity, navigation, banners, and footer content | [Open site](https://janga.github.io/norna/examples/feature-demos/sitewide-content/) | [View files](feature-demos/sitewide-content/) |
16
+ | Sitewide content | Shared logo settings, banners, and footer content | [Open site](https://janga.github.io/norna/examples/feature-demos/sitewide-content/) | [View files](feature-demos/sitewide-content/) |
14
17
 
15
18
  ## Directory Structure
16
19
 
@@ -20,7 +23,10 @@ examples/
20
23
  | |-- dog-shelter-single-page/
21
24
  | `-- dog-shelter-multi-page/
22
25
  `-- feature-demos/
23
- |-- theme-presets/
26
+ |-- theme-preset-portfolio/
27
+ |-- theme-preset-documentation/
28
+ |-- theme-preset-project/
29
+ |-- theme-preset-statement/
24
30
  |-- media-and-surfaces/
25
31
  `-- sitewide-content/
26
32
  ```
@@ -2,58 +2,34 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "type": "object",
4
4
  "properties": {
5
- "title": {
6
- "type": "string"
7
- },
8
- "description": {
9
- "type": "string"
5
+ "page": {
6
+ "type": "object",
7
+ "properties": {
8
+ "description": {
9
+ "description": "Optional page-specific meta description.",
10
+ "type": "string",
11
+ "minLength": 1
12
+ }
13
+ },
14
+ "additionalProperties": false,
15
+ "description": "Optional metadata for this homepage or additional page. The Markdown H1 supplies the page title."
10
16
  },
11
17
  "navigation": {
18
+ "description": "Optional navigation metadata for this page.",
12
19
  "type": "object",
13
20
  "properties": {
14
- "include": {
21
+ "listed": {
22
+ "default": true,
23
+ "description": "List this page in site navigation. The page remains public when false.",
15
24
  "type": "boolean"
16
- },
17
- "label": {
18
- "type": "string"
19
25
  }
20
26
  },
21
27
  "additionalProperties": false
22
28
  },
23
- "sections": {
24
- "default": {},
25
- "type": "object",
26
- "propertyNames": {
27
- "type": "string",
28
- "pattern": "^[a-z0-9-]+$"
29
- },
30
- "additionalProperties": {
31
- "type": "object",
32
- "properties": {
33
- "visible": {
34
- "type": "object",
35
- "properties": {
36
- "from": {
37
- "type": "string",
38
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
39
- },
40
- "until": {
41
- "type": "string",
42
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
43
- }
44
- },
45
- "additionalProperties": false
46
- }
47
- },
48
- "additionalProperties": false
49
- }
50
- },
51
29
  "$schema": {
52
30
  "type": "string"
53
31
  }
54
32
  },
55
- "required": [
56
- "title",
57
- "description"
58
- ]
33
+ "additionalProperties": false,
34
+ "description": "Frontmatter for a homepage or additional page content.md file."
59
35
  }