@janga/norna 0.7.17 → 0.7.22

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 (533) hide show
  1. package/README.md +32 -13
  2. package/astro.config.mjs +22 -0
  3. package/bin/norna-cli.mjs +7 -1
  4. package/package.json +46 -12
  5. package/schemas/category.schema.json +20 -0
  6. package/schemas/config.schema.json +55 -4
  7. package/schemas/content-frontmatter.schema.json +5 -5
  8. package/schemas/manifest.json +4 -2
  9. package/schemas/page-theme.schema.json +192 -0
  10. package/schemas/sitewide-content.schema.json +18 -18
  11. package/schemas/theme.schema.json +364 -226
  12. package/scripts/add-site-node.mjs +251 -0
  13. package/scripts/check-config.mjs +12 -3
  14. package/scripts/deploy-site.mjs +6 -9
  15. package/scripts/generate-images.mjs +18 -29
  16. package/scripts/generate-schemas.mjs +7 -1
  17. package/scripts/init-site.mjs +35 -0
  18. package/scripts/lib/astro-command.mjs +14 -9
  19. package/scripts/lib/editor-language-service.mjs +28 -191
  20. package/scripts/lib/heading-ids.mjs +3 -1
  21. package/scripts/lib/navigation-model.mjs +23 -17
  22. package/scripts/lib/norna-markdown-blocks.mjs +64 -145
  23. package/scripts/lib/norna-markdown-render-plugin.mjs +37 -0
  24. package/scripts/lib/object.mjs +28 -0
  25. package/scripts/lib/page-markdown.mjs +282 -0
  26. package/scripts/lib/page-model.mjs +26 -7
  27. package/scripts/lib/presentation-contract.mjs +266 -0
  28. package/scripts/lib/presentation-palette-metadata.mjs +51 -0
  29. package/scripts/lib/presentation.mjs +548 -93
  30. package/scripts/lib/project-config.mjs +73 -16
  31. package/scripts/lib/schema-definitions.mjs +89 -21
  32. package/scripts/lib/schema-editor-metadata.mjs +166 -33
  33. package/scripts/lib/schema-value-definitions.mjs +32 -4
  34. package/scripts/lib/site-content.mjs +33 -223
  35. package/scripts/lib/site-conventions.mjs +1 -0
  36. package/scripts/lib/site-paths.mjs +11 -6
  37. package/scripts/lib/site-structure.mjs +189 -0
  38. package/scripts/lib/theme-config.mjs +3 -2
  39. package/scripts/lib/theme-presets.mjs +105 -101
  40. package/scripts/lib/theme-profiles.mjs +221 -0
  41. package/scripts/lib/typography.mjs +220 -35
  42. package/scripts/lib/yaml-config.mjs +46 -6
  43. package/scripts/lib/yaml-indentation.mjs +86 -0
  44. package/scripts/show-typography.mjs +3 -36
  45. package/scripts/sync-content-sections.mjs +88 -79
  46. package/src/components/DisplaySettings.astro +107 -0
  47. package/src/components/ImageCarousel.astro +34 -13
  48. package/src/components/NavigationPageTree.astro +154 -34
  49. package/src/components/PageContentsLinks.astro +40 -0
  50. package/src/components/SectionNavigationScript.astro +68 -7
  51. package/src/components/SiteBreadcrumbs.astro +24 -18
  52. package/src/components/SiteNavigation.astro +130 -46
  53. package/src/components/SitePage.astro +65 -55
  54. package/src/components/SiteSection.astro +37 -198
  55. package/src/components/SiteTreeNavigation.astro +36 -0
  56. package/src/components/TreeNavigationScript.astro +83 -0
  57. package/src/content.config.ts +2 -8
  58. package/src/layouts/BaseLayout.astro +52 -2
  59. package/src/lib/generatedImages.ts +0 -7
  60. package/src/lib/pageThemes.ts +11 -9
  61. package/src/lib/readerPreferencesScript.mjs +141 -0
  62. package/src/lib/sectionContent.ts +120 -206
  63. package/src/lib/siteNavigation.ts +38 -19
  64. package/src/lib/sitePages.ts +115 -33
  65. package/src/pages/[...slug].astro +2 -2
  66. package/src/pages/index.astro +2 -1
  67. package/src/styles/global.css +1110 -279
  68. package/starters/basic/README.md +8 -8
  69. package/starters/basic/site/theme.yaml +1 -105
  70. package/docs/README.md +0 -135
  71. package/docs/assets/norna-dog-shelter.jpg +0 -0
  72. package/docs/commands.md +0 -189
  73. package/docs/configuration.md +0 -119
  74. package/docs/content.md +0 -342
  75. package/docs/design/command-organization.md +0 -414
  76. package/docs/design/navigation-and-theme-plan.md +0 -115
  77. package/docs/design/norna-diagram-design.md +0 -159
  78. package/docs/design/site-examples-structure.md +0 -115
  79. package/docs/engine-development.md +0 -218
  80. package/docs/getting-started.md +0 -206
  81. package/docs/how-to/embedded-site.md +0 -35
  82. package/docs/images-and-metadata.md +0 -186
  83. package/docs/local-development.md +0 -82
  84. package/docs/pages.md +0 -134
  85. package/docs/public-files.md +0 -118
  86. package/docs/publishing.md +0 -117
  87. package/docs/requirements.md +0 -54
  88. package/docs/site-files.md +0 -145
  89. package/docs/sitewide-content.md +0 -73
  90. package/docs/theme.md +0 -271
  91. package/docs/typography.md +0 -180
  92. package/examples/README.md +0 -43
  93. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +0 -35
  94. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +0 -97
  95. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +0 -852
  96. package/examples/complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs +0 -4
  97. package/examples/complete-sites/dog-shelter-multi-page/.astro/content-modules.mjs +0 -1
  98. package/examples/complete-sites/dog-shelter-multi-page/.astro/content.d.ts +0 -183
  99. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +0 -1
  100. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev-local.json +0 -8
  101. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +0 -13
  102. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +0 -36
  103. package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +0 -5
  104. package/examples/complete-sites/dog-shelter-multi-page/.astro/types.d.ts +0 -2
  105. package/examples/complete-sites/dog-shelter-multi-page/README.md +0 -24
  106. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +0 -74
  107. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
  108. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
  109. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  110. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  111. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  112. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  113. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  114. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  115. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  116. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  117. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
  118. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
  119. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
  120. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
  121. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
  122. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
  123. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/package.json +0 -3
  124. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  125. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
  126. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
  127. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
  128. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
  129. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
  130. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
  131. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
  132. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
  133. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
  134. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
  135. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +0 -98
  136. package/examples/complete-sites/dog-shelter-multi-page/site/config.yaml +0 -1
  137. package/examples/complete-sites/dog-shelter-multi-page/site/content.md +0 -23
  138. package/examples/complete-sites/dog-shelter-multi-page/site/images/shelter-dog.jpg +0 -0
  139. package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/content.md +0 -21
  140. package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/images/rex.jpg +0 -0
  141. package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/images/rover.jpg +0 -0
  142. package/examples/complete-sites/dog-shelter-multi-page/site/pages/020-adopt/content.md +0 -22
  143. package/examples/complete-sites/dog-shelter-multi-page/site/pages/020-adopt/images/adoption-dog.jpg +0 -0
  144. package/examples/complete-sites/dog-shelter-multi-page/site/public/favicon.svg +0 -10
  145. package/examples/complete-sites/dog-shelter-multi-page/site/public/logo.svg +0 -9
  146. package/examples/complete-sites/dog-shelter-multi-page/site/public/robots.txt +0 -2
  147. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +0 -4
  148. package/examples/complete-sites/dog-shelter-multi-page/site/theme.yaml +0 -1
  149. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +0 -35
  150. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +0 -97
  151. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +0 -852
  152. package/examples/complete-sites/dog-shelter-single-page/.astro/content-assets.mjs +0 -4
  153. package/examples/complete-sites/dog-shelter-single-page/.astro/content-modules.mjs +0 -1
  154. package/examples/complete-sites/dog-shelter-single-page/.astro/content.d.ts +0 -183
  155. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +0 -1
  156. package/examples/complete-sites/dog-shelter-single-page/.astro/dev-local.json +0 -8
  157. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +0 -13
  158. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +0 -18
  159. package/examples/complete-sites/dog-shelter-single-page/.astro/settings.json +0 -5
  160. package/examples/complete-sites/dog-shelter-single-page/.astro/types.d.ts +0 -2
  161. package/examples/complete-sites/dog-shelter-single-page/README.md +0 -24
  162. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +0 -74
  163. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
  164. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
  165. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  166. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  167. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  168. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  169. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  170. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  171. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  172. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  173. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
  174. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
  175. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
  176. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
  177. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
  178. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
  179. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/package.json +0 -3
  180. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  181. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
  182. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
  183. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
  184. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
  185. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
  186. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
  187. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
  188. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
  189. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
  190. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
  191. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +0 -50
  192. package/examples/complete-sites/dog-shelter-single-page/site/config.yaml +0 -1
  193. package/examples/complete-sites/dog-shelter-single-page/site/content.md +0 -37
  194. package/examples/complete-sites/dog-shelter-single-page/site/images/foster-dog.jpg +0 -0
  195. package/examples/complete-sites/dog-shelter-single-page/site/images/rescue-dog.jpg +0 -0
  196. package/examples/complete-sites/dog-shelter-single-page/site/public/favicon.svg +0 -10
  197. package/examples/complete-sites/dog-shelter-single-page/site/public/logo.svg +0 -9
  198. package/examples/complete-sites/dog-shelter-single-page/site/public/robots.txt +0 -2
  199. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +0 -4
  200. package/examples/complete-sites/dog-shelter-single-page/site/theme.yaml +0 -1
  201. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +0 -35
  202. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +0 -97
  203. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +0 -852
  204. package/examples/feature-demos/media-and-surfaces/.astro/content-assets.mjs +0 -4
  205. package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +0 -1
  206. package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +0 -183
  207. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +0 -1
  208. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +0 -14
  209. package/examples/feature-demos/media-and-surfaces/.astro/settings.json +0 -5
  210. package/examples/feature-demos/media-and-surfaces/.astro/types.d.ts +0 -2
  211. package/examples/feature-demos/media-and-surfaces/README.md +0 -21
  212. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +0 -80
  213. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
  214. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
  215. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  216. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  217. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  218. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  219. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  220. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  221. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  222. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  223. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
  224. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
  225. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js +0 -1389
  226. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js.map +0 -1
  227. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
  228. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
  229. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
  230. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
  231. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/package.json +0 -3
  232. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  233. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
  234. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
  235. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
  236. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
  237. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
  238. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
  239. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
  240. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
  241. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
  242. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
  243. package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +0 -66
  244. package/examples/feature-demos/media-and-surfaces/site/config.yaml +0 -1
  245. package/examples/feature-demos/media-and-surfaces/site/content.md +0 -15
  246. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/content.md +0 -71
  247. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-carousel.svg +0 -11
  248. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-stack.svg +0 -9
  249. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-surfaces.svg +0 -8
  250. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-one.svg +0 -8
  251. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-three.svg +0 -13
  252. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-two.svg +0 -8
  253. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/stack-one.svg +0 -8
  254. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/stack-two.svg +0 -9
  255. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/content.md +0 -41
  256. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +0 -3
  257. package/examples/feature-demos/media-and-surfaces/site/public/robots.txt +0 -2
  258. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.yaml +0 -2
  259. package/examples/feature-demos/media-and-surfaces/site/theme.yaml +0 -1
  260. package/examples/feature-demos/sitewide-content/.astro/collections/site.schema.json +0 -59
  261. package/examples/feature-demos/sitewide-content/.astro/collections/sitewide.schema.json +0 -138
  262. package/examples/feature-demos/sitewide-content/.astro/collections/theme.schema.json +0 -755
  263. package/examples/feature-demos/sitewide-content/.astro/content-assets.mjs +0 -1
  264. package/examples/feature-demos/sitewide-content/.astro/content-modules.mjs +0 -1
  265. package/examples/feature-demos/sitewide-content/.astro/content.d.ts +0 -183
  266. package/examples/feature-demos/sitewide-content/.astro/data-store.json +0 -1
  267. package/examples/feature-demos/sitewide-content/.astro/dev.json +0 -13
  268. package/examples/feature-demos/sitewide-content/.astro/dev.log +0 -18
  269. package/examples/feature-demos/sitewide-content/.astro/settings.json +0 -5
  270. package/examples/feature-demos/sitewide-content/.astro/types.d.ts +0 -2
  271. package/examples/feature-demos/sitewide-content/README.md +0 -26
  272. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/_metadata.json +0 -74
  273. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
  274. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
  275. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  276. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  277. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  278. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  279. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  280. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  281. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  282. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  283. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
  284. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
  285. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
  286. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
  287. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
  288. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
  289. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/package.json +0 -3
  290. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  291. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
  292. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
  293. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
  294. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
  295. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
  296. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
  297. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
  298. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
  299. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
  300. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
  301. package/examples/feature-demos/sitewide-content/site/.norna/generated-images.json +0 -1
  302. package/examples/feature-demos/sitewide-content/site/config.yaml +0 -1
  303. package/examples/feature-demos/sitewide-content/site/content.md +0 -17
  304. package/examples/feature-demos/sitewide-content/site/pages/010-logo-and-navigation/content.md +0 -17
  305. package/examples/feature-demos/sitewide-content/site/pages/020-notices/content.md +0 -23
  306. package/examples/feature-demos/sitewide-content/site/pages/030-footer/content.md +0 -18
  307. package/examples/feature-demos/sitewide-content/site/public/logo.svg +0 -6
  308. package/examples/feature-demos/sitewide-content/site/public/robots.txt +0 -2
  309. package/examples/feature-demos/sitewide-content/site/sitewide-content.yaml +0 -14
  310. package/examples/feature-demos/sitewide-content/site/theme.yaml +0 -1
  311. package/examples/feature-demos/theme-presets/.astro/collections/routeTheme.schema.json +0 -746
  312. package/examples/feature-demos/theme-presets/.astro/collections/site.schema.json +0 -59
  313. package/examples/feature-demos/theme-presets/.astro/collections/sitewide.schema.json +0 -138
  314. package/examples/feature-demos/theme-presets/.astro/collections/theme.schema.json +0 -755
  315. package/examples/feature-demos/theme-presets/.astro/content-assets.mjs +0 -4
  316. package/examples/feature-demos/theme-presets/.astro/content-modules.mjs +0 -1
  317. package/examples/feature-demos/theme-presets/.astro/content.d.ts +0 -183
  318. package/examples/feature-demos/theme-presets/.astro/data-store.json +0 -1
  319. package/examples/feature-demos/theme-presets/.astro/dev-local.json +0 -8
  320. package/examples/feature-demos/theme-presets/.astro/dev.json +0 -15
  321. package/examples/feature-demos/theme-presets/.astro/dev.log +0 -164
  322. package/examples/feature-demos/theme-presets/.astro/settings.json +0 -5
  323. package/examples/feature-demos/theme-presets/.astro/types.d.ts +0 -2
  324. package/examples/feature-demos/theme-presets/README.md +0 -18
  325. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/_metadata.json +0 -80
  326. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
  327. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
  328. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  329. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  330. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  331. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  332. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  333. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  334. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  335. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  336. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
  337. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
  338. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js +0 -1389
  339. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js.map +0 -1
  340. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
  341. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
  342. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
  343. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
  344. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/package.json +0 -3
  345. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  346. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
  347. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
  348. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
  349. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
  350. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
  351. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
  352. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
  353. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
  354. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
  355. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
  356. package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +0 -290
  357. package/examples/feature-demos/theme-presets/site/config.yaml +0 -1
  358. package/examples/feature-demos/theme-presets/site/content.md +0 -14
  359. package/examples/feature-demos/theme-presets/site/pages/010-portfolio/content.md +0 -31
  360. package/examples/feature-demos/theme-presets/site/pages/010-portfolio/images/puppy-portrait.jpg +0 -0
  361. package/examples/feature-demos/theme-presets/site/pages/010-portfolio/images/shepherd-portrait.jpg +0 -0
  362. package/examples/feature-demos/theme-presets/site/pages/010-portfolio/images/white-puppy.jpg +0 -0
  363. package/examples/feature-demos/theme-presets/site/pages/010-portfolio/theme.yaml +0 -1
  364. package/examples/feature-demos/theme-presets/site/pages/020-documentation/content.md +0 -30
  365. package/examples/feature-demos/theme-presets/site/pages/020-documentation/images/black-schnauzer.jpg +0 -0
  366. package/examples/feature-demos/theme-presets/site/pages/020-documentation/images/retriever-portrait.jpg +0 -0
  367. package/examples/feature-demos/theme-presets/site/pages/020-documentation/images/schnauzer-portrait.jpg +0 -0
  368. package/examples/feature-demos/theme-presets/site/pages/020-documentation/theme.yaml +0 -1
  369. package/examples/feature-demos/theme-presets/site/pages/030-project/content.md +0 -31
  370. package/examples/feature-demos/theme-presets/site/pages/030-project/images/boxer-portrait.jpg +0 -0
  371. package/examples/feature-demos/theme-presets/site/pages/030-project/images/grass-puppy.jpg +0 -0
  372. package/examples/feature-demos/theme-presets/site/pages/030-project/images/grey-street-dog.jpg +0 -0
  373. package/examples/feature-demos/theme-presets/site/pages/030-project/theme.yaml +0 -1
  374. package/examples/feature-demos/theme-presets/site/pages/040-statement/content.md +0 -31
  375. package/examples/feature-demos/theme-presets/site/pages/040-statement/images/black-pedigree.jpg +0 -0
  376. package/examples/feature-demos/theme-presets/site/pages/040-statement/images/sheepdog-grass.jpg +0 -0
  377. package/examples/feature-demos/theme-presets/site/pages/040-statement/images/sheepdog-wide.jpg +0 -0
  378. package/examples/feature-demos/theme-presets/site/pages/040-statement/theme.yaml +0 -1
  379. package/examples/feature-demos/theme-presets/site/public/robots.txt +0 -2
  380. package/examples/feature-demos/theme-presets/site/sitewide-content.yaml +0 -3
  381. package/examples/feature-demos/theme-presets/site/theme.yaml +0 -1
  382. package/fixtures/basic/site/.norna/generated-images.json +0 -1
  383. package/fixtures/basic/site/config.yaml +0 -1
  384. package/fixtures/basic/site/content.md +0 -14
  385. package/fixtures/basic/site/public/robots.txt +0 -2
  386. package/fixtures/basic/site/sitewide-content.yaml +0 -3
  387. package/fixtures/basic/site/theme.yaml +0 -8
  388. package/fixtures/content-model-v2/.astro/collections/site.schema.json +0 -776
  389. package/fixtures/content-model-v2/.astro/collections/theme.schema.json +0 -668
  390. package/fixtures/content-model-v2/.astro/content-assets.mjs +0 -4
  391. package/fixtures/content-model-v2/.astro/content-modules.mjs +0 -1
  392. package/fixtures/content-model-v2/.astro/content.d.ts +0 -175
  393. package/fixtures/content-model-v2/.astro/data-store.json +0 -1
  394. package/fixtures/content-model-v2/.astro/dev-local.json +0 -8
  395. package/fixtures/content-model-v2/.astro/dev.json +0 -13
  396. package/fixtures/content-model-v2/.astro/dev.log +0 -231
  397. package/fixtures/content-model-v2/.astro/settings.json +0 -5
  398. package/fixtures/content-model-v2/.astro/types.d.ts +0 -2
  399. package/fixtures/content-model-v2/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +0 -1
  400. package/fixtures/content-model-v2/dist/_astro/SitePage.BbfZub4g.css +0 -1
  401. package/fixtures/content-model-v2/dist/guide/index.html +0 -3
  402. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-480.webp +0 -0
  403. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-768.webp +0 -0
  404. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-971.webp +0 -0
  405. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-480.webp +0 -0
  406. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-768.webp +0 -0
  407. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-971.webp +0 -0
  408. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-480.webp +0 -0
  409. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-768.webp +0 -0
  410. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-971.webp +0 -0
  411. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1080.webp +0 -0
  412. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1440.webp +0 -0
  413. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1600.webp +0 -0
  414. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-480.webp +0 -0
  415. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-768.webp +0 -0
  416. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-480.webp +0 -0
  417. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-768.webp +0 -0
  418. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-960.webp +0 -0
  419. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1080.webp +0 -0
  420. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1440.webp +0 -0
  421. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1600.webp +0 -0
  422. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-480.webp +0 -0
  423. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-768.webp +0 -0
  424. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1080.webp +0 -0
  425. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1440.webp +0 -0
  426. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1600.webp +0 -0
  427. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-480.webp +0 -0
  428. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-768.webp +0 -0
  429. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1080.webp +0 -0
  430. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1440.webp +0 -0
  431. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1600.webp +0 -0
  432. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-480.webp +0 -0
  433. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-768.webp +0 -0
  434. package/fixtures/content-model-v2/dist/index.html +0 -8
  435. package/fixtures/content-model-v2/node_modules/.vite/deps/_metadata.json +0 -80
  436. package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
  437. package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
  438. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  439. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  440. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  441. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  442. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  443. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  444. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  445. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  446. package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
  447. package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
  448. package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js +0 -1389
  449. package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js.map +0 -1
  450. package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
  451. package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
  452. package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
  453. package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
  454. package/fixtures/content-model-v2/node_modules/.vite/deps/package.json +0 -3
  455. package/fixtures/content-model-v2/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  456. package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
  457. package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
  458. package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
  459. package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
  460. package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
  461. package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
  462. package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
  463. package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
  464. package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
  465. package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
  466. package/fixtures/content-model-v2/site/.norna/generated-images.json +0 -210
  467. package/fixtures/content-model-v2/site/config.yaml +0 -1
  468. package/fixtures/content-model-v2/site/content.md +0 -79
  469. package/fixtures/content-model-v2/site/images/adopt.svg +0 -9
  470. package/fixtures/content-model-v2/site/images/detail.jpg +0 -0
  471. package/fixtures/content-model-v2/site/images/duplicate.jpg +0 -0
  472. package/fixtures/content-model-v2/site/images/foster.svg +0 -12
  473. package/fixtures/content-model-v2/site/images/hero.jpg +0 -0
  474. package/fixtures/content-model-v2/site/images/image.jpg +0 -0
  475. package/fixtures/content-model-v2/site/images/slide-one.jpg +0 -0
  476. package/fixtures/content-model-v2/site/images/slide-three.jpg +0 -0
  477. package/fixtures/content-model-v2/site/images/slide-two.jpg +0 -0
  478. package/fixtures/content-model-v2/site/pages/010-guide/content.md +0 -18
  479. package/fixtures/content-model-v2/site/pages/010-guide/images/duplicate.jpg +0 -0
  480. package/fixtures/content-model-v2/site/theme.yaml +0 -4
  481. package/fixtures/nested-pages/site/.norna/generated-images.json +0 -10
  482. package/fixtures/nested-pages/site/config.yaml +0 -1
  483. package/fixtures/nested-pages/site/content.md +0 -15
  484. package/fixtures/nested-pages/site/pages/010-guides/content.md +0 -15
  485. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/content.md +0 -21
  486. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/images/diagram.svg +0 -21
  487. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +0 -14
  488. package/fixtures/nested-pages/site/pages/010-guides/pages/020-workflows/content.md +0 -11
  489. package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +0 -3
  490. package/fixtures/nested-pages/site/pages/020-reference/content.md +0 -10
  491. package/fixtures/nested-pages/site/pages/020-reference/pages/010-installation/content.md +0 -11
  492. package/fixtures/nested-pages/site/theme.yaml +0 -3
  493. package/scripts/build-pages.mjs +0 -69
  494. package/scripts/lib/example-sites.mjs +0 -37
  495. package/scripts/lib/frontmatter-yaml.mjs +0 -113
  496. package/scripts/lib/git-status.mjs +0 -7
  497. package/scripts/release.mjs +0 -153
  498. package/scripts/test-banner-visibility.mjs +0 -80
  499. package/scripts/test-ci-lockfile.mjs +0 -65
  500. package/scripts/test-cli-discovery.mjs +0 -124
  501. package/scripts/test-client-javascript.mjs +0 -218
  502. package/scripts/test-content-check.mjs +0 -621
  503. package/scripts/test-content-model-v2.mjs +0 -1629
  504. package/scripts/test-documentation.mjs +0 -187
  505. package/scripts/test-editor-language-service.mjs +0 -302
  506. package/scripts/test-engine-commands.mjs +0 -204
  507. package/scripts/test-examples.mjs +0 -24
  508. package/scripts/test-heading-ids.mjs +0 -68
  509. package/scripts/test-navigation-model.mjs +0 -63
  510. package/scripts/test-navigation-preview.mjs +0 -108
  511. package/scripts/test-navigation.mjs +0 -148
  512. package/scripts/test-nested-pages.mjs +0 -110
  513. package/scripts/test-package-check.mjs +0 -531
  514. package/scripts/test-page-model.mjs +0 -80
  515. package/scripts/test-project-config.mjs +0 -144
  516. package/scripts/test-schemas.mjs +0 -154
  517. package/scripts/test-site-public.mjs +0 -85
  518. package/scripts/test-theme-presets.mjs +0 -182
  519. package/src/components/SiteNotesScript.astro +0 -43
  520. package/starters/basic/site/images/.gitkeep +0 -1
  521. package/starters/project/.github/workflows/deploy.yml +0 -64
  522. package/starters/project/README.md +0 -84
  523. package/starters/project/package-lock.json +0 -4296
  524. package/starters/project/package.json +0 -37
  525. package/starters/project/site/config.yaml +0 -1
  526. package/starters/project/site/content.md +0 -119
  527. package/starters/project/site/pages/010-guide/content.md +0 -80
  528. package/starters/project/site/public/robots.txt +0 -2
  529. package/starters/project/site/sitewide-content.yaml +0 -3
  530. package/starters/project/site/theme.yaml +0 -31
  531. package/tsconfig.json +0 -5
  532. /package/starters/basic/site/{content.md → pages/000-home/content.md} +0 -0
  533. /package/{fixtures/basic/site → starters/basic/site/pages/000-home}/images/.gitkeep +0 -0
