@janga/norna 0.7.8 → 0.7.10

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 (234) hide show
  1. package/README.md +1 -1
  2. package/docs/README.md +18 -11
  3. package/docs/configuration.md +9 -54
  4. package/docs/content.md +6 -7
  5. package/docs/design/norna-diagram-design.md +158 -0
  6. package/docs/getting-started.md +18 -16
  7. package/docs/routes.md +7 -6
  8. package/docs/site-structure.md +4 -2
  9. package/docs/sitewide-content.md +74 -0
  10. package/docs/theme.md +61 -128
  11. package/docs/typography.md +45 -33
  12. package/examples/001-dog-shelter-single-page/README.md +9 -0
  13. package/examples/001-dog-shelter-single-page/site/config.mjs +27 -0
  14. package/examples/001-dog-shelter-single-page/site/content.md +38 -0
  15. package/examples/001-dog-shelter-single-page/site/images/what-we-do/dog-house.svg +25 -0
  16. package/examples/001-dog-shelter-single-page/site/images/you-can-help/heart.svg +13 -0
  17. package/examples/001-dog-shelter-single-page/site/public/favicon.svg +10 -0
  18. package/examples/001-dog-shelter-single-page/site/public/robots.txt +2 -0
  19. package/examples/001-dog-shelter-single-page/site/sitewide-content.md +6 -0
  20. package/examples/001-dog-shelter-single-page/site/theme.md +25 -0
  21. package/examples/002-dog-shelter-multi-page/README.md +9 -0
  22. package/examples/002-dog-shelter-multi-page/site/config.mjs +27 -0
  23. package/examples/002-dog-shelter-multi-page/site/content.md +12 -0
  24. package/examples/002-dog-shelter-multi-page/site/public/favicon.svg +10 -0
  25. package/examples/002-dog-shelter-multi-page/site/public/robots.txt +2 -0
  26. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.svg +19 -0
  27. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.svg +19 -0
  28. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/route-content.md +30 -0
  29. package/examples/002-dog-shelter-multi-page/site/routes/020-adopt/route-content.md +12 -0
  30. package/examples/002-dog-shelter-multi-page/site/sitewide-content.md +6 -0
  31. package/examples/002-dog-shelter-multi-page/site/theme.md +25 -0
  32. package/examples/dog-gallery/.astro/collections/site.schema.json +776 -0
  33. package/examples/dog-gallery/.astro/collections/theme.schema.json +672 -0
  34. package/examples/dog-gallery/.astro/content-assets.mjs +4 -0
  35. package/examples/dog-gallery/.astro/content-modules.mjs +1 -0
  36. package/examples/dog-gallery/.astro/content.d.ts +175 -0
  37. package/examples/dog-gallery/.astro/data-store.json +1 -0
  38. package/examples/dog-gallery/.astro/dev-local.json +8 -0
  39. package/examples/dog-gallery/.astro/dev.json +13 -0
  40. package/examples/dog-gallery/.astro/dev.log +95 -0
  41. package/examples/dog-gallery/.astro/settings.json +5 -0
  42. package/examples/dog-gallery/.astro/types.d.ts +2 -0
  43. package/examples/dog-gallery/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +1 -0
  44. package/examples/dog-gallery/dist/_astro/SitePage.DicGh_5N.css +1 -0
  45. package/examples/dog-gallery/dist/dog-care/index.html +15 -0
  46. package/examples/dog-gallery/dist/dog-shelter-logo.svg +14 -0
  47. package/examples/dog-gallery/dist/favicon.svg +7 -0
  48. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp +0 -0
  49. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp +0 -0
  50. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp +0 -0
  51. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp +0 -0
  52. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp +0 -0
  53. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp +0 -0
  54. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp +0 -0
  55. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp +0 -0
  56. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1080.webp +0 -0
  57. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp +0 -0
  58. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1920.webp +0 -0
  59. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-3939.webp +0 -0
  60. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-480.webp +0 -0
  61. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-768.webp +0 -0
  62. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp +0 -0
  63. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp +0 -0
  64. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp +0 -0
  65. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-2400.webp +0 -0
  66. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp +0 -0
  67. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp +0 -0
  68. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp +0 -0
  69. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp +0 -0
  70. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp +0 -0
  71. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp +0 -0
  72. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-768.webp +0 -0
  73. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp +0 -0
  74. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp +0 -0
  75. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp +0 -0
  76. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-2576.webp +0 -0
  77. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp +0 -0
  78. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp +0 -0
  79. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1080.webp +0 -0
  80. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp +0 -0
  81. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-480.webp +0 -0
  82. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-768.webp +0 -0
  83. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp +0 -0
  84. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp +0 -0
  85. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp +0 -0
  86. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp +0 -0
  87. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp +0 -0
  88. package/examples/dog-gallery/dist/index.html +45 -0
  89. package/examples/dog-gallery/dist/robots.txt +2 -0
  90. package/examples/dog-gallery/node_modules/.vite/deps/_metadata.json +7 -7
  91. package/examples/dog-gallery/site/.norna/generated-images.json +8 -8
  92. package/examples/dog-gallery/site/config.mjs +0 -20
  93. package/examples/dog-gallery/site/content.md +4 -5
  94. package/examples/dog-gallery/site/public/logo.svg +14 -0
  95. package/examples/dog-gallery/site/sitewide-content.md +16 -0
  96. package/examples/dog-gallery/site/theme.md +13 -24
  97. package/examples/presentation/README.md +15 -0
  98. package/examples/presentation/site/.norna/generated-images.json +66 -0
  99. package/examples/presentation/site/config.mjs +29 -0
  100. package/examples/presentation/site/content.md +67 -0
  101. package/examples/presentation/site/public/robots.txt +2 -0
  102. package/examples/presentation/site/routes/010-presets/route-content.md +63 -0
  103. package/examples/presentation/site/routes/010-presets/theme.md +4 -0
  104. package/examples/presentation/site/routes/020-media/images/cards/card-carousel.svg +11 -0
  105. package/examples/presentation/site/routes/020-media/images/cards/card-stack.svg +9 -0
  106. package/examples/presentation/site/routes/020-media/images/cards/card-surfaces.svg +8 -0
  107. package/examples/presentation/site/routes/020-media/images/carousel/carousel-one.svg +8 -0
  108. package/examples/presentation/site/routes/020-media/images/carousel/carousel-three.svg +13 -0
  109. package/examples/presentation/site/routes/020-media/images/carousel/carousel-two.svg +8 -0
  110. package/examples/presentation/site/routes/020-media/images/stack/stack-one.svg +8 -0
  111. package/examples/presentation/site/routes/020-media/images/stack/stack-two.svg +9 -0
  112. package/examples/presentation/site/routes/020-media/route-content.md +77 -0
  113. package/examples/presentation/site/routes/020-media/theme.md +4 -0
  114. package/examples/presentation/site/routes/030-surfaces/route-content.md +44 -0
  115. package/examples/presentation/site/routes/030-surfaces/theme.md +7 -0
  116. package/examples/presentation/site/sitewide-content.md +6 -0
  117. package/examples/presentation/site/theme.md +43 -0
  118. package/examples/typography-presets/.astro/collections/routeTheme.schema.json +746 -0
  119. package/examples/typography-presets/.astro/collections/site.schema.json +59 -0
  120. package/examples/typography-presets/.astro/collections/sitewide.schema.json +114 -0
  121. package/examples/typography-presets/.astro/collections/theme.schema.json +770 -0
  122. package/examples/typography-presets/.astro/content-assets.mjs +4 -0
  123. package/examples/typography-presets/.astro/content-modules.mjs +1 -0
  124. package/examples/typography-presets/.astro/content.d.ts +183 -0
  125. package/examples/typography-presets/.astro/data-store.json +1 -0
  126. package/examples/typography-presets/.astro/dev-local.json +8 -0
  127. package/examples/typography-presets/.astro/dev.json +15 -0
  128. package/examples/typography-presets/.astro/dev.log +45 -0
  129. package/examples/typography-presets/.astro/settings.json +5 -0
  130. package/examples/typography-presets/.astro/types.d.ts +2 -0
  131. package/examples/typography-presets/node_modules/.vite/deps/_metadata.json +80 -0
  132. package/examples/typography-presets/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  133. package/examples/typography-presets/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  134. package/examples/typography-presets/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  135. package/examples/typography-presets/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  136. package/examples/typography-presets/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  137. package/examples/typography-presets/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  138. package/examples/typography-presets/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  139. package/examples/typography-presets/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  140. package/examples/typography-presets/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  141. package/examples/typography-presets/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  142. package/examples/typography-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  143. package/examples/typography-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  144. package/examples/typography-presets/node_modules/.vite/deps/embla-carousel.js +1389 -0
  145. package/examples/typography-presets/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  146. package/examples/typography-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  147. package/examples/typography-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  148. package/examples/typography-presets/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  149. package/examples/typography-presets/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  150. package/examples/typography-presets/node_modules/.vite/deps/package.json +3 -0
  151. package/examples/typography-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  152. package/examples/typography-presets/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  153. package/examples/typography-presets/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  154. package/examples/typography-presets/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  155. package/examples/typography-presets/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  156. package/examples/typography-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  157. package/examples/typography-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  158. package/examples/typography-presets/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  159. package/examples/typography-presets/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  160. package/examples/typography-presets/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  161. package/examples/typography-presets/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  162. package/examples/typography-presets/site/.norna/generated-images.json +290 -0
  163. package/examples/typography-presets/site/config.mjs +29 -0
  164. package/examples/typography-presets/site/content.md +16 -0
  165. package/examples/typography-presets/site/public/robots.txt +2 -0
  166. package/examples/typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/puppy-portrait.jpg +0 -0
  167. package/examples/typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/shepherd-portrait.jpg +0 -0
  168. package/examples/typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/white-puppy.jpg +0 -0
  169. package/examples/typography-presets/site/routes/010-quiet-gallery/route-content.md +34 -0
  170. package/examples/typography-presets/site/routes/010-quiet-gallery/theme.md +4 -0
  171. package/examples/typography-presets/site/routes/020-compact-gallery/images/compact-gallery/black-schnauzer.jpg +0 -0
  172. package/examples/typography-presets/site/routes/020-compact-gallery/images/compact-gallery/retriever-portrait.jpg +0 -0
  173. package/examples/typography-presets/site/routes/020-compact-gallery/images/compact-gallery/schnauzer-portrait.jpg +0 -0
  174. package/examples/typography-presets/site/routes/020-compact-gallery/route-content.md +33 -0
  175. package/examples/typography-presets/site/routes/020-compact-gallery/theme.md +4 -0
  176. package/examples/typography-presets/site/routes/030-text-forward/images/text-forward/boxer-portrait.jpg +0 -0
  177. package/examples/typography-presets/site/routes/030-text-forward/images/text-forward/grass-puppy.jpg +0 -0
  178. package/examples/typography-presets/site/routes/030-text-forward/images/text-forward/grey-street-dog.jpg +0 -0
  179. package/examples/typography-presets/site/routes/030-text-forward/route-content.md +34 -0
  180. package/examples/typography-presets/site/routes/030-text-forward/theme.md +4 -0
  181. package/examples/typography-presets/site/routes/040-statement/images/statement/black-pedigree.jpg +0 -0
  182. package/examples/typography-presets/site/routes/040-statement/images/statement/sheepdog-grass.jpg +0 -0
  183. package/examples/typography-presets/site/routes/040-statement/images/statement/sheepdog-wide.jpg +0 -0
  184. package/examples/typography-presets/site/routes/040-statement/route-content.md +34 -0
  185. package/examples/typography-presets/site/routes/040-statement/theme.md +4 -0
  186. package/examples/typography-presets/site/sitewide-content.md +14 -0
  187. package/examples/typography-presets/site/theme.md +43 -0
  188. package/fixtures/basic/site/config.mjs +0 -13
  189. package/fixtures/basic/site/sitewide-content.md +12 -0
  190. package/fixtures/basic/site/theme.md +2 -2
  191. package/fixtures/content-model-v2/site/content.md +2 -5
  192. package/fixtures/content-model-v2/site/theme.md +1 -3
  193. package/package.json +3 -2
  194. package/scripts/check-config.mjs +22 -1
  195. package/scripts/lib/frontmatter-yaml.mjs +28 -0
  196. package/scripts/lib/logo-assets.mjs +35 -0
  197. package/scripts/lib/norna-markdown-blocks.mjs +166 -0
  198. package/scripts/lib/presentation.mjs +104 -46
  199. package/scripts/lib/project-config.mjs +67 -105
  200. package/scripts/lib/site-content.mjs +26 -42
  201. package/scripts/lib/site-paths.mjs +2 -0
  202. package/scripts/lib/sitewide-config.mjs +34 -0
  203. package/scripts/lib/theme-config.mjs +72 -6
  204. package/scripts/lib/typography.mjs +20 -26
  205. package/scripts/show-typography.mjs +40 -147
  206. package/scripts/sync-content-sections.mjs +19 -14
  207. package/scripts/test-content-check.mjs +76 -14
  208. package/scripts/test-content-model-v2.mjs +154 -0
  209. package/scripts/test-engine-commands.mjs +3 -1
  210. package/scripts/test-package-check.mjs +78 -19
  211. package/scripts/test-temporary-visibility.mjs +19 -2
  212. package/src/components/CardList.astro +5 -2
  213. package/src/components/GalleryGrid.astro +37 -16
  214. package/src/components/SiteBanners.astro +100 -0
  215. package/src/components/SiteNavigation.astro +48 -31
  216. package/src/components/SitePage.astro +55 -13
  217. package/src/components/SiteSection.astro +194 -36
  218. package/src/content.config.ts +78 -48
  219. package/src/layouts/BaseLayout.astro +64 -14
  220. package/src/lib/routeThemes.ts +61 -0
  221. package/src/lib/sectionContent.ts +236 -44
  222. package/src/lib/sitePublicAssets.ts +1 -0
  223. package/src/styles/global.css +282 -93
  224. package/starters/basic/.github/workflows/deploy.yml +1 -1
  225. package/starters/basic/README.md +7 -6
  226. package/starters/basic/site/config.mjs +0 -13
  227. package/starters/basic/site/content.md +1 -1
  228. package/starters/basic/site/sitewide-content.md +14 -0
  229. package/starters/basic/site/theme.md +13 -24
  230. package/starters/project/.github/workflows/deploy.yml +1 -1
  231. package/starters/project/README.md +10 -8
  232. package/starters/project/site/config.mjs +0 -13
  233. package/starters/project/site/sitewide-content.md +14 -0
  234. package/starters/project/site/theme.md +3 -11
