@janga/norna 0.7.6 → 0.7.8

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 (139) hide show
  1. package/README.md +8 -7
  2. package/astro.config.mjs +76 -0
  3. package/bin/norna-cli.mjs +2 -2
  4. package/docs/README.md +3 -3
  5. package/docs/commands.md +7 -6
  6. package/docs/configuration.md +3 -2
  7. package/docs/content.md +202 -91
  8. package/docs/design/site-examples-structure.md +1 -1
  9. package/docs/engine-development.md +3 -3
  10. package/docs/getting-started.md +50 -8
  11. package/docs/images-and-metadata.md +117 -20
  12. package/docs/routes.md +20 -12
  13. package/docs/site-structure.md +9 -5
  14. package/docs/theme.md +12 -8
  15. package/docs/typography.md +9 -10
  16. package/examples/dog-gallery/site/content.md +38 -77
  17. package/examples/dog-gallery/site/routes/010-dog-care/route-content.md +0 -10
  18. package/fixtures/basic/site/content.md +2 -4
  19. package/fixtures/content-model-v2/.astro/collections/site.schema.json +776 -0
  20. package/fixtures/content-model-v2/.astro/collections/theme.schema.json +668 -0
  21. package/fixtures/content-model-v2/.astro/content-assets.mjs +4 -0
  22. package/fixtures/content-model-v2/.astro/content-modules.mjs +1 -0
  23. package/fixtures/content-model-v2/.astro/content.d.ts +175 -0
  24. package/fixtures/content-model-v2/.astro/data-store.json +1 -0
  25. package/fixtures/content-model-v2/.astro/dev-local.json +8 -0
  26. package/fixtures/content-model-v2/.astro/dev.json +13 -0
  27. package/fixtures/content-model-v2/.astro/dev.log +231 -0
  28. package/fixtures/content-model-v2/.astro/settings.json +5 -0
  29. package/fixtures/content-model-v2/.astro/types.d.ts +2 -0
  30. package/fixtures/content-model-v2/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +1 -0
  31. package/fixtures/content-model-v2/dist/_astro/SitePage.BbfZub4g.css +1 -0
  32. package/fixtures/content-model-v2/dist/guide/index.html +3 -0
  33. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-480.webp +0 -0
  34. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-768.webp +0 -0
  35. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-971.webp +0 -0
  36. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-480.webp +0 -0
  37. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-768.webp +0 -0
  38. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-971.webp +0 -0
  39. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-480.webp +0 -0
  40. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-768.webp +0 -0
  41. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-971.webp +0 -0
  42. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1080.webp +0 -0
  43. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1440.webp +0 -0
  44. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1600.webp +0 -0
  45. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-480.webp +0 -0
  46. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-768.webp +0 -0
  47. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-480.webp +0 -0
  48. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-768.webp +0 -0
  49. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-960.webp +0 -0
  50. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1080.webp +0 -0
  51. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1440.webp +0 -0
  52. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1600.webp +0 -0
  53. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-480.webp +0 -0
  54. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-768.webp +0 -0
  55. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1080.webp +0 -0
  56. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1440.webp +0 -0
  57. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1600.webp +0 -0
  58. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-480.webp +0 -0
  59. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-768.webp +0 -0
  60. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1080.webp +0 -0
  61. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1440.webp +0 -0
  62. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1600.webp +0 -0
  63. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-480.webp +0 -0
  64. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-768.webp +0 -0
  65. package/fixtures/content-model-v2/dist/index.html +8 -0
  66. package/fixtures/content-model-v2/node_modules/.vite/deps/_metadata.json +80 -0
  67. package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  68. package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  69. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  70. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  71. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  72. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  73. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  74. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  75. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  76. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  77. package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  78. package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  79. package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js +1389 -0
  80. package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  81. package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  82. package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  83. package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  84. package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  85. package/fixtures/content-model-v2/node_modules/.vite/deps/package.json +3 -0
  86. package/fixtures/content-model-v2/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  87. package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  88. package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  89. package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  90. package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  91. package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  92. package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  93. package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  94. package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  95. package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  96. package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  97. package/fixtures/content-model-v2/site/.norna/generated-images.json +210 -0
  98. package/fixtures/content-model-v2/site/config.mjs +11 -0
  99. package/fixtures/content-model-v2/site/content.md +84 -0
  100. package/fixtures/content-model-v2/site/images/card-section/adopt.svg +9 -0
  101. package/fixtures/content-model-v2/site/images/card-section/foster.svg +12 -0
  102. package/fixtures/content-model-v2/site/images/intro/detail.jpg +0 -0
  103. package/fixtures/content-model-v2/site/images/intro/duplicate.jpg +0 -0
  104. package/fixtures/content-model-v2/site/images/intro/hero.jpg +0 -0
  105. package/fixtures/content-model-v2/site/images/plain/image.jpg +0 -0
  106. package/fixtures/content-model-v2/site/images/timed/slide-one.jpg +0 -0
  107. package/fixtures/content-model-v2/site/images/timed/slide-three.jpg +0 -0
  108. package/fixtures/content-model-v2/site/images/timed/slide-two.jpg +0 -0
  109. package/fixtures/content-model-v2/site/routes/010-guide/images/intro/duplicate.jpg +0 -0
  110. package/fixtures/content-model-v2/site/routes/010-guide/route-content.md +17 -0
  111. package/fixtures/content-model-v2/site/theme.md +9 -0
  112. package/package.json +3 -2
  113. package/scripts/deploy-site.mjs +11 -4
  114. package/scripts/dev-local.mjs +6 -0
  115. package/scripts/generate-images.mjs +132 -56
  116. package/scripts/lib/image-dimensions.mjs +26 -0
  117. package/scripts/lib/norna-markdown-blocks.mjs +643 -0
  118. package/scripts/lib/site-content.mjs +31 -29
  119. package/scripts/show-typography.mjs +17 -9
  120. package/scripts/sync-content-sections.mjs +414 -412
  121. package/scripts/test-content-check.mjs +59 -45
  122. package/scripts/test-content-model-v2.mjs +1230 -0
  123. package/scripts/test-engine-commands.mjs +1 -1
  124. package/scripts/test-package-check.mjs +36 -8
  125. package/scripts/test-temporary-visibility.mjs +3 -6
  126. package/src/components/CardList.astro +77 -0
  127. package/src/components/GalleryGrid.astro +22 -12
  128. package/src/components/SiteNavigation.astro +5 -4
  129. package/src/components/SitePage.astro +9 -2
  130. package/src/components/SiteSection.astro +35 -13
  131. package/src/content.config.ts +4 -17
  132. package/src/lib/generatedImages.ts +50 -10
  133. package/src/lib/sectionContent.ts +130 -35
  134. package/src/styles/global.css +187 -0
  135. package/starters/basic/README.md +4 -2
  136. package/starters/basic/site/content.md +9 -11
  137. package/starters/project/README.md +7 -3
  138. package/starters/project/site/content.md +0 -9
  139. package/starters/project/site/routes/010-guide/route-content.md +0 -5