@@ -1,73 +1,451 @@
1
1
  import {
2
+ assertTypographyContract,
2
3
  defaultTypography,
3
4
  resolveTypographyConfig,
4
5
  } from './typography.mjs';
6
+ import {
7
+ assertPaletteModeContract,
8
+ createSemanticColorRoles,
9
+ deriveSecondaryTextColor,
10
+ } from './presentation-contract.mjs';
11
+ import { presentationPaletteNames } from './presentation-palette-metadata.mjs';
5
12
  import { resolveThemeConfig } from './theme-presets.mjs';
6
13
 
7
- export const presentationPaletteNames = ['dark', 'light', 'paper'];
8
- const sectionSurfaceNames = ['base', 'soft', 'emphasis'];
14
+ export { presentationPaletteNames };
15
+ export const colorModeNames = ['system', 'light', 'dark'];
16
+ const sectionBackgroundPatterns = Object.freeze({
17
+ uniform: ['base'],
18
+ alternating: ['base', 'soft'],
19
+ accented: ['base', 'soft', 'emphasis', 'soft'],
20
+ });
21
+
22
+ const createPaletteMode = ({ appearance, page, surfaces, frame, css }) => {
23
+ const resolvedSurfaces = Object.fromEntries(Object.entries(surfaces).map(([name, surface]) => [
24
+ name,
25
+ Object.freeze({
26
+ ...surface,
27
+ secondaryTextColor: deriveSecondaryTextColor(surface.textColor, surface.backgroundColor),
28
+ }),
29
+ ]));
30
+
31
+ return Object.freeze({
32
+ page: Object.freeze(page),
33
+ surfaces: Object.freeze(resolvedSurfaces),
34
+ frame: Object.freeze(frame),
35
+ css: Object.freeze(css),
36
+ semantic: createSemanticColorRoles({
37
+ appearance,
38
+ page,
39
+ secondaryText: css.muted,
40
+ linkText: css.accent,
41
+ }),
42
+ });
43
+ };
9
44
 
