@janga/norna 0.7.8 → 0.7.10

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 (234) hide show
  1. package/README.md +1 -1
  2. package/docs/README.md +18 -11
  3. package/docs/configuration.md +9 -54
  4. package/docs/content.md +6 -7
  5. package/docs/design/norna-diagram-design.md +158 -0
  6. package/docs/getting-started.md +18 -16
  7. package/docs/routes.md +7 -6
  8. package/docs/site-structure.md +4 -2
  9. package/docs/sitewide-content.md +74 -0
  10. package/docs/theme.md +61 -128
  11. package/docs/typography.md +45 -33
  12. package/examples/001-dog-shelter-single-page/README.md +9 -0
  13. package/examples/001-dog-shelter-single-page/site/config.mjs +27 -0
  14. package/examples/001-dog-shelter-single-page/site/content.md +38 -0
  15. package/examples/001-dog-shelter-single-page/site/images/what-we-do/dog-house.svg +25 -0
  16. package/examples/001-dog-shelter-single-page/site/images/you-can-help/heart.svg +13 -0
  17. package/examples/001-dog-shelter-single-page/site/public/favicon.svg +10 -0
  18. package/examples/001-dog-shelter-single-page/site/public/robots.txt +2 -0
  19. package/examples/001-dog-shelter-single-page/site/sitewide-content.md +6 -0
  20. package/examples/001-dog-shelter-single-page/site/theme.md +25 -0
  21. package/examples/002-dog-shelter-multi-page/README.md +9 -0
  22. package/examples/002-dog-shelter-multi-page/site/config.mjs +27 -0
  23. package/examples/002-dog-shelter-multi-page/site/content.md +12 -0
  24. package/examples/002-dog-shelter-multi-page/site/public/favicon.svg +10 -0
  25. package/examples/002-dog-shelter-multi-page/site/public/robots.txt +2 -0
  26. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.svg +19 -0
  27. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.svg +19 -0
  28. package/examples/002-dog-shelter-multi-page/site/routes/010-dogs/route-content.md +30 -0
  29. package/examples/002-dog-shelter-multi-page/site/routes/020-adopt/route-content.md +12 -0
  30. package/examples/002-dog-shelter-multi-page/site/sitewide-content.md +6 -0
  31. package/examples/002-dog-shelter-multi-page/site/theme.md +25 -0
  32. package/examples/dog-gallery/.astro/collections/site.schema.json +776 -0
  33. package/examples/dog-gallery/.astro/collections/theme.schema.json +672 -0
  34. package/examples/dog-gallery/.astro/content-assets.mjs +4 -0
  35. package/examples/dog-gallery/.astro/content-modules.mjs +1 -0
  36. package/examples/dog-gallery/.astro/content.d.ts +175 -0
  37. package/examples/dog-gallery/.astro/data-store.json +1 -0
  38. package/examples/dog-gallery/.astro/dev-local.json +8 -0
  39. package/examples/dog-gallery/.astro/dev.json +13 -0
  40. package/examples/dog-gallery/.astro/dev.log +95 -0
  41. package/examples/dog-gallery/.astro/settings.json +5 -0
  42. package/examples/dog-gallery/.astro/types.d.ts +2 -0
  43. package/examples/dog-gallery/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +1 -0
  44. package/examples/dog-gallery/dist/_astro/SitePage.DicGh_5N.css +1 -0
  45. package/examples/dog-gallery/dist/dog-care/index.html +15 -0
  46. package/examples/dog-gallery/dist/dog-shelter-logo.svg +14 -0
  47. package/examples/dog-gallery/dist/favicon.svg +7 -0
  48. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp +0 -0
  49. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp +0 -0
  50. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp +0 -0
  51. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp +0 -0
  52. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp +0 -0
  53. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp +0 -0
  54. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp +0 -0
  55. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp +0 -0
  56. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1080.webp +0 -0
  57. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp +0 -0
  58. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1920.webp +0 -0
  59. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-3939.webp +0 -0
  60. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-480.webp +0 -0
  61. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-768.webp +0 -0
  62. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp +0 -0
  63. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp +0 -0
  64. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp +0 -0
  65. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-2400.webp +0 -0
  66. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp +0 -0
  67. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp +0 -0
  68. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp +0 -0
  69. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp +0 -0
  70. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp +0 -0
  71. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp +0 -0
  72. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-768.webp +0 -0
  73. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp +0 -0
  74. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp +0 -0
  75. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp +0 -0
  76. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-2576.webp +0 -0
  77. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp +0 -0
  78. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp +0 -0
  79. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1080.webp +0 -0
  80. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp +0 -0
  81. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-480.webp +0 -0
  82. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-768.webp +0 -0
  83. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp +0 -0
  84. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp +0 -0
  85. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp +0 -0
  86. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp +0 -0
  87. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp +0 -0
  88. package/examples/dog-gallery/dist/index.html +45 -0
  89. package/examples/dog-gallery/dist/robots.txt +2 -0
  90. package/examples/dog-gallery/node_modules/.vite/deps/_metadata.json +7 -7
  91. package/examples/dog-gallery/site/.norna/generated-images.json +8 -8
  92. package/examples/dog-gallery/site/config.mjs +0 -20
  93. package/examples/dog-gallery/site/content.md +4 -5
  94. package/examples/dog-gallery/site/public/logo.svg +14 -0
  95. package/examples/dog-gallery/site/sitewide-content.md +16 -0
  96. package/examples/dog-gallery/site/theme.md +13 -24
  97. package/examples/presentation/README.md +15 -0
  98. package/examples/presentation/site/.norna/generated-images.json +66 -0
  99. package/examples/presentation/site/config.mjs +29 -0
  100. package/examples/presentation/site/content.md +67 -0
  101. package/examples/presentation/site/public/robots.txt +2 -0
  102. package/examples/presentation/site/routes/010-presets/route-content.md +63 -0
  103. package/examples/presentation/site/routes/010-presets/theme.md +4 -0
  104. package/examples/presentation/site/routes/020-media/images/cards/card-carousel.svg +11 -0
  105. package/examples/presentation/site/routes/020-media/images/cards/card-stack.svg +9 -0
  106. package/examples/presentation/site/routes/020-media/images/cards/card-surfaces.svg +8 -0
  107. package/examples/presentation/site/routes/020-media/images/carousel/carousel-one.svg +8 -0
  108. package/examples/presentation/site/routes/020-media/images/carousel/carousel-three.svg +13 -0
  109. package/examples/presentation/site/routes/020-media/images/carousel/carousel-two.svg +8 -0
  110. package/examples/presentation/site/routes/020-media/images/stack/stack-one.svg +8 -0
  111. package/examples/presentation/site/routes/020-media/images/stack/stack-two.svg +9 -0
  112. package/examples/presentation/site/routes/020-media/route-content.md +77 -0
  113. package/examples/presentation/site/routes/020-media/theme.md +4 -0
  114. package/examples/presentation/site/routes/030-surfaces/route-content.md +44 -0
  115. package/examples/presentation/site/routes/030-surfaces/theme.md +7 -0
  116. package/examples/presentation/site/sitewide-content.md +6 -0
  117. package/examples/presentation/site/theme.md +43 -0
  118. package/examples/typography-presets/.astro/collections/routeTheme.schema.json +746 -0
  119. package/examples/typography-presets/.astro/collections/site.schema.json +59 -0
  120. package/examples/typography-presets/.astro/collections/sitewide.schema.json +114 -0
  121. package/examples/typography-presets/.astro/collections/theme.schema.json +770 -0
  122. package/examples/typography-presets/.astro/content-assets.mjs +4 -0
  123. package/examples/typography-presets/.astro/content-modules.mjs +1 -0
  124. package/examples/typography-presets/.astro/content.d.ts +183 -0
  125. package/examples/typography-presets/.astro/data-store.json +1 -0
  126. package/examples/typography-presets/.astro/dev-local.json +8 -0
  127. package/examples/typography-presets/.astro/dev.json +15 -0
  128. package/examples/typography-presets/.astro/dev.log +45 -0
  129. package/examples/typography-presets/.astro/settings.json +5 -0
  130. package/examples/typography-presets/.astro/types.d.ts +2 -0
  131. package/examples/typography-presets/node_modules/.vite/deps/_metadata.json +80 -0
  132. package/examples/typography-presets/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  133. package/examples/typography-presets/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  134. package/examples/typography-presets/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  135. package/examples/typography-presets/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  136. package/examples/typography-presets/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  137. package/examples/typography-presets/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  138. package/examples/typography-presets/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  139. package/examples/typography-presets/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  140. package/examples/typography-presets/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  141. package/examples/typography-presets/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  142. package/examples/typography-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  143. package/examples/typography-presets/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  144. package/examples/typography-presets/node_modules/.vite/deps/embla-carousel.js +1389 -0
  145. package/examples/typography-presets/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  146. package/examples/typography-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  147. package/examples/typography-presets/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  148. package/examples/typography-presets/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  149. package/examples/typography-presets/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  150. package/examples/typography-presets/node_modules/.vite/deps/package.json +3 -0
  151. package/examples/typography-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  152. package/examples/typography-presets/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  153. package/examples/typography-presets/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  154. package/examples/typography-presets/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  155. package/examples/typography-presets/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  156. package/examples/typography-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  157. package/examples/typography-presets/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  158. package/examples/typography-presets/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  159. package/examples/typography-presets/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  160. package/examples/typography-presets/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  161. package/examples/typography-presets/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  162. package/examples/typography-presets/site/.norna/generated-images.json +290 -0
  163. package/examples/typography-presets/site/config.mjs +29 -0
  164. package/examples/typography-presets/site/content.md +16 -0
  165. package/examples/typography-presets/site/public/robots.txt +2 -0
  166. package/examples/typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/puppy-portrait.jpg +0 -0
  167. package/examples/typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/shepherd-portrait.jpg +0 -0
  168. package/examples/typography-presets/site/routes/010-quiet-gallery/images/quiet-gallery/white-puppy.jpg +0 -0
  169. package/examples/typography-presets/site/routes/010-quiet-gallery/route-content.md +34 -0
  170. package/examples/typography-presets/site/routes/010-quiet-gallery/theme.md +4 -0
  171. package/examples/typography-presets/site/routes/020-compact-gallery/images/compact-gallery/black-schnauzer.jpg +0 -0
  172. package/examples/typography-presets/site/routes/020-compact-gallery/images/compact-gallery/retriever-portrait.jpg +0 -0
  173. package/examples/typography-presets/site/routes/020-compact-gallery/images/compact-gallery/schnauzer-portrait.jpg +0 -0
  174. package/examples/typography-presets/site/routes/020-compact-gallery/route-content.md +33 -0
  175. package/examples/typography-presets/site/routes/020-compact-gallery/theme.md +4 -0
  176. package/examples/typography-presets/site/routes/030-text-forward/images/text-forward/boxer-portrait.jpg +0 -0
  177. package/examples/typography-presets/site/routes/030-text-forward/images/text-forward/grass-puppy.jpg +0 -0
  178. package/examples/typography-presets/site/routes/030-text-forward/images/text-forward/grey-street-dog.jpg +0 -0
  179. package/examples/typography-presets/site/routes/030-text-forward/route-content.md +34 -0
  180. package/examples/typography-presets/site/routes/030-text-forward/theme.md +4 -0
  181. package/examples/typography-presets/site/routes/040-statement/images/statement/black-pedigree.jpg +0 -0
  182. package/examples/typography-presets/site/routes/040-statement/images/statement/sheepdog-grass.jpg +0 -0
  183. package/examples/typography-presets/site/routes/040-statement/images/statement/sheepdog-wide.jpg +0 -0
  184. package/examples/typography-presets/site/routes/040-statement/route-content.md +34 -0
  185. package/examples/typography-presets/site/routes/040-statement/theme.md +4 -0
  186. package/examples/typography-presets/site/sitewide-content.md +14 -0
  187. package/examples/typography-presets/site/theme.md +43 -0
  188. package/fixtures/basic/site/config.mjs +0 -13
  189. package/fixtures/basic/site/sitewide-content.md +12 -0
  190. package/fixtures/basic/site/theme.md +2 -2
  191. package/fixtures/content-model-v2/site/content.md +2 -5
  192. package/fixtures/content-model-v2/site/theme.md +1 -3
  193. package/package.json +3 -2
  194. package/scripts/check-config.mjs +22 -1
  195. package/scripts/lib/frontmatter-yaml.mjs +28 -0
  196. package/scripts/lib/logo-assets.mjs +35 -0
  197. package/scripts/lib/norna-markdown-blocks.mjs +166 -0
  198. package/scripts/lib/presentation.mjs +104 -46
  199. package/scripts/lib/project-config.mjs +67 -105
  200. package/scripts/lib/site-content.mjs +26 -42
  201. package/scripts/lib/site-paths.mjs +2 -0
  202. package/scripts/lib/sitewide-config.mjs +34 -0
  203. package/scripts/lib/theme-config.mjs +72 -6
  204. package/scripts/lib/typography.mjs +20 -26
  205. package/scripts/show-typography.mjs +40 -147
  206. package/scripts/sync-content-sections.mjs +19 -14
  207. package/scripts/test-content-check.mjs +76 -14
  208. package/scripts/test-content-model-v2.mjs +154 -0
  209. package/scripts/test-engine-commands.mjs +3 -1
  210. package/scripts/test-package-check.mjs +78 -19
  211. package/scripts/test-temporary-visibility.mjs +19 -2
  212. package/src/components/CardList.astro +5 -2
  213. package/src/components/GalleryGrid.astro +37 -16
  214. package/src/components/SiteBanners.astro +100 -0
  215. package/src/components/SiteNavigation.astro +48 -31
  216. package/src/components/SitePage.astro +55 -13
  217. package/src/components/SiteSection.astro +194 -36
  218. package/src/content.config.ts +78 -48
  219. package/src/layouts/BaseLayout.astro +64 -14
  220. package/src/lib/routeThemes.ts +61 -0
  221. package/src/lib/sectionContent.ts +236 -44
  222. package/src/lib/sitePublicAssets.ts +1 -0
  223. package/src/styles/global.css +282 -93
  224. package/starters/basic/.github/workflows/deploy.yml +1 -1
  225. package/starters/basic/README.md +7 -6
  226. package/starters/basic/site/config.mjs +0 -13
  227. package/starters/basic/site/content.md +1 -1
  228. package/starters/basic/site/sitewide-content.md +14 -0
  229. package/starters/basic/site/theme.md +13 -24
  230. package/starters/project/.github/workflows/deploy.yml +1 -1
  231. package/starters/project/README.md +10 -8
  232. package/starters/project/site/config.mjs +0 -13
  233. package/starters/project/site/sitewide-content.md +14 -0
  234. package/starters/project/site/theme.md +3 -11