@@ -0,0 +1,45 @@
1
+ <!DOCTYPE html><html lang="en" style="scroll-behavior: smooth; --font-sans: Arial, 'Helvetica Neue', Helvetica, sans-serif; --page-width: 2048px; --content-gutter-desktop: clamp(1.25rem, 4vw, 3rem); --content-gutter-mobile: 16px; --space-nav-to-first-section-desktop: clamp(1.25rem, 2.5vw, 2rem); --space-nav-to-first-section-mobile: 1rem; --space-section-body-to-gallery-desktop: 1.25rem; --space-section-body-to-gallery-mobile: 1rem; --space-gallery-item-desktop: clamp(1.25rem, 2.8vw, 2rem); --space-gallery-item-mobile: 1.8rem; --space-section-to-section-desktop: clamp(1.8rem, 3vw, 2.75rem); --space-section-to-section-mobile: 1.65rem; --space-final-section-bottom-desktop: clamp(1.8rem, 3vw, 2.75rem); --space-final-section-bottom-mobile: 1.65rem; --gallery-width: 55vw; --gallery-max-available-width-desktop: 100%; --gallery-max-available-width-mobile: 100%; --gallery-max-image-height-desktop: 74svh; --gallery-max-image-height-mobile: 68svh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="format-detection" content="telephone=no"><meta name="description" content="A small norna example with free dog images."><meta name="theme-color" content="#000000"><link rel="canonical" href="http://localhost:4321/"><meta name="generator" content="Astro v7.1.3"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><title>Local Dog Example</title><link rel="stylesheet" href="/_astro/SitePage.DicGh_5N.css"></head><body><a class="skip-link" href="#main-content">Skip to content</a><header class="site-top site-top-has-site-nav" data-smooth-scroll="{&quot;durationPerPixelMs&quot;:0.22,&quot;enabled&quot;:true,&quot;maximumDurationMs&quot;:4000,&quot;minimumDurationMs&quot;:2000}" style="--site-top-background-color: #550000; --site-top-text-color: #ffffff"><div class="site-nav-row"><a class="site-brand" href="/"><img class="site-brand-logo" src="/dog-shelter-logo.svg" alt="Dog Site"></a><nav class="site-nav" aria-label="Pages"><ul><li class="site-nav-item site-nav-item-has-sections"><a href="/" aria-current="page">Snoopy´s dog shelter!</a><div class="site-nav-submenu"><nav aria-label="Snoopy´s dog shelter! On this page"><ul><li><a href="/#black-dogs">Black Dogs</a></li><li><a href="/#summer-dogs">Summer Dogs</a></li><li><a href="/#brown-dogs">Brown Dogs</a></li><li><a href="/#golden-dogs">Golden Dogs</a></li><li><a href="/#white-dogs">White Dogs</a></li><li><a href="/#sources">Sources</a></li></ul></nav></div></li><li class="site-nav-item site-nav-item-has-sections"><a href="/dog-care/">Dog care</a><div class="site-nav-submenu"><nav aria-label="Dog care On this page"><ul><li><a href="/dog-care/#daily-rhythm">Daily rhythm</a></li><li><a href="/dog-care/#calm-training">Calm training</a></li><li><a href="/dog-care/#media-notes">Media notes</a></li></ul></nav></div></li></ul></nav><details class="mobile-nav-menu"><summary><span>Snoopy´s dog shelter!</span></summary><div class="mobile-nav-panel"><nav class="mobile-site-nav" aria-label="Pages"><h2>Pages</h2><ul><li><a href="/" aria-current="page">Snoopy´s dog shelter!</a></li><li><a href="/dog-care/">Dog care</a></li></ul></nav><nav class="mobile-page-nav" aria-label="On this page"><h2>On this page</h2><ul><li><a href="/#black-dogs" aria-current="true">Black Dogs</a></li><li><a href="/#summer-dogs">Summer Dogs</a></li><li><a href="/#brown-dogs">Brown Dogs</a></li><li><a href="/#golden-dogs">Golden Dogs</a></li><li><a href="/#white-dogs">White Dogs</a></li><li><a href="/#sources">Sources</a></li></ul></nav></div></details></div></header><script type="module">var e=document.querySelector(`.site-top`),t=Array.from(document.querySelectorAll(`.site-section`)),n=Array.from(document.querySelectorAll(`.site-nav-submenu a, .mobile-page-nav a`)),r=document.querySelector(`.mobile-nav-menu`),i=JSON.parse(e?.getAttribute(`data-smooth-scroll`)??`{}`),a=0,o=[120,320,700,1e3,2e3],s=window.matchMedia(`(prefers-reduced-motion: reduce)`),c=i.minimumDurationMs,l=i.maximumDurationMs,u=i.durationPerPixelMs,d=[`wheel`,`touchstart`],f=new Set([`ArrowDown`,`ArrowUp`,`End`,`Home`,`PageDown`,`PageUp`,` `]),p=null,m=null,h=0;`scrollRestoration`in history&&(history.scrollRestoration=`manual`);var g=()=>{if(!(e instanceof HTMLElement))return;let t=Math.ceil(e.getBoundingClientRect().height+a);return document.documentElement.style.setProperty(`--site-top-anchor-offset`,`${t}px`),t},_=e=>{let n=e.replace(/^#/,``);return t.find(e=>e.id===n)},v=e=>e?.querySelector(`h1, h2`),y=()=>{p&&=(p.cancel(),null)},b=e=>{e&&m!==e.id&&(m=e.id,n.forEach(t=>{let n=new URL(t.href,window.location.href);n.pathname===window.location.pathname&&n.hash===`#${e.id}`?t.setAttribute(`aria-current`,`true`):t.removeAttribute(`aria-current`)}))},x=()=>_(window.location.hash),S=e=>{window.location.hash!==e&&history.pushState(null,``,e)},C=()=>{r instanceof HTMLDetailsElement&&(r.open=!1)},w=e=>{if(!(e instanceof HTMLElement))return;let t=v(e);if(!(t instanceof HTMLElement))return;let n=g();if(n)return Math.max(0,t.getBoundingClientRect().top+window.scrollY-n)},T=e=>{y();let t=document.documentElement,n=t.style.scrollBehavior;t.style.scrollBehavior=`auto`,window.scrollTo(0,e),t.style.scrollBehavior=n},E=e=>{let t=Math.abs(e);return!i.enabled||s.matches||t<=a?0:Math.min(l,Math.max(c,t*u))},D=e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,O=(e,{duration:t,onComplete:n}={})=>{y();let r=typeof e==`function`?e:()=>e,i=r();if(i===void 0)return 0;let a=window.scrollY,o=i-a,s=t??E(o);if(s<=0){let e=r();return e===void 0?0:(T(e),n?.(),0)}let c=document.documentElement,l=c.style.scrollBehavior,u=performance.now(),m=0,h={cancel:()=>{}},g=()=>{d.forEach(e=>{window.removeEventListener(e,v)}),window.removeEventListener(`keydown`,b),c.style.scrollBehavior=l,p===h&&(p=null)},_=()=>{m&&cancelAnimationFrame(m),g()},v=()=>_(),b=e=>{f.has(e.key)&&v()},x=e=>{let t=e-u,o=Math.min(1,t/s),c=r();c!==void 0&&(i=c);let l=a+(i-a)*D(o);if(window.scrollTo(0,l),o>=1){window.scrollTo(0,i),g(),n?.();return}m=requestAnimationFrame(x)};return h.cancel=_,p=h,c.style.scrollBehavior=`auto`,d.forEach(e=>{window.addEventListener(e,v,{passive:!0})}),window.addEventListener(`keydown`,b),m=requestAnimationFrame(x),s},k=(e,{behavior:t=`smooth`,duration:n,onComplete:r}={})=>{let i=w(e);if(i===void 0)return 0;let a=t===`smooth`?O(()=>w(e),{duration:n,onComplete:r}):(T(i),r?.(),0);return b(e),a},A=()=>{g()},j=()=>{if(p)return;let e=x();e instanceof HTMLElement&&k(e,{behavior:`auto`})},M=()=>{if(!window.location.hash)return;h+=1;let e=h;o.forEach(t=>{window.setTimeout(()=>{e===h&&requestAnimationFrame(j)},t)})},N=({behavior:e=`auto`,scrollHashlessTop:n=!1}={})=>{let r=x();if(r instanceof HTMLElement){k(r,{behavior:e}),M();return}n&&T(0),b(t[0])};n.forEach(e=>{e.addEventListener(`click`,t=>{let n=new URL(e.href,window.location.href);if(n.pathname!==window.location.pathname)return;let r=_(n.hash);if(!(r instanceof HTMLElement))return;let i=w(r);if(i===void 0)return;t.preventDefault();let a=n.hash,o=E(i-window.scrollY);S(a),b(r),C(),k(r,{behavior:`smooth`,duration:o,onComplete:M})})}),A(),requestAnimationFrame(()=>N({behavior:`auto`})),e instanceof HTMLElement&&`ResizeObserver`in window&&new ResizeObserver(A).observe(e),window.addEventListener(`resize`,A),window.addEventListener(`load`,M),window.addEventListener(`hashchange`,()=>N({behavior:`auto`,scrollHashlessTop:!0})),window.addEventListener(`popstate`,()=>N({behavior:`auto`,scrollHashlessTop:!0})),window.visualViewport&&window.visualViewport.addEventListener(`resize`,A);</script><main id="main-content" class="site-content"><section id="black-dogs" class="site-section" data-section-title="Black Dogs" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.08; --section-heading-spacing-after: 0.45em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.05rem, 0.98rem + 0.28vw, 1.22rem); --section-markdown-h3-font-size-mobile: clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing-before: 1.2em; --section-markdown-h3-spacing-after: 0.45em; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-line-height: 1.5; --section-markdown-h4-spacing-before: 0.9em; --section-markdown-h4-spacing-after: 0.35em; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.5; --section-body-paragraph-spacing: 0.65em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-line-height: 1.35; --section-caption-spacing-before: 0.35em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h1>Black Dogs</h1></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>Black-coated dogs from the local norna development collection. This sentence
2
+ contains <span class="inline-style inline-style-highlight" style="--inline-style-color: #ffd84d">yellow highlighted text</span> for inline style inspection.</p>
3
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a
4
+ ante venenatis dapibus posuere velit aliquet.</p>
5
+ <h3 id="coat-notes">Coat notes</h3>
6
+ <p>This <code>###</code> heading should follow <code>typography.headings.h3</code>.</p>
7
+ <h4 id="small-detail">Small detail</h4>
8
+ <p>This <code>####</code> heading should follow <code>typography.headings.h4</code>.</p>
9
+ <p>Curabitur blandit tempus porttitor. Donec id elit non mi porta gravida at eget
10
+ metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.</p>
11
+ </div><div class="gallery" aria-label="Images: Black Dogs"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp" srcset="/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp 480w, /images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp 768w, /images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp 960w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 960 / 1600;" width="960" height="1600" class="gallery-image" alt="A black dog sitting outdoors and looking at the camera." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Photo of a dog. ContaDeletada2906, CC0 1.0, via Wikimedia Commons.</span></div></figcaption></figure><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp" srcset="/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp 480w, /images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp 768w, /images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp 1080w, /images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp 1440w, /images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp 1536w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1536 / 1024;" width="1536" height="1024" class="gallery-image gallery-image-landscape" alt="A black puppy standing in a grassy meadow and looking at the camera." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>AI-generated image.</span></div></figcaption></figure></div><script type="module" src="/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js"></script></div></div></section><section id="summer-dogs" class="site-section" data-section-title="Summer Dogs" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.08; --section-heading-spacing-after: 0.45em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.05rem, 0.98rem + 0.28vw, 1.22rem); --section-markdown-h3-font-size-mobile: clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing-before: 1.2em; --section-markdown-h3-spacing-after: 0.45em; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-line-height: 1.5; --section-markdown-h4-spacing-before: 0.9em; --section-markdown-h4-spacing-after: 0.35em; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.5; --section-body-paragraph-spacing: 0.65em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-line-height: 1.35; --section-caption-spacing-before: 0.35em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h2>Summer Dogs</h2></header><div class="section-body section-body-text-only"><div class="section-markdown"><p>This temporary section is visible during August 2026. It is here to demonstrate
12
+ date-controlled sections and <span class="inline-style inline-style-alert" style="--inline-style-color: #ff9a3d">warm alert text</span> in the local dog example.</p>
13
+ <p>Lorem ipsum dolor sit amet.</p>
14
+ <p>Vestibulum id ligula porta felis euismod semper. Maecenas faucibus mollis
15
+ interdum. Nullam quis risus eget urna mollis ornare vel eu leo.</p></div></div></div></section><section id="brown-dogs" class="site-section" data-section-title="Brown Dogs" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.08; --section-heading-spacing-after: 0.45em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.05rem, 0.98rem + 0.28vw, 1.22rem); --section-markdown-h3-font-size-mobile: clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing-before: 1.2em; --section-markdown-h3-spacing-after: 0.45em; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-line-height: 1.5; --section-markdown-h4-spacing-before: 0.9em; --section-markdown-h4-spacing-after: 0.35em; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.5; --section-body-paragraph-spacing: 0.65em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-line-height: 1.35; --section-caption-spacing-before: 0.35em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h2>Brown Dogs</h2></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>Brown dogs provide a second image section for local navigation checks.</p>
16
+ <p>Donec ullamcorper nulla non metus auctor fringilla. Fusce dapibus, tellus ac
17
+ cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit
18
+ amet risus.</p>
19
+ <p>Maecenas sed diam eget risus varius blandit sit amet non magna. Morbi leo risus,
20
+ porta ac consectetur ac, vestibulum at eros. Sed posuere consectetur est at
21
+ lobortis.</p>
22
+ </div><div class="gallery" aria-label="Images: Brown Dogs"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp" srcset="/images/generated/brown-dogs/brown-dog-50ef114e-480.webp 480w, /images/generated/brown-dogs/brown-dog-50ef114e-768.webp 768w, /images/generated/brown-dogs/brown-dog-50ef114e-1080.webp 1080w, /images/generated/brown-dogs/brown-dog-50ef114e-1440.webp 1440w, /images/generated/brown-dogs/brown-dog-50ef114e-1920.webp 1920w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 3939 / 2626;" width="3939" height="2626" class="gallery-image gallery-image-landscape" alt="A brown dog looking directly at the camera." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>DogBrown. Frank-3, CC0 1.0, via Wikimedia Commons.</span></div></figcaption></figure><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp" srcset="/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp 480w, /images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp 768w, /images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp 1080w, /images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp 1440w, /images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp 1920w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 2400 / 1800;" width="2400" height="1800" class="gallery-image gallery-image-landscape" alt="A man walks outdoors with a dog at his side." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Dog accompanies his master. Steve Hillebrand, U.S. Fish and Wildlife Service, public domain.</span></div></figcaption></figure></div></div></div></section><section id="golden-dogs" class="site-section" data-section-title="Golden Dogs" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.08; --section-heading-spacing-after: 0.45em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.05rem, 0.98rem + 0.28vw, 1.22rem); --section-markdown-h3-font-size-mobile: clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing-before: 1.2em; --section-markdown-h3-spacing-after: 0.45em; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-line-height: 1.5; --section-markdown-h4-spacing-before: 0.9em; --section-markdown-h4-spacing-after: 0.35em; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.5; --section-body-paragraph-spacing: 0.65em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-line-height: 1.35; --section-caption-spacing-before: 0.35em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h2>Golden Dogs</h2></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>Golden-coated retrievers add a third image section and more scrolling depth.</p>
23
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam.</p>
24
+ <h3 id="training-note">Training note</h3>
25
+ <p>This <code>###</code> heading follows the site-wide <code>headings.h3</code> style.</p>
26
+ <p>Nulla vitae elit libero, a pharetra augue. Integer posuere erat a ante venenatis
27
+ dapibus posuere velit aliquet. Aenean eu leo quam. Pellentesque ornare sem
28
+ lacinia quam venenatis vestibulum.</p>
29
+ </div><div class="gallery" aria-label="Images: Golden Dogs"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp" srcset="/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp 480w, /images/generated/golden-dogs/golden-retriever-f797fd88-768.webp 768w, /images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp 1080w, /images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp 1440w, /images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp 1600w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1600 / 1200;" width="1600" height="1200" class="gallery-image gallery-image-landscape" alt="A golden retriever standing outdoors." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Golden Retriever. Ribo, public domain, via Wikimedia Commons.</span></div></figcaption></figure><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp" srcset="/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp 480w, /images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp 768w, /images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp 1080w, /images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp 1440w, /images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp 1920w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 2576 / 1932;" width="2576" height="1932" class="gallery-image gallery-image-landscape" alt="A young Nova Scotia Duck Tolling Retriever puppy sitting on grass." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Nova Scotia Duck Tolling Retriever puppy. RM, public domain, via Wikimedia Commons.</span></div></figcaption></figure></div></div></div></section><section id="white-dogs" class="site-section" data-section-title="White Dogs" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.08; --section-heading-spacing-after: 0.45em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.05rem, 0.98rem + 0.28vw, 1.22rem); --section-markdown-h3-font-size-mobile: clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing-before: 1.2em; --section-markdown-h3-spacing-after: 0.45em; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-line-height: 1.5; --section-markdown-h4-spacing-before: 0.9em; --section-markdown-h4-spacing-after: 0.35em; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.5; --section-body-paragraph-spacing: 0.65em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-line-height: 1.35; --section-caption-spacing-before: 0.35em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h2>White Dogs</h2></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>A white dog completes the colour-based image sequence.</p>
30
+ <p>Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta
31
+ gravida at eget metus.</p>
32
+ <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Lorem ipsum
33
+ dolor sit amet, consectetur adipiscing elit. Donec sed odio dui. Vestibulum id
34
+ ligula porta felis euismod semper.</p>
35
+ </div><div class="gallery" aria-label="Images: White Dogs"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp" srcset="/images/generated/white-dogs/white-cute-dog-077a0689-480.webp 480w, /images/generated/white-dogs/white-cute-dog-077a0689-768.webp 768w, /images/generated/white-dogs/white-cute-dog-077a0689-1080.webp 1080w, /images/generated/white-dogs/white-cute-dog-077a0689-1277.webp 1277w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1277 / 1060;" width="1277" height="1060" class="gallery-image gallery-image-landscape" alt="A white dog looking toward the camera." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>White cute dog. Neal Ziring, public domain, via Wikimedia Commons.</span></div></figcaption></figure><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp" srcset="/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp 480w, /images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp 768w, /images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp 1080w, /images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp 1440w, /images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp 1536w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1536 / 1024;" width="1536" height="1024" class="gallery-image gallery-image-landscape" alt="A fluffy white puppy standing on grass in a garden." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>AI-generated image.</span></div></figcaption></figure></div></div></div></section><section id="sources" class="site-section" data-section-title="Sources" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.08; --section-heading-spacing-after: 0.45em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.05rem, 0.98rem + 0.28vw, 1.22rem); --section-markdown-h3-font-size-mobile: clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing-before: 1.2em; --section-markdown-h3-spacing-after: 0.45em; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-markdown-h4-line-height: 1.5; --section-markdown-h4-spacing-before: 0.9em; --section-markdown-h4-spacing-after: 0.35em; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.5; --section-body-paragraph-spacing: 0.65em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-line-height: 1.35; --section-caption-spacing-before: 0.35em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h2>Sources</h2></header><div class="section-body section-body-text-only"><div class="section-markdown"><p>Most images are sourced from Wikimedia Commons pages that list CC0 or
36
+ public-domain licensing:</p>
37
+ <ul>
38
+ <li><a href="https://commons.wikimedia.org/wiki/File:Photo_of_a_dog.jpg">Photo of a dog</a></li>
39
+ <li><a href="https://commons.wikimedia.org/wiki/File:DogBrown.jpg">DogBrown</a></li>
40
+ <li><a href="https://commons.wikimedia.org/wiki/File:Dog_accompanies_his_master.jpg">Dog accompanies his master</a></li>
41
+ <li><a href="https://commons.wikimedia.org/wiki/File:Golden_Retriever.jpg">Golden Retriever</a></li>
42
+ <li><a href="https://commons.wikimedia.org/wiki/File:Toller_pup7wks2.JPG">Toller pup7wks2</a></li>
43
+ <li><a href="https://commons.wikimedia.org/wiki/File:White_cute_dog.jpg">White cute dog</a></li>
44
+ </ul>
45
+ <p>The black and white puppy images are AI-generated.</p></div></div></div></section></main><footer class="site-footer" style="--site-footer-background-color: #550000; --site-footer-text-color: #ffffff"><p>Dog images from Wikimedia Commons; see image captions for license details.<span>Built 17/08/2026, 15:17</span></p></footer></body></html>
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Allow: /
@@ -1,31 +1,31 @@
1
1
  {
2
- "hash": "18953098",
3
- "configHash": "df6ba470",
2
+ "hash": "9288c44d",
3
+ "configHash": "157af100",
4
4
  "lockfileHash": "808f2e8e",
5
- "browserHash": "54286dfc",
5
+ "browserHash": "a00be533",
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": "dc2a8aee",
10
+ "fileHash": "9b91d854",
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": "3acd67c7",
16
+ "fileHash": "5a1ed64b",
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": "9967a3db",
22
+ "fileHash": "6d948667",
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": "98dc9563",
28
+ "fileHash": "deee87d7",
29
29
  "needsInterop": false
30
30
  }
