@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
@@ -0,0 +1,74 @@
1
+ {
2
+ "pages/000-home/images/puppy-portrait.jpg": {
3
+ "outputVersion": 2,
4
+ "sourceHash": "0cb5126b86660785da62903393e43df7b6e361d3bd1a0492cc6f371159c5afb8",
5
+ "width": 1200,
6
+ "height": 800,
7
+ "variants": [
8
+ {
9
+ "src": "/images/generated/pages/000-home/images/puppy-portrait-0cb5126b-480.webp",
10
+ "width": 480
11
+ },
12
+ {
13
+ "src": "/images/generated/pages/000-home/images/puppy-portrait-0cb5126b-768.webp",
14
+ "width": 768
15
+ },
16
+ {
17
+ "src": "/images/generated/pages/000-home/images/puppy-portrait-0cb5126b-1080.webp",
18
+ "width": 1080
19
+ },
20
+ {
21
+ "src": "/images/generated/pages/000-home/images/puppy-portrait-0cb5126b-1200.webp",
22
+ "width": 1200
23
+ }
24
+ ]
25
+ },
26
+ "pages/000-home/images/shepherd-portrait.jpg": {
27
+ "outputVersion": 2,
28
+ "sourceHash": "604099036852fa40c2fecf8620a138405c8edcb0b92f120bb603742f9ee91154",
29
+ "width": 1200,
30
+ "height": 800,
31
+ "variants": [
32
+ {
33
+ "src": "/images/generated/pages/000-home/images/shepherd-portrait-60409903-480.webp",
34
+ "width": 480
35
+ },
36
+ {
37
+ "src": "/images/generated/pages/000-home/images/shepherd-portrait-60409903-768.webp",
38
+ "width": 768
39
+ },
40
+ {
41
+ "src": "/images/generated/pages/000-home/images/shepherd-portrait-60409903-1080.webp",
42
+ "width": 1080
43
+ },
44
+ {
45
+ "src": "/images/generated/pages/000-home/images/shepherd-portrait-60409903-1200.webp",
46
+ "width": 1200
47
+ }
48
+ ]
49
+ },
50
+ "pages/000-home/images/white-puppy.jpg": {
51
+ "outputVersion": 2,
52
+ "sourceHash": "bcb834d00bb9b520dac475c32906f8578a03bd922c1639c7d86252ae1f1c433a",
53
+ "width": 1200,
54
+ "height": 800,
55
+ "variants": [
56
+ {
57
+ "src": "/images/generated/pages/000-home/images/white-puppy-bcb834d0-480.webp",
58
+ "width": 480
59
+ },
60
+ {
61
+ "src": "/images/generated/pages/000-home/images/white-puppy-bcb834d0-768.webp",
62
+ "width": 768
63
+ },
64
+ {
65
+ "src": "/images/generated/pages/000-home/images/white-puppy-bcb834d0-1080.webp",
66
+ "width": 1080
67
+ },
68
+ {
69
+ "src": "/images/generated/pages/000-home/images/white-puppy-bcb834d0-1200.webp",
70
+ "width": 1200
71
+ }
72
+ ]
73
+ }
74
+ }
@@ -0,0 +1 @@
1
+ url: http://localhost:4321/
@@ -1,13 +1,10 @@
1
1
  ---
2
- title: Portfolio
3
- description: A complete theme preset for image-led portfolios and presentations.
4
- navigation:
5
- label: Portfolio
2
+ page:
3
+ description: A complete theme preset for image-led portfolios and presentations.
6
4
  ---
7
5
 
8
- ## Portfolio {#portfolio}
9
-
10
- This route uses the complete `portfolio` preset without overrides. It gives
6
+ # Portfolio
7
+ This site uses the complete `portfolio` preset without overrides. It gives
11
8
  images a broad stage, keeps typography restrained and uses a dark palette for
12
9
  an image-led presentation.
