@janga/norna 0.7.10 → 0.7.12

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 (476) hide show
  1. package/README.md +120 -106
  2. package/bin/norna-cli.mjs +4 -1
  3. package/docs/README.md +107 -74
  4. package/docs/assets/norna-dog-shelter.jpg +0 -0
  5. package/docs/commands.md +13 -4
  6. package/docs/configuration.md +86 -184
  7. package/docs/content.md +14 -14
  8. package/docs/design/command-organization.md +1 -1
  9. package/docs/design/norna-diagram-design.md +2 -1
  10. package/docs/design/site-examples-structure.md +38 -24
  11. package/docs/engine-development.md +28 -15
  12. package/docs/getting-started.md +141 -124
  13. package/docs/how-to/embedded-site.md +35 -0
  14. package/docs/publishing.md +47 -46
  15. package/docs/requirements.md +54 -0
  16. package/docs/routes.md +3 -2
  17. package/docs/site-structure.md +12 -9
  18. package/docs/sitewide-content.md +2 -1
  19. package/docs/theme.md +104 -34
  20. package/docs/typography.md +32 -17
  21. package/examples/README.md +43 -0
  22. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/sitewide.schema.json +24 -0
  23. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/theme.schema.json +9 -24
  24. package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/content.d.ts +9 -1
  25. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -0
  26. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev-local.json +2 -2
  27. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +13 -0
  28. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +26 -0
  29. package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +5 -0
  30. package/examples/complete-sites/dog-shelter-multi-page/README.md +16 -0
  31. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +74 -0
  32. package/examples/{typography-presets/node_modules/.vite/deps/astro-D_GIpJIE.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js} +4 -4
  33. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  34. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js +151 -151
  35. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  36. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js +131 -131
  37. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  38. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js +1 -1
  39. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  40. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +10 -10
  41. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  42. package/examples/{typography-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js} +10 -10
  43. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  44. package/examples/{typography-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js} +1 -1
  45. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  46. package/examples/{typography-presets/node_modules/.vite/deps/icons-RyebKi45.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js} +1 -1
  47. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  48. package/examples/{typography-presets/node_modules/.vite/deps/settings-DaU-gNnK.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js} +2 -2
  49. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  50. package/examples/{typography-presets/node_modules/.vite/deps/toolbar-63PA619H.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js} +2 -2
  51. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  52. package/examples/{typography-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js} +10 -10
  53. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  54. package/examples/{typography-presets/node_modules/.vite/deps/window-jPkpKVcy.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js} +1 -1
  55. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  56. package/examples/{typography-presets/node_modules/.vite/deps/xray-BXCHpEJP.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js} +3 -3
  57. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  58. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +98 -0
  59. package/examples/complete-sites/dog-shelter-multi-page/site/config.md +3 -0
  60. package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/content.md +12 -0
  61. package/examples/complete-sites/dog-shelter-multi-page/site/public/logo.svg +9 -0
  62. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/route-content.md +22 -0
  63. package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/020-adopt/route-content.md +11 -0
  64. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.md +16 -0
  65. package/examples/complete-sites/dog-shelter-multi-page/site/theme.md +3 -0
  66. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +59 -0
  67. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +138 -0
  68. package/examples/{dog-gallery → complete-sites/dog-shelter-single-page}/.astro/collections/theme.schema.json +151 -68
  69. package/examples/complete-sites/dog-shelter-single-page/.astro/content.d.ts +183 -0
  70. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +1 -0
  71. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +13 -0
  72. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +14 -0
  73. package/examples/complete-sites/dog-shelter-single-page/.astro/settings.json +5 -0
  74. package/examples/complete-sites/dog-shelter-single-page/README.md +16 -0
  75. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +74 -0
  76. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  77. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  78. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  79. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  80. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  81. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  82. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  83. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  84. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  85. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  86. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  87. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  88. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  89. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  90. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  91. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  92. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  93. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  94. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  95. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  96. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  97. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  98. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  99. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  100. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  101. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  102. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +50 -0
  103. package/examples/complete-sites/dog-shelter-single-page/site/config.md +3 -0
  104. package/examples/complete-sites/dog-shelter-single-page/site/content.md +34 -0
  105. package/examples/complete-sites/dog-shelter-single-page/site/public/logo.svg +9 -0
  106. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.md +16 -0
  107. package/examples/complete-sites/dog-shelter-single-page/site/theme.md +3 -0
  108. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +59 -0
  109. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +138 -0
  110. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +755 -0
  111. package/examples/feature-demos/media-and-surfaces/.astro/content-assets.mjs +4 -0
  112. package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +1 -0
  113. package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +183 -0
  114. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -0
  115. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +24 -0
  116. package/examples/feature-demos/media-and-surfaces/.astro/settings.json +5 -0
  117. package/examples/feature-demos/media-and-surfaces/.astro/types.d.ts +2 -0
  118. package/examples/feature-demos/media-and-surfaces/README.md +21 -0
  119. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +80 -0
  120. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  121. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  122. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  123. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  124. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  125. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  126. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  127. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  128. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  129. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  130. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  131. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  132. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js +1389 -0
  133. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  134. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  135. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  136. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  137. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  138. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/package.json +3 -0
  139. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  140. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  141. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  142. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  143. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  144. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  145. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  146. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  147. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  148. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  149. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  150. package/examples/{presentation → feature-demos/media-and-surfaces}/site/.norna/generated-images.json +16 -16
  151. package/examples/feature-demos/media-and-surfaces/site/config.md +4 -0
  152. package/examples/feature-demos/media-and-surfaces/site/content.md +18 -0
  153. package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/route-content.md +17 -24
  154. package/examples/{presentation/site/routes/030-surfaces → feature-demos/media-and-surfaces/site/routes/020-surfaces}/route-content.md +1 -1
  155. package/examples/{presentation/site/routes/030-surfaces → feature-demos/media-and-surfaces/site/routes/020-surfaces}/theme.md +1 -0
  156. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.md +6 -0
  157. package/examples/feature-demos/media-and-surfaces/site/theme.md +3 -0
  158. package/examples/feature-demos/sitewide-content/.astro/collections/site.schema.json +59 -0
  159. package/examples/feature-demos/sitewide-content/.astro/collections/sitewide.schema.json +138 -0
  160. package/examples/feature-demos/sitewide-content/.astro/collections/theme.schema.json +755 -0
  161. package/examples/feature-demos/sitewide-content/.astro/content-assets.mjs +1 -0
  162. package/examples/feature-demos/sitewide-content/.astro/content-modules.mjs +1 -0
  163. package/examples/feature-demos/sitewide-content/.astro/content.d.ts +183 -0
  164. package/examples/feature-demos/sitewide-content/.astro/data-store.json +1 -0
  165. package/examples/feature-demos/sitewide-content/.astro/dev.json +13 -0
  166. package/examples/feature-demos/sitewide-content/.astro/dev.log +18 -0
  167. package/examples/feature-demos/sitewide-content/.astro/settings.json +5 -0
  168. package/examples/feature-demos/sitewide-content/.astro/types.d.ts +2 -0
  169. package/examples/feature-demos/sitewide-content/README.md +18 -0
  170. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/_metadata.json +74 -0
  171. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  172. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  173. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  174. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  175. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  176. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  177. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  178. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  179. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  180. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  181. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  182. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  183. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  184. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  185. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  186. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  187. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/package.json +3 -0
  188. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  189. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  190. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  191. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  192. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  193. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  194. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  195. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  196. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  197. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  198. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  199. package/examples/feature-demos/sitewide-content/site/.norna/generated-images.json +1 -0
  200. package/examples/feature-demos/sitewide-content/site/config.md +3 -0
  201. package/examples/feature-demos/sitewide-content/site/content.md +16 -0
  202. package/examples/feature-demos/sitewide-content/site/public/logo.svg +6 -0
  203. package/examples/feature-demos/sitewide-content/site/routes/010-identity/route-content.md +20 -0
  204. package/examples/feature-demos/sitewide-content/site/routes/020-notices/route-content.md +22 -0
  205. package/examples/feature-demos/sitewide-content/site/routes/030-footer/route-content.md +17 -0
  206. package/examples/feature-demos/sitewide-content/site/sitewide-content.md +33 -0
  207. package/examples/feature-demos/sitewide-content/site/theme.md +3 -0
  208. package/examples/feature-demos/theme-presets/.astro/collections/site.schema.json +59 -0
  209. package/examples/feature-demos/theme-presets/.astro/collections/sitewide.schema.json +138 -0
  210. package/examples/feature-demos/theme-presets/.astro/collections/theme.schema.json +755 -0
  211. package/examples/feature-demos/theme-presets/.astro/content-assets.mjs +4 -0
  212. package/examples/feature-demos/theme-presets/.astro/content-modules.mjs +1 -0
  213. package/examples/{typography-presets → feature-demos/theme-presets}/.astro/data-store.json +1 -1
  214. package/examples/feature-demos/theme-presets/.astro/dev-local.json +8 -0
  215. package/examples/{typography-presets → feature-demos/theme-presets}/.astro/dev.json +2 -2
  216. package/examples/feature-demos/theme-presets/.astro/dev.log +164 -0
  217. package/examples/feature-demos/theme-presets/.astro/types.d.ts +2 -0
  218. package/examples/feature-demos/theme-presets/README.md +18 -0
  219. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/package.json +3 -0
  220. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  221. package/examples/{typography-presets → feature-demos/theme-presets}/site/.norna/generated-images.json +45 -45
  222. package/examples/feature-demos/theme-presets/site/config.md +3 -0
  223. package/examples/feature-demos/theme-presets/site/content.md +17 -0
  224. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio/shepherd-portrait.jpg +0 -0
  225. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio/white-puppy.jpg +0 -0
  226. package/examples/{typography-presets/site/routes/010-quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio}/route-content.md +8 -8
  227. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/theme.md +3 -0
  228. package/examples/feature-demos/theme-presets/site/routes/020-documentation/images/documentation/retriever-portrait.jpg +0 -0
  229. package/examples/{typography-presets/site/routes/020-compact-gallery → feature-demos/theme-presets/site/routes/020-documentation}/route-content.md +8 -8
  230. package/examples/feature-demos/theme-presets/site/routes/020-documentation/theme.md +3 -0
  231. package/examples/feature-demos/theme-presets/site/routes/030-project/images/project/boxer-portrait.jpg +0 -0
  232. package/examples/feature-demos/theme-presets/site/routes/030-project/images/project/grass-puppy.jpg +0 -0
  233. package/examples/{typography-presets/site/routes/030-text-forward → feature-demos/theme-presets/site/routes/030-project}/route-content.md +8 -8
  234. package/examples/feature-demos/theme-presets/site/routes/030-project/theme.md +3 -0
  235. package/examples/feature-demos/theme-presets/site/routes/040-statement/images/statement/sheepdog-grass.jpg +0 -0
  236. package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/route-content.md +3 -3
  237. package/examples/feature-demos/theme-presets/site/routes/040-statement/theme.md +3 -0
  238. package/examples/{typography-presets → feature-demos/theme-presets}/site/sitewide-content.md +1 -1
  239. package/examples/feature-demos/theme-presets/site/theme.md +3 -0
  240. package/fixtures/basic/site/config.md +3 -0
  241. package/fixtures/content-model-v2/site/config.md +3 -0
  242. package/package.json +17 -8
  243. package/scripts/build-pages.mjs +69 -0
  244. package/scripts/check-config.mjs +3 -11
  245. package/scripts/deploy-site.mjs +12 -8
  246. package/scripts/export-theme-preset.mjs +31 -0
  247. package/scripts/init-site.mjs +1 -0
  248. package/scripts/lib/example-sites.mjs +37 -0
  249. package/scripts/lib/github-repository.mjs +44 -0
  250. package/scripts/lib/norna-markdown-blocks.mjs +97 -10
  251. package/scripts/lib/presentation.mjs +6 -5
  252. package/scripts/lib/project-config.mjs +114 -124
  253. package/scripts/lib/site-content.mjs +9 -2
  254. package/scripts/lib/site-paths.mjs +6 -2
  255. package/scripts/lib/theme-config.mjs +3 -0
  256. package/scripts/lib/theme-presets.mjs +209 -0
  257. package/scripts/show-typography.mjs +6 -5
  258. package/scripts/test-client-javascript.mjs +236 -0
  259. package/scripts/test-content-check.mjs +103 -0
  260. package/scripts/test-content-model-v2.mjs +9 -13
  261. package/scripts/test-documentation.mjs +116 -0
  262. package/scripts/test-engine-commands.mjs +13 -3
  263. package/scripts/test-examples.mjs +24 -0
  264. package/scripts/test-navigation.mjs +73 -45
  265. package/scripts/test-package-check.mjs +17 -9
  266. package/scripts/test-project-config.mjs +130 -0
  267. package/scripts/test-temporary-visibility.mjs +3 -10
  268. package/scripts/test-theme-presets.mjs +146 -0
  269. package/scripts/watch-pages-deploy.mjs +15 -11
  270. package/src/components/GalleryGrid.astro +30 -230
  271. package/src/components/ImageCarousel.astro +184 -0
  272. package/src/components/MobileSectionNavigationScript.astro +14 -0
  273. package/src/components/NornaSmoothScrollScript.astro +250 -0
  274. package/src/components/SiteNavigation.astro +58 -341
  275. package/src/components/SiteNotesScript.astro +43 -0
  276. package/src/components/SitePage.astro +6 -3
  277. package/src/components/SiteSection.astro +4 -47
  278. package/src/content.config.ts +2 -0
  279. package/src/layouts/BaseLayout.astro +1 -1
  280. package/src/lib/galleryImages.ts +53 -0
  281. package/src/styles/global.css +83 -1
  282. package/starters/basic/.github/workflows/deploy.yml +1 -2
  283. package/starters/basic/README.md +10 -8
  284. package/starters/basic/package.json +1 -0
  285. package/starters/basic/site/config.md +3 -0
  286. package/starters/project/.github/workflows/deploy.yml +1 -2
  287. package/starters/project/README.md +3 -4
  288. package/starters/project/package.json +1 -0
  289. package/starters/project/site/config.md +3 -0
  290. package/examples/001-dog-shelter-single-page/README.md +0 -9
  291. package/examples/001-dog-shelter-single-page/site/config.mjs +0 -27
  292. package/examples/001-dog-shelter-single-page/site/content.md +0 -38
  293. package/examples/001-dog-shelter-single-page/site/images/what-we-do/dog-house.svg +0 -25
  294. package/examples/001-dog-shelter-single-page/site/images/you-can-help/heart.svg +0 -13
  295. package/examples/001-dog-shelter-single-page/site/sitewide-content.md +0 -6
  296. package/examples/001-dog-shelter-single-page/site/theme.md +0 -25
  297. package/examples/002-dog-shelter-multi-page/README.md +0 -9
  298. package/examples/002-dog-shelter-multi-page/site/config.mjs +0 -27
  299. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.svg +0 -19
  300. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.svg +0 -19
  301. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/route-content.md +0 -30
  302. package/examples/002-dog-shelter-multi-page/site/sitewide-content.md +0 -6
  303. package/examples/002-dog-shelter-multi-page/site/theme.md +0 -25
  304. package/examples/dog-gallery/.astro/collections/site.schema.json +0 -776
  305. package/examples/dog-gallery/.astro/data-store.json +0 -1
  306. package/examples/dog-gallery/.astro/dev-local.json +0 -8
  307. package/examples/dog-gallery/.astro/dev.json +0 -13
  308. package/examples/dog-gallery/.astro/dev.log +0 -95
  309. package/examples/dog-gallery/.astro/settings.json +0 -5
  310. package/examples/dog-gallery/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +0 -1
  311. package/examples/dog-gallery/dist/_astro/SitePage.DicGh_5N.css +0 -1
  312. package/examples/dog-gallery/dist/dog-care/index.html +0 -15
  313. package/examples/dog-gallery/dist/dog-shelter-logo.svg +0 -14
  314. package/examples/dog-gallery/dist/favicon.svg +0 -7
  315. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp +0 -0
  316. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp +0 -0
  317. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp +0 -0
  318. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp +0 -0
  319. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp +0 -0
  320. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp +0 -0
  321. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp +0 -0
  322. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp +0 -0
  323. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1080.webp +0 -0
  324. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp +0 -0
  325. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1920.webp +0 -0
  326. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-3939.webp +0 -0
  327. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-480.webp +0 -0
  328. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-768.webp +0 -0
  329. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp +0 -0
  330. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp +0 -0
  331. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp +0 -0
  332. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-2400.webp +0 -0
  333. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp +0 -0
  334. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp +0 -0
  335. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp +0 -0
  336. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp +0 -0
  337. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp +0 -0
  338. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp +0 -0
  339. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-768.webp +0 -0
  340. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp +0 -0
  341. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp +0 -0
  342. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp +0 -0
  343. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-2576.webp +0 -0
  344. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp +0 -0
  345. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp +0 -0
  346. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1080.webp +0 -0
  347. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp +0 -0
  348. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-480.webp +0 -0
  349. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-768.webp +0 -0
  350. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp +0 -0
  351. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp +0 -0
  352. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp +0 -0
  353. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp +0 -0
  354. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp +0 -0
  355. package/examples/dog-gallery/dist/index.html +0 -45
  356. package/examples/dog-gallery/node_modules/.vite/deps/_metadata.json +0 -74
  357. package/examples/dog-gallery/site/.norna/generated-images.json +0 -226
  358. package/examples/dog-gallery/site/config.mjs +0 -47
  359. package/examples/dog-gallery/site/content.md +0 -127
  360. package/examples/dog-gallery/site/images/black-dogs/black-puppy-meadow.png +0 -0
  361. package/examples/dog-gallery/site/images/black-dogs/photo-of-a-black-dog.jpg +0 -0
  362. package/examples/dog-gallery/site/images/brown-dogs/brown-dog.jpg +0 -0
  363. package/examples/dog-gallery/site/images/brown-dogs/dog-accompanies-master.jpg +0 -0
  364. package/examples/dog-gallery/site/images/golden-dogs/golden-retriever.jpg +0 -0
  365. package/examples/dog-gallery/site/images/golden-dogs/toller-puppy.jpg +0 -0
  366. package/examples/dog-gallery/site/images/white-dogs/white-cute-dog.jpg +0 -0
  367. package/examples/dog-gallery/site/images/white-dogs/white-puppy-garden.png +0 -0
  368. package/examples/dog-gallery/site/public/favicon.svg +0 -7
  369. package/examples/dog-gallery/site/public/logo.svg +0 -14
  370. package/examples/dog-gallery/site/routes/010-dog-care/route-content.md +0 -38
  371. package/examples/dog-gallery/site/sitewide-content.md +0 -16
  372. package/examples/dog-gallery/site/theme.md +0 -101
  373. package/examples/presentation/README.md +0 -15
  374. package/examples/presentation/site/config.mjs +0 -29
  375. package/examples/presentation/site/content.md +0 -67
  376. package/examples/presentation/site/public/robots.txt +0 -2
  377. package/examples/presentation/site/routes/010-presets/route-content.md +0 -63
  378. package/examples/presentation/site/routes/010-presets/theme.md +0 -4
  379. package/examples/presentation/site/routes/020-media/theme.md +0 -4
  380. package/examples/presentation/site/sitewide-content.md +0 -6
  381. package/examples/presentation/site/theme.md +0 -43
  382. package/examples/typography-presets/.astro/dev.log +0 -45
  383. package/examples/typography-presets/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
  384. package/examples/typography-presets/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  385. package/examples/typography-presets/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  386. package/examples/typography-presets/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  387. package/examples/typography-presets/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  388. package/examples/typography-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
  389. package/examples/typography-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
  390. package/examples/typography-presets/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
  391. package/examples/typography-presets/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
  392. package/examples/typography-presets/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
  393. package/examples/typography-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
  394. package/examples/typography-presets/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
  395. package/examples/typography-presets/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
  396. package/examples/typography-presets/site/config.mjs +0 -29
  397. package/examples/typography-presets/site/content.md +0 -16
  398. package/examples/typography-presets/site/routes/010-quiet-gallery/theme.md +0 -4
  399. package/examples/typography-presets/site/routes/020-compact-gallery/theme.md +0 -4
  400. package/examples/typography-presets/site/routes/030-text-forward/theme.md +0 -4
  401. package/examples/typography-presets/site/routes/040-statement/theme.md +0 -4
  402. package/examples/typography-presets/site/theme.md +0 -43
  403. package/fixtures/basic/site/config.mjs +0 -27
  404. package/fixtures/content-model-v2/site/config.mjs +0 -11
  405. package/starters/basic/site/config.mjs +0 -27
  406. package/starters/project/site/config.mjs +0 -30
  407. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/site.schema.json +0 -0
  408. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/content-assets.mjs +0 -0
  409. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/content-modules.mjs +0 -0
  410. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/types.d.ts +0 -0
  411. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/package.json +0 -0
  412. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  413. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery/retriever-portrait.jpg → complete-sites/dog-shelter-multi-page/site/images/intro/shelter-dog.jpg} +0 -0
  414. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/public/favicon.svg +0 -0
  415. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/public/robots.txt +0 -0
  416. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/white-puppy.jpg → complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.jpg} +0 -0
  417. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward/boxer-portrait.jpg → complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.jpg} +0 -0
  418. /package/examples/{typography-presets/site/routes/040-statement/images/statement/sheepdog-grass.jpg → complete-sites/dog-shelter-multi-page/site/routes/020-adopt/images/adopt/adoption-dog.jpg} +0 -0
  419. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/.astro/content-assets.mjs +0 -0
  420. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/.astro/content-modules.mjs +0 -0
  421. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/.astro/types.d.ts +0 -0
  422. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/node_modules/.vite/deps/package.json +0 -0
  423. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  424. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward/grass-puppy.jpg → complete-sites/dog-shelter-single-page/site/images/what-we-do/rescue-dog.jpg} +0 -0
  425. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/shepherd-portrait.jpg → complete-sites/dog-shelter-single-page/site/images/you-can-help/foster-dog.jpg} +0 -0
  426. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/public/favicon.svg +0 -0
  427. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/public/robots.txt +0 -0
  428. /package/examples/{dog-gallery/dist → feature-demos/media-and-surfaces/site/public}/robots.txt +0 -0
  429. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-carousel.svg +0 -0
  430. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-stack.svg +0 -0
  431. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-surfaces.svg +0 -0
  432. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-one.svg +0 -0
  433. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-three.svg +0 -0
  434. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-two.svg +0 -0
  435. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/stack/stack-one.svg +0 -0
  436. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/stack/stack-two.svg +0 -0
  437. /package/examples/{dog-gallery → feature-demos/sitewide-content}/site/public/robots.txt +0 -0
  438. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/collections/routeTheme.schema.json +0 -0
  439. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/content.d.ts +0 -0
  440. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/settings.json +0 -0
  441. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/_metadata.json +0 -0
  442. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  443. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  444. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  445. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  446. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  447. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  448. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  449. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  450. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  451. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  452. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  453. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  454. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/embla-carousel.js +0 -0
  455. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
  456. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  457. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  458. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  459. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  460. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  461. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  462. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  463. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  464. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  465. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  466. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  467. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  468. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  469. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  470. /package/examples/{typography-presets → feature-demos/theme-presets}/site/public/robots.txt +0 -0
  471. /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
  472. /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
  473. /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
  474. /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
  475. /package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/images/statement/black-pedigree.jpg +0 -0
  476. /package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/images/statement/sheepdog-wide.jpg +0 -0
