@janga/norna 0.7.11 → 0.7.13

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 (239) hide show
  1. package/README.md +120 -108
  2. package/bin/norna-cli.mjs +1 -1
  3. package/docs/README.md +107 -75
  4. package/docs/assets/norna-dog-shelter.jpg +0 -0
  5. package/docs/commands.md +7 -4
  6. package/docs/configuration.md +86 -185
  7. package/docs/design/command-organization.md +1 -1
  8. package/docs/design/norna-diagram-design.md +2 -1
  9. package/docs/design/site-examples-structure.md +4 -1
  10. package/docs/engine-development.md +15 -8
  11. package/docs/getting-started.md +126 -144
  12. package/docs/how-to/embedded-site.md +35 -0
  13. package/docs/publishing.md +47 -46
  14. package/docs/requirements.md +54 -0
  15. package/docs/routes.md +1 -1
  16. package/docs/site-structure.md +4 -4
  17. package/docs/sitewide-content.md +2 -1
  18. package/docs/theme.md +18 -0
  19. package/examples/README.md +26 -24
  20. package/examples/complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs +4 -1
  21. package/examples/complete-sites/dog-shelter-multi-page/.astro/content.d.ts +1 -1
  22. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -1
  23. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +6 -8
  24. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +26 -53
  25. package/examples/complete-sites/dog-shelter-multi-page/README.md +7 -0
  26. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +29 -35
  27. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{astro-D_GIpJIE.js → astro-B3JHJyiv.js} +4 -4
  28. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  29. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js +151 -151
  30. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -1
  31. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js +131 -131
  32. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -1
  33. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js +1 -1
  34. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -1
  35. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +10 -10
  36. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -1
  37. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{audit-DM9Hkl5B.js → audit-C3SVr7dT.js} +10 -10
  38. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  39. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{highlight-DnZ1ULOL.js → highlight-BLtvqtzO.js} +1 -1
  40. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  41. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{icons-RyebKi45.js → icons-C92i61-2.js} +1 -1
  42. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  43. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{settings-DaU-gNnK.js → settings-v5GgKks_.js} +2 -2
  44. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  45. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{toolbar-63PA619H.js → toolbar-BFvJVp26.js} +2 -2
  46. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  47. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{ui-library--bkcNSYz.js → ui-library-Cd35oAvo.js} +10 -10
  48. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  49. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{window-jPkpKVcy.js → window-vo3A6TMn.js} +1 -1
  50. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  51. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{xray-BXCHpEJP.js → xray-DwhzGckb.js} +3 -3
  52. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  53. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +92 -12
  54. package/examples/complete-sites/dog-shelter-multi-page/site/config.md +3 -0
  55. package/examples/complete-sites/dog-shelter-multi-page/site/content.md +12 -0
  56. package/examples/complete-sites/dog-shelter-multi-page/site/images/intro/shelter-dog.jpg +0 -0
  57. package/examples/complete-sites/dog-shelter-multi-page/site/public/logo.svg +9 -0
  58. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.jpg +0 -0
  59. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.jpg +0 -0
  60. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/route-content.md +11 -19
  61. package/examples/complete-sites/dog-shelter-multi-page/site/routes/020-adopt/images/adopt/adoption-dog.jpg +0 -0
  62. package/examples/complete-sites/dog-shelter-multi-page/site/routes/020-adopt/route-content.md +11 -0
  63. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.md +12 -2
  64. package/examples/complete-sites/dog-shelter-multi-page/site/theme.md +1 -23
  65. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +59 -0
  66. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +138 -0
  67. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +755 -0
  68. package/examples/complete-sites/dog-shelter-single-page/.astro/content-assets.mjs +4 -0
  69. package/examples/complete-sites/dog-shelter-single-page/.astro/content-modules.mjs +1 -0
  70. package/examples/complete-sites/dog-shelter-single-page/.astro/content.d.ts +183 -0
  71. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +1 -0
  72. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +13 -0
  73. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +14 -0
  74. package/examples/complete-sites/dog-shelter-single-page/.astro/settings.json +5 -0
  75. package/examples/complete-sites/dog-shelter-single-page/.astro/types.d.ts +2 -0
  76. package/examples/complete-sites/dog-shelter-single-page/README.md +7 -0
  77. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +74 -0
  78. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  79. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  80. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  81. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  82. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  83. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  84. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  85. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  86. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  87. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  88. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  89. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  90. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  91. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  92. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  93. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  94. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/package.json +3 -0
  95. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  96. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  97. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  98. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  99. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  100. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  101. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  102. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  103. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  104. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  105. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  106. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +44 -12
  107. package/examples/complete-sites/dog-shelter-single-page/site/config.md +3 -0
  108. package/examples/complete-sites/dog-shelter-single-page/site/content.md +20 -24
  109. package/examples/complete-sites/dog-shelter-single-page/site/images/what-we-do/rescue-dog.jpg +0 -0
  110. package/examples/complete-sites/dog-shelter-single-page/site/images/you-can-help/foster-dog.jpg +0 -0
  111. package/examples/complete-sites/dog-shelter-single-page/site/public/logo.svg +9 -0
  112. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.md +12 -2
  113. package/examples/complete-sites/dog-shelter-single-page/site/theme.md +1 -23
  114. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
  115. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +15 -2
  116. package/examples/feature-demos/media-and-surfaces/README.md +7 -1
  117. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +7 -1
  118. package/examples/{complete-sites/dog-shelter-multi-page → feature-demos/media-and-surfaces}/node_modules/.vite/deps/embla-carousel.js +1 -1
  119. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  120. package/examples/feature-demos/media-and-surfaces/site/config.md +3 -0
  121. package/examples/feature-demos/media-and-surfaces/site/content.md +5 -51
  122. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/route-content.md +10 -25
  123. package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/route-content.md +1 -1
  124. package/examples/feature-demos/sitewide-content/.astro/collections/site.schema.json +59 -0
  125. package/examples/feature-demos/sitewide-content/.astro/collections/sitewide.schema.json +138 -0
  126. package/examples/feature-demos/sitewide-content/.astro/collections/theme.schema.json +755 -0
  127. package/examples/feature-demos/sitewide-content/.astro/content-assets.mjs +1 -0
  128. package/examples/feature-demos/sitewide-content/.astro/content-modules.mjs +1 -0
  129. package/examples/feature-demos/sitewide-content/.astro/content.d.ts +183 -0
  130. package/examples/feature-demos/sitewide-content/.astro/data-store.json +1 -0
  131. package/examples/feature-demos/sitewide-content/.astro/dev.json +13 -0
  132. package/examples/feature-demos/sitewide-content/.astro/dev.log +18 -0
  133. package/examples/feature-demos/sitewide-content/.astro/settings.json +5 -0
  134. package/examples/feature-demos/sitewide-content/.astro/types.d.ts +2 -0
  135. package/examples/feature-demos/sitewide-content/README.md +18 -0
  136. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/_metadata.json +74 -0
  137. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  138. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  139. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  140. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  141. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  142. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  143. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  144. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  145. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  146. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  147. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  148. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  149. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  150. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  151. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  152. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  153. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/package.json +3 -0
  154. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  155. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  156. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  157. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  158. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  159. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  160. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  161. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  162. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  163. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  164. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  165. package/examples/feature-demos/sitewide-content/site/.norna/generated-images.json +1 -0
  166. package/examples/feature-demos/sitewide-content/site/config.md +3 -0
  167. package/examples/feature-demos/sitewide-content/site/content.md +16 -0
  168. package/examples/feature-demos/sitewide-content/site/public/logo.svg +6 -0
  169. package/examples/feature-demos/sitewide-content/site/public/robots.txt +2 -0
  170. package/examples/feature-demos/sitewide-content/site/routes/010-identity/route-content.md +20 -0
  171. package/examples/feature-demos/sitewide-content/site/routes/020-notices/route-content.md +22 -0
  172. package/examples/feature-demos/sitewide-content/site/routes/030-footer/route-content.md +17 -0
  173. package/examples/feature-demos/sitewide-content/site/sitewide-content.md +33 -0
  174. package/examples/feature-demos/sitewide-content/site/theme.md +3 -0
  175. package/examples/feature-demos/theme-presets/.astro/dev.log +37 -0
  176. package/examples/feature-demos/theme-presets/README.md +5 -1
  177. package/examples/feature-demos/theme-presets/site/config.md +3 -0
  178. package/fixtures/basic/site/config.md +3 -0
  179. package/fixtures/content-model-v2/site/config.md +3 -0
  180. package/package.json +12 -7
  181. package/scripts/build-pages.mjs +4 -6
  182. package/scripts/check-config.mjs +1 -10
  183. package/scripts/deploy-site.mjs +12 -8
  184. package/scripts/lib/example-sites.mjs +3 -0
  185. package/scripts/lib/github-repository.mjs +44 -0
  186. package/scripts/lib/norna-markdown-blocks.mjs +97 -10
  187. package/scripts/lib/project-config.mjs +112 -123
  188. package/scripts/lib/site-content.mjs +7 -0
  189. package/scripts/lib/site-paths.mjs +6 -2
  190. package/scripts/test-client-javascript.mjs +221 -0
  191. package/scripts/test-content-check.mjs +103 -0
  192. package/scripts/test-content-model-v2.mjs +9 -13
  193. package/scripts/test-documentation.mjs +116 -0
  194. package/scripts/test-engine-commands.mjs +12 -3
  195. package/scripts/test-examples.mjs +9 -0
  196. package/scripts/test-package-check.mjs +17 -9
  197. package/scripts/test-project-config.mjs +125 -0
  198. package/scripts/test-temporary-visibility.mjs +3 -10
  199. package/scripts/test-theme-presets.mjs +3 -8
  200. package/scripts/watch-pages-deploy.mjs +15 -11
  201. package/src/components/GalleryGrid.astro +30 -230
  202. package/src/components/ImageCarousel.astro +184 -0
  203. package/src/components/MobileSectionNavigationScript.astro +14 -0
  204. package/src/components/SiteNavigation.astro +54 -341
  205. package/src/components/SiteNotesScript.astro +43 -0
  206. package/src/components/SitePage.astro +4 -1
  207. package/src/components/SiteSection.astro +4 -47
  208. package/src/layouts/BaseLayout.astro +1 -1
  209. package/src/lib/galleryImages.ts +53 -0
  210. package/src/styles/global.css +81 -1
  211. package/starters/basic/.github/workflows/deploy.yml +1 -2
  212. package/starters/basic/README.md +10 -8
  213. package/starters/basic/site/config.md +3 -0
  214. package/starters/project/.github/workflows/deploy.yml +1 -2
  215. package/starters/project/README.md +3 -4
  216. package/starters/project/site/config.md +3 -0
  217. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
  218. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
  219. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/embla-carousel.js.map +0 -1
  220. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
  221. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
  222. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
  223. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
  224. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
  225. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
  226. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
  227. package/examples/complete-sites/dog-shelter-multi-page/site/config.mjs +0 -30
  228. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.svg +0 -19
  229. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.svg +0 -19
  230. package/examples/complete-sites/dog-shelter-single-page/site/config.mjs +0 -30
  231. package/examples/complete-sites/dog-shelter-single-page/site/images/what-we-do/dog-house.svg +0 -25
  232. package/examples/complete-sites/dog-shelter-single-page/site/images/you-can-help/heart.svg +0 -13
  233. package/examples/feature-demos/media-and-surfaces/site/config.mjs +0 -30
  234. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/theme.md +0 -3
  235. package/examples/feature-demos/theme-presets/site/config.mjs +0 -30
  236. package/fixtures/basic/site/config.mjs +0 -27
  237. package/fixtures/content-model-v2/site/config.mjs +0 -11
  238. package/starters/basic/site/config.mjs +0 -27
  239. package/starters/project/site/config.mjs +0 -30