@@ -73,28 +73,42 @@ const withTempProject = async ({ site, theme = defaultTheme, files, siteDirector
73
73
 
74
74
  const brokenSite = `---
75
75
  sections:
76
- - id: karin-walde
77
- gallery:
78
- - image: karin.jpg
79
- - id: min-konst
80
- gallery:
81
- - image: vav.jpeg
82
- - image: missing.jpeg
83
- - image: duplicate.jpg
84
- - image: duplicate.jpg
85
- - id: mitt-hem
86
- gallery:
87
- - image: home.jpg
76
+ karin-walde: {}
77
+ min-konst: {}
78
+ mitt-hem: {}
88
79
 
89
80
  ---
90
81
  ## Karin Walde {#karin-walde}
91
82
  Text.
83
+
84
+ \`\`\`norna-image-stack
85
+ - image: karin.jpg
86
+ alt: Karin
87
+ \`\`\`
88
+
92
89
  ## Min konst {#min-konst}
93
90
  Text.
91
+
92
+ \`\`\`norna-image-stack
93
+ - image: vav.jpeg
94
+ alt: Vav
95
+ - image: missing.jpeg
96
+ alt: Missing
97
+ - image: duplicate.jpg
98
+ alt: Duplicate one
99
+ - image: duplicate.jpg
100
+ alt: Duplicate two
101
+ \`\`\`
102
+
94
103
  ## Extra {#extra}
95
104
  Text.
96
105
  ## Mitt hem {#mitt-hem}
97
106
  Text.
107
+
108
+ \`\`\`norna-image-stack
109
+ - image: home.jpg
110
+ alt: Home
111
+ \`\`\`
98
112
  `;
99
113
 
100
114
  test('content:check groups section issues, global issues, and unreferenced images', async () => {
@@ -113,28 +127,26 @@ test('content:check groups section issues, global issues, and unreferenced image
113
127
 
114
128
  assert.equal(result.status, 1, output);
115
129
  assert.match(output, /^Content check failed\./m);
116
- assert.match(output, /Section And Image Issues\n\n\[min-konst\]\n Errors:/);
117
- assert.match(output, /Image "vav\.jpeg" is used here but is located in site\/images\/mitt-hem\/\./);
118
- assert.match(output, /Image "missing\.jpeg" does not exist anywhere under site\/images\/\./);
119
- assert.match(output, /Image "duplicate\.jpg" is referenced more than once in this section\./);
120
- assert.match(output, /\[extra\]\n Warnings:/);
121
- assert.match(output, /Global Content Issues\n\nWarnings:\n- Markdown section order differs from frontmatter\./);
122
- assert.match(output, /Unreferenced Images\nThese files are kept in site\/images\/ but are not mounted on the site:/);
130
+ assert.match(output, /Content Issues\n\n\[site\/content\.md \[min-konst\]\]\n Errors:/);
131
+ assert.match(output, /Image "vav\.jpeg" is used here but is located in site\/images\/mitt-hem\/vav\.jpeg\./);
132
+ assert.match(output, /Image "missing\.jpeg" does not exist at site\/images\/min-konst\/missing\.jpeg or anywhere under any page or route image root\./);
133
+ assert.match(output, /Unreferenced Images\nThese files are kept under page or route image roots but are not referenced by Norna-managed image references:/);
123
134
  assert.match(output, /site\/images\/karin-walde\/unreferenced\.jpg/);
124
135
  });
125
136
  });
126
137
 
127
138
  const carouselAspectRatioSite = `---
128
- sections:
129
- - id: puppies
130
- gallery:
131
- - carousel:
132
- - image: wide.png
133
- - image: wider.png
134
-
139
+ title: Carousel Aspect Ratio
135
140
  ---
136
141
  ## Puppies {#puppies}
137
142
  Text.
143
+
144
+ \`\`\`norna-image-carousel
145
+ - image: wide.png
146
+ alt: Wide
147
+ - image: wider.png
148
+ alt: Wider
149
+ \`\`\`
138
150
  `;
139
151
 
140
152
  test('content:check warns when carousel images use different aspect ratios', async () => {
@@ -156,7 +168,7 @@ test('content:check warns when carousel images use different aspect ratios', asy
156
168
 
157
169
  assert.equal(result.status, 0, output);
158
170
  assert.match(output, /^Content check completed with warnings\./m);
159
- assert.match(output, /Carousel on line 5 uses images with different aspect ratios: wide\.png \(4:3\), wider\.png \(2:1\)\./);
171
+ assert.match(output, /Carousel on line 7 uses images with different aspect ratios: wide\.png \(4:3\), wider\.png \(2:1\)\./);
160
172
  assert.match(output, /Use images with exactly matching proportions in the same carousel/);
161
173
  });
162
174
  });
