@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,224 +1,125 @@
1
1
  # Configuration
2
2
 
3
- Technical site configuration lives in the selected site's `config.mjs`; by
4
- default that is `site/config.mjs`. The file must default-export an object.
3
+ Technical site configuration lives in the selected site's `config.md`; by
4
+ default that is `site/config.md`. The file contains YAML frontmatter only.
5
5
 
6
- This document describes the generic configuration interface. It does not list
7
- the current values for any one site.
6
+ A normal configuration needs only the public URL:
8
7
 
9
- ## Site
8
+ ```yaml
9
+ ---
10
+ url: https://example.com/
11
+ ---
12
+ ```
13
+
14
+ Norna deliberately keeps this file small. Visual choices belong in
15
+ `theme.md`; shared identity, banners and footer content belong in
16
+ `sitewide-content.md`.
10
17
 
11
- ### `site.url`
18
+ ## `url`
12
19
 
13
- - Purpose: canonical public URL used in the page `<link rel="canonical">`,
14
- deploy monitoring output, and site-specific documentation.
15
- - Type: string.
20
+ - Purpose: canonical public URL and the source of the site's deployment path.
21
+ - Type: absolute `http` or `https` URL.
16
22
  - Required: yes.
17
23
  - Default: none.
18
- - Validation: non-empty absolute URL accepted by `new URL()`.
19
- - Consequence: wrong values render a wrong canonical URL and make deploy
20
- output point at the wrong site. For GitHub Pages project sites, include the
21
- repository path in the URL, for example `https://owner.github.io/repo-name/`.
22
-
23
- Example:
24
+ - Restrictions: no query string or fragment.
24
25
 
25
- ```js
26
- site: {
27
- url: 'https://example.com/',
28
- }
29
- ```
30
-
31
- ### `site.basePath`
26
+ Norna adds a trailing slash when it is omitted. The URL pathname becomes the
27
+ base path for generated links, favicons and managed images, so there is no
28
+ separate `basePath` setting.
32
29
 
33
- - Purpose: URL path prefix used for generated internal page links, favicons,
34
- generated image URLs, and root-relative links or images written in Markdown.
35
- - Type: string URL path.
36
- - Required: no.
37
- - Default: `/`.
38
- - Validation: must start and end with `/` and must not contain whitespace,
39
- `?`, `#`, or `//`.
40
- - Consequence: use `/` for a root site or custom domain. Use
41
- `/repository-name/` for a GitHub Pages project site without a custom domain.
42
- Source Markdown can still use root-relative paths such as `/favicon.svg` or
43
- `/getting-started/`; Norna prefixes them during rendering.
44
-
45
- Examples:
46
-
47
- ```js
48
- site: {
49
- url: 'https://example.com/',
50
- basePath: '/',
51
- }
52
- ```
30
+ Root-hosted site or custom domain:
53
31
 
54
- ```js
55
- site: {
56
- url: 'https://janga.github.io/norna/',
57
- basePath: '/norna/',
58
- }
32
+ ```yaml
33
+ ---
34
+ url: https://example.com/
35
+ ---
59
36
  ```
60
37
 
61
- ## Visual Theme
62
-
63
- Visual configuration lives in `site/theme.md`, not `site/config.mjs`.
64
-
65
- Use [Theme](theme.md) for:
66
-
67
- - complete theme presets and focused overrides
68
- - `layout.pageWidth`
69
- - `layout.gutter`
70
- - `layout.density`
71
- - `gallery.width`
72
- - `gallery.maxAvailableWidthPercent`
73
- - `gallery.maxAvailableHeightPercent`
74
- - `typography.fontFamily`
75
- - typography presets, rhythm, and overrides
76
- - presentation palettes and section surfaces
77
-
78
- ## Navigation
79
-
80
- ### `navigation.smoothScroll`
81
-
82
- - Purpose: controls enhanced same-page anchor navigation and native
83
- `scroll-behavior`.
84
- - Type: object.
85
- - Required: no; omitted fields use defaults.
86
-
87
- Fields:
88
-
89
- - `navigation.smoothScroll.enabled`: boolean, default `true`.
90
- - `navigation.smoothScroll.minimumDurationMs`: positive integer, default
91
- `2000`.
92
- - `navigation.smoothScroll.maximumDurationMs`: positive integer, default
93
- `4000`; must be greater than or equal to `minimumDurationMs`.
94
- - `navigation.smoothScroll.durationPerPixelMs`: positive number, default
95
- `0.22`.
38
+ GitHub Pages project site:
96
39
 
97
- When `enabled` is `false`, section links jump directly to anchors without the
98
- controlled animation. The no-JavaScript fallback keeps real `href="#section-id"`
99
- links.
100
-
101
- Example:
102
-
103
- ```js
104
- navigation: {
105
- smoothScroll: {
106
- enabled: true,
107
- minimumDurationMs: 600,
108
- maximumDurationMs: 1_200,
109
- durationPerPixelMs: 0.2,
110
- },
111
- }
40
+ ```yaml
41
+ ---
42
+ url: https://owner.github.io/repository-name/
43
+ ---
112
44
  ```