@@ -1,206 +1,188 @@
1
- # Getting Started
1
+ # Build Your First Norna Site
2
2
 
3
- This guide creates a new site repository from the included starter. It describes
4
- the generic `norna` setup; site-specific content belongs in the new site
5
- repository.
3
+ This tutorial takes the shortest path from an empty directory to a running,
4
+ edited, and verified Norna site. Follow the steps in order. Installation time
5
+ depends on your npm connection, but the site work itself should take about five
6
+ minutes.
6
7
 
7
- ## Requirements
8
+ At the end you will have:
8
9
 
9
- - Node.js `>=22.12.0`
10
- - ImageMagick for image generation
11
- - GitHub CLI (`gh`) for deploy checks and deploy monitoring
10
+ - a standalone site project with a pinned Norna version,
11
+ - a homepage with your own content and navigation,
12
+ - a complete visual preset,
13
+ - validated source files and a static build in `dist/`.
12
14
 
13
- Install Playwright Chromium only when you plan to run navigation diagnostics:
15
+ ## Before You Start
14
16
 
15
- ```sh
16
- npx playwright install chromium
17
- ```
17
+ You need:
18
+
19
+ - Node.js `22.12` or later,
20
+ - npm, which is included with Node.js,
21
+ - a terminal and a text editor.
18
22
 
