@janga/norna 0.7.16 → 0.7.17

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 (200) hide show
  1. package/README.md +6 -6
  2. package/astro.config.mjs +35 -3
  3. package/docs/README.md +10 -10
  4. package/docs/commands.md +2 -2
  5. package/docs/content.md +82 -102
  6. package/docs/design/navigation-and-theme-plan.md +115 -0
  7. package/docs/design/norna-diagram-design.md +9 -9
  8. package/docs/design/site-examples-structure.md +9 -9
  9. package/docs/engine-development.md +9 -9
  10. package/docs/getting-started.md +20 -15
  11. package/docs/images-and-metadata.md +10 -9
  12. package/docs/pages.md +134 -0
  13. package/docs/public-files.md +49 -36
  14. package/docs/publishing.md +19 -3
  15. package/docs/site-files.md +29 -28
  16. package/docs/sitewide-content.md +20 -36
  17. package/docs/theme.md +20 -20
  18. package/docs/typography.md +10 -10
  19. package/examples/README.md +2 -2
  20. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +17 -41
  21. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +26 -67
  22. package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +185 -88
  23. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -1
  24. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev-local.json +4 -4
  25. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +5 -5
  26. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +33 -23
  27. package/examples/complete-sites/dog-shelter-multi-page/README.md +1 -1
  28. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +8 -8
  29. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +20 -20
  30. package/examples/complete-sites/dog-shelter-multi-page/site/content.md +3 -4
  31. package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/010-dogs/content.md +3 -4
  32. package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/020-adopt/content.md +3 -4
  33. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +2 -4
  34. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +17 -41
  35. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +26 -67
  36. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +185 -88
  37. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +1 -1
  38. package/examples/complete-sites/dog-shelter-single-page/.astro/dev-local.json +8 -0
  39. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +5 -5
  40. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +16 -12
  41. package/examples/complete-sites/dog-shelter-single-page/README.md +1 -1
  42. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +8 -8
  43. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +12 -12
  44. package/examples/complete-sites/dog-shelter-single-page/site/content.md +5 -2
  45. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +2 -4
  46. package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +17 -41
  47. package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +26 -67
  48. package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +185 -88
  49. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
  50. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +4 -14
  51. package/examples/feature-demos/media-and-surfaces/README.md +2 -2
  52. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +9 -9
  53. package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +16 -16
  54. package/examples/feature-demos/media-and-surfaces/site/content.md +4 -7
  55. package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/010-media/content.md +6 -5
  56. package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/020-surfaces/content.md +7 -6
  57. package/examples/feature-demos/media-and-surfaces/site/sitewide-content.yaml +0 -2
  58. package/examples/feature-demos/sitewide-content/README.md +3 -3
  59. package/examples/feature-demos/sitewide-content/site/content.md +8 -7
  60. package/examples/feature-demos/sitewide-content/site/pages/010-logo-and-navigation/content.md +17 -0
  61. package/examples/feature-demos/sitewide-content/site/{routes → pages}/020-notices/content.md +7 -6
  62. package/examples/feature-demos/sitewide-content/site/{routes → pages}/030-footer/content.md +6 -5
  63. package/examples/feature-demos/sitewide-content/site/sitewide-content.yaml +4 -13
  64. package/examples/feature-demos/theme-presets/README.md +1 -1
  65. package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +60 -60
  66. package/examples/feature-demos/theme-presets/site/content.md +4 -7
  67. package/examples/feature-demos/theme-presets/site/{routes → pages}/010-portfolio/content.md +4 -7
  68. package/examples/feature-demos/theme-presets/site/{routes → pages}/020-documentation/content.md +4 -7
  69. package/examples/feature-demos/theme-presets/site/{routes → pages}/030-project/content.md +4 -7
  70. package/examples/feature-demos/theme-presets/site/{routes → pages}/040-statement/content.md +4 -7
  71. package/examples/feature-demos/theme-presets/site/sitewide-content.yaml +1 -10
  72. package/fixtures/basic/site/content.md +5 -6
  73. package/fixtures/basic/site/sitewide-content.yaml +1 -8
  74. package/fixtures/content-model-v2/site/content.md +11 -13
  75. package/fixtures/content-model-v2/site/pages/010-guide/content.md +18 -0
  76. package/fixtures/nested-pages/site/.norna/generated-images.json +10 -0
  77. package/fixtures/nested-pages/site/config.yaml +1 -0
  78. package/fixtures/nested-pages/site/content.md +15 -0
  79. package/fixtures/nested-pages/site/pages/010-guides/content.md +15 -0
  80. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/content.md +21 -0
  81. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/images/diagram.svg +21 -0
  82. package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +14 -0
  83. package/fixtures/nested-pages/site/pages/010-guides/pages/020-workflows/content.md +11 -0
  84. package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +3 -0
  85. package/fixtures/nested-pages/site/pages/020-reference/content.md +10 -0
  86. package/fixtures/nested-pages/site/pages/020-reference/pages/010-installation/content.md +11 -0
  87. package/fixtures/nested-pages/site/theme.yaml +3 -0
  88. package/package.json +7 -4
  89. package/schemas/config.schema.json +5 -5
  90. package/schemas/content-frontmatter.schema.json +28 -63
  91. package/schemas/manifest.json +1 -0
  92. package/schemas/sitewide-content.schema.json +58 -132
  93. package/schemas/theme.schema.json +396 -86
  94. package/scripts/check-config.mjs +6 -5
  95. package/scripts/deploy-site.mjs +6 -8
  96. package/scripts/doctor.mjs +2 -2
  97. package/scripts/generate-images.mjs +11 -18
  98. package/scripts/generate-schemas.mjs +3 -217
  99. package/scripts/lib/base-path-redirect.mjs +9 -0
  100. package/scripts/lib/editor-language-service.mjs +126 -66
  101. package/scripts/lib/heading-ids.mjs +161 -0
  102. package/scripts/lib/navigation-model.mjs +51 -0
  103. package/scripts/lib/norna-markdown-blocks.mjs +3 -4
  104. package/scripts/lib/page-model.mjs +83 -0
  105. package/scripts/lib/project-config.mjs +28 -0
  106. package/scripts/lib/schema-definitions.mjs +41 -46
  107. package/scripts/lib/schema-editor-metadata.mjs +475 -0
  108. package/scripts/lib/schema-value-definitions.mjs +6 -6
  109. package/scripts/lib/site-content.mjs +124 -87
  110. package/scripts/lib/site-paths.mjs +2 -2
  111. package/scripts/lib/theme-config.mjs +9 -16
  112. package/scripts/lib/theme-presets.mjs +9 -1
  113. package/scripts/release.mjs +1 -1
  114. package/scripts/show-typography.mjs +26 -20
  115. package/scripts/sync-content-sections.mjs +106 -65
  116. package/scripts/{test-temporary-visibility.mjs → test-banner-visibility.mjs} +7 -24
  117. package/scripts/test-client-javascript.mjs +39 -42
  118. package/scripts/test-content-check.mjs +138 -54
  119. package/scripts/test-content-model-v2.mjs +445 -228
  120. package/scripts/test-documentation.mjs +6 -1
  121. package/scripts/test-editor-language-service.mjs +168 -24
  122. package/scripts/test-engine-commands.mjs +2 -1
  123. package/scripts/test-heading-ids.mjs +68 -0
  124. package/scripts/test-navigation-model.mjs +63 -0
  125. package/scripts/test-nested-pages.mjs +110 -0
  126. package/scripts/test-package-check.mjs +31 -40
  127. package/scripts/test-page-model.mjs +80 -0
  128. package/scripts/test-project-config.mjs +25 -1
  129. package/scripts/test-schemas.mjs +66 -14
  130. package/scripts/test-theme-presets.mjs +33 -24
  131. package/src/components/NavigationPageTree.astro +68 -0
  132. package/src/components/SectionNavigationScript.astro +110 -5
  133. package/src/components/SiteBreadcrumbs.astro +29 -0
  134. package/src/components/SiteNavigation.astro +65 -69
  135. package/src/components/SitePage.astro +70 -46
  136. package/src/components/SiteSection.astro +27 -20
  137. package/src/content.config.ts +9 -5
  138. package/src/layouts/BaseLayout.astro +11 -20
  139. package/src/lib/pageThemes.ts +42 -0
  140. package/src/lib/sectionContent.ts +109 -106
  141. package/src/lib/siteNavigation.ts +48 -0
  142. package/src/lib/sitePages.ts +85 -38
  143. package/src/pages/{[slug].astro → [...slug].astro} +2 -2
  144. package/src/styles/global.css +373 -55
  145. package/starters/basic/README.md +5 -7
  146. package/starters/basic/site/content.md +7 -4
  147. package/starters/basic/site/sitewide-content.yaml +1 -10
  148. package/starters/project/README.md +8 -8
  149. package/starters/project/site/content.md +5 -4
  150. package/starters/project/site/{routes → pages}/010-guide/content.md +5 -4
  151. package/starters/project/site/sitewide-content.yaml +1 -10
  152. package/docs/routes.md +0 -121
  153. package/examples/feature-demos/sitewide-content/site/routes/010-identity/content.md +0 -20
  154. package/fixtures/content-model-v2/site/routes/010-guide/content.md +0 -17
  155. package/scripts/lib/route-model.mjs +0 -17
  156. package/scripts/test-route-model.mjs +0 -32
  157. package/src/lib/routeThemes.ts +0 -41
  158. /package/examples/complete-sites/dog-shelter-multi-page/site/images/{intro/shelter-dog.jpg → shelter-dog.jpg} +0 -0
  159. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rex.jpg +0 -0
  160. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rover.jpg +0 -0
  161. /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/020-adopt/images/adopt → pages/020-adopt/images}/adoption-dog.jpg +0 -0
  162. /package/examples/complete-sites/dog-shelter-single-page/site/images/{you-can-help/foster-dog.jpg → foster-dog.jpg} +0 -0
  163. /package/examples/complete-sites/dog-shelter-single-page/site/images/{what-we-do/rescue-dog.jpg → rescue-dog.jpg} +0 -0
  164. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-carousel.svg +0 -0
  165. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-stack.svg +0 -0
  166. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-surfaces.svg +0 -0
  167. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-one.svg +0 -0
  168. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-three.svg +0 -0
  169. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-two.svg +0 -0
  170. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-one.svg +0 -0
  171. /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-two.svg +0 -0
  172. /package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/020-surfaces/theme.yaml +0 -0
  173. /package/examples/feature-demos/theme-presets/site/{routes/010-portfolio/images/portfolio → pages/010-portfolio/images}/puppy-portrait.jpg +0 -0
  174. /package/examples/feature-demos/theme-presets/site/{routes/010-portfolio/images/portfolio → pages/010-portfolio/images}/shepherd-portrait.jpg +0 -0
  175. /package/examples/feature-demos/theme-presets/site/{routes/010-portfolio/images/portfolio → pages/010-portfolio/images}/white-puppy.jpg +0 -0
  176. /package/examples/feature-demos/theme-presets/site/{routes → pages}/010-portfolio/theme.yaml +0 -0
  177. /package/examples/feature-demos/theme-presets/site/{routes/020-documentation/images/documentation → pages/020-documentation/images}/black-schnauzer.jpg +0 -0
  178. /package/examples/feature-demos/theme-presets/site/{routes/020-documentation/images/documentation → pages/020-documentation/images}/retriever-portrait.jpg +0 -0
  179. /package/examples/feature-demos/theme-presets/site/{routes/020-documentation/images/documentation → pages/020-documentation/images}/schnauzer-portrait.jpg +0 -0
  180. /package/examples/feature-demos/theme-presets/site/{routes → pages}/020-documentation/theme.yaml +0 -0
  181. /package/examples/feature-demos/theme-presets/site/{routes/030-project/images/project → pages/030-project/images}/boxer-portrait.jpg +0 -0
  182. /package/examples/feature-demos/theme-presets/site/{routes/030-project/images/project → pages/030-project/images}/grass-puppy.jpg +0 -0
  183. /package/examples/feature-demos/theme-presets/site/{routes/030-project/images/project → pages/030-project/images}/grey-street-dog.jpg +0 -0
  184. /package/examples/feature-demos/theme-presets/site/{routes → pages}/030-project/theme.yaml +0 -0
  185. /package/examples/feature-demos/theme-presets/site/{routes/040-statement/images/statement → pages/040-statement/images}/black-pedigree.jpg +0 -0
  186. /package/examples/feature-demos/theme-presets/site/{routes/040-statement/images/statement → pages/040-statement/images}/sheepdog-grass.jpg +0 -0
  187. /package/examples/feature-demos/theme-presets/site/{routes/040-statement/images/statement → pages/040-statement/images}/sheepdog-wide.jpg +0 -0
  188. /package/examples/feature-demos/theme-presets/site/{routes → pages}/040-statement/theme.yaml +0 -0
  189. /package/fixtures/basic/site/images/{work/.gitkeep → .gitkeep} +0 -0
  190. /package/fixtures/content-model-v2/site/images/{card-section/adopt.svg → adopt.svg} +0 -0
  191. /package/fixtures/content-model-v2/site/images/{intro/detail.jpg → detail.jpg} +0 -0
  192. /package/fixtures/content-model-v2/site/images/{intro/duplicate.jpg → duplicate.jpg} +0 -0
  193. /package/fixtures/content-model-v2/site/images/{card-section/foster.svg → foster.svg} +0 -0
  194. /package/fixtures/content-model-v2/site/images/{intro/hero.jpg → hero.jpg} +0 -0
  195. /package/fixtures/content-model-v2/site/images/{plain/image.jpg → image.jpg} +0 -0
  196. /package/fixtures/content-model-v2/site/images/{timed/slide-one.jpg → slide-one.jpg} +0 -0
  197. /package/fixtures/content-model-v2/site/images/{timed/slide-three.jpg → slide-three.jpg} +0 -0
  198. /package/fixtures/content-model-v2/site/images/{timed/slide-two.jpg → slide-two.jpg} +0 -0
  199. /package/fixtures/content-model-v2/site/{routes/010-guide/images/intro → pages/010-guide/images}/duplicate.jpg +0 -0
  200. /package/starters/basic/site/images/{work/.gitkeep → .gitkeep} +0 -0
