@janga/norna 0.7.9 → 0.7.11
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 +4 -2
- package/bin/norna-cli.mjs +3 -0
- package/docs/README.md +16 -12
- package/docs/commands.md +6 -0
- package/docs/configuration.md +10 -54
- package/docs/content.md +20 -21
- package/docs/design/norna-diagram-design.md +2 -0
- package/docs/design/site-examples-structure.md +35 -24
- package/docs/engine-development.md +13 -7
- package/docs/getting-started.md +56 -19
- package/docs/routes.md +8 -6
- package/docs/site-structure.md +11 -6
- package/docs/sitewide-content.md +74 -0
- package/docs/theme.md +125 -140
- package/docs/typography.md +72 -45
- package/examples/README.md +41 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +59 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +138 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +755 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/content-modules.mjs +1 -0
- package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/content.d.ts +8 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -0
- package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev-local.json +2 -2
- package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev.json +2 -2
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +53 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +5 -0
- package/examples/complete-sites/dog-shelter-multi-page/README.md +9 -0
- package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/_metadata.json +13 -7
- package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +18 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/config.mjs +30 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/content.md +12 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/public/favicon.svg +10 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.svg +19 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.svg +19 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/route-content.md +30 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/routes/020-adopt/route-content.md +12 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.md +6 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/theme.md +25 -0
- package/examples/complete-sites/dog-shelter-single-page/README.md +9 -0
- package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +18 -0
- package/examples/complete-sites/dog-shelter-single-page/site/config.mjs +30 -0
- package/examples/complete-sites/dog-shelter-single-page/site/content.md +38 -0
- package/examples/complete-sites/dog-shelter-single-page/site/images/what-we-do/dog-house.svg +25 -0
- package/examples/complete-sites/dog-shelter-single-page/site/images/you-can-help/heart.svg +13 -0
- package/examples/complete-sites/dog-shelter-single-page/site/public/favicon.svg +10 -0
- package/examples/complete-sites/dog-shelter-single-page/site/public/robots.txt +2 -0
- package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.md +6 -0
- package/examples/complete-sites/dog-shelter-single-page/site/theme.md +25 -0
- package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +59 -0
- package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +138 -0
- package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +755 -0
- package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +1 -0
- package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +183 -0
- package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -0
- package/examples/feature-demos/media-and-surfaces/.astro/dev.log +11 -0
- package/examples/feature-demos/media-and-surfaces/.astro/settings.json +5 -0
- package/examples/feature-demos/media-and-surfaces/.astro/types.d.ts +2 -0
- package/examples/feature-demos/media-and-surfaces/README.md +15 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +74 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +66 -0
- package/examples/feature-demos/media-and-surfaces/site/config.mjs +30 -0
- package/examples/feature-demos/media-and-surfaces/site/content.md +64 -0
- package/examples/feature-demos/media-and-surfaces/site/public/robots.txt +2 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/cards/card-carousel.svg +11 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/cards/card-stack.svg +9 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/cards/card-surfaces.svg +8 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/carousel/carousel-one.svg +8 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/carousel/carousel-three.svg +13 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/carousel/carousel-two.svg +8 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/stack/stack-one.svg +8 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/stack/stack-two.svg +9 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/route-content.md +85 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/theme.md +3 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/route-content.md +44 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/theme.md +8 -0
- package/examples/feature-demos/media-and-surfaces/site/sitewide-content.md +6 -0
- package/examples/feature-demos/media-and-surfaces/site/theme.md +3 -0
- package/examples/{typography-presets/.astro/collections/theme.schema.json → feature-demos/theme-presets/.astro/collections/routeTheme.schema.json} +143 -65
- package/examples/feature-demos/theme-presets/.astro/collections/site.schema.json +59 -0
- package/examples/feature-demos/theme-presets/.astro/collections/sitewide.schema.json +138 -0
- package/examples/feature-demos/theme-presets/.astro/collections/theme.schema.json +755 -0
- package/examples/feature-demos/theme-presets/.astro/content-assets.mjs +4 -0
- package/examples/feature-demos/theme-presets/.astro/content-modules.mjs +1 -0
- package/examples/feature-demos/theme-presets/.astro/content.d.ts +183 -0
- package/examples/feature-demos/theme-presets/.astro/data-store.json +1 -0
- package/examples/feature-demos/theme-presets/.astro/dev-local.json +8 -0
- package/examples/feature-demos/theme-presets/.astro/dev.json +15 -0
- package/examples/feature-demos/theme-presets/.astro/dev.log +127 -0
- package/examples/feature-demos/theme-presets/.astro/types.d.ts +2 -0
- package/examples/feature-demos/theme-presets/README.md +14 -0
- package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js +1389 -0
- package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js.map +1 -0
- package/examples/feature-demos/theme-presets/node_modules/.vite/deps/package.json +3 -0
- package/examples/feature-demos/theme-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
- package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +290 -0
- package/examples/{typography-presets → feature-demos/theme-presets}/site/config.mjs +4 -16
- package/examples/feature-demos/theme-presets/site/content.md +17 -0
- package/examples/feature-demos/theme-presets/site/routes/010-portfolio/route-content.md +34 -0
- package/examples/feature-demos/theme-presets/site/routes/010-portfolio/theme.md +3 -0
- package/examples/feature-demos/theme-presets/site/routes/020-documentation/route-content.md +33 -0
- package/examples/feature-demos/theme-presets/site/routes/020-documentation/theme.md +3 -0
- package/examples/feature-demos/theme-presets/site/routes/030-project/route-content.md +34 -0
- package/examples/feature-demos/theme-presets/site/routes/030-project/theme.md +3 -0
- package/examples/feature-demos/theme-presets/site/routes/040-statement/route-content.md +34 -0
- package/examples/feature-demos/theme-presets/site/routes/040-statement/theme.md +3 -0
- package/examples/feature-demos/theme-presets/site/sitewide-content.md +14 -0
- package/examples/feature-demos/theme-presets/site/theme.md +3 -0
- package/fixtures/basic/site/config.mjs +0 -13
- package/fixtures/basic/site/sitewide-content.md +12 -0
- package/fixtures/basic/site/theme.md +2 -2
- package/fixtures/content-model-v2/site/content.md +2 -5
- package/fixtures/content-model-v2/site/theme.md +1 -3
- package/package.json +9 -4
- package/scripts/build-pages.mjs +71 -0
- package/scripts/check-config.mjs +23 -1
- package/scripts/export-theme-preset.mjs +31 -0
- package/scripts/init-site.mjs +1 -0
- package/scripts/lib/example-sites.mjs +34 -0
- package/scripts/lib/frontmatter-yaml.mjs +28 -0
- package/scripts/lib/logo-assets.mjs +35 -0
- package/scripts/lib/norna-markdown-blocks.mjs +166 -0
- package/scripts/lib/presentation.mjs +106 -47
- package/scripts/lib/project-config.mjs +68 -105
- package/scripts/lib/site-content.mjs +26 -118
- package/scripts/lib/site-paths.mjs +2 -0
- package/scripts/lib/sitewide-config.mjs +34 -0
- package/scripts/lib/theme-config.mjs +75 -8
- package/scripts/lib/theme-presets.mjs +209 -0
- package/scripts/lib/typography.mjs +20 -26
- package/scripts/show-typography.mjs +43 -149
- package/scripts/sync-content-sections.mjs +19 -17
- package/scripts/test-content-check.mjs +59 -27
- package/scripts/test-content-model-v2.mjs +154 -0
- package/scripts/test-engine-commands.mjs +4 -1
- package/scripts/test-examples.mjs +15 -0
- package/scripts/test-navigation.mjs +73 -45
- package/scripts/test-package-check.mjs +66 -24
- package/scripts/test-temporary-visibility.mjs +19 -2
- package/scripts/test-theme-presets.mjs +151 -0
- package/src/components/CardList.astro +5 -2
- package/src/components/GalleryGrid.astro +37 -16
- package/src/components/SiteBanners.astro +100 -0
- package/src/components/SiteNavigation.astro +48 -31
- package/src/components/SitePage.astro +55 -13
- package/src/components/SiteSection.astro +193 -35
- package/src/content.config.ts +80 -48
- package/src/layouts/BaseLayout.astro +64 -14
- package/src/lib/routeThemes.ts +61 -0
- package/src/lib/sectionContent.ts +235 -51
- package/src/lib/sitePublicAssets.ts +1 -0
- package/src/styles/global.css +284 -93
- package/starters/basic/.github/workflows/deploy.yml +1 -1
- package/starters/basic/README.md +7 -6
- package/starters/basic/package.json +1 -0
- package/starters/basic/site/config.mjs +0 -13
- package/starters/basic/site/content.md +1 -1
- package/starters/basic/site/sitewide-content.md +14 -0
- package/starters/basic/site/theme.md +13 -24
- package/starters/project/.github/workflows/deploy.yml +1 -1
- package/starters/project/README.md +10 -8
- package/starters/project/package.json +1 -0
- package/starters/project/site/config.mjs +0 -13
- package/starters/project/site/sitewide-content.md +14 -0
- package/starters/project/site/theme.md +3 -11
- package/examples/dog-gallery/site/.norna/generated-images.json +0 -226
- package/examples/dog-gallery/site/config.mjs +0 -67
- package/examples/dog-gallery/site/content.md +0 -128
- 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 +0 -7
- package/examples/dog-gallery/site/routes/010-dog-care/route-content.md +0 -38
- package/examples/dog-gallery/site/theme.md +0 -112
- package/examples/typography-presets/.astro/collections/site.schema.json +0 -776
- package/examples/typography-presets/.astro/data-store.json +0 -1
- package/examples/typography-presets/.astro/dev.log +0 -24
- package/examples/typography-presets/site/.norna/generated-images.json +0 -290
- package/examples/typography-presets/site/content.md +0 -134
- package/examples/typography-presets/site/theme.md +0 -43
- /package/examples/{typography-presets/.astro/content-modules.mjs → complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs} +0 -0
- /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/types.d.ts +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
- /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js +0 -0
- /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/package.json +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/site/public/robots.txt +0 -0
- /package/examples/{typography-presets → feature-demos/media-and-surfaces}/.astro/content-assets.mjs +0 -0
- /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/package.json +0 -0
- /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/settings.json +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/_metadata.json +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/site/public/robots.txt +0 -0
- /package/examples/{typography-presets/site/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/puppy-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/shepherd-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/white-puppy.jpg +0 -0
- /package/examples/{typography-presets/site/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/black-schnauzer.jpg +0 -0
- /package/examples/{typography-presets/site/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/retriever-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/schnauzer-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/boxer-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grass-puppy.jpg +0 -0
- /package/examples/{typography-presets/site/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grey-street-dog.jpg +0 -0
- /package/examples/{typography-presets/site → feature-demos/theme-presets/site/routes/040-statement}/images/statement/black-pedigree.jpg +0 -0
- /package/examples/{typography-presets/site → feature-demos/theme-presets/site/routes/040-statement}/images/statement/sheepdog-grass.jpg +0 -0
- /package/examples/{typography-presets/site → feature-demos/theme-presets/site/routes/040-statement}/images/statement/sheepdog-wide.jpg +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Sitewide Content
|
|
2
|
+
|
|
3
|
+
`site/sitewide-content.md` contains content and settings shared by the whole site. It
|
|
4
|
+
is separate from `content.md`, which defines the homepage, and from
|
|
5
|
+
`config.mjs`, which defines technical behaviour.
|
|
6
|
+
|
|
7
|
+
## Site identity
|
|
8
|
+
|
|
9
|
+
Use the optional `navigation` object for identity shared by all pages. `brand`
|
|
10
|
+
is the text shown in the home link when no logo is present. A logo is discovered
|
|
11
|
+
from one convention-based file in `site/public`: `logo.svg`, `logo.png`,
|
|
12
|
+
`logo.jpg`, or `logo.jpeg`.
|
|
13
|
+
|
|
14
|
+
```yaml
|
|
15
|
+
navigation:
|
|
16
|
+
brand: Example Site
|
|
17
|
+
logo:
|
|
18
|
+
alt: Example Site
|
|
19
|
+
height: 2.6rem
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
If `navigation.brand` is omitted, Norna uses the homepage `title` from
|
|
23
|
+
`site/content.md`. The logo's width is derived from its intrinsic aspect ratio.
|
|
24
|
+
If both a logo and a brand are present, the logo is displayed and the brand is
|
|
25
|
+
used as its text fallback and accessible default.
|
|
26
|
+
|
|
27
|
+
## Banners
|
|
28
|
+
|
|
29
|
+
Use `banners` for short notices shown above the page content on every route.
|
|
30
|
+
The list order controls the presentation order. Each banner needs a unique
|
|
31
|
+
`id`, a title and text:
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
---
|
|
35
|
+
banners:
|
|
36
|
+
- id: project-status
|
|
37
|
+
tone: warning
|
|
38
|
+
visible:
|
|
39
|
+
from: "2026-08-01"
|
|
40
|
+
until: "2026-09-01"
|
|
41
|
+
title: Experimental code
|
|
42
|
+
text: Not for production use.
|
|
43
|
+
---
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`visible` uses the same date-window rules as temporary sections. Visitors can
|
|
47
|
+
dismiss individual active banners. The dismissal is stored locally in the
|
|
48
|
+
browser and is tied to the banner content, so an edited banner can appear
|
|
49
|
+
again.
|
|
50
|
+
|
|
51
|
+
The first version supports the `warning` tone. Keep banner text short; banners
|
|
52
|
+
are presented as compact single-line notices and may use an ellipsis when the
|
|
53
|
+
text does not fit.
|
|
54
|
+
|
|
55
|
+
## Footer
|
|
56
|
+
|
|
57
|
+
The footer is also sitewide content. `copyrightMessage` adds a copyright or
|
|
58
|
+
license sentence. `buildInfo` optionally adds a generated build timestamp:
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
footer:
|
|
62
|
+
copyrightMessage: (c) Example Artist.
|
|
63
|
+
buildInfo:
|
|
64
|
+
enabled: true
|
|
65
|
+
text: Built
|
|
66
|
+
dateTimeFormat:
|
|
67
|
+
locale: en-GB
|
|
68
|
+
timeZone: UTC
|
|
69
|
+
dateStyle: short
|
|
70
|
+
timeStyle: short
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
If both the copyright message and enabled build information are absent, the
|
|
74
|
+
footer is not rendered.
|
package/docs/theme.md
CHANGED
|
@@ -1,69 +1,95 @@
|
|
|
1
1
|
# Theme
|
|
2
2
|
|
|
3
|
-
`site/theme.md` defines
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
`site/theme.md` defines the site-wide visual theme for a `norna` site. It uses
|
|
4
|
+
YAML frontmatter and does not need a Markdown body. The root theme file is
|
|
5
|
+
required. The normal setup selects one complete theme preset and adds only
|
|
6
|
+
focused overrides when needed.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
exceptions; the normal place for shared visual choices is `site/theme.md`.
|
|
8
|
+
An optional `theme.md` inside a route directory replaces the root visual theme
|
|
9
|
+
for that route. Shared identity such as brand and logo remains site-wide and
|
|
10
|
+
belongs in `sitewide-content.md`.
|
|
11
11
|
|
|
12
|
-
##
|
|
12
|
+
## Theme Presets
|
|
13
|
+
|
|
14
|
+
Available complete theme presets are:
|
|
15
|
+
|
|
16
|
+
- `portfolio`: restrained typography and a broad image area for image-led
|
|
17
|
+
presentation.
|
|
18
|
+
- `documentation`: reading-focused typography, a paper palette, and compact
|
|
19
|
+
structural rhythm.
|
|
20
|
+
- `project`: compact layout and a light presentation for project and product
|
|
21
|
+
sites.
|
|
22
|
+
- `statement`: airy spacing and stronger typography for short editorial
|
|
23
|
+
content.
|
|
24
|
+
|
|
25
|
+
A normal `theme.md` can be only:
|
|
13
26
|
|
|
14
27
|
```yaml
|
|
15
28
|
---
|
|
16
|
-
|
|
17
|
-
|
|
29
|
+
preset: documentation
|
|
30
|
+
---
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Each preset supplies coordinated values for:
|
|
34
|
+
|
|
35
|
+
- layout density, page width, and gutters
|
|
36
|
+
- managed image sizing
|
|
37
|
+
- font family, typography preset, and typography rhythm
|
|
38
|
+
- palette and section-surface behaviour
|
|
39
|
+
|
|
40
|
+
The nested `typography.preset` setting documented below is a lower-level
|
|
41
|
+
typography choice. A top-level theme `preset` selects the complete visual
|
|
42
|
+
system, including that typography choice.
|
|
43
|
+
|
|
44
|
+
## Overrides
|
|
45
|
+
|
|
46
|
+
Values written beside the top-level preset override only that part of the
|
|
47
|
+
preset. Other preset values remain active:
|
|
48
|
+
|
|
49
|
+
```yaml
|
|
50
|
+
---
|
|
51
|
+
preset: documentation
|
|
18
52
|
layout:
|
|
19
|
-
|
|
20
|
-
pageWidth: 1180px
|
|
21
|
-
gutter:
|
|
22
|
-
desktop: clamp(1.25rem, 4vw, 3rem)
|
|
23
|
-
mobile: 1rem
|
|
24
|
-
gallery:
|
|
25
|
-
width: 900px
|
|
26
|
-
maxAvailableWidthPercent:
|
|
27
|
-
desktop: 100
|
|
28
|
-
mobile: 100
|
|
29
|
-
maxAvailableHeightPercent:
|
|
30
|
-
desktop: 74
|
|
31
|
-
mobile: 68
|
|
32
|
-
typography:
|
|
33
|
-
fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
|
|
34
|
-
preset: quiet-gallery
|
|
35
|
-
rhythm: normal
|
|
53
|
+
pageWidth: 1320px
|
|
36
54
|
presentation:
|
|
37
|
-
|
|
38
|
-
textColor: "#f7f4ee"
|
|
39
|
-
frame:
|
|
40
|
-
colors: presentation
|
|
55
|
+
palette: dark
|
|
41
56
|
---
|
|
42
57
|
```
|
|
43
58
|
|
|
44
|
-
|
|
45
|
-
`
|
|
46
|
-
|
|
47
|
-
configuration is the uncommented YAML below it.
|
|
59
|
+
Nested objects are merged by key. Arrays such as
|
|
60
|
+
`presentation.sectionSurfaces.sequence` replace the preset array when they are
|
|
61
|
+
specified.
|
|
48
62
|
|
|
49
|
-
|
|
63
|
+
It is still valid to omit the top-level preset and define the visual settings
|
|
64
|
+
explicitly. Omitted explicit settings then use engine defaults. This is useful
|
|
65
|
+
for focused testing, but selecting a complete preset is the simpler normal
|
|
66
|
+
workflow.
|
|
50
67
|
|
|
51
|
-
|
|
68
|
+
## Export A Preset
|
|
52
69
|
|
|
53
|
-
|
|
54
|
-
navigation.
|
|
70
|
+
Export the installed definition of a preset before choosing overrides:
|
|
55
71
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
72
|
+
```sh
|
|
73
|
+
norna theme:export documentation
|
|
74
|
+
```
|
|
59
75
|
|
|
60
|
-
|
|
76
|
+
In a generated site, the equivalent npm command is:
|
|
61
77
|
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
brand: Norna
|
|
78
|
+
```sh
|
|
79
|
+
npm run norna:theme:export -- documentation
|
|
65
80
|
```
|
|
66
81
|
|
|
82
|
+
The command creates `site/orig-documentation-theme.md`, or the corresponding
|
|
83
|
+
path under the selected site directory. The file contains the preset values,
|
|
84
|
+
comments describing accepted alternatives, and an example of a fine-grained
|
|
85
|
+
typography override.
|
|
86
|
+
|
|
87
|
+
Norna never loads `orig-*-theme.md`; only `theme.md` is active. The export
|
|
88
|
+
command refuses to overwrite an existing reference file.
|
|
89
|
+
|
|
90
|
+
Site identity is not part of the visual theme. Define the optional navigation
|
|
91
|
+
brand and logo settings in `site/sitewide-content.md`; see [Sitewide Content](sitewide-content.md).
|
|
92
|
+
|
|
67
93
|
## Layout
|
|
68
94
|
|
|
69
95
|
`layout` is optional. It controls the outer page geometry:
|
|
@@ -74,9 +100,9 @@ navigation:
|
|
|
74
100
|
`desktop` / `mobile` values.
|
|
75
101
|
- `density`: default structural spacing profile. Allowed values are `compact`,
|
|
76
102
|
`normal`, and `airy`.
|
|
77
|
-
- `spacing`: optional
|
|
78
|
-
|
|
79
|
-
|
|
103
|
+
- `spacing`: optional spacing overrides for sections and content blocks. Every
|
|
104
|
+
spacing value accepts either one CSS length for all viewports or `desktop` /
|
|
105
|
+
`mobile` values.
|
|
80
106
|
|
|
81
107
|
Example:
|
|
82
108
|
|
|
@@ -94,6 +120,12 @@ layout:
|
|
|
94
120
|
sectionGap:
|
|
95
121
|
desktop: clamp(1.4rem, 3vw, 2.75rem)
|
|
96
122
|
mobile: 1.5rem
|
|
123
|
+
headingToBlock:
|
|
124
|
+
desktop: 0.75em
|
|
125
|
+
mobile: 0.7em
|
|
126
|
+
blockGap:
|
|
127
|
+
desktop: 1.5em
|
|
128
|
+
mobile: 1.25em
|
|
97
129
|
```
|
|
98
130
|
|
|
99
131
|
If omitted, Norna uses `1180px` for `pageWidth`, desktop
|
|
@@ -105,11 +137,20 @@ Spacing keys:
|
|
|
105
137
|
- `firstSectionTop`: space above the first section heading.
|
|
106
138
|
- `sectionGap`: space above each following section.
|
|
107
139
|
- `finalSectionBottom`: space below the final section.
|
|
108
|
-
- `
|
|
140
|
+
- `headingToBlock`: space between a section heading and its first visual content
|
|
141
|
+
block, such as an image stack, carousel, or card list.
|
|
142
|
+
- `blockGap`: space between content blocks in a section. It applies between
|
|
143
|
+
Markdown, image, carousel, and card-list blocks, but not after the final block.
|
|
109
144
|
- `imageGap`: space between stacked images or carousel blocks.
|
|
110
145
|
|
|
111
|
-
|
|
112
|
-
|
|
146
|
+
The default `compact`, `normal`, and `airy` density profiles provide values for
|
|
147
|
+
these spacing keys. The `em` values for `headingToBlock` and `blockGap` are
|
|
148
|
+
relative to the relevant text size, so the rhythm follows typography changes.
|
|
149
|
+
Use `sectionGap` and the other structural keys when the distance should describe
|
|
150
|
+
the page layout rather than the size of nearby text.
|
|
151
|
+
|
|
152
|
+
Text-near spacing inside Markdown, such as spacing after headings, spacing
|
|
153
|
+
before Markdown subheadings, paragraph spacing, and caption spacing, belongs to
|
|
113
154
|
`typography.rhythm` and typography overrides.
|
|
114
155
|
|
|
115
156
|
## Image Sizing
|
|
@@ -153,18 +194,20 @@ Example:
|
|
|
153
194
|
```yaml
|
|
154
195
|
typography:
|
|
155
196
|
fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
|
|
156
|
-
preset:
|
|
197
|
+
preset: text-forward
|
|
157
198
|
rhythm: normal
|
|
158
199
|
overrides:
|
|
159
200
|
headings:
|
|
160
201
|
h2:
|
|
161
202
|
size: medium
|
|
203
|
+
weight: 600
|
|
162
204
|
spacingAfter: 0.55em
|
|
163
205
|
h3:
|
|
164
206
|
size: medium
|
|
165
207
|
spacingBefore: 1.5em
|
|
166
208
|
spacingAfter: 0.5em
|
|
167
209
|
body:
|
|
210
|
+
width: narrow
|
|
168
211
|
lineHeight: 1.55
|
|
169
212
|
```
|
|
170
213
|
|
|
@@ -174,107 +217,49 @@ selected site. See [Typography](typography.md).
|
|
|
174
217
|
|
|
175
218
|
## Presentation
|
|
176
219
|
|
|
177
|
-
`presentation` is optional. It
|
|
220
|
+
`presentation` is optional. It selects a small built-in visual palette for the
|
|
221
|
+
page frame and defines how section surfaces are assigned:
|
|
178
222
|
|
|
179
|
-
- `
|
|
180
|
-
|
|
181
|
-
- `
|
|
182
|
-
|
|
183
|
-
|
|
223
|
+
- `palette`: `dark`, `light`, or `paper`. The palette controls the page,
|
|
224
|
+
navigation, footer, and section colors.
|
|
225
|
+
- `sectionSurfaces.mode`: `none` or `cycle`.
|
|
226
|
+
- `sectionSurfaces.sequence`: optional sequence of `base`, `soft`, and
|
|
227
|
+
`emphasis`. Each surface may occur at most once.
|
|
184
228
|
|
|
185
229
|
Example:
|
|
186
230
|
|
|
187
231
|
```yaml
|
|
188
232
|
presentation:
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
## Page And Section Overrides
|
|
194
|
-
|
|
195
|
-
Site-wide presentation belongs in `site/theme.md`. Page-level presentation in a
|
|
196
|
-
page file is always an override on top of the theme:
|
|
197
|
-
|
|
198
|
-
```yaml
|
|
199
|
-
presentation:
|
|
200
|
-
typography:
|
|
201
|
-
overrides:
|
|
202
|
-
headings:
|
|
203
|
-
h2:
|
|
204
|
-
size: large
|
|
205
|
-
spacingAfter: 0.6em
|
|
206
|
-
body:
|
|
207
|
-
paragraphSpacing: 1em
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
Section-specific presentation belongs under
|
|
211
|
-
`sections.<section-id>.presentation`. Use it when one section genuinely needs
|
|
212
|
-
different presentation; do not use `sections` to define section order or normal
|
|
213
|
-
Markdown structure.
|
|
214
|
-
|
|
215
|
-
```yaml
|
|
216
|
-
sections:
|
|
217
|
-
intro:
|
|
218
|
-
presentation:
|
|
219
|
-
backgroundColor: "#161616"
|
|
220
|
-
textColor: "#ffffff"
|
|
221
|
-
typography:
|
|
222
|
-
preset: statement
|
|
233
|
+
palette: paper # Alternatives: dark, light
|
|
234
|
+
sectionSurfaces:
|
|
235
|
+
mode: cycle
|
|
236
|
+
sequence: [base, soft, emphasis]
|
|
223
237
|
```
|
|
224
238
|
|
|
225
|
-
|
|
226
|
-
section omits `presentation`, it uses the resolved page presentation.
|
|
227
|
-
|
|
228
|
-
Configured section backgrounds render as full-width horizontal bands while the
|
|
229
|
-
section content keeps the normal page and image widths. The top spacing
|
|
230
|
-
before the first heading, the spacing between sections, and the spacing after
|
|
231
|
-
the final section are part of the section background.
|
|
232
|
-
|
|
233
|
-
Configured section text colors apply to section headings, Markdown text,
|
|
234
|
-
Markdown subheadings, and image captions. Links keep the global accent color.
|
|
235
|
-
|
|
236
|
-
## Frame Colors
|
|
239
|
+
## Route Themes
|
|
237
240
|
|
|
238
|
-
`
|
|
241
|
+
Add `theme.md` to a route directory when that route should have a different
|
|
242
|
+
visual expression:
|
|
239
243
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
- `presentation`: use the resolved presentation colors for this level.
|
|
243
|
-
- `theme`: use the site theme frame colors. This is useful in page-level
|
|
244
|
-
frontmatter.
|
|
245
|
-
- explicit colors:
|
|
246
|
-
|
|
247
|
-
```yaml
|
|
248
|
-
frame:
|
|
249
|
-
colors:
|
|
250
|
-
backgroundColor: "#111111"
|
|
251
|
-
textColor: "#eeeeee"
|
|
244
|
+
```text
|
|
245
|
+
site/routes/010-guide/theme.md
|
|
252
246
|
```
|
|
253
247
|
|
|
254
|
-
The
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
## Inline Styles
|
|
258
|
-
|
|
259
|
-
`presentation.inlineStyles` defines named inline text styles that can be used
|
|
260
|
-
from Markdown:
|
|
248
|
+
The route theme uses the same visual schema and complete presets as the root
|
|
249
|
+
theme. A route can therefore select a different expression without repeating a
|
|
250
|
+
large configuration:
|
|
261
251
|
|
|
262
252
|
```yaml
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
color: "#ffd84d"
|
|
253
|
+
---
|
|
254
|
+
preset: statement
|
|
255
|
+
---
|
|
267
256
|
```
|
|
268
257
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
Apply an inline style in Markdown with `[text]{.style-name}`:
|
|
274
|
-
|
|
275
|
-
```md
|
|
276
|
-
This sentence contains [highlighted text]{.highlight}.
|
|
277
|
-
```
|
|
258
|
+
It completely replaces the root visual theme for that route. If the route
|
|
259
|
+
theme selects no top-level preset, omitted values use engine defaults rather
|
|
260
|
+
than values from the root theme. It cannot define navigation, brand, logo, or
|
|
261
|
+
technical configuration.
|
|
278
262
|
|
|
279
|
-
|
|
280
|
-
|
|
263
|
+
Section surfaces render as full-width horizontal bands while the section
|
|
264
|
+
content keeps the normal page and image widths. Links keep the palette's global
|
|
265
|
+
accent color.
|
package/docs/typography.md
CHANGED
|
@@ -3,12 +3,20 @@
|
|
|
3
3
|
`norna` typography is configured in `site/theme.md` through a site-wide font,
|
|
4
4
|
presets, text rhythm, and optional overrides.
|
|
5
5
|
|
|
6
|
-
The normal
|
|
7
|
-
|
|
8
|
-
Page and section files may override the theme when a focused exception is
|
|
9
|
-
needed, but the normal workflow is to keep typography in `theme.md`.
|
|
6
|
+
The normal workflow is to select a complete top-level theme preset. It already
|
|
7
|
+
chooses a coordinated font, typography preset, and rhythm:
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
```yaml
|
|
10
|
+
---
|
|
11
|
+
preset: documentation
|
|
12
|
+
---
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Use the nested `typography` block only when those typographic choices need to
|
|
16
|
+
differ from the selected theme preset. Typography is configured at root-theme
|
|
17
|
+
or route-theme level, not in page or section content.
|
|
18
|
+
|
|
19
|
+
## Typography Presets
|
|
12
20
|
|
|
13
21
|
Available presets:
|
|
14
22
|
|
|
@@ -21,13 +29,25 @@ Available presets:
|
|
|
21
29
|
- `statement`: tighter, more declarative line-height for short programmatic
|
|
22
30
|
statements. Use it sparingly, usually as a page or section exception.
|
|
23
31
|
|
|
24
|
-
If theme
|
|
32
|
+
If a complete top-level theme preset is selected, that preset supplies the
|
|
33
|
+
typography choice. If both the top-level preset and nested typography are
|
|
34
|
+
omitted, the engine default is `quiet-gallery`.
|
|
25
35
|
|
|
26
|
-
Presets define alignment, size, and line height for `headings.h1`
|
|
27
|
-
`headings.h4`, `body`, and `caption`.
|
|
28
|
-
|
|
29
|
-
Markdown heading level, so `h1`
|
|
30
|
-
and so on.
|
|
36
|
+
Presets define alignment, size, weight, and line height for `headings.h1`
|
|
37
|
+
through `headings.h4`, `body`, and `caption`. They also choose a readable body
|
|
38
|
+
text width. Built-in presets use `medium` as the default size for every text
|
|
39
|
+
role. Visual heading hierarchy comes from the Markdown heading level, so `h1`
|
|
40
|
+
is larger than `h2`, `h2` is larger than `h3`, and so on.
|
|
41
|
+
|
|
42
|
+
The presets use these controls deliberately:
|
|
43
|
+
|
|
44
|
+
- `quiet-gallery` uses restrained heading weights and a normal reading width.
|
|
45
|
+
- `compact-gallery` uses stronger headings and a wider text column for short,
|
|
46
|
+
scannable content.
|
|
47
|
+
- `text-forward` uses a narrower reading width and more generous body line
|
|
48
|
+
height.
|
|
49
|
+
- `statement` uses the strongest heading weights and a narrow text column for
|
|
50
|
+
short, declarative content.
|
|
31
51
|
|
|
32
52
|
`rhythm` defines text-near spacing for headings, paragraphs, and captions.
|
|
33
53
|
Available rhythms are `compact`, `normal`, and `airy`. Built-in rhythm values
|
|
@@ -62,12 +82,14 @@ typography:
|
|
|
62
82
|
headings:
|
|
63
83
|
h2:
|
|
64
84
|
size: medium
|
|
85
|
+
weight: 600
|
|
65
86
|
spacingAfter: 0.55em
|
|
66
87
|
h3:
|
|
67
88
|
size: medium
|
|
68
89
|
spacingBefore: 1.5em
|
|
69
90
|
spacingAfter: 0.5em
|
|
70
91
|
body:
|
|
92
|
+
width: narrow
|
|
71
93
|
paragraphSpacing: 0.8em
|
|
72
94
|
caption:
|
|
73
95
|
spacingBefore: 0.5em
|
|
@@ -104,56 +126,61 @@ follows the Markdown level the user wrote: `##` uses `headings.h2`.
|
|
|
104
126
|
`spacingAfter`, and `paragraphSpacing` are CSS lengths such as `0`, `0.8em`,
|
|
105
127
|
`1rem`, or `12px`. Use `em` for spacing that should track the text size.
|
|
106
128
|
|
|
129
|
+
`weight` is a controlled heading weight. Allowed values are `400`, `500`,
|
|
130
|
+
`600`, and `700`. `body.width` is the readable text width and accepts
|
|
131
|
+
`narrow`, `normal`, or `wide`. It controls the prose column, not the page's
|
|
132
|
+
maximum width or the width of image blocks.
|
|
133
|
+
|
|
107
134
|
Supported override fields:
|
|
108
135
|
|
|
109
|
-
- `headings.h1.align`, `headings.h1.size`, `headings.h1.
|
|
136
|
+
- `headings.h1.align`, `headings.h1.size`, `headings.h1.weight`,
|
|
137
|
+
`headings.h1.lineHeight`,
|
|
110
138
|
`headings.h1.spacingBefore`, `headings.h1.spacingAfter`
|
|
111
|
-
- `headings.h2.align`, `headings.h2.size`, `headings.h2.
|
|
139
|
+
- `headings.h2.align`, `headings.h2.size`, `headings.h2.weight`,
|
|
140
|
+
`headings.h2.lineHeight`,
|
|
112
141
|
`headings.h2.spacingBefore`, `headings.h2.spacingAfter`
|
|
113
|
-
- `headings.h3.align`, `headings.h3.size`, `headings.h3.
|
|
142
|
+
- `headings.h3.align`, `headings.h3.size`, `headings.h3.weight`,
|
|
143
|
+
`headings.h3.lineHeight`,
|
|
114
144
|
`headings.h3.spacingBefore`, `headings.h3.spacingAfter`
|
|
115
|
-
- `headings.h4.align`, `headings.h4.size`, `headings.h4.
|
|
145
|
+
- `headings.h4.align`, `headings.h4.size`, `headings.h4.weight`,
|
|
146
|
+
`headings.h4.lineHeight`,
|
|
116
147
|
`headings.h4.spacingBefore`, `headings.h4.spacingAfter`
|
|
117
|
-
- `body.align`, `body.size`, `body.
|
|
148
|
+
- `body.align`, `body.size`, `body.width`, `body.lineHeight`,
|
|
149
|
+
`body.paragraphSpacing`
|
|
118
150
|
- `caption.align`, `caption.size`, `caption.lineHeight`,
|
|
119
151
|
`caption.spacingBefore`
|
|
120
152
|
|
|
121
|
-
##
|
|
153
|
+
## Route Themes
|
|
122
154
|
|
|
123
|
-
|
|
155
|
+
The simplest route-specific typography change is to select a complete theme
|
|
156
|
+
preset:
|
|
124
157
|
|
|
125
158
|
```yaml
|
|
126
|
-
# site/theme.md
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
rhythm: normal
|
|
159
|
+
# site/routes/010-introduction/theme.md
|
|
160
|
+
---
|
|
161
|
+
preset: statement
|
|
162
|
+
---
|
|
131
163
|
```
|
|
132
164
|
|
|
133
|
-
A
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
character for that section. `rhythm` is inherited separately, so changing
|
|
137
|
-
preset does not change spacing unless `rhythm` is also set.
|
|
138
|
-
|
|
139
|
-
If a section sets `typography.rhythm`, that section changes text-near spacing.
|
|
140
|
-
If a section only sets `typography.overrides`, it keeps the resolved page
|
|
141
|
-
preset and rhythm and changes only the specified values.
|
|
165
|
+
A route-local `theme.md` replaces the root visual theme rather than inheriting
|
|
166
|
+
from it. The complete preset supplies a coherent route theme without repeating
|
|
167
|
+
the root values.
|
|
142
168
|
|
|
143
|
-
|
|
169
|
+
Use a nested typography choice when only the typographic character needs to be
|
|
170
|
+
specified explicitly:
|
|
144
171
|
|
|
145
172
|
```yaml
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
body:
|
|
153
|
-
paragraphSpacing: 0.7em
|
|
173
|
+
# site/routes/010-introduction/theme.md
|
|
174
|
+
---
|
|
175
|
+
typography:
|
|
176
|
+
preset: statement
|
|
177
|
+
rhythm: normal
|
|
178
|
+
---
|
|
154
179
|
```
|
|
155
180
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
181
|
+
Without a top-level theme preset, other omitted route-theme values use engine
|
|
182
|
+
defaults rather than values from the root theme.
|
|
183
|
+
|
|
184
|
+
The `body.width` value controls the prose column independently of the page and
|
|
185
|
+
image widths. Captions are normally centered, but `text-forward` uses
|
|
186
|
+
left-aligned captions to support longer explanatory text.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Norna examples
|
|
2
|
+
|
|
3
|
+
Runnable examples are grouped by purpose.
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
examples/
|
|
7
|
+
|-- complete-sites/
|
|
8
|
+
| |-- dog-shelter-single-page/
|
|
9
|
+
| `-- dog-shelter-multi-page/
|
|
10
|
+
`-- feature-demos/
|
|
11
|
+
|-- theme-presets/
|
|
12
|
+
`-- media-and-surfaces/
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Complete sites
|
|
16
|
+
|
|
17
|
+
`complete-sites/` contains small sites that can be read as coherent examples
|
|
18
|
+
of a Norna project.
|
|
19
|
+
|
|
20
|
+
- `dog-shelter-single-page/` demonstrates a homepage made from sections.
|
|
21
|
+
- `dog-shelter-multi-page/` adds ordered routes and route-local content.
|
|
22
|
+
|
|
23
|
+
## Feature demos
|
|
24
|
+
|
|
25
|
+
`feature-demos/` contains focused visual test benches. They are useful for
|
|
26
|
+
documentation, manual inspection and integration checks, but are not intended
|
|
27
|
+
as starter templates.
|
|
28
|
+
|
|
29
|
+
- `theme-presets/` compares Norna's complete built-in theme presets.
|
|
30
|
+
- `media-and-surfaces/` demonstrates managed media blocks, notes, palettes and
|
|
31
|
+
section surfaces.
|
|
32
|
+
|
|
33
|
+
The repository's GitHub Pages workflow publishes rendered copies under
|
|
34
|
+
`https://janga.github.io/norna/examples/` so the HTML documentation can link to
|
|
35
|
+
working sites rather than only their source files.
|
|
36
|
+
|
|
37
|
+
Run an example from the repository root by passing its `site/` directory:
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
node bin/norna.mjs --site-dir examples/feature-demos/media-and-surfaces/site dev:local
|
|
41
|
+
```
|