@janga/norna 0.7.17 → 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 (262) hide show
  1. package/README.md +15 -6
  2. package/bin/norna-cli.mjs +1 -1
  3. package/docs/README.md +11 -9
  4. package/docs/configuration.md +25 -2
  5. package/docs/content.md +21 -12
  6. package/docs/design/navigation-and-theme-plan.md +90 -19
  7. package/docs/design/site-examples-structure.md +7 -3
  8. package/docs/engine-development.md +19 -22
  9. package/docs/getting-started.md +3 -3
  10. package/docs/images-and-metadata.md +6 -4
  11. package/docs/pages.md +120 -64
  12. package/docs/public-files.md +1 -1
  13. package/docs/site-files.md +36 -29
  14. package/docs/sitewide-content.md +1 -1
  15. package/docs/theme.md +107 -141
  16. package/docs/typography.md +15 -27
  17. package/examples/README.md +8 -2
  18. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +5 -5
  19. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +10 -10
  20. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +35 -43
  21. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
  22. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/content.md +2 -1
  23. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +2 -3
  24. package/examples/feature-demos/theme-preset-documentation/README.md +16 -0
  25. package/examples/feature-demos/theme-preset-documentation/site/.norna/generated-images.json +74 -0
  26. package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/content.md +1 -1
  27. package/examples/feature-demos/theme-preset-portfolio/README.md +16 -0
  28. package/examples/feature-demos/theme-preset-portfolio/site/.norna/generated-images.json +74 -0
  29. package/examples/feature-demos/theme-preset-portfolio/site/config.yaml +1 -0
  30. package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/content.md +1 -1
  31. package/examples/feature-demos/theme-preset-portfolio/site/public/robots.txt +2 -0
  32. package/examples/feature-demos/theme-preset-portfolio/site/sitewide-content.yaml +3 -0
  33. package/examples/feature-demos/theme-preset-project/README.md +16 -0
  34. package/examples/feature-demos/theme-preset-project/site/.norna/generated-images.json +74 -0
  35. package/examples/feature-demos/theme-preset-project/site/config.yaml +1 -0
  36. package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/content.md +1 -1
  37. package/examples/feature-demos/theme-preset-project/site/public/robots.txt +2 -0
  38. package/examples/feature-demos/theme-preset-project/site/sitewide-content.yaml +3 -0
  39. package/examples/feature-demos/theme-preset-statement/README.md +16 -0
  40. package/examples/feature-demos/theme-preset-statement/site/.norna/generated-images.json +74 -0
  41. package/examples/feature-demos/theme-preset-statement/site/config.yaml +1 -0
  42. package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/content.md +1 -1
  43. package/examples/feature-demos/theme-preset-statement/site/public/robots.txt +2 -0
  44. package/examples/feature-demos/theme-preset-statement/site/sitewide-content.yaml +3 -0
  45. package/fixtures/basic/site/theme.yaml +1 -8
  46. package/fixtures/nested-pages/.astro/collections/site.schema.json +35 -0
  47. package/fixtures/nested-pages/.astro/collections/sitewide.schema.json +97 -0
  48. package/fixtures/nested-pages/.astro/collections/theme.schema.json +844 -0
  49. package/fixtures/nested-pages/.astro/content-assets.mjs +4 -0
  50. package/fixtures/nested-pages/.astro/content-modules.mjs +1 -0
  51. package/fixtures/nested-pages/.astro/content.d.ts +183 -0
  52. package/fixtures/nested-pages/.astro/data-store.json +1 -0
  53. package/fixtures/nested-pages/.astro/dev-local.json +8 -0
  54. package/fixtures/nested-pages/.astro/dev.log +1128 -0
  55. package/fixtures/nested-pages/.astro/settings.json +5 -0
  56. package/fixtures/nested-pages/.astro/types.d.ts +2 -0
  57. package/fixtures/nested-pages/node_modules/.vite/deps/_metadata.json +74 -0
  58. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  59. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  60. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  61. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  62. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  63. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  64. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  65. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  66. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  67. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  68. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  69. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  70. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  71. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  72. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  73. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  74. package/fixtures/nested-pages/node_modules/.vite/deps/package.json +3 -0
  75. package/fixtures/nested-pages/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  76. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  77. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  78. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  79. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  80. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  81. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  82. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  83. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  84. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  85. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  86. package/fixtures/nested-pages/site/config.yaml +2 -0
  87. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +4 -0
  88. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/theme.yaml +2 -0
  89. package/fixtures/nested-pages/site/pages/010-guides/pages/030-release-notes/content.md +9 -0
  90. package/fixtures/nested-pages/site/pages/010-guides/pages/040-configuration/content.md +3 -0
  91. package/fixtures/nested-pages/site/pages/010-guides/pages/050-content/content.md +3 -0
  92. package/fixtures/nested-pages/site/pages/010-guides/pages/060-themes/content.md +3 -0
  93. package/fixtures/nested-pages/site/pages/010-guides/pages/070-images/content.md +3 -0
  94. package/fixtures/nested-pages/site/pages/010-guides/pages/080-cards/content.md +3 -0
  95. package/fixtures/nested-pages/site/pages/010-guides/pages/090-notes/content.md +3 -0
  96. package/fixtures/nested-pages/site/pages/010-guides/pages/100-validation/content.md +3 -0
  97. package/fixtures/nested-pages/site/pages/010-guides/pages/110-synchronization/content.md +3 -0
  98. package/fixtures/nested-pages/site/pages/010-guides/pages/120-building/content.md +3 -0
  99. package/fixtures/nested-pages/site/pages/010-guides/pages/130-publishing/content.md +3 -0
  100. package/fixtures/nested-pages/site/pages/010-guides/pages/140-troubleshooting/content.md +3 -0
  101. package/fixtures/nested-pages/site/pages/010-guides/pages/150-migration/content.md +3 -0
  102. package/fixtures/nested-pages/site/pages/010-guides/pages/160-accessibility/content.md +3 -0
  103. package/fixtures/nested-pages/site/pages/010-guides/pages/170-performance/content.md +3 -0
  104. package/fixtures/nested-pages/site/pages/010-guides/pages/180-security/content.md +3 -0
  105. package/fixtures/nested-pages/site/pages/010-guides/pages/190-localization/content.md +3 -0
  106. package/fixtures/nested-pages/site/pages/010-guides/pages/200-upgrading/content.md +3 -0
  107. package/fixtures/nested-pages/site/pages/010-guides/pages/210-faq/content.md +3 -0
  108. package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +7 -3
  109. package/fixtures/nested-pages/site/theme.yaml +1 -3
  110. package/package.json +2 -1
  111. package/schemas/config.schema.json +45 -4
  112. package/schemas/content-frontmatter.schema.json +5 -5
  113. package/schemas/manifest.json +3 -2
  114. package/schemas/page-theme.schema.json +192 -0
  115. package/schemas/sitewide-content.schema.json +17 -17
  116. package/schemas/theme.schema.json +188 -216
  117. package/scripts/check-config.mjs +2 -1
  118. package/scripts/deploy-site.mjs +1 -1
  119. package/scripts/generate-images.mjs +7 -14
  120. package/scripts/generate-schemas.mjs +4 -1
  121. package/scripts/lib/editor-language-service.mjs +0 -14
  122. package/scripts/lib/example-sites.mjs +15 -3
  123. package/scripts/lib/page-model.mjs +26 -7
  124. package/scripts/lib/presentation.mjs +25 -17
  125. package/scripts/lib/project-config.mjs +26 -16
  126. package/scripts/lib/schema-definitions.mjs +42 -14
  127. package/scripts/lib/schema-editor-metadata.mjs +70 -26
  128. package/scripts/lib/schema-value-definitions.mjs +14 -0
  129. package/scripts/lib/site-content.mjs +50 -25
  130. package/scripts/lib/site-conventions.mjs +1 -0
  131. package/scripts/lib/site-paths.mjs +9 -3
  132. package/scripts/lib/theme-config.mjs +3 -2
  133. package/scripts/lib/theme-presets.mjs +54 -21
  134. package/scripts/show-typography.mjs +1 -33
  135. package/scripts/sync-content-sections.mjs +1 -3
  136. package/scripts/test-banner-visibility.mjs +2 -2
  137. package/scripts/test-client-javascript.mjs +11 -4
  138. package/scripts/test-content-check.mjs +25 -25
  139. package/scripts/test-content-model-v2.mjs +165 -101
  140. package/scripts/test-documentation.mjs +4 -2
  141. package/scripts/test-editor-language-service.mjs +11 -8
  142. package/scripts/test-engine-commands.mjs +5 -5
  143. package/scripts/test-examples.mjs +30 -1
  144. package/scripts/test-heading-ids.mjs +2 -2
  145. package/scripts/test-navigation.mjs +11 -2
  146. package/scripts/test-nested-pages.mjs +25 -10
  147. package/scripts/test-package-check.mjs +29 -60
  148. package/scripts/test-page-model.mjs +30 -2
  149. package/scripts/test-project-config.mjs +5 -10
  150. package/scripts/test-schemas.mjs +18 -3
  151. package/scripts/test-theme-presets.mjs +33 -27
  152. package/src/components/NavigationPageTree.astro +114 -25
  153. package/src/components/PageContentsLinks.astro +40 -0
  154. package/src/components/SectionNavigationScript.astro +12 -5
  155. package/src/components/SiteBreadcrumbs.astro +17 -14
  156. package/src/components/SiteNavigation.astro +45 -12
  157. package/src/components/SitePage.astro +37 -23
  158. package/src/components/SiteSection.astro +2 -7
  159. package/src/components/SiteTreeNavigation.astro +35 -0
  160. package/src/components/TreeNavigationScript.astro +83 -0
  161. package/src/content.config.ts +2 -8
  162. package/src/layouts/BaseLayout.astro +10 -0
  163. package/src/lib/pageThemes.ts +11 -9
  164. package/src/lib/sectionContent.ts +1 -5
  165. package/src/lib/siteNavigation.ts +2 -1
  166. package/src/lib/sitePages.ts +25 -14
  167. package/src/pages/index.astro +2 -1
  168. package/src/styles/global.css +411 -43
  169. package/starters/basic/README.md +7 -7
  170. package/starters/basic/site/theme.yaml +1 -105
  171. package/starters/project/README.md +8 -8
  172. package/starters/project/site/theme.yaml +1 -31
  173. package/examples/feature-demos/theme-presets/README.md +0 -18
  174. package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +0 -290
  175. package/examples/feature-demos/theme-presets/site/content.md +0 -14
  176. package/examples/feature-demos/theme-presets/site/theme.yaml +0 -1
  177. /package/examples/complete-sites/dog-shelter-multi-page/site/{content.md → pages/000-home/content.md} +0 -0
  178. /package/examples/complete-sites/dog-shelter-multi-page/site/{images → pages/000-home/images}/shelter-dog.jpg +0 -0
  179. /package/examples/complete-sites/dog-shelter-single-page/site/{content.md → pages/000-home/content.md} +0 -0
  180. /package/examples/complete-sites/dog-shelter-single-page/site/{images → pages/000-home/images}/foster-dog.jpg +0 -0
  181. /package/examples/complete-sites/dog-shelter-single-page/site/{images → pages/000-home/images}/rescue-dog.jpg +0 -0
  182. /package/examples/feature-demos/media-and-surfaces/site/{content.md → pages/000-home/content.md} +0 -0
  183. /package/examples/feature-demos/sitewide-content/site/{content.md → pages/000-home/content.md} +0 -0
  184. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/config.yaml +0 -0
  185. /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/images/black-schnauzer.jpg +0 -0
  186. /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/images/retriever-portrait.jpg +0 -0
  187. /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/images/schnauzer-portrait.jpg +0 -0
  188. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/public/robots.txt +0 -0
  189. /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/sitewide-content.yaml +0 -0
  190. /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site}/theme.yaml +0 -0
  191. /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/images/puppy-portrait.jpg +0 -0
  192. /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/images/shepherd-portrait.jpg +0 -0
  193. /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/images/white-puppy.jpg +0 -0
  194. /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site}/theme.yaml +0 -0
  195. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/routeTheme.schema.json +0 -0
  196. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/site.schema.json +0 -0
  197. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/sitewide.schema.json +0 -0
  198. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/theme.schema.json +0 -0
  199. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-assets.mjs +0 -0
  200. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-modules.mjs +0 -0
  201. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content.d.ts +0 -0
  202. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/data-store.json +0 -0
  203. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev-local.json +0 -0
  204. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.json +0 -0
  205. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.log +0 -0
  206. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/settings.json +0 -0
  207. /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/types.d.ts +0 -0
  208. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/_metadata.json +0 -0
  209. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  210. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  211. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  212. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  213. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  214. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  215. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  216. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  217. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  218. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  219. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  220. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  221. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js +0 -0
  222. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
  223. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  224. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  225. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  226. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  227. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/package.json +0 -0
  228. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  229. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  230. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  231. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  232. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  233. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  234. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  235. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  236. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  237. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  238. /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  239. /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/images/boxer-portrait.jpg +0 -0
  240. /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/images/grass-puppy.jpg +0 -0
  241. /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/images/grey-street-dog.jpg +0 -0
  242. /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site}/theme.yaml +0 -0
  243. /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/images/black-pedigree.jpg +0 -0
  244. /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/images/sheepdog-grass.jpg +0 -0
  245. /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/images/sheepdog-wide.jpg +0 -0
  246. /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site}/theme.yaml +0 -0
  247. /package/fixtures/basic/site/{content.md → pages/000-home/content.md} +0 -0
  248. /package/fixtures/basic/site/{images → pages/000-home/images}/.gitkeep +0 -0
  249. /package/fixtures/content-model-v2/site/{content.md → pages/000-home/content.md} +0 -0
  250. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/adopt.svg +0 -0
  251. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/detail.jpg +0 -0
  252. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/duplicate.jpg +0 -0
  253. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/foster.svg +0 -0
  254. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/hero.jpg +0 -0
  255. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/image.jpg +0 -0
  256. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/slide-one.jpg +0 -0
  257. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/slide-three.jpg +0 -0
  258. /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/slide-two.jpg +0 -0
  259. /package/fixtures/nested-pages/site/{content.md → pages/000-home/content.md} +0 -0
  260. /package/starters/basic/site/{content.md → pages/000-home/content.md} +0 -0
  261. /package/starters/basic/site/{images → pages/000-home/images}/.gitkeep +0 -0
  262. /package/starters/project/site/{content.md → pages/000-home/content.md} +0 -0