10
45
  const presentationPalettes = Object.freeze({
11
- dark: {
12
- colorScheme: 'dark',
13
- page: { backgroundColor: '#000000', textColor: '#f2eee6' },
14
- surfaces: {
15
- base: { backgroundColor: '#000000', textColor: '#f2eee6' },
16
- soft: { backgroundColor: '#171717', textColor: '#f2eee6' },
17
- emphasis: { backgroundColor: '#252525', textColor: '#f2eee6' },
18
- },
19
- frame: { backgroundColor: '#000000', textColor: '#f2eee6' },
20
- css: {
21
- surface: '#101010',
22
- muted: '#aaa49a',
23
- soft: '#302f2c',
24
- accent: '#d8d2c8',
25
- border: 'rgb(255 255 255 / 14%)',
26
- navBackground: 'rgb(0 0 0 / 90%)',
27
- navSeparator: 'rgb(255 255 255 / 28%)',
28
- },
29
- },
30
- light: {
31
- colorScheme: 'light',
32
- page: { backgroundColor: '#ffffff', textColor: '#17201d' },
33
- surfaces: {
34
- base: { backgroundColor: '#ffffff', textColor: '#17201d' },
35
- soft: { backgroundColor: '#f1f4f2', textColor: '#17201d' },
36
- emphasis: { backgroundColor: '#dde7e1', textColor: '#17201d' },
37
- },
38
- frame: { backgroundColor: '#ffffff', textColor: '#17201d' },
39
- css: {
40
- surface: '#f7f8f7',
41
- muted: '#5e655f',
42
- soft: '#d9dfda',
43
- accent: '#38645a',
44
- border: 'rgb(0 0 0 / 14%)',
45
- navBackground: 'rgb(255 255 255 / 92%)',
46
- navSeparator: 'rgb(0 0 0 / 20%)',
47
- },
48
- },
49
- paper: {
50
- colorScheme: 'light',
51
- page: { backgroundColor: '#f8f5ee', textColor: '#272522' },
52
- surfaces: {
53
- base: { backgroundColor: '#f8f5ee', textColor: '#272522' },
54
- soft: { backgroundColor: '#ebe5d9', textColor: '#272522' },
55
- emphasis: { backgroundColor: '#ded4c5', textColor: '#272522' },
56
- },
57
- frame: { backgroundColor: '#f8f5ee', textColor: '#272522' },
58
- css: {
59
- surface: '#f0ebe1',
60
- muted: '#746e63',
61
- soft: '#d8d0c4',
62
- accent: '#685a43',
63
- border: 'rgb(39 37 34 / 18%)',
64
- navBackground: 'rgb(248 245 238 / 92%)',
65
- navSeparator: 'rgb(39 37 34 / 24%)',
66
- },
67
- },
46
+ 'near-monochrome': Object.freeze({
47
+ defaultMode: 'dark',
48
+ modes: Object.freeze({
49
+ light: createPaletteMode({
50
+ appearance: 'light',
51
+ page: { backgroundColor: '#f7f7f5', textColor: '#171717' },
52
+ surfaces: {
53
+ base: { backgroundColor: '#f7f7f5', textColor: '#171717' },
54
+ soft: { backgroundColor: '#ececea', textColor: '#171717' },
55
+ emphasis: { backgroundColor: '#dadad6', textColor: '#171717' },
56
+ },
57
+ frame: { backgroundColor: '#f7f7f5', textColor: '#171717' },
58
+ css: {
59
+ surface: '#eeeeeb',
60
+ muted: '#666660',
61
+ soft: '#d8d8d3',
62
+ accent: '#4b4b46',
63
+ border: 'rgb(23 23 23 / 16%)',
64
+ navBackground: 'rgb(247 247 245 / 92%)',
65
+ navSeparator: 'rgb(23 23 23 / 24%)',
66
+ },
67
+ }),
68
+ dark: createPaletteMode({
69
+ appearance: 'dark',
70
+ page: { backgroundColor: '#000000', textColor: '#f2eee6' },
71
+ surfaces: {
72
+ base: { backgroundColor: '#000000', textColor: '#f2eee6' },
73
+ soft: { backgroundColor: '#171717', textColor: '#f2eee6' },
74
+ emphasis: { backgroundColor: '#252525', textColor: '#f2eee6' },
75
+ },
76
+ frame: { backgroundColor: '#000000', textColor: '#f2eee6' },
77
+ css: {
78
+ surface: '#101010',
79
+ muted: '#aaa49a',
80
+ soft: '#302f2c',
81
+ accent: '#d8d2c8',
82
+ border: 'rgb(255 255 255 / 14%)',
83
+ navBackground: 'rgb(0 0 0 / 90%)',
84
+ navSeparator: 'rgb(255 255 255 / 28%)',
85
+ },
86
+ }),
87
+ }),
88
+ }),
89
+ 'arctic-blue': Object.freeze({
90
+ defaultMode: 'light',
91
+ modes: Object.freeze({
92
+ light: createPaletteMode({
93
+ appearance: 'light',
94
+ page: { backgroundColor: '#f3f6f8', textColor: '#202932' },
95
+ surfaces: {
96
+ base: { backgroundColor: '#f3f6f8', textColor: '#202932' },
97
+ soft: { backgroundColor: '#e4eaf0', textColor: '#202932' },
98
+ emphasis: { backgroundColor: '#d3dee8', textColor: '#202932' },
99
+ },
100
+ frame: { backgroundColor: '#f3f6f8', textColor: '#202932' },
101
+ css: {
102
+ surface: '#e9eef2',
103
+ muted: '#5d6a76',
104
+ soft: '#d5dfe7',
105
+ accent: '#2a5877',
106
+ border: 'rgb(32 41 50 / 16%)',
107
+ navBackground: 'rgb(243 246 248 / 92%)',
108
+ navSeparator: 'rgb(32 41 50 / 24%)',
109
+ },
110
+ }),
111
+ dark: createPaletteMode({
112
+ appearance: 'dark',
113
+ page: { backgroundColor: '#17202a', textColor: '#edf3f7' },
114
+ surfaces: {
115
+ base: { backgroundColor: '#17202a', textColor: '#edf3f7' },
116
+ soft: { backgroundColor: '#202c38', textColor: '#edf3f7' },
117
+ emphasis: { backgroundColor: '#2b3c4b', textColor: '#edf3f7' },
118
+ },
119
+ frame: { backgroundColor: '#17202a', textColor: '#edf3f7' },
120
+ css: {
121
+ surface: '#1d2833',
122
+ muted: '#b2bec8',
123
+ soft: '#354655',
124
+ accent: '#9bc5de',
125
+ border: 'rgb(237 243 247 / 16%)',
126
+ navBackground: 'rgb(23 32 42 / 92%)',
127
+ navSeparator: 'rgb(237 243 247 / 28%)',
128
+ },
129
+ }),
130
+ }),
131
+ }),
132
+ 'mineral-teal': Object.freeze({
133
+ defaultMode: 'light',
134
+ modes: Object.freeze({
135
+ light: createPaletteMode({
136
+ appearance: 'light',
137
+ page: { backgroundColor: '#eef4f1', textColor: '#203631' },
138
+ surfaces: {
139
+ base: { backgroundColor: '#eef4f1', textColor: '#203631' },
140
+ soft: { backgroundColor: '#dce9e4', textColor: '#203631' },
141
+ emphasis: { backgroundColor: '#c8ddd5', textColor: '#203631' },
142
+ },
143
+ frame: { backgroundColor: '#eef4f1', textColor: '#203631' },
144
+ css: {
145
+ surface: '#e3ece8',
146
+ muted: '#536560',
147
+ soft: '#cfdfd9',
148
+ accent: '#155f5a',
149
+ border: 'rgb(32 54 49 / 17%)',
150
+ navBackground: 'rgb(238 244 241 / 92%)',
151
+ navSeparator: 'rgb(32 54 49 / 24%)',
152
+ },
153
+ }),
154
+ dark: createPaletteMode({
155
+ appearance: 'dark',
156
+ page: { backgroundColor: '#102d2c', textColor: '#edf5f1' },
157
+ surfaces: {
158
+ base: { backgroundColor: '#102d2c', textColor: '#edf5f1' },
159
+ soft: { backgroundColor: '#173a37', textColor: '#edf5f1' },
160
+ emphasis: { backgroundColor: '#24504a', textColor: '#edf5f1' },
161
+ },
162
+ frame: { backgroundColor: '#102d2c', textColor: '#edf5f1' },
163
+ css: {
164
+ surface: '#153633',
165
+ muted: '#b2c5bf',
166
+ soft: '#2c554f',
167
+ accent: '#8bd5ca',
168
+ border: 'rgb(237 245 241 / 16%)',
169
+ navBackground: 'rgb(16 45 44 / 92%)',
170
+ navSeparator: 'rgb(237 245 241 / 28%)',
171
+ },
172
+ }),
173
+ }),
174
+ }),
175
+ 'soft-lavender': Object.freeze({
176
+ defaultMode: 'light',
177
+ modes: Object.freeze({
178
+ light: createPaletteMode({
179
+ appearance: 'light',
180
+ page: { backgroundColor: '#f7f3fa', textColor: '#2e2736' },
181
+ surfaces: {
182
+ base: { backgroundColor: '#f7f3fa', textColor: '#2e2736' },
183
+ soft: { backgroundColor: '#ebe4f1', textColor: '#2e2736' },
184
+ emphasis: { backgroundColor: '#ddd3e8', textColor: '#2e2736' },
185
+ },
186
+ frame: { backgroundColor: '#f7f3fa', textColor: '#2e2736' },
187
+ css: {
188
+ surface: '#eee8f3',
189
+ muted: '#6c6273',
190
+ soft: '#ded5e7',
191
+ accent: '#604678',
192
+ border: 'rgb(46 39 54 / 16%)',
193
+ navBackground: 'rgb(247 243 250 / 92%)',
194
+ navSeparator: 'rgb(46 39 54 / 24%)',
195
+ },
196
+ }),
197
+ dark: createPaletteMode({
198
+ appearance: 'dark',
199
+ page: { backgroundColor: '#251f2e', textColor: '#f4edf8' },
200
+ surfaces: {
201
+ base: { backgroundColor: '#251f2e', textColor: '#f4edf8' },
202
+ soft: { backgroundColor: '#31283d', textColor: '#f4edf8' },
203
+ emphasis: { backgroundColor: '#42344f', textColor: '#f4edf8' },
204
+ },
205
+ frame: { backgroundColor: '#251f2e', textColor: '#f4edf8' },
206
+ css: {
207
+ surface: '#2d2538',
208
+ muted: '#c1b4c7',
209
+ soft: '#4b3d57',
210
+ accent: '#d4b7e3',
211
+ border: 'rgb(244 237 248 / 16%)',
212
+ navBackground: 'rgb(37 31 46 / 92%)',
213
+ navSeparator: 'rgb(244 237 248 / 28%)',
214
+ },
215
+ }),
216
+ }),
217
+ }),
218
+ 'warm-paper': Object.freeze({
219
+ defaultMode: 'light',
220
+ modes: Object.freeze({
221
+ light: createPaletteMode({
222
+ appearance: 'light',
223
+ page: { backgroundColor: '#f8f5ee', textColor: '#272522' },
224
+ surfaces: {
225
+ base: { backgroundColor: '#f8f5ee', textColor: '#272522' },
226
+ soft: { backgroundColor: '#ebe5d9', textColor: '#272522' },
227
+ emphasis: { backgroundColor: '#ded4c5', textColor: '#272522' },
228
+ },
229
+ frame: { backgroundColor: '#f8f5ee', textColor: '#272522' },
230
+ css: {
231
+ surface: '#f0ebe1',
232
+ muted: '#6b655b',
233
+ soft: '#d8d0c4',
234
+ accent: '#5f513c',
235
+ border: 'rgb(39 37 34 / 18%)',
236
+ navBackground: 'rgb(248 245 238 / 92%)',
237
+ navSeparator: 'rgb(39 37 34 / 24%)',
238
+ },
239
+ }),
240
+ dark: createPaletteMode({
241
+ appearance: 'dark',
242
+ page: { backgroundColor: '#1b1916', textColor: '#f3ede2' },
243
+ surfaces: {
244
+ base: { backgroundColor: '#1b1916', textColor: '#f3ede2' },
245
+ soft: { backgroundColor: '#25211c', textColor: '#f3ede2' },
246
+ emphasis: { backgroundColor: '#342d25', textColor: '#f3ede2' },
247
+ },
248
+ frame: { backgroundColor: '#1b1916', textColor: '#f3ede2' },
249
+ css: {
250
+ surface: '#211e1a',
251
+ muted: '#b9ad9c',
252
+ soft: '#3b342b',
253
+ accent: '#d5bea0',
254
+ border: 'rgb(243 237 226 / 16%)',
255
+ navBackground: 'rgb(27 25 22 / 92%)',
256
+ navSeparator: 'rgb(243 237 226 / 26%)',
257
+ },
258
+ }),
259
+ }),
260
+ }),
261
+ 'retro-earth': Object.freeze({
262
+ defaultMode: 'light',
263
+ modes: Object.freeze({
264
+ light: createPaletteMode({
265
+ appearance: 'light',
266
+ page: { backgroundColor: '#f7efd9', textColor: '#34291c' },
267
+ surfaces: {
268
+ base: { backgroundColor: '#f7efd9', textColor: '#34291c' },
269
+ soft: { backgroundColor: '#eadbb8', textColor: '#34291c' },
270
+ emphasis: { backgroundColor: '#d8c18c', textColor: '#34291c' },
271
+ },
272
+ frame: { backgroundColor: '#f7efd9', textColor: '#34291c' },
273
+ css: {
274
+ surface: '#efe2c4',
275
+ muted: '#6c5e4c',
276
+ soft: '#deca9c',
277
+ accent: '#5e4514',
278
+ border: 'rgb(52 41 28 / 18%)',
279
+ navBackground: 'rgb(247 239 217 / 92%)',
280
+ navSeparator: 'rgb(52 41 28 / 25%)',
281
+ },
282
+ }),
283
+ dark: createPaletteMode({
284
+ appearance: 'dark',
285
+ page: { backgroundColor: '#282117', textColor: '#f5e8c9' },
286
+ surfaces: {
287
+ base: { backgroundColor: '#282117', textColor: '#f5e8c9' },
288
+ soft: { backgroundColor: '#382c1e', textColor: '#f5e8c9' },
289
+ emphasis: { backgroundColor: '#4b3a24', textColor: '#f5e8c9' },
290
+ },
291
+ frame: { backgroundColor: '#282117', textColor: '#f5e8c9' },
292
+ css: {
293
+ surface: '#33291c',
294
+ muted: '#c6b796',
295
+ soft: '#54422a',
296
+ accent: '#e5c36c',
297
+ border: 'rgb(245 232 201 / 16%)',
298
+ navBackground: 'rgb(40 33 23 / 92%)',
299
+ navSeparator: 'rgb(245 232 201 / 28%)',
300
+ },
301
+ }),
302
+ }),
303
+ }),
304
+ 'clay-rose': Object.freeze({
305
+ defaultMode: 'light',
306
+ modes: Object.freeze({
307
+ light: createPaletteMode({
308
+ appearance: 'light',
309
+ page: { backgroundColor: '#f7efed', textColor: '#3c2929' },
310
+ surfaces: {
311
+ base: { backgroundColor: '#f7efed', textColor: '#3c2929' },
312
+ soft: { backgroundColor: '#ecdeda', textColor: '#3c2929' },
313
+ emphasis: { backgroundColor: '#ddc7c1', textColor: '#3c2929' },
314
+ },
315
+ frame: { backgroundColor: '#f7efed', textColor: '#3c2929' },
316
+ css: {
317
+ surface: '#f0e3e0',
318
+ muted: '#6d5558',
319
+ soft: '#e2cfca',
320
+ accent: '#71313d',
321
+ border: 'rgb(60 41 41 / 17%)',
322
+ navBackground: 'rgb(247 239 237 / 92%)',
323
+ navSeparator: 'rgb(60 41 41 / 25%)',
324
+ },
325
+ }),
326
+ dark: createPaletteMode({
327
+ appearance: 'dark',
328
+ page: { backgroundColor: '#2d1e22', textColor: '#f7ebeb' },
329
+ surfaces: {
330
+ base: { backgroundColor: '#2d1e22', textColor: '#f7ebeb' },
331
+ soft: { backgroundColor: '#3b282e', textColor: '#f7ebeb' },
332
+ emphasis: { backgroundColor: '#50343d', textColor: '#f7ebeb' },
333
+ },
334
+ frame: { backgroundColor: '#2d1e22', textColor: '#f7ebeb' },
335
+ css: {
336
+ surface: '#36252a',
337
+ muted: '#c8b3b7',
338
+ soft: '#58404a',
339
+ accent: '#e6a7b0',
340
+ border: 'rgb(247 235 235 / 16%)',
341
+ navBackground: 'rgb(45 30 34 / 92%)',
342
+ navSeparator: 'rgb(247 235 235 / 28%)',
343
+ },
344
+ }),
345
+ }),
346
+ }),
347
+ 'forest-moss': Object.freeze({
348
+ defaultMode: 'light',
349
+ modes: Object.freeze({
350
+ light: createPaletteMode({
351
+ appearance: 'light',
352
+ page: { backgroundColor: '#f1f3e8', textColor: '#263225' },
353
+ surfaces: {
354
+ base: { backgroundColor: '#f1f3e8', textColor: '#263225' },
355
+ soft: { backgroundColor: '#e1e6d2', textColor: '#263225' },
356
+ emphasis: { backgroundColor: '#cbd5b7', textColor: '#263225' },
357
+ },
358
+ frame: { backgroundColor: '#f1f3e8', textColor: '#263225' },
359
+ css: {
360
+ surface: '#e7eadb',
361
+ muted: '#52604c',
362
+ soft: '#d5ddc5',
363
+ accent: '#324e25',
364
+ border: 'rgb(38 50 37 / 17%)',
365
+ navBackground: 'rgb(241 243 232 / 92%)',
366
+ navSeparator: 'rgb(38 50 37 / 24%)',
367
+ },
368
+ }),
369
+ dark: createPaletteMode({
370
+ appearance: 'dark',
371
+ page: { backgroundColor: '#172218', textColor: '#eef2e6' },
372
+ surfaces: {
373
+ base: { backgroundColor: '#172218', textColor: '#eef2e6' },
374
+ soft: { backgroundColor: '#213022', textColor: '#eef2e6' },
375
+ emphasis: { backgroundColor: '#314531', textColor: '#eef2e6' },
376
+ },
377
+ frame: { backgroundColor: '#172218', textColor: '#eef2e6' },
378
+ css: {
379
+ surface: '#1d2a1e',
380
+ muted: '#b8c3af',
381
+ soft: '#394c37',
382
+ accent: '#add493',
383
+ border: 'rgb(238 242 230 / 16%)',
384
+ navBackground: 'rgb(23 34 24 / 92%)',
385
+ navSeparator: 'rgb(238 242 230 / 28%)',
386
+ },
387
+ }),
388
+ }),
389
+ }),
390
+ 'vivid-night': Object.freeze({
391
+ defaultMode: 'dark',
392
+ modes: Object.freeze({
393
+ light: createPaletteMode({
394
+ appearance: 'light',
395
+ page: { backgroundColor: '#f2f4fb', textColor: '#25243a' },
396
+ surfaces: {
397
+ base: { backgroundColor: '#f2f4fb', textColor: '#25243a' },
398
+ soft: { backgroundColor: '#e2e6f3', textColor: '#25243a' },
399
+ emphasis: { backgroundColor: '#d0d7eb', textColor: '#25243a' },
400
+ },
401
+ frame: { backgroundColor: '#f2f4fb', textColor: '#25243a' },
402
+ css: {
403
+ surface: '#e8eaf5',
404
+ muted: '#62647a',
405
+ soft: '#d5daec',
406
+ accent: '#3b568f',
407
+ border: 'rgb(37 36 58 / 16%)',
408
+ navBackground: 'rgb(242 244 251 / 92%)',
409
+ navSeparator: 'rgb(37 36 58 / 24%)',
410
+ },
411
+ }),
412
+ dark: createPaletteMode({
413
+ appearance: 'dark',
414
+ page: { backgroundColor: '#1d1b2d', textColor: '#f4f1ff' },
415
+ surfaces: {
416
+ base: { backgroundColor: '#1d1b2d', textColor: '#f4f1ff' },
417
+ soft: { backgroundColor: '#29263d', textColor: '#f4f1ff' },
418
+ emphasis: { backgroundColor: '#38334f', textColor: '#f4f1ff' },
419
+ },
420
+ frame: { backgroundColor: '#1d1b2d', textColor: '#f4f1ff' },
421
+ css: {
422
+ surface: '#252238',
423
+ muted: '#bbb7cc',
424
+ soft: '#403a58',
425
+ accent: '#9fe4e8',
426
+ border: 'rgb(244 241 255 / 16%)',
427
+ navBackground: 'rgb(29 27 45 / 92%)',
428
+ navSeparator: 'rgb(244 241 255 / 28%)',
429
+ },
430
+ }),
431
+ }),
432
+ }),
68
433
  });
