@janga/norna 0.7.2 → 0.7.3

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 (145) hide show
  1. package/README.md +16 -16
  2. package/bin/norna-cli.mjs +12 -7
  3. package/docs/README.md +10 -11
  4. package/docs/commands.md +8 -8
  5. package/docs/configuration.md +13 -145
  6. package/docs/content.md +17 -15
  7. package/docs/design/command-organization.md +55 -55
  8. package/docs/design/site-examples-structure.md +2 -2
  9. package/docs/engine-development.md +5 -5
  10. package/docs/getting-started.md +19 -26
  11. package/docs/images-and-metadata.md +1 -1
  12. package/docs/local-development.md +2 -2
  13. package/docs/publishing.md +1 -1
  14. package/docs/routes.md +2 -2
  15. package/docs/site-structure.md +8 -7
  16. package/docs/theme.md +149 -7
  17. package/docs/typography.md +47 -28
  18. package/examples/dog-gallery/.astro/collections/site.schema.json +802 -0
  19. package/examples/dog-gallery/.astro/collections/theme.schema.json +714 -0
  20. package/examples/dog-gallery/.astro/content-assets.mjs +4 -0
  21. package/examples/dog-gallery/.astro/content-modules.mjs +1 -0
  22. package/examples/dog-gallery/.astro/content.d.ts +175 -0
  23. package/examples/dog-gallery/.astro/data-store.json +1 -0
  24. package/examples/dog-gallery/.astro/dev-local.json +8 -0
  25. package/examples/dog-gallery/.astro/dev.json +13 -0
  26. package/examples/dog-gallery/.astro/dev.log +49 -0
  27. package/examples/dog-gallery/.astro/settings.json +5 -0
  28. package/examples/dog-gallery/.astro/types.d.ts +2 -0
  29. package/examples/dog-gallery/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +1 -0
  30. package/examples/dog-gallery/dist/_astro/SitePage.BFHZm5UG.css +1 -0
  31. package/examples/dog-gallery/dist/dog-care/index.html +15 -0
  32. package/examples/dog-gallery/dist/favicon.svg +7 -0
  33. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp +0 -0
  34. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp +0 -0
  35. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp +0 -0
  36. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp +0 -0
  37. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp +0 -0
  38. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp +0 -0
  39. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp +0 -0
  40. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp +0 -0
  41. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1080.webp +0 -0
  42. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp +0 -0
  43. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1920.webp +0 -0
  44. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-3939.webp +0 -0
  45. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-480.webp +0 -0
  46. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-768.webp +0 -0
  47. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp +0 -0
  48. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp +0 -0
  49. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp +0 -0
  50. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-2400.webp +0 -0
  51. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp +0 -0
  52. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp +0 -0
  53. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp +0 -0
  54. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp +0 -0
  55. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp +0 -0
  56. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp +0 -0
  57. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-768.webp +0 -0
  58. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp +0 -0
  59. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp +0 -0
  60. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp +0 -0
  61. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-2576.webp +0 -0
  62. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp +0 -0
  63. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp +0 -0
  64. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1080.webp +0 -0
  65. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp +0 -0
  66. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-480.webp +0 -0
  67. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-768.webp +0 -0
  68. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp +0 -0
  69. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp +0 -0
  70. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp +0 -0
  71. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp +0 -0
  72. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp +0 -0
  73. package/examples/dog-gallery/dist/index.html +43 -0
  74. package/examples/dog-gallery/dist/robots.txt +2 -0
  75. package/examples/dog-gallery/node_modules/.vite/deps/_metadata.json +74 -0
  76. package/examples/dog-gallery/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  77. package/examples/dog-gallery/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  78. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  79. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  80. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  81. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  82. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  83. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  84. package/examples/dog-gallery/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  85. package/examples/dog-gallery/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  86. package/examples/dog-gallery/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  87. package/examples/dog-gallery/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  88. package/examples/dog-gallery/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  89. package/examples/dog-gallery/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  90. package/examples/dog-gallery/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  91. package/examples/dog-gallery/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  92. package/examples/dog-gallery/node_modules/.vite/deps/package.json +3 -0
  93. package/examples/dog-gallery/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  94. package/examples/dog-gallery/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  95. package/examples/dog-gallery/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  96. package/examples/dog-gallery/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  97. package/examples/dog-gallery/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  98. package/examples/dog-gallery/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  99. package/examples/dog-gallery/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  100. package/examples/dog-gallery/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  101. package/examples/dog-gallery/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  102. package/examples/dog-gallery/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  103. package/examples/dog-gallery/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  104. package/examples/dog-gallery/site/config.mjs +12 -42
  105. package/examples/dog-gallery/site/content.md +27 -5
  106. package/examples/dog-gallery/site/routes/dog-care/route-content.md +17 -3
  107. package/examples/dog-gallery/site/theme.md +85 -26
  108. package/fixtures/basic/site/config.mjs +2 -22
  109. package/fixtures/basic/site/content.md +1 -1
  110. package/fixtures/basic/site/theme.md +7 -3
  111. package/package.json +3 -3
  112. package/scripts/check-config.mjs +3 -3
  113. package/scripts/deploy-site.mjs +3 -3
  114. package/scripts/init-site.mjs +10 -8
  115. package/scripts/lib/frontmatter-yaml.mjs +85 -0
  116. package/scripts/lib/presentation.mjs +10 -11
  117. package/scripts/lib/project-config.mjs +91 -45
  118. package/scripts/lib/site-content.mjs +20 -2
  119. package/scripts/lib/theme-config.mjs +34 -0
  120. package/scripts/lib/typography.mjs +100 -20
  121. package/scripts/show-typography.mjs +58 -154
  122. package/scripts/sync-content-sections.mjs +6 -6
  123. package/scripts/test-content-check.mjs +3 -4
  124. package/scripts/test-engine-commands.mjs +2 -2
  125. package/scripts/test-package-check.mjs +17 -16
  126. package/scripts/test-temporary-visibility.mjs +2 -3
  127. package/src/components/SitePage.astro +2 -3
  128. package/src/components/SiteSection.astro +39 -5
  129. package/src/content.config.ts +60 -2
  130. package/src/layouts/BaseLayout.astro +17 -0
  131. package/src/styles/global.css +54 -50
  132. package/starters/basic/README.md +10 -15
  133. package/starters/basic/package.json +2 -2
  134. package/starters/basic/site/config.mjs +3 -24
  135. package/starters/basic/site/content.md +40 -7
  136. package/starters/basic/site/theme.md +110 -17
  137. package/starters/project/.github/workflows/deploy.yml +65 -0
  138. package/starters/project/README.md +72 -0
  139. package/starters/project/package-lock.json +4296 -0
  140. package/starters/project/package.json +35 -0
  141. package/starters/project/site/config.mjs +43 -0
  142. package/starters/project/site/content.md +88 -0
  143. package/starters/project/site/public/robots.txt +2 -0
  144. package/starters/project/site/routes/guide/route-content.md +58 -0
  145. package/starters/project/site/theme.md +15 -0
