@janga/norna 0.7.10 → 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 (312) hide show
  1. package/README.md +4 -2
  2. package/bin/norna-cli.mjs +3 -0
  3. package/docs/README.md +3 -2
  4. package/docs/commands.md +6 -0
  5. package/docs/configuration.md +1 -0
  6. package/docs/content.md +14 -14
  7. package/docs/design/site-examples-structure.md +35 -24
  8. package/docs/engine-development.md +13 -7
  9. package/docs/getting-started.md +44 -9
  10. package/docs/routes.md +2 -1
  11. package/docs/site-structure.md +8 -5
  12. package/docs/theme.md +86 -34
  13. package/docs/typography.md +32 -17
  14. package/examples/README.md +41 -0
  15. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/sitewide.schema.json +24 -0
  16. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/theme.schema.json +9 -24
  17. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -0
  18. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev-local.json +2 -2
  19. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev.json +2 -2
  20. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +53 -0
  21. package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +5 -0
  22. package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/README.md +1 -1
  23. package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/_metadata.json +13 -7
  24. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +18 -0
  25. package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/config.mjs +5 -2
  26. package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/README.md +1 -1
  27. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +18 -0
  28. package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/site/config.mjs +5 -2
  29. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +59 -0
  30. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +138 -0
  31. package/examples/{dog-gallery → feature-demos/media-and-surfaces}/.astro/collections/theme.schema.json +151 -68
  32. package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +1 -0
  33. package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +183 -0
  34. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -0
  35. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +11 -0
  36. package/examples/feature-demos/media-and-surfaces/.astro/settings.json +5 -0
  37. package/examples/feature-demos/media-and-surfaces/README.md +15 -0
  38. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +74 -0
  39. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  40. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  41. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  42. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  43. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  44. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  45. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  46. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  47. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  48. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  49. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  50. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  51. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  52. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  53. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  54. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  55. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  56. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  57. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  58. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  59. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  60. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  61. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  62. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  63. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  64. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  65. package/examples/{presentation → feature-demos/media-and-surfaces}/site/.norna/generated-images.json +16 -16
  66. package/examples/{presentation → feature-demos/media-and-surfaces}/site/config.mjs +4 -3
  67. package/examples/{presentation → feature-demos/media-and-surfaces}/site/content.md +12 -15
  68. package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/route-content.md +11 -3
  69. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/theme.md +3 -0
  70. package/examples/{presentation/site/routes/030-surfaces → feature-demos/media-and-surfaces/site/routes/020-surfaces}/theme.md +1 -0
  71. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.md +6 -0
  72. package/examples/feature-demos/media-and-surfaces/site/theme.md +3 -0
  73. package/examples/feature-demos/theme-presets/.astro/collections/site.schema.json +59 -0
  74. package/examples/feature-demos/theme-presets/.astro/collections/sitewide.schema.json +138 -0
  75. package/examples/feature-demos/theme-presets/.astro/collections/theme.schema.json +755 -0
  76. package/examples/feature-demos/theme-presets/.astro/content-modules.mjs +1 -0
  77. package/examples/{dog-gallery → feature-demos/theme-presets}/.astro/content.d.ts +8 -0
  78. package/examples/{typography-presets → feature-demos/theme-presets}/.astro/data-store.json +1 -1
  79. package/examples/feature-demos/theme-presets/.astro/dev-local.json +8 -0
  80. package/examples/feature-demos/theme-presets/.astro/dev.json +15 -0
  81. package/examples/feature-demos/theme-presets/.astro/dev.log +127 -0
  82. package/examples/feature-demos/theme-presets/.astro/types.d.ts +2 -0
  83. package/examples/feature-demos/theme-presets/README.md +14 -0
  84. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js +1389 -0
  85. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  86. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/package.json +3 -0
  87. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  88. package/examples/{typography-presets → feature-demos/theme-presets}/site/.norna/generated-images.json +45 -45
  89. package/examples/{typography-presets → feature-demos/theme-presets}/site/config.mjs +4 -3
  90. package/examples/feature-demos/theme-presets/site/content.md +17 -0
  91. package/examples/{typography-presets/site/routes/010-quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio}/route-content.md +8 -8
  92. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/theme.md +3 -0
  93. package/examples/{typography-presets/site/routes/020-compact-gallery → feature-demos/theme-presets/site/routes/020-documentation}/route-content.md +8 -8
  94. package/examples/feature-demos/theme-presets/site/routes/020-documentation/theme.md +3 -0
  95. package/examples/{typography-presets/site/routes/030-text-forward → feature-demos/theme-presets/site/routes/030-project}/route-content.md +8 -8
  96. package/examples/feature-demos/theme-presets/site/routes/030-project/theme.md +3 -0
  97. package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/route-content.md +3 -3
  98. package/examples/feature-demos/theme-presets/site/routes/040-statement/theme.md +3 -0
  99. package/examples/{typography-presets → feature-demos/theme-presets}/site/sitewide-content.md +1 -1
  100. package/examples/feature-demos/theme-presets/site/theme.md +3 -0
  101. package/package.json +7 -3
  102. package/scripts/build-pages.mjs +71 -0
  103. package/scripts/check-config.mjs +2 -1
  104. package/scripts/export-theme-preset.mjs +31 -0
  105. package/scripts/init-site.mjs +1 -0
  106. package/scripts/lib/example-sites.mjs +34 -0
  107. package/scripts/lib/presentation.mjs +6 -5
  108. package/scripts/lib/project-config.mjs +2 -1
  109. package/scripts/lib/site-content.mjs +2 -2
  110. package/scripts/lib/theme-config.mjs +3 -0
  111. package/scripts/lib/theme-presets.mjs +209 -0
  112. package/scripts/show-typography.mjs +6 -5
  113. package/scripts/test-engine-commands.mjs +1 -0
  114. package/scripts/test-examples.mjs +15 -0
  115. package/scripts/test-navigation.mjs +73 -45
  116. package/scripts/test-theme-presets.mjs +151 -0
  117. package/src/components/SitePage.astro +2 -2
  118. package/src/content.config.ts +2 -0
  119. package/src/styles/global.css +2 -0
  120. package/starters/basic/package.json +1 -0
  121. package/starters/project/package.json +1 -0
  122. package/examples/dog-gallery/.astro/collections/site.schema.json +0 -776
  123. package/examples/dog-gallery/.astro/data-store.json +0 -1
  124. package/examples/dog-gallery/.astro/dev-local.json +0 -8
  125. package/examples/dog-gallery/.astro/dev.json +0 -13
  126. package/examples/dog-gallery/.astro/dev.log +0 -95
  127. package/examples/dog-gallery/.astro/settings.json +0 -5
  128. package/examples/dog-gallery/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +0 -1
  129. package/examples/dog-gallery/dist/_astro/SitePage.DicGh_5N.css +0 -1
  130. package/examples/dog-gallery/dist/dog-care/index.html +0 -15
  131. package/examples/dog-gallery/dist/dog-shelter-logo.svg +0 -14
  132. package/examples/dog-gallery/dist/favicon.svg +0 -7
  133. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp +0 -0
  134. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp +0 -0
  135. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp +0 -0
  136. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp +0 -0
  137. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp +0 -0
  138. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp +0 -0
  139. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp +0 -0
  140. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp +0 -0
  141. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1080.webp +0 -0
  142. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp +0 -0
  143. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1920.webp +0 -0
  144. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-3939.webp +0 -0
  145. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-480.webp +0 -0
  146. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-768.webp +0 -0
  147. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp +0 -0
  148. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp +0 -0
  149. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp +0 -0
  150. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-2400.webp +0 -0
  151. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp +0 -0
  152. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp +0 -0
  153. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp +0 -0
  154. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp +0 -0
  155. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp +0 -0
  156. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp +0 -0
  157. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-768.webp +0 -0
  158. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp +0 -0
  159. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp +0 -0
  160. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp +0 -0
  161. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-2576.webp +0 -0
  162. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp +0 -0
  163. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp +0 -0
  164. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1080.webp +0 -0
  165. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp +0 -0
  166. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-480.webp +0 -0
  167. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-768.webp +0 -0
  168. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp +0 -0
  169. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp +0 -0
  170. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp +0 -0
  171. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp +0 -0
  172. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp +0 -0
  173. package/examples/dog-gallery/dist/index.html +0 -45
  174. package/examples/dog-gallery/site/.norna/generated-images.json +0 -226
  175. package/examples/dog-gallery/site/config.mjs +0 -47
  176. package/examples/dog-gallery/site/content.md +0 -127
  177. package/examples/dog-gallery/site/images/black-dogs/black-puppy-meadow.png +0 -0
  178. package/examples/dog-gallery/site/images/black-dogs/photo-of-a-black-dog.jpg +0 -0
  179. package/examples/dog-gallery/site/images/brown-dogs/brown-dog.jpg +0 -0
  180. package/examples/dog-gallery/site/images/brown-dogs/dog-accompanies-master.jpg +0 -0
  181. package/examples/dog-gallery/site/images/golden-dogs/golden-retriever.jpg +0 -0
  182. package/examples/dog-gallery/site/images/golden-dogs/toller-puppy.jpg +0 -0
  183. package/examples/dog-gallery/site/images/white-dogs/white-cute-dog.jpg +0 -0
  184. package/examples/dog-gallery/site/images/white-dogs/white-puppy-garden.png +0 -0
  185. package/examples/dog-gallery/site/public/favicon.svg +0 -7
  186. package/examples/dog-gallery/site/public/logo.svg +0 -14
  187. package/examples/dog-gallery/site/public/robots.txt +0 -2
  188. package/examples/dog-gallery/site/routes/010-dog-care/route-content.md +0 -38
  189. package/examples/dog-gallery/site/sitewide-content.md +0 -16
  190. package/examples/dog-gallery/site/theme.md +0 -101
  191. package/examples/presentation/README.md +0 -15
  192. package/examples/presentation/site/public/robots.txt +0 -2
  193. package/examples/presentation/site/routes/010-presets/route-content.md +0 -63
  194. package/examples/presentation/site/routes/010-presets/theme.md +0 -4
  195. package/examples/presentation/site/routes/020-media/theme.md +0 -4
  196. package/examples/presentation/site/sitewide-content.md +0 -6
  197. package/examples/presentation/site/theme.md +0 -43
  198. package/examples/typography-presets/.astro/dev.log +0 -45
  199. package/examples/typography-presets/site/content.md +0 -16
  200. package/examples/typography-presets/site/routes/010-quiet-gallery/theme.md +0 -4
  201. package/examples/typography-presets/site/routes/020-compact-gallery/theme.md +0 -4
  202. package/examples/typography-presets/site/routes/030-text-forward/theme.md +0 -4
  203. package/examples/typography-presets/site/routes/040-statement/theme.md +0 -4
  204. package/examples/typography-presets/site/theme.md +0 -43
  205. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/site.schema.json +0 -0
  206. /package/examples/{dog-gallery/.astro/content-modules.mjs → complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs} +0 -0
  207. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/content-modules.mjs +0 -0
  208. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/content.d.ts +0 -0
  209. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/types.d.ts +0 -0
  210. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  211. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  212. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  213. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  214. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  215. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  216. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  217. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  218. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  219. /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
  220. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  221. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  222. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js +0 -0
  223. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
  224. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  225. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  226. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  227. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  228. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/package.json +0 -0
  229. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  230. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  231. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  232. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  233. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  234. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  235. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  236. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  237. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  238. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  239. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  240. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/content.md +0 -0
  241. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/public/favicon.svg +0 -0
  242. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/public/robots.txt +0 -0
  243. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/010-dogs/images/dogs/rex.svg +0 -0
  244. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/010-dogs/images/dogs/rover.svg +0 -0
  245. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/010-dogs/route-content.md +0 -0
  246. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/020-adopt/route-content.md +0 -0
  247. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/sitewide-content.md +0 -0
  248. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/theme.md +0 -0
  249. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/site/content.md +0 -0
  250. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/site/images/what-we-do/dog-house.svg +0 -0
  251. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/site/images/you-can-help/heart.svg +0 -0
  252. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/public/favicon.svg +0 -0
  253. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/public/robots.txt +0 -0
  254. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/sitewide-content.md +0 -0
  255. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/theme.md +0 -0
  256. /package/examples/{dog-gallery → feature-demos/media-and-surfaces}/.astro/content-assets.mjs +0 -0
  257. /package/examples/{typography-presets → feature-demos/media-and-surfaces}/.astro/types.d.ts +0 -0
  258. /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/package.json +0 -0
  259. /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  260. /package/examples/{dog-gallery/dist → feature-demos/media-and-surfaces/site/public}/robots.txt +0 -0
  261. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-carousel.svg +0 -0
  262. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-stack.svg +0 -0
  263. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-surfaces.svg +0 -0
  264. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-one.svg +0 -0
  265. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-three.svg +0 -0
  266. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-two.svg +0 -0
  267. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/stack/stack-one.svg +0 -0
  268. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/stack/stack-two.svg +0 -0
  269. /package/examples/{presentation/site/routes/030-surfaces → feature-demos/media-and-surfaces/site/routes/020-surfaces}/route-content.md +0 -0
  270. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/collections/routeTheme.schema.json +0 -0
  271. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/content-assets.mjs +0 -0
  272. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/settings.json +0 -0
  273. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/_metadata.json +0 -0
  274. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  275. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  276. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  277. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  278. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  279. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  280. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  281. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  282. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  283. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  284. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  285. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  286. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  287. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  288. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  289. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  290. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  291. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  292. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  293. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  294. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  295. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  296. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  297. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  298. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  299. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  300. /package/examples/{typography-presets → feature-demos/theme-presets}/site/public/robots.txt +0 -0
  301. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/puppy-portrait.jpg +0 -0
  302. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/shepherd-portrait.jpg +0 -0
  303. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/white-puppy.jpg +0 -0
  304. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/black-schnauzer.jpg +0 -0
  305. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/retriever-portrait.jpg +0 -0
  306. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/schnauzer-portrait.jpg +0 -0
  307. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/boxer-portrait.jpg +0 -0
  308. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grass-puppy.jpg +0 -0
  309. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grey-street-dog.jpg +0 -0
  310. /package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/images/statement/black-pedigree.jpg +0 -0
  311. /package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/images/statement/sheepdog-grass.jpg +0 -0
  312. /package/examples/{typography-presets → 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, palettes, and section surfaces, 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
@@ -45,8 +45,9 @@ For a quick reference:
45
45
  - [Content](content.md) describes page frontmatter, Markdown-authored
46
46
  sections, optional section metadata, managed media blocks, temporary sections,
47
47
  and content validation.
48
- - [Theme](theme.md) describes site-wide layout, layout density, image sizing,
49
- font, typography rhythm, presentation palettes, and section surfaces.
48
+ - [Theme](theme.md) describes complete visual presets, focused overrides,
49
+ preset export, layout, image sizing, typography, palettes, and section
50
+ surfaces.
50
51
  - [Typography](typography.md) describes presets, rhythms, roles, overrides,
51
52
  inheritance, and inspection commands.
52
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`
package/docs/content.md CHANGED
@@ -269,14 +269,16 @@ NORNA_TODAY=2026-08-15 npm run norna:build
269
269
 
270
270
  ## Markdown Text
271
271
 
272
- Inline styles use this Markdown form:
272
+ Use ordinary Markdown for emphasis and structure:
273
273
 
274
274
  ```md
275
- This sentence contains [highlighted text]{.highlight}.
275
+ This sentence contains **important text** and *emphasised text*.
276
276
  ```
277
277
 
278
- Inline style definitions live in `site/theme.md`. See
279
- [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.
280
282
 
281
283
  ## Validation And Sync
282
284
 
@@ -288,27 +290,25 @@ npm run norna:content:check
288
290
 
289
291
  This checks section heading ids, section metadata, duplicate image names,
290
292
  missing image files, misplaced referenced images, duplicate image references,
291
- invalid managed media blocks, unreferenced images, undefined inline styles,
293
+ invalid managed media blocks, unreferenced images, removed inline style syntax,
292
294
  Markdown image references to unmanaged local files, and common frontmatter
293
295
  indentation and structure mistakes.
294
296
 
295
297
  Frontmatter uses YAML indentation. Use ordinary spaces, not tabs or
296
298
  non-breaking spaces. `content:check` reports a focused error when indentation is
297
299
  invalid, when a key is indented under a line that already has a value, or when a
298
- known nested key such as section-specific `typography` appears at the top
299
- level:
300
+ known nested key appears at the top level:
300
301
 
301
302
  ```yaml
302
- presentation:
303
- typography:
304
- preset: quiet-gallery
305
- overrides:
306
- body:
307
- paragraphSpacing: 0.8em
303
+ sections:
304
+ intro:
305
+ visible:
306
+ from: "2026-08-01"
308
307
  ```
309
308
 
310
309
  Top-level page frontmatter may contain only `title`, `description`,
311
- `navigation`, `presentation`, `frame`, and `sections`.
310
+ `navigation`, and `sections`. Visual settings belong in the root or route-local
311
+ `theme.md`.
312
312
 
313
313
  Run:
314
314
 
@@ -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
 
@@ -92,9 +92,8 @@ Relevant documentation: [Commands](commands.md), [Site Structure](site-structure
92
92
  repository, and deploy settings.
93
93
  2. Edit `site/sitewide-content.md` for the shared brand or logo, banners and
94
94
  footer content.
95
- 3. Edit `site/theme.md` for site-wide layout, layout density, typography
96
- rhythm, image sizing, font, typography preset, palettes, and section
97
- surfaces, or omit it to use engine defaults.
95
+ 3. Keep `site/theme.md` and select a complete theme preset. Add focused visual
96
+ overrides only when the preset needs adjustment.
98
97
  4. Edit `site/content.md` for homepage title, description, Markdown sections,
99
98
  text, Norna managed media blocks, alt text, and captions.
100
99
  5. Put source images under `site/images/<section-id>/`, where `<section-id>`
@@ -124,6 +123,42 @@ publishing.
124
123
  Relevant documentation: [Content](content.md), [Theme](theme.md),
125
124
  [Typography](typography.md), [Routes](routes.md), [Images And Metadata](images-and-metadata.md).
126
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
+
127
162
  ## Configure The Public URL
128
163
 
129
164
  For a custom domain or any site published at the web root, use:
@@ -159,13 +194,13 @@ Read [Site Structure](site-structure.md), [Content](content.md),
159
194
  [Theme](theme.md), [Typography](typography.md), [Routes](routes.md), and
160
195
  [Configuration](configuration.md) before publishing a real site.
161
196
 
162
- To change the site's maximum page width, side gutters, layout density,
163
- typography rhythm, image width, image height limits, font, palettes, or
164
- site-wide typography preset, edit `site/theme.md`. See [Theme](theme.md) for
165
- 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.
166
200
 
167
- To give a route a different visual expression, add a complete route-local
168
- `theme.md`. See [Theme](theme.md#route-themes) and [Typography](typography.md).
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).
169
204
  Use `norna typography presets` to inspect the installed preset and rhythm values
170
205
  and `norna typography show` to inspect the resolved typography for the selected
171
206
  site.
package/docs/routes.md CHANGED
@@ -10,7 +10,8 @@ for the page and section model.
10
10
 
11
11
  Route directories can contain route content, route-local images, and
12
12
  an optional route-local `theme.md`. The route theme replaces the root visual
13
- theme for that route. Route directories cannot contain technical site
13
+ theme for that route and can select any complete top-level theme preset. Route
14
+ directories cannot contain technical site
14
15
  configuration; technical configuration stays in the selected site directory's
15
16
  top-level `config.mjs`.
16
17
 
@@ -31,15 +31,16 @@ site directory. Without an explicit site directory, commands first accept the
31
31
  current directory when it contains both `config.mjs` and `content.md`.
32
32
  Otherwise, commands started from a subdirectory walk upward until they find the
33
33
  default `site/` directory containing those files.
34
- `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.
35
35
 
36
36
  ## Versioned Source Files
37
37
 
38
38
  Version these files in a site repository:
39
39
 
40
40
  - `site/config.mjs`: technical site configuration.
41
- - `site/theme.md`: optional site-wide visual theme, including layout, spacing,
42
- image sizing, font, typography defaults, palettes, and section surfaces.
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).
44
45
  - `site/sitewide-content.md`: shared site identity, banners and footer content.