113
45
 
114
- ## Locale And UI Labels
46
+ In the second example, Norna derives `/repository-name/` as the base path.
47
+ Root-relative links written in Markdown are prefixed when rendered.
115
48
 
116
- ### `locale.lang`
49
+ ## `language`
117
50
 
118
- - Purpose: language tag rendered on the root `<html lang="...">` element.
119
- - Type: string language tag such as `en` or `sv`.
51
+ - Purpose: language tag rendered on the root `<html lang="...">` element and
52
+ selection of Norna's built-in interface text.
53
+ - Type: language tag such as `en`, `en-GB`, `sv` or `sv-SE`.
120
54
  - Required: no.
121
55
  - Default: `en`.
122
- - Validation: two or three letters, optionally followed by `-` separated
123
- subtags.
124
- - Consequence: screen readers, browsers, and search engines use this to
125
- interpret the page language.
126
-
127
- ### `locale.labels`
128
-
129
- - Purpose: site-wide UI labels rendered by the engine for non-editorial
130
- interface text.
131
- - Type: object.
132
- - Required: no; omitted labels use English defaults.
133
-
134
- Fields:
135
-
136
- - `locale.labels.skipToContent`: skip-link text, default `Skip to content`.
137
- - `locale.labels.siteNavigation`: site-level navigation ARIA label and mobile
138
- menu group heading, default `Pages`.
139
- - `locale.labels.pageNavigation`: current-page section navigation ARIA label and
140
- mobile menu group heading, default `On this page`.
141
- - `locale.labels.sectionNavigation`: legacy section navigation label, default
142
- `Sections`.
143
- - `locale.labels.menu`: mobile menu summary text, default `Menu`.
144
- - `locale.labels.closeMenu`: reserved close-menu label, default `Close menu`.
145
- - `locale.labels.dismissBanner`: banner dismissal button label, default
146
- `Dismiss notice`.
147
- - `locale.labels.siteBanners`: ARIA label for the banner stack, default
148
- `Site notices`.
149
- - `locale.labels.gallery`: Norna managed media ARIA label prefix, default
150
- `Images`.
151
-
152
- Example:
153
56
 
154
- ```js
155
- locale: {
156
- lang: 'sv',
157
- labels: {
158
- skipToContent: 'Hoppa till innehåll',
159
- siteNavigation: 'Sidor',
160
- pageNavigation: 'På denna sida',
161
- sectionNavigation: 'Sektioner',
162
- menu: 'Meny',
163
- gallery: 'Bilder',
164
- },
165
- }
166
- ```
57
+ Norna currently includes interface text for English and Swedish. Regional tags
58
+ use the language identified by their primary subtag. An unsupported language is
59
+ an error because silently rendering English controls on another-language pages
60
+ would be misleading.
167
61
 
168
- ## Sitewide Content
62
+ Interface labels are part of the engine and are not configured individually.
63
+ Editorial text remains in `content.md`, route content files and
64
+ `sitewide-content.md`.
169
65
 
170
- Shared site identity, banners and footer content are defined in
171
- `site/sitewide-content.md`. See [Sitewide Content](sitewide-content.md) for the
172
- schema and examples.
66
+ ## `smoothScroll`
173
67
 
174
- ## GitHub
68
+ - Purpose: enables smooth same-page anchor movement.
69
+ - Type: boolean.
70
+ - Required: no.
71
+ - Default: `false`.
175
72
 
176
- ### `github.repo`
73
+ Example:
177
74
 