package/docs/theme.md CHANGED
@@ -13,12 +13,51 @@ on top of the resolved page presentation.
13
13
  ```yaml
14
14
  ---
15
15
  navigation:
16
- brand: Example Gallery
16
+ brand: Example Site
17
+ layout:
18
+ pageWidth: 1180px
19
+ gutter:
20
+ desktop: clamp(1.25rem, 4vw, 3rem)
21
+ mobile: 1rem
22
+ spacing:
23
+ firstSectionTop:
24
+ desktop: clamp(1.875rem, 3vw, 2.75rem)
25
+ mobile: 1.375rem
26
+ sectionGap:
27
+ desktop: clamp(2.55rem, 4.2vw, 3.9rem)
28
+ mobile: 2.25rem
29
+ finalSectionBottom:
30
+ desktop: clamp(2.55rem, 4.2vw, 3.9rem)
31
+ mobile: 2.25rem
32
+ sectionHeadingToBody:
33
+ desktop: clamp(0.5625rem, 1.25vw, 0.75rem)
34
+ mobile: 0.4375rem
35
+ bodyToImages:
36
+ desktop: clamp(1.25rem, 2.5vw, 2rem)
37
+ mobile: 1.25rem
38
+ imageGap:
39
+ desktop: clamp(1.5rem, 3.5vw, 2.75rem)
40
+ mobile: 2.75rem
41
+ subheadingTop:
42
+ desktop: 2rem
43
+ mobile: 1.6rem
44
+ subheadingRuleTop:
45
+ desktop: 1rem
46
+ mobile: 0.8rem
47
+ gallery:
48
+ width: 900px
49
+ maxAvailableWidthPercent:
50
+ desktop: 100
51
+ mobile: 100
52
+ maxAvailableHeightPercent:
53
+ desktop: 74
54
+ mobile: 68
55
+ typography:
56
+ fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
57
+ preset: quiet-gallery
17
58
  presentation:
18
59
  backgroundColor: "#000000"
19
60
  textColor: "#f7f4ee"
20
- typography:
21
- preset: quiet-gallery
22
61
  frame:
23
62
  colors: presentation
24
63
  ---
@@ -47,6 +86,108 @@ navigation:
47
86
  brand: Norna
48
87
  ```