@@ -27,7 +27,48 @@
27
27
  "description": "For short, expressive sites, with larger typography, airy spacing, and stronger section emphasis."
28
28
  }
29
29
  ],
30
- "markdownDescription": "```yaml\npreset: documentation\n```\n\nSelects coordinated layout, image sizing, typography, palette and section surfaces. This is the normal starting point for a theme.\n\n[Compare theme presets](https://github.com/janga/norna/blob/v0.7.16/docs/theme.md#theme-presets)"
30
+ "markdownDescription": "```yaml\npreset: documentation\n```\n\nSelects coordinated navigation, layout, image sizing, typography, palette and section surfaces. This is the normal starting point for a theme.\n\n[Compare theme presets](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#theme-presets)"
31
+ },
32
+ "navigation": {
33
+ "type": "object",
34
+ "properties": {
35
+ "mode": {
36
+ "description": "Navigation model. Omit this to keep the selected preset.",
37
+ "type": "string",
38
+ "oneOf": [
39
+ {
40
+ "const": "automatic",
41
+ "title": "Automatic",
42
+ "description": "Choose sections for one page, top navigation for a shallow multi-page site, and tree navigation for deeper content."
43
+ },
44
+ {
45
+ "const": "sections",
46
+ "title": "Sections",
47
+ "description": "Navigate the sections of the current page."
48
+ },
49
+ {
50
+ "const": "top",
51
+ "title": "Top",
52
+ "description": "Use pages in the top navigation and sections below them."
53
+ },
54
+ {
55
+ "const": "tree",
56
+ "title": "Tree",
57
+ "description": "Use a hierarchical site-wide navigation tree."
58
+ }
59
+ ],
60
+ "markdownDescription": "```yaml\nnavigation:\n mode: automatic\n```\n\nNavigation model. Omit this to keep the selected preset.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md)",
61
+ "examples": [
62
+ "automatic",
63
+ "sections",
64
+ "top",
65
+ "tree"
66
+ ]
67
+ }
68
+ },
69
+ "additionalProperties": false,
70
+ "description": "Site-wide navigation behavior. This may be set only in the root theme.",
71
+ "markdownDescription": "```yaml\nnavigation:\n mode: automatic\n```\n\nSets the site-wide navigation model. Only the root theme may override this preset value.\n\n[Theme reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md)"
31
72
  },