19
- ## Create A Site
23
+ ImageMagick is needed when you add raster images that Norna should process. It
24
+ is not needed to make the text-only first edit in this tutorial. GitHub CLI and
25
+ Playwright are not required.
20
26
 
21
- ### Standalone Site
27
+ See [Requirements and limitations](requirements.md) for platform details and
28
+ the current product boundaries.
22
29
 
23
- Use a standalone setup when the website is its own project. Create the site
24
- from the starter first, then install dependencies inside the new site
25
- directory:
30
+ ## 1. Create And Run The Site
31
+
32
+ Run these commands from the directory where you keep projects:
26
33
 
27
34
  ```sh
28
- cd path/to/your/projects
29
35
  npx @janga/norna@latest init my-site
30
36
  cd my-site
31
37
  npm install
32
38
  npm run dev
33
39
  ```
34
40
 
35
- After `npm install`, the project's npm scripts use the project-local `norna`
36
- binary from `node_modules/.bin`. A globally installed `norna` can also be used
37
- as a convenience launcher; inside a project with an installed `@janga/norna`
38
- dependency, it delegates to the project's local version.
41
+ `init` creates the project before `npm install` runs. The generated
42
+ `package.json` pins the Norna engine version so this project keeps using the
43
+ same version until you update it deliberately.
39
44
 