49
88
 
89
+ ## Layout
90
+
91
+ `layout` is optional. It controls the outer page geometry:
92
+
93
+ - `pageWidth`: maximum width of the main page content area.
94
+ - `gutter`: side margin removed from the viewport before available content
95
+ width is calculated. Use either one CSS length for all viewports or
96
+ `desktop` / `mobile` values.
97
+ - `spacing`: vertical rhythm for sections, text, image rows, and Markdown
98
+ subheadings. Every spacing value accepts either one CSS length for all
99
+ viewports or `desktop` / `mobile` values.
100
+
101
+ Example:
102
+
103
+ ```yaml
104
+ layout:
105
+ pageWidth: 1180px
106
+ gutter:
107
+ desktop: clamp(1.25rem, 4vw, 3rem)
108
+ mobile: 1rem
109
+ spacing:
110
+ firstSectionTop:
111
+ desktop: clamp(1.875rem, 3vw, 2.75rem)
112
+ mobile: 1.375rem
113
+ sectionGap:
114
+ desktop: clamp(2.55rem, 4.2vw, 3.9rem)
115
+ mobile: 2.25rem
116
+ subheadingTop:
117
+ desktop: 2rem
118
+ mobile: 1.6rem
119
+ ```
120
+
121
+ If omitted, Norna uses `1180px` for `pageWidth`, desktop
122
+ `clamp(1.25rem, 4vw, 3rem)` for `gutter`, mobile `1rem`, and the spacing
123
+ defaults shown in the minimal theme example.
124
+
125
+ Spacing keys:
126
+
127
+ - `firstSectionTop`: space above the first section heading.
128
+ - `sectionGap`: space above each following section.
129
+ - `finalSectionBottom`: space below the final section.
130
+ - `sectionHeadingToBody`: space from a section heading to its body text.
131
+ - `bodyToImages`: space from section body text to image rows.
132
+ - `imageGap`: space between image rows.
133
+ - `subheadingTop`: space above Markdown `###` subheadings inside body text.
134
+ - `subheadingRuleTop`: space between the rule above a Markdown `###`
135
+ subheading and the subheading text.
136
+
137
+ ## Image Sizing
138
+
139
+ `gallery` is optional. It controls image sizing:
140
+
141
+ - `width`: hard maximum rendered image area width for images, captions, and
142
+ aligned text.
143
+ - `maxAvailableWidthPercent`: maximum share of available width after gutters.
144
+ - `maxAvailableHeightPercent`: maximum share of viewport height used by
145
+ images.
146
+
147
+ Example:
148
+
149
+ ```yaml
150
+ gallery:
151
+ width: 900px
152
+ maxAvailableWidthPercent:
153
+ desktop: 100
154
+ mobile: 100
155
+ maxAvailableHeightPercent:
156
+ desktop: 74
157
+ mobile: 68
158
+ ```
159
+
160
+ If omitted, Norna uses `900px`, full available width, and image height limits of
161
+ desktop `74` / mobile `68`.
162
+
163
+ ## Typography
164
+
165
+ Top-level `typography` is the site-wide typographic base. It supports:
166
+
167
+ - `fontFamily`: global CSS font-family stack.
168
+ - `preset`: built-in typography preset.
169
+ - `overrides`: focused changes to preset values.
170
+
171
+ Example:
172
+
173
+ ```yaml
174
+ typography:
175
+ fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
176
+ preset: quiet-gallery
177
+ overrides:
178
+ headings:
179
+ h2:
180
+ size: medium
181
+ h3:
182
+ size: small
183
+ body:
184
+ lineHeight: 1.55
185
+ ```
186
+
187
+ Use `norna typography presets` to inspect built-in preset values and
188
+ `norna typography show` to inspect the resolved typography for the selected
189
+ site. See [Typography](typography.md).
190
+
50
191
  ## Presentation