45
46
  See [Sitewide Content](sitewide-content.md).
@@ -90,6 +91,8 @@ In this repository:
90
91
  - `starters/project/` is a project-site starter used as a maintained example
91
92
  for small project and developer-tool sites.
92
93
  - `fixtures/basic/site/` is used by engine regression tests.
93
- - `examples/dog-gallery/site/` is the local visual dog example used by demo
94
- 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.
95
98
  - `site/` is reserved for the local documentation site.
package/docs/theme.md CHANGED
@@ -2,48 +2,90 @@
2
2
 
3
3
  `site/theme.md` defines the site-wide visual theme for a `norna` site. It uses
4
4
  YAML frontmatter and does not need a Markdown body. The root theme file is
5
- required, but every setting inside it is optional and falls back to an engine
6
- default.
5
+ required. The normal setup selects one complete theme preset and adds only
6
+ focused overrides when needed.
7
7
 
8
8
  An optional `theme.md` inside a route directory replaces the root visual theme
9
- for that route. Route themes do not merge with the root theme: omitted values
10
- use engine defaults. Shared identity such as brand and logo remains site-wide
11
- and belongs in `sitewide-content.md`.
9
+ for that route. Shared identity such as brand and logo remains site-wide and
10
+ belongs in `sitewide-content.md`.
12
11
 
