@janga/norna 0.7.22 → 0.7.24

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 (88) hide show
  1. package/README.md +14 -18
  2. package/astro.config.mjs +15 -0
  3. package/bin/norna-cli.mjs +8 -2
  4. package/package.json +28 -3
  5. package/schemas/category.schema.json +2 -2
  6. package/schemas/config.schema.json +52 -24
  7. package/schemas/content-frontmatter.schema.json +25 -5
  8. package/schemas/page-theme.schema.json +53 -25
  9. package/schemas/sitewide-content.schema.json +19 -18
  10. package/schemas/theme.schema.json +385 -252
  11. package/scripts/build-site.mjs +1 -0
  12. package/scripts/check-config.mjs +36 -5
  13. package/scripts/deploy-site.mjs +0 -1
  14. package/scripts/dev-local.mjs +175 -112
  15. package/scripts/generate-search-index.mjs +57 -0
  16. package/scripts/init-site.mjs +1 -0
  17. package/scripts/lib/code-fence-metadata.mjs +223 -0
  18. package/scripts/lib/content-sync-apply.mjs +34 -0
  19. package/scripts/lib/content-sync-plan.mjs +179 -0
  20. package/scripts/lib/edit-source-link.mjs +49 -0
  21. package/scripts/lib/editor-language-service.mjs +160 -12
  22. package/scripts/lib/heading-ids.mjs +1 -1
  23. package/scripts/lib/image-presentation.mjs +6 -0
  24. package/scripts/lib/markdown-links.mjs +182 -0
  25. package/scripts/lib/navigation-model.mjs +44 -12
  26. package/scripts/lib/navigation-review.mjs +396 -0
  27. package/scripts/lib/norna-markdown-blocks.mjs +74 -26
  28. package/scripts/lib/norna-markdown-render-plugin.mjs +64 -1
  29. package/scripts/lib/page-aliases.mjs +184 -0
  30. package/scripts/lib/page-markdown.mjs +88 -7
  31. package/scripts/lib/page-move-plan.mjs +659 -0
  32. package/scripts/lib/presentation-palette-metadata.mjs +1 -1
  33. package/scripts/lib/presentation.mjs +10 -37
  34. package/scripts/lib/project-config.mjs +146 -19
  35. package/scripts/lib/public-asset-conventions.mjs +36 -2
  36. package/scripts/lib/schema-definitions.mjs +43 -15
  37. package/scripts/lib/schema-editor-metadata.mjs +60 -32
  38. package/scripts/lib/schema-value-definitions.mjs +6 -2
  39. package/scripts/lib/semantic-callouts.mjs +128 -0
  40. package/scripts/lib/site-content.mjs +28 -5
  41. package/scripts/lib/site-link-graph.mjs +357 -0
  42. package/scripts/lib/site-navigation-tree.mjs +85 -0
  43. package/scripts/lib/site-page-urls.mjs +10 -0
  44. package/scripts/lib/sitemap.mjs +34 -0
  45. package/scripts/lib/social-image-assets.mjs +30 -0
  46. package/scripts/lib/theme-presets.mjs +53 -25
  47. package/scripts/lib/theme-profiles.mjs +6 -8
  48. package/scripts/lib/yaml-config.mjs +6 -2
  49. package/scripts/move-site-page.mjs +256 -0
  50. package/scripts/review-navigation.mjs +32 -0
  51. package/scripts/sync-content-sections.mjs +182 -216
  52. package/scripts/sync-site-public.mjs +43 -3
  53. package/src/components/CodeBlockCopyScript.astro +97 -0
  54. package/src/components/DisplaySettings.astro +4 -4
  55. package/src/components/EditSourceLink.astro +17 -0
  56. package/src/components/ImageCarousel.astro +6 -3
  57. package/src/components/NavigationPageTree.astro +81 -86
  58. package/src/components/NavigationTreeControls.astro +77 -0
  59. package/src/components/PageAliasRedirect.astro +49 -0
  60. package/src/components/PageContentsNavigation.astro +21 -0
  61. package/src/components/PageList.astro +33 -0
  62. package/src/components/PageSequenceNavigation.astro +37 -0
  63. package/src/components/SearchPage.astro +151 -0
  64. package/src/components/SectionNavigationScript.astro +62 -6
  65. package/src/components/SiteNavigation.astro +50 -11
  66. package/src/components/SitePage.astro +113 -20
  67. package/src/components/SiteSection.astro +16 -3
  68. package/src/components/SiteTreeNavigation.astro +8 -2
  69. package/src/components/TreeNavigationScript.astro +207 -26
  70. package/src/content.config.ts +5 -2
  71. package/src/layouts/BaseLayout.astro +71 -10
  72. package/src/lib/readerPreferencesScript.mjs +2 -2
  73. package/src/lib/sectionContent.ts +32 -3
  74. package/src/lib/siteNavigation.ts +31 -52
  75. package/src/lib/sitePages.ts +3 -2
  76. package/src/lib/sitePublicAssets.ts +1 -0
  77. package/src/pages/404.astro +110 -0
  78. package/src/pages/[...slug].astro +45 -8
  79. package/src/styles/content.css +718 -0
  80. package/src/styles/foundations.css +284 -0
  81. package/src/styles/global.css +6 -2510
  82. package/src/styles/media.css +518 -0
  83. package/src/styles/navigation.css +526 -0
  84. package/src/styles/page-layout.css +786 -0
  85. package/src/styles/responsive.css +594 -0
  86. package/starters/basic/README.md +6 -19
  87. package/starters/basic/package.json +1 -0
  88. package/starters/basic/site/pages/000-home/content.md +13 -50