40
- A freshly created empty directory is not a `norna` site yet. It becomes a
41
- site when `init` copies the starter files, including `package.json`. If you run
42
- `npm install` in an empty directory, npm may walk up to a parent directory and
43
- install dependencies for another project instead.
45
+ ### Checkpoint: The Starter Is Visible
44
46
 
45
- For normal site work, keep site repositories as siblings of the `norna`
46
- engine repository. For example:
47
+ Open the URL printed by the development server. It is normally
48
+ `http://localhost:4321/`, but Norna uses another available port when necessary.
49
+ You should see the starter homepage and its section navigation.
47
50
 
48
- ```text
49
- Projects/
50
- norna/
51
- my-site/
52
- ```
51
+ Leave the development server running while you complete the next steps.
53
52
 
54
- The starter contains:
53
+ ## 2. Replace The Homepage Content
55
54
 
56
- - `package.json` with npm scripts that call `norna`
57
- - `.github/workflows/deploy.yml` for GitHub Pages
58
- - `site/config.mjs`
59
- - `site/theme.md`
60
- - `site/sitewide-content.md`
61
- - `site/content.md`
62
- - `site/public/robots.txt`
55
+ Replace `site/content.md` with:
63
56
 
64
- Commit the generated `package-lock.json` after the first install.
57
+ ```md
58
+ ---
59
+ title: My first Norna site
60
+ description: A website built from plain files.
61
+ ---
65
62
 
66
- ### Embedded Site
63
+ ## Welcome {#welcome}
67
64
 
68
- Use an embedded setup when a Norna site should live inside an existing Node or
69
- GitHub project:
65
+ This page is written in Markdown. Norna provides its layout and navigation.
70
66
 
71
- ```sh
72
- cd existing-project
73
- npx @janga/norna@latest init . --type embedded --site-dir presentation
74
- npm install
75
- npm run norna:dev
76
- ```
67
+ ## Next {#next}
77
68
 
78
- The command looks different because the target is different. `.` means "add
79
- Norna to the current project" instead of creating a new directory.
80
- `--site-dir presentation` tells Norna to manage `presentation/` as the site
81
- directory instead of the default `site/`.
82
-
83
- Embedded setup keeps the surrounding project structure. It adds namespaced
84
- `norna:*` scripts so Norna does not take over the project's normal `build`,
85
- `test`, or deploy scripts.
86
-
87
- Relevant documentation: [Commands](commands.md), [Site Structure](site-structure.md).
88
-
89
- ## First Edits
90
-
91
- 1. Edit `site/config.mjs` for the site's URL, language labels, GitHub
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>`
100
- matches a `## Section {#section-id}` heading in `site/content.md`.
101
- 6. Add optional route pages under
102
- `site/routes/<NNN-route-id>/route-content.md`, for example
103
- `site/routes/010-about/route-content.md`.
104
- 7. Put static files such as `robots.txt`, `CNAME`, and favicons under
105
- `site/public/`.
106
- 8. Run:
107
-
108
- ```sh
109
- npm run norna:config:check
110
- npm run norna:content:check
111
- npm run norna:sync
112
- npm run norna:check
113
- npm run build
69
+ Edit this file while the development server is running and the browser updates.
114
70
  ```
115
71
 
116
- `norna:sync` moves misplaced referenced image files when the intended move is
117
- unambiguous. It can move images between sections and routes, but cross-route
118
- writes require a clean Git working tree so the operation is easy to roll back.
119
- Publishing is normally done by committing the site files and pushing them with
120
- Git; the starter GitHub Pages workflow runs the required checks before
121
- publishing.
72
+ Each `##` heading is a page section. Its explicit `{#section-id}` gives the
73
+ section a stable identity and is required by Norna.
122
74
 
123
- Relevant documentation: [Content](content.md), [Theme](theme.md),
124
- [Typography](typography.md), [Routes](routes.md), [Images And Metadata](images-and-metadata.md).
75
+ ### Checkpoint: Content And Navigation Update
125
76
 
126
- ## Choose A Theme
77
+ Return to the browser. The page should now contain `Welcome` and `Next`, and
78
+ the single-page navigation should link to those two sections. You should not
79
+ need to restart the server.
127
80
 
128
- The required root `theme.md` can be deliberately short:
81
+ ## 3. Set The Shared Brand
82
+
83
+ Replace `site/sitewide-content.md` with:
129
84
 
