@janga/norna 0.7.10 → 0.7.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/README.md +4 -2
  2. package/bin/norna-cli.mjs +3 -0
  3. package/docs/README.md +3 -2
  4. package/docs/commands.md +6 -0
  5. package/docs/configuration.md +1 -0
  6. package/docs/content.md +14 -14
  7. package/docs/design/site-examples-structure.md +35 -24
  8. package/docs/engine-development.md +13 -7
  9. package/docs/getting-started.md +44 -9
  10. package/docs/routes.md +2 -1
  11. package/docs/site-structure.md +8 -5
  12. package/docs/theme.md +86 -34
  13. package/docs/typography.md +32 -17
  14. package/examples/README.md +41 -0
  15. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/sitewide.schema.json +24 -0
  16. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/theme.schema.json +9 -24
  17. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -0
  18. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev-local.json +2 -2
  19. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev.json +2 -2
  20. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +53 -0
  21. package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +5 -0
  22. package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/README.md +1 -1
  23. package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/_metadata.json +13 -7
  24. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +18 -0
  25. package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/config.mjs +5 -2
  26. package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/README.md +1 -1
  27. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +18 -0
  28. package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/site/config.mjs +5 -2
  29. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +59 -0
  30. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +138 -0
  31. package/examples/{dog-gallery → feature-demos/media-and-surfaces}/.astro/collections/theme.schema.json +151 -68
  32. package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +1 -0
  33. package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +183 -0
  34. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -0
  35. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +11 -0
  36. package/examples/feature-demos/media-and-surfaces/.astro/settings.json +5 -0
  37. package/examples/feature-demos/media-and-surfaces/README.md +15 -0
  38. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +74 -0
  39. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  40. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  41. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  42. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  43. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  44. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  45. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  46. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  47. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  48. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  49. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  50. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  51. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  52. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  53. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  54. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  55. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  56. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  57. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  58. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  59. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  60. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  61. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  62. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  63. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  64. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  65. package/examples/{presentation → feature-demos/media-and-surfaces}/site/.norna/generated-images.json +16 -16
  66. package/examples/{presentation → feature-demos/media-and-surfaces}/site/config.mjs +4 -3
  67. package/examples/{presentation → feature-demos/media-and-surfaces}/site/content.md +12 -15
  68. package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/route-content.md +11 -3
  69. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/theme.md +3 -0
  70. package/examples/{presentation/site/routes/030-surfaces → feature-demos/media-and-surfaces/site/routes/020-surfaces}/theme.md +1 -0
  71. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.md +6 -0
  72. package/examples/feature-demos/media-and-surfaces/site/theme.md +3 -0
  73. package/examples/feature-demos/theme-presets/.astro/collections/site.schema.json +59 -0
  74. package/examples/feature-demos/theme-presets/.astro/collections/sitewide.schema.json +138 -0
  75. package/examples/feature-demos/theme-presets/.astro/collections/theme.schema.json +755 -0
  76. package/examples/feature-demos/theme-presets/.astro/content-modules.mjs +1 -0
  77. package/examples/{dog-gallery → feature-demos/theme-presets}/.astro/content.d.ts +8 -0
  78. package/examples/{typography-presets → feature-demos/theme-presets}/.astro/data-store.json +1 -1
  79. package/examples/feature-demos/theme-presets/.astro/dev-local.json +8 -0
  80. package/examples/feature-demos/theme-presets/.astro/dev.json +15 -0
  81. package/examples/feature-demos/theme-presets/.astro/dev.log +127 -0
  82. package/examples/feature-demos/theme-presets/.astro/types.d.ts +2 -0
  83. package/examples/feature-demos/theme-presets/README.md +14 -0
  84. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js +1389 -0
  85. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  86. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/package.json +3 -0
  87. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  88. package/examples/{typography-presets → feature-demos/theme-presets}/site/.norna/generated-images.json +45 -45
  89. package/examples/{typography-presets → feature-demos/theme-presets}/site/config.mjs +4 -3
  90. package/examples/feature-demos/theme-presets/site/content.md +17 -0
  91. package/examples/{typography-presets/site/routes/010-quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio}/route-content.md +8 -8
  92. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/theme.md +3 -0
  93. package/examples/{typography-presets/site/routes/020-compact-gallery → feature-demos/theme-presets/site/routes/020-documentation}/route-content.md +8 -8
  94. package/examples/feature-demos/theme-presets/site/routes/020-documentation/theme.md +3 -0
  95. package/examples/{typography-presets/site/routes/030-text-forward → feature-demos/theme-presets/site/routes/030-project}/route-content.md +8 -8
  96. package/examples/feature-demos/theme-presets/site/routes/030-project/theme.md +3 -0
  97. package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/route-content.md +3 -3
  98. package/examples/feature-demos/theme-presets/site/routes/040-statement/theme.md +3 -0
  99. package/examples/{typography-presets → feature-demos/theme-presets}/site/sitewide-content.md +1 -1
  100. package/examples/feature-demos/theme-presets/site/theme.md +3 -0
  101. package/package.json +7 -3
  102. package/scripts/build-pages.mjs +71 -0
  103. package/scripts/check-config.mjs +2 -1
  104. package/scripts/export-theme-preset.mjs +31 -0
  105. package/scripts/init-site.mjs +1 -0
  106. package/scripts/lib/example-sites.mjs +34 -0
  107. package/scripts/lib/presentation.mjs +6 -5
  108. package/scripts/lib/project-config.mjs +2 -1
  109. package/scripts/lib/site-content.mjs +2 -2
  110. package/scripts/lib/theme-config.mjs +3 -0
  111. package/scripts/lib/theme-presets.mjs +209 -0
  112. package/scripts/show-typography.mjs +6 -5
  113. package/scripts/test-engine-commands.mjs +1 -0
  114. package/scripts/test-examples.mjs +15 -0
  115. package/scripts/test-navigation.mjs +73 -45
  116. package/scripts/test-theme-presets.mjs +151 -0
  117. package/src/components/SitePage.astro +2 -2
  118. package/src/content.config.ts +2 -0
  119. package/src/styles/global.css +2 -0
  120. package/starters/basic/package.json +1 -0
  121. package/starters/project/package.json +1 -0
  122. package/examples/dog-gallery/.astro/collections/site.schema.json +0 -776
  123. package/examples/dog-gallery/.astro/data-store.json +0 -1
  124. package/examples/dog-gallery/.astro/dev-local.json +0 -8
  125. package/examples/dog-gallery/.astro/dev.json +0 -13
  126. package/examples/dog-gallery/.astro/dev.log +0 -95
  127. package/examples/dog-gallery/.astro/settings.json +0 -5
  128. package/examples/dog-gallery/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +0 -1
  129. package/examples/dog-gallery/dist/_astro/SitePage.DicGh_5N.css +0 -1
  130. package/examples/dog-gallery/dist/dog-care/index.html +0 -15
  131. package/examples/dog-gallery/dist/dog-shelter-logo.svg +0 -14
  132. package/examples/dog-gallery/dist/favicon.svg +0 -7
  133. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp +0 -0
  134. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp +0 -0
  135. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp +0 -0
  136. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp +0 -0
  137. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp +0 -0
  138. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp +0 -0
  139. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp +0 -0
  140. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp +0 -0
  141. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1080.webp +0 -0
  142. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp +0 -0
  143. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1920.webp +0 -0
  144. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-3939.webp +0 -0
  145. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-480.webp +0 -0
  146. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-768.webp +0 -0
  147. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp +0 -0
  148. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp +0 -0
  149. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp +0 -0
  150. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-2400.webp +0 -0
  151. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp +0 -0
  152. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp +0 -0
  153. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp +0 -0
  154. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp +0 -0
  155. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp +0 -0
  156. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp +0 -0
  157. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-768.webp +0 -0
  158. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp +0 -0
  159. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp +0 -0
  160. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp +0 -0
  161. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-2576.webp +0 -0
  162. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp +0 -0
  163. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp +0 -0
  164. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1080.webp +0 -0
  165. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp +0 -0
  166. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-480.webp +0 -0
  167. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-768.webp +0 -0
  168. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp +0 -0
  169. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp +0 -0
  170. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp +0 -0
  171. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp +0 -0
  172. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp +0 -0
  173. package/examples/dog-gallery/dist/index.html +0 -45
  174. package/examples/dog-gallery/site/.norna/generated-images.json +0 -226
  175. package/examples/dog-gallery/site/config.mjs +0 -47
  176. package/examples/dog-gallery/site/content.md +0 -127
  177. package/examples/dog-gallery/site/images/black-dogs/black-puppy-meadow.png +0 -0
  178. package/examples/dog-gallery/site/images/black-dogs/photo-of-a-black-dog.jpg +0 -0
  179. package/examples/dog-gallery/site/images/brown-dogs/brown-dog.jpg +0 -0
  180. package/examples/dog-gallery/site/images/brown-dogs/dog-accompanies-master.jpg +0 -0
  181. package/examples/dog-gallery/site/images/golden-dogs/golden-retriever.jpg +0 -0
  182. package/examples/dog-gallery/site/images/golden-dogs/toller-puppy.jpg +0 -0
  183. package/examples/dog-gallery/site/images/white-dogs/white-cute-dog.jpg +0 -0
  184. package/examples/dog-gallery/site/images/white-dogs/white-puppy-garden.png +0 -0
  185. package/examples/dog-gallery/site/public/favicon.svg +0 -7
  186. package/examples/dog-gallery/site/public/logo.svg +0 -14
  187. package/examples/dog-gallery/site/public/robots.txt +0 -2
  188. package/examples/dog-gallery/site/routes/010-dog-care/route-content.md +0 -38
  189. package/examples/dog-gallery/site/sitewide-content.md +0 -16
  190. package/examples/dog-gallery/site/theme.md +0 -101
  191. package/examples/presentation/README.md +0 -15
  192. package/examples/presentation/site/public/robots.txt +0 -2
  193. package/examples/presentation/site/routes/010-presets/route-content.md +0 -63
  194. package/examples/presentation/site/routes/010-presets/theme.md +0 -4
  195. package/examples/presentation/site/routes/020-media/theme.md +0 -4
  196. package/examples/presentation/site/sitewide-content.md +0 -6
  197. package/examples/presentation/site/theme.md +0 -43
  198. package/examples/typography-presets/.astro/dev.log +0 -45
  199. package/examples/typography-presets/site/content.md +0 -16
  200. package/examples/typography-presets/site/routes/010-quiet-gallery/theme.md +0 -4
  201. package/examples/typography-presets/site/routes/020-compact-gallery/theme.md +0 -4
  202. package/examples/typography-presets/site/routes/030-text-forward/theme.md +0 -4
  203. package/examples/typography-presets/site/routes/040-statement/theme.md +0 -4
  204. package/examples/typography-presets/site/theme.md +0 -43
  205. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/site.schema.json +0 -0
  206. /package/examples/{dog-gallery/.astro/content-modules.mjs → complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs} +0 -0
  207. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/content-modules.mjs +0 -0
  208. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/content.d.ts +0 -0
  209. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/types.d.ts +0 -0
  210. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  211. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  212. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  213. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  214. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  215. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  216. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  217. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  218. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  219. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  220. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  221. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  222. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js +0 -0
  223. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
  224. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  225. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  226. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  227. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  228. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/package.json +0 -0
  229. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  230. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  231. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  232. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  233. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  234. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  235. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  236. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  237. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  238. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  239. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  240. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/content.md +0 -0
  241. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/public/favicon.svg +0 -0
  242. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/public/robots.txt +0 -0
  243. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/010-dogs/images/dogs/rex.svg +0 -0
  244. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/010-dogs/images/dogs/rover.svg +0 -0
  245. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/010-dogs/route-content.md +0 -0
  246. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/020-adopt/route-content.md +0 -0
  247. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/sitewide-content.md +0 -0
  248. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/theme.md +0 -0
  249. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/site/content.md +0 -0
  250. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/site/images/what-we-do/dog-house.svg +0 -0
  251. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-single-page}/site/images/you-can-help/heart.svg +0 -0
  252. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/public/favicon.svg +0 -0
  253. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/public/robots.txt +0 -0
  254. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/sitewide-content.md +0 -0
  255. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/theme.md +0 -0
  256. /package/examples/{dog-gallery → feature-demos/media-and-surfaces}/.astro/content-assets.mjs +0 -0
  257. /package/examples/{typography-presets → feature-demos/media-and-surfaces}/.astro/types.d.ts +0 -0
  258. /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/package.json +0 -0
  259. /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  260. /package/examples/{dog-gallery/dist → feature-demos/media-and-surfaces/site/public}/robots.txt +0 -0
  261. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-carousel.svg +0 -0
  262. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-stack.svg +0 -0
  263. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-surfaces.svg +0 -0
  264. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-one.svg +0 -0
  265. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-three.svg +0 -0
  266. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-two.svg +0 -0
  267. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/stack/stack-one.svg +0 -0
  268. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/stack/stack-two.svg +0 -0
  269. /package/examples/{presentation/site/routes/030-surfaces → feature-demos/media-and-surfaces/site/routes/020-surfaces}/route-content.md +0 -0
  270. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/collections/routeTheme.schema.json +0 -0
  271. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/content-assets.mjs +0 -0
  272. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/settings.json +0 -0
  273. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/_metadata.json +0 -0
  274. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  275. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  276. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  277. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  278. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  279. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  280. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  281. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  282. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  283. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  284. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  285. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  286. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  287. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  288. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  289. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  290. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  291. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  292. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  293. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  294. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  295. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  296. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  297. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  298. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  299. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  300. /package/examples/{typography-presets → feature-demos/theme-presets}/site/public/robots.txt +0 -0
  301. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/puppy-portrait.jpg +0 -0
  302. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/shepherd-portrait.jpg +0 -0
  303. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/white-puppy.jpg +0 -0
  304. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/black-schnauzer.jpg +0 -0
  305. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/retriever-portrait.jpg +0 -0
  306. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/schnauzer-portrait.jpg +0 -0
  307. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/boxer-portrait.jpg +0 -0
  308. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grass-puppy.jpg +0 -0
  309. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grey-street-dog.jpg +0 -0
  310. /package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/images/statement/black-pedigree.jpg +0 -0
  311. /package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/images/statement/sheepdog-grass.jpg +0 -0
  312. /package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/images/statement/sheepdog-wide.jpg +0 -0