@@ -1,223 +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
- - `layout.pageWidth`
68
- - `layout.gutter`
69
- - `layout.density`
70
- - `gallery.width`
71
- - `gallery.maxAvailableWidthPercent`
72
- - `gallery.maxAvailableHeightPercent`
73
- - `typography.fontFamily`
74
- - typography presets, rhythm, and overrides
75
- - presentation palettes and section surfaces
76
-
77
- ## Navigation
78
-
79
- ### `navigation.smoothScroll`
80
-
81
- - Purpose: controls enhanced same-page anchor navigation and native
82
- `scroll-behavior`.
83
- - Type: object.
84
- - Required: no; omitted fields use defaults.
85
-
86
- Fields:
87
-
88
- - `navigation.smoothScroll.enabled`: boolean, default `true`.
89
- - `navigation.smoothScroll.minimumDurationMs`: positive integer, default
90
- `2000`.
91
- - `navigation.smoothScroll.maximumDurationMs`: positive integer, default
92
- `4000`; must be greater than or equal to `minimumDurationMs`.
93
- - `navigation.smoothScroll.durationPerPixelMs`: positive number, default
94
- `0.22`.
38
+ GitHub Pages project site:
95
39
 
96
- When `enabled` is `false`, section links jump directly to anchors without the
97
- controlled animation. The no-JavaScript fallback keeps real `href="#section-id"`
98
- links.
99
-
100
- Example:
101
-
102
- ```js
103
- navigation: {
104
- smoothScroll: {
105
- enabled: true,
106
- minimumDurationMs: 600,
107
- maximumDurationMs: 1_200,
108
- durationPerPixelMs: 0.2,
109
- },
110
- }
40
+ ```yaml
41
+ ---
42
+ url: https://owner.github.io/repository-name/
43
+ ---
111
44
  ```
112
45
 
113
- ## 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.
114
48
 
115
- ### `locale.lang`
49
+ ## `language`
116
50
 
117
- - Purpose: language tag rendered on the root `<html lang="...">` element.
118
- - 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`.
119
54
  - Required: no.
