@janga/norna 0.7.17 → 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 +15 -6
- package/bin/norna-cli.mjs +1 -1
- package/docs/README.md +11 -9
- package/docs/configuration.md +25 -2
- package/docs/content.md +21 -12
- package/docs/design/navigation-and-theme-plan.md +90 -19
- package/docs/design/site-examples-structure.md +7 -3
- package/docs/engine-development.md +19 -22
- package/docs/getting-started.md +3 -3
- package/docs/images-and-metadata.md +6 -4
- package/docs/pages.md +120 -64
- package/docs/public-files.md +1 -1
- package/docs/site-files.md +36 -29
- package/docs/sitewide-content.md +1 -1
- package/docs/theme.md +107 -141
- package/docs/typography.md +15 -27
- package/examples/README.md +8 -2
- package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +5 -5
- package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +10 -10
- package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +35 -43
- package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
- package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/content.md +2 -1
- package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +2 -3
- 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/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/content.md +1 -1
- 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/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/content.md +1 -1
- 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/pages/030-project → theme-preset-project/site/pages/000-home}/content.md +1 -1
- 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/pages/040-statement → theme-preset-statement/site/pages/000-home}/content.md +1 -1
- 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/theme.yaml +1 -8
- 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/config.yaml +2 -0
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +4 -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/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 -3
- package/fixtures/nested-pages/site/theme.yaml +1 -3
- package/package.json +2 -1
- package/schemas/config.schema.json +45 -4
- package/schemas/content-frontmatter.schema.json +5 -5
- package/schemas/manifest.json +3 -2
- package/schemas/page-theme.schema.json +192 -0
- package/schemas/sitewide-content.schema.json +17 -17
- package/schemas/theme.schema.json +188 -216
- package/scripts/check-config.mjs +2 -1
- package/scripts/deploy-site.mjs +1 -1
- package/scripts/generate-images.mjs +7 -14
- package/scripts/generate-schemas.mjs +4 -1
- package/scripts/lib/editor-language-service.mjs +0 -14
- package/scripts/lib/example-sites.mjs +15 -3
- package/scripts/lib/page-model.mjs +26 -7
- package/scripts/lib/presentation.mjs +25 -17
- package/scripts/lib/project-config.mjs +26 -16
- package/scripts/lib/schema-definitions.mjs +42 -14
- package/scripts/lib/schema-editor-metadata.mjs +70 -26
- package/scripts/lib/schema-value-definitions.mjs +14 -0
- package/scripts/lib/site-content.mjs +50 -25
- package/scripts/lib/site-conventions.mjs +1 -0
- package/scripts/lib/site-paths.mjs +9 -3
- package/scripts/lib/theme-config.mjs +3 -2
- package/scripts/lib/theme-presets.mjs +54 -21
- package/scripts/show-typography.mjs +1 -33
- package/scripts/sync-content-sections.mjs +1 -3
- package/scripts/test-banner-visibility.mjs +2 -2
- package/scripts/test-client-javascript.mjs +11 -4
- package/scripts/test-content-check.mjs +25 -25
- package/scripts/test-content-model-v2.mjs +165 -101
- package/scripts/test-documentation.mjs +4 -2
- package/scripts/test-editor-language-service.mjs +11 -8
- package/scripts/test-engine-commands.mjs +5 -5
- package/scripts/test-examples.mjs +30 -1
- package/scripts/test-heading-ids.mjs +2 -2
- package/scripts/test-navigation.mjs +11 -2
- package/scripts/test-nested-pages.mjs +25 -10
- package/scripts/test-package-check.mjs +29 -60
- package/scripts/test-page-model.mjs +30 -2
- package/scripts/test-project-config.mjs +5 -10
- package/scripts/test-schemas.mjs +18 -3
- package/scripts/test-theme-presets.mjs +33 -27
- package/src/components/NavigationPageTree.astro +114 -25
- package/src/components/PageContentsLinks.astro +40 -0
- package/src/components/SectionNavigationScript.astro +12 -5
- package/src/components/SiteBreadcrumbs.astro +17 -14
- package/src/components/SiteNavigation.astro +45 -12
- package/src/components/SitePage.astro +37 -23
- package/src/components/SiteSection.astro +2 -7
- package/src/components/SiteTreeNavigation.astro +35 -0
- package/src/components/TreeNavigationScript.astro +83 -0
- package/src/content.config.ts +2 -8
- package/src/layouts/BaseLayout.astro +10 -0
- package/src/lib/pageThemes.ts +11 -9
- package/src/lib/sectionContent.ts +1 -5
- package/src/lib/siteNavigation.ts +2 -1
- package/src/lib/sitePages.ts +25 -14
- package/src/pages/index.astro +2 -1
- package/src/styles/global.css +411 -43
- package/starters/basic/README.md +7 -7
- package/starters/basic/site/theme.yaml +1 -105
- package/starters/project/README.md +8 -8
- package/starters/project/site/theme.yaml +1 -31
- 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 -14
- package/examples/feature-demos/theme-presets/site/theme.yaml +0 -1
- /package/examples/complete-sites/dog-shelter-multi-page/site/{content.md → pages/000-home/content.md} +0 -0
- /package/examples/complete-sites/dog-shelter-multi-page/site/{images → pages/000-home/images}/shelter-dog.jpg +0 -0
- /package/examples/complete-sites/dog-shelter-single-page/site/{content.md → pages/000-home/content.md} +0 -0
- /package/examples/complete-sites/dog-shelter-single-page/site/{images → pages/000-home/images}/foster-dog.jpg +0 -0
- /package/examples/complete-sites/dog-shelter-single-page/site/{images → pages/000-home/images}/rescue-dog.jpg +0 -0
- /package/examples/feature-demos/media-and-surfaces/site/{content.md → pages/000-home/content.md} +0 -0
- /package/examples/feature-demos/sitewide-content/site/{content.md → pages/000-home/content.md} +0 -0
- /package/examples/feature-demos/{theme-presets → theme-preset-documentation}/site/config.yaml +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/images/black-schnauzer.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site/pages/000-home}/images/retriever-portrait.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/020-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 → theme-preset-documentation}/site/sitewide-content.yaml +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/020-documentation → theme-preset-documentation/site}/theme.yaml +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/images/puppy-portrait.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/images/shepherd-portrait.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/010-portfolio → theme-preset-portfolio/site/pages/000-home}/images/white-puppy.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/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/pages/030-project → theme-preset-project/site/pages/000-home}/images/boxer-portrait.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/images/grass-puppy.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site/pages/000-home}/images/grey-street-dog.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/030-project → theme-preset-project/site}/theme.yaml +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/images/black-pedigree.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/images/sheepdog-grass.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site/pages/000-home}/images/sheepdog-wide.jpg +0 -0
- /package/examples/feature-demos/{theme-presets/site/pages/040-statement → theme-preset-statement/site}/theme.yaml +0 -0
- /package/fixtures/basic/site/{content.md → pages/000-home/content.md} +0 -0
- /package/fixtures/basic/site/{images → pages/000-home/images}/.gitkeep +0 -0
- /package/fixtures/content-model-v2/site/{content.md → pages/000-home/content.md} +0 -0
- /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/adopt.svg +0 -0
- /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/detail.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/duplicate.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/foster.svg +0 -0
- /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/hero.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/image.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/slide-one.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/slide-three.jpg +0 -0
- /package/fixtures/content-model-v2/site/{images → pages/000-home/images}/slide-two.jpg +0 -0
- /package/fixtures/nested-pages/site/{content.md → pages/000-home/content.md} +0 -0
- /package/starters/basic/site/{content.md → pages/000-home/content.md} +0 -0
- /package/starters/basic/site/{images → pages/000-home/images}/.gitkeep +0 -0
- /package/starters/project/site/{content.md → pages/000-home/content.md} +0 -0
package/README.md
CHANGED
|
@@ -52,15 +52,21 @@ site/
|
|
|
52
52
|
|-- config.yaml
|
|
53
53
|
|-- theme.yaml
|
|
54
54
|
|-- sitewide-content.yaml
|
|
55
|
-
|-- content.md
|
|
56
|
-
|-- images/
|
|
57
55
|
|-- pages/
|
|
56
|
+
| |-- 000-home/
|
|
57
|
+
| | |-- content.md
|
|
58
|
+
| | `-- images/
|
|
59
|
+
| `-- 010-guide/
|
|
60
|
+
| |-- content.md
|
|
61
|
+
| `-- pages/
|
|
62
|
+
| `-- 010-installation/
|
|
58
63
|
`-- public/
|
|
59
64
|
```
|
|
60
65
|
|
|
61
|
-
- `content.md`
|
|
62
|
-
- `
|
|
63
|
-
-
|
|
66
|
+
- `pages/000-home/content.md` is the required homepage at `/`.
|
|
67
|
+
- Other top-level directories under `pages/` are global navigation roots.
|
|
68
|
+
- A page may contain local images, limited presentation settings, and nested
|
|
69
|
+
child pages under its own `pages/` directory.
|
|
64
70
|
- `theme.yaml` normally selects one complete visual preset.
|
|
65
71
|
- `sitewide-content.yaml` holds shared logo display settings, banners, and footer content.
|
|
66
72
|
- `config.yaml` holds the public URL and optional language and scroll behavior.
|
|
@@ -89,7 +95,10 @@ documentation.
|
|
|
89
95
|
| --- | --- | --- |
|
|
90
96
|
| Dog shelter, single page | [Open demo](https://janga.github.io/norna/examples/complete-sites/dog-shelter-single-page/) | [View files](examples/complete-sites/dog-shelter-single-page/) |
|
|
91
97
|
| Dog shelter, multi-page | [Open demo](https://janga.github.io/norna/examples/complete-sites/dog-shelter-multi-page/) | [View files](examples/complete-sites/dog-shelter-multi-page/) |
|
|
92
|
-
|
|
|
98
|
+
| Portfolio preset | [Open demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-portfolio/) | [View files](examples/feature-demos/theme-preset-portfolio/) |
|
|
99
|
+
| Documentation preset | [Open demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-documentation/) | [View files](examples/feature-demos/theme-preset-documentation/) |
|
|
100
|
+
| Project preset | [Open demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-project/) | [View files](examples/feature-demos/theme-preset-project/) |
|
|
101
|
+
| Statement preset | [Open demo](https://janga.github.io/norna/examples/feature-demos/theme-preset-statement/) | [View files](examples/feature-demos/theme-preset-statement/) |
|
|
93
102
|
| Media and surfaces | [Open demo](https://janga.github.io/norna/examples/feature-demos/media-and-surfaces/) | [View files](examples/feature-demos/media-and-surfaces/) |
|
|
94
103
|
| Sitewide content | [Open demo](https://janga.github.io/norna/examples/feature-demos/sitewide-content/) | [View files](examples/feature-demos/sitewide-content/) |
|
|
95
104
|
|
package/bin/norna-cli.mjs
CHANGED
|
@@ -16,7 +16,7 @@ Commands:
|
|
|
16
16
|
dev:stop Stop local dev server
|
|
17
17
|
check Validate configuration and content
|
|
18
18
|
config:check Validate site/config.yaml
|
|
19
|
-
content:check Validate
|
|
19
|
+
content:check Validate page content and managed image references
|
|
20
20
|
content:sync Move misplaced Norna-managed images and refresh generated images
|
|
21
21
|
theme:presets List available theme presets and their intended uses
|
|
22
22
|
theme:export Export a commented theme preset reference
|
package/docs/README.md
CHANGED
|
@@ -27,9 +27,12 @@ site/
|
|
|
27
27
|
|-- config.yaml
|
|
28
28
|
|-- theme.yaml
|
|
29
29
|
|-- sitewide-content.yaml
|
|
30
|
-
|-- content.md
|
|
31
|
-
|-- images/
|
|
32
30
|
|-- pages/
|
|
31
|
+
| |-- 000-home/
|
|
32
|
+
| | |-- content.md
|
|
33
|
+
| | `-- images/
|
|
34
|
+
| `-- 010-guide/
|
|
35
|
+
| `-- content.md
|
|
33
36
|
`-- public/
|
|
34
37
|
```
|
|
35
38
|
|
|
@@ -39,12 +42,11 @@ site/
|
|
|
39
42
|
overrides.
|
|
40
43
|
- [`sitewide-content.yaml`](sitewide-content.md): shared logo display settings,
|
|
41
44
|
banners, and footer.
|
|
42
|
-
- [`
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
page-local images.
|
|
45
|
+
- [`pages/`](pages.md): Home, top-level areas, nested pages, ordering, and URLs.
|
|
46
|
+
- [`content.md`](content.md): the content file inside every page directory,
|
|
47
|
+
containing its title, optional metadata, sections, prose, notes, and blocks.
|
|
48
|
+
- [`images/`](images-and-metadata.md): managed images kept inside the page that
|
|
49
|
+
references them, plus variants, sync, and generated image state.
|
|
48
50
|
- [`public/`](public-files.md): navigation logos, favicons, and other static
|
|
49
51
|
files copied without managed-image processing.
|
|
50
52
|
- [Generated files](site-files.md#generated-files): `site/.norna/public/`,
|
|
@@ -82,7 +84,7 @@ required, optional, convention-discovered, versioned, or generated.
|
|
|
82
84
|
|
|
83
85
|
- [Choose a complete theme preset](theme.md#theme-presets)
|
|
84
86
|
- [Inspect and override a preset](theme.md#overrides)
|
|
85
|
-
- [
|
|
87
|
+
- [Adjust limited presentation for a page subtree](theme.md#page-themes)
|
|
86
88
|
- [Adjust typography](typography.md)
|
|
87
89
|
|
|
88
90
|
### Check, Build, And Publish
|
package/docs/configuration.md
CHANGED
|
@@ -13,7 +13,7 @@ url: https://example.com/
|
|
|
13
13
|
Norna deliberately keeps this file small. Visual choices belong in
|
|
14
14
|
[`theme.yaml`](theme.md), shared editorial content belongs in
|
|
15
15
|
[`sitewide-content.yaml`](sitewide-content.md), and page content belongs in
|
|
16
|
-
[`content.md`](content.md).
|
|
16
|
+
[`pages/*/content.md`](content.md).
|
|
17
17
|
|
|
18
18
|
## `url`
|
|
19
19
|
|
|
@@ -58,6 +58,26 @@ would be misleading.
|
|
|
58
58
|
Interface labels are part of the engine and are not configured individually.
|
|
59
59
|
Editorial text remains in page content and `sitewide-content.yaml`.
|
|
60
60
|
|
|
61
|
+
## `navigation`
|
|
62
|
+
|
|
63
|
+
`navigation.mode` selects the site-wide navigation model:
|
|
64
|
+
|
|
65
|
+
- `automatic`: choose from the discovered page and heading structure. This is
|
|
66
|
+
the default.
|
|
67
|
+
- `sections`: navigate headings on a single page.
|
|
68
|
+
- `top`: use the sticky top navigation for a shallow multi-page site.
|
|
69
|
+
- `tree`: combine global top-level navigation with a local page hierarchy.
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
url: https://example.com/
|
|
73
|
+
navigation:
|
|
74
|
+
mode: automatic
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Navigation behavior is technical and site-wide. It cannot be configured in
|
|
78
|
+
`theme.yaml` or in an individual page. See [Pages](pages.md#navigation) for the
|
|
79
|
+
relationship between Home, top-level pages, child pages, and headings.
|
|
80
|
+
|
|
61
81
|
## `scrollBehavior`
|
|
62
82
|
|
|
63
83
|
- Purpose: select native same-page anchor movement.
|
|
@@ -80,6 +100,8 @@ requests reduced motion always get immediate anchor movement.
|
|
|
80
100
|
```yaml
|
|
81
101
|
url: https://example.com/
|
|
82
102
|
language: en-GB
|
|
103
|
+
navigation:
|
|
104
|
+
mode: automatic
|
|
83
105
|
scrollBehavior: instant
|
|
84
106
|
```
|
|
85
107
|
|
|
@@ -110,7 +132,8 @@ norna --site-dir presentation build
|
|
|
110
132
|
|
|
111
133
|
If `NORNA_SITE_DIR` is set to an empty value, commands fail. Relative site
|
|
112
134
|
directories are resolved by walking upward from the invocation directory until
|
|
113
|
-
the selected directory contains `config.yaml` and
|
|
135
|
+
the selected directory contains `config.yaml` and
|
|
136
|
+
`pages/000-home/content.md`.
|
|
114
137
|
|
|
115
138
|
Without an explicit selection, the current directory itself can be the site
|
|
116
139
|
directory when it contains those two files. Otherwise Norna walks upward for a
|
package/docs/content.md
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
# Content
|
|
2
2
|
|
|
3
|
-
`site/content.md` is the homepage file for a Norna site. Its Markdown H1 is
|
|
3
|
+
`site/pages/000-home/content.md` is the homepage file for a Norna site. Its Markdown H1 is
|
|
4
4
|
the page title. Optional page metadata can be added in YAML frontmatter.
|
|
5
5
|
|
|
6
|
-
Additional pages use the same page model in
|
|
7
|
-
`site/pages
|
|
8
|
-
page-specific rules.
|
|
6
|
+
Additional and nested pages use the same page model in a page directory under
|
|
7
|
+
`site/pages/`. See [Pages](pages.md) for the directory and nesting rules.
|
|
9
8
|
|
|
10
9
|
Site-wide visual defaults belong in [Theme](theme.md). Typography profiles and
|
|
11
10
|
overrides are described in [Typography](typography.md). Technical site settings
|
|
@@ -79,15 +78,25 @@ Markdown level 2 headings define the page sections and their order:
|
|
|
79
78
|
...
|
|
80
79
|
```
|
|
81
80
|
|
|
82
|
-
|
|
81
|
+
Norna derives a stable lowercase id from the heading text when no explicit id
|
|
82
|
+
is present:
|
|
83
|
+
|
|
84
|
+
```md
|
|
85
|
+
## Work
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Add an explicit id when a public anchor must remain stable even if the heading
|
|
89
|
+
text changes:
|
|
83
90
|
|
|
84
91
|
```md
|
|
85
92
|
## Work {#work}
|
|
86
93
|
```
|
|
87
94
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
95
|
+
Explicit ids must match `^[a-z0-9-]+$`. Derived and explicit ids are used for
|
|
96
|
+
anchors and section navigation; the visible label still comes from the heading
|
|
97
|
+
text. H3 headings use the same derivation for deeper local navigation. If two
|
|
98
|
+
headings on one page resolve to the same id, `content:check` reports the page
|
|
99
|
+
and both headings instead of guessing.
|
|
91
100
|
|
|
92
101
|
Markdown section content starts at the level 2 heading and continues until the
|
|
93
102
|
next level 2 heading. `###` and `####` headings are body subheadings within the
|
|
@@ -207,13 +216,13 @@ sizing is less predictable.
|
|
|
207
216
|
Homepage images live under:
|
|
208
217
|
|
|
209
218
|
```text
|
|
210
|
-
site/images/
|
|
219
|
+
site/pages/000-home/images/
|
|
211
220
|
```
|
|
212
221
|
|
|
213
|
-
|
|
222
|
+
Images for any page live directly under that page directory. For example:
|
|
214
223
|
|
|
215
224
|
```text
|
|
216
|
-
site/pages
|
|
225
|
+
site/pages/010-guide/pages/020-installation/images/
|
|
217
226
|
```
|
|
218
227
|
|
|
219
228
|
Image references in Norna managed image blocks use only the filename:
|
|
@@ -225,7 +234,7 @@ Image references in Norna managed image blocks use only the filename:
|
|
|
225
234
|
````
|
|
226
235
|
|
|
227
236
|
If `portrait.jpg` is referenced anywhere on the homepage, its expected
|
|
228
|
-
location is `site/images/portrait.jpg`. The same file may be referenced from
|
|
237
|
+
location is `site/pages/000-home/images/portrait.jpg`. The same file may be referenced from
|
|
229
238
|
more than one section on that page.
|
|
230
239
|
|
|
231
240
|
Filenames must be unique within one page's image directory, but do not have to
|
|
@@ -26,7 +26,7 @@ information architecture.
|
|
|
26
26
|
|
|
27
27
|
## Order Of Work
|
|
28
28
|
|
|
29
|
-
### 1. Stabilize The Page Tree
|
|
29
|
+
### 1. Stabilize The Page Tree - Complete
|
|
30
30
|
|
|
31
31
|
Finish and test nested page discovery independently of final navigation
|
|
32
32
|
presentation. Establish deterministic rules for:
|
|
@@ -39,30 +39,79 @@ presentation. Establish deterministic rules for:
|
|
|
39
39
|
|
|
40
40
|
Commit this foundation separately before broad theme or preset changes.
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
The page tree now supports nested pages with deterministic directory parsing,
|
|
43
|
+
URLs, ordering, ancestry, breadcrumbs, inherited page resources, and collision
|
|
44
|
+
diagnostics.
|
|
43
45
|
|
|
44
|
-
The
|
|
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:
|
|
45
69
|
|
|
46
70
|
- a small global navigation for the site's top-level areas;
|
|
47
71
|
- a larger local page tree for the selected area;
|
|
48
|
-
- a separate `On this page` list for headings on the current page;
|
|
49
72
|
- breadcrumbs for location and ancestry;
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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.
|
|
59
105
|
|
|
60
106
|
The contract should also define the fallback and override behavior for the
|
|
61
107
|
supported navigation modes. Structural behavior belongs to site-level engine
|
|
62
108
|
configuration or deterministic automatic selection, not to presentation
|
|
63
109
|
presets.
|
|
64
110
|
|
|
65
|
-
|
|
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
|
|
66
115
|
|
|
67
116
|
Implement and verify the navigation model in this order:
|
|
68
117
|
|
|
@@ -72,10 +121,10 @@ Implement and verify the navigation model in this order:
|
|
|
72
121
|
4. keyboard, focus, current-page, and progressive-enhancement behavior;
|
|
73
122
|
5. visual evaluation at representative viewport sizes.
|
|
74
123
|
|
|
75
|
-
|
|
76
|
-
interaction that cannot be
|
|
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.
|
|
77
126
|
|
|
78
|
-
### 4. Refine Theme And Preset Responsibilities
|
|
127
|
+
### 4. Refine Theme And Preset Responsibilities - Proof Of Concept
|
|
79
128
|
|
|
80
129
|
Presets should control visual presentation, including:
|
|
81
130
|
|
|
@@ -94,6 +143,27 @@ consistent. Page-local theme variation should be limited to properties such as
|
|
|
94
143
|
content width, density, and media presentation when variation does not weaken
|
|
95
144
|
site identity or navigation clarity.
|
|
96
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
|
+
|
|
97
167
|
### 5. Migrate After Evaluation
|
|
98
168
|
|
|
99
169
|
After the page tree, navigation contract, and preset boundaries have been
|
|
@@ -111,5 +181,6 @@ separate commits where practical.
|
|
|
111
181
|
|
|
112
182
|
## Immediate Checkpoint
|
|
113
183
|
|
|
114
|
-
The
|
|
115
|
-
|
|
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.
|
|
@@ -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
|
```
|
|
@@ -79,8 +82,9 @@ together in a realistic project:
|
|
|
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
90
|
- `sitewide-content/`: convention-based logo handling, navigation, banner stacks,
|
|
@@ -185,28 +185,25 @@ and commit their updated `package-lock.json`.
|
|
|
185
185
|
|
|
186
186
|
## Rendering Notes
|
|
187
187
|
|
|
188
|
-
The renderer
|
|
189
|
-
`site/pages
|
|
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,7 +69,7 @@ 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
|
---
|
|
@@ -91,8 +91,8 @@ Edit this file while the development server is running and the browser updates.
|
|
|
91
91
|
```
|
|
92
92
|
|
|
93
93
|
The single `#` heading is the page title. Each `##` heading is a page section.
|
|
94
|
-
|
|
95
|
-
|
|
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.
|
|
96
96
|
|
|
97
97
|
### Checkpoint: Content And Navigation Update
|
|
98
98
|
|
|
@@ -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/pages/<NNN-page-id>/images/
|
|
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`
|
|
@@ -140,7 +142,7 @@ copyright metadata.
|
|
|
140
142
|
Generated WebP files are created with ImageMagick using `-strip`, so embedded
|
|
141
143
|
metadata is not a publication mechanism for generated variants. Keep licensing,
|
|
142
144
|
credits, copyright notices, alt text, and captions in site-owned files such as
|
|
143
|
-
`site/content.md`, page content files, `COPYRIGHT.md`, or other site
|
|
145
|
+
`site/pages/000-home/content.md`, page content files, `COPYRIGHT.md`, or other site
|
|
144
146
|
documentation.
|
|
145
147
|
|
|
146
148
|
If a site wants embedded metadata in original source files, that process is
|