@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
@@ -31,9 +31,12 @@
31
31
  --space-nav-to-first-section-desktop: clamp(1.875rem, 3vw, 2.75rem);
32
32
  --space-nav-to-first-section-mobile: 1.375rem;
33
33
  --space-nav-to-first-section: var(--space-nav-to-first-section-desktop);
34
- --space-section-body-to-gallery-desktop: clamp(1.25rem, 2.5vw, 2rem);
35
- --space-section-body-to-gallery-mobile: 1.25rem;
36
- --space-section-body-to-gallery: var(--space-section-body-to-gallery-desktop);
34
+ --space-content-block-gap-desktop: 1.5em;
35
+ --space-content-block-gap-mobile: 1.25em;
36
+ --space-content-block-gap: var(--space-content-block-gap-desktop);
37
+ --space-heading-to-block-desktop: 0.75em;
38
+ --space-heading-to-block-mobile: 0.7em;
39
+ --space-heading-to-block: var(--space-heading-to-block-desktop);
37
40
  --space-gallery-item-desktop: clamp(1.5rem, 3.5vw, 2.75rem);
38
41
  --space-gallery-item-mobile: 2.75rem;
39
42
  --space-gallery-item: var(--space-gallery-item-desktop);
@@ -48,7 +51,7 @@
48
51
  --content-gutter-mobile: 1rem;
49
52
  --content-gutter: var(--content-gutter-desktop);
50
53
  --site-top-anchor-offset: 4.5rem;
51
- color-scheme: dark;
54
+ color-scheme: var(--color-scheme, dark);
52
55
  scroll-behavior: smooth;
53
56
  scroll-padding-top: var(--site-top-anchor-offset);
54
57
  }