120
55
  - Default: `en`.
121
- - Validation: two or three letters, optionally followed by `-` separated
122
- subtags.
123
- - Consequence: screen readers, browsers, and search engines use this to
124
- interpret the page language.
125
-
126
- ### `locale.labels`
127
-
128
- - Purpose: site-wide UI labels rendered by the engine for non-editorial
129
- interface text.
130
- - Type: object.
131
- - Required: no; omitted labels use English defaults.
132
-
133
- Fields:
134
-
135
- - `locale.labels.skipToContent`: skip-link text, default `Skip to content`.
136
- - `locale.labels.siteNavigation`: site-level navigation ARIA label and mobile
137
- menu group heading, default `Pages`.
138
- - `locale.labels.pageNavigation`: current-page section navigation ARIA label and
139
- mobile menu group heading, default `On this page`.
140
- - `locale.labels.sectionNavigation`: legacy section navigation label, default
141
- `Sections`.
142
- - `locale.labels.menu`: mobile menu summary text, default `Menu`.
143
- - `locale.labels.closeMenu`: reserved close-menu label, default `Close menu`.
144
- - `locale.labels.dismissBanner`: banner dismissal button label, default
145
- `Dismiss notice`.
146
- - `locale.labels.siteBanners`: ARIA label for the banner stack, default
147
- `Site notices`.
148
- - `locale.labels.gallery`: Norna managed media ARIA label prefix, default
149
- `Images`.
150
-
151
- Example:
152
56
 
