@janga/norna 0.7.9 → 0.7.11

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 (287) hide show
  1. package/README.md +4 -2
  2. package/bin/norna-cli.mjs +3 -0
  3. package/docs/README.md +16 -12
  4. package/docs/commands.md +6 -0
  5. package/docs/configuration.md +10 -54
  6. package/docs/content.md +20 -21
  7. package/docs/design/norna-diagram-design.md +2 -0
  8. package/docs/design/site-examples-structure.md +35 -24
  9. package/docs/engine-development.md +13 -7
  10. package/docs/getting-started.md +56 -19
  11. package/docs/routes.md +8 -6
  12. package/docs/site-structure.md +11 -6
  13. package/docs/sitewide-content.md +74 -0
  14. package/docs/theme.md +125 -140
  15. package/docs/typography.md +72 -45
  16. package/examples/README.md +41 -0
  17. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +59 -0
  18. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +138 -0
  19. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +755 -0
  20. package/examples/complete-sites/dog-shelter-multi-page/.astro/content-modules.mjs +1 -0
  21. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/content.d.ts +8 -0
  22. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -0
  23. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev-local.json +2 -2
  24. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev.json +2 -2
  25. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +53 -0
  26. package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +5 -0
  27. package/examples/complete-sites/dog-shelter-multi-page/README.md +9 -0
  28. package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/_metadata.json +13 -7
  29. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +18 -0
  30. package/examples/complete-sites/dog-shelter-multi-page/site/config.mjs +30 -0
  31. package/examples/complete-sites/dog-shelter-multi-page/site/content.md +12 -0
  32. package/examples/complete-sites/dog-shelter-multi-page/site/public/favicon.svg +10 -0
  33. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.svg +19 -0
  34. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.svg +19 -0
  35. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/route-content.md +30 -0
  36. package/examples/complete-sites/dog-shelter-multi-page/site/routes/020-adopt/route-content.md +12 -0
  37. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.md +6 -0
  38. package/examples/complete-sites/dog-shelter-multi-page/site/theme.md +25 -0
  39. package/examples/complete-sites/dog-shelter-single-page/README.md +9 -0
  40. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +18 -0
  41. package/examples/complete-sites/dog-shelter-single-page/site/config.mjs +30 -0
  42. package/examples/complete-sites/dog-shelter-single-page/site/content.md +38 -0
  43. package/examples/complete-sites/dog-shelter-single-page/site/images/what-we-do/dog-house.svg +25 -0
  44. package/examples/complete-sites/dog-shelter-single-page/site/images/you-can-help/heart.svg +13 -0
  45. package/examples/complete-sites/dog-shelter-single-page/site/public/favicon.svg +10 -0
  46. package/examples/complete-sites/dog-shelter-single-page/site/public/robots.txt +2 -0
  47. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.md +6 -0
  48. package/examples/complete-sites/dog-shelter-single-page/site/theme.md +25 -0
  49. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +59 -0
  50. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +138 -0
  51. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +755 -0
  52. package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +1 -0
  53. package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +183 -0
  54. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -0
  55. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +11 -0
  56. package/examples/feature-demos/media-and-surfaces/.astro/settings.json +5 -0
  57. package/examples/feature-demos/media-and-surfaces/.astro/types.d.ts +2 -0
  58. package/examples/feature-demos/media-and-surfaces/README.md +15 -0
  59. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +74 -0
  60. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  61. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  62. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  63. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  64. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  65. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  66. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  67. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  68. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  69. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  70. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  71. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  72. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  73. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  74. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  75. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  76. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  77. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  78. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  79. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  80. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  81. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  82. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  83. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  84. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  85. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  86. package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +66 -0
  87. package/examples/feature-demos/media-and-surfaces/site/config.mjs +30 -0
  88. package/examples/feature-demos/media-and-surfaces/site/content.md +64 -0
  89. package/examples/feature-demos/media-and-surfaces/site/public/robots.txt +2 -0
  90. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/cards/card-carousel.svg +11 -0
  91. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/cards/card-stack.svg +9 -0
  92. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/cards/card-surfaces.svg +8 -0
  93. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/carousel/carousel-one.svg +8 -0
  94. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/carousel/carousel-three.svg +13 -0
  95. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/carousel/carousel-two.svg +8 -0
  96. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/stack/stack-one.svg +8 -0
  97. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/stack/stack-two.svg +9 -0
  98. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/route-content.md +85 -0
  99. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/theme.md +3 -0
  100. package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/route-content.md +44 -0
  101. package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/theme.md +8 -0
  102. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.md +6 -0
  103. package/examples/feature-demos/media-and-surfaces/site/theme.md +3 -0
  104. package/examples/{typography-presets/.astro/collections/theme.schema.json → feature-demos/theme-presets/.astro/collections/routeTheme.schema.json} +143 -65
  105. package/examples/feature-demos/theme-presets/.astro/collections/site.schema.json +59 -0
  106. package/examples/feature-demos/theme-presets/.astro/collections/sitewide.schema.json +138 -0
  107. package/examples/feature-demos/theme-presets/.astro/collections/theme.schema.json +755 -0
  108. package/examples/feature-demos/theme-presets/.astro/content-assets.mjs +4 -0
  109. package/examples/feature-demos/theme-presets/.astro/content-modules.mjs +1 -0
  110. package/examples/feature-demos/theme-presets/.astro/content.d.ts +183 -0
  111. package/examples/feature-demos/theme-presets/.astro/data-store.json +1 -0
  112. package/examples/feature-demos/theme-presets/.astro/dev-local.json +8 -0
  113. package/examples/feature-demos/theme-presets/.astro/dev.json +15 -0
  114. package/examples/feature-demos/theme-presets/.astro/dev.log +127 -0
  115. package/examples/feature-demos/theme-presets/.astro/types.d.ts +2 -0
  116. package/examples/feature-demos/theme-presets/README.md +14 -0
  117. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js +1389 -0
  118. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  119. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/package.json +3 -0
  120. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  121. package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +290 -0
  122. package/examples/{typography-presets → feature-demos/theme-presets}/site/config.mjs +4 -16
  123. package/examples/feature-demos/theme-presets/site/content.md +17 -0
  124. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/route-content.md +34 -0
  125. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/theme.md +3 -0
  126. package/examples/feature-demos/theme-presets/site/routes/020-documentation/route-content.md +33 -0
  127. package/examples/feature-demos/theme-presets/site/routes/020-documentation/theme.md +3 -0
  128. package/examples/feature-demos/theme-presets/site/routes/030-project/route-content.md +34 -0
  129. package/examples/feature-demos/theme-presets/site/routes/030-project/theme.md +3 -0
  130. package/examples/feature-demos/theme-presets/site/routes/040-statement/route-content.md +34 -0
  131. package/examples/feature-demos/theme-presets/site/routes/040-statement/theme.md +3 -0
  132. package/examples/feature-demos/theme-presets/site/sitewide-content.md +14 -0
  133. package/examples/feature-demos/theme-presets/site/theme.md +3 -0
  134. package/fixtures/basic/site/config.mjs +0 -13
  135. package/fixtures/basic/site/sitewide-content.md +12 -0
  136. package/fixtures/basic/site/theme.md +2 -2
  137. package/fixtures/content-model-v2/site/content.md +2 -5
  138. package/fixtures/content-model-v2/site/theme.md +1 -3
  139. package/package.json +9 -4
  140. package/scripts/build-pages.mjs +71 -0
  141. package/scripts/check-config.mjs +23 -1
  142. package/scripts/export-theme-preset.mjs +31 -0
  143. package/scripts/init-site.mjs +1 -0
  144. package/scripts/lib/example-sites.mjs +34 -0
  145. package/scripts/lib/frontmatter-yaml.mjs +28 -0
  146. package/scripts/lib/logo-assets.mjs +35 -0
  147. package/scripts/lib/norna-markdown-blocks.mjs +166 -0
  148. package/scripts/lib/presentation.mjs +106 -47
  149. package/scripts/lib/project-config.mjs +68 -105
  150. package/scripts/lib/site-content.mjs +26 -118
  151. package/scripts/lib/site-paths.mjs +2 -0
  152. package/scripts/lib/sitewide-config.mjs +34 -0
  153. package/scripts/lib/theme-config.mjs +75 -8
  154. package/scripts/lib/theme-presets.mjs +209 -0
  155. package/scripts/lib/typography.mjs +20 -26
  156. package/scripts/show-typography.mjs +43 -149
  157. package/scripts/sync-content-sections.mjs +19 -17
  158. package/scripts/test-content-check.mjs +59 -27
  159. package/scripts/test-content-model-v2.mjs +154 -0
  160. package/scripts/test-engine-commands.mjs +4 -1
  161. package/scripts/test-examples.mjs +15 -0
  162. package/scripts/test-navigation.mjs +73 -45
  163. package/scripts/test-package-check.mjs +66 -24
  164. package/scripts/test-temporary-visibility.mjs +19 -2
  165. package/scripts/test-theme-presets.mjs +151 -0
  166. package/src/components/CardList.astro +5 -2
  167. package/src/components/GalleryGrid.astro +37 -16
  168. package/src/components/SiteBanners.astro +100 -0
  169. package/src/components/SiteNavigation.astro +48 -31
  170. package/src/components/SitePage.astro +55 -13
  171. package/src/components/SiteSection.astro +193 -35
  172. package/src/content.config.ts +80 -48
  173. package/src/layouts/BaseLayout.astro +64 -14
  174. package/src/lib/routeThemes.ts +61 -0
  175. package/src/lib/sectionContent.ts +235 -51
  176. package/src/lib/sitePublicAssets.ts +1 -0
  177. package/src/styles/global.css +284 -93
  178. package/starters/basic/.github/workflows/deploy.yml +1 -1
  179. package/starters/basic/README.md +7 -6
  180. package/starters/basic/package.json +1 -0
  181. package/starters/basic/site/config.mjs +0 -13
  182. package/starters/basic/site/content.md +1 -1
  183. package/starters/basic/site/sitewide-content.md +14 -0
  184. package/starters/basic/site/theme.md +13 -24
  185. package/starters/project/.github/workflows/deploy.yml +1 -1
  186. package/starters/project/README.md +10 -8
  187. package/starters/project/package.json +1 -0
  188. package/starters/project/site/config.mjs +0 -13
  189. package/starters/project/site/sitewide-content.md +14 -0
  190. package/starters/project/site/theme.md +3 -11
  191. package/examples/dog-gallery/site/.norna/generated-images.json +0 -226
  192. package/examples/dog-gallery/site/config.mjs +0 -67
  193. package/examples/dog-gallery/site/content.md +0 -128
  194. package/examples/dog-gallery/site/images/black-dogs/black-puppy-meadow.png +0 -0
  195. package/examples/dog-gallery/site/images/black-dogs/photo-of-a-black-dog.jpg +0 -0
  196. package/examples/dog-gallery/site/images/brown-dogs/brown-dog.jpg +0 -0
  197. package/examples/dog-gallery/site/images/brown-dogs/dog-accompanies-master.jpg +0 -0
  198. package/examples/dog-gallery/site/images/golden-dogs/golden-retriever.jpg +0 -0
  199. package/examples/dog-gallery/site/images/golden-dogs/toller-puppy.jpg +0 -0
  200. package/examples/dog-gallery/site/images/white-dogs/white-cute-dog.jpg +0 -0
  201. package/examples/dog-gallery/site/images/white-dogs/white-puppy-garden.png +0 -0
  202. package/examples/dog-gallery/site/public/favicon.svg +0 -7
  203. package/examples/dog-gallery/site/routes/010-dog-care/route-content.md +0 -38
  204. package/examples/dog-gallery/site/theme.md +0 -112
  205. package/examples/typography-presets/.astro/collections/site.schema.json +0 -776
  206. package/examples/typography-presets/.astro/data-store.json +0 -1
  207. package/examples/typography-presets/.astro/dev.log +0 -24
  208. package/examples/typography-presets/site/.norna/generated-images.json +0 -290
  209. package/examples/typography-presets/site/content.md +0 -134
  210. package/examples/typography-presets/site/theme.md +0 -43
  211. /package/examples/{typography-presets/.astro/content-modules.mjs → complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs} +0 -0
  212. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/types.d.ts +0 -0
  213. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  214. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  215. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  216. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  217. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  218. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  219. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  220. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  221. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  222. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  223. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  224. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  225. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js +0 -0
  226. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
  227. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  228. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  229. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  230. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  231. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/package.json +0 -0
  232. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  233. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  234. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  235. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  236. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  237. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  238. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  239. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  240. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  241. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  242. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  243. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/site/public/robots.txt +0 -0
  244. /package/examples/{typography-presets → feature-demos/media-and-surfaces}/.astro/content-assets.mjs +0 -0
  245. /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/package.json +0 -0
  246. /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  247. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/settings.json +0 -0
  248. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/_metadata.json +0 -0
  249. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  250. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  251. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  252. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  253. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  254. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  255. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  256. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  257. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  258. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  259. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  260. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  261. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  262. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  263. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  264. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  265. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  266. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  267. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  268. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  269. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  270. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  271. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  272. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  273. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  274. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  275. /package/examples/{typography-presets → feature-demos/theme-presets}/site/public/robots.txt +0 -0
  276. /package/examples/{typography-presets/site/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/puppy-portrait.jpg +0 -0
  277. /package/examples/{typography-presets/site/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/shepherd-portrait.jpg +0 -0
  278. /package/examples/{typography-presets/site/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/white-puppy.jpg +0 -0
  279. /package/examples/{typography-presets/site/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/black-schnauzer.jpg +0 -0
  280. /package/examples/{typography-presets/site/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/retriever-portrait.jpg +0 -0
  281. /package/examples/{typography-presets/site/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/schnauzer-portrait.jpg +0 -0
  282. /package/examples/{typography-presets/site/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/boxer-portrait.jpg +0 -0
  283. /package/examples/{typography-presets/site/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grass-puppy.jpg +0 -0
  284. /package/examples/{typography-presets/site/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grey-street-dog.jpg +0 -0
  285. /package/examples/{typography-presets/site → feature-demos/theme-presets/site/routes/040-statement}/images/statement/black-pedigree.jpg +0 -0
  286. /package/examples/{typography-presets/site → feature-demos/theme-presets/site/routes/040-statement}/images/statement/sheepdog-grass.jpg +0 -0
  287. /package/examples/{typography-presets/site → feature-demos/theme-presets/site/routes/040-statement}/images/statement/sheepdog-wide.jpg +0 -0
@@ -0,0 +1,74 @@
1
+ # Sitewide Content
2
+
3
+ `site/sitewide-content.md` contains content and settings shared by the whole site. It
4
+ is separate from `content.md`, which defines the homepage, and from
5
+ `config.mjs`, which defines technical behaviour.
6
+
7
+ ## Site identity
8
+
9
+ Use the optional `navigation` object for identity shared by all pages. `brand`
10
+ is the text shown in the home link when no logo is present. A logo is discovered
11
+ from one convention-based file in `site/public`: `logo.svg`, `logo.png`,
12
+ `logo.jpg`, or `logo.jpeg`.
13
+
14
+ ```yaml
15
+ navigation:
16
+ brand: Example Site
17
+ logo:
18
+ alt: Example Site
19
+ height: 2.6rem
20
+ ```
21
+
22
+ If `navigation.brand` is omitted, Norna uses the homepage `title` from
23
+ `site/content.md`. The logo's width is derived from its intrinsic aspect ratio.
24
+ If both a logo and a brand are present, the logo is displayed and the brand is
25
+ used as its text fallback and accessible default.
26
+
27
+ ## Banners
28
+
29
+ Use `banners` for short notices shown above the page content on every route.
30
+ The list order controls the presentation order. Each banner needs a unique
31
+ `id`, a title and text:
32
+
33
+ ```yaml
34
+ ---
35
+ banners:
36
+ - id: project-status
37
+ tone: warning
38
+ visible:
39
+ from: "2026-08-01"
40
+ until: "2026-09-01"
41
+ title: Experimental code
42
+ text: Not for production use.
43
+ ---
44
+ ```
45
+
46
+ `visible` uses the same date-window rules as temporary sections. Visitors can
47
+ dismiss individual active banners. The dismissal is stored locally in the
48
+ browser and is tied to the banner content, so an edited banner can appear
49
+ again.
50
+
51
+ The first version supports the `warning` tone. Keep banner text short; banners
52
+ are presented as compact single-line notices and may use an ellipsis when the
53
+ text does not fit.
54
+
55
+ ## Footer
56
+
57
+ The footer is also sitewide content. `copyrightMessage` adds a copyright or
58
+ license sentence. `buildInfo` optionally adds a generated build timestamp:
59
+
60
+ ```yaml
61
+ footer:
62
+ copyrightMessage: (c) Example Artist.
63
+ buildInfo:
64
+ enabled: true
65
+ text: Built
66
+ dateTimeFormat:
67
+ locale: en-GB
68
+ timeZone: UTC
69
+ dateStyle: short
70
+ timeStyle: short
71
+ ```
72
+
73
+ If both the copyright message and enabled build information are absent, the
74
+ footer is not rendered.
package/docs/theme.md CHANGED
@@ -1,69 +1,95 @@
1
1
  # Theme
2
2
 
3
- `site/theme.md` defines optional site-wide visual defaults for a `norna` site.
4
- It uses YAML frontmatter and does not need a Markdown body. If the file is
5
- missing, built-in engine defaults are used.
3
+ `site/theme.md` defines the site-wide visual theme for a `norna` site. It uses
4
+ YAML frontmatter and does not need a Markdown body. The root theme file is
5
+ required. The normal setup selects one complete theme preset and adds only
6
+ focused overrides when needed.
6
7
 
7
- Page-level presentation in `site/content.md` and route page files is always an
8
- override on top of `site/theme.md`. Section-level presentation is an override
9
- on top of the resolved page presentation. Use those overrides for focused
10
- exceptions; the normal place for shared visual choices is `site/theme.md`.
8
+ An optional `theme.md` inside a route directory replaces the root visual theme
9
+ for that route. Shared identity such as brand and logo remains site-wide and
10
+ belongs in `sitewide-content.md`.
11
11
 
12
- ## Minimal Theme
12
+ ## Theme Presets
13
+
14
+ Available complete theme presets are:
15
+
16
+ - `portfolio`: restrained typography and a broad image area for image-led
17
+ presentation.
18
+ - `documentation`: reading-focused typography, a paper palette, and compact
19
+ structural rhythm.
20
+ - `project`: compact layout and a light presentation for project and product
21
+ sites.
22
+ - `statement`: airy spacing and stronger typography for short editorial
23
+ content.
24
+
25
+ A normal `theme.md` can be only:
13
26
 
14
27
  ```yaml
15
28
  ---
16
- navigation:
17
- brand: Example Site
29
+ preset: documentation
30
+ ---
31
+ ```
32
+
33
+ Each preset supplies coordinated values for:
34
+
35
+ - layout density, page width, and gutters
36
+ - managed image sizing
37
+ - font family, typography preset, and typography rhythm
38
+ - palette and section-surface behaviour
39
+
40
+ The nested `typography.preset` setting documented below is a lower-level
41
+ typography choice. A top-level theme `preset` selects the complete visual
42
+ system, including that typography choice.
43
+
44
+ ## Overrides
45
+
46
+ Values written beside the top-level preset override only that part of the
47
+ preset. Other preset values remain active:
48
+
49
+ ```yaml
50
+ ---
51
+ preset: documentation
18
52
  layout:
19
- density: normal
20
- pageWidth: 1180px
21
- gutter:
22
- desktop: clamp(1.25rem, 4vw, 3rem)
23
- mobile: 1rem
24
- gallery:
25
- width: 900px
26
- maxAvailableWidthPercent:
27
- desktop: 100
28
- mobile: 100
29
- maxAvailableHeightPercent:
30
- desktop: 74
31
- mobile: 68
32
- typography:
33
- fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
34
- preset: quiet-gallery
35
- rhythm: normal
53
+ pageWidth: 1320px
36
54
  presentation:
37
- backgroundColor: "#000000"
38
- textColor: "#f7f4ee"
39
- frame:
40
- colors: presentation
55
+ palette: dark
41
56
  ---
42
57
  ```
43
58
 
44
- Starter sites include a marked comment block such as
45
- `norna:start theme-help` / `norna:end theme-help`. The block is only
46
- explorable help text; YAML comments do not affect rendering. The active
47
- configuration is the uncommented YAML below it.
59
+ Nested objects are merged by key. Arrays such as
60
+ `presentation.sectionSurfaces.sequence` replace the preset array when they are
61
+ specified.
48
62
 
49
- ## Navigation
63
+ It is still valid to omit the top-level preset and define the visual settings
64
+ explicitly. Omitted explicit settings then use engine defaults. This is useful
65
+ for focused testing, but selecting a complete preset is the simpler normal
66
+ workflow.
50
67
 
51
- `navigation` is optional. It currently supports:
68
+ ## Export A Preset
52
69
 
53
- - `brand`: optional site-wide brand or home-link text shown in the site
54
- navigation.
70
+ Export the installed definition of a preset before choosing overrides:
55
71
 
56
- If `navigation.brand` is omitted, Norna uses the homepage `title` from
57
- `site/content.md`. Use `navigation.brand` when the homepage title is editorial
58
- or route-specific, but the navigation should keep a stable site name.
72
+ ```sh
73
+ norna theme:export documentation
74
+ ```
59
75
 
60
- Example:
76
+ In a generated site, the equivalent npm command is:
61
77
 
62
- ```yaml
63
- navigation:
64
- brand: Norna
78
+ ```sh
79
+ npm run norna:theme:export -- documentation
65
80
  ```
66
81
 
82
+ The command creates `site/orig-documentation-theme.md`, or the corresponding
83
+ path under the selected site directory. The file contains the preset values,
84
+ comments describing accepted alternatives, and an example of a fine-grained
85
+ typography override.
86
+
87
+ Norna never loads `orig-*-theme.md`; only `theme.md` is active. The export
88
+ command refuses to overwrite an existing reference file.
89
+
90
+ Site identity is not part of the visual theme. Define the optional navigation
91
+ brand and logo settings in `site/sitewide-content.md`; see [Sitewide Content](sitewide-content.md).
92
+
67
93
  ## Layout
68
94
 
69
95
  `layout` is optional. It controls the outer page geometry:
@@ -74,9 +100,9 @@ navigation:
74
100
  `desktop` / `mobile` values.
75
101
  - `density`: default structural spacing profile. Allowed values are `compact`,
76
102
  `normal`, and `airy`.
77
- - `spacing`: optional structural spacing overrides for sections and Norna
78
- managed media blocks. Every spacing value accepts either one CSS length for all
79
- viewports or `desktop` / `mobile` values.
103
+ - `spacing`: optional spacing overrides for sections and content blocks. Every
104
+ spacing value accepts either one CSS length for all viewports or `desktop` /
105
+ `mobile` values.
80
106
 
81
107
  Example:
82
108
 
@@ -94,6 +120,12 @@ layout:
94
120
  sectionGap:
95
121
  desktop: clamp(1.4rem, 3vw, 2.75rem)
96
122
  mobile: 1.5rem
123
+ headingToBlock:
124
+ desktop: 0.75em
125
+ mobile: 0.7em
126
+ blockGap:
127
+ desktop: 1.5em
128
+ mobile: 1.25em
97
129
  ```
98
130
 
99
131
  If omitted, Norna uses `1180px` for `pageWidth`, desktop
@@ -105,11 +137,20 @@ Spacing keys:
105
137
  - `firstSectionTop`: space above the first section heading.
106
138
  - `sectionGap`: space above each following section.
107
139
  - `finalSectionBottom`: space below the final section.
108
- - `bodyToImages`: space from section body text to Norna managed media blocks.
140
+ - `headingToBlock`: space between a section heading and its first visual content
141
+ block, such as an image stack, carousel, or card list.
142
+ - `blockGap`: space between content blocks in a section. It applies between
143
+ Markdown, image, carousel, and card-list blocks, but not after the final block.
109
144
  - `imageGap`: space between stacked images or carousel blocks.
110
145
 
111
- Text-near spacing, such as spacing after headings, spacing before Markdown
112
- subheadings, paragraph spacing, and caption spacing, belongs to
146
+ The default `compact`, `normal`, and `airy` density profiles provide values for
147
+ these spacing keys. The `em` values for `headingToBlock` and `blockGap` are
148
+ relative to the relevant text size, so the rhythm follows typography changes.
149
+ Use `sectionGap` and the other structural keys when the distance should describe
150
+ the page layout rather than the size of nearby text.
151
+
152
+ Text-near spacing inside Markdown, such as spacing after headings, spacing
153
+ before Markdown subheadings, paragraph spacing, and caption spacing, belongs to
113
154
  `typography.rhythm` and typography overrides.
114
155
 
115
156
  ## Image Sizing
@@ -153,18 +194,20 @@ Example:
153
194
  ```yaml
154
195
  typography:
155
196
  fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
156
- preset: quiet-gallery
197
+ preset: text-forward
157
198
  rhythm: normal
158
199
  overrides:
159
200
  headings:
160
201
  h2:
161
202
  size: medium
203
+ weight: 600
162
204
  spacingAfter: 0.55em
163
205
  h3:
164
206
  size: medium
165
207
  spacingBefore: 1.5em
166
208
  spacingAfter: 0.5em
167
209
  body:
210
+ width: narrow
168
211
  lineHeight: 1.55
169
212
  ```
170
213
 
@@ -174,107 +217,49 @@ selected site. See [Typography](typography.md).
174
217
 
175
218
  ## Presentation
176
219
 
177
- `presentation` is optional. It can contain:
220
+ `presentation` is optional. It selects a small built-in visual palette for the
221
+ page frame and defines how section surfaces are assigned:
178
222
 
179
- - `backgroundColor`: optional quoted hex color in `#rgb`, `#rrggbb`, or
180
- `#rrggbbaa` form.
181
- - `textColor`: optional quoted hex color in `#rgb`, `#rrggbb`, or
182
- `#rrggbbaa` form.
183
- - `inlineStyles`: optional named inline text styles.
223
+ - `palette`: `dark`, `light`, or `paper`. The palette controls the page,
224
+ navigation, footer, and section colors.
225
+ - `sectionSurfaces.mode`: `none` or `cycle`.
226
+ - `sectionSurfaces.sequence`: optional sequence of `base`, `soft`, and
227
+ `emphasis`. Each surface may occur at most once.
184
228
 
185
229
  Example:
186
230
 
187
231
  ```yaml
188
232
  presentation:
189
- backgroundColor: "#101418"
190
- textColor: "#f4f1ea"
191
- ```
192
-
193
- ## Page And Section Overrides
194
-
195
- Site-wide presentation belongs in `site/theme.md`. Page-level presentation in a
196
- page file is always an override on top of the theme:
197
-
198
- ```yaml
199
- presentation:
200
- typography:
201
- overrides:
202
- headings:
203
- h2:
204
- size: large
205
- spacingAfter: 0.6em
206
- body:
207
- paragraphSpacing: 1em
208
- ```
209
-
210
- Section-specific presentation belongs under
211
- `sections.<section-id>.presentation`. Use it when one section genuinely needs
212
- different presentation; do not use `sections` to define section order or normal
213
- Markdown structure.
214
-
215
- ```yaml
216
- sections:
217
- intro:
218
- presentation:
219
- backgroundColor: "#161616"
220
- textColor: "#ffffff"
221
- typography:
222
- preset: statement
233
+ palette: paper # Alternatives: dark, light
234
+ sectionSurfaces:
235
+ mode: cycle
236
+ sequence: [base, soft, emphasis]
223
237
  ```
224
238
 
225
- If a page omits `presentation`, it uses the theme presentation unchanged. If a
226
- section omits `presentation`, it uses the resolved page presentation.
227
-
228
- Configured section backgrounds render as full-width horizontal bands while the
229
- section content keeps the normal page and image widths. The top spacing
230
- before the first heading, the spacing between sections, and the spacing after
231
- the final section are part of the section background.
232
-
233
- Configured section text colors apply to section headings, Markdown text,
234
- Markdown subheadings, and image captions. Links keep the global accent color.
235
-
236
- ## Frame Colors
239
+ ## Route Themes
237
240
 
238
- `frame.colors` controls the sticky navigation and footer colors.
241
+ Add `theme.md` to a route directory when that route should have a different
242
+ visual expression:
239
243
 
240
- Allowed values:
241
-
242
- - `presentation`: use the resolved presentation colors for this level.
243
- - `theme`: use the site theme frame colors. This is useful in page-level
244
- frontmatter.
245
- - explicit colors:
246
-
247
- ```yaml
248
- frame:
249
- colors:
250
- backgroundColor: "#111111"
251
- textColor: "#eeeeee"
244
+ ```text
245
+ site/routes/010-guide/theme.md
252
246
  ```
253
247
 
254
- The sticky section navigation row and footer use the resolved frame colors, not
255
- section-specific presentation.
256
-
257
- ## Inline Styles
258
-
259
- `presentation.inlineStyles` defines named inline text styles that can be used
260
- from Markdown:
248
+ The route theme uses the same visual schema and complete presets as the root
249
+ theme. A route can therefore select a different expression without repeating a
250
+ large configuration:
261
251
 
262
252
  ```yaml
263
- presentation:
264
- inlineStyles:
265
- highlight:
266
- color: "#ffd84d"
253
+ ---
254
+ preset: statement
255
+ ---
267
256
  ```
268
257
 
269
- Inline style names must match `^[a-z][a-z0-9-]*$`. Each style currently
270
- supports a required `color` field using the same quoted hex color format as
271
- `textColor`.
272
-
273
- Apply an inline style in Markdown with `[text]{.style-name}`:
274
-
275
- ```md
276
- This sentence contains [highlighted text]{.highlight}.
277
- ```
258
+ It completely replaces the root visual theme for that route. If the route
259
+ theme selects no top-level preset, omitted values use engine defaults rather
260
+ than values from the root theme. It cannot define navigation, brand, logo, or
261
+ technical configuration.
278
262
 
279
- `content:check` fails if Markdown uses an inline style that is not defined in
280
- `site/theme.md` `presentation.inlineStyles`.
263
+ Section surfaces render as full-width horizontal bands while the section
264
+ content keeps the normal page and image widths. Links keep the palette's global
265
+ accent color.
@@ -3,12 +3,20 @@
3
3
  `norna` typography is configured in `site/theme.md` through a site-wide font,
4
4
  presets, text rhythm, and optional overrides.
5
5
 
6
- The normal place to choose a site-wide typography preset and rhythm is the
7
- top-level `typography` block in `site/theme.md`.
8
- Page and section files may override the theme when a focused exception is
9
- needed, but the normal workflow is to keep typography in `theme.md`.
6
+ The normal workflow is to select a complete top-level theme preset. It already
7
+ chooses a coordinated font, typography preset, and rhythm:
10
8
 
11
- ## Presets
9
+ ```yaml
10
+ ---
11
+ preset: documentation
12
+ ---
13
+ ```
14
+
15
+ Use the nested `typography` block only when those typographic choices need to
16
+ differ from the selected theme preset. Typography is configured at root-theme
17
+ or route-theme level, not in page or section content.
18
+
19
+ ## Typography Presets
12
20
 
13
21
  Available presets:
14
22
 
@@ -21,13 +29,25 @@ Available presets:
21
29
  - `statement`: tighter, more declarative line-height for short programmatic
22
30
  statements. Use it sparingly, usually as a page or section exception.
23
31
 
24
- If theme typography is omitted, `quiet-gallery` is used.
32
+ If a complete top-level theme preset is selected, that preset supplies the
33
+ typography choice. If both the top-level preset and nested typography are
34
+ omitted, the engine default is `quiet-gallery`.
25
35
 
26
- Presets define alignment, size, and line height for `headings.h1` through
27
- `headings.h4`, `body`, and `caption`. Built-in presets use `medium` as the
28
- default size for every text role. Visual heading hierarchy comes from the
29
- Markdown heading level, so `h1` is larger than `h2`, `h2` is larger than `h3`,
30
- and so on.
36
+ Presets define alignment, size, weight, and line height for `headings.h1`
37
+ through `headings.h4`, `body`, and `caption`. They also choose a readable body
38
+ text width. Built-in presets use `medium` as the default size for every text
39
+ role. Visual heading hierarchy comes from the Markdown heading level, so `h1`
40
+ is larger than `h2`, `h2` is larger than `h3`, and so on.
41
+
42
+ The presets use these controls deliberately:
43
+
44
+ - `quiet-gallery` uses restrained heading weights and a normal reading width.
45
+ - `compact-gallery` uses stronger headings and a wider text column for short,
46
+ scannable content.
47
+ - `text-forward` uses a narrower reading width and more generous body line
48
+ height.
49
+ - `statement` uses the strongest heading weights and a narrow text column for
50
+ short, declarative content.
31
51
 
32
52
  `rhythm` defines text-near spacing for headings, paragraphs, and captions.
33
53
  Available rhythms are `compact`, `normal`, and `airy`. Built-in rhythm values
@@ -62,12 +82,14 @@ typography:
62
82
  headings:
63
83
  h2:
64
84
  size: medium
85
+ weight: 600
65
86
  spacingAfter: 0.55em
66
87
  h3:
67
88
  size: medium
68
89
  spacingBefore: 1.5em
69
90
  spacingAfter: 0.5em
70
91
  body:
92
+ width: narrow
71
93
  paragraphSpacing: 0.8em
72
94
  caption:
73
95
  spacingBefore: 0.5em
@@ -104,56 +126,61 @@ follows the Markdown level the user wrote: `##` uses `headings.h2`.
104
126
  `spacingAfter`, and `paragraphSpacing` are CSS lengths such as `0`, `0.8em`,
105
127
  `1rem`, or `12px`. Use `em` for spacing that should track the text size.
106
128
 
129
+ `weight` is a controlled heading weight. Allowed values are `400`, `500`,
130
+ `600`, and `700`. `body.width` is the readable text width and accepts
131
+ `narrow`, `normal`, or `wide`. It controls the prose column, not the page's
132
+ maximum width or the width of image blocks.
133
+
107
134
  Supported override fields:
108
135
 
109
- - `headings.h1.align`, `headings.h1.size`, `headings.h1.lineHeight`,
136
+ - `headings.h1.align`, `headings.h1.size`, `headings.h1.weight`,
137
+ `headings.h1.lineHeight`,
110
138
  `headings.h1.spacingBefore`, `headings.h1.spacingAfter`
111
- - `headings.h2.align`, `headings.h2.size`, `headings.h2.lineHeight`,
139
+ - `headings.h2.align`, `headings.h2.size`, `headings.h2.weight`,
140
+ `headings.h2.lineHeight`,
112
141
  `headings.h2.spacingBefore`, `headings.h2.spacingAfter`
113
- - `headings.h3.align`, `headings.h3.size`, `headings.h3.lineHeight`,
142
+ - `headings.h3.align`, `headings.h3.size`, `headings.h3.weight`,
143
+ `headings.h3.lineHeight`,
114
144
  `headings.h3.spacingBefore`, `headings.h3.spacingAfter`
115
- - `headings.h4.align`, `headings.h4.size`, `headings.h4.lineHeight`,
145
+ - `headings.h4.align`, `headings.h4.size`, `headings.h4.weight`,
146
+ `headings.h4.lineHeight`,
116
147
  `headings.h4.spacingBefore`, `headings.h4.spacingAfter`
117
- - `body.align`, `body.size`, `body.lineHeight`, `body.paragraphSpacing`
148
+ - `body.align`, `body.size`, `body.width`, `body.lineHeight`,
149
+ `body.paragraphSpacing`
118
150
  - `caption.align`, `caption.size`, `caption.lineHeight`,
119
151
  `caption.spacingBefore`
120
152
 
121
- ## Inheritance
153
+ ## Route Themes
122
154
 
123
- Theme typography is the site-wide base:
155
+ The simplest route-specific typography change is to select a complete theme
156
+ preset:
124
157
 
125
158
  ```yaml
126
- # site/theme.md
127
- typography:
128
- fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
129
- preset: quiet-gallery
130
- rhythm: normal
159
+ # site/routes/010-introduction/theme.md
160
+ ---
161
+ preset: statement
162
+ ---
131
163
  ```
132
164
 
133
- A page-level `presentation.typography.preset` changes the typographic character
134
- for that page. A section-level
135
- `sections.<section-id>.presentation.typography.preset` changes the typographic
136
- character for that section. `rhythm` is inherited separately, so changing
137
- preset does not change spacing unless `rhythm` is also set.
138
-
139
- If a section sets `typography.rhythm`, that section changes text-near spacing.
140
- If a section only sets `typography.overrides`, it keeps the resolved page
141
- preset and rhythm and changes only the specified values.
165
+ A route-local `theme.md` replaces the root visual theme rather than inheriting
166
+ from it. The complete preset supplies a coherent route theme without repeating
167
+ the root values.
142
168
 
143
- Example section override:
169
+ Use a nested typography choice when only the typographic character needs to be
170
+ specified explicitly:
144
171
 
145
172
  ```yaml
146
- sections:
147
- intro:
148
- presentation:
149
- typography:
150
- preset: statement
151
- overrides:
152
- body:
153
- paragraphSpacing: 0.7em
173
+ # site/routes/010-introduction/theme.md
174
+ ---
175
+ typography:
176
+ preset: statement
177
+ rhythm: normal
178
+ ---
154
179
  ```
155
180
 
156
- Centered text uses narrower text widths. Left- or right-aligned heading and body
157
- text use the calculated image layout width so text edges line up with images
158
- after layout gutters and image limits are applied. Captions are normally
159
- centered.
181
+ Without a top-level theme preset, other omitted route-theme values use engine
182
+ defaults rather than values from the root theme.
183
+
184
+ The `body.width` value controls the prose column independently of the page and
185
+ image widths. Captions are normally centered, but `text-forward` uses
186
+ left-aligned captions to support longer explanatory text.
@@ -0,0 +1,41 @@
1
+ # Norna examples
2
+
3
+ Runnable examples are grouped by purpose.
4
+
5
+ ```text
6
+ examples/
7
+ |-- complete-sites/
8
+ | |-- dog-shelter-single-page/
9
+ | `-- dog-shelter-multi-page/
10
+ `-- feature-demos/
11
+ |-- theme-presets/
12
+ `-- media-and-surfaces/
13
+ ```
14
+
15
+ ## Complete sites
16
+
17
+ `complete-sites/` contains small sites that can be read as coherent examples
18
+ of a Norna project.
19
+
20
+ - `dog-shelter-single-page/` demonstrates a homepage made from sections.
21
+ - `dog-shelter-multi-page/` adds ordered routes and route-local content.
22
+
23
+ ## Feature demos
24
+
25
+ `feature-demos/` contains focused visual test benches. They are useful for
26
+ documentation, manual inspection and integration checks, but are not intended
27
+ as starter templates.
28
+
29
+ - `theme-presets/` compares Norna's complete built-in theme presets.
30
+ - `media-and-surfaces/` demonstrates managed media blocks, notes, palettes and
31
+ section surfaces.
32
+
33
+ The repository's GitHub Pages workflow publishes rendered copies under
34
+ `https://janga.github.io/norna/examples/` so the HTML documentation can link to
35
+ working sites rather than only their source files.
36
+
37
+ Run an example from the repository root by passing its `site/` directory:
38
+
39
+ ```sh
40
+ node bin/norna.mjs --site-dir examples/feature-demos/media-and-surfaces/site dev:local
41
+ ```