@janga/norna 0.7.18 → 0.7.23

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 (615) hide show
  1. package/README.md +22 -12
  2. package/astro.config.mjs +25 -0
  3. package/bin/norna-cli.mjs +8 -2
  4. package/package.json +60 -13
  5. package/schemas/category.schema.json +20 -0
  6. package/schemas/config.schema.json +22 -14
  7. package/schemas/content-frontmatter.schema.json +25 -5
  8. package/schemas/manifest.json +2 -1
  9. package/schemas/page-theme.schema.json +58 -30
  10. package/schemas/sitewide-content.schema.json +20 -19
  11. package/schemas/theme.schema.json +542 -243
  12. package/scripts/add-site-node.mjs +251 -0
  13. package/scripts/check-config.mjs +32 -4
  14. package/scripts/deploy-site.mjs +5 -9
  15. package/scripts/dev-local.mjs +175 -112
  16. package/scripts/generate-images.mjs +11 -15
  17. package/scripts/generate-schemas.mjs +4 -1
  18. package/scripts/init-site.mjs +35 -0
  19. package/scripts/lib/astro-command.mjs +14 -9
  20. package/scripts/lib/content-sync-apply.mjs +34 -0
  21. package/scripts/lib/content-sync-plan.mjs +179 -0
  22. package/scripts/lib/editor-language-service.mjs +156 -177
  23. package/scripts/lib/heading-ids.mjs +4 -2
  24. package/scripts/lib/image-presentation.mjs +2 -0
  25. package/scripts/lib/markdown-links.mjs +182 -0
  26. package/scripts/lib/navigation-model.mjs +36 -19
  27. package/scripts/lib/norna-markdown-blocks.mjs +65 -145
  28. package/scripts/lib/norna-markdown-render-plugin.mjs +37 -0
  29. package/scripts/lib/object.mjs +28 -0
  30. package/scripts/lib/page-aliases.mjs +164 -0
  31. package/scripts/lib/page-markdown.mjs +332 -0
  32. package/scripts/lib/presentation-contract.mjs +266 -0
  33. package/scripts/lib/presentation-palette-metadata.mjs +51 -0
  34. package/scripts/lib/presentation.mjs +508 -79
  35. package/scripts/lib/project-config.mjs +78 -10
  36. package/scripts/lib/schema-definitions.mjs +67 -16
  37. package/scripts/lib/schema-editor-metadata.mjs +126 -24
  38. package/scripts/lib/schema-value-definitions.mjs +30 -12
  39. package/scripts/lib/site-content.mjs +46 -239
  40. package/scripts/lib/site-link-graph.mjs +326 -0
  41. package/scripts/lib/site-page-urls.mjs +10 -0
  42. package/scripts/lib/site-paths.mjs +2 -3
  43. package/scripts/lib/site-structure.mjs +189 -0
  44. package/scripts/lib/sitemap.mjs +34 -0
  45. package/scripts/lib/theme-presets.mjs +118 -119
  46. package/scripts/lib/theme-profiles.mjs +223 -0
  47. package/scripts/lib/typography.mjs +220 -35
  48. package/scripts/lib/yaml-config.mjs +50 -6
  49. package/scripts/lib/yaml-indentation.mjs +86 -0
  50. package/scripts/show-typography.mjs +2 -3
  51. package/scripts/sync-content-sections.mjs +158 -244
  52. package/scripts/sync-site-public.mjs +23 -2
  53. package/src/components/CodeBlockCopyScript.astro +92 -0
  54. package/src/components/DisplaySettings.astro +107 -0
  55. package/src/components/ImageCarousel.astro +38 -13
  56. package/src/components/NavigationPageTree.astro +103 -88
  57. package/src/components/PageAliasRedirect.astro +49 -0
  58. package/src/components/PageContentsNavigation.astro +21 -0
  59. package/src/components/SectionNavigationScript.astro +112 -2
  60. package/src/components/SiteBreadcrumbs.astro +15 -12
  61. package/src/components/SiteNavigation.astro +104 -41
  62. package/src/components/SitePage.astro +76 -40
  63. package/src/components/SiteSection.astro +40 -191
  64. package/src/components/SiteTreeNavigation.astro +10 -10
  65. package/src/content.config.ts +5 -2
  66. package/src/layouts/BaseLayout.astro +55 -9
  67. package/src/lib/generatedImages.ts +0 -7
  68. package/src/lib/readerPreferencesScript.mjs +141 -0
  69. package/src/lib/sectionContent.ts +119 -201
  70. package/src/lib/siteNavigation.ts +36 -18
  71. package/src/lib/sitePages.ts +92 -20
  72. package/src/pages/[...slug].astro +35 -8
  73. package/src/styles/content.css +494 -0
  74. package/src/styles/foundations.css +284 -0
  75. package/src/styles/global.css +6 -2047
  76. package/src/styles/media.css +523 -0
  77. package/src/styles/navigation.css +495 -0
  78. package/src/styles/page-layout.css +437 -0
  79. package/src/styles/responsive.css +525 -0
  80. package/starters/basic/README.md +3 -3
  81. package/docs/README.md +0 -137
  82. package/docs/assets/norna-dog-shelter.jpg +0 -0
  83. package/docs/commands.md +0 -189
  84. package/docs/configuration.md +0 -142
  85. package/docs/content.md +0 -351
  86. package/docs/design/command-organization.md +0 -414
  87. package/docs/design/navigation-and-theme-plan.md +0 -186
  88. package/docs/design/norna-diagram-design.md +0 -159
  89. package/docs/design/site-examples-structure.md +0 -119
  90. package/docs/engine-development.md +0 -215
  91. package/docs/getting-started.md +0 -206
  92. package/docs/how-to/embedded-site.md +0 -35
  93. package/docs/images-and-metadata.md +0 -188
  94. package/docs/local-development.md +0 -82
  95. package/docs/pages.md +0 -190
  96. package/docs/public-files.md +0 -118
  97. package/docs/publishing.md +0 -117
  98. package/docs/requirements.md +0 -54
  99. package/docs/site-files.md +0 -152
  100. package/docs/sitewide-content.md +0 -73
  101. package/docs/theme.md +0 -237
  102. package/docs/typography.md +0 -168
  103. package/examples/README.md +0 -49
  104. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +0 -35
  105. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +0 -97
  106. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +0 -852
  107. package/examples/complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs +0 -4
  108. package/examples/complete-sites/dog-shelter-multi-page/.astro/content-modules.mjs +0 -1
  109. package/examples/complete-sites/dog-shelter-multi-page/.astro/content.d.ts +0 -183
  110. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +0 -1
  111. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev-local.json +0 -8
  112. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +0 -13
  113. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +0 -36
  114. package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +0 -5
  115. package/examples/complete-sites/dog-shelter-multi-page/.astro/types.d.ts +0 -2
  116. package/examples/complete-sites/dog-shelter-multi-page/README.md +0 -24
  117. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +0 -74
  118. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
  119. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
  120. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  121. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  122. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  123. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  124. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  125. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  126. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  127. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  128. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
  129. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
  130. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
  131. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
  132. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
  133. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
  134. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/package.json +0 -3
  135. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  136. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
  137. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
  138. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
  139. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
  140. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
  141. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
  142. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
  143. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
  144. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
  145. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
  146. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +0 -98
  147. package/examples/complete-sites/dog-shelter-multi-page/site/config.yaml +0 -1
  148. package/examples/complete-sites/dog-shelter-multi-page/site/pages/000-home/content.md +0 -23
  149. package/examples/complete-sites/dog-shelter-multi-page/site/pages/000-home/images/shelter-dog.jpg +0 -0
  150. package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/content.md +0 -21
  151. package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/images/rex.jpg +0 -0
  152. package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/images/rover.jpg +0 -0
  153. package/examples/complete-sites/dog-shelter-multi-page/site/pages/020-adopt/content.md +0 -22
  154. package/examples/complete-sites/dog-shelter-multi-page/site/pages/020-adopt/images/adoption-dog.jpg +0 -0
  155. package/examples/complete-sites/dog-shelter-multi-page/site/public/favicon.svg +0 -10
  156. package/examples/complete-sites/dog-shelter-multi-page/site/public/logo.svg +0 -9
  157. package/examples/complete-sites/dog-shelter-multi-page/site/public/robots.txt +0 -2
  158. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +0 -4
  159. package/examples/complete-sites/dog-shelter-multi-page/site/theme.yaml +0 -1
  160. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +0 -35
  161. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +0 -97
  162. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +0 -852
  163. package/examples/complete-sites/dog-shelter-single-page/.astro/content-assets.mjs +0 -4
  164. package/examples/complete-sites/dog-shelter-single-page/.astro/content-modules.mjs +0 -1
  165. package/examples/complete-sites/dog-shelter-single-page/.astro/content.d.ts +0 -183
  166. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +0 -1
  167. package/examples/complete-sites/dog-shelter-single-page/.astro/dev-local.json +0 -8
  168. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +0 -13
  169. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +0 -18
  170. package/examples/complete-sites/dog-shelter-single-page/.astro/settings.json +0 -5
  171. package/examples/complete-sites/dog-shelter-single-page/.astro/types.d.ts +0 -2
  172. package/examples/complete-sites/dog-shelter-single-page/README.md +0 -24
  173. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +0 -74
  174. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
  175. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
  176. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  177. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  178. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  179. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  180. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  181. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  182. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  183. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  184. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
  185. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
  186. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
  187. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
  188. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
  189. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
  190. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/package.json +0 -3
  191. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  192. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
  193. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
  194. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
  195. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
  196. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
  197. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
  198. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
  199. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
  200. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
  201. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
  202. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +0 -50
  203. package/examples/complete-sites/dog-shelter-single-page/site/config.yaml +0 -1
  204. package/examples/complete-sites/dog-shelter-single-page/site/pages/000-home/content.md +0 -37
  205. package/examples/complete-sites/dog-shelter-single-page/site/pages/000-home/images/foster-dog.jpg +0 -0
  206. package/examples/complete-sites/dog-shelter-single-page/site/pages/000-home/images/rescue-dog.jpg +0 -0
  207. package/examples/complete-sites/dog-shelter-single-page/site/public/favicon.svg +0 -10
  208. package/examples/complete-sites/dog-shelter-single-page/site/public/logo.svg +0 -9
  209. package/examples/complete-sites/dog-shelter-single-page/site/public/robots.txt +0 -2
  210. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +0 -4
  211. package/examples/complete-sites/dog-shelter-single-page/site/theme.yaml +0 -1
  212. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +0 -35
  213. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +0 -97
  214. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +0 -844
  215. package/examples/feature-demos/media-and-surfaces/.astro/content-assets.mjs +0 -4
  216. package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +0 -1
  217. package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +0 -183
  218. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +0 -1
  219. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +0 -14
  220. package/examples/feature-demos/media-and-surfaces/.astro/settings.json +0 -5
  221. package/examples/feature-demos/media-and-surfaces/.astro/types.d.ts +0 -2
  222. package/examples/feature-demos/media-and-surfaces/README.md +0 -21
  223. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +0 -80
  224. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
  225. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
  226. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  227. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  228. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  229. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  230. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  231. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  232. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  233. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  234. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
  235. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
  236. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js +0 -1389
  237. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js.map +0 -1
  238. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
  239. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
  240. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
  241. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
  242. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/package.json +0 -3
  243. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  244. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
  245. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
  246. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
  247. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
  248. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
  249. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
  250. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
  251. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
  252. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
  253. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
  254. package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +0 -66
  255. package/examples/feature-demos/media-and-surfaces/site/config.yaml +0 -1
  256. package/examples/feature-demos/media-and-surfaces/site/pages/000-home/content.md +0 -15
  257. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/content.md +0 -71
  258. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-carousel.svg +0 -11
  259. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-stack.svg +0 -9
  260. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-surfaces.svg +0 -8
  261. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-one.svg +0 -8
  262. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-three.svg +0 -13
  263. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-two.svg +0 -8
  264. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/stack-one.svg +0 -8
  265. package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/stack-two.svg +0 -9
  266. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/content.md +0 -42
  267. package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +0 -2
  268. package/examples/feature-demos/media-and-surfaces/site/public/robots.txt +0 -2
  269. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.yaml +0 -2
  270. package/examples/feature-demos/media-and-surfaces/site/theme.yaml +0 -1
  271. package/examples/feature-demos/sitewide-content/.astro/collections/site.schema.json +0 -59
  272. package/examples/feature-demos/sitewide-content/.astro/collections/sitewide.schema.json +0 -138
  273. package/examples/feature-demos/sitewide-content/.astro/collections/theme.schema.json +0 -755
  274. package/examples/feature-demos/sitewide-content/.astro/content-assets.mjs +0 -1
  275. package/examples/feature-demos/sitewide-content/.astro/content-modules.mjs +0 -1
  276. package/examples/feature-demos/sitewide-content/.astro/content.d.ts +0 -183
  277. package/examples/feature-demos/sitewide-content/.astro/data-store.json +0 -1
  278. package/examples/feature-demos/sitewide-content/.astro/dev.json +0 -13
  279. package/examples/feature-demos/sitewide-content/.astro/dev.log +0 -18
  280. package/examples/feature-demos/sitewide-content/.astro/settings.json +0 -5
  281. package/examples/feature-demos/sitewide-content/.astro/types.d.ts +0 -2
  282. package/examples/feature-demos/sitewide-content/README.md +0 -26
  283. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/_metadata.json +0 -74
  284. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
  285. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
  286. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  287. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  288. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  289. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  290. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  291. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  292. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  293. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  294. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
  295. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
  296. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
  297. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
  298. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
  299. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
  300. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/package.json +0 -3
  301. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  302. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
  303. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
  304. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
  305. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
  306. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
  307. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
  308. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
  309. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
  310. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
  311. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
  312. package/examples/feature-demos/sitewide-content/site/.norna/generated-images.json +0 -1
  313. package/examples/feature-demos/sitewide-content/site/config.yaml +0 -1
  314. package/examples/feature-demos/sitewide-content/site/pages/000-home/content.md +0 -17
  315. package/examples/feature-demos/sitewide-content/site/pages/010-logo-and-navigation/content.md +0 -17
  316. package/examples/feature-demos/sitewide-content/site/pages/020-notices/content.md +0 -23
  317. package/examples/feature-demos/sitewide-content/site/pages/030-footer/content.md +0 -18
  318. package/examples/feature-demos/sitewide-content/site/public/logo.svg +0 -6
  319. package/examples/feature-demos/sitewide-content/site/public/robots.txt +0 -2
  320. package/examples/feature-demos/sitewide-content/site/sitewide-content.yaml +0 -14
  321. package/examples/feature-demos/sitewide-content/site/theme.yaml +0 -1
  322. package/examples/feature-demos/theme-preset-documentation/README.md +0 -16
  323. package/examples/feature-demos/theme-preset-documentation/site/.norna/generated-images.json +0 -74
  324. package/examples/feature-demos/theme-preset-documentation/site/config.yaml +0 -1
  325. package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/content.md +0 -30
  326. package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/images/black-schnauzer.jpg +0 -0
  327. package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/images/retriever-portrait.jpg +0 -0
  328. package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/images/schnauzer-portrait.jpg +0 -0
  329. package/examples/feature-demos/theme-preset-documentation/site/public/robots.txt +0 -2
  330. package/examples/feature-demos/theme-preset-documentation/site/sitewide-content.yaml +0 -3
  331. package/examples/feature-demos/theme-preset-documentation/site/theme.yaml +0 -1
  332. package/examples/feature-demos/theme-preset-portfolio/README.md +0 -16
  333. package/examples/feature-demos/theme-preset-portfolio/site/.norna/generated-images.json +0 -74
  334. package/examples/feature-demos/theme-preset-portfolio/site/config.yaml +0 -1
  335. package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/content.md +0 -31
  336. package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/images/puppy-portrait.jpg +0 -0
  337. package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/images/shepherd-portrait.jpg +0 -0
  338. package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/images/white-puppy.jpg +0 -0
  339. package/examples/feature-demos/theme-preset-portfolio/site/public/robots.txt +0 -2
  340. package/examples/feature-demos/theme-preset-portfolio/site/sitewide-content.yaml +0 -3
  341. package/examples/feature-demos/theme-preset-portfolio/site/theme.yaml +0 -1
  342. package/examples/feature-demos/theme-preset-project/.astro/collections/routeTheme.schema.json +0 -746
  343. package/examples/feature-demos/theme-preset-project/.astro/collections/site.schema.json +0 -59
  344. package/examples/feature-demos/theme-preset-project/.astro/collections/sitewide.schema.json +0 -138
  345. package/examples/feature-demos/theme-preset-project/.astro/collections/theme.schema.json +0 -755
  346. package/examples/feature-demos/theme-preset-project/.astro/content-assets.mjs +0 -4
  347. package/examples/feature-demos/theme-preset-project/.astro/content-modules.mjs +0 -1
  348. package/examples/feature-demos/theme-preset-project/.astro/content.d.ts +0 -183
  349. package/examples/feature-demos/theme-preset-project/.astro/data-store.json +0 -1
  350. package/examples/feature-demos/theme-preset-project/.astro/dev-local.json +0 -8
  351. package/examples/feature-demos/theme-preset-project/.astro/dev.json +0 -15
  352. package/examples/feature-demos/theme-preset-project/.astro/dev.log +0 -164
  353. package/examples/feature-demos/theme-preset-project/.astro/settings.json +0 -5
  354. package/examples/feature-demos/theme-preset-project/.astro/types.d.ts +0 -2
  355. package/examples/feature-demos/theme-preset-project/README.md +0 -16
  356. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/_metadata.json +0 -80
  357. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
  358. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
  359. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  360. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  361. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  362. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  363. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  364. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  365. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  366. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  367. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
  368. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
  369. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/embla-carousel.js +0 -1389
  370. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/embla-carousel.js.map +0 -1
  371. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
  372. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
  373. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
  374. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
  375. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/package.json +0 -3
  376. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  377. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
  378. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
  379. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
  380. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
  381. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
  382. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
  383. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
  384. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
  385. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
  386. package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
  387. package/examples/feature-demos/theme-preset-project/site/.norna/generated-images.json +0 -74
  388. package/examples/feature-demos/theme-preset-project/site/config.yaml +0 -1
  389. package/examples/feature-demos/theme-preset-project/site/pages/000-home/content.md +0 -31
  390. package/examples/feature-demos/theme-preset-project/site/pages/000-home/images/boxer-portrait.jpg +0 -0
  391. package/examples/feature-demos/theme-preset-project/site/pages/000-home/images/grass-puppy.jpg +0 -0
  392. package/examples/feature-demos/theme-preset-project/site/pages/000-home/images/grey-street-dog.jpg +0 -0
  393. package/examples/feature-demos/theme-preset-project/site/public/robots.txt +0 -2
  394. package/examples/feature-demos/theme-preset-project/site/sitewide-content.yaml +0 -3
  395. package/examples/feature-demos/theme-preset-project/site/theme.yaml +0 -1
  396. package/examples/feature-demos/theme-preset-statement/README.md +0 -16
  397. package/examples/feature-demos/theme-preset-statement/site/.norna/generated-images.json +0 -74
  398. package/examples/feature-demos/theme-preset-statement/site/config.yaml +0 -1
  399. package/examples/feature-demos/theme-preset-statement/site/pages/000-home/content.md +0 -31
  400. package/examples/feature-demos/theme-preset-statement/site/pages/000-home/images/black-pedigree.jpg +0 -0
  401. package/examples/feature-demos/theme-preset-statement/site/pages/000-home/images/sheepdog-grass.jpg +0 -0
  402. package/examples/feature-demos/theme-preset-statement/site/pages/000-home/images/sheepdog-wide.jpg +0 -0
  403. package/examples/feature-demos/theme-preset-statement/site/public/robots.txt +0 -2
  404. package/examples/feature-demos/theme-preset-statement/site/sitewide-content.yaml +0 -3
  405. package/examples/feature-demos/theme-preset-statement/site/theme.yaml +0 -1
  406. package/fixtures/basic/site/.norna/generated-images.json +0 -1
  407. package/fixtures/basic/site/config.yaml +0 -1
  408. package/fixtures/basic/site/pages/000-home/content.md +0 -14
  409. package/fixtures/basic/site/pages/000-home/images/.gitkeep +0 -1
  410. package/fixtures/basic/site/public/robots.txt +0 -2
  411. package/fixtures/basic/site/sitewide-content.yaml +0 -3
  412. package/fixtures/basic/site/theme.yaml +0 -1
  413. package/fixtures/content-model-v2/.astro/collections/site.schema.json +0 -776
  414. package/fixtures/content-model-v2/.astro/collections/theme.schema.json +0 -668
  415. package/fixtures/content-model-v2/.astro/content-assets.mjs +0 -4
  416. package/fixtures/content-model-v2/.astro/content-modules.mjs +0 -1
  417. package/fixtures/content-model-v2/.astro/content.d.ts +0 -175
  418. package/fixtures/content-model-v2/.astro/data-store.json +0 -1
  419. package/fixtures/content-model-v2/.astro/dev-local.json +0 -8
  420. package/fixtures/content-model-v2/.astro/dev.json +0 -13
  421. package/fixtures/content-model-v2/.astro/dev.log +0 -231
  422. package/fixtures/content-model-v2/.astro/settings.json +0 -5
  423. package/fixtures/content-model-v2/.astro/types.d.ts +0 -2
  424. package/fixtures/content-model-v2/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +0 -1
  425. package/fixtures/content-model-v2/dist/_astro/SitePage.BbfZub4g.css +0 -1
  426. package/fixtures/content-model-v2/dist/guide/index.html +0 -3
  427. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-480.webp +0 -0
  428. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-768.webp +0 -0
  429. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-971.webp +0 -0
  430. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-480.webp +0 -0
  431. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-768.webp +0 -0
  432. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-971.webp +0 -0
  433. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-480.webp +0 -0
  434. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-768.webp +0 -0
  435. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-971.webp +0 -0
  436. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1080.webp +0 -0
  437. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1440.webp +0 -0
  438. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1600.webp +0 -0
  439. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-480.webp +0 -0
  440. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-768.webp +0 -0
  441. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-480.webp +0 -0
  442. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-768.webp +0 -0
  443. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-960.webp +0 -0
  444. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1080.webp +0 -0
  445. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1440.webp +0 -0
  446. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1600.webp +0 -0
  447. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-480.webp +0 -0
  448. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-768.webp +0 -0
  449. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1080.webp +0 -0
  450. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1440.webp +0 -0
  451. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1600.webp +0 -0
  452. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-480.webp +0 -0
  453. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-768.webp +0 -0
  454. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1080.webp +0 -0
  455. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1440.webp +0 -0
  456. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1600.webp +0 -0
  457. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-480.webp +0 -0
  458. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-768.webp +0 -0
  459. package/fixtures/content-model-v2/dist/index.html +0 -8
  460. package/fixtures/content-model-v2/node_modules/.vite/deps/_metadata.json +0 -80
  461. package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
  462. package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
  463. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  464. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  465. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  466. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  467. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  468. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  469. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  470. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  471. package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
  472. package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
  473. package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js +0 -1389
  474. package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js.map +0 -1
  475. package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
  476. package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
  477. package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
  478. package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
  479. package/fixtures/content-model-v2/node_modules/.vite/deps/package.json +0 -3
  480. package/fixtures/content-model-v2/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  481. package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
  482. package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
  483. package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
  484. package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
  485. package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
  486. package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
  487. package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
  488. package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
  489. package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
  490. package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
  491. package/fixtures/content-model-v2/site/.norna/generated-images.json +0 -210
  492. package/fixtures/content-model-v2/site/config.yaml +0 -1
  493. package/fixtures/content-model-v2/site/pages/000-home/content.md +0 -79
  494. package/fixtures/content-model-v2/site/pages/000-home/images/adopt.svg +0 -9
  495. package/fixtures/content-model-v2/site/pages/000-home/images/detail.jpg +0 -0
  496. package/fixtures/content-model-v2/site/pages/000-home/images/duplicate.jpg +0 -0
  497. package/fixtures/content-model-v2/site/pages/000-home/images/foster.svg +0 -12
  498. package/fixtures/content-model-v2/site/pages/000-home/images/hero.jpg +0 -0
  499. package/fixtures/content-model-v2/site/pages/000-home/images/image.jpg +0 -0
  500. package/fixtures/content-model-v2/site/pages/000-home/images/slide-one.jpg +0 -0
  501. package/fixtures/content-model-v2/site/pages/000-home/images/slide-three.jpg +0 -0
  502. package/fixtures/content-model-v2/site/pages/000-home/images/slide-two.jpg +0 -0
  503. package/fixtures/content-model-v2/site/pages/010-guide/content.md +0 -18
  504. package/fixtures/content-model-v2/site/pages/010-guide/images/duplicate.jpg +0 -0
  505. package/fixtures/content-model-v2/site/theme.yaml +0 -4
  506. package/fixtures/nested-pages/.astro/collections/site.schema.json +0 -35
  507. package/fixtures/nested-pages/.astro/collections/sitewide.schema.json +0 -97
  508. package/fixtures/nested-pages/.astro/collections/theme.schema.json +0 -844
  509. package/fixtures/nested-pages/.astro/content-assets.mjs +0 -4
  510. package/fixtures/nested-pages/.astro/content-modules.mjs +0 -1
  511. package/fixtures/nested-pages/.astro/content.d.ts +0 -183
  512. package/fixtures/nested-pages/.astro/data-store.json +0 -1
  513. package/fixtures/nested-pages/.astro/dev-local.json +0 -8
  514. package/fixtures/nested-pages/.astro/dev.log +0 -1128
  515. package/fixtures/nested-pages/.astro/settings.json +0 -5
  516. package/fixtures/nested-pages/.astro/types.d.ts +0 -2
  517. package/fixtures/nested-pages/node_modules/.vite/deps/_metadata.json +0 -74
  518. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
  519. package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
  520. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
  521. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  522. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
  523. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  524. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
  525. package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  526. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
  527. package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  528. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
  529. package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
  530. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
  531. package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
  532. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
  533. package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
  534. package/fixtures/nested-pages/node_modules/.vite/deps/package.json +0 -3
  535. package/fixtures/nested-pages/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
  536. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
  537. package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
  538. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
  539. package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
  540. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
  541. package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
  542. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
  543. package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
  544. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
  545. package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
  546. package/fixtures/nested-pages/site/.norna/generated-images.json +0 -10
  547. package/fixtures/nested-pages/site/config.yaml +0 -3
  548. package/fixtures/nested-pages/site/pages/000-home/content.md +0 -15
  549. package/fixtures/nested-pages/site/pages/010-guides/content.md +0 -15
  550. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/content.md +0 -21
  551. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/images/diagram.svg +0 -21
  552. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +0 -18
  553. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/theme.yaml +0 -2
  554. package/fixtures/nested-pages/site/pages/010-guides/pages/020-workflows/content.md +0 -11
  555. package/fixtures/nested-pages/site/pages/010-guides/pages/030-release-notes/content.md +0 -9
  556. package/fixtures/nested-pages/site/pages/010-guides/pages/040-configuration/content.md +0 -3
  557. package/fixtures/nested-pages/site/pages/010-guides/pages/050-content/content.md +0 -3
  558. package/fixtures/nested-pages/site/pages/010-guides/pages/060-themes/content.md +0 -3
  559. package/fixtures/nested-pages/site/pages/010-guides/pages/070-images/content.md +0 -3
  560. package/fixtures/nested-pages/site/pages/010-guides/pages/080-cards/content.md +0 -3
  561. package/fixtures/nested-pages/site/pages/010-guides/pages/090-notes/content.md +0 -3
  562. package/fixtures/nested-pages/site/pages/010-guides/pages/100-validation/content.md +0 -3
  563. package/fixtures/nested-pages/site/pages/010-guides/pages/110-synchronization/content.md +0 -3
  564. package/fixtures/nested-pages/site/pages/010-guides/pages/120-building/content.md +0 -3
  565. package/fixtures/nested-pages/site/pages/010-guides/pages/130-publishing/content.md +0 -3
  566. package/fixtures/nested-pages/site/pages/010-guides/pages/140-troubleshooting/content.md +0 -3
  567. package/fixtures/nested-pages/site/pages/010-guides/pages/150-migration/content.md +0 -3
  568. package/fixtures/nested-pages/site/pages/010-guides/pages/160-accessibility/content.md +0 -3
  569. package/fixtures/nested-pages/site/pages/010-guides/pages/170-performance/content.md +0 -3
  570. package/fixtures/nested-pages/site/pages/010-guides/pages/180-security/content.md +0 -3
  571. package/fixtures/nested-pages/site/pages/010-guides/pages/190-localization/content.md +0 -3
  572. package/fixtures/nested-pages/site/pages/010-guides/pages/200-upgrading/content.md +0 -3
  573. package/fixtures/nested-pages/site/pages/010-guides/pages/210-faq/content.md +0 -3
  574. package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +0 -7
  575. package/fixtures/nested-pages/site/pages/020-reference/content.md +0 -10
  576. package/fixtures/nested-pages/site/pages/020-reference/pages/010-installation/content.md +0 -11
  577. package/fixtures/nested-pages/site/theme.yaml +0 -1
  578. package/scripts/build-pages.mjs +0 -69
  579. package/scripts/lib/example-sites.mjs +0 -49
  580. package/scripts/lib/frontmatter-yaml.mjs +0 -113
  581. package/scripts/lib/git-status.mjs +0 -7
  582. package/scripts/release.mjs +0 -153
  583. package/scripts/test-banner-visibility.mjs +0 -80
  584. package/scripts/test-ci-lockfile.mjs +0 -65
  585. package/scripts/test-cli-discovery.mjs +0 -124
  586. package/scripts/test-client-javascript.mjs +0 -225
  587. package/scripts/test-content-check.mjs +0 -621
  588. package/scripts/test-content-model-v2.mjs +0 -1693
  589. package/scripts/test-documentation.mjs +0 -189
  590. package/scripts/test-editor-language-service.mjs +0 -305
  591. package/scripts/test-engine-commands.mjs +0 -204
  592. package/scripts/test-examples.mjs +0 -53
  593. package/scripts/test-heading-ids.mjs +0 -68
  594. package/scripts/test-navigation-model.mjs +0 -63
  595. package/scripts/test-navigation-preview.mjs +0 -108
  596. package/scripts/test-navigation.mjs +0 -157
  597. package/scripts/test-nested-pages.mjs +0 -125
  598. package/scripts/test-package-check.mjs +0 -500
  599. package/scripts/test-page-model.mjs +0 -108
  600. package/scripts/test-project-config.mjs +0 -139
  601. package/scripts/test-schemas.mjs +0 -169
  602. package/scripts/test-site-public.mjs +0 -85
  603. package/scripts/test-theme-presets.mjs +0 -188
  604. package/src/components/SiteNotesScript.astro +0 -43
  605. package/starters/project/.github/workflows/deploy.yml +0 -64
  606. package/starters/project/README.md +0 -84
  607. package/starters/project/package-lock.json +0 -4296
  608. package/starters/project/package.json +0 -37
  609. package/starters/project/site/config.yaml +0 -1
  610. package/starters/project/site/pages/000-home/content.md +0 -119
  611. package/starters/project/site/pages/010-guide/content.md +0 -80
  612. package/starters/project/site/public/robots.txt +0 -2
  613. package/starters/project/site/sitewide-content.yaml +0 -3
  614. package/starters/project/site/theme.yaml +0 -1
  615. package/tsconfig.json +0 -5