31
31
  },
@@ -1,5 +1,5 @@
1
1
  {
2
- "black-puppy-meadow.png": {
2
+ "images/black-dogs/black-puppy-meadow.png": {
3
3
  "outputVersion": 2,
4
4
  "sourceHash": "7255e3d9148c1ded01ae6ae6809b9a8261b553a1516d3f8f4de0554bc321f652",
5
5
  "width": 1536,
@@ -27,7 +27,7 @@
27
27
  }
28
28
  ]
29
29
  },
30
- "photo-of-a-black-dog.jpg": {
30
+ "images/black-dogs/photo-of-a-black-dog.jpg": {
31
31
  "outputVersion": 2,
32
32
  "sourceHash": "5cf614d2863ca8f86b6162c7b477fd2690adbc101816206c9e675bf36d9962d0",
33
33
  "width": 960,
@@ -47,7 +47,7 @@
47
47
  }
48
48
  ]
49
49
  },
50
- "brown-dog.jpg": {
50
+ "images/brown-dogs/brown-dog.jpg": {
51
51
  "outputVersion": 2,
52
52
  "sourceHash": "50ef114e49ae48491c015157b4a25f4f1fd69140170fe6d4202c551858c3e03d",
53
53
  "width": 3939,
@@ -79,7 +79,7 @@
79
79
  }
80
80
  ]