69
434
 
70
- export const getPresentationPalette = (paletteName = 'dark') => {
435
+ const implementedPaletteNames = Object.keys(presentationPalettes);
436
+ const missingPaletteNames = presentationPaletteNames.filter((name) => !implementedPaletteNames.includes(name));
437
+ const unexpectedPaletteNames = implementedPaletteNames.filter((name) => !presentationPaletteNames.includes(name));
438
+ if (missingPaletteNames.length > 0 || unexpectedPaletteNames.length > 0) {
439
+ throw new Error(`Palette metadata and implementations differ. Missing: ${missingPaletteNames.join(', ') || '(none)'}. Unexpected: ${unexpectedPaletteNames.join(', ') || '(none)'}.`);
440
+ }
441
+
442
+ for (const [paletteName, palette] of Object.entries(presentationPalettes)) {
443
+ for (const [modeName, mode] of Object.entries(palette.modes)) {
444
+ assertPaletteModeContract(paletteName, modeName, mode);
445
+ }
446
+ }
447
+
448
+ export const getPresentationPalette = (paletteName = 'near-monochrome') => {
71
449
  const palette = presentationPalettes[paletteName];
72
450
  if (!palette) {
73
451
  throw new Error(`Unknown presentation palette: ${paletteName}. Use one of: ${presentationPaletteNames.join(', ')}`);
@@ -77,65 +455,142 @@ export const getPresentationPalette = (paletteName = 'dark') => {
77
455
  };
78
456
 
79
457
  export const getPresentationCssVariables = (presentation) => {
80
- const { palette } = presentation;
81
- return {
82
- '--color-page': palette.page.backgroundColor,
83
- '--color-text': palette.page.textColor,
84
- '--color-surface': palette.css.surface,
85
- '--color-muted': palette.css.muted,
86
- '--color-soft': palette.css.soft,
87
- '--color-accent': palette.css.accent,
88
- '--color-border': palette.css.border,
89
- '--color-nav-background': palette.css.navBackground,
90
- '--color-nav-separator': palette.css.navSeparator,
91
- '--color-scheme': palette.colorScheme,
92
- };
93
- };
94
-
95
- const getSectionSurfaces = (value = ['base'], sourceLabel = 'theme.yaml') => {
96
- if (!Array.isArray(value) || value.length < 1 || value.length > 3) {
97
- throw new Error(`sectionSurfaces must contain one to three values in ${sourceLabel}.`);
98
- }
99
-
100
- for (const surface of value) {
101
- if (!sectionSurfaceNames.includes(surface)) {
102
- throw new Error(`Unknown section surface "${surface}" in ${sourceLabel}. Use one of: ${sectionSurfaceNames.join(', ')}.`);
458
+ const variables = {};
459
+ for (const [modeName, palette] of Object.entries(presentation.paletteModes)) {
460
+ const prefix = `--palette-${modeName}`;
461
+ variables[`${prefix}-page-background`] = palette.page.backgroundColor;
462
+ variables[`${prefix}-page-text`] = palette.page.textColor;
463
+ variables[`${prefix}-frame-background`] = palette.frame.backgroundColor;
464
+ variables[`${prefix}-frame-text`] = palette.frame.textColor;
465
+ for (const [surfaceName, surface] of Object.entries(palette.surfaces)) {
466
+ variables[`${prefix}-surface-${surfaceName}-background`] = surface.backgroundColor;
467
+ variables[`${prefix}-surface-${surfaceName}-text`] = surface.textColor;
468
+ variables[`${prefix}-surface-${surfaceName}-secondary-text`] = surface.secondaryTextColor;
469
+ }
470
+ for (const [name, value] of Object.entries(palette.css)) {
471
+ const cssName = name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
472
+ variables[`${prefix}-${cssName}`] = value;
473
+ }
474
+ for (const [name, value] of Object.entries(palette.semantic)) {
475
+ const cssName = name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
476
+ variables[`${prefix}-${cssName}`] = value;
103
477
  }
104
478
  }
105
479
 
106
- if (new Set(value).size !== value.length) {
107
- throw new Error(`Each section surface may appear only once in ${sourceLabel}.`);
480
+ return variables;
481
+ };
482
+
483
+ const getSectionSurfaces = (pattern = 'uniform', sourceLabel = 'theme.yaml') => {
484
+ const surfaces = sectionBackgroundPatterns[pattern];
485
+ if (!surfaces) {
486
+ throw new Error(`sections.backgroundPattern must be one of ${Object.keys(sectionBackgroundPatterns).join(', ')} in ${sourceLabel}.`);
108
487
  }
109
488
 
110
- return value;
489
+ return surfaces;
111
490
  };
112
491
 
113
492
  export const resolveThemePresentation = (theme, sourceLabel = 'theme.yaml') => {
114
493
  const normalizedTheme = resolveThemeConfig(theme, sourceLabel);
115
- const paletteName = normalizedTheme.palette ?? 'dark';
494
+ const paletteName = normalizedTheme.palette ?? 'near-monochrome';
116
495
  const palette = getPresentationPalette(paletteName);
496
+ const colorMode = normalizedTheme.colorMode ?? {};
497
+ const readerControls = normalizedTheme.readerControls ?? {};
498
+ const defaultColorMode = colorMode.default ?? palette.defaultMode;
499
+ if (!colorModeNames.includes(defaultColorMode)) {
500
+ throw new Error(`colorMode.default must be one of ${colorModeNames.join(', ')} in ${sourceLabel}.`);
501
+ }
502
+ const typography = resolveTypographyConfig(normalizedTheme.typography ?? defaultTypography, sourceLabel);
503
+ const textWidth = normalizedTheme.layout?.textWidth;
504
+ if (textWidth !== undefined) {
505
+ typography.values.body.width = textWidth;
506
+ }
507
+ assertTypographyContract(typography, sourceLabel);
117
508
 
118
509
  return {
119
510
  paletteName,
120
- palette,
121
- sectionSurfaces: getSectionSurfaces(normalizedTheme.sectionSurfaces, sourceLabel),
122
- typography: resolveTypographyConfig(normalizedTheme.typography ?? defaultTypography),
511
+ palette: palette.modes[defaultColorMode === 'dark' ? 'dark' : 'light'],
512
+ paletteModes: palette.modes,
513
+ colorMode: {
514
+ default: defaultColorMode,
515
+ },
516
+ readerPreferences: {
517
+ controls: {
518
+ appearance: readerControls.colorMode === true,
519
+ readingWidth: true,
520
+ focusReading: readerControls.focusReading === true,
521
+ },
522
+ defaults: {
523
+ appearance: defaultColorMode,
524
+ readingWidth: textWidth === 'narrow' ? 'narrow' : textWidth === 'wide' ? 'wide' : 'standard',
525
+ focusReading: 'off',
526
+ },
527
+ },
528
+ blocks: {
529
+ cardList: {
530
+ width: normalizedTheme.blocks?.cardList?.width ?? 'normal',
531
+ },
532
+ },
533
+ sectionSurfaces: getSectionSurfaces(normalizedTheme.sections?.backgroundPattern, sourceLabel),
534
+ typography,
123
535
  };
124
536
  };
125
537
 
126
- export const resolvePagePresentation = (theme, sourceLabel) => {
538
+ export const assertSectionBackgroundPatternCompatibility = (
539
+ theme,
540
+ sourceLabel = 'theme.yaml',
541
+ navigationMode = 'sections',
542
+ ) => {
543
+ const requestedPattern = theme?.sections?.backgroundPattern;
544
+ if (navigationMode === 'tree' && requestedPattern !== undefined && requestedPattern !== 'uniform') {
545
+ throw new Error([
546
+ `sections.backgroundPattern "${requestedPattern}" cannot be used with tree navigation in ${sourceLabel}.`,
547
+ 'Tree navigation uses one uniform reading surface so the navigation rail and page content remain distinct.',
548
+ 'Remove sections.backgroundPattern or set it to uniform.',
549
+ ].join('\n'));
550
+ }
551
+ };
552
+
553
+ export const resolvePagePresentation = (theme, sourceLabel, { navigationMode = 'sections' } = {}) => {
554
+ assertSectionBackgroundPatternCompatibility(theme, sourceLabel, navigationMode);
555
+
127
556
  const resolvedThemePresentation = resolveThemePresentation(theme, sourceLabel);
557
+ if (navigationMode === 'tree') {
558
+ return {
559
+ ...resolvedThemePresentation,
560
+ readerPreferences: {
561
+ ...resolvedThemePresentation.readerPreferences,
562
+ controls: {
563
+ ...resolvedThemePresentation.readerPreferences.controls,
564
+ focusReading: true,
565
+ },
566
+ },
567
+ sectionSurfaces: getSectionSurfaces('uniform', sourceLabel),
568
+ };
569
+ }
128
570
 
129
571
  return resolvedThemePresentation;
130
572
  };
131
573
 
574
+ const textWidthCssValues = Object.freeze({
575
+ narrow: 'min(60ch, var(--text-width))',
576
+ normal: 'min(72ch, var(--text-width))',
577
+ wide: 'min(72ch, var(--image-layout-width))',
578
+ });
579
+
580
+ export const getTextWidthCssValue = (textWidth) => textWidthCssValues[textWidth];
581
+
132
582
  export const resolveSectionSurface = (pagePresentation, sectionIndex) => {
133
583
  const surfaceName = pagePresentation.sectionSurfaces[sectionIndex % pagePresentation.sectionSurfaces.length];
134
584
 
135
585
  return {
136
586
  name: surfaceName,
137
- ...pagePresentation.palette.surfaces[surfaceName],
587
+ backgroundColor: `var(--color-surface-${surfaceName}-background)`,
588
+ textColor: `var(--color-surface-${surfaceName}-text)`,
589
+ secondaryTextColor: `var(--color-surface-${surfaceName}-secondary-text)`,
138
590
  };
139
591
  };
140
592
 
141
- export const resolveFrameColors = ({ theme, sourceLabel }) => resolveThemePresentation(theme, sourceLabel).palette.frame;
593
+ export const resolveFrameColors = () => ({
594
+ backgroundColor: 'var(--color-frame-background)',
595
+ textColor: 'var(--color-frame-text)',
596
+ });