178
- - Purpose: repository used by deploy checks and deploy monitoring.
179
- - Type: string in `owner/name` form.
180
- - Required: yes.
181
- - Default: none.
182
- - Validation: non-empty string.
75
+ ```yaml
76
+ ---
77
+ url: https://example.com/
78
+ smoothScroll: true
79
+ ---
80
+ ```
183
81
 
184
- ### `github.branch`
82
+ Norna uses the browser's native CSS scrolling behavior rather than a scripted
83
+ animation. Visitors whose system requests reduced motion always get immediate
84
+ anchor movement.
185
85
 
186
- - Purpose: deploy branch required by `norna deploy` and monitored by
187
- `deploy:watch`.
188
- - Type: string.
189
- - Required: yes.
190
- - Default: none.
191
- - Validation: non-empty string.
86
+ ## Complete Example
192
87
 
193
- ### `github.pagesWorkflow`
88
+ ```yaml
89
+ ---
90
+ url: https://example.com/
91
+ language: en
92
+ smoothScroll: false
93
+ ---
94
+ ```
194
95
 
195
- - Purpose: GitHub Actions workflow name used by deploy checks and
196
- `deploy:watch`.
197
- - Type: string.
198
- - Required: yes.
199
- - Default: none.
200
- - Validation: non-empty string.
96
+ Do not add Markdown below the closing `---`; `config.md` is frontmatter-only.
97
+ Run `npm run norna:config:check` after changing it.
201
98
 
202
- ## Deploy Watch
99
+ ## Related Files
203
100
 
204
- ### `deploy.watch`
101
+ - [`theme.md`](theme.md) selects a complete presentation preset and optional
102
+ focused overrides.
103
+ - [`sitewide-content.md`](sitewide-content.md) contains shared identity,
104
+ banners and footer content.
105
+ - [`content.md`](content.md) and route content files contain page content.
205
106
 
206
- - Purpose: defaults for `norna deploy:watch`.
207
- - Type: object.
208
- - Required: no; omitted fields use defaults.
107
+ ## Publishing Discovery
209
108
 
210
- Fields:
109
+ GitHub repository, default branch and deploy workflow are not site
110
+ configuration fields.
211
111
 
212
- - `deploy.watch.intervalMs`: positive integer, default `10000`.
213
- - `deploy.watch.timeoutMs`: positive integer, default `900000`.
214
- - `deploy.watch.runLimit`: positive integer, default `10`.
112
+ `norna deploy` discovers the current GitHub repository and its default branch
113
+ through the authenticated GitHub CLI. Norna's included workflow file is
114
+ `.github/workflows/deploy.yml`. `deploy:watch` accepts command-line overrides
115
+ such as `--repo`, `--branch`, `--workflow`, `--interval`, `--timeout` and
116
+ `--limit` when a one-off run needs different values.
215
117
 
216
- Command-line options such as `--interval`, `--timeout`, and `--limit` can
217
- override these values for one run.
118
+ See [Publishing](publishing.md) for the complete workflow.
218
119
 
219
120
  ## Site Directory Selection
220
121
 
221
- The site directory is not configured in `config.mjs`.
122
+ The site directory is not configured in `config.md`.
222
123
 
223
124
  Use one of:
224
125
 
@@ -229,9 +130,9 @@ norna --site-dir my-site build
229
130
 
230
131
  If `NORNA_SITE_DIR` is set to an empty value, commands fail. Relative site
231
132
  directories are resolved by walking upward from the invocation root until the
232
- selected directory contains `config.mjs` and `content.md`. Absolute site
133
+ selected directory contains `config.md` and `content.md`. Absolute site
233
134
  directories are accepted and make their parent the site project root.
234
135
 
235
- When no site directory is explicitly selected, the current directory itself can
236
- be the site directory if it contains `config.mjs` and `content.md`. If not,
136
+ When no site directory is explicitly selected, the current directory itself
137
+ can be the site directory if it contains `config.md` and `content.md`. If not,
237
138
  Norna walks upward looking for a default `site/` directory with those files.
@@ -295,7 +295,7 @@ Messages emitted by the engine should mention the direct CLI command and the
295
295
  starter-style npm wrapper when suggesting a fix.
296
296
 
297
297
  Configuration edits are normally manual edits to the selected site
298
- `config.mjs`, followed by:
298
+ `config.md`, followed by:
299
299
 