32
73
  "layout": {
33
74
  "type": "object",
@@ -51,12 +92,14 @@
51
92
  "title": "Airy",
52
93
  "description": "Increase vertical spacing for a more expansive presentation."
53
94
  }
54
- ]
95
+ ],
96
+ "markdownDescription": "```yaml\nlayout:\n density: compact\n```\n\nOverall spacing density. Omit this to keep the selected preset.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
55
97
  },
56
98
  "pageWidth": {
57
99
  "description": "Maximum width of the site layout. Omit this to keep the selected preset.",
58
100
  "type": "string",
59
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$"
101
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
102
+ "markdownDescription": "```yaml\nlayout:\n pageWidth: 72rem\n```\n\nMaximum width of the site layout. Omit this to keep the selected preset.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
60
103
  },
61
104
  "gutter": {
62
105
  "description": "Horizontal page gutter as one value or separate desktop and mobile values.",
@@ -72,12 +115,14 @@
72
115
  "desktop": {
73
116
  "type": "string",
74
117
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
75
- "description": "Responsive CSS length or clamp() expression."
118
+ "description": "Responsive CSS length or clamp() expression.",
119
+ "markdownDescription": "```yaml\nlayout:\n gutter:\n desktop: clamp(1.25rem, 4vw, 3rem)\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
76
120
  },
77
121
  "mobile": {
78
122
  "type": "string",
79
123
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
80
- "description": "Responsive CSS length or clamp() expression."
124
+ "description": "Responsive CSS length or clamp() expression.",
125
+ "markdownDescription": "```yaml\nlayout:\n gutter:\n mobile: 1rem\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
81
126
  }
82
127
  },
83
128
  "required": [
@@ -86,6 +131,17 @@
86
131
  ],
87
132
  "additionalProperties": false
88
133
  }
134
+ ],
135
+ "markdownDescription": "```yaml\nlayout:\n gutter:\n desktop: clamp(1.25rem, 4vw, 3rem)\n mobile: 1rem\n```\n\nHorizontal page gutter as one value or separate desktop and mobile values.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
136
+ "defaultSnippets": [
137
+ {
138
+ "label": "Responsive page gutter",
139
+ "markdownDescription": "Set separate page gutters for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
140
+ "body": {
141
+ "desktop": "${1:clamp(1.25rem, 4vw, 3rem)}",
142
+ "mobile": "${2:1rem}"
143
+ }
144
+ }
89
145
  ]
90
146
  },
91
147
  "spacing": {
@@ -106,12 +162,14 @@
106
162
  "desktop": {
107
163
  "type": "string",
108
164
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
109
- "description": "Responsive CSS length or clamp() expression."
165
+ "description": "Responsive CSS length or clamp() expression.",
166
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n blockGap:\n desktop: 1.5em\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
110
167
  },
111
168
  "mobile": {
112
169
  "type": "string",
113
170
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
114
- "description": "Responsive CSS length or clamp() expression."
171
+ "description": "Responsive CSS length or clamp() expression.",
172
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n blockGap:\n mobile: 1.5em\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
115
173
  }
116
174
  },
117
175
  "required": [
@@ -120,6 +178,17 @@
120
178
  ],
121
179
  "additionalProperties": false
122
180
  }
181
+ ],
182
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n blockGap: 1.5em\n```\n\nDefault vertical gap between structured content blocks.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
183
+ "defaultSnippets": [
184
+ {
185
+ "label": "Responsive spacing",
186
+ "markdownDescription": "Set separate spacing values for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
187
+ "body": {
188
+ "desktop": "${1:1.5em}",
189
+ "mobile": "${2:1.5em}"
190
+ }
191
+ }
123
192
  ]
124
193
  },
125
194
  "finalSectionBottom": {
@@ -136,12 +205,14 @@
136
205
  "desktop": {
137
206
  "type": "string",
138
207
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
139
- "description": "Responsive CSS length or clamp() expression."
208
+ "description": "Responsive CSS length or clamp() expression.",
209
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n finalSectionBottom:\n desktop: 2rem\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
140
210
  },
141
211
  "mobile": {
142
212
  "type": "string",
143
213
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
144
- "description": "Responsive CSS length or clamp() expression."
214
+ "description": "Responsive CSS length or clamp() expression.",
215
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n finalSectionBottom:\n mobile: 2rem\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
145
216
  }
146
217
  },
147
218
  "required": [
@@ -150,6 +221,17 @@
150
221
  ],
151
222
  "additionalProperties": false
152
223
  }
224
+ ],
225
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n finalSectionBottom: 2rem\n```\n\nBottom space after the final section.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
226
+ "defaultSnippets": [
227
+ {
228
+ "label": "Responsive spacing",
229
+ "markdownDescription": "Set separate spacing values for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
230
+ "body": {
231
+ "desktop": "${1:2rem}",
232
+ "mobile": "${2:2rem}"
233
+ }
234
+ }
153
235
  ]