@@ -130,12 +133,14 @@ a {
130
133
  .site-nav a,
131
134
  .mobile-nav-menu summary,
132
135
  .mobile-nav-panel a,
133
- .page-nav a {
136
+ .site-nav-submenu a {
134
137
  color: currentColor;
135
138
  text-decoration: none;
136
139
  }
137
140
 
138
141
  .site-brand {
142
+ display: flex;
143
+ align-items: center;
139
144
  flex: 0 0 auto;
140
145
  font-size: 0.82rem;
141
146
  font-weight: 700;
@@ -144,21 +149,31 @@ a {
144
149
  text-transform: uppercase;
145
150
  }
146
151
 
152
+ .site-brand-logo {
153
+ display: block;
154
+ width: auto;
155
+ height: var(--site-brand-logo-height, 2.6rem);
156
+ max-width: min(30vw, 18rem);
157
+ }
158
+
147
159
  .site-nav ul,
148
- .mobile-nav-panel ul,
149
- .page-nav ul {
160
+ .mobile-nav-panel ul {
150
161
  margin: 0;
151
162
  padding: 0;
152
163
  list-style: none;
153
164
  }
154
165
 
155
- .site-nav ul {
166
+ .site-nav > ul {
156
167
  display: flex;
157
168
  flex-wrap: wrap;
158
169
  justify-content: flex-end;
159
170
  gap: 0.35rem clamp(0.9rem, 2.6vw, 2rem);
160
171
  }
161
172
 
173
+ .site-nav-item {
174
+ position: relative;
175
+ }
176
+
162
177
  .site-nav a,
163
178
  .mobile-nav-panel a {
164
179
  display: block;
@@ -183,71 +198,66 @@ a {
183
198
  text-underline-offset: 0.35em;
184
199
  }
185
200
 
186
- .mobile-nav-menu {
187
- display: none;
201
+ .site-nav-submenu {
202
+ position: absolute;
203
+ top: 100%;
204
+ left: 50%;
205
+ z-index: 10;
206
+ width: max-content;
207
+ min-width: 12rem;
208
+ padding-top: 0.7rem;
209
+ opacity: 0;
210
+ visibility: hidden;
211
+ pointer-events: none;
212
+ transform: translate(-50%, -0.35rem);
213
+ transition: opacity 0.16s ease, transform 0.16s ease, visibility 0.16s ease;
188
214
  }
189
215
 
190
- .page-nav {
191
- border-top: 1px solid color-mix(in srgb, currentColor 14%, transparent);
216
+ .site-nav-submenu > nav {
217
+ border: 1px solid color-mix(in srgb, currentColor 30%, transparent);
218
+ padding: 0.8rem 1rem;
219
+ background: var(--site-top-background-color, var(--color-nav-background));
220
+ box-shadow: 0 1rem 2.5rem rgb(0 0 0 / 0.22);
192
221
  }
193
222
 
194
- .page-nav ul {
195
- display: flex;
196
- flex-wrap: wrap;
197
- justify-content: center;
198
- gap: 0 clamp(1.4rem, 4vw, 3.25rem);
223
+ .site-nav-submenu ul {
224
+ display: grid;
225
+ gap: 0.65rem;
199
226
  }
200
227
 
201
- .page-nav li {
202
- position: relative;
228
+ .site-nav-submenu a {
229
+ font-size: 0.76rem;
230
+ letter-spacing: 0.03em;
231
+ line-height: 1.3;
232
+ opacity: 0.78;
233
+ text-transform: none;
234
+ white-space: nowrap;
203
235
  }
204
236
 
205
- .page-nav li + li::before {
206
- position: absolute;
207
- top: 50%;
208
- left: calc(clamp(1.4rem, 4vw, 3.25rem) / -2 - 0.1rem);
209
- transform: translateY(-50%);
210
- color: currentColor;
211
- content: "/";
212
- font-size: 0.75rem;
213
- opacity: 0.28;
237
+ .site-nav-submenu a:hover,
238
+ .site-nav-submenu a:focus-visible {
239
+ opacity: 1;
240
+ text-decoration: underline;
241
+ text-underline-offset: 0.25em;
214
242
  }
215
243
 
216
- .page-nav a {
217
- display: block;
218
- position: relative;
219
- padding: 1.05rem 0 0.95rem;
220
- font-size: 0.76rem;
221
- font-weight: 500;
222
- letter-spacing: 0.12em;
223
- line-height: 1;
224
- opacity: 0.76;
225
- text-decoration: none;
226
- text-transform: uppercase;
244
+ .site-nav-item:hover .site-nav-submenu,
245
+ .site-nav-item:focus-within .site-nav-submenu {
246
+ opacity: 1;
247
+ visibility: visible;
248
+ pointer-events: auto;
249
+ transform: translate(-50%, 0);
227
250
  }
228
251
 
229
- .page-nav a::after {
230
- position: absolute;
231
- right: 0;
232
- bottom: 0.62rem;
233
- left: 0;
234
- height: 1px;
235
- transform: scaleX(0);
236
- background: currentColor;
237
- content: "";
238
- opacity: 0;
239
- transition: opacity 0.18s ease, transform 0.18s ease;
252
+ .mobile-nav-menu {
253
+ display: none;
240
254
  }
241
255
 
242
- .page-nav a:hover,
243
- .page-nav a[aria-current='true'],
244
256
  .mobile-page-nav a[aria-current='true'] {
245
257
  opacity: 1;
246
- }
247
-
248
- .page-nav a[aria-current='true']::after {
249
- transform: scaleX(1);
250
- opacity: 0.75;
258
+ text-decoration: underline;
259
+ text-decoration-thickness: 1px;
260
+ text-underline-offset: 0.35em;
251
261
  }
252
262
 
253
263
  @media (hover: hover) and (pointer: fine) {
@@ -264,6 +274,77 @@ a {
264
274
  padding: 0;
265
275
  }
266
276
 
277
+ .site-banners {
278
+ position: relative;
279
+ z-index: 2;
280
+ display: grid;
281
+ gap: 0.75rem;
282
+ width: min(calc(100% - (var(--content-gutter) * 2)), var(--page-width));
283
+ margin: 0 auto;
284
+ padding: 1rem 0 0;
285
+ }
286
+
287
+ .site-banner {
288
+ display: flex;
289
+ align-items: flex-start;
290
+ gap: 1rem;
291
+ border: 1px solid color-mix(in srgb, #ffd84d 42%, var(--color-border));
292
+ border-inline-start: 0.35rem solid #ffd84d;
293
+ padding: 0.8rem 0.9rem;
294
+ background: color-mix(in srgb, #ffd84d 12%, var(--color-surface));
295
+ color: var(--color-text);
296
+ }
297
+
298
+ .site-banner[hidden] {
299
+ display: none;
300
+ }
301
+
302
+ .site-banner-copy {
303
+ display: flex;
304
+ align-items: baseline;
305
+ gap: 0.65rem;
306
+ min-width: 0;
307
+ flex: 1 1 auto;
308
+ }
309
+
310
+ .site-banner-title,
311
+ .site-banner-text {
312
+ margin: 0;
313
+ }
314
+
315
+ .site-banner-title {
316
+ flex: 0 0 auto;
317
+ white-space: nowrap;
318
+ font-weight: 700;
319
+ }
320
+
321
+ .site-banner-text {
322
+ min-width: 0;
323
+ overflow: hidden;
324
+ text-overflow: ellipsis;
325
+ white-space: nowrap;
326
+ margin-top: 0.2rem;
327
+ color: color-mix(in srgb, currentColor 86%, transparent);
328
+ }
329
+
330
+ .site-banner-dismiss {
331
+ flex: 0 0 auto;
332
+ width: 2rem;
333
+ height: 2rem;
334
+ border: 1px solid color-mix(in srgb, currentColor 35%, transparent);
335
+ padding: 0;
336
+ background: transparent;
337
+ color: currentColor;
338
+ cursor: pointer;
339
+ font-size: 1.25rem;
340
+ line-height: 1;
341
+ }
342
+
343
+ .site-banner-dismiss:hover,
344
+ .site-banner-dismiss:focus-visible {
345
+ background: color-mix(in srgb, currentColor 12%, transparent);
346
+ }
347
+
267
348
  .site-footer {
268
349
  position: relative;
269
350
  isolation: isolate;
@@ -332,6 +413,10 @@ a {
332
413
  text-align: var(--section-heading-align-desktop, center);
333
414
  }
334
415
 
416
+ .site-section-first-block-is-visual .section-header {
417
+ padding-bottom: var(--space-heading-to-block);
418
+ }
419
+
335
420
  .section-header h1,
336
421
  .section-header h2,
337
422
  p,
@@ -344,7 +429,7 @@ ul {
344
429
  margin-bottom: 0;
345
430
  color: inherit;
346
431
  font-size: var(--section-heading-font-size-desktop, clamp(1.35rem, 1.1rem + 0.9vw, 2rem));
347
- font-weight: 400;
432
+ font-weight: var(--section-heading-font-weight, 400);
348
433
  letter-spacing: 0;
349
434
  line-height: var(--section-heading-line-height, 1.04);
350
435
  text-transform: uppercase;
@@ -359,12 +444,96 @@ ul {
359
444
  font-size: clamp(0.96rem, 0.94rem + 0.08vw, 1rem);
360
445
  }
361
446
 
447
+ .section-reading-layout {
448
+ display: grid;
449
+ --section-reading-body-width: var(--section-body-width-desktop, var(--text-width));
450
+ --section-reading-inline-start: max(0px, calc((100% - var(--section-reading-body-width)) / 2));
451
+ grid-template-columns: minmax(0, var(--section-reading-body-width)) minmax(0, 13rem);
452
+ column-gap: 1.5rem;
453
+ row-gap: var(--section-body-paragraph-spacing, 1em);
454
+ width: min(
455
+ calc(100% - var(--section-reading-inline-start)),
456
+ calc(var(--section-reading-body-width) + 13rem + 1.5rem)
457
+ );
458
+ margin: 0 0 0 var(--section-reading-inline-start);
459
+ align-items: start;
460
+ }
461
+
462
+ .section-reading-layout .section-markdown {
463
+ grid-column: 1;
464
+ width: 100%;
465
+ margin: 0;
466
+ }
467
+
468
+ .section-note {
469
+ grid-column: 2;
470
+ display: grid;
471
+ grid-template-columns: auto minmax(0, 1fr);
472
+ column-gap: 0.25rem;
473
+ align-self: start;
474
+ margin: 0;
475
+ margin-top: var(--section-note-offset, 0px);
476
+ border-inline-start: 2px solid color-mix(in srgb, currentColor 35%, transparent);
477
+ padding: 0 0 0 0.35rem;
478
+ color: color-mix(in srgb, currentColor 76%, transparent);
479
+ font-size: 0.88em;
480
+ line-height: 1.45;
481
+ scroll-margin-top: calc(var(--site-top-anchor-offset) + 1rem);
482
+ }
483
+
484
+ .section-note-number {
485
+ display: block;
486
+ margin: 0;
487
+ color: inherit;
488
+ font-size: 0.82em;
489
+ font-weight: 700;
490
+ line-height: 1;
491
+ text-decoration: none;
492
+ }
493
+
494
+ .section-note-ref {
495
+ display: inline-block;
496
+ margin-left: 0.03em;
497
+ font-size: 0.72em;
498
+ line-height: 0;
499
+ white-space: nowrap;
500
+ vertical-align: super;
501
+ }
502
+
503
+ .section-note-ref a {
504
+ color: inherit;
505
+ text-decoration: underline;
506
+ text-decoration-thickness: 0.08em;
507
+ text-underline-offset: 0.15em;
508
+ }
509
+
510
+ .section-note.is-referenced,
511
+ .section-note:target {
512
+ border-inline-start-color: currentColor;
513
+ background: color-mix(in srgb, currentColor 6%, transparent);
514
+ }
515
+
516
+ .section-note-ref a.is-referenced,
517
+ .section-note-ref a:hover,
518
+ .section-note-ref a:focus-visible {
519
+ text-decoration-thickness: 0.16em;
520
+ }
521
+
522
+ .section-note-content > :first-child {
523
+ margin-top: 0;
524
+ }
525
+
526
+ .section-note-content > :last-child {
527
+ margin-bottom: 0;
528
+ }
529
+
362
530
  .section-markdown {
363
531
  width: min(100%, var(--section-body-width-desktop, var(--text-width)));
364
- margin: 0 auto var(--space-section-body-to-gallery);
532
+ max-width: 72ch;
533
+ margin: 0 auto;
365
534
  font-size: var(--section-body-font-size-desktop, clamp(0.96rem, 0.94rem + 0.08vw, 1rem));
366
- line-height: var(--section-body-line-height, 1.78);
367
- text-align: var(--section-body-align-desktop, center);
535
+ line-height: var(--section-body-line-height, 1.6);
536
+ text-align: var(--section-body-align-desktop, left);
368
537
  }
369
538
 
370
539
  .section-markdown p {
@@ -396,14 +565,6 @@ ul {
396
565
  font: inherit;
397
566
  }
398
567
 
399
- .section-markdown .inline-style {
400
- color: var(--inline-style-color);
401
- }
402
-
403
- .section-body-text-only .section-markdown {
404
- margin-bottom: 0;
405
- }
406
-
407
568
  .section-markdown > :last-child,
408
569
  .gallery-meta :last-child {
409
570
  margin-bottom: 0;
@@ -426,6 +587,7 @@ ul {
426
587
  padding-top: 0.55em;
427
588
  font-family: var(--font-sans);
428
589
  font-size: var(--section-markdown-h3-font-size-desktop, 0.82rem);
590
+ font-weight: var(--section-markdown-h3-font-weight, 700);
429
591
  letter-spacing: 0;
430
592
  line-height: var(--section-markdown-h3-line-height, 1.35);
431
593
  text-align: var(--section-markdown-h3-align-desktop, left);
@@ -439,7 +601,7 @@ ul {
439
601
  var(--section-markdown-h4-spacing-after, 0.4em);
440
602
  color: inherit;
441
603
  font-size: var(--section-markdown-h4-font-size-desktop, clamp(0.96rem, 0.94rem + 0.08vw, 1rem));
442
- font-weight: 400;
604
+ font-weight: var(--section-markdown-h4-font-weight, 400);
443
605
  letter-spacing: 0;
444
606
  line-height: var(--section-markdown-h4-line-height, 1.5);
445
607
  text-align: var(--section-markdown-h4-align-desktop, left);
@@ -463,7 +625,7 @@ ul {
463
625
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
464
626
  gap: var(--card-list-gap, clamp(0.9rem, 2vw, 1.25rem));
465
627
  width: min(100%, var(--card-list-width, var(--gallery-layout-width)));
466
- margin: 0 auto var(--space-section-body-to-gallery);
628
+ margin: 0 auto;
467
629
  text-align: left;
468
630
  --card-list-width: var(--gallery-layout-width);
469
631
  --card-list-gap: clamp(0.9rem, 2vw, 1.25rem);
@@ -476,6 +638,36 @@ ul {
476
638
  --card-list-text-scale: 1;
477
639
  }
478
640
 
641
+ .section-body > .section-reading-layout:not(:last-child),
642
+ .section-body > .section-markdown:not(:last-child),
643
+ .section-body > .card-list:not(:last-child),
644
+ .section-body > .gallery:not(:last-child) {
645
+ margin-bottom: var(--space-content-block-gap);
646
+ }
647
+
648
+ @media (max-width: 1100px) {
649
+ .section-reading-layout {
650
+ display: block;
651
+ width: 100%;
652
+ margin: 0;
653
+ }
654
+
655
+ .section-reading-layout .section-markdown,
656
+ .section-reading-layout .section-note {
657
+ width: min(100%, var(--section-reading-body-width, var(--section-body-width-desktop, var(--text-width))));
658
+ margin-right: auto;
659
+ margin-left: auto;
660
+ }
661
+
662
+ .section-reading-layout .section-note {
663
+ margin-top: var(--section-body-paragraph-spacing, 0.85em);
664
+ }
665
+
666
+ .section-reading-layout .section-markdown + .section-markdown {
667
+ margin-top: var(--section-body-paragraph-spacing, 1em);
668
+ }
669
+ }
670
+
479
671
  .card-list-width-text {
480
672
  --card-list-width: var(--text-width);
481
673
  }
@@ -642,7 +834,7 @@ ul {
642
834
 
643
835
  .gallery-item {
644
836
  display: grid;
645
- gap: 0.7rem;
837
+ gap: 0.55rem;
646
838
  align-content: start;
647
839
  margin: 0;
648
840
  }
@@ -806,7 +998,7 @@ ul {
806
998
  }
807
999
 
808
1000
  .gallery-carousel-captions {
809
- width: min(100%, var(--gallery-layout-width));
1001
+ width: min(100%, var(--gallery-layout-width), 72ch);
810
1002
  margin: 0 auto;
811
1003
  }
812
1004
 
@@ -830,7 +1022,7 @@ ul {
830
1022
  }
831
1023
 
832
1024
  .gallery-meta {
833
- width: min(100%, var(--gallery-layout-width));
1025
+ width: min(100%, var(--gallery-layout-width), 72ch);
834
1026
  margin: var(--section-caption-spacing-before, 0.5em) auto 0;
835
1027
  font-size: var(--section-caption-font-size-desktop, 0.95rem);
836
1028
  text-align: var(--section-caption-align-desktop, center);
@@ -853,7 +1045,8 @@ ul {
853
1045
  @media (max-width: 700px) {
854
1046
  :root {
855
1047
  --space-nav-to-first-section: var(--space-nav-to-first-section-mobile);
856
- --space-section-body-to-gallery: var(--space-section-body-to-gallery-mobile);
1048
+ --space-content-block-gap: var(--space-content-block-gap-mobile);
1049
+ --space-heading-to-block: var(--space-heading-to-block-mobile);
857
1050
  --space-gallery-item: var(--space-gallery-item-mobile);
858
1051
  --space-section-to-section: var(--space-section-to-section-mobile);
859
1052
  --space-final-section-bottom: var(--space-final-section-bottom-mobile);
@@ -874,26 +1067,13 @@ ul {
874
1067
  overflow-wrap: anywhere;
875
1068
  }
876
1069
 
877
- .site-nav,
878
- .site-top-has-site-nav .page-nav {
879
- display: none;
880
- }
881
-
882
- .page-nav ul {
883
- justify-content: center;
884
- gap: 0 1.55rem;
885
- padding: 0 1rem;
886
- text-align: center;
1070
+ .site-brand-logo {
1071
+ height: min(var(--site-brand-logo-height, 2.6rem), 2.15rem);
1072
+ max-width: min(48vw, 13rem);
887
1073
  }
888
1074
 
889
- .page-nav li + li::before {
890
- left: -0.95rem;
891
- }
892
-
893
- .page-nav a {
894
- padding: 0.95rem 0 0.85rem;
895
- font-size: 0.72rem;
896
- white-space: nowrap;
1075
+ .site-nav {
1076
+ display: none;
897
1077
  }
898
1078
 
899
1079
  .mobile-nav-menu {
@@ -980,6 +1160,11 @@ ul {
980
1160
  width: min(calc(100% - (var(--content-gutter) * 2)), var(--page-width));
981
1161
  }
982
1162
 
1163
+ .site-banners {
1164
+ width: min(calc(100% - 2rem), var(--page-width));
1165
+ padding-top: 0.75rem;
1166
+ }
1167
+
983
1168
  .site-footer {
984
1169
  width: min(calc(100% - 2rem), 34rem);
985
1170
  }
@@ -1006,6 +1191,10 @@ ul {
1006
1191
  text-align: var(--section-heading-align-mobile, var(--section-heading-align-desktop, center));
1007
1192
  }
1008
1193
 
1194
+ .section-reading-layout {
1195
+ --section-reading-body-width: var(--section-body-width-mobile, var(--section-body-width-desktop, var(--text-width)));
1196
+ }
1197
+
1009
1198
  .section-markdown {
1010
1199
  width: min(100%, var(--section-body-width-mobile, var(--section-body-width-desktop, var(--text-width))));
1011
1200
  font-size: var(
@@ -42,7 +42,7 @@ jobs:
42
42
  - name: Install dependencies
43
43
  run: npm ci
44
44
 
45
- - name: Build
45
+ - name: Check and build
46
46
  run: npm run build
47
47
 
48
48
  - name: Configure Pages
@@ -15,9 +15,10 @@ If the standard local port is blocked, start with:
15
15
  npm run dev -- --kill
16
16
  ```
17
17
 
18
- Edit site-wide visual defaults in `site/theme.md`, homepage content and section
19
- overrides in `site/content.md`, technical settings such as URL and locale
20
- labels in `site/config.mjs`, source images under `site/images/<section-id>/`,
18
+ Edit shared brand, logo, banners and footer in `site/sitewide-content.md`,
19
+ site-wide visual defaults in `site/theme.md`, homepage content and section
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
22
  and static public files under `site/public/`. The image folder name should
22
23
  match the section id in Markdown, for example `## Work {#work}` uses
23
24
  `site/images/work/`.
@@ -35,9 +36,9 @@ site: {
35
36
  In GitHub repository settings, configure Pages to build from GitHub Actions.
36
37
 
37
38
  Page width, side gutters, layout density, typography rhythm, image width, image
38
- height limits, font, colors, and site-wide typography are configured in
39
- `site/theme.md`. Page and section presentation overrides live in
40
- `site/content.md`.
39
+ height limits, font, palettes, section surfaces, and site-wide typography are
40
+ configured in `site/theme.md`. A route may replace that visual theme with its
41
+ own `theme.md`.
41
42
 
42
43
  Commit `package-lock.json` after the first install so GitHub Actions can use
43
44
  `npm ci`.
@@ -19,19 +19,6 @@ export default {
19
19
  gallery: 'Images',
20
20
  },
21
21
  },
22
- footer: {
23
- copyrightMessage: '(c) Example Owner.',
24
- buildInfo: {
25
- enabled: true,
26
- text: 'Built',
27
- dateTimeFormat: {
28
- locale: 'en-GB',
29
- timeZone: 'UTC',
30
- dateStyle: 'short',
31
- timeStyle: 'short',
32
- },
33
- },
34
- },
35
22
  github: {
36
23
  repo: 'owner/example-site',
37
24
  branch: 'main',
@@ -6,7 +6,7 @@ description: Minimal norna starter site.
6
6
  ## Intro {#intro}
7
7
  This is a minimal starter site for norna. Since this site doesn't have any
8
8
  routes defined, the navigation menu will be a sticky bar with anchor links for
9
- ease of use on phones etc. [Highlighted inline text]{.highlight} when a short
9
+ ease of use on phones etc. **Highlighted inline text** when a short
10
10
  phrase needs emphasis
11
11
  ## Work {#work}
12
12
  Add Norna managed media blocks in Markdown where the media should appear. Put
@@ -0,0 +1,14 @@
1
+ ---
2
+ navigation:
3
+ brand: Example Site
4
+ footer:
5
+ copyrightMessage: (c) Example Owner.
6
+ buildInfo:
7
+ enabled: true
8
+ text: Built
9
+ dateTimeFormat:
10
+ locale: en-GB
11
+ timeZone: UTC
12
+ dateStyle: short
13
+ timeStyle: short
14
+ ---
@@ -4,8 +4,6 @@
4
4
  # Active values below are ordinary YAML; this marked comment block is only help text.
5
5
  #
6
6
  # Available structure:
7
- # navigation:
8
- # brand: site-wide brand/home text; defaults to the homepage title
9
7
  # layout:
10
8
  # density: compact | normal | airy
11
9
  # pageWidth: CSS length, e.g. 1180px
@@ -22,9 +20,12 @@
22
20
  # finalSectionBottom:
23
21
  # desktop: CSS length or clamp(), e.g. clamp(1.4rem, 3vw, 2.75rem)
24
22
  # mobile: CSS length, e.g. 1.5rem
25
- # bodyToImages:
26
- # desktop: CSS length, e.g. 1.25rem
27
- # mobile: CSS length, e.g. 1rem
23
+ # headingToBlock:
24
+ # desktop: CSS length, e.g. 0.75em
25
+ # mobile: CSS length, e.g. 0.7em
26
+ # blockGap:
27
+ # desktop: CSS length, e.g. 1.5em
28
+ # mobile: CSS length, e.g. 1.25em
28
29
  # imageGap:
29
30
  # desktop: CSS length or clamp(), e.g. clamp(1.25rem, 2.8vw, 2rem)
30
31
  # mobile: CSS length, e.g. 1.5rem
@@ -81,19 +82,11 @@
81
82
  # lineHeight: number from 1 through 3
82
83
  # spacingBefore: CSS length, e.g. 0.5em
83
84
  # presentation:
84
- # backgroundColor: quoted hex color, e.g. "#000000"
85
- # textColor: quoted hex color, e.g. "#f7f4ee"
86
- # inlineStyles:
87
- # style-name:
88
- # color: quoted hex color
89
- # frame:
90
- # colors: presentation | theme
91
- # colors:
92
- # backgroundColor: quoted hex color
93
- # textColor: quoted hex color
85
+ # palette: dark # Alternatives: light, paper
86
+ # sectionSurfaces:
87
+ # mode: none | cycle
88
+ # sequence: [base, soft, emphasis]
94
89
  # norna:end theme-help
95
- navigation:
96
- brand: Example Site
97
90
  layout:
98
91
  density: normal
99
92
  pageWidth: 1180px
@@ -113,11 +106,7 @@ typography:
113
106
  preset: quiet-gallery
114
107
  rhythm: normal
115
108
  presentation:
116
- backgroundColor: "#000000"
117
- textColor: "#f7f4ee"
118
- inlineStyles:
119
- highlight:
120
- color: "#ffd84d"
121
- frame:
122
- colors: presentation
109
+ palette: dark # Alternatives: light, paper
110
+ sectionSurfaces:
111
+ mode: cycle
123
112
  ---