@janga/norna 0.7.10 → 0.7.12

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 (476) hide show
  1. package/README.md +120 -106
  2. package/bin/norna-cli.mjs +4 -1
  3. package/docs/README.md +107 -74
  4. package/docs/assets/norna-dog-shelter.jpg +0 -0
  5. package/docs/commands.md +13 -4
  6. package/docs/configuration.md +86 -184
  7. package/docs/content.md +14 -14
  8. package/docs/design/command-organization.md +1 -1
  9. package/docs/design/norna-diagram-design.md +2 -1
  10. package/docs/design/site-examples-structure.md +38 -24
  11. package/docs/engine-development.md +28 -15
  12. package/docs/getting-started.md +141 -124
  13. package/docs/how-to/embedded-site.md +35 -0
  14. package/docs/publishing.md +47 -46
  15. package/docs/requirements.md +54 -0
  16. package/docs/routes.md +3 -2
  17. package/docs/site-structure.md +12 -9
  18. package/docs/sitewide-content.md +2 -1
  19. package/docs/theme.md +104 -34
  20. package/docs/typography.md +32 -17
  21. package/examples/README.md +43 -0
  22. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/sitewide.schema.json +24 -0
  23. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/theme.schema.json +9 -24
  24. package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/content.d.ts +9 -1
  25. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -0
  26. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev-local.json +2 -2
  27. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +13 -0
  28. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +26 -0
  29. package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +5 -0
  30. package/examples/complete-sites/dog-shelter-multi-page/README.md +16 -0
  31. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +74 -0
  32. package/examples/{typography-presets/node_modules/.vite/deps/astro-D_GIpJIE.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js} +4 -4
  33. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  34. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js +151 -151
  35. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  36. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js +131 -131
  37. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  38. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js +1 -1
  39. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  40. package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +10 -10
  41. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  42. package/examples/{typography-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js} +10 -10
  43. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  44. package/examples/{typography-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js} +1 -1
  45. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  46. package/examples/{typography-presets/node_modules/.vite/deps/icons-RyebKi45.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js} +1 -1
  47. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  48. package/examples/{typography-presets/node_modules/.vite/deps/settings-DaU-gNnK.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js} +2 -2
  49. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  50. package/examples/{typography-presets/node_modules/.vite/deps/toolbar-63PA619H.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js} +2 -2
  51. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  52. package/examples/{typography-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js} +10 -10
  53. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  54. package/examples/{typography-presets/node_modules/.vite/deps/window-jPkpKVcy.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js} +1 -1
  55. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  56. package/examples/{typography-presets/node_modules/.vite/deps/xray-BXCHpEJP.js → complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js} +3 -3
  57. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  58. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +98 -0
  59. package/examples/complete-sites/dog-shelter-multi-page/site/config.md +3 -0
  60. package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/content.md +12 -0
  61. package/examples/complete-sites/dog-shelter-multi-page/site/public/logo.svg +9 -0
  62. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/route-content.md +22 -0
  63. package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-multi-page}/site/routes/020-adopt/route-content.md +11 -0
  64. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.md +16 -0
  65. package/examples/complete-sites/dog-shelter-multi-page/site/theme.md +3 -0
  66. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +59 -0
  67. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +138 -0
  68. package/examples/{dog-gallery → complete-sites/dog-shelter-single-page}/.astro/collections/theme.schema.json +151 -68
  69. package/examples/complete-sites/dog-shelter-single-page/.astro/content.d.ts +183 -0
  70. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +1 -0
  71. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +13 -0
  72. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +14 -0
  73. package/examples/complete-sites/dog-shelter-single-page/.astro/settings.json +5 -0
  74. package/examples/complete-sites/dog-shelter-single-page/README.md +16 -0
  75. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +74 -0
  76. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  77. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  78. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  79. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  80. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  81. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  82. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  83. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  84. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  85. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  86. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  87. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  88. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  89. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  90. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  91. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  92. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  93. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  94. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  95. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  96. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  97. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  98. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  99. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  100. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  101. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  102. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +50 -0
  103. package/examples/complete-sites/dog-shelter-single-page/site/config.md +3 -0
  104. package/examples/complete-sites/dog-shelter-single-page/site/content.md +34 -0
  105. package/examples/complete-sites/dog-shelter-single-page/site/public/logo.svg +9 -0
  106. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.md +16 -0
  107. package/examples/complete-sites/dog-shelter-single-page/site/theme.md +3 -0
  108. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +59 -0
  109. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +138 -0
  110. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +755 -0
  111. package/examples/feature-demos/media-and-surfaces/.astro/content-assets.mjs +4 -0
  112. package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +1 -0
  113. package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +183 -0
  114. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -0
  115. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +24 -0
  116. package/examples/feature-demos/media-and-surfaces/.astro/settings.json +5 -0
  117. package/examples/feature-demos/media-and-surfaces/.astro/types.d.ts +2 -0
  118. package/examples/feature-demos/media-and-surfaces/README.md +21 -0
  119. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +80 -0
  120. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  121. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  122. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  123. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  124. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  125. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  126. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  127. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  128. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  129. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  130. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  131. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  132. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js +1389 -0
  133. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  134. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  135. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  136. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  137. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  138. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/package.json +3 -0
  139. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  140. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  141. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  142. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  143. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  144. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  145. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  146. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  147. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  148. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  149. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  150. package/examples/{presentation → feature-demos/media-and-surfaces}/site/.norna/generated-images.json +16 -16
  151. package/examples/feature-demos/media-and-surfaces/site/config.md +4 -0
  152. package/examples/feature-demos/media-and-surfaces/site/content.md +18 -0
  153. package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/route-content.md +17 -24
  154. package/examples/{presentation/site/routes/030-surfaces → feature-demos/media-and-surfaces/site/routes/020-surfaces}/route-content.md +1 -1
  155. package/examples/{presentation/site/routes/030-surfaces → feature-demos/media-and-surfaces/site/routes/020-surfaces}/theme.md +1 -0
  156. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.md +6 -0
  157. package/examples/feature-demos/media-and-surfaces/site/theme.md +3 -0
  158. package/examples/feature-demos/sitewide-content/.astro/collections/site.schema.json +59 -0
  159. package/examples/feature-demos/sitewide-content/.astro/collections/sitewide.schema.json +138 -0
  160. package/examples/feature-demos/sitewide-content/.astro/collections/theme.schema.json +755 -0
  161. package/examples/feature-demos/sitewide-content/.astro/content-assets.mjs +1 -0
  162. package/examples/feature-demos/sitewide-content/.astro/content-modules.mjs +1 -0
  163. package/examples/feature-demos/sitewide-content/.astro/content.d.ts +183 -0
  164. package/examples/feature-demos/sitewide-content/.astro/data-store.json +1 -0
  165. package/examples/feature-demos/sitewide-content/.astro/dev.json +13 -0
  166. package/examples/feature-demos/sitewide-content/.astro/dev.log +18 -0
  167. package/examples/feature-demos/sitewide-content/.astro/settings.json +5 -0
  168. package/examples/feature-demos/sitewide-content/.astro/types.d.ts +2 -0
  169. package/examples/feature-demos/sitewide-content/README.md +18 -0
  170. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/_metadata.json +74 -0
  171. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  172. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  173. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  174. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  175. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  176. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  177. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  178. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  179. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  180. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  181. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  182. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  183. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  184. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  185. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  186. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  187. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/package.json +3 -0
  188. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  189. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  190. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  191. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  192. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  193. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  194. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  195. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  196. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  197. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  198. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  199. package/examples/feature-demos/sitewide-content/site/.norna/generated-images.json +1 -0
  200. package/examples/feature-demos/sitewide-content/site/config.md +3 -0
  201. package/examples/feature-demos/sitewide-content/site/content.md +16 -0
  202. package/examples/feature-demos/sitewide-content/site/public/logo.svg +6 -0
  203. package/examples/feature-demos/sitewide-content/site/routes/010-identity/route-content.md +20 -0
  204. package/examples/feature-demos/sitewide-content/site/routes/020-notices/route-content.md +22 -0
  205. package/examples/feature-demos/sitewide-content/site/routes/030-footer/route-content.md +17 -0
  206. package/examples/feature-demos/sitewide-content/site/sitewide-content.md +33 -0
  207. package/examples/feature-demos/sitewide-content/site/theme.md +3 -0
  208. package/examples/feature-demos/theme-presets/.astro/collections/site.schema.json +59 -0
  209. package/examples/feature-demos/theme-presets/.astro/collections/sitewide.schema.json +138 -0
  210. package/examples/feature-demos/theme-presets/.astro/collections/theme.schema.json +755 -0
  211. package/examples/feature-demos/theme-presets/.astro/content-assets.mjs +4 -0
  212. package/examples/feature-demos/theme-presets/.astro/content-modules.mjs +1 -0
  213. package/examples/{typography-presets → feature-demos/theme-presets}/.astro/data-store.json +1 -1
  214. package/examples/feature-demos/theme-presets/.astro/dev-local.json +8 -0
  215. package/examples/{typography-presets → feature-demos/theme-presets}/.astro/dev.json +2 -2
  216. package/examples/feature-demos/theme-presets/.astro/dev.log +164 -0
  217. package/examples/feature-demos/theme-presets/.astro/types.d.ts +2 -0
  218. package/examples/feature-demos/theme-presets/README.md +18 -0
  219. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/package.json +3 -0
  220. package/examples/feature-demos/theme-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  221. package/examples/{typography-presets → feature-demos/theme-presets}/site/.norna/generated-images.json +45 -45
  222. package/examples/feature-demos/theme-presets/site/config.md +3 -0
  223. package/examples/feature-demos/theme-presets/site/content.md +17 -0
  224. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio/shepherd-portrait.jpg +0 -0
  225. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio/white-puppy.jpg +0 -0
  226. package/examples/{typography-presets/site/routes/010-quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio}/route-content.md +8 -8
  227. package/examples/feature-demos/theme-presets/site/routes/010-portfolio/theme.md +3 -0
  228. package/examples/feature-demos/theme-presets/site/routes/020-documentation/images/documentation/retriever-portrait.jpg +0 -0
  229. package/examples/{typography-presets/site/routes/020-compact-gallery → feature-demos/theme-presets/site/routes/020-documentation}/route-content.md +8 -8
  230. package/examples/feature-demos/theme-presets/site/routes/020-documentation/theme.md +3 -0
  231. package/examples/feature-demos/theme-presets/site/routes/030-project/images/project/boxer-portrait.jpg +0 -0
  232. package/examples/feature-demos/theme-presets/site/routes/030-project/images/project/grass-puppy.jpg +0 -0
  233. package/examples/{typography-presets/site/routes/030-text-forward → feature-demos/theme-presets/site/routes/030-project}/route-content.md +8 -8
  234. package/examples/feature-demos/theme-presets/site/routes/030-project/theme.md +3 -0
  235. package/examples/feature-demos/theme-presets/site/routes/040-statement/images/statement/sheepdog-grass.jpg +0 -0
  236. package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/route-content.md +3 -3
  237. package/examples/feature-demos/theme-presets/site/routes/040-statement/theme.md +3 -0
  238. package/examples/{typography-presets → feature-demos/theme-presets}/site/sitewide-content.md +1 -1
  239. package/examples/feature-demos/theme-presets/site/theme.md +3 -0
  240. package/fixtures/basic/site/config.md +3 -0
  241. package/fixtures/content-model-v2/site/config.md +3 -0
  242. package/package.json +17 -8
  243. package/scripts/build-pages.mjs +69 -0
  244. package/scripts/check-config.mjs +3 -11
  245. package/scripts/deploy-site.mjs +12 -8
  246. package/scripts/export-theme-preset.mjs +31 -0
  247. package/scripts/init-site.mjs +1 -0
  248. package/scripts/lib/example-sites.mjs +37 -0
  249. package/scripts/lib/github-repository.mjs +44 -0
  250. package/scripts/lib/norna-markdown-blocks.mjs +97 -10
  251. package/scripts/lib/presentation.mjs +6 -5
  252. package/scripts/lib/project-config.mjs +114 -124
  253. package/scripts/lib/site-content.mjs +9 -2
  254. package/scripts/lib/site-paths.mjs +6 -2
  255. package/scripts/lib/theme-config.mjs +3 -0
  256. package/scripts/lib/theme-presets.mjs +209 -0
  257. package/scripts/show-typography.mjs +6 -5
  258. package/scripts/test-client-javascript.mjs +236 -0
  259. package/scripts/test-content-check.mjs +103 -0
  260. package/scripts/test-content-model-v2.mjs +9 -13
  261. package/scripts/test-documentation.mjs +116 -0
  262. package/scripts/test-engine-commands.mjs +13 -3
  263. package/scripts/test-examples.mjs +24 -0
  264. package/scripts/test-navigation.mjs +73 -45
  265. package/scripts/test-package-check.mjs +17 -9
  266. package/scripts/test-project-config.mjs +130 -0
  267. package/scripts/test-temporary-visibility.mjs +3 -10
  268. package/scripts/test-theme-presets.mjs +146 -0
  269. package/scripts/watch-pages-deploy.mjs +15 -11
  270. package/src/components/GalleryGrid.astro +30 -230
  271. package/src/components/ImageCarousel.astro +184 -0
  272. package/src/components/MobileSectionNavigationScript.astro +14 -0
  273. package/src/components/NornaSmoothScrollScript.astro +250 -0
  274. package/src/components/SiteNavigation.astro +58 -341
  275. package/src/components/SiteNotesScript.astro +43 -0
  276. package/src/components/SitePage.astro +6 -3
  277. package/src/components/SiteSection.astro +4 -47
  278. package/src/content.config.ts +2 -0
  279. package/src/layouts/BaseLayout.astro +1 -1
  280. package/src/lib/galleryImages.ts +53 -0
  281. package/src/styles/global.css +83 -1
  282. package/starters/basic/.github/workflows/deploy.yml +1 -2
  283. package/starters/basic/README.md +10 -8
  284. package/starters/basic/package.json +1 -0
  285. package/starters/basic/site/config.md +3 -0
  286. package/starters/project/.github/workflows/deploy.yml +1 -2
  287. package/starters/project/README.md +3 -4
  288. package/starters/project/package.json +1 -0
  289. package/starters/project/site/config.md +3 -0
  290. package/examples/001-dog-shelter-single-page/README.md +0 -9
  291. package/examples/001-dog-shelter-single-page/site/config.mjs +0 -27
  292. package/examples/001-dog-shelter-single-page/site/content.md +0 -38
  293. package/examples/001-dog-shelter-single-page/site/images/what-we-do/dog-house.svg +0 -25
  294. package/examples/001-dog-shelter-single-page/site/images/you-can-help/heart.svg +0 -13
  295. package/examples/001-dog-shelter-single-page/site/sitewide-content.md +0 -6
  296. package/examples/001-dog-shelter-single-page/site/theme.md +0 -25
  297. package/examples/002-dog-shelter-multi-page/README.md +0 -9
  298. package/examples/002-dog-shelter-multi-page/site/config.mjs +0 -27
  299. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.svg +0 -19
  300. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.svg +0 -19
  301. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/route-content.md +0 -30
  302. package/examples/002-dog-shelter-multi-page/site/sitewide-content.md +0 -6
  303. package/examples/002-dog-shelter-multi-page/site/theme.md +0 -25
  304. package/examples/dog-gallery/.astro/collections/site.schema.json +0 -776
  305. package/examples/dog-gallery/.astro/data-store.json +0 -1
  306. package/examples/dog-gallery/.astro/dev-local.json +0 -8
  307. package/examples/dog-gallery/.astro/dev.json +0 -13
  308. package/examples/dog-gallery/.astro/dev.log +0 -95
  309. package/examples/dog-gallery/.astro/settings.json +0 -5
  310. package/examples/dog-gallery/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +0 -1
  311. package/examples/dog-gallery/dist/_astro/SitePage.DicGh_5N.css +0 -1
  312. package/examples/dog-gallery/dist/dog-care/index.html +0 -15
  313. package/examples/dog-gallery/dist/dog-shelter-logo.svg +0 -14
  314. package/examples/dog-gallery/dist/favicon.svg +0 -7
  315. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp +0 -0
  316. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp +0 -0
  317. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp +0 -0
  318. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp +0 -0
  319. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp +0 -0
  320. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp +0 -0
  321. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp +0 -0
  322. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp +0 -0
  323. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1080.webp +0 -0
  324. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp +0 -0
  325. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1920.webp +0 -0
  326. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-3939.webp +0 -0
  327. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-480.webp +0 -0
  328. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-768.webp +0 -0
  329. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp +0 -0
  330. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp +0 -0
  331. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp +0 -0
  332. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-2400.webp +0 -0
  333. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp +0 -0
  334. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp +0 -0
  335. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp +0 -0
  336. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp +0 -0
  337. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp +0 -0
  338. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp +0 -0
  339. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-768.webp +0 -0
  340. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp +0 -0
  341. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp +0 -0
  342. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp +0 -0
  343. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-2576.webp +0 -0
  344. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp +0 -0
  345. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp +0 -0
  346. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1080.webp +0 -0
  347. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp +0 -0
  348. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-480.webp +0 -0
  349. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-768.webp +0 -0
  350. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp +0 -0
  351. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp +0 -0
  352. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp +0 -0
  353. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp +0 -0
  354. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp +0 -0
  355. package/examples/dog-gallery/dist/index.html +0 -45
  356. package/examples/dog-gallery/node_modules/.vite/deps/_metadata.json +0 -74
  357. package/examples/dog-gallery/site/.norna/generated-images.json +0 -226
  358. package/examples/dog-gallery/site/config.mjs +0 -47
  359. package/examples/dog-gallery/site/content.md +0 -127
  360. package/examples/dog-gallery/site/images/black-dogs/black-puppy-meadow.png +0 -0
  361. package/examples/dog-gallery/site/images/black-dogs/photo-of-a-black-dog.jpg +0 -0
  362. package/examples/dog-gallery/site/images/brown-dogs/brown-dog.jpg +0 -0
  363. package/examples/dog-gallery/site/images/brown-dogs/dog-accompanies-master.jpg +0 -0
  364. package/examples/dog-gallery/site/images/golden-dogs/golden-retriever.jpg +0 -0
  365. package/examples/dog-gallery/site/images/golden-dogs/toller-puppy.jpg +0 -0
  366. package/examples/dog-gallery/site/images/white-dogs/white-cute-dog.jpg +0 -0
  367. package/examples/dog-gallery/site/images/white-dogs/white-puppy-garden.png +0 -0
  368. package/examples/dog-gallery/site/public/favicon.svg +0 -7
  369. package/examples/dog-gallery/site/public/logo.svg +0 -14
  370. package/examples/dog-gallery/site/routes/010-dog-care/route-content.md +0 -38
  371. package/examples/dog-gallery/site/sitewide-content.md +0 -16
  372. package/examples/dog-gallery/site/theme.md +0 -101
  373. package/examples/presentation/README.md +0 -15
  374. package/examples/presentation/site/config.mjs +0 -29
  375. package/examples/presentation/site/content.md +0 -67
  376. package/examples/presentation/site/public/robots.txt +0 -2
  377. package/examples/presentation/site/routes/010-presets/route-content.md +0 -63
  378. package/examples/presentation/site/routes/010-presets/theme.md +0 -4
  379. package/examples/presentation/site/routes/020-media/theme.md +0 -4
  380. package/examples/presentation/site/sitewide-content.md +0 -6
  381. package/examples/presentation/site/theme.md +0 -43
  382. package/examples/typography-presets/.astro/dev.log +0 -45
  383. package/examples/typography-presets/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
  384. package/examples/typography-presets/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
  385. package/examples/typography-presets/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
  386. package/examples/typography-presets/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
  387. package/examples/typography-presets/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
  388. package/examples/typography-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
  389. package/examples/typography-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
  390. package/examples/typography-presets/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
  391. package/examples/typography-presets/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
  392. package/examples/typography-presets/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
  393. package/examples/typography-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
  394. package/examples/typography-presets/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
  395. package/examples/typography-presets/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
  396. package/examples/typography-presets/site/config.mjs +0 -29
  397. package/examples/typography-presets/site/content.md +0 -16
  398. package/examples/typography-presets/site/routes/010-quiet-gallery/theme.md +0 -4
  399. package/examples/typography-presets/site/routes/020-compact-gallery/theme.md +0 -4
  400. package/examples/typography-presets/site/routes/030-text-forward/theme.md +0 -4
  401. package/examples/typography-presets/site/routes/040-statement/theme.md +0 -4
  402. package/examples/typography-presets/site/theme.md +0 -43
  403. package/fixtures/basic/site/config.mjs +0 -27
  404. package/fixtures/content-model-v2/site/config.mjs +0 -11
  405. package/starters/basic/site/config.mjs +0 -27
  406. package/starters/project/site/config.mjs +0 -30
  407. /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/collections/site.schema.json +0 -0
  408. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/content-assets.mjs +0 -0
  409. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/content-modules.mjs +0 -0
  410. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/.astro/types.d.ts +0 -0
  411. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/package.json +0 -0
  412. /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  413. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery/retriever-portrait.jpg → complete-sites/dog-shelter-multi-page/site/images/intro/shelter-dog.jpg} +0 -0
  414. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/public/favicon.svg +0 -0
  415. /package/examples/{001-dog-shelter-single-page → complete-sites/dog-shelter-multi-page}/site/public/robots.txt +0 -0
  416. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/white-puppy.jpg → complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.jpg} +0 -0
  417. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward/boxer-portrait.jpg → complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.jpg} +0 -0
  418. /package/examples/{typography-presets/site/routes/040-statement/images/statement/sheepdog-grass.jpg → complete-sites/dog-shelter-multi-page/site/routes/020-adopt/images/adopt/adoption-dog.jpg} +0 -0
  419. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/.astro/content-assets.mjs +0 -0
  420. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/.astro/content-modules.mjs +0 -0
  421. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/.astro/types.d.ts +0 -0
  422. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/node_modules/.vite/deps/package.json +0 -0
  423. /package/examples/{typography-presets → complete-sites/dog-shelter-single-page}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
  424. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward/grass-puppy.jpg → complete-sites/dog-shelter-single-page/site/images/what-we-do/rescue-dog.jpg} +0 -0
  425. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/shepherd-portrait.jpg → complete-sites/dog-shelter-single-page/site/images/you-can-help/foster-dog.jpg} +0 -0
  426. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/public/favicon.svg +0 -0
  427. /package/examples/{002-dog-shelter-multi-page → complete-sites/dog-shelter-single-page}/site/public/robots.txt +0 -0
  428. /package/examples/{dog-gallery/dist → feature-demos/media-and-surfaces/site/public}/robots.txt +0 -0
  429. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-carousel.svg +0 -0
  430. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-stack.svg +0 -0
  431. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/cards/card-surfaces.svg +0 -0
  432. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-one.svg +0 -0
  433. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-three.svg +0 -0
  434. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/carousel/carousel-two.svg +0 -0
  435. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/stack/stack-one.svg +0 -0
  436. /package/examples/{presentation/site/routes/020-media → feature-demos/media-and-surfaces/site/routes/010-media}/images/stack/stack-two.svg +0 -0
  437. /package/examples/{dog-gallery → feature-demos/sitewide-content}/site/public/robots.txt +0 -0
  438. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/collections/routeTheme.schema.json +0 -0
  439. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/content.d.ts +0 -0
  440. /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/settings.json +0 -0
  441. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/_metadata.json +0 -0
  442. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
  443. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
  444. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
  445. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
  446. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
  447. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
  448. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
  449. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
  450. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
  451. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
  452. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
  453. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
  454. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/embla-carousel.js +0 -0
  455. /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
  456. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
  457. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
  458. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
  459. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
  460. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
  461. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
  462. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
  463. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
  464. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
  465. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
  466. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
  467. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
  468. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
  469. /package/examples/{dog-gallery → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
  470. /package/examples/{typography-presets → feature-demos/theme-presets}/site/public/robots.txt +0 -0
  471. /package/examples/{typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/puppy-portrait.jpg +0 -0
  472. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/black-schnauzer.jpg +0 -0
  473. /package/examples/{typography-presets/site/routes/020-compact-gallery/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/schnauzer-portrait.jpg +0 -0
  474. /package/examples/{typography-presets/site/routes/030-text-forward/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grey-street-dog.jpg +0 -0
  475. /package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/images/statement/black-pedigree.jpg +0 -0
  476. /package/examples/{typography-presets → feature-demos/theme-presets}/site/routes/040-statement/images/statement/sheepdog-wide.jpg +0 -0
@@ -0,0 +1,43 @@
1
+ <script>
2
+ const noteParts = Array.from(document.querySelectorAll<HTMLElement>('[data-note-id]'));
3
+ const noteReferences = noteParts.filter((part) => part.matches('.section-note-ref a'));
4
+ const marginNotes = noteParts.filter((part) => part.matches('.section-note'));
5
+
6
+ const setNoteState = (noteId: string, active: boolean) => {
7
+ noteParts
8
+ .filter((part) => part.dataset.noteId === noteId)
9
+ .forEach((part) => part.classList.toggle('is-referenced', active));
10
+ };
11
+
12
+ noteParts.forEach((part) => {
13
+ const noteId = part.dataset.noteId;
14
+ if (!noteId) return;
15
+
16
+ part.addEventListener('pointerenter', () => setNoteState(noteId, true));
17
+ part.addEventListener('pointerleave', () => setNoteState(noteId, false));
18
+ part.addEventListener('focusin', () => setNoteState(noteId, true));
19
+ part.addEventListener('focusout', () => setNoteState(noteId, false));
20
+ });
21
+
22
+ const alignMarginNotes = () => {
23
+ const wideLayout = window.matchMedia('(min-width: 1101px)').matches;
24
+ if (!wideLayout) {
25
+ marginNotes.forEach((note) => note.style.removeProperty('--section-note-offset'));
26
+ return;
27
+ }
28
+
29
+ marginNotes.forEach((note) => {
30
+ const noteId = note.dataset.noteId;
31
+ const reference = noteReferences.find((part) => part.dataset.noteId === noteId);
32
+ if (!noteId || !reference) return;
33
+
34
+ note.style.removeProperty('--section-note-offset');
35
+ const offset = reference.getBoundingClientRect().top - note.getBoundingClientRect().top;
36
+ note.style.setProperty('--section-note-offset', `${Math.max(0, offset)}px`);
37
+ });
38
+ };
39
+
40
+ alignMarginNotes();
41
+ window.addEventListener('resize', alignMarginNotes);
42
+ document.fonts?.ready.then(alignMarginNotes);
43
+ </script>
@@ -4,6 +4,7 @@ import path from 'node:path';
4
4
  import BaseLayout from '../layouts/BaseLayout.astro';
5
5
  import SiteNavigation from './SiteNavigation.astro';
6
6
  import SiteBanners from './SiteBanners.astro';
7
+ import SiteNotesScript from './SiteNotesScript.astro';
7
8
  import SiteSection from './SiteSection.astro';
8
9
  import { getSectionNavigation, getSectionsContent } from '../lib/sectionContent';
9
10
  import { getRouteTheme } from '../lib/routeThemes';
@@ -57,14 +58,15 @@ const logo = logoAsset
57
58
  height: logoSettings?.height,
58
59
  }
59
60
  : undefined;
60
- const pagePresentation = resolvePagePresentation(themeData);
61
- const frameColors = resolveFrameColors({ theme: themeData });
61
+ const pagePresentation = resolvePagePresentation(themeData, themeLabel);
62
+ const frameColors = resolveFrameColors({ theme: themeData, sourceLabel: themeLabel });
62
63
  const sections = entry.data.sections;
63
64
  const siteHtml = entry.rendered?.html ?? '';
64
65
  const resolvedSections = await getSectionsContent(siteHtml, rawMarkdown, sections, currentPage);
65
66
  const today = getToday();
66
67
  const siteBanners = (sitewideData.banners ?? []).filter((banner) => isVisibleToday(banner.visible, today));
67
68
  const visibleSections = resolvedSections.filter((section) => isVisibleToday(section.visible, today));
69
+ const hasMarginNotes = visibleSections.some((section) => section.contentBlocks.some((block) => block.type === 'note'));
68
70
 
69
71
  const getPageContent = async (page: SitePage) => {
70
72
  if (page.pathname === currentPage.pathname) {
@@ -102,7 +104,7 @@ if (visibleSections.length === 0) {
102
104
  pageNavigation={pageNavigation}
103
105
  frameColors={frameColors}
104
106
  />
105
- <SiteBanners banners={siteBanners} />
107
+ {siteBanners.length > 0 && <SiteBanners banners={siteBanners} />}
106
108
 
107
109
  <main id="main-content" class="site-content">
108
110
  {visibleSections.map((section, index) => (
@@ -116,4 +118,5 @@ if (visibleSections.length === 0) {
116
118
  />
117
119
  ))}
118
120
  </main>
121
+ {hasMarginNotes && <SiteNotesScript />}
119
122
  </BaseLayout>
@@ -3,6 +3,7 @@ import projectConfig from '../../scripts/lib/project-config.mjs';
3
3
  import { resolveSectionSurface } from '../../scripts/lib/presentation.mjs';
4
4
  import CardList from './CardList.astro';
5
5
  import GalleryGrid from './GalleryGrid.astro';
6
+ import ImageCarousel from './ImageCarousel.astro';
6
7
  import type { ResolvedSection } from '../lib/sectionContent';
7
8
 
8
9
  type ResponsiveValue<T> = { desktop: T; mobile: T };
@@ -379,9 +380,9 @@ const sectionStyle = [
379
380
  const block = group.block;
380
381
  if (block.type === 'image-carousel') {
381
382
  return (
382
- <GalleryGrid
383
+ <ImageCarousel
383
384
  title={section.title}
384
- items={[{ carousel: block.images }]}
385
+ images={block.images}
385
386
  maxAvailableWidthPercent={visualTheme.gallery.maxAvailableWidthPercent}
386
387
  priorityFirstImage={priorityGalleryImage && groupIndex === 0}
387
388
  />
@@ -395,7 +396,7 @@ const sectionStyle = [
395
396
  return (
396
397
  <GalleryGrid
397
398
  title={section.title}
398
- items={block.images}
399
+ images={block.images}
399
400
  maxAvailableWidthPercent={visualTheme.gallery.maxAvailableWidthPercent}
400
401
  priorityFirstImage={priorityGalleryImage && groupIndex === 0}
401
402
  />
@@ -404,47 +405,3 @@ const sectionStyle = [
404
405
  </div>
405
406
  </div>
406
407
  </section>
407
-
408
- <script>
409
- const noteParts = Array.from(document.querySelectorAll<HTMLElement>('[data-note-id]'));
410
- const noteReferences = noteParts.filter((part) => part.matches('.section-note-ref a'));
411
- const marginNotes = noteParts.filter((part) => part.matches('.section-note'));
412
-
413
- const setNoteState = (noteId: string, active: boolean) => {
414
- noteParts
415
- .filter((part) => part.dataset.noteId === noteId)
416
- .forEach((part) => part.classList.toggle('is-referenced', active));
417
- };
418
-
419
- noteParts.forEach((part) => {
420
- const noteId = part.dataset.noteId;
421
- if (!noteId) return;
422
-
423
- part.addEventListener('pointerenter', () => setNoteState(noteId, true));
424
- part.addEventListener('pointerleave', () => setNoteState(noteId, false));
425
- part.addEventListener('focusin', () => setNoteState(noteId, true));
426
- part.addEventListener('focusout', () => setNoteState(noteId, false));
427
- });
428
-
429
- const alignMarginNotes = () => {
430
- const wideLayout = window.matchMedia('(min-width: 1101px)').matches;
431
- if (!wideLayout) {
432
- marginNotes.forEach((note) => note.style.removeProperty('--section-note-offset'));
433
- return;
434
- }
435
-
436
- marginNotes.forEach((note) => {
437
- const noteId = note.dataset.noteId;
438
- const reference = noteReferences.find((part) => part.dataset.noteId === noteId);
439
- if (!noteId || !reference) return;
440
-
441
- note.style.removeProperty('--section-note-offset');
442
- const offset = reference.getBoundingClientRect().top - note.getBoundingClientRect().top;
443
- note.style.setProperty('--section-note-offset', `${Math.max(0, offset)}px`);
444
- });
445
- };
446
-
447
- alignMarginNotes();
448
- window.addEventListener('resize', alignMarginNotes);
449
- document.fonts?.ready.then(alignMarginNotes);
450
- </script>
@@ -15,6 +15,7 @@ const textSize = z.enum(['small', 'medium', 'large', 'xlarge']);
15
15
  const textWidth = z.enum(['narrow', 'normal', 'wide']);
16
16
  const headingWeight = z.union([z.literal(400), z.literal(500), z.literal(600), z.literal(700)]);
17
17
  const typographyPreset = z.enum(['quiet-gallery', 'compact-gallery', 'text-forward', 'statement']);
18
+ const themePreset = z.enum(['portfolio', 'documentation', 'project', 'statement']);
18
19
  const presentationPalette = z.enum(['dark', 'light', 'paper']);
19
20
  const sectionSurfaceMode = z.enum(['none', 'cycle']);
20
21
  const sectionSurface = z.enum(['base', 'soft', 'emphasis']);
@@ -197,6 +198,7 @@ const siteSchema = z.object({
197
198
  });
198
199
 
199
200
  export const themeVisualSchema = z.object({
201
+ preset: themePreset.optional(),
200
202
  layout: themeLayout.optional(),
201
203
  gallery: themeGallery.optional(),
202
204
  typography: themeTypography.optional(),
@@ -73,7 +73,7 @@ const {
73
73
  const documentTitle = title;
74
74
  const canonicalUrl = new URL(withBasePath(projectConfig.site.basePath, pathname), projectConfig.site.url).href;
75
75
  const iconLinks = getIconLinks();
76
- const scrollBehavior = projectConfig.navigation.smoothScroll.enabled ? 'smooth' : 'auto';
76
+ const scrollBehavior = projectConfig.navigation.scrollBehavior === 'browser-smooth' ? 'smooth' : 'auto';
77
77
  const formatPercent = (value: number) => `${value}%`;
78
78
  const formatViewportHeightPercent = (value: number) => `${value}svh`;
79
79
  const layoutSpacing = visualTheme.layout.spacing;
@@ -0,0 +1,53 @@
1
+ import { getGeneratedImage } from './generatedImages';
2
+
3
+ export type GalleryImage = {
4
+ image: string;
5
+ src?: string;
6
+ alt?: string;
7
+ caption?: string;
8
+ };
9
+
10
+ type GeneratedImageWithDimensions = NonNullable<ReturnType<typeof getGeneratedImage>> & {
11
+ width: number;
12
+ height: number;
13
+ };
14
+
15
+ const hasDimensions = (image: ReturnType<typeof getGeneratedImage>): image is GeneratedImageWithDimensions => (
16
+ Boolean(image) && Number.isFinite(image.width) && Number.isFinite(image.height)
17
+ );
18
+
19
+ export const getCaptionId = (image: GalleryImage, itemIndex: number, imageIndex = 0) => {
20
+ const source = (image.src ?? image.image)
21
+ .toLowerCase()
22
+ .replace(/[^a-z0-9]+/g, '-')
23
+ .replace(/^-|-$/g, '');
24
+
25
+ return `gallery-caption-${source}-${itemIndex}-${imageIndex}`;
26
+ };
27
+
28
+ export const getGalleryImageSizes = (maxAvailableWidthPercent: { desktop: number; mobile: number }) => [
29
+ `(max-width: 700px) ${maxAvailableWidthPercent.mobile}vw`,
30
+ `${maxAvailableWidthPercent.desktop}vw`,
31
+ ].join(', ');
32
+
33
+ export const getImageClass = (image: GalleryImage) => {
34
+ const generatedImage = getGeneratedImage(image.src ?? image.image);
35
+ return hasDimensions(generatedImage) && generatedImage.width > generatedImage.height
36
+ ? 'gallery-image-landscape'
37
+ : undefined;
38
+ };
39
+
40
+ export const getImageLoadingProps = (isPriority: boolean) => ({
41
+ decoding: 'async' as const,
42
+ fetchpriority: isPriority ? 'high' as const : 'low' as const,
43
+ loading: isPriority ? 'eager' as const : 'lazy' as const,
44
+ });
45
+
46
+ export const getCarouselAspectRatio = (images: GalleryImage[]) => {
47
+ const ratios = images
48
+ .map((image) => getGeneratedImage(image.src ?? image.image))
49
+ .filter(hasDimensions)
50
+ .map((image) => image.width / image.height);
51
+
52
+ return ratios.length > 0 ? Math.min(...ratios) : null;
53
+ };
@@ -34,6 +34,7 @@
34
34
  --space-content-block-gap-desktop: 1.5em;
35
35
  --space-content-block-gap-mobile: 1.25em;
36
36
  --space-content-block-gap: var(--space-content-block-gap-desktop);
37
+ --space-card-list-after: 0.5em;
37
38
  --space-heading-to-block-desktop: 0.75em;
38
39
  --space-heading-to-block-mobile: 0.7em;
39
40
  --space-heading-to-block: var(--space-heading-to-block-desktop);
@@ -61,6 +62,12 @@ html {
61
62
  background: var(--color-page);
62
63
  }
63
64
 
65
+ @media (prefers-reduced-motion: reduce) {
66
+ html {
67
+ scroll-behavior: auto !important;
68
+ }
69
+ }
70
+
64
71
  body {
65
72
  min-height: 100vh;
66
73
  min-height: 100svh;
@@ -253,6 +260,55 @@ a {
253
260
  display: none;
254
261
  }
255
262
 
263
+ .page-nav {
264
+ border-top: 1px solid color-mix(in srgb, currentColor 14%, transparent);
265
+ }
266
+
267
+ .page-nav ul {
268
+ display: flex;
269
+ flex-wrap: wrap;
270
+ justify-content: center;
271
+ gap: 0 clamp(1.4rem, 4vw, 3.25rem);
272
+ margin: 0;
273
+ padding: 0;
274
+ list-style: none;
275
+ }
276
+
277
+ .page-nav li {
278
+ position: relative;
279
+ }
280
+
281
+ .page-nav li + li::before {
282
+ position: absolute;
283
+ top: 50%;
284
+ left: calc(clamp(1.4rem, 4vw, 3.25rem) / -2 - 0.1rem);
285
+ transform: translateY(-50%);
286
+ content: "·";
287
+ font-size: 0.75rem;
288
+ opacity: 0.28;
289
+ }
290
+
291
+ .page-nav a {
292
+ display: block;
293
+ padding: 1.05rem 0 0.95rem;
294
+ color: currentColor;
295
+ font-size: 0.76rem;
296
+ font-weight: 500;
297
+ letter-spacing: 0.08em;
298
+ line-height: 1.2;
299
+ opacity: 0.72;
300
+ text-decoration: none;
301
+ text-transform: uppercase;
302
+ }
303
+
304
+ .page-nav a:hover,
305
+ .page-nav a:focus-visible {
306
+ opacity: 1;
307
+ text-decoration: underline;
308
+ text-decoration-thickness: 1px;
309
+ text-underline-offset: 0.35em;
310
+ }
311
+
256
312
  .mobile-page-nav a[aria-current='true'] {
257
313
  opacity: 1;
258
314
  text-decoration: underline;
@@ -287,6 +343,8 @@ a {
287
343
  .site-banner {
288
344
  display: flex;
289
345
  align-items: flex-start;
346
+ width: 100%;
347
+ min-width: 0;
290
348
  gap: 1rem;
291
349
  border: 1px solid color-mix(in srgb, #ffd84d 42%, var(--color-border));
292
350
  border-inline-start: 0.35rem solid #ffd84d;
@@ -437,6 +495,7 @@ ul {
437
495
  }
438
496
 
439
497
  .section-body {
498
+ display: flow-root;
440
499
  width: 100%;
441
500
  margin: 0 auto;
442
501
  color: inherit;
@@ -640,11 +699,18 @@ ul {
640
699
 
641
700
  .section-body > .section-reading-layout:not(:last-child),
642
701
  .section-body > .section-markdown:not(:last-child),
643
- .section-body > .card-list:not(:last-child),
644
702
  .section-body > .gallery:not(:last-child) {
645
703
  margin-bottom: var(--space-content-block-gap);
646
704
  }
647
705
 
706
+ .section-body > .card-list:not(:last-child) {
707
+ margin-bottom: calc(var(--space-content-block-gap) + var(--space-card-list-after));
708
+ }
709
+
710
+ .section-body > .card-list:last-child {
711
+ margin-bottom: var(--space-card-list-after);
712
+ }
713
+
648
714
  @media (max-width: 1100px) {
649
715
  .section-reading-layout {
650
716
  display: block;
@@ -1082,6 +1148,22 @@ ul {
1082
1148
  flex: 0 0 auto;
1083
1149
  }
1084
1150
 
1151
+ .page-nav ul {
1152
+ gap: 0 1.55rem;
1153
+ padding: 0 1rem;
1154
+ text-align: center;
1155
+ }
1156
+
1157
+ .page-nav li + li::before {
1158
+ left: -0.95rem;
1159
+ }
1160
+
1161
+ .page-nav a {
1162
+ padding: 0.95rem 0 0.85rem;
1163
+ font-size: 0.72rem;
1164
+ white-space: nowrap;
1165
+ }
1166
+
1085
1167
  .mobile-nav-menu summary {
1086
1168
  display: flex;
1087
1169
  align-items: center;
@@ -2,8 +2,6 @@ name: Deploy to GitHub Pages
2
2
 
3
3
  on:
4
4
  push:
5
- branches:
6
- - main
7
5
  workflow_dispatch:
8
6
 
9
7
  permissions:
@@ -17,6 +15,7 @@ concurrency:
17
15
 
18
16
  jobs:
19
17
  build:
18
+ if: github.ref_name == github.event.repository.default_branch
20
19
  runs-on: ubuntu-latest
21
20
  steps:
22
21
  - name: Checkout
@@ -18,21 +18,23 @@ npm run dev -- --kill
18
18
  Edit shared brand, logo, banners and footer in `site/sitewide-content.md`,
19
19
  site-wide visual defaults in `site/theme.md`, homepage content and section
20
20
  metadata in `site/content.md`, and technical settings such as URL and locale
21
- labels in `site/config.mjs`. Keep source images under `site/images/<section-id>/`
21
+ in `site/config.md`. Keep source images under `site/images/<section-id>/`
22
22
  and static public files under `site/public/`. The image folder name should
23
23
  match the section id in Markdown, for example `## Work {#work}` uses
24
24
  `site/images/work/`.
25
25
 
26
- Use `site.basePath: '/'` for a custom domain or root-hosted site. For a GitHub
27
- Pages project site without a custom domain, set both values:
26
+ For a GitHub Pages project site without a custom domain, include the repository
27
+ path in the public URL:
28
28
 
29
- ```js
30
- site: {
31
- url: 'https://owner.github.io/repository-name/',
32
- basePath: '/repository-name/',
33
- }
29
+ ```yaml
30
+ ---
31
+ url: https://owner.github.io/repository-name/
32
+ ---
34
33
  ```
35
34
 
35
+ Norna derives `/repository-name/` as the base path. Use a root URL such as
36
+ `https://example.com/` for a custom domain or root-hosted site.
37
+
36
38
  In GitHub repository settings, configure Pages to build from GitHub Actions.
37
39
 
38
40
  Page width, side gutters, layout density, typography rhythm, image width, image
@@ -14,6 +14,7 @@
14
14
  "norna:config:check": "norna config:check",
15
15
  "norna:content:check": "norna content:check",
16
16
  "norna:sync": "norna content:sync",
17
+ "norna:theme:export": "norna theme:export",
17
18
  "norna:typography:presets": "norna typography presets",
18
19
  "norna:typography:show": "norna typography show",
19
20
  "norna:public": "norna site:public",
@@ -0,0 +1,3 @@
1
+ ---
2
+ url: https://example.com/
3
+ ---
@@ -2,8 +2,6 @@ name: Deploy to GitHub Pages
2
2
 
3
3
  on:
4
4
  push:
5
- branches:
6
- - main
7
5
  workflow_dispatch:
8
6
 
9
7
  permissions:
@@ -17,6 +15,7 @@ concurrency:
17
15
 
18
16
  jobs:
19
17
  build:
18
+ if: github.ref_name == github.event.repository.default_branch
20
19
  runs-on: ubuntu-latest
21
20
  steps:
22
21
  - name: Checkout
@@ -18,8 +18,7 @@ npm run dev -- --kill
18
18
 
19
19
  ## Files
20
20
 
21
- - `site/config.mjs`: technical settings such as URL, language labels, GitHub
22
- repository, and deploy workflow.
21
+ - `site/config.md`: public URL and optional language and smooth scrolling.
23
22
  - `site/sitewide-content.md`: shared brand or logo, banners and footer content.
24
23
  - `site/theme.md`: site-wide visual settings such as layout density, typography
25
24
  rhythm, palettes, section surfaces, and typography.
@@ -45,8 +44,8 @@ GitHub Pages workflow uses `npm ci`.
45
44
  surfaces, and typography.
46
45
  5. Put any local source images in the image folder for the Markdown section
47
46
  that references them, for example `site/images/intro/`.
48
- 6. Edit `site/config.mjs` for public URL, GitHub repository and deploy workflow
49
- name.
47
+ 6. Edit `site/config.md` for the public URL and, when needed, language or smooth
48
+ scrolling. Deploy commands discover the GitHub repository and default branch.
50
49
  7. Update `package.json` with the site's package name and keep
51
50
  `package-lock.json` committed.
52
51
 
@@ -14,6 +14,7 @@
14
14
  "norna:config:check": "norna config:check",
15
15
  "norna:content:check": "norna content:check",
16
16
  "norna:sync": "norna content:sync",
17
+ "norna:theme:export": "norna theme:export",
17
18
  "norna:typography:presets": "norna typography presets",
18
19
  "norna:typography:show": "norna typography show",
19
20
  "norna:public": "norna site:public",
@@ -0,0 +1,3 @@
1
+ ---
2
+ url: https://example.com/
3
+ ---
@@ -1,9 +0,0 @@
1
- # Dog Shelter single-page example
2
-
3
- A small Norna site with two homepage sections and no routes.
4
-
5
- Run it from the Norna repository root:
6
-
7
- ```sh
8
- node bin/norna.mjs --site-dir examples/001-dog-shelter-single-page/site dev:local
9
- ```
@@ -1,27 +0,0 @@
1
- export default {
2
- site: {
3
- url: 'http://localhost:4321/',
4
- basePath: '/',
5
- },
6
- navigation: {
7
- smoothScroll: {
8
- enabled: true,
9
- minimumDurationMs: 600,
10
- maximumDurationMs: 1_200,
11
- durationPerPixelMs: 0.2,
12
- },
13
- },
14
- locale: {
15
- lang: 'en',
16
- labels: {
17
- skipToContent: 'Skip to content',
18
- sectionNavigation: 'Sections',
19
- gallery: 'Images',
20
- },
21
- },
22
- github: {
23
- repo: 'owner/dog-shelter',
24
- branch: 'main',
25
- pagesWorkflow: 'Deploy to GitHub Pages',
26
- },
27
- };
@@ -1,38 +0,0 @@
1
- ---
2
- title: Home
3
- description: A single-page dog shelter website built with Norna.
4
- ---
5
-
6
- ## What we do {#what-we-do}
7
-
8
- We rescue and rehome dogs.
9
-
10
- <!-- norna-image-provenance:
11
- image: dog-house.svg
12
- source: AI-assisted, hand-authored SVG
13
- prompt: Draw a simple flat vector dog house with a friendly dog at the entrance,
14
- using a small paper, red and dark-brown palette. No text and no external assets.
15
- -->
16
-
17
- ```norna-image-stack
18
- - image: dog-house.svg
19
- alt: A brown dog standing at the entrance to a red dog house.
20
- caption: Time to recover before adoption.
21
- ```
22
-
23
- ## You can help {#you-can-help}
24
-
25
- Adopt. Foster. Donate.
26
-
27
- <!-- norna-image-provenance:
28
- image: heart.svg
29
- source: AI-assisted, hand-authored SVG
30
- prompt: Draw two simple hands holding a red heart as a flat vector illustration,
31
- using a small paper, red and dark-brown palette. No text or external assets.
32
- -->
33
-
34
- ```norna-image-stack
35
- - image: heart.svg
36
- alt: Two open hands holding a red heart.
37
- caption: Foster care helps another dog.
38
- ```
@@ -1,25 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 520" role="img" aria-labelledby="title desc">
2
- <title id="title">Dog at a shelter house</title>
3
- <desc id="desc">A friendly brown dog stands at the entrance to a red wooden dog house.</desc>
4
- <rect width="800" height="520" rx="32" fill="#eef3ef"/>
5
- <path d="M0 405 Q180 365 380 405 T800 390 V520 H0Z" fill="#cad8bd"/>
6
- <g stroke="#493c2b" stroke-width="8" stroke-linejoin="round">
7
- <path d="M190 247 L400 82 L610 247" fill="#9f493a"/>
8
- <path d="M236 222 H564 V432 H236Z" fill="#c8674f"/>
9
- <path d="M327 432 V300 Q327 234 400 234 Q473 234 473 300 V432Z" fill="#332d29"/>
10
- <path d="M213 244 L400 94 L587 244" fill="none" stroke="#7f3f32" stroke-width="24" stroke-linecap="round"/>
11
- </g>
12
- <g transform="translate(310 250)" stroke="#493c2b" stroke-width="6" stroke-linejoin="round">
13
- <path d="M40 119 C47 80 93 64 142 76 C181 86 196 119 184 158 H58 C42 151 34 135 40 119Z" fill="#b8794d"/>
14
- <path d="M62 94 C45 61 58 23 96 13 C133 3 169 27 168 64 C167 93 145 108 112 109 H76Z" fill="#b8794d"/>
15
- <path d="M76 32 L53 3 L98 17" fill="#8c573a"/>
16
- <path d="M143 25 L171 3 L164 46" fill="#8c573a"/>
17
- <circle cx="92" cy="53" r="6" fill="#272522" stroke="none"/>
18
- <circle cx="140" cy="53" r="6" fill="#272522" stroke="none"/>
19
- <ellipse cx="116" cy="76" rx="25" ry="19" fill="#dca477"/>
20
- <circle cx="116" cy="70" r="7" fill="#272522" stroke="none"/>
21
- <path d="M105 84 Q116 96 129 84" fill="none" stroke-linecap="round"/>
22
- <path d="M59 154 V188 M94 154 V188 M145 154 V188" fill="none" stroke-linecap="round"/>
23
- <path d="M177 105 Q220 80 211 39" fill="none" stroke-linecap="round"/>
24
- </g>
25
- </svg>
@@ -1,13 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 520" role="img" aria-labelledby="title desc">
2
- <title id="title">Hands holding a heart</title>
3
- <desc id="desc">Two open hands support a large red heart.</desc>
4
- <rect width="800" height="520" rx="32" fill="#f3eee5"/>
5
- <circle cx="400" cy="250" r="176" fill="#e5dccd"/>
6
- <path d="M400 354 C368 316 263 252 263 166 C263 108 309 79 354 92 C379 99 394 116 400 135 C406 116 421 99 446 92 C491 79 537 108 537 166 C537 252 432 316 400 354Z" fill="#b84f45" stroke="#493c2b" stroke-width="8" stroke-linejoin="round"/>
7
- <g fill="#d5a071" stroke="#493c2b" stroke-width="7" stroke-linecap="round" stroke-linejoin="round">
8
- <path d="M74 368 C144 330 211 328 291 365 L363 407 C382 420 373 451 350 450 L268 426 C228 414 191 421 154 451 L92 502 L30 429Z"/>
9
- <path d="M726 368 C656 330 589 328 509 365 L437 407 C418 420 427 451 450 450 L532 426 C572 414 609 421 646 451 L708 502 L770 429Z"/>
10
- <path d="M290 365 L350 349 C369 344 383 360 376 378 L363 407"/>
11
- <path d="M510 365 L450 349 C431 344 417 360 424 378 L437 407"/>
12
- </g>
13
- </svg>
@@ -1,6 +0,0 @@
1
- ---
2
- navigation:
3
- brand: Dog Shelter
4
- footer:
5
- copyrightMessage: Dog Shelter example site.
6
- ---
@@ -1,25 +0,0 @@
1
- ---
2
- layout:
3
- density: normal
4
- pageWidth: 1180px
5
- gutter:
6
- desktop: clamp(1.25rem, 4vw, 3rem)
7
- mobile: 1rem
8
- gallery:
9
- width: 760px
10
- maxAvailableWidthPercent:
11
- desktop: 100
12
- mobile: 100
13
- maxAvailableHeightPercent:
14
- desktop: 72
15
- mobile: 68
16
- typography:
17
- fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
18
- preset: text-forward
19
- rhythm: normal
20
- presentation:
21
- palette: paper
22
- sectionSurfaces:
23
- mode: cycle
24
- sequence: [base, soft]
25
- ---
@@ -1,9 +0,0 @@
1
- # Dog Shelter multi-page example
2
-
3
- A small Norna site with a homepage and ordered routes for dogs and adoption.
4
-
5
- Run it from the Norna repository root:
6
-
7
- ```sh
8
- node bin/norna.mjs --site-dir examples/002-dog-shelter-multi-page/site dev:local
9
- ```