154
236
  },
155
237
  "firstSectionTop": {
@@ -166,12 +248,14 @@
166
248
  "desktop": {
167
249
  "type": "string",
168
250
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
169
- "description": "Responsive CSS length or clamp() expression."
251
+ "description": "Responsive CSS length or clamp() expression.",
252
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n firstSectionTop:\n desktop: 1.5rem\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
170
253
  },
171
254
  "mobile": {
172
255
  "type": "string",
173
256
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
174
- "description": "Responsive CSS length or clamp() expression."
257
+ "description": "Responsive CSS length or clamp() expression.",
258
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n firstSectionTop:\n mobile: 1.5rem\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
175
259
  }
176
260
  },
177
261
  "required": [
@@ -180,6 +264,17 @@
180
264
  ],
181
265
  "additionalProperties": false
182
266
  }
267
+ ],
268
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n firstSectionTop: 1.5rem\n```\n\nTop space before the first section.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
269
+ "defaultSnippets": [
270
+ {
271
+ "label": "Responsive spacing",
272
+ "markdownDescription": "Set separate spacing values for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
273
+ "body": {
274
+ "desktop": "${1:1.5rem}",
275
+ "mobile": "${2:1.5rem}"
276
+ }
277
+ }
183
278
  ]
184
279
  },
185
280
  "headingToBlock": {
@@ -196,12 +291,14 @@
196
291
  "desktop": {
197
292
  "type": "string",
198
293
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
199
- "description": "Responsive CSS length or clamp() expression."
294
+ "description": "Responsive CSS length or clamp() expression.",
295
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n headingToBlock:\n desktop: 0.75em\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
200
296
  },
201
297
  "mobile": {
202
298
  "type": "string",
203
299
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
204
- "description": "Responsive CSS length or clamp() expression."
300
+ "description": "Responsive CSS length or clamp() expression.",
301
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n headingToBlock:\n mobile: 0.75em\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
205
302
  }
206
303
  },
207
304
  "required": [
@@ -210,6 +307,17 @@
210
307
  ],
211
308
  "additionalProperties": false
212
309
  }
310
+ ],
311
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n headingToBlock: 0.75em\n```\n\nGap from a section heading to a following structured block.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
312
+ "defaultSnippets": [
313
+ {
314
+ "label": "Responsive spacing",
315
+ "markdownDescription": "Set separate spacing values for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
316
+ "body": {
317
+ "desktop": "${1:0.75em}",
318
+ "mobile": "${2:0.75em}"
319
+ }
320
+ }
213
321
  ]
214
322
  },
215
323
  "imageGap": {
@@ -226,12 +334,14 @@
226
334
  "desktop": {
227
335
  "type": "string",
228
336
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
229
- "description": "Responsive CSS length or clamp() expression."
337
+ "description": "Responsive CSS length or clamp() expression.",
338
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n imageGap:\n desktop: 1rem\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
230
339
  },
231
340
  "mobile": {
232
341
  "type": "string",
233
342
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
234
- "description": "Responsive CSS length or clamp() expression."
343
+ "description": "Responsive CSS length or clamp() expression.",
344
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n imageGap:\n mobile: 1rem\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
235
345
  }
236
346
  },
237
347
  "required": [
@@ -240,6 +350,17 @@
240
350
  ],
241
351
  "additionalProperties": false
242
352
  }
353
+ ],
354
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n imageGap: 1rem\n```\n\nGap between images in an image stack.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
355
+ "defaultSnippets": [
356
+ {
357
+ "label": "Responsive spacing",
358
+ "markdownDescription": "Set separate spacing values for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
359
+ "body": {
360
+ "desktop": "${1:1rem}",
361
+ "mobile": "${2:1rem}"
362
+ }
363
+ }
243
364
  ]
244
365
  },
245
366
  "sectionGap": {
@@ -256,12 +377,14 @@
256
377
  "desktop": {
257
378
  "type": "string",
258
379
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
259
- "description": "Responsive CSS length or clamp() expression."
380
+ "description": "Responsive CSS length or clamp() expression.",
381
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n sectionGap:\n desktop: 2rem\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
260
382
  },
261
383
  "mobile": {
262
384
  "type": "string",
263
385
  "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
264
- "description": "Responsive CSS length or clamp() expression."
386
+ "description": "Responsive CSS length or clamp() expression.",
387
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n sectionGap:\n mobile: 2rem\n```\n\nResponsive CSS length or clamp() expression.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
265
388
  }
266
389
  },
267
390
  "required": [
@@ -270,15 +393,41 @@
270
393
  ],
271
394
  "additionalProperties": false
272
395
  }