13
- ## 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:
26
+
27
+ ```yaml
28
+ ---
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:
14
48
 
15
49
  ```yaml
16
50
  ---
51
+ preset: documentation
17
52
  layout:
18
- density: normal
19
- pageWidth: 1180px
20
- gutter:
21
- desktop: clamp(1.25rem, 4vw, 3rem)
22
- mobile: 1rem
23
- gallery:
24
- width: 900px
25
- maxAvailableWidthPercent:
26
- desktop: 100
27
- mobile: 100
28
- maxAvailableHeightPercent:
29
- desktop: 74
30
- mobile: 68
31
- typography:
32
- fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
33
- preset: quiet-gallery
34
- rhythm: normal
53
+ pageWidth: 1320px
35
54
  presentation:
36
- palette: dark # Alternatives: light, paper
37
- sectionSurfaces:
38
- mode: cycle
39
- sequence: [base, soft, emphasis]
55
+ palette: dark
40
56
  ---
41
57
  ```
42
58
 
43
- Starter sites include a marked comment block such as
44
- `norna:start theme-help` / `norna:end theme-help`. The block is only
45
- explorable help text; YAML comments do not affect rendering. The active
46
- 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.
62
+
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.
67
+
68
+ ## Export A Preset
69
+
70
+ Export the installed definition of a preset before choosing overrides:
71
+
72
+ ```sh
73
+ norna theme:export documentation
74
+ ```
75
+
76
+ In a generated site, the equivalent npm command is:
77
+
78
+ ```sh
79
+ npm run norna:theme:export -- documentation
80
+ ```
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.
47
89
 
48
90
  Site identity is not part of the visual theme. Define the optional navigation
49
91
  brand and logo settings in `site/sitewide-content.md`; see [Sitewide Content](sitewide-content.md).
@@ -203,9 +245,19 @@ visual expression:
203
245
  site/routes/010-guide/theme.md
204
246
  ```