@@ -0,0 +1,41 @@
1
+ # Norna examples
2
+
3
+ Runnable examples are grouped by purpose.
4
+
5
+ ```text
6
+ examples/
7
+ |-- complete-sites/
8
+ | |-- dog-shelter-single-page/
9
+ | `-- dog-shelter-multi-page/
10
+ `-- feature-demos/
11
+ |-- theme-presets/
12
+ `-- media-and-surfaces/
13
+ ```
14
+
15
+ ## Complete sites
16
+
17
+ `complete-sites/` contains small sites that can be read as coherent examples
18
+ of a Norna project.
19
+
20
+ - `dog-shelter-single-page/` demonstrates a homepage made from sections.
21
+ - `dog-shelter-multi-page/` adds ordered routes and route-local content.
22
+
23
+ ## Feature demos
24
+
25
+ `feature-demos/` contains focused visual test benches. They are useful for
26
+ documentation, manual inspection and integration checks, but are not intended
27
+ as starter templates.
28
+
29
+ - `theme-presets/` compares Norna's complete built-in theme presets.
30
+ - `media-and-surfaces/` demonstrates managed media blocks, notes, palettes and
31
+ section surfaces.
32
+
33
+ The repository's GitHub Pages workflow publishes rendered copies under
34
+ `https://janga.github.io/norna/examples/` so the HTML documentation can link to
35
+ working sites rather than only their source files.
36
+
37
+ Run an example from the repository root by passing its `site/` directory:
38
+
39
+ ```sh
40
+ node bin/norna.mjs --site-dir examples/feature-demos/media-and-surfaces/site dev:local
41
+ ```
@@ -2,6 +2,30 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "type": "object",
4
4
  "properties": {
5
+ "navigation": {
6
+ "type": "object",
7
+ "properties": {
8
+ "brand": {
9
+ "type": "string",
10
+ "minLength": 1
11
+ },
12
+ "logo": {
13
+ "type": "object",
14
+ "properties": {
15
+ "alt": {
16
+ "type": "string",
17
+ "minLength": 1
18
+ },
19
+ "height": {
20
+ "type": "string",
21
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$"
22
+ }
23
+ },
24
+ "additionalProperties": false
25
+ }
26
+ },
27
+ "additionalProperties": false
28
+ },
5
29
  "banners": {
6
30
  "default": [],
7
31
  "type": "array",
@@ -2,6 +2,15 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "type": "object",
4
4
  "properties": {
5
+ "preset": {
6
+ "type": "string",
7
+ "enum": [
8
+ "portfolio",
9
+ "documentation",
10
+ "project",
11
+ "statement"
12
+ ]
13
+ },
5
14
  "layout": {
6
15
  "type": "object",
7
16
  "properties": {
@@ -738,30 +747,6 @@
738
747
  },
739
748
  "additionalProperties": false
740
749
  },
741
- "navigation": {
742
- "type": "object",
743
- "properties": {
744
- "brand": {
745
- "type": "string",
746
- "minLength": 1
747
- },
748
- "logo": {
749
- "type": "object",
750
- "properties": {
751
- "alt": {
752
- "type": "string",
753
- "minLength": 1
754
- },
755
- "height": {
756
- "type": "string",
757
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$"
758
- }
759
- },
760
- "additionalProperties": false
761
- }
762
- },
763
- "additionalProperties": false
764
- },
765
750
  "$schema": {
766
751
  "type": "string"
767
752
  }
@@ -0,0 +1 @@
1
+ [["Map",1,2,9,10,72,73,94,95],"meta::meta",["Map",3,4,5,6,7,8],"astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":\"jsx\",\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":\"0.0.0.0\",\"port\":4321,\"allowedHosts\":[\"0.0.0.0\",\"0.0.0.0\",\"0.0.0.0\",\"0.0.0.0\"]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"dangerouslyProcessSVG\":false,\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":{\"type\":\"shiki\",\"excludeLangs\":[\"math\"]},\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"processor\":{\"name\":\"satteri\",\"options\":{\"mdastPlugins\":[],\"hastPlugins\":[],\"features\":{}}}},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"csp\":false,\"actionBodySizeLimit\":1048576,\"serverIslandBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"prerenderConflictBehavior\":\"warn\",\"fetchFile\":\"fetch\",\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"chromeDevtoolsWorkspace\":false,\"collectionStorage\":\"single-file\"},\"legacy\":{\"collectionsBackwardsCompat\":false}}","astro-version","7.1.3","content-config-digest","ef24ddbc7d731e37","site",["Map",11,12,32,33,52,53],"site-content",{"id":11,"data":13,"body":17,"filePath":18,"digest":19,"rendered":20},{"title":14,"description":15,"sections":16},"Home","A multi-page dog shelter website built with Norna.",{},"## Dog Shelter {#intro}\n\nWe rescue dogs, help them recover and introduce them to families ready to give\nthem a permanent home.\n\nVisit **Dogs** to meet two current residents, or **Adopt** to learn how the\nadoption process works.","site/content.md","0691a0caebe70101",{"html":21,"metadata":22},"\u003Ch2 id=\"dog-shelter-intro\">Dog Shelter {#intro}\u003C/h2>\n\u003Cp>We rescue dogs, help them recover and introduce them to families ready to give\nthem a permanent home.\u003C/p>\n\u003Cp>Visit \u003Cstrong>Dogs\u003C/strong> to meet two current residents, or \u003Cstrong>Adopt\u003C/strong> to learn how the\nadoption process works.\u003C/p>\n",{"headings":23,"localImagePaths":28,"remoteImagePaths":29,"frontmatter":30,"imagePaths":31},[24],{"depth":25,"slug":26,"text":27},2,"dog-shelter-intro","Dog Shelter {#intro}",[],[],{"title":14,"description":15},[],"site-route-010-dogs",{"id":32,"data":34,"body":38,"filePath":39,"digest":40,"rendered":41},{"title":35,"description":36,"sections":37},"Dogs","Meet dogs currently waiting for adoption.",{},"## Dogs {#dogs}\n\nMeet Rover and Rex.\n\n\u003C!-- norna-image-provenance:\nimage: rover.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Draw a friendly brown cartoon dog standing in profile on a pale green\nbackground. Flat vector style, dark outlines, no text or external assets.\n\nimage: rex.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Draw a friendly golden cartoon dog standing in profile on a pale cream\nbackground. Make it visibly distinct from Rover. Flat vector style, dark\noutlines, no text or external assets.\n-->\n\n```norna-image-stack\n- image: rover.svg\n alt: Rover, a brown dog with upright ears and a curled tail.\n caption: Rover needs daily walks.\n- image: rex.svg\n alt: Rex, a golden dog with one floppy ear and a gently curved tail.\n caption: Rex needs a patient home.\n```","site/routes/010-dogs/route-content.md","73e4b18631e96d28",{"html":42,"metadata":43},"\u003Ch2 id=\"dogs-dogs\">Dogs {#dogs}\u003C/h2>\n\u003Cp>Meet Rover and Rex.\u003C/p>\n\u003C!-- norna-image-provenance:\nimage: rover.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Draw a friendly brown cartoon dog standing in profile on a pale green\nbackground. Flat vector style, dark outlines, no text or external assets.\n\nimage: rex.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Draw a friendly golden cartoon dog standing in profile on a pale cream\nbackground. Make it visibly distinct from Rover. Flat vector style, dark\noutlines, no text or external assets.\n-->\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>- image: rover.svg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> alt: Rover, a brown dog with upright ears and a curled tail.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> caption: Rover needs daily walks.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- image: rex.svg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> alt: Rex, a golden dog with one floppy ear and a gently curved tail.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> caption: Rex needs a patient home.\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n",{"headings":44,"localImagePaths":48,"remoteImagePaths":49,"frontmatter":50,"imagePaths":51},[45],{"depth":25,"slug":46,"text":47},"dogs-dogs","Dogs {#dogs}",[],[],{"title":35,"description":36},[],"site-route-020-adopt",{"id":52,"data":54,"body":58,"filePath":59,"digest":60,"rendered":61},{"title":55,"description":56,"sections":57},"Adopt","Learn how to adopt from Dog Shelter.",{},"## Adopt {#adopt}\n\nAdoption begins with a conversation about your home, routines and experience\nwith dogs. We then arrange a meeting with dogs whose needs appear to match.\n\nThe goal is not the quickest placement. It is a stable home where both the dog\nand the family have the support they need.","site/routes/020-adopt/route-content.md","9e72f3ba5409e5a5",{"html":62,"metadata":63},"\u003Ch2 id=\"adopt-adopt\">Adopt {#adopt}\u003C/h2>\n\u003Cp>Adoption begins with a conversation about your home, routines and experience\nwith dogs. We then arrange a meeting with dogs whose needs appear to match.\u003C/p>\n\u003Cp>The goal is not the quickest placement. It is a stable home where both the dog\nand the family have the support they need.\u003C/p>\n",{"headings":64,"localImagePaths":68,"remoteImagePaths":69,"frontmatter":70,"imagePaths":71},[65],{"depth":25,"slug":66,"text":67},"adopt-adopt","Adopt {#adopt}",[],[],{"title":55,"description":56},[],"sitewide",["Map",74,75],"site-sitewide",{"id":74,"data":76,"filePath":82,"digest":83,"rendered":84},{"navigation":77,"banners":79,"footer":80},{"brand":78},"Dog Shelter",[],{"copyrightMessage":81},"Dog Shelter example site.","site/sitewide-content.md","1e321f6f03ded3d4",{"html":85,"metadata":86},"",{"headings":87,"localImagePaths":88,"remoteImagePaths":89,"frontmatter":90,"imagePaths":93},[],[],[],{"navigation":91,"footer":92},{"brand":78},{"copyrightMessage":81},[],"theme",["Map",96,97],"theme.md",{"id":96,"data":98,"filePath":122,"digest":123,"rendered":124},{"layout":99,"gallery":105,"typography":112,"presentation":115},{"density":100,"pageWidth":101,"gutter":102},"normal","1180px",{"desktop":103,"mobile":104},"clamp(1.25rem, 4vw, 3rem)","1rem",{"width":106,"maxAvailableWidthPercent":107,"maxAvailableHeightPercent":109},"760px",{"desktop":108,"mobile":108},100,{"desktop":110,"mobile":111},72,68,{"fontFamily":113,"preset":114,"rhythm":100},"Arial, 'Helvetica Neue', Helvetica, sans-serif","text-forward",{"palette":116,"sectionSurfaces":117},"paper",{"mode":118,"sequence":119},"cycle",[120,121],"base","soft","site/theme.md","c7dd8e38cdcd2768",{"html":85,"metadata":125},{"headings":126,"localImagePaths":127,"remoteImagePaths":128,"frontmatter":129,"imagePaths":139},[],[],[],{"layout":130,"gallery":132,"typography":135,"presentation":136},{"density":100,"pageWidth":101,"gutter":131},{"desktop":103,"mobile":104},{"width":106,"maxAvailableWidthPercent":133,"maxAvailableHeightPercent":134},{"desktop":108,"mobile":108},{"desktop":110,"mobile":111},{"fontFamily":113,"preset":114,"rhythm":100},{"palette":116,"sectionSurfaces":137},{"mode":118,"sequence":138},[120,121],[]]
@@ -1,8 +1,8 @@
1
1
  {
2
- "pid": 6298,
2
+ "pid": 47121,
3
3
  "port": 4321,
4
4
  "host": "0.0.0.0",
5
5
  "mode": "lan",
6
6
  "url": "http://127.0.0.1:4321/",
7
- "startedAt": "2026-08-19T19:41:41.296Z"
7
+ "startedAt": "2026-08-21T03:52:43.086Z"
8
8
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "pid": 6298,
2
+ "pid": 47121,
3
3
  "port": 4321,
4
4
  "url": "http://localhost:4321",
5
5
  "urls": {
@@ -11,5 +11,5 @@
11
11
  ]
12
12
  },
13
13
  "background": true,
14
- "startedAt": "2026-08-19T19:41:40.916Z"
14
+ "startedAt": "2026-08-21T03:52:42.741Z"
15
15
  }
@@ -0,0 +1,53 @@
1
+ 05:52:41 [vite] connected.
2
+ 05:52:42 [types] Generated 1ms
3
+ 05:52:42 [vite] connected.
4
+ 05:52:42 [content] Syncing content
5
+ [Shiki] The language "norna-image-stack" doesn't exist, falling back to "plaintext".
6
+ 05:52:42 [content] Synced content
7
+ astro v7.1.3 ready in 1114 ms
8
+ ┃ Local http://localhost:4321/
9
+ ┃ Network http://192.168.1.102:4321/
10
+ 05:52:42 watching for file changes...
11
+
12
+ update ▶ New version of Astro available: 7.2.4
13
+ Run npx @astrojs/upgrade to update
14
+
15
+ 05:52:43 [200] / 49ms
16
+ 05:52:43 [200] / 8ms
17
+ 05:52:43 [200] / 4ms
18
+ 05:52:50 [200] /dogs/ 22ms
19
+ 05:52:51 [vite] ✨ new dependencies optimized: embla-carousel
20
+ 05:52:53 [200] /adopt/ 8ms
21
+ 05:52:55 [200] /dogs/ 9ms
22
+ 05:53:14 [200] / 8ms
23
+ 05:53:15 [200] /dogs/ 8ms
24
+ 05:55:45 [ERROR] [vite] Norna image refresh failed:
25
+ spawn /opt/homebrew/Cellar/node/26.7.0/bin/node ENOENT
26
+ 05:55:45 [ERROR] Failed to load url /.astro/content-assets.mjs (resolved id: /Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/.astro/content-assets.mjs) in /Users/jangarefelt/Projects/webbhack/norna/node_modules/astro/dist/content/runtime.js. Does the file exist?
27
+ Stack trace:
28
+ at loadAndTransform (file:///Users/jangarefelt/Projects/webbhack/norna/node_modules/vite/dist/node/chunks/node.js:19714:31)
29
+ at async handleInvoke (file:///Users/jangarefelt/Projects/webbhack/norna/node_modules/vite/dist/node/chunks/node.js:25811:21)
30
+ 05:55:45 [ERROR] [UnknownFilesystemError]
31
+ Hint:
32
+ It can be caused by many things, eg. missing permissions or a file not existing we attempt to read. Check the error cause for more details.
33
+ Error reference:
34
+ https://docs.astro.build/en/reference/errors/unknown-filesystem-error/
35
+ Stack trace:
36
+ at /Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/Users/jangarefelt/Projects/webbhack/norna/node_modules/astro/dist/content/mutable-data-store.js:367:13
37
+ [...] See full stack trace in the browser, or rerun with --verbose.
38
+ Caused by:
39
+ ENOENT: no such file or directory, open '/Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/.astro/data-store.json.tmp'
40
+ at async open (node:internal/fs/promises:1360:25)
41
+ [...] See full stack trace in the browser, or rerun with --verbose.
42
+ 05:55:45 [ERROR] [UnknownFilesystemError]
43
+ Hint:
44
+ It can be caused by many things, eg. missing permissions or a file not existing we attempt to read. Check the error cause for more details.
45
+ Error reference:
46
+ https://docs.astro.build/en/reference/errors/unknown-filesystem-error/
47
+ Stack trace:
48
+ at /Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/Users/jangarefelt/Projects/webbhack/norna/node_modules/astro/dist/content/mutable-data-store.js:103:15
49
+ [...] See full stack trace in the browser, or rerun with --verbose.
50
+ Caused by:
51
+ ENOENT: no such file or directory, open '/Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/.astro/content-assets.mjs.tmp'
52
+ at async open (node:internal/fs/promises:1360:25)
53
+ [...] See full stack trace in the browser, or rerun with --verbose.
@@ -0,0 +1,5 @@
1
+ {
2
+ "_variables": {
3
+ "lastUpdateCheck": 1787284362911
4
+ }
5
+ }
@@ -5,5 +5,5 @@ A small Norna site with a homepage and ordered routes for dogs and adoption.
5
5
  Run it from the Norna repository root:
6
6
 
7
7
  ```sh
8
- node bin/norna.mjs --site-dir examples/002-dog-shelter-multi-page/site dev:local
8
+ node bin/norna.mjs --site-dir examples/complete-sites/dog-shelter-multi-page/site dev:local
9
9
  ```
@@ -1,31 +1,37 @@
1
1
  {
2
- "hash": "9288c44d",
3
- "configHash": "157af100",
2
+ "hash": "c5835335",
3
+ "configHash": "81cb5b61",
4
4
  "lockfileHash": "808f2e8e",
5
- "browserHash": "a00be533",
5
+ "browserHash": "3314f0cd",
6
6
  "optimized": {
7
7
  "astro > aria-query": {
8
8
  "src": "../../../../../node_modules/aria-query/lib/index.js",
9
9
  "file": "astro_n_aria-query.js",
10
- "fileHash": "9b91d854",
10
+ "fileHash": "2df55228",
11
11
  "needsInterop": true
12
12
  },
13
13
  "astro > axobject-query": {
14
14
  "src": "../../../../../node_modules/axobject-query/lib/index.js",
15
15
  "file": "astro_n_axobject-query.js",
16
- "fileHash": "5a1ed64b",
16
+ "fileHash": "3317e674",
17
17
  "needsInterop": true
18
18
  },
19
19
  "astro > html-escaper": {
20
20
  "src": "../../../../../node_modules/html-escaper/esm/index.js",
21
21
  "file": "astro_n_html-escaper.js",
22
- "fileHash": "6d948667",
22
+ "fileHash": "b3fbc938",
23
23
  "needsInterop": false
24
24
  },
25
25
  "astro/runtime/client/dev-toolbar/entrypoint.js": {
26
26
  "src": "../../../../../node_modules/astro/dist/runtime/client/dev-toolbar/entrypoint.js",
27
27
  "file": "astro_runtime_client_dev-toolbar_entrypoint__js.js",
28
- "fileHash": "deee87d7",
28
+ "fileHash": "a1ac7053",
29
+ "needsInterop": false
30
+ },
31
+ "embla-carousel": {
32
+ "src": "../../../../../node_modules/embla-carousel/esm/embla-carousel.esm.js",
33
+ "file": "embla-carousel.js",
34
+ "fileHash": "6ac7301f",
29
35
  "needsInterop": false
30
36
  }
31
37
  },
@@ -0,0 +1,18 @@
1
+ {
2
+ "routes/010-dogs/images/dogs/rex.svg": {
3
+ "kind": "static",
4
+ "outputVersion": 2,
5
+ "sourceHash": "5d3dc8094421574fac86e1416a005102b7b8e25846f0c9595b386424a541f0ed",
6
+ "src": "/images/original/routes/010-dogs/images/dogs/rex-5d3dc809.svg",
7
+ "width": 800,
8
+ "height": 560
9
+ },
10
+ "routes/010-dogs/images/dogs/rover.svg": {
11
+ "kind": "static",
12
+ "outputVersion": 2,
13
+ "sourceHash": "fb093ebb096ed5f5182a95133ae6df9384c584781d27e282b1cda3c7ac351e3e",
14
+ "src": "/images/original/routes/010-dogs/images/dogs/rover-fb093ebb.svg",
15
+ "width": 800,
16
+ "height": 560
17
+ }
18
+ }
@@ -1,7 +1,10 @@
1
+ const siteUrl = process.env.NORNA_EXAMPLE_SITE_URL ?? 'http://localhost:4321/';
2
+ const basePath = process.env.NORNA_EXAMPLE_BASE_PATH ?? '/';
3
+
1
4
  export default {
2
5
  site: {
3
- url: 'http://localhost:4321/',
4
- basePath: '/',
6
+ url: siteUrl,
7
+ basePath,
5
8
  },
6
9
  navigation: {
7
10
  smoothScroll: {
@@ -5,5 +5,5 @@ A small Norna site with two homepage sections and no routes.
5
5
  Run it from the Norna repository root:
6
6
 
7
7
  ```sh
8
- node bin/norna.mjs --site-dir examples/001-dog-shelter-single-page/site dev:local
8
+ node bin/norna.mjs --site-dir examples/complete-sites/dog-shelter-single-page/site dev:local
9
9
  ```
@@ -0,0 +1,18 @@
1
+ {
2
+ "images/what-we-do/dog-house.svg": {
3
+ "kind": "static",
4
+ "outputVersion": 2,
5
+ "sourceHash": "740ee3e9cc493fbd06510d282592f818669f367f6f9dc480add2032935afdf45",
6
+ "src": "/images/original/images/what-we-do/dog-house-740ee3e9.svg",
7
+ "width": 800,
8
+ "height": 520
9
+ },
10
+ "images/you-can-help/heart.svg": {
11
+ "kind": "static",
12
+ "outputVersion": 2,
13
+ "sourceHash": "8f95f517fd7ee7a125c06f3f6e560d5e6fc73f085331cefc8c97403688e5ca4a",
14
+ "src": "/images/original/images/you-can-help/heart-8f95f517.svg",
15
+ "width": 800,
16
+ "height": 520
17
+ }
18
+ }
@@ -1,7 +1,10 @@
1
+ const siteUrl = process.env.NORNA_EXAMPLE_SITE_URL ?? 'http://localhost:4321/';
2
+ const basePath = process.env.NORNA_EXAMPLE_BASE_PATH ?? '/';
3
+
1
4
  export default {
2
5
  site: {
3
- url: 'http://localhost:4321/',
4
- basePath: '/',
6
+ url: siteUrl,
7
+ basePath,
5
8
  },
6
9
  navigation: {
7
10
  smoothScroll: {
@@ -0,0 +1,59 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "title": {
6
+ "type": "string"
7
+ },
8
+ "description": {
9
+ "type": "string"
10
+ },
11
+ "navigation": {
12
+ "type": "object",
13
+ "properties": {
14
+ "include": {
15
+ "type": "boolean"
16
+ },
17
+ "label": {
18
+ "type": "string"
19
+ }
20
+ },
21
+ "additionalProperties": false
22
+ },
23
+ "sections": {
24
+ "default": {},
25
+ "type": "object",
26
+ "propertyNames": {
27
+ "type": "string",
28
+ "pattern": "^[a-z0-9-]+$"
29
+ },
30
+ "additionalProperties": {
31
+ "type": "object",
32
+ "properties": {
33
+ "visible": {
34
+ "type": "object",
35
+ "properties": {
36
+ "from": {
37
+ "type": "string",
38
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
39
+ },
40
+ "until": {
41
+ "type": "string",
42
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
43
+ }
44
+ },
45
+ "additionalProperties": false
46
+ }
47
+ },
48
+ "additionalProperties": false
49
+ }
50
+ },
51
+ "$schema": {
52
+ "type": "string"
53
+ }
54
+ },
55
+ "required": [
56
+ "title",
57
+ "description"
58
+ ]
59
+ }
@@ -0,0 +1,138 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "navigation": {
6
+ "type": "object",
7
+ "properties": {
8
+ "brand": {
9
+ "type": "string",
10
+ "minLength": 1
11
+ },
12
+ "logo": {
13
+ "type": "object",
14
+ "properties": {
15
+ "alt": {
16
+ "type": "string",
17
+ "minLength": 1
18
+ },
19
+ "height": {
20
+ "type": "string",
21
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$"
22
+ }
23
+ },
24
+ "additionalProperties": false
25
+ }
26
+ },
27
+ "additionalProperties": false
28
+ },
29
+ "banners": {
30
+ "default": [],
31
+ "type": "array",
32
+ "items": {
33
+ "type": "object",
34
+ "properties": {
35
+ "id": {
36
+ "type": "string",
37
+ "pattern": "^[a-z0-9-]+$"
38
+ },
39
+ "tone": {
40
+ "default": "warning",
41
+ "type": "string",
42
+ "enum": [
43
+ "warning"
44
+ ]
45
+ },
46
+ "visible": {
47
+ "type": "object",
48
+ "properties": {
49
+ "from": {
50
+ "type": "string",
51
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
52
+ },
53
+ "until": {
54
+ "type": "string",
55
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
56
+ }
57
+ },
58
+ "additionalProperties": false
59
+ },
60
+ "title": {
61
+ "type": "string",
62
+ "minLength": 1
63
+ },
64
+ "text": {
65
+ "type": "string",
66
+ "minLength": 1
67
+ }
68
+ },
69
+ "required": [
70
+ "id",
71
+ "title",
72
+ "text"
73
+ ],
74
+ "additionalProperties": false
75
+ }
76
+ },
77
+ "footer": {
78
+ "type": "object",
79
+ "properties": {
80
+ "copyrightMessage": {
81
+ "type": "string",
82
+ "minLength": 1
83
+ },
84
+ "buildInfo": {
85
+ "type": "object",
86
+ "properties": {
87
+ "enabled": {
88
+ "default": true,
89
+ "type": "boolean"
90
+ },
91
+ "text": {
92
+ "type": "string",
93
+ "minLength": 1
94
+ },
95
+ "dateTimeFormat": {
96
+ "type": "object",
97
+ "properties": {
98
+ "locale": {
99
+ "type": "string",
100
+ "minLength": 1
101
+ },
102
+ "timeZone": {
103
+ "type": "string",
104
+ "minLength": 1
105
+ },
106
+ "dateStyle": {
107
+ "type": "string",
108
+ "minLength": 1
109
+ },
110
+ "timeStyle": {
111
+ "type": "string",
112
+ "minLength": 1
113
+ }
114
+ },
115
+ "required": [
116
+ "locale",
117
+ "timeZone",
118
+ "dateStyle",
119
+ "timeStyle"
120
+ ],
121
+ "additionalProperties": false
122
+ }
123
+ },
124
+ "required": [
125
+ "text",
126
+ "dateTimeFormat"
127
+ ],
128
+ "additionalProperties": false
129
+ }
130
+ },
131
+ "additionalProperties": false
132
+ },
133
+ "$schema": {
134
+ "type": "string"
135
+ }
136
+ },
137
+ "additionalProperties": false
138
+ }