package/README.md CHANGED
@@ -24,7 +24,7 @@ A `norna` site is file-driven:
24
24
  2. The site keeps technical settings, including public URL and optional URL
25
25
  base path, in `site/config.mjs`.
26
26
  3. The site keeps site-wide visual theme defaults, including layout, image
27
- sizing, font, typography, colors, and frame colors, in `site/theme.md`.
27
+ sizing, font, typography, palettes, and section surfaces, in `site/theme.md`.
28
28
  4. The site keeps homepage content, Markdown section order, managed media
29
29
  blocks, alt text, captions, and optional section metadata in
30
30
  `site/content.md`.
package/docs/README.md CHANGED
@@ -10,13 +10,14 @@ For a site maintainer:
10
10
  1. [Getting Started](getting-started.md)
11
11
  2. [Site Structure](site-structure.md)
12
12
  3. [Theme](theme.md)
13
- 4. [Configuration](configuration.md)
14
- 5. [Content](content.md)
15
- 6. [Typography](typography.md)
16
- 7. [Routes](routes.md)
17
- 8. [Images And Metadata](images-and-metadata.md)
18
- 9. [Local Development](local-development.md)
19
- 10. [Publishing](publishing.md)
13
+ 4. [Sitewide Content](sitewide-content.md)
14
+ 5. [Configuration](configuration.md)
15
+ 6. [Content](content.md)
16
+ 7. [Typography](typography.md)
17
+ 8. [Routes](routes.md)
18
+ 9. [Images And Metadata](images-and-metadata.md)
19
+ 10. [Local Development](local-development.md)
20
+ 11. [Publishing](publishing.md)
20
21
 