153
- ```js
154
- locale: {
155
- lang: 'sv',
156
- labels: {
157
- skipToContent: 'Hoppa till innehåll',
158
- siteNavigation: 'Sidor',
159
- pageNavigation: 'På denna sida',
160
- sectionNavigation: 'Sektioner',
161
- menu: 'Meny',
162
- gallery: 'Bilder',
163
- },
164
- }
165
- ```
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.
166
61
 
167
- ## 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`.
168
65
 
169
- Shared site identity, banners and footer content are defined in
170
- `site/sitewide-content.md`. See [Sitewide Content](sitewide-content.md) for the
171
- schema and examples.
66
+ ## `smoothScroll`
172
67
 
173
- ## GitHub
68
+ - Purpose: enables smooth same-page anchor movement.
69
+ - Type: boolean.
70
+ - Required: no.
71
+ - Default: `false`.
174
72
 
175
- ### `github.repo`
73
+ Example:
176
74
 
177
- - Purpose: repository used by deploy checks and deploy monitoring.
178
- - Type: string in `owner/name` form.
179
- - Required: yes.
180
- - Default: none.
181
- - Validation: non-empty string.
75
+ ```yaml
76
+ ---
77
+ url: https://example.com/
78
+ smoothScroll: true
79
+ ---
80
+ ```
182
81
 