396
+ ],
397
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n sectionGap: 2rem\n```\n\nVertical separation between page sections.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
398
+ "defaultSnippets": [
399
+ {
400
+ "label": "Responsive spacing",
401
+ "markdownDescription": "Set separate spacing values for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
402
+ "body": {
403
+ "desktop": "${1:2rem}",
404
+ "mobile": "${2:2rem}"
405
+ }
406
+ }
273
407
  ]
274
408
  }
275
409
  },
276
- "additionalProperties": false
410
+ "additionalProperties": false,
411
+ "markdownDescription": "```yaml\nlayout:\n spacing:\n sectionGap: 2rem\n```\n\nFine-grained spacing overrides.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
412
+ "defaultSnippets": [
413
+ {
414
+ "label": "Layout spacing overrides",
415
+ "markdownDescription": "Start with the structural spacing values most commonly adjusted together.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)",
416
+ "body": {
417
+ "sectionGap": {
418
+ "desktop": "${1:2rem}",
419
+ "mobile": "${2:1.5rem}"
420
+ },
421
+ "headingToBlock": "${3:0.75em}",
422
+ "blockGap": "${4:1.5em}"
423
+ }
424
+ }
425
+ ]
277
426
  }
278
427
  },
279
428
  "additionalProperties": false,
280
429
  "description": "Optional layout overrides applied after the preset.",
281
- "markdownDescription": "```yaml\nlayout:\n density: compact\n pageWidth: 72rem\n```\n\nOverrides page width, gutters and structural spacing after the selected preset.\n\n[Layout reference](https://github.com/janga/norna/blob/v0.7.16/docs/theme.md#layout)"
430
+ "markdownDescription": "```yaml\nlayout:\n density: compact\n pageWidth: 72rem\n```\n\nOverrides page width, gutters and structural spacing after the selected preset.\n\n[Layout reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#layout)"
282
431
  },
283
432
  "images": {
284
433
  "type": "object",
@@ -286,7 +435,8 @@
286
435
  "width": {
287
436
  "description": "Maximum managed-image width. Omit this to keep the selected preset.",
288
437
  "type": "string",
289
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$"
438
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)|clamp\\(\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*,\\s*(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|vw|vh|vmin|vmax|ch|%)\\s*\\))$",
439
+ "markdownDescription": "```yaml\nimages:\n width: 900px\n```\n\nMaximum managed-image width. Omit this to keep the selected preset.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)"
290
440
  },
291
441
  "maxAvailableWidthPercent": {
292
442
  "description": "Maximum percentage of available horizontal space used by managed images.",
@@ -303,13 +453,15 @@
303
453
  "type": "number",
304
454
  "exclusiveMinimum": 0,
305
455
  "maximum": 100,
306
- "description": "Percentage used on wider screens."
456
+ "description": "Percentage used on wider screens.",
457
+ "markdownDescription": "```yaml\nimages:\n maxAvailableWidthPercent:\n desktop: 100\n```\n\nPercentage used on wider screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)"
307
458
  },
308
459
  "mobile": {
309
460
  "type": "number",
310
461
  "exclusiveMinimum": 0,
311
462
  "maximum": 100,
312
- "description": "Percentage used on narrow screens."
463
+ "description": "Percentage used on narrow screens.",
464
+ "markdownDescription": "```yaml\nimages:\n maxAvailableWidthPercent:\n mobile: 100\n```\n\nPercentage used on narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)"
313
465
  }
314
466
  },
315
467
  "required": [
@@ -318,6 +470,17 @@
318
470
  ],
319
471
  "additionalProperties": false
320
472
  }
473
+ ],
474
+ "markdownDescription": "```yaml\nimages:\n maxAvailableWidthPercent:\n desktop: 100\n mobile: 100\n```\n\nMaximum percentage of available horizontal space used by managed images.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)",
475
+ "defaultSnippets": [
476
+ {
477
+ "label": "Responsive image limit",
478
+ "markdownDescription": "Set separate managed-image limits for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)",
479
+ "body": {
480
+ "desktop": "${1:100}",
481
+ "mobile": "${2:100}"
482
+ }
483
+ }
321
484
  ]
322
485
  },
323
486
  "maxAvailableHeightPercent": {
@@ -335,13 +498,15 @@
335
498
  "type": "number",
336
499
  "exclusiveMinimum": 0,
337
500
  "maximum": 100,
338
- "description": "Percentage used on wider screens."
501
+ "description": "Percentage used on wider screens.",
502
+ "markdownDescription": "```yaml\nimages:\n maxAvailableHeightPercent:\n desktop: 74\n```\n\nPercentage used on wider screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)"
339
503
  },
340
504
  "mobile": {
341
505
  "type": "number",
342
506
  "exclusiveMinimum": 0,
343
507
  "maximum": 100,
344
- "description": "Percentage used on narrow screens."
508
+ "description": "Percentage used on narrow screens.",
509
+ "markdownDescription": "```yaml\nimages:\n maxAvailableHeightPercent:\n mobile: 68\n```\n\nPercentage used on narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)"
345
510
  }
346
511
  },
347
512
  "required": [
@@ -350,12 +515,23 @@
350
515
  ],
351
516
  "additionalProperties": false
352
517
  }
518
+ ],
519
+ "markdownDescription": "```yaml\nimages:\n maxAvailableHeightPercent:\n desktop: 74\n mobile: 68\n```\n\nMaximum percentage of viewport height used by managed images.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)",
520
+ "defaultSnippets": [
521
+ {
522
+ "label": "Responsive image limit",
523
+ "markdownDescription": "Set separate managed-image limits for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)",
524
+ "body": {
525
+ "desktop": "${1:74}",
526
+ "mobile": "${2:68}"
527
+ }
528
+ }
353
529
  ]
354
530
  }
355
531
  },
356
532
  "additionalProperties": false,
357
533
  "description": "Optional defaults for managed image presentation.",
358
- "markdownDescription": "```yaml\nimages:\n width: 900px\n maxAvailableHeightPercent: 74\n```\n\nOverrides the available width and height used by Norna-managed images.\n\n[Image sizing reference](https://github.com/janga/norna/blob/v0.7.16/docs/theme.md#image-sizing)"
534
+ "markdownDescription": "```yaml\nimages:\n width: 900px\n maxAvailableHeightPercent: 74\n```\n\nOverrides the available width and height used by Norna-managed images.\n\n[Image sizing reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#image-sizing)"
359
535
  },
360
536
  "typography": {
361
537
  "type": "object",
@@ -363,7 +539,8 @@
363
539
  "fontFamily": {
364
540
  "description": "CSS font-family stack.",
365
541
  "type": "string",
366
- "minLength": 1
542
+ "minLength": 1,
543
+ "markdownDescription": "```yaml\ntypography:\n fontFamily: \"Arial, sans-serif\"\n```\n\nCSS font-family stack.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
367
544
  },
368
545
  "profile": {
369
546
  "description": "Typography profile. Omit this to keep the selected preset.",
@@ -389,7 +566,8 @@
389
566
  "title": "Statement",
390
567
  "description": "Stronger headings and tighter body rhythm for short, expressive pages."
391
568
  }
392
- ]
569
+ ],
570
+ "markdownDescription": "```yaml\ntypography:\n profile: reading\n```\n\nTypography profile. Omit this to keep the selected preset.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
393
571
  },
394
572
  "rhythm": {
395
573
  "description": "Typography spacing rhythm. Omit this to keep the selected preset.",
@@ -410,7 +588,8 @@
410
588
  "title": "Airy",
411
589
  "description": "Increase vertical spacing for a more expansive presentation."
412
590
  }
413
- ]
591
+ ],
592
+ "markdownDescription": "```yaml\ntypography:\n rhythm: normal\n```\n\nTypography spacing rhythm. Omit this to keep the selected preset.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
414
593
  },
415
594
  "overrides": {
416
595
  "description": "Focused typography overrides applied after the profile.",
@@ -447,7 +626,8 @@
447
626
  "title": "Right",
448
627
  "description": "Align text with the right edge of its text area."
449
628
  }
450
- ]
629
+ ],
630
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h1:\n \n align:\n desktop: left\n```\n\nText alignment on wider screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
451
631
  },
452
632
  "mobile": {
453
633
  "description": "Text alignment on narrow screens.",
@@ -468,10 +648,22 @@
468
648
  "title": "Right",
469
649
  "description": "Align text with the right edge of its text area."
470
650
  }
471
- ]
651
+ ],
652
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h1:\n \n align:\n mobile: left\n```\n\nText alignment on narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
472
653
  }
473
654
  },
474
- "additionalProperties": false
655
+ "additionalProperties": false,
656
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h1:\n \n align:\n desktop: left\n mobile: left\n```\n\nResponsive text alignment override.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
657
+ "defaultSnippets": [
658
+ {
659
+ "label": "Responsive text alignment",
660
+ "markdownDescription": "Set separate text alignment for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
661
+ "body": {
662
+ "desktop": "${1:left}",
663
+ "mobile": "${2:left}"
664
+ }
665
+ }
666
+ ]
475
667
  },
476
668
  "size": {
477
669
  "type": "string",
@@ -497,13 +689,15 @@
497
689
  "title": "Extra large",
498
690
  "description": "Use the largest available type size for exceptional emphasis."
499
691
  }
500
- ]
692
+ ],
693
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h1:\n \n size: medium\n```\n\nText size from the active typography system. Omit an override to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
501
694
  },