21
22
  For a developer integrating or updating the engine:
22
23
 
@@ -32,17 +33,20 @@ For design and naming principles:
32
33
 
33
34
  1. [Command Organization](design/command-organization.md)
34
35
  2. [Site Examples Structure](design/site-examples-structure.md)
36
+ 3. [Norna Diagram Design](design/norna-diagram-design.md)
35
37
 
36
38
  For a quick reference:
37
39
 
38
40
  - [Configuration](configuration.md) describes technical `site/config.mjs`
39
- fields such as URL, base path, locale labels, footer, GitHub, and deploy
41
+ fields such as URL, base path, locale labels, GitHub, and deploy
40
42
  settings.
43
+ - [Sitewide Content](sitewide-content.md) describes shared site identity, banners
44
+ and footer content in `site/sitewide-content.md`.
41
45
  - [Content](content.md) describes page frontmatter, Markdown-authored
42
- sections, optional section metadata, managed media blocks, temporary
43
- sections, and content validation.
46
+ sections, optional section metadata, managed media blocks, temporary sections,
47
+ and content validation.
44
48
  - [Theme](theme.md) describes site-wide layout, layout density, image sizing,
45
- font, typography rhythm, presentation colors, frame colors, and inline styles.
49
+ font, typography rhythm, presentation palettes, and section surfaces.
46
50
  - [Typography](typography.md) describes presets, rhythms, roles, overrides,
