@janga/norna 0.7.16 → 0.7.18

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 (342) hide show
  1. package/README.md +18 -9
  2. package/astro.config.mjs +35 -3
  3. package/bin/norna-cli.mjs +1 -1
  4. package/docs/README.md +16 -14
  5. package/docs/commands.md +2 -2
  6. package/docs/configuration.md +25 -2
  7. package/docs/content.md +92 -103
  8. package/docs/design/navigation-and-theme-plan.md +186 -0
  9. package/docs/design/norna-diagram-design.md +9 -9
  10. package/docs/design/site-examples-structure.md +15 -11
  11. package/docs/engine-development.md +19 -22
  12. package/docs/getting-started.md +21 -16
  13. package/docs/images-and-metadata.md +12 -9
  14. package/docs/pages.md +190 -0
  15. package/docs/public-files.md +49 -36
  16. package/docs/publishing.md +19 -3
  17. package/docs/site-files.md +46 -38
  18. package/docs/sitewide-content.md +20 -36
  19. package/docs/theme.md +109 -143
  20. package/docs/typography.md +19 -31
  21. package/examples/README.md +10 -4
  22. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +17 -41
  23. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +26 -67
  24. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +185 -88
  25. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -1
  26. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev-local.json +4 -4
  27. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +5 -5
  28. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +33 -23
  29. package/examples/complete-sites/dog-shelter-multi-page/README.md +1 -1
  30. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +8 -8
  31. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +20 -20
  32. package/examples/complete-sites/dog-shelter-multi-page/site/{content.md → pages/000-home/content.md} +3 -4
  33. package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/010-dogs/content.md +3 -4
  34. package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/020-adopt/content.md +3 -4
  35. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +2 -4
  36. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +17 -41
  37. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +26 -67
  38. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +185 -88
  39. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +1 -1
  40. package/examples/complete-sites/dog-shelter-single-page/.astro/dev-local.json +8 -0
  41. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +5 -5
  42. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +16 -12
  43. package/examples/complete-sites/dog-shelter-single-page/README.md +1 -1
  44. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +8 -8
  45. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +12 -12
  46. package/examples/complete-sites/dog-shelter-single-page/site/{content.md → pages/000-home/content.md} +5 -2
  47. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +2 -4
  48. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +17 -41
  49. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +26 -67
  50. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +180 -91
  51. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
  52. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +4 -14
  53. package/examples/feature-demos/media-and-surfaces/README.md +2 -2
  54. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +9 -9
  55. package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +16 -16
  56. package/examples/feature-demos/media-and-surfaces/site/{content.md → pages/000-home/content.md} +4 -7
  57. package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/010-media/content.md +6 -5
  58. package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/020-surfaces/content.md +9 -7
  59. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +2 -0
  60. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.yaml +0 -2
  61. package/examples/feature-demos/sitewide-content/README.md +3 -3
  62. package/examples/feature-demos/sitewide-content/site/pages/000-home/content.md +17 -0
  63. package/examples/feature-demos/sitewide-content/site/pages/010-logo-and-navigation/content.md +17 -0
  64. package/examples/feature-demos/sitewide-content/site/{routes → pages}/020-notices/content.md +7 -6
  65. package/examples/feature-demos/sitewide-content/site/{routes → pages}/030-footer/content.md +6 -5
  66. package/examples/feature-demos/sitewide-content/site/sitewide-content.yaml +4 -13
  67. package/examples/feature-demos/theme-preset-documentation/README.md +16 -0
  68. package/examples/feature-demos/theme-preset-documentation/site/.norna/generated-images.json +74 -0
  69. package/examples/feature-demos/{theme-presets/site/routes/020-documentation → theme-preset-documentation/site/pages/000-home}/content.md +4 -7
  70. package/examples/feature-demos/theme-preset-documentation/site/sitewide-content.yaml +3 -0
  71. package/examples/feature-demos/theme-preset-portfolio/README.md +16 -0
  72. package/examples/feature-demos/theme-preset-portfolio/site/.norna/generated-images.json +74 -0
  73. package/examples/feature-demos/theme-preset-portfolio/site/config.yaml +1 -0
  74. package/examples/feature-demos/{theme-presets/site/routes/010-portfolio → theme-preset-portfolio/site/pages/000-home}/content.md +4 -7
  75. package/examples/feature-demos/theme-preset-portfolio/site/public/robots.txt +2 -0
  76. package/examples/feature-demos/theme-preset-portfolio/site/sitewide-content.yaml +3 -0
  77. package/examples/feature-demos/theme-preset-project/README.md +16 -0
  78. package/examples/feature-demos/theme-preset-project/site/.norna/generated-images.json +74 -0
  79. package/examples/feature-demos/theme-preset-project/site/config.yaml +1 -0
  80. package/examples/feature-demos/{theme-presets/site/routes/030-project → theme-preset-project/site/pages/000-home}/content.md +4 -7
  81. package/examples/feature-demos/theme-preset-project/site/public/robots.txt +2 -0
  82. package/examples/feature-demos/theme-preset-project/site/sitewide-content.yaml +3 -0
  83. package/examples/feature-demos/theme-preset-statement/README.md +16 -0
  84. package/examples/feature-demos/theme-preset-statement/site/.norna/generated-images.json +74 -0
  85. package/examples/feature-demos/theme-preset-statement/site/config.yaml +1 -0
  86. package/examples/feature-demos/{theme-presets/site/routes/040-statement → theme-preset-statement/site/pages/000-home}/content.md +4 -7
  87. package/examples/feature-demos/theme-preset-statement/site/public/robots.txt +2 -0
  88. package/examples/feature-demos/theme-preset-statement/site/sitewide-content.yaml +3 -0
  89. package/fixtures/basic/site/{content.md → pages/000-home/content.md} +5 -6
  90. package/fixtures/basic/site/sitewide-content.yaml +1 -8
  91. package/fixtures/basic/site/theme.yaml +1 -8
  92. package/fixtures/content-model-v2/site/{content.md → pages/000-home/content.md} +11 -13
  93. package/fixtures/content-model-v2/site/pages/010-guide/content.md +18 -0
  94. package/fixtures/nested-pages/.astro/collections/site.schema.json +35 -0
  95. package/fixtures/nested-pages/.astro/collections/sitewide.schema.json +97 -0
  96. package/fixtures/nested-pages/.astro/collections/theme.schema.json +844 -0
  97. package/fixtures/nested-pages/.astro/content-assets.mjs +4 -0
  98. package/fixtures/nested-pages/.astro/content-modules.mjs +1 -0
  99. package/fixtures/nested-pages/.astro/content.d.ts +183 -0
  100. package/fixtures/nested-pages/.astro/data-store.json +1 -0
  101. package/fixtures/nested-pages/.astro/dev-local.json +8 -0
  102. package/fixtures/nested-pages/.astro/dev.log +1128 -0
  103. package/fixtures/nested-pages/.astro/settings.json +5 -0
  104. package/fixtures/nested-pages/.astro/types.d.ts +2 -0
  105. package/fixtures/nested-pages/node_modules/.vite/deps/_metadata.json +74 -0
  106. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  107. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  108. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  109. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  110. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  111. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  112. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  113. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  114. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  115. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  116. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  117. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  118. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  119. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  120. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  121. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  122. package/fixtures/nested-pages/node_modules/.vite/deps/package.json +3 -0
  123. package/fixtures/nested-pages/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  124. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  125. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  126. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  127. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  128. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  129. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  130. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  131. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  132. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  133. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  134. package/fixtures/nested-pages/site/.norna/generated-images.json +10 -0
  135. package/fixtures/nested-pages/site/config.yaml +3 -0
  136. package/fixtures/nested-pages/site/pages/000-home/content.md +15 -0
  137. package/fixtures/nested-pages/site/pages/010-guides/content.md +15 -0
  138. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/content.md +21 -0
  139. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/images/diagram.svg +21 -0
  140. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +18 -0
  141. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/theme.yaml +2 -0
  142. package/fixtures/nested-pages/site/pages/010-guides/pages/020-workflows/content.md +11 -0
  143. package/fixtures/nested-pages/site/pages/010-guides/pages/030-release-notes/content.md +9 -0
  144. package/fixtures/nested-pages/site/pages/010-guides/pages/040-configuration/content.md +3 -0
  145. package/fixtures/nested-pages/site/pages/010-guides/pages/050-content/content.md +3 -0
  146. package/fixtures/nested-pages/site/pages/010-guides/pages/060-themes/content.md +3 -0
  147. package/fixtures/nested-pages/site/pages/010-guides/pages/070-images/content.md +3 -0
  148. package/fixtures/nested-pages/site/pages/010-guides/pages/080-cards/content.md +3 -0
  149. package/fixtures/nested-pages/site/pages/010-guides/pages/090-notes/content.md +3 -0
  150. package/fixtures/nested-pages/site/pages/010-guides/pages/100-validation/content.md +3 -0
  151. package/fixtures/nested-pages/site/pages/010-guides/pages/110-synchronization/content.md +3 -0
  152. package/fixtures/nested-pages/site/pages/010-guides/pages/120-building/content.md +3 -0
  153. package/fixtures/nested-pages/site/pages/010-guides/pages/130-publishing/content.md +3 -0
  154. package/fixtures/nested-pages/site/pages/010-guides/pages/140-troubleshooting/content.md +3 -0
  155. package/fixtures/nested-pages/site/pages/010-guides/pages/150-migration/content.md +3 -0
  156. package/fixtures/nested-pages/site/pages/010-guides/pages/160-accessibility/content.md +3 -0
  157. package/fixtures/nested-pages/site/pages/010-guides/pages/170-performance/content.md +3 -0
  158. package/fixtures/nested-pages/site/pages/010-guides/pages/180-security/content.md +3 -0
  159. package/fixtures/nested-pages/site/pages/010-guides/pages/190-localization/content.md +3 -0
  160. package/fixtures/nested-pages/site/pages/010-guides/pages/200-upgrading/content.md +3 -0
  161. package/fixtures/nested-pages/site/pages/010-guides/pages/210-faq/content.md +3 -0
  162. package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +7 -0
  163. package/fixtures/nested-pages/site/pages/020-reference/content.md +10 -0
  164. package/fixtures/nested-pages/site/pages/020-reference/pages/010-installation/content.md +11 -0
  165. package/fixtures/nested-pages/site/theme.yaml +1 -0
  166. package/package.json +8 -4
  167. package/schemas/config.schema.json +46 -5
  168. package/schemas/content-frontmatter.schema.json +28 -63
  169. package/schemas/manifest.json +4 -2
  170. package/schemas/page-theme.schema.json +192 -0
  171. package/schemas/sitewide-content.schema.json +58 -132
  172. package/schemas/theme.schema.json +434 -152
  173. package/scripts/check-config.mjs +8 -6
  174. package/scripts/deploy-site.mjs +6 -8
  175. package/scripts/doctor.mjs +2 -2
  176. package/scripts/generate-images.mjs +15 -29
  177. package/scripts/generate-schemas.mjs +7 -218
  178. package/scripts/lib/base-path-redirect.mjs +9 -0
  179. package/scripts/lib/editor-language-service.mjs +125 -79
  180. package/scripts/lib/example-sites.mjs +15 -3
  181. package/scripts/lib/heading-ids.mjs +161 -0
  182. package/scripts/lib/navigation-model.mjs +51 -0
  183. package/scripts/lib/norna-markdown-blocks.mjs +3 -4
  184. package/scripts/lib/page-model.mjs +102 -0
  185. package/scripts/lib/presentation.mjs +25 -17
  186. package/scripts/lib/project-config.mjs +46 -8
  187. package/scripts/lib/schema-definitions.mjs +78 -55
  188. package/scripts/lib/schema-editor-metadata.mjs +519 -0
  189. package/scripts/lib/schema-value-definitions.mjs +20 -6
  190. package/scripts/lib/site-content.mjs +159 -97
  191. package/scripts/lib/site-conventions.mjs +1 -0
  192. package/scripts/lib/site-paths.mjs +11 -5
  193. package/scripts/lib/theme-config.mjs +12 -18
  194. package/scripts/lib/theme-presets.mjs +55 -14
  195. package/scripts/release.mjs +1 -1
  196. package/scripts/show-typography.mjs +4 -30
  197. package/scripts/sync-content-sections.mjs +107 -68
  198. package/scripts/{test-temporary-visibility.mjs → test-banner-visibility.mjs} +8 -25
  199. package/scripts/test-client-javascript.mjs +50 -46
  200. package/scripts/test-content-check.mjs +153 -69
  201. package/scripts/test-content-model-v2.mjs +566 -285
  202. package/scripts/test-documentation.mjs +10 -3
  203. package/scripts/test-editor-language-service.mjs +172 -25
  204. package/scripts/test-engine-commands.mjs +6 -5
  205. package/scripts/test-examples.mjs +30 -1
  206. package/scripts/test-heading-ids.mjs +68 -0
  207. package/scripts/test-navigation-model.mjs +63 -0
  208. package/scripts/test-navigation.mjs +11 -2
  209. package/scripts/test-nested-pages.mjs +125 -0
  210. package/scripts/test-package-check.mjs +55 -95
  211. package/scripts/test-page-model.mjs +108 -0
  212. package/scripts/test-project-config.mjs +22 -3
  213. package/scripts/test-schemas.mjs +82 -15
  214. package/scripts/test-theme-presets.mjs +57 -42
  215. package/src/components/NavigationPageTree.astro +157 -0
  216. package/src/components/PageContentsLinks.astro +40 -0
  217. package/src/components/SectionNavigationScript.astro +117 -5
  218. package/src/components/SiteBreadcrumbs.astro +32 -0
  219. package/src/components/SiteNavigation.astro +97 -68
  220. package/src/components/SitePage.astro +93 -55
  221. package/src/components/SiteSection.astro +29 -27
  222. package/src/components/SiteTreeNavigation.astro +35 -0
  223. package/src/components/TreeNavigationScript.astro +83 -0
  224. package/src/content.config.ts +8 -10
  225. package/src/layouts/BaseLayout.astro +21 -20
  226. package/src/lib/pageThemes.ts +44 -0
  227. package/src/lib/sectionContent.ts +106 -107
  228. package/src/lib/siteNavigation.ts +49 -0
  229. package/src/lib/sitePages.ts +96 -38
  230. package/src/pages/{[slug].astro → [...slug].astro} +2 -2
  231. package/src/pages/index.astro +2 -1
  232. package/src/styles/global.css +743 -57
  233. package/starters/basic/README.md +9 -11
  234. package/starters/basic/site/{content.md → pages/000-home/content.md} +7 -4
  235. package/starters/basic/site/sitewide-content.yaml +1 -10
  236. package/starters/basic/site/theme.yaml +1 -105
  237. package/starters/project/README.md +14 -14
  238. package/starters/project/site/{content.md → pages/000-home/content.md} +5 -4
  239. package/starters/project/site/{routes → pages}/010-guide/content.md +5 -4
  240. package/starters/project/site/sitewide-content.yaml +1 -10
  241. package/starters/project/site/theme.yaml +1 -31
  242. package/docs/routes.md +0 -121
  243. package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/theme.yaml +0 -3
  244. package/examples/feature-demos/sitewide-content/site/content.md +0 -16
  245. package/examples/feature-demos/sitewide-content/site/routes/010-identity/content.md +0 -20
  246. package/examples/feature-demos/theme-presets/README.md +0 -18
  247. package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +0 -290
  248. package/examples/feature-demos/theme-presets/site/content.md +0 -17
  249. package/examples/feature-demos/theme-presets/site/sitewide-content.yaml +0 -12
  250. package/examples/feature-demos/theme-presets/site/theme.yaml +0 -1
  251. package/fixtures/content-model-v2/site/routes/010-guide/content.md +0 -17
  252. package/scripts/lib/route-model.mjs +0 -17
  253. package/scripts/test-route-model.mjs +0 -32
  254. package/src/lib/routeThemes.ts +0 -41
  255. /package/examples/complete-sites/dog-shelter-multi-page/site/{images/intro → pages/000-home/images}/shelter-dog.jpg +0 -0
  256. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rex.jpg +0 -0
  257. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rover.jpg +0 -0
  258. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/020-adopt/images/adopt → pages/020-adopt/images}/adoption-dog.jpg +0 -0
  259. /package/examples/complete-sites/dog-shelter-single-page/site/{images/you-can-help → pages/000-home/images}/foster-dog.jpg +0 -0
  260. /package/examples/complete-sites/dog-shelter-single-page/site/{images/what-we-do → pages/000-home/images}/rescue-dog.jpg +0 -0
  261. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-carousel.svg +0 -0
  262. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-stack.svg +0 -0
  263. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-surfaces.svg +0 -0
  264. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-one.svg +0 -0
  265. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-three.svg +0 -0
  266. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-two.svg +0 -0
  267. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-one.svg +0 -0
  268. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-two.svg +0 -0
  269. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/config.yaml +0 -0
  270. /package/examples/feature-demos/{theme-presets/site/routes/020-documentation/images/documentation → theme-preset-documentation/site/pages/000-home/images}/black-schnauzer.jpg +0 -0
  271. /package/examples/feature-demos/{theme-presets/site/routes/020-documentation/images/documentation → theme-preset-documentation/site/pages/000-home/images}/retriever-portrait.jpg +0 -0
  272. /package/examples/feature-demos/{theme-presets/site/routes/020-documentation/images/documentation → theme-preset-documentation/site/pages/000-home/images}/schnauzer-portrait.jpg +0 -0
  273. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/public/robots.txt +0 -0
  274. /package/examples/feature-demos/{theme-presets/site/routes/020-documentation → theme-preset-documentation/site}/theme.yaml +0 -0
  275. /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio/images/portfolio → theme-preset-portfolio/site/pages/000-home/images}/puppy-portrait.jpg +0 -0
  276. /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio/images/portfolio → theme-preset-portfolio/site/pages/000-home/images}/shepherd-portrait.jpg +0 -0
  277. /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio/images/portfolio → theme-preset-portfolio/site/pages/000-home/images}/white-puppy.jpg +0 -0
  278. /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio → theme-preset-portfolio/site}/theme.yaml +0 -0
  279. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/routeTheme.schema.json +0 -0
  280. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/site.schema.json +0 -0
  281. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/sitewide.schema.json +0 -0
  282. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/theme.schema.json +0 -0
  283. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-assets.mjs +0 -0
  284. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-modules.mjs +0 -0
  285. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content.d.ts +0 -0
  286. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/data-store.json +0 -0
  287. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev-local.json +0 -0
  288. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.json +0 -0
  289. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.log +0 -0
  290. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/settings.json +0 -0
  291. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/types.d.ts +0 -0
  292. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/_metadata.json +0 -0
  293. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  294. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  295. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  296. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  297. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  298. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  299. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  300. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  301. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  302. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  303. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  304. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  305. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js +0 -0
  306. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
  307. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  308. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  309. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  310. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  311. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/package.json +0 -0
  312. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  313. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  314. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  315. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  316. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  317. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  318. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  319. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  320. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  321. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  322. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  323. /package/examples/feature-demos/{theme-presets/site/routes/030-project/images/project → theme-preset-project/site/pages/000-home/images}/boxer-portrait.jpg +0 -0
  324. /package/examples/feature-demos/{theme-presets/site/routes/030-project/images/project → theme-preset-project/site/pages/000-home/images}/grass-puppy.jpg +0 -0
  325. /package/examples/feature-demos/{theme-presets/site/routes/030-project/images/project → theme-preset-project/site/pages/000-home/images}/grey-street-dog.jpg +0 -0
  326. /package/examples/feature-demos/{theme-presets/site/routes/030-project → theme-preset-project/site}/theme.yaml +0 -0
  327. /package/examples/feature-demos/{theme-presets/site/routes/040-statement/images/statement → theme-preset-statement/site/pages/000-home/images}/black-pedigree.jpg +0 -0
  328. /package/examples/feature-demos/{theme-presets/site/routes/040-statement/images/statement → theme-preset-statement/site/pages/000-home/images}/sheepdog-grass.jpg +0 -0
  329. /package/examples/feature-demos/{theme-presets/site/routes/040-statement/images/statement → theme-preset-statement/site/pages/000-home/images}/sheepdog-wide.jpg +0 -0
  330. /package/examples/feature-demos/{theme-presets/site/routes/040-statement → theme-preset-statement/site}/theme.yaml +0 -0
  331. /package/fixtures/basic/site/{images/work → pages/000-home/images}/.gitkeep +0 -0
  332. /package/fixtures/content-model-v2/site/{images/card-section → pages/000-home/images}/adopt.svg +0 -0
  333. /package/fixtures/content-model-v2/site/{images/intro → pages/000-home/images}/detail.jpg +0 -0
  334. /package/fixtures/content-model-v2/site/{images/intro → pages/000-home/images}/duplicate.jpg +0 -0
  335. /package/fixtures/content-model-v2/site/{images/card-section → pages/000-home/images}/foster.svg +0 -0
  336. /package/fixtures/content-model-v2/site/{images/intro → pages/000-home/images}/hero.jpg +0 -0
  337. /package/fixtures/content-model-v2/site/{images/plain → pages/000-home/images}/image.jpg +0 -0
  338. /package/fixtures/content-model-v2/site/{images/timed → pages/000-home/images}/slide-one.jpg +0 -0
  339. /package/fixtures/content-model-v2/site/{images/timed → pages/000-home/images}/slide-three.jpg +0 -0
  340. /package/fixtures/content-model-v2/site/{images/timed → pages/000-home/images}/slide-two.jpg +0 -0
  341. /package/fixtures/content-model-v2/site/{routes/010-guide/images/intro → pages/010-guide/images}/duplicate.jpg +0 -0
  342. /package/starters/basic/site/{images/work → pages/000-home/images}/.gitkeep +0 -0