@@ -170,10 +182,7 @@ presentation:
170
182
  `;
171
183
 
172
184
  const inlineStyleSite = `---
173
- sections:
174
- - id: intro
175
- gallery: []
176
-
185
+ title: Inline Style
177
186
  ---
178
187
  ## Intro {#intro}
179
188
  This has [known text]{.highlight} and [unknown text]{.missing}.
@@ -190,7 +199,7 @@ test('content:check fails when Markdown uses undefined inline styles', async ()
190
199
 
191
200
  assert.equal(result.status, 1, output);
192
201
  assert.match(output, /^Content check failed\./m);
193
- assert.match(output, /Inline style "\.missing" is used in Markdown but is not defined in site\/theme\.md presentation\.inlineStyles\./);
202
+ assert.match(output, /Inline style "\.missing" is used in site\/content\.md but is not defined in site\/theme\.md presentation\.inlineStyles\./);
194
203
  assert.doesNotMatch(output, /"\.highlight" is used in Markdown/);
195
204
  });
196
205
  });
@@ -203,8 +212,7 @@ presentation:
203
212
  body:
204
213
  paragraphSpacing: 0.3em
205
214
  sections:
206
- - id: intro
207
- gallery: []
215
+ intro: {}
208
216
 
209
217
  ---
210
218
  ## Intro {#intro}