51
192
 
52
193
  `presentation` is optional. It can contain:
@@ -56,8 +197,6 @@ navigation:
56
197
  - `textColor`: optional quoted hex color in `#rgb`, `#rrggbb`, or
57
198
  `#rrggbbaa` form.
58
199
  - `inlineStyles`: optional named inline text styles.
59
- - `typography`: optional typography preset and overrides. See
60
- [Typography](typography.md).
61
200
 
62
201
  Example:
63
202
 
@@ -76,6 +215,9 @@ page file is always an override on top of the theme:
76
215
  presentation:
77
216
  typography:
78
217
  overrides:
218
+ headings:
219
+ h2:
220
+ size: large
79
221
  body:
80
222
  paragraphSpacing: 1em
81
223
  ```
@@ -96,12 +238,12 @@ If a page omits `presentation`, it uses the theme presentation unchanged. If a
96
238
  section omits `presentation`, it uses the resolved page presentation.
97
239
 
98
240
  Configured section backgrounds render as full-width horizontal bands while the
99
- section content keeps the normal page and gallery widths. The top spacing
241
+ section content keeps the normal page and image widths. The top spacing
100
242
  before the first heading, the spacing between sections, and the spacing after
101
243
  the final section are part of the section background.
102
244
 
103
245
  Configured section text colors apply to section headings, Markdown text,
104
- Markdown subheadings, and gallery captions. Links keep the global accent color.
246
+ Markdown subheadings, and image captions. Links keep the global accent color.
105
247
 
106
248
  ## Frame Colors
107
249
 
@@ -1,10 +1,10 @@
1
1
  # Typography
2
2
 
3
- `norna` typography is configured through presets with optional overrides. The
4
- site font family itself is a technical setting in
5
- [`typography.fontFamily`](configuration.md#typographyfontfamily).
3
+ `norna` typography is configured in `site/theme.md` through a site-wide font,
4
+ presets, and optional overrides.
6
5
 
7
- The normal place to choose a site-wide typography preset is `site/theme.md`.
6
+ The normal place to choose a site-wide typography preset is the top-level
7
+ `typography` block in `site/theme.md`.
8
8
  Page and section files may override the theme when a page or section needs a
9
9
  different presentation.
10
10
 
@@ -12,8 +12,8 @@ different presentation.
12
12
 
13
13
  Available presets:
14
14
 
15
- - `quiet-gallery`: the default for image-led art and portfolio sites. Text is
16
- restrained and supports the images without dominating the page.
15
+ - `quiet-gallery`: the default for image-led sites. Text is restrained and
16
+ supports the images without dominating the page.
17
17
  - `compact-gallery`: tighter typography for many sections, many images, or
18
18
  short information blocks.
19
19
  - `text-forward`: more generous body text for pages where longer text carries
@@ -23,23 +23,23 @@ Available presets:
23
23
 
24
24
  If theme typography is omitted, `quiet-gallery` is used.
25
25
 
26
- Presets normally keep `heading.size` and `body.size` at `medium`. They differ
27
- primarily through alignment, line height, paragraph spacing, caption treatment,
28
- and intended use. Choose larger or smaller type with focused overrides when a
29
- specific page or section needs it.
26
+ Presets define `headings.h1` through `headings.h4`, `body`, and `caption`.
27
+ They differ primarily through heading scale, alignment, line height, paragraph
28
+ spacing, caption treatment, and intended use. Choose larger or smaller type
29
+ with focused overrides when a specific page or section needs it.
30
30
 
31
31
  Use this command to inspect the exact preset values shipped with the installed
32
32
  engine:
33
33
 
34
34
  ```sh