502
695
  "lineHeight": {
503
696
  "type": "number",
504
697
  "minimum": 1,
505
698
  "maximum": 3,
506
- "description": "Unitless line height between 1 and 3."
699
+ "description": "Unitless line height between 1 and 3.",
700
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h1:\n \n lineHeight: 1.5\n```\n\nUnitless line height between 1 and 3.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
507
701
  },
508
702
  "weight": {
509
703
  "description": "Heading font weight. Omit this to keep the profile value.",
@@ -528,20 +722,24 @@
528
722
  "title": "Bold",
529
723
  "description": "Use bold font weight."
530
724
  }
531
- ]
725
+ ],
726
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h1:\n \n weight: 600\n```\n\nHeading font weight. Omit this to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
532
727
  },
533
728
  "spacingBefore": {
534
729
  "description": "Vertical space before the heading.",
535
730
  "type": "string",
536
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
731
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
732
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h1:\n \n spacingBefore: 1.5em\n```\n\nVertical space before the heading.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
537
733
  },
538
734
  "spacingAfter": {
539
735
  "description": "Vertical space after the heading.",
540
736
  "type": "string",
541
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
737
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
738
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h1:\n \n spacingAfter: 0.5em\n```\n\nVertical space after the heading.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
542
739
  }
543
740
  },
544
- "additionalProperties": false
741
+ "additionalProperties": false,
742
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h1:\n size: medium\n```\n\nOverrides for Markdown level 1 headings.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
545
743
  },
546
744
  "h2": {
547
745
  "description": "Overrides for Markdown level 2 section headings.",
@@ -570,7 +768,8 @@
570
768
  "title": "Right",
571
769
  "description": "Align text with the right edge of its text area."
572
770
  }
573
- ]
771
+ ],
772
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n \n align:\n desktop: left\n```\n\nText alignment on wider screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
574
773
  },
575
774
  "mobile": {
576
775
  "description": "Text alignment on narrow screens.",
@@ -591,10 +790,22 @@
591
790
  "title": "Right",
592
791
  "description": "Align text with the right edge of its text area."
593
792
  }
594
- ]
793
+ ],
794
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n \n align:\n mobile: left\n```\n\nText alignment on narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
595
795
  }
596
796
  },
597
- "additionalProperties": false
797
+ "additionalProperties": false,
798
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n \n align:\n desktop: left\n mobile: left\n```\n\nResponsive text alignment override.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
799
+ "defaultSnippets": [
800
+ {
801
+ "label": "Responsive text alignment",
802
+ "markdownDescription": "Set separate text alignment for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
803
+ "body": {
804
+ "desktop": "${1:left}",
805
+ "mobile": "${2:left}"
806
+ }
807
+ }
808
+ ]
598
809
  },
599
810
  "size": {
600
811
  "type": "string",
@@ -620,13 +831,15 @@
620
831
  "title": "Extra large",
621
832
  "description": "Use the largest available type size for exceptional emphasis."
622
833
  }
623
- ]
834
+ ],
835
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n \n size: medium\n```\n\nText size from the active typography system. Omit an override to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
624
836
  },
625
837
  "lineHeight": {
626
838
  "type": "number",
627
839
  "minimum": 1,
628
840
  "maximum": 3,
629
- "description": "Unitless line height between 1 and 3."
841
+ "description": "Unitless line height between 1 and 3.",
842
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n \n lineHeight: 1.5\n```\n\nUnitless line height between 1 and 3.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
630
843
  },
631
844
  "weight": {
632
845
  "description": "Heading font weight. Omit this to keep the profile value.",
@@ -651,20 +864,24 @@
651
864
  "title": "Bold",
652
865
  "description": "Use bold font weight."
653
866
  }
654
- ]
867
+ ],
868
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n \n weight: 600\n```\n\nHeading font weight. Omit this to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
655
869
  },
656
870
  "spacingBefore": {
657
871
  "description": "Vertical space before the heading.",
658
872
  "type": "string",
659
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
873
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
874
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n \n spacingBefore: 1.5em\n```\n\nVertical space before the heading.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
660
875
  },
661
876
  "spacingAfter": {
662
877
  "description": "Vertical space after the heading.",
663
878
  "type": "string",
664
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
879
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
880
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n \n spacingAfter: 0.5em\n```\n\nVertical space after the heading.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
665
881
  }
666
882
  },
667
- "additionalProperties": false
883
+ "additionalProperties": false,
884
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n size: medium\n```\n\nOverrides for Markdown level 2 section headings.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
668
885
  },
669
886
  "h3": {
670
887
  "description": "Overrides for Markdown level 3 headings.",
@@ -693,7 +910,8 @@
693
910
  "title": "Right",
694
911
  "description": "Align text with the right edge of its text area."
695
912
  }
696
- ]
913
+ ],
914
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h3:\n \n align:\n desktop: left\n```\n\nText alignment on wider screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
697
915
  },
698
916
  "mobile": {
699
917
  "description": "Text alignment on narrow screens.",
@@ -714,10 +932,22 @@
714
932
  "title": "Right",
715
933
  "description": "Align text with the right edge of its text area."
716
934
  }
717
- ]
935
+ ],
936
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h3:\n \n align:\n mobile: left\n```\n\nText alignment on narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
718
937
  }
719
938
  },
720
- "additionalProperties": false
939
+ "additionalProperties": false,
940
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h3:\n \n align:\n desktop: left\n mobile: left\n```\n\nResponsive text alignment override.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
941
+ "defaultSnippets": [
942
+ {
943
+ "label": "Responsive text alignment",
944
+ "markdownDescription": "Set separate text alignment for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
945
+ "body": {
946
+ "desktop": "${1:left}",
947
+ "mobile": "${2:left}"
948
+ }
949
+ }
950
+ ]
721
951
  },
722
952
  "size": {
723
953
  "type": "string",
@@ -743,13 +973,15 @@
743
973
  "title": "Extra large",
744
974
  "description": "Use the largest available type size for exceptional emphasis."
745
975
  }
746
- ]
976
+ ],
977
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h3:\n \n size: medium\n```\n\nText size from the active typography system. Omit an override to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
747
978
  },
748
979
  "lineHeight": {
749
980
  "type": "number",
750
981
  "minimum": 1,
751
982
  "maximum": 3,
752
- "description": "Unitless line height between 1 and 3."
983
+ "description": "Unitless line height between 1 and 3.",
984
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h3:\n \n lineHeight: 1.5\n```\n\nUnitless line height between 1 and 3.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
753
985
  },
754
986
  "weight": {
755
987
  "description": "Heading font weight. Omit this to keep the profile value.",
@@ -774,20 +1006,24 @@
774
1006
  "title": "Bold",
775
1007
  "description": "Use bold font weight."
776
1008
  }
777
- ]
1009
+ ],
1010
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h3:\n \n weight: 600\n```\n\nHeading font weight. Omit this to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
778
1011
  },
