@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
package/README.md CHANGED
@@ -23,8 +23,9 @@ A `norna` site is file-driven:
23
23
  1. A site repository depends on this package.
24
24
  2. The site keeps technical settings, including public URL and optional URL
25
25
  base path, in `site/config.mjs`.
26
- 3. The site keeps site-wide visual theme defaults, including layout, image
27
- sizing, font, typography, colors, and frame colors, in `site/theme.md`.
26
+ 3. The site selects a complete visual preset, with optional focused overrides
27
+ for layout, image sizing, font, typography, palettes, and section surfaces,
28
+ in `site/theme.md`.
28
29
  4. The site keeps homepage content, Markdown section order, managed media
29
30
  blocks, alt text, captions, and optional section metadata in
30
31
  `site/content.md`.
@@ -81,6 +82,7 @@ Actions use the same engine version.
81
82
  - Publish under a GitHub Pages project path:
82
83
  [`site.basePath`](docs/configuration.md#sitebasepath)
83
84
  - Configure site-wide theme: [Theme](docs/theme.md)
85
+ - Export a theme preset for inspection: [`theme:export`](docs/commands.md#command-summary)
84
86
  - Add route pages: [Routes](docs/routes.md)
85
87
  - Set page width: [`layout.pageWidth`](docs/theme.md#layout)
86
88
  - Set side gutters: [`layout.gutter`](docs/theme.md#layout)
package/bin/norna-cli.mjs CHANGED
@@ -17,6 +17,7 @@ Commands:
17
17
  config:check Validate site/config.mjs
18
18
  content:check Validate site/content.md and image references
19
19
  content:sync Move misplaced Norna-managed images and refresh generated images
20
+ theme:export Export a commented theme preset reference
20
21
  typography presets Show built-in typography preset values
21
22
  typography show Show resolved typography for the selected site
22
23
  site:public Sync site/public/ to public/
@@ -131,6 +132,8 @@ try {
131
132
  } else if (command === 'content:sync') {
132
133
  await runScript('scripts/sync-content-sections.mjs', ['--write', ...rest]);
133
134
  await runScript('scripts/generate-images.mjs', rest);
135
+ } else if (command === 'theme:export') {
136
+ await runScript('scripts/export-theme-preset.mjs', rest);
134
137
  } else if (command === 'typography:presets' || (command === 'typography' && subcommand === 'presets')) {
135
138
  const scriptArgs = command === 'typography' ? subcommandRest : rest;
136
139
  await runScript('scripts/show-typography.mjs', ['presets', ...scriptArgs]);
package/docs/README.md CHANGED
@@ -10,13 +10,14 @@ For a site maintainer:
10
10
  1. [Getting Started](getting-started.md)
11
11
  2. [Site Structure](site-structure.md)
12
12
  3. [Theme](theme.md)
13
- 4. [Configuration](configuration.md)
14
- 5. [Content](content.md)
15
- 6. [Typography](typography.md)
16
- 7. [Routes](routes.md)
17
- 8. [Images And Metadata](images-and-metadata.md)
18
- 9. [Local Development](local-development.md)
19
- 10. [Publishing](publishing.md)
13
+ 4. [Sitewide Content](sitewide-content.md)
14
+ 5. [Configuration](configuration.md)
15
+ 6. [Content](content.md)
16
+ 7. [Typography](typography.md)
17
+ 8. [Routes](routes.md)
18
+ 9. [Images And Metadata](images-and-metadata.md)
19
+ 10. [Local Development](local-development.md)
20
+ 11. [Publishing](publishing.md)
20
21
 
21
22
  For a developer integrating or updating the engine:
22
23
 
@@ -37,13 +38,16 @@ For design and naming principles:
37
38
  For a quick reference:
38
39
 
39
40
  - [Configuration](configuration.md) describes technical `site/config.mjs`
40
- fields such as URL, base path, locale labels, footer, GitHub, and deploy
41
+ fields such as URL, base path, locale labels, GitHub, and deploy
41
42
  settings.
43
+ - [Sitewide Content](sitewide-content.md) describes shared site identity, banners
44
+ and footer content in `site/sitewide-content.md`.
42
45
  - [Content](content.md) describes page frontmatter, Markdown-authored
43
- sections, optional section metadata, managed media blocks, temporary
44
- sections, and content validation.
45
- - [Theme](theme.md) describes site-wide layout, layout density, image sizing,
46
- font, typography rhythm, presentation colors, frame colors, and inline styles.
46
+ sections, optional section metadata, managed media blocks, temporary sections,
47
+ and content validation.
48
+ - [Theme](theme.md) describes complete visual presets, focused overrides,
49
+ preset export, layout, image sizing, typography, palettes, and section
50
+ surfaces.
47
51
  - [Typography](typography.md) describes presets, rhythms, roles, overrides,
48
52
  inheritance, and inspection commands.
49
53
  - [Routes](routes.md) describes route files, slugs, route navigation, and
package/docs/commands.md CHANGED
@@ -25,6 +25,7 @@ norna dev:stop
25
25
  norna config:check
26
26
  norna content:check
27
27
  norna content:sync
28
+ norna theme:export <preset>
28
29
  norna typography presets
29
30
  norna typography show
30
31
  norna site:public
@@ -72,6 +73,7 @@ npm run norna:check
72
73
  npm run norna:config:check
73
74
  npm run norna:content:check
74
75
  npm run norna:sync
76
+ npm run norna:theme:export -- <preset>
75
77
  npm run norna:typography:presets
76
78
  npm run norna:typography:show
77
79
  npm run norna:public
@@ -106,6 +108,10 @@ should normally mean the repository's complete publishable artifact, while
106
108
  - `content:sync` / `norna:sync`: moves misplaced referenced image files after
107
109
  confirmation when the intended move is unambiguous. Moving files between the
108
110
  homepage and routes, or between routes, requires a clean Git working tree.
111
+ - `theme:export <preset>`: writes a protected, commented
112
+ `orig-<preset>-theme.md` reference under the selected site directory. The
113
+ available complete theme presets are `portfolio`, `documentation`,
114
+ `project`, and `statement`. Norna continues to load only `theme.md`.
109
115
  - `typography presets`: prints the exact built-in values for typography
110
116
  presets and rhythms.
111
117
  - `typography show`: prints the selected site's resolved typography for the
@@ -64,6 +64,7 @@ Visual configuration lives in `site/theme.md`, not `site/config.mjs`.
64
64
 
65
65
  Use [Theme](theme.md) for:
66
66
 
67
+ - complete theme presets and focused overrides
67
68
  - `layout.pageWidth`
68
69
  - `layout.gutter`
69
70
  - `layout.density`
@@ -72,7 +73,7 @@ Use [Theme](theme.md) for:
72
73
  - `gallery.maxAvailableHeightPercent`
73
74
  - `typography.fontFamily`
74
75
  - typography presets, rhythm, and overrides
75
- - presentation colors, inline styles, and frame colors
76
+ - presentation palettes and section surfaces
76
77
 
77
78
  ## Navigation
78
79
 
@@ -141,6 +142,10 @@ Fields:
141
142
  `Sections`.
142
143
  - `locale.labels.menu`: mobile menu summary text, default `Menu`.
143
144
  - `locale.labels.closeMenu`: reserved close-menu label, default `Close menu`.
145
+ - `locale.labels.dismissBanner`: banner dismissal button label, default
146
+ `Dismiss notice`.
147
+ - `locale.labels.siteBanners`: ARIA label for the banner stack, default
148
+ `Site notices`.
144
149
  - `locale.labels.gallery`: Norna managed media ARIA label prefix, default
145
150
  `Images`.
146
151
 
@@ -160,60 +165,11 @@ locale: {
160
165
  }
161
166
  ```
162
167
 
163
- ## Footer
168
+ ## Sitewide Content
164
169
 
165
- ### `footer.copyrightMessage`
166
-
167
- - Purpose: optional footer sentence.
168
- - Type: string.
169
- - Required: no.
170
- - Default: hidden.
171
- - Validation: if set, it must be a non-empty string. `undefined`, `null`, and
172
- `''` are treated as absent.
173
- - Consequence: footer rendering is enabled when this or enabled build info is
174
- present.
175
-
176
- ### `footer.buildInfo`
177
-
178
- - Purpose: optional footer build timestamp.
179
- - Type: object, `false`, `null`, or omitted.
180
- - Required: no.
181
- - Default: hidden.
182
- - Validation: object fields are validated when the object is present. `false`,
183
- `null`, or omission hides build info.
184
-
185
- Fields:
186
-
187
- - `footer.buildInfo.enabled`: boolean, default `true`.
188
- - `footer.buildInfo.text`: required non-empty string.
189
- - `footer.buildInfo.dateTimeFormat`: required object.
190
- - `footer.buildInfo.dateTimeFormat.locale`: required string.
191
- - `footer.buildInfo.dateTimeFormat.timeZone`: required string.
192
- - `footer.buildInfo.dateTimeFormat.dateStyle`: required string.
193
- - `footer.buildInfo.dateTimeFormat.timeStyle`: required string.
194
-
195
- The date/time object must be accepted by `Intl.DateTimeFormat`.
196
-
197
- Example:
198
-
199
- ```js
200
- footer: {
201
- copyrightMessage: '(c) Example Artist.',
202
- buildInfo: {
203
- enabled: true,
204
- text: 'Built',
205
- dateTimeFormat: {
206
- locale: 'en-GB',
207
- timeZone: 'UTC',
208
- dateStyle: 'short',
209
- timeStyle: 'short',
210
- },
211
- },
212
- }
213
- ```
214
-
215
- If both `footer.copyrightMessage` and enabled `footer.buildInfo` are absent, the
216
- footer is not rendered.
170
+ Shared site identity, banners and footer content are defined in
171
+ `site/sitewide-content.md`. See [Sitewide Content](sitewide-content.md) for the
172
+ schema and examples.
217
173
 
218
174
  ## GitHub
219
175
 
package/docs/content.md CHANGED
@@ -18,9 +18,6 @@ The Astro content schema validates these top-level fields in page files:
18
18
  - `title`: required string. Rendered as the document title.
19
19
  - `description`: required string. Rendered as the meta description.
20
20
  - `navigation`: optional page navigation metadata. See [Routes](routes.md).
21
- - `presentation`: optional page-level presentation overrides. See
22
- [Theme](theme.md) and [Typography](typography.md).
23
- - `frame`: optional page-level frame color source. See [Theme](theme.md).
24
21
  - `sections`: optional section metadata keyed by section id.
25
22
 
26
23
  Minimal homepage:
@@ -71,16 +68,18 @@ current section, not new sections.
71
68
  ## Section Metadata
72
69
 
73
70
  Use `sections` only when a section needs structured metadata that is not
74
- naturally expressed by Markdown, such as visibility or presentation overrides.
71
+ naturally expressed by Markdown. Currently this is date-based visibility.
75
72
 
76
73
  ```yaml
77
74
  sections:
78
75
  work:
79
- presentation:
80
- typography:
81
- preset: statement
76
+ visible:
77
+ from: "2026-08-01"
78
+ until: "2026-09-16"
82
79
  ```
83
80
 
81
+ See [Temporary Sections](#temporary-sections) for visibility semantics.
82
+
84
83
  Each `sections.<section-id>` key must match a Markdown heading id in the same
85
84
  page file:
86
85
 
@@ -270,14 +269,16 @@ NORNA_TODAY=2026-08-15 npm run norna:build
270
269
 
271
270
  ## Markdown Text
272
271
 
273
- Inline styles use this Markdown form:
272
+ Use ordinary Markdown for emphasis and structure:
274
273
 
275
274
  ```md
276
- This sentence contains [highlighted text]{.highlight}.
275
+ This sentence contains **important text** and *emphasised text*.
277
276
  ```
278
277
 
279
- Inline style definitions live in `site/theme.md`. See
280
- [Theme](theme.md#inline-styles).
278
+ Norna intentionally does not support arbitrary inline color or style classes.
279
+ Deprecated syntax such as `[highlighted text]{.yellow}` is rejected by
280
+ `content:check`. Keep the route visually coherent through its `theme.md`
281
+ instead of styling individual phrases.
281
282
 
282
283
  ## Validation And Sync
283
284
 
@@ -289,27 +290,25 @@ npm run norna:content:check
289
290
 
290
291
  This checks section heading ids, section metadata, duplicate image names,
291
292
  missing image files, misplaced referenced images, duplicate image references,
292
- invalid managed media blocks, unreferenced images, undefined inline styles,
293
+ invalid managed media blocks, unreferenced images, removed inline style syntax,
293
294
  Markdown image references to unmanaged local files, and common frontmatter
294
295
  indentation and structure mistakes.
295
296
 
296
297
  Frontmatter uses YAML indentation. Use ordinary spaces, not tabs or
297
298
  non-breaking spaces. `content:check` reports a focused error when indentation is
298
299
  invalid, when a key is indented under a line that already has a value, or when a
299
- known nested key such as section-specific `typography` appears at the top
300
- level:
300
+ known nested key appears at the top level:
301
301
 
302
302
  ```yaml
303
- presentation:
304
- typography:
305
- preset: quiet-gallery
306
- overrides:
307
- body:
308
- paragraphSpacing: 0.8em
303
+ sections:
304
+ intro:
305
+ visible:
306
+ from: "2026-08-01"
309
307
  ```
310
308
 
311
309
  Top-level page frontmatter may contain only `title`, `description`,
312
- `navigation`, `presentation`, `frame`, and `sections`.
310
+ `navigation`, and `sections`. Visual settings belong in the root or route-local
311
+ `theme.md`.
313
312
 
314
313
  Run:
315
314
 
@@ -67,6 +67,8 @@ Diagrams must match the current Norna model:
67
67
 
68
68
  - A Norna site is described with site files, not arbitrary project structure.
69
69
  - `content.md` is the homepage content file.
70
+ - `sitewide-content.md` contains shared site identity, banners, and footer
71
+ content.
70
72
  - Additional pages are route directories with `route-content.md`.
71
73
  - Route folder prefixes control route presentation order.
72
74
  - Route ids become default URL slugs.
@@ -10,7 +10,8 @@ files are product documentation, which files are examples, and which files are
10
10
  test fixtures.
11
11
 
12
12
  The repository grew from one local demo, one starter, and a set of tests. The
13
- current structure keeps those roles separate.
13
+ current structure keeps those roles distinct while allowing runnable examples
14
+ to serve as documentation and realistic integration tests.
14
15
 
15
16
  ## Terms
16
17
 
@@ -26,8 +27,8 @@ site repository. It should not be a showcase for every feature.
26
27
  An example site is a runnable site that demonstrates one or more features.
27
28
 
28
29
  Examples can be richer than the starter. They may show routes, navigation,
29
- typography presets, typography rhythms, image stacks, image carousels, inline
30
- styles, and site-specific configuration choices.
30
+ complete theme presets, image stacks, image carousels, cards, notes, surfaces,
31
+ and site-specific configuration choices.
31
32
 
32
33
  ### Documentation Site
33
34
 
@@ -54,26 +55,37 @@ A fixture is test data.
54
55
  It should be minimal, stable, and optimized for regression tests rather than
55
56
  for human reading or visual appeal.
56
57
 
57
- ## Intended Direction
58
+ ## Repository Structure
58
59
 
59
60
  Runnable site examples are collected under `examples/`:
60
61
 
61
62
  ```text
62
63
  examples/
63
- dog-gallery/
64
- routes-demo/
65
- typography-demo/
64
+ complete-sites/
65
+ dog-shelter-single-page/
66
+ dog-shelter-multi-page/
67
+ feature-demos/
68
+ theme-presets/
69
+ media-and-surfaces/
66
70
  ```
67
71
 
68
- Only `dog-gallery/` exists today. Additional examples should be added when
69
- they demonstrate a distinct feature or workflow.
72
+ `complete-sites/` contains coherent sites that show how Norna files work
73
+ together in a realistic project:
70
74
 
71
- - `dog-gallery/`: current local visual demo, manual inspection site, and
72
- navigation diagnostic target.
73
- - `routes-demo/`: focused route/navigation example if the dog example becomes
74
- too broad.
75
- - `typography-demo/`: focused typography preset, rhythm, and override example
76
- if needed.
75
+ - `dog-shelter-single-page/`: sections and managed images without routes.
76
+ - `dog-shelter-multi-page/`: ordered routes with route-local content and
77
+ images.
78
+
79
+ `feature-demos/` contains focused visual test benches:
80
+
81
+ - `theme-presets/`: one route per complete built-in theme preset, without
82
+ overrides.
83
+ - `media-and-surfaces/`: managed media blocks, notes, palettes and section
84
+ surfaces. This is also the broad demo-build and navigation-test target.
85
+
86
+ The repository Pages workflow builds all four examples and publishes them
87
+ under `/norna/examples/`. The HTML documentation links to those rendered sites
88
+ from its Examples route.
77
89
 
78
90
  The repository-local `site/` directory is reserved for the documentation site.
79
91
  `docs/` should remain for reference documentation. It should link to the
@@ -82,8 +94,8 @@ documentation site when visual explanation is more useful than reference text.
82
94
  `starters/basic/` stays separate from examples because it is copied by
83
95
  `norna init`. It should stay small and conservative.
84
96
 
85
- Fixtures may either stay under `fixtures/` or move under a clearly named test
86
- area later. They should not be confused with examples.
97
+ Fixtures stay under `fixtures/`. They are intentionally smaller and more stable
98
+ than examples and should not be confused with user-facing sites.
87
99
 
88
100
  ## Constraints
89
101
 
@@ -91,11 +103,10 @@ area later. They should not be confused with examples.
91
103
  - Do not make the documentation site the only documentation.
92
104
  - Do not let examples become required input for production site repositories.
93
105
  - Keep `norna init` deterministic and easy to test.
94
- - Keep engine tests using stable fixtures, not visually evolving demo content.
95
-
96
- ## Open Decisions
106
+ - Use examples for build, navigation and visual integration tests where the
107
+ user-facing site is the behavior being protected.
108
+ - Use fixtures for isolated edge cases, invalid input and narrowly scoped
109
+ engine regressions.
97
110
 
98
- - Whether the documentation site should be published anywhere, or exist only as
99
- a local/example build.
100
- - How local example selection should work when there are multiple runnable
101
- examples.
111
+ The repository-local `site/` remains the product documentation site and is not
112
+ an example or fixture.
@@ -19,8 +19,8 @@ This document is for work on the reusable `norna` package itself.
19
19
  - `tests/`: Playwright navigation diagnostics.
20
20
  - `fixtures/basic/site/`: minimal site used for engine checks.
21
21
  - `starters/basic/`: copyable site starter.
22
- - `examples/dog-gallery/site/`: visual dog example used by demo builds and
23
- navigation diagnostics.
22
+ - `examples/feature-demos/media-and-surfaces/site/`: broad visual example used
23
+ by demo builds and navigation diagnostics.
24
24
 
25
25
  The repository-local `site/` directory is reserved for a local documentation
26
26
  site. It is useful for dogfooding `norna` documentation, but it is not the
@@ -34,11 +34,18 @@ Run focused checks while developing:
34
34
  npm run test:content-check
35
35
  npm run test:site-public
36
36
  npm run test:fixture:build
37
+ npm run test:examples
37
38
  npm run demo:build
38
39
  npm run package:check
39
40
  ```
40
41
 
41
- `npm run test` runs the standard non-demo check sequence.
42
+ `npm run test:examples` builds every complete site and feature demo under
43
+ `examples/`. `npm run test` includes those builds in the standard check
44
+ sequence.
45
+
46
+ `npm run build:pages` is specific to this repository. It builds the
47
+ documentation site and assembles rendered examples under `dist/examples/` for
48
+ the shared GitHub Pages artifact. It is not a generic Norna site command.
42
49
 
43
50
  The root `site/` directory is the documentation site. Use the ordinary local
44
51
  commands for it:
@@ -48,12 +55,11 @@ npm run dev:local
48
55
  npm run build
49
56
  ```
50
57
 
51
- The dog example remains the visual demo and navigation diagnostic target:
58
+ The media-and-surfaces feature demo is the broad visual and navigation
59
+ diagnostic target:
52
60
 
53
61
  ```sh
54
- cd examples/dog-gallery/site
55
- node ../../../bin/norna.mjs dev:local
56
- cd ../../..
62
+ node bin/norna.mjs --site-dir examples/feature-demos/media-and-surfaces/site dev:local
57
63
  npm run demo:build
58
64
  ```
59
65
 
@@ -57,6 +57,7 @@ The starter contains:
57
57
  - `.github/workflows/deploy.yml` for GitHub Pages
58
58
  - `site/config.mjs`
59
59
  - `site/theme.md`
60
+ - `site/sitewide-content.md`
60
61
  - `site/content.md`
61
62
  - `site/public/robots.txt`
62
63
 
@@ -88,21 +89,21 @@ Relevant documentation: [Commands](commands.md), [Site Structure](site-structure
88
89
  ## First Edits
89
90
 
90
91
  1. Edit `site/config.mjs` for the site's URL, language labels, GitHub
91
- repository, footer, and deploy settings.
92
- 2. Edit `site/theme.md` for site-wide layout, layout density, typography
93
- rhythm, image sizing, font, typography preset, colors, inline styles, and
94
- frame colors, or omit it to use engine defaults.
95
- 3. Edit `site/content.md` for homepage title, description, Markdown sections,
96
- text, Norna managed media blocks, page/section presentation overrides, alt
97
- text, and captions.
98
- 4. Put source images under `site/images/<section-id>/`, where `<section-id>`
92
+ repository, and deploy settings.
93
+ 2. Edit `site/sitewide-content.md` for the shared brand or logo, banners and
94
+ footer content.
95
+ 3. Keep `site/theme.md` and select a complete theme preset. Add focused visual
96
+ overrides only when the preset needs adjustment.
97
+ 4. Edit `site/content.md` for homepage title, description, Markdown sections,
98
+ text, Norna managed media blocks, alt text, and captions.
99
+ 5. Put source images under `site/images/<section-id>/`, where `<section-id>`
99
100
  matches a `## Section {#section-id}` heading in `site/content.md`.
100
- 5. Add optional route pages under
101
+ 6. Add optional route pages under
101
102
  `site/routes/<NNN-route-id>/route-content.md`, for example
102
103
  `site/routes/010-about/route-content.md`.
103
- 6. Put static files such as `robots.txt`, `CNAME`, and favicons under
104
+ 7. Put static files such as `robots.txt`, `CNAME`, and favicons under
104
105
  `site/public/`.
105
- 7. Run:
106
+ 8. Run:
106
107
 
107
108
  ```sh
108
109
  npm run norna:config:check
@@ -122,6 +123,42 @@ publishing.
122
123
  Relevant documentation: [Content](content.md), [Theme](theme.md),
123
124
  [Typography](typography.md), [Routes](routes.md), [Images And Metadata](images-and-metadata.md).
124
125
 
126
+ ## Choose A Theme
127
+
128
+ The required root `theme.md` can be deliberately short:
129
+
130
+ ```yaml
131
+ ---
132
+ preset: project
133
+ ---
134
+ ```
135
+
136
+ Available complete presets are `portfolio`, `documentation`, `project`, and
137
+ `statement`. They coordinate layout, image sizing, font, typography, spacing,
138
+ palette, and section surfaces.
139
+
140
+ Override only what the site needs to change:
141
+
142
+ ```yaml
143
+ ---
144
+ preset: project
145
+ layout:
146
+ pageWidth: 1240px
147
+ ---
148
+ ```
149
+
150
+ Export a commented reference for a preset with:
151
+
152
+ ```sh
153
+ npm run norna:theme:export -- project
154
+ ```
155
+
156
+ The generated `site/orig-project-theme.md` is reference material and is not
157
+ loaded by Norna. The command does not overwrite an existing reference file.
158
+
159
+ Relevant documentation: [Theme](theme.md), [Typography](typography.md),
160
+ [Commands](commands.md).
161
+
125
162
  ## Configure The Public URL
126
163
 
127
164
  For a custom domain or any site published at the web root, use:
@@ -157,13 +194,13 @@ Read [Site Structure](site-structure.md), [Content](content.md),
157
194
  [Theme](theme.md), [Typography](typography.md), [Routes](routes.md), and
158
195
  [Configuration](configuration.md) before publishing a real site.
159
196
 
160
- To change the site's maximum page width, side gutters, layout density,
161
- typography rhythm, image width, image height limits, font, colors, or
162
- site-wide typography preset, edit `site/theme.md`. See [Theme](theme.md) for
163
- the accepted shape.
197
+ To change the site's overall visual expression, select a top-level preset in
198
+ `site/theme.md`. Override individual page-width, gutter, image, typography, or
199
+ palette values only where needed. See [Theme](theme.md) for the accepted shape.
164
200
 
165
- To change one page or section, add a focused `presentation.typography`
166
- override in `site/content.md`. See [Typography](typography.md). Use
167
- `norna typography presets` to inspect the installed preset and rhythm values and
168
- `norna typography show` to inspect the resolved typography for the selected
201
+ To give a route a different visual expression, add a route-local `theme.md`
202
+ and normally select another complete top-level preset. See
203
+ [Theme](theme.md#route-themes) and [Typography](typography.md).
204
+ Use `norna typography presets` to inspect the installed preset and rhythm values
205
+ and `norna typography show` to inspect the resolved typography for the selected
169
206
  site.
package/docs/routes.md CHANGED
@@ -4,14 +4,16 @@
4
4
  under `site/routes/<NNN-route-id>/route-content.md` and build to first-level
5
5
  URLs.
6
6
 
7
- Routes use the same page frontmatter, optional section metadata, Norna managed
8
- media blocks, and Markdown section model as the homepage. See
9
- [Content](content.md) for the page and section model.
7
+ Routes use the same page frontmatter, optional section metadata, Norna-managed
8
+ media blocks, and Markdown section model as the homepage. See [Content](content.md)
9
+ for the page and section model.
10
10
 
11
11
  Route directories can contain route content, route-local images, and
12
- route-local presentation overrides in `route-content.md`. They cannot contain
13
- technical site configuration; technical configuration stays at the selected
14
- site directory's top-level `config.mjs`.
12
+ an optional route-local `theme.md`. The route theme replaces the root visual
13
+ theme for that route and can select any complete top-level theme preset. Route
14
+ directories cannot contain technical site
15
+ configuration; technical configuration stays in the selected site directory's
16
+ top-level `config.mjs`.
15
17
 
16
18
  ## Route Directory Format
17
19
 
@@ -11,6 +11,7 @@ The selected site directory defaults to `site/`:
11
11
  site/
12
12
  |-- config.mjs
13
13
  |-- theme.md
14
+ |-- sitewide-content.md
14
15
  |-- content.md
15
16
  |-- images/
16
17
  | `-- <section-id>/
@@ -30,17 +31,19 @@ site directory. Without an explicit site directory, commands first accept the
30
31
  current directory when it contains both `config.mjs` and `content.md`.
31
32
  Otherwise, commands started from a subdirectory walk upward until they find the
32
33
  default `site/` directory containing those files.
33
- `theme.md` is optional; omit it to use the engine's built-in visual defaults.
34
+ `theme.md` is required. It can contain only a complete preset selection.
34
35
 
35
36
  ## Versioned Source Files
36
37
 
37
38
  Version these files in a site repository:
38
39
 
39
40
  - `site/config.mjs`: technical site configuration.
40
- - `site/theme.md`: optional site-wide visual theme, including layout, spacing,
41
- image sizing, font, typography defaults, colors, inline styles, and frame
42
- colors.
41
+ - `site/theme.md`: required site-wide visual theme. It normally selects a
42
+ complete preset and may add focused layout, image, typography, palette, or
43
+ section-surface overrides.
43
44
  See [Theme](theme.md).
45
+ - `site/sitewide-content.md`: shared site identity, banners and footer content.
46
+ See [Sitewide Content](sitewide-content.md).
44
47
  - `site/content.md`: homepage page file with editable content, Markdown
45
48
  sections, optional section metadata, managed media blocks, alt text, and
46
49
  captions.
@@ -88,6 +91,8 @@ In this repository:
88
91
  - `starters/project/` is a project-site starter used as a maintained example
89
92
  for small project and developer-tool sites.
90
93
  - `fixtures/basic/site/` is used by engine regression tests.
91
- - `examples/dog-gallery/site/` is the local visual dog example used by demo
92
- builds and navigation diagnostics.
94
+ - `examples/feature-demos/media-and-surfaces/site/` is the broad visual example
95
+ used by demo builds and navigation diagnostics.
96
+ - `examples/complete-sites/` contains coherent sites, while
97
+ `examples/feature-demos/` contains focused visual test benches.
93
98
  - `site/` is reserved for the local documentation site.