300
300
  ```sh
301
301
  npm run norna:config:check
@@ -78,7 +78,8 @@ Diagrams must match the current Norna model:
78
78
  - Norna managed media blocks cover fixed site patterns such as image stacks,
79
79
  carousels, and card lists.
80
80
  - `theme.md` controls visual presentation.
81
- - `config.mjs` controls technical site configuration.
81
+ - `config.md` controls the public URL and optional language and smooth
82
+ scrolling.
82
83
  - `dist/` is generated static output.
83
84
  - GitHub Pages is the integrated publishing target today.
84
85
 
@@ -67,6 +67,7 @@ examples/
67
67
  feature-demos/
68
68
  theme-presets/
69
69
  media-and-surfaces/
70
+ sitewide-content/
70
71
  ```
71
72
 
72
73
  `complete-sites/` contains coherent sites that show how Norna files work
@@ -82,8 +83,10 @@ together in a realistic project:
82
83
  overrides.
83
84
  - `media-and-surfaces/`: managed media blocks, notes, palettes and section
84
85
  surfaces. This is also the broad demo-build and navigation-test target.
86
+ - `sitewide-content/`: convention-based identity, navigation, banner stacks,
87
+ dismissal and footer content shared across routes.
85
88
 
86
- The repository Pages workflow builds all four examples and publishes them
89
+ The repository Pages workflow builds all examples and publishes them
87
90
  under `/norna/examples/`. The HTML documentation links to those rendered sites
88
91
  from its Examples route.
89
92
 
@@ -7,7 +7,8 @@ This document is for work on the reusable `norna` package itself.
7
7
  - `bin/norna.mjs`: public CLI launcher and local-version resolver.
8
8
  - `bin/norna-cli.mjs`: public CLI command dispatcher.
9
9
  - `scripts/lib/site-paths.mjs`: engine/site path resolution.
10
- - `scripts/lib/project-config.mjs`: `site/config.mjs` validation and defaults.
10
+ - `scripts/lib/project-config.mjs`: frontmatter-only `site/config.md`
11
+ validation, defaults and derived URL path.
11
12
  - `scripts/sync-content-sections.mjs`: content validation and sync behavior.
12
13
  - `scripts/generate-images.mjs`: managed image pipeline and manifest.
13
14
  - `scripts/sync-site-public.mjs`: static public file sync.
@@ -33,6 +34,7 @@ Run focused checks while developing:
33
34
  ```sh
34
35
  npm run test:content-check
35
36
  npm run test:site-public
37
+ npm run test:documentation
36
38
  npm run test:fixture:build
37
39
  npm run test:examples
38
40
  npm run demo:build
@@ -43,6 +45,11 @@ npm run package:check
43
45
  `examples/`. `npm run test` includes those builds in the standard check
44
46
  sequence.
45
47
 
48
+ `npm run test:documentation` extracts the file examples from the five-minute
49
+ tutorial, applies them to a freshly initialized temporary site, runs the
50
+ configuration and content checks, builds the result, and checks local Markdown
51
+ links plus the `llms.txt` source targets.
52
+
46
53
  `npm run build:pages` is specific to this repository. It builds the
47
54
  documentation site and assembles rendered examples under `dist/examples/` for
48
55
  the shared GitHub Pages artifact. It is not a generic Norna site command.
@@ -188,11 +195,11 @@ history, back/forward moves between hash entries, and returning to the same page
188
195
  without a hash restores the first section as active. The enhancement does not
189
196
  derive active section state from free manual scrolling.
190
197
 
191
- The sticky navigation updates root scroll offset variables so direct hash links
192
- and clicked links land below the fixed header. Hash targets may be corrected
193
- again after layout shifts such as image loading, but that correction must not
194
- add history entries or change the active section independently of the URL hash.
198
+ The sticky navigation updates a root scroll-offset variable so direct hash
199
+ links and clicked links remain visible below the fixed header. The browser owns
200
+ anchor movement; Norna does not run a separate scroll animation or retry anchor
201
+ positions after later layout shifts.
195
202
 
196
- The shared layout reads UI language and labels from `site/config.mjs`
197
- `locale`. Keep editorial content in page Markdown and non-editorial engine UI
198
- labels in config.
203
+ The shared layout selects Norna's built-in UI labels from the optional
204
+ `language` in `site/config.md`. Keep editorial content in page Markdown and
205
+ non-editorial engine UI labels in the engine language packs.