779
1012
  "spacingBefore": {
780
1013
  "description": "Vertical space before the heading.",
781
1014
  "type": "string",
782
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
1015
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
1016
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h3:\n \n spacingBefore: 1.5em\n```\n\nVertical space before the heading.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
783
1017
  },
784
1018
  "spacingAfter": {
785
1019
  "description": "Vertical space after the heading.",
786
1020
  "type": "string",
787
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
1021
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
1022
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h3:\n \n spacingAfter: 0.5em\n```\n\nVertical space after the heading.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
788
1023
  }
789
1024
  },
790
- "additionalProperties": false
1025
+ "additionalProperties": false,
1026
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h3:\n size: medium\n```\n\nOverrides for Markdown level 3 headings.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
791
1027
  },
792
1028
  "h4": {
793
1029
  "description": "Overrides for Markdown level 4 headings.",
@@ -816,7 +1052,8 @@
816
1052
  "title": "Right",
817
1053
  "description": "Align text with the right edge of its text area."
818
1054
  }
819
- ]
1055
+ ],
1056
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h4:\n \n align:\n desktop: left\n```\n\nText alignment on wider screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
820
1057
  },
821
1058
  "mobile": {
822
1059
  "description": "Text alignment on narrow screens.",
@@ -837,10 +1074,22 @@
837
1074
  "title": "Right",
838
1075
  "description": "Align text with the right edge of its text area."
839
1076
  }
840
- ]
1077
+ ],
1078
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h4:\n \n align:\n mobile: left\n```\n\nText alignment on narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
841
1079
  }
842
1080
  },
843
- "additionalProperties": false
1081
+ "additionalProperties": false,
1082
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h4:\n \n align:\n desktop: left\n mobile: left\n```\n\nResponsive text alignment override.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
1083
+ "defaultSnippets": [
1084
+ {
1085
+ "label": "Responsive text alignment",
1086
+ "markdownDescription": "Set separate text alignment for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
1087
+ "body": {
1088
+ "desktop": "${1:left}",
1089
+ "mobile": "${2:left}"
1090
+ }
1091
+ }
1092
+ ]
844
1093
  },
845
1094
  "size": {
846
1095
  "type": "string",
@@ -866,13 +1115,15 @@
866
1115
  "title": "Extra large",
867
1116
  "description": "Use the largest available type size for exceptional emphasis."
868
1117
  }
869
- ]
1118
+ ],
1119
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h4:\n \n size: medium\n```\n\nText size from the active typography system. Omit an override to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
870
1120
  },
871
1121
  "lineHeight": {
872
1122
  "type": "number",
873
1123
  "minimum": 1,
874
1124
  "maximum": 3,
875
- "description": "Unitless line height between 1 and 3."
1125
+ "description": "Unitless line height between 1 and 3.",
1126
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h4:\n \n lineHeight: 1.5\n```\n\nUnitless line height between 1 and 3.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
876
1127
  },
877
1128
  "weight": {
878
1129
  "description": "Heading font weight. Omit this to keep the profile value.",
@@ -897,23 +1148,28 @@
897
1148
  "title": "Bold",
898
1149
  "description": "Use bold font weight."
899
1150
  }
900
- ]
1151
+ ],
1152
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h4:\n \n weight: 600\n```\n\nHeading font weight. Omit this to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
901
1153
  },
902
1154
  "spacingBefore": {
903
1155
  "description": "Vertical space before the heading.",
904
1156
  "type": "string",
905
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
1157
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
1158
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h4:\n \n spacingBefore: 1.5em\n```\n\nVertical space before the heading.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
906
1159
  },
907
1160
  "spacingAfter": {
908
1161
  "description": "Vertical space after the heading.",
909
1162
  "type": "string",
910
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
1163
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
1164
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h4:\n \n spacingAfter: 0.5em\n```\n\nVertical space after the heading.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
911
1165
  }
912
1166
  },
913
- "additionalProperties": false
1167
+ "additionalProperties": false,
1168
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h4:\n size: medium\n```\n\nOverrides for Markdown level 4 headings.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
914
1169
  }
915
1170
  },
916
- "additionalProperties": false
1171
+ "additionalProperties": false,
1172
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n headings:\n h2:\n size: medium\n```\n\nOverrides for heading levels.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
917
1173
  },
918
1174
  "body": {
919
1175
  "description": "Overrides for body text.",
@@ -942,7 +1198,8 @@
942
1198
  "title": "Right",
943
1199
  "description": "Align text with the right edge of its text area."
944
1200
  }
945
- ]
1201
+ ],
1202
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n body:\n align:\n desktop: left\n```\n\nText alignment on wider screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
946
1203
  },
947
1204
  "mobile": {
948
1205
  "description": "Text alignment on narrow screens.",
@@ -963,10 +1220,22 @@
963
1220
  "title": "Right",
964
1221
  "description": "Align text with the right edge of its text area."
965
1222
  }
966
- ]
1223
+ ],
1224
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n body:\n align:\n mobile: left\n```\n\nText alignment on narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
967
1225
  }
968
1226
  },
969
- "additionalProperties": false
1227
+ "additionalProperties": false,
1228
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n body:\n align:\n desktop: left\n mobile: left\n```\n\nResponsive text alignment override.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
1229
+ "defaultSnippets": [
1230
+ {
1231
+ "label": "Responsive text alignment",
1232
+ "markdownDescription": "Set separate text alignment for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
1233
+ "body": {
1234
+ "desktop": "${1:left}",
1235
+ "mobile": "${2:left}"
1236
+ }
1237
+ }
1238
+ ]
970
1239
  },
971
1240
  "size": {
972
1241
  "type": "string",
@@ -992,13 +1261,15 @@
992
1261
  "title": "Extra large",
993
1262
  "description": "Use the largest available type size for exceptional emphasis."
994
1263
  }
995
- ]
1264
+ ],
1265
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n body:\n size: medium\n```\n\nText size from the active typography system. Omit an override to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
996
1266
  },
997
1267
  "lineHeight": {
998
1268
  "type": "number",
999
1269
  "minimum": 1,
1000
1270
  "maximum": 3,
1001
- "description": "Unitless line height between 1 and 3."
1271
+ "description": "Unitless line height between 1 and 3.",
1272
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n body:\n lineHeight: 1.5\n```\n\nUnitless line height between 1 and 3.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1002
1273
  },
1003
1274
  "width": {
1004
1275
  "description": "Maximum body-text line length.",
@@ -1019,15 +1290,18 @@
1019
1290
  "title": "Wide",
1020
1291
  "description": "Allow body text to use more horizontal space."
1021
1292
  }
1022
- ]
1293
+ ],
1294
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n body:\n width: narrow\n```\n\nMaximum body-text line length.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1023
1295
  },
1024
1296
  "paragraphSpacing": {
1025
1297
  "description": "Vertical space between body paragraphs.",
1026
1298
  "type": "string",
1027
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
1299
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
1300
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n body:\n paragraphSpacing: 1em\n```\n\nVertical space between body paragraphs.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1028
1301
  }
1029
1302
  },
