@janga/norna 0.7.0 → 0.7.2
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.
- package/README.md +18 -4
- package/astro.config.mjs +2 -0
- package/bin/norna-cli.mjs +170 -0
- package/bin/norna.mjs +149 -150
- package/docs/README.md +36 -16
- package/docs/commands.md +18 -5
- package/docs/configuration.md +37 -2
- package/docs/content.md +98 -257
- package/docs/{command-organization.md → design/command-organization.md} +9 -5
- package/docs/{site-examples-structure-note.md → design/site-examples-structure.md} +17 -22
- package/docs/engine-development.md +33 -5
- package/docs/getting-started.md +40 -4
- package/docs/local-development.md +13 -0
- package/docs/publishing.md +23 -0
- package/docs/routes.md +90 -0
- package/docs/site-structure.md +15 -8
- package/docs/theme.md +150 -0
- package/docs/typography.md +125 -0
- package/examples/dog-gallery/site/.norna/generated-images.json +226 -0
- package/examples/dog-gallery/site/config.mjs +97 -0
- package/examples/dog-gallery/site/content.md +146 -0
- package/examples/dog-gallery/site/images/black-dogs/black-puppy-meadow.png +0 -0
- package/examples/dog-gallery/site/images/black-dogs/photo-of-a-black-dog.jpg +0 -0
- package/examples/dog-gallery/site/images/brown-dogs/brown-dog.jpg +0 -0
- package/examples/dog-gallery/site/images/brown-dogs/dog-accompanies-master.jpg +0 -0
- package/examples/dog-gallery/site/images/golden-dogs/golden-retriever.jpg +0 -0
- package/examples/dog-gallery/site/images/golden-dogs/toller-puppy.jpg +0 -0
- package/examples/dog-gallery/site/images/white-dogs/white-cute-dog.jpg +0 -0
- package/examples/dog-gallery/site/images/white-dogs/white-puppy-garden.png +0 -0
- package/examples/dog-gallery/site/public/favicon.svg +7 -0
- package/examples/dog-gallery/site/public/robots.txt +2 -0
- package/examples/dog-gallery/site/routes/dog-care/route-content.md +35 -0
- package/examples/dog-gallery/site/theme.md +55 -0
- package/fixtures/basic/site/config.mjs +1 -0
- package/package.json +8 -7
- package/scripts/check-config.mjs +1 -0
- package/scripts/dev-local.mjs +64 -15
- package/scripts/init-site.mjs +1 -1
- package/scripts/lib/project-config.mjs +22 -0
- package/scripts/lib/site-content.mjs +2 -1
- package/scripts/lib/site-paths.mjs +18 -3
- package/scripts/lib/typography.mjs +5 -5
- package/scripts/show-typography.mjs +252 -29
- package/scripts/test-cli-discovery.mjs +124 -0
- package/scripts/test-engine-commands.mjs +18 -4
- package/scripts/test-navigation.mjs +10 -6
- package/scripts/test-package-check.mjs +32 -4
- package/src/components/SiteNavigation.astro +7 -5
- package/src/components/SitePage.astro +3 -0
- package/src/components/SiteSection.astro +24 -24
- package/src/content.config.ts +4 -0
- package/src/layouts/BaseLayout.astro +2 -1
- package/src/lib/basePath.ts +21 -0
- package/src/lib/generatedImages.ts +8 -4
- package/src/lib/sectionContent.ts +6 -1
- package/src/lib/sitePublicAssets.ts +8 -1
- package/src/styles/global.css +8 -8
- package/starters/basic/.github/workflows/deploy.yml +3 -3
- package/starters/basic/README.md +21 -0
- package/starters/basic/package.json +1 -1
- package/starters/basic/site/config.mjs +1 -0
- package/starters/basic/site/content.md +5 -3
- package/starters/basic/site/theme.md +4 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
{
|
|
2
|
+
"black-puppy-meadow.png": {
|
|
3
|
+
"outputVersion": 2,
|
|
4
|
+
"sourceHash": "7255e3d9148c1ded01ae6ae6809b9a8261b553a1516d3f8f4de0554bc321f652",
|
|
5
|
+
"width": 1536,
|
|
6
|
+
"height": 1024,
|
|
7
|
+
"variants": [
|
|
8
|
+
{
|
|
9
|
+
"src": "/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp",
|
|
10
|
+
"width": 480
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"src": "/images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp",
|
|
14
|
+
"width": 768
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"src": "/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp",
|
|
18
|
+
"width": 1080
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"src": "/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp",
|
|
22
|
+
"width": 1440
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"src": "/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp",
|
|
26
|
+
"width": 1536
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"photo-of-a-black-dog.jpg": {
|
|
31
|
+
"outputVersion": 2,
|
|
32
|
+
"sourceHash": "5cf614d2863ca8f86b6162c7b477fd2690adbc101816206c9e675bf36d9962d0",
|
|
33
|
+
"width": 960,
|
|
34
|
+
"height": 1600,
|
|
35
|
+
"variants": [
|
|
36
|
+
{
|
|
37
|
+
"src": "/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp",
|
|
38
|
+
"width": 480
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"src": "/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp",
|
|
42
|
+
"width": 768
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"src": "/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp",
|
|
46
|
+
"width": 960
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
"brown-dog.jpg": {
|
|
51
|
+
"outputVersion": 2,
|
|
52
|
+
"sourceHash": "50ef114e49ae48491c015157b4a25f4f1fd69140170fe6d4202c551858c3e03d",
|
|
53
|
+
"width": 3939,
|
|
54
|
+
"height": 2626,
|
|
55
|
+
"variants": [
|
|
56
|
+
{
|
|
57
|
+
"src": "/images/generated/brown-dogs/brown-dog-50ef114e-480.webp",
|
|
58
|
+
"width": 480
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"src": "/images/generated/brown-dogs/brown-dog-50ef114e-768.webp",
|
|
62
|
+
"width": 768
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"src": "/images/generated/brown-dogs/brown-dog-50ef114e-1080.webp",
|
|
66
|
+
"width": 1080
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"src": "/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp",
|
|
70
|
+
"width": 1440
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"src": "/images/generated/brown-dogs/brown-dog-50ef114e-1920.webp",
|
|
74
|
+
"width": 1920
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"src": "/images/generated/brown-dogs/brown-dog-50ef114e-3939.webp",
|
|
78
|
+
"width": 3939
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"dog-accompanies-master.jpg": {
|
|
83
|
+
"outputVersion": 2,
|
|
84
|
+
"sourceHash": "7ef804d5ebe27724409f4ffa94389c7b1102c2c8bb9c1dae29ecbd4c56e61af9",
|
|
85
|
+
"width": 2400,
|
|
86
|
+
"height": 1800,
|
|
87
|
+
"variants": [
|
|
88
|
+
{
|
|
89
|
+
"src": "/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp",
|
|
90
|
+
"width": 480
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"src": "/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp",
|
|
94
|
+
"width": 768
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"src": "/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp",
|
|
98
|
+
"width": 1080
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"src": "/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp",
|
|
102
|
+
"width": 1440
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"src": "/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp",
|
|
106
|
+
"width": 1920
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"src": "/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-2400.webp",
|
|
110
|
+
"width": 2400
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
"golden-retriever.jpg": {
|
|
115
|
+
"outputVersion": 2,
|
|
116
|
+
"sourceHash": "f797fd880d6c3b112ceb3408f468fbeaf442efc792f935fd6c9954b812fdc838",
|
|
117
|
+
"width": 1600,
|
|
118
|
+
"height": 1200,
|
|
119
|
+
"variants": [
|
|
120
|
+
{
|
|
121
|
+
"src": "/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp",
|
|
122
|
+
"width": 480
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"src": "/images/generated/golden-dogs/golden-retriever-f797fd88-768.webp",
|
|
126
|
+
"width": 768
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"src": "/images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp",
|
|
130
|
+
"width": 1080
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"src": "/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp",
|
|
134
|
+
"width": 1440
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"src": "/images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp",
|
|
138
|
+
"width": 1600
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
"toller-puppy.jpg": {
|
|
143
|
+
"outputVersion": 2,
|
|
144
|
+
"sourceHash": "a2a8fbc0d599deb019d45f7b11de98bcbcb4f1fd609e931073161dcb88cbf63f",
|
|
145
|
+
"width": 2576,
|
|
146
|
+
"height": 1932,
|
|
147
|
+
"variants": [
|
|
148
|
+
{
|
|
149
|
+
"src": "/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp",
|
|
150
|
+
"width": 480
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"src": "/images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp",
|
|
154
|
+
"width": 768
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"src": "/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp",
|
|
158
|
+
"width": 1080
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"src": "/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp",
|
|
162
|
+
"width": 1440
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"src": "/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp",
|
|
166
|
+
"width": 1920
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"src": "/images/generated/golden-dogs/toller-puppy-a2a8fbc0-2576.webp",
|
|
170
|
+
"width": 2576
|
|
171
|
+
}
|
|
172
|
+
]
|
|
173
|
+
},
|
|
174
|
+
"white-cute-dog.jpg": {
|
|
175
|
+
"outputVersion": 2,
|
|
176
|
+
"sourceHash": "077a06891d97eafb4593cfcaa5c9b04fdb1e3a6206d56acd4ebd3eadb83356bf",
|
|
177
|
+
"width": 1277,
|
|
178
|
+
"height": 1060,
|
|
179
|
+
"variants": [
|
|
180
|
+
{
|
|
181
|
+
"src": "/images/generated/white-dogs/white-cute-dog-077a0689-480.webp",
|
|
182
|
+
"width": 480
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"src": "/images/generated/white-dogs/white-cute-dog-077a0689-768.webp",
|
|
186
|
+
"width": 768
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"src": "/images/generated/white-dogs/white-cute-dog-077a0689-1080.webp",
|
|
190
|
+
"width": 1080
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"src": "/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp",
|
|
194
|
+
"width": 1277
|
|
195
|
+
}
|
|
196
|
+
]
|
|
197
|
+
},
|
|
198
|
+
"white-puppy-garden.png": {
|
|
199
|
+
"outputVersion": 2,
|
|
200
|
+
"sourceHash": "d3ab2ca04fb37dfbf010e7f9f3adf2ba8401553bd1946e3b388cb662eac58ee9",
|
|
201
|
+
"width": 1536,
|
|
202
|
+
"height": 1024,
|
|
203
|
+
"variants": [
|
|
204
|
+
{
|
|
205
|
+
"src": "/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp",
|
|
206
|
+
"width": 480
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"src": "/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp",
|
|
210
|
+
"width": 768
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"src": "/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp",
|
|
214
|
+
"width": 1080
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"src": "/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp",
|
|
218
|
+
"width": 1440
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"src": "/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp",
|
|
222
|
+
"width": 1536
|
|
223
|
+
}
|
|
224
|
+
]
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
const siteUrl = 'http://localhost:4321/';
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
site: {
|
|
5
|
+
// Public canonical URL for this site.
|
|
6
|
+
url: siteUrl,
|
|
7
|
+
|
|
8
|
+
// URL path prefix. Use "/" for root sites and "/repository-name/" for
|
|
9
|
+
// GitHub Pages project sites without a custom domain.
|
|
10
|
+
basePath: '/',
|
|
11
|
+
},
|
|
12
|
+
layout: {
|
|
13
|
+
// Maximum width of the page content area.
|
|
14
|
+
pageWidth: '2048px',
|
|
15
|
+
|
|
16
|
+
// Side margin on desktop and mobile before available gallery width is calculated.
|
|
17
|
+
gutter: {
|
|
18
|
+
desktop: 'clamp(1.25rem, 4vw, 3rem)',
|
|
19
|
+
mobile: '16px',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
gallery: {
|
|
23
|
+
// Hard maximum rendered gallery width for images and aligned text.
|
|
24
|
+
width: '55vw',
|
|
25
|
+
|
|
26
|
+
// Maximum share of the available width after gutters.
|
|
27
|
+
maxAvailableWidthPercent: {
|
|
28
|
+
desktop: 100,
|
|
29
|
+
mobile: 100,
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
// Maximum share of viewport height used by gallery images.
|
|
33
|
+
maxAvailableHeightPercent: {
|
|
34
|
+
desktop: 74,
|
|
35
|
+
mobile: 68,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
typography: {
|
|
39
|
+
// CSS font-family stack used by the whole site, including sticky navigation.
|
|
40
|
+
fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif",
|
|
41
|
+
},
|
|
42
|
+
navigation: {
|
|
43
|
+
smoothScroll: {
|
|
44
|
+
// Set to false to make section links jump directly to the target anchor.
|
|
45
|
+
enabled: true,
|
|
46
|
+
|
|
47
|
+
// Minimum and maximum animation time for controlled anchor navigation.
|
|
48
|
+
minimumDurationMs: 2_000,
|
|
49
|
+
maximumDurationMs: 4_000,
|
|
50
|
+
|
|
51
|
+
// Additional duration per pixel of scroll distance, before min/max clamping.
|
|
52
|
+
durationPerPixelMs: 0.22,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
locale: {
|
|
56
|
+
lang: 'en',
|
|
57
|
+
labels: {
|
|
58
|
+
skipToContent: 'Skip to content',
|
|
59
|
+
sectionNavigation: 'Sections',
|
|
60
|
+
gallery: 'Gallery',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
footer: {
|
|
64
|
+
// Omit this value to hide the copyright sentence.
|
|
65
|
+
copyrightMessage: 'Dog images from Wikimedia Commons; see image captions for license details.',
|
|
66
|
+
|
|
67
|
+
// Set enabled to false to hide the build timestamp while keeping its config.
|
|
68
|
+
buildInfo: {
|
|
69
|
+
enabled: true,
|
|
70
|
+
|
|
71
|
+
// Text shown before the formatted build timestamp.
|
|
72
|
+
text: 'Built',
|
|
73
|
+
|
|
74
|
+
// Standard Intl.DateTimeFormat options for the build timestamp.
|
|
75
|
+
dateTimeFormat: {
|
|
76
|
+
locale: 'en-GB',
|
|
77
|
+
timeZone: 'UTC',
|
|
78
|
+
dateStyle: 'short',
|
|
79
|
+
timeStyle: 'short',
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
github: {
|
|
84
|
+
// Example repository and workflow details used by deploy scripts.
|
|
85
|
+
repo: 'owner/example-gallery',
|
|
86
|
+
branch: 'main',
|
|
87
|
+
pagesWorkflow: 'Deploy to GitHub Pages',
|
|
88
|
+
},
|
|
89
|
+
deploy: {
|
|
90
|
+
watch: {
|
|
91
|
+
// Defaults for npm run deploy:watch.
|
|
92
|
+
intervalMs: 10_000,
|
|
93
|
+
timeoutMs: 15 * 60_000,
|
|
94
|
+
runLimit: 10,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Local Dog Gallery
|
|
3
|
+
description: A small norna example with free dog images.
|
|
4
|
+
navigation:
|
|
5
|
+
label: Dog site!
|
|
6
|
+
order: 10
|
|
7
|
+
sections:
|
|
8
|
+
- id: black-dogs
|
|
9
|
+
presentation:
|
|
10
|
+
typography:
|
|
11
|
+
preset: statement
|
|
12
|
+
gallery:
|
|
13
|
+
- image: photo-of-a-black-dog.jpg
|
|
14
|
+
alt: "A black dog sitting outdoors and looking at the camera."
|
|
15
|
+
caption:
|
|
16
|
+
"Photo of a dog. ContaDeletada2906, CC0 1.0, via Wikimedia Commons."
|
|
17
|
+
- image: black-puppy-meadow.png
|
|
18
|
+
alt:
|
|
19
|
+
"A black puppy standing in a grassy meadow and looking at the camera."
|
|
20
|
+
caption: "AI-generated image."
|
|
21
|
+
- id: summer-dogs
|
|
22
|
+
visible:
|
|
23
|
+
from: "2026-08-01"
|
|
24
|
+
until: "2026-09-01"
|
|
25
|
+
presentation:
|
|
26
|
+
backgroundColor: "#181818"
|
|
27
|
+
typography:
|
|
28
|
+
preset: compact-gallery
|
|
29
|
+
gallery: []
|
|
30
|
+
- id: brown-dogs
|
|
31
|
+
presentation:
|
|
32
|
+
typography:
|
|
33
|
+
preset: text-forward
|
|
34
|
+
gallery:
|
|
35
|
+
- image: brown-dog.jpg
|
|
36
|
+
alt: "A brown dog looking directly at the camera."
|
|
37
|
+
caption: "DogBrown. Frank-3, CC0 1.0, via Wikimedia Commons."
|
|
38
|
+
- image: dog-accompanies-master.jpg
|
|
39
|
+
alt: "A man walks outdoors with a dog at his side."
|
|
40
|
+
caption:
|
|
41
|
+
"Dog accompanies his master. Steve Hillebrand, U.S. Fish and Wildlife
|
|
42
|
+
Service, public domain."
|
|
43
|
+
- id: golden-dogs
|
|
44
|
+
presentation:
|
|
45
|
+
typography:
|
|
46
|
+
overrides:
|
|
47
|
+
body:
|
|
48
|
+
lineHeight: 1.58
|
|
49
|
+
paragraphSpacing: 1em
|
|
50
|
+
gallery:
|
|
51
|
+
- image: golden-retriever.jpg
|
|
52
|
+
alt: "A golden retriever standing outdoors."
|
|
53
|
+
caption: "Golden Retriever. Ribo, public domain, via Wikimedia Commons."
|
|
54
|
+
- image: toller-puppy.jpg
|
|
55
|
+
alt:
|
|
56
|
+
"A young Nova Scotia Duck Tolling Retriever puppy sitting on grass."
|
|
57
|
+
caption:
|
|
58
|
+
"Nova Scotia Duck Tolling Retriever puppy. RM, public domain, via
|
|
59
|
+
Wikimedia Commons."
|
|
60
|
+
- id: white-dogs
|
|
61
|
+
presentation:
|
|
62
|
+
typography:
|
|
63
|
+
overrides:
|
|
64
|
+
caption:
|
|
65
|
+
spacing: 0.35em
|
|
66
|
+
gallery:
|
|
67
|
+
- carousel:
|
|
68
|
+
- image: white-cute-dog.jpg
|
|
69
|
+
alt: "A white dog looking toward the camera."
|
|
70
|
+
caption:
|
|
71
|
+
"White cute dog. Neal Ziring, public domain, via Wikimedia
|
|
72
|
+
Commons."
|
|
73
|
+
- image: white-puppy-garden.png
|
|
74
|
+
alt: "A fluffy white puppy standing on grass in a garden."
|
|
75
|
+
caption: "AI-generated image."
|
|
76
|
+
- id: sources
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Black Dogs {#black-dogs}
|
|
80
|
+
|
|
81
|
+
Black-coated dogs from the local norna development collection. This
|
|
82
|
+
sentence contains [yellow highlighted text]{.highlight} for inline style
|
|
83
|
+
inspection.
|
|
84
|
+
|
|
85
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a
|
|
86
|
+
ante venenatis dapibus posuere velit aliquet.
|
|
87
|
+
|
|
88
|
+
Curabitur blandit tempus porttitor. Donec id elit non mi porta gravida at eget
|
|
89
|
+
metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
|
|
90
|
+
|
|
91
|
+
## Summer Dogs {#summer-dogs}
|
|
92
|
+
|
|
93
|
+
This temporary section is visible during August 2026. It is here to demonstrate
|
|
94
|
+
date-controlled sections and [warm alert text]{.alert} in the local dog gallery.
|
|
95
|
+
|
|
96
|
+
Lorem ipsum dolor sit amet.
|
|
97
|
+
|
|
98
|
+
Vestibulum id ligula porta felis euismod semper. Maecenas faucibus mollis
|
|
99
|
+
interdum. Nullam quis risus eget urna mollis ornare vel eu leo.
|
|
100
|
+
|
|
101
|
+
## Brown Dogs {#brown-dogs}
|
|
102
|
+
|
|
103
|
+
Brown dogs provide a second gallery section for local navigation checks.
|
|
104
|
+
|
|
105
|
+
Donec ullamcorper nulla non metus auctor fringilla. Fusce dapibus, tellus ac
|
|
106
|
+
cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit
|
|
107
|
+
amet risus.
|
|
108
|
+
|
|
109
|
+
Maecenas sed diam eget risus varius blandit sit amet non magna. Morbi leo risus,
|
|
110
|
+
porta ac consectetur ac, vestibulum at eros. Sed posuere consectetur est at
|
|
111
|
+
lobortis.
|
|
112
|
+
|
|
113
|
+
## Golden Dogs {#golden-dogs}
|
|
114
|
+
|
|
115
|
+
Golden-coated retrievers add a third gallery section and more scrolling depth.
|
|
116
|
+
|
|
117
|
+
Cras justo odio, dapibus ac facilisis in, egestas eget quam.
|
|
118
|
+
|
|
119
|
+
Nulla vitae elit libero, a pharetra augue. Integer posuere erat a ante venenatis
|
|
120
|
+
dapibus posuere velit aliquet. Aenean eu leo quam. Pellentesque ornare sem
|
|
121
|
+
lacinia quam venenatis vestibulum.
|
|
122
|
+
|
|
123
|
+
## White Dogs {#white-dogs}
|
|
124
|
+
|
|
125
|
+
A white dog completes the colour-based gallery sequence.
|
|
126
|
+
|
|
127
|
+
Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta
|
|
128
|
+
gravida at eget metus.
|
|
129
|
+
|
|
130
|
+
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Lorem ipsum
|
|
131
|
+
dolor sit amet, consectetur adipiscing elit. Donec sed odio dui. Vestibulum id
|
|
132
|
+
ligula porta felis euismod semper.
|
|
133
|
+
|
|
134
|
+
## Sources {#sources}
|
|
135
|
+
|
|
136
|
+
Most images are sourced from Wikimedia Commons pages that list CC0 or
|
|
137
|
+
public-domain licensing:
|
|
138
|
+
|
|
139
|
+
- [Photo of a dog](https://commons.wikimedia.org/wiki/File:Photo_of_a_dog.jpg)
|
|
140
|
+
- [DogBrown](https://commons.wikimedia.org/wiki/File:DogBrown.jpg)
|
|
141
|
+
- [Dog accompanies his master](https://commons.wikimedia.org/wiki/File:Dog_accompanies_his_master.jpg)
|
|
142
|
+
- [Golden Retriever](https://commons.wikimedia.org/wiki/File:Golden_Retriever.jpg)
|
|
143
|
+
- [Toller pup7wks2](https://commons.wikimedia.org/wiki/File:Toller_pup7wks2.JPG)
|
|
144
|
+
- [White cute dog](https://commons.wikimedia.org/wiki/File:White_cute_dog.jpg)
|
|
145
|
+
|
|
146
|
+
The black and white puppy images are AI-generated.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
|
|
2
|
+
<rect width="128" height="128" rx="24" fill="#111111" />
|
|
3
|
+
<circle cx="40" cy="43" r="13" fill="#ffffff" />
|
|
4
|
+
<circle cx="64" cy="34" r="13" fill="#ffffff" />
|
|
5
|
+
<circle cx="88" cy="43" r="13" fill="#ffffff" />
|
|
6
|
+
<path fill="#ffffff" d="M31 83c0-18 15-31 33-31s33 13 33 31c0 12-9 18-20 14-7-3-19-3-26 0-11 4-20-2-20-14Z" />
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Dog care
|
|
3
|
+
description: A small route for testing multi-page norna navigation.
|
|
4
|
+
navigation:
|
|
5
|
+
label: Dog care
|
|
6
|
+
order: 20
|
|
7
|
+
sections:
|
|
8
|
+
- id: daily-rhythm
|
|
9
|
+
- id: calm-training
|
|
10
|
+
- id: gallery-notes
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Daily rhythm {#daily-rhythm}
|
|
14
|
+
|
|
15
|
+
Dogs often settle into a home when the day has a clear rhythm. Meals, walks,
|
|
16
|
+
rest and play do not need to be dramatic events, but they become easier to
|
|
17
|
+
understand when they happen in a predictable order.
|
|
18
|
+
|
|
19
|
+
Short routines also make a gallery page easier to scan. This route exists mainly
|
|
20
|
+
to test how page navigation and site navigation behave together.
|
|
21
|
+
|
|
22
|
+
## Calm training {#calm-training}
|
|
23
|
+
|
|
24
|
+
Good training can be quiet. A short session with one clear task is often more
|
|
25
|
+
useful than a long session with many competing signals.
|
|
26
|
+
|
|
27
|
+
The same principle applies to navigation. The page should show where the visitor
|
|
28
|
+
is in the site first, and then offer a simple way to jump within the current
|
|
29
|
+
page.
|
|
30
|
+
|
|
31
|
+
## Gallery notes {#gallery-notes}
|
|
32
|
+
|
|
33
|
+
This section is intentionally text-only. Image routes can be added later, but a
|
|
34
|
+
first navigation test should make it easy to judge menus, active states and
|
|
35
|
+
anchor positions without layout noise from new media.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
# norna:start theme-help
|
|
3
|
+
# Site-wide visual defaults. Remove a value to use the engine default.
|
|
4
|
+
# Active values below are ordinary YAML; this marked comment block is only help text.
|
|
5
|
+
#
|
|
6
|
+
# Available structure:
|
|
7
|
+
# presentation:
|
|
8
|
+
# backgroundColor: quoted hex color, e.g. "#000000"
|
|
9
|
+
# textColor: quoted hex color, e.g. "#f7f4ee"
|
|
10
|
+
# inlineStyles:
|
|
11
|
+
# style-name:
|
|
12
|
+
# color: quoted hex color
|
|
13
|
+
# typography:
|
|
14
|
+
# preset: quiet-gallery | compact-gallery | text-forward | statement
|
|
15
|
+
# overrides:
|
|
16
|
+
# heading:
|
|
17
|
+
# align:
|
|
18
|
+
# desktop: left | center | right
|
|
19
|
+
# mobile: left | center | right
|
|
20
|
+
# size: small | medium | large | xlarge
|
|
21
|
+
# lineHeight: number from 1 through 3
|
|
22
|
+
# spacing: CSS length, e.g. 0.65em
|
|
23
|
+
# body:
|
|
24
|
+
# align:
|
|
25
|
+
# desktop: left | center | right
|
|
26
|
+
# mobile: left | center | right
|
|
27
|
+
# size: small | medium | large | xlarge
|
|
28
|
+
# lineHeight: number from 1 through 3
|
|
29
|
+
# paragraphSpacing: CSS length, e.g. 0.85em
|
|
30
|
+
# caption:
|
|
31
|
+
# align:
|
|
32
|
+
# desktop: left | center | right
|
|
33
|
+
# mobile: left | center | right
|
|
34
|
+
# size: small | medium | large | xlarge
|
|
35
|
+
# lineHeight: number from 1 through 3
|
|
36
|
+
# spacing: CSS length, e.g. 0.5em
|
|
37
|
+
# frame:
|
|
38
|
+
# colors: presentation | theme
|
|
39
|
+
# colors:
|
|
40
|
+
# backgroundColor: quoted hex color
|
|
41
|
+
# textColor: quoted hex color
|
|
42
|
+
# norna:end theme-help
|
|
43
|
+
presentation:
|
|
44
|
+
backgroundColor: "#550000"
|
|
45
|
+
textColor: "#ffffff"
|
|
46
|
+
inlineStyles:
|
|
47
|
+
highlight:
|
|
48
|
+
color: "#ffd84d"
|
|
49
|
+
alert:
|
|
50
|
+
color: "#ff9a3d"
|
|
51
|
+
typography:
|
|
52
|
+
preset: quiet-gallery
|
|
53
|
+
frame:
|
|
54
|
+
colors: presentation
|
|
55
|
+
---
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@janga/norna",
|
|
3
3
|
"description": "A command-line publishing workflow for simple static sites.",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "0.7.
|
|
5
|
+
"version": "0.7.2",
|
|
6
6
|
"license": "GPL-3.0-only",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"astro.config.mjs",
|
|
26
26
|
"bin/",
|
|
27
27
|
"docs/",
|
|
28
|
+
"examples/",
|
|
28
29
|
"fixtures/",
|
|
29
30
|
"scripts/",
|
|
30
31
|
"src/",
|
|
@@ -40,8 +41,8 @@
|
|
|
40
41
|
"node": ">=22.12.0"
|
|
41
42
|
},
|
|
42
43
|
"scripts": {
|
|
43
|
-
"dev": "npm run dev:local",
|
|
44
|
-
"dev:local": "
|
|
44
|
+
"dev": "npm run dev:local --",
|
|
45
|
+
"dev:local": "node bin/norna.mjs dev:local",
|
|
45
46
|
"dev:lan": "node bin/norna.mjs dev:lan",
|
|
46
47
|
"dev:restart": "node bin/norna.mjs dev:restart",
|
|
47
48
|
"dev:status": "node bin/norna.mjs dev:status",
|
|
@@ -54,18 +55,18 @@
|
|
|
54
55
|
"typography:show": "node bin/norna.mjs typography:show",
|
|
55
56
|
"site:public": "node bin/norna.mjs site:public",
|
|
56
57
|
"images": "node bin/norna.mjs images",
|
|
57
|
-
"build": "
|
|
58
|
+
"build": "node bin/norna.mjs build",
|
|
58
59
|
"build:local": "node bin/norna.mjs build:local",
|
|
59
60
|
"deploy": "node bin/norna.mjs deploy",
|
|
60
61
|
"deploy:commit": "node bin/norna.mjs deploy:commit",
|
|
61
62
|
"deploy:watch": "node bin/norna.mjs deploy:watch",
|
|
62
63
|
"doctor": "node bin/norna.mjs doctor",
|
|
63
|
-
"demo:
|
|
64
|
-
"
|
|
65
|
-
"test": "npm run test:content-check && npm run test:site-public && npm run test:engine-commands && npm run test:ci-lockfile && npm run test:temporary-visibility && npm run test:fixture:build && npm run demo:build && npm run package:check",
|
|
64
|
+
"demo:build": "node bin/norna.mjs --site-dir examples/dog-gallery/site build",
|
|
65
|
+
"test": "npm run test:content-check && npm run test:site-public && npm run test:cli-discovery && npm run test:engine-commands && npm run test:ci-lockfile && npm run test:temporary-visibility && npm run test:fixture:build && npm run package:check",
|
|
66
66
|
"test:fixture:build": "node bin/norna.mjs --site-dir fixtures/basic/site build",
|
|
67
67
|
"test:content-check": "node scripts/test-content-check.mjs",
|
|
68
68
|
"test:site-public": "node scripts/test-site-public.mjs",
|
|
69
|
+
"test:cli-discovery": "node scripts/test-cli-discovery.mjs",
|
|
69
70
|
"test:engine-commands": "node scripts/test-engine-commands.mjs",
|
|
70
71
|
"test:ci-lockfile": "node scripts/test-ci-lockfile.mjs",
|
|
71
72
|
"test:temporary-visibility": "node scripts/test-temporary-visibility.mjs",
|
package/scripts/check-config.mjs
CHANGED
|
@@ -20,6 +20,7 @@ try {
|
|
|
20
20
|
|
|
21
21
|
console.log('Config check passed.');
|
|
22
22
|
console.log(`Site URL: ${projectConfig.site.url}`);
|
|
23
|
+
console.log(`Base path: ${projectConfig.site.basePath}`);
|
|
23
24
|
console.log(`Page width: ${projectConfig.layout.pageWidth}`);
|
|
24
25
|
console.log(`Gutter: desktop ${projectConfig.layout.gutter.desktop}, mobile ${projectConfig.layout.gutter.mobile}`);
|
|
25
26
|
console.log(`Gallery width: ${projectConfig.gallery.width}`);
|