@janga/norna 0.7.16 → 0.7.18
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 -9
- package/astro.config.mjs +35 -3
- package/bin/norna-cli.mjs +1 -1
- package/docs/README.md +16 -14
- package/docs/commands.md +2 -2
- package/docs/configuration.md +25 -2
- package/docs/content.md +92 -103
- package/docs/design/navigation-and-theme-plan.md +186 -0
- package/docs/design/norna-diagram-design.md +9 -9
- package/docs/design/site-examples-structure.md +15 -11
- package/docs/engine-development.md +19 -22
- package/docs/getting-started.md +21 -16
- package/docs/images-and-metadata.md +12 -9
- package/docs/pages.md +190 -0
- package/docs/public-files.md +49 -36
- package/docs/publishing.md +19 -3
- package/docs/site-files.md +46 -38
- package/docs/sitewide-content.md +20 -36
- package/docs/theme.md +109 -143
- package/docs/typography.md +19 -31
- package/examples/README.md +10 -4
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +17 -41
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +26 -67
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +185 -88
- package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -1
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev-local.json +4 -4
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +5 -5
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +33 -23
- package/examples/complete-sites/dog-shelter-multi-page/README.md +1 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +8 -8
- package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +20 -20
- package/examples/complete-sites/dog-shelter-multi-page/site/{content.md → pages/000-home/content.md} +3 -4
- package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/010-dogs/content.md +3 -4
- package/examples/complete-sites/dog-shelter-multi-page/site/{routes → pages}/020-adopt/content.md +3 -4
- package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +2 -4
- package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +17 -41
- package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +26 -67
- package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +185 -88
- package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +1 -1
- package/examples/complete-sites/dog-shelter-single-page/.astro/dev-local.json +8 -0
- package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +5 -5
- package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +16 -12
- package/examples/complete-sites/dog-shelter-single-page/README.md +1 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +8 -8
- package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +12 -12
- package/examples/complete-sites/dog-shelter-single-page/site/{content.md → pages/000-home/content.md} +5 -2
- package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +2 -4
- package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +17 -41
- package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +26 -67
- package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +180 -91
- package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
- package/examples/feature-demos/media-and-surfaces/.astro/dev.log +4 -14
- package/examples/feature-demos/media-and-surfaces/README.md +2 -2
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +9 -9
- package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +16 -16
- package/examples/feature-demos/media-and-surfaces/site/{content.md → pages/000-home/content.md} +4 -7
- package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/010-media/content.md +6 -5
- package/examples/feature-demos/media-and-surfaces/site/{routes → pages}/020-surfaces/content.md +9 -7
- package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +2 -0
- package/examples/feature-demos/media-and-surfaces/site/sitewide-content.yaml +0 -2
- package/examples/feature-demos/sitewide-content/README.md +3 -3
- package/examples/feature-demos/sitewide-content/site/pages/000-home/content.md +17 -0
- package/examples/feature-demos/sitewide-content/site/pages/010-logo-and-navigation/content.md +17 -0
- package/examples/feature-demos/sitewide-content/site/{routes → pages}/020-notices/content.md +7 -6
- package/examples/feature-demos/sitewide-content/site/{routes → pages}/030-footer/content.md +6 -5
- package/examples/feature-demos/sitewide-content/site/sitewide-content.yaml +4 -13
- package/examples/feature-demos/theme-preset-documentation/README.md +16 -0
- package/examples/feature-demos/theme-preset-documentation/site/.norna/generated-images.json +74 -0
- package/examples/feature-demos/{theme-presets/site/routes/020-documentation → theme-preset-documentation/site/pages/000-home}/content.md +4 -7
- package/examples/feature-demos/theme-preset-documentation/site/sitewide-content.yaml +3 -0
- package/examples/feature-demos/theme-preset-portfolio/README.md +16 -0
- package/examples/feature-demos/theme-preset-portfolio/site/.norna/generated-images.json +74 -0
- package/examples/feature-demos/theme-preset-portfolio/site/config.yaml +1 -0
- package/examples/feature-demos/{theme-presets/site/routes/010-portfolio → theme-preset-portfolio/site/pages/000-home}/content.md +4 -7
- package/examples/feature-demos/theme-preset-portfolio/site/public/robots.txt +2 -0
- package/examples/feature-demos/theme-preset-portfolio/site/sitewide-content.yaml +3 -0
- package/examples/feature-demos/theme-preset-project/README.md +16 -0
- package/examples/feature-demos/theme-preset-project/site/.norna/generated-images.json +74 -0
- package/examples/feature-demos/theme-preset-project/site/config.yaml +1 -0
- package/examples/feature-demos/{theme-presets/site/routes/030-project → theme-preset-project/site/pages/000-home}/content.md +4 -7
- package/examples/feature-demos/theme-preset-project/site/public/robots.txt +2 -0
- package/examples/feature-demos/theme-preset-project/site/sitewide-content.yaml +3 -0
- package/examples/feature-demos/theme-preset-statement/README.md +16 -0
- package/examples/feature-demos/theme-preset-statement/site/.norna/generated-images.json +74 -0
- package/examples/feature-demos/theme-preset-statement/site/config.yaml +1 -0
- package/examples/feature-demos/{theme-presets/site/routes/040-statement → theme-preset-statement/site/pages/000-home}/content.md +4 -7
- package/examples/feature-demos/theme-preset-statement/site/public/robots.txt +2 -0
- package/examples/feature-demos/theme-preset-statement/site/sitewide-content.yaml +3 -0
- package/fixtures/basic/site/{content.md → pages/000-home/content.md} +5 -6
- package/fixtures/basic/site/sitewide-content.yaml +1 -8
- package/fixtures/basic/site/theme.yaml +1 -8
- package/fixtures/content-model-v2/site/{content.md → pages/000-home/content.md} +11 -13
- package/fixtures/content-model-v2/site/pages/010-guide/content.md +18 -0
- package/fixtures/nested-pages/.astro/collections/site.schema.json +35 -0
- package/fixtures/nested-pages/.astro/collections/sitewide.schema.json +97 -0
- package/fixtures/nested-pages/.astro/collections/theme.schema.json +844 -0
- package/fixtures/nested-pages/.astro/content-assets.mjs +4 -0
- package/fixtures/nested-pages/.astro/content-modules.mjs +1 -0
- package/fixtures/nested-pages/.astro/content.d.ts +183 -0
- package/fixtures/nested-pages/.astro/data-store.json +1 -0
- package/fixtures/nested-pages/.astro/dev-local.json +8 -0
- package/fixtures/nested-pages/.astro/dev.log +1128 -0
- package/fixtures/nested-pages/.astro/settings.json +5 -0
- package/fixtures/nested-pages/.astro/types.d.ts +2 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/_metadata.json +74 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/package.json +3 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
- package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
- package/fixtures/nested-pages/site/.norna/generated-images.json +10 -0
- package/fixtures/nested-pages/site/config.yaml +3 -0
- package/fixtures/nested-pages/site/pages/000-home/content.md +15 -0
- package/fixtures/nested-pages/site/pages/010-guides/content.md +15 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/content.md +21 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/images/diagram.svg +21 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +18 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/theme.yaml +2 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/020-workflows/content.md +11 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/030-release-notes/content.md +9 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/040-configuration/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/050-content/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/060-themes/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/070-images/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/080-cards/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/090-notes/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/100-validation/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/110-synchronization/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/120-building/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/130-publishing/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/140-troubleshooting/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/150-migration/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/160-accessibility/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/170-performance/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/180-security/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/190-localization/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/200-upgrading/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/210-faq/content.md +3 -0
- package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +7 -0
- package/fixtures/nested-pages/site/pages/020-reference/content.md +10 -0
- package/fixtures/nested-pages/site/pages/020-reference/pages/010-installation/content.md +11 -0
- package/fixtures/nested-pages/site/theme.yaml +1 -0
- package/package.json +8 -4
- package/schemas/config.schema.json +46 -5
- package/schemas/content-frontmatter.schema.json +28 -63
- package/schemas/manifest.json +4 -2
- package/schemas/page-theme.schema.json +192 -0
- package/schemas/sitewide-content.schema.json +58 -132
- package/schemas/theme.schema.json +434 -152
- package/scripts/check-config.mjs +8 -6
- package/scripts/deploy-site.mjs +6 -8
- package/scripts/doctor.mjs +2 -2
- package/scripts/generate-images.mjs +15 -29
- package/scripts/generate-schemas.mjs +7 -218
- package/scripts/lib/base-path-redirect.mjs +9 -0
- package/scripts/lib/editor-language-service.mjs +125 -79
- package/scripts/lib/example-sites.mjs +15 -3
- package/scripts/lib/heading-ids.mjs +161 -0
- package/scripts/lib/navigation-model.mjs +51 -0
- package/scripts/lib/norna-markdown-blocks.mjs +3 -4
- package/scripts/lib/page-model.mjs +102 -0
- package/scripts/lib/presentation.mjs +25 -17
- package/scripts/lib/project-config.mjs +46 -8
- package/scripts/lib/schema-definitions.mjs +78 -55
- package/scripts/lib/schema-editor-metadata.mjs +519 -0
- package/scripts/lib/schema-value-definitions.mjs +20 -6
- package/scripts/lib/site-content.mjs +159 -97
- package/scripts/lib/site-conventions.mjs +1 -0
- package/scripts/lib/site-paths.mjs +11 -5
- package/scripts/lib/theme-config.mjs +12 -18
- package/scripts/lib/theme-presets.mjs +55 -14
- package/scripts/release.mjs +1 -1
- package/scripts/show-typography.mjs +4 -30
- package/scripts/sync-content-sections.mjs +107 -68
- package/scripts/{test-temporary-visibility.mjs → test-banner-visibility.mjs} +8 -25
- package/scripts/test-client-javascript.mjs +50 -46
- package/scripts/test-content-check.mjs +153 -69
- package/scripts/test-content-model-v2.mjs +566 -285
- package/scripts/test-documentation.mjs +10 -3
- package/scripts/test-editor-language-service.mjs +172 -25
- package/scripts/test-engine-commands.mjs +6 -5
- package/scripts/test-examples.mjs +30 -1
- package/scripts/test-heading-ids.mjs +68 -0
- package/scripts/test-navigation-model.mjs +63 -0
- package/scripts/test-navigation.mjs +11 -2
- package/scripts/test-nested-pages.mjs +125 -0
- package/scripts/test-package-check.mjs +55 -95
- package/scripts/test-page-model.mjs +108 -0
- package/scripts/test-project-config.mjs +22 -3
- package/scripts/test-schemas.mjs +82 -15
- package/scripts/test-theme-presets.mjs +57 -42
- package/src/components/NavigationPageTree.astro +157 -0
- package/src/components/PageContentsLinks.astro +40 -0
- package/src/components/SectionNavigationScript.astro +117 -5
- package/src/components/SiteBreadcrumbs.astro +32 -0
- package/src/components/SiteNavigation.astro +97 -68
- package/src/components/SitePage.astro +93 -55
- package/src/components/SiteSection.astro +29 -27
- package/src/components/SiteTreeNavigation.astro +35 -0
- package/src/components/TreeNavigationScript.astro +83 -0
- package/src/content.config.ts +8 -10
- package/src/layouts/BaseLayout.astro +21 -20
- package/src/lib/pageThemes.ts +44 -0
- package/src/lib/sectionContent.ts +106 -107
- package/src/lib/siteNavigation.ts +49 -0
- package/src/lib/sitePages.ts +96 -38
- package/src/pages/{[slug].astro → [...slug].astro} +2 -2
- package/src/pages/index.astro +2 -1
- package/src/styles/global.css +743 -57
- package/starters/basic/README.md +9 -11
- package/starters/basic/site/{content.md → pages/000-home/content.md} +7 -4
- package/starters/basic/site/sitewide-content.yaml +1 -10
- package/starters/basic/site/theme.yaml +1 -105
- package/starters/project/README.md +14 -14
- package/starters/project/site/{content.md → pages/000-home/content.md} +5 -4
- package/starters/project/site/{routes → pages}/010-guide/content.md +5 -4
- package/starters/project/site/sitewide-content.yaml +1 -10
- package/starters/project/site/theme.yaml +1 -31
- package/docs/routes.md +0 -121
- package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/theme.yaml +0 -3
- package/examples/feature-demos/sitewide-content/site/content.md +0 -16
- package/examples/feature-demos/sitewide-content/site/routes/010-identity/content.md +0 -20
- package/examples/feature-demos/theme-presets/README.md +0 -18
- package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +0 -290
- package/examples/feature-demos/theme-presets/site/content.md +0 -17
- package/examples/feature-demos/theme-presets/site/sitewide-content.yaml +0 -12
- package/examples/feature-demos/theme-presets/site/theme.yaml +0 -1
- package/fixtures/content-model-v2/site/routes/010-guide/content.md +0 -17
- package/scripts/lib/route-model.mjs +0 -17
- package/scripts/test-route-model.mjs +0 -32
- package/src/lib/routeThemes.ts +0 -41
- /package/examples/complete-sites/dog-shelter-multi-page/site/{images/intro → pages/000-home/images}/shelter-dog.jpg +0 -0
- /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rex.jpg +0 -0
- /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/010-dogs/images/dogs → pages/010-dogs/images}/rover.jpg +0 -0
- /package/examples/complete-sites/dog-shelter-multi-page/site/{routes/020-adopt/images/adopt → pages/020-adopt/images}/adoption-dog.jpg +0 -0
- /package/examples/complete-sites/dog-shelter-single-page/site/{images/you-can-help → pages/000-home/images}/foster-dog.jpg +0 -0
- /package/examples/complete-sites/dog-shelter-single-page/site/{images/what-we-do → pages/000-home/images}/rescue-dog.jpg +0 -0
- /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-carousel.svg +0 -0
- /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-stack.svg +0 -0
- /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/cards → pages/010-media/images}/card-surfaces.svg +0 -0
- /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-one.svg +0 -0
- /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-three.svg +0 -0
- /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/carousel → pages/010-media/images}/carousel-two.svg +0 -0
- /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-one.svg +0 -0
- /package/examples/feature-demos/media-and-surfaces/site/{routes/010-media/images/stack → pages/010-media/images}/stack-two.svg +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/config.yaml +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/020-documentation/images/documentation → theme-preset-documentation/site/pages/000-home/images}/black-schnauzer.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/020-documentation/images/documentation → theme-preset-documentation/site/pages/000-home/images}/retriever-portrait.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/020-documentation/images/documentation → theme-preset-documentation/site/pages/000-home/images}/schnauzer-portrait.jpg +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/public/robots.txt +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/020-documentation → theme-preset-documentation/site}/theme.yaml +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio/images/portfolio → theme-preset-portfolio/site/pages/000-home/images}/puppy-portrait.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio/images/portfolio → theme-preset-portfolio/site/pages/000-home/images}/shepherd-portrait.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio/images/portfolio → theme-preset-portfolio/site/pages/000-home/images}/white-puppy.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/010-portfolio → theme-preset-portfolio/site}/theme.yaml +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/routeTheme.schema.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/site.schema.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/sitewide.schema.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/collections/theme.schema.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-assets.mjs +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content-modules.mjs +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/content.d.ts +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/data-store.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev-local.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/dev.log +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/settings.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/.astro/types.d.ts +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/_metadata.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/package.json +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-project}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/030-project/images/project → theme-preset-project/site/pages/000-home/images}/boxer-portrait.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/030-project/images/project → theme-preset-project/site/pages/000-home/images}/grass-puppy.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/030-project/images/project → theme-preset-project/site/pages/000-home/images}/grey-street-dog.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/030-project → theme-preset-project/site}/theme.yaml +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/040-statement/images/statement → theme-preset-statement/site/pages/000-home/images}/black-pedigree.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/040-statement/images/statement → theme-preset-statement/site/pages/000-home/images}/sheepdog-grass.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/040-statement/images/statement → theme-preset-statement/site/pages/000-home/images}/sheepdog-wide.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/routes/040-statement → theme-preset-statement/site}/theme.yaml +0 -0
- /package/fixtures/basic/site/{images/work → pages/000-home/images}/.gitkeep +0 -0
- /package/fixtures/content-model-v2/site/{images/card-section → pages/000-home/images}/adopt.svg +0 -0
- /package/fixtures/content-model-v2/site/{images/intro → pages/000-home/images}/detail.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images/intro → pages/000-home/images}/duplicate.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images/card-section → pages/000-home/images}/foster.svg +0 -0
- /package/fixtures/content-model-v2/site/{images/intro → pages/000-home/images}/hero.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images/plain → pages/000-home/images}/image.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images/timed → pages/000-home/images}/slide-one.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images/timed → pages/000-home/images}/slide-three.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images/timed → pages/000-home/images}/slide-two.jpg +0 -0
- /package/fixtures/content-model-v2/site/{routes/010-guide/images/intro → pages/010-guide/images}/duplicate.jpg +0 -0
- /package/starters/basic/site/{images/work → pages/000-home/images}/.gitkeep +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Navigation And Theme Plan
|
|
2
|
+
|
|
3
|
+
This document records the intended order of work for page hierarchy,
|
|
4
|
+
navigation, and theme presets. It is an implementation plan, not a description
|
|
5
|
+
of released behavior.
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Norna should support sites with limited global navigation and a larger local
|
|
10
|
+
page hierarchy without making mobile navigation harder to understand. Theme
|
|
11
|
+
presets should provide a coherent visual system without changing the site's
|
|
12
|
+
information architecture.
|
|
13
|
+
|
|
14
|
+
## Working Principles
|
|
15
|
+
|
|
16
|
+
- The file structure defines the page hierarchy and presentation order.
|
|
17
|
+
- Navigation behavior and navigation styling are separate concerns.
|
|
18
|
+
- Global site navigation, local page navigation, and headings on the current
|
|
19
|
+
page have distinct roles.
|
|
20
|
+
- Changing a theme preset must not change which pages are available or how the
|
|
21
|
+
page hierarchy is interpreted.
|
|
22
|
+
- Site-wide visual identity should remain coherent while individual pages may
|
|
23
|
+
vary where that does not disrupt navigation or orientation.
|
|
24
|
+
- Documentation and broad example migration should follow implementation and
|
|
25
|
+
manual evaluation, not precede them.
|
|
26
|
+
|
|
27
|
+
## Order Of Work
|
|
28
|
+
|
|
29
|
+
### 1. Stabilize The Page Tree - Complete
|
|
30
|
+
|
|
31
|
+
Finish and test nested page discovery independently of final navigation
|
|
32
|
+
presentation. Establish deterministic rules for:
|
|
33
|
+
|
|
34
|
+
- directory parsing, page ids, URL paths, and presentation order;
|
|
35
|
+
- parent and ancestor relationships;
|
|
36
|
+
- collisions and invalid nesting;
|
|
37
|
+
- page-local content, images, and themes;
|
|
38
|
+
- breadcrumbs and current-branch discovery.
|
|
39
|
+
|
|
40
|
+
Commit this foundation separately before broad theme or preset changes.
|
|
41
|
+
|
|
42
|
+
The page tree now supports nested pages with deterministic directory parsing,
|
|
43
|
+
URLs, ordering, ancestry, breadcrumbs, inherited page resources, and collision
|
|
44
|
+
diagnostics.
|
|
45
|
+
|
|
46
|
+
The current breaking page-container proof of concept removes the special root
|
|
47
|
+
page. Every page now uses the same physical model:
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
site/pages/NNN-page-id/
|
|
51
|
+
content.md
|
|
52
|
+
theme.yaml # optional page-local presentation
|
|
53
|
+
images/ # optional managed page images
|
|
54
|
+
pages/ # optional child pages
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
`site/pages/000-home/content.md` is required and maps to `/`. The `000` prefix
|
|
58
|
+
is reserved for this page. Other top-level page directories are its siblings,
|
|
59
|
+
not its children. The homepage cannot contain a `pages/` hierarchy; place each
|
|
60
|
+
top-level area beside `000-home` and nest further pages below that area.
|
|
61
|
+
|
|
62
|
+
The root `site/` directory now contains only site-wide files and the page
|
|
63
|
+
container. Removed root-level page and image locations produce a migration
|
|
64
|
+
error instead of being interpreted as a second page model.
|
|
65
|
+
|
|
66
|
+
### 2. Define The Navigation Contract - Complete
|
|
67
|
+
|
|
68
|
+
The accepted information architecture is:
|
|
69
|
+
|
|
70
|
+
- a small global navigation for the site's top-level areas;
|
|
71
|
+
- a larger local page tree for the selected area;
|
|
72
|
+
- breadcrumbs for location and ancestry;
|
|
73
|
+
- headings for the current page integrated below that page in the local tree;
|
|
74
|
+
- one unified mobile navigation containing the whole page hierarchy and the
|
|
75
|
+
current page headings.
|
|
76
|
+
|
|
77
|
+
Navigation modes follow the site structure:
|
|
78
|
+
|
|
79
|
+
- a single-page site uses section navigation;
|
|
80
|
+
- an ordinary shallow multi-page site uses top navigation;
|
|
81
|
+
- a deeper documentation-style hierarchy uses tree navigation.
|
|
82
|
+
|
|
83
|
+
The tree contract is:
|
|
84
|
+
|
|
85
|
+
- top-level areas remain available in the sticky global navigation;
|
|
86
|
+
- the selected top-level area supplies the desktop local tree;
|
|
87
|
+
- breadcrumbs show page ancestry without changing the vertical position of
|
|
88
|
+
the page heading;
|
|
89
|
+
- a closed expandable page title expands the node without navigating;
|
|
90
|
+
- an open expandable page title links to that page, while its chevron can
|
|
91
|
+
collapse the node;
|
|
92
|
+
- a page without headings or child pages is always a direct link;
|
|
93
|
+
- headings on the current page appear under its page node rather than in a
|
|
94
|
+
separate `On this page` region;
|
|
95
|
+
- opening one branch does not implicitly close another branch;
|
|
96
|
+
- long desktop trees scroll independently of short page content;
|
|
97
|
+
- mobile uses one drawer for the complete hierarchy instead of requiring a
|
|
98
|
+
separate page-selection and section-selection sequence.
|
|
99
|
+
|
|
100
|
+
Real links and native disclosure elements provide the fallback. JavaScript
|
|
101
|
+
preserves explicitly opened branches, restores navigation scroll position,
|
|
102
|
+
enhances focus handling, and keeps measured sticky offsets stable. Without
|
|
103
|
+
JavaScript, navigation remains usable but manually opened branches are not
|
|
104
|
+
preserved across page loads.
|
|
105
|
+
|
|
106
|
+
The contract should also define the fallback and override behavior for the
|
|
107
|
+
supported navigation modes. Structural behavior belongs to site-level engine
|
|
108
|
+
configuration or deterministic automatic selection, not to presentation
|
|
109
|
+
presets.
|
|
110
|
+
|
|
111
|
+
The contract was evaluated with the nested-pages fixture and focused desktop,
|
|
112
|
+
mobile, no-JavaScript, spatial-stability, and long-navigation tests.
|
|
113
|
+
|
|
114
|
+
### 3. Implement Navigation In Layers - Complete
|
|
115
|
+
|
|
116
|
+
Implement and verify the navigation model in this order:
|
|
117
|
+
|
|
118
|
+
1. page-tree data and validation;
|
|
119
|
+
2. desktop global navigation, local tree, breadcrumbs, and `On this page`;
|
|
120
|
+
3. unified mobile navigation;
|
|
121
|
+
4. keyboard, focus, current-page, and progressive-enhancement behavior;
|
|
122
|
+
5. visual evaluation at representative viewport sizes.
|
|
123
|
+
|
|
124
|
+
Real links remain the foundation. Client-side JavaScript is limited to
|
|
125
|
+
interaction and state that cannot be retained adequately with HTML and CSS.
|
|
126
|
+
|
|
127
|
+
### 4. Refine Theme And Preset Responsibilities - Proof Of Concept
|
|
128
|
+
|
|
129
|
+
Presets should control visual presentation, including:
|
|
130
|
+
|
|
131
|
+
- color system;
|
|
132
|
+
- typography;
|
|
133
|
+
- spacing and density;
|
|
134
|
+
- page and content widths;
|
|
135
|
+
- the visual treatment of global navigation, local navigation, breadcrumbs,
|
|
136
|
+
and `On this page`.
|
|
137
|
+
|
|
138
|
+
Presets must not determine page hierarchy, link membership, or semantic
|
|
139
|
+
navigation structure. Those must remain stable when a preset changes.
|
|
140
|
+
|
|
141
|
+
Site-wide color, typography, and navigation treatment should normally remain
|
|
142
|
+
consistent. Page-local theme variation should be limited to properties such as
|
|
143
|
+
content width, density, and media presentation when variation does not weaken
|
|
144
|
+
site identity or navigation clarity.
|
|
145
|
+
|
|
146
|
+
The proof-of-concept contract is:
|
|
147
|
+
|
|
148
|
+
- `config.yaml` owns the site-wide navigation mode;
|
|
149
|
+
- the root `theme.yaml` owns presets, palette, shape, typography, the page
|
|
150
|
+
frame, global spacing primitives, and default page presentation;
|
|
151
|
+
- a page-local `theme.yaml` may set only `layout.textWidth`,
|
|
152
|
+
`layout.contentSpacing`, managed-image sizing, and
|
|
153
|
+
`sections.backgroundPattern`;
|
|
154
|
+
- page-local values are inherited by descendant pages and merged field by
|
|
155
|
+
field, while global visual identity is never replaced;
|
|
156
|
+
- `layout.contentSpacing` replaces the ambiguous `layout.density` name;
|
|
157
|
+
- `sections.backgroundPattern` replaces the low-level `sectionSurfaces` list
|
|
158
|
+
with `uniform`, `alternating`, and `cycling` choices;
|
|
159
|
+
- custom presets and custom font definitions are deferred until the built-in
|
|
160
|
+
contract has been tested in real sites.
|
|
161
|
+
|
|
162
|
+
The nested-pages fixture is the current proof of concept. The engine-owned
|
|
163
|
+
basic init starter follows the new page contract so newly created sites remain
|
|
164
|
+
valid. Documentation, other starters, and broad examples should be migrated
|
|
165
|
+
only after manual approval.
|
|
166
|
+
|
|
167
|
+
### 5. Migrate After Evaluation
|
|
168
|
+
|
|
169
|
+
After the page tree, navigation contract, and preset boundaries have been
|
|
170
|
+
manually evaluated:
|
|
171
|
+
|
|
172
|
+
- migrate fixtures and examples;
|
|
173
|
+
- update schemas and editor assistance;
|
|
174
|
+
- update Markdown reference documentation;
|
|
175
|
+
- update the rendered documentation site;
|
|
176
|
+
- remove obsolete navigation and preset behavior rather than retaining
|
|
177
|
+
compatibility layers.
|
|
178
|
+
|
|
179
|
+
Keep foundation, navigation, preset, migration, and documentation changes in
|
|
180
|
+
separate commits where practical.
|
|
181
|
+
|
|
182
|
+
## Immediate Checkpoint
|
|
183
|
+
|
|
184
|
+
The nested navigation contract has been evaluated and committed. The unified
|
|
185
|
+
page-container and theme-scope proof of concepts are now ready for manual
|
|
186
|
+
evaluation against the nested-pages fixture before broad migration begins.
|
|
@@ -54,9 +54,9 @@ the image, or in `docs/design/` when it is useful for future maintenance.
|
|
|
54
54
|
- Keep arrows few and directional.
|
|
55
55
|
- Avoid diagrams where every object connects to every other object.
|
|
56
56
|
- Prefer multiple simple diagrams over one dense diagram.
|
|
57
|
-
- Make
|
|
57
|
+
- Make page order, URL slugs, section ids, image folders, source files, and
|
|
58
58
|
generated output visually distinct when those ideas matter.
|
|
59
|
-
- Do not show templates, components, custom rendering logic,
|
|
59
|
+
- Do not show templates, components, custom rendering logic, page-level
|
|
60
60
|
technical configuration, or hosting integrations that Norna does not support.
|
|
61
61
|
- Do not show page layouts that Norna cannot actually render unless the diagram
|
|
62
62
|
is clearly abstract and not a product capability example.
|
|
@@ -67,12 +67,12 @@ Diagrams must match the current Norna model:
|
|
|
67
67
|
|
|
68
68
|
- A Norna site is described with site files, not arbitrary project structure.
|
|
69
69
|
- `content.md` is the homepage content file.
|
|
70
|
-
- `sitewide-content.yaml` contains shared
|
|
70
|
+
- `sitewide-content.yaml` contains shared logo settings, banners, and footer
|
|
71
71
|
content.
|
|
72
|
-
- Additional pages are
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
- Images belong under the image root for
|
|
72
|
+
- Additional pages are page directories with `content.md`.
|
|
73
|
+
- Page folder prefixes control navigation order.
|
|
74
|
+
- Page ids become URL segments.
|
|
75
|
+
- Images belong under the image root for their page, usually grouped by
|
|
76
76
|
section id.
|
|
77
77
|
- Markdown remains the primary writing format.
|
|
78
78
|
- Norna blocks cover fixed site patterns such as image stacks,
|
|
@@ -108,7 +108,7 @@ over relying on horizontal scrolling.
|
|
|
108
108
|
Store diagram SVG files as normal Norna managed image assets:
|
|
109
109
|
|
|
110
110
|
```text
|
|
111
|
-
site/
|
|
111
|
+
site/pages/<NNN-page-id>/images/<diagram-name>.svg
|
|
112
112
|
```
|
|
113
113
|
|
|
114
114
|
Reference them with a Norna image block:
|
|
@@ -132,7 +132,7 @@ Before accepting a diagram:
|
|
|
132
132
|
|
|
133
133
|
- The main message is obvious without reading the surrounding section.
|
|
134
134
|
- The diagram does not imply unsupported Norna functionality.
|
|
135
|
-
- URL,
|
|
135
|
+
- URL, page, section, image, theme, config, and output terminology is
|
|
136
136
|
consistent with documentation.
|
|
137
137
|
- Text fits inside boxes at desktop and mobile widths.
|
|
138
138
|
- Arrows clarify the relationship instead of adding noise.
|
|
@@ -26,7 +26,7 @@ site repository. It should not be a showcase for every feature.
|
|
|
26
26
|
|
|
27
27
|
An example site is a runnable site that demonstrates one or more features.
|
|
28
28
|
|
|
29
|
-
Examples can be richer than the starter. They may show
|
|
29
|
+
Examples can be richer than the starter. They may show pages, navigation,
|
|
30
30
|
complete theme presets, image stacks, image carousels, cards, notes, surfaces,
|
|
31
31
|
and site-specific configuration choices.
|
|
32
32
|
|
|
@@ -35,8 +35,8 @@ and site-specific configuration choices.
|
|
|
35
35
|
A documentation site is a runnable `norna` site that explains the product
|
|
36
36
|
visually.
|
|
37
37
|
|
|
38
|
-
It can use images, diagrams, screenshots, and
|
|
39
|
-
such as file structure, presentation inheritance,
|
|
38
|
+
It can use images, diagrams, screenshots, and additional pages to explain concepts
|
|
39
|
+
such as file structure, presentation inheritance, site navigation, and image
|
|
40
40
|
handling.
|
|
41
41
|
|
|
42
42
|
### Reference Documentation
|
|
@@ -65,7 +65,10 @@ examples/
|
|
|
65
65
|
dog-shelter-single-page/
|
|
66
66
|
dog-shelter-multi-page/
|
|
67
67
|
feature-demos/
|
|
68
|
-
theme-
|
|
68
|
+
theme-preset-portfolio/
|
|
69
|
+
theme-preset-documentation/
|
|
70
|
+
theme-preset-project/
|
|
71
|
+
theme-preset-statement/
|
|
69
72
|
media-and-surfaces/
|
|
70
73
|
sitewide-content/
|
|
71
74
|
```
|
|
@@ -73,22 +76,23 @@ examples/
|
|
|
73
76
|
`complete-sites/` contains coherent sites that show how Norna files work
|
|
74
77
|
together in a realistic project:
|
|
75
78
|
|
|
76
|
-
- `dog-shelter-single-page/`: sections and managed images without
|
|
77
|
-
- `dog-shelter-multi-page/`: ordered
|
|
79
|
+
- `dog-shelter-single-page/`: sections and managed images without additional pages.
|
|
80
|
+
- `dog-shelter-multi-page/`: ordered pages with page-local content and
|
|
78
81
|
images.
|
|
79
82
|
|
|
80
83
|
`feature-demos/` contains focused visual test benches:
|
|
81
84
|
|
|
82
|
-
- `theme-
|
|
83
|
-
overrides.
|
|
85
|
+
- `theme-preset-*/`: one independent site per complete built-in preset, without
|
|
86
|
+
overrides. Presets are site-wide, so comparing them must not rely on
|
|
87
|
+
page-local preset changes.
|
|
84
88
|
- `media-and-surfaces/`: image and card blocks, notes, palettes and section
|
|
85
89
|
surfaces. This is also the broad demo-build and navigation-test target.
|
|
86
|
-
- `sitewide-content/`: convention-based
|
|
87
|
-
dismissal and footer content shared across
|
|
90
|
+
- `sitewide-content/`: convention-based logo handling, navigation, banner stacks,
|
|
91
|
+
dismissal and footer content shared across pages.
|
|
88
92
|
|
|
89
93
|
The repository Pages workflow builds all examples and publishes them
|
|
90
94
|
under `/norna/examples/`. The HTML documentation links to those rendered sites
|
|
91
|
-
from its Examples
|
|
95
|
+
from its Examples page.
|
|
92
96
|
|
|
93
97
|
The repository-local `site/` directory is reserved for the documentation site.
|
|
94
98
|
`docs/` should remain for reference documentation. It should link to the
|
|
@@ -185,28 +185,25 @@ and commit their updated `package-lock.json`.
|
|
|
185
185
|
|
|
186
186
|
## Rendering Notes
|
|
187
187
|
|
|
188
|
-
The renderer
|
|
189
|
-
`site/
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
-
|
|
196
|
-
`href="#section-id"`
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
may
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
history, back/forward moves between hash entries, and returning to the same page
|
|
208
|
-
without a hash restores the first section as active. The enhancement does not
|
|
209
|
-
derive active section state from free manual scrolling.
|
|
188
|
+
The renderer discovers a required homepage at
|
|
189
|
+
`site/pages/000-home/content.md`, top-level navigation roots beside Home, and
|
|
190
|
+
nested child pages under each non-home page's `pages/` directory.
|
|
191
|
+
|
|
192
|
+
Navigation has two related levels:
|
|
193
|
+
|
|
194
|
+
- Global navigation moves between Home and top-level page areas.
|
|
195
|
+
- Local navigation follows nested pages and headings within the active area.
|
|
196
|
+
Section links use real `href="#section-id"` anchors so they work without
|
|
197
|
+
JavaScript.
|
|
198
|
+
|
|
199
|
+
Automatic navigation selects section navigation for one-page sites, top
|
|
200
|
+
navigation for shallow page structures, and tree navigation for deeper page or
|
|
201
|
+
heading hierarchies. `config.yaml` may choose a mode explicitly. Home is a
|
|
202
|
+
standalone front door and cannot contain child pages.
|
|
203
|
+
|
|
204
|
+
The optional JavaScript enhancement manages menu interaction and active local
|
|
205
|
+
navigation while retaining normal links and browser history. The rendered page
|
|
206
|
+
tree and anchor navigation remain usable without client-side JavaScript.
|
|
210
207
|
|
|
211
208
|
The sticky navigation updates a root scroll-offset variable so direct hash
|
|
212
209
|
links and clicked links remain visible below the fixed header. The browser owns
|
package/docs/getting-started.md
CHANGED
|
@@ -69,50 +69,55 @@ Leave the development server running while you complete the next steps.
|
|
|
69
69
|
|
|
70
70
|
## 2. Replace The Homepage Content
|
|
71
71
|
|
|
72
|
-
Replace `site/content.md` with:
|
|
72
|
+
Replace `site/pages/000-home/content.md` with:
|
|
73
73
|
|
|
74
74
|
```md
|
|
75
75
|
---
|
|
76
|
-
|
|
77
|
-
description: A website built from plain files.
|
|
76
|
+
page:
|
|
77
|
+
description: A website built from plain files.
|
|
78
78
|
---
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
# My first Norna site
|
|
81
81
|
|
|
82
82
|
This page is written in Markdown. Norna provides its layout and navigation.
|
|
83
83
|
|
|
84
|
+
## Welcome {#welcome}
|
|
85
|
+
|
|
86
|
+
This is the first section.
|
|
87
|
+
|
|
84
88
|
## Next {#next}
|
|
85
89
|
|
|
86
90
|
Edit this file while the development server is running and the browser updates.
|
|
87
91
|
```
|
|
88
92
|
|
|
89
|
-
|
|
90
|
-
section
|
|
93
|
+
The single `#` heading is the page title. Each `##` heading is a page section.
|
|
94
|
+
Norna derives section anchors from heading text. The explicit ids in this
|
|
95
|
+
example keep those public anchors stable if the visible headings are renamed.
|
|
91
96
|
|
|
92
97
|
### Checkpoint: Content And Navigation Update
|
|
93
98
|
|
|
94
99
|
Return to the browser. The page should now contain `Welcome` and `Next`, and
|
|
95
|
-
the
|
|
100
|
+
the section navigation should link to those two sections. You should not
|
|
96
101
|
need to restart the server.
|
|
97
102
|
|
|
98
|
-
## 3. Set
|
|
103
|
+
## 3. Set Shared Content
|
|
99
104
|
|
|
100
105
|
Replace `site/sitewide-content.yaml` with:
|
|
101
106
|
|
|
102
107
|
```yaml
|
|
103
|
-
navigation:
|
|
104
|
-
label: My first Norna site
|
|
105
108
|
footer:
|
|
106
109
|
copyrightMessage: My first Norna site.
|
|
107
110
|
```
|
|
108
111
|
|
|
109
|
-
The
|
|
110
|
-
|
|
112
|
+
The footer is site-wide content rather than a page section. If you add pages
|
|
113
|
+
later, they share it. The homepage H1 you set in the previous step already
|
|
114
|
+
names the homepage in navigation and becomes the alternative text if you add a
|
|
115
|
+
conventional navigation logo.
|
|
111
116
|
|
|
112
|
-
### Checkpoint: The
|
|
117
|
+
### Checkpoint: The Footer Is Shared
|
|
113
118
|
|
|
114
|
-
The navigation should
|
|
115
|
-
the new message.
|
|
119
|
+
The navigation should use `My first Norna site` from `content.md`. The footer
|
|
120
|
+
should show the new message.
|
|
116
121
|
|
|
117
122
|
## 4. Choose A Complete Theme
|
|
118
123
|
|
|
@@ -158,7 +163,7 @@ build.
|
|
|
158
163
|
## What To Do Next
|
|
159
164
|
|
|
160
165
|
- [Add and manage images](content.md#norna-blocks)
|
|
161
|
-
- [Add another page](
|
|
166
|
+
- [Add another page](pages.md)
|
|
162
167
|
- [Inspect and adjust the theme](theme.md)
|
|
163
168
|
- [Configure the public URL](configuration.md)
|
|
164
169
|
- [Publish with GitHub Pages](publishing.md)
|
|
@@ -12,15 +12,17 @@ Norna-managed local images are referenced from Markdown with
|
|
|
12
12
|
Homepage source images live under:
|
|
13
13
|
|
|
14
14
|
```text
|
|
15
|
-
site/images
|
|
15
|
+
site/pages/000-home/images/
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Images for any page, including nested pages, live directly under that page:
|
|
19
19
|
|
|
20
20
|
```text
|
|
21
|
-
site/
|
|
21
|
+
site/pages/<NNN-page-id>/pages/<NNN-page-id>/images/
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
The number of nested `pages/` segments follows the page hierarchy.
|
|
25
|
+
|
|
24
26
|
Supported source extensions:
|
|
25
27
|
|
|
26
28
|
- `.jpg`
|
|
@@ -52,11 +54,12 @@ prompt: Short prompt or editing note.
|
|
|
52
54
|
-->
|
|
53
55
|
```
|
|
54
56
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
move will not break another reference. If the
|
|
59
|
-
roots, `content:sync` requires a clean Git working tree
|
|
57
|
+
Each filename identifies one managed source image within its page. The same
|
|
58
|
+
filename may be used by another page. Automatic sync only moves misplaced
|
|
59
|
+
files when the filename identifies exactly one source candidate across all
|
|
60
|
+
page image roots, and when the move will not break another reference. If the
|
|
61
|
+
move crosses page image roots, `content:sync` requires a clean Git working tree
|
|
62
|
+
before writing.
|
|
60
63
|
|
|
61
64
|
## Markdown Images
|
|
62
65
|
|
|
@@ -139,7 +142,7 @@ copyright metadata.
|
|
|
139
142
|
Generated WebP files are created with ImageMagick using `-strip`, so embedded
|
|
140
143
|
metadata is not a publication mechanism for generated variants. Keep licensing,
|
|
141
144
|
credits, copyright notices, alt text, and captions in site-owned files such as
|
|
142
|
-
`site/content.md`,
|
|
145
|
+
`site/pages/000-home/content.md`, page content files, `COPYRIGHT.md`, or other site
|
|
143
146
|
documentation.
|
|
144
147
|
|
|
145
148
|
If a site wants embedded metadata in original source files, that process is
|
package/docs/pages.md
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Pages
|
|
2
|
+
|
|
3
|
+
Every Norna page is a directory under `site/pages/` with its own `content.md`.
|
|
4
|
+
The same model is used for the homepage, top-level areas, and nested pages.
|
|
5
|
+
|
|
6
|
+
```text
|
|
7
|
+
site/pages/
|
|
8
|
+
|-- 000-home/
|
|
9
|
+
| `-- content.md
|
|
10
|
+
|-- 010-guides/
|
|
11
|
+
| |-- content.md
|
|
12
|
+
| `-- pages/
|
|
13
|
+
| `-- 010-installation/
|
|
14
|
+
| `-- content.md
|
|
15
|
+
`-- 020-reference/
|
|
16
|
+
`-- content.md
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Pages use the same Markdown H1, optional metadata, sections, Norna blocks, and
|
|
20
|
+
managed-image model. See [Content](content.md) for what belongs inside
|
|
21
|
+
`content.md`.
|
|
22
|
+
|
|
23
|
+
## Homepage And Top-Level Pages
|
|
24
|
+
|
|
25
|
+
The homepage is required at:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
site/pages/000-home/content.md
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
It builds to `/`. The `000` prefix is reserved for `000-home`, and Home cannot
|
|
32
|
+
contain a nested `pages/` directory. Home is the site's front door, not the
|
|
33
|
+
parent of every page.
|
|
34
|
+
|
|
35
|
+
Other directories directly under `site/pages/` are top-level navigation roots.
|
|
36
|
+
For example, `site/pages/010-guides/content.md` builds to `/guides/`. Place
|
|
37
|
+
further pages under the nearest meaningful non-home page.
|
|
38
|
+
|
|
39
|
+
## Nested Pages
|
|
40
|
+
|
|
41
|
+
A page may contain a `pages/` directory:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
site/pages/010-guides/
|
|
45
|
+
|-- content.md
|
|
46
|
+
`-- pages/
|
|
47
|
+
`-- 020-workflows/
|
|
48
|
+
|-- content.md
|
|
49
|
+
`-- pages/
|
|
50
|
+
`-- 010-local/
|
|
51
|
+
`-- content.md
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
This produces:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
/guides/
|
|
58
|
+
/guides/workflows/
|
|
59
|
+
/guides/workflows/local/
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Each directory in the chain is a real page and therefore needs its own
|
|
63
|
+
`content.md`. Empty grouping directories are not part of the page model.
|
|
64
|
+
|
|
65
|
+
## Directory Names, Order, And URLs
|
|
66
|
+
|
|
67
|
+
Page directories use:
|
|
68
|
+
|
|
69
|
+
```text
|
|
70
|
+
NNN-page-id
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`NNN` is a three-digit sibling presentation order. `page-id` becomes that
|
|
74
|
+
page's URL segment. Valid ordinary page names include:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
010-getting-started
|
|
78
|
+
020-concepts
|
|
79
|
+
120-api-reference
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Invalid names include:
|
|
83
|
+
|
|
84
|
+
```text
|
|
85
|
+
10-about
|
|
86
|
+
000-about
|
|
87
|
+
010_About
|
|
88
|
+
010-About
|
|
89
|
+
010-about-
|
|
90
|
+
010-about--team
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
The page id may contain only lowercase `a-z`, numbers, and single hyphens
|
|
94
|
+
between alphanumeric groups. The numeric prefix is not part of the URL.
|
|
95
|
+
Renaming `030-contact/` to `015-contact/` changes its order among siblings but
|
|
96
|
+
keeps the URL segment `contact`.
|
|
97
|
+
|
|
98
|
+
Sibling page ids and numeric orders must be unique. Reusing the same id below a
|
|
99
|
+
different parent is valid because the complete URL remains different.
|
|
100
|
+
|
|
101
|
+
## Page Content
|
|
102
|
+
|
|
103
|
+
A minimal page is ordinary Markdown:
|
|
104
|
+
|
|
105
|
+
```md
|
|
106
|
+
---
|
|
107
|
+
page:
|
|
108
|
+
description: Installation instructions.
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
# Installation
|
|
112
|
+
|
|
113
|
+
Introductory text.
|
|
114
|
+
|
|
115
|
+
## Requirements {#requirements}
|
|
116
|
+
|
|
117
|
+
Text...
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The H1 supplies the visible page title, document title, and navigation label.
|
|
121
|
+
`page.description` is optional metadata and is not rendered. H2 and H3 headings
|
|
122
|
+
provide page-local navigation according to the selected navigation model.
|
|
123
|
+
|
|
124
|
+
## Navigation
|
|
125
|
+
|
|
126
|
+
Home and listed top-level pages appear in global navigation. Child pages appear
|
|
127
|
+
in the local hierarchy for their top-level area. Breadcrumbs show actual parent
|
|
128
|
+
pages; Home is not added as an artificial ancestor.
|
|
129
|
+
|
|
130
|
+
The numeric prefix controls order among siblings. Set `navigation.listed` to
|
|
131
|
+
`false` in a non-home page's frontmatter when the page should remain public but
|
|
132
|
+
not appear in generated navigation:
|
|
133
|
+
|
|
134
|
+
```yaml
|
|
135
|
+
navigation:
|
|
136
|
+
listed: false
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Home is always listed. By default, Norna chooses navigation from the site
|
|
140
|
+
structure:
|
|
141
|
+
|
|
142
|
+
- one listed page uses section navigation;
|
|
143
|
+
- a shallow hierarchy uses top navigation;
|
|
144
|
+
- deeper page or heading hierarchies use tree navigation.
|
|
145
|
+
|
|
146
|
+
The site-wide `navigation.mode` in `config.yaml` can explicitly select
|
|
147
|
+
`automatic`, `sections`, `top`, or `tree`. See
|
|
148
|
+
[Configuration](configuration.md#navigation).
|
|
149
|
+
|
|
150
|
+
## Page Images
|
|
151
|
+
|
|
152
|
+
Managed images belong directly to the page that references them:
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
site/pages/010-guides/pages/020-workflows/images/diagram.svg
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The Markdown block still uses only the filename:
|
|
159
|
+
|
|
160
|
+
````md
|
|
161
|
+
```norna-image-stack
|
|
162
|
+
- image: diagram.svg
|
|
163
|
+
alt: The local workflow.
|
|
164
|
+
```
|
|
165
|
+
````
|
|
166
|
+
|
|
167
|
+
Run `norna content:check` to find missing or misplaced images and
|
|
168
|
+
`norna content:sync` to move unambiguous files into the expected page image
|
|
169
|
+
root. Cross-page writes require a clean Git working tree and never guess when a
|
|
170
|
+
filename has multiple possible sources.
|
|
171
|
+
|
|
172
|
+
## Page Themes
|
|
173
|
+
|
|
174
|
+
The root `site/theme.yaml` owns the site's visual identity: preset, palette,
|
|
175
|
+
shape, typography, page frame, and navigation presentation.
|
|
176
|
+
|
|
177
|
+
An optional page-local `theme.yaml` may adjust only:
|
|
178
|
+
|
|
179
|
+
- `layout.textWidth`
|
|
180
|
+
- `layout.contentSpacing`
|
|
181
|
+
- managed-image sizing under `images`
|
|
182
|
+
- `sections.backgroundPattern`
|
|
183
|
+
|
|
184
|
+
These values are inherited by descendant pages and merged with more local page
|
|
185
|
+
settings. Page themes cannot select presets or change site colors, fonts,
|
|
186
|
+
shape, page width, gutters, or navigation. See [Theme](theme.md#page-themes).
|
|
187
|
+
|
|
188
|
+
Page directories also cannot contain `config.yaml` or
|
|
189
|
+
`sitewide-content.yaml`; technical configuration and shared editorial content
|
|
190
|
+
remain at the selected site's top level.
|