@@ -0,0 +1,594 @@
1
+ /* Responsive and forced-colors adaptations, kept last in the cascade. */
2
+
3
+ @media (max-width: 700px) {
4
+ :root {
5
+ --space-nav-to-first-section: var(--space-nav-to-first-section-mobile);
6
+ --space-content-block-gap: var(--space-content-block-gap-mobile);
7
+ --space-heading-to-block: var(--space-heading-to-block-mobile);
8
+ --space-image-item: var(--space-image-item-mobile);
9
+ --space-section-to-section: var(--space-section-to-section-mobile);
10
+ --space-page-title-to-first-section: var(--space-page-title-to-first-section-mobile);
11
+ --space-final-section-bottom: var(--space-final-section-bottom-mobile);
12
+ --content-gutter: var(--content-gutter-mobile);
13
+ --image-max-available-width: var(--image-max-available-width-mobile);
14
+ --image-max-height: var(--image-max-height-mobile);
15
+ --site-top-anchor-offset: 6.25rem;
16
+ }
17
+
18
+ .image-carousel {
19
+ --image-carousel-width-from-height: var(--image-carousel-width-from-height-mobile, var(--image-layout-width));
20
+ }
21
+
22
+ .site-nav-row {
23
+ width: min(calc(100% - (var(--content-gutter) * 2)), var(--page-width));
24
+ padding: 0.75rem 0;
25
+ }
26
+
27
+ .site-nav-row-mobile-only {
28
+ display: flex;
29
+ }
30
+
31
+ .site-brand {
32
+ max-width: min(70vw, 26rem);
33
+ font-size: 0.76rem;
34
+ overflow-wrap: anywhere;
35
+ }
36
+
37
+ .site-brand-logo {
38
+ height: min(var(--site-brand-logo-height, 2.6rem), 2.15rem);
39
+ max-width: min(48vw, 13rem);
40
+ }
41
+
42
+ .site-nav {
43
+ display: none;
44
+ }
45
+
46
+ .display-settings {
47
+ position: static;
48
+ }
49
+
50
+ .display-settings-panel {
51
+ top: calc(100% + 0.35rem);
52
+ right: max(var(--content-gutter), env(safe-area-inset-right, 0px));
53
+ left: max(var(--content-gutter), env(safe-area-inset-left, 0px));
54
+ width: auto;
55
+ max-height: calc(
56
+ 100dvh - 100% - max(var(--content-gutter), env(safe-area-inset-bottom, 0px)) - 0.35rem
57
+ );
58
+ }
59
+
60
+ .mobile-nav-menu {
61
+ display: block;
62
+ position: relative;
63
+ flex: 0 0 auto;
64
+ margin-left: auto;
65
+ }
66
+
67
+ .page-nav {
68
+ display: none;
69
+ }
70
+
71
+ .page-nav.page-nav-title-only {
72
+ display: block;
73
+ }
74
+
75
+ .mobile-nav-menu > summary {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 0.5rem;
79
+ min-height: 2.75rem;
80
+ border: 1px solid currentColor;
81
+ padding: 0.55rem 0.75rem;
82
+ font-size: 0.72rem;
83
+ font-weight: 700;
84
+ letter-spacing: 0.1em;
85
+ line-height: 1;
86
+ list-style: none;
87
+ color: var(--site-top-text-color, var(--color-primary-text));
88
+ text-transform: uppercase;
89
+ }
90
+
91
+ .mobile-nav-menu > summary::after {
92
+ content: "☰";
93
+ font-size: 1rem;
94
+ line-height: 1;
95
+ opacity: 0.86;
96
+ }
97
+
98
+ .mobile-nav-menu[open] > summary::after {
99
+ content: "×";
100
+ font-size: 1.25rem;
101
+ }
102
+
103
+ .mobile-nav-menu > summary::-webkit-details-marker {
104
+ display: none;
105
+ }
106
+
107
+ .mobile-nav-panel {
108
+ position: fixed;
109
+ top: var(--site-top-anchor-offset);
110
+ right: 0;
111
+ bottom: 0;
112
+ left: 0;
113
+ width: 100%;
114
+ max-height: none;
115
+ border-top: 1px solid color-mix(in srgb, currentColor 24%, transparent);
116
+ padding: clamp(1.25rem, 5vw, 2rem) var(--content-gutter) max(1.5rem, env(safe-area-inset-bottom));
117
+ background: var(--site-top-background-color, var(--color-page));
118
+ box-shadow: 0 1.5rem 3.5rem rgb(0 0 0 / 0.32);
119
+ color: var(--site-top-text-color, var(--color-text));
120
+ overflow-y: auto;
121
+ overscroll-behavior: contain;
122
+ }
123
+
124
+ .mobile-site-nav {
125
+ width: min(100%, 32rem);
126
+ margin: 0 auto;
127
+ }
128
+
129
+ .mobile-nav-panel h2 {
130
+ margin: 0 0 1.25rem;
131
+ font-size: clamp(1.25rem, 5vw, 1.55rem);
132
+ font-weight: 650;
133
+ letter-spacing: 0;
134
+ line-height: 1.2;
135
+ text-transform: none;
136
+ }
137
+
138
+ .mobile-nav-panel .navigation-tree-controls {
139
+ position: static;
140
+ margin-bottom: 1rem;
141
+ padding-bottom: 1rem;
142
+ background: var(--site-top-background-color, var(--color-page));
143
+ }
144
+
145
+ .mobile-nav-panel .navigation-tree-filter > input {
146
+ min-height: 2.75rem;
147
+ font-size: 0.9rem;
148
+ }
149
+
150
+ .mobile-nav-panel .navigation-tree-commands > button {
151
+ width: 2.75rem;
152
+ height: 2.75rem;
153
+ background: var(--site-top-background-color, var(--color-page));
154
+ }
155
+
156
+ .mobile-nav-panel .navigation-tree-commands svg {
157
+ width: 1.15rem;
158
+ height: 1.15rem;
159
+ }
160
+
161
+ .mobile-nav-panel :is(ul, ol) {
162
+ display: grid;
163
+ gap: 0;
164
+ margin: 0;
165
+ padding: 0;
166
+ list-style: none;
167
+ }
168
+
169
+ .navigation-page-tree-mobile > .navigation-page-node {
170
+ border-top: 1px solid color-mix(in srgb, currentColor 14%, transparent);
171
+ }
172
+
173
+ .navigation-page-tree-mobile > .navigation-page-node:first-child {
174
+ border-top: 0;
175
+ }
176
+
177
+ .navigation-page-tree-mobile .navigation-page-link {
178
+ display: flex;
179
+ align-items: center;
180
+ width: 100%;
181
+ min-height: 3.25rem;
182
+ padding: 0.75rem 2.5rem 0.75rem 0;
183
+ color: var(--color-secondary-text);
184
+ font-size: 0.94rem;
185
+ letter-spacing: 0;
186
+ line-height: 1.35;
187
+ text-decoration: none;
188
+ text-transform: none;
189
+ }
190
+
191
+ .navigation-page-tree-mobile
192
+ .navigation-page-disclosure.navigation-category-disclosure
193
+ > .navigation-page-summary {
194
+ position: static;
195
+ display: flex;
196
+ align-items: center;
197
+ justify-content: space-between;
198
+ width: 100%;
199
+ height: auto;
200
+ min-height: 3.25rem;
201
+ padding: 0.75rem 0;
202
+ font-size: 0.94rem;
203
+ line-height: 1.35;
204
+ color: var(--color-secondary-text);
205
+ }
206
+
207
+ .navigation-page-tree-mobile
208
+ .navigation-page-node-page-disclosure {
209
+ display: grid;
210
+ grid-template-columns: 2.5rem minmax(0, 1fr);
211
+ }
212
+
213
+ .navigation-page-tree-mobile
214
+ .navigation-page-node-page-disclosure
215
+ > .navigation-page-disclosure
216
+ > .navigation-page-summary {
217
+ position: static;
218
+ display: grid;
219
+ place-items: center;
220
+ width: 100%;
221
+ height: auto;
222
+ min-height: 3.25rem;
223
+ padding: 0;
224
+ color: var(--color-secondary-text);
225
+ }
226
+
227
+ .navigation-page-tree-mobile .navigation-page-node-page-disclosure > .navigation-page-open-link {
228
+ position: static;
229
+ grid-column: 2;
230
+ grid-row: 1;
231
+ display: flex;
232
+ align-items: center;
233
+ min-height: 3.25rem;
234
+ width: 100%;
235
+ padding: 0.75rem 0;
236
+ font-size: 0.94rem;
237
+ line-height: 1.35;
238
+ color: var(--color-secondary-text);
239
+ overflow-wrap: anywhere;
240
+ }
241
+
242
+ .navigation-page-tree-mobile .navigation-page-disclosure > .navigation-page-summary:hover,
243
+ .navigation-page-tree-mobile .navigation-page-disclosure > .navigation-page-summary:focus-visible,
244
+ .navigation-page-node-current > .navigation-page-disclosure > .navigation-page-summary {
245
+ background: transparent;
246
+ color: var(--color-primary-text);
247
+ }
248
+
249
+ .navigation-page-tree-mobile .navigation-page-disclosure > .navigation-page-summary:hover > :first-child,
250
+ .navigation-page-tree-mobile .navigation-page-disclosure > .navigation-page-summary:focus-visible > :first-child,
251
+ .navigation-page-node-current > .navigation-page-disclosure > .navigation-page-summary > :first-child {
252
+ text-decoration: underline;
253
+ text-decoration-thickness: 1px;
254
+ text-underline-offset: 0.3em;
255
+ }
256
+
257
+ .navigation-page-chevron::before {
258
+ display: block;
259
+ content: "›";
260
+ font-size: 1.25rem;
261
+ line-height: 1;
262
+ transition: transform 140ms ease;
263
+ }
264
+
265
+ .navigation-page-disclosure[open] > .navigation-page-summary .navigation-page-chevron::before {
266
+ transform: rotate(90deg);
267
+ }
268
+
269
+ .navigation-page-tree-mobile .navigation-page-disclosure > .navigation-page-summary > [aria-hidden='true']::before,
270
+ .navigation-page-tree-mobile .navigation-page-disclosure[open] > .navigation-page-summary > [aria-hidden='true']::before {
271
+ content: "›";
272
+ }
273
+
274
+ .navigation-page-tree-mobile .navigation-page-branch-content {
275
+ grid-column: 1 / -1;
276
+ margin-left: 0.35rem;
277
+ border-left: 1px solid color-mix(in srgb, currentColor 20%, transparent);
278
+ padding-left: 1rem;
279
+ }
280
+
281
+ .navigation-page-tree-mobile .navigation-page-sections {
282
+ margin: 0 0 0.45rem;
283
+ }
284
+
285
+ .navigation-page-tree-mobile .navigation-page-sections-disclosure > summary {
286
+ top: 0;
287
+ right: 0;
288
+ left: auto;
289
+ width: 2.5rem;
290
+ height: 3.25rem;
291
+ }
292
+
293
+ .navigation-page-branch-content > .navigation-page-tree-mobile > .navigation-page-node {
294
+ border-top: 1px solid color-mix(in srgb, currentColor 10%, transparent);
295
+ }
296
+
297
+ .navigation-page-tree-mobile .navigation-page-link:hover,
298
+ .navigation-page-tree-mobile .navigation-page-link:focus-visible,
299
+ .navigation-page-tree-mobile .navigation-page-link[aria-current='page'] {
300
+ color: var(--color-primary-text);
301
+ text-decoration: underline;
302
+ text-decoration-thickness: 1px;
303
+ text-underline-offset: 0.3em;
304
+ }
305
+
306
+ .page-contents-links-mobile {
307
+ margin-top: 0.25rem;
308
+ }
309
+
310
+ .page-contents-links-mobile > li {
311
+ border-bottom: 1px solid color-mix(in srgb, currentColor 12%, transparent);
312
+ }
313
+
314
+ .page-contents-links-mobile li + li {
315
+ margin-top: 0;
316
+ }
317
+
318
+ .page-contents-links-mobile ol {
319
+ border-left: 1px solid color-mix(in srgb, currentColor 16%, transparent);
320
+ padding-left: 1rem;
321
+ }
322
+
323
+ .page-contents-links-mobile a {
324
+ min-height: 3.2rem;
325
+ padding: 0.85rem 0;
326
+ font-size: 0.92rem;
327
+ color: var(--color-secondary-text);
328
+ }
329
+
330
+ .mobile-nav-panel a {
331
+ font-family: inherit;
332
+ font-size: 0.94rem;
333
+ letter-spacing: 0;
334
+ line-height: 1.35;
335
+ text-transform: none;
336
+ }
337
+
338
+ .mobile-nav-view + .mobile-nav-view {
339
+ margin-top: 2rem;
340
+ }
341
+
342
+ .mobile-nav-sections {
343
+ border-top: 1px solid color-mix(in srgb, currentColor 16%, transparent);
344
+ }
345
+
346
+ .mobile-nav-sections li {
347
+ border-bottom: 1px solid color-mix(in srgb, currentColor 12%, transparent);
348
+ }
349
+
350
+ .mobile-nav-sections a {
351
+ min-height: 3.2rem;
352
+ padding: 0.85rem 0;
353
+ font-size: 0.92rem;
354
+ color: var(--color-secondary-text);
355
+ }
356
+
357
+ .mobile-nav-sections .mobile-nav-page-top {
358
+ font-weight: 650;
359
+ }
360
+
361
+ .mobile-nav-sections li:not(.mobile-nav-page-top-item) a {
362
+ padding-left: 1rem;
363
+ }
364
+
365
+ .mobile-nav-sections a:hover,
366
+ .mobile-nav-sections a:focus-visible,
367
+ .mobile-nav-sections a[aria-current='location'] {
368
+ color: var(--color-primary-text);
369
+ text-decoration: underline;
370
+ text-decoration-thickness: 1px;
371
+ text-underline-offset: 0.25em;
372
+ }
373
+
374
+ .mobile-navigation-open {
375
+ overflow: hidden;
376
+ }
377
+
378
+ .site-content {
379
+ width: min(calc(100% - (var(--content-gutter) * 2)), var(--page-width));
380
+ }
381
+
382
+ .site-page-layout-tree {
383
+ display: block;
384
+ width: 100%;
385
+ }
386
+
387
+ .site-page-layout-tree > .site-content {
388
+ width: min(calc(100% - (var(--content-gutter) * 2)), var(--page-width));
389
+ }
390
+
391
+ .site-page-layout-tree .site-section::before {
392
+ left: calc(50% - 50vw);
393
+ right: calc(50% - 50vw);
394
+ }
395
+
396
+ .tree-local-navigation {
397
+ display: none;
398
+ }
399
+
400
+ .page-contents-navigation {
401
+ display: none;
402
+ }
403
+
404
+ .page-sequence-navigation {
405
+ grid-template-columns: 1fr;
406
+ }
407
+
408
+ .page-sequence-empty {
409
+ display: none;
410
+ }
411
+
412
+ .site-banners {
413
+ width: min(calc(100% - 2rem), var(--page-width));
414
+ padding-top: 0.75rem;
415
+ }
416
+
417
+ .site-footer {
418
+ width: min(calc(100% - 2rem), 34rem);
419
+ }
420
+
421
+ .site-section + .site-section {
422
+ margin-top: 0;
423
+ }
424
+
425
+ .section-body {
426
+ width: 100%;
427
+ line-height: 1.72;
428
+ }
429
+
430
+ .section-header h1,
431
+ .section-header h2 {
432
+ font-size: var(
433
+ --section-heading-font-size-mobile,
434
+ var(--section-heading-font-size-desktop, clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem))
435
+ );
436
+ }
437
+
438
+ .section-header {
439
+ width: min(
440
+ 100%,
441
+ var(
442
+ --reader-text-width,
443
+ var(--section-heading-width-mobile, var(--section-heading-width-desktop, 760px))
444
+ )
445
+ );
446
+ text-align: var(--section-heading-align-mobile, var(--section-heading-align-desktop, center));
447
+ }
448
+
449
+ .section-markdown {
450
+ width: min(
451
+ 100%,
452
+ var(--reader-text-width, var(--section-body-width-mobile, var(--section-body-width-desktop, var(--text-width))))
453
+ );
454
+ font-size: var(
455
+ --section-body-font-size-mobile,
456
+ var(--section-body-font-size-desktop, clamp(0.96rem, 0.94rem + 0.08vw, 1rem))
457
+ );
458
+ text-align: var(--section-body-align-mobile, var(--section-body-align-desktop, left));
459
+ }
460
+
461
+ .image-meta {
462
+ font-size: var(--section-caption-font-size-mobile, var(--section-caption-font-size-desktop, 0.95rem));
463
+ text-align: var(--section-caption-align-mobile, var(--section-caption-align-desktop, center));
464
+ }
465
+
466
+ .image-details {
467
+ justify-content: var(--section-caption-justify-mobile, var(--section-caption-justify-desktop, center));
468
+ }
469
+
470
+ .section-markdown h3 {
471
+ font-size: var(--section-markdown-h3-font-size-mobile, var(--section-markdown-h3-font-size-desktop, 0.82rem));
472
+ text-align: var(--section-markdown-h3-align-mobile, var(--section-markdown-h3-align-desktop, left));
473
+ }
474
+
475
+ .section-markdown h4 {
476
+ font-size: var(--section-markdown-h4-font-size-mobile, var(--section-markdown-h4-font-size-desktop, clamp(0.96rem, 0.94rem + 0.08vw, 1rem)));
477
+ text-align: var(--section-markdown-h4-align-mobile, var(--section-markdown-h4-align-desktop, left));
478
+ }
479
+
480
+ .card-list-layout-image-left .card-list-item-has-image,
481
+ .card-list-layout-image-right .card-list-item-has-image,
482
+ .card-list-layout-image-left .card-list-item-has-image .card-list-link,
483
+ .card-list-layout-image-right .card-list-item-has-image .card-list-link {
484
+ grid-template-columns: 1fr;
485
+ }
486
+
487
+ .card-list-layout-image-right .card-list-image-frame {
488
+ order: 0;
489
+ }
490
+
491
+ .section-markdown ul,
492
+ .section-markdown ol {
493
+ display: block;
494
+ }
495
+
496
+ .managed-image-item img {
497
+ max-height: var(--image-max-height);
498
+ }
499
+
500
+ .image-carousel-position {
501
+ position: absolute;
502
+ right: 0.5rem;
503
+ bottom: 0.5rem;
504
+ min-width: 3rem;
505
+ min-height: 1.75rem;
506
+ padding: 0.3rem 0.55rem;
507
+ font-size: 0.75rem;
508
+ }
509
+
510
+ :is(.image-stack, .managed-images) {
511
+ gap: var(--space-image-item);
512
+ }
513
+
514
+ .image-details {
515
+ padding: 0 0.25rem;
516
+ font-size: 1rem;
517
+ }
518
+ }
519
+
520
+ @media (forced-colors: active) {
521
+ :root,
522
+ :root[data-appearance='dark'],
523
+ :root[data-appearance='system'] {
524
+ --color-page: Canvas;
525
+ --color-primary-text: CanvasText;
526
+ --color-secondary-text: CanvasText;
527
+ --color-link-text: LinkText;
528
+ --color-text: CanvasText;
529
+ --color-muted: CanvasText;
530
+ --color-accent: LinkText;
531
+ --color-surface: Canvas;
532
+ --color-soft: CanvasText;
533
+ --color-border: CanvasText;
534
+ --color-nav-separator: CanvasText;
535
+ --color-frame-background: Canvas;
536
+ --color-frame-text: CanvasText;
537
+ --color-surface-base-background: Canvas;
538
+ --color-surface-base-text: CanvasText;
539
+ --color-surface-base-secondary-text: CanvasText;
540
+ --color-surface-soft-background: Canvas;
541
+ --color-surface-soft-text: CanvasText;
542
+ --color-surface-soft-secondary-text: CanvasText;
543
+ --color-surface-emphasis-background: Canvas;
544
+ --color-surface-emphasis-text: CanvasText;
545
+ --color-surface-emphasis-secondary-text: CanvasText;
546
+ --color-focus-ring: Highlight;
547
+ --color-focus-ring-contrast: Canvas;
548
+ --color-selection-background: Highlight;
549
+ --color-selection-text: HighlightText;
550
+ --color-control-background: ButtonFace;
551
+ --color-control-background-active: Highlight;
552
+ --color-control-text: ButtonText;
553
+ --color-code-background: Canvas;
554
+ --color-code-text: CanvasText;
555
+ --color-warning-accent: Highlight;
556
+ --color-warning-surface: Canvas;
557
+ --color-warning-text: CanvasText;
558
+ --color-error-accent: Highlight;
559
+ --color-error-surface: Canvas;
560
+ --color-error-text: CanvasText;
561
+ --color-success-accent: Highlight;
562
+ --color-success-surface: Canvas;
563
+ --color-success-text: CanvasText;
564
+ }
565
+
566
+ .display-settings-panel,
567
+ .mobile-nav-panel,
568
+ .site-nav-submenu > nav,
569
+ .norna-callout,
570
+ .norna-code-example,
571
+ .card-list-item,
572
+ .page-sequence-link,
573
+ .image-carousel-button,
574
+ .image-carousel-position {
575
+ border: 1px solid CanvasText;
576
+ box-shadow: none;
577
+ }
578
+
579
+ :is(.display-settings button, .display-settings-segmented span, .mobile-nav-menu > summary, .site-banner-dismiss) {
580
+ border-color: ButtonText;
581
+ background: ButtonFace;
582
+ color: ButtonText;
583
+ }
584
+
585
+ .norna-code-line-highlighted {
586
+ border-inline-start-color: Highlight !important;
587
+ background: Canvas !important;
588
+ }
589
+
590
+ :is(.display-settings-segmented input:checked + span, .image-carousel-button:hover:not(:disabled)) {
591
+ background: Highlight;
592
+ color: HighlightText;
593
+ }
594
+ }
@@ -1,4 +1,4 @@
1
- # norna Starter
1
+ # Norna Starter
2
2
 