47
51
  inheritance, and inspection commands.
48
52
  - [Routes](routes.md) describes route files, slugs, route navigation, and
@@ -58,6 +62,9 @@ Design documents are intentionally separate from the user reference:
58
62
  - [Site Examples Structure](design/site-examples-structure.md) defines the
59
63
  intended vocabulary for starters, examples, documentation sites, reference
60
64
  docs, and fixtures.
65
+ - [Norna Diagram Design](design/norna-diagram-design.md) defines the first
66
+ experiment for technical and pedagogical diagrams without adding external
67
+ diagram tooling to the build pipeline.
61
68
 
62
69
  Site repositories should document only their site-specific choices and link here
63
70
  for generic `norna` behavior.
@@ -72,7 +72,7 @@ Use [Theme](theme.md) for:
72
72
  - `gallery.maxAvailableHeightPercent`
73
73
  - `typography.fontFamily`
74
74
  - typography presets, rhythm, and overrides
75
- - presentation colors, inline styles, and frame colors
75
+ - presentation palettes and section surfaces
76
76
 
77
77
  ## Navigation
78
78
 
@@ -141,6 +141,10 @@ Fields:
141
141
  `Sections`.
142
142
  - `locale.labels.menu`: mobile menu summary text, default `Menu`.
143
143
  - `locale.labels.closeMenu`: reserved close-menu label, default `Close menu`.