81
81
  },
82
- "dog-accompanies-master.jpg": {
82
+ "images/brown-dogs/dog-accompanies-master.jpg": {
83
83
  "outputVersion": 2,
84
84
  "sourceHash": "7ef804d5ebe27724409f4ffa94389c7b1102c2c8bb9c1dae29ecbd4c56e61af9",
85
85
  "width": 2400,
@@ -111,7 +111,7 @@
111
111
  }
112
112
  ]
113
113
  },
114
- "golden-retriever.jpg": {
114
+ "images/golden-dogs/golden-retriever.jpg": {
115
115
  "outputVersion": 2,
116
116
  "sourceHash": "f797fd880d6c3b112ceb3408f468fbeaf442efc792f935fd6c9954b812fdc838",
117
117
  "width": 1600,
@@ -139,7 +139,7 @@
139
139
  }
140
140
  ]
141
141
  },
142
- "toller-puppy.jpg": {
142
+ "images/golden-dogs/toller-puppy.jpg": {
143
143
  "outputVersion": 2,
144
144
  "sourceHash": "a2a8fbc0d599deb019d45f7b11de98bcbcb4f1fd609e931073161dcb88cbf63f",
145
145
  "width": 2576,
@@ -171,7 +171,7 @@
171
171
  }
172
172
  ]