13
10
 
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Disallow:
@@ -0,0 +1,3 @@
1
+ footer:
2
+ copyrightMessage: Dog photos by Bicanski, CC0, via Pixnio.
3
+ buildInfo: true
@@ -0,0 +1,16 @@
1
+ # Project Theme Preset
2
+
3
+ This site demonstrates the complete `project` preset without overrides.
4
+
5
+ [Live demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-project/)
6
+ |
7
+ [View source](https://github.com/janga/norna/tree/main/examples/feature-demos/theme-preset-project)
8
+
9
+ Run it from the repository root:
10
+
11
+ ```sh
12
+ node bin/norna.mjs --site-dir examples/feature-demos/theme-preset-project/site dev:local
13
+ ```
14
+
15
+ The dog photos are CC0 images by Bicanski, sourced from Pixnio. Attribution is
16
+ included in the captions even though the licence does not require it.
@@ -0,0 +1,74 @@
1
+ {
2
+ "pages/000-home/images/boxer-portrait.jpg": {
3
+ "outputVersion": 2,
4
+ "sourceHash": "da764a5b71f2bfa610ae4978cad4660cd6ecfdcd5b7fcbd788b92c3f9ada42b1",
5
+ "width": 1200,
6
+ "height": 800,
7
+ "variants": [
8
+ {
9
+ "src": "/images/generated/pages/000-home/images/boxer-portrait-da764a5b-480.webp",
10
+ "width": 480
11
+ },
12
+ {
13
+ "src": "/images/generated/pages/000-home/images/boxer-portrait-da764a5b-768.webp",
14
+ "width": 768
15
+ },
16
+ {
17
+ "src": "/images/generated/pages/000-home/images/boxer-portrait-da764a5b-1080.webp",
18
+ "width": 1080
19
+ },
20
+ {
21
+ "src": "/images/generated/pages/000-home/images/boxer-portrait-da764a5b-1200.webp",
22
+ "width": 1200
23
+ }
24
+ ]
25
+ },
26
+ "pages/000-home/images/grass-puppy.jpg": {
27
+ "outputVersion": 2,
28
+ "sourceHash": "519d663971223bdb1948db9087c637f1ed8b4d21d81c08e1fc10d5e2d904f230",
29
+ "width": 1200,
30
+ "height": 800,
31
+ "variants": [
32
+ {
33
+ "src": "/images/generated/pages/000-home/images/grass-puppy-519d6639-480.webp",
34
+ "width": 480
35
+ },
36
+ {
37
+ "src": "/images/generated/pages/000-home/images/grass-puppy-519d6639-768.webp",
38
+ "width": 768
39
+ },
40
+ {
41
+ "src": "/images/generated/pages/000-home/images/grass-puppy-519d6639-1080.webp",
42
+ "width": 1080
43
+ },
44
+ {
45
+ "src": "/images/generated/pages/000-home/images/grass-puppy-519d6639-1200.webp",
46
+ "width": 1200
47
+ }
48
+ ]
49
+ },
50
+ "pages/000-home/images/grey-street-dog.jpg": {
51
+ "outputVersion": 2,
52
+ "sourceHash": "08cab93ba9a2d1c3a72c471dd8724efa7d820f43dad447221b445c32ebe9ab28",
53
+ "width": 1200,
54
+ "height": 800,
55
+ "variants": [
56
+ {
57
+ "src": "/images/generated/pages/000-home/images/grey-street-dog-08cab93b-480.webp",
58
+ "width": 480
59
+ },
60
+ {
61
+ "src": "/images/generated/pages/000-home/images/grey-street-dog-08cab93b-768.webp",
62
+ "width": 768
63
+ },
64
+ {
65
+ "src": "/images/generated/pages/000-home/images/grey-street-dog-08cab93b-1080.webp",
66
+ "width": 1080
67
+ },
68
+ {
69
+ "src": "/images/generated/pages/000-home/images/grey-street-dog-08cab93b-1200.webp",
70
+ "width": 1200
71
+ }
72
+ ]
73
+ }
74
+ }
@@ -0,0 +1 @@
1
+ url: http://localhost:4321/
@@ -1,13 +1,10 @@
1
1
  ---
2
- title: Project
3
- description: A complete theme preset for project and product websites.
4
- navigation:
5
- label: Project
2
+ page:
3
+ description: A complete theme preset for project and product websites.
6
4
  ---
7
5
 
8
- ## Project {#project}
9
-
10
- This route uses the complete `project` preset without overrides. It provides a
6
+ # Project
7
+ This site uses the complete `project` preset without overrides. It provides a
11
8
  compact, neutral presentation for project overviews, feature descriptions and
12
9
  practical documentation.
13
10
 
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Disallow:
@@ -0,0 +1,3 @@
1
+ footer:
2
+ copyrightMessage: Dog photos by Bicanski, CC0, via Pixnio.
3
+ buildInfo: true
@@ -0,0 +1,16 @@
1
+ # Statement Theme Preset
2
+
3
+ This site demonstrates the complete `statement` preset without overrides.
4
+
5
+ [Live demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-statement/)
6
+ |
7
+ [View source](https://github.com/janga/norna/tree/main/examples/feature-demos/theme-preset-statement)
8
+
9
+ Run it from the repository root:
10
+
11
+ ```sh
12
+ node bin/norna.mjs --site-dir examples/feature-demos/theme-preset-statement/site dev:local
13
+ ```
14
+
15
+ The dog photos are CC0 images by Bicanski, sourced from Pixnio. Attribution is
16
+ included in the captions even though the licence does not require it.
@@ -0,0 +1,74 @@
1
+ {
2
+ "pages/000-home/images/black-pedigree.jpg": {
3
+ "outputVersion": 2,
4
+ "sourceHash": "7d5e0be21d7889cb440b9dd6bab74d8f656e4f5159fdcd6cbe937fc7b9d4bd44",
5
+ "width": 1200,
6
+ "height": 800,
7
+ "variants": [
8
+ {
9
+ "src": "/images/generated/pages/000-home/images/black-pedigree-7d5e0be2-480.webp",
10
+ "width": 480
11
+ },
12
+ {
13
+ "src": "/images/generated/pages/000-home/images/black-pedigree-7d5e0be2-768.webp",
14
+ "width": 768
15
+ },
16
+ {
17
+ "src": "/images/generated/pages/000-home/images/black-pedigree-7d5e0be2-1080.webp",
18
+ "width": 1080
19
+ },
20
+ {
21
+ "src": "/images/generated/pages/000-home/images/black-pedigree-7d5e0be2-1200.webp",
22
+ "width": 1200
23
+ }
24
+ ]
25
+ },
26
+ "pages/000-home/images/sheepdog-grass.jpg": {
27
+ "outputVersion": 2,
28
+ "sourceHash": "b9396e00227dac3b290d6e29cc82758a4cf98f08bc9154c24c8fbf598563b69a",
29
+ "width": 1200,
30
+ "height": 800,
31
+ "variants": [
32
+ {
33
+ "src": "/images/generated/pages/000-home/images/sheepdog-grass-b9396e00-480.webp",
34
+ "width": 480
35
+ },
36
+ {
37
+ "src": "/images/generated/pages/000-home/images/sheepdog-grass-b9396e00-768.webp",
38
+ "width": 768
39
+ },
40
+ {
41
+ "src": "/images/generated/pages/000-home/images/sheepdog-grass-b9396e00-1080.webp",
42
+ "width": 1080
43
+ },
44
+ {
45
+ "src": "/images/generated/pages/000-home/images/sheepdog-grass-b9396e00-1200.webp",
46
+ "width": 1200
47
+ }
48
+ ]
49
+ },
50
+ "pages/000-home/images/sheepdog-wide.jpg": {
51
+ "outputVersion": 2,
52
+ "sourceHash": "5c8a6878d3d38549d41f8161b92ffb555f3bf5c2d3defbade15932c4d11b6dea",
53
+ "width": 1200,
54
+ "height": 667,
55
+ "variants": [
56
+ {
57
+ "src": "/images/generated/pages/000-home/images/sheepdog-wide-5c8a6878-480.webp",
58
+ "width": 480
59
+ },
60
+ {
61
+ "src": "/images/generated/pages/000-home/images/sheepdog-wide-5c8a6878-768.webp",
62
+ "width": 768
63
+ },
64
+ {
65
+ "src": "/images/generated/pages/000-home/images/sheepdog-wide-5c8a6878-1080.webp",
66
+ "width": 1080
67
+ },
68
+ {
69
+ "src": "/images/generated/pages/000-home/images/sheepdog-wide-5c8a6878-1200.webp",
70
+ "width": 1200
71
+ }
72
+ ]
73
+ }
74
+ }
@@ -0,0 +1 @@
1
+ url: http://localhost:4321/
@@ -1,13 +1,10 @@
1
1
  ---
2
- title: Statement
3
- description: A stronger typography profile for short declarative content.
4
- navigation:
5
- label: Statement
2
+ page:
3
+ description: A stronger typography profile for short declarative content.
6
4
  ---
7
5
 
8
- ## Statement {#statement}
9
-
10
- This route uses the complete `statement` preset without overrides. Its airy
6
+ # Statement
7
+ This site uses the complete `statement` preset without overrides. Its airy
11
8
  layout, stronger typography and alternating surfaces suit short, declarative
12
9
  content with a more editorial voice.
13
10
 
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Disallow:
@@ -0,0 +1,3 @@
1
+ footer:
2
+ copyrightMessage: Dog photos by Bicanski, CC0, via Pixnio.
3
+ buildInfo: true
@@ -1,11 +1,10 @@
1
1
  ---
2
- title: Fixture Site
3
- description: Minimal Norna fixture site.
4
- sections:
5
- intro: {}
6
- work: {}
7
-
2
+ page:
3
+ description: Minimal Norna fixture site.
8
4
  ---
5
+
6
+ # Fixture Site
7
+
9
8
  ## Intro {#intro}
10
9
 
11
10
  This fixture validates the Norna engine against a stable page without managed images.
@@ -1,10 +1,3 @@
1
1
  footer:
2
2
  copyrightMessage: (c) Fixture Artist.
3
- buildInfo:
4
- enabled: true
5
- text: Built
6
- dateTimeFormat:
7
- locale: en-GB
8
- timeZone: UTC
9
- dateStyle: short
10
- timeStyle: short
3
+ buildInfo: true
@@ -1,8 +1 @@
1
- layout:
2
- pageWidth: 1180px
3
- images:
4
- width: 900px
5
- typography:
6
- fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
7
- profile: restrained
8
- palette: dark
1
+ preset: project
@@ -1,18 +1,15 @@
1
1
  ---
2
- title: Content Model v2 Fixture
3
- description: Internal fixture for Markdown-authoritative Norna content.
4
- sections:
5
- intro: {}
6
- timed:
7
- visible:
8
- from: "2026-01-01"
9
- until: "2027-01-01"
2
+ page:
3
+ description: Internal fixture for Markdown-authoritative Norna content.
10
4
  ---
11
5
 
6
+ # Content Model v2 Fixture
7
+
8
+
12
9
  ## Intro {#intro}
13
10
 
14
- This fixture validates that Markdown defines sections and that section metadata
15
- is optional. It also checks **inline emphasis**.
11
+ This fixture validates that Markdown defines sections. It also checks **inline
12
+ emphasis**.
16
13
 
17
14
  ```norna-image-stack
18
15
  - image: hero.jpg
@@ -33,9 +30,10 @@ Text can continue after a Norna-managed image.
33
30
  caption: Dog portrait three: a white and brown border collie-type dog.
34
31
  ```
35
32
 
36
- ## Timed section {#timed}
33
+ ## Carousel section {#timed}
37
34
 
38
- This section uses frontmatter metadata without duplicating section order.
35
+ This section demonstrates an image carousel without duplicating section order
36
+ in frontmatter.
39
37
 
40
38
  ```norna-image-carousel
41
39
  - image: slide-one.jpg
@@ -51,7 +49,7 @@ This section uses frontmatter metadata without duplicating section order.
51
49
 
52
50
  ## Plain section {#plain}
53
51
 
54
- This section has no frontmatter metadata.
52
+ This section is defined entirely by Markdown.
55
53
 
56
54
  ```norna-image-stack
57
55
  - image: image.jpg
@@ -0,0 +1,18 @@
1
+ ---
2
+ page:
3
+ description: Internal page fixture for content model v2.
4
+ ---
5
+
6
+ # Guide
7
+
8
+
9
+ ## Intro {#intro}
10
+
11
+ Pages may use the same section id and image filename as other pages without
12
+ making the site invalid.
13
+
14
+ ```norna-image-stack
15
+ - image: duplicate.jpg
16
+ alt: A page-local duplicated filename.
17
+ caption: This file is resolved in the page image root.
18
+ ```
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
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."
16
+ },
17
+ "navigation": {
18
+ "description": "Optional navigation metadata for this page.",
19
+ "type": "object",
20
+ "properties": {
21
+ "listed": {
22
+ "default": true,
23
+ "description": "List this page in site navigation. The page remains public when false.",
24
+ "type": "boolean"
25
+ }
26
+ },
27
+ "additionalProperties": false
28
+ },
29
+ "$schema": {
30
+ "type": "string"
31
+ }
32
+ },
33
+ "additionalProperties": false,
34
+ "description": "Frontmatter for a homepage or additional page content.md file."
35
+ }
@@ -0,0 +1,97 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "logo": {
6
+ "type": "object",
7
+ "properties": {
8
+ "height": {
9
+ "description": "Displayed logo height. Width follows the intrinsic aspect ratio.",
10
+ "type": "string",
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*\\))$"
12
+ }
13
+ },
14
+ "additionalProperties": false,
15
+ "description": "Optional display settings for a convention-based navigation logo."
16
+ },
17
+ "banners": {
18
+ "default": [],
19
+ "description": "Site-wide dismissible notices.",
20
+ "type": "array",
21
+ "items": {
22
+ "type": "object",
23
+ "properties": {
24
+ "id": {
25
+ "type": "string",
26
+ "pattern": "^[a-z0-9-]+$",
27
+ "description": "Stable banner identifier used for dismissal state."
28
+ },
29
+ "tone": {
30
+ "default": "warning",
31
+ "description": "Semantic banner tone.",
32
+ "type": "string",
33
+ "enum": [
34
+ "warning"
35
+ ]
36
+ },
37
+ "visible": {
38
+ "description": "Optional date window for the banner.",
39
+ "type": "object",
40
+ "properties": {
41
+ "from": {
42
+ "description": "First date on which the content is visible.",
43
+ "type": "string",
44
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
45
+ },
46
+ "until": {
47
+ "description": "First date on which the content is no longer visible.",
48
+ "type": "string",
49
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
50
+ }
51
+ },
52
+ "additionalProperties": false
53
+ },
54
+ "title": {
55
+ "type": "string",
56
+ "minLength": 1,
57
+ "description": "Short banner heading."
58
+ },
59
+ "text": {
60
+ "type": "string",
61
+ "minLength": 1,
62
+ "description": "Concise banner message."
63
+ }
64
+ },
65
+ "required": [
66
+ "id",
67
+ "title",
68
+ "text"
69
+ ],
70
+ "additionalProperties": false,
71
+ "description": "Dismissible site-wide warning shown above page content for important temporary information."
72
+ }
73
+ },
74
+ "footer": {
75
+ "description": "Site-wide footer content.",
76
+ "type": "object",
77
+ "properties": {
78
+ "copyrightMessage": {
79
+ "description": "Copyright or ownership text shown in the site footer.",
80
+ "type": "string",
81
+ "minLength": 1
82
+ },
83
+ "buildInfo": {
84
+ "default": false,
85
+ "description": "Show a localized generated build timestamp in the footer.",
86
+ "type": "boolean"
87
+ }
88
+ },
89
+ "additionalProperties": false
90
+ },
91
+ "$schema": {
92
+ "type": "string"
93
+ }
94
+ },
95
+ "additionalProperties": false,
96
+ "description": "Editorial content and optional navigation logo display settings shared by every page."
97
+ }