144
+ - `locale.labels.dismissBanner`: banner dismissal button label, default
145
+ `Dismiss notice`.
146
+ - `locale.labels.siteBanners`: ARIA label for the banner stack, default
147
+ `Site notices`.
144
148
  - `locale.labels.gallery`: Norna managed media ARIA label prefix, default
145
149
  `Images`.
146
150
 
@@ -160,60 +164,11 @@ locale: {
160
164
  }
161
165
  ```
162
166
 
163
- ## Footer
167
+ ## Sitewide Content
164
168
 
165
- ### `footer.copyrightMessage`
166
-
167
- - Purpose: optional footer sentence.
168
- - Type: string.
169
- - Required: no.
170
- - Default: hidden.
171
- - Validation: if set, it must be a non-empty string. `undefined`, `null`, and
172
- `''` are treated as absent.
173
- - Consequence: footer rendering is enabled when this or enabled build info is
174
- present.
175
-
176
- ### `footer.buildInfo`
177
-
178
- - Purpose: optional footer build timestamp.
179
- - Type: object, `false`, `null`, or omitted.
180
- - Required: no.
181
- - Default: hidden.
182
- - Validation: object fields are validated when the object is present. `false`,
183
- `null`, or omission hides build info.
184
-
185
- Fields:
186
-
187
- - `footer.buildInfo.enabled`: boolean, default `true`.
188
- - `footer.buildInfo.text`: required non-empty string.
189
- - `footer.buildInfo.dateTimeFormat`: required object.
190
- - `footer.buildInfo.dateTimeFormat.locale`: required string.
191
- - `footer.buildInfo.dateTimeFormat.timeZone`: required string.
192
- - `footer.buildInfo.dateTimeFormat.dateStyle`: required string.
193
- - `footer.buildInfo.dateTimeFormat.timeStyle`: required string.
194
-
195
- The date/time object must be accepted by `Intl.DateTimeFormat`.
196
-
197
- Example:
198
-
199
- ```js
200
- footer: {
201
- copyrightMessage: '(c) Example Artist.',
202
- buildInfo: {
203
- enabled: true,
204
- text: 'Built',
205
- dateTimeFormat: {
206
- locale: 'en-GB',
207
- timeZone: 'UTC',
208
- dateStyle: 'short',
209
- timeStyle: 'short',
210
- },
211
- },
212
- }
213
- ```
214
-
215
- If both `footer.copyrightMessage` and enabled `footer.buildInfo` are absent, the
216
- footer is not rendered.
169
+ Shared site identity, banners and footer content are defined in
170
+ `site/sitewide-content.md`. See [Sitewide Content](sitewide-content.md) for the
171
+ schema and examples.
217
172
 
218
173
  ## GitHub
219
174
 
package/docs/content.md CHANGED
@@ -18,9 +18,6 @@ The Astro content schema validates these top-level fields in page files:
18
18
  - `title`: required string. Rendered as the document title.
19
19
  - `description`: required string. Rendered as the meta description.
20
20
  - `navigation`: optional page navigation metadata. See [Routes](routes.md).
21
- - `presentation`: optional page-level presentation overrides. See
22
- [Theme](theme.md) and [Typography](typography.md).
23
- - `frame`: optional page-level frame color source. See [Theme](theme.md).
24
21
  - `sections`: optional section metadata keyed by section id.
25
22
 
26
23
  Minimal homepage:
@@ -71,16 +68,18 @@ current section, not new sections.
71
68
  ## Section Metadata
72
69
 
73
70
  Use `sections` only when a section needs structured metadata that is not
74
- naturally expressed by Markdown, such as visibility or presentation overrides.
71
+ naturally expressed by Markdown. Currently this is date-based visibility.
75
72
 
76
73
  ```yaml
77
74
  sections:
78
75
  work:
79
- presentation:
80
- typography:
81
- preset: statement
76
+ visible:
77
+ from: "2026-08-01"
78
+ until: "2026-09-16"
82
79
  ```
83
80
 
81
+ See [Temporary Sections](#temporary-sections) for visibility semantics.
82
+
84
83
  Each `sections.<section-id>` key must match a Markdown heading id in the same
85
84
  page file:
86
85
 
@@ -0,0 +1,158 @@
1
+ # Norna Diagram Design
2
+
3
+ This document defines a repository-local workflow for creating technical and
4
+ pedagogical diagrams for Norna.
5
+
6
+ It is intentionally not a vendored copy of any external skill, MCP server, or
7
+ diagram tool. The first experiment should use hand-authored SVG assets managed
8
+ by Norna's existing image model.
9
+
10
+ ## Goal
11
+
12
+ Norna diagrams should help a new reader understand the site model faster than
13
+ text alone.
14
+
15
+ A diagram should explain one idea clearly, not show every related feature. If a
16
+ topic needs several ideas, split it into several diagrams.
17
+
18
+ ## Current Scope
19
+
20
+ Use this workflow for diagrams in the Norna documentation site under `site/`.
21
+
22
+ Do not add diagram generation to the Norna build pipeline yet. Diagram creation
23
+ is an authoring workflow for now, not product functionality.
24
+
25
+ Do not require Excalidraw, MCP servers, browser plugins, or external layout
26
+ tools for the first experiment.
27
+
28
+ ## Diagram Brief
29
+
30
+ Before creating or replacing a diagram, write a short brief:
31
+
32
+ ```md
33
+ Purpose:
34
+ Audience:
35
+ Main message:
36
+ Concepts to show:
37
+ Concepts to avoid:
38
+ Norna features that must not be implied:
39
+ Suggested layout:
40
+ Mobile/readability requirement:
41
+ Where the SVG will live:
42
+ Markdown block and alt text:
43
+ ```
44
+
45
+ The brief can live in the discussion, in a source-only Markdown comment near
46
+ the image, or in `docs/design/` when it is useful for future maintenance.
47
+
48
+ ## Design Principles
49
+
50
+ - Show one primary flow or relationship.
51
+ - Prefer two to five main objects.
52
+ - Use short labels.
53
+ - Use one clear visual hierarchy.
54
+ - Keep arrows few and directional.
55
+ - Avoid diagrams where every object connects to every other object.
56
+ - Prefer multiple simple diagrams over one dense diagram.
57
+ - Make route order, URL slugs, section ids, image folders, source files, and
58
+ generated output visually distinct when those ideas matter.
59
+ - Do not show templates, components, custom rendering logic, route-level
60
+ technical configuration, or hosting integrations that Norna does not support.
61
+ - Do not show page layouts that Norna cannot actually render unless the diagram
62
+ is clearly abstract and not a product capability example.
63
+
64
+ ## Norna-Specific Accuracy
65
+
66
+ Diagrams must match the current Norna model:
67
+
68
+ - A Norna site is described with site files, not arbitrary project structure.
69
+ - `content.md` is the homepage content file.
70
+ - `sitewide-content.md` contains shared site identity, banners, and footer
71
+ content.
72
+ - Additional pages are route directories with `route-content.md`.
73
+ - Route folder prefixes control route presentation order.
74
+ - Route ids become default URL slugs.
75
+ - Images belong under the image root for the page or route, usually grouped by
76
+ section id.
77
+ - Markdown remains the primary writing format.
78
+ - Norna managed media blocks cover fixed site patterns such as image stacks,
79
+ carousels, and card lists.
80
+ - `theme.md` controls visual presentation.
81
+ - `config.mjs` controls technical site configuration.
82
+ - `dist/` is generated static output.
83
+ - GitHub Pages is the integrated publishing target today.
84
+
85
+ ## SVG Requirements
86
+
87
+ Use hand-authored SVG for the first experiment.
88
+
89
+ SVG assets should:
90
+
91
+ - have a `viewBox`;
92
+ - include `<title>` and `<desc>`;
93
+ - use real text, not outlined text;
94
+ - avoid external fonts and external image files;
95
+ - remain readable at the size used on the site;
96
+ - work when scaled down on a phone;
97
+ - use restrained colors that fit the surrounding page;
98
+ - avoid decorative effects that compete with the explanation;
99
+ - keep text inside boxes with visible margins;
100
+ - be maintainable by editing the SVG source.
101
+
102
+ If a diagram is too wide for mobile, prefer splitting it into smaller diagrams
103
+ over relying on horizontal scrolling.
104
+
105
+ ## Source Placement
106
+
107
+ Store diagram SVG files as normal Norna managed image assets:
108
+
109
+ ```text
110
+ site/routes/<NNN-route-id>/images/<section-id>/<diagram-name>.svg
111
+ ```
112
+
113
+ Reference them with a Norna managed media block:
114
+
115
+ ````md
116
+ <!-- norna-image-provenance:
117
+ image: diagram-name.svg
118
+ source: hand-authored
119
+ Short maintenance note explaining why the diagram exists.
120
+ -->
121
+
122
+ ```norna-image-stack
123
+ - image: diagram-name.svg
124
+ alt: Concise explanation of what the diagram shows.
125
+ ```
126
+ ````
127
+
128
+ ## Review Checklist
129
+
130
+ Before accepting a diagram:
131
+
132
+ - The main message is obvious without reading the surrounding section.
133
+ - The diagram does not imply unsupported Norna functionality.
134
+ - URL, route, section, image, theme, config, and output terminology is
135
+ consistent with documentation.
136
+ - Text fits inside boxes at desktop and mobile widths.
137
+ - Arrows clarify the relationship instead of adding noise.
138
+ - The SVG has title, description, and useful alt text in Markdown.
139
+ - `norna content:check` passes.
140
+ - A desktop and mobile visual check has been done when layout changed.
141
+
142
+ ## Relationship To Excalidraw
143
+
144
+ Excalidraw can be useful as a sketching style or inspiration for box-and-arrow
145
+ clarity, but the first Norna experiment should not depend on Excalidraw files,
146
+ exports, or MCP tooling.
147
+
148
+ If future experiments show that diagram generation should be automated, evaluate
149
+ that as a separate authoring tool or CLI. Do not make it part of the site build
150
+ engine unless there is a clear product reason.
151
+
152
+ ## Future Questions
153
+
154
+ - Should diagram briefs become tracked files next to SVG assets?
155
+ - Should Norna have a separate authoring helper for diagrams?
156
+ - Should generated diagrams store both a source format and exported SVG?
157
+ - Should a later tool create Excalidraw-compatible files, plain SVG, or both?
158
+ - What review rules are needed before diagrams are used in starters or examples?
@@ -57,6 +57,7 @@ The starter contains:
57
57
  - `.github/workflows/deploy.yml` for GitHub Pages
58
58
  - `site/config.mjs`
59
59
  - `site/theme.md`
60
+ - `site/sitewide-content.md`
60
61
  - `site/content.md`
61
62
  - `site/public/robots.txt`
62
63
 
@@ -88,21 +89,22 @@ Relevant documentation: [Commands](commands.md), [Site Structure](site-structure
88
89
  ## First Edits
89
90
 
90
91
  1. Edit `site/config.mjs` for the site's URL, language labels, GitHub
91
- repository, footer, and deploy settings.
92
- 2. Edit `site/theme.md` for site-wide layout, layout density, typography
93
- rhythm, image sizing, font, typography preset, colors, inline styles, and
94
- frame colors, or omit it to use engine defaults.
95
- 3. Edit `site/content.md` for homepage title, description, Markdown sections,
96
- text, Norna managed media blocks, page/section presentation overrides, alt
97
- text, and captions.
98
- 4. Put source images under `site/images/<section-id>/`, where `<section-id>`
92
+ repository, and deploy settings.
93
+ 2. Edit `site/sitewide-content.md` for the shared brand or logo, banners and
94
+ footer content.
95
+ 3. Edit `site/theme.md` for site-wide layout, layout density, typography
96
+ rhythm, image sizing, font, typography preset, palettes, and section
97
+ surfaces, or omit it to use engine defaults.
98
+ 4. Edit `site/content.md` for homepage title, description, Markdown sections,
99
+ text, Norna managed media blocks, alt text, and captions.
100
+ 5. Put source images under `site/images/<section-id>/`, where `<section-id>`
99
101
  matches a `## Section {#section-id}` heading in `site/content.md`.