183
- ### `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.
184
85
 
185
- - Purpose: deploy branch required by `norna deploy` and monitored by
186
- `deploy:watch`.
187
- - Type: string.
188
- - Required: yes.
189
- - Default: none.
190
- - Validation: non-empty string.
86
+ ## Complete Example
191
87
 
192
- ### `github.pagesWorkflow`
88
+ ```yaml
89
+ ---
90
+ url: https://example.com/
91
+ language: en
92
+ smoothScroll: false
93
+ ---
94
+ ```
193
95
 
194
- - Purpose: GitHub Actions workflow name used by deploy checks and
195
- `deploy:watch`.
196
- - Type: string.
197
- - Required: yes.
198
- - Default: none.
199
- - 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.
200
98
 
201
- ## Deploy Watch
99
+ ## Related Files
202
100
 
203
- ### `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.
204
106
 
205
- - Purpose: defaults for `norna deploy:watch`.
206
- - Type: object.
207
- - Required: no; omitted fields use defaults.
107
+ ## Publishing Discovery
208
108
 
209
- Fields:
109
+ GitHub repository, default branch and deploy workflow are not site
110
+ configuration fields.
210
111
 
211
- - `deploy.watch.intervalMs`: positive integer, default `10000`.
212
- - `deploy.watch.timeoutMs`: positive integer, default `900000`.
213
- - `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.
214
117
 
215
- Command-line options such as `--interval`, `--timeout`, and `--limit` can
216
- override these values for one run.
118
+ See [Publishing](publishing.md) for the complete workflow.
217
119
 
218
120
  ## Site Directory Selection
219
121
 
220
- The site directory is not configured in `config.mjs`.
122
+ The site directory is not configured in `config.md`.
221
123
 
222
124
  Use one of:
223
125
 
@@ -228,9 +130,9 @@ norna --site-dir my-site build
228
130
 
229
131
  If `NORNA_SITE_DIR` is set to an empty value, commands fail. Relative site
230
132
  directories are resolved by walking upward from the invocation root until the
231
- selected directory contains `config.mjs` and `content.md`. Absolute site
133
+ selected directory contains `config.md` and `content.md`. Absolute site
232
134
  directories are accepted and make their parent the site project root.
233
135
 
234
- When no site directory is explicitly selected, the current directory itself can
235
- 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,
236
138
  Norna walks upward looking for a default `site/` directory with those files.
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
 
@@ -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
 
@@ -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,40 @@ 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/
70
+ sitewide-content/
66
71
  ```