1030
- "additionalProperties": false
1303
+ "additionalProperties": false,
1304
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n body:\n width: narrow\n```\n\nOverrides for body text.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1031
1305
  },
1032
1306
  "caption": {
1033
1307
  "description": "Overrides for image captions.",
@@ -1056,7 +1330,8 @@
1056
1330
  "title": "Right",
1057
1331
  "description": "Align text with the right edge of its text area."
1058
1332
  }
1059
- ]
1333
+ ],
1334
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n caption:\n align:\n desktop: left\n```\n\nText alignment on wider screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1060
1335
  },
1061
1336
  "mobile": {
1062
1337
  "description": "Text alignment on narrow screens.",
@@ -1077,10 +1352,22 @@
1077
1352
  "title": "Right",
1078
1353
  "description": "Align text with the right edge of its text area."
1079
1354
  }
1080
- ]
1355
+ ],
1356
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n caption:\n align:\n mobile: left\n```\n\nText alignment on narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1081
1357
  }
1082
1358
  },
1083
- "additionalProperties": false
1359
+ "additionalProperties": false,
1360
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n caption:\n align:\n desktop: left\n mobile: left\n```\n\nResponsive text alignment override.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
1361
+ "defaultSnippets": [
1362
+ {
1363
+ "label": "Responsive text alignment",
1364
+ "markdownDescription": "Set separate text alignment for wider and narrow screens.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
1365
+ "body": {
1366
+ "desktop": "${1:left}",
1367
+ "mobile": "${2:left}"
1368
+ }
1369
+ }
1370
+ ]
1084
1371
  },
1085
1372
  "size": {
1086
1373
  "type": "string",
@@ -1106,29 +1393,52 @@
1106
1393
  "title": "Extra large",
1107
1394
  "description": "Use the largest available type size for exceptional emphasis."
1108
1395
  }
1109
- ]
1396
+ ],
1397
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n caption:\n size: medium\n```\n\nText size from the active typography system. Omit an override to keep the profile value.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1110
1398
  },
1111
1399
  "lineHeight": {
1112
1400
  "type": "number",
1113
1401
  "minimum": 1,
1114
1402
  "maximum": 3,
1115
- "description": "Unitless line height between 1 and 3."
1403
+ "description": "Unitless line height between 1 and 3.",
1404
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n caption:\n lineHeight: 1.5\n```\n\nUnitless line height between 1 and 3.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1116
1405
  },
1117
1406
  "spacingBefore": {
1118
1407
  "description": "Vertical space between an image and its caption.",
1119
1408
  "type": "string",
1120
- "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$"
1409
+ "pattern": "^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|rem|em|ch|lh))$",
1410
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n caption:\n spacingBefore: 0.5em\n```\n\nVertical space between an image and its caption.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1121
1411
  }
1122
1412
  },
1123
- "additionalProperties": false
1413
+ "additionalProperties": false,
1414
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n caption:\n size: small\n```\n\nOverrides for image captions.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1124
1415
  }
1125
1416
  },
1126
- "additionalProperties": false
1417
+ "additionalProperties": false,
1418
+ "markdownDescription": "```yaml\ntypography:\n overrides:\n body:\n width: narrow\n```\n\nFocused typography overrides applied after the profile.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
1419
+ "defaultSnippets": [
1420
+ {
1421
+ "label": "Typography overrides",
1422
+ "markdownDescription": "Start a focused set of heading and body-text overrides.\n\n[Read the relevant reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)",
1423
+ "body": {
1424
+ "headings": {
1425
+ "h2": {
1426
+ "size": "${1:medium}",
1427
+ "weight": "${2:600}"
1428
+ }
1429
+ },
1430
+ "body": {
1431
+ "width": "${3:narrow}",
1432
+ "lineHeight": "${4:1.55}"
1433
+ }
1434
+ }
1435
+ }
1436
+ ]
1127
1437
  }
1128
1438
  },
1129
1439
  "additionalProperties": false,
1130
1440
  "description": "Typography profile, rhythm, font family, and focused overrides.",
1131
- "markdownDescription": "```yaml\ntypography:\n profile: reading\n rhythm: normal\n```\n\nOverrides the preset's font stack, typography profile, rhythm or individual text settings.\n\n[Typography configuration reference](https://github.com/janga/norna/blob/v0.7.16/docs/typography.md#configuration-shape)"
1441
+ "markdownDescription": "```yaml\ntypography:\n profile: reading\n rhythm: normal\n```\n\nOverrides the preset's font stack, typography profile, rhythm or individual text settings.\n\n[Typography configuration reference](https://github.com/janga/norna/blob/v0.7.17/docs/typography.md#configuration-shape)"
1132
1442
  },
1133
1443
  "palette": {
1134
1444
  "type": "string",
@@ -1150,7 +1460,7 @@
1150
1460
  "description": "Warm off-white surfaces with dark text."
1151
1461
  }
1152
1462
  ],
1153
- "markdownDescription": "```yaml\npalette: paper\n```\n\nChooses a coordinated color system for the page frame, navigation, footer and section surfaces.\n\n[Palette and section surfaces](https://github.com/janga/norna/blob/v0.7.16/docs/theme.md#palette-and-section-surfaces)",
1463
+ "markdownDescription": "```yaml\npalette: paper\n```\n\nChooses a coordinated color system for the page frame, navigation, footer and section surfaces.\n\n[Palette and section surfaces](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#palette-and-section-surfaces)",
1154
1464
  "examples": [
1155
1465
  "dark",
1156
1466
  "light",
@@ -1183,7 +1493,7 @@
1183
1493
  }
1184
1494
  ]
1185
1495
  },
1186
- "markdownDescription": "```yaml\nsectionSurfaces: [base, soft, emphasis]\n```\n\nLists one to three semantic surfaces. Norna cycles through them in section order; omit this field to keep the preset sequence.\n\n[Palette and section surfaces](https://github.com/janga/norna/blob/v0.7.16/docs/theme.md#palette-and-section-surfaces)",
1496
+ "markdownDescription": "```yaml\nsectionSurfaces: [base, soft, emphasis]\n```\n\nLists one to three semantic surfaces. Norna cycles through them in section order; omit this field to keep the preset sequence.\n\n[Palette and section surfaces](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md#palette-and-section-surfaces)",
1187
1497
  "examples": [
1188
1498
  [
1189
1499
  "base"
@@ -1201,8 +1511,8 @@
1201
1511
  }
1202
1512
  },
1203
1513
  "additionalProperties": false,
1204
- "description": "Visual settings for a site or route. A route theme replaces the inherited visual theme; site identity remains site-wide.",
1514
+ "description": "Visual settings for a site or page. A page theme replaces the inherited visual theme; navigation logo settings remain site-wide.",
1205
1515
  "$id": "https://janga.github.io/norna/schemas/theme.schema.json",
1206
1516
  "title": "Norna visual theme",
1207
- "markdownDescription": "```yaml\npreset: documentation\n```\n\nChoose one complete preset first. Add focused overrides only when the site needs to differ from it.\n\n[Theme reference](https://github.com/janga/norna/blob/v0.7.16/docs/theme.md)"
1517
+ "markdownDescription": "```yaml\npreset: documentation\n```\n\nChoose one complete preset first. Add focused overrides only when the site needs to differ from it.\n\n[Theme reference](https://github.com/janga/norna/blob/v0.7.17/docs/theme.md)"
1208
1518
  }