100
- 5. Add optional route pages under
102
+ 6. Add optional route pages under
101
103
  `site/routes/<NNN-route-id>/route-content.md`, for example
102
104
  `site/routes/010-about/route-content.md`.
103
- 6. Put static files such as `robots.txt`, `CNAME`, and favicons under
105
+ 7. Put static files such as `robots.txt`, `CNAME`, and favicons under
104
106
  `site/public/`.
105
- 7. Run:
107
+ 8. Run:
106
108
 
107
109
  ```sh
108
110
  npm run norna:config:check
@@ -158,12 +160,12 @@ Read [Site Structure](site-structure.md), [Content](content.md),
158
160
  [Configuration](configuration.md) before publishing a real site.
159
161
 
160
162
  To change the site's maximum page width, side gutters, layout density,
161
- typography rhythm, image width, image height limits, font, colors, or
163
+ typography rhythm, image width, image height limits, font, palettes, or
162
164
  site-wide typography preset, edit `site/theme.md`. See [Theme](theme.md) for
163
165
  the accepted shape.
164
166
 
165
- To change one page or section, add a focused `presentation.typography`
166
- override in `site/content.md`. See [Typography](typography.md). Use
167
- `norna typography presets` to inspect the installed preset and rhythm values and
168
- `norna typography show` to inspect the resolved typography for the selected
167
+ To give a route a different visual expression, add a complete route-local
168
+ `theme.md`. See [Theme](theme.md#route-themes) and [Typography](typography.md).
169
+ Use `norna typography presets` to inspect the installed preset and rhythm values
170
+ and `norna typography show` to inspect the resolved typography for the selected
169
171
  site.
package/docs/routes.md CHANGED
@@ -4,14 +4,15 @@
4
4
  under `site/routes/<NNN-route-id>/route-content.md` and build to first-level
5
5
  URLs.
6
6
 
7
- Routes use the same page frontmatter, optional section metadata, Norna managed
8
- media blocks, and Markdown section model as the homepage. See
9
- [Content](content.md) for the page and section model.
7
+ Routes use the same page frontmatter, optional section metadata, Norna-managed
8
+ media blocks, and Markdown section model as the homepage. See [Content](content.md)
9
+ for the page and section model.
10
10
 
11
11
  Route directories can contain route content, route-local images, and
12
- route-local presentation overrides in `route-content.md`. They cannot contain
13
- technical site configuration; technical configuration stays at the selected
14
- site directory's top-level `config.mjs`.
12
+ an optional route-local `theme.md`. The route theme replaces the root visual
13
+ theme for that route. Route directories cannot contain technical site
14
+ configuration; technical configuration stays in the selected site directory's
15
+ top-level `config.mjs`.
15
16
 
16
17
  ## Route Directory Format
17
18
 
@@ -11,6 +11,7 @@ The selected site directory defaults to `site/`:
11
11
  site/
12
12
  |-- config.mjs
13
13
  |-- theme.md
14
+ |-- sitewide-content.md
14
15
  |-- content.md
15
16
  |-- images/
16
17
  | `-- <section-id>/