67
72
 
68
- Only `dog-gallery/` exists today. Additional examples should be added when
69
- they demonstrate a distinct feature or workflow.
73
+ `complete-sites/` contains coherent sites that show how Norna files work
74
+ together in a realistic project:
70
75
 
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.
76
+ - `dog-shelter-single-page/`: sections and managed images without routes.
77
+ - `dog-shelter-multi-page/`: ordered routes with route-local content and
78
+ images.
79
+
80
+ `feature-demos/` contains focused visual test benches:
81
+
82
+ - `theme-presets/`: one route per complete built-in theme preset, without
83
+ overrides.
84
+ - `media-and-surfaces/`: managed media blocks, notes, palettes and section
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.
88
+
89
+ The repository Pages workflow builds all examples and publishes them
90
+ under `/norna/examples/`. The HTML documentation links to those rendered sites
91
+ from its Examples route.
77
92
 
78
93
  The repository-local `site/` directory is reserved for the documentation site.
79
94
  `docs/` should remain for reference documentation. It should link to the
@@ -82,8 +97,8 @@ documentation site when visual explanation is more useful than reference text.
82
97
  `starters/basic/` stays separate from examples because it is copied by
83
98
  `norna init`. It should stay small and conservative.
84
99
 
85
- Fixtures may either stay under `fixtures/` or move under a clearly named test
86
- area later. They should not be confused with examples.
100
+ Fixtures stay under `fixtures/`. They are intentionally smaller and more stable
101
+ than examples and should not be confused with user-facing sites.
87
102
 