@@ -0,0 +1,844 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "preset": {
6
+ "description": "Complete visual starting point. Add only the overrides the site actually needs.",
7
+ "type": "string",
8
+ "enum": [
9
+ "portfolio",
10
+ "documentation",
11
+ "project",
12
+ "statement"
13
+ ]
14
+ },
15
+ "shape": {
16
+ "description": "Site-wide shape profile. Omit this to use the selected preset.",
17
+ "type": "string",
18
+ "enum": [
19
+ "square",
20
+ "soft"
21
+ ]
22
+ },
23
+ "layout": {
24
+ "type": "object",
25
+ "properties": {
26
+ "contentSpacing": {
27
+ "description": "Page content spacing. Omit this to keep the selected preset or inherited page setting.",
28
+ "type": "string",
29
+ "enum": [
30
+ "compact",
31
+ "normal",
32
+ "spacious"
33
+ ]
34
+ },
35
+ "textWidth": {
36
+ "description": "Body-text line length. Omit this to keep the selected preset or inherited page setting.",
37
+ "type": "string",
38
+ "enum": [
39
+ "narrow",
40
+ "normal",
41
+ "wide"
42
+ ]
43
+ },
44
+ "pageWidth": {
45
+ "description": "Maximum width of the site layout. Omit this to keep the selected preset.",
46
+ "type": "string",
47
+ "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*\\))$"
48
+ },
49
+ "gutter": {
50
+ "description": "Horizontal page gutter as one value or separate desktop and mobile values.",
51
+ "anyOf": [
52
+ {
53
+ "type": "string",
54
+ "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*\\))$",
55
+ "description": "Responsive CSS length or clamp() expression."
56
+ },
57
+ {
58
+ "type": "object",
59
+ "properties": {
60
+ "desktop": {
61
+ "type": "string",
62
+ "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*\\))$",
63
+ "description": "Responsive CSS length or clamp() expression."
64
+ },
65
+ "mobile": {
66
+ "type": "string",
67
+ "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*\\))$",
68
+ "description": "Responsive CSS length or clamp() expression."
69
+ }
70
+ },
71
+ "required": [
72
+ "desktop",
73
+ "mobile"
74
+ ],
75
+ "additionalProperties": false
76
+ }
77
+ ]
78
+ },
79
+ "spacing": {
80
+ "description": "Fine-grained spacing overrides.",
81
+ "type": "object",
82
+ "properties": {
83
+ "blockGap": {
84
+ "description": "Default vertical gap between structured content blocks.",
85
+ "anyOf": [
86
+ {
87
+ "type": "string",
88
+ "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*\\))$",
89
+ "description": "Responsive CSS length or clamp() expression."
90
+ },
91
+ {
92
+ "type": "object",
93
+ "properties": {
94
+ "desktop": {
95
+ "type": "string",
96
+ "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*\\))$",
97
+ "description": "Responsive CSS length or clamp() expression."
98
+ },
99
+ "mobile": {
100
+ "type": "string",
101
+ "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*\\))$",
102
+ "description": "Responsive CSS length or clamp() expression."
103
+ }
104
+ },
105
+ "required": [
106
+ "desktop",
107
+ "mobile"
108
+ ],
109
+ "additionalProperties": false
110
+ }
111
+ ]
112
+ },
113
+ "finalSectionBottom": {
114
+ "description": "Bottom space after the final section.",
115
+ "anyOf": [
116
+ {
117
+ "type": "string",
118
+ "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*\\))$",
119
+ "description": "Responsive CSS length or clamp() expression."
120
+ },
121
+ {
122
+ "type": "object",
123
+ "properties": {
124
+ "desktop": {
125
+ "type": "string",
126
+ "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*\\))$",
127
+ "description": "Responsive CSS length or clamp() expression."
128
+ },
129
+ "mobile": {
130
+ "type": "string",
131
+ "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*\\))$",
132
+ "description": "Responsive CSS length or clamp() expression."
133
+ }
134
+ },
135
+ "required": [
136
+ "desktop",
137
+ "mobile"
138
+ ],
139
+ "additionalProperties": false
140
+ }
141
+ ]
142
+ },
143
+ "firstSectionTop": {
144
+ "description": "Top space before the first section.",
145
+ "anyOf": [
146
+ {
147
+ "type": "string",
148
+ "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*\\))$",
149
+ "description": "Responsive CSS length or clamp() expression."
150
+ },
151
+ {
152
+ "type": "object",
153
+ "properties": {
154
+ "desktop": {
155
+ "type": "string",
156
+ "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*\\))$",
157
+ "description": "Responsive CSS length or clamp() expression."
158
+ },
159
+ "mobile": {
160
+ "type": "string",
161
+ "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*\\))$",
162
+ "description": "Responsive CSS length or clamp() expression."
163
+ }
164
+ },
165
+ "required": [
166
+ "desktop",
167
+ "mobile"
168
+ ],
169
+ "additionalProperties": false
170
+ }
171
+ ]
172
+ },
173
+ "headingToBlock": {
174
+ "description": "Gap from a section heading to a following structured block.",
175
+ "anyOf": [
176
+ {
177
+ "type": "string",
178
+ "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*\\))$",
179
+ "description": "Responsive CSS length or clamp() expression."
180
+ },
181
+ {
182
+ "type": "object",
183
+ "properties": {
184
+ "desktop": {
185
+ "type": "string",
186
+ "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*\\))$",
187
+ "description": "Responsive CSS length or clamp() expression."
188
+ },
189
+ "mobile": {
190
+ "type": "string",
191
+ "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*\\))$",
192
+ "description": "Responsive CSS length or clamp() expression."
193
+ }
194
+ },
195
+ "required": [
196
+ "desktop",
197
+ "mobile"
198
+ ],
199
+ "additionalProperties": false
200
+ }
201
+ ]
202
+ },
203
+ "imageGap": {
204
+ "description": "Gap between images in an image stack.",
205
+ "anyOf": [
206
+ {
207
+ "type": "string",
208
+ "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*\\))$",
209
+ "description": "Responsive CSS length or clamp() expression."
210
+ },
211
+ {
212
+ "type": "object",
213
+ "properties": {
214
+ "desktop": {
215
+ "type": "string",
216
+ "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*\\))$",
217
+ "description": "Responsive CSS length or clamp() expression."
218
+ },
219
+ "mobile": {
220
+ "type": "string",
221
+ "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*\\))$",
222
+ "description": "Responsive CSS length or clamp() expression."
223
+ }
224
+ },
225
+ "required": [
226
+ "desktop",
227
+ "mobile"
228
+ ],
229
+ "additionalProperties": false
230
+ }
231
+ ]
232
+ },
233
+ "sectionGap": {
234
+ "description": "Vertical separation between page sections.",
235
+ "anyOf": [
236
+ {
237
+ "type": "string",
238
+ "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*\\))$",
239
+ "description": "Responsive CSS length or clamp() expression."
240
+ },
241
+ {
242
+ "type": "object",
243
+ "properties": {
244
+ "desktop": {
245
+ "type": "string",
246
+ "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*\\))$",
247
+ "description": "Responsive CSS length or clamp() expression."
248
+ },
249
+ "mobile": {
250
+ "type": "string",
251
+ "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*\\))$",
252
+ "description": "Responsive CSS length or clamp() expression."
253
+ }
254
+ },
255
+ "required": [
256
+ "desktop",
257
+ "mobile"
258
+ ],
259
+ "additionalProperties": false
260
+ }
261
+ ]
262
+ }
263
+ },
264
+ "additionalProperties": false
265
+ }
266
+ },
267
+ "additionalProperties": false,
268
+ "description": "Optional layout overrides applied after the preset."
269
+ },
270
+ "images": {
271
+ "type": "object",
272
+ "properties": {
273
+ "width": {
274
+ "description": "Maximum managed-image width. Omit this to keep the selected preset.",
275
+ "type": "string",
276
+ "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*\\))$"
277
+ },
278
+ "maxAvailableWidthPercent": {
279
+ "description": "Maximum percentage of available horizontal space used by managed images.",
280
+ "anyOf": [
281
+ {
282
+ "type": "number",
283
+ "exclusiveMinimum": 0,
284
+ "maximum": 100
285
+ },
286
+ {
287
+ "type": "object",
288
+ "properties": {
289
+ "desktop": {
290
+ "type": "number",
291
+ "exclusiveMinimum": 0,
292
+ "maximum": 100,
293
+ "description": "Percentage used on wider screens."
294
+ },
295
+ "mobile": {
296
+ "type": "number",
297
+ "exclusiveMinimum": 0,
298
+ "maximum": 100,
299
+ "description": "Percentage used on narrow screens."
300
+ }
301
+ },
302
+ "required": [
303
+ "desktop",
304
+ "mobile"
305
+ ],
306
+ "additionalProperties": false
307
+ }
308
+ ]
309
+ },
310
+ "maxAvailableHeightPercent": {
311
+ "description": "Maximum percentage of viewport height used by managed images.",
312
+ "anyOf": [
313
+ {
314
+ "type": "number",
315
+ "exclusiveMinimum": 0,
316
+ "maximum": 100
317
+ },
318
+ {
319
+ "type": "object",
320
+ "properties": {
321
+ "desktop": {
322
+ "type": "number",
323
+ "exclusiveMinimum": 0,
324
+ "maximum": 100,
325
+ "description": "Percentage used on wider screens."
326
+ },
327
+ "mobile": {
328
+ "type": "number",
329
+ "exclusiveMinimum": 0,
330
+ "maximum": 100,
331
+ "description": "Percentage used on narrow screens."
332
+ }
333
+ },
334
+ "required": [
335
+ "desktop",
336
+ "mobile"
337
+ ],
338
+ "additionalProperties": false
339
+ }
340
+ ]
341
+ }
342
+ },
343
+ "additionalProperties": false,
344
+ "description": "Optional defaults for managed image presentation."
345
+ },
346
+ "typography": {
347
+ "type": "object",
348
+ "properties": {
349
+ "fontFamily": {
350
+ "description": "CSS font-family stack.",
351
+ "type": "string",
352
+ "minLength": 1
353
+ },
354
+ "profile": {
355
+ "description": "Typography profile. Omit this to keep the selected preset.",
356
+ "type": "string",
357
+ "enum": [
358
+ "restrained",
359
+ "dense",
360
+ "reading",
361
+ "statement"
362
+ ]
363
+ },
364
+ "rhythm": {
365
+ "description": "Typography spacing rhythm. Omit this to keep the selected preset.",
366
+ "type": "string",
367
+ "enum": [
368
+ "compact",
369
+ "normal",
370
+ "airy"
371
+ ]
372
+ },
373
+ "overrides": {
374
+ "description": "Focused typography overrides applied after the profile.",
375
+ "type": "object",
376
+ "properties": {
377
+ "headings": {
378
+ "description": "Overrides for heading levels.",
379
+ "type": "object",
380
+ "properties": {
381
+ "h1": {
382
+ "description": "Overrides for Markdown level 1 headings.",
383
+ "type": "object",
384
+ "properties": {
385
+ "align": {
386
+ "description": "Responsive text alignment override.",
387
+ "type": "object",
388
+ "properties": {
389
+ "desktop": {
390
+ "description": "Text alignment on wider screens.",
391
+ "type": "string",
392
+ "enum": [
393
+ "left",
394
+ "center",
395
+ "right"
396
+ ]
397
+ },
398
+ "mobile": {
399
+ "description": "Text alignment on narrow screens.",
400
+ "type": "string",
401
+ "enum": [
402
+ "left",
403
+ "center",
404
+ "right"
405
+ ]
406
+ }
407
+ },
408
+ "additionalProperties": false
409
+ },
410
+ "size": {
411
+ "type": "string",
412
+ "enum": [
413
+ "small",
414
+ "medium",
415
+ "large",
416
+ "xlarge"
417
+ ],
418
+ "description": "Text size from the active typography system. Omit an override to keep the profile value."
419
+ },
420
+ "lineHeight": {
421
+ "type": "number",
422
+ "minimum": 1,
423
+ "maximum": 3,
424
+ "description": "Unitless line height between 1 and 3."
425
+ },
426
+ "weight": {
427
+ "description": "Heading font weight. Omit this to keep the profile value.",
428
+ "anyOf": [
429
+ {
430
+ "type": "number",
431
+ "const": 400
432
+ },
433
+ {
434
+ "type": "number",
435
+ "const": 500
436
+ },
437
+ {
438
+ "type": "number",
439
+ "const": 600
440
+ },
441
+ {
442
+ "type": "number",
443
+ "const": 700
444
+ }
445
+ ]
446
+ },
447
+ "spacingBefore": {
448
+ "description": "Vertical space before the heading.",
449
+ "type": "string",
450
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
451
+ },
452
+ "spacingAfter": {
453
+ "description": "Vertical space after the heading.",
454
+ "type": "string",
455
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
456
+ }
457
+ },
458
+ "additionalProperties": false
459
+ },
460
+ "h2": {
461
+ "description": "Overrides for Markdown level 2 section headings.",
462
+ "type": "object",
463
+ "properties": {
464
+ "align": {
465
+ "description": "Responsive text alignment override.",
466
+ "type": "object",
467
+ "properties": {
468
+ "desktop": {
469
+ "description": "Text alignment on wider screens.",
470
+ "type": "string",
471
+ "enum": [
472
+ "left",
473
+ "center",
474
+ "right"
475
+ ]
476
+ },
477
+ "mobile": {
478
+ "description": "Text alignment on narrow screens.",
479
+ "type": "string",
480
+ "enum": [
481
+ "left",
482
+ "center",
483
+ "right"
484
+ ]
485
+ }
486
+ },
487
+ "additionalProperties": false
488
+ },
489
+ "size": {
490
+ "type": "string",
491
+ "enum": [
492
+ "small",
493
+ "medium",
494
+ "large",
495
+ "xlarge"
496
+ ],
497
+ "description": "Text size from the active typography system. Omit an override to keep the profile value."
498
+ },
499
+ "lineHeight": {
500
+ "type": "number",
501
+ "minimum": 1,
502
+ "maximum": 3,
503
+ "description": "Unitless line height between 1 and 3."
504
+ },
505
+ "weight": {
506
+ "description": "Heading font weight. Omit this to keep the profile value.",
507
+ "anyOf": [
508
+ {
509
+ "type": "number",
510
+ "const": 400
511
+ },
512
+ {
513
+ "type": "number",
514
+ "const": 500
515
+ },
516
+ {
517
+ "type": "number",
518
+ "const": 600
519
+ },
520
+ {
521
+ "type": "number",
522
+ "const": 700
523
+ }
524
+ ]
525
+ },
526
+ "spacingBefore": {
527
+ "description": "Vertical space before the heading.",
528
+ "type": "string",
529
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
530
+ },
531
+ "spacingAfter": {
532
+ "description": "Vertical space after the heading.",
533
+ "type": "string",
534
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
535
+ }
536
+ },
537
+ "additionalProperties": false
538
+ },
539
+ "h3": {
540
+ "description": "Overrides for Markdown level 3 headings.",
541
+ "type": "object",
542
+ "properties": {
543
+ "align": {
544
+ "description": "Responsive text alignment override.",
545
+ "type": "object",
546
+ "properties": {
547
+ "desktop": {
548
+ "description": "Text alignment on wider screens.",
549
+ "type": "string",
550
+ "enum": [
551
+ "left",
552
+ "center",
553
+ "right"
554
+ ]
555
+ },
556
+ "mobile": {
557
+ "description": "Text alignment on narrow screens.",
558
+ "type": "string",
559
+ "enum": [
560
+ "left",
561
+ "center",
562
+ "right"
563
+ ]
564
+ }
565
+ },
566
+ "additionalProperties": false
567
+ },
568
+ "size": {
569
+ "type": "string",
570
+ "enum": [
571
+ "small",
572
+ "medium",
573
+ "large",
574
+ "xlarge"
575
+ ],
576
+ "description": "Text size from the active typography system. Omit an override to keep the profile value."
577
+ },
578
+ "lineHeight": {
579
+ "type": "number",
580
+ "minimum": 1,
581
+ "maximum": 3,
582
+ "description": "Unitless line height between 1 and 3."
583
+ },
584
+ "weight": {
585
+ "description": "Heading font weight. Omit this to keep the profile value.",
586
+ "anyOf": [
587
+ {
588
+ "type": "number",
589
+ "const": 400
590
+ },
591
+ {
592
+ "type": "number",
593
+ "const": 500
594
+ },
595
+ {
596
+ "type": "number",
597
+ "const": 600
598
+ },
599
+ {
600
+ "type": "number",
601
+ "const": 700
602
+ }
603
+ ]
604
+ },
605
+ "spacingBefore": {
606
+ "description": "Vertical space before the heading.",
607
+ "type": "string",
608
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
609
+ },
610
+ "spacingAfter": {
611
+ "description": "Vertical space after the heading.",
612
+ "type": "string",
613
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
614
+ }
615
+ },
616
+ "additionalProperties": false
617
+ },
618
+ "h4": {
619
+ "description": "Overrides for Markdown level 4 headings.",
620
+ "type": "object",
621
+ "properties": {
622
+ "align": {
623
+ "description": "Responsive text alignment override.",
624
+ "type": "object",
625
+ "properties": {
626
+ "desktop": {
627
+ "description": "Text alignment on wider screens.",
628
+ "type": "string",
629
+ "enum": [
630
+ "left",
631
+ "center",
632
+ "right"
633
+ ]
634
+ },
635
+ "mobile": {
636
+ "description": "Text alignment on narrow screens.",
637
+ "type": "string",
638
+ "enum": [
639
+ "left",
640
+ "center",
641
+ "right"
642
+ ]
643
+ }
644
+ },
645
+ "additionalProperties": false
646
+ },
647
+ "size": {
648
+ "type": "string",
649
+ "enum": [
650
+ "small",
651
+ "medium",
652
+ "large",
653
+ "xlarge"
654
+ ],
655
+ "description": "Text size from the active typography system. Omit an override to keep the profile value."
656
+ },
657
+ "lineHeight": {
658
+ "type": "number",
659
+ "minimum": 1,
660
+ "maximum": 3,
661
+ "description": "Unitless line height between 1 and 3."
662
+ },
663
+ "weight": {
664
+ "description": "Heading font weight. Omit this to keep the profile value.",
665
+ "anyOf": [
666
+ {
667
+ "type": "number",
668
+ "const": 400
669
+ },
670
+ {
671
+ "type": "number",
672
+ "const": 500
673
+ },
674
+ {
675
+ "type": "number",
676
+ "const": 600
677
+ },
678
+ {
679
+ "type": "number",
680
+ "const": 700
681
+ }
682
+ ]
683
+ },
684
+ "spacingBefore": {
685
+ "description": "Vertical space before the heading.",
686
+ "type": "string",
687
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
688
+ },
689
+ "spacingAfter": {
690
+ "description": "Vertical space after the heading.",
691
+ "type": "string",
692
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
693
+ }
694
+ },
695
+ "additionalProperties": false
696
+ }
697
+ },
698
+ "additionalProperties": false
699
+ },
700
+ "body": {
701
+ "description": "Overrides for body text.",
702
+ "type": "object",
703
+ "properties": {
704
+ "align": {
705
+ "description": "Responsive text alignment override.",
706
+ "type": "object",
707
+ "properties": {
708
+ "desktop": {
709
+ "description": "Text alignment on wider screens.",
710
+ "type": "string",
711
+ "enum": [
712
+ "left",
713
+ "center",
714
+ "right"
715
+ ]
716
+ },
717
+ "mobile": {
718
+ "description": "Text alignment on narrow screens.",
719
+ "type": "string",
720
+ "enum": [
721
+ "left",
722
+ "center",
723
+ "right"
724
+ ]
725
+ }
726
+ },
727
+ "additionalProperties": false
728
+ },
729
+ "size": {
730
+ "type": "string",
731
+ "enum": [
732
+ "small",
733
+ "medium",
734
+ "large",
735
+ "xlarge"
736
+ ],
737
+ "description": "Text size from the active typography system. Omit an override to keep the profile value."
738
+ },
739
+ "lineHeight": {
740
+ "type": "number",
741
+ "minimum": 1,
742
+ "maximum": 3,
743
+ "description": "Unitless line height between 1 and 3."
744
+ },
745
+ "paragraphSpacing": {
746
+ "description": "Vertical space between body paragraphs.",
747
+ "type": "string",
748
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
749
+ }
750
+ },
751
+ "additionalProperties": false
752
+ },
753
+ "caption": {
754
+ "description": "Overrides for image captions.",
755
+ "type": "object",
756
+ "properties": {
757
+ "align": {
758
+ "description": "Responsive text alignment override.",
759
+ "type": "object",
760
+ "properties": {
761
+ "desktop": {
762
+ "description": "Text alignment on wider screens.",
763
+ "type": "string",
764
+ "enum": [
765
+ "left",
766
+ "center",
767
+ "right"
768
+ ]
769
+ },
770
+ "mobile": {
771
+ "description": "Text alignment on narrow screens.",
772
+ "type": "string",
773
+ "enum": [
774
+ "left",
775
+ "center",
776
+ "right"
777
+ ]
778
+ }
779
+ },
780
+ "additionalProperties": false
781
+ },
782
+ "size": {
783
+ "type": "string",
784
+ "enum": [
785
+ "small",
786
+ "medium",
787
+ "large",
788
+ "xlarge"
789
+ ],
790
+ "description": "Text size from the active typography system. Omit an override to keep the profile value."
791
+ },
792
+ "lineHeight": {
793
+ "type": "number",
794
+ "minimum": 1,
795
+ "maximum": 3,
796
+ "description": "Unitless line height between 1 and 3."
797
+ },
798
+ "spacingBefore": {
799
+ "description": "Vertical space between an image and its caption.",
800
+ "type": "string",
801
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
802
+ }
803
+ },
804
+ "additionalProperties": false
805
+ }
806
+ },
807
+ "additionalProperties": false
808
+ }
809
+ },
810
+ "additionalProperties": false,
811
+ "description": "Typography profile, rhythm, font family, and focused overrides."
812
+ },
813
+ "palette": {
814
+ "type": "string",
815
+ "enum": [
816
+ "dark",
817
+ "light",
818
+ "paper"
819
+ ],
820
+ "description": "Coordinated site color palette. Omit this to use the selected preset."
821
+ },
822
+ "sections": {
823
+ "type": "object",
824
+ "properties": {
825
+ "backgroundPattern": {
826
+ "description": "Section background sequence. Omit this to keep the selected preset or inherited page setting.",
827
+ "type": "string",
828
+ "enum": [
829
+ "uniform",
830
+ "alternating",
831
+ "cycling"
832
+ ]
833
+ }
834
+ },
835
+ "additionalProperties": false,
836
+ "description": "Defaults for page section presentation."
837
+ },
838
+ "$schema": {
839
+ "type": "string"
840
+ }
841
+ },
842
+ "additionalProperties": false,
843
+ "description": "Site-wide visual identity and default page presentation. Presets may be selected only in the root theme."
844
+ }