35
- npm run norna:typography:presets
35
+ norna typography presets
36
36
  ```
37
37
 
38
38
  Use this command to inspect the effective values for the selected site after
39
39
  presets and overrides have been applied:
40
40
 
41
41
  ```sh
42
- npm run norna:typography:show
42
+ norna typography show
43
43
  ```
44
44
 
45
45
  The output includes the site theme, every page route, and every section. Each
@@ -49,19 +49,28 @@ also marked with `inherited: true`.
49
49
  ## Configuration Shape
50
50
 
51
51
  ```yaml
52
- presentation:
53
- typography:
54
- preset: quiet-gallery
55
- overrides:
56
- body:
57
- paragraphSpacing: 0.8em
52
+ typography:
53
+ fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
54
+ preset: quiet-gallery
55
+ overrides:
56
+ headings:
57
+ h2:
58
+ size: medium
59
+ h3:
60
+ size: small
61
+ body:
62
+ paragraphSpacing: 0.8em
58
63
  ```
59
64
 
60
65
  The typographic roles are:
61
66
 
62
- - `heading`: section headings.
67
+ - `headings.h1`: reserved for page-level Markdown `#` headings if the content
68
+ model starts supporting them.
69
+ - `headings.h2`: Markdown `##` section headings.
70
+ - `headings.h3`: Markdown `###` subheadings inside section body text.
71
+ - `headings.h4`: Markdown `####` subheadings inside section body text.
63
72
  - `body`: Markdown body text inside sections.
64
- - `caption`: gallery captions.
73
+ - `caption`: image captions.
65
74
 
66
75
  Allowed alignment values are `left`, `center`, and `right`. Alignment can be
67
76
  responsive:
@@ -76,14 +85,24 @@ Allowed size values are `small`, `medium`, `large`, and `xlarge`. `medium` is
76
85
  the normal reading size. Use `small` for quieter supporting text, and use
77
86
  `large` or `xlarge` only when a page or section needs stronger emphasis.
78
87
  Headings use their own scale, but follow the same principle: `medium` is the
79
- normal section heading size, not a hero size.
88
+ normal section heading size, not a hero size. Norna may render the first
89
+ section heading as an HTML `h1` for document structure, but its visual
90
+ typography still follows the Markdown level the user wrote: `##` uses
91
+ `headings.h2`.
80
92
 
81
93
  `lineHeight` is a unitless number from `1` through `3`. `spacing` and
82
94
  `paragraphSpacing` are CSS lengths such as `0`, `0.8em`, `1rem`, or `12px`.
83
95
 
84
96
  Supported override fields:
85
97
 
86
- - `heading.align`, `heading.size`, `heading.lineHeight`, `heading.spacing`
98
+ - `headings.h1.align`, `headings.h1.size`, `headings.h1.lineHeight`,
99
+ `headings.h1.spacing`
100
+ - `headings.h2.align`, `headings.h2.size`, `headings.h2.lineHeight`,
101
+ `headings.h2.spacing`
102
+ - `headings.h3.align`, `headings.h3.size`, `headings.h3.lineHeight`,
103
+ `headings.h3.spacing`
104
+ - `headings.h4.align`, `headings.h4.size`, `headings.h4.lineHeight`,
105
+ `headings.h4.spacing`
87
106
  - `body.align`, `body.size`, `body.lineHeight`, `body.paragraphSpacing`
88
107
  - `caption.align`, `caption.size`, `caption.lineHeight`, `caption.spacing`
89
108
 
@@ -93,9 +112,9 @@ Theme typography is the site-wide base:
93
112
 
94
113
  ```yaml
95
114
  # site/theme.md
96
- presentation:
97
- typography:
98
- preset: quiet-gallery
115
+ typography:
116
+ fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
117
+ preset: quiet-gallery
99
118
  ```
100
119
 
101
120
  A page-level `presentation.typography.preset` changes the typographic base for
@@ -120,6 +139,6 @@ sections:
120
139
  ```
121
140
 
122
141
  Centered text uses narrower text widths. Left- or right-aligned heading and body
123
- text use the calculated gallery layout width so text edges line up with gallery
124
- images after layout gutters and gallery limits are applied. Gallery captions
125
- are normally centered.
142
+ text use the calculated image layout width so text edges line up with images
143
+ after layout gutters and image limits are applied. Captions are normally
144
+ centered.