205
247
 
206
- The route theme uses the same visual schema as the root theme. It completely
207
- replaces the root visual theme for that route, so include every non-default
208
- visual choice the route needs. It cannot define navigation, brand, logo, or
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:
251
+
252
+ ```yaml
253
+ ---
254
+ preset: statement
255
+ ---
256
+ ```
257
+
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
209
261
  technical configuration.
210
262
 
211
263
  Section surfaces render as full-width horizontal bands while the section
@@ -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,7 +29,9 @@ 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
36
  Presets define alignment, size, weight, and line height for `headings.h1`
27
37
  through `headings.h4`, `body`, and `caption`. They also choose a readable body
@@ -142,30 +152,35 @@ Supported override fields:
142
152
 
143
153
  ## Route Themes
144
154
 
145
- Theme typography is the site-wide base:
155
+ The simplest route-specific typography change is to select a complete theme
156
+ preset:
146
157
 
147
158
  ```yaml
148
- # site/theme.md
149
- typography:
150
- fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
151
- preset: quiet-gallery
152
- rhythm: normal
159
+ # site/routes/010-introduction/theme.md
160
+ ---
161
+ preset: statement
162
+ ---
153
163
  ```
154
164
 
155
- A route-local `theme.md` can give that route a different typographic character.
156
- The route theme replaces the root visual theme rather than inheriting from it,
157
- so repeat any non-default `fontFamily`, `rhythm`, or `overrides` that the route
158
- still needs.
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.
159
168
 
160
- Example route theme:
169
+ Use a nested typography choice when only the typographic character needs to be
170
+ specified explicitly:
161
171
 
162
172
  ```yaml
163
173
  # site/routes/010-introduction/theme.md
174
+ ---
164
175
  typography:
165
176
  preset: statement
166
177
  rhythm: normal
178
+ ---
167
179
  ```
168
180
 
181
+ Without a top-level theme preset, other omitted route-theme values use engine
182
+ defaults rather than values from the root theme.
183
+
169
184
  The `body.width` value controls the prose column independently of the page and
170
185
  image widths. Captions are normally centered, but `text-forward` uses
171
186
  left-aligned captions to support longer explanatory text.