@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,110 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { execFile } from 'node:child_process';
3
- import { access, cp, mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
4
- import path from 'node:path';
5
- import { promisify } from 'node:util';
6
-
7
- const execFileAsync = promisify(execFile);
8
- const repoRoot = path.resolve(import.meta.dirname, '..');
9
- const fixtureRoot = path.join(repoRoot, 'fixtures', 'nested-pages');
10
- const tempParent = path.join(repoRoot, 'node_modules', '.cache');
11
- await mkdir(tempParent, { recursive: true });
12
- const tempRoot = await mkdtemp(path.join(tempParent, 'norna-nested-pages-'));
13
- const fixtureCopyRoot = path.join(tempRoot, 'nested-pages');
14
- const nornaBin = path.join(repoRoot, 'bin', 'norna.mjs');
15
- const runNorna = (siteDir, ...args) => execFileAsync(process.execPath, [
16
- nornaBin,
17
- '--site-dir',
18
- siteDir,
19
- ...args,
20
- ], {
21
- cwd: repoRoot,
22
- maxBuffer: 1024 * 1024 * 10,
23
- });
24
- const runGit = (args) => execFileAsync('git', args, {
25
- cwd: fixtureCopyRoot,
26
- env: {
27
- ...process.env,
28
- GIT_AUTHOR_NAME: 'Norna Test',
29
- GIT_AUTHOR_EMAIL: 'norna@example.test',
30
- GIT_COMMITTER_NAME: 'Norna Test',
31
- GIT_COMMITTER_EMAIL: 'norna@example.test',
32
- },
33
- });
34
- const fileExists = (filePath) => access(filePath).then(() => true, () => false);
35
-
36
- try {
37
- await cp(fixtureRoot, fixtureCopyRoot, { recursive: true });
38
- const siteDir = path.join(fixtureCopyRoot, 'site');
39
- await runNorna(siteDir, 'content:check');
40
- await runNorna(siteDir, 'build');
41
-
42
- const distDir = path.join(fixtureCopyRoot, 'dist');
43
- const expectedPages = [
44
- 'index.html',
45
- 'guides/index.html',
46
- 'guides/installation/index.html',
47
- 'guides/installation/macos/index.html',
48
- 'guides/workflows/index.html',
49
- 'reference/index.html',
50
- 'reference/installation/index.html',
51
- ];
52
- for (const pagePath of expectedPages) {
53
- assert.match(await readFile(path.join(distDir, pagePath), 'utf8'), /<main\b[^>]*id="main-content"/);
54
- }
55
-
56
- const rootHtml = await readFile(path.join(distDir, 'index.html'), 'utf8');
57
- const guidesHtml = await readFile(path.join(distDir, 'guides', 'index.html'), 'utf8');
58
- const installationHtml = await readFile(path.join(distDir, 'guides', 'installation', 'index.html'), 'utf8');
59
- const macosHtml = await readFile(path.join(distDir, 'guides', 'installation', 'macos', 'index.html'), 'utf8');
60
- assert.match(rootHtml, /--color-page: #000000/);
61
- assert.match(guidesHtml, /--color-page: #ffffff/);
62
- assert.match(installationHtml, /--color-page: #ffffff/);
63
- assert.match(macosHtml, /--color-page: #ffffff/);
64
- assert.match(installationHtml, /Three nested page levels connected in sequence/);
65
- assert.match(installationHtml, /\/original\/pages\/010-guides\/pages\/010-installation\/images\/diagram-[a-f0-9]+\.svg/);
66
- assert.match(macosHtml, /class="site-nav-item site-nav-item-has-submenu site-nav-item-current-branch"/);
67
- assert.match(macosHtml, /href="\/guides\/installation\/macos\/" aria-current="page"/);
68
- assert.match(macosHtml, /<details class="mobile-navigation-branch" open>/);
69
- assert.match(macosHtml, /<nav class="site-breadcrumbs" aria-label="Breadcrumb"><ol><li><a href="\/guides\/">Guides<\/a><\/li><li><a href="\/guides\/installation\/">Installation<\/a><\/li><li><span aria-current="page">macOS<\/span>/);
70
- for (const submenuMatch of macosHtml.matchAll(/<div class="site-nav-submenu">([\s\S]*?)<\/div>/g)) {
71
- assert.doesNotMatch(submenuMatch[1], /href="[^"#]*#[^"]+"/);
72
- }
73
- assert.match(macosHtml, /<nav class="mobile-nav-view" aria-label="On this page">/);
74
- assert.ok(
75
- macosHtml.indexOf('href="/guides/installation/"') < macosHtml.indexOf('href="/guides/workflows/"'),
76
- 'Nested sibling navigation should follow page directory order.',
77
- );
78
-
79
- await runGit(['init']);
80
- await runGit(['add', '.']);
81
- await runGit(['commit', '-m', 'Initial nested fixture']);
82
- const installationContentPath = path.join(
83
- siteDir,
84
- 'pages',
85
- '010-guides',
86
- 'pages',
87
- '010-installation',
88
- 'content.md',
89
- );
90
- const workflowsContentPath = path.join(siteDir, 'pages', '010-guides', 'pages', '020-workflows', 'content.md');
91
- const imageBlockPattern = /\n```norna-image-stack\n[\s\S]*?\n```\n/;
92
- const installationContent = await readFile(installationContentPath, 'utf8');
93
- const imageBlock = installationContent.match(imageBlockPattern)?.[0];
94
- assert.ok(imageBlock, 'The nested fixture needs a managed image block to exercise content:sync.');
95
- await writeFile(installationContentPath, installationContent.replace(imageBlockPattern, '\n'));
96
- await writeFile(workflowsContentPath, `${await readFile(workflowsContentPath, 'utf8')}${imageBlock}`);
97
- await runGit(['add', '.']);
98
- await runGit(['commit', '-m', 'Move nested image reference']);
99
- await runNorna(siteDir, 'content:sync', '--yes');
100
-
101
- const previousImagePath = path.join(siteDir, 'pages', '010-guides', 'pages', '010-installation', 'images', 'diagram.svg');
102
- const nextImagePath = path.join(siteDir, 'pages', '010-guides', 'pages', '020-workflows', 'images', 'diagram.svg');
103
- assert.equal(await fileExists(previousImagePath), false);
104
- assert.equal(await fileExists(nextImagePath), true);
105
- await runNorna(siteDir, 'content:check');
106
-
107
- console.log('Nested pages fixture check passed.');
108
- } finally {
109
- await rm(tempRoot, { recursive: true, force: true });
110
- }
@@ -1,531 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { cp, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
3
- import { spawn } from 'node:child_process';
4
- import { tmpdir } from 'node:os';
5
- import path from 'node:path';
6
- import { fileURLToPath } from 'node:url';
7
-
8
- const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
9
-
10
- const run = (command, args, options = {}) => new Promise((resolve, reject) => {
11
- const child = spawn(command, args, {
12
- cwd: repoRoot,
13
- stdio: ['ignore', 'pipe', 'pipe'],
14
- ...options,
15
- });
16
- let stdout = '';
17
- let stderr = '';
18
-
19
- child.stdout?.on('data', (chunk) => {
20
- stdout += chunk;
21
- });
22
- child.stderr?.on('data', (chunk) => {
23
- stderr += chunk;
24
- });
25
- child.once('error', reject);
26
- child.once('exit', (code, signal) => {
27
- if (code === 0) {
28
- resolve({ stdout, stderr });
29
- return;
30
- }
31
-
32
- const commandText = [command, ...args].join(' ');
33
- reject(new Error([
34
- signal
35
- ? `${commandText} exited with signal ${signal}.`
36
- : `${commandText} exited with code ${code}.`,
37
- stdout.trim(),
38
- stderr.trim(),
39
- ].filter(Boolean).join('\n')));
40
- });
41
- });
42
-
43
- const runInherit = (command, args, options = {}) => new Promise((resolve, reject) => {
44
- const child = spawn(command, args, {
45
- cwd: repoRoot,
46
- stdio: 'inherit',
47
- ...options,
48
- });
49
-
50
- child.once('error', reject);
51
- child.once('exit', (code, signal) => {
52
- if (code === 0) {
53
- resolve();
54
- return;
55
- }
56
-
57
- const commandText = [command, ...args].join(' ');
58
- reject(new Error(signal
59
- ? `${commandText} exited with signal ${signal}.`
60
- : `${commandText} exited with code ${code}.`));
61
- });
62
- });
63
-
64
- const runExpectFailure = async (command, args, options = {}, expectedText) => {
65
- try {
66
- await run(command, args, options);
67
- } catch (error) {
68
- const message = error instanceof Error ? error.message : String(error);
69
-
70
- if (message.includes(expectedText)) {
71
- return;
72
- }
73
-
74
- throw new Error(`Expected failing command output to include "${expectedText}".\n${message}`);
75
- }
76
-
77
- throw new Error(`Expected command to fail: ${[command, ...args].join(' ')}`);
78
- };
79
-
80
- const npmBin = process.platform === 'win32' ? 'npm.cmd' : 'npm';
81
- const npxBin = process.platform === 'win32' ? 'npx.cmd' : 'npx';
82
- const tempRoot = await mkdtemp(path.join(tmpdir(), 'norna-package-check-'));
83
- const packDir = path.join(tempRoot, 'pack');
84
- const unpackDir = path.join(tempRoot, 'unpack');
85
- const siteProjectRoot = path.join(tempRoot, 'site-project');
86
- const initializedSiteRoot = path.join(tempRoot, 'initialized-site');
87
- const npmCachePath = path.resolve(
88
- repoRoot,
89
- process.env.NORNA_PACKAGE_CHECK_CACHE
90
- ?? path.join('node_modules', '.cache', 'norna-package-check-npm'),
91
- );
92
- const npmEnv = {
93
- ...process.env,
94
- npm_config_cache: npmCachePath,
95
- };
96
-
97
- const assertFileExists = async (filePath) => {
98
- try {
99
- await readFile(filePath);
100
- } catch (error) {
101
- if (error?.code === 'ENOENT') {
102
- throw new Error(`Packed package is missing ${path.relative(unpackDir, filePath)}.`);
103
- }
104
-
105
- throw error;
106
- }
107
- };
108
-
109
- const assertFileMissing = async (filePath) => {
110
- try {
111
- await readFile(filePath);
112
- } catch (error) {
113
- if (error?.code === 'ENOENT') {
114
- return;
115
- }
116
-
117
- throw error;
118
- }
119
-
120
- throw new Error(`Unexpected file exists: ${filePath}.`);
121
- };
122
-
123
- const assertFileIncludes = async (filePath, expectedText) => {
124
- const fileContent = await readFile(filePath, 'utf8');
125
-
126
- if (!fileContent.includes(expectedText)) {
127
- throw new Error(`Expected ${filePath} to include: ${expectedText}`);
128
- }
129
- };
130
-
131
- const assertFileExcludes = async (filePath, unexpectedText) => {
132
- const fileContent = await readFile(filePath, 'utf8');
133
-
134
- if (fileContent.includes(unexpectedText)) {
135
- throw new Error(`Expected ${filePath} not to include: ${unexpectedText}`);
136
- }
137
- };
138
-
139
- try {
140
- await mkdir(packDir, { recursive: true });
141
- await mkdir(npmCachePath, { recursive: true });
142
- const packResult = await run(npmBin, ['pack', '--pack-destination', packDir], {
143
- env: npmEnv,
144
- });
145
- const tarballName = packResult.stdout.trim().split('\n').at(-1);
146
-
147
- if (!tarballName?.endsWith('.tgz')) {
148
- throw new Error(`npm pack did not report a tarball name.\n${packResult.stdout}${packResult.stderr}`);
149
- }
150
-
151
- const tarballPath = path.join(packDir, tarballName);
152
- await mkdir(unpackDir, { recursive: true });
153
- await runInherit('tar', ['-xzf', tarballPath, '-C', unpackDir]);
154
- const packagedStarterRoot = path.join(unpackDir, 'package', 'starters', 'basic');
155
- await Promise.all([
156
- assertFileExists(path.join(unpackDir, 'package', 'docs', 'README.md')),
157
- assertFileExists(path.join(unpackDir, 'package', 'docs', 'configuration.md')),
158
- assertFileExists(path.join(unpackDir, 'package', 'docs', 'images-and-metadata.md')),
159
- assertFileExists(path.join(unpackDir, 'package', 'schemas', 'manifest.json')),
160
- assertFileExists(path.join(unpackDir, 'package', 'schemas', 'config.schema.json')),
161
- assertFileExists(path.join(unpackDir, 'package', 'schemas', 'content-frontmatter.schema.json')),
162
- assertFileExists(path.join(unpackDir, 'package', 'schemas', 'sitewide-content.schema.json')),
163
- assertFileExists(path.join(unpackDir, 'package', 'schemas', 'theme.schema.json')),
164
- assertFileExists(path.join(packagedStarterRoot, '.github', 'workflows', 'deploy.yml')),
165
- assertFileExists(path.join(packagedStarterRoot, 'package.json')),
166
- assertFileExists(path.join(packagedStarterRoot, 'README.md')),
167
- assertFileExists(path.join(packagedStarterRoot, 'site', 'config.yaml')),
168
- assertFileExists(path.join(packagedStarterRoot, 'site', 'theme.yaml')),
169
- assertFileExists(path.join(packagedStarterRoot, 'site', 'sitewide-content.yaml')),
170
- assertFileExists(path.join(packagedStarterRoot, 'site', 'content.md')),
171
- assertFileExists(path.join(packagedStarterRoot, 'site', 'images', '.gitkeep')),
172
- assertFileExists(path.join(packagedStarterRoot, 'site', 'public', 'robots.txt')),
173
- ]);
174
- await assertFileIncludes(
175
- path.join(packagedStarterRoot, '.github', 'workflows', 'deploy.yml'),
176
- 'node-version: 24.18.0',
177
- );
178
- await assertFileIncludes(
179
- path.join(packagedStarterRoot, '.github', 'workflows', 'deploy.yml'),
180
- 'run: npm run norna:build',
181
- );
182
- await cp(packagedStarterRoot, siteProjectRoot, {
183
- recursive: true,
184
- });
185
- const packageJsonPath = path.join(siteProjectRoot, 'package.json');
186
- const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8'));
187
- assert.equal(packageJson.scripts['norna:check'], 'norna check');
188
- packageJson.name = 'norna-package-check-site';
189
- packageJson.dependencies['@janga/norna'] = tarballPath;
190
- await writeFile(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\n`);
191
- const packageCheckConfigPath = path.join(siteProjectRoot, 'site', 'config.yaml');
192
- const packageCheckConfig = await readFile(packageCheckConfigPath, 'utf8');
193
- await writeFile(
194
- packageCheckConfigPath,
195
- packageCheckConfig.replace('url: https://example.com/', 'url: https://example.com/site/'),
196
- );
197
- const packageCheckSitewidePath = path.join(siteProjectRoot, 'site', 'sitewide-content.yaml');
198
- const packageCheckSitewide = await readFile(packageCheckSitewidePath, 'utf8');
199
- await writeFile(
200
- packageCheckSitewidePath,
201
- `logo:\n height: 2.6rem\n${packageCheckSitewide}`,
202
- );
203
- await writeFile(
204
- path.join(siteProjectRoot, 'site', 'public', 'logo.svg'),
205
- '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" fill="black"/></svg>\n',
206
- );
207
- await writeFile(path.join(siteProjectRoot, 'site', 'content.md'), `---
208
- page:
209
- description: Site used by package checks.
210
- ---
211
-
212
- # Package Check Site
213
-
214
- ## Intro {#intro}
215
-
216
- This page verifies that **packaged norna sites** can build with the current content model.
217
-
218
- <!-- norna-image-provenance:
219
- image: package-check.svg
220
- source: package check fixture
221
- -->
222
-
223
- ## **Warning** {#warning}
224
-
225
- This section verifies styled section headings.
226
-
227
- ## Work {#work}
228
-
229
- This section keeps the package check independent from user-facing starter copy.
230
- `);
231
- await mkdir(path.join(siteProjectRoot, 'site', 'pages', '010-about'), { recursive: true });
232
- await writeFile(path.join(siteProjectRoot, 'site', 'pages', '010-about', 'content.md'), `---
233
- page:
234
- description: Page used by package checks.
235
- ---
236
-
237
- # About the site
238
-
239
- ## About {#about}
240
-
241
- This page verifies that packaged norna sites can build additional pages.
242
- `);
243
-
244
- await runInherit(npmBin, ['install', '--no-audit', '--no-fund', '--prefer-offline', '--fetch-retries=0'], { cwd: siteProjectRoot, env: npmEnv });
245
- const nornaBinPath = path.join(siteProjectRoot, 'node_modules', '.bin', process.platform === 'win32' ? 'norna.cmd' : 'norna');
246
- await runInherit(nornaBinPath, ['init', initializedSiteRoot], { cwd: tempRoot, env: npmEnv });
247
- await Promise.all([
248
- assertFileExists(path.join(initializedSiteRoot, 'package.json')),
249
- assertFileExists(path.join(initializedSiteRoot, 'site', 'config.yaml')),
250
- assertFileExists(path.join(initializedSiteRoot, 'site', 'theme.yaml')),
251
- assertFileMissing(path.join(initializedSiteRoot, '.DS_Store')),
252
- assertFileMissing(path.join(initializedSiteRoot, 'site', '.DS_Store')),
253
- ]);
254
- await runInherit(npxBin, ['norna', 'engine:version'], { cwd: path.join(siteProjectRoot, 'site', 'images'), env: npmEnv });
255
- await runInherit(npxBin, ['norna', 'doctor'], { cwd: path.join(siteProjectRoot, 'site', 'images'), env: npmEnv });
256
- await runInherit(npxBin, ['norna', 'config:check'], { cwd: path.join(siteProjectRoot, 'site', 'images'), env: npmEnv });
257
- await runInherit(npxBin, ['norna', 'content:check'], { cwd: siteProjectRoot, env: npmEnv });
258
- await runInherit(npxBin, ['norna', 'check'], { cwd: siteProjectRoot, env: npmEnv });
259
- await runInherit(npxBin, ['norna', 'build'], { cwd: siteProjectRoot, env: npmEnv });
260
- await assertFileExists(path.join(siteProjectRoot, 'site', '.norna', 'public', 'robots.txt'));
261
- await assertFileExists(path.join(siteProjectRoot, 'dist', 'robots.txt'));
262
- await assertFileExists(path.join(siteProjectRoot, 'dist', 'about', 'index.html'));
263
- await assertFileMissing(path.join(siteProjectRoot, 'public', 'robots.txt'));
264
- await assertFileExcludes(
265
- path.join(siteProjectRoot, 'dist', 'index.html'),
266
- 'href="/favicon.svg"',
267
- );
268
- await assertFileExcludes(
269
- path.join(siteProjectRoot, 'dist', 'index.html'),
270
- 'href="/favicon.ico"',
271
- );
272
- await assertFileIncludes(
273
- path.join(siteProjectRoot, 'dist', 'index.html'),
274
- '--section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem)',
275
- );
276
- await assertFileIncludes(
277
- path.join(siteProjectRoot, 'dist', 'index.html'),
278
- '--section-heading-font-weight: 400',
279
- );
280
- await assertFileIncludes(
281
- path.join(siteProjectRoot, 'dist', 'index.html'),
282
- '--section-heading-spacing-after: 0.55em',
283
- );
284
- await assertFileIncludes(
285
- path.join(siteProjectRoot, 'dist', 'index.html'),
286
- '--section-markdown-h3-spacing-before: 1.5em',
287
- );
288
- await assertFileIncludes(
289
- path.join(siteProjectRoot, 'dist', 'index.html'),
290
- "--font-sans: Arial, 'Helvetica Neue', Helvetica, sans-serif",
291
- );
292
- await assertFileIncludes(
293
- path.join(siteProjectRoot, 'dist', 'index.html'),
294
- '<meta name="format-detection" content="telephone=no">',
295
- );
296
- await assertFileIncludes(
297
- path.join(siteProjectRoot, 'dist', 'index.html'),
298
- 'style="scroll-behavior: auto;',
299
- );
300
- await assertFileExcludes(
301
- path.join(siteProjectRoot, 'dist', 'index.html'),
302
- 'data-smooth-scroll=',
303
- );
304
- await assertFileIncludes(
305
- path.join(siteProjectRoot, 'dist', 'about', 'index.html'),
306
- '<link rel="canonical" href="https://example.com/site/about/">',
307
- );
308
- await assertFileIncludes(
309
- path.join(siteProjectRoot, 'dist', 'about', 'index.html'),
310
- 'href="/site/about/" aria-current="page"',
311
- );
312
- await assertFileIncludes(
313
- path.join(siteProjectRoot, 'dist', 'index.html'),
314
- '<a class="site-brand" href="/site/"><img class="site-brand-logo" src="/site/logo.svg" alt="Package Check Site">',
315
- );
316
- await assertFileExcludes(
317
- path.join(siteProjectRoot, 'dist', 'index.html'),
318
- '<div class="site-nav-submenu">',
319
- );
320
- await assertFileIncludes(
321
- path.join(siteProjectRoot, 'dist', 'index.html'),
322
- 'href="/site/about/">About the site</a>',
323
- );
324
- await assertFileIncludes(
325
- path.join(siteProjectRoot, 'dist', 'index.html'),
326
- '<nav class="page-nav" aria-label="On this page">',
327
- );
328
- await assertFileIncludes(
329
- path.join(siteProjectRoot, 'dist', 'index.html'),
330
- 'href="#intro">Intro</a>',
331
- );
332
- await assertFileIncludes(
333
- path.join(siteProjectRoot, 'dist', 'index.html'),
334
- '--section-body-align-mobile: left',
335
- );
336
- await assertFileIncludes(
337
- path.join(siteProjectRoot, 'dist', 'index.html'),
338
- '--section-body-line-height: 1.5',
339
- );
340
- await assertFileIncludes(
341
- path.join(siteProjectRoot, 'dist', 'index.html'),
342
- '--section-body-width-desktop: min(72ch, var(--text-width))',
343
- );
344
- await assertFileExcludes(
345
- path.join(siteProjectRoot, 'dist', 'index.html'),
346
- 'norna-image-provenance',
347
- );
348
- await assertFileIncludes(
349
- path.join(siteProjectRoot, 'dist', 'index.html'),
350
- '--section-body-paragraph-spacing: 0.85em',
351
- );
352
- await assertFileIncludes(
353
- path.join(siteProjectRoot, 'dist', 'index.html'),
354
- '--section-caption-line-height: 1.35',
355
- );
356
- await assertFileIncludes(
357
- path.join(siteProjectRoot, 'dist', 'index.html'),
358
- '--section-caption-spacing-before: 0.5em',
359
- );
360
- await assertFileIncludes(
361
- path.join(siteProjectRoot, 'dist', 'index.html'),
362
- '--section-caption-font-size-desktop: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem)',
363
- );
364
- await assertFileExcludes(
365
- path.join(siteProjectRoot, 'dist', 'index.html'),
366
- 'class="inline-style',
367
- );
368
- await assertFileIncludes(
369
- path.join(siteProjectRoot, 'dist', 'index.html'),
370
- 'data-section-title="Warning"',
371
- );
372
- await assertFileIncludes(
373
- path.join(siteProjectRoot, 'dist', 'index.html'),
374
- 'href="#warning">Warning</a>',
375
- );
376
- await assertFileIncludes(
377
- path.join(siteProjectRoot, 'dist', 'index.html'),
378
- '--section-background-color: #000000',
379
- );
380
- await assertFileIncludes(
381
- path.join(siteProjectRoot, 'dist', 'index.html'),
382
- '--section-background-color: #171717',
383
- );
384
- await assertFileIncludes(
385
- path.join(siteProjectRoot, 'dist', 'index.html'),
386
- '--section-background-color: #252525',
387
- );
388
- await assertFileIncludes(
389
- path.join(siteProjectRoot, 'dist', 'index.html'),
390
- '--site-top-background-color: #000000',
391
- );
392
- await assertFileIncludes(
393
- path.join(siteProjectRoot, 'dist', 'index.html'),
394
- '--site-top-text-color: #f2eee6',
395
- );
396
- await assertFileIncludes(
397
- path.join(siteProjectRoot, 'dist', 'index.html'),
398
- '--site-footer-background-color: #000000',
399
- );
400
- await assertFileIncludes(
401
- path.join(siteProjectRoot, 'dist', 'index.html'),
402
- '--site-footer-text-color: #f2eee6',
403
- );
404
- await assertFileIncludes(
405
- path.join(siteProjectRoot, 'dist', 'index.html'),
406
- '--section-text-color: #f2eee6',
407
- );
408
- await writeFile(path.join(siteProjectRoot, 'site', 'public', 'favicon.ico'), 'fake icon');
409
- await runInherit(npxBin, ['norna', 'build'], { cwd: siteProjectRoot, env: npmEnv });
410
- await assertFileExists(path.join(siteProjectRoot, 'dist', 'favicon.ico'));
411
- await assertFileIncludes(
412
- path.join(siteProjectRoot, 'dist', 'index.html'),
413
- '<link rel="icon" sizes="any" href="/site/favicon.ico">',
414
- );
415
- await assertFileExcludes(
416
- path.join(siteProjectRoot, 'dist', 'index.html'),
417
- 'href="/favicon.svg"',
418
- );
419
- const siteContentPath = path.join(siteProjectRoot, 'site', 'content.md');
420
- const siteContent = await readFile(siteContentPath, 'utf8');
421
- const siteThemePath = path.join(siteProjectRoot, 'site', 'theme.yaml');
422
- const siteTheme = await readFile(siteThemePath, 'utf8');
423
- await writeFile(siteThemePath, siteTheme.replace('\n profile: restrained', '\n profile: noisy'));
424
- await runExpectFailure(
425
- npxBin,
426
- ['norna', 'build'],
427
- { cwd: siteProjectRoot, env: npmEnv },
428
- 'Unknown typography profile: noisy',
429
- );
430
- await writeFile(
431
- siteThemePath,
432
- siteTheme.replace('\npalette: dark', '\npalette: neon'),
433
- );
434
- await runExpectFailure(
435
- npxBin,
436
- ['norna', 'build'],
437
- { cwd: siteProjectRoot, env: npmEnv },
438
- 'palette',
439
- );
440
- await writeFile(
441
- siteThemePath,
442
- siteTheme.replace('\nsectionSurfaces: [base, soft, emphasis]', '\nsectionSurfaces: [base, glowing]'),
443
- );
444
- await runExpectFailure(
445
- npxBin,
446
- ['norna', 'build'],
447
- { cwd: siteProjectRoot, env: npmEnv },
448
- 'Unknown section surface "glowing"',
449
- );
450
- await writeFile(
451
- siteThemePath,
452
- siteTheme.replace('\nsectionSurfaces: [base, soft, emphasis]', '\nsectionSurfaces: [base, base]'),
453
- );
454
- await runExpectFailure(
455
- npxBin,
456
- ['norna', 'build'],
457
- { cwd: siteProjectRoot, env: npmEnv },
458
- 'Each section surface may appear only once',
459
- );
460
- await writeFile(siteThemePath, siteTheme);
461
- await writeFile(
462
- siteContentPath,
463
- siteContent.replace(
464
- 'This page verifies that **packaged norna sites** can build with the current content model.',
465
- 'This page verifies that [packaged norna sites]{.highlight} can build with the current content model.',
466
- ),
467
- );
468
- await runExpectFailure(
469
- npxBin,
470
- ['norna', 'build'],
471
- { cwd: siteProjectRoot, env: npmEnv },
472
- 'Inline color style ".highlight" is no longer supported',
473
- );
474
- await writeFile(siteContentPath, siteContent);
475
- await writeFile(
476
- siteContentPath,
477
- siteContent.replace(
478
- 'description: Site used by package checks.',
479
- 'description: Site used by package checks.\ntypography:\n overrides:\n body:\n lineHeight: tight',
480
- ),
481
- );
482
- await runExpectFailure(
483
- npxBin,
484
- ['norna', 'build'],
485
- { cwd: siteProjectRoot, env: npmEnv },
486
- 'typography',
487
- );
488
- await writeFile(
489
- siteContentPath,
490
- siteContent.replace(
491
- 'description: Site used by package checks.',
492
- 'description: Site used by package checks.\nsections:\n intro: {}',
493
- ),
494
- );
495
- await runExpectFailure(
496
- npxBin,
497
- ['norna', 'build'],
498
- { cwd: siteProjectRoot, env: npmEnv },
499
- 'defines "sections" at the top level, but it is not a valid top-level content field',
500
- );
501
- await writeFile(
502
- siteThemePath,
503
- siteTheme.replace(
504
- 'fontFamily: "Arial, \'Helvetica Neue\', Helvetica, sans-serif"',
505
- 'fontFamily: "Arial; color: red"',
506
- ),
507
- );
508
- await runExpectFailure(
509
- npxBin,
510
- ['norna', 'config:check'],
511
- { cwd: siteProjectRoot, env: npmEnv },
512
- 'typography.fontFamily',
513
- );
514
- await writeFile(siteThemePath, siteTheme);
515
- const siteConfigPath = path.join(siteProjectRoot, 'site', 'config.yaml');
516
- const siteConfig = await readFile(siteConfigPath, 'utf8');
517
- await writeFile(
518
- siteConfigPath,
519
- siteConfig.replace('url: https://example.com/site/', 'url: example.com/site/'),
520
- );
521
- await runExpectFailure(
522
- npxBin,
523
- ['norna', 'config:check'],
524
- { cwd: siteProjectRoot, env: npmEnv },
525
- 'url must be an absolute URL',
526
- );
527
-
528
- console.log('Package check passed.');
529
- } finally {
530
- await rm(tempRoot, { force: true, recursive: true });
531
- }