@@ -1,6 +1,11 @@
1
1
  ---
2
- import projectConfig from '../../scripts/lib/project-config.mjs';
3
2
  import { getTextWidthCssValue, resolveSectionSurface } from '../../scripts/lib/presentation.mjs';
3
+ import {
4
+ bodyTypographySizeValues,
5
+ captionTypographySizeValues,
6
+ getHeadingTypographySizeValue,
7
+ getTypographySizeValue,
8
+ } from '../../scripts/lib/typography.mjs';
4
9
  import CardList from './CardList.astro';
5
10
  import ImageCarousel from './ImageCarousel.astro';
6
11
  import ImageStack from './ImageStack.astro';
@@ -12,6 +17,11 @@ type TextAlign = 'left' | 'center' | 'right';
12
17
  type TextSize = 'small' | 'medium' | 'large' | 'xlarge';
13
18
  type TextWidth = 'narrow' | 'normal' | 'wide';
14
19
  type ResolvedPagePresentation = {
20
+ blocks: {
21
+ cardList: {
22
+ width: 'text' | 'narrow' | 'normal' | 'wide';
23
+ };
24
+ };
15
25
  palette: {
16
26
  surfaces: Record<'base' | 'soft' | 'emphasis', { backgroundColor: string; textColor: string }>;
17
27
  };
@@ -23,10 +33,15 @@ type ResolvedPagePresentation = {
23
33
  };
24
34
  type VisualTheme = {
25
35
  images: {
36
+ presentation: 'prose-aligned' | 'centered-fit';
26
37
  maxAvailableWidthPercent: {
27
38
  desktop: number;
28
39
  mobile: number;
29
40
  };
41
+ maxAvailableHeightPercent?: {
42
+ desktop: number;
43
+ mobile: number;
44
+ };
30
45
  };
31
46
  };
32
47
 
@@ -45,128 +60,13 @@ const sectionHeadingVisualLevel = section.headingLevel === 1 ? 'h1' : 'h2';
45
60
  const headingId = section.id ?? 'page-title';
46
61
  const firstContentBlock = section.contentBlocks[0];
47
62
  const firstContentBlockIsVisual = firstContentBlock !== undefined
48
- && firstContentBlock.type !== 'html'
49
- && firstContentBlock.type !== 'note';
50
- type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4';
51
- const headingSizeValues: Record<HeadingLevel, Record<TextSize, ResponsiveValue<string>>> = {
52
- h1: {
53
- small: {
54
- desktop: 'clamp(1.35rem, 1.2rem + 0.55vw, 1.7rem)',
55
- mobile: 'clamp(1.32rem, 1.16rem + 0.8vw, 1.58rem)',
56
- },
57
- medium: {
58
- desktop: 'clamp(1.65rem, 1.35rem + 1.1vw, 2.4rem)',
59
- mobile: 'clamp(1.5rem, 1.22rem + 1.4vw, 2rem)',
60
- },
61
- large: {
62
- desktop: 'clamp(1.95rem, 1.48rem + 1.7vw, 3.2rem)',
63
- mobile: 'clamp(1.75rem, 1.32rem + 2.15vw, 2.5rem)',
64
- },
65
- xlarge: {
66
- desktop: 'clamp(2.35rem, 1.58rem + 2.75vw, 4.4rem)',
67
- mobile: 'clamp(2rem, 1.4rem + 3vw, 3.1rem)',
68
- },
69
- },
70
- h2: {
71
- small: {
72
- desktop: 'clamp(1.1rem, 1.02rem + 0.35vw, 1.35rem)',
73
- mobile: 'clamp(1.12rem, 1rem + 0.85vw, 1.42rem)',
74
- },
75
- medium: {
76
- desktop: 'clamp(1.35rem, 1.1rem + 0.9vw, 2rem)',
77
- mobile: 'clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem)',
78
- },
79
- large: {
80
- desktop: 'clamp(1.6rem, 1.22rem + 1.45vw, 2.75rem)',
81
- mobile: 'clamp(1.5rem, 1.12rem + 2vw, 2.25rem)',
82
- },
83
- xlarge: {
84
- desktop: 'clamp(2rem, 1.35rem + 2.4vw, 3.75rem)',
85
- mobile: 'clamp(1.8rem, 1.25rem + 3vw, 2.85rem)',
86
- },
87
- },
88
- h3: {
89
- small: {
90
- desktop: 'clamp(0.96rem, 0.94rem + 0.08vw, 1rem)',
91
- mobile: 'clamp(0.96rem, 0.94rem + 0.08vw, 1rem)',
92
- },
93
- medium: {
94
- desktop: 'clamp(1.05rem, 0.98rem + 0.28vw, 1.22rem)',
95
- mobile: 'clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem)',
96
- },
97
- large: {
98
- desktop: 'clamp(1.16rem, 1.02rem + 0.5vw, 1.5rem)',
99
- mobile: 'clamp(1.12rem, 1rem + 0.75vw, 1.36rem)',
100
- },
101
- xlarge: {
102
- desktop: 'clamp(1.32rem, 1.08rem + 0.85vw, 1.9rem)',
103
- mobile: 'clamp(1.24rem, 1.04rem + 1.15vw, 1.65rem)',
104
- },
105
- },
106
- h4: {
107
- small: {
108
- desktop: 'clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem)',
109
- mobile: 'clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem)',
110
- },
111
- medium: {
112
- desktop: 'clamp(0.96rem, 0.94rem + 0.08vw, 1rem)',
113
- mobile: 'clamp(0.96rem, 0.94rem + 0.08vw, 1rem)',
114
- },
115
- large: {
116
- desktop: 'clamp(1.05rem, 1rem + 0.16vw, 1.12rem)',
117
- mobile: 'clamp(1.05rem, 1rem + 0.16vw, 1.12rem)',
118
- },
119
- xlarge: {
120
- desktop: 'clamp(1.14rem, 1.06rem + 0.26vw, 1.25rem)',
121
- mobile: 'clamp(1.14rem, 1.06rem + 0.26vw, 1.25rem)',
122
- },
123
- },
124
- };
125
- const bodySizeValues: Record<TextSize, ResponsiveValue<string>> = {
126
- small: {
127
- desktop: 'clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem)',
128
- mobile: 'clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem)',
129
- },
130
- medium: {
131
- desktop: 'clamp(0.96rem, 0.94rem + 0.08vw, 1rem)',
132
- mobile: 'clamp(0.96rem, 0.94rem + 0.08vw, 1rem)',
133
- },
134
- large: {
135
- desktop: 'clamp(1.05rem, 1rem + 0.16vw, 1.12rem)',
136
- mobile: 'clamp(1.05rem, 1rem + 0.16vw, 1.12rem)',
137
- },
138
- xlarge: {
139
- desktop: 'clamp(1.14rem, 1.06rem + 0.26vw, 1.25rem)',
140
- mobile: 'clamp(1.14rem, 1.06rem + 0.26vw, 1.25rem)',
141
- },
142
- };
143
- const captionSizeValues: Record<TextSize, ResponsiveValue<string>> = {
144
- small: {
145
- desktop: 'clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem)',
146
- mobile: 'clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem)',
147
- },
148
- medium: {
149
- desktop: 'clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem)',
150
- mobile: 'clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem)',
151
- },
152
- large: {
153
- desktop: 'clamp(0.96rem, 0.92rem + 0.12vw, 1rem)',
154
- mobile: 'clamp(0.96rem, 0.92rem + 0.12vw, 1rem)',
155
- },
156
- xlarge: {
157
- desktop: 'clamp(1.04rem, 0.98rem + 0.18vw, 1.12rem)',
158
- mobile: 'clamp(1.04rem, 0.98rem + 0.18vw, 1.12rem)',
159
- },
160
- };
161
- const getSizeValue = (
162
- sizeValues: Record<TextSize, ResponsiveValue<string>>,
163
- size: TextSize,
164
- ) => sizeValues[size];
165
- const getHeadingSizeValue = (level: HeadingLevel, size: TextSize) => (
166
- headingSizeValues[level][size]
167
- );
63
+ && firstContentBlock.type !== 'html';
168
64
  const surface = isPageTitle
169
- ? pagePresentation.palette.surfaces.base
65
+ ? {
66
+ backgroundColor: 'var(--color-surface-base-background)',
67
+ textColor: 'var(--color-surface-base-text)',
68
+ secondaryTextColor: 'var(--color-surface-base-secondary-text)',
69
+ }
170
70
  : resolveSectionSurface(pagePresentation, sectionIndex);
171
71
  const typography = pagePresentation.typography.values;
172
72
  const heading = typography.headings[sectionHeadingVisualLevel] as {
@@ -192,9 +92,9 @@ const markdownHeadings = Object.fromEntries(markdownHeadingLevels.map((level) =>
192
92
  const headingAlign = heading.align;
193
93
  const bodyAlign = typography.body.align as ResponsiveValue<TextAlign>;
194
94
  const captionAlign = typography.caption.align as ResponsiveValue<TextAlign>;
195
- const headingFontSize = getHeadingSizeValue(sectionHeadingVisualLevel, heading.size);
196
- const bodyFontSize = getSizeValue(bodySizeValues, typography.body.size as TextSize);
197
- const captionFontSize = getSizeValue(captionSizeValues, typography.caption.size as TextSize);
95
+ const headingFontSize = getHeadingTypographySizeValue(sectionHeadingVisualLevel, heading.size);
96
+ const bodyFontSize = getTypographySizeValue(bodyTypographySizeValues, typography.body.size as TextSize);
97
+ const captionFontSize = getTypographySizeValue(captionTypographySizeValues, typography.caption.size as TextSize);
198
98
  const justifyByAlign: Record<TextAlign, string> = {
199
99
  left: 'flex-start',
200
100
  center: 'center',
@@ -219,14 +119,6 @@ const hasMedia = section.contentBlocks.some((block) => (
219
119
  || block.type === 'image-carousel'
220
120
  || (block.type === 'card-list' && block.cards.some((card) => card.image))
221
121
  ));
222
- const hasMarginNotes = section.contentBlocks.some((block) => (
223
- block.type === 'note'
224
- ));
225
- const getNoteGridRow = (blocks: ResolvedSection['contentBlocks'], blockIndex: number) => Math.max(
226
- 1,
227
- blocks.slice(0, blockIndex).filter((block) => block.type === 'html').length,
228
- );
229
- const noteLabel = projectConfig.locale.labels.note;
230
122
  const contentGroups: Array<
231
123
  | { type: 'reading'; blocks: ResolvedSection['contentBlocks'] }
232
124
  | { type: 'media'; block: Extract<ResolvedSection['contentBlocks'][number], { type: 'image-stack' | 'image-carousel' | 'card-list' }> }
@@ -251,7 +143,7 @@ flushReadingBlocks();
251
143
  const firstMediaGroupIndex = contentGroups.findIndex((group) => group.type === 'media');
252
144
  const markdownHeadingStyle = (level: 'h3' | 'h4') => {
253
145
  const headingConfig = markdownHeadings[level];
254
- const fontSize = getHeadingSizeValue(level, headingConfig.size);
146
+ const fontSize = getHeadingTypographySizeValue(level, headingConfig.size);
255
147
 
256
148
  return [
257
149
  `--section-markdown-${level}-align-desktop: ${headingConfig.align.desktop}`,
@@ -267,6 +159,7 @@ const markdownHeadingStyle = (level: 'h3' | 'h4') => {
267
159
  const sectionStyle = [
268
160
  `--section-background-color: ${surface.backgroundColor}`,
269
161
  `--section-text-color: ${surface.textColor}`,
162
+ `--section-secondary-text-color: ${surface.secondaryTextColor}`,
270
163
  `--section-heading-align-desktop: ${headingAlign.desktop}`,
271
164
  `--section-heading-align-mobile: ${headingAlign.mobile}`,
272
165
  `--section-heading-font-size-desktop: ${headingFontSize.desktop}`,
@@ -305,7 +198,6 @@ const sectionStyle = [
305
198
  'site-section-page-title': isPageTitle,
306
199
  'site-section-page-title-empty': isPageTitle && section.contentBlocks.length === 0,
307
200
  'site-section-first-block-is-visual': firstContentBlockIsVisual,
308
- 'site-section-has-margin-notes': hasMarginNotes,
309
201
  },
310
202
  ]}
311
203
  data-section-title={section.title}
@@ -319,61 +211,9 @@ const sectionStyle = [
319
211
  <div class:list={['section-body', { 'section-body-has-media': hasMedia, 'section-body-text-only': !hasMedia }]}>
320
212
  {contentGroups.map((group, groupIndex) => {
321
213
  if (group.type === 'reading') {
322
- if (hasMarginNotes && group.blocks.some((block) => block.type === 'note')) {
323
- return (
324
- <div class="section-reading-layout">
325
- {group.blocks.map((block, blockIndex) => {
326
- if (block.type === 'html') {
327
- return block.html && <div class="section-markdown" set:html={block.html} />;
328
- }
329
-
330
- const noteGridRow = getNoteGridRow(group.blocks, blockIndex);
331
- return (
332
- <aside
333
- class="section-note section-note-margin"
334
- id={block.id}
335
- aria-label={`${noteLabel}${block.number ? ` ${block.number}` : ''}`}
336
- role="note"
337
- data-note-id={block.id}
338
- style={`grid-row: ${noteGridRow};`}
339
- >
340
- {block.number && block.referenceId && (
341
- <a class="section-note-number" href={`#${block.referenceId}`} aria-label={`${noteLabel} ${block.number}`}>
342
- {block.number}
343
- </a>
344
- )}
345
- <div class="section-note-content" set:html={block.html} />
346
- </aside>
347
- );
348
- })}
349
- </div>
350
- );
351
- }
352
-
353
- return group.blocks.map((block, blockIndex) => {
354
- if (block.type === 'html') {
355
- return block.html && <div class="section-markdown" set:html={block.html} />;
356
- }
357
-
358
- const noteGridRow = getNoteGridRow(group.blocks, blockIndex);
359
- return (
360
- <aside
361
- class="section-note section-note-margin"
362
- id={block.id}
363
- aria-label={`${noteLabel}${block.number ? ` ${block.number}` : ''}`}
364
- role="note"
365
- data-note-id={block.id}
366
- style={`grid-row: ${noteGridRow};`}
367
- >
368
- {block.number && block.referenceId && (
369
- <a class="section-note-number" href={`#${block.referenceId}`} aria-label={`${noteLabel} ${block.number}`}>
370
- {block.number}
371
- </a>
372
- )}
373
- <div class="section-note-content" set:html={block.html} />
374
- </aside>
375
- );
376
- });
214
+ return group.blocks.map((block) => block.type === 'html'
215
+ && block.html
216
+ && <div class="section-markdown" set:html={block.html} />);
377
217
  }
378
218
 
379
219
  const block = group.block;
@@ -383,13 +223,22 @@ const sectionStyle = [
383
223
  title={section.title}
384
224
  images={block.images}
385
225
  maxAvailableWidthPercent={visualTheme.images.maxAvailableWidthPercent}
226
+ maxAvailableHeightPercent={visualTheme.images.maxAvailableHeightPercent}
386
227
  priorityFirstImage={prioritizeFirstImage && groupIndex === firstMediaGroupIndex}
387
228
  />
388
229
  );
389
230
  }
390
231
 
391
232
  if (block.type === 'card-list') {
392
- return <CardList cards={block.cards} layout={block.layout} flow={block.flow} size={block.size} width={block.width} />;
233
+ return (
234
+ <CardList
235
+ cards={block.cards}
236
+ layout={block.layout}
237
+ flow={block.flow}
238
+ size={block.size}
239
+ width={block.width ?? pagePresentation.blocks.cardList.width}
240
+ />
241
+ );
393
242
  }
394
243
 
395
244
  return (
@@ -1,34 +1,34 @@
1
1
  ---
2
2
  import projectConfig from '../../scripts/lib/project-config.mjs';
3
- import { withBasePath } from '../lib/basePath';
4
- import { getListedPageNavigationTree, type PageNavigationEntry } from '../lib/siteNavigation';
3
+ import { getListedSiteNavigationTree, type SiteNavigationEntry } from '../lib/siteNavigation';
5
4
  import type { SitePage } from '../lib/sitePages';
6
5
  import NavigationPageTree from './NavigationPageTree.astro';
7
6
 
8
7
  interface Props {
9
8
  currentPage: SitePage;
10
- pageNavigation: PageNavigationEntry[];
9
+ navigationEntries: SiteNavigationEntry[];
11
10
  }
12
11
 
13
- const { currentPage, pageNavigation } = Astro.props;
14
- const roots = getListedPageNavigationTree(pageNavigation);
12
+ const { currentPage, navigationEntries } = Astro.props;
13
+ const roots = getListedSiteNavigationTree(navigationEntries);
15
14
  const activeRoot = roots.find((node) => (
16
- currentPage.pageDirectory === node.page.pageDirectory
17
- || currentPage.pageDirectory.startsWith(`${node.page.pageDirectory}/pages/`)
15
+ currentPage.pageDirectory === node.node.pageDirectory
16
+ || currentPage.pageDirectory.startsWith(`${node.node.pageDirectory}/pages/`)
18
17
  ));
18
+ const navigationRoot = activeRoot?.node.pagePath ? `/${activeRoot.node.pagePath}/` : '/';
19
19
  ---
20
20
 
21
21
  {activeRoot && (
22
22
  <aside
23
+ id="tree-local-navigation"
23
24
  class="tree-local-navigation"
24
- data-navigation-root={withBasePath(projectConfig.site.basePath, activeRoot.page.pathname)}
25
+ data-navigation-root={navigationRoot}
25
26
  >
26
- <nav aria-label={`${activeRoot.page.title}: ${projectConfig.locale.labels.siteNavigation}`}>
27
+ <nav aria-label={`${activeRoot.node.title}: ${projectConfig.locale.labels.siteNavigation}`}>
27
28
  <NavigationPageTree
28
29
  nodes={[activeRoot]}
29
30
  currentPage={currentPage}
30
31
  variant="sidebar"
31
- integratePageSections
32
32
  />
33
33
  </nav>
34
34
  </aside>
@@ -1,5 +1,6 @@
1
1
  import { defineCollection } from 'astro:content';
2
2
  import { glob } from 'astro/loaders';
3
+ import { z } from 'astro/zod';
3
4
  import { basename } from 'node:path';
4
5
  import { pathToFileURL } from 'node:url';
5
6
  import {
@@ -19,7 +20,9 @@ const siteEntryId = `${siteDirLabel
19
20
  .replace(/^[./\\]+/, '')
20
21
  .replace(/[^a-zA-Z0-9-]+/g, '-')
21
22
  .replace(/^-+|-+$/g, '') || 'site'}-content`;
22
- const siteThemeSchema = themeVisualSchema;
23
+ const emptyYamlMapping = (value: unknown) => value ?? {};
24
+ const siteThemeSchema = z.preprocess(emptyYamlMapping, themeVisualSchema);
25
+ const sitewideContentSchema = z.preprocess(emptyYamlMapping, sitewideSchema);
23
26
 
24
27
  const site = defineCollection({
25
28
  loader: glob({
@@ -52,7 +55,7 @@ const sitewide = defineCollection({
52
55
  base: pathToFileURL(siteDir),
53
56
  generateId: () => `${siteEntryId.replace(/-content$/, '')}-sitewide`,
54
57
  }),
55
- schema: sitewideSchema,
58
+ schema: sitewideContentSchema,
56
59
  });
57
60
 
58
61
  export const collections = { site, theme, sitewide };
@@ -3,6 +3,7 @@ import projectConfig from '../../scripts/lib/project-config.mjs';
3
3
  import { getPresentationCssVariables } from '../../scripts/lib/presentation.mjs';
4
4
  import { getIconLinks } from '../lib/sitePublicAssets';
5
5
  import { withBasePath } from '../lib/basePath';
6
+ import { getReaderPreferencesScript } from '../lib/readerPreferencesScript.mjs';
6
7
  import '../styles/global.css';
7
8
 
8
9
  type FrameColors = {
@@ -13,14 +14,33 @@ type FrameColors = {
13
14
  type Presentation = {
14
15
  palette: {
15
16
  page: FrameColors;
17
+ };
18
+ paletteModes: Record<'light' | 'dark', {
19
+ page: FrameColors;
16
20
  css: Record<string, string>;
17
- colorScheme: string;
21
+ }>;
22
+ appearance: {
23
+ default: 'system' | 'light' | 'dark';
24
+ };
25
+ readerPreferences: {
26
+ controls: {
27
+ appearance: boolean;
28
+ readingWidth: boolean;
29
+ focusReading: boolean;
30
+ };
31
+ defaults: {
32
+ appearance: 'system' | 'light' | 'dark';
33
+ readingWidth: 'narrow' | 'standard' | 'wide';
34
+ focusReading: 'off' | 'on';
35
+ };
18
36
  };
19
37
  };
20
38
  type VisualTheme = {
21
39
  layout: {
22
40
  gutter: { desktop: string; mobile: string };
23
41
  localNavigationGap: string;
42
+ noteWidth: string;
43
+ noteGap: string;
24
44
  pageWidth: string;
25
45
  spacing: {
26
46
  firstSectionTop: { desktop: string; mobile: string };
@@ -32,12 +52,13 @@ type VisualTheme = {
32
52
  };
33
53
  };
34
54
  images: {
55
+ presentation: 'prose-aligned' | 'centered-fit';
35
56
  width: string;
36
57
  maxAvailableWidthPercent: { desktop: number; mobile: number };
37
- maxAvailableHeightPercent: { desktop: number; mobile: number };
58
+ maxAvailableHeightPercent?: { desktop: number; mobile: number };
38
59
  };
39
60
  typography: { fontFamily: string };
40
- shape: {
61
+ corners: {
41
62
  radiusSmall: string;
42
63
  radiusMedium: string;
43
64
  radiusLarge: string;
@@ -55,6 +76,7 @@ interface Props {
55
76
  copyrightMessage?: string;
56
77
  buildInfo?: boolean;
57
78
  };
79
+ contentsNavigation?: boolean;
58
80
  }
59
81
 
60
82
  const {
@@ -65,6 +87,7 @@ const {
65
87
  frameColors,
66
88
  pathname = '/',
67
89
  footer,
90
+ contentsNavigation = false,
68
91
  } = Astro.props;
69
92
 
70
93
  const documentTitle = title;
@@ -78,11 +101,13 @@ const documentStyle = [
78
101
  `scroll-behavior: ${scrollBehavior}`,
79
102
  ...Object.entries(getPresentationCssVariables(presentation)).map(([name, value]) => `${name}: ${value}`),
80
103
  `--font-sans: ${visualTheme.typography.fontFamily}`,
81
- `--shape-radius-small: ${visualTheme.shape.radiusSmall}`,
82
- `--shape-radius-medium: ${visualTheme.shape.radiusMedium}`,
83
- `--shape-radius-large: ${visualTheme.shape.radiusLarge}`,
104
+ `--corner-radius-small: ${visualTheme.corners.radiusSmall}`,
105
+ `--corner-radius-medium: ${visualTheme.corners.radiusMedium}`,
106
+ `--corner-radius-large: ${visualTheme.corners.radiusLarge}`,
84
107
  `--page-width: ${visualTheme.layout.pageWidth}`,
85
108
  `--local-navigation-gap: ${visualTheme.layout.localNavigationGap}`,
109
+ `--section-note-width: ${visualTheme.layout.noteWidth}`,
110
+ `--section-note-gap: ${visualTheme.layout.noteGap}`,
86
111
  `--content-gutter-desktop: ${visualTheme.layout.gutter.desktop}`,
87
112
  `--content-gutter-mobile: ${visualTheme.layout.gutter.mobile}`,
88
113
  `--space-nav-to-first-section-desktop: ${layoutSpacing.firstSectionTop.desktop}`,
@@ -100,8 +125,12 @@ const documentStyle = [
100
125
  `--image-width: ${visualTheme.images.width}`,
101
126
  `--image-max-available-width-desktop: ${formatPercent(visualTheme.images.maxAvailableWidthPercent.desktop)}`,
102
127
  `--image-max-available-width-mobile: ${formatPercent(visualTheme.images.maxAvailableWidthPercent.mobile)}`,
103
- `--image-max-height-desktop: ${formatViewportHeightPercent(visualTheme.images.maxAvailableHeightPercent.desktop)}`,
104
- `--image-max-height-mobile: ${formatViewportHeightPercent(visualTheme.images.maxAvailableHeightPercent.mobile)}`,
128
+ ...(visualTheme.images.maxAvailableHeightPercent
129
+ ? [
130
+ `--image-max-height-desktop: ${formatViewportHeightPercent(visualTheme.images.maxAvailableHeightPercent.desktop)}`,
131
+ `--image-max-height-mobile: ${formatViewportHeightPercent(visualTheme.images.maxAvailableHeightPercent.mobile)}`,
132
+ ]
133
+ : []),
105
134
  ].join('; ');
106
135
  const { buildInfo, copyrightMessage } = footer ?? {};
107
136
  const showBuildInfo = buildInfo === true;
@@ -117,16 +146,33 @@ const footerStyle = [
117
146
  `--site-footer-background-color: ${frameColors.backgroundColor}`,
118
147
  `--site-footer-text-color: ${frameColors.textColor}`,
119
148
  ].join('; ');
149
+ const readerPreferencesEnabled = Object.values(presentation.readerPreferences.controls).some(Boolean);
150
+ const readerPreferencesScript = readerPreferencesEnabled
151
+ ? getReaderPreferencesScript({
152
+ controls: presentation.readerPreferences.controls,
153
+ defaults: presentation.readerPreferences.defaults,
154
+ cookiePath: projectConfig.site.basePath,
155
+ })
156
+ : null;
120
157
  ---
121
158
 
122
159
  <!doctype html>
123
- <html lang={projectConfig.locale.lang} style={documentStyle}>
160
+ <html
161
+ lang={projectConfig.locale.lang}
162
+ data-appearance={presentation.readerPreferences.defaults.appearance}
163
+ data-image-presentation={visualTheme.images.presentation}
164
+ data-reading-width={presentation.readerPreferences.defaults.readingWidth}
165
+ data-focus-reading={presentation.readerPreferences.defaults.focusReading}
166
+ data-section-tracking={contentsNavigation ? 'enabled' : undefined}
167
+ style={documentStyle}
168
+ >
124
169
  <head>
125
170
  <meta charset="utf-8" />
126
171
  <meta name="viewport" content="width=device-width, initial-scale=1" />
127
172
  <meta name="format-detection" content="telephone=no" />
128
173
  {description && <meta name="description" content={description} />}
129
174
  <meta name="theme-color" content={presentation.palette.page.backgroundColor} />
175
+ {readerPreferencesScript && <script is:inline set:html={readerPreferencesScript} />}
130
176
  <link rel="canonical" href={canonicalUrl} />
131
177
  <meta name="generator" content={Astro.generator} />
132
178
  {iconLinks.map((iconLink) => (
@@ -45,13 +45,6 @@ export const getGeneratedImage = (src: string) => readGeneratedImages()[src];
45
45
 
46
46
  const displaySrc = (src: string) => withBasePath(projectConfig.site.basePath, src);
47
47
 
48
- export const getLinkedImageSrc = (src: string) => {
49
- const image = getGeneratedImage(src);
50
- return displaySrc(image?.kind === 'static'
51
- ? image.src ?? src
52
- : image?.variants?.at(-1)?.src ?? src);
53
- };
54
-
55
48
  const getDisplayVariants = (variants: NonNullable<GeneratedImage['variants']>) => {
56
49
  const sortedVariants = [...variants].sort((a, b) => a.width - b.width);
57
50
  const displayVariants = sortedVariants.filter((variant) => variant.width <= maxDisplayImageWidth);
@@ -0,0 +1,141 @@
1
+ const preferenceDefinitions = Object.freeze({
2
+ appearance: Object.freeze({
3
+ allowed: Object.freeze(['system', 'light', 'dark']),
4
+ cookieName: 'norna-appearance',
5
+ }),
6
+ readingWidth: Object.freeze({
7
+ allowed: Object.freeze(['narrow', 'standard', 'wide']),
8
+ cookieName: 'norna-reading-width',
9
+ }),
10
+ focusReading: Object.freeze({
11
+ allowed: Object.freeze(['off', 'on']),
12
+ cookieName: 'norna-focus-reading',
13
+ }),
14
+ });
15
+
16
+ export const getReaderPreferencesScript = ({ controls, defaults, cookiePath }) => `(() => {
17
+ const root = document.documentElement;
18
+ const controls = ${JSON.stringify(controls)};
19
+ const defaults = ${JSON.stringify(defaults)};
20
+ const cookiePath = ${JSON.stringify(cookiePath)};
21
+ const definitions = ${JSON.stringify(preferenceDefinitions)};
22
+ const values = { ...defaults };
23
+ const readCookie = (name) => {
24
+ const prefix = encodeURIComponent(name) + '=';
25
+ const cookie = document.cookie.split('; ').find((part) => part.startsWith(prefix));
26
+ return cookie ? decodeURIComponent(cookie.slice(prefix.length)) : null;
27
+ };
28
+ const writeCookie = (name, value, maxAge = 31536000) => {
29
+ try {
30
+ const secure = location.protocol === 'https:' ? '; Secure' : '';
31
+ document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value)
32
+ + '; Path=' + cookiePath + '; Max-Age=' + maxAge + '; SameSite=Lax' + secure;
33
+ } catch {}
34
+ };
35
+ const isAllowed = (name, value) => definitions[name].allowed.includes(value);
36
+ const captureReadingPosition = () => {
37
+ if (window.scrollY <= 1) return null;
38
+ const contentTop = document.querySelector('.site-top')?.getBoundingClientRect().bottom ?? 0;
39
+ const candidates = document.querySelectorAll([
40
+ '#main-content .section-header',
41
+ '#main-content .section-markdown > *',
42
+ '#main-content .image-stack',
43
+ '#main-content .image-carousel',
44
+ '#main-content .card-list',
45
+ ].join(', '));
46
+ const element = Array.from(candidates).find((candidate) => {
47
+ const rectangle = candidate.getBoundingClientRect();
48
+ return rectangle.height > 0 && rectangle.bottom > contentTop + 1;
49
+ });
50
+ return element ? { element, top: element.getBoundingClientRect().top } : null;
51
+ };
52
+ const restoreReadingPosition = (position) => {
53
+ if (!position) return;
54
+ requestAnimationFrame(() => {
55
+ const delta = position.element.getBoundingClientRect().top - position.top;
56
+ if (Math.abs(delta) < 0.5) return;
57
+ const scrollBehavior = root.style.scrollBehavior;
58
+ root.style.scrollBehavior = 'auto';
59
+ window.scrollBy(0, delta);
60
+ root.style.scrollBehavior = scrollBehavior;
61
+ });
62
+ };
63
+ const preserveReadingPosition = (change) => {
64
+ const position = captureReadingPosition();
65
+ change();
66
+ restoreReadingPosition(position);
67
+ };
68
+ const updateThemeColor = () => requestAnimationFrame(() => {
69
+ const themeColor = getComputedStyle(root).getPropertyValue('--color-page').trim();
70
+ if (themeColor) document.querySelectorAll('meta[name="theme-color"]').forEach((meta) => meta.content = themeColor);
71
+ });
72
+ const apply = (name, value, persist = false) => {
73
+ const nextValue = isAllowed(name, value) ? value : defaults[name];
74
+ values[name] = nextValue;
75
+ if (name === 'appearance') root.dataset.appearance = nextValue;
76
+ if (name === 'readingWidth') root.dataset.readingWidth = nextValue;
77
+ if (name === 'focusReading') root.dataset.focusReading = nextValue;
78
+ if (persist) writeCookie(definitions[name].cookieName, nextValue);
79
+ if (name === 'appearance') updateThemeColor();
80
+ };
81
+ for (const name of Object.keys(definitions)) {
82
+ const saved = controls[name] ? readCookie(definitions[name].cookieName) : null;
83
+ apply(name, saved && isAllowed(name, saved) ? saved : defaults[name]);
84
+ }
85
+ root.dataset.readerPreferencesReady = 'true';
86
+ const syncControls = () => {
87
+ document.querySelectorAll('[data-reader-appearance]').forEach((input) => {
88
+ input.checked = input.value === values.appearance;
89
+ });
90
+ document.querySelectorAll('[data-reader-width]').forEach((input) => {
91
+ input.checked = input.value === values.readingWidth;
92
+ });
93
+ document.querySelectorAll('[data-reader-focus]').forEach((input) => {
94
+ input.checked = values.focusReading === 'on';
95
+ });
96
+ };
97
+ document.addEventListener('DOMContentLoaded', () => {
98
+ syncControls();
99
+ document.querySelectorAll('[data-reader-appearance]').forEach((input) => {
100
+ input.addEventListener('change', () => {
101
+ if (input.checked) apply('appearance', input.value, true);
102
+ });
103
+ });
104
+ document.querySelectorAll('[data-reader-width]').forEach((input) => {
105
+ input.addEventListener('change', () => {
106
+ if (input.checked) preserveReadingPosition(() => apply('readingWidth', input.value, true));
107
+ });
108
+ });
109
+ document.querySelectorAll('[data-reader-focus]').forEach((input) => {
110
+ input.addEventListener('change', () => preserveReadingPosition(() => {
111
+ apply('focusReading', input.checked ? 'on' : 'off', true);
112
+ }));
113
+ });
114
+ document.querySelectorAll('[data-reader-reset]').forEach((button) => {
115
+ button.addEventListener('click', () => {
116
+ preserveReadingPosition(() => {
117
+ for (const name of Object.keys(definitions)) {
118
+ writeCookie(definitions[name].cookieName, '', 0);
119
+ apply(name, defaults[name]);
120
+ }
121
+ syncControls();
122
+ });
123
+ });
124
+ });
125
+ document.querySelectorAll('[data-display-settings]').forEach((settings) => {
126
+ settings.addEventListener('keydown', (event) => {
127
+ if (event.key !== 'Escape') return;
128
+ settings.removeAttribute('open');
129
+ settings.querySelector('summary')?.focus();
130
+ });
131
+ });
132
+ });
133
+ document.addEventListener('click', (event) => {
134
+ document.querySelectorAll('[data-display-settings][open]').forEach((settings) => {
135
+ if (!settings.contains(event.target)) settings.removeAttribute('open');
136
+ });
137
+ });
138
+ matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
139
+ if (values.appearance === 'system') updateThemeColor();
140
+ });
141
+ })();`;