173
173
  },
174
- "white-cute-dog.jpg": {
174
+ "images/white-dogs/white-cute-dog.jpg": {
175
175
  "outputVersion": 2,
176
176
  "sourceHash": "077a06891d97eafb4593cfcaa5c9b04fdb1e3a6206d56acd4ebd3eadb83356bf",
177
177
  "width": 1277,
@@ -195,7 +195,7 @@
195
195
  }
196
196
  ]
197
197
  },
198
- "white-puppy-garden.png": {
198
+ "images/white-dogs/white-puppy-garden.png": {
199
199
  "outputVersion": 2,
200
200
  "sourceHash": "d3ab2ca04fb37dfbf010e7f9f3adf2ba8401553bd1946e3b388cb662eac58ee9",
201
201
  "width": 1536,
@@ -30,26 +30,6 @@ export default {
30
30
  gallery: 'Images',
31
31
  },
32
32
  },
33
- footer: {
34
- // Omit this value to hide the copyright sentence.
35
- copyrightMessage: 'Dog images from Wikimedia Commons; see image captions for license details.',
36
-
37
- // Set enabled to false to hide the build timestamp while keeping its config.
38
- buildInfo: {
39
- enabled: true,
40
-
41
- // Text shown before the formatted build timestamp.
42
- text: 'Built',
43
-
44
- // Standard Intl.DateTimeFormat options for the build timestamp.
45
- dateTimeFormat: {
46
- locale: 'en-GB',
47
- timeZone: 'UTC',
48
- dateStyle: 'short',
49
- timeStyle: 'short',
50
- },
51
- },
52
- },
53
33
  github: {
54
34
  // Example repository and workflow details used by deploy scripts.
55
35
  repo: 'owner/example-site',
@@ -2,7 +2,7 @@
2
2
  title: Local Dog Example
3
3
  description: A small norna example with free dog images.
4
4
  navigation:
5
- label: Dog site!
5
+ label: Snoopy´s dog shelter!
6
6
  sections:
7
7
  summer-dogs:
8
8
  visible:
@@ -12,9 +12,8 @@ sections:
12
12
 
13
13
  ## Black Dogs {#black-dogs}
14
14
 
15
- Black-coated dogs from the local norna development collection. This
16
- sentence contains [yellow highlighted text]{.highlight} for inline style
17
- inspection.
15
+ Black-coated dogs from the local norna development collection. This sentence
16
+ contains **highlighted text** for inline emphasis inspection.
18
17
 
19
18
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a
20
19
  ante venenatis dapibus posuere velit aliquet.
@@ -42,7 +41,7 @@ metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
42
41
  ## Summer Dogs {#summer-dogs}
43
42
 
44
43
  This temporary section is visible during August 2026. It is here to demonstrate
45
- date-controlled sections and [warm alert text]{.alert} in the local dog example.
44
+ date-controlled sections and **warm alert text** in the local dog example.
46
45
 
47
46
  Lorem ipsum dolor sit amet.
48
47
 
@@ -0,0 +1,14 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 104" role="img" aria-labelledby="title desc">
2
+ <title id="title">Dog Shelter</title>
3
+ <desc id="desc">A line-art dog house, food bowl and dog beside the words Dog Shelter.</desc>
4
+ <g fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="4">
5
+ <path d="M8 48 39 19l31 29M16 42v43h46V42M30 85V58h18v27"/>
6
+ <path d="M80 69h42l-6 17H86zM78 69c0-6 46-6 46 0"/>
7
+ <path d="M159 42c-3-8-2-17 2-24 6 2 12 6 16 11 5-4 11-7 17-8 3 8 1 16-4 22"/>
8
+ <path d="M158 41c-1 14 7 24 19 24s20-10 19-24M163 66c-5 8-7 15-6 20M191 66c5 8 7 15 6 20"/>
9
+ <circle cx="166" cy="43" r="2" fill="#fff" stroke="none"/>
10
+ <circle cx="186" cy="43" r="2" fill="#fff" stroke="none"/>
11
+ <path d="M177 50c2 2 6 2 8 0M181 47v3"/>
12
+ </g>
13
+ <text x="232" y="63" fill="#fff" font-family="Arial, Helvetica, sans-serif" font-size="29" font-weight="700" letter-spacing="2">DOG SHELTER</text>
14
+ </svg>
@@ -0,0 +1,16 @@
1
+ ---
2
+ navigation:
3
+ logo:
4
+ alt: Dog Shelter
5
+ height: 2.6rem
6
+ footer:
7
+ copyrightMessage: Dog images from Wikimedia Commons; see image captions for license details.
8
+ buildInfo:
9
+ enabled: true
10
+ text: Built
11
+ dateTimeFormat:
12
+ locale: en-GB
13
+ timeZone: UTC
14
+ dateStyle: short
15
+ timeStyle: short
16
+ ---
@@ -4,8 +4,6 @@
4
4
  # Active values below are ordinary YAML; this marked comment block is only help text.
5
5
  #
6
6
  # Available structure:
7
- # navigation:
8
- # brand: site-wide brand/home text; defaults to the homepage title
9
7
  # layout:
10
8
  # density: compact | normal | airy
11
9
  # pageWidth: CSS length, e.g. 2048px
@@ -44,16 +42,10 @@
44
42
  # spacingBefore: CSS length, e.g. 0.9em
45
43
  # spacingAfter: CSS length, e.g. 0.35em
46
44
  # presentation:
47
- # backgroundColor: quoted hex color, e.g. "#000000"
48
- # textColor: quoted hex color, e.g. "#f7f4ee"
49
- # inlineStyles:
50
- # style-name:
51
- # color: quoted hex color
52
- # frame:
53
- # colors: presentation | theme
54
- # colors:
55
- # backgroundColor: quoted hex color
56
- # textColor: quoted hex color
45
+ # palette: dark # Alternatives: light, paper
46
+ # sectionSurfaces:
47
+ # mode: none | cycle
48
+ # sequence: [base, soft, emphasis]
57
49
  # norna:end theme-help
58
50
  layout:
59
51
  density: compact
@@ -71,9 +63,12 @@ layout:
71
63
  finalSectionBottom:
72
64
  desktop: clamp(1.8rem, 3vw, 2.75rem)
73
65
  mobile: 1.65rem
74
- bodyToImages:
75
- desktop: 1.25rem
76
- mobile: 1rem
66
+ headingToBlock:
67
+ desktop: 0.65em
68
+ mobile: 0.6em
69
+ blockGap:
70
+ desktop: 1.25em
71
+ mobile: 1.1em
77
72
  imageGap:
78
73
  desktop: clamp(1.25rem, 2.8vw, 2rem)
79
74
  mobile: 1.8rem
@@ -100,13 +95,7 @@ typography:
100
95
  spacingBefore: 0.9em
101
96
  spacingAfter: 0.35em
102
97
  presentation:
103
- backgroundColor: "#550000"
104
- textColor: "#ffffff"
105
- inlineStyles:
106
- highlight:
107
- color: "#ffd84d"
108
- alert:
109
- color: "#ff9a3d"
110
- frame:
111
- colors: presentation
98
+ palette: dark # Alternatives: light, paper
99
+ sectionSurfaces:
100
+ mode: cycle
112
101
  ---
@@ -0,0 +1,15 @@
1
+ # Norna visual model example
2
+
3
+ This example is a visual test bench for Norna's presentation features.
4
+
5
+ It shows established typography presets and managed media blocks alongside the
6
+ palette and section-surface model. The SVG files are hand-authored local assets
7
+ so the example does not depend on external images.
8
+
9
+ Run it from the repository root with:
10
+
11
+ ```sh
12
+ node bin/norna.mjs --site-dir examples/presentation/site dev:local
13
+ ```
14
+
15
+ The site has a home page plus routes for presets, media blocks and surfaces.
@@ -0,0 +1,66 @@
1
+ {
2
+ "routes/020-media/images/cards/card-carousel.svg": {
3
+ "kind": "static",
4
+ "outputVersion": 2,
5
+ "sourceHash": "1447ec44c3cfe2f9041237dfd8aff42a21b82bc6762b840ab2c22d17b0454f8b",
6
+ "src": "/images/original/routes/020-media/images/cards/card-carousel-1447ec44.svg",
7
+ "width": 1200,
8
+ "height": 700
9
+ },
10
+ "routes/020-media/images/cards/card-stack.svg": {
11
+ "kind": "static",
12
+ "outputVersion": 2,
13
+ "sourceHash": "00e6c2d553b7cb23cc8a13d0fbca72d25a046a76db828faa5de8ccb6b2e4b2ae",
14
+ "src": "/images/original/routes/020-media/images/cards/card-stack-00e6c2d5.svg",
15
+ "width": 1200,
16
+ "height": 700
17
+ },
18
+ "routes/020-media/images/cards/card-surfaces.svg": {
19
+ "kind": "static",
20
+ "outputVersion": 2,
21
+ "sourceHash": "094c43e8bad8f1b8e497d21996f5cf66588f3b4c1ab9ced6dd40a3f67d827fb4",
22
+ "src": "/images/original/routes/020-media/images/cards/card-surfaces-094c43e8.svg",
23
+ "width": 1200,
24
+ "height": 700
25
+ },
26
+ "routes/020-media/images/carousel/carousel-one.svg": {
27
+ "kind": "static",
28
+ "outputVersion": 2,
29
+ "sourceHash": "b2d1e7c0642cd1ec7b36a26da54b58739804b61db9e986fe054eb7fe3c811e88",
30
+ "src": "/images/original/routes/020-media/images/carousel/carousel-one-b2d1e7c0.svg",
31
+ "width": 1200,
32
+ "height": 700
33
+ },
34
+ "routes/020-media/images/carousel/carousel-three.svg": {
35
+ "kind": "static",
36
+ "outputVersion": 2,
37
+ "sourceHash": "08e70e38babec81507497a81dfe0136a7b9993fb885ac06155b346bfc8413cac",
38
+ "src": "/images/original/routes/020-media/images/carousel/carousel-three-08e70e38.svg",
39
+ "width": 1200,
40
+ "height": 700
41
+ },
42
+ "routes/020-media/images/carousel/carousel-two.svg": {
43
+ "kind": "static",
44
+ "outputVersion": 2,
45
+ "sourceHash": "ba65261788ba8cc8dd5162dd0a748919a01aa925f2f8e3f844745e0c54af28be",
46
+ "src": "/images/original/routes/020-media/images/carousel/carousel-two-ba652617.svg",
47
+ "width": 1200,
48
+ "height": 700
49
+ },
50
+ "routes/020-media/images/stack/stack-one.svg": {
51
+ "kind": "static",
52
+ "outputVersion": 2,
53
+ "sourceHash": "c835acc71775886a86829989398b2e498fb2ccedafa465ee03f97dd8f6695c69",
54
+ "src": "/images/original/routes/020-media/images/stack/stack-one-c835acc7.svg",
55
+ "width": 1200,
56
+ "height": 700
57
+ },
58
+ "routes/020-media/images/stack/stack-two.svg": {
59
+ "kind": "static",
60
+ "outputVersion": 2,
61
+ "sourceHash": "83c64b1c1dd3b4745100baf272db7e91921b2e2967a51f0d31a9cd30cf045881",
62
+ "src": "/images/original/routes/020-media/images/stack/stack-two-83c64b1c.svg",
63
+ "width": 1200,
64
+ "height": 700
65
+ }
66
+ }
@@ -0,0 +1,29 @@
1
+ const siteUrl = 'http://localhost:4321/';
2
+
3
+ export default {
4
+ site: {
5
+ url: siteUrl,
6
+ basePath: '/',
7
+ },
8
+ navigation: {
9
+ smoothScroll: {
10
+ enabled: true,
11
+ minimumDurationMs: 2_000,
12
+ maximumDurationMs: 4_000,
13
+ durationPerPixelMs: 0.22,
14
+ },
15
+ },
16
+ locale: {
17
+ lang: 'en',
18
+ labels: {
19
+ skipToContent: 'Skip to content',
20
+ sectionNavigation: 'Sections',
21
+ gallery: 'Images',
22
+ },
23
+ },
24
+ github: {
25
+ repo: 'owner/norna-visual-model-example',
26
+ branch: 'main',
27
+ pagesWorkflow: 'Deploy to GitHub Pages',
28
+ },
29
+ };
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: Visual Model
3
+ description: A visual test bench for Norna's established and new presentation features.
4
+ navigation:
5
+ label: Home
6
+ ---
7
+
8
+ ## Norna's visual model {#intro}
9
+
10
+ This site is a small test bench for Norna's graphical possibilities. It shows
11
+ the features that have been part of the site model for some time, together with
12
+ the newer palette and section-surface controls.
13
+
14
+ The examples are deliberately ordinary Norna files: a theme chooses the site's
15
+ visual defaults, routes can use their own complete themes, and Markdown blocks
16
+ place managed media in the content flow.
17
+
18
+ ## New: palettes and surfaces {#palette}
19
+
20
+ The palette is a small, named choice rather than a collection of unrelated
21
+ colours. The site theme selects one of the built-in palettes:
22
+
23
+ ```yaml
24
+ presentation:
25
+ palette: paper
26
+ ```
27
+
28
+ The palette supplies the page, navigation and frame colours. A site can also
29
+ cycle through base, soft and emphasis section surfaces:
30
+
31
+ ```yaml
32
+ presentation:
33
+ sectionSurfaces:
34
+ mode: cycle
35
+ sequence: [base, soft, emphasis]
36
+ ```
37
+
38
+ This keeps the visual rhythm consistent without asking each section to invent
39
+ its own colours.
40
+
41
+ ## New: explicit section surfaces {#surfaces}
42
+
43
+ This page uses the theme's surface sequence. `palette` is the visual family;
44
+ `sectionSurfaces` chooses a bounded sequence of base, soft and emphasis
45
+ treatments for the page.
46
+
47
+ The result is a restrained change in background and text treatment, while the
48
+ same typography and content model remain in place.
49
+
50
+ ## Established features {#established}
51
+
52
+ Typography presets, managed image stacks, carousels and card lists remain the
53
+ main building blocks for shaping a small site. They are shown in detail on the
54
+ routes in this example.
55
+
56
+ The important distinction is that these controls are named and bounded. They
57
+ provide useful visual variation without turning every page into a new template
58
+ or CSS project.
59
+
60
+ ## Explore the examples {#next}
61
+
62
+ Read [Presets](/presets/) to compare the four typography presets.
63
+
64
+ Read [Media blocks](/media/) to compare image stacks, carousels and card lists.
65
+
66
+ Read [Surfaces](/surfaces/) for the relationship between palette defaults and
67
+ theme-level surface choices.
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Allow: /