@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 +0,0 @@
1
- url: http://localhost:4321/
@@ -1,15 +0,0 @@
1
- ---
2
- page:
3
- description: A focused fixture for nested Norna pages.
4
- ---
5
-
6
- # Nested pages
7
-
8
- ## Start here
9
-
10
- This fixture shows how parent and child pages form paths and navigation.
11
-
12
- ## What to inspect
13
-
14
- Open Guides, Installation and macOS in sequence. Reference contains another
15
- Installation page to verify that page ids only need to be unique among siblings.
@@ -1,15 +0,0 @@
1
- ---
2
- page:
3
- description: The parent page for nested guides.
4
- ---
5
-
6
- # Guides
7
-
8
- ## Guide overview
9
-
10
- Guides is a top-level page and the parent of Installation and Workflows.
11
-
12
- ## Inherited presentation
13
-
14
- This page defines a local theme. Its descendants inherit that theme unless they
15
- define their own.
@@ -1,21 +0,0 @@
1
- ---
2
- page:
3
- description: A nested installation guide.
4
- ---
5
-
6
- # Installation
7
-
8
- ## Installation details
9
-
10
- This page should be available at `/guides/installation/` and inherit the Guides
11
- theme.
12
-
13
- ## Examples
14
-
15
- The managed image belongs to this nested page and section.
16
-
17
- ```norna-image-stack
18
- - image: diagram.svg
19
- alt: Three nested page levels connected in sequence.
20
- caption: A managed SVG resolved from the nested page image directory.
21
- ```
@@ -1,21 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 240" role="img" aria-labelledby="title desc">
2
- <title id="title">Nested pages</title>
3
- <desc id="desc">Three page boxes connected from Guides to Installation to macOS.</desc>
4
- <rect width="900" height="240" fill="#f3f0e8"/>
5
- <g fill="#fff" stroke="#191919" stroke-width="3">
6
- <rect x="45" y="65" width="210" height="110" rx="6"/>
7
- <rect x="345" y="65" width="210" height="110" rx="6"/>
8
- <rect x="645" y="65" width="210" height="110" rx="6"/>
9
- </g>
10
- <g fill="#191919" font-family="system-ui, sans-serif" font-size="26" text-anchor="middle">
11
- <text x="150" y="130">Guides</text>
12
- <text x="450" y="130">Installation</text>
13
- <text x="750" y="130">macOS</text>
14
- </g>
15
- <g fill="none" stroke="#b33a2b" stroke-width="4">
16
- <path d="M270 120h55"/>
17
- <path d="m315 110 10 10-10 10"/>
18
- <path d="M570 120h55"/>
19
- <path d="m615 110 10 10-10 10"/>
20
- </g>
21
- </svg>
@@ -1,14 +0,0 @@
1
- ---
2
- page:
3
- description: A third-level macOS installation page.
4
- ---
5
-
6
- # macOS
7
-
8
- ## Install
9
-
10
- This third-level page should be available at `/guides/installation/macos/`.
11
-
12
- ## Verify
13
-
14
- The page should inherit the theme from Guides through its parent page.
@@ -1,11 +0,0 @@
1
- ---
2
- page:
3
- description: A sibling page ordered after Installation.
4
- ---
5
-
6
- # Workflows
7
-
8
- ## Local work
9
-
10
- This sibling follows Installation because `020-workflows` follows
11
- `010-installation`.
@@ -1,3 +0,0 @@
1
- typography:
2
- profile: statement
3
- palette: light
@@ -1,10 +0,0 @@
1
- ---
2
- page:
3
- description: A second top-level branch.
4
- ---
5
-
6
- # Reference
7
-
8
- ## Reference overview
9
-
10
- Reference follows Guides and has its own child named Installation.
@@ -1,11 +0,0 @@
1
- ---
2
- page:
3
- description: A duplicate local page id in a different branch.
4
- ---
5
-
6
- # Reference installation
7
-
8
- ## Options
9
-
10
- This page should be available at `/reference/installation/` without conflicting
11
- with `/guides/installation/`.
@@ -1,3 +0,0 @@
1
- typography:
2
- profile: reading
3
- palette: dark
@@ -1,69 +0,0 @@
1
- import { cp, mkdir, mkdtemp, readFile, rm } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import path from 'node:path';
4
- import { fileURLToPath } from 'node:url';
5
- import { getExampleSites } from './lib/example-sites.mjs';
6
- import projectConfig from './lib/project-config.mjs';
7
- import { runInherit } from './lib/run-command.mjs';
8
-
9
- const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
10
- const cliPath = path.join(root, 'bin', 'norna.mjs');
11
- const distDirectory = path.join(root, 'dist');
12
- const temporaryDirectory = await mkdtemp(path.join(tmpdir(), 'norna-pages-'));
13
- const artifactDirectory = path.join(temporaryDirectory, 'artifact');
14
- const documentationUrl = new URL(projectConfig.site.url);
15
- const documentationBasePath = projectConfig.site.basePath;
16
- const examples = await getExampleSites(root);
17
- let artifactStarted = false;
18
-
19
- const buildSite = (siteLabel, env = process.env) => runInherit(
20
- process.execPath,
21
- [cliPath, ...(siteLabel ? ['--site-dir', siteLabel] : []), 'build'],
22
- { cwd: root, env },
23
- );
24
-
25
- try {
26
- console.log('Building documentation site');
27
- await buildSite();
28
- await cp(distDirectory, artifactDirectory, { recursive: true });
29
- artifactStarted = true;
30
-
31
- for (const example of examples) {
32
- const relativePublicPath = `examples/${example.category}/${example.name}/`;
33
- const siteUrl = new URL(relativePublicPath, documentationUrl).href;
34
-
35
- console.log(`\nBuilding ${example.siteLabel} for ${siteUrl}`);
36
- await buildSite(example.siteLabel, {
37
- ...process.env,
38
- NORNA_SITE_URL: siteUrl,
39
- });
40
-
41
- const destination = path.join(artifactDirectory, relativePublicPath);
42
- await mkdir(path.dirname(destination), { recursive: true });
43
- await cp(distDirectory, destination, { recursive: true });
44
- }
45
- } finally {
46
- if (artifactStarted) {
47
- await rm(distDirectory, { recursive: true, force: true });
48
- await cp(artifactDirectory, distDirectory, { recursive: true });
49
- }
50
- await rm(temporaryDirectory, { recursive: true, force: true });
51
- }
52
-
53
- const documentationExamplesHtml = await readFile(path.join(distDirectory, 'examples', 'index.html'), 'utf8');
54
-
55
- for (const example of examples) {
56
- const relativePublicPath = `examples/${example.category}/${example.name}/`;
57
- const basePath = `${documentationBasePath.replace(/\/$/, '')}/${relativePublicPath}`;
58
- const siteUrl = new URL(relativePublicPath, documentationUrl).href;
59
- const exampleHtml = await readFile(path.join(distDirectory, relativePublicPath, 'index.html'), 'utf8');
60
-
61
- if (!documentationExamplesHtml.includes(`href="${siteUrl}"`)) {
62
- throw new Error(`Documentation is missing the rendered example link ${siteUrl}.`);
63
- }
64
- if (!exampleHtml.includes(`href="${basePath}`) && !exampleHtml.includes(`src="${basePath}`)) {
65
- throw new Error(`Rendered example ${relativePublicPath} does not use its deployment base path ${basePath}.`);
66
- }
67
- }
68
-
69
- console.log(`\nok - assembled documentation and ${examples.length} rendered examples in dist/`);
@@ -1,37 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { readdir } from 'node:fs/promises';
3
- import path from 'node:path';
4
-
5
- export const exampleCategories = ['complete-sites', 'feature-demos'];
6
-
7
- export const getExampleSites = async (root) => {
8
- const examples = [];
9
-
10
- for (const category of exampleCategories) {
11
- const categoryDirectory = path.join(root, 'examples', category);
12
- const entries = await readdir(categoryDirectory, { withFileTypes: true });
13
-
14
- for (const entry of entries.filter((candidate) => candidate.isDirectory()).sort((a, b) => a.name.localeCompare(b.name))) {
15
- const siteDirectory = path.join(categoryDirectory, entry.name, 'site');
16
- if (!existsSync(path.join(siteDirectory, 'config.yaml'))) {
17
- throw new Error(`Example ${path.relative(root, siteDirectory)} is missing config.yaml.`);
18
- }
19
- if (!existsSync(path.join(siteDirectory, 'content.md'))) {
20
- throw new Error(`Example ${path.relative(root, siteDirectory)} is missing content.md.`);
21
- }
22
-
23
- examples.push({
24
- category,
25
- name: entry.name,
26
- siteDirectory,
27
- siteLabel: path.relative(root, siteDirectory),
28
- });
29
- }
30
- }
31
-
32
- if (examples.length === 0) {
33
- throw new Error('No example sites were found.');
34
- }
35
-
36
- return examples;
37
- };
@@ -1,113 +0,0 @@
1
- const countIndent = (line) => line.match(/^\s*/)?.[0].length ?? 0;
2
-
3
- const stripInlineComment = (value) => {
4
- let quote = null;
5
-
6
- for (let index = 0; index < value.length; index += 1) {
7
- const character = value[index];
8
- const previous = value[index - 1];
9
-
10
- if ((character === '"' || character === "'") && previous !== '\\') {
11
- quote = quote === character ? null : quote ?? character;
12
- continue;
13
- }
14
-
15
- if (character === '#' && quote === null && /\s/.test(previous ?? '')) {
16
- return value.slice(0, index).trimEnd();
17
- }
18
- }
19
-
20
- return value;
21
- };
22
-
23
- const splitInlineList = (value) => {
24
- const entries = [];
25
- let entryStart = 0;
26
- let quote = null;
27
-
28
- for (let index = 0; index < value.length; index += 1) {
29
- const character = value[index];
30
- const previous = value[index - 1];
31
-
32
- if ((character === '"' || character === "'") && previous !== '\\') {
33
- quote = quote === character ? null : quote ?? character;
34
- continue;
35
- }
36
-
37
- if (character === ',' && quote === null) {
38
- entries.push(value.slice(entryStart, index).trim());
39
- entryStart = index + 1;
40
- }
41
- }
42
-
43
- entries.push(value.slice(entryStart).trim());
44
- return entries.filter(Boolean);
45
- };
46
-
47
- const parseScalar = (rawValue) => {
48
- const value = stripInlineComment(rawValue.trim());
49
-
50
- if (value.startsWith('[') && value.endsWith(']')) {
51
- const listValue = value.slice(1, -1).trim();
52
- return listValue ? splitInlineList(listValue).map(parseScalar) : [];
53
- }
54
- if (value === 'true') return true;
55
- if (value === 'false') return false;
56
- if (/^-?\d+(?:\.\d+)?$/.test(value)) return Number(value);
57
- if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
58
- return value.slice(1, -1);
59
- }
60
-
61
- return value;
62
- };
63
-
64
- export const parseMapping = (lines, startIndex = 0, baseIndent = -1) => {
65
- const value = {};
66
- let index = startIndex;
67
-
68
- while (index < lines.length) {
69
- const line = lines[index];
70
- if (!line.trim() || line.trim().startsWith('#')) {
71
- index += 1;
72
- continue;
73
- }
74
-
75
- const indent = countIndent(line);
76
- if (indent <= baseIndent) break;
77
- if (line.trim().startsWith('- ')) break;
78
-
79
- const match = line.trim().match(/^([a-zA-Z][a-zA-Z0-9-]*):(?:\s+(.*))?$/);
80
- if (!match) break;
81
-
82
- const [, key, rawValue] = match;
83
- if (rawValue === undefined) {
84
- const parsed = parseMapping(lines, index + 1, indent);
85
- value[key] = parsed.value;
86
- index = parsed.nextIndex;
87
- } else {
88
- value[key] = parseScalar(rawValue);
89
- index += 1;
90
- }
91
- }
92
-
93
- return { value, nextIndex: index };
94
- };
95
-
96
- export const parseYamlMapping = (source) => parseMapping(source.split(/\r?\n/)).value;
97
-
98
- export const findMap = (lines, label, parentStart = 0, parentEnd = lines.length, requiredIndent = null) => {
99
- for (let index = parentStart; index < parentEnd; index += 1) {
100
- const line = lines[index];
101
- const match = line.match(/^(\s*)([a-zA-Z][a-zA-Z0-9-]*):\s*$/);
102
- if (!match || match[2] !== label) continue;
103
- if (requiredIndent !== null && match[1].length !== requiredIndent) continue;
104
-
105
- return {
106
- index,
107
- indent: match[1].length,
108
- ...parseMapping(lines, index + 1, match[1].length),
109
- };
110
- }
111
-
112
- return null;
113
- };
@@ -1,7 +0,0 @@
1
- export const parseShortGitStatus = (output) => (
2
- output.split(/\r?\n/u).filter((line) => line.length > 0)
3
- );
4
-
5
- export const getShortGitStatusPath = (line) => (
6
- line.slice(3).split(' -> ').at(-1)
7
- );
@@ -1,153 +0,0 @@
1
- import { readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { promisify } from 'node:util';
5
- import { execFile } from 'node:child_process';
6
- import { getShortGitStatusPath, parseShortGitStatus } from './lib/git-status.mjs';
7
- import { runInherit } from './lib/run-command.mjs';
8
-
9
- const execFileAsync = promisify(execFile);
10
- const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
11
- const npmBin = process.platform === 'win32' ? 'npm.cmd' : 'npm';
12
- const npmRegistry = 'https://registry.npmjs.org/';
13
- const npmCachePath = '/private/tmp/norna-npm-cache';
14
- const releaseTypes = new Set(['patch', 'minor', 'major']);
15
- const releaseArguments = process.argv.slice(2);
16
- const [releaseType] = releaseArguments;
17
- const showHelp = releaseArguments.includes('--help') || releaseArguments.includes('-h');
18
-
19
- const printUsage = () => {
20
- console.log('Usage: node scripts/release.mjs <patch|minor|major>');
21
- console.log('Checks npm authentication, prepares the version and schemas, runs npm test, creates the release commit and tag, publishes to npm, then pushes.');
22
- };
23
-
24
- const run = (command, args) => runInherit(command, args, { cwd: repoRoot });
25
-
26
- const readPackageVersion = async () => {
27
- const packageJson = JSON.parse(await readFile(path.join(repoRoot, 'package.json'), 'utf8'));
28
- return packageJson.version;
29
- };
30
-
31
- const releasePaths = ['package.json', 'package-lock.json', 'schemas'];
32
-
33
- const getWorktreeChanges = async () => {
34
- const { stdout } = await execFileAsync('git', ['status', '--short'], { cwd: repoRoot });
35
- return parseShortGitStatus(stdout);
36
- };
37
-
38
- const isReleasePath = (filePath) => (
39
- filePath === 'package.json'
40
- || filePath === 'package-lock.json'
41
- || filePath === 'schemas'
42
- || filePath.startsWith('schemas/')
43
- );
44
-
45
- const assertOnlyReleaseChanges = async () => {
46
- const changes = await getWorktreeChanges();
47
- const unexpected = changes.filter((line) => !isReleasePath(getShortGitStatusPath(line)));
48
- if (unexpected.length > 0) {
49
- throw new Error(`Release checks changed unexpected files:\n${unexpected.join('\n')}`);
50
- }
51
- for (const requiredPath of ['package.json', 'package-lock.json']) {
52
- if (!changes.some((line) => getShortGitStatusPath(line) === requiredPath)) {
53
- throw new Error(`Release preparation did not update ${requiredPath}.`);
54
- }
55
- }
56
- };
57
-
58
- const assertTagDoesNotExist = async (tag) => {
59
- try {
60
- await execFileAsync('git', ['rev-parse', '--quiet', '--verify', `refs/tags/${tag}`], { cwd: repoRoot });
61
- } catch (error) {
62
- if (error?.code === 1) return;
63
- throw error;
64
- }
65
- throw new Error(`Git tag ${tag} already exists.`);
66
- };
67
-
68
- const rollbackPreparedRelease = async () => {
69
- await execFileAsync('git', ['restore', '--staged', '--worktree', '--', ...releasePaths], { cwd: repoRoot });
70
- console.log('Release preparation failed before commit. Restored package version and generated schemas.');
71
- };
72
-
73
- const assertCleanWorktree = async (stage) => {
74
- const { stdout } = await execFileAsync('git', ['status', '--short'], { cwd: repoRoot });
75
-
76
- if (stdout.trim()) {
77
- throw new Error(`Working tree must be clean ${stage}. Commit, stash, or discard the listed changes first.\n${stdout.trim()}`);
78
- }
79
- };
80
-
81
- const assertNpmAuthenticated = async () => {
82
- try {
83
- const { stdout } = await execFileAsync(npmBin, [
84
- 'whoami',
85
- `--registry=${npmRegistry}`,
86
- '--cache',
87
- npmCachePath,
88
- ], { cwd: repoRoot });
89
- console.log(`npm registry authentication: ${stdout.trim()}`);
90
- } catch {
91
- throw new Error([
92
- 'Cannot publish because npm is not authenticated for the registry/cache used by release:publish.',
93
- 'Run this command, complete the browser login, then start the release again:',
94
- `npm login --registry=${npmRegistry} --auth-type=web --cache ${npmCachePath}`,
95
- ].join('\n'));
96
- }
97
- };
98
-
99
- if (showHelp || !releaseType) {
100
- printUsage();
101
- process.exitCode = showHelp ? 0 : 1;
102
- } else if (!releaseTypes.has(releaseType)) {
103
- printUsage();
104
- throw new Error(`Unsupported release type: ${releaseType}`);
105
- } else {
106
- const previousVersion = await readPackageVersion();
107
- let preparationStarted = false;
108
- let releaseCommitCreated = false;
109
- let releaseTagCreated = false;
110
- let publishedVersion = null;
111
-
112
- await assertCleanWorktree('before the release checks');
113
- await assertNpmAuthenticated();
114
- console.log(`Preparing a ${releaseType} release from ${previousVersion}.`);
115
-
116
- try {
117
- preparationStarted = true;
118
- await run(npmBin, ['version', releaseType, '--no-git-tag-version']);
119
- publishedVersion = await readPackageVersion();
120
- const releaseTag = `v${publishedVersion}`;
121
- if (publishedVersion === previousVersion) {
122
- throw new Error(`Version did not change from ${previousVersion}.`);
123
- }
124
-
125
- await assertTagDoesNotExist(releaseTag);
126
- await run(npmBin, ['run', 'schemas:generate']);
127
- await run(npmBin, ['test']);
128
- await assertOnlyReleaseChanges();
129
- await run('git', ['add', ...releasePaths]);
130
- await run('git', ['commit', '-m', `Release ${releaseTag}`]);
131
- releaseCommitCreated = true;
132
- await run('git', ['tag', '-a', releaseTag, '-m', `Release ${releaseTag}`]);
133
- releaseTagCreated = true;
134
- await run(npmBin, ['run', 'release:publish']);
135
- await run('git', ['push', '--follow-tags']);
136
-
137
- console.log(`Released @janga/norna@${publishedVersion}.`);
138
- } catch (error) {
139
- if (preparationStarted && !releaseCommitCreated) {
140
- try {
141
- await rollbackPreparedRelease();
142
- } catch (rollbackError) {
143
- throw new AggregateError([error, rollbackError], 'Release failed and automatic rollback also failed.');
144
- }
145
- } else if (releaseCommitCreated) {
146
- const state = releaseTagCreated
147
- ? `Release commit and tag v${publishedVersion} remain locally.`
148
- : `Release commit for v${publishedVersion} remains locally, but its tag was not created.`;
149
- console.error(state);
150
- }
151
- throw error;
152
- }
153
- }
@@ -1,80 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
3
- import { spawnSync } from 'node:child_process';
4
- import path from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
-
7
- const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
8
- const nornaBin = path.join(repoRoot, 'bin', 'norna.mjs');
9
- const tempParent = path.join(repoRoot, 'node_modules', '.cache');
10
- await mkdir(tempParent, { recursive: true });
11
- const tempRoot = await mkdtemp(path.join(tempParent, 'norna-banner-visibility-'));
12
- const siteDir = path.join(tempRoot, 'site');
13
-
14
- const runCli = (args, env = {}) => {
15
- const result = spawnSync(process.execPath, [nornaBin, ...args], {
16
- cwd: tempRoot,
17
- encoding: 'utf8',
18
- env: {
19
- ...process.env,
20
- NORNA_SITE_DIR: siteDir,
21
- ...env,
22
- },
23
- });
24
-
25
- if (result.status !== 0) {
26
- throw new Error([
27
- `norna ${args.join(' ')} exited with code ${result.status}.`,
28
- result.stdout.trim(),
29
- result.stderr.trim(),
30
- ].filter(Boolean).join('\n'));
31
- }
32
-
33
- return result;
34
- };
35
-
36
- try {
37
- await mkdir(path.join(siteDir, 'images'), { recursive: true });
38
- await mkdir(path.join(siteDir, 'public'), { recursive: true });
39
- await writeFile(path.join(siteDir, 'public', 'robots.txt'), 'User-agent: *\nAllow: /\n');
40
- await writeFile(path.join(siteDir, 'config.yaml'), 'url: https://example.com/\n');
41
- await writeFile(path.join(siteDir, 'theme.yaml'), `typography:
42
- profile: restrained
43
- palette: dark
44
- `);
45
- await writeFile(path.join(siteDir, 'sitewide-content.yaml'), `banners:
46
- - id: expired-banner
47
- visible:
48
- until: "2026-01-01"
49
- title: Expired banner
50
- text: Expired banner text.
51
- - id: active-banner
52
- visible:
53
- from: "2026-01-01"
54
- until: "2026-12-31"
55
- title: Active banner
56
- text: Active banner text.
57
- `);
58
- await writeFile(path.join(siteDir, 'content.md'), `---
59
- page:
60
- description: Test site for temporary banners.
61
- ---
62
-
63
- # Temporary Visibility Test
64
-
65
- ## Content {#content}
66
-
67
- Always visible section text.
68
- `);
69
-
70
- runCli(['build'], { NORNA_TODAY: '2026-06-15' });
71
-
72
- const html = await readFile(path.join(tempRoot, 'dist', 'index.html'), 'utf8');
73
- assert.match(html, /Always visible section text/);
74
- assert.match(html, /Active banner text/);
75
- assert.doesNotMatch(html, /Expired banner text/);
76
-
77
- console.log('Temporary banner visibility test passed.');
78
- } finally {
79
- await rm(tempRoot, { force: true, recursive: true });
80
- }
@@ -1,65 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { execFile } from 'node:child_process';
3
- import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
4
- import { tmpdir } from 'node:os';
5
- import path from 'node:path';
6
- import { fileURLToPath } from 'node:url';
7
- import { promisify } from 'node:util';
8
- import { normalizeCiLockfile, verifyCiLockfile } from './lib/ci-lockfile.mjs';
9
-
10
- const execFileAsync = promisify(execFile);
11
- const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
12
- const tempRoot = await mkdtemp(path.join(tmpdir(), 'norna-ci-lockfile-'));
13
- const npmCachePath = path.join(repoRoot, 'node_modules', '.cache', 'norna-npm');
14
- const npmEnv = {
15
- ...process.env,
16
- npm_config_cache: npmCachePath,
17
- };
18
-
19
- function escapeRegExp(value) {
20
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
21
- }
22
-
23
- try {
24
- await writeFile(path.join(tempRoot, 'package.json'), `${JSON.stringify({
25
- name: 'norna-ci-lockfile-test',
26
- private: true,
27
- dependencies: {
28
- astro: '^7.1.3',
29
- },
30
- }, null, 2)}\n`);
31
-
32
- const quietOptions = { env: npmEnv, stdio: 'ignore' };
33
- await normalizeCiLockfile(tempRoot, quietOptions);
34
- const lockfilePath = path.join(tempRoot, 'package-lock.json');
35
- const corruptedLockfile = JSON.parse(await readFile(lockfilePath, 'utf8'));
36
- const emnapiCoreVersion = corruptedLockfile.packages['node_modules/@emnapi/core']?.version;
37
- assert.ok(emnapiCoreVersion, 'expected npm to include @emnapi/core in the normalized lockfile');
38
- delete corruptedLockfile.packages['node_modules/@emnapi/core'];
39
- await writeFile(lockfilePath, `${JSON.stringify(corruptedLockfile, null, 2)}\n`);
40
-
41
- await assert.rejects(
42
- execFileAsync(process.platform === 'win32' ? 'npx.cmd' : 'npx', [
43
- '--yes',
44
- 'npm@11.16.0',
45
- 'ci',
46
- '--dry-run',
47
- '--ignore-scripts',
48
- '--no-audit',
49
- '--no-fund',
50
- '--os=linux',
51
- '--cpu=x64',
52
- '--libc=glibc',
53
- ], { cwd: tempRoot, env: npmEnv }),
54
- new RegExp(`Missing: @emnapi\\/core@${escapeRegExp(emnapiCoreVersion)} from lock file`),
55
- );
56
-
57
- await normalizeCiLockfile(tempRoot, quietOptions);
58
- await verifyCiLockfile(tempRoot, quietOptions);
59
-
60
- const repairedLockfile = JSON.parse(await readFile(lockfilePath, 'utf8'));
61
- assert.equal(repairedLockfile.packages['node_modules/@emnapi/core']?.version, emnapiCoreVersion);
62
- console.log('ok - CI lockfile normalization repairs missing optional npm peers');
63
- } finally {
64
- await rm(tempRoot, { force: true, recursive: true });
65
- }