@janga/norna 0.7.9 → 0.7.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/bin/norna-cli.mjs +3 -0
- package/docs/README.md +16 -12
- package/docs/commands.md +6 -0
- package/docs/configuration.md +10 -54
- package/docs/content.md +20 -21
- package/docs/design/norna-diagram-design.md +2 -0
- package/docs/design/site-examples-structure.md +35 -24
- package/docs/engine-development.md +13 -7
- package/docs/getting-started.md +56 -19
- package/docs/routes.md +8 -6
- package/docs/site-structure.md +11 -6
- package/docs/sitewide-content.md +74 -0
- package/docs/theme.md +125 -140
- package/docs/typography.md +72 -45
- package/examples/README.md +41 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/site.schema.json +59 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/sitewide.schema.json +138 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/collections/theme.schema.json +755 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/content-modules.mjs +1 -0
- package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/content.d.ts +8 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -0
- package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev-local.json +2 -2
- package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/dev.json +2 -2
- package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +53 -0
- package/examples/complete-sites/dog-shelter-multi-page/.astro/settings.json +5 -0
- package/examples/complete-sites/dog-shelter-multi-page/README.md +9 -0
- package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/_metadata.json +13 -7
- package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +18 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/config.mjs +30 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/content.md +12 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/public/favicon.svg +10 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.svg +19 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.svg +19 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/route-content.md +30 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/routes/020-adopt/route-content.md +12 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.md +6 -0
- package/examples/complete-sites/dog-shelter-multi-page/site/theme.md +25 -0
- package/examples/complete-sites/dog-shelter-single-page/README.md +9 -0
- package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +18 -0
- package/examples/complete-sites/dog-shelter-single-page/site/config.mjs +30 -0
- package/examples/complete-sites/dog-shelter-single-page/site/content.md +38 -0
- package/examples/complete-sites/dog-shelter-single-page/site/images/what-we-do/dog-house.svg +25 -0
- package/examples/complete-sites/dog-shelter-single-page/site/images/you-can-help/heart.svg +13 -0
- package/examples/complete-sites/dog-shelter-single-page/site/public/favicon.svg +10 -0
- package/examples/complete-sites/dog-shelter-single-page/site/public/robots.txt +2 -0
- package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.md +6 -0
- package/examples/complete-sites/dog-shelter-single-page/site/theme.md +25 -0
- package/examples/feature-demos/media-and-surfaces/.astro/collections/site.schema.json +59 -0
- package/examples/feature-demos/media-and-surfaces/.astro/collections/sitewide.schema.json +138 -0
- package/examples/feature-demos/media-and-surfaces/.astro/collections/theme.schema.json +755 -0
- package/examples/feature-demos/media-and-surfaces/.astro/content-modules.mjs +1 -0
- package/examples/feature-demos/media-and-surfaces/.astro/content.d.ts +183 -0
- package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -0
- package/examples/feature-demos/media-and-surfaces/.astro/dev.log +11 -0
- package/examples/feature-demos/media-and-surfaces/.astro/settings.json +5 -0
- package/examples/feature-demos/media-and-surfaces/.astro/types.d.ts +2 -0
- package/examples/feature-demos/media-and-surfaces/README.md +15 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +74 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
- package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
- package/examples/feature-demos/media-and-surfaces/site/.norna/generated-images.json +66 -0
- package/examples/feature-demos/media-and-surfaces/site/config.mjs +30 -0
- package/examples/feature-demos/media-and-surfaces/site/content.md +64 -0
- package/examples/feature-demos/media-and-surfaces/site/public/robots.txt +2 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/cards/card-carousel.svg +11 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/cards/card-stack.svg +9 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/cards/card-surfaces.svg +8 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/carousel/carousel-one.svg +8 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/carousel/carousel-three.svg +13 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/carousel/carousel-two.svg +8 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/stack/stack-one.svg +8 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/images/stack/stack-two.svg +9 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/route-content.md +85 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/010-media/theme.md +3 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/route-content.md +44 -0
- package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/theme.md +8 -0
- package/examples/feature-demos/media-and-surfaces/site/sitewide-content.md +6 -0
- package/examples/feature-demos/media-and-surfaces/site/theme.md +3 -0
- package/examples/{typography-presets/.astro/collections/theme.schema.json → feature-demos/theme-presets/.astro/collections/routeTheme.schema.json} +143 -65
- package/examples/feature-demos/theme-presets/.astro/collections/site.schema.json +59 -0
- package/examples/feature-demos/theme-presets/.astro/collections/sitewide.schema.json +138 -0
- package/examples/feature-demos/theme-presets/.astro/collections/theme.schema.json +755 -0
- package/examples/feature-demos/theme-presets/.astro/content-assets.mjs +4 -0
- package/examples/feature-demos/theme-presets/.astro/content-modules.mjs +1 -0
- package/examples/feature-demos/theme-presets/.astro/content.d.ts +183 -0
- package/examples/feature-demos/theme-presets/.astro/data-store.json +1 -0
- package/examples/feature-demos/theme-presets/.astro/dev-local.json +8 -0
- package/examples/feature-demos/theme-presets/.astro/dev.json +15 -0
- package/examples/feature-demos/theme-presets/.astro/dev.log +127 -0
- package/examples/feature-demos/theme-presets/.astro/types.d.ts +2 -0
- package/examples/feature-demos/theme-presets/README.md +14 -0
- package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js +1389 -0
- package/examples/feature-demos/theme-presets/node_modules/.vite/deps/embla-carousel.js.map +1 -0
- package/examples/feature-demos/theme-presets/node_modules/.vite/deps/package.json +3 -0
- package/examples/feature-demos/theme-presets/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
- package/examples/feature-demos/theme-presets/site/.norna/generated-images.json +290 -0
- package/examples/{typography-presets → feature-demos/theme-presets}/site/config.mjs +4 -16
- package/examples/feature-demos/theme-presets/site/content.md +17 -0
- package/examples/feature-demos/theme-presets/site/routes/010-portfolio/route-content.md +34 -0
- package/examples/feature-demos/theme-presets/site/routes/010-portfolio/theme.md +3 -0
- package/examples/feature-demos/theme-presets/site/routes/020-documentation/route-content.md +33 -0
- package/examples/feature-demos/theme-presets/site/routes/020-documentation/theme.md +3 -0
- package/examples/feature-demos/theme-presets/site/routes/030-project/route-content.md +34 -0
- package/examples/feature-demos/theme-presets/site/routes/030-project/theme.md +3 -0
- package/examples/feature-demos/theme-presets/site/routes/040-statement/route-content.md +34 -0
- package/examples/feature-demos/theme-presets/site/routes/040-statement/theme.md +3 -0
- package/examples/feature-demos/theme-presets/site/sitewide-content.md +14 -0
- package/examples/feature-demos/theme-presets/site/theme.md +3 -0
- package/fixtures/basic/site/config.mjs +0 -13
- package/fixtures/basic/site/sitewide-content.md +12 -0
- package/fixtures/basic/site/theme.md +2 -2
- package/fixtures/content-model-v2/site/content.md +2 -5
- package/fixtures/content-model-v2/site/theme.md +1 -3
- package/package.json +9 -4
- package/scripts/build-pages.mjs +71 -0
- package/scripts/check-config.mjs +23 -1
- package/scripts/export-theme-preset.mjs +31 -0
- package/scripts/init-site.mjs +1 -0
- package/scripts/lib/example-sites.mjs +34 -0
- package/scripts/lib/frontmatter-yaml.mjs +28 -0
- package/scripts/lib/logo-assets.mjs +35 -0
- package/scripts/lib/norna-markdown-blocks.mjs +166 -0
- package/scripts/lib/presentation.mjs +106 -47
- package/scripts/lib/project-config.mjs +68 -105
- package/scripts/lib/site-content.mjs +26 -118
- package/scripts/lib/site-paths.mjs +2 -0
- package/scripts/lib/sitewide-config.mjs +34 -0
- package/scripts/lib/theme-config.mjs +75 -8
- package/scripts/lib/theme-presets.mjs +209 -0
- package/scripts/lib/typography.mjs +20 -26
- package/scripts/show-typography.mjs +43 -149
- package/scripts/sync-content-sections.mjs +19 -17
- package/scripts/test-content-check.mjs +59 -27
- package/scripts/test-content-model-v2.mjs +154 -0
- package/scripts/test-engine-commands.mjs +4 -1
- package/scripts/test-examples.mjs +15 -0
- package/scripts/test-navigation.mjs +73 -45
- package/scripts/test-package-check.mjs +66 -24
- package/scripts/test-temporary-visibility.mjs +19 -2
- package/scripts/test-theme-presets.mjs +151 -0
- package/src/components/CardList.astro +5 -2
- package/src/components/GalleryGrid.astro +37 -16
- package/src/components/SiteBanners.astro +100 -0
- package/src/components/SiteNavigation.astro +48 -31
- package/src/components/SitePage.astro +55 -13
- package/src/components/SiteSection.astro +193 -35
- package/src/content.config.ts +80 -48
- package/src/layouts/BaseLayout.astro +64 -14
- package/src/lib/routeThemes.ts +61 -0
- package/src/lib/sectionContent.ts +235 -51
- package/src/lib/sitePublicAssets.ts +1 -0
- package/src/styles/global.css +284 -93
- package/starters/basic/.github/workflows/deploy.yml +1 -1
- package/starters/basic/README.md +7 -6
- package/starters/basic/package.json +1 -0
- package/starters/basic/site/config.mjs +0 -13
- package/starters/basic/site/content.md +1 -1
- package/starters/basic/site/sitewide-content.md +14 -0
- package/starters/basic/site/theme.md +13 -24
- package/starters/project/.github/workflows/deploy.yml +1 -1
- package/starters/project/README.md +10 -8
- package/starters/project/package.json +1 -0
- package/starters/project/site/config.mjs +0 -13
- package/starters/project/site/sitewide-content.md +14 -0
- package/starters/project/site/theme.md +3 -11
- package/examples/dog-gallery/site/.norna/generated-images.json +0 -226
- package/examples/dog-gallery/site/config.mjs +0 -67
- package/examples/dog-gallery/site/content.md +0 -128
- package/examples/dog-gallery/site/images/black-dogs/black-puppy-meadow.png +0 -0
- package/examples/dog-gallery/site/images/black-dogs/photo-of-a-black-dog.jpg +0 -0
- package/examples/dog-gallery/site/images/brown-dogs/brown-dog.jpg +0 -0
- package/examples/dog-gallery/site/images/brown-dogs/dog-accompanies-master.jpg +0 -0
- package/examples/dog-gallery/site/images/golden-dogs/golden-retriever.jpg +0 -0
- package/examples/dog-gallery/site/images/golden-dogs/toller-puppy.jpg +0 -0
- package/examples/dog-gallery/site/images/white-dogs/white-cute-dog.jpg +0 -0
- package/examples/dog-gallery/site/images/white-dogs/white-puppy-garden.png +0 -0
- package/examples/dog-gallery/site/public/favicon.svg +0 -7
- package/examples/dog-gallery/site/routes/010-dog-care/route-content.md +0 -38
- package/examples/dog-gallery/site/theme.md +0 -112
- package/examples/typography-presets/.astro/collections/site.schema.json +0 -776
- package/examples/typography-presets/.astro/data-store.json +0 -1
- package/examples/typography-presets/.astro/dev.log +0 -24
- package/examples/typography-presets/site/.norna/generated-images.json +0 -290
- package/examples/typography-presets/site/content.md +0 -134
- package/examples/typography-presets/site/theme.md +0 -43
- /package/examples/{typography-presets/.astro/content-modules.mjs → complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs} +0 -0
- /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/.astro/types.d.ts +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
- /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js +0 -0
- /package/examples/{typography-presets → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/embla-carousel.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/package.json +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
- /package/examples/{dog-gallery → complete-sites/dog-shelter-multi-page}/site/public/robots.txt +0 -0
- /package/examples/{typography-presets → feature-demos/media-and-surfaces}/.astro/content-assets.mjs +0 -0
- /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/package.json +0 -0
- /package/examples/{typography-presets → feature-demos/media-and-surfaces}/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/.astro/settings.json +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/_metadata.json +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_aria-query.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_axobject-query.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_n_html-escaper.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -0
- /package/examples/{typography-presets → feature-demos/theme-presets}/site/public/robots.txt +0 -0
- /package/examples/{typography-presets/site/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/puppy-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/shepherd-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/quiet-gallery → feature-demos/theme-presets/site/routes/010-portfolio/images/portfolio}/white-puppy.jpg +0 -0
- /package/examples/{typography-presets/site/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/black-schnauzer.jpg +0 -0
- /package/examples/{typography-presets/site/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/retriever-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/compact-gallery → feature-demos/theme-presets/site/routes/020-documentation/images/documentation}/schnauzer-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/boxer-portrait.jpg +0 -0
- /package/examples/{typography-presets/site/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grass-puppy.jpg +0 -0
- /package/examples/{typography-presets/site/images/text-forward → feature-demos/theme-presets/site/routes/030-project/images/project}/grey-street-dog.jpg +0 -0
- /package/examples/{typography-presets/site → feature-demos/theme-presets/site/routes/040-statement}/images/statement/black-pedigree.jpg +0 -0
- /package/examples/{typography-presets/site → feature-demos/theme-presets/site/routes/040-statement}/images/statement/sheepdog-grass.jpg +0 -0
- /package/examples/{typography-presets/site → feature-demos/theme-presets/site/routes/040-statement}/images/statement/sheepdog-wide.jpg +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { parseYamlMapping } from './frontmatter-yaml.mjs';
|
|
3
|
+
import {
|
|
4
|
+
sitewideContentLabel,
|
|
5
|
+
sitewideContentPath,
|
|
6
|
+
} from './site-paths.mjs';
|
|
7
|
+
import {
|
|
8
|
+
splitSiteFile,
|
|
9
|
+
validateFrontmatterIndentation,
|
|
10
|
+
validateSitewideFrontmatterStructure,
|
|
11
|
+
} from './site-content.mjs';
|
|
12
|
+
|
|
13
|
+
export const readSitewideConfig = async () => {
|
|
14
|
+
const source = await readFile(sitewideContentPath, 'utf8').catch((error) => {
|
|
15
|
+
if (error?.code === 'ENOENT') return null;
|
|
16
|
+
throw error;
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
if (!source) return {};
|
|
20
|
+
|
|
21
|
+
const { frontmatter, frontmatterBody } = splitSiteFile(source, sitewideContentLabel);
|
|
22
|
+
const issues = [];
|
|
23
|
+
validateFrontmatterIndentation(frontmatter, (issue) => issues.push(issue));
|
|
24
|
+
validateSitewideFrontmatterStructure(frontmatter, (issue) => issues.push(issue));
|
|
25
|
+
|
|
26
|
+
if (issues.length > 0) {
|
|
27
|
+
throw new Error([
|
|
28
|
+
`${sitewideContentLabel} has invalid frontmatter.`,
|
|
29
|
+
...issues.map((issue) => `- ${issue.message}`),
|
|
30
|
+
].join('\n'));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return parseYamlMapping(frontmatterBody);
|
|
34
|
+
};
|
|
@@ -1,19 +1,25 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
1
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
2
3
|
import { parseYamlMapping } from './frontmatter-yaml.mjs';
|
|
3
4
|
import {
|
|
4
5
|
splitSiteFile,
|
|
5
|
-
validateFrontmatterColorValues,
|
|
6
6
|
validateFrontmatterIndentation,
|
|
7
|
+
validateRouteThemeFrontmatterStructure,
|
|
7
8
|
validateThemeFrontmatterStructure,
|
|
8
9
|
} from './site-content.mjs';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
import {
|
|
11
|
+
siteRoutesDir,
|
|
12
|
+
siteRoutesLabel,
|
|
13
|
+
siteThemeLabel,
|
|
14
|
+
siteThemePath,
|
|
15
|
+
sitewideContentLabel,
|
|
16
|
+
} from './site-paths.mjs';
|
|
17
|
+
import { resolveThemeConfig } from './theme-presets.mjs';
|
|
12
18
|
|
|
13
19
|
export const readThemeConfig = async () => {
|
|
14
20
|
const themeFile = await readFile(siteThemePath, 'utf8').catch((error) => {
|
|
15
21
|
if (error?.code === 'ENOENT') {
|
|
16
|
-
|
|
22
|
+
throw new Error(`${siteThemeLabel} is required. Create it before running Norna.`);
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
throw error;
|
|
@@ -23,7 +29,6 @@ export const readThemeConfig = async () => {
|
|
|
23
29
|
|
|
24
30
|
validateFrontmatterIndentation(frontmatter, (issue) => issues.push(issue));
|
|
25
31
|
validateThemeFrontmatterStructure(frontmatter, (issue) => issues.push(issue));
|
|
26
|
-
validateFrontmatterColorValues(frontmatter, (issue) => issues.push(issue), siteThemeLabel);
|
|
27
32
|
|
|
28
33
|
if (issues.length > 0) {
|
|
29
34
|
throw new Error([
|
|
@@ -32,5 +37,67 @@ export const readThemeConfig = async () => {
|
|
|
32
37
|
].join('\n'));
|
|
33
38
|
}
|
|
34
39
|
|
|
35
|
-
|
|
40
|
+
const config = parseYamlMapping(frontmatterBody);
|
|
41
|
+
if (Object.hasOwn(config, 'navigation')) {
|
|
42
|
+
throw new Error(`${siteThemeLabel} may not define navigation. Brand and logo belong in ${sitewideContentLabel}.`);
|
|
43
|
+
}
|
|
44
|
+
resolveThemeConfig(config, siteThemeLabel);
|
|
45
|
+
|
|
46
|
+
return config;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const getRouteThemeFiles = async (directory, relativeDirectory = '') => {
|
|
50
|
+
const entries = await readdir(directory, { withFileTypes: true }).catch((error) => {
|
|
51
|
+
if (error?.code === 'ENOENT') return [];
|
|
52
|
+
throw error;
|
|
53
|
+
});
|
|
54
|
+
const files = [];
|
|
55
|
+
|
|
56
|
+
for (const entry of entries) {
|
|
57
|
+
const relativePath = path.join(relativeDirectory, entry.name);
|
|
58
|
+
const absolutePath = path.join(directory, entry.name);
|
|
59
|
+
if (entry.isDirectory()) {
|
|
60
|
+
files.push(...await getRouteThemeFiles(absolutePath, relativePath));
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (entry.name === 'theme.md') {
|
|
65
|
+
files.push({
|
|
66
|
+
path: absolutePath,
|
|
67
|
+
label: `${siteRoutesLabel}/${relativePath.split(path.sep).join('/')}`,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return files;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const validateRouteThemeFiles = async () => {
|
|
76
|
+
const files = await getRouteThemeFiles(siteRoutesDir);
|
|
77
|
+
const configs = [];
|
|
78
|
+
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
const source = await readFile(file.path, 'utf8');
|
|
81
|
+
const { frontmatter, frontmatterBody } = splitSiteFile(source, file.label);
|
|
82
|
+
const issues = [];
|
|
83
|
+
validateFrontmatterIndentation(frontmatter, (issue) => issues.push(issue));
|
|
84
|
+
validateRouteThemeFrontmatterStructure(frontmatter, (issue) => issues.push(issue));
|
|
85
|
+
|
|
86
|
+
if (issues.length > 0) {
|
|
87
|
+
throw new Error([
|
|
88
|
+
`${file.label} has invalid frontmatter.`,
|
|
89
|
+
...issues.map((issue) => `- ${issue.message}`),
|
|
90
|
+
].join('\n'));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const config = parseYamlMapping(frontmatterBody);
|
|
94
|
+
if (Object.hasOwn(config, 'navigation')) {
|
|
95
|
+
throw new Error(`${file.label} may not define navigation. Brand and logo belong in ${sitewideContentLabel}.`);
|
|
96
|
+
}
|
|
97
|
+
resolveThemeConfig(config, file.label);
|
|
98
|
+
|
|
99
|
+
configs.push({ ...file, config });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return configs;
|
|
36
103
|
};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { mergeDeep } from './typography.mjs';
|
|
2
|
+
|
|
3
|
+
export const themePresetNames = [
|
|
4
|
+
'portfolio',
|
|
5
|
+
'documentation',
|
|
6
|
+
'project',
|
|
7
|
+
'statement',
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export const themePresets = Object.freeze({
|
|
11
|
+
portfolio: Object.freeze({
|
|
12
|
+
layout: {
|
|
13
|
+
density: 'normal',
|
|
14
|
+
pageWidth: '1240px',
|
|
15
|
+
gutter: {
|
|
16
|
+
desktop: 'clamp(1.25rem, 4vw, 3rem)',
|
|
17
|
+
mobile: '1rem',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
gallery: {
|
|
21
|
+
width: '1000px',
|
|
22
|
+
maxAvailableWidthPercent: { desktop: 100, mobile: 100 },
|
|
23
|
+
maxAvailableHeightPercent: { desktop: 78, mobile: 68 },
|
|
24
|
+
},
|
|
25
|
+
typography: {
|
|
26
|
+
fontFamily: "'Helvetica Neue', Arial, sans-serif",
|
|
27
|
+
preset: 'quiet-gallery',
|
|
28
|
+
rhythm: 'normal',
|
|
29
|
+
},
|
|
30
|
+
presentation: {
|
|
31
|
+
palette: 'dark',
|
|
32
|
+
sectionSurfaces: {
|
|
33
|
+
mode: 'none',
|
|
34
|
+
sequence: ['base', 'soft', 'emphasis'],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
}),
|
|
38
|
+
documentation: Object.freeze({
|
|
39
|
+
layout: {
|
|
40
|
+
density: 'compact',
|
|
41
|
+
pageWidth: '1240px',
|
|
42
|
+
gutter: {
|
|
43
|
+
desktop: 'clamp(1.25rem, 4vw, 3rem)',
|
|
44
|
+
mobile: '1rem',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
gallery: {
|
|
48
|
+
width: '920px',
|
|
49
|
+
maxAvailableWidthPercent: { desktop: 100, mobile: 100 },
|
|
50
|
+
maxAvailableHeightPercent: { desktop: 74, mobile: 68 },
|
|
51
|
+
},
|
|
52
|
+
typography: {
|
|
53
|
+
fontFamily: "Georgia, 'Times New Roman', serif",
|
|
54
|
+
preset: 'text-forward',
|
|
55
|
+
rhythm: 'compact',
|
|
56
|
+
},
|
|
57
|
+
presentation: {
|
|
58
|
+
palette: 'paper',
|
|
59
|
+
sectionSurfaces: {
|
|
60
|
+
mode: 'cycle',
|
|
61
|
+
sequence: ['base', 'soft'],
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
}),
|
|
65
|
+
project: Object.freeze({
|
|
66
|
+
layout: {
|
|
67
|
+
density: 'compact',
|
|
68
|
+
pageWidth: '1120px',
|
|
69
|
+
gutter: {
|
|
70
|
+
desktop: 'clamp(1.25rem, 4vw, 3rem)',
|
|
71
|
+
mobile: '1rem',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
gallery: {
|
|
75
|
+
width: '840px',
|
|
76
|
+
maxAvailableWidthPercent: { desktop: 100, mobile: 100 },
|
|
77
|
+
maxAvailableHeightPercent: { desktop: 70, mobile: 62 },
|
|
78
|
+
},
|
|
79
|
+
typography: {
|
|
80
|
+
fontFamily: "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
|
|
81
|
+
preset: 'text-forward',
|
|
82
|
+
rhythm: 'compact',
|
|
83
|
+
},
|
|
84
|
+
presentation: {
|
|
85
|
+
palette: 'light',
|
|
86
|
+
sectionSurfaces: {
|
|
87
|
+
mode: 'cycle',
|
|
88
|
+
sequence: ['base', 'soft'],
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
}),
|
|
92
|
+
statement: Object.freeze({
|
|
93
|
+
layout: {
|
|
94
|
+
density: 'airy',
|
|
95
|
+
pageWidth: '1280px',
|
|
96
|
+
gutter: {
|
|
97
|
+
desktop: 'clamp(1.5rem, 5vw, 4rem)',
|
|
98
|
+
mobile: '1rem',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
gallery: {
|
|
102
|
+
width: '1080px',
|
|
103
|
+
maxAvailableWidthPercent: { desktop: 100, mobile: 100 },
|
|
104
|
+
maxAvailableHeightPercent: { desktop: 80, mobile: 70 },
|
|
105
|
+
},
|
|
106
|
+
typography: {
|
|
107
|
+
fontFamily: "'Trebuchet MS', 'Helvetica Neue', Arial, sans-serif",
|
|
108
|
+
preset: 'statement',
|
|
109
|
+
rhythm: 'airy',
|
|
110
|
+
},
|
|
111
|
+
presentation: {
|
|
112
|
+
palette: 'paper',
|
|
113
|
+
sectionSurfaces: {
|
|
114
|
+
mode: 'cycle',
|
|
115
|
+
sequence: ['base', 'emphasis'],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
}),
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
export const getThemePreset = (presetName, sourceLabel = 'theme.md') => {
|
|
122
|
+
const preset = themePresets[presetName];
|
|
123
|
+
|
|
124
|
+
if (!preset) {
|
|
125
|
+
throw new Error(`Unknown theme preset "${presetName}" in ${sourceLabel}. Use one of: ${themePresetNames.join(', ')}.`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return structuredClone(preset);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export const resolveThemeConfig = (theme = {}, sourceLabel = 'theme.md') => {
|
|
132
|
+
const presetName = theme?.preset;
|
|
133
|
+
if (presetName === undefined) return structuredClone(theme ?? {});
|
|
134
|
+
|
|
135
|
+
const overrides = structuredClone(theme ?? {});
|
|
136
|
+
delete overrides.preset;
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
preset: presetName,
|
|
140
|
+
...mergeDeep(getThemePreset(presetName, sourceLabel), overrides),
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
const quote = (value) => JSON.stringify(value);
|
|
145
|
+
const responsiveValueLines = (label, value, indent = 2) => {
|
|
146
|
+
const prefix = ' '.repeat(indent);
|
|
147
|
+
return [
|
|
148
|
+
`${prefix}${label}:`,
|
|
149
|
+
`${prefix} desktop: ${value.desktop}`,
|
|
150
|
+
`${prefix} mobile: ${value.mobile}`,
|
|
151
|
+
];
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export const renderThemePresetReference = (presetName, sourceLabel = 'theme.md') => {
|
|
155
|
+
const preset = getThemePreset(presetName, sourceLabel);
|
|
156
|
+
const { layout, gallery, typography, presentation } = preset;
|
|
157
|
+
|
|
158
|
+
return [
|
|
159
|
+
'---',
|
|
160
|
+
`# Original values for Norna's "${presetName}" theme preset.`,
|
|
161
|
+
'# This is a reference file. Norna only loads theme.md.',
|
|
162
|
+
'# Keep the preset in theme.md and copy only the values you want to override.',
|
|
163
|
+
`# Available theme presets: ${themePresetNames.join(', ')}.`,
|
|
164
|
+
`preset: ${presetName}`,
|
|
165
|
+
'',
|
|
166
|
+
'layout:',
|
|
167
|
+
' # Alternatives: compact, normal, airy.',
|
|
168
|
+
` density: ${layout.density}`,
|
|
169
|
+
' # Any positive CSS length, including px, rem, em, %, or clamp(...).',
|
|
170
|
+
` pageWidth: ${layout.pageWidth}`,
|
|
171
|
+
' gutter:',
|
|
172
|
+
` desktop: ${layout.gutter.desktop}`,
|
|
173
|
+
` mobile: ${layout.gutter.mobile}`,
|
|
174
|
+
' # Optional spacing overrides use blockGap, finalSectionBottom,',
|
|
175
|
+
' # firstSectionTop, headingToBlock, imageGap, and sectionGap.',
|
|
176
|
+
'',
|
|
177
|
+
'gallery:',
|
|
178
|
+
' # width accepts a positive CSS length.',
|
|
179
|
+
` width: ${gallery.width}`,
|
|
180
|
+
' # Percent values must be greater than 0 and at most 100.',
|
|
181
|
+
...responsiveValueLines('maxAvailableWidthPercent', gallery.maxAvailableWidthPercent),
|
|
182
|
+
...responsiveValueLines('maxAvailableHeightPercent', gallery.maxAvailableHeightPercent),
|
|
183
|
+
'',
|
|
184
|
+
'typography:',
|
|
185
|
+
' # Any valid CSS font-family stack without semicolons.',
|
|
186
|
+
` fontFamily: ${quote(typography.fontFamily)}`,
|
|
187
|
+
' # Alternatives: quiet-gallery, compact-gallery, text-forward, statement.',
|
|
188
|
+
` preset: ${typography.preset}`,
|
|
189
|
+
' # Alternatives: compact, normal, airy.',
|
|
190
|
+
` rhythm: ${typography.rhythm}`,
|
|
191
|
+
' # Fine-grained overrides can target headings.h1-h4, body, and caption.',
|
|
192
|
+
' # Example:',
|
|
193
|
+
' # overrides:',
|
|
194
|
+
' # headings:',
|
|
195
|
+
' # h2:',
|
|
196
|
+
' # size: large # small, medium, large, or xlarge',
|
|
197
|
+
'',
|
|
198
|
+
'presentation:',
|
|
199
|
+
' # Alternatives: dark, light, paper.',
|
|
200
|
+
` palette: ${presentation.palette}`,
|
|
201
|
+
' sectionSurfaces:',
|
|
202
|
+
' # Alternatives: none, cycle.',
|
|
203
|
+
` mode: ${presentation.sectionSurfaces.mode}`,
|
|
204
|
+
' # Use one to three unique values from: base, soft, emphasis.',
|
|
205
|
+
` sequence: [${presentation.sectionSurfaces.sequence.join(', ')}]`,
|
|
206
|
+
'---',
|
|
207
|
+
'',
|
|
208
|
+
].join('\n');
|
|
209
|
+
};
|
|
@@ -17,27 +17,32 @@ export const typographyPresets = {
|
|
|
17
17
|
h1: {
|
|
18
18
|
align: { desktop: 'left', mobile: 'left' },
|
|
19
19
|
size: 'medium',
|
|
20
|
+
weight: 400,
|
|
20
21
|
lineHeight: 1.04,
|
|
21
22
|
},
|
|
22
23
|
h2: {
|
|
23
24
|
align: { desktop: 'left', mobile: 'left' },
|
|
24
25
|
size: 'medium',
|
|
26
|
+
weight: 400,
|
|
25
27
|
lineHeight: 1.08,
|
|
26
28
|
},
|
|
27
29
|
h3: {
|
|
28
30
|
align: { desktop: 'left', mobile: 'left' },
|
|
29
31
|
size: 'medium',
|
|
32
|
+
weight: 500,
|
|
30
33
|
lineHeight: 1.35,
|
|
31
34
|
},
|
|
32
35
|
h4: {
|
|
33
36
|
align: { desktop: 'left', mobile: 'left' },
|
|
34
37
|
size: 'medium',
|
|
38
|
+
weight: 400,
|
|
35
39
|
lineHeight: 1.5,
|
|
36
40
|
},
|
|
37
41
|
},
|
|
38
42
|
body: {
|
|
39
43
|
align: { desktop: 'left', mobile: 'left' },
|
|
40
44
|
size: 'medium',
|
|
45
|
+
width: 'normal',
|
|
41
46
|
lineHeight: 1.5,
|
|
42
47
|
},
|
|
43
48
|
caption: {
|
|
@@ -51,27 +56,32 @@ export const typographyPresets = {
|
|
|
51
56
|
h1: {
|
|
52
57
|
align: { desktop: 'left', mobile: 'left' },
|
|
53
58
|
size: 'medium',
|
|
59
|
+
weight: 500,
|
|
54
60
|
lineHeight: 1.04,
|
|
55
61
|
},
|
|
56
62
|
h2: {
|
|
57
63
|
align: { desktop: 'left', mobile: 'left' },
|
|
58
64
|
size: 'medium',
|
|
65
|
+
weight: 500,
|
|
59
66
|
lineHeight: 1.08,
|
|
60
67
|
},
|
|
61
68
|
h3: {
|
|
62
69
|
align: { desktop: 'left', mobile: 'left' },
|
|
63
70
|
size: 'medium',
|
|
71
|
+
weight: 600,
|
|
64
72
|
lineHeight: 1.3,
|
|
65
73
|
},
|
|
66
74
|
h4: {
|
|
67
75
|
align: { desktop: 'left', mobile: 'left' },
|
|
68
76
|
size: 'medium',
|
|
77
|
+
weight: 500,
|
|
69
78
|
lineHeight: 1.42,
|
|
70
79
|
},
|
|
71
80
|
},
|
|
72
81
|
body: {
|
|
73
82
|
align: { desktop: 'left', mobile: 'left' },
|
|
74
83
|
size: 'medium',
|
|
84
|
+
width: 'wide',
|
|
75
85
|
lineHeight: 1.42,
|
|
76
86
|
},
|
|
77
87
|
caption: {
|
|
@@ -85,27 +95,32 @@ export const typographyPresets = {
|
|
|
85
95
|
h1: {
|
|
86
96
|
align: { desktop: 'left', mobile: 'left' },
|
|
87
97
|
size: 'medium',
|
|
98
|
+
weight: 500,
|
|
88
99
|
lineHeight: 1.06,
|
|
89
100
|
},
|
|
90
101
|
h2: {
|
|
91
102
|
align: { desktop: 'left', mobile: 'left' },
|
|
92
103
|
size: 'medium',
|
|
104
|
+
weight: 500,
|
|
93
105
|
lineHeight: 1.12,
|
|
94
106
|
},
|
|
95
107
|
h3: {
|
|
96
108
|
align: { desktop: 'left', mobile: 'left' },
|
|
97
109
|
size: 'medium',
|
|
110
|
+
weight: 500,
|
|
98
111
|
lineHeight: 1.35,
|
|
99
112
|
},
|
|
100
113
|
h4: {
|
|
101
114
|
align: { desktop: 'left', mobile: 'left' },
|
|
102
115
|
size: 'medium',
|
|
116
|
+
weight: 400,
|
|
103
117
|
lineHeight: 1.55,
|
|
104
118
|
},
|
|
105
119
|
},
|
|
106
120
|
body: {
|
|
107
121
|
align: { desktop: 'left', mobile: 'left' },
|
|
108
122
|
size: 'medium',
|
|
123
|
+
width: 'narrow',
|
|
109
124
|
lineHeight: 1.62,
|
|
110
125
|
},
|
|
111
126
|
caption: {
|
|
@@ -119,27 +134,32 @@ export const typographyPresets = {
|
|
|
119
134
|
h1: {
|
|
120
135
|
align: { desktop: 'left', mobile: 'left' },
|
|
121
136
|
size: 'medium',
|
|
137
|
+
weight: 600,
|
|
122
138
|
lineHeight: 1.02,
|
|
123
139
|
},
|
|
124
140
|
h2: {
|
|
125
141
|
align: { desktop: 'left', mobile: 'left' },
|
|
126
142
|
size: 'medium',
|
|
143
|
+
weight: 600,
|
|
127
144
|
lineHeight: 1.04,
|
|
128
145
|
},
|
|
129
146
|
h3: {
|
|
130
147
|
align: { desktop: 'left', mobile: 'left' },
|
|
131
148
|
size: 'medium',
|
|
149
|
+
weight: 600,
|
|
132
150
|
lineHeight: 1.18,
|
|
133
151
|
},
|
|
134
152
|
h4: {
|
|
135
153
|
align: { desktop: 'left', mobile: 'left' },
|
|
136
154
|
size: 'medium',
|
|
155
|
+
weight: 500,
|
|
137
156
|
lineHeight: 1.42,
|
|
138
157
|
},
|
|
139
158
|
},
|
|
140
159
|
body: {
|
|
141
160
|
align: { desktop: 'left', mobile: 'left' },
|
|
142
161
|
size: 'medium',
|
|
162
|
+
width: 'narrow',
|
|
143
163
|
lineHeight: 1.42,
|
|
144
164
|
},
|
|
145
165
|
caption: {
|
|
@@ -243,32 +263,6 @@ export const resolveTypographyConfig = (typography = defaultTypography) => {
|
|
|
243
263
|
};
|
|
244
264
|
};
|
|
245
265
|
|
|
246
|
-
export const resolveTypographyOverride = (baseResolved, typographyConfig) => {
|
|
247
|
-
if (typographyConfig?.preset || typographyConfig?.rhythm) {
|
|
248
|
-
return resolveTypographyConfig({
|
|
249
|
-
preset: typographyConfig.preset ?? baseResolved.preset,
|
|
250
|
-
rhythm: typographyConfig.rhythm ?? baseResolved.rhythm,
|
|
251
|
-
overrides: typographyConfig.overrides,
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
if (typographyConfig?.overrides) {
|
|
256
|
-
return {
|
|
257
|
-
preset: baseResolved.preset,
|
|
258
|
-
rhythm: baseResolved.rhythm,
|
|
259
|
-
values: mergeDeep(baseResolved.values, typographyConfig.overrides),
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
return baseResolved;
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
export const resolveSectionTypography = (defaultTypographyConfig, sectionTypographyConfig) => {
|
|
267
|
-
const defaultResolved = resolveTypographyConfig(defaultTypographyConfig);
|
|
268
|
-
|
|
269
|
-
return resolveTypographyOverride(defaultResolved, sectionTypographyConfig);
|
|
270
|
-
};
|
|
271
|
-
|
|
272
266
|
const quoteString = (value) => typeof value === 'string' && !/^[a-z0-9.-]+$/i.test(value)
|
|
273
267
|
? JSON.stringify(value)
|
|
274
268
|
: value;
|