@@ -38,9 +39,10 @@ Version these files in a site repository:
38
39
 
39
40
  - `site/config.mjs`: technical site configuration.
40
41
  - `site/theme.md`: optional site-wide visual theme, including layout, spacing,
41
- image sizing, font, typography defaults, colors, inline styles, and frame
42
- colors.
42
+ image sizing, font, typography defaults, palettes, and section surfaces.
43
43
  See [Theme](theme.md).
44
+ - `site/sitewide-content.md`: shared site identity, banners and footer content.
45
+ See [Sitewide Content](sitewide-content.md).
44
46
  - `site/content.md`: homepage page file with editable content, Markdown
45
47
  sections, optional section metadata, managed media blocks, alt text, and
46
48
  captions.
@@ -0,0 +1,74 @@
1
+ # Sitewide Content
2
+
3
+ `site/sitewide-content.md` contains content and settings shared by the whole site. It
4
+ is separate from `content.md`, which defines the homepage, and from
5
+ `config.mjs`, which defines technical behaviour.
6
+
7
+ ## Site identity
8
+
9
+ Use the optional `navigation` object for identity shared by all pages. `brand`
10
+ is the text shown in the home link when no logo is present. A logo is discovered
11
+ from one convention-based file in `site/public`: `logo.svg`, `logo.png`,
12
+ `logo.jpg`, or `logo.jpeg`.
13
+
14
+ ```yaml
15
+ navigation:
16
+ brand: Example Site
17
+ logo:
18
+ alt: Example Site
19
+ height: 2.6rem
20
+ ```
21
+
22
+ If `navigation.brand` is omitted, Norna uses the homepage `title` from
23
+ `site/content.md`. The logo's width is derived from its intrinsic aspect ratio.
24
+ If both a logo and a brand are present, the logo is displayed and the brand is
25
+ used as its text fallback and accessible default.
26
+
27
+ ## Banners
28
+
29
+ Use `banners` for short notices shown above the page content on every route.
30
+ The list order controls the presentation order. Each banner needs a unique
31
+ `id`, a title and text:
32
+
33
+ ```yaml
34
+ ---
35
+ banners:
36
+ - id: project-status
37
+ tone: warning
38
+ visible:
39
+ from: "2026-08-01"
40
+ until: "2026-09-01"
41
+ title: Experimental code
42
+ text: Not for production use.
43
+ ---
44
+ ```
45
+
46
+ `visible` uses the same date-window rules as temporary sections. Visitors can
47
+ dismiss individual active banners. The dismissal is stored locally in the
48
+ browser and is tied to the banner content, so an edited banner can appear
49
+ again.
50
+
51
+ The first version supports the `warning` tone. Keep banner text short; banners
52
+ are presented as compact single-line notices and may use an ellipsis when the
53
+ text does not fit.
54
+
55
+ ## Footer
56
+
57
+ The footer is also sitewide content. `copyrightMessage` adds a copyright or
58
+ license sentence. `buildInfo` optionally adds a generated build timestamp:
59
+
60
+ ```yaml
61
+ footer:
62
+ copyrightMessage: (c) Example Artist.
63
+ buildInfo:
64
+ enabled: true
65
+ text: Built
66
+ dateTimeFormat:
67
+ locale: en-GB
68
+ timeZone: UTC
69
+ dateStyle: short
70
+ timeStyle: short
71
+ ```
72
+
73
+ If both the copyright message and enabled build information are absent, the
74
+ footer is not rendered.