88
103
  ## Constraints
89
104
 
@@ -91,11 +106,10 @@ area later. They should not be confused with examples.
91
106
  - Do not make the documentation site the only documentation.
92
107
  - Do not let examples become required input for production site repositories.
93
108
  - Keep `norna init` deterministic and easy to test.
94
- - Keep engine tests using stable fixtures, not visually evolving demo content.
95
-
96
- ## Open Decisions
109
+ - Use examples for build, navigation and visual integration tests where the
110
+ user-facing site is the behavior being protected.
111
+ - Use fixtures for isolated edge cases, invalid input and narrowly scoped
112
+ engine regressions.
97
113
 
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.
114
+ The repository-local `site/` remains the product documentation site and is not
115
+ an example or fixture.
@@ -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.
@@ -19,8 +20,8 @@ This document is for work on the reusable `norna` package itself.
19
20
  - `tests/`: Playwright navigation diagnostics.
20
21
  - `fixtures/basic/site/`: minimal site used for engine checks.
21
22
  - `starters/basic/`: copyable site starter.
22
- - `examples/dog-gallery/site/`: visual dog example used by demo builds and
23
- navigation diagnostics.
23
+ - `examples/feature-demos/media-and-surfaces/site/`: broad visual example used
24
+ by demo builds and navigation diagnostics.
24
25
 