@@ -234,8 +242,7 @@ presentation:
234
242
  body:
235
243
  paragraphSpacing: 0.3em
236
244
  sections:
237
- - id: intro
238
- gallery: []
245
+ intro: {}
239
246
 
240
247
  ---
241
248
  ## Intro {#intro}
@@ -261,7 +268,7 @@ const topLevelGallerySite = `---
261
268
  title: Example
262
269
  description: Example site.
263
270
  sections:
264
- - id: intro
271
+ intro: {}
265
272
  gallery:
266
273
  - image: intro.jpg
267
274
 
@@ -281,7 +288,7 @@ test('content:check explains likely misindented frontmatter keys', async () => {
281
288
  assert.equal(result.status, 1, output);
282
289
  assert.match(output, /^Content check failed\./m);
283
290
  assert.match(output, /Frontmatter line 6 defines "gallery" at the top level, but it is not a valid top-level content field\./);
284
- assert.match(output, /Indent "gallery:" under the section or object it belongs to\./);
291
+ assert.match(output, /Indent "gallery:" under the object it belongs to, or move image content into Norna Markdown blocks\./);
285
292
  });
286
293
  });
287
294
 
@@ -304,18 +311,25 @@ test('content:check respects NORNA_SITE_DIR', async () => {
304
311
 
305
312
  const movableSite = `---
306
313
  sections:
307
- - id: min-konst
308
- gallery:
309
- - image: move-me.jpg
310
- - id: mitt-hem
311
- gallery:
312
- - image: home.jpg
314
+ min-konst: {}
315
+ mitt-hem: {}
313
316
 
314
317
  ---
315
318
  ## Min konst {#min-konst}
316
319
  Text.
320
+
321
+ \`\`\`norna-image-stack
322
+ - image: move-me.jpg
323
+ alt: Move me
324
+ \`\`\`
325
+
317
326
  ## Mitt hem {#mitt-hem}
318
327
  Text.
328
+
329
+ \`\`\`norna-image-stack
330
+ - image: home.jpg
331
+ alt: Home
332
+ \`\`\`
319
333
  `;
320
334
 
321
335
  test('content:sync moves referenced images and keeps unreferenced images in place', async () => {
@@ -340,7 +354,7 @@ test('content:sync moves referenced images and keeps unreferenced images in plac
340
354
  const checkOutput = getOutput(checkResult);
341
355
 
342
356
  assert.equal(checkResult.status, 0, checkOutput);
343
- assert.match(checkOutput, /Content check passed\./);
357
+ assert.match(checkOutput, /Content check completed with warnings\./);
344
358
  assert.match(checkOutput, /site\/images\/mitt-hem\/unreferenced\.jpg/);
345
359
  });
346
360
  });