From 671acb83b44e80ef1147e8ae7b184467b9624e86 Mon Sep 17 00:00:00 2001 From: Alessio Civitillo Date: Sat, 21 Dec 2024 12:38:45 +0100 Subject: [PATCH] first commit --- .env-sample | 1 + .github/workflows/main.yml | 36 + .gitignore | 14 + .prettierignore | 4 + .prettierrc | 18 + LICENSE.MD | 48 + eleventy.config.js | 124 + netlify.toml | 20 + package-lock.json | 6982 +++++++++++++++++ package.json | 74 + readme.md | 7 + src/_config/collections.js | 19 + src/_config/events.js | 5 + src/_config/events/svg-to-jpeg.js | 33 + src/_config/filters.js | 18 + src/_config/filters/dates.js | 7 + src/_config/filters/markdown-format.js | 9 + src/_config/filters/slugify.js | 10 + src/_config/filters/sort-alphabetic.js | 7 + src/_config/filters/sort-random.js | 3 + src/_config/filters/splitlines.js | 20 + src/_config/filters/striptags.js | 3 + src/_config/plugins.js | 30 + src/_config/plugins/css-config.js | 48 + src/_config/plugins/drafts.js | 30 + src/_config/plugins/html-config.js | 19 + src/_config/plugins/js-config.js | 45 + src/_config/plugins/markdown.js | 86 + src/_config/setup/create-colors.js | 86 + src/_config/setup/generate-favicons.js | 40 + src/_config/shortcodes.js | 4 + src/_config/shortcodes/image.js | 97 + src/_config/shortcodes/svg.js | 23 + src/_config/utils/clamp-generator.js | 43 + src/_config/utils/tokens-to-tailwind.js | 24 + src/_data/designTokens/borderRadius.json | 15 + src/_data/designTokens/colors.json | 102 + src/_data/designTokens/colorsBase.json | 26 + src/_data/designTokens/fonts.json | 29 + src/_data/designTokens/spacing.json | 110 + src/_data/designTokens/textLeading.json | 18 + src/_data/designTokens/textSizes.json | 49 + src/_data/designTokens/textWeights.json | 23 + src/_data/designTokens/viewports.json | 9 + src/_data/helpers.js | 49 + src/_data/meta.js | 89 + src/_data/navigation.js | 26 + src/_data/personal.yaml | 11 + src/_data/team.yaml | 26 + src/_includes/head/css-inline.njk | 14 + src/_includes/head/js-defer.njk | 1 + src/_includes/head/js-inline.njk | 7 + src/_includes/head/meta-info.njk | 91 + src/_includes/head/preloads.njk | 17 + src/_includes/head/schema.njk | 5 + src/_includes/partials/card-blog.njk | 23 + src/_includes/partials/card-tag.njk | 11 + src/_includes/partials/date.njk | 1 + src/_includes/partials/details.njk | 20 + src/_includes/partials/edit-on.njk | 9 + src/_includes/partials/footer.njk | 46 + src/_includes/partials/gallery.njk | 19 + src/_includes/partials/header.njk | 15 + src/_includes/partials/main-nav.njk | 54 + src/_includes/partials/pagination.njk | 40 + src/_includes/partials/post-tags.njk | 7 + src/_includes/partials/search.njk | 67 + src/_includes/partials/theme-switch.njk | 17 + src/_includes/schemas/base-schema.njk | 15 + src/_includes/schemas/blogpost-schema.njk | 27 + src/_includes/webc/custom-card.webc | 7 + src/_includes/webc/custom-masonry.webc | 9 + src/_includes/webc/custom-svg.webc | 44 + src/_includes/webc/custom-youtube-link.webc | 16 + src/_includes/webc/custom-youtube.webc | 59 + src/_layouts/base.njk | 50 + src/_layouts/page.njk | 8 + src/_layouts/post.njk | 48 + src/_layouts/tags.njk | 10 + src/assets/css/bundle/about.css | 11 + src/assets/css/bundle/column.css | 14 + src/assets/css/bundle/custom-card.css | 105 + src/assets/css/bundle/details.css | 86 + src/assets/css/bundle/footnotes.css | 26 + src/assets/css/bundle/gallery.css | 30 + src/assets/css/bundle/home.css | 314 + src/assets/css/bundle/pagination.css | 41 + src/assets/css/bundle/post.css | 28 + src/assets/css/bundle/styleguide.css | 72 + src/assets/css/bundle/table.css | 96 + src/assets/css/global/base/fonts.css | 49 + src/assets/css/global/base/global-styles.css | 142 + src/assets/css/global/base/reset.css | 144 + src/assets/css/global/base/variables.css | 86 + src/assets/css/global/blocks/button.css | 97 + src/assets/css/global/blocks/code.css | 230 + .../css/global/blocks/external-link.css | 23 + src/assets/css/global/blocks/main-nav.css | 197 + src/assets/css/global/blocks/pagefind.css | 137 + src/assets/css/global/blocks/prose.css | 73 + src/assets/css/global/blocks/section.css | 19 + src/assets/css/global/blocks/seperator.css | 10 + src/assets/css/global/blocks/site-footer.css | 45 + src/assets/css/global/blocks/site-header.css | 4 + src/assets/css/global/blocks/site-logo.css | 11 + src/assets/css/global/blocks/skip-link.css | 35 + src/assets/css/global/blocks/tag.css | 31 + src/assets/css/global/blocks/textgradient.css | 15 + src/assets/css/global/blocks/theme-switch.css | 31 + .../css/global/compositions/cluster.css | 24 + src/assets/css/global/compositions/flow.css | 8 + src/assets/css/global/compositions/grid.css | 39 + src/assets/css/global/compositions/repel.css | 24 + .../css/global/compositions/sidebar.css | 51 + .../css/global/compositions/wrapper.css | 36 + src/assets/css/global/global.css | 18 + src/assets/css/global/tests/debug.css | 70 + src/assets/css/global/tests/is-land.css | 17 + src/assets/css/global/utilities/blur.css | 3 + .../css/global/utilities/heading-line.css | 18 + src/assets/css/global/utilities/ontop.css | 5 + src/assets/css/global/utilities/region.css | 9 + src/assets/css/global/utilities/spin.css | 14 + .../css/global/utilities/visually-hidden.css | 15 + .../fonts/clearsans/clearsans-bold.woff2 | Bin 0 -> 14572 bytes .../fonts/clearsans/clearsans-italic.woff2 | Bin 0 -> 18860 bytes .../fonts/clearsans/clearsans-light.woff2 | Bin 0 -> 16224 bytes .../fonts/clearsans/clearsans-medium.woff2 | Bin 0 -> 16588 bytes .../fonts/clearsans/clearsans-regular.woff2 | Bin 0 -> 14676 bytes .../images/favicon/apple-touch-icon.png | Bin 0 -> 3968 bytes src/assets/images/favicon/favicon.ico | Bin 0 -> 377 bytes src/assets/images/favicon/favicon.svg | 15 + src/assets/images/favicon/icon-192x192.png | Bin 0 -> 4276 bytes src/assets/images/favicon/icon-512x512.png | Bin 0 -> 14269 bytes src/assets/images/favicon/maskable-icon.png | Bin 0 -> 15049 bytes src/assets/images/team/alessio.jpg | Bin 0 -> 252144 bytes src/assets/images/team/karol.jpg | Bin 0 -> 228659 bytes src/assets/images/team/mateusz.jpg | Bin 0 -> 267614 bytes src/assets/images/template/external.svg | 16 + .../images/template/opengraph-default.jpg | Bin 0 -> 73377 bytes ...ove-obsevability-and-data-ops-preview.jpeg | Bin 0 -> 49152 bytes .../comparing-dbt-and-sqlmesh-preview.jpeg | Bin 0 -> 36022 bytes src/assets/og-images/just-a-test-preview.jpeg | Bin 0 -> 27905 bytes ...tivation-process-and-workflow-preview.jpeg | Bin 0 -> 46872 bytes ...o-deploy-prefect-flows-on-vms-preview.jpeg | Bin 0 -> 52791 bytes ...tform-and-why-should-you-care-preview.jpeg | Bin 0 -> 45977 bytes src/assets/scripts/bundle/details.js | 25 + src/assets/scripts/bundle/gallery.js | 20 + src/assets/scripts/bundle/is-land.js | 1 + src/assets/scripts/bundle/nav-drawer.js | 39 + src/assets/scripts/bundle/theme-toggle.js | 74 + .../scripts/components/custom-masonry.js | 41 + .../scripts/components/pagefind-search.js | 111 + src/assets/svg/brand/arrows.svg | 16 + src/assets/svg/brand/brick.svg | 20 + src/assets/svg/brand/logo-spaced.svg | 15 + src/assets/svg/brand/logo.svg | 15 + src/assets/svg/brand/rings.svg | 14 + src/assets/svg/brand/simple.svg | 13 + src/assets/svg/brand/staggered.svg | 23 + src/assets/svg/divider/edgy.svg | 11 + src/assets/svg/divider/pixels.svg | 12 + src/assets/svg/divider/soft-bottom.svg | 10 + src/assets/svg/divider/soft-top.svg | 10 + src/assets/svg/divider/waves.svg | 11 + src/assets/svg/misc/arrow.svg | 16 + src/assets/svg/misc/heart.svg | 14 + src/assets/svg/misc/logo.svg | 7 + src/assets/svg/misc/rss.svg | 15 + src/assets/svg/misc/search.svg | 14 + src/assets/svg/misc/star.svg | 7 + src/assets/svg/platform/bluesky.svg | 13 + src/assets/svg/platform/github.svg | 16 + src/assets/svg/platform/gitlab.svg | 15 + src/assets/svg/platform/instagram.svg | 15 + src/assets/svg/platform/kofi.svg | 23 + src/assets/svg/platform/linkedin.svg | 15 + src/assets/svg/platform/mastodon.svg | 18 + src/assets/svg/platform/youtube.svg | 16 + src/common/404.md | 14 + src/common/_redirects.njk | 14 + src/common/carbon.njk | 9 + src/common/feed-atom.njk | 30 + src/common/feed-json.njk | 32 + src/common/humans.njk | 12 + src/common/og-images.njk | 83 + src/common/robots.njk | 21 + src/common/site-manifest.njk | 31 + src/common/sitemap.njk | 24 + src/common/tagList.njk | 39 + src/common/tags.njk | 20 + src/pages/about.njk | 36 + src/pages/index.njk | 251 + src/pages/insights.njk | 50 + src/pages/legal.md | 12 + src/pages/privacy.md | 36 + src/pages/styleguide.njk | 192 + .../2024/2024-11-20-prefect-deployments.md | 9 + src/posts/2024/2024-11-21-lightweight-K3S.md | 7 + src/posts/2024/2024-11-22-dbt-vs-sqlmesh.md | 7 + .../2024-12-21-prefect-1-to-2-migration.md | 243 + src/posts/posts.json | 5 + tailwind.config.js | 148 + 203 files changed, 13970 insertions(+) create mode 100644 .env-sample create mode 100644 .github/workflows/main.yml create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 LICENSE.MD create mode 100644 eleventy.config.js create mode 100644 netlify.toml create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 readme.md create mode 100644 src/_config/collections.js create mode 100644 src/_config/events.js create mode 100644 src/_config/events/svg-to-jpeg.js create mode 100644 src/_config/filters.js create mode 100644 src/_config/filters/dates.js create mode 100644 src/_config/filters/markdown-format.js create mode 100644 src/_config/filters/slugify.js create mode 100644 src/_config/filters/sort-alphabetic.js create mode 100644 src/_config/filters/sort-random.js create mode 100644 src/_config/filters/splitlines.js create mode 100644 src/_config/filters/striptags.js create mode 100644 src/_config/plugins.js create mode 100644 src/_config/plugins/css-config.js create mode 100644 src/_config/plugins/drafts.js create mode 100644 src/_config/plugins/html-config.js create mode 100644 src/_config/plugins/js-config.js create mode 100644 src/_config/plugins/markdown.js create mode 100644 src/_config/setup/create-colors.js create mode 100644 src/_config/setup/generate-favicons.js create mode 100644 src/_config/shortcodes.js create mode 100644 src/_config/shortcodes/image.js create mode 100644 src/_config/shortcodes/svg.js create mode 100644 src/_config/utils/clamp-generator.js create mode 100644 src/_config/utils/tokens-to-tailwind.js create mode 100644 src/_data/designTokens/borderRadius.json create mode 100644 src/_data/designTokens/colors.json create mode 100644 src/_data/designTokens/colorsBase.json create mode 100644 src/_data/designTokens/fonts.json create mode 100644 src/_data/designTokens/spacing.json create mode 100644 src/_data/designTokens/textLeading.json create mode 100644 src/_data/designTokens/textSizes.json create mode 100644 src/_data/designTokens/textWeights.json create mode 100644 src/_data/designTokens/viewports.json create mode 100644 src/_data/helpers.js create mode 100644 src/_data/meta.js create mode 100644 src/_data/navigation.js create mode 100644 src/_data/personal.yaml create mode 100644 src/_data/team.yaml create mode 100644 src/_includes/head/css-inline.njk create mode 100644 src/_includes/head/js-defer.njk create mode 100644 src/_includes/head/js-inline.njk create mode 100644 src/_includes/head/meta-info.njk create mode 100644 src/_includes/head/preloads.njk create mode 100644 src/_includes/head/schema.njk create mode 100644 src/_includes/partials/card-blog.njk create mode 100644 src/_includes/partials/card-tag.njk create mode 100644 src/_includes/partials/date.njk create mode 100644 src/_includes/partials/details.njk create mode 100644 src/_includes/partials/edit-on.njk create mode 100644 src/_includes/partials/footer.njk create mode 100644 src/_includes/partials/gallery.njk create mode 100644 src/_includes/partials/header.njk create mode 100644 src/_includes/partials/main-nav.njk create mode 100644 src/_includes/partials/pagination.njk create mode 100644 src/_includes/partials/post-tags.njk create mode 100644 src/_includes/partials/search.njk create mode 100644 src/_includes/partials/theme-switch.njk create mode 100644 src/_includes/schemas/base-schema.njk create mode 100644 src/_includes/schemas/blogpost-schema.njk create mode 100644 src/_includes/webc/custom-card.webc create mode 100644 src/_includes/webc/custom-masonry.webc create mode 100644 src/_includes/webc/custom-svg.webc create mode 100644 src/_includes/webc/custom-youtube-link.webc create mode 100644 src/_includes/webc/custom-youtube.webc create mode 100644 src/_layouts/base.njk create mode 100644 src/_layouts/page.njk create mode 100644 src/_layouts/post.njk create mode 100644 src/_layouts/tags.njk create mode 100644 src/assets/css/bundle/about.css create mode 100644 src/assets/css/bundle/column.css create mode 100644 src/assets/css/bundle/custom-card.css create mode 100644 src/assets/css/bundle/details.css create mode 100644 src/assets/css/bundle/footnotes.css create mode 100644 src/assets/css/bundle/gallery.css create mode 100644 src/assets/css/bundle/home.css create mode 100644 src/assets/css/bundle/pagination.css create mode 100644 src/assets/css/bundle/post.css create mode 100644 src/assets/css/bundle/styleguide.css create mode 100644 src/assets/css/bundle/table.css create mode 100644 src/assets/css/global/base/fonts.css create mode 100644 src/assets/css/global/base/global-styles.css create mode 100644 src/assets/css/global/base/reset.css create mode 100644 src/assets/css/global/base/variables.css create mode 100644 src/assets/css/global/blocks/button.css create mode 100644 src/assets/css/global/blocks/code.css create mode 100644 src/assets/css/global/blocks/external-link.css create mode 100644 src/assets/css/global/blocks/main-nav.css create mode 100644 src/assets/css/global/blocks/pagefind.css create mode 100644 src/assets/css/global/blocks/prose.css create mode 100644 src/assets/css/global/blocks/section.css create mode 100644 src/assets/css/global/blocks/seperator.css create mode 100644 src/assets/css/global/blocks/site-footer.css create mode 100644 src/assets/css/global/blocks/site-header.css create mode 100644 src/assets/css/global/blocks/site-logo.css create mode 100644 src/assets/css/global/blocks/skip-link.css create mode 100644 src/assets/css/global/blocks/tag.css create mode 100644 src/assets/css/global/blocks/textgradient.css create mode 100644 src/assets/css/global/blocks/theme-switch.css create mode 100644 src/assets/css/global/compositions/cluster.css create mode 100644 src/assets/css/global/compositions/flow.css create mode 100644 src/assets/css/global/compositions/grid.css create mode 100644 src/assets/css/global/compositions/repel.css create mode 100644 src/assets/css/global/compositions/sidebar.css create mode 100644 src/assets/css/global/compositions/wrapper.css create mode 100644 src/assets/css/global/global.css create mode 100644 src/assets/css/global/tests/debug.css create mode 100644 src/assets/css/global/tests/is-land.css create mode 100644 src/assets/css/global/utilities/blur.css create mode 100644 src/assets/css/global/utilities/heading-line.css create mode 100644 src/assets/css/global/utilities/ontop.css create mode 100644 src/assets/css/global/utilities/region.css create mode 100644 src/assets/css/global/utilities/spin.css create mode 100644 src/assets/css/global/utilities/visually-hidden.css create mode 100644 src/assets/fonts/clearsans/clearsans-bold.woff2 create mode 100644 src/assets/fonts/clearsans/clearsans-italic.woff2 create mode 100644 src/assets/fonts/clearsans/clearsans-light.woff2 create mode 100644 src/assets/fonts/clearsans/clearsans-medium.woff2 create mode 100644 src/assets/fonts/clearsans/clearsans-regular.woff2 create mode 100644 src/assets/images/favicon/apple-touch-icon.png create mode 100644 src/assets/images/favicon/favicon.ico create mode 100644 src/assets/images/favicon/favicon.svg create mode 100644 src/assets/images/favicon/icon-192x192.png create mode 100644 src/assets/images/favicon/icon-512x512.png create mode 100644 src/assets/images/favicon/maskable-icon.png create mode 100644 src/assets/images/team/alessio.jpg create mode 100644 src/assets/images/team/karol.jpg create mode 100644 src/assets/images/team/mateusz.jpg create mode 100644 src/assets/images/template/external.svg create mode 100644 src/assets/images/template/opengraph-default.jpg create mode 100644 src/assets/og-images/breaking-down-prefect-flows-to-improve-obsevability-and-data-ops-preview.jpeg create mode 100644 src/assets/og-images/comparing-dbt-and-sqlmesh-preview.jpeg create mode 100644 src/assets/og-images/just-a-test-preview.jpeg create mode 100644 src/assets/og-images/prefect-10-to-20-migration-motivation-process-and-workflow-preview.jpeg create mode 100644 src/assets/og-images/using-k3s-as-a-lightweight-scalable-solution-to-deploy-prefect-flows-on-vms-preview.jpeg create mode 100644 src/assets/og-images/what-is-a-modern-data-platform-and-why-should-you-care-preview.jpeg create mode 100644 src/assets/scripts/bundle/details.js create mode 100644 src/assets/scripts/bundle/gallery.js create mode 100644 src/assets/scripts/bundle/is-land.js create mode 100644 src/assets/scripts/bundle/nav-drawer.js create mode 100644 src/assets/scripts/bundle/theme-toggle.js create mode 100644 src/assets/scripts/components/custom-masonry.js create mode 100644 src/assets/scripts/components/pagefind-search.js create mode 100644 src/assets/svg/brand/arrows.svg create mode 100644 src/assets/svg/brand/brick.svg create mode 100644 src/assets/svg/brand/logo-spaced.svg create mode 100644 src/assets/svg/brand/logo.svg create mode 100644 src/assets/svg/brand/rings.svg create mode 100644 src/assets/svg/brand/simple.svg create mode 100644 src/assets/svg/brand/staggered.svg create mode 100644 src/assets/svg/divider/edgy.svg create mode 100644 src/assets/svg/divider/pixels.svg create mode 100644 src/assets/svg/divider/soft-bottom.svg create mode 100644 src/assets/svg/divider/soft-top.svg create mode 100644 src/assets/svg/divider/waves.svg create mode 100644 src/assets/svg/misc/arrow.svg create mode 100644 src/assets/svg/misc/heart.svg create mode 100644 src/assets/svg/misc/logo.svg create mode 100644 src/assets/svg/misc/rss.svg create mode 100644 src/assets/svg/misc/search.svg create mode 100644 src/assets/svg/misc/star.svg create mode 100644 src/assets/svg/platform/bluesky.svg create mode 100644 src/assets/svg/platform/github.svg create mode 100644 src/assets/svg/platform/gitlab.svg create mode 100644 src/assets/svg/platform/instagram.svg create mode 100644 src/assets/svg/platform/kofi.svg create mode 100644 src/assets/svg/platform/linkedin.svg create mode 100644 src/assets/svg/platform/mastodon.svg create mode 100644 src/assets/svg/platform/youtube.svg create mode 100644 src/common/404.md create mode 100644 src/common/_redirects.njk create mode 100644 src/common/carbon.njk create mode 100644 src/common/feed-atom.njk create mode 100644 src/common/feed-json.njk create mode 100644 src/common/humans.njk create mode 100644 src/common/og-images.njk create mode 100644 src/common/robots.njk create mode 100644 src/common/site-manifest.njk create mode 100644 src/common/sitemap.njk create mode 100644 src/common/tagList.njk create mode 100644 src/common/tags.njk create mode 100644 src/pages/about.njk create mode 100644 src/pages/index.njk create mode 100644 src/pages/insights.njk create mode 100644 src/pages/legal.md create mode 100644 src/pages/privacy.md create mode 100644 src/pages/styleguide.njk create mode 100644 src/posts/2024/2024-11-20-prefect-deployments.md create mode 100644 src/posts/2024/2024-11-21-lightweight-K3S.md create mode 100644 src/posts/2024/2024-11-22-dbt-vs-sqlmesh.md create mode 100644 src/posts/2024/2024-12-21-prefect-1-to-2-migration.md create mode 100644 src/posts/posts.json create mode 100644 tailwind.config.js diff --git a/.env-sample b/.env-sample new file mode 100644 index 0000000..e598bb8 --- /dev/null +++ b/.env-sample @@ -0,0 +1 @@ +URL=http://localhost:8080 \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..8d8a242 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,36 @@ +name: Build & Deploy + +on: + push: + branches: ['main'] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: ['20.11.0'] + + steps: + - uses: actions/checkout@v3 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + - name: Install packages + run: npm install + + - name: Run npm build + run: npm run build:11ty + + - name: Deploy to gh-pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./_site # Adjust to your Eleventy output directory + destination_branch: gh-pages # Ensure this branch exists or can be created + force_orphan: true # Optional: Fixes potential branch conflicts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10ade96 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Node modules +node_modules + +# generated files +dist +_site +src/_includes/css +src/_includes/scripts + +# cache +.cache + +# secret data +.env \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..77462a8 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +src/**/*.md +src/_includes/components/**/custom-*.njk +src/common/* +src/_includes/scripts/* \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..c322e20 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,18 @@ +{ + "printWidth": 110, + "tabWidth": 2, + "singleQuote": true, + "bracketSpacing": false, + "quoteProps": "consistent", + "trailingComma": "none", + "arrowParens": "avoid", + "plugins": ["prettier-plugin-jinja-template"], + "overrides": [ + { + "files": "*.njk", + "options": { + "parser": "jinja-template" + } + } + ] +} diff --git a/LICENSE.MD b/LICENSE.MD new file mode 100644 index 0000000..3be4818 --- /dev/null +++ b/LICENSE.MD @@ -0,0 +1,48 @@ +## Licenses + +Eleventy Excellent is licensed under the ISC License. +This starter includes components that are licensed under the MIT and Apache License. + +### ISC License + +The **Eleventy Excellent** starter is licensed under the ISC License. +Copyright (c) 2024 Lene Saile + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +### MIT License + +The **Cube Boilerplate** is licensed under the MIT License. +Copyright (c) 2024 Set Studio + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +### APACHE LICENSE 2.0 + +The Font **Clear Sans** is licensed under the Apache License, Version 2.0. +Copyright (c) 2021 Intel + +This license allows: + +- Commercial use +- Modification +- Redistribution with attribution +- Full license: https://www.apache.org/licenses/LICENSE-2.0 diff --git a/eleventy.config.js b/eleventy.config.js new file mode 100644 index 0000000..44e088d --- /dev/null +++ b/eleventy.config.js @@ -0,0 +1,124 @@ +/** + * Most adjustments must be made in `./src/_config/*` + */ + +/** + * Configures Eleventy with various settings, collections, plugins, filters, shortcodes, and more. + * Hint VS Code for eleventyConfig autocompletion. + * © Henry Desroches - https://gist.github.com/xdesro/69583b25d281d055cd12b144381123bf + * @param {import("@11ty/eleventy/src/UserConfig")} eleventyConfig - + * @returns {Object} - + */ + +// register dotenv for process.env.* variables to pickup +import dotenv from 'dotenv'; +dotenv.config(); + +// add yaml support +import yaml from 'js-yaml'; + +// config import +import {getAllPosts, onlyMarkdown, tagList} from './src/_config/collections.js'; +import events from './src/_config/events.js'; +import filters from './src/_config/filters.js'; +import plugins from './src/_config/plugins.js'; +import shortcodes from './src/_config/shortcodes.js'; + +export default async function (eleventyConfig) { + eleventyConfig.addWatchTarget('./src/assets/**/*.{css,js,svg,png,jpeg}'); + eleventyConfig.addWatchTarget('./src/_includes/**/*.{webc}'); + + // --------------------- layout aliases + eleventyConfig.addLayoutAlias('base', 'base.njk'); + eleventyConfig.addLayoutAlias('page', 'page.njk'); + eleventyConfig.addLayoutAlias('post', 'post.njk'); + eleventyConfig.addLayoutAlias('tags', 'tags.njk'); + + // --------------------- Collections + eleventyConfig.addCollection('allPosts', getAllPosts); + eleventyConfig.addCollection('onlyMarkdown', onlyMarkdown); + eleventyConfig.addCollection('tagList', tagList); + + // --------------------- Plugins + eleventyConfig.addPlugin(plugins.htmlConfig); + eleventyConfig.addPlugin(plugins.cssConfig); + eleventyConfig.addPlugin(plugins.jsConfig); + eleventyConfig.addPlugin(plugins.drafts); + + eleventyConfig.addPlugin(plugins.EleventyRenderPlugin); + eleventyConfig.addPlugin(plugins.EleventyHtmlBasePlugin); + eleventyConfig.addPlugin(plugins.rss); + eleventyConfig.addPlugin(plugins.syntaxHighlight); + + eleventyConfig.addPlugin(plugins.webc, { + components: ['./src/_includes/webc/*.webc'], + useTransform: true + }); + + // --------------------- bundle + eleventyConfig.addBundle('css', {hoist: true}); + + // --------------------- Library and Data + eleventyConfig.setLibrary('md', plugins.markdownLib); + eleventyConfig.addDataExtension('yaml', contents => yaml.load(contents)); + + // --------------------- Filters + eleventyConfig.addFilter('toIsoString', filters.toISOString); + eleventyConfig.addFilter('formatDate', filters.formatDate); + eleventyConfig.addFilter('markdownFormat', filters.markdownFormat); + eleventyConfig.addFilter('splitlines', filters.splitlines); + eleventyConfig.addFilter('striptags', filters.striptags); + eleventyConfig.addFilter('shuffle', filters.shuffleArray); + eleventyConfig.addFilter('alphabetic', filters.sortAlphabetically); + eleventyConfig.addFilter('slugify', filters.slugifyString); + + // --------------------- Shortcodes + eleventyConfig.addShortcode('svg', shortcodes.svgShortcode); + eleventyConfig.addShortcode('image', shortcodes.imageShortcode); + eleventyConfig.addShortcode('year', () => `${new Date().getFullYear()}`); + + // --------------------- Events --------------------- + if (process.env.ELEVENTY_RUN_MODE === 'serve') { + eleventyConfig.on('eleventy.after', events.svgToJpeg); + } + + // --------------------- Passthrough File Copy + + // -- same path + ['src/assets/fonts/', 'src/assets/images/template', 'src/assets/og-images'].forEach(path => + eleventyConfig.addPassthroughCopy(path) + ); + + eleventyConfig.addPassthroughCopy({ + // -- to root + 'src/assets/images/favicon/*': '/', + + // -- node_modules + 'node_modules/lite-youtube-embed/src/lite-yt-embed.{css,js}': `assets/components/` + }); + + // --------------------- Build Settings + eleventyConfig.setDataDeepMerge(true); + + // --------------------- Deployment Settings + eleventyConfig.setBrowserSyncConfig({ + files: './public/static/**/*.css' + }); + + // --------------------- general config + + // const isProduction = process.env.ELEVENTY_ENV === 'production'; + // pathPrefix: isProduction ? '/11ty-test/' : '/' + + return { + markdownTemplateEngine: 'njk', + + dir: { + output: '_site', + input: 'src', + includes: '_includes', + layouts: '_layouts' + } + }; +} + diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..7f2a635 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,20 @@ +[[plugins]] +package = "netlify-plugin-cache" + [plugins.inputs] + paths = [ ".cache" ] + + +[[headers]] + for = "/*" + [headers.values] + Content-Security-Policy = "upgrade-insecure-requests;" + X-Content-Type-Options = "nosniff" + X-Frame-Options = "DENY" + X-XSS-Protection = "1; mode=block" + Referrer-Policy = "strict-origin-when-cross-origin" + Permissions-Policy = "autoplay=(), camera=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), publickey-credentials-get=()" + + +[build] + command = "npm run build" + publish = "_site" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..10007c5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6982 @@ +{ + "name": "the-scalable-way", + "version": "3.7.3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "the-scalable-way", + "version": "3.7.3", + "dependencies": { + "@11ty/eleventy": "^3.0.0", + "@11ty/eleventy-fetch": "^5.0.1", + "@11ty/eleventy-img": "^5.0.0", + "@11ty/eleventy-plugin-rss": "^2.0.1", + "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", + "@11ty/eleventy-plugin-webc": "^0.11.2", + "@11ty/is-land": "^4.0.0", + "lite-youtube-embed": "^0.3.2", + "tailwindcss": "^3.0.23" + }, + "devDependencies": { + "@toycode/markdown-it-class": "^1.2.4", + "autoprefixer": "^10.4.13", + "colorjs.io": "^0.5.2", + "cross-env": "^7.0.3", + "cssnano": "^7.0.1", + "dayjs": "^1.11.5", + "dotenv": "^16.0.3", + "esbuild": "^0.24.0", + "html-minifier-terser": "^7.1.0", + "js-yaml": "^4.1.0", + "markdown-it": "^14.0.0", + "markdown-it-abbr": "^2.0.0", + "markdown-it-anchor": "^9.0.1", + "markdown-it-eleventy-img": "^0.10.2", + "markdown-it-emoji": "^3.0.0", + "markdown-it-footnote": "^4.0.0", + "markdown-it-link-attributes": "^4.0.1", + "markdown-it-mark": "^4.0.0", + "markdown-it-prism": "^2.3.0", + "netlify-plugin-cache": "^1.0.3", + "pagefind": "^1.2.0", + "postcss": "^8.4.8", + "postcss-cli": "^11.0.0", + "postcss-import": "^16.0.0", + "postcss-import-ext-glob": "^2.0.1", + "postcss-js": "^4.0.0", + "prettier-plugin-jinja-template": "^2.0.0", + "rgb-hex": "^4.1.0", + "rimraf": "^6.0.1", + "sanitize-html": "^2.7.2", + "sharp": "^0.33.4", + "sharp-ico": "^0.1.5", + "slugify": "^1.6.5", + "svgo": "^3.2.0" + }, + "engines": { + "node": ">=20.x.x" + } + }, + "node_modules/@11ty/dependency-tree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-3.0.1.tgz", + "integrity": "sha512-aZizxcL4Z/clm3KPRx8i9ohW9R2gLssXfUSy7qQmQRXb4CUOyvmqk2gKeJqRmXIfMi2bB9w03SgtN5v1YwqpiA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^1.0.2" + } + }, + "node_modules/@11ty/dependency-tree-esm": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-1.0.1.tgz", + "integrity": "sha512-CaCD5dTwyJlQqzzIVMR7Bqa3JApjmILl6+VfOrA1gDjDO+7J5EPhTxE/b7nyGICMc1UtcUnvKputl+EfLpP/PA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^1.0.3", + "acorn": "^8.14.0", + "dependency-graph": "^1.0.0", + "normalize-path": "^3.0.0" + } + }, + "node_modules/@11ty/eleventy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.0.0.tgz", + "integrity": "sha512-0P0ZsJXVW2QiNdhd7z+GYy6n+ivh0enx1DRdua5ta6NlzY2AhbkeWBY6U+FKA8lPS3H4+XsTpfLLfIScpPZLaQ==", + "license": "MIT", + "dependencies": { + "@11ty/dependency-tree": "^3.0.1", + "@11ty/dependency-tree-esm": "^1.0.0", + "@11ty/eleventy-dev-server": "^2.0.4", + "@11ty/eleventy-plugin-bundle": "^3.0.0", + "@11ty/eleventy-utils": "^1.0.3", + "@11ty/lodash-custom": "^4.17.21", + "@11ty/posthtml-urls": "^1.0.0", + "@11ty/recursive-copy": "^3.0.0", + "@sindresorhus/slugify": "^2.2.1", + "bcp-47-normalize": "^2.3.0", + "chardet": "^2.0.0", + "chokidar": "^3.6.0", + "cross-spawn": "^7.0.3", + "debug": "^4.3.7", + "dependency-graph": "^1.0.0", + "entities": "^5.0.0", + "fast-glob": "^3.3.2", + "filesize": "^10.1.6", + "graceful-fs": "^4.2.11", + "gray-matter": "^4.0.3", + "is-glob": "^4.0.3", + "iso-639-1": "^3.1.3", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "liquidjs": "^10.17.0", + "luxon": "^3.5.0", + "markdown-it": "^14.1.0", + "micromatch": "^4.0.8", + "minimist": "^1.2.8", + "moo": "^0.5.2", + "node-retrieve-globals": "^6.0.0", + "normalize-path": "^3.0.0", + "nunjucks": "^3.2.4", + "please-upgrade-node": "^3.2.0", + "posthtml": "^0.16.6", + "posthtml-match-helper": "^2.0.2", + "semver": "^7.6.3", + "slugify": "^1.6.6" + }, + "bin": { + "eleventy": "cmd.cjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-dev-server": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-2.0.4.tgz", + "integrity": "sha512-d0CuufX6yPtVz+RW0oJZg1pVoxo1jOrPmpXYacoiKLJm0MMC9MkPQOCXlimguHVaceHejFo5+aZB9/aGB2RR0A==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^1.0.3", + "chokidar": "^3.6.0", + "debug": "^4.3.7", + "dev-ip": "^1.0.1", + "finalhandler": "^1.3.0", + "mime": "^3.0.0", + "minimist": "^1.2.8", + "morphdom": "^2.7.4", + "please-upgrade-node": "^3.2.0", + "send": "^0.19.0", + "ssri": "^11.0.0", + "urlpattern-polyfill": "^10.0.0", + "ws": "^8.18.0" + }, + "bin": { + "eleventy-dev-server": "cmd.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-fetch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.0.1.tgz", + "integrity": "sha512-n79UhOAWG7XcJkRIoV8cZBpKgGln6mn+2UgsZkP6Xjgg8BqiMfxlYMJrNobSDdw3utyRAs8w/ZAPXoc18qrvMw==", + "license": "MIT", + "dependencies": { + "@rgrove/parse-xml": "^4.2.0", + "debug": "^4.3.7", + "flat-cache": "^6.1.1", + "graceful-fs": "^4.2.11", + "p-queue": "6.6.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-img": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-img/-/eleventy-img-5.0.0.tgz", + "integrity": "sha512-hJ4X5ZIRSOCooL0uXegj+nZi1abWNj22BR4PzF6e9iJg9DGYGxPrC0rg0Hy+7xzP7mzTYiOpDjZVv/NgrHNx6w==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-fetch": "^4.0.1", + "@11ty/eleventy-utils": "^1.0.3", + "brotli-size": "^4.0.0", + "debug": "^4.3.7", + "entities": "^5.0.0", + "image-size": "^1.1.1", + "p-queue": "^6.6.2", + "sharp": "^0.33.5" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-img/node_modules/@11ty/eleventy-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-4.0.1.tgz", + "integrity": "sha512-yIiLM5ziBmg86i4TlXpBdcIygJHvh/GgPJyAiFOckO9H4y9cQDM8eIcJCUQ4Mum0NEVui/OjhEut2R08xw0vlQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "flat-cache": "^3.0.4", + "node-fetch": "^2.6.7", + "p-queue": "^6.6.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-img/node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@11ty/eleventy-img/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@11ty/eleventy-img/node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/@11ty/eleventy-img/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@11ty/eleventy-plugin-bundle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.0.tgz", + "integrity": "sha512-JSnqehT+sWSPi6e44jTXUW+KiV9284YF9fzPQvfGB4cXlk/m/SJk17CavHCleIvKXDN+jrUw9TZkwAwr85ONWQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "posthtml-match-helper": "^2.0.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-rss": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-2.0.2.tgz", + "integrity": "sha512-BiPsNbCvaqAORsg2NA4YqcSvMy/PZiefDU3PtGgwYJQ7A5rkRq/gdod2nu1AzwBG/0c5Qe7D49BxV0SByq9vCw==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^1.0.3", + "@11ty/posthtml-urls": "1.0.0", + "debug": "^4.3.5", + "posthtml": "^0.16.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-syntaxhighlight": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-syntaxhighlight/-/eleventy-plugin-syntaxhighlight-5.0.0.tgz", + "integrity": "sha512-y9BUmP1GofmbJgxM1+ky/UpFCpD8JSOeLeKItUs0WApgnrHk9haHziW7lS86lbArX5SiCVo4zTTw9x53gvRCaA==", + "dependencies": { + "prismjs": "^1.29.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-webc": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-webc/-/eleventy-plugin-webc-0.11.2.tgz", + "integrity": "sha512-oa/XlAqI5KtVO7M14qaN92D2yJfBEMMSb66YWY6YZVbRqFSVbjO4WmRJ2Ti2ZZb1FNvxj4ypGNV8VJleGE69xw==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-plugin-bundle": "^1.0.4", + "@11ty/webc": "^0.11.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-webc/node_modules/@11ty/eleventy-plugin-bundle": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-1.0.5.tgz", + "integrity": "sha512-Esv97j+mOo/yfxjaWl4j8CyszOBsRjU/DOUWOBqVnnDLM8VDXeus2LTJUxF70nAU0g+z+b6fRn8fKnm6b2a/UQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-1.0.3.tgz", + "integrity": "sha512-nULO91om7vQw4Y/UBjM8i7nJ1xl+/nyK4rImZ41lFxiY2d+XUz7ChAj1CDYFjrLZeu0utAYJTZ45LlcHTkUG4g==", + "license": "MIT", + "dependencies": { + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/is-land": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@11ty/is-land/-/is-land-4.0.0.tgz", + "integrity": "sha512-RxbjF2+FzSu3rerHrWLRsvsPX2YM47RwXpdWCCzLhwRSsz5sJe9TnK7mphEld1gZnp2GeD5ByvhqjIc4CqidsQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/lodash-custom": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz", + "integrity": "sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/posthtml-urls": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.0.tgz", + "integrity": "sha512-CcsRdI933x613u7CjM+QGs7iD/m8SaDup3Apohg1+7dybigrEUHc2jGS3mcMgQKvF2+IphqmepD/FrKLlPkPEg==", + "license": "MIT", + "dependencies": { + "evaluate-value": "^2.0.0", + "http-equiv-refresh": "^2.0.1", + "list-to-array": "^1.1.0", + "object.entries": "^1.1.7", + "parse-srcset": "^1.0.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@11ty/recursive-copy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-3.0.1.tgz", + "integrity": "sha512-suoSv7CanyKXIwwtLlzP43n3Mm3MTR7UzaLgnG+JP9wAdg4uCIUJiAhhgs/nkwtkvsuqfrGWrUiaG1K9mEoiPg==", + "license": "ISC", + "dependencies": { + "errno": "^0.1.2", + "graceful-fs": "^4.2.11", + "junk": "^1.0.1", + "maximatch": "^0.1.0", + "mkdirp": "^3.0.1", + "pify": "^2.3.0", + "promise": "^7.0.1", + "rimraf": "^5.0.7", + "slash": "^1.0.0" + } + }, + "node_modules/@11ty/recursive-copy/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@11ty/recursive-copy/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@11ty/recursive-copy/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@11ty/recursive-copy/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/@11ty/recursive-copy/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@11ty/recursive-copy/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@11ty/recursive-copy/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@11ty/webc": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@11ty/webc/-/webc-0.11.4.tgz", + "integrity": "sha512-q1GMcjNnx9PxUr6jyTT5CdDFma3JWkT5D45wRNYUQ/B4cxTTxpC15b2rYdzNaGuSqB6tsArQ9Qh4BPqg6Xo9cA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^1.0.1", + "css-tree": "^2.3.1", + "dependency-graph": "^0.11.0", + "entities": "^4.4.0", + "fast-glob": "^3.2.12", + "is-glob": "^4.0.3", + "nanoid": "^4.0.1", + "node-retrieve-globals": "^2.0.7", + "parse5": "^7.1.2" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/webc/node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/@11ty/webc/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@11ty/webc/node_modules/node-retrieve-globals": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-2.0.8.tgz", + "integrity": "sha512-mVimS/m8H28kyMdvOIfyMCM8wFNiKXM83ag1yHYP297iVmlCSmCh7Ih4b+ig9/DZ2+LbXZCPLDSZO4yRa5ttyg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.8.2", + "acorn-walk": "^8.2.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@canvas/image-data": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz", + "integrity": "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.1.tgz", + "integrity": "sha512-kKXeynfORDGPUEEl2PvTExM2zs+IldC6ZD8jPcfvI351MDNtfMlw9V9s4XZXuJNDK2qR5gbEKxRyoYx3quHUVQ==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.3.0.tgz", + "integrity": "sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.3.0.tgz", + "integrity": "sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.3.0.tgz", + "integrity": "sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.3.0.tgz", + "integrity": "sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.3.0.tgz", + "integrity": "sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rgrove/parse-xml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rgrove/parse-xml/-/parse-xml-4.2.0.tgz", + "integrity": "sha512-UuBOt7BOsKVOkFXRe4Ypd/lADuNIfqJXv8GvHqtXaTYXPPKkj2nS2zPllVsrtRjcomDhIJVBnZwfmlI222WH8g==", + "license": "ISC", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/slugify": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/transliterate": "^1.0.0", + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@toycode/markdown-it-class": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz", + "integrity": "sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-normalize": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-2.3.0.tgz", + "integrity": "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==", + "license": "MIT", + "dependencies": { + "bcp-47": "^2.0.0", + "bcp-47-match": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brotli-size": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-4.0.0.tgz", + "integrity": "sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==", + "license": "MIT", + "dependencies": { + "duplexer": "0.1.1" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/browserslist": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cacheable": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.6.tgz", + "integrity": "sha512-RNBnqNhWBtgYNe4mF4395e6260Q9loh6zT2CDFia9LSJor5+vOsvkxhd7GAtg3U4m8i38adn1Q3jiCU1N33/gg==", + "license": "MIT", + "dependencies": { + "hookified": "^1.5.1", + "keyv": "^5.2.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001689", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", + "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chardet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.0.0.tgz", + "integrity": "sha512-xVgPpulCooDjY6zH4m9YW3jbkaBe3FKIAvF5sj5t7aBNsVl2ljIE+xwJ4iNgiDZHFQvNIpjdKdVOQvvk5ZfxbQ==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", + "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^7.0.6", + "lilconfig": "^3.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", + "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.0", + "postcss-calc": "^10.0.2", + "postcss-colormin": "^7.0.2", + "postcss-convert-values": "^7.0.4", + "postcss-discard-comments": "^7.0.3", + "postcss-discard-duplicates": "^7.0.1", + "postcss-discard-empty": "^7.0.0", + "postcss-discard-overridden": "^7.0.0", + "postcss-merge-longhand": "^7.0.4", + "postcss-merge-rules": "^7.0.4", + "postcss-minify-font-values": "^7.0.0", + "postcss-minify-gradients": "^7.0.0", + "postcss-minify-params": "^7.0.2", + "postcss-minify-selectors": "^7.0.4", + "postcss-normalize-charset": "^7.0.0", + "postcss-normalize-display-values": "^7.0.0", + "postcss-normalize-positions": "^7.0.0", + "postcss-normalize-repeat-style": "^7.0.0", + "postcss-normalize-string": "^7.0.0", + "postcss-normalize-timing-functions": "^7.0.0", + "postcss-normalize-unicode": "^7.0.2", + "postcss-normalize-url": "^7.0.0", + "postcss-normalize-whitespace": "^7.0.0", + "postcss-ordered-values": "^7.0.1", + "postcss-reduce-initial": "^7.0.2", + "postcss-reduce-transforms": "^7.0.0", + "postcss-svgo": "^7.0.1", + "postcss-unique-selectors": "^7.0.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", + "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-bmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/decode-bmp/-/decode-bmp-0.2.1.tgz", + "integrity": "sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@canvas/image-data": "^1.0.0", + "to-data-view": "^1.1.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/decode-ico": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-ico/-/decode-ico-0.4.1.tgz", + "integrity": "sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@canvas/image-data": "^1.0.0", + "decode-bmp": "^0.2.0", + "to-data-view": "^1.1.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.74", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz", + "integrity": "sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-5.0.0.tgz", + "integrity": "sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm-import-transformer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.2.tgz", + "integrity": "sha512-PgvO0wro44lTDM9pYeeOIfpS0lGF80jA+rjT7sBd3b07rxv1AxeNMEI5kSCqRKke2W6SPEz17W3kHOLjaiD7Cw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.2" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/evaluate-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/evaluate-value/-/evaluate-value-2.0.0.tgz", + "integrity": "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-sort": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/fast-sort/-/fast-sort-3.4.1.tgz", + "integrity": "sha512-76uvGPsF6So53sZAqenP9UVT3p5l7cyTHkLWVCMinh41Y8NDrK1IYXJgaBMfc1gk7nJiSRZp676kddFG2Aa5+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/flat-cache": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.4.tgz", + "integrity": "sha512-Km+tVF9BLnxaYqX2R9OKLkwSPvGjDXXlciDC8oBr/nSM4xMCNO8X9s0w5i6lNoE8E/6BEzSJBUF5Bar+TXmKJQ==", + "license": "MIT", + "dependencies": { + "cacheable": "^1.8.6", + "flatted": "^3.3.2", + "hookified": "^1.5.1" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookified": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.5.1.tgz", + "integrity": "sha512-sZQQ5QgNVQUXffNd66qefqOMXA88CXIV0gW8I4bMAJYeu1ZCJsyy7sdchaoHzRyS4o0cXw3krNDXkljZr7uexw==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-equiv-refresh": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-2.0.1.tgz", + "integrity": "sha512-XJpDL/MLkV3dKwLzHwr2dY05dYNfBNlyPu4STQ8WvKCFdc6vC5tPXuq28of663+gHVg03C+16pHHs/+FmmDjcw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ico-endec": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ico-endec/-/ico-endec-0.1.6.tgz", + "integrity": "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==", + "dev": true, + "license": "MPL-2.0" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", + "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "license": "ISC" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/iso-639-1": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.3.tgz", + "integrity": "sha512-1jz0Wh9hyLMRwqEPchb/KZCiTqfFWtc9R3nm7GHPygBAKS8wdKJ3FH4lvLsri6UtAE5Kz5SnowtXZa//6bqMyw==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/junk": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", + "integrity": "sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/keyv": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.2.tgz", + "integrity": "sha512-CRPP4Sq5ofbUE8s4FOirFmDgHeKZFRrH/8+WOUNvLJiMIplRMfnMjxmbaDb+zVd7ex0gGAWqMhZHfcL2u6PrNQ==", + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/liquidjs": { + "version": "10.19.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.19.0.tgz", + "integrity": "sha512-dNINmbNJ/bp3B8n25BtZQV/GbrmFf0o2InGdMdfQXa+LxfzTFXOkUnBsOLZUb82sLzxaiWv5Jc381Kn4zHjTsQ==", + "license": "MIT", + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "liquid": "bin/liquid.js", + "liquidjs": "bin/liquid.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/liquidjs" + } + }, + "node_modules/list-to-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz", + "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==", + "license": "MIT" + }, + "node_modules/lite-youtube-embed": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lite-youtube-embed/-/lite-youtube-embed-0.3.3.tgz", + "integrity": "sha512-gFfVVnj6NRjxVfJKo3qoLtpi0v5mn3AcR4eKD45wrxQuxzveFJUb+7Cr6uV6n+DjO8X3p0UzPPquhGt0H/y+NA==", + "license": "Apache-2.0" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-abbr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-abbr/-/markdown-it-abbr-2.0.0.tgz", + "integrity": "sha512-of7C8pXSjXjDojW4neNP+jD7inUYH/DO0Ca+K/4FUEccg0oHAEX/nfscw0jfz66PJbYWOAT9U8mjO21X5p6aAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it-anchor": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.0.tgz", + "integrity": "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it-eleventy-img": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/markdown-it-eleventy-img/-/markdown-it-eleventy-img-0.10.2.tgz", + "integrity": "sha512-/NAQtt+KKDugE2iWk8AahirM+KGm31INtkrlRXbzBFPnx1nFpyZBXchbluQSvwMbxYBCYkO4VuQAxMiIOkBOAA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@11ty/eleventy-img": "^4.0.2", + "sharp": "^0.33.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "markdown-it": ">= 9.0.0" + } + }, + "node_modules/markdown-it-eleventy-img/node_modules/@11ty/eleventy-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-4.0.1.tgz", + "integrity": "sha512-yIiLM5ziBmg86i4TlXpBdcIygJHvh/GgPJyAiFOckO9H4y9cQDM8eIcJCUQ4Mum0NEVui/OjhEut2R08xw0vlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "flat-cache": "^3.0.4", + "node-fetch": "^2.6.7", + "p-queue": "^6.6.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/markdown-it-eleventy-img/node_modules/@11ty/eleventy-img": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-img/-/eleventy-img-4.0.2.tgz", + "integrity": "sha512-MSCkZRJk9rWa7nojx9HBMZJePOrm+V3XNpT091qguj61SG5UsgXbxAkoeejO3npmKIQJTyVIV/rrA6d7xZYOvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@11ty/eleventy-fetch": "^4.0.0", + "brotli-size": "^4.0.0", + "debug": "^4.3.4", + "entities": "^4.5.0", + "image-size": "^1.1.1", + "p-queue": "^6.6.2", + "sharp": "^0.33.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/markdown-it-eleventy-img/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdown-it-eleventy-img/node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/markdown-it-eleventy-img/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/markdown-it-eleventy-img/node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/markdown-it-eleventy-img/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/markdown-it-emoji": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", + "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it-footnote": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-4.0.0.tgz", + "integrity": "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it-link-attributes": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-4.0.1.tgz", + "integrity": "sha512-pg5OK0jPLg62H4k7M9mRJLT61gUp9nvG0XveKYHMOOluASo9OEF13WlXrpAp2aj35LbedAy3QOCgQCw0tkLKAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it-mark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-4.0.0.tgz", + "integrity": "sha512-YLhzaOsU9THO/cal0lUjfMjrqSMPjjyjChYM7oyj4DnyaXEzA8gnW6cVJeyCrCVeyesrY2PlEdUYJSPFYL4Nkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it-prism": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.3.0.tgz", + "integrity": "sha512-ePtHY80gZyeje4bn3R3SL0jpd1C9HFaYffJW2Ma0YD+tspqa2v9TuVwUyFwboFu4jnFNcO8oPQROgbcYJbmBvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prismjs": "1.29.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/math-intrinsics": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", + "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/maximatch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", + "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", + "license": "MIT", + "dependencies": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "license": "BSD-3-Clause" + }, + "node_modules/morphdom": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.4.tgz", + "integrity": "sha512-ATTbWMgGa+FaMU3FhnFYB6WgulCqwf6opOll4CBzmVDTLvPMmUPrEv8CudmLPK0MESa64+6B89fWOxP3+YIlxQ==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/netlify-plugin-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/netlify-plugin-cache/-/netlify-plugin-cache-1.0.3.tgz", + "integrity": "sha512-CTOwNWrTOP59T6y6unxQNnp1WX702v2R/faR5peSH94ebrYfyY4zT5IsRcIiHKq57jXeyCrhy0GLuTN8ktzuQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-retrieve-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.0.tgz", + "integrity": "sha512-VoEp6WMN/JcbBrJr6LnFE11kdzpKiBKNPFrHCEK2GgFWtiYpeL85WgcZpZFFnWxAU0O65+b+ipQAy4Oxy/+Pdg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.1.3", + "acorn-walk": "^8.3.2", + "esm-import-transformer": "^3.0.2" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pagefind": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.3.0.tgz", + "integrity": "sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==", + "dev": true, + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.3.0", + "@pagefind/darwin-x64": "1.3.0", + "@pagefind/linux-arm64": "1.3.0", + "@pagefind/linux-x64": "1.3.0", + "@pagefind/windows-x64": "1.3.0" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-cli": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.0.tgz", + "integrity": "sha512-xMITAI7M0u1yolVcXJ9XTZiO9aO49mcoKQy6pCDFdMh9kGqhzLVpWxeD/32M/QBmkhcGypZFFOLNLmIW4Pg4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^11.0.0", + "get-stdin": "^9.0.0", + "globby": "^14.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^5.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-cli/node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/postcss-cli/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-colormin": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", + "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz", + "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-comments": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz", + "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", + "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", + "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-import": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz", + "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import-ext-glob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-import-ext-glob/-/postcss-import-ext-glob-2.1.1.tgz", + "integrity": "sha512-qd4ELOx2G0hyjgtmLnf/fSVJXXPhkcxcxhLT1y1mAnk53JYbMLoGg+AFtnJowOSvnv4CvjPAzpLpAcfWeofP5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.12", + "fast-sort": "^3.2.0", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-merge-longhand": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz", + "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.4" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", + "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.0", + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", + "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", + "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", + "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz", + "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", + "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", + "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", + "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", + "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", + "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", + "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", + "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", + "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", + "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-ordered-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", + "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", + "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", + "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reporter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", + "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.3.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz", + "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/posthtml": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "license": "MIT", + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-match-helper": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/posthtml-match-helper/-/posthtml-match-helper-2.0.3.tgz", + "integrity": "sha512-p9oJgTdMF2dyd7WE54QI1LvpBIkNkbSiiECKezNnDVYhGhD1AaOnAkw0Uh0y5TW+OHO8iBdSqnd8Wkpb6iUqmw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "posthtml": "^0.16.6" + } + }, + "node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "license": "MIT", + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "license": "MIT", + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-jinja-template": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-jinja-template/-/prettier-plugin-jinja-template-2.0.0.tgz", + "integrity": "sha512-REZDAcZuOUvMDaPS47/GNRLKvbxh9DO9euXhWA7gJGqTLGzHPK2Z841F8I4bxsR7e2lqnHezkQ8GcWaKekKBVQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "prettier": "^3.0.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "license": "MIT" + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", + "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-hex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rgb-hex/-/rgb-hex-4.1.0.tgz", + "integrity": "sha512-UZLM57BW09Yi9J1R3OP8B1yCbbDK3NT8BDtihGZkGkGEs2b6EaV85rsfJ6yK4F+8UbxFFmfA+9xHT5ZWhN1gDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sanitize-html": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.13.1.tgz", + "integrity": "sha512-ZXtKq89oue4RP7abL9wp/9URJcqQNABB5GGJ2acW1sdO8JTVl92f4ygD7Yc9Ze09VAZhnt2zegeU0tbNsdcLYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^8.0.0", + "is-plain-object": "^5.0.0", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" + } + }, + "node_modules/sanitize-html/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sanitize-html/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", + "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp-ico": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/sharp-ico/-/sharp-ico-0.1.5.tgz", + "integrity": "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "decode-ico": "*", + "ico-endec": "*", + "sharp": "*" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-11.0.0.tgz", + "integrity": "sha512-aZpUoMN/Jj2MqA4vMCeiKGnc/8SuSyHbGSBdgFbZxP8OJGF/lFkIuElzPxsN0q8TQQ+prw3P4EDfB3TBHHgfXw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylehacks": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", + "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "postcss-selector-parser": "^6.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/sucrase/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/terser": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "devOptional": true, + "license": "0BSD" + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7a78986 --- /dev/null +++ b/package.json @@ -0,0 +1,74 @@ +{ + "name": "the-scalable-way", + "version": "3.7.3", + "description": "Based on Eleventy Excellent.", + "author": "Lene Saile", + "type": "module", + "engines": { + "node": ">=20.x.x" + }, + "scripts": { + "clean": "rimraf _site src/_includes/css src/_includes/scripts", + "favicons": "node ./src/_config/setup/generate-favicons.js", + "colors": "node ./src/_config/setup/create-colors.js", + "dev:clean": "rimraf src/assets/og-images", + "dev:11ty": "cross-env ELEVENTY_ENV=development eleventy --serve --watch", + "dev:search": "npx pagefind --site '_site' --serve", + "build:11ty": "cross-env ELEVENTY_ENV=production eleventy", + "build:search": "npx pagefind --site '_site'", + "start": "npm run dev:clean & npm run dev:11ty", + "build": "npm run clean && npm run build:11ty && npm run build:search" + }, + "keywords": [], + "repository": { + "type": "git", + "url": "https://github.com/madrilene/eleventy-excellent.git" + }, + "dependencies": { + "@11ty/eleventy": "^3.0.0", + "@11ty/eleventy-fetch": "^5.0.1", + "@11ty/eleventy-img": "^5.0.0", + "@11ty/eleventy-plugin-rss": "^2.0.1", + "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", + "@11ty/eleventy-plugin-webc": "^0.11.2", + "@11ty/is-land": "^4.0.0", + "lite-youtube-embed": "^0.3.2", + "tailwindcss": "^3.0.23" + }, + "devDependencies": { + "@toycode/markdown-it-class": "^1.2.4", + "autoprefixer": "^10.4.13", + "colorjs.io": "^0.5.2", + "cross-env": "^7.0.3", + "cssnano": "^7.0.1", + "dayjs": "^1.11.5", + "dotenv": "^16.0.3", + "esbuild": "^0.24.0", + "html-minifier-terser": "^7.1.0", + "js-yaml": "^4.1.0", + "markdown-it": "^14.0.0", + "markdown-it-abbr": "^2.0.0", + "markdown-it-anchor": "^9.0.1", + "markdown-it-eleventy-img": "^0.10.2", + "markdown-it-emoji": "^3.0.0", + "markdown-it-footnote": "^4.0.0", + "markdown-it-link-attributes": "^4.0.1", + "markdown-it-mark": "^4.0.0", + "markdown-it-prism": "^2.3.0", + "netlify-plugin-cache": "^1.0.3", + "pagefind": "^1.2.0", + "postcss": "^8.4.8", + "postcss-cli": "^11.0.0", + "postcss-import": "^16.0.0", + "postcss-import-ext-glob": "^2.0.1", + "postcss-js": "^4.0.0", + "prettier-plugin-jinja-template": "^2.0.0", + "rgb-hex": "^4.1.0", + "rimraf": "^6.0.1", + "sanitize-html": "^2.7.2", + "sharp": "^0.33.4", + "sharp-ico": "^0.1.5", + "slugify": "^1.6.5", + "svgo": "^3.2.0" + } +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..6659693 --- /dev/null +++ b/readme.md @@ -0,0 +1,7 @@ +# The Scalable Way + +Based on [eleventy-excellent](https://github.com/madrilene/eleventy-excellent). + + +### To Dos +- optimize the syntax css load in css-inline.njk (now using a CDN) \ No newline at end of file diff --git a/src/_config/collections.js b/src/_config/collections.js new file mode 100644 index 0000000..356d6ed --- /dev/null +++ b/src/_config/collections.js @@ -0,0 +1,19 @@ +/** All blog posts as a collection. */ +export const getAllPosts = collection => { + return collection.getFilteredByGlob('./src/posts/**/*.md').reverse(); +}; + +/** All markdown files as a collection for sitemap.xml */ +export const onlyMarkdown = collection => { + return collection.getFilteredByGlob('./src/**/*.{md,njk}'); +}; + +/** All tags from all posts as a collection - excluding custom collections */ +export const tagList = collection => { + const tagsSet = new Set(); + collection.getAll().forEach(item => { + if (!item.data.tags) return; + item.data.tags.filter(tag => !['posts', 'docs', 'all'].includes(tag)).forEach(tag => tagsSet.add(tag)); + }); + return Array.from(tagsSet).sort(); +}; diff --git a/src/_config/events.js b/src/_config/events.js new file mode 100644 index 0000000..f2957cc --- /dev/null +++ b/src/_config/events.js @@ -0,0 +1,5 @@ +import {svgToJpeg} from './events/svg-to-jpeg.js'; + +export default { + svgToJpeg, +}; diff --git a/src/_config/events/svg-to-jpeg.js b/src/_config/events/svg-to-jpeg.js new file mode 100644 index 0000000..37a39bc --- /dev/null +++ b/src/_config/events/svg-to-jpeg.js @@ -0,0 +1,33 @@ +import {promises as fsPromises, existsSync} from 'node:fs'; +import path from 'node:path'; +import Image from '@11ty/eleventy-img'; + +const ogImagesDir = './src/assets/og-images'; + +export const svgToJpeg = async function () { + const socialPreviewImagesDir = '_site/assets/og-images/'; + + if (!existsSync(socialPreviewImagesDir)) { + console.log('⚠ No OG images dir found'); + return; + } + + const files = await fsPromises.readdir(socialPreviewImagesDir); + if (files.length > 0) { + files.forEach(async function (filename) { + const outputFilename = filename.substring(0, filename.length - 4); + if (filename.endsWith('.svg') & !existsSync(path.join(ogImagesDir, outputFilename))) { + const imageUrl = socialPreviewImagesDir + filename; + await Image(imageUrl, { + formats: ['jpeg'], + outputDir: ogImagesDir, + filenameFormat: function (id, src, width, format, options) { + return `${outputFilename}.${format}`; + } + }); + } + }); + } else { + console.log('⚠ No images found on OG images dir'); + } +}; diff --git a/src/_config/filters.js b/src/_config/filters.js new file mode 100644 index 0000000..1a3fe3c --- /dev/null +++ b/src/_config/filters.js @@ -0,0 +1,18 @@ +import {toISOString, formatDate} from './filters/dates.js'; +import {markdownFormat} from './filters/markdown-format.js'; +import {shuffleArray} from './filters/sort-random.js'; +import {sortAlphabetically} from './filters/sort-alphabetic.js'; +import {splitlines} from './filters/splitlines.js'; +import {striptags} from './filters/striptags.js'; +import {slugifyString} from './filters/slugify.js'; + +export default { + toISOString, + formatDate, + markdownFormat, + splitlines, + striptags, + shuffleArray, + sortAlphabetically, + slugifyString +}; diff --git a/src/_config/filters/dates.js b/src/_config/filters/dates.js new file mode 100644 index 0000000..684fc58 --- /dev/null +++ b/src/_config/filters/dates.js @@ -0,0 +1,7 @@ +import dayjs from 'dayjs'; + +/** Converts the given date string to ISO8610 format. */ +export const toISOString = dateString => dayjs(dateString).toISOString(); + +/** Formats a date using dayjs's conventions: https://day.js.org/docs/en/display/format */ +export const formatDate = (date, format) => dayjs(date).format(format); diff --git a/src/_config/filters/markdown-format.js b/src/_config/filters/markdown-format.js new file mode 100644 index 0000000..2285d92 --- /dev/null +++ b/src/_config/filters/markdown-format.js @@ -0,0 +1,9 @@ +// by Chris Burnell: https://chrisburnell.com/article/some-eleventy-filters/#markdown-format + +import markdownParser from 'markdown-it'; + +const markdown = markdownParser(); + +export const markdownFormat = string => { + return markdown.render(string); +}; diff --git a/src/_config/filters/slugify.js b/src/_config/filters/slugify.js new file mode 100644 index 0000000..89d75b5 --- /dev/null +++ b/src/_config/filters/slugify.js @@ -0,0 +1,10 @@ +import slugify from 'slugify'; + +/** Converts string to a slug form. */ +export const slugifyString = str => { + return slugify(str, { + replacement: '-', + remove: /[#,&,+()$~%.'":*¿?¡!<>{}]/g, + lower: true + }); +}; diff --git a/src/_config/filters/sort-alphabetic.js b/src/_config/filters/sort-alphabetic.js new file mode 100644 index 0000000..0f12faf --- /dev/null +++ b/src/_config/filters/sort-alphabetic.js @@ -0,0 +1,7 @@ +export const sortAlphabetically = array => { + return array.sort((a, b) => { + if (a.data.title < b.data.title) return -1; + if (a.data.title > b.data.title) return 1; + return 0; + }); +}; diff --git a/src/_config/filters/sort-random.js b/src/_config/filters/sort-random.js new file mode 100644 index 0000000..baca2e0 --- /dev/null +++ b/src/_config/filters/sort-random.js @@ -0,0 +1,3 @@ +export const shuffleArray = array => { + return array.sort(() => Math.random() - 0.5); +}; diff --git a/src/_config/filters/splitlines.js b/src/_config/filters/splitlines.js new file mode 100644 index 0000000..507b72c --- /dev/null +++ b/src/_config/filters/splitlines.js @@ -0,0 +1,20 @@ +export const splitlines = (input, maxCharLength) => { + const parts = input.split(' '); + const lines = parts.reduce(function (acc, cur) { + if (!acc.length) { + return [cur]; + } + + let lastOne = acc[acc.length - 1]; + + if (lastOne.length + cur.length > maxCharLength) { + return [...acc, cur]; + } + + acc[acc.length - 1] = lastOne + ' ' + cur; + + return acc; + }, []); + + return lines; +}; diff --git a/src/_config/filters/striptags.js b/src/_config/filters/striptags.js new file mode 100644 index 0000000..b839112 --- /dev/null +++ b/src/_config/filters/striptags.js @@ -0,0 +1,3 @@ +export const striptags = string => { + return string.replace(/<[^>]*>?/gm, ''); +}; diff --git a/src/_config/plugins.js b/src/_config/plugins.js new file mode 100644 index 0000000..00dd5d9 --- /dev/null +++ b/src/_config/plugins.js @@ -0,0 +1,30 @@ +// Eleventy +import {EleventyRenderPlugin} from '@11ty/eleventy'; +import {EleventyHtmlBasePlugin} from '@11ty/eleventy'; +import rss from '@11ty/eleventy-plugin-rss'; +import syntaxHighlight from '@11ty/eleventy-plugin-syntaxhighlight'; +import webc from '@11ty/eleventy-plugin-webc'; + +// custom +import {markdownLib} from './plugins/markdown.js'; +import {drafts} from './plugins/drafts.js'; + +// Custom transforms +import {htmlConfig} from './plugins/html-config.js'; + +// Custom template language +import {cssConfig} from './plugins/css-config.js'; +import {jsConfig} from './plugins/js-config.js'; + +export default { + EleventyRenderPlugin, + EleventyHtmlBasePlugin, + rss, + syntaxHighlight, + webc, + markdownLib, + drafts, + htmlConfig, + cssConfig, + jsConfig +}; diff --git a/src/_config/plugins/css-config.js b/src/_config/plugins/css-config.js new file mode 100644 index 0000000..b77af52 --- /dev/null +++ b/src/_config/plugins/css-config.js @@ -0,0 +1,48 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import postcss from 'postcss'; +import postcssImport from 'postcss-import'; +import postcssImportExtGlob from 'postcss-import-ext-glob'; +import tailwindcss from 'tailwindcss'; +import autoprefixer from 'autoprefixer'; +import cssnano from 'cssnano'; + +export const cssConfig = eleventyConfig => { + eleventyConfig.addTemplateFormats('css'); + + eleventyConfig.addExtension('css', { + outputFileExtension: 'css', + compile: async (inputContent, inputPath) => { + const paths = []; + if (inputPath.endsWith('/src/assets/css/global/global.css')) { + paths.push('src/_includes/css/global.css'); + } else if (inputPath.includes('/src/assets/css/bundle/')) { + const baseName = path.basename(inputPath); + paths.push(`src/_includes/css/${baseName}`); + } else if (inputPath.includes('/src/assets/css/components/')) { + const baseName = path.basename(inputPath); + paths.push(`_site/assets/css/components/${baseName}`); + } else { + return; + } + + return async () => { + let result = await postcss([ + postcssImportExtGlob, + postcssImport, + tailwindcss, + autoprefixer, + cssnano + ]).process(inputContent, {from: inputPath}); + + // Write the output to all specified paths + for (const outputPath of paths) { + await fs.mkdir(path.dirname(outputPath), {recursive: true}); + await fs.writeFile(outputPath, result.css); + } + + return result.css; + }; + } + }); +}; diff --git a/src/_config/plugins/drafts.js b/src/_config/plugins/drafts.js new file mode 100644 index 0000000..05eec4a --- /dev/null +++ b/src/_config/plugins/drafts.js @@ -0,0 +1,30 @@ +export const drafts = eleventyConfig => { + eleventyConfig.addGlobalData('eleventyComputed.permalink', function () { + return data => { + // Always skip during non-watch/serve builds + if (data.draft && !process.env.BUILD_DRAFTS) { + return false; // Ensure templates that use this handle it correctly + } + return data.permalink; + }; + }); + + // When `eleventyExcludeFromCollections` is true, the file is not included in any collections + eleventyConfig.addGlobalData('eleventyComputed.eleventyExcludeFromCollections', function () { + return data => { + // Always exclude from non-watch/serve builds + if (data.draft && !process.env.BUILD_DRAFTS) { + return true; + } + + return data.eleventyExcludeFromCollections ?? false; + }; + }); + + eleventyConfig.on('eleventy.before', ({runMode}) => { + // Set the environment variable + if (runMode === 'serve' || runMode === 'watch') { + process.env.BUILD_DRAFTS = true; + } + }); +}; diff --git a/src/_config/plugins/html-config.js b/src/_config/plugins/html-config.js new file mode 100644 index 0000000..288d451 --- /dev/null +++ b/src/_config/plugins/html-config.js @@ -0,0 +1,19 @@ +import htmlmin from 'html-minifier-terser'; + +const isProduction = process.env.ELEVENTY_ENV === 'production'; + +export const htmlConfig = eleventyConfig => { + eleventyConfig.addTransform('html-minify', (content, path) => { + if (path && path.endsWith('.html') && isProduction) { + return htmlmin.minify(content, { + collapseBooleanAttributes: true, + collapseWhitespace: true, + decodeEntities: true, + includeAutoGeneratedTags: false, + removeComments: true + }); + } + + return content; + }); +}; diff --git a/src/_config/plugins/js-config.js b/src/_config/plugins/js-config.js new file mode 100644 index 0000000..e45a688 --- /dev/null +++ b/src/_config/plugins/js-config.js @@ -0,0 +1,45 @@ +import esbuild from 'esbuild'; +import path from 'node:path'; + +export const jsConfig = eleventyConfig => { + eleventyConfig.addTemplateFormats('js'); + + eleventyConfig.addExtension('js', { + outputFileExtension: 'js', + compile: async (content, inputPath) => { + // Skip processing if not in the designated scripts directories + if (!inputPath.startsWith('./src/assets/scripts/')) { + return; + } + + // Inline scripts processing + if (inputPath.startsWith('./src/assets/scripts/bundle/')) { + const filename = path.basename(inputPath); + const outputFilename = filename; + const outputPath = `./src/_includes/scripts/${outputFilename}`; + + await esbuild.build({ + target: 'es2020', + entryPoints: [inputPath], + outfile: outputPath, + bundle: true, + minify: true + }); + return; + } + + // Default handling for other scripts, excluding inline scripts + return async () => { + let output = await esbuild.build({ + target: 'es2020', + entryPoints: [inputPath], + bundle: true, + minify: true, + write: false + }); + + return output.outputFiles[0].text; + }; + } + }); +}; diff --git a/src/_config/plugins/markdown.js b/src/_config/plugins/markdown.js new file mode 100644 index 0000000..6cbadbe --- /dev/null +++ b/src/_config/plugins/markdown.js @@ -0,0 +1,86 @@ +import markdownIt from 'markdown-it'; +import markdownItPrism from 'markdown-it-prism'; +import markdownItAnchor from 'markdown-it-anchor'; +import markdownItClass from '@toycode/markdown-it-class'; +import markdownItLinkAttributes from 'markdown-it-link-attributes'; +import {full as markdownItEmoji} from 'markdown-it-emoji'; +import markdownItEleventyImg from 'markdown-it-eleventy-img'; +import markdownItFootnote from 'markdown-it-footnote'; +import markdownitMark from 'markdown-it-mark'; +import markdownitAbbr from 'markdown-it-abbr'; +import {slugifyString} from '../filters/slugify.js'; +import path from 'node:path'; + +export const markdownLib = markdownIt({ + html: true, + breaks: true, + linkify: true, + typographer: true +}) + .disable('code') + .use(markdownItPrism, { + defaultLanguage: 'plaintext' + }) + .use(markdownItAnchor, { + slugify: slugifyString, + tabIndex: false, + permalink: markdownItAnchor.permalink.headerLink({ + class: 'heading-anchor' + }) + }) + .use(markdownItClass, { + ol: 'list', + ul: 'list' + }) + .use(markdownItLinkAttributes, [ + { + // match external links + matcher(href) { + return href.match(/^https?:\/\//); + }, + attrs: { + rel: 'noopener' + } + } + ]) + .use(markdownItEmoji) + .use(markdownItEleventyImg, { + imgOptions: { + widths: [440, 880, 1024], + urlPath: '/assets/images/', + outputDir: './_site/assets/images/', + formats: ['webp', 'jpeg'] + }, + globalAttributes: { + loading: 'lazy', + decoding: 'async', + sizes: '90vw' + }, + // prepend src for markdown images + resolvePath: (filepath, env) => { + return path.join('src', filepath); + }, + renderImage(image, attributes) { + const [Image, options] = image; + const [src, attrs] = attributes; + + Image(src, options); + + const metadata = Image.statsSync(src, options); + const imageMarkup = Image.generateHTML(metadata, attrs, { + whitespaceMode: 'inline' + }); + + const imageElement = attrs.title + ? `
+ ${imageMarkup} +
${attrs.title}
+
` + : `${imageMarkup}`; + + return imageElement; + } + }) + .use(markdownItFootnote) + .use(markdownitMark) + .use(markdownitAbbr); diff --git a/src/_config/setup/create-colors.js b/src/_config/setup/create-colors.js new file mode 100644 index 0000000..494abb5 --- /dev/null +++ b/src/_config/setup/create-colors.js @@ -0,0 +1,86 @@ +import fs from 'node:fs'; +import Color from 'colorjs.io'; +import rgbHex from 'rgb-hex'; + +const colorsBase = JSON.parse(fs.readFileSync('./src/_data/designTokens/colorsBase.json', 'utf-8')); + +const generateColorPalette = baseColorHex => { + const baseColor = new Color(baseColorHex).to('oklch'); + + const steps = [ + {label: '50', lightness: 0.96, chroma: baseColor.c * 0.19, hue: baseColor.h}, + {label: '100', lightness: 0.94, chroma: baseColor.c * 0.45, hue: baseColor.h}, + {label: '200', lightness: 0.86, chroma: baseColor.c * 0.76, hue: baseColor.h}, + {label: '300', lightness: 0.8, chroma: baseColor.c * 0.86, hue: baseColor.h}, + {label: '400', lightness: 0.7, chroma: baseColor.c * 0.96, hue: baseColor.h}, + {label: '500', lightness: 0.62, chroma: baseColor.c * 1, hue: baseColor.h}, + {label: '600', lightness: 0.5, chroma: baseColor.c * 1, hue: baseColor.h}, + {label: '700', lightness: 0.42, chroma: baseColor.c * 1, hue: baseColor.h}, + {label: '800', lightness: 0.36, chroma: baseColor.c * 0.85, hue: baseColor.h}, + {label: '900', lightness: 0.25, chroma: baseColor.c * 0.72, hue: baseColor.h}, + {label: '950', lightness: 0.2, chroma: baseColor.c * 0.55, hue: baseColor.h} + ]; + + return steps.map(step => ({ + name: `${step.label}`, + value: '#' + rgbHex(new Color('oklch', [step.lightness, step.chroma, step.hue]).to('srgb').toString()) + })); +}; + +const generateNeutralPalette = baseColorHex => { + const baseColor = new Color(baseColorHex).to('oklch'); + + const steps = [ + {label: '50', lightness: 0.973, chroma: baseColor.c * 0.12, hue: baseColor.h}, + {label: '100', lightness: 0.9, chroma: baseColor.c * 0.14, hue: baseColor.h}, + {label: '200', lightness: 0.8, chroma: baseColor.c * 0.2, hue: baseColor.h}, + {label: '300', lightness: 0.7, chroma: baseColor.c * 0.25, hue: baseColor.h}, + {label: '400', lightness: 0.6, chroma: baseColor.c * 0.3, hue: baseColor.h}, + {label: '500', lightness: 0.5, chroma: baseColor.c * 0.35, hue: baseColor.h}, + {label: '600', lightness: 0.45, chroma: baseColor.c * 0.3, hue: baseColor.h}, + {label: '700', lightness: 0.37, chroma: baseColor.c * 0.28, hue: baseColor.h}, + {label: '800', lightness: 0.33, chroma: baseColor.c * 0.25, hue: baseColor.h}, + {label: '900', lightness: 0.27, chroma: baseColor.c * 0.22, hue: baseColor.h}, + {label: '950', lightness: 0.24, chroma: baseColor.c * 0.2, hue: baseColor.h} + ]; + + return steps.map(step => ({ + name: `${step.label}`, + value: '#' + rgbHex(new Color('oklch', [step.lightness, step.chroma, step.hue]).to('srgb').toString()) + })); +}; + +const colorTokens = { + title: colorsBase.title, + description: colorsBase.description, + items: [] +}; + +colorsBase.neutral.forEach(color => { + const palette = generateNeutralPalette(color.value); + palette.forEach(shade => { + colorTokens.items.push({ + name: `${color.name} ${shade.name}`, + value: shade.value + }); + }); +}); + +colorsBase.colors.forEach(color => { + const palette = generateColorPalette(color.value); + palette.forEach(shade => { + colorTokens.items.push({ + name: `${color.name} ${shade.name}`, + value: shade.value + }); + }); +}); + +colorsBase.fixedColors.forEach(color => { + colorTokens.items.push({ + name: color.name, + value: color.value + }); +}); + +fs.writeFileSync('./src/_data/designTokens/colors.json', JSON.stringify(colorTokens, null, 2)); diff --git a/src/_config/setup/generate-favicons.js b/src/_config/setup/generate-favicons.js new file mode 100644 index 0000000..0074c04 --- /dev/null +++ b/src/_config/setup/generate-favicons.js @@ -0,0 +1,40 @@ +import fs from 'node:fs'; +import sharp from 'sharp'; +import {sharpsToIco} from 'sharp-ico'; +import {pathToSvgLogo} from '../../_data/meta.js'; + +async function createFavicons() { + const outputDir = 'src/assets/images/favicon'; + fs.mkdirSync(outputDir, {recursive: true}); + + // Get the SVG logo + const svgBuffer = fs.readFileSync(pathToSvgLogo); + + // SVG icon + fs.writeFileSync(`${outputDir}/favicon.svg`, svgBuffer); + + // PNG icons + await sharp(svgBuffer).resize(192, 192).toFile(`${outputDir}/icon-192x192.png`); + await sharp(svgBuffer).resize(512, 512).toFile(`${outputDir}/icon-512x512.png`); + await sharp(svgBuffer).resize(180, 180).toFile(`${outputDir}/apple-touch-icon.png`); + + // maskable icon + await sharp(svgBuffer) + .resize(512, 512) + .extend({ + top: 50, + bottom: 50, + left: 50, + right: 50, + background: {r: 0, g: 0, b: 0, alpha: 0} // Transparent padding + }) + .toFile(`${outputDir}/maskable-icon.png`); + + // ICO icon + const iconSharp = sharp(svgBuffer).resize(16, 16); + await sharpsToIco([iconSharp], `${outputDir}/favicon.ico`, {sizes: [16]}); + + console.log('All favicons generated.'); +} + +createFavicons(); diff --git a/src/_config/shortcodes.js b/src/_config/shortcodes.js new file mode 100644 index 0000000..82bcec6 --- /dev/null +++ b/src/_config/shortcodes.js @@ -0,0 +1,4 @@ +import {imageShortcode} from './shortcodes/image.js'; +import {svgShortcode} from './shortcodes/svg.js'; + +export default {imageShortcode, svgShortcode}; diff --git a/src/_config/shortcodes/image.js b/src/_config/shortcodes/image.js new file mode 100644 index 0000000..a7b5018 --- /dev/null +++ b/src/_config/shortcodes/image.js @@ -0,0 +1,97 @@ +import Image from '@11ty/eleventy-img'; +import path from 'node:path'; +import htmlmin from 'html-minifier-terser'; + +/** + * Converts an attribute map object to a string of HTML attributes. + * @param {Object} attributeMap - The attribute map object. + * @returns {string} - The string of HTML attributes. + */ +const stringifyAttributes = attributeMap => { + return Object.entries(attributeMap) + .map(([attribute, value]) => { + if (typeof value === 'undefined') return ''; + return `${attribute}="${value}"`; + }) + .join(' '); +}; + +/** + * Generates an HTML image element with responsive images and optional caption. + * @param {string} src - The path to the image source file. + * @param {string} [alt=''] - The alternative text for the image. + * @param {string} [caption=''] - The caption for the image. + * @param {string} [loading='lazy'] - The loading attribute for the image. + * @param {string} [className] - The CSS class name for the image element. + * @param {string} [sizes='90vw'] - The sizes attribute for the image. + * @param {number[]} [widths=[440, 650, 960, 1200]] - The widths for generating responsive images. + * @param {string[]} [formats=['avif', 'webp', 'jpeg']] - The formats for generating responsive images. + * @returns {string} - The HTML image element. + */ +export const imageShortcode = async ( + src, + alt = '', + caption = '', + loading = 'lazy', + className, + sizes = '90vw', + widths = [440, 650, 960, 1200], + formats = ['avif', 'webp', 'jpeg'] +) => { + const metadata = await Image(src, { + widths: [...widths], + formats: [...formats], + urlPath: '/assets/images/', + outputDir: './_site/assets/images/', + filenameFormat: (id, src, width, format, options) => { + const extension = path.extname(src); + const name = path.basename(src, extension); + return `${name}-${width}w.${format}`; + } + }); + + const lowsrc = metadata.jpeg[metadata.jpeg.length - 1]; + + // Getting the URL to use + let imgSrc = src; + if (!imgSrc.startsWith('.')) { + const inputPath = this.page.inputPath; + const pathParts = inputPath.split('/'); + pathParts.pop(); + imgSrc = `${pathParts.join('/')}/${src}`; + } + + const imageSources = Object.values(metadata) + .map(imageFormat => { + return ` `; + }) + .join('\n'); + + const imgageAttributes = stringifyAttributes({ + src: lowsrc.url, + width: lowsrc.width, + height: lowsrc.height, + alt, + loading, + decoding: loading === 'eager' ? 'sync' : 'async' + }); + + const imageElement = caption + ? `
+ + ${imageSources} + + +
${caption}
+
` + : ` + ${imageSources} + + `; + + return htmlmin.minify(imageElement, {collapseWhitespace: true}); +}; diff --git a/src/_config/shortcodes/svg.js b/src/_config/shortcodes/svg.js new file mode 100644 index 0000000..b46abe8 --- /dev/null +++ b/src/_config/shortcodes/svg.js @@ -0,0 +1,23 @@ +/** + * Generates an optimized SVG shortcode with optional attributes. + * + * @param {string} svgName - The name of the SVG file (without the .svg extension). + * @param {string} [ariaName=''] - The ARIA label for the SVG. + * @param {string} [className=''] - The CSS class name for the SVG. + * @param {string} [styleName=''] - The inline style for the SVG. + * @returns {Promise} The optimized SVG shortcode. + */ + +import {optimize} from 'svgo'; +import {readFileSync} from 'node:fs'; + +export const svgShortcode = async (svgName, ariaName = '', className = '', styleName = '') => { + const svgData = readFileSync(`./src/assets/svg/${svgName}.svg`, 'utf8'); + + const {data} = await optimize(svgData); + + return data.replace( + //, + `` + ); +}; diff --git a/src/_config/utils/clamp-generator.js b/src/_config/utils/clamp-generator.js new file mode 100644 index 0000000..0617e6b --- /dev/null +++ b/src/_config/utils/clamp-generator.js @@ -0,0 +1,43 @@ +/** + * Credits: + * - © Andy Bell - https://buildexcellentwebsit.es/ + */ + +/** + * Takes an array of tokens and sends back and array of name + * and clamp pairs for CSS fluid values. + * + * @param {array} tokens array of {name: string, min: number, max: number} + * @returns {array} {name: string, value: string} + */ + +import viewports from '../../_data/designTokens/viewports.json'; + +export const clampGenerator = tokens => { + const rootSize = 16; + + return tokens.map(({name, min, max}) => { + if (min === max) { + return `${min / rootSize}rem`; + } + + // Convert the min and max sizes to rems + const minSize = min / rootSize; + const maxSize = max / rootSize; + + // Convert the pixel viewport sizes into rems + const minViewport = viewports.min / rootSize; + const maxViewport = viewports.max / rootSize; + + // Slope and intersection allow us to have a fluid value but also keep that sensible + const slope = (maxSize - minSize) / (maxViewport - minViewport); + const intersection = -1 * minViewport * slope + minSize; + + return { + name, + value: `clamp(${minSize}rem, ${intersection.toFixed(2)}rem + ${(slope * 100).toFixed( + 2 + )}vw, ${maxSize}rem)` + }; + }); +}; diff --git a/src/_config/utils/tokens-to-tailwind.js b/src/_config/utils/tokens-to-tailwind.js new file mode 100644 index 0000000..2944744 --- /dev/null +++ b/src/_config/utils/tokens-to-tailwind.js @@ -0,0 +1,24 @@ +/** + * Credits: + * - © Andy Bell - https://buildexcellentwebsit.es/ + */ + +/** + * Converts human readable tokens into tailwind config friendly ones + * + * @param {array} tokens {name: string, value: any} + * @return {object} {key, value} + */ + +import slugify from 'slugify'; + +export const tokensToTailwind = tokens => { + const nameSlug = text => slugify(text, {lower: true}); + let response = {}; + + tokens.forEach(({name, value}) => { + response[nameSlug(name)] = value; + }); + + return response; +}; diff --git a/src/_data/designTokens/borderRadius.json b/src/_data/designTokens/borderRadius.json new file mode 100644 index 0000000..192feb4 --- /dev/null +++ b/src/_data/designTokens/borderRadius.json @@ -0,0 +1,15 @@ +{ + "title": "Border Radius", + "description": "", + "meta": {}, + "items": [ + { + "name": "small", + "value": "1.5px" + }, + { + "name": "Medium", + "value": "3px" + } + ] +} diff --git a/src/_data/designTokens/colors.json b/src/_data/designTokens/colors.json new file mode 100644 index 0000000..e45ed9b --- /dev/null +++ b/src/_data/designTokens/colors.json @@ -0,0 +1,102 @@ +{ + "title": "Colors", + "description": "Hex color codes that can be shared, cross-platform. They can be converted at point of usage, such as HSL for web or CMYK for print. neutral and colors are converted to color scales, fixedColors are kept as they are", + "items": [ + { + "name": "Dove Gray 50", + "value": "#f5f5f6" + }, + { + "name": "Dove Gray 100", + "value": "#ddddde" + }, + { + "name": "Dove Gray 200", + "value": "#bdbdbe" + }, + { + "name": "Dove Gray 300", + "value": "#9e9e9f" + }, + { + "name": "Dove Gray 400", + "value": "#807f81" + }, + { + "name": "Dove Gray 500", + "value": "#636264" + }, + { + "name": "Dove Gray 600", + "value": "#555456" + }, + { + "name": "Dove Gray 700", + "value": "#3f3f40" + }, + { + "name": "Dove Gray 800", + "value": "#353536" + }, + { + "name": "Dove Gray 900", + "value": "#262627" + }, + { + "name": "Dove Gray 950", + "value": "#1f1f1f" + }, + { + "name": "Royal Blue 50", + "value": "#e7f1ff" + }, + { + "name": "Royal Blue 100", + "value": "#deeaff" + }, + { + "name": "Royal Blue 200", + "value": "#b9ceff" + }, + { + "name": "Royal Blue 300", + "value": "#9fb9ff" + }, + { + "name": "Royal Blue 400", + "value": "#7494ff" + }, + { + "name": "Royal Blue 500", + "value": "#5977fc" + }, + { + "name": "Royal Blue 600", + "value": "#3a50d2" + }, + { + "name": "Royal Blue 700", + "value": "#2936b7" + }, + { + "name": "Royal Blue 800", + "value": "#1f2a94" + }, + { + "name": "Royal Blue 900", + "value": "#0d0c64" + }, + { + "name": "Royal Blue 950", + "value": "#070846" + }, + { + "name": "Gold", + "value": "#DFBA56" + }, + { + "name": "Pink", + "value": "#C23797" + } + ] +} \ No newline at end of file diff --git a/src/_data/designTokens/colorsBase.json b/src/_data/designTokens/colorsBase.json new file mode 100644 index 0000000..856fae8 --- /dev/null +++ b/src/_data/designTokens/colorsBase.json @@ -0,0 +1,26 @@ +{ + "title": "Colors", + "description": "Hex color codes that can be shared, cross-platform. They can be converted at point of usage, such as HSL for web or CMYK for print. neutral and colors are converted to color scales, fixedColors are kept as they are", + "neutral": [ + { + "name": "Dove Gray", + "value": "#68676C" + } + ], + "colors": [ + { + "name": "Royal Blue", + "value": "#4862E5" + } + ], + "fixedColors": [ + { + "name": "Gold", + "value": "#DFBA56" + }, + { + "name": "Pink", + "value": "#C23797" + } + ] +} diff --git a/src/_data/designTokens/fonts.json b/src/_data/designTokens/fonts.json new file mode 100644 index 0000000..734107b --- /dev/null +++ b/src/_data/designTokens/fonts.json @@ -0,0 +1,29 @@ +{ + "title": "Fonts", + "description": "Each array of fonts creates a priority-based order. The first font in the array should be the ideal font, followed by sensible, web-safe fallbacks", + "items": [ + { + "name": "Display", + "description": "Display font stack for headings and large text. ", + "value": ["Clear Sans", "Segoe UI", "Roboto", "Helvetica Neue", "Arial", "sans-serif"] + }, + { + "name": "Base", + "description": "Base font stack for body text. Clear Sans is a modern, versatile sans-serif typeface designed for optimal readability across user interfaces, print, and digital screens. Its clean, open letterforms and balanced proportions ensure clarity even at smaller sizes, making it ideal for UI design and body text. Originally created by Intel for enhanced legibility.", + "value": ["Clear Sans", "system-ui", "sans-serif"] + }, + { + "name": "Mono", + "description": "Monospace font for code and preformatted text.", + "value": [ + "ui-monospace", + "Cascadia Code", + "Source Code Pro", + "Menlo", + "Consolas", + "DejaVu Sans Mono", + "monospace" + ] + } + ] +} diff --git a/src/_data/designTokens/spacing.json b/src/_data/designTokens/spacing.json new file mode 100644 index 0000000..779ea03 --- /dev/null +++ b/src/_data/designTokens/spacing.json @@ -0,0 +1,110 @@ +{ + "title": "Spacing", + "description": "Consistent spacing sizes, based on a ratio, with min and max sizes. This allows you to set spacing based on the context size. For example, min for mobile and max for desktop browsers.", + "meta": { + "scaleGenerator": "https://utopia.fyi/space/calculator?c=320,19,1.2,1350,26,1.414,8,2,&s=0.75|0.5|0.25,2|3|5|8|13,s-l&g=s,l,xl,12", + "note": "" + }, + "items": [ + { + "name": "4XS", + "min": 2, + "max": 3 + }, + { + "name": "3XS", + "min": 5, + "max": 6 + }, + { + "name": "2XS", + "min": 9, + "max": 11 + }, + { + "name": "XS", + "min": 14, + "max": 17 + }, + { + "name": "S", + "min": 18, + "max": 22 + }, + { + "name": "M", + "min": 27, + "max": 33 + }, + { + "name": "L", + "min": 36, + "max": 44 + }, + { + "name": "XL", + "min": 54, + "max": 66 + }, + { + "name": "2XL", + "min": 90, + "max": 110 + }, + { + "name": "3XL", + "min": 144, + "max": 176 + }, + { + "name": "4XL", + "min": 234, + "max": 286 + }, + { + "name": "3XS - 2XS", + "min": 5, + "max": 11 + }, + { + "name": "2XS - XS", + "min": 9, + "max": 17 + }, + { + "name": "XS - S", + "min": 14, + "max": 22 + }, + { + "name": "S - M", + "min": 18, + "max": 33 + }, + { + "name": "M - L", + "min": 27, + "max": 44 + }, + { + "name": "L - XL", + "min": 36, + "max": 66 + }, + { + "name": "L - 2xl", + "min": 36, + "max": 110 + }, + { + "name": "XL - 2XL", + "min": 54, + "max": 110 + }, + { + "name": "2XL - 3xl", + "min": 90, + "max": 176 + } + ] +} diff --git a/src/_data/designTokens/textLeading.json b/src/_data/designTokens/textLeading.json new file mode 100644 index 0000000..c221a97 --- /dev/null +++ b/src/_data/designTokens/textLeading.json @@ -0,0 +1,18 @@ +{ + "title": "Leading", + "description": "Ratio-based leading/line-height values", + "items": [ + { + "name": "Flat", + "value": 1 + }, + { + "name": "Fine", + "value": 1.2 + }, + { + "name": "Standard", + "value": 1.5 + } + ] +} diff --git a/src/_data/designTokens/textSizes.json b/src/_data/designTokens/textSizes.json new file mode 100644 index 0000000..5a4e0a4 --- /dev/null +++ b/src/_data/designTokens/textSizes.json @@ -0,0 +1,49 @@ +{ + "title": "Text Sizes", + "description": "A minimum and maximum text size size allows you to pick the right size from a ratio, depending on the context size. The min and max sizes are in pixels and should be converted to appropiate sizes, per context", + "meta": { + "scaleGenerator": "https://utopia.fyi/type/calculator?c=320,19,1.2,1350,28,1.25,6,2,&s=0.75|0.5|0.25,2|3|5|8|13,s-l&g=s,l,xl,12" + }, + "items": [ + { + "name": "Step min 2", + "min": 11, + "max": 13 + }, + { + "name": "Step min 1", + "min": 15, + "max": 16 + }, + { + "name": "Step 0", + "min": 18, + "max": 22 + }, + { + "name": "Step 1", + "min": 20, + "max": 26 + }, + { + "name": "Step 2", + "min": 22, + "max": 31 + }, + { + "name": "Step 3", + "min": 26, + "max": 44 + }, + { + "name": "Step 4", + "min": 31, + "max": 63 + }, + { + "name": "Step 5", + "min": 37, + "max": 88 + } + ] +} diff --git a/src/_data/designTokens/textWeights.json b/src/_data/designTokens/textWeights.json new file mode 100644 index 0000000..c7f29e7 --- /dev/null +++ b/src/_data/designTokens/textWeights.json @@ -0,0 +1,23 @@ +{ + "title": "Text Weights", + "description": "Helper classes and custom properties for common font weights", + "meta": {}, + "items": [ + { + "name": "Light", + "value": 300 + }, + { + "name": "Regular", + "value": 400 + }, + { + "name": "Medium", + "value": 500 + }, + { + "name": "Bold", + "value": 700 + } + ] +} diff --git a/src/_data/designTokens/viewports.json b/src/_data/designTokens/viewports.json new file mode 100644 index 0000000..7c4a4f4 --- /dev/null +++ b/src/_data/designTokens/viewports.json @@ -0,0 +1,9 @@ +{ + "title": "Viewports", + "description": "The min and maximum viewports used to generate fluid type and space scales.", + "min": 320, + "navigation": 603, + "sm": 640, + "md": 1000, + "max": 1360 +} diff --git a/src/_data/helpers.js b/src/_data/helpers.js new file mode 100644 index 0000000..a6893bd --- /dev/null +++ b/src/_data/helpers.js @@ -0,0 +1,49 @@ +/** + * Returns back some attributes based on whether the + * link is active or a parent of an active item. + * + * @param {String} itemUrl - The link in question. + * @param {String} pageUrl - The page context. + * @returns {String} - The attributes or empty. + */ +export function getLinkActiveState(itemUrl, pageUrl) { + let response = ''; + + // Ensure pageUrl is a string before proceeding + if (typeof pageUrl === 'string') { + if (itemUrl === pageUrl) { + response = ' aria-current="page"'; + } + + if (itemUrl.length > 1 && pageUrl.startsWith(itemUrl.replace('/page-0/', ''))) { + response += ' data-state="active"'; + } + } + + return response; +} + +/** + * Take an array of keys and return back items that match. + * Note: items in the collection must have a key attribute in + * Front Matter. + * + * @param {Array} collection - 11ty collection. + * @param {Array} keys - Collection of keys. + * @returns {Array} - Result collection or empty. + */ +export function filterCollectionByKeys(collection, keys) { + return collection.filter(x => keys.includes(x.data.key)); +} + +/** + * Generates a random UUID (Universally Unique Identifier). + * + * @returns {string} A random UUID. + */ +export function random() { + const segment = () => { + return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); + }; + return `${segment()}-${segment()}-${segment()}`; +} diff --git a/src/_data/meta.js b/src/_data/meta.js new file mode 100644 index 0000000..ee103f0 --- /dev/null +++ b/src/_data/meta.js @@ -0,0 +1,89 @@ +export const url = process.env.URL || 'http://localhost:8080'; +export const siteName = 'The Scalable Way'; +export const siteDescription = 'Empowering Data Platforms with Precision and Scale'; +export const siteType = 'Organization'; // schema +export const locale = 'en_EN'; +export const lang = 'en'; +export const skipContent = 'Skip to content'; +export const author = { + name: 'The Scalable Way', // i.e. Lene Saile - page / blog author's name. Must be set. + avatar: '/icon-512x512.png', // path to the author's avatar. In this case just using a favicon. + email: '', // i.e. hola@lenesaile.com - email of the author + website: '', // i.e. https.://www.lenesaile.com - the personal site of the author + fediverse: '' // used for highlighting journalism on the fediverse. Can be Mastodon, Flipboard, Threads, WordPress (with the ActivityPub plugin installed), PeerTube, Pixelfed, etc. https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/ +}; +export const creator = { + name: 'Lene Saile', // i.e. Lene Saile - creator's (developer) name. + email: 'hola@lenesaile.com', + website: 'https://www.lenesaile.com', + social: 'https://front-end.social/@lene' +}; +export const pathToSvgLogo = 'src/assets/svg/brand/logo-spaced.svg'; // used for favicon generation +export const themeColor = '#f5f5f6'; // Manifest: defines the default theme color for the application +export const themeBgColor = '#f5f5f6'; // Manifest: defines a placeholder background color for the application page to display before its stylesheet is loaded +export const opengraph_default = '/assets/images/template/opengraph-default.jpg'; // fallback/default meta image +export const opengraph_default_alt = 'Visible content: The Scalable Way'; // alt text for default meta image" +export const blog = { + // RSS feed + name: 'Blog', + description: '', + // feed links are looped over in the head. You may add more to the array. + feedLinks: [ + { + title: 'Atom Feed', + url: '/feed.xml', + type: 'application/atom+xml' + }, + { + title: 'JSON Feed', + url: '/feed.json', + type: 'application/json' + } + ], + // Tags + tagSingle: 'Tag', + tagPlural: 'Tags', + tagMore: 'More tags:', + // pagination + paginationLabel: 'Blog', + paginationPage: 'Page', + paginationPrevious: 'Previous', + paginationNext: 'Next', + paginationNumbers: true +}; +export const details = { + aria: 'section controls', + expand: 'expand all', + collapse: 'collapse all' +}; +export const navigation = { + navLabel: 'Menu', + ariaTop: 'Main', + ariaBottom: 'Complementary', + ariaPlatforms: 'Platforms', + drawerNav: false +}; +export const themeSwitch = { + title: 'Theme', + light: 'light', + dark: 'dark' +}; +export const greenweb = { + // this goes into src/common/greenweb.njk + providers: { + // if you want to add more than one, edit the array directly. + domain: 'netlify.com', + service: 'cdn' + }, + credentials: { + // optional, eg: { domain='my-org.com', doctype = 'webpage', url = 'https://my-org.com/our-climate-record'} + domain: '', + doctype: '', + url: '' + } +}; +export const viewRepo = { + // this is for the view/edit on github link. The value in the package.json will be pulled in. + allow: true, + infoText: 'View this page on GitHub' +}; diff --git a/src/_data/navigation.js b/src/_data/navigation.js new file mode 100644 index 0000000..598e508 --- /dev/null +++ b/src/_data/navigation.js @@ -0,0 +1,26 @@ +export default { + top: [ + { + text: 'About', + url: '/about/' + }, + { + text: 'Insights', + url: '/insights/' + } + ], + bottom: [ + { + text: 'Style guide', + url: '/styleguide/' + }, + { + text: 'Imprint', + url: '/imprint/' + }, + { + text: 'Privacy', + url: '/privacy/' + } + ] +}; diff --git a/src/_data/personal.yaml b/src/_data/personal.yaml new file mode 100644 index 0000000..644c22a --- /dev/null +++ b/src/_data/personal.yaml @@ -0,0 +1,11 @@ +email: hola@eyourmail.lol +address: |- + Organization name + Your street + 12345, city + Tel: +34 928231911 +platforms: + github: '' + mastodon: '' + bluesky: '' + kofi: '' diff --git a/src/_data/team.yaml b/src/_data/team.yaml new file mode 100644 index 0000000..910c97f --- /dev/null +++ b/src/_data/team.yaml @@ -0,0 +1,26 @@ +- name: Alessio Civitillo + image: alessio.jpg + description_short: | + An experienced financial analyst and software engineer, Alessio brings a unique blend of expertise and vision to the world of data, ensuring that our clients unlock the hidden connections in their data and deliver value to their stakeholders. + description_long: | + Alessio Civitillo has spent over a decade blending financial analysis with software engineering. His work focuses on helping clients discover valuable insights hidden in complex datasets. + + By merging data science with strategic thinking, Alessio consistently delivers solutions that drive measurable business success. + +- name: Karol + image: karol.jpg + description_short: | + A dedicated data strategist focused on actionable insights and innovative data-driven solutions. + description_long: | + Karol specializes in developing data-driven strategies tailored to client goals. His keen analytical skills turn raw data into powerful insights. + + With a background in finance and tech, Karol bridges the gap between complex data sets and meaningful business decisions. + +- name: Mateusz + image: mateusz.jpg + description_short: | + Passionate about turning complex data into clear, actionable intelligence for better decision-making. + description_long: | + Mateusz brings expertise in data analytics and process optimization. His focus is on making complex data easy to understand and act upon. + + He thrives on designing solutions that transform insights into competitive advantages, driving client success through precision and clarity. diff --git a/src/_includes/head/css-inline.njk b/src/_includes/head/css-inline.njk new file mode 100644 index 0000000..a8cd2b3 --- /dev/null +++ b/src/_includes/head/css-inline.njk @@ -0,0 +1,14 @@ + + {%- if eleventy.env.runMode === "serve" %} + + + + + {%- else %} + + + + + {%- endif %} + + {% css "global" %}{% include "css/global.css" %}{% endcss %} diff --git a/src/_includes/head/js-defer.njk b/src/_includes/head/js-defer.njk new file mode 100644 index 0000000..2fdb955 --- /dev/null +++ b/src/_includes/head/js-defer.njk @@ -0,0 +1 @@ + diff --git a/src/_includes/head/js-inline.njk b/src/_includes/head/js-inline.njk new file mode 100644 index 0000000..a3037c1 --- /dev/null +++ b/src/_includes/head/js-inline.njk @@ -0,0 +1,7 @@ + + + +{%- js "inline" %} +{% include "scripts/is-land.js" %} +{% include "scripts/theme-toggle.js" %} +{% endjs %} diff --git a/src/_includes/head/meta-info.njk b/src/_includes/head/meta-info.njk new file mode 100644 index 0000000..5e41d60 --- /dev/null +++ b/src/_includes/head/meta-info.njk @@ -0,0 +1,91 @@ +{% set metaDescription %} + {%- if discover.description -%} + {{- discover.description -}} + {%- elif description -%} + {{- description -}} + {%- else -%} + {{- meta.siteDescription -}} + {%- endif -%} +{% endset %} + + + + + + + + + + + + + + + + + + + +{% if personal.platforms.mastodon %} + + +{% endif %} + +{% if meta.author.fediverse %} + + +{% endif %} + + + + + + + + + + + + + + + + + +{% for feedLink in meta.blog.feedLinks %} + +{% endfor %} + + + + + + diff --git a/src/_includes/head/preloads.njk b/src/_includes/head/preloads.njk new file mode 100644 index 0000000..cda68c7 --- /dev/null +++ b/src/_includes/head/preloads.njk @@ -0,0 +1,17 @@ + + + +{%- if preloads -%} + + +{% endif %} diff --git a/src/_includes/head/schema.njk b/src/_includes/head/schema.njk new file mode 100644 index 0000000..ec856c2 --- /dev/null +++ b/src/_includes/head/schema.njk @@ -0,0 +1,5 @@ + +{% include "schemas/base-schema.njk" %} + + +{% if schema == 'blog' %}{%- include "schemas/blogpost-schema.njk" -%}{% endif %} diff --git a/src/_includes/partials/card-blog.njk b/src/_includes/partials/card-blog.njk new file mode 100644 index 0000000..c058bb2 --- /dev/null +++ b/src/_includes/partials/card-blog.njk @@ -0,0 +1,23 @@ + +

+ {{ item.data.title }} +

+ {% include "partials/date.njk" %} + {% + if + item.data.tags.length > 1 + %} +
+ {% for tag in item.data.tags %} + {% if tag != "posts" %} + + {% endif %} + {% endfor %} +
+ {% endif %} +
{{ item.data.description | markdownFormat | safe }}
+
+ +{% css "inline" %} + {% include "css/custom-card.css" %} +{% endcss %} diff --git a/src/_includes/partials/card-tag.njk b/src/_includes/partials/card-tag.njk new file mode 100644 index 0000000..6332c3e --- /dev/null +++ b/src/_includes/partials/card-tag.njk @@ -0,0 +1,11 @@ + +

+ {{ item.data.title }} +

+ {% include "partials/date.njk" %} +

{{ item.data.description }}

+
+ +{% css "inline" %} + {% include "css/custom-card.css" %} +{% endcss %} diff --git a/src/_includes/partials/date.njk b/src/_includes/partials/date.njk new file mode 100644 index 0000000..5735269 --- /dev/null +++ b/src/_includes/partials/date.njk @@ -0,0 +1 @@ + diff --git a/src/_includes/partials/details.njk b/src/_includes/partials/details.njk new file mode 100644 index 0000000..805c378 --- /dev/null +++ b/src/_includes/partials/details.njk @@ -0,0 +1,20 @@ +
+
+ + +
+ {%- for item in itemList | alphabetic -%} +
+ {{ item.data.title }} + {{- item.templateContent | safe -}} +
+ {%- endfor -%} +
+ +{% css "inline" %} + {% include "css/details.css" %} +{% endcss %} + +{% js "defer" %} + {% include "scripts/details.js" %} +{% endjs %} diff --git a/src/_includes/partials/edit-on.njk b/src/_includes/partials/edit-on.njk new file mode 100644 index 0000000..53645b8 --- /dev/null +++ b/src/_includes/partials/edit-on.njk @@ -0,0 +1,9 @@ +{% if meta.viewRepo.allow %} +
+

+ {{ meta[page.lang].blog.githubEdit }} + {{ meta.viewRepo.infoText }}. +

+{% endif %} diff --git a/src/_includes/partials/footer.njk b/src/_includes/partials/footer.njk new file mode 100644 index 0000000..a91fe87 --- /dev/null +++ b/src/_includes/partials/footer.njk @@ -0,0 +1,46 @@ + diff --git a/src/_includes/partials/gallery.njk b/src/_includes/partials/gallery.njk new file mode 100644 index 0000000..f658bf5 --- /dev/null +++ b/src/_includes/partials/gallery.njk @@ -0,0 +1,19 @@ + + + + {% css "inline" %} + {% include "css/gallery.css" %} + {% endcss %} + + {% js "defer" %} + {% include "scripts/gallery.js" %} + {% endjs %} + diff --git a/src/_includes/partials/header.njk b/src/_includes/partials/header.njk new file mode 100644 index 0000000..76cc665 --- /dev/null +++ b/src/_includes/partials/header.njk @@ -0,0 +1,15 @@ + diff --git a/src/_includes/partials/main-nav.njk b/src/_includes/partials/main-nav.njk new file mode 100644 index 0000000..b0d28a5 --- /dev/null +++ b/src/_includes/partials/main-nav.njk @@ -0,0 +1,54 @@ + +{% set drawerNav = meta.navigation.drawerNav %} + + + +{% if drawerNav %} + + + + + +{% endif %} + +{% if drawerNav %} + {% js "defer" %} + {% include "scripts/nav-drawer.js" %} + {% endjs %} +{% endif %} diff --git a/src/_includes/partials/pagination.njk b/src/_includes/partials/pagination.njk new file mode 100644 index 0000000..f6b782a --- /dev/null +++ b/src/_includes/partials/pagination.njk @@ -0,0 +1,40 @@ +
+ +
+ +{% css "inline" %} + {% include "css/pagination.css" %} +{% endcss %} diff --git a/src/_includes/partials/post-tags.njk b/src/_includes/partials/post-tags.njk new file mode 100644 index 0000000..07626b9 --- /dev/null +++ b/src/_includes/partials/post-tags.njk @@ -0,0 +1,7 @@ +{% if tags.size > 1 %} +
+ {% for tag in tags %} + {{ tag }} + {% endfor %} +
+{% endif %} diff --git a/src/_includes/partials/search.njk b/src/_includes/partials/search.njk new file mode 100644 index 0000000..ec01771 --- /dev/null +++ b/src/_includes/partials/search.njk @@ -0,0 +1,67 @@ + + + + + + + diff --git a/src/_includes/partials/theme-switch.njk b/src/_includes/partials/theme-switch.njk new file mode 100644 index 0000000..7ddd6a0 --- /dev/null +++ b/src/_includes/partials/theme-switch.njk @@ -0,0 +1,17 @@ +
+

{{ meta.themeSwitch.title }}

+ + +
+
diff --git a/src/_includes/schemas/base-schema.njk b/src/_includes/schemas/base-schema.njk new file mode 100644 index 0000000..273c415 --- /dev/null +++ b/src/_includes/schemas/base-schema.njk @@ -0,0 +1,15 @@ + diff --git a/src/_includes/schemas/blogpost-schema.njk b/src/_includes/schemas/blogpost-schema.njk new file mode 100644 index 0000000..754ed2f --- /dev/null +++ b/src/_includes/schemas/blogpost-schema.njk @@ -0,0 +1,27 @@ + diff --git a/src/_includes/webc/custom-card.webc b/src/_includes/webc/custom-card.webc new file mode 100644 index 0000000..9c64715 --- /dev/null +++ b/src/_includes/webc/custom-card.webc @@ -0,0 +1,7 @@ + + + +
+ + +
diff --git a/src/_includes/webc/custom-masonry.webc b/src/_includes/webc/custom-masonry.webc new file mode 100644 index 0000000..c28f916 --- /dev/null +++ b/src/_includes/webc/custom-masonry.webc @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/_includes/webc/custom-svg.webc b/src/_includes/webc/custom-svg.webc new file mode 100644 index 0000000..33a9520 --- /dev/null +++ b/src/_includes/webc/custom-svg.webc @@ -0,0 +1,44 @@ + diff --git a/src/_includes/webc/custom-youtube-link.webc b/src/_includes/webc/custom-youtube-link.webc new file mode 100644 index 0000000..8e237ec --- /dev/null +++ b/src/_includes/webc/custom-youtube-link.webc @@ -0,0 +1,16 @@ + + + + + + diff --git a/src/_includes/webc/custom-youtube.webc b/src/_includes/webc/custom-youtube.webc new file mode 100644 index 0000000..7c49133 --- /dev/null +++ b/src/_includes/webc/custom-youtube.webc @@ -0,0 +1,59 @@ + + + + + + + + + + + + diff --git a/src/_layouts/base.njk b/src/_layouts/base.njk new file mode 100644 index 0000000..773823b --- /dev/null +++ b/src/_layouts/base.njk @@ -0,0 +1,50 @@ +{% set assetHash = helpers.random() %} + + + + + + + + + + + + + {%- if title -%} + {{- title -}} + {%- else -%} + {{- meta.siteName -}} + {%- endif -%} + + + + + + {% include "head/js-inline.njk" %} + + + {% include "head/schema.njk" %} + + + + {% include "head/css-inline.njk" %} + + + {% include "head/preloads.njk" %} + + + {% include "head/js-defer.njk" %} + + + {% include "head/meta-info.njk" %} + + + + {% include "partials/header.njk" %} + +
{{ content | safe }}
+ + {% include "partials/footer.njk" %} + + diff --git a/src/_layouts/page.njk b/src/_layouts/page.njk new file mode 100644 index 0000000..33106a8 --- /dev/null +++ b/src/_layouts/page.njk @@ -0,0 +1,8 @@ +--- +layout: base +--- + +
+

{{ title }}

+ {{ content | safe }} +
diff --git a/src/_layouts/post.njk b/src/_layouts/post.njk new file mode 100644 index 0000000..e70e4a9 --- /dev/null +++ b/src/_layouts/post.njk @@ -0,0 +1,48 @@ +--- +layout: base +schema: blog +--- + +
+
+

{{ title }}

+ + {% if image %} + + {% image image, alt or title, credit, "eager", "feature" %} + {% endif %} + +

+ + {% set definedDate = date %} {% include "partials/date.njk" %} + {% + if tags.length > + 1 + %} + + {% for tag in tags %}{% if tag != "posts" %} + + {% endif %}{% endfor %} + {% endif %} +

+ + {{ content | safe }} + {% include 'partials/edit-on.njk' %} +
+ + + +
+ +{%- css "inline" -%} + {%- include 'css/post.css' -%} + {%- include 'css/footnotes.css' -%} +{%- endcss -%} diff --git a/src/_layouts/tags.njk b/src/_layouts/tags.njk new file mode 100644 index 0000000..d6c3c86 --- /dev/null +++ b/src/_layouts/tags.njk @@ -0,0 +1,10 @@ +--- +layout: base +--- + +
+
+

{{ title }}

+ {{ content | safe }} +
+
diff --git a/src/assets/css/bundle/about.css b/src/assets/css/bundle/about.css new file mode 100644 index 0000000..8948a62 --- /dev/null +++ b/src/assets/css/bundle/about.css @@ -0,0 +1,11 @@ +.about main wrapper > * { + border-inline-end: 1px solid var(--color-bg-accent); +} + +.about .grid { + --grid-min-item-size: clamp(16rem, 50vw, 16rem); +} + +.about .about__content div { + padding-block-start: var(--space-2xs); +} diff --git a/src/assets/css/bundle/column.css b/src/assets/css/bundle/column.css new file mode 100644 index 0000000..dc8dabf --- /dev/null +++ b/src/assets/css/bundle/column.css @@ -0,0 +1,14 @@ +.column { + column-count: 1; +} + +.column > * { + break-inside: avoid; +} + +@media screen(sm) { + .column:not(:has(p:only-child, li:only-child)) { + column-count: 2; + gap: var(--gutter, var(--space-l-xl)); + } +} diff --git a/src/assets/css/bundle/custom-card.css b/src/assets/css/bundle/custom-card.css new file mode 100644 index 0000000..6820151 --- /dev/null +++ b/src/assets/css/bundle/custom-card.css @@ -0,0 +1,105 @@ +custom-card { + --gutter: var(--space-xs-s); + background-color: var(--card-bg, var(--color-bg-accent)); + border: 4px solid var(--color-bg-accent); + color: var(--color-text); + padding: var(--space-s-m); + border-radius: var(--border-radius-small); + max-inline-size: unset; + display: grid; + grid-template-rows: [image] max-content [headline] max-content [meta] max-content [desc] auto [footer] max-content; +} + +/* avoid flow space being added to unused elements with nested slots */ +custom-card > :empty { + display: none; +} + +custom-card ::selection { + color: var(--color-dark); + background-color: var(--color-pink); +} + +custom-card :is(h2, h3) { + --flow-space: var(--space-m); + grid-row: headline; + font-size: var(--size-step-2); +} + +custom-card :is(h2, h3) a { + text-decoration: none; +} + +custom-card > :is(picture, figure) { + grid-row: image; + --flow-space: 0; +} + +custom-card img { + max-inline-size: var(--max-img-width, 100%); + block-size: auto; + aspect-ratio: 16/9; + object-fit: cover; + object-position: center; +} + +custom-card > .meta { + grid-row: meta; + font-size: var(--size-step-min-1); +} + +custom-card > p { + grid-row: desc; +} + +custom-card > footer { + grid-row: footer; + font-size: var(--size-step-min-2); +} + +/* avoid overflow of long words */ + +custom-card :is(a, p, h2, h3) { + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; +} + +/* -------------------- variants -------------------- */ + +/* no padding */ + +custom-card[no-padding] { + background-color: transparent; + border: 4px solid var(--color-bg-accent); + padding: 0; + border-radius: none; +} + +/* squared image */ + +custom-card[img-square] img { + aspect-ratio: 1; +} + +/* clickable */ + +custom-card[clickable]:hover, +custom-card[clickable]:focus-within { + border: 4px solid var(--color-blue); +} + +custom-card[clickable]:focus-within a:focus { + outline: none; +} +custom-card[clickable] { + position: relative; +} +custom-card[clickable] a:after { + bottom: 0; + content: ''; + left: 0; + position: absolute; + right: 0; + top: 0; +} diff --git a/src/assets/css/bundle/details.css b/src/assets/css/bundle/details.css new file mode 100644 index 0000000..7eaacd8 --- /dev/null +++ b/src/assets/css/bundle/details.css @@ -0,0 +1,86 @@ +.details .control { + --gutter: var(--space-xs-s); + --cluster-horizontal-alignment: flex-end; + border-block-start: 1px solid var(--color-bg-accent); + padding-block-start: var(--space-xs); +} + +/* Hide without JS */ +is-land:not(:defined) .details .control { + display: none; +} + +.details details > * + * { + margin-block-start: var(--flow-space, 1em); +} + +.details details > p:last-child { + margin-block-end: var(--space-l); +} + +.details summary { + grid-column: content; +} + +.details summary { + display: flex; + align-items: baseline; + line-height: 1.2; + gap: 0 1ch; + cursor: pointer; + list-style: none; + font-weight: var(--font-bold); + font-size: var(--size-step-1); +} + +.details summary:hover, +.details summary:focus-visible, +.details[open] > summary { + color: var(--color-blue); +} + +.details summary::before { + content: '+'; + display: block; + color: var(--color-blue); + font-family: var(--font-mono); + font-size: var(--size-step-0); + font-weight: var(--font-regular); + line-height: 0.5; + transform: scale(1.4); + transform-origin: right bottom; + margin-inline-start: 0.2ch; +} + +.details details[open] summary::before { + content: '–'; +} + +.details details > :is(h2, h3) { + font-weight: var(--font-bold); + font-size: var(--size-step-0); + border-block-end: 1px solid var(--color-bg-accent); + padding-block-end: var(--space-xs); +} + +.details details > :is(h2, h3) { + font-weight: var(--font-bold); + font-size: var(--size-step-0); + border-block-end: 1px solid var(--color-bg-accent); + padding-block-end: var(--space-xs); +} + +/* Hide default marker */ +.details summary::-webkit-details-marker, +.details summary::marker { + content: ''; + display: none; +} + +.details summary + * { + margin-block-start: var(--space-s-m); +} + +.details details > * + * { + margin-inline-start: 2.4ch; +} diff --git a/src/assets/css/bundle/footnotes.css b/src/assets/css/bundle/footnotes.css new file mode 100644 index 0000000..37b76ad --- /dev/null +++ b/src/assets/css/bundle/footnotes.css @@ -0,0 +1,26 @@ +.footnotes { + font-size: var(--size-step-min-1); +} + +.footnote-ref { + font-size: var(--size-step-min-2); + vertical-align: super; + margin-inline-start: 0.1ch; + color: var(--color-text-accent); +} + +.footnote-ref a { + text-decoration: none; + padding: 0.3ch; +} + +.footnote-backref { + text-decoration: none; + background-color: var(--color-bg-accent); + border-radius: var(--border-radius-small); + padding-inline: var(--space-xs); +} + +.footnote-backref:hover { + color: var(--color-blue); +} diff --git a/src/assets/css/bundle/gallery.css b/src/assets/css/bundle/gallery.css new file mode 100644 index 0000000..03e081a --- /dev/null +++ b/src/assets/css/bundle/gallery.css @@ -0,0 +1,30 @@ +.gallery dialog { + border-radius: var(--border-radius-small); + inset: revert; +} + +.gallery dialog + button { + all: unset; + cursor: pointer; +} + +/* Don't indicate interactivity without JS */ +is-land:not(:defined) .gallery dialog + button { + cursor: default; +} + +.gallery dialog::backdrop { + background-image: var(--gradient-stripes); + opacity: 0.9; + filter: brightness(50%); +} + +.gallery dialog img { + aspect-ratio: auto; + max-block-size: 70vh; + inline-size: auto; +} + +.gallery dialog figcaption { + color: var(--color-light); +} diff --git a/src/assets/css/bundle/home.css b/src/assets/css/bundle/home.css new file mode 100644 index 0000000..b924a58 --- /dev/null +++ b/src/assets/css/bundle/home.css @@ -0,0 +1,314 @@ +.home h1 { + font-weight: var(--font-light); +} + +/* ------------------- hero */ + +.home .hero { + --button-icon-size: 1.8ch; + overflow: hidden; + grid-row: 1; + background: var(--color-bg-accent); + display: grid; + block-size: clamp(35rem, 70vh, 45rem); + grid-column: full; +} + +.home .hero > :is(svg, header) { + grid-row: 1; +} + +/* first blue pixel */ +.home .hero > svg { + grid-column: full; + inline-size: 100%; + block-size: auto; + color: var(--color-bg-accent-2); + mix-blend-mode: plus-lighter; +} + +@media screen(max) { + .home .hero > svg { + color: var(--color-text); + mix-blend-mode: normal; + } +} + +.home .hero > svg:first-of-type { + grid-column: full-start / content-end; + transform: rotate(30deg); + inline-size: clamp(30ch, 30vw, 35rem); + margin-inline-start: -15ch; +} + +.home .hero > svg:nth-of-type(2) { + grid-column: content-start / full-end; + justify-self: end; + align-self: center; + inline-size: clamp(50ch, 40vw, 60rem); + transform: rotate(210deg); + margin-inline-end: -20%; + margin-block-end: -10ch; +} + +.home .hero > header { + grid-column: content; + background: transparent; + z-index: 1; + align-self: center; +} + +.home .hero > header p { + max-inline-size: 45ch; +} + +/* ------------------- sections */ + +/* highlight-1 */ + +.home .highlight-one { + position: relative; + overflow: hidden; +} + +.home .highlight-one article > div { + max-inline-size: 58ch; +} + +.home .highlight-one span { + color: var(--color-pink); +} + +.home .highlight-one svg { + grid-column: content-start / full-end; + position: absolute; + inset-inline-end: 0; + inline-size: clamp(30ch, 40vw, 35rem); + block-size: auto; + color: var(--color-blue-accent-2); + mix-blend-mode: overlay; + translate: var(--space-2xl) calc(var(--space-3xl) * -1); +} + +@media screen(md) { + .home .highlight-one svg { + color: var(--color-blue-accent-2); + mix-blend-mode: normal; + } +} + +/* highlight-2 */ + +.home .highlight-two { + z-index: 1; + position: relative; +} + +.home .highlight-two article > * { + max-inline-size: 55ch; + margin-inline: auto; +} + +/* foundations */ + +.home .foundations { + overflow: hidden; + padding-inline: var(--gap); + background: var(--color-bg-accent); + position: relative; +} + +.home .foundations .split { + display: grid; + grid-template-columns: repeat(6, 1fr); +} + +.home .foundations svg { + grid-row: 1; + grid-column: 1/ -1; + color: var(--color-bg-accent-2); +} + +.home .foundations .timeline { + grid-row: 1; + grid-column: 1 / -1; +} + +@media screen(sm) { + .home .foundations svg { + grid-column: 1/ 5; + } + + .home .foundations .timeline { + grid-column: 2 / -1; + } +} + +@media screen(md) { + .home .foundations svg { + grid-column: 1/ 4; + color: var(--color-text); + } + + .home .foundations .timeline { + grid-column: 4 / -1; + } +} + +.home .foundations svg { + inline-size: clamp(40ch, 50vw, 40rem); + block-size: auto; + + margin-block-start: calc(var(--space-l) * -1); + margin-inline-end: calc(var(--space-3xl) - 1.5ch); + justify-self: end; +} + +.home .foundations .timeline { + margin-inline-start: calc(var(--space-s) * -1); + list-style: none; + padding: 0; + position: relative; + display: flex; + flex-direction: column; + gap: var(--space-l); +} + +.home .foundations .timeline li::after { + content: ''; + position: absolute; + width: 0.15ch; + background: var(--color-blue); + inset-inline-start: var(--space-s); + inset-block-start: calc(var(--space-s) * 2); + inset-block-end: calc(-1 * var(--space-l)); + z-index: 0; +} + +.home .foundations .timeline li:last-child::after { + display: none; +} + +.home .foundations .timeline li { + position: relative; + display: flex; + align-items: flex-start; + padding-inline-start: var(--space-xl); + z-index: 1; +} + +.home .foundations .timeline span { + block-size: calc(var(--space-s) * 2); + inline-size: calc(var(--space-s) * 2); + background: var(--color-blue); + color: var(--color-royal-blue-50); + font-size: var(--size-step-2); + font-weight: var(--font-medium); + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + position: absolute; + inset-inline-start: 0; +} + +.home .foundations .timeline div { + margin-inline-start: var(--space-s); + margin-block-start: var(--space-3xs); +} + +/* about */ + +.home .about .grid { + --gutter: var(--space-xl); + --grid-min-item-size: clamp(16rem, 28%, 25rem); +} + +.home .about header div { + grid-column: span 2; + max-inline-size: 45ch; +} + +.home .about .about__content p { + font-size: var(--size-step-min-1); +} + +/* why */ + +.home .why { + --gutter: var(--space-xl); +} + +.home .why header p { + font-size: var(--size-step-1); + font-weight: var(--font-medium); +} + +@media screen(sm) { + .home .why header p { + max-inline-size: 50%; + margin-inline-start: calc(50% + var(--gutter) / 2); + } +} + +.home .why header strong { + color: var(--color-pink); +} + +.home .why .column { + --gutter: var(--space-xl); +} + +.home .why dl > * { + --flow-space: var(--space-l); +} + +.home .why dl div > * { + --flow-space: var(--space-4xs); +} + +/* services */ + +.home .services { + position: relative; +} + +.home .services h3 { + color: var(--color-blue-accent-4); +} + +.home .services h3 span { + display: block; + background: var(--color-blue-accent-4); + color: var(--color-bg); + inline-size: fit-content; + border-radius: var(--border-radius-small); + padding: var(--space-4xs) var(--space-3xs); + margin-block-start: var(--space-3xs); +} + +.home .services .grid { + --gutter: var(--space-s); + --grid-min-item-size: clamp(9rem, 25%, 20rem); + background: var(--color-bg); + border-radius: var(--border-radius-small); + border: 1px solid var(--color-blue-accent-3); + padding: var(--space-xs); + margin-block-start: var(--space-l); + position: relative; +} + +.home .services .grid div { + grid-column: span 2; +} + +.home .services svg { + grid-column: content-start / full-end; + position: absolute; + inset-inline-end: var(--space-m); + inset-block-start: var(--space-s); + inline-size: clamp(10ch, 40vw, 30rem); + block-size: auto; + color: var(--color-blue-accent-3); + rotate: 90deg; +} diff --git a/src/assets/css/bundle/pagination.css b/src/assets/css/bundle/pagination.css new file mode 100644 index 0000000..464afbf --- /dev/null +++ b/src/assets/css/bundle/pagination.css @@ -0,0 +1,41 @@ +.pagination { + --gutter: var(--space-xs-s); +} + +.pagination li { + color: var(--pagination-text, var(--color-text)); + background-color: var(--pagination-bg, var(--color-bg)); + border: 3px solid var(--pagination-border, var(--color-bg-accent)); + border-radius: var(--border-radius-small); +} + +.pagination li:not(:has(a)) { + padding: var(--space-xs) var(--space-s-m); + opacity: 0.6; +} + +.pagination a { + text-decoration: none; +} + +.pagination a { + padding: var(--space-xs) var(--space-s-m); + text-decoration: none; + display: block; +} + +.pagination li:not(:has(a)) { + padding: var(--space-xs) var(--space-s-m); + opacity: 0.6; +} + +.pagination li:has(a:hover) { + --pagination-bg: var(--color-bg-accent); + --pagination-border: var(--color-bg-accent); +} + +.pagination li:has(a[aria-current='page']) { + --pagination-bg: var(--color-pink); + --pagination-border: var(--color-pink); + --pagination-text: var(--color-base-light); +} diff --git a/src/assets/css/bundle/post.css b/src/assets/css/bundle/post.css new file mode 100644 index 0000000..b38f052 --- /dev/null +++ b/src/assets/css/bundle/post.css @@ -0,0 +1,28 @@ +.post img { + max-inline-size: var(--max-img-width, 100%); + block-size: auto; + aspect-ratio: 16/9; + object-fit: cover; + object-position: center; +} + +time { + font-size: var(--size-step-min-1); + color: var(--color-pink); + text-transform: uppercase; + font-weight: var(--font-medium); +} + +.post .credit { + font-size: var(--size-step-min-1); + color: var(--color-text-accent); + background-color: var(--color-bg); + padding: var(--space-xs) var(--space-s); + border-radius: var(--border-radius-small); + transform: translateY(-4ch) translateX(-0.5ch); + max-inline-size: fit-content; +} + +.post .meta { + font-size: var(--size-step-min-1); +} diff --git a/src/assets/css/bundle/styleguide.css b/src/assets/css/bundle/styleguide.css new file mode 100644 index 0000000..4cded7c --- /dev/null +++ b/src/assets/css/bundle/styleguide.css @@ -0,0 +1,72 @@ +.styleguide { + --region-space-top: var(--space-xl-2xl); + --spot-color: color-mix(in oklab, var(--color-bg) 97%, var(--color-text)); +} + +.styleguide code { + font-size: var(--size-step-min-2); +} + +.styleguide li p:has(code) { + line-height: var(--leading-flat); +} + +.styleguide section { + --region-space-bottom: var(--space-l-xl); + --region-space-top: var(--space-l-xl); +} + +.styleguide :is(h2, h3) { + font-size: var(--size-step-0); + font-family: var(--font-base); + text-transform: uppercase; +} + +.styleguide h2 { + letter-spacing: var(--tracking-wide); +} + +.styleguide .colors { + --cluster-vertical-alignment: flex-start; +} + +.styleguide .colors ul { + --min: 10ch; + --gap: var(--space-s-m); + + display: grid; + grid-gap: var(--gap); + /* min() with 100% prevents overflow + in extra narrow spaces */ + grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--min)), 1fr)); +} + +.styleguide .colors li { + display: grid; + gap: var(--space-xs); + grid-row: span 2; + grid-template-rows: subgrid; +} + +.styleguide .colors li div { + max-inline-size: var(--max-img-width, 100%); + block-size: auto; + aspect-ratio: 16/9; + object-fit: cover; + object-position: center; + border: 1px solid var(--color-text); +} + +.styleguide .space { + background-color: var(--color-text); + display: block; +} + +.styleguide .tabs { + align-items: center; + border-block-end: 1px solid #d1d8e0; + display: flex; + gap: var(--space-xs); + margin-block-end: var(--space-s); + padding-block-end: var(--space-s); +} diff --git a/src/assets/css/bundle/table.css b/src/assets/css/bundle/table.css new file mode 100644 index 0000000..28f479a --- /dev/null +++ b/src/assets/css/bundle/table.css @@ -0,0 +1,96 @@ +table { + border: 0; + inline-size: 100%; +} + +table br { + display: none; +} + +thead { + border: none; + clip: rect(0 0 0 0); + block-size: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + inline-size: 1px; +} + +tr { + border: 1px solid var(--color-text); + display: block; + margin-block-end: var(--space-s); +} + +th, +td { + padding: var(--space-xs) var(--space-s); + vertical-align: sub; +} + +td { + border-block-end: 1px solid var(--color-text); + display: block; + text-align: start; +} + +td::before { + content: attr(data-label); + float: start; + font-weight: var(--font-bold); +} + +td:last-child { + border-block-end: 0; +} + +@media screen(sm) { + table { + border-collapse: collapse; + margin: 0; + padding: 0; + table-layout: fixed; + } + + table br { + display: block; + } + + thead { + position: static; + text-align: start; + display: table-header-group; + } + + caption { + margin: var(--space-xs) 0 var(--space-s); + } + + tr { + border: 0; + padding: var(--space-xs); + margin: 0; + display: table-row; + } + + tr:not(:last-child) { + border-block-end: 1px solid var(--color-bg-accent); + } + + td { + border: none; + } + + td::before { + display: none; + } + + th, + td { + padding: var(--space-s); + text-align: start; + display: table-cell; + } +} diff --git a/src/assets/css/global/base/fonts.css b/src/assets/css/global/base/fonts.css new file mode 100644 index 0000000..fb8f888 --- /dev/null +++ b/src/assets/css/global/base/fonts.css @@ -0,0 +1,49 @@ +@font-face { + font-family: 'Clear Sans'; + font-style: normal; + font-display: swap; + font-weight: 300; + src: + local(''), + url('/assets/fonts/clearsans/clearsans-light.woff2') format('woff2'); +} + +@font-face { + font-family: 'Clear Sans'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: + local(''), + url('/assets/fonts/clearsans/clearsans-regular.woff2') format('woff2'); +} + +@font-face { + font-family: 'Clear Sans'; + font-style: italic; + font-display: swap; + font-weight: 400; + src: + local(''), + url('/assets/fonts/clearsans/clearsans-italic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Clear Sans'; + font-style: normal; + font-display: swap; + font-weight: 500; + src: + local(''), + url('/assets/fonts/clearsans/clearsans-medium.woff2') format('woff2'); +} + +@font-face { + font-family: 'Clear Sans'; + font-style: normal; + font-display: swap; + font-weight: 700; + src: + local(''), + url('/assets/fonts/clearsans/clearsans-bold.woff2') format('woff2'); +} diff --git a/src/assets/css/global/base/global-styles.css b/src/assets/css/global/base/global-styles.css new file mode 100644 index 0000000..62ad256 --- /dev/null +++ b/src/assets/css/global/base/global-styles.css @@ -0,0 +1,142 @@ +/* + Global styles + + Low-specificity, global styles that apply to the whole + project: https://cube.fyi/css.html +*/ + +/* Base styles */ +html { + color-scheme: light dark; +} + +body { + display: flex; + flex-direction: column; + font-family: var(--font-base); + font-size: var(--size-step-0); + font-weight: var(--font-regular); + font-size-adjust: from-font; + line-height: var(--leading-standard); + color: var(--color-text); + background-color: var(--color-bg); + accent-color: var(--color-blue); +} + +main { + flex: auto; +} + +/* Typography */ +h1, +h2, +h3 { + font-family: var(--font-display); + font-weight: var(--font-medium); + line-height: var(--leading-fine); + letter-spacing: var(--tracking-s); +} + +h1 { + font-size: var(--size-step-4); +} + +h2 { + font-size: var(--size-step-3); +} + +h3 { + font-size: var(--size-step-2); +} + +/* Text formatting */ +p, +li, +blockquote:not([class]) { + max-inline-size: 65ch; +} + +blockquote { + padding: var(--space-m-l); + border-inline-start: 0.5rem solid var(--color-blue); + font-size: var(--size-step-2); +} + +blockquote > * + * { + margin-block-start: var(--space-m-l); +} + +blockquote :last-child { + font-family: var(--font-base); + font-style: normal; + font-size: var(--size-step-1); +} + +/* Form elements */ +input, +textarea { + caret-color: var(--color-blue); +} + +/* SVG */ +svg { + block-size: 2ex; + inline-size: auto; + flex: none; + stroke-width: 2; + vector-effect: non-scaling-stroke; +} + +/* Text styling */ +b, +strong { + font-weight: var(--font-bold); +} + +/* Horizontal rule */ +hr { + height: 1px; + width: 10%; + margin-block: var(--space-m-l); + margin-inline-start: 0; + background-color: var(--color-bg-accent-2); + border: 0; +} + +/* Links */ +a { + color: currentcolor; + text-decoration-thickness: 0.08em; +} + +mark { + background: var(--color-gold); +} + +a:hover { + text-decoration: none; +} + +/* Focus styles */ +:focus-visible { + outline: 3px solid; + outline-offset: 0.3ch; +} + +/* Text selection */ +::selection { + background-color: var(--color-text); + color: var(--color-bg); +} + +/* Transitions */ +.preload-transitions * { + transition: none !important; +} + +/* Scripting */ +@media (scripting: none) { + .require-js { + display: none; + } +} diff --git a/src/assets/css/global/base/reset.css b/src/assets/css/global/base/reset.css new file mode 100644 index 0000000..64587ed --- /dev/null +++ b/src/assets/css/global/base/reset.css @@ -0,0 +1,144 @@ +/* inspired by: */ +/* https://piccalil.li/blog/a-modern-css-reset/ */ +/* https://keithjgrant.com/posts/2024/01/my-css-resets/ */ +/* https://moderncss.dev/modern-css-for-dynamic-component-based-architecture/#css-reset-additions */ +/* https://github.com/mayank99/reset.css/blob/main/package/index.css */ +/* Box sizing rules */ + +*, +*::before, +*::after { + box-sizing: border-box; +} + +/* Typography */ +:where(*) { + text-wrap: pretty; +} + +:where(h1, h2, h3, h4) { + text-wrap: balance; +} + +/* Scroll behavior */ +:where(html:focus-within) { + scroll-behavior: smooth; +} + +/* Body defaults */ +:where(body) { + min-height: 100vh; + min-height: 100dvh; + text-rendering: optimizeSpeed; + line-height: 1.5; +} + +/* Margins */ +:where(body, h1, h2, h3, h4, p, figure, blockquote, dl, dd) { + margin: 0; +} + +/* List styles */ +:where(ul[role='list'], ol[role='list']) { + list-style: none; +} + +/* Padding for lists */ +:where([role='list']) { + padding: 0; +} + +/* Anchor styles */ +:where(a:not([class])) { + text-decoration-skip-ink: auto; +} + +/* Image styles */ +:where(img, picture, svg, canvas) { + max-inline-size: 100%; + block-size: auto; + vertical-align: middle; + font-style: italic; + background-repeat: no-repeat; + background-size: cover; + shape-margin: 0.75rem; +} + +/* Button styles */ +:where(button) { + all: unset; +} + +/* Inherit fonts for inputs and buttons */ +:where(button, input, select, textarea) { + font: inherit; + color: inherit; +} + +/* Textarea styles */ +:where(textarea) { + resize: vertical; + resize: block; +} + +/* Textarea height */ +:where(textarea:not([rows])) { + min-height: 10em; +} + +/* Cursor styles */ +:where(button, label, select, summary, [role='button'], [role='option']) { + cursor: pointer; +} + +/* Scroll margin above anchor links */ +:where(:target) { + scroll-margin-block-start: 2ex; +} + +/* Scroll margin below focused elements */ +:where(:focus) { + scroll-margin-block-end: 8vh; +} + +:where(dialog) { + border: none; + background: none; + inset: unset; + max-width: unset; + max-height: unset; +} + +:where([popover]) { + border: none; + background: none; + inset: unset; + color: inherit; +} + +/* hide dialog elements without open or popover attributes, and elements with a popover attribute that are not in an open state. */ +:where(dialog:not([open], [popover])), +:where([popover]:not(:popover-open)) { + display: none !important; +} + +/* Prevent page scroll: https://blog.mayank.co/is-dialog-enough */ +:where(html:has(dialog[open]:modal)) { + overflow: hidden; +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + html:focus-within { + scroll-behavior: auto; + } + + *, + ::after, + ::before { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + } +} diff --git a/src/assets/css/global/base/variables.css b/src/assets/css/global/base/variables.css new file mode 100644 index 0000000..5b5d4cb --- /dev/null +++ b/src/assets/css/global/base/variables.css @@ -0,0 +1,86 @@ +/* Basic variable definitions for color schemes */ +:root { + --gap: clamp(1rem, 6vw, 3rem); + --gutter: var(--space-m-l); + --transition-duration: 250ms; + --transition-timing: ease; + --tracking: -0.05ch; + --tracking-s: -0.075ch; + --tracking-wide: 0.05ch; + + --gradient-rainbow: linear-gradient(90deg, #cf4662 10%, #fbbe25 30%, #62c95c 50%, #08bccb 75%, #a977d5 90%); + --gradient-conic: conic-gradient( + var(--color-blue) 0 28%, + var(--color-pink) 0 67%, + var(--color-gold) 0 100% + ); + --gradient-stripes: linear-gradient( + 45deg, + var(--color-base-dark) 0 75%, + var(--color-blue) 0 85%, + var(--color-pink) 0 92%, + var(--color-gold) 0 100% + ); +} + +/* Default / Light theme specific variables */ +:root, +:root[data-theme='light'] { + --color-dark: var(--color-dove-gray-900); + --color-light: var(--color-dove-gray-50); + --color-text: var(--color-dove-gray-900); + --color-text-accent: var(--color-dove-gray-800); + --color-bg: white; + --color-bg-accent: var(--color-dove-gray-50); + --color-bg-accent-2: var(--color-dove-gray-100); + --color-bg-accent-3: var(--color-dove-gray-200); + --color-blue: var(--color-royal-blue-500); + --color-blue-accent: var(--color-royal-blue-50); + --color-blue-accent-2: var(--color-royal-blue-900); + --color-blue-accent-3: var(--color-royal-blue-200); + --color-blue-accent-4: var(--color-royal-blue-600); + + img { + filter: brightness(1); + } +} + +/* Dark theme specific variables based on system preference */ +@media (prefers-color-scheme: dark) { + :root { + --color-text: var(--color-dove-gray-50); + --color-bg: var(--color-dove-gray-800); + --color-blue: var(--color-royal-blue-600); + --color-blue-accent: var(--color-dove-gray-900); + --color-blue-accent-2: var(--color-royal-blue-300); + --color-blue-accent-3: var(--color-dove-gray-100); + --color-blue-accent-4: var(--color-royal-blue-400); + --color-text-accent: var(--color-dove-gray-100); + --color-bg-accent: var(--color-dove-gray-900); + --color-bg-accent-2: var(--color-dove-gray-700); + --color-bg-accent-3: var(--color-dove-gray-700); + + img { + filter: brightness(0.9); + } + } +} + +/* Dark theme specific variables based on manual override */ +:root[data-theme='dark'] { + --color-text: var(--color-dove-gray-50); + --color-bg: var(--color-dove-gray-800); + --color-blue: var(--color-royal-blue-600); + --color-blue-accent: var(--color-dove-gray-900); + --color-blue-accent-2: var(--color-royal-blue-300); + --color-blue-accent-3: var(--color-dove-gray-100); + --color-blue-accent-4: var(--color-royal-blue-400); + --color-text-accent: var(--color-dove-gray-100); + --color-bg-accent: var(--color-dove-gray-900); + --color-bg-accent-2: var(--color-dove-gray-700); + --color-bg-accent-3: var(--color-dove-gray-700); + + img { + filter: brightness(0.9); + } +} diff --git a/src/assets/css/global/blocks/button.css b/src/assets/css/global/blocks/button.css new file mode 100644 index 0000000..9a06bce --- /dev/null +++ b/src/assets/css/global/blocks/button.css @@ -0,0 +1,97 @@ +.button { + --button-bg: var(--color-text); + --button-color: color-mix(in oklab, var(--button-bg) 10%, var(--color-bg)); + --button-hover-bg: color-mix(in oklab, var(--button-bg) 90%, var(--color-bg)); + --button-hover-color: color-mix(in oklab, var(--button-bg) 5%, var(--color-bg)); + --button-border-width: var(--border-thickness); + --button-border-style: solid; + --button-border-color: color-mix(in oklab, var(--button-bg) 80%, var(--color-text)); + --button-radius: var(--border-radius-small); + --button-font-weight: var(--font-bold); + --button-gap: var(--space-2xs); + --button-padding: var(--space-3xs) var(--space-xs); + --button-font-size: var(--size-step-0); + --button-text-transform: none; + + display: inline-flex; + align-items: center; + gap: var(--button-gap); + padding: var(--button-padding); + background: var(--button-bg); + color: var(--button-color); + border-width: var(--button-border-width); + border-style: var(--button-border-style); + border-color: var(--button-border-color); + border-radius: var(--button-radius); + text-decoration: none; + font-weight: var(--button-font-weight); + font-size: var(--button-font-size); + line-height: var(--leading-flat); + text-transform: var(--button-text-transform); + /* trim the space at the cap height - in Safari Technology Preview */ + text-box-trim: trim-both; + text-box-edge: cap alphabetic; +} + +.button svg { + block-size: var(--button-icon-size, 1.2cap); + flex: none; +} + +/* Hover/focus/active */ +.button:hover, +.button[aria-current='page'], +.button[aria-pressed='true'], +.button[data-state='active'] { + background: var(--button-hover-bg); + color: var(--button-color); +} + +.button:focus { + outline-color: var(--button-outline-color, var(--button-border-color)); +} + +.button:active { + transform: scale(99%); +} + +/* Variants */ +.button[data-button-variant='blue'] { + --button-bg: var(--color-blue); + --button-color: var(--color-royal-blue-50); +} + +.button[data-button-variant='pink'] { + --button-bg: var(--color-pink); + --button-color: var(--color-medium-red-violet-50); +} + +.button[data-button-variant='gold'] { + --button-bg: var(--color-gold); + --button-color: var(--color-dark); +} + +.button[data-ghost-button] { + --button-bg: var(--color-bg); + --button-border-color: var(--color-text); + --button-color: var(--color-text); + --button-hover-color: var(--color-bg); +} + +.button[data-ghost-button]:hover { + --_ghost-hover-bg: var(--button-bg); + --_ghost-hover-bg: color-mix(in oklab, var(--button-bg) 95%, var(--color-dark)); + background: var(--_ghost-hover-bg); +} + +.button[data-small-button] { + --button-border-width: 2px; + --button-radius: var(--border-radius-small); + --button-font-size: var(--size-step-min-2); + --button-padding: var(--space-3xs) var(--space-xs); + --button-text-transform: uppercase; +} +/* Radius variants */ +.button[data-button-radius='hard'] { + --button-radius: 0; +} diff --git a/src/assets/css/global/blocks/code.css b/src/assets/css/global/blocks/code.css new file mode 100644 index 0000000..33bb4d2 --- /dev/null +++ b/src/assets/css/global/blocks/code.css @@ -0,0 +1,230 @@ +:root { + --color-code-orange: hsl(30, 70%, 60%); + --color-code-blue: var(--color-pink); + --color-code-indigo: hsl(260, 48%, 56%); + --color-code-violet: hsl(314, 70%, 60%); + --color-code-pink: hsl(350, 70%, 60%); + --color-code-gray: hsl(0, 0%, 58%); + --color-code-bg: color-mix(in oklab, var(--color-bg) 92%, black); +} + +code, +pre { + font-family: var(--font-mono); + font-size: var(--size-step-min-1); + background-color: var(--color-code-bg); + + border-radius: var(--border-radius-small); +} + +code[class*='language-'], +pre[class*='language-'] { + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + hyphens: none; +} + +/* Specific Styles for
 Elements */
+pre {
+  grid-column: popout !important;
+  overflow-x: auto;
+  padding: var(--space-m-l);
+}
+
+/* Style Adjustments for  within different contexts */
+:where(:not(pre)) > code {
+  position: relative;
+  top: -0.05em;
+  padding: 0.1em 0.4em;
+}
+
+pre[class*='language-'] {
+  overflow: auto;
+  position: relative;
+}
+
+[class*='language-'] .namespace {
+  opacity: 0.7;
+}
+
+.token.atrule {
+  color: var(--color-code-pink);
+}
+
+.token.attr-name {
+  color: var(--color-code-orange);
+}
+
+.token.attr-value {
+  color: var(--color-text-accent);
+}
+
+.token.attribute {
+  color: var(--color-code-blue);
+}
+
+.token.boolean {
+  color: var(--color-code-pink);
+}
+
+.token.builtin {
+  color: var(--color-code-orange);
+}
+
+.token.cdata {
+  color: var(--color-code-orange);
+}
+
+.token.char {
+  color: var(--color-code-orange);
+}
+
+.token.class {
+  color: var(--color-code-orange);
+}
+
+.token.class-name {
+  color: var(--color-code-orange);
+}
+
+.token.color {
+  color: var(--color-code-orange);
+}
+
+.token.comment {
+  color: var(--color-code-gray);
+}
+
+.token.constant {
+  color: var(--color-code-pink);
+}
+
+.token.deleted {
+  color: var(--color-code-pink);
+}
+
+.token.doctype {
+  color: var(--color-code-orange);
+}
+
+.token.entity {
+  color: var(--color-code-pink);
+}
+
+.token.function {
+  color: var(--color-code-pink);
+}
+
+.token.hexcode {
+  color: var(--color-code-orange);
+}
+
+.token.id {
+  color: var(--color-code-pink);
+  font-weight: var(--font-bold);
+}
+
+.token.important {
+  color: var(--color-code-pink);
+  font-weight: var(--font-bold);
+}
+
+.token.inserted {
+  color: var(--color-code-orange);
+}
+
+.token.keyword {
+  color: var(--color-code-pink);
+  font-style: italic;
+}
+
+.token.number {
+  color: var(--color-text-accent);
+}
+
+.token.operator {
+  color: var(--color-code-gray);
+}
+
+.token.prolog {
+  color: var(--color-code-orange);
+}
+
+.token.property {
+  color: var(--color-code-orange);
+}
+
+.token.pseudo-class {
+  color: var(--color-code-blue);
+}
+
+.token.pseudo-element {
+  color: var(--color-code-blue);
+}
+
+.token.punctuation {
+  color: var(--color-code-gray);
+}
+
+.token.regex {
+  color: var(--color-code-orange);
+}
+
+.token.selector {
+  color: var(--color-code-pink);
+}
+
+.token.string {
+  color: var(--color-text-accent);
+}
+
+.token.symbol {
+  color: var(--color-code-pink);
+}
+
+.token.tag {
+  color: var(--color-code-pink);
+}
+
+.token.unit {
+  color: var(--color-code-pink);
+}
+
+.token.url {
+  color: var(--color-code-violet);
+}
+
+.token.variable {
+  color: var(--color-code-pink);
+}
+
+/* CodePen iframe */
+.codepen a {
+  --icon-size: 1.2em;
+
+  display: flex;
+  align-items: center;
+  gap: var(--space-2xs);
+}
+
+.prose .cp_embed_wrapper,
+.prose .cp_embed_wrapper + script + *:not(h2) {
+  --flow-space: var(--space-l);
+}
+
+.cp_embed_wrapper {
+  grid-column: popout;
+  position: relative;
+  overflow: auto;
+  display: grid;
+  place-items: center;
+  grid-template-areas: 'container';
+  resize: horizontal;
+}
+
+.cp_embed_wrapper iframe {
+  grid-area: container;
+  width: 100%;
+}
diff --git a/src/assets/css/global/blocks/external-link.css b/src/assets/css/global/blocks/external-link.css
new file mode 100644
index 0000000..89cf8ca
--- /dev/null
+++ b/src/assets/css/global/blocks/external-link.css
@@ -0,0 +1,23 @@
+article
+  a[href^='http']:not([href*='localhost:8080']):not([href*='eleventy-excellent.netlify.app']):not(.button) {
+  padding-inline-end: 0.8em;
+}
+
+article
+  a[href^='http']:not([href*='localhost:8080']):not([href*='eleventy-excellent.netlify.app']):not(
+    .no-indicator
+  )::after {
+  position: absolute;
+  display: inline-block;
+  inline-size: 1em;
+  block-size: 1em;
+  background-image: url('/assets/images/template/external.svg');
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: 60% auto;
+  /* alternative text rules */
+  content: '(external link)';
+  overflow: hidden;
+  white-space: nowrap;
+  text-indent: 1em; /* the width of the icon */
+}
diff --git a/src/assets/css/global/blocks/main-nav.css b/src/assets/css/global/blocks/main-nav.css
new file mode 100644
index 0000000..da5fcac
--- /dev/null
+++ b/src/assets/css/global/blocks/main-nav.css
@@ -0,0 +1,197 @@
+.mainnav {
+  --nav-list-timing-function: cubic-bezier(0.68, -0.55, 0.27, 1.55);
+  position: var(--nav-position, absolute);
+  inset-inline-end: 0;
+  /* position depending on search button */
+  order: 1;
+}
+
+.mainnav:has([aria-expanded='true']) {
+  --nav-position: fixed;
+  inset-inline-end: var(--gap);
+}
+
+.mainnav ul {
+  /* configuration */
+  --gutter: var(--space-3xs);
+  --cluster-vertical-alignment: center;
+  --nav-list-background: var(--color-bg-accent);
+  --nav-list-shadow: -5px 0 11px 0 hsl(0 0% 0% / 0.2);
+  --nav-list-layout: column;
+  --nav-list-height: 100dvh;
+  --nav-list-padding: var(--space-2xl) var(--space-s);
+  --nav-list-position: fixed;
+  --nav-list-width: min(18rem, 100vw);
+  --nav-list-visibility: hidden;
+
+  background: var(--nav-list-background);
+  box-shadow: var(--nav-list-shadow);
+  display: flex;
+  flex-direction: var(--nav-list-layout);
+  flex-wrap: wrap;
+  block-size: var(--nav-list-height);
+  list-style: none;
+  margin: 0;
+  padding: var(--nav-list-padding);
+  position: var(--nav-list-position);
+  inset-block-start: 0;
+  inset-inline-end: 0;
+  inline-size: var(--nav-list-width);
+  opacity: 0;
+  transition:
+    opacity 0.3 var(--nav-list-timing-function),
+    visibility 0.3s ease-in-out;
+  visibility: var(--nav-list-visibility);
+}
+
+.mainnav ul[no-flash] {
+  transition: none;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+  .mainnav ul {
+    --nav-list-transform: translateX(100%);
+    opacity: 1;
+    transform: var(--nav-list-transform);
+    transition:
+      transform 0.5s var(--nav-list-timing-function),
+      visibility 0.3s linear;
+  }
+
+  .mainnav svg {
+    transition: transform 0.4s var(--nav-list-timing-function);
+  }
+}
+
+.mainnav [aria-expanded='true'] + ul {
+  --nav-list-visibility: visible;
+  --nav-list-transform: translateX(0);
+  opacity: 1;
+}
+
+.mainnav button {
+  --gutter: var(--space-2xs);
+  --cluster-vertical-alignment: center;
+  display: var(--nav-button-display, flex);
+  position: relative;
+  z-index: 2;
+  padding: var(--space-2xs) 0;
+  line-height: var(--leading-flat);
+}
+
+.mainnav span {
+  font-weight: var(--font-bold);
+  text-transform: uppercase;
+  font-family: var(--font-display);
+  font-size: var(--size-step-min-1);
+}
+
+.mainnav svg {
+  block-size: 0.9em;
+  color: var(--color-text);
+  stroke-width: 3;
+}
+
+.mainnav [aria-expanded='true'] svg {
+  transform: rotate(45deg);
+}
+
+.mainnav a {
+  /* configuration */
+  --nav-item-background: transparent;
+  --nav-item-text-color: var(--color-text);
+  --nav-item-padding: var(--space-2xs) var(--space-2xs);
+  --nav-item-decoration-color: transparent;
+
+  background: var(--nav-item-background);
+  color: var(--nav-item-text-color);
+  padding: var(--nav-item-padding);
+  display: block;
+  border-radius: var(--border-radius-small);
+  text-decoration-line: underline;
+  text-decoration-color: var(--nav-item-decoration-color);
+  text-decoration-thickness: 3px;
+  text-underline-offset: 0.2em;
+  font-weight: var(--font-medium);
+}
+
+.mainnav a:is(:hover, :focus) {
+  --nav-item-background: transparent;
+  --nav-item-text-color: var(--color-text);
+  --nav-item-decoration-color: var(--color-text);
+}
+
+.mainnav [aria-current='page'],
+.mainnav [data-state='active'] {
+  --nav-item-background: var(--color-text);
+  --nav-item-text-color: var(--color-light);
+  --nav-item-decoration-color: transparent;
+}
+
+.mainnav > ul:first-of-type > li:last-child a {
+  --nav-item-background: var(--color-blue);
+  --nav-item-padding: var(--space-4xs) var(--space-xs);
+  --nav-item-text-color: var(--color-light);
+}
+
+.mainnav > ul:first-of-type > li:last-child a:is(:hover, :focus),
+.mainnav > ul:first-of-type > li:last-child [aria-current='page'] {
+  --nav-item-background: var(--color-text);
+  --nav-item-decoration-color: transparent;
+  --nav-item-text-color: var(--color-bg);
+}
+
+/* Search Toggle Visibility */
+@media screen(navigation) {
+  .mainnav {
+    /* position depending on search button */
+    order: 0;
+    margin-inline-end: var(--space-xl);
+    --nav-position: static;
+    --nav-button-display: none;
+  }
+
+  .mainnav ul {
+    --nav-list-layout: row;
+    --nav-list-position: static;
+    --nav-list-padding: 0;
+    --nav-list-height: auto;
+    --nav-list-width: 100%;
+    --nav-list-shadow: none;
+    --nav-list-visibility: visible;
+    --nav-list-transform: translateX(0);
+  }
+
+  .mainnav [aria-current='page'],
+  .mainnav [data-state='active'] {
+    --nav-item-background: transparent;
+    --nav-item-text-color: var(--color-text);
+    --nav-item-decoration-color: var(--color-text);
+  }
+}
+
+/* Repeat the settings to provide a different styling when JavaScript is disabled or drawerNav is set to false. The selector
+assumes that the button doesn’t exist without JS, making the list the first child within the navigation. */
+
+.mainnav ul:first-child {
+  --nav-list-layout: row;
+  --nav-list-position: static;
+  --nav-list-padding: 0;
+  --nav-list-height: auto;
+  --nav-list-width: 100%;
+  --nav-list-shadow: none;
+  --nav-list-visibility: visible;
+  --nav-list-transform: translateX(0);
+}
+
+.mainnav ul:first-child [aria-current='page'],
+.mainnav ul:first-child [data-state='active'] {
+  --nav-item-background: transparent;
+  --nav-item-text-color: var(--color-text);
+  --nav-item-decoration-color: var(--color-text);
+}
+
+/* make menu wrap without drawer */
+.mainnav:has(ul:first-child) {
+  --nav-position: relative;
+}
diff --git a/src/assets/css/global/blocks/pagefind.css b/src/assets/css/global/blocks/pagefind.css
new file mode 100644
index 0000000..1a35d34
--- /dev/null
+++ b/src/assets/css/global/blocks/pagefind.css
@@ -0,0 +1,137 @@
+/* Search Toggle Visibility */
+@media screen(navigation) {
+  .search-toggle {
+    position: absolute;
+    right: 0;
+  }
+}
+
+@media screen(ltnav) {
+  .search-toggle {
+    display: flex;
+    justify-content: flex-start;
+    order: 0;
+  }
+}
+
+.search-toggle {
+  background: none;
+  border: none;
+  padding: var(--space-2xs);
+  cursor: pointer;
+}
+
+.search-toggle svg {
+  block-size: auto;
+}
+
+pagefind-search {
+  position: absolute;
+  inset-inline-end: 0;
+  top: 120%;
+  inline-size: min(100%, 25rem);
+}
+
+.pagefind-ui form {
+  display: flex;
+  position: relative;
+  block-size: var(--space-m);
+}
+
+.pagefind-ui form:before {
+  position: absolute;
+  inline-size: 1ch;
+  block-size: 1ch;
+  background-color: var(--color-text);
+  inset-block-start: 0.8ch;
+  inset-inline-start: 1ch;
+  content: '';
+  mask-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0ic2VhcmNoIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZT0iY3VycmVudENvbG9yIj4KICA8cGF0aCBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Im0yMSAyMS01LjE5Ny01LjE5N20wIDBBNy41IDcuNSAwIDEgMCA1LjE5NiA1LjE5NmE3LjUgNy41IDAgMCAwIDEwLjYwNyAxMC42MDdaIiAvPgo8L3N2Zz4K);
+}
+
+.pagefind-ui input {
+  padding-inline-start: 2.25rem;
+  padding-inline-end: 1rem;
+  inline-size: 100%;
+  border-radius: var(--border-radius-small);
+  border: 2px solid var(--color-bg-accent-2);
+  background-color: var(--color-bg-accent);
+  font-size: var(--size-step-min-1);
+  color: var(--color-text);
+}
+
+.pagefind-ui .pagefind-ui__results-area {
+  position: absolute;
+  inset-inline-start: 0;
+  inline-size: 100%;
+  margin-block-start: var(--space-l);
+  inset-inline-start: auto;
+  inset-inline-end: 0;
+  border-radius: var(--border-radius-small);
+  overflow: hidden;
+  border: 2px solid var(--color-bg-accent-2);
+  background-color: var(--color-bg-accent);
+}
+
+.pagefind-ui ol {
+  display: flex;
+  flex-direction: column;
+  max-block-size: 50vh;
+  overflow-y: auto;
+  gap: var(--space-2xs);
+  padding: var(--space-xs);
+}
+
+.pagefind-ui li {
+  list-style: none;
+  border-radius: var(--border-radius-small);
+  padding: var(--space-xs);
+  border: 1px solid var(--color-bg-accent-2);
+}
+
+.pagefind-ui li:hover,
+.pagefind-ui li:focus-within {
+  background-color: var(--color-bg-accent-2);
+  border: 1px solid var(--color-bg);
+}
+
+.pagefind-ui li:focus-within a:focus {
+  outline: none;
+}
+
+.pagefind-ui li {
+  position: relative;
+}
+
+.pagefind-ui li a:after {
+  position: absolute;
+  inset: 0;
+  content: '';
+}
+
+.pagefind-ui .pagefind-ui__result-title {
+  font-weight: var(--font-medium);
+  margin-block-end: var(--space-xs);
+}
+
+.pagefind-ui .pagefind-ui__result-excerpt {
+  font-size: var(--size-step-min-1);
+}
+
+.pagefind-ui .pagefind-ui__button,
+.pagefind-ui .pagefind-ui__search-clear,
+.pagefind-ui .pagefind-ui__message,
+.pagefind-ui .pagefind-ui__hidden {
+  display: none;
+}
+
+.pagefind-ui .pagefind-ui__message:has(+ ol:empty) {
+  display: block;
+  text-align: center;
+  color: var(--color-text);
+  padding: var(--space-xs);
+}
+
+.pagefind-ui .pagefind-ui__message + ol:empty {
+  display: none;
+}
diff --git a/src/assets/css/global/blocks/prose.css b/src/assets/css/global/blocks/prose.css
new file mode 100644
index 0000000..ee657d6
--- /dev/null
+++ b/src/assets/css/global/blocks/prose.css
@@ -0,0 +1,73 @@
+/* Based on Andy Bell, https://github.com/Andy-set-studio/personal-site-eleventy */
+
+.prose {
+  --flow-space: var(--space-s-m);
+}
+
+.prose :where(pre, pre + *, figure, figure + *) {
+  --flow-space: var(--space-m-l);
+}
+
+.prose figcaption {
+  font-size: var(--size-step-min-1);
+  text-align: center;
+  padding-block-end: var(--space-xs);
+  margin-block-end: var(--space-s);
+  border-bottom: 1px solid var(--color-bg-accent);
+}
+
+:where(.prose :is(h2, h3, h4)) {
+  --flow-space: var(--space-xl);
+}
+
+:where(.prose :is(h2 + *, h3 + *, h4 + *):not(figure)) {
+  --flow-space: var(--space-m);
+}
+
+.prose .heading-anchor:is(:hover, :focus) {
+  text-decoration: none;
+}
+
+.heading-anchor {
+  text-decoration: none;
+}
+
+.prose mark {
+  background-color: var(--color-gold);
+  color: var(--color-base-dark);
+}
+
+/* block space only for "regular lists" */
+.prose :not(.cluster):not(.grid) > li + li {
+  padding-block-start: var(--space-s-m);
+}
+
+/* inline space only for "regular lists" */
+.prose :where(ul:not(.grid), ol:not(.grid)) {
+  padding-inline-start: 1.2ch;
+}
+
+/* marker only for "regular lists" */
+.prose :where(ul:not(.grid):not([role='list'])) li::marker {
+  color: var(--color-blue);
+  content: '– ';
+}
+
+.prose ol li::marker {
+  color: var(--color-blue);
+}
+
+.prose img {
+  border-radius: var(--border-radius-small);
+}
+
+@media screen(ltnav) {
+  .prose > *,
+  .prose a {
+    overflow-wrap: break-word;
+    word-wrap: break-word;
+    word-break: break-word;
+    /* Adds a hyphen where the word breaks, if supported (No Blink) */
+    hyphens: auto;
+  }
+}
diff --git a/src/assets/css/global/blocks/section.css b/src/assets/css/global/blocks/section.css
new file mode 100644
index 0000000..50e53db
--- /dev/null
+++ b/src/assets/css/global/blocks/section.css
@@ -0,0 +1,19 @@
+.section > .seperator:first-child {
+  transform: rotate(180deg) translateY(-1px);
+}
+
+.section__inner {
+  background-color: var(--spot-color, var(--color-bg-accent));
+  color: var(--color-text);
+}
+
+.section blockquote {
+  font-weight: var(--font-bold);
+  line-height: 1;
+  font-size: var(--size-step-4);
+  letter-spacing: var(--tracking-s);
+}
+
+.section :is(h1, h2, h3, blockquote) {
+  opacity: 95%;
+}
diff --git a/src/assets/css/global/blocks/seperator.css b/src/assets/css/global/blocks/seperator.css
new file mode 100644
index 0000000..ea9c3f8
--- /dev/null
+++ b/src/assets/css/global/blocks/seperator.css
@@ -0,0 +1,10 @@
+.seperator {
+  display: block;
+  block-size: 3.5em;
+  inline-size: 100%;
+  fill: var(--spot-color, var(--color-bg));
+}
+
+.section > .seperator {
+  transform: translateY(-1px);
+}
diff --git a/src/assets/css/global/blocks/site-footer.css b/src/assets/css/global/blocks/site-footer.css
new file mode 100644
index 0000000..4f5ec4b
--- /dev/null
+++ b/src/assets/css/global/blocks/site-footer.css
@@ -0,0 +1,45 @@
+.site-footer {
+  padding: var(--space-s-m);
+  color: var(--color-text);
+}
+
+.site-footer .footer__meta {
+  --gutter: var(--space-xs);
+  --cluster-horizontal-alignment: center;
+}
+
+/* increase tab size */
+.site-footer .footer__meta a {
+  padding: var(--space-3xs);
+}
+
+.site-footer svg {
+  stroke-width: 2;
+  inline-size: 1.1em;
+  block-size: 1em;
+}
+
+.site-footer .creator {
+  font-size: var(--size-step-min-1);
+  margin-block-start: var(--space-xl);
+  display: grid;
+  place-items: center;
+}
+
+.site-footer .creator a {
+  --gutter: var(--space-xs);
+  --cluster-horizontal-alignment: center;
+  text-decoration: none;
+}
+
+.site-footer .creator a:hover {
+  color: transparent;
+  background-image: var(--gradient-rainbow);
+  background-size: 100%;
+  background-repeat: repeat;
+  background-clip: text;
+}
+
+.site-footer .creator:hover svg {
+  color: var(--color-text);
+}
diff --git a/src/assets/css/global/blocks/site-header.css b/src/assets/css/global/blocks/site-header.css
new file mode 100644
index 0000000..b85770d
--- /dev/null
+++ b/src/assets/css/global/blocks/site-header.css
@@ -0,0 +1,4 @@
+.site-header {
+  background: var(--color-bg-accent);
+  z-index: 2;
+}
diff --git a/src/assets/css/global/blocks/site-logo.css b/src/assets/css/global/blocks/site-logo.css
new file mode 100644
index 0000000..97a3367
--- /dev/null
+++ b/src/assets/css/global/blocks/site-logo.css
@@ -0,0 +1,11 @@
+.logo {
+  --gutter: var(--space-xs);
+  padding: var(--space-2xs) 0;
+  font-size: var(--size-step-0);
+  text-decoration: none;
+  font-weight: var(--font-medium);
+}
+.logo svg {
+  color: var(--color-royal-blue-500);
+  block-size: auto;
+}
diff --git a/src/assets/css/global/blocks/skip-link.css b/src/assets/css/global/blocks/skip-link.css
new file mode 100644
index 0000000..0bfb428
--- /dev/null
+++ b/src/assets/css/global/blocks/skip-link.css
@@ -0,0 +1,35 @@
+.skip-link {
+  clip: rect(1px, 1px, 1px, 1px);
+  display: block;
+  block-size: 1px;
+  overflow: hidden;
+  position: absolute;
+  inline-size: 1px;
+  top: 1rem;
+  left: 1rem;
+  z-index: 999;
+}
+
+.skip-link:focus {
+  clip: auto;
+  block-size: auto;
+  overflow: visible;
+  inline-size: auto;
+  background-color: var(--color-text);
+  color: var(--color-bg);
+  padding: var(--space-xs) var(--space-s-m);
+  border-radius: var(--border-radius-small);
+  line-height: 1;
+}
+
+.skip-link:not(:focus) {
+  border: 0;
+  clip: rect(0 0 0 0);
+  block-size: auto;
+  margin: 0;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  inline-size: 1px;
+  white-space: nowrap;
+}
diff --git a/src/assets/css/global/blocks/tag.css b/src/assets/css/global/blocks/tag.css
new file mode 100644
index 0000000..e13ced0
--- /dev/null
+++ b/src/assets/css/global/blocks/tag.css
@@ -0,0 +1,31 @@
+/* always in combination with .button */
+
+.taglist {
+  --gutter: var(--space-s-m);
+}
+
+.post-tag {
+  --button-bg: var(--color-text);
+  --button-text: var(--color-bg);
+  --button-border: var(--color-text);
+  font-size: var(--size-step-min-2);
+  text-transform: uppercase;
+  padding: 0.1rem 0.625rem;
+  font-weight: var(--font-bold);
+}
+
+.card .post-tag {
+  --button-bg: var(--color-bg-accent-2);
+  --button-text: var(--color-text);
+  --button-border: var(--color-bg-accent-2);
+}
+
+/* layout */
+
+.tags h1 {
+  font-size: var(--size-step-4);
+}
+
+.tags h2 {
+  font-size: var(--size-step-2);
+}
diff --git a/src/assets/css/global/blocks/textgradient.css b/src/assets/css/global/blocks/textgradient.css
new file mode 100644
index 0000000..b28d6b3
--- /dev/null
+++ b/src/assets/css/global/blocks/textgradient.css
@@ -0,0 +1,15 @@
+.gradient-text {
+  color: transparent;
+  background-image: var(--gradient-conic);
+  padding: 0.6rem 0;
+  background-size: 50%;
+  background-clip: text;
+}
+
+.gradient-text-linear {
+  color: transparent;
+  background-image: var(--gradient-rainbow);
+  background-size: 100%;
+  background-repeat: repeat;
+  background-clip: text;
+}
diff --git a/src/assets/css/global/blocks/theme-switch.css b/src/assets/css/global/blocks/theme-switch.css
new file mode 100644
index 0000000..3073229
--- /dev/null
+++ b/src/assets/css/global/blocks/theme-switch.css
@@ -0,0 +1,31 @@
+.theme-switch h2 {
+  font-size: var(--size-step-min-1);
+  font-family: var(--font-base);
+}
+
+.theme-switch .button {
+  --button-border-color: var(--color-text);
+  --button-border-width: 2px;
+  --button-color: var(--color-light);
+  --button-bg: var(--color-dark);
+  font-family: var(--font-display);
+  border-radius: var(--border-radius-small);
+  font-size: var(--size-step-min-2);
+  padding: 0.1rem 0.625rem;
+  font-weight: var(--font-semi-bold);
+  min-block-size: 1.5em;
+  text-transform: uppercase;
+}
+
+.theme-switch .button[aria-pressed='true'] {
+  --_color-primary-contrast: var(--color-royal-blue-600);
+  --button-bg: var(--_color-primary-contrast);
+  --button-color: var(--color-light);
+  --button-border-color: var(--_color-primary-contrast);
+  outline-color: var(--_color-primary-contrast);
+}
+
+/* Hide without JS */
+is-land:not(:defined) .theme-switch {
+  display: none;
+}
diff --git a/src/assets/css/global/compositions/cluster.css b/src/assets/css/global/compositions/cluster.css
new file mode 100644
index 0000000..0d3df5d
--- /dev/null
+++ b/src/assets/css/global/compositions/cluster.css
@@ -0,0 +1,24 @@
+/*
+CLUSTER
+More info: https://every-layout.dev/layouts/cluster/
+A layout that lets you distribute items with consitent
+spacing, regardless of their size
+
+CUSTOM PROPERTIES AND CONFIGURATION
+--gutter (var(--space-s-m)): This defines the space
+between each item.
+
+--cluster-horizontal-alignment (flex-start) How items should align
+horizontally. Can be any acceptable flexbox aligmnent value.
+
+--cluster-vertical-alignment How items should align vertically.
+Can be any acceptable flexbox alignment value.
+*/
+
+:where(.cluster) {
+  display: flex;
+  flex-wrap: wrap;
+  gap: var(--gutter, var(--space-s-l));
+  justify-content: var(--cluster-horizontal-alignment, flex-start);
+  align-items: var(--cluster-vertical-alignment, center);
+}
diff --git a/src/assets/css/global/compositions/flow.css b/src/assets/css/global/compositions/flow.css
new file mode 100644
index 0000000..7259304
--- /dev/null
+++ b/src/assets/css/global/compositions/flow.css
@@ -0,0 +1,8 @@
+/*
+FLOW UTILITY
+Like the Every Layout stack: https://every-layout.dev/layouts/stack/
+Info about this implementation: https://piccalil.li/quick-tip/flow-utility/
+*/
+:where(.flow) > * + * {
+  margin-block-start: var(--flow-space, 1em);
+}
diff --git a/src/assets/css/global/compositions/grid.css b/src/assets/css/global/compositions/grid.css
new file mode 100644
index 0000000..0398bf2
--- /dev/null
+++ b/src/assets/css/global/compositions/grid.css
@@ -0,0 +1,39 @@
+/* AUTO GRID
+Related Every Layout: https://every-layout.dev/layouts/grid/
+More info on the flexible nature: https://piccalil.li/tutorial/create-a-responsive-grid-layout-with-no-media-queries-using-css-grid/
+A flexible layout that will create an auto-fill grid with
+configurable grid item sizes
+
+CUSTOM PROPERTIES AND CONFIGURATION
+--gutter (var(--space-s-m)): This defines the space
+between each item.
+
+--grid-min-item-size (14rem): How large each item should be
+ideally, as a minimum.
+
+--grid-placement (auto-fill): Set either auto-fit or auto-fill
+to change how empty grid tracks are handled */
+
+:where(.grid) {
+  display: grid;
+  grid-template-columns: repeat(
+    var(--grid-placement, auto-fill),
+    minmax(var(--grid-min-item-size, 16rem), 1fr)
+  );
+  gap: var(--gutter, var(--space-s-m));
+}
+
+:where(.grid)[data-rows='masonry'] {
+  grid-template-rows: masonry;
+  align-items: start;
+}
+
+:where(.grid)[data-layout='50-50'] {
+  --grid-placement: auto-fit;
+  --grid-min-item-size: clamp(16rem, 50vw, 25rem);
+}
+
+:where(.grid)[data-layout='thirds'] {
+  --grid-placement: auto-fit;
+  --grid-min-item-size: clamp(16rem, 33%, 25rem);
+}
diff --git a/src/assets/css/global/compositions/repel.css b/src/assets/css/global/compositions/repel.css
new file mode 100644
index 0000000..4b7fbfc
--- /dev/null
+++ b/src/assets/css/global/compositions/repel.css
@@ -0,0 +1,24 @@
+/*
+REPEL
+A little layout that pushes items away from each other where
+there is space in the viewport and stacks on small viewports
+
+CUSTOM PROPERTIES AND CONFIGURATION
+--gutter (var(--space-s-m)): This defines the space
+between each item.
+
+--repel-vertical-alignment How items should align vertically.
+Can be any acceptable flexbox alignment value.
+*/
+
+:where(.repel) {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+  align-items: var(--repel-vertical-alignment, center);
+  gap: var(--gutter, var(--space-s-l));
+}
+
+:where(.repel)[data-nowrap] {
+  flex-wrap: nowrap;
+}
diff --git a/src/assets/css/global/compositions/sidebar.css b/src/assets/css/global/compositions/sidebar.css
new file mode 100644
index 0000000..2e953f4
--- /dev/null
+++ b/src/assets/css/global/compositions/sidebar.css
@@ -0,0 +1,51 @@
+/*
+SIDEBAR
+More info: https://every-layout.dev/layouts/sidebar/
+A layout that allows you to have a flexible main content area
+and a "fixed" width sidebar that sits on the left or right.
+If there is not enough viewport space to fit both the sidebar
+width *and* the main content minimum width, they will stack
+on top of each other
+
+CUSTOM PROPERTIES AND CONFIGURATION
+--gutter (var(--space-size-1)): This defines the space
+between the sidebar and main content.
+
+--sidebar-target-width (20rem): How large the sidebar should be
+
+--sidebar-content-min-width(50%): The minimum size of the main content area
+
+EXCEPTIONS
+.sidebar[data-direction='rtl']: flips the sidebar to be on the right
+*/
+
+:where(.sidebar) {
+  display: flex;
+  flex-wrap: wrap;
+  gap: var(--gutter, var(--space-s-l));
+}
+
+:where(.sidebar):not([data-direction]) > :first-child {
+  flex-basis: var(--sidebar-target-width, 20rem);
+  flex-grow: 1;
+}
+
+:where(.sidebar):not([data-direction]) > :last-child {
+  flex-basis: 0;
+  flex-grow: 999;
+  min-inline-size: var(--sidebar-content-min-width, 50%);
+}
+
+/*
+A flipped version where the sidebar is on the right
+*/
+:where(.sidebar)[data-direction='rtl'] > :last-child {
+  flex-basis: var(--sidebar-target-width, 20rem);
+  flex-grow: 1;
+}
+
+:where(.sidebar)[data-direction='rtl'] > :first-child {
+  flex-basis: 0;
+  flex-grow: 999;
+  min-inline-size: var(--sidebar-content-min-width, 50%);
+}
diff --git a/src/assets/css/global/compositions/wrapper.css b/src/assets/css/global/compositions/wrapper.css
new file mode 100644
index 0000000..a8c3af1
--- /dev/null
+++ b/src/assets/css/global/compositions/wrapper.css
@@ -0,0 +1,36 @@
+/* © Ryan Mulligan - https://ryanmulligan.dev/blog/layout-breakouts/ */
+
+.wrapper {
+  --wrapper-width: 53rem;
+  --gap: clamp(1rem, 6vw, 3rem);
+  --full: minmax(var(--gap), 1fr);
+  --content: min(var(--wrapper-width, 85rem), 100% - var(--gap) * 2);
+  --popout: minmax(0, 2rem);
+  --feature: minmax(0, 5rem);
+
+  display: grid;
+  grid-template-columns:
+    [full-start] var(--full)
+    [feature-start] var(--feature)
+    [popout-start] var(--popout)
+    [content-start] var(--content) [content-end]
+    var(--popout) [popout-end]
+    var(--feature) [feature-end]
+    var(--full) [full-end];
+}
+
+.wrapper > * {
+  grid-column: content;
+}
+
+.popout {
+  grid-column: popout;
+}
+
+.feature {
+  grid-column: feature;
+}
+
+.full {
+  grid-column: full;
+}
diff --git a/src/assets/css/global/global.css b/src/assets/css/global/global.css
new file mode 100644
index 0000000..09ba94f
--- /dev/null
+++ b/src/assets/css/global/global.css
@@ -0,0 +1,18 @@
+@import 'tailwindcss/base';
+
+@import 'base/reset.css';
+@import 'base/fonts.css';
+
+@import 'tailwindcss/components';
+
+@import 'base/variables.css';
+@import 'base/global-styles.css';
+
+@import-glob 'compositions/*.css';
+@import-glob 'blocks/*.css';
+@import-glob 'utilities/*.css';
+
+/* debugging */
+/* @import-glob 'tests/*.css'; */
+
+@import 'tailwindcss/utilities';
diff --git a/src/assets/css/global/tests/debug.css b/src/assets/css/global/tests/debug.css
new file mode 100644
index 0000000..5805413
--- /dev/null
+++ b/src/assets/css/global/tests/debug.css
@@ -0,0 +1,70 @@
+/* https://heydonworks.com/article/testing-html-with-modern-css/ */
+
+/* WIP */
+
+:root {
+  --highlight-outline: 0.25rem solid cornflowerblue;
+  --warning-outline: 0.25rem solid orange;
+  --error-outline: 0.25rem solid red;
+}
+
+/* outline all elements  */
+* * * * * {
+  outline: var(--highlight-outline);
+}
+
+/* highlight empty elements */
+*:empty:not(svg *) {
+  outline: var(--warning-outline);
+  --warning-empty-element: 'The element is empty';
+}
+
+a:not([href]) {
+  outline: var(--error-outline);
+  --error-not-href: 'The link does not have an href. Did you mean to use a