130
85
  ```yaml
131
86
  ---
132
- preset: project
87
+ navigation:
88
+ brand: My first Norna site
89
+ footer:
90
+ copyrightMessage: My first Norna site.
133
91
  ---
134
92
  ```
135
93
 
136
- Available complete presets are `portfolio`, `documentation`, `project`, and
137
- `statement`. They coordinate layout, image sizing, font, typography, spacing,
138
- palette, and section surfaces.
94
+ The brand and footer are site-wide content rather than page sections. If you
95
+ add routes later, they inherit these values.
96
+
97
+ ### Checkpoint: The Brand Is Shared
98
+
99
+ The navigation should now display `My first Norna site`. The footer should show
100
+ the new message.
101
+
102
+ ## 4. Choose A Complete Theme
139
103
 
140
- Override only what the site needs to change:
104
+ Replace `site/theme.md` with:
141
105
 
142
106
  ```yaml
143
107
  ---
144
108
  preset: project
145
- layout:
146
- pageWidth: 1240px
147
109
  ---
148
110
  ```
149
111
 
150
- Export a commented reference for a preset with:
112
+ The preset supplies coordinated layout, typography, spacing, image sizing,
113
+ palette, and section surfaces. Add overrides only when a real site needs to
114
+ differ from the preset.
115
+
116
+ ### Checkpoint: The Preset Is Active
117
+
118
+ The browser should refresh with the `project` presentation. Your content files
119
+ remain unchanged because presentation belongs in `theme.md`.
120
+
121
+ ## 5. Check And Build
122
+
123
+ Open another terminal in `my-site` and run:
151
124
 
152
125
  ```sh
153
- npm run norna:theme:export -- project
126
+ npm run norna:check
127
+ npm run build
154
128
  ```
155
129
 
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.
130
+ The check should complete without errors. The build should create:
158
131
 
159
- Relevant documentation: [Theme](theme.md), [Typography](typography.md),
160
- [Commands](commands.md).
132
+ ```text
133
+ dist/
134
+ ```
161
135
 
162
- ## Configure The Public URL
136
+ `dist/` is generated output. Continue editing the files under `site/`; do not
137
+ edit the built HTML as the source of the website.
163
138
 
164
- For a custom domain or any site published at the web root, use:
139
+ ### Checkpoint: The Source Produces A Clean Build
165
140
 
166
- ```js
167
- site: {
168
- url: 'https://example.com/',
169
- basePath: '/',
170
- }
171
- ```
141
+ Confirm that both commands exit successfully and that `dist/index.html`
142
+ exists. You now have a complete local Norna workflow: edit, preview, check, and
143
+ build.
144
+
145
+ ## What To Do Next
172
146
 