@@ -1 +1 @@
1
- [["Map",1,2,9,10,72,73,98,99],"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\":\"127.0.0.1\",\"port\":4412,\"allowedHosts\":[\"127.0.0.1\",\"127.0.0.1\",\"127.0.0.1\",\"127.0.0.1\"]},\"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\",\"logger\":{\"entrypoint\":\"astro/logger/json\"},\"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.\n\n```norna-card-list\nlayout: image-right\nflow: stack\nsize: s\nwidth: narrow\n\n- title: Rescue, recovery and new homes\n text: Meet the dogs currently in our care and learn what kind of home each one needs.\n image: shelter-dog.jpg\n link: /dogs/\n```","site/content.md","8e6311f7aa2b670d",{"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\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>layout: image-right\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>flow: stack\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>size: s\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>width: narrow\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Rescue, recovery and new homes\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Meet the dogs currently in our care and learn what kind of home each one needs.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: shelter-dog.jpg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> link: /dogs/\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\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```norna-card-list\nlayout: image-top\nflow: grid\nsize: s\nwidth: narrow\n\n- title: Rover\n text: Curious and active. Rover needs daily walks and room to explore.\n image: rover.jpg\n- title: Rex\n text: Gentle and observant. Rex needs a patient home with quiet routines.\n image: rex.jpg\n```","site/routes/010-dogs/route-content.md","7b650f7fd791e689",{"html":42,"metadata":43},"\u003Ch2 id=\"dogs-dogs\">Dogs {#dogs}\u003C/h2>\n\u003Cp>Meet Rover and Rex.\u003C/p>\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>layout: image-top\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>flow: grid\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>size: s\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>width: narrow\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Rover\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Curious and active. Rover needs daily walks and room to explore.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: rover.jpg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Rex\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Gentle and observant. Rex needs a patient home with quiet routines.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: rex.jpg\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.\n\n```norna-card-list\nlayout: image-left\nflow: stack\nsize: s\nwidth: narrow\n\n- title: Start with a conversation\n text: Tell us about your home and routines, then meet dogs whose needs may be a good match.\n image: adoption-dog.jpg\n```","site/routes/020-adopt/route-content.md","9c0eba10f95aae72",{"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\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>layout: image-left\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>flow: stack\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>size: s\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>width: narrow\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Start with a conversation\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Tell us about your home and routines, then meet dogs whose needs may be a good match.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: adoption-dog.jpg\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\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,"body":84,"filePath":85,"digest":86,"rendered":87},{"navigation":77,"banners":81,"footer":82},{"logo":78},{"alt":79,"height":80},"Dog Shelter","3rem",[],{"copyrightMessage":83},"Dog Shelter example site. Dog photos by Bicanski, CC0, via Pixnio.","\u003C!-- norna-image-provenance:\nimage: logo.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Create a compact horizontal dog shelter logo with a simple dog face in\na house-shaped mark and the words Dog Shelter. Use flat vector shapes, a warm\nred accent, dark text, transparent background and no external assets.\n-->","site/sitewide-content.md","68de962e675a456b",{"html":88,"metadata":89},"\u003C!-- norna-image-provenance:\nimage: logo.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Create a compact horizontal dog shelter logo with a simple dog face in\na house-shaped mark and the words Dog Shelter. Use flat vector shapes, a warm\nred accent, dark text, transparent background and no external assets.\n-->\n",{"headings":90,"localImagePaths":91,"remoteImagePaths":92,"frontmatter":93,"imagePaths":97},[],[],[],{"navigation":94,"footer":96},{"logo":95},{"alt":79,"height":80},{"copyrightMessage":83},[],"theme",["Map",100,101],"theme.md",{"id":100,"data":102,"filePath":104,"digest":105,"rendered":106},{"preset":103},"project","site/theme.md","d19ab283a10fb060",{"html":107,"metadata":108},"",{"headings":109,"localImagePaths":110,"remoteImagePaths":111,"frontmatter":112,"imagePaths":113},[],[],[],{"preset":103},[]]
1
+ [["Map",1,2,9,10,72,73,85,86],"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\":\"127.0.0.1\",\"port\":4321,\"allowedHosts\":[\"127.0.0.1\",\"127.0.0.1\",\"127.0.0.1\",\"127.0.0.1\"]},\"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","c08b570b4ff0a86c","site",["Map",11,12,32,33,52,53],"site-content",{"id":11,"data":13,"body":16,"filePath":17,"digest":18,"rendered":19},{"page":14},{"description":15},"A multi-page dog shelter website built with Norna.","# Dog Shelter\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.\n\n```norna-card-list\nlayout: image-right\nflow: stack\nsize: s\nwidth: narrow\n\n- title: Rescue, recovery and new homes\n text: Meet the dogs currently in our care and learn what kind of home each one needs.\n image: shelter-dog.jpg\n link: /dogs/\n```","site/content.md","0973a5e4cc48f0c9",{"html":20,"metadata":21},"\u003Ch1 id=\"dog-shelter\">Dog Shelter\u003C/h1>\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\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>layout: image-right\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>flow: stack\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>size: s\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>width: narrow\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Rescue, recovery and new homes\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Meet the dogs currently in our care and learn what kind of home each one needs.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: shelter-dog.jpg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> link: /dogs/\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n",{"headings":22,"localImagePaths":27,"remoteImagePaths":28,"frontmatter":29,"imagePaths":31},[23],{"depth":24,"slug":25,"text":26},1,"dog-shelter","Dog Shelter",[],[],{"page":30},{"description":15},[],"site-page-010-dogs",{"id":32,"data":34,"body":37,"filePath":38,"digest":39,"rendered":40},{"page":35},{"description":36},"Meet dogs currently waiting for adoption.","# Dogs\nMeet Rover and Rex.\n\n```norna-card-list\nlayout: image-top\nflow: grid\nsize: s\nwidth: narrow\n\n- title: Rover\n text: Curious and active. Rover needs daily walks and room to explore.\n image: rover.jpg\n- title: Rex\n text: Gentle and observant. Rex needs a patient home with quiet routines.\n image: rex.jpg\n```","site/pages/010-dogs/content.md","c04adb7dae63dce9",{"html":41,"metadata":42},"\u003Ch1 id=\"dogs\">Dogs\u003C/h1>\n\u003Cp>Meet Rover and Rex.\u003C/p>\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>layout: image-top\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>flow: grid\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>size: s\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>width: narrow\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Rover\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Curious and active. Rover needs daily walks and room to explore.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: rover.jpg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Rex\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Gentle and observant. Rex needs a patient home with quiet routines.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: rex.jpg\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n",{"headings":43,"localImagePaths":47,"remoteImagePaths":48,"frontmatter":49,"imagePaths":51},[44],{"depth":24,"slug":45,"text":46},"dogs","Dogs",[],[],{"page":50},{"description":36},[],"site-page-020-adopt",{"id":52,"data":54,"body":57,"filePath":58,"digest":59,"rendered":60},{"page":55},{"description":56},"Learn how to adopt from Dog Shelter.","# Adopt\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.\n\n```norna-card-list\nlayout: image-left\nflow: stack\nsize: s\nwidth: narrow\n\n- title: Start with a conversation\n text: Tell us about your home and routines, then meet dogs whose needs may be a good match.\n image: adoption-dog.jpg\n```","site/pages/020-adopt/content.md","e0ec7128596846fd",{"html":61,"metadata":62},"\u003Ch1 id=\"adopt\">Adopt\u003C/h1>\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\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>layout: image-left\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>flow: stack\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>size: s\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>width: narrow\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Start with a conversation\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Tell us about your home and routines, then meet dogs whose needs may be a good match.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: adoption-dog.jpg\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n",{"headings":63,"localImagePaths":67,"remoteImagePaths":68,"frontmatter":69,"imagePaths":71},[64],{"depth":24,"slug":65,"text":66},"adopt","Adopt",[],[],{"page":70},{"description":56},[],"sitewide",["Map",74,75],"site-sitewide",{"id":74,"data":76,"filePath":83,"digest":84},{"logo":77,"banners":79,"footer":80},{"height":78},"3rem",[],{"copyrightMessage":81,"buildInfo":82},"Dog Shelter example site. Dog photos by Bicanski, CC0, via Pixnio.",false,"site/sitewide-content.yaml","88890db1dd044f1f","theme",["Map",87,88],"site-theme",{"id":87,"data":89,"filePath":91,"digest":92},{"preset":90},"project","site/theme.yaml","dbaab11724ca485c"]
@@ -1,8 +1,8 @@
1
1
  {
2
- "pid": 47121,
2
+ "pid": 68539,
3
3
  "port": 4321,
4
- "host": "0.0.0.0",
5
- "mode": "lan",
4
+ "host": "127.0.0.1",
5
+ "mode": "local",
6
6
  "url": "http://127.0.0.1:4321/",
7
- "startedAt": "2026-08-21T03:52:43.086Z"
7
+ "startedAt": "2026-08-24T06:29:38.062Z"
8
8
  }
@@ -1,13 +1,13 @@
1
1
  {
2
- "pid": 58179,
3
- "port": 4412,
4
- "url": "http://127.0.0.1:4412",
2
+ "pid": 68539,
3
+ "port": 4321,
4
+ "url": "http://127.0.0.1:4321",
5
5
  "urls": {
6
6
  "local": [
7
- "http://127.0.0.1:4412/"
7
+ "http://127.0.0.1:4321/"
8
8
  ],
9
9
  "network": []
10
10
  },
11
11
  "background": true,
12
- "startedAt": "2026-08-21T04:55:53.950Z"
12
+ "startedAt": "2026-08-24T06:29:37.723Z"
13
13
  }
@@ -1,26 +1,36 @@
1
- {"message":"connected.","label":"vite","level":"info"}
2
- {"message":"Generated 0ms","label":"types","level":"info"}
3
- {"message":"connected.","label":"vite","level":"info"}
4
- {"message":"Syncing content","label":"content","level":"info"}
5
- {"message":"Astro config changed","label":"content","level":"info"}
6
- {"message":"Clearing content store","label":"content","level":"info"}
1
+ 08:29:36 [vite] connected.
2
+ 08:29:37 [types] Generated 1ms
3
+ 08:29:37 [vite] connected.
4
+ 08:29:37 [content] Syncing content
5
+ 08:29:37 [content] Astro config changed
6
+ 08:29:37 [content] Content config changed
7
+ 08:29:37 [content] Clearing content store
7
8
  [Shiki] The language "norna-card-list" doesn't exist, falling back to "plaintext".
8
9
  [Shiki] The language "norna-card-list" doesn't exist, falling back to "plaintext".
9
10
  [Shiki] The language "norna-card-list" doesn't exist, falling back to "plaintext".
10
- {"message":"Synced content","label":"content","level":"info"}
11
- {"message":"Re-optimizing dependencies because vite config has changed","label":"vite","level":"info"}
12
- {"message":" astro v7.1.3 ready in 1134 ms\n┃ Local http://127.0.0.1:4412/","label":"SKIP_FORMAT","level":"info"}
13
- {"message":"watching for file changes...","label":null,"level":"info"}
14
- {"message":"[200] / 52ms","label":null,"level":"info"}
15
- {"message":"[200] / 7ms","label":null,"level":"info"}
16
- {"message":"[200] /dogs/ 18ms","label":null,"level":"info"}
17
- {"message":"[200] /adopt/ 8ms","label":null,"level":"info"}
18
- {"message":"[200] / 8ms","label":null,"level":"info"}
19
- {"message":"[200] /dogs/ 8ms","label":null,"level":"info"}
20
- {"message":"[200] /adopt/ 8ms","label":null,"level":"info"}
21
- {"message":"[200] /dogs/ 8ms","label":null,"level":"info"}
22
- {"message":"[200] / 9ms","label":null,"level":"info"}
23
- {"message":"[200] / 8ms","label":null,"level":"info"}
24
- {"message":"[200] / 6ms","label":null,"level":"info"}
25
- {"message":"[200] /dogs/ 13ms","label":null,"level":"info"}
26
- {"message":"[200] /dogs/ 7ms","label":null,"level":"info"}
11
+ 08:29:37 [content] Synced content
12
+ 08:29:37 [vite] Re-optimizing dependencies because lockfile has changed
13
+ astro v7.1.3 ready in 1129 ms
14
+ ┃ Local http://127.0.0.1:4321/
15
+ 08:29:37 watching for file changes...
16
+ 08:29:38 [200] / 55ms
17
+ 08:29:38 [200] / 7ms
18
+ 08:29:38 [200] / 6ms
19
+ 08:29:42 [200] /dogs/ 21ms
20
+ 08:29:44 [200] /adopt/ 10ms
21
+ 08:35:40 [200] /adopt/ 968ms
22
+ 09:44:47 [200] /adopt/ 288ms
23
+ 16:01:06 [WARN] [router] A `getStaticPaths()` route pattern was matched, but no matching static path was found for requested path `/norna/`.
24
+
25
+ Possible dynamic routes being matched: ../../../src/pages/[slug].astro.
26
+ 16:01:06 [404] /norna/ 9ms
27
+ 16:01:07 [WARN] [router] A `getStaticPaths()` route pattern was matched, but no matching static path was found for requested path `/norna/`.
28
+
29
+ Possible dynamic routes being matched: ../../../src/pages/[slug].astro.
30
+ 16:01:07 [404] /norna/ 2ms
31
+ 16:01:11 [200] / 17ms
32
+ 16:01:14 [200] /dogs/ 11ms
33
+ 16:01:15 [200] /adopt/ 9ms
34
+ 16:01:19 [200] / 9ms
35
+ 16:01:19 [200] /dogs/ 10ms
36
+ 16:01:20 [200] /adopt/ 9ms
@@ -1,6 +1,6 @@
1
1
  # Dog Shelter multi-page example
2
2
 
3
- A small Norna site with a homepage and ordered routes for dogs and adoption.
3
+ A small Norna site with a homepage and ordered pages for dogs and adoption.
4
4
 
5
5
  [Live demo](https://janga.github.io/norna/examples/complete-sites/dog-shelter-multi-page/)
6
6
  |
@@ -1,31 +1,31 @@
1
1
  {
2
- "hash": "5cf74c44",
3
- "configHash": "468b2565",
4
- "lockfileHash": "808f2e8e",
5
- "browserHash": "24b56f2c",
2
+ "hash": "beb50cee",
3
+ "configHash": "c4c14140",
4
+ "lockfileHash": "79c26dec",
5
+ "browserHash": "c7d7bd9a",
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": "22765b52",
10
+ "fileHash": "d7bc62c4",
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": "c0c497a1",
16
+ "fileHash": "1f30a90b",
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": "3d5b47f7",
22
+ "fileHash": "02792f9d",
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": "89643eed",
28
+ "fileHash": "d23b5e13",
29
29
  "needsInterop": false
30
30
  }
31
31
  },
@@ -1,96 +1,96 @@
1
1
  {
2
- "images/intro/shelter-dog.jpg": {
2
+ "pages/000-home/images/shelter-dog.jpg": {
3
3
  "outputVersion": 2,
4
4
  "sourceHash": "c441ca2935debeb008a43e2a7fd510bfd6776682f84160151fd5c8605bfb8cae",
5
5
  "width": 1200,
6
6
  "height": 800,
7
7
  "variants": [
8
8
  {
9
- "src": "/images/generated/intro/shelter-dog-c441ca29-480.webp",
9
+ "src": "/images/generated/pages/000-home/images/shelter-dog-c441ca29-480.webp",
10
10
  "width": 480
11
11
  },
12
12
  {
13
- "src": "/images/generated/intro/shelter-dog-c441ca29-768.webp",
13
+ "src": "/images/generated/pages/000-home/images/shelter-dog-c441ca29-768.webp",
14
14
  "width": 768
15
15
  },
16
16
  {
17
- "src": "/images/generated/intro/shelter-dog-c441ca29-1080.webp",
17
+ "src": "/images/generated/pages/000-home/images/shelter-dog-c441ca29-1080.webp",
18
18
  "width": 1080
19
19
  },
20
20
  {
21
- "src": "/images/generated/intro/shelter-dog-c441ca29-1200.webp",
21
+ "src": "/images/generated/pages/000-home/images/shelter-dog-c441ca29-1200.webp",
22
22
  "width": 1200
23
23
  }
24
24
  ]
25
25
  },
26
- "routes/010-dogs/images/dogs/rex.jpg": {
26
+ "pages/010-dogs/images/rex.jpg": {
27
27
  "outputVersion": 2,
28
28
  "sourceHash": "bcb834d00bb9b520dac475c32906f8578a03bd922c1639c7d86252ae1f1c433a",
29
29
  "width": 1200,
30
30
  "height": 800,
31
31
  "variants": [
32
32
  {
33
- "src": "/images/generated/routes/010-dogs/images/dogs/rex-bcb834d0-480.webp",
33
+ "src": "/images/generated/pages/010-dogs/images/rex-bcb834d0-480.webp",
34
34
  "width": 480
35
35
  },
36
36
  {
37
- "src": "/images/generated/routes/010-dogs/images/dogs/rex-bcb834d0-768.webp",
37
+ "src": "/images/generated/pages/010-dogs/images/rex-bcb834d0-768.webp",
38
38
  "width": 768
39
39
  },
40
40
  {
41
- "src": "/images/generated/routes/010-dogs/images/dogs/rex-bcb834d0-1080.webp",
41
+ "src": "/images/generated/pages/010-dogs/images/rex-bcb834d0-1080.webp",
42
42
  "width": 1080
43
43
  },
44
44
  {
45
- "src": "/images/generated/routes/010-dogs/images/dogs/rex-bcb834d0-1200.webp",
45
+ "src": "/images/generated/pages/010-dogs/images/rex-bcb834d0-1200.webp",
46
46
  "width": 1200
47
47
  }
48
48
  ]
49
49
  },
50
- "routes/010-dogs/images/dogs/rover.jpg": {
50
+ "pages/010-dogs/images/rover.jpg": {
51
51
  "outputVersion": 2,
52
52
  "sourceHash": "da764a5b71f2bfa610ae4978cad4660cd6ecfdcd5b7fcbd788b92c3f9ada42b1",
53
53
  "width": 1200,
54
54
  "height": 800,
55
55
  "variants": [
56
56
  {
57
- "src": "/images/generated/routes/010-dogs/images/dogs/rover-da764a5b-480.webp",
57
+ "src": "/images/generated/pages/010-dogs/images/rover-da764a5b-480.webp",
58
58
  "width": 480
59
59
  },
60
60
  {
61
- "src": "/images/generated/routes/010-dogs/images/dogs/rover-da764a5b-768.webp",
61
+ "src": "/images/generated/pages/010-dogs/images/rover-da764a5b-768.webp",
62
62
  "width": 768
63
63
  },
64
64
  {
65
- "src": "/images/generated/routes/010-dogs/images/dogs/rover-da764a5b-1080.webp",
65
+ "src": "/images/generated/pages/010-dogs/images/rover-da764a5b-1080.webp",
66
66
  "width": 1080
67
67
  },
68
68
  {
69
- "src": "/images/generated/routes/010-dogs/images/dogs/rover-da764a5b-1200.webp",
69
+ "src": "/images/generated/pages/010-dogs/images/rover-da764a5b-1200.webp",
70
70
  "width": 1200
71
71
  }
72
72
  ]
73
73
  },
74
- "routes/020-adopt/images/adopt/adoption-dog.jpg": {
74
+ "pages/020-adopt/images/adoption-dog.jpg": {
75
75
  "outputVersion": 2,
76
76
  "sourceHash": "b9396e00227dac3b290d6e29cc82758a4cf98f08bc9154c24c8fbf598563b69a",
77
77
  "width": 1200,
78
78
  "height": 800,
79
79
  "variants": [
80
80
  {
81
- "src": "/images/generated/routes/020-adopt/images/adopt/adoption-dog-b9396e00-480.webp",
81
+ "src": "/images/generated/pages/020-adopt/images/adoption-dog-b9396e00-480.webp",
82
82
  "width": 480
83
83
  },
84
84
  {
85
- "src": "/images/generated/routes/020-adopt/images/adopt/adoption-dog-b9396e00-768.webp",
85
+ "src": "/images/generated/pages/020-adopt/images/adoption-dog-b9396e00-768.webp",
86
86
  "width": 768
87
87
  },
88
88
  {
89
- "src": "/images/generated/routes/020-adopt/images/adopt/adoption-dog-b9396e00-1080.webp",
89
+ "src": "/images/generated/pages/020-adopt/images/adoption-dog-b9396e00-1080.webp",
90
90
  "width": 1080
91
91
  },
92
92
  {
93
- "src": "/images/generated/routes/020-adopt/images/adopt/adoption-dog-b9396e00-1200.webp",
93
+ "src": "/images/generated/pages/020-adopt/images/adoption-dog-b9396e00-1200.webp",
94
94
  "width": 1200
95
95
  }
96
96
  ]
@@ -1,10 +1,9 @@
1
1
  ---
2
- title: Home
3
- description: A multi-page dog shelter website built with Norna.
2
+ page:
3
+ description: A multi-page dog shelter website built with Norna.
4
4
  ---
5
5
 
6
- ## Dog Shelter {#intro}
7
-
6
+ # Dog Shelter
8
7
  We rescue dogs, help them recover and introduce them to families ready to give
9
8
  them a permanent home.
10
9
 
@@ -1,10 +1,9 @@
1
1
  ---
2
- title: Dogs
3
- description: Meet dogs currently waiting for adoption.
2
+ page:
3
+ description: Meet dogs currently waiting for adoption.
4
4
  ---
5
5
 
6
- ## Dogs {#dogs}
7
-
6
+ # Dogs
8
7
  Meet Rover and Rex.
9
8
 
10
9
  ```norna-card-list
@@ -1,10 +1,9 @@
1
1
  ---
2
- title: Adopt
3
- description: Learn how to adopt from Dog Shelter.
2
+ page:
3
+ description: Learn how to adopt from Dog Shelter.
4
4
  ---
5
5
 
6
- ## Adopt {#adopt}
7
-
6
+ # Adopt
8
7
  Adoption begins with a conversation about your home, routines and experience
9
8
  with dogs. We then arrange a meeting with dogs whose needs appear to match.
10
9
 
@@ -1,6 +1,4 @@
1
- navigation:
2
- label: Dog Shelter
3
- logo:
4
- height: 3rem
1
+ logo:
2
+ height: 3rem
5
3
  footer:
6
4
  copyrightMessage: Dog Shelter example site. Dog photos by Bicanski, CC0, via Pixnio.
@@ -2,58 +2,34 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "type": "object",
4
4
  "properties": {
5
- "title": {
6
- "type": "string"
7
- },
8
- "description": {
9
- "type": "string"
5
+ "page": {
6
+ "type": "object",
7
+ "properties": {
8
+ "description": {
9
+ "description": "Optional page-specific meta description.",
10
+ "type": "string",
11
+ "minLength": 1
12
+ }
13
+ },
14
+ "additionalProperties": false,
15
+ "description": "Optional metadata for this homepage or additional page. The Markdown H1 supplies the page title."
10
16
  },
11
17
  "navigation": {
18
+ "description": "Optional navigation metadata for this page.",
12
19
  "type": "object",
13
20
  "properties": {
14
- "include": {
21
+ "listed": {
22
+ "default": true,
23
+ "description": "List this page in site navigation. The page remains public when false.",
15
24
  "type": "boolean"
16
- },
17
- "label": {
18
- "type": "string"
19
25
  }
20
26
  },
21
27
  "additionalProperties": false
22
28
  },
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
29
  "$schema": {
52
30
  "type": "string"
53
31
  }
54
32
  },
55
- "required": [
56
- "title",
57
- "description"
58
- ]
33
+ "additionalProperties": false,
34
+ "description": "Frontmatter for a homepage or additional page content.md file."
59
35
  }
@@ -2,55 +2,49 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "type": "object",
4
4
  "properties": {
5
- "navigation": {
5
+ "logo": {
6
6
  "type": "object",
7
7
  "properties": {
8
- "brand": {
8
+ "height": {
9
+ "description": "Displayed logo height. Width follows the intrinsic aspect ratio.",
9
10
  "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
11
+ "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*\\))$"
25
12
  }
26
13
  },
27
- "additionalProperties": false
14
+ "additionalProperties": false,
15
+ "description": "Optional display settings for a convention-based navigation logo."
28
16
  },
29
17
  "banners": {
30
18
  "default": [],
19
+ "description": "Site-wide dismissible notices.",
31
20
  "type": "array",
32
21
  "items": {
33
22
  "type": "object",
34
23
  "properties": {
35
24
  "id": {
36
25
  "type": "string",
37
- "pattern": "^[a-z0-9-]+$"
26
+ "pattern": "^[a-z0-9-]+$",
27
+ "description": "Stable banner identifier used for dismissal state."
38
28
  },
39
29
  "tone": {
40
30
  "default": "warning",
31
+ "description": "Semantic banner tone.",
41
32
  "type": "string",
42
33
  "enum": [
43
34
  "warning"
44
35
  ]
45
36
  },
46
37
  "visible": {
38
+ "description": "Optional date window for the banner.",
47
39
  "type": "object",
48
40
  "properties": {
49
41
  "from": {
42
+ "description": "First date on which the content is visible.",
50
43
  "type": "string",
51
44
  "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
52
45
  },
53
46
  "until": {
47
+ "description": "First date on which the content is no longer visible.",
54
48
  "type": "string",
55
49
  "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
56
50
  }
@@ -59,11 +53,13 @@
59
53
  },
60
54
  "title": {
61
55
  "type": "string",
62
- "minLength": 1
56
+ "minLength": 1,
57
+ "description": "Short banner heading."
63
58
  },
64
59
  "text": {
65
60
  "type": "string",
66
- "minLength": 1
61
+ "minLength": 1,
62
+ "description": "Concise banner message."
67
63
  }
68
64
  },
69
65
  "required": [
@@ -71,61 +67,23 @@
71
67
  "title",
72
68
  "text"
73
69
  ],
74
- "additionalProperties": false
70
+ "additionalProperties": false,
71
+ "description": "Dismissible site-wide warning shown above page content for important temporary information."
75
72
  }
76
73
  },
77
74
  "footer": {
75
+ "description": "Site-wide footer content.",
78
76
  "type": "object",
79
77
  "properties": {
80
78
  "copyrightMessage": {
79
+ "description": "Copyright or ownership text shown in the site footer.",
81
80
  "type": "string",
82
81
  "minLength": 1
83
82
  },
84
83
  "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
84
+ "default": false,
85
+ "description": "Show a localized generated build timestamp in the footer.",
86
+ "type": "boolean"
129
87
  }
130
88
  },
131
89
  "additionalProperties": false
@@ -134,5 +92,6 @@
134
92
  "type": "string"
135
93
  }
136
94
  },
137
- "additionalProperties": false
95
+ "additionalProperties": false,
96
+ "description": "Editorial content and optional navigation logo display settings shared by every page."
138
97
  }