@janga/norna 0.7.18 → 0.7.22
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 +22 -12
- package/astro.config.mjs +22 -0
- package/bin/norna-cli.mjs +6 -0
- package/package.json +45 -12
- package/schemas/category.schema.json +20 -0
- package/schemas/config.schema.json +16 -6
- package/schemas/content-frontmatter.schema.json +5 -5
- package/schemas/manifest.json +2 -1
- package/schemas/page-theme.schema.json +22 -22
- package/schemas/sitewide-content.schema.json +18 -18
- package/schemas/theme.schema.json +312 -146
- package/scripts/add-site-node.mjs +251 -0
- package/scripts/check-config.mjs +10 -2
- package/scripts/deploy-site.mjs +5 -8
- package/scripts/generate-images.mjs +11 -15
- package/scripts/generate-schemas.mjs +4 -1
- package/scripts/init-site.mjs +35 -0
- package/scripts/lib/astro-command.mjs +14 -9
- package/scripts/lib/editor-language-service.mjs +28 -177
- package/scripts/lib/heading-ids.mjs +3 -1
- package/scripts/lib/navigation-model.mjs +23 -17
- package/scripts/lib/norna-markdown-blocks.mjs +64 -145
- package/scripts/lib/norna-markdown-render-plugin.mjs +37 -0
- package/scripts/lib/object.mjs +28 -0
- package/scripts/lib/page-markdown.mjs +282 -0
- package/scripts/lib/presentation-contract.mjs +266 -0
- package/scripts/lib/presentation-palette-metadata.mjs +51 -0
- package/scripts/lib/presentation.mjs +526 -79
- package/scripts/lib/project-config.mjs +53 -6
- package/scripts/lib/schema-definitions.mjs +53 -13
- package/scripts/lib/schema-editor-metadata.mjs +107 -18
- package/scripts/lib/schema-value-definitions.mjs +24 -10
- package/scripts/lib/site-content.mjs +23 -238
- package/scripts/lib/site-paths.mjs +2 -3
- package/scripts/lib/site-structure.mjs +189 -0
- package/scripts/lib/theme-presets.mjs +75 -104
- package/scripts/lib/theme-profiles.mjs +221 -0
- package/scripts/lib/typography.mjs +220 -35
- package/scripts/lib/yaml-config.mjs +46 -6
- package/scripts/lib/yaml-indentation.mjs +86 -0
- package/scripts/show-typography.mjs +2 -3
- package/scripts/sync-content-sections.mjs +87 -76
- package/src/components/DisplaySettings.astro +107 -0
- package/src/components/ImageCarousel.astro +34 -13
- package/src/components/NavigationPageTree.astro +74 -43
- package/src/components/SectionNavigationScript.astro +56 -2
- package/src/components/SiteBreadcrumbs.astro +15 -12
- package/src/components/SiteNavigation.astro +92 -41
- package/src/components/SitePage.astro +35 -39
- package/src/components/SiteSection.astro +35 -191
- package/src/components/SiteTreeNavigation.astro +10 -9
- package/src/layouts/BaseLayout.astro +46 -6
- package/src/lib/generatedImages.ts +0 -7
- package/src/lib/readerPreferencesScript.mjs +141 -0
- package/src/lib/sectionContent.ts +119 -201
- package/src/lib/siteNavigation.ts +36 -18
- package/src/lib/sitePages.ts +91 -20
- package/src/pages/[...slug].astro +2 -2
- package/src/styles/global.css +759 -296
- package/starters/basic/README.md +2 -2
- package/docs/README.md +0 -137
- package/docs/assets/norna-dog-shelter.jpg +0 -0
- package/docs/commands.md +0 -189
- package/docs/configuration.md +0 -142
- package/docs/content.md +0 -351
- package/docs/design/command-organization.md +0 -414
- package/docs/design/navigation-and-theme-plan.md +0 -186
- package/docs/design/norna-diagram-design.md +0 -159
- package/docs/design/site-examples-structure.md +0 -119
- package/docs/engine-development.md +0 -215
- package/docs/getting-started.md +0 -206
- package/docs/how-to/embedded-site.md +0 -35
- package/docs/images-and-metadata.md +0 -188
- package/docs/local-development.md +0 -82
- package/docs/pages.md +0 -190
- package/docs/public-files.md +0 -118
- package/docs/publishing.md +0 -117
- package/docs/requirements.md +0 -54
- package/docs/site-files.md +0 -152
- package/docs/sitewide-content.md +0 -73
- package/docs/theme.md +0 -237
- package/docs/typography.md +0 -168
- package/examples/README.md +0 -49
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +0 -35
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +0 -97
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +0 -852
- package/examples/complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs +0 -4
- package/examples/complete-sites/dog-shelter-multi-page/.astro/content-modules.mjs +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/.astro/content.d.ts +0 -183
- package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev-local.json +0 -8
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +0 -13
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +0 -36
- package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +0 -5
- package/examples/complete-sites/dog-shelter-multi-page/.astro/types.d.ts +0 -2
- package/examples/complete-sites/dog-shelter-multi-page/README.md +0 -24
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +0 -74
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/package.json +0 -3
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
- package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +0 -98
- package/examples/complete-sites/dog-shelter-multi-page/site/config.yaml +0 -1
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/000-home/content.md +0 -23
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/000-home/images/shelter-dog.jpg +0 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/content.md +0 -21
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/images/rex.jpg +0 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/010-dogs/images/rover.jpg +0 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/020-adopt/content.md +0 -22
- package/examples/complete-sites/dog-shelter-multi-page/site/pages/020-adopt/images/adoption-dog.jpg +0 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/public/favicon.svg +0 -10
- package/examples/complete-sites/dog-shelter-multi-page/site/public/logo.svg +0 -9
- package/examples/complete-sites/dog-shelter-multi-page/site/public/robots.txt +0 -2
- package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.yaml +0 -4
- package/examples/complete-sites/dog-shelter-multi-page/site/theme.yaml +0 -1
- package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +0 -35
- package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +0 -97
- package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +0 -852
- package/examples/complete-sites/dog-shelter-single-page/.astro/content-assets.mjs +0 -4
- package/examples/complete-sites/dog-shelter-single-page/.astro/content-modules.mjs +0 -1
- package/examples/complete-sites/dog-shelter-single-page/.astro/content.d.ts +0 -183
- package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +0 -1
- package/examples/complete-sites/dog-shelter-single-page/.astro/dev-local.json +0 -8
- package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +0 -13
- package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +0 -18
- package/examples/complete-sites/dog-shelter-single-page/.astro/settings.json +0 -5
- package/examples/complete-sites/dog-shelter-single-page/.astro/types.d.ts +0 -2
- package/examples/complete-sites/dog-shelter-single-page/README.md +0 -24
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +0 -74
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/package.json +0 -3
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
- package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
- package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +0 -50
- package/examples/complete-sites/dog-shelter-single-page/site/config.yaml +0 -1
- package/examples/complete-sites/dog-shelter-single-page/site/pages/000-home/content.md +0 -37
- package/examples/complete-sites/dog-shelter-single-page/site/pages/000-home/images/foster-dog.jpg +0 -0
- package/examples/complete-sites/dog-shelter-single-page/site/pages/000-home/images/rescue-dog.jpg +0 -0
- package/examples/complete-sites/dog-shelter-single-page/site/public/favicon.svg +0 -10
- package/examples/complete-sites/dog-shelter-single-page/site/public/logo.svg +0 -9
- package/examples/complete-sites/dog-shelter-single-page/site/public/robots.txt +0 -2
- package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.yaml +0 -4
- package/examples/complete-sites/dog-shelter-single-page/site/theme.yaml +0 -1
- package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +0 -35
- package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +0 -97
- package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +0 -844
- package/examples/feature-demos/media-and-surfaces/.astro/content-assets.mjs +0 -4
- package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +0 -1
- package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +0 -183
- package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +0 -1
- package/examples/feature-demos/media-and-surfaces/.astro/dev.log +0 -14
- package/examples/feature-demos/media-and-surfaces/.astro/settings.json +0 -5
- package/examples/feature-demos/media-and-surfaces/.astro/types.d.ts +0 -2
- package/examples/feature-demos/media-and-surfaces/README.md +0 -21
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +0 -80
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js +0 -1389
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/package.json +0 -3
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
- package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +0 -66
- package/examples/feature-demos/media-and-surfaces/site/config.yaml +0 -1
- package/examples/feature-demos/media-and-surfaces/site/pages/000-home/content.md +0 -15
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/content.md +0 -71
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-carousel.svg +0 -11
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-stack.svg +0 -9
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/card-surfaces.svg +0 -8
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-one.svg +0 -8
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-three.svg +0 -13
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/carousel-two.svg +0 -8
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/stack-one.svg +0 -8
- package/examples/feature-demos/media-and-surfaces/site/pages/010-media/images/stack-two.svg +0 -9
- package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/content.md +0 -42
- package/examples/feature-demos/media-and-surfaces/site/pages/020-surfaces/theme.yaml +0 -2
- package/examples/feature-demos/media-and-surfaces/site/public/robots.txt +0 -2
- package/examples/feature-demos/media-and-surfaces/site/sitewide-content.yaml +0 -2
- package/examples/feature-demos/media-and-surfaces/site/theme.yaml +0 -1
- package/examples/feature-demos/sitewide-content/.astro/collections/site.schema.json +0 -59
- package/examples/feature-demos/sitewide-content/.astro/collections/sitewide.schema.json +0 -138
- package/examples/feature-demos/sitewide-content/.astro/collections/theme.schema.json +0 -755
- package/examples/feature-demos/sitewide-content/.astro/content-assets.mjs +0 -1
- package/examples/feature-demos/sitewide-content/.astro/content-modules.mjs +0 -1
- package/examples/feature-demos/sitewide-content/.astro/content.d.ts +0 -183
- package/examples/feature-demos/sitewide-content/.astro/data-store.json +0 -1
- package/examples/feature-demos/sitewide-content/.astro/dev.json +0 -13
- package/examples/feature-demos/sitewide-content/.astro/dev.log +0 -18
- package/examples/feature-demos/sitewide-content/.astro/settings.json +0 -5
- package/examples/feature-demos/sitewide-content/.astro/types.d.ts +0 -2
- package/examples/feature-demos/sitewide-content/README.md +0 -26
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/_metadata.json +0 -74
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js +0 -434
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js +0 -1534
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js +0 -48
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js +0 -42
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/package.json +0 -3
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js +0 -190
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js +0 -458
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js +0 -1016
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js +0 -32
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js.map +0 -1
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js +0 -111
- package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js.map +0 -1
- package/examples/feature-demos/sitewide-content/site/.norna/generated-images.json +0 -1
- package/examples/feature-demos/sitewide-content/site/config.yaml +0 -1
- package/examples/feature-demos/sitewide-content/site/pages/000-home/content.md +0 -17
- package/examples/feature-demos/sitewide-content/site/pages/010-logo-and-navigation/content.md +0 -17
- package/examples/feature-demos/sitewide-content/site/pages/020-notices/content.md +0 -23
- package/examples/feature-demos/sitewide-content/site/pages/030-footer/content.md +0 -18
- package/examples/feature-demos/sitewide-content/site/public/logo.svg +0 -6
- package/examples/feature-demos/sitewide-content/site/public/robots.txt +0 -2
- package/examples/feature-demos/sitewide-content/site/sitewide-content.yaml +0 -14
- package/examples/feature-demos/sitewide-content/site/theme.yaml +0 -1
- package/examples/feature-demos/theme-preset-documentation/README.md +0 -16
- package/examples/feature-demos/theme-preset-documentation/site/.norna/generated-images.json +0 -74
- package/examples/feature-demos/theme-preset-documentation/site/config.yaml +0 -1
- package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/content.md +0 -30
- package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/images/black-schnauzer.jpg +0 -0
- package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/images/retriever-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-documentation/site/pages/000-home/images/schnauzer-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-documentation/site/public/robots.txt +0 -2
- package/examples/feature-demos/theme-preset-documentation/site/sitewide-content.yaml +0 -3
- package/examples/feature-demos/theme-preset-documentation/site/theme.yaml +0 -1
- package/examples/feature-demos/theme-preset-portfolio/README.md +0 -16
- package/examples/feature-demos/theme-preset-portfolio/site/.norna/generated-images.json +0 -74
- package/examples/feature-demos/theme-preset-portfolio/site/config.yaml +0 -1
- package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/content.md +0 -31
- package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/images/puppy-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/images/shepherd-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-portfolio/site/pages/000-home/images/white-puppy.jpg +0 -0
- package/examples/feature-demos/theme-preset-portfolio/site/public/robots.txt +0 -2
- package/examples/feature-demos/theme-preset-portfolio/site/sitewide-content.yaml +0 -3
- package/examples/feature-demos/theme-preset-portfolio/site/theme.yaml +0 -1
- package/examples/feature-demos/theme-preset-project/.astro/collections/routeTheme.schema.json +0 -746
- package/examples/feature-demos/theme-preset-project/.astro/collections/site.schema.json +0 -59
- package/examples/feature-demos/theme-preset-project/.astro/collections/sitewide.schema.json +0 -138
- package/examples/feature-demos/theme-preset-project/.astro/collections/theme.schema.json +0 -755
- package/examples/feature-demos/theme-preset-project/.astro/content-assets.mjs +0 -4
- package/examples/feature-demos/theme-preset-project/.astro/content-modules.mjs +0 -1
- package/examples/feature-demos/theme-preset-project/.astro/content.d.ts +0 -183
- package/examples/feature-demos/theme-preset-project/.astro/data-store.json +0 -1
- package/examples/feature-demos/theme-preset-project/.astro/dev-local.json +0 -8
- package/examples/feature-demos/theme-preset-project/.astro/dev.json +0 -15
- package/examples/feature-demos/theme-preset-project/.astro/dev.log +0 -164
- package/examples/feature-demos/theme-preset-project/.astro/settings.json +0 -5
- package/examples/feature-demos/theme-preset-project/.astro/types.d.ts +0 -2
- package/examples/feature-demos/theme-preset-project/README.md +0 -16
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/_metadata.json +0 -80
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/embla-carousel.js +0 -1389
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/embla-carousel.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/package.json +0 -3
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
- package/examples/feature-demos/theme-preset-project/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
- package/examples/feature-demos/theme-preset-project/site/.norna/generated-images.json +0 -74
- package/examples/feature-demos/theme-preset-project/site/config.yaml +0 -1
- package/examples/feature-demos/theme-preset-project/site/pages/000-home/content.md +0 -31
- package/examples/feature-demos/theme-preset-project/site/pages/000-home/images/boxer-portrait.jpg +0 -0
- package/examples/feature-demos/theme-preset-project/site/pages/000-home/images/grass-puppy.jpg +0 -0
- package/examples/feature-demos/theme-preset-project/site/pages/000-home/images/grey-street-dog.jpg +0 -0
- package/examples/feature-demos/theme-preset-project/site/public/robots.txt +0 -2
- package/examples/feature-demos/theme-preset-project/site/sitewide-content.yaml +0 -3
- package/examples/feature-demos/theme-preset-project/site/theme.yaml +0 -1
- package/examples/feature-demos/theme-preset-statement/README.md +0 -16
- package/examples/feature-demos/theme-preset-statement/site/.norna/generated-images.json +0 -74
- package/examples/feature-demos/theme-preset-statement/site/config.yaml +0 -1
- package/examples/feature-demos/theme-preset-statement/site/pages/000-home/content.md +0 -31
- package/examples/feature-demos/theme-preset-statement/site/pages/000-home/images/black-pedigree.jpg +0 -0
- package/examples/feature-demos/theme-preset-statement/site/pages/000-home/images/sheepdog-grass.jpg +0 -0
- package/examples/feature-demos/theme-preset-statement/site/pages/000-home/images/sheepdog-wide.jpg +0 -0
- package/examples/feature-demos/theme-preset-statement/site/public/robots.txt +0 -2
- package/examples/feature-demos/theme-preset-statement/site/sitewide-content.yaml +0 -3
- package/examples/feature-demos/theme-preset-statement/site/theme.yaml +0 -1
- package/fixtures/basic/site/.norna/generated-images.json +0 -1
- package/fixtures/basic/site/config.yaml +0 -1
- package/fixtures/basic/site/pages/000-home/content.md +0 -14
- package/fixtures/basic/site/pages/000-home/images/.gitkeep +0 -1
- package/fixtures/basic/site/public/robots.txt +0 -2
- package/fixtures/basic/site/sitewide-content.yaml +0 -3
- package/fixtures/basic/site/theme.yaml +0 -1
- package/fixtures/content-model-v2/.astro/collections/site.schema.json +0 -776
- package/fixtures/content-model-v2/.astro/collections/theme.schema.json +0 -668
- package/fixtures/content-model-v2/.astro/content-assets.mjs +0 -4
- package/fixtures/content-model-v2/.astro/content-modules.mjs +0 -1
- package/fixtures/content-model-v2/.astro/content.d.ts +0 -175
- package/fixtures/content-model-v2/.astro/data-store.json +0 -1
- package/fixtures/content-model-v2/.astro/dev-local.json +0 -8
- package/fixtures/content-model-v2/.astro/dev.json +0 -13
- package/fixtures/content-model-v2/.astro/dev.log +0 -231
- package/fixtures/content-model-v2/.astro/settings.json +0 -5
- package/fixtures/content-model-v2/.astro/types.d.ts +0 -2
- package/fixtures/content-model-v2/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +0 -1
- package/fixtures/content-model-v2/dist/_astro/SitePage.BbfZub4g.css +0 -1
- package/fixtures/content-model-v2/dist/guide/index.html +0 -3
- package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-971.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-971.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-971.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1080.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1440.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1600.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-960.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1080.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1440.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1600.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1080.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1440.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1600.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-768.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1080.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1440.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1600.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-480.webp +0 -0
- package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-768.webp +0 -0
- package/fixtures/content-model-v2/dist/index.html +0 -8
- package/fixtures/content-model-v2/node_modules/.vite/deps/_metadata.json +0 -80
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
- package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js +0 -1389
- package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
- package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
- package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/package.json +0 -3
- package/fixtures/content-model-v2/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
- package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
- package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
- package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
- package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
- package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
- package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
- package/fixtures/content-model-v2/site/.norna/generated-images.json +0 -210
- package/fixtures/content-model-v2/site/config.yaml +0 -1
- package/fixtures/content-model-v2/site/pages/000-home/content.md +0 -79
- package/fixtures/content-model-v2/site/pages/000-home/images/adopt.svg +0 -9
- package/fixtures/content-model-v2/site/pages/000-home/images/detail.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/duplicate.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/foster.svg +0 -12
- package/fixtures/content-model-v2/site/pages/000-home/images/hero.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/image.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/slide-one.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/slide-three.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/000-home/images/slide-two.jpg +0 -0
- package/fixtures/content-model-v2/site/pages/010-guide/content.md +0 -18
- package/fixtures/content-model-v2/site/pages/010-guide/images/duplicate.jpg +0 -0
- package/fixtures/content-model-v2/site/theme.yaml +0 -4
- package/fixtures/nested-pages/.astro/collections/site.schema.json +0 -35
- package/fixtures/nested-pages/.astro/collections/sitewide.schema.json +0 -97
- package/fixtures/nested-pages/.astro/collections/theme.schema.json +0 -844
- package/fixtures/nested-pages/.astro/content-assets.mjs +0 -4
- package/fixtures/nested-pages/.astro/content-modules.mjs +0 -1
- package/fixtures/nested-pages/.astro/content.d.ts +0 -183
- package/fixtures/nested-pages/.astro/data-store.json +0 -1
- package/fixtures/nested-pages/.astro/dev-local.json +0 -8
- package/fixtures/nested-pages/.astro/dev.log +0 -1128
- package/fixtures/nested-pages/.astro/settings.json +0 -5
- package/fixtures/nested-pages/.astro/types.d.ts +0 -2
- package/fixtures/nested-pages/node_modules/.vite/deps/_metadata.json +0 -74
- package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -434
- package/fixtures/nested-pages/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js +0 -6390
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js +0 -2702
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js +0 -65
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -455
- package/fixtures/nested-pages/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -1534
- package/fixtures/nested-pages/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -48
- package/fixtures/nested-pages/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js +0 -42
- package/fixtures/nested-pages/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/package.json +0 -3
- package/fixtures/nested-pages/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -4
- package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -190
- package/fixtures/nested-pages/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js +0 -458
- package/fixtures/nested-pages/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -1016
- package/fixtures/nested-pages/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js +0 -32
- package/fixtures/nested-pages/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
- package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -111
- package/fixtures/nested-pages/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
- package/fixtures/nested-pages/site/.norna/generated-images.json +0 -10
- package/fixtures/nested-pages/site/config.yaml +0 -3
- package/fixtures/nested-pages/site/pages/000-home/content.md +0 -15
- package/fixtures/nested-pages/site/pages/010-guides/content.md +0 -15
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/content.md +0 -21
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/images/diagram.svg +0 -21
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/pages/010-macos/content.md +0 -18
- package/fixtures/nested-pages/site/pages/010-guides/pages/010-installation/theme.yaml +0 -2
- package/fixtures/nested-pages/site/pages/010-guides/pages/020-workflows/content.md +0 -11
- package/fixtures/nested-pages/site/pages/010-guides/pages/030-release-notes/content.md +0 -9
- package/fixtures/nested-pages/site/pages/010-guides/pages/040-configuration/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/050-content/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/060-themes/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/070-images/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/080-cards/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/090-notes/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/100-validation/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/110-synchronization/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/120-building/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/130-publishing/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/140-troubleshooting/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/150-migration/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/160-accessibility/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/170-performance/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/180-security/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/190-localization/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/200-upgrading/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/pages/210-faq/content.md +0 -3
- package/fixtures/nested-pages/site/pages/010-guides/theme.yaml +0 -7
- package/fixtures/nested-pages/site/pages/020-reference/content.md +0 -10
- package/fixtures/nested-pages/site/pages/020-reference/pages/010-installation/content.md +0 -11
- package/fixtures/nested-pages/site/theme.yaml +0 -1
- package/scripts/build-pages.mjs +0 -69
- package/scripts/lib/example-sites.mjs +0 -49
- package/scripts/lib/frontmatter-yaml.mjs +0 -113
- package/scripts/lib/git-status.mjs +0 -7
- package/scripts/release.mjs +0 -153
- package/scripts/test-banner-visibility.mjs +0 -80
- package/scripts/test-ci-lockfile.mjs +0 -65
- package/scripts/test-cli-discovery.mjs +0 -124
- package/scripts/test-client-javascript.mjs +0 -225
- package/scripts/test-content-check.mjs +0 -621
- package/scripts/test-content-model-v2.mjs +0 -1693
- package/scripts/test-documentation.mjs +0 -189
- package/scripts/test-editor-language-service.mjs +0 -305
- package/scripts/test-engine-commands.mjs +0 -204
- package/scripts/test-examples.mjs +0 -53
- package/scripts/test-heading-ids.mjs +0 -68
- package/scripts/test-navigation-model.mjs +0 -63
- package/scripts/test-navigation-preview.mjs +0 -108
- package/scripts/test-navigation.mjs +0 -157
- package/scripts/test-nested-pages.mjs +0 -125
- package/scripts/test-package-check.mjs +0 -500
- package/scripts/test-page-model.mjs +0 -108
- package/scripts/test-project-config.mjs +0 -139
- package/scripts/test-schemas.mjs +0 -169
- package/scripts/test-site-public.mjs +0 -85
- package/scripts/test-theme-presets.mjs +0 -188
- package/src/components/SiteNotesScript.astro +0 -43
- package/starters/project/.github/workflows/deploy.yml +0 -64
- package/starters/project/README.md +0 -84
- package/starters/project/package-lock.json +0 -4296
- package/starters/project/package.json +0 -37
- package/starters/project/site/config.yaml +0 -1
- package/starters/project/site/pages/000-home/content.md +0 -119
- package/starters/project/site/pages/010-guide/content.md +0 -80
- package/starters/project/site/public/robots.txt +0 -2
- package/starters/project/site/sitewide-content.yaml +0 -3
- package/starters/project/site/theme.yaml +0 -1
- package/tsconfig.json +0 -5
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Buffer } from 'node:buffer';
|
|
2
1
|
import { documentationLink } from './documentation-links.mjs';
|
|
3
2
|
|
|
4
3
|
const field = (description, options = {}) => Object.freeze({ description, ...options });
|
|
@@ -55,13 +54,12 @@ export const nornaMarkdownBlockDefinitions = Object.freeze({
|
|
|
55
54
|
xl: value('Extra large', 'Use the largest card and image size.'),
|
|
56
55
|
}),
|
|
57
56
|
}),
|
|
58
|
-
width: field('
|
|
59
|
-
default: 'normal',
|
|
57
|
+
width: field('Override the root theme\'s maximum width for this card list.', {
|
|
60
58
|
values: Object.freeze({
|
|
61
|
-
text: value('Text', 'Match the active body-text width.'),
|
|
62
|
-
narrow: value('Narrow', '
|
|
63
|
-
normal: value('Normal', '
|
|
64
|
-
wide: value('Wide', 'Allow the card list to use
|
|
59
|
+
text: value('Text', 'Match the active body-text width, including a reader-selected reading width.'),
|
|
60
|
+
narrow: value('Narrow', 'Limit the complete card list to at most 48rem.'),
|
|
61
|
+
normal: value('Normal', 'Limit the complete card list to at most 56rem.'),
|
|
62
|
+
wide: value('Wide', 'Allow the complete card list to use the available page-layout width.'),
|
|
65
63
|
}),
|
|
66
64
|
}),
|
|
67
65
|
}),
|
|
@@ -87,7 +85,6 @@ const blockTypeLabels = {
|
|
|
87
85
|
|
|
88
86
|
const knownBlockTypeList = Array.from(nornaBlockTypes).join(', ');
|
|
89
87
|
const imageNameRegex = /^[a-z0-9][a-z0-9.-]*\.(jpe?g|png|svg)$/i;
|
|
90
|
-
const markerTagName = 'norna-block';
|
|
91
88
|
const imageStackExample = [
|
|
92
89
|
'```norna-image-stack',
|
|
93
90
|
'- image: filename.jpg',
|
|
@@ -98,7 +95,6 @@ const cardListExample = [
|
|
|
98
95
|
'layout: image-top',
|
|
99
96
|
'flow: grid',
|
|
100
97
|
'size: m',
|
|
101
|
-
'width: normal',
|
|
102
98
|
'',
|
|
103
99
|
'- title: Adopt',
|
|
104
100
|
' text: Give a dog a new home.',
|
|
@@ -203,6 +199,35 @@ const getFenceCloseInfo = (line, opening) => {
|
|
|
203
199
|
return fence;
|
|
204
200
|
};
|
|
205
201
|
|
|
202
|
+
export const getOpenMarkdownFenceAtLine = (markdown, lineIndex) => {
|
|
203
|
+
const lines = normalizeLines(markdown);
|
|
204
|
+
let open = null;
|
|
205
|
+
|
|
206
|
+
for (let index = 0; index <= Math.min(lineIndex, lines.length - 1); index += 1) {
|
|
207
|
+
const fence = getFenceInfo(lines[index]);
|
|
208
|
+
if (!fence || fence.length < 3) continue;
|
|
209
|
+
|
|
210
|
+
if (!open) {
|
|
211
|
+
open = {
|
|
212
|
+
character: fence.markerCharacter,
|
|
213
|
+
length: fence.length,
|
|
214
|
+
line: index,
|
|
215
|
+
type: fence.info.split(/\s+/)[0] ?? '',
|
|
216
|
+
};
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (getFenceCloseInfo(lines[index], {
|
|
221
|
+
length: open.length,
|
|
222
|
+
markerCharacter: open.character,
|
|
223
|
+
})) {
|
|
224
|
+
open = null;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return open;
|
|
229
|
+
};
|
|
230
|
+
|
|
206
231
|
const getNornaLineAttempt = (line) => {
|
|
207
232
|
const match = line.match(/^ {0,3}([`~]{0,2})(norna-[a-z0-9-]+)\s*$/);
|
|
208
233
|
if (!match) return null;
|
|
@@ -226,7 +251,14 @@ const getUnclosedNornaBlockMessage = (opening) =>
|
|
|
226
251
|
`This Norna block was started on line ${opening.line} but not closed. Add a closing ${opening.markerCharacter.repeat(opening.length)} line after the last entry.`;
|
|
227
252
|
|
|
228
253
|
const scanMarkdownFencedBlocks = (markdown, options = {}) => {
|
|
229
|
-
const
|
|
254
|
+
const normalizedMarkdown = markdown.replace(/\r\n?/g, '\n');
|
|
255
|
+
const lines = normalizedMarkdown.split('\n');
|
|
256
|
+
const lineOffsets = [];
|
|
257
|
+
let nextLineOffset = 0;
|
|
258
|
+
for (const line of lines) {
|
|
259
|
+
lineOffsets.push(nextLineOffset);
|
|
260
|
+
nextLineOffset += line.length + 1;
|
|
261
|
+
}
|
|
230
262
|
const lineOffset = options.lineOffset ?? 0;
|
|
231
263
|
const blocks = [];
|
|
232
264
|
const errors = [];
|
|
@@ -242,6 +274,7 @@ const scanMarkdownFencedBlocks = (markdown, options = {}) => {
|
|
|
242
274
|
if (attempt) {
|
|
243
275
|
errors.push({
|
|
244
276
|
blockType: attempt.type,
|
|
277
|
+
code: 'invalid-norna-block-start',
|
|
245
278
|
line: lineNumber,
|
|
246
279
|
source: '',
|
|
247
280
|
message: failMessage(getNornaFenceStartMessage(attempt.type, attempt.marker), { ...options, line: lineNumber }),
|
|
@@ -257,6 +290,7 @@ const scanMarkdownFencedBlocks = (markdown, options = {}) => {
|
|
|
257
290
|
if (attempt) {
|
|
258
291
|
errors.push({
|
|
259
292
|
blockType: attempt.type,
|
|
293
|
+
code: 'invalid-norna-block-start',
|
|
260
294
|
line: lineNumber,
|
|
261
295
|
source: '',
|
|
262
296
|
message: failMessage(getNornaFenceStartMessage(attempt.type, attempt.marker), { ...options, line: lineNumber }),
|
|
@@ -288,7 +322,10 @@ const scanMarkdownFencedBlocks = (markdown, options = {}) => {
|
|
|
288
322
|
if (isNornaLike) {
|
|
289
323
|
errors.push({
|
|
290
324
|
blockType: type,
|
|
325
|
+
code: 'unclosed-norna-block',
|
|
326
|
+
endOffset: normalizedMarkdown.length,
|
|
291
327
|
line: lineNumber,
|
|
328
|
+
startOffset: lineOffsets[index],
|
|
292
329
|
source: lines.slice(bodyStartIndex).join('\n'),
|
|
293
330
|
message: failMessage(getUnclosedNornaBlockMessage(opening), { ...options, line: lineNumber }),
|
|
294
331
|
});
|
|
@@ -301,13 +338,19 @@ const scanMarkdownFencedBlocks = (markdown, options = {}) => {
|
|
|
301
338
|
if (nornaBlockTypes.has(type)) {
|
|
302
339
|
blocks.push({
|
|
303
340
|
blockType: type,
|
|
341
|
+
endLine: lineOffset + closingIndex + 1,
|
|
342
|
+
endOffset: lineOffsets[closingIndex] + lines[closingIndex].length,
|
|
304
343
|
line: lineNumber,
|
|
344
|
+
startOffset: lineOffsets[index],
|
|
305
345
|
source,
|
|
346
|
+
sourceEndOffset: lineOffsets[closingIndex],
|
|
306
347
|
sourceLine: lineNumber + 1,
|
|
348
|
+
sourceStartOffset: lineOffsets[bodyStartIndex],
|
|
307
349
|
});
|
|
308
350
|
} else {
|
|
309
351
|
errors.push({
|
|
310
352
|
blockType: type,
|
|
353
|
+
code: 'unknown-norna-block',
|
|
311
354
|
line: lineNumber,
|
|
312
355
|
source,
|
|
313
356
|
message: failMessage(getUnknownNornaBlockMessage(type), { ...options, line: lineNumber }),
|
|
@@ -337,7 +380,7 @@ const parseImageListBlock = (source, options = {}) => {
|
|
|
337
380
|
const lineNumber = (options.line ?? 1) + index;
|
|
338
381
|
const itemMatch = line.match(/^(\s*)-\s+image:\s*(.*?)\s*$/);
|
|
339
382
|
if (itemMatch) {
|
|
340
|
-
current = { image: decodeScalar(itemMatch[2]) };
|
|
383
|
+
current = { image: decodeScalar(itemMatch[2]), line: lineNumber };
|
|
341
384
|
images.push(current);
|
|
342
385
|
continue;
|
|
343
386
|
}
|
|
@@ -375,7 +418,7 @@ const parseCardListBlock = (source, options = {}) => {
|
|
|
375
418
|
let layout = cardListDefinition.options.layout.default;
|
|
376
419
|
let flow = cardListDefinition.options.flow.default;
|
|
377
420
|
let size = cardListDefinition.options.size.default;
|
|
378
|
-
let width
|
|
421
|
+
let width;
|
|
379
422
|
let current = null;
|
|
380
423
|
|
|
381
424
|
for (const [index, line] of normalizeLines(source).entries()) {
|
|
@@ -384,7 +427,7 @@ const parseCardListBlock = (source, options = {}) => {
|
|
|
384
427
|
const lineNumber = (options.line ?? 1) + index;
|
|
385
428
|
const itemMatch = line.match(/^(\s*)-\s+title:\s*(.*?)\s*$/);
|
|
386
429
|
if (itemMatch) {
|
|
387
|
-
current = { title: decodeScalar(itemMatch[2]) };
|
|
430
|
+
current = { title: decodeScalar(itemMatch[2]), line: lineNumber };
|
|
388
431
|
cards.push(current);
|
|
389
432
|
continue;
|
|
390
433
|
}
|
|
@@ -486,26 +529,6 @@ export const parseNornaMarkdownBlock = (type, source, options = {}) => {
|
|
|
486
529
|
|
|
487
530
|
const getLineNumber = (source, index) => source.slice(0, index).split(/\r?\n/).length;
|
|
488
531
|
|
|
489
|
-
export const extractNornaMarkdownBlocks = (markdown, options = {}) => {
|
|
490
|
-
const blocks = [];
|
|
491
|
-
const { blocks: scannedBlocks, errors } = scanMarkdownFencedBlocks(markdown, options);
|
|
492
|
-
|
|
493
|
-
if (errors.length > 0) {
|
|
494
|
-
throw new Error(errors[0].message);
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
for (const block of scannedBlocks) {
|
|
498
|
-
blocks.push({
|
|
499
|
-
...parseNornaMarkdownBlock(block.blockType, block.source, { ...options, line: block.sourceLine }),
|
|
500
|
-
blockType: block.blockType,
|
|
501
|
-
line: block.line,
|
|
502
|
-
source: block.source,
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
return blocks;
|
|
507
|
-
};
|
|
508
|
-
|
|
509
532
|
export const extractNornaMarkdownBlockDiagnostics = (markdown, options = {}) => {
|
|
510
533
|
const blocks = [];
|
|
511
534
|
const { blocks: scannedBlocks, errors } = scanMarkdownFencedBlocks(markdown, options);
|
|
@@ -515,12 +538,18 @@ export const extractNornaMarkdownBlockDiagnostics = (markdown, options = {}) =>
|
|
|
515
538
|
blocks.push({
|
|
516
539
|
...parseNornaMarkdownBlock(block.blockType, block.source, { ...options, line: block.sourceLine }),
|
|
517
540
|
blockType: block.blockType,
|
|
541
|
+
endLine: block.endLine,
|
|
542
|
+
endOffset: block.endOffset,
|
|
518
543
|
line: block.line,
|
|
544
|
+
startOffset: block.startOffset,
|
|
519
545
|
source: block.source,
|
|
546
|
+
sourceEndOffset: block.sourceEndOffset,
|
|
547
|
+
sourceStartOffset: block.sourceStartOffset,
|
|
520
548
|
});
|
|
521
549
|
} catch (error) {
|
|
522
550
|
errors.push({
|
|
523
551
|
blockType: block.blockType,
|
|
552
|
+
code: 'invalid-norna-block',
|
|
524
553
|
line: block.line,
|
|
525
554
|
source: block.source,
|
|
526
555
|
message: error instanceof Error ? error.message : String(error),
|
|
@@ -570,18 +599,6 @@ const maskFencedCodeBlocks = (markdown) => {
|
|
|
570
599
|
const isExternalImageTarget = (target) => /^[a-z][a-z0-9+.-]*:/i.test(target) || target.startsWith('//');
|
|
571
600
|
const isRootRelativePublicTarget = (target) => target.startsWith('/');
|
|
572
601
|
|
|
573
|
-
const stripTags = (value) => value.replace(/<[^>]*>/g, '');
|
|
574
|
-
|
|
575
|
-
const decodeHtmlEntities = (value) =>
|
|
576
|
-
value
|
|
577
|
-
.replace(/&/g, '&')
|
|
578
|
-
.replace(/</g, '<')
|
|
579
|
-
.replace(/>/g, '>')
|
|
580
|
-
.replace(/"/g, '"')
|
|
581
|
-
.replace(/'/g, "'")
|
|
582
|
-
.replace(/&#x([0-9a-f]+);/gi, (_match, hex) => String.fromCodePoint(Number.parseInt(hex, 16)))
|
|
583
|
-
.replace(/&#(\d+);/g, (_match, decimal) => String.fromCodePoint(Number.parseInt(decimal, 10)));
|
|
584
|
-
|
|
585
602
|
export const extractMarkdownImageReferences = (markdown) => {
|
|
586
603
|
const masked = maskFencedCodeBlocks(markdown);
|
|
587
604
|
const references = [];
|
|
@@ -610,7 +627,7 @@ export const getNornaBlockImageReferences = (blocks) =>
|
|
|
610
627
|
alt: card.title,
|
|
611
628
|
blockType: block.blockType,
|
|
612
629
|
blockDisplayType: block.type,
|
|
613
|
-
line: block.line,
|
|
630
|
+
line: card.line ?? block.line,
|
|
614
631
|
}));
|
|
615
632
|
}
|
|
616
633
|
|
|
@@ -618,54 +635,10 @@ export const getNornaBlockImageReferences = (blocks) =>
|
|
|
618
635
|
...image,
|
|
619
636
|
blockType: block.blockType,
|
|
620
637
|
blockDisplayType: block.type,
|
|
621
|
-
line: block.line,
|
|
638
|
+
line: image.line ?? block.line,
|
|
622
639
|
}));
|
|
623
640
|
});
|
|
624
641
|
|
|
625
|
-
export const createNornaMarkdownBlockMarker = (type, source) => {
|
|
626
|
-
const encodedSource = Buffer.from(source, 'utf8').toString('base64');
|
|
627
|
-
return `<${markerTagName} data-type="${type}" data-source="${encodedSource}"></${markerTagName}>`;
|
|
628
|
-
};
|
|
629
|
-
|
|
630
|
-
export const splitNornaMarkdownBlockMarkers = (html, options = {}) => {
|
|
631
|
-
const blocks = [];
|
|
632
|
-
const markerRegex = /<norna-block\s+data-type="([^"]+)"\s+data-source="([^"]*)"\s*><\/norna-block>|<pre\b([^>]*)>\s*<code\b([^>]*)>([\s\S]*?)<\/code>\s*<\/pre>/g;
|
|
633
|
-
let cursor = 0;
|
|
634
|
-
|
|
635
|
-
for (const match of html.matchAll(markerRegex)) {
|
|
636
|
-
const start = match.index ?? 0;
|
|
637
|
-
if (start > cursor) {
|
|
638
|
-
blocks.push({ type: 'html', html: html.slice(cursor, start) });
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
if (match[1]) {
|
|
642
|
-
const blockType = match[1];
|
|
643
|
-
const source = Buffer.from(match[2] ?? '', 'base64').toString('utf8');
|
|
644
|
-
blocks.push(parseNornaMarkdownBlock(blockType, source, options));
|
|
645
|
-
} else {
|
|
646
|
-
const attributes = `${match[3] ?? ''} ${match[4] ?? ''}`;
|
|
647
|
-
const blockType = attributes.match(/\blanguage-(norna-[a-z0-9-]+)\b/)?.[1]
|
|
648
|
-
?? attributes.match(/\bdata-language="(norna-[a-z0-9-]+)"/)?.[1];
|
|
649
|
-
if (!nornaBlockTypes.has(blockType)) {
|
|
650
|
-
blocks.push({ type: 'html', html: match[0] });
|
|
651
|
-
} else {
|
|
652
|
-
const source = decodeHtmlEntities(stripTags(match[5] ?? ''));
|
|
653
|
-
blocks.push(parseNornaMarkdownBlock(blockType, source, options));
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
cursor = start + match[0].length;
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
if (cursor < html.length) {
|
|
661
|
-
blocks.push({ type: 'html', html: html.slice(cursor) });
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
return blocks.filter((block) => block.type !== 'html' || block.html.trim());
|
|
665
|
-
};
|
|
666
|
-
|
|
667
|
-
const normalizeBlockSource = (source) => source.replace(/\r\n?/g, '\n').trim();
|
|
668
|
-
|
|
669
642
|
const inlineNoteReferenceRegex = /\{note-ref\}/g;
|
|
670
643
|
const inlineNoteDeclarationOpeningRegex = /^\s*\{note:\s*(.*)$/;
|
|
671
644
|
const inlineNoteDeclarationClosingRegex = /^(.*?)\}\s*$/;
|
|
@@ -918,57 +891,3 @@ export const extractInlineNoteDiagnostics = (markdown, options = {}) => {
|
|
|
918
891
|
|
|
919
892
|
return { notes, errors };
|
|
920
893
|
};
|
|
921
|
-
|
|
922
|
-
export const splitNornaRenderedCodeBlocks = (html, rawBlocks, options = {}) => {
|
|
923
|
-
const blocks = [];
|
|
924
|
-
const renderedCodeRegex = /<pre\b[^>]*>\s*<code\b[^>]*>([\s\S]*?)<\/code>\s*<\/pre>/g;
|
|
925
|
-
let cursor = 0;
|
|
926
|
-
let rawIndex = 0;
|
|
927
|
-
|
|
928
|
-
for (const match of html.matchAll(renderedCodeRegex)) {
|
|
929
|
-
const start = match.index ?? 0;
|
|
930
|
-
if (start > cursor) {
|
|
931
|
-
blocks.push({ type: 'html', html: html.slice(cursor, start) });
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
const rawBlock = rawBlocks[rawIndex];
|
|
935
|
-
const renderedSource = normalizeBlockSource(decodeHtmlEntities(stripTags(match[1] ?? '')));
|
|
936
|
-
const rawSource = normalizeBlockSource(rawBlock?.source ?? '');
|
|
937
|
-
|
|
938
|
-
if (rawBlock && renderedSource === rawSource) {
|
|
939
|
-
blocks.push(parseNornaMarkdownBlock(rawBlock.blockType, rawBlock.source, options));
|
|
940
|
-
rawIndex += 1;
|
|
941
|
-
} else {
|
|
942
|
-
blocks.push({ type: 'html', html: match[0] });
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
cursor = start + match[0].length;
|
|
946
|
-
}
|
|
947
|
-
|
|
948
|
-
if (cursor < html.length) {
|
|
949
|
-
blocks.push({ type: 'html', html: html.slice(cursor) });
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
return blocks.filter((block) => block.type !== 'html' || block.html.trim());
|
|
953
|
-
};
|
|
954
|
-
|
|
955
|
-
const visitCodeBlocks = (node) => {
|
|
956
|
-
if (!node || typeof node !== 'object') return;
|
|
957
|
-
|
|
958
|
-
if (Array.isArray(node.children)) {
|
|
959
|
-
for (const child of node.children) {
|
|
960
|
-
visitCodeBlocks(child);
|
|
961
|
-
}
|
|
962
|
-
}
|
|
963
|
-
|
|
964
|
-
if (node.type !== 'code' || !nornaBlockTypes.has(node.lang)) return;
|
|
965
|
-
|
|
966
|
-
node.type = 'html';
|
|
967
|
-
node.value = createNornaMarkdownBlockMarker(node.lang, node.value ?? '');
|
|
968
|
-
delete node.lang;
|
|
969
|
-
delete node.meta;
|
|
970
|
-
};
|
|
971
|
-
|
|
972
|
-
export const nornaMarkdownBlocksRemarkPlugin = () => (tree) => {
|
|
973
|
-
visitCodeBlocks(tree);
|
|
974
|
-
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { defineMdastPlugin } from 'satteri';
|
|
2
|
+
import { nornaBlockTypes } from './norna-markdown-blocks.mjs';
|
|
3
|
+
|
|
4
|
+
const stateKey = 'nornaMarkdownRender';
|
|
5
|
+
|
|
6
|
+
const getState = (context) => {
|
|
7
|
+
if (!context.data[stateKey]) {
|
|
8
|
+
context.data[stateKey] = { blockIndex: 0, regionIndex: 0 };
|
|
9
|
+
}
|
|
10
|
+
return context.data[stateKey];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const nornaMarkdownRenderPlugin = defineMdastPlugin({
|
|
14
|
+
name: 'norna-markdown-render',
|
|
15
|
+
code(node, context) {
|
|
16
|
+
if (!nornaBlockTypes.has(node.lang)) return;
|
|
17
|
+
|
|
18
|
+
const state = getState(context);
|
|
19
|
+
const blockIndex = state.blockIndex;
|
|
20
|
+
state.blockIndex += 1;
|
|
21
|
+
context.replaceNode(node, {
|
|
22
|
+
type: 'html',
|
|
23
|
+
value: `<norna-block data-index="${blockIndex}"></norna-block>`,
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
heading(node, context) {
|
|
27
|
+
if (node.depth !== 1 && node.depth !== 2) return;
|
|
28
|
+
const state = getState(context);
|
|
29
|
+
const regionIndex = state.regionIndex;
|
|
30
|
+
state.blockIndex = 0;
|
|
31
|
+
state.regionIndex += 1;
|
|
32
|
+
context.replaceNode(node, {
|
|
33
|
+
type: 'html',
|
|
34
|
+
value: `<norna-region data-index="${regionIndex}"></norna-region>`,
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const isPlainObject = (value) => (
|
|
2
|
+
value !== null
|
|
3
|
+
&& typeof value === 'object'
|
|
4
|
+
&& !Array.isArray(value)
|
|
5
|
+
);
|
|
6
|
+
|
|
7
|
+
export const freezeDeep = (value) => {
|
|
8
|
+
if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;
|
|
9
|
+
|
|
10
|
+
for (const child of Object.values(value)) freezeDeep(child);
|
|
11
|
+
return Object.freeze(value);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const mergeDeep = (base, override) => {
|
|
15
|
+
if (!isPlainObject(override)) return structuredClone(base);
|
|
16
|
+
|
|
17
|
+
const merged = structuredClone(base);
|
|
18
|
+
|
|
19
|
+
for (const [key, value] of Object.entries(override)) {
|
|
20
|
+
if (isPlainObject(value) && isPlainObject(merged[key])) {
|
|
21
|
+
merged[key] = mergeDeep(merged[key], value);
|
|
22
|
+
} else if (value !== undefined) {
|
|
23
|
+
merged[key] = value;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return merged;
|
|
28
|
+
};
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getHeadingIdentifierIssues,
|
|
3
|
+
getMarkdownHeadings,
|
|
4
|
+
} from './heading-ids.mjs';
|
|
5
|
+
import {
|
|
6
|
+
extractInlineNoteDiagnostics,
|
|
7
|
+
extractMarkdownImageReferences,
|
|
8
|
+
extractNornaMarkdownBlockDiagnostics,
|
|
9
|
+
getNornaBlockImageReferences,
|
|
10
|
+
} from './norna-markdown-blocks.mjs';
|
|
11
|
+
|
|
12
|
+
const normalizeMarkdown = (source) => source.replace(/\r\n?/g, '\n');
|
|
13
|
+
|
|
14
|
+
const hasContent = (source) => source.trim().length > 0;
|
|
15
|
+
|
|
16
|
+
export const splitPageMarkdownSource = (source) => {
|
|
17
|
+
const normalizedSource = normalizeMarkdown(source);
|
|
18
|
+
const lines = normalizedSource.split('\n');
|
|
19
|
+
if (lines[0]?.trim() !== '---') {
|
|
20
|
+
return {
|
|
21
|
+
body: normalizedSource,
|
|
22
|
+
bodyOffset: 0,
|
|
23
|
+
frontmatter: '',
|
|
24
|
+
frontmatterUnclosed: false,
|
|
25
|
+
lineOffset: 0,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const closingIndex = lines.findIndex((line, index) => index > 0 && line.trim() === '---');
|
|
30
|
+
if (closingIndex < 0) {
|
|
31
|
+
return {
|
|
32
|
+
body: '',
|
|
33
|
+
bodyOffset: normalizedSource.length,
|
|
34
|
+
frontmatter: normalizedSource,
|
|
35
|
+
frontmatterUnclosed: true,
|
|
36
|
+
lineOffset: lines.length,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const frontmatterLines = lines.slice(0, closingIndex + 1);
|
|
41
|
+
const frontmatter = frontmatterLines.join('\n');
|
|
42
|
+
const bodyOffset = frontmatter.length + (closingIndex < lines.length - 1 ? 1 : 0);
|
|
43
|
+
return {
|
|
44
|
+
body: normalizedSource.slice(bodyOffset),
|
|
45
|
+
bodyOffset,
|
|
46
|
+
frontmatter,
|
|
47
|
+
frontmatterUnclosed: false,
|
|
48
|
+
lineOffset: closingIndex + 1,
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const getPageStructureDiagnostics = ({ headings, pageHeadings, prelude }, lineOffset) => {
|
|
53
|
+
const diagnostics = [];
|
|
54
|
+
|
|
55
|
+
if (pageHeadings.length === 0) {
|
|
56
|
+
diagnostics.push({
|
|
57
|
+
code: 'missing-page-title',
|
|
58
|
+
line: lineOffset + 1,
|
|
59
|
+
message: 'The page is missing its Markdown H1 title.',
|
|
60
|
+
severity: 'error',
|
|
61
|
+
fix: 'Add exactly one page title before any sections, for example "# About".',
|
|
62
|
+
});
|
|
63
|
+
} else if (pageHeadings.length > 1) {
|
|
64
|
+
for (const heading of pageHeadings.slice(1)) {
|
|
65
|
+
diagnostics.push({
|
|
66
|
+
code: 'duplicate-page-title',
|
|
67
|
+
line: lineOffset + heading.line,
|
|
68
|
+
message: `The page contains ${pageHeadings.length} Markdown H1 headings.`,
|
|
69
|
+
severity: 'error',
|
|
70
|
+
fix: 'Keep exactly one H1 page title. Use level 2 headings with explicit ids for sections.',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (headings[0] && headings[0].depth !== 1) {
|
|
76
|
+
diagnostics.push({
|
|
77
|
+
code: 'page-title-order',
|
|
78
|
+
line: lineOffset + headings[0].line,
|
|
79
|
+
message: `The first content heading is "${headings[0].title}", but a Norna page must start with its H1 title.`,
|
|
80
|
+
severity: 'error',
|
|
81
|
+
fix: 'Move the single H1 page title before every section.',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (hasContent(prelude)) {
|
|
86
|
+
diagnostics.push({
|
|
87
|
+
code: 'page-title-order',
|
|
88
|
+
line: lineOffset + 1,
|
|
89
|
+
message: 'The page contains content before its first heading.',
|
|
90
|
+
severity: 'error',
|
|
91
|
+
fix: 'Make the Markdown H1 page title the first content after optional frontmatter.',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return diagnostics;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const getHeadingDiagnostics = (headings, lineOffset) => getHeadingIdentifierIssues(headings).map((issue) => ({
|
|
99
|
+
code: issue.code,
|
|
100
|
+
heading: issue.heading,
|
|
101
|
+
line: lineOffset + issue.heading.line,
|
|
102
|
+
message: issue.message,
|
|
103
|
+
otherHeading: issue.otherHeading,
|
|
104
|
+
otherLine: issue.otherHeading ? lineOffset + issue.otherHeading.line : null,
|
|
105
|
+
severity: 'error',
|
|
106
|
+
fix: issue.fix,
|
|
107
|
+
}));
|
|
108
|
+
|
|
109
|
+
const getRegionContent = (regionMarkdown, blocks, regionOffset) => {
|
|
110
|
+
const content = [];
|
|
111
|
+
let cursor = 0;
|
|
112
|
+
|
|
113
|
+
for (const block of blocks) {
|
|
114
|
+
if (block.startOffset > cursor) {
|
|
115
|
+
content.push({
|
|
116
|
+
kind: 'markdown',
|
|
117
|
+
markdown: regionMarkdown.slice(cursor, block.startOffset),
|
|
118
|
+
range: {
|
|
119
|
+
start: regionOffset + cursor,
|
|
120
|
+
end: regionOffset + block.startOffset,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
content.push({
|
|
126
|
+
kind: 'norna-block',
|
|
127
|
+
block,
|
|
128
|
+
range: {
|
|
129
|
+
start: regionOffset + block.startOffset,
|
|
130
|
+
end: regionOffset + block.endOffset,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
cursor = block.endOffset;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (cursor < regionMarkdown.length) {
|
|
137
|
+
content.push({
|
|
138
|
+
kind: 'markdown',
|
|
139
|
+
markdown: regionMarkdown.slice(cursor),
|
|
140
|
+
range: {
|
|
141
|
+
start: regionOffset + cursor,
|
|
142
|
+
end: regionOffset + regionMarkdown.length,
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return content.filter((item) => item.kind !== 'markdown' || item.markdown.length > 0);
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const createRegion = ({ heading, nextHeading, headings, source, label, lineOffset }) => {
|
|
151
|
+
const endOffset = nextHeading?.index ?? source.length;
|
|
152
|
+
const markdown = source.slice(heading.index, endOffset).trimEnd();
|
|
153
|
+
const regionLineOffset = lineOffset + heading.line - 1;
|
|
154
|
+
const blockResult = extractNornaMarkdownBlockDiagnostics(markdown, {
|
|
155
|
+
label,
|
|
156
|
+
lineOffset: regionLineOffset,
|
|
157
|
+
});
|
|
158
|
+
const noteResult = extractInlineNoteDiagnostics(markdown, {
|
|
159
|
+
label,
|
|
160
|
+
lineOffset: regionLineOffset,
|
|
161
|
+
});
|
|
162
|
+
const markdownImages = extractMarkdownImageReferences(markdown).map((reference) => ({
|
|
163
|
+
...reference,
|
|
164
|
+
line: regionLineOffset + reference.line,
|
|
165
|
+
}));
|
|
166
|
+
const regionHeadings = headings.filter((candidate) => (
|
|
167
|
+
candidate.index >= heading.index
|
|
168
|
+
&& candidate.index < endOffset
|
|
169
|
+
));
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
bodyMarkdown: source.slice(heading.index + heading.source.length, endOffset).trimEnd(),
|
|
173
|
+
blocks: blockResult.blocks,
|
|
174
|
+
blockErrors: blockResult.errors,
|
|
175
|
+
content: getRegionContent(markdown, blockResult.blocks, heading.index),
|
|
176
|
+
endOffset,
|
|
177
|
+
heading,
|
|
178
|
+
headings: regionHeadings,
|
|
179
|
+
id: heading.id,
|
|
180
|
+
kind: heading.depth === 1 ? 'page-intro' : 'section',
|
|
181
|
+
bodyLine: heading.line,
|
|
182
|
+
line: lineOffset + heading.line,
|
|
183
|
+
managedImages: getNornaBlockImageReferences(blockResult.blocks),
|
|
184
|
+
markdown,
|
|
185
|
+
markdownImages,
|
|
186
|
+
notes: noteResult.notes,
|
|
187
|
+
noteErrors: noteResult.errors,
|
|
188
|
+
startOffset: heading.index,
|
|
189
|
+
title: heading.title,
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
export const parsePageMarkdown = async (markdown, options = {}) => {
|
|
194
|
+
const source = normalizeMarkdown(markdown);
|
|
195
|
+
const label = options.label ?? 'Markdown';
|
|
196
|
+
const lineOffset = options.lineOffset ?? 0;
|
|
197
|
+
const { headings } = await getMarkdownHeadings(source);
|
|
198
|
+
const structuralHeadings = headings.filter((heading) => heading.depth <= 2);
|
|
199
|
+
const prelude = structuralHeadings.length > 0
|
|
200
|
+
? source.slice(0, structuralHeadings[0].index)
|
|
201
|
+
: source;
|
|
202
|
+
const pageHeadings = structuralHeadings.filter((heading) => heading.depth === 1);
|
|
203
|
+
const regions = structuralHeadings.map((heading, index) => createRegion({
|
|
204
|
+
heading,
|
|
205
|
+
nextHeading: structuralHeadings[index + 1],
|
|
206
|
+
headings,
|
|
207
|
+
label,
|
|
208
|
+
lineOffset,
|
|
209
|
+
source,
|
|
210
|
+
}));
|
|
211
|
+
const headingIssues = getHeadingIdentifierIssues(headings);
|
|
212
|
+
const headingDiagnostics = getHeadingDiagnostics(headings, lineOffset);
|
|
213
|
+
const structureDiagnostics = getPageStructureDiagnostics({ headings, pageHeadings, prelude }, lineOffset);
|
|
214
|
+
const blockDiagnostics = regions.flatMap((region) => region.blockErrors.map((error) => ({
|
|
215
|
+
code: error.code ?? 'invalid-norna-block',
|
|
216
|
+
line: error.line,
|
|
217
|
+
message: error.message,
|
|
218
|
+
regionId: region.id,
|
|
219
|
+
severity: 'error',
|
|
220
|
+
})));
|
|
221
|
+
const noteDiagnostics = regions.flatMap((region) => region.noteErrors.map((error) => ({
|
|
222
|
+
code: 'invalid-inline-note',
|
|
223
|
+
line: error.line,
|
|
224
|
+
message: error.message,
|
|
225
|
+
regionId: region.id,
|
|
226
|
+
severity: 'error',
|
|
227
|
+
})));
|
|
228
|
+
const navigationHeadings = [];
|
|
229
|
+
let parentId = null;
|
|
230
|
+
for (const heading of headings) {
|
|
231
|
+
if (heading.depth === 2) parentId = heading.id;
|
|
232
|
+
if ((heading.depth !== 2 && heading.depth !== 3) || !heading.id) continue;
|
|
233
|
+
navigationHeadings.push({
|
|
234
|
+
depth: heading.depth,
|
|
235
|
+
id: heading.id,
|
|
236
|
+
line: lineOffset + heading.line,
|
|
237
|
+
parentId: heading.depth === 3 ? parentId : null,
|
|
238
|
+
title: heading.title,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return {
|
|
243
|
+
blocks: regions.flatMap((region) => region.blocks),
|
|
244
|
+
diagnostics: [
|
|
245
|
+
...structureDiagnostics,
|
|
246
|
+
...headingDiagnostics,
|
|
247
|
+
...blockDiagnostics,
|
|
248
|
+
...noteDiagnostics,
|
|
249
|
+
],
|
|
250
|
+
headings,
|
|
251
|
+
headingIssues,
|
|
252
|
+
intro: regions.find((region) => region.kind === 'page-intro') ?? null,
|
|
253
|
+
label,
|
|
254
|
+
lineOffset,
|
|
255
|
+
managedImages: regions.flatMap((region) => region.managedImages),
|
|
256
|
+
markdownImages: regions.flatMap((region) => region.markdownImages),
|
|
257
|
+
navigationHeadings,
|
|
258
|
+
notes: regions.flatMap((region) => region.notes),
|
|
259
|
+
pageTitle: pageHeadings[0] ?? null,
|
|
260
|
+
pageHeadings,
|
|
261
|
+
prelude,
|
|
262
|
+
regions,
|
|
263
|
+
sections: regions.filter((region) => region.kind === 'section'),
|
|
264
|
+
source,
|
|
265
|
+
};
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
export const parsePageMarkdownSource = async (source, options = {}) => {
|
|
269
|
+
const split = splitPageMarkdownSource(source);
|
|
270
|
+
const model = await parsePageMarkdown(split.body, {
|
|
271
|
+
...options,
|
|
272
|
+
lineOffset: (options.lineOffset ?? 0) + split.lineOffset,
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
return {
|
|
276
|
+
...model,
|
|
277
|
+
bodyOffset: split.bodyOffset,
|
|
278
|
+
frontmatter: split.frontmatter,
|
|
279
|
+
frontmatterUnclosed: split.frontmatterUnclosed,
|
|
280
|
+
fullSource: normalizeMarkdown(source),
|
|
281
|
+
};
|
|
282
|
+
};
|