3
3
  This is a minimal site repository starter for `@janga/norna`.
4
4
 
@@ -9,11 +9,8 @@ npm install
9
9
  npm run norna:dev
10
10
  ```
11
11
 
12
- If the standard local port is blocked, start with:
13
-
14
- ```sh
15
- npm run norna:dev -- --kill
16
- ```
12
+ Open the address printed by the development server. Stop it later with
13
+ `npm run norna:dev:stop`.
17
14
 
18
15
  Edit shared logo settings, banners, and footer in
19
16
  `site/sitewide-content.yaml`,
@@ -63,16 +60,6 @@ still selects this project's locally installed Norna version.
63
60
  Use `npm run norna:engine:version` to inspect the installed engine and
64
61
  `npm run norna:engine:update` to update it.
65
62
 
66
- Generic documentation lives in the `norna` repository:
67
-
68
- - `docs/README.md`
69
- - `docs/site-files.md`
70
- - `docs/public-files.md`
71
- - `docs/content.md`
72
- - `docs/theme.md`
73
- - `docs/typography.md`
74
- - `docs/pages.md`
75
- - `docs/configuration.md`
76
- - `docs/commands.md`
77
- - `docs/images-and-metadata.md`
78
- - `docs/publishing.md`
63
+ Start with the [illustrated Getting Started guide](https://janga.github.io/norna/getting-started/install-norna/).
64
+ Use the [Markdown reference index](https://github.com/janga/norna/blob/main/docs/README.md)
65
+ for exact file contracts, syntax, commands, and publishing behavior.
@@ -14,6 +14,7 @@
14
14
  "norna:config:check": "norna config:check",
15
15
  "norna:content:check": "norna content:check",
16
16
  "norna:sync": "norna content:sync",
17
+ "norna:navigation:review": "norna navigation:review",
17
18
  "norna:theme:presets": "norna theme:presets",
18
19
  "norna:theme:export": "norna theme:export",
19
20
  "norna:typography:profiles": "norna typography profiles",
@@ -1,57 +1,20 @@
1
1
  ---
2
2
  page:
3
- description: Minimal norna starter site.
3
+ description: A new site created with Norna.
4
4
  ---
5
5
 
6
- # Example Site
6
+ # My Site
7
7
 
8
+ This is a new Norna site. Replace this introduction with a short description
9
+ of what visitors can find here.
8
10
 
9
- ## Intro {#intro}
10
- This is a minimal starter site for norna. Since this site doesn't have any
11
- pages defined, the navigation menu will be a sticky bar with anchor links for
12
- ease of use on phones etc. **Highlighted inline text** when a short
13
- phrase needs emphasis
14
- ## Work {#work}
15
- Add Norna image blocks in Markdown where the images should appear. Put
16
- matching source images directly under `images/`.
11
+ ## Welcome
17
12
 
18
- ````
19
- ```norna-image-stack
20
- - image: example.jpg
21
- caption: Replace this with a real image and caption.
22
- ```
23
- ````
24
- ## What is Lorem Ipsum? {#lorem1}
25
- Lorem Ipsum is simply dummy text of the printing and typesetting
26
- industry. Lorem Ipsum has been the industry's standard dummy text ever
27
- since 1966, when designers at Letraset and James Mosley, the librarian
28
- at St Bride Printing Library in London, took a 1914 Cicero translation
29
- and scrambled it to make dummy text for Letraset's Body Type
30
- sheets. It has survived not only many decades, but also the leap into
31
- electronic typesetting, remaining essentially unchanged. It was
32
- popularised thanks to these sheets and more recently with desktop
33
- publishing software like Aldus PageMaker and Microsoft Word including
34
- versions of Lorem Ipsum.
35
- ## Why do we use it? {#lorem2}
36
- It is a long established fact that a reader will be distracted by the
37
- readable content of a page when looking at its layout. The point of
38
- using Lorem Ipsum is that it has a more-or-less normal distribution of
39
- letters, as opposed to using 'Content here, content here', making it
40
- look like readable English. Many desktop publishing packages and web
41
- page editors now use Lorem Ipsum as their default model text, and a
42
- search for 'lorem ipsum' will uncover many web sites still in their
43
- infancy. Various versions have evolved over the years, sometimes by
44
- accident, sometimes on purpose (injected humour and the like).
45
- ## Where does it come from? {#lorem3}
46
- Contrary to popular belief, Lorem Ipsum is not simply random text. It
47
- has roots in a piece of classical Latin literature from 45 BC, making
48
- it over 2000 years old. Richard McClintock, a Latin professor at
49
- Hampden-Sydney College in Virginia, looked up one of the more obscure
50
- Latin words, consectetur, from a Lorem Ipsum passage, and going
51
- through the cites of the word in classical literature, discovered the
52
- undoubtable source. Lorem Ipsum comes from sections 1.10.32 and
53
- 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and
54
- Evil) by Cicero, written in 45 BC. This book is a treatise on the
55
- theory of ethics, very popular during the Renaissance. The first line
56
- of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in
57
- section 1.10.32
13
+ Edit this page in `site/pages/000-home/content.md`. Every H2 starts a section
14
+ and becomes a destination in this one-page site's navigation.
15
+
16
+ ## Next steps
17
+
18
+ Add your own text, then choose a preset in `site/theme.yaml`. Put local images
19
+ in this page's `images/` directory and reference them through a Norna image
20
+ block when the site needs them.