25
26
  The repository-local `site/` directory is reserved for a local documentation
26
27
  site. It is useful for dogfooding `norna` documentation, but it is not the
@@ -33,12 +34,25 @@ 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
39
+ npm run test:examples
37
40
  npm run demo:build
38
41
  npm run package:check
39
42
  ```
40
43
 
41
- `npm run test` runs the standard non-demo check sequence.
44
+ `npm run test:examples` builds every complete site and feature demo under
45
+ `examples/`. `npm run test` includes those builds in the standard check
46
+ sequence.
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
+
53
+ `npm run build:pages` is specific to this repository. It builds the
54
+ documentation site and assembles rendered examples under `dist/examples/` for
55
+ the shared GitHub Pages artifact. It is not a generic Norna site command.
42
56
 
43
57
  The root `site/` directory is the documentation site. Use the ordinary local
44
58
  commands for it:
@@ -48,12 +62,11 @@ npm run dev:local
48
62
  npm run build
49
63
  ```
50
64
 
51
- The dog example remains the visual demo and navigation diagnostic target:
65
+ The media-and-surfaces feature demo is the broad visual and navigation
66
+ diagnostic target:
52
67
 
53
68
  ```sh
54
- cd examples/dog-gallery/site
55
- node ../../../bin/norna.mjs dev:local
56
- cd ../../..
69
+ node bin/norna.mjs --site-dir examples/feature-demos/media-and-surfaces/site dev:local
57
70
  npm run demo:build
58
71
  ```
59
72
 
@@ -182,11 +195,11 @@ history, back/forward moves between hash entries, and returning to the same page
182
195
  without a hash restores the first section as active. The enhancement does not
183
196
  derive active section state from free manual scrolling.
184
197
 
185
- The sticky navigation updates root scroll offset variables so direct hash links
186
- and clicked links land below the fixed header. Hash targets may be corrected
187
- again after layout shifts such as image loading, but that correction must not
188
- 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.
189
202
 
190
- The shared layout reads UI language and labels from `site/config.mjs`
191
- `locale`. Keep editorial content in page Markdown and non-editorial engine UI
192
- 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.