173
- For a GitHub Pages project site without a custom domain, the site is served
174
- under the repository name. Configure both values:
147
+ - [Add and manage images](content.md#managed-media-blocks)
148
+ - [Add another page](routes.md)
149
+ - [Inspect and adjust the theme](theme.md)
150
+ - [Configure the public URL](configuration.md)
151
+ - [Publish with GitHub Pages](publishing.md)
152
+ - [Browse complete and focused examples](../examples/README.md)
175
153
 
176
- ```js
177
- site: {
178
- url: 'https://owner.github.io/repository-name/',
179
- basePath: '/repository-name/',
180
- }
154
+ To add Norna inside an existing Node project instead of creating a standalone
155
+ site, see [Add an embedded site](how-to/embedded-site.md).
156
+
157
+ The [documentation map](README.md) separates task guides, explanation, and
158
+ reference so you can continue from the kind of question you have.
159
+
160
+ ## Common First Problems
161
+
162
+ ### The Default Port Is Occupied
163
+
164
+ Start the development server with:
165
+
166
+ ```sh
167
+ npm run dev -- --kill
181
168
  ```
182
169
 
183
- After that, content files may still use root-style internal links such as
184
- `/getting-started/` and `/favicon.svg`. Norna applies `site.basePath` during
185
- rendering so the built links work under the GitHub Pages project path.
170
+ This tells Norna to stop the process occupying its standard port before
171
+ starting. The separator `--` is required so npm forwards `--kill` to Norna.
172
+
173
+ ### Images Fail During Checking Or Building
186
174
 
187
- The starter includes a GitHub Pages workflow in `.github/workflows/deploy.yml`.
188
- In the GitHub repository settings, configure Pages to build from GitHub
189
- Actions.
175
+ Install ImageMagick and confirm that either `magick` or the older `identify`
176
+ and `convert` commands are available. Then rerun the failed command.
190
177
 
191
- Relevant documentation: [Configuration](configuration.md), [Publishing](publishing.md).
178
+ ### The Page Reports Invalid Content
192
179
 
193
- Read [Site Structure](site-structure.md), [Content](content.md),
194
- [Theme](theme.md), [Typography](typography.md), [Routes](routes.md), and
195
- [Configuration](configuration.md) before publishing a real site.
180
+ Run:
196
181
 
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.
182
+ ```sh
183
+ npm run norna:content:check
184
+ ```
200
185
 
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
206
- site.
186
+ Read all reported issues before editing. Norna reports file and line context
187
+ for invalid sections and managed content blocks. See [Content](content.md) for
188
+ the accepted Markdown forms.
@@ -0,0 +1,35 @@
1
+ # Add Norna To An Existing Project
2
+
3
+ Use embedded setup when the website should live inside an existing Node
4
+ project rather than in its own repository.
5
+
6
+ From the existing project root, run:
7
+
8
+ ```sh
9
+ npx @janga/norna@latest init . --type embedded --site-dir presentation
10
+ npm install
11
+ npm run norna:dev
12
+ ```
13
+
14
+ The arguments are intentionally different from standalone setup:
15
+
16
+ - `.` means that Norna should update the current project instead of creating a
17
+ new project directory.
18
+ - `--type embedded` preserves the surrounding project's role and scripts.
19
+ - `--site-dir presentation` puts the site source in `presentation/` instead of
20
+ the default `site/` directory.
21
+
22
+ Embedded setup adds `@janga/norna` as a project dependency and adds namespaced
23
+ `norna:*` npm scripts. It refuses to overwrite conflicting scripts or a
24
+ non-empty target site directory.
25
+
26
+ The surrounding project keeps its normal `build`, `test`, and deploy commands.
27
+ Use the added commands for the embedded site:
28
+
29
+ ```sh
30
+ npm run norna:check
31
+ npm run norna:build
32
+ ```
33
+
34
+ See [Commands](../commands.md) for the complete script list and
35
+ [Site Structure](../site-structure.md) for source and generated files.
@@ -1,52 +1,47 @@
1
1
  # Publishing
2
2
 
3
- Publishing is site-specific. The generic deploy commands read repository,
4
- branch, workflow, watch, and public URL settings from the selected site's
5
- `site/config.mjs`.
3
+ Norna includes a GitHub Pages workflow and deploy helpers. The public URL is
4
+ declared in `site/config.md`; repository and default branch are discovered from
5
+ GitHub when a deploy command runs.
6
6
 
7
7
  Do not run deploy commands from the engine repository unless you deliberately
8
- want to test the demo configuration.
8
+ want to deploy the documentation site.
9
9
 
10
10
  ## GitHub Pages Workflow
11
11
 
12
- Each site repository should own its `.github/workflows/deploy.yml`. The starter
13
- workflow:
12
+ Each site repository owns `.github/workflows/deploy.yml`. The starter workflow:
14
13
 
15
- 1. checks out the site repository,
16
- 2. sets up Node,
17
- 3. installs image tools,
14
+ 1. runs for the repository's default branch,
15
+ 2. checks out the site repository,
16
+ 3. sets up Node and image tools,
18
17
  4. restores the generated image cache,
19
- 5. runs `npm ci`,
20
- 6. runs `npm run build` in the starter, which aliases
21
- `npm run norna:build`,
22
- 7. uploads `dist/`,
23
- 8. deploys to GitHub Pages.
18
+ 5. runs `npm ci` and `npm run build`,
19
+ 6. uploads `dist/`,
20
+ 7. deploys the artifact to GitHub Pages.
24
21
 
25
- Site-specific static files such as `site/public/CNAME`, `robots.txt`, and
22
+ In the GitHub repository settings, set Pages to build from GitHub Actions.
23
+ Site-specific public files such as `site/public/CNAME`, `robots.txt` and
26
24
  `sitemap.xml` belong in the site repository.
27
25
 
28
- In the GitHub repository settings, set Pages to build from GitHub Actions. For
29
- a project site without a custom domain, configure the site URL and base path in
30
- `site/config.mjs`:
26
+ For a project site without a custom domain, include the repository path in
27
+ `site/config.md`:
31
28
 
32
- ```js
33
- site: {
34
- url: 'https://owner.github.io/repository-name/',
35
- basePath: '/repository-name/',
36
- }
29
+ ```yaml
30
+ ---
31
+ url: https://owner.github.io/repository-name/
32
+ ---
37
33
  ```
38
34
 
39
- For a custom domain, keep `basePath` as `/`:
35
+ For a custom domain or root-hosted site:
40
36
 
41
- ```js
42
- site: {
43
- url: 'https://example.com/',
44
- basePath: '/',
45
- }
37
+ ```yaml
38
+ ---
39
+ url: https://example.com/
40
+ ---
46
41
  ```
47
42
 
48
- Norna uses `site.basePath` for generated internal page links, favicons,
49
- generated images, and root-relative links or images written in Markdown.
43
+ Norna derives the base path from the URL pathname and applies it to generated
44
+ internal links, favicons, managed images and root-relative Markdown links.
50
45
 
51
46
  ## Deploy An Already Committed Branch
52
47
 
@@ -56,16 +51,17 @@ Use:
56
51
  npm run norna:deploy
57
52
  ```
58
53
 
59
- The deploy command:
54
+ The command requires an authenticated GitHub CLI. It asks GitHub for the
55
+ current repository and its default branch, then:
60
56
 
61
- - requires the current branch to equal `github.branch`,
62
- - requires a clean worktree before build,
57
+ - requires the current branch to be that default branch,
58
+ - requires a clean worktree before the build,
63
59
  - fetches `origin`,
64
60
  - refuses to proceed when the branch is behind or diverged,
65
61
  - runs the full build,
66
62
  - requires the build to leave the worktree clean,
67
- - pushes only when the local branch is ahead of `origin/<branch>`,
68
- - checks the configured GitHub Pages workflow.
63
+ - pushes only when local `HEAD` is ahead of the remote branch,
64
+ - checks the included `deploy.yml` GitHub Pages workflow.
69
65
 
70
66
  It does not create commits or push uncommitted changes.
71
67
 
@@ -77,11 +73,11 @@ The older convenience flow remains available:
77
73
  npm run norna:deploy:commit -- "Commit message"
78
74
  ```
79
75
 
80
- It builds, stages only allowed site changes, commits, pushes, and checks Pages.
81
- The allowlist is implemented in `scripts/deploy-site.mjs` and includes the
82
- site content file, selected config/static files, expected generated images,
83
- generated image manifest, package files, `tsconfig.json`, `astro.config.mjs`,
84
- and `src/` changes.
76
+ It discovers the same repository/default branch, builds, stages only allowed
77
+ site changes, commits, pushes and checks Pages. The allowlist is implemented in
78
+ `scripts/deploy-site.mjs` and includes site content and configuration, expected
79
+ managed images and generated image state, public files, package files and
80
+ renderer source changes.
85
81
 
86
82
  ## Watch A Deploy
87
83
 
@@ -91,14 +87,19 @@ Use:
91
87
  npm run norna:deploy:watch
92
88
  ```
93
89
 
94
- By default it monitors the workflow run for the current `HEAD` on the configured
95
- branch and repository. Useful one-run overrides include:
90
+ By default it monitors `deploy.yml` for the current `HEAD` in the discovered
91
+ repository and default branch. Useful one-run overrides include:
96
92
 
97
93
  ```sh
98
94
  npm run norna:deploy:watch -- --timeout 20m --interval 5s
99
95
  npm run norna:deploy:watch -- --sha <commit-sha>
96
+ npm run norna:deploy:watch -- --repo owner/name --branch main
100
97
  ```
101
98
 
102
- The monitor prints the run id, run URL, Actions URL, branch, commit SHA, status,
103
- and configured public site URL. On failures it fetches failed job details and a
104
- log excerpt.
99
+ The default poll interval is 10 seconds, timeout is 15 minutes and recent-run
100
+ limit is 10. `--workflow`, `--site-url` and `--limit` provide further one-run
101
+ overrides; these operational values do not belong in `config.md`.
102
+
103
+ The monitor prints the run id, run URL, Actions URL, branch, commit SHA, status
104
+ and public site URL. On failures it fetches failed job details and a log
105
+ excerpt.
@@ -0,0 +1,54 @@
1
+ # Requirements And Limitations
2
+
3
+ This page separates requirements for ordinary site work from optional tooling
4
+ and current product boundaries.
5
+
6
+ ## Required For Every Site
7
+
8
+ - Node.js `22.12.0` or later.
9
+ - npm or another package manager capable of installing the project-local
10
+ `@janga/norna` dependency. Generated standalone sites use npm scripts and a
11
+ committed `package-lock.json` by default.
12
+ - A terminal and a text editor.
13
+
14
+ ## Required For Managed Raster Images
15
+
16
+ ImageMagick is required when Norna reads raster image dimensions or generates
17
+ responsive raster variants. Norna accepts either the current `magick` command
18
+ or the older `identify` and `convert` commands.
19
+
20
+ Static SVG images with an intrinsic aspect ratio are rendered directly and do
21
+ not need raster variants. See [Images and Metadata](images-and-metadata.md) for
22
+ the supported managed-image behavior.
23
+
24
+ ## Optional Tools
25
+
26
+ - Git is strongly recommended for reviewing and restoring site changes. It is
27
+ used by the normal commit-and-push publishing workflow.
28
+ - GitHub CLI (`gh`) is needed only for Norna's deploy status and monitoring
29
+ helpers.
30
+ - Playwright Chromium is needed only for navigation diagnostics used while
31
+ developing the Norna engine.
32
+
33
+ Neither GitHub CLI nor Playwright is required to edit, preview, check, or build
34
+ an ordinary Norna site.
35
+
36
+ ## Current Product Boundaries
37
+
38
+ - Norna builds generated static output into `dist/`.
39
+ - GitHub Pages is the only publishing provider with an included integration.
40
+ Other static hosts can serve the generated files, but Norna does not
41
+ currently configure or publish to them.
42
+ - Norna provides its own site model and presentation layer. A project does not
43
+ supply custom page templates, component trees, or rendering logic through
44
+ the normal site interface.
45
+ - Norna is intended for content-driven websites. Dynamic applications,
46
+ database-backed publishing, and visual CMS editing are outside its current
47
+ scope.
48
+ - Norna is pre-1.0. Breaking changes to files, configuration, and commands may
49
+ occur between releases and should be reviewed before updating a project.
50
+
51
+ These constraints are part of the product's current scope, not hidden setup
52
+ steps. Start with [the tutorial](getting-started.md), and use
53
+ [`norna engine:version`](commands.md#command-summary) to inspect the version
54
+ installed by an existing project.
package/docs/routes.md CHANGED
@@ -13,7 +13,7 @@ an optional route-local `theme.md`. The route theme replaces the root visual
13
13
  theme for that route and can select any complete top-level theme preset. Route
14
14
  directories cannot contain technical site
15
15
  configuration; technical configuration stays in the selected site directory's
16
- top-level `config.mjs`.
16
+ top-level `config.md`.
17
17
 
18
18
  ## Route Directory Format
19
19
 
@@ -9,7 +9,7 @@ The selected site directory defaults to `site/`:
9
9
 
10
10
  ```text
11
11
  site/
12
- |-- config.mjs
12
+ |-- config.md
13
13
  |-- theme.md
14
14
  |-- sitewide-content.md
15
15
  |-- content.md
@@ -28,7 +28,7 @@ site/
28
28
 
29
29
  Use `NORNA_SITE_DIR` or `norna --site-dir <path>` to select another
30
30
  site directory. Without an explicit site directory, commands first accept the
31
- current directory when it contains both `config.mjs` and `content.md`.
31
+ current directory when it contains both `config.md` 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
34
  `theme.md` is required. It can contain only a complete preset selection.
@@ -37,7 +37,7 @@ default `site/` directory containing those files.
37
37
 
38
38
  Version these files in a site repository:
39
39
 
40
- - `site/config.mjs`: technical site configuration.
40
+ - `site/config.md`: public URL and optional language and smooth scrolling.
41
41
  - `site/theme.md`: required site-wide visual theme. It normally selects a
42
42
  complete preset and may add focused layout, image, typography, palette, or
43
43
  section-surface overrides.
@@ -75,7 +75,7 @@ Do not edit these by hand:
75
75
 
76
76
  Favicons are convention-based. Put files such as `favicon.svg`, `favicon.ico`,
77
77
  `favicon.png`, or `apple-touch-icon.png` in `site/public/`. The renderer emits
78
- icon links only for files that exist and prefixes them with `site.basePath`
78
+ icon links only for files that exist and prefixes them with the base path
79
79
  when the site is published below a path such as `/repository-name/`.
80
80
 
81
81
  ## Engine Repository Layout
@@ -2,7 +2,8 @@
2
2
 
3
3
  `site/sitewide-content.md` contains content and settings shared by the whole site. It
4
4
  is separate from `content.md`, which defines the homepage, and from
5
- `config.mjs`, which defines technical behaviour.
5
+ `config.md`, which defines the public URL and optional language and scroll
6
+ behaviour.
6
7
 
7
8
  ## Site identity
8
9
 
package/docs/theme.md CHANGED
@@ -263,3 +263,21 @@ technical configuration.
263
263
  Section surfaces render as full-width horizontal bands while the section
264
264
  content keeps the normal page and image widths. Links keep the palette's global
265
265
  accent color.
266
+
267
+ ## Common Questions
268
+
269
+ ### Should every route select its own preset?
270
+
271
+ No. A route without its own `theme.md` inherits the root theme, which is the
272
+ normal choice when the site should keep one visual expression.
273
+
274
+ Add a route theme only when the route should intentionally look different. If
275
+ the route should keep the same preset but demonstrate a focused change, repeat
276
+ the root preset in the route theme and override only that setting. This is
277
+ necessary because a route theme replaces the root visual theme rather than
278
+ merging with it.
279
+
280
+ For example, a route demonstrating section surfaces may keep `preset: project`
281
+ and change only `presentation.sectionSurfaces`. A route demonstrating media or
282
+ content blocks should normally inherit the root preset so that the media or
283
+ content remains the only variable being compared.