From 25a91409b210f8e8149f8b5bf55d6fd5f6f6aac5 Mon Sep 17 00:00:00 2001 From: Zijian Zhang <35801754+futrime@users.noreply.github.com> Date: Sat, 17 Oct 2026 22:48:00 +0800 Subject: [PATCH 1/2] docs: migrate to levimc-kit Replace MkDocs Material with levimc-kit (Vite + React 19 + react-router 7 + TypeScript + Tailwind CSS v4, statically prerendered), the shared "Impression, Craft" design system used by every LeviMC site. - vendor levimc-kit 1.0.0 into kit/ and add package.json, package-lock.json, docs.config.ts, vite.config.ts and tsconfig.json at the repository root - port nav, nav_translations (Home/Tutorials/APIs), suffix i18n (zh under /zh/), directory URLs, pymdownx heading ids, logo/favicon, edit links and last-updated dates 1:1 from mkdocs.yml; keep h2-h6 in the page outline - remove mkdocs.yml, requirements.txt and docs/overrides/ (the language redirect is handled by the kit) - build_docs workflow: Node 24, npm ci, typecheck, build, internal link check, upload-pages-artifact@v5, deploy-pages@v5 (deploy condition unchanged), fetch-depth 0 for last-updated dates - fix broken and redirecting links (link text unchanged) --- .github/workflows/build_docs.yml | 36 +- .gitignore | 4 + README.md | 2 +- README.zh.md | 2 +- docs.config.ts | 111 + docs/apis/DataAPI/DataBase.md | 6 +- docs/apis/GameAPI/Player.md | 26 +- docs/apis/GameAPI/Player.zh.md | 26 +- docs/apis/LanguageSupport.md | 2 +- docs/apis/LanguageSupport.zh.md | 2 +- docs/apis/NbtAPI/NBTValue.md | 2 +- docs/apis/NbtAPI/NBTValue.zh.md | 2 +- docs/apis/ScriptAPI/i18n.md | 4 +- docs/apis/ScriptAPI/i18n.zh.md | 4 +- docs/apis/SystemAPI/Network.zh.md | 2 +- docs/overrides/main.html | 89 - docs/tutorials/create_your_first_plugin.md | 2 +- docs/tutorials/create_your_first_plugin.zh.md | 2 +- kit/.vendored | 3 + kit/README.md | 603 +++ kit/VERSION | 1 + kit/assets/build-assets.mjs | 197 + kit/assets/icons/apps.svg | 1 + kit/assets/icons/arrow-left.svg | 1 + kit/assets/icons/arrow-right.svg | 1 + kit/assets/icons/arrow-up.svg | 1 + kit/assets/icons/book-quill.svg | 1 + kit/assets/icons/bug.svg | 1 + kit/assets/icons/check.svg | 1 + kit/assets/icons/chest.svg | 1 + kit/assets/icons/chevron-down.svg | 1 + kit/assets/icons/chevron-right.svg | 1 + kit/assets/icons/clock.svg | 1 + kit/assets/icons/close.svg | 1 + kit/assets/icons/compass.svg | 1 + kit/assets/icons/copy.svg | 1 + kit/assets/icons/diamond.svg | 1 + kit/assets/icons/edit.svg | 1 + kit/assets/icons/emerald.svg | 1 + kit/assets/icons/external.svg | 1 + kit/assets/icons/globe.svg | 1 + kit/assets/icons/grass.svg | 1 + kit/assets/icons/hash.svg | 1 + kit/assets/icons/heart.svg | 1 + kit/assets/icons/history.svg | 1 + kit/assets/icons/map.svg | 1 + kit/assets/icons/menu.svg | 1 + kit/assets/icons/monitor.svg | 1 + kit/assets/icons/moon.svg | 1 + kit/assets/icons/paper.svg | 1 + kit/assets/icons/pickaxe.svg | 1 + kit/assets/icons/potion.svg | 1 + kit/assets/icons/question.svg | 1 + kit/assets/icons/quote.svg | 1 + kit/assets/icons/search.svg | 1 + kit/assets/icons/sun.svg | 1 + kit/assets/icons/tnt.svg | 1 + kit/assets/icons/torch.svg | 1 + kit/assets/sprites.mjs | 836 ++++ kit/components/Badge.tsx | 20 + kit/components/Card.tsx | 50 + kit/components/GlobalBar.tsx | 113 + kit/components/Hotbar.tsx | 113 + kit/components/LocaleSwitcher.tsx | 71 + kit/components/PaintedBackdrop.tsx | 34 + kit/components/PaintedHero.tsx | 147 + kit/components/PixelButton.tsx | 50 + kit/components/PixelIcon.tsx | 69 + kit/components/SiteFooter.tsx | 111 + kit/components/ThemeToggle.tsx | 57 + kit/components/Tooltip.tsx | 30 + kit/components/fonts.ts | 13 + kit/components/i18n.ts | 595 +++ kit/components/index.ts | 33 + kit/components/menu.ts | 44 + kit/components/paint.ts | 391 ++ kit/components/pixel-icons.ts | 744 ++++ kit/components/projects.ts | 79 + kit/components/theme.ts | 162 + kit/docs/app/App.tsx | 184 + kit/docs/app/components/DocFooter.tsx | 63 + kit/docs/app/components/KitLink.tsx | 56 + kit/docs/app/components/MobileDrawer.tsx | 93 + kit/docs/app/components/SearchModal.tsx | 197 + kit/docs/app/components/Sidebar.tsx | 74 + kit/docs/app/components/SiteHeader.tsx | 121 + kit/docs/app/components/Toc.tsx | 62 + kit/docs/app/components/focus.ts | 40 + kit/docs/app/data.ts | 76 + kit/docs/app/docs.css | 955 ++++ kit/docs/app/enhance.ts | 117 + kit/docs/app/entry-client.tsx | 36 + kit/docs/app/entry-server.tsx | 46 + kit/docs/app/index.html | 20 + kit/docs/app/layout-api.ts | 14 + kit/docs/app/layouts/DocLayout.tsx | 57 + kit/docs/app/layouts/HomeLayout.tsx | 60 + kit/docs/app/layouts/NotFound.tsx | 29 + kit/docs/app/styles.css | 6 + kit/docs/app/virtual.d.ts | 10 + kit/docs/build.mjs | 19 + kit/docs/node/config.ts | 262 ++ kit/docs/node/content.ts | 182 + kit/docs/node/git.ts | 33 + kit/docs/node/links.ts | 163 + kit/docs/node/markdown/html-tags.ts | 19 + kit/docs/node/markdown/preprocess.ts | 519 +++ kit/docs/node/markdown/render.ts | 471 ++ kit/docs/node/markdown/shiki-themes.ts | 145 + kit/docs/node/markdown/shiki.ts | 288 ++ kit/docs/node/markdown/slug.ts | 70 + kit/docs/node/nav.ts | 227 + kit/docs/node/site.ts | 241 + kit/docs/node/vite.ts | 302 ++ kit/docs/prerender.mjs | 60 + kit/docs/shared/head.ts | 85 + kit/docs/shared/routing.ts | 45 + kit/docs/shared/search.ts | 50 + kit/docs/shared/types.ts | 140 + kit/package.template.json | 51 + kit/scripts/linkcheck.mjs | 263 ++ kit/scripts/mkdocs-nav.mjs | 47 + kit/scripts/serve-pages.mjs | 125 + kit/scripts/shot.mjs | 18 + kit/scripts/smoke.mjs | 270 ++ kit/scripts/text-parity.mjs | 269 ++ kit/scripts/url-parity.mjs | 121 + kit/scripts/vendor.mjs | 29 + kit/ssg/prerender.mjs | 95 + kit/static/build-static.mjs | 274 ++ kit/static/chrome-entry.css | 13 + kit/static/chrome-reset.css | 55 + kit/static/doxygen/doxygen-kit.css | 356 ++ kit/static/doxygen/footer.html | 20 + kit/static/doxygen/header.html | 78 + kit/static/footer.html | 2 + kit/static/globalbar.html | 2 + kit/static/grass.svg | 1 + kit/static/i18n/footer.de.html | 2 + kit/static/i18n/footer.en.html | 2 + kit/static/i18n/footer.es.html | 2 + kit/static/i18n/footer.fr.html | 2 + kit/static/i18n/footer.ja.html | 2 + kit/static/i18n/footer.ko.html | 2 + kit/static/i18n/footer.ru.html | 2 + kit/static/i18n/footer.zh-CN.html | 2 + kit/static/i18n/footer.zh-HK.html | 2 + kit/static/i18n/globalbar.de.html | 2 + kit/static/i18n/globalbar.en.html | 2 + kit/static/i18n/globalbar.es.html | 2 + kit/static/i18n/globalbar.fr.html | 2 + kit/static/i18n/globalbar.ja.html | 2 + kit/static/i18n/globalbar.ko.html | 2 + kit/static/i18n/globalbar.ru.html | 2 + kit/static/i18n/globalbar.zh-CN.html | 2 + kit/static/i18n/globalbar.zh-HK.html | 2 + kit/static/icons/apps.svg | 1 + kit/static/icons/arrow-left.svg | 1 + kit/static/icons/arrow-right.svg | 1 + kit/static/icons/arrow-up.svg | 1 + kit/static/icons/book-quill.svg | 1 + kit/static/icons/bug.svg | 1 + kit/static/icons/check.svg | 1 + kit/static/icons/chest.svg | 1 + kit/static/icons/chevron-down.svg | 1 + kit/static/icons/chevron-right.svg | 1 + kit/static/icons/clock.svg | 1 + kit/static/icons/close.svg | 1 + kit/static/icons/compass.svg | 1 + kit/static/icons/copy.svg | 1 + kit/static/icons/diamond.svg | 1 + kit/static/icons/edit.svg | 1 + kit/static/icons/emerald.svg | 1 + kit/static/icons/external.svg | 1 + kit/static/icons/globe.svg | 1 + kit/static/icons/grass.svg | 1 + kit/static/icons/hash.svg | 1 + kit/static/icons/heart.svg | 1 + kit/static/icons/history.svg | 1 + kit/static/icons/map.svg | 1 + kit/static/icons/menu.svg | 1 + kit/static/icons/monitor.svg | 1 + kit/static/icons/moon.svg | 1 + kit/static/icons/paper.svg | 1 + kit/static/icons/pickaxe.svg | 1 + kit/static/icons/potion.svg | 1 + kit/static/icons/question.svg | 1 + kit/static/icons/quote.svg | 1 + kit/static/icons/search.svg | 1 + kit/static/icons/sun.svg | 1 + kit/static/icons/tnt.svg | 1 + kit/static/icons/torch.svg | 1 + kit/static/kit-chrome.css | 2 + kit/static/kit.css | 2 + kit/static/kit.js | 96 + kit/static/pages/404.html | 38 + kit/static/pages/index.html | 38 + kit/static/snippets.tsx | 14 + kit/static/static-entry.css | 7 + kit/static/theme-init-doxygen.js | 1 + kit/static/theme-init.js | 1 + kit/theme/admonitions.css | 196 + kit/theme/base.css | 147 + kit/theme/chrome.css | 879 ++++ kit/theme/code.css | 229 + kit/theme/generated.css | 52 + kit/theme/index.css | 18 + kit/theme/painterly.css | 243 + kit/theme/pixel.css | 433 ++ kit/theme/prose.css | 535 +++ kit/theme/tailwind.css | 5 + kit/theme/tokens.css | 180 + kit/tsconfig.template.json | 21 + mkdocs.yml | 134 - package-lock.json | 3905 +++++++++++++++++ package.json | 50 + requirements.txt | 29 - tsconfig.json | 20 + vite.config.ts | 7 + 219 files changed, 19708 insertions(+), 298 deletions(-) create mode 100644 docs.config.ts delete mode 100644 docs/overrides/main.html create mode 100644 kit/.vendored create mode 100644 kit/README.md create mode 100644 kit/VERSION create mode 100644 kit/assets/build-assets.mjs create mode 100644 kit/assets/icons/apps.svg create mode 100644 kit/assets/icons/arrow-left.svg create mode 100644 kit/assets/icons/arrow-right.svg create mode 100644 kit/assets/icons/arrow-up.svg create mode 100644 kit/assets/icons/book-quill.svg create mode 100644 kit/assets/icons/bug.svg create mode 100644 kit/assets/icons/check.svg create mode 100644 kit/assets/icons/chest.svg create mode 100644 kit/assets/icons/chevron-down.svg create mode 100644 kit/assets/icons/chevron-right.svg create mode 100644 kit/assets/icons/clock.svg create mode 100644 kit/assets/icons/close.svg create mode 100644 kit/assets/icons/compass.svg create mode 100644 kit/assets/icons/copy.svg create mode 100644 kit/assets/icons/diamond.svg create mode 100644 kit/assets/icons/edit.svg create mode 100644 kit/assets/icons/emerald.svg create mode 100644 kit/assets/icons/external.svg create mode 100644 kit/assets/icons/globe.svg create mode 100644 kit/assets/icons/grass.svg create mode 100644 kit/assets/icons/hash.svg create mode 100644 kit/assets/icons/heart.svg create mode 100644 kit/assets/icons/history.svg create mode 100644 kit/assets/icons/map.svg create mode 100644 kit/assets/icons/menu.svg create mode 100644 kit/assets/icons/monitor.svg create mode 100644 kit/assets/icons/moon.svg create mode 100644 kit/assets/icons/paper.svg create mode 100644 kit/assets/icons/pickaxe.svg create mode 100644 kit/assets/icons/potion.svg create mode 100644 kit/assets/icons/question.svg create mode 100644 kit/assets/icons/quote.svg create mode 100644 kit/assets/icons/search.svg create mode 100644 kit/assets/icons/sun.svg create mode 100644 kit/assets/icons/tnt.svg create mode 100644 kit/assets/icons/torch.svg create mode 100644 kit/assets/sprites.mjs create mode 100644 kit/components/Badge.tsx create mode 100644 kit/components/Card.tsx create mode 100644 kit/components/GlobalBar.tsx create mode 100644 kit/components/Hotbar.tsx create mode 100644 kit/components/LocaleSwitcher.tsx create mode 100644 kit/components/PaintedBackdrop.tsx create mode 100644 kit/components/PaintedHero.tsx create mode 100644 kit/components/PixelButton.tsx create mode 100644 kit/components/PixelIcon.tsx create mode 100644 kit/components/SiteFooter.tsx create mode 100644 kit/components/ThemeToggle.tsx create mode 100644 kit/components/Tooltip.tsx create mode 100644 kit/components/fonts.ts create mode 100644 kit/components/i18n.ts create mode 100644 kit/components/index.ts create mode 100644 kit/components/menu.ts create mode 100644 kit/components/paint.ts create mode 100644 kit/components/pixel-icons.ts create mode 100644 kit/components/projects.ts create mode 100644 kit/components/theme.ts create mode 100644 kit/docs/app/App.tsx create mode 100644 kit/docs/app/components/DocFooter.tsx create mode 100644 kit/docs/app/components/KitLink.tsx create mode 100644 kit/docs/app/components/MobileDrawer.tsx create mode 100644 kit/docs/app/components/SearchModal.tsx create mode 100644 kit/docs/app/components/Sidebar.tsx create mode 100644 kit/docs/app/components/SiteHeader.tsx create mode 100644 kit/docs/app/components/Toc.tsx create mode 100644 kit/docs/app/components/focus.ts create mode 100644 kit/docs/app/data.ts create mode 100644 kit/docs/app/docs.css create mode 100644 kit/docs/app/enhance.ts create mode 100644 kit/docs/app/entry-client.tsx create mode 100644 kit/docs/app/entry-server.tsx create mode 100644 kit/docs/app/index.html create mode 100644 kit/docs/app/layout-api.ts create mode 100644 kit/docs/app/layouts/DocLayout.tsx create mode 100644 kit/docs/app/layouts/HomeLayout.tsx create mode 100644 kit/docs/app/layouts/NotFound.tsx create mode 100644 kit/docs/app/styles.css create mode 100644 kit/docs/app/virtual.d.ts create mode 100644 kit/docs/build.mjs create mode 100644 kit/docs/node/config.ts create mode 100644 kit/docs/node/content.ts create mode 100644 kit/docs/node/git.ts create mode 100644 kit/docs/node/links.ts create mode 100644 kit/docs/node/markdown/html-tags.ts create mode 100644 kit/docs/node/markdown/preprocess.ts create mode 100644 kit/docs/node/markdown/render.ts create mode 100644 kit/docs/node/markdown/shiki-themes.ts create mode 100644 kit/docs/node/markdown/shiki.ts create mode 100644 kit/docs/node/markdown/slug.ts create mode 100644 kit/docs/node/nav.ts create mode 100644 kit/docs/node/site.ts create mode 100644 kit/docs/node/vite.ts create mode 100644 kit/docs/prerender.mjs create mode 100644 kit/docs/shared/head.ts create mode 100644 kit/docs/shared/routing.ts create mode 100644 kit/docs/shared/search.ts create mode 100644 kit/docs/shared/types.ts create mode 100644 kit/package.template.json create mode 100644 kit/scripts/linkcheck.mjs create mode 100644 kit/scripts/mkdocs-nav.mjs create mode 100644 kit/scripts/serve-pages.mjs create mode 100644 kit/scripts/shot.mjs create mode 100644 kit/scripts/smoke.mjs create mode 100644 kit/scripts/text-parity.mjs create mode 100644 kit/scripts/url-parity.mjs create mode 100644 kit/scripts/vendor.mjs create mode 100644 kit/ssg/prerender.mjs create mode 100644 kit/static/build-static.mjs create mode 100644 kit/static/chrome-entry.css create mode 100644 kit/static/chrome-reset.css create mode 100644 kit/static/doxygen/doxygen-kit.css create mode 100644 kit/static/doxygen/footer.html create mode 100644 kit/static/doxygen/header.html create mode 100644 kit/static/footer.html create mode 100644 kit/static/globalbar.html create mode 100644 kit/static/grass.svg create mode 100644 kit/static/i18n/footer.de.html create mode 100644 kit/static/i18n/footer.en.html create mode 100644 kit/static/i18n/footer.es.html create mode 100644 kit/static/i18n/footer.fr.html create mode 100644 kit/static/i18n/footer.ja.html create mode 100644 kit/static/i18n/footer.ko.html create mode 100644 kit/static/i18n/footer.ru.html create mode 100644 kit/static/i18n/footer.zh-CN.html create mode 100644 kit/static/i18n/footer.zh-HK.html create mode 100644 kit/static/i18n/globalbar.de.html create mode 100644 kit/static/i18n/globalbar.en.html create mode 100644 kit/static/i18n/globalbar.es.html create mode 100644 kit/static/i18n/globalbar.fr.html create mode 100644 kit/static/i18n/globalbar.ja.html create mode 100644 kit/static/i18n/globalbar.ko.html create mode 100644 kit/static/i18n/globalbar.ru.html create mode 100644 kit/static/i18n/globalbar.zh-CN.html create mode 100644 kit/static/i18n/globalbar.zh-HK.html create mode 100644 kit/static/icons/apps.svg create mode 100644 kit/static/icons/arrow-left.svg create mode 100644 kit/static/icons/arrow-right.svg create mode 100644 kit/static/icons/arrow-up.svg create mode 100644 kit/static/icons/book-quill.svg create mode 100644 kit/static/icons/bug.svg create mode 100644 kit/static/icons/check.svg create mode 100644 kit/static/icons/chest.svg create mode 100644 kit/static/icons/chevron-down.svg create mode 100644 kit/static/icons/chevron-right.svg create mode 100644 kit/static/icons/clock.svg create mode 100644 kit/static/icons/close.svg create mode 100644 kit/static/icons/compass.svg create mode 100644 kit/static/icons/copy.svg create mode 100644 kit/static/icons/diamond.svg create mode 100644 kit/static/icons/edit.svg create mode 100644 kit/static/icons/emerald.svg create mode 100644 kit/static/icons/external.svg create mode 100644 kit/static/icons/globe.svg create mode 100644 kit/static/icons/grass.svg create mode 100644 kit/static/icons/hash.svg create mode 100644 kit/static/icons/heart.svg create mode 100644 kit/static/icons/history.svg create mode 100644 kit/static/icons/map.svg create mode 100644 kit/static/icons/menu.svg create mode 100644 kit/static/icons/monitor.svg create mode 100644 kit/static/icons/moon.svg create mode 100644 kit/static/icons/paper.svg create mode 100644 kit/static/icons/pickaxe.svg create mode 100644 kit/static/icons/potion.svg create mode 100644 kit/static/icons/question.svg create mode 100644 kit/static/icons/quote.svg create mode 100644 kit/static/icons/search.svg create mode 100644 kit/static/icons/sun.svg create mode 100644 kit/static/icons/tnt.svg create mode 100644 kit/static/icons/torch.svg create mode 100644 kit/static/kit-chrome.css create mode 100644 kit/static/kit.css create mode 100644 kit/static/kit.js create mode 100644 kit/static/pages/404.html create mode 100644 kit/static/pages/index.html create mode 100644 kit/static/snippets.tsx create mode 100644 kit/static/static-entry.css create mode 100644 kit/static/theme-init-doxygen.js create mode 100644 kit/static/theme-init.js create mode 100644 kit/theme/admonitions.css create mode 100644 kit/theme/base.css create mode 100644 kit/theme/chrome.css create mode 100644 kit/theme/code.css create mode 100644 kit/theme/generated.css create mode 100644 kit/theme/index.css create mode 100644 kit/theme/painterly.css create mode 100644 kit/theme/pixel.css create mode 100644 kit/theme/prose.css create mode 100644 kit/theme/tailwind.css create mode 100644 kit/theme/tokens.css create mode 100644 kit/tsconfig.template.json delete mode 100644 mkdocs.yml create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 requirements.txt create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml index 90235178..02d9e89b 100644 --- a/.github/workflows/build_docs.yml +++ b/.github/workflows/build_docs.yml @@ -1,9 +1,24 @@ on: + pull_request: + paths: + - .github/workflows/build_docs.yml + - docs/** + - kit/** + - docs.config.ts + - vite.config.ts + - tsconfig.json + - package.json + - package-lock.json push: paths: - .github/workflows/build_docs.yml - docs/** - - mkdocs.yml + - kit/** + - docs.config.ts + - vite.config.ts + - tsconfig.json + - package.json + - package-lock.json branches: - '**' workflow_dispatch: @@ -13,16 +28,29 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 + with: + fetch-depth: 0 # full history for the "Last updated" dates + + - uses: actions/setup-node@v7 + with: + node-version: 24 + cache: npm + + - run: | + npm ci + + - run: | + npm run typecheck - run: | - pip install -r requirements.txt + npm run build - run: | - mkdocs build + npm run linkcheck - uses: actions/upload-pages-artifact@v5 with: - path: site/ + path: dist/ deploy: if: github.ref == 'refs/heads/develop' && github.event_name == 'push' diff --git a/.gitignore b/.gitignore index 6ca4a2b5..ea8ef92d 100644 --- a/.gitignore +++ b/.gitignore @@ -559,3 +559,7 @@ fabric.properties /.vscode/ /bin/ /vsxmake2022 + +# Documentation site (levimc-kit) +/dist/ +/.kit/ diff --git a/README.md b/README.md index a2a80b14..7f6ba026 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ To access plugin development API hints and scaffolding toolkits, visit the [lega 2. Run the server, then the plugins will be migrated to LeviLamina plugin manifest automatically 3. To load them, you need to restart the server -For more information, please refer to [the documentation](https://docs.levimc.org/LegacyScriptEngine) +For more information, please refer to [the documentation](https://docs.levimc.org/LegacyScriptEngine/) ## Contributing diff --git a/README.zh.md b/README.zh.md index 01881302..cfa31526 100644 --- a/README.zh.md +++ b/README.zh.md @@ -15,7 +15,7 @@ 2. 运行服务器,然后插件将自动迁移到 LeviLamina 插件清单中 3. 重启服务器后,插件就会被加载 -更多信息请参见[文档](https://docs.levimc.org/LegacyScriptEngine) +更多信息请参见[文档](https://docs.levimc.org/LegacyScriptEngine/) ## 贡献 diff --git a/docs.config.ts b/docs.config.ts new file mode 100644 index 00000000..12cba06d --- /dev/null +++ b/docs.config.ts @@ -0,0 +1,111 @@ +// LegacyScriptEngine documentation — built with levimc-kit (see kit/README.md). +// Ported 1:1 from the former mkdocs.yml (MkDocs Material + mkdocs-static-i18n). +import { defineDocsConfig } from './kit/docs/node/config.ts'; + +export default defineDocsConfig({ + base: '/LegacyScriptEngine/', + title: 'LegacyScriptEngine', + titleTemplate: ':title - :site', + logo: 'img/logo.png', + favicon: 'img/logo.png', + project: 'LegacyScriptEngine', + repo: 'https://github.com/LiteLDev/LegacyScriptEngine', + editLink: 'https://github.com/LiteLDev/LegacyScriptEngine/edit/develop/docs/:path', + contentDir: 'docs', + hostname: 'https://docs.levimc.org', + sitemap: { hostname: 'https://docs.levimc.org' }, + lastUpdated: true, + i18n: { + mode: 'suffix', + defaultLocale: 'en', + locales: [ + { code: 'en', label: 'English', lang: 'en' }, + { code: 'zh', label: '中文', lang: 'zh' }, + ], + }, + urlStyle: 'directory', + slug: 'pymdownx', + markdown: { compat: 'python-markdown' }, + // MkDocs Material lists h2–h6 in "Table of contents"; the API entries of File, Basic, Command, DataBase + // and LanguageSupport are h5 headings, so keep the full depth instead of the kit default [2, 4]. + outline: [2, 6], + sidebar: 'tabs', + nav: [ + { Home: 'index.md' }, + { Tutorials: ['tutorials/create_your_first_plugin.md'] }, + 'faq.md', + { + APIs: [ + 'apis/README.md', + 'apis/LanguageSupport.md', + { + DataAPI: [ + 'apis/DataAPI/ConfigFile.md', + 'apis/DataAPI/DataBase.md', + 'apis/DataAPI/Economy.md', + 'apis/DataAPI/OtherData.md', + 'apis/DataAPI/PlayerData.md', + ], + }, + { + EventAPI: [ + 'apis/EventAPI/Listen.md', + 'apis/EventAPI/BlockEvents.md', + 'apis/EventAPI/EconomicEvents.md', + 'apis/EventAPI/EntityEvents.md', + 'apis/EventAPI/OtherEvents.md', + 'apis/EventAPI/PlayerEvents.md', + ], + }, + { + GameAPI: [ + 'apis/GameAPI/Basic.md', + 'apis/GameAPI/Block.md', + 'apis/GameAPI/BlockEntity.md', + 'apis/GameAPI/Command.md', + 'apis/GameAPI/Container.md', + 'apis/GameAPI/Device.md', + 'apis/GameAPI/Entity.md', + 'apis/GameAPI/GameUtils.md', + 'apis/GameAPI/Item.md', + 'apis/GameAPI/Packet.md', + 'apis/GameAPI/Particle.md', + 'apis/GameAPI/Player.md', + 'apis/GameAPI/ScoreBoard.md', + 'apis/GameAPI/Server.md', + ], + }, + { GuiAPI: ['apis/GuiAPI/Form.md', 'apis/GuiAPI/FormBuilder.md'] }, + { + NbtAPI: [ + 'apis/NbtAPI/NBT.md', + 'apis/NbtAPI/NBTCompound.md', + 'apis/NbtAPI/NBTList.md', + 'apis/NbtAPI/NBTValue.md', + ], + }, + { + ScriptAPI: [ + 'apis/ScriptAPI/Logger.md', + 'apis/ScriptAPI/ScriptHelp.md', + 'apis/ScriptAPI/i18n.md', + 'apis/ScriptAPI/Ll.md', + 'apis/ScriptAPI/VanillaI18n.md', + ], + }, + { + SystemAPI: [ + 'apis/SystemAPI/File.md', + 'apis/SystemAPI/FileSystem.md', + 'apis/SystemAPI/Network.md', + 'apis/SystemAPI/SystemCall.md', + 'apis/SystemAPI/SystemInfo.md', + ], + }, + ], + }, + ], + navTranslations: { + zh: { Home: '主页', Tutorials: '教程', APIs: '接口' }, + }, +}); diff --git a/docs/apis/DataAPI/DataBase.md b/docs/apis/DataAPI/DataBase.md index 699613a9..aac93672 100644 --- a/docs/apis/DataAPI/DataBase.md +++ b/docs/apis/DataAPI/DataBase.md @@ -102,7 +102,7 @@ SQL databases are suitable for handling large amounts of relational data using S **Note:** Unless otherwise specified, the following APIs may throw exceptions. It is recommended to use exception handling blocks. For **JavaScript**, use `try ... catch` blocks; for **Lua**, use `pcall`. Generally, if no error is thrown, the call is successful. -> If you are a JavaScript plugin developer, you can also try using the [Yoyo](https://www.google.com/search?q=https://gitee.com/Y_oyo) LLDB Chained Operation Library (primarily for beginners who are unfamiliar with SQL syntax). Details: [Click here](https://gitee.com/Y_oyo/yoyo-mcbe-lite-xloader-item/blob/master/sql/yoyoSqlite.js%202.0.0.md) +> If you are a JavaScript plugin developer, you can also try using the [Yoyo](https://gitee.com/Y_oyo) LLDB Chained Operation Library (primarily for beginners who are unfamiliar with SQL syntax). Details: [Click here](https://gitee.com/Y_oyo/yoyo-mcbe-lite-xloader-item/blob/master/sql/yoyoSqlite.js%202.0.0.md) ### Open a SQL Database Session @@ -116,7 +116,7 @@ To achieve cross-database compatibility, connecting to a database requires passi * `type`: `String` The database type, supports `"sqlite3"` and `"mysql"`. * `params`: `Object` - [Connection Parameters](https://www.google.com/search?q=%23connection-parameters) + [Connection Parameters](#connection-parameters) * **Returns:** The opened database session object. @@ -359,7 +359,7 @@ stmt.bind(114514, 7); // Binds to h (index 7) `stmt.fetchAll()` -* **Returns:** The full result set. (See [Execute SQL and Get Result Set](https://www.google.com/search?q=%23execute-sql-and-get-result-set)). +* **Returns:** The full result set. (See [Execute SQL and Get Result Set](#execute-sql-and-get-result-set)). * **Return Type:** `Array` `stmt.fetchAll(callback)` diff --git a/docs/apis/GameAPI/Player.md b/docs/apis/GameAPI/Player.md index 9073e6d3..cc898f7c 100644 --- a/docs/apis/GameAPI/Player.md +++ b/docs/apis/GameAPI/Player.md @@ -1415,7 +1415,7 @@ Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/cr - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#attack) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#attack) #### Simulate Destroy @@ -1434,7 +1434,7 @@ Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/cre - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#breakblock) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#breakblock) #### Simulate Disconnect @@ -1463,7 +1463,7 @@ Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/cre - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#interact) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#interact) #### Simulate Jump @@ -1472,7 +1472,7 @@ Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/cre - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#jump) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#jump) #### Simulate Look At a Block or Entity @@ -1498,7 +1498,7 @@ Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/cre - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#lookatblock) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#lookatblock) #### Simulate Set Body Rotation @@ -1553,7 +1553,7 @@ Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/cr - Return value: Whether the move request was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#movetolocation) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#movetolocation) Note: If you need automatic pathfinding, consider using `Simulate Navigate Move` #### Simulate Navigate Move @@ -1574,7 +1574,7 @@ Note: If you need automatic pathfinding, consider using `Simulate Navigate Move` ,path:`Number[3][]`} - Return type: `Object` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#navigatetoblock) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#navigatetoblock) Return value example: ```json @@ -1642,7 +1642,7 @@ path is not empty, the simulated player will move to the (-1,0,0) coordinate. - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#navigatetolocations) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#navigatetolocations) #### Simulate Use Item @@ -1665,7 +1665,7 @@ Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/cre - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#useitem) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#useitem) #### Simulate Stop Destroying Block @@ -1674,7 +1674,7 @@ Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/cre - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#stopbreakingblock) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#stopbreakingblock) #### Simulate Stop Interacting @@ -1683,7 +1683,7 @@ Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/cre - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#stopinteracting) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#stopinteracting) #### Simulate Stop Moving @@ -1692,7 +1692,7 @@ Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/cre - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#stopmoving) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#stopmoving) #### Simulate Stop Using Item @@ -1701,4 +1701,4 @@ Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/cre - Return value: Whether the simulation operation was successful - Return type: `Boolean` -Reference: [mojang-gametest docs](https://docs.microsoft.com/en-us/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#stopusingitem) +Reference: [mojang-gametest docs](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#stopusingitem) diff --git a/docs/apis/GameAPI/Player.zh.md b/docs/apis/GameAPI/Player.zh.md index c9ff542b..ab66d3ec 100644 --- a/docs/apis/GameAPI/Player.zh.md +++ b/docs/apis/GameAPI/Player.zh.md @@ -1787,7 +1787,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#attack) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#attack) #### 模拟破坏 @@ -1806,7 +1806,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#breakblock) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#breakblock) #### 模拟断开连接 @@ -1835,7 +1835,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#interact) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#interact) #### 模拟跳跃 @@ -1844,7 +1844,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#jump) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#jump) #### 模拟看向某方块或实体 @@ -1870,7 +1870,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#lookatblock) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#lookatblock) #### 模拟设置身体角度 @@ -1925,7 +1925,7 @@ - 返回值:是否请求移动成功 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#movetolocation) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#movetolocation) 注:如需自动寻路,请考虑使用 `模拟导航移动` #### 模拟导航移动 @@ -1945,7 +1945,7 @@ - 返回值:是否能到达指定位置以及导航路径,结构:{isFullPath:`Boolean`,path:`Number[3][]`} - 返回值类型:`Object` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#navigatetoblock) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#navigatetoblock) 返回值示例: ```json @@ -2012,7 +2012,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#navigatetolocations) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#navigatetolocations) #### 模拟使用物品 @@ -2035,7 +2035,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#useitem) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#useitem) #### 模拟停止破坏方块 @@ -2044,7 +2044,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#stopbreakingblock) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#stopbreakingblock) #### 模拟停止交互 @@ -2053,7 +2053,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#stopinteracting) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#stopinteracting) #### 模拟停止移动 @@ -2062,7 +2062,7 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#stopmoving) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#stopmoving) #### 模拟停止使用物品 @@ -2071,5 +2071,5 @@ - 返回值:是否成功模拟操作 - 返回值类型:`Boolean` -参考:[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#stopusingitem) +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#stopusingitem) diff --git a/docs/apis/LanguageSupport.md b/docs/apis/LanguageSupport.md index 8d401a96..cf7c6075 100644 --- a/docs/apis/LanguageSupport.md +++ b/docs/apis/LanguageSupport.md @@ -18,7 +18,7 @@ Currently, LSE supports writing plugins in the following languages: !!! tip If you need to write plugins in native languages such as C++, Go, Rust, etc., please go - to [Home](https://docs.levimc.org/LeviLamina) for other language documentation + to [Home](https://docs.levimc.org/LeviLamina/) for other language documentation ## JavaScript language support description diff --git a/docs/apis/LanguageSupport.zh.md b/docs/apis/LanguageSupport.zh.md index 13e57c27..9ca1d0a6 100644 --- a/docs/apis/LanguageSupport.zh.md +++ b/docs/apis/LanguageSupport.zh.md @@ -15,7 +15,7 @@ | `Python` | 使用 CPython 引擎运行插件,支持 pip 包管理 | !!! tip - 如果需要使用 C++、Go、Rust 等原生语言编写插件,请移步 [主页](https://docs.levimc.org/LeviLamina) 查看其他语言文档 + 如果需要使用 C++、Go、Rust 等原生语言编写插件,请移步 [主页](https://docs.levimc.org/LeviLamina/) 查看其他语言文档 ## JavaScript 语言支持说明 diff --git a/docs/apis/NbtAPI/NBTValue.md b/docs/apis/NbtAPI/NBTValue.md index b3a1698e..9371ec3b 100644 --- a/docs/apis/NbtAPI/NBTValue.md +++ b/docs/apis/NbtAPI/NBTValue.md @@ -60,6 +60,6 @@ For an NBT object that stores common data types `value`, with the following memb `value.get()` - Return value: The data stored in the object. -- Return value type: ``Number` / `Float` / `Double` / `ByteBuffer` / `String`, depending on the type of the data stored. +- Return value type: \``Number` / `Float` / `Double` / `ByteBuffer` / `String`, depending on the type of the data stored. diff --git a/docs/apis/NbtAPI/NBTValue.zh.md b/docs/apis/NbtAPI/NBTValue.zh.md index 2c5960fc..73f3750e 100644 --- a/docs/apis/NbtAPI/NBTValue.zh.md +++ b/docs/apis/NbtAPI/NBTValue.zh.md @@ -61,6 +61,6 @@ `value.get()` - 返回值:对象中储存的数据 -- 返回值类型:``Number` / `Float` / `Double` / `ByteBuffer` / `String`,以储存的实际数据类型为准 +- 返回值类型:\``Number` / `Float` / `Double` / `ByteBuffer` / `String`,以储存的实际数据类型为准 diff --git a/docs/apis/ScriptAPI/i18n.md b/docs/apis/ScriptAPI/i18n.md index 78a182dc..d63d8d6c 100644 --- a/docs/apis/ScriptAPI/i18n.md +++ b/docs/apis/ScriptAPI/i18n.md @@ -100,7 +100,7 @@ Each file inside should be similar to: - ... : `Any` Format arguments - Return value: `String` translated and formatted text -- Note: Formatting should follow [syntax](https://fmt.dev/latest/syntax.html) +- Note: Formatting should follow [syntax](https://fmt.dev/latest/syntax/) - Throw: - Invalid parameter @@ -116,7 +116,7 @@ Each file inside should be similar to: - ... : `Any` Format arguments - Return value: `String` translated and formatted text -- Note: Formatting should follow [syntax](https://fmt.dev/latest/syntax.html) +- Note: Formatting should follow [syntax](https://fmt.dev/latest/syntax/) - Throw: - Invalid parameter diff --git a/docs/apis/ScriptAPI/i18n.zh.md b/docs/apis/ScriptAPI/i18n.zh.md index 198cff6a..0c507d58 100644 --- a/docs/apis/ScriptAPI/i18n.zh.md +++ b/docs/apis/ScriptAPI/i18n.zh.md @@ -98,7 +98,7 @@ - ...: `Any` 格式化参数 - 返回值: `String` 翻译并格式化后的文本 -- 注意: 格式化应遵循[语法](https://fmt.dev/latest/syntax.html) +- 注意: 格式化应遵循[语法](https://fmt.dev/latest/syntax/) - 抛出: - 参数无效 @@ -114,7 +114,7 @@ - ...: `Any` 格式化参数 - 返回值: `String` 翻译并格式化后的文本 -- 注意: 格式化应遵循[语法](https://fmt.dev/latest/syntax.html) +- 注意: 格式化应遵循[语法](https://fmt.dev/latest/syntax/) - 抛出: - 参数无效 diff --git a/docs/apis/SystemAPI/Network.zh.md b/docs/apis/SystemAPI/Network.zh.md index 9705b9b0..9528782b 100644 --- a/docs/apis/SystemAPI/Network.zh.md +++ b/docs/apis/SystemAPI/Network.zh.md @@ -567,4 +567,4 @@ server.onGet("/hello(.+)", (req, resp) => { }).listen(this.listen_address, this.listen_port); logger.info("http_server_test: run: Server listening on " + this.listen_address + ":" + this.listen_port); ``` -请查看 [UnitTest](https://github.com/LiteLDev/LiteLoaderBDSv2/blob/v2/main/test/UnitTest.js) +请查看 [UnitTest](https://github.com/LiteLDev/LiteLoaderBDS/blob/v2/main/test/UnitTest.js) diff --git a/docs/overrides/main.html b/docs/overrides/main.html deleted file mode 100644 index 328ac833..00000000 --- a/docs/overrides/main.html +++ /dev/null @@ -1,89 +0,0 @@ -{% extends "base.html" %} - -{% block extrahead %} - -{% endblock %} diff --git a/docs/tutorials/create_your_first_plugin.md b/docs/tutorials/create_your_first_plugin.md index 09372ac0..f51ce56b 100644 --- a/docs/tutorials/create_your_first_plugin.md +++ b/docs/tutorials/create_your_first_plugin.md @@ -7,7 +7,7 @@ ## Prerequisites Before developing your first plugin, we will need to set up your developer environment (IDE). The choice of software you -use to program is yours, but trusted and reliable software is recommended. [Atom](https://atom.io/) is lightweight +use to program is yours, but trusted and reliable software is recommended. [Atom](https://github.blog/news-insights/product-news/sunsetting-atom/) is lightweight editor that works well for this tutorial, otherwise [VSCode](https://code.visualstudio.com/) is also a widely used editor with a lot of powerful features. diff --git a/docs/tutorials/create_your_first_plugin.zh.md b/docs/tutorials/create_your_first_plugin.zh.md index 61733ab0..7ad2b0a3 100644 --- a/docs/tutorials/create_your_first_plugin.zh.md +++ b/docs/tutorials/create_your_first_plugin.zh.md @@ -7,7 +7,7 @@ 在开发你的第一个插件之前,我们需要设置你的开发环境。你用来编程的软件由你自己选择,但建议使用可信和可靠的软件。 -- [Atom](https://atom.io/) 是轻量级的编辑器,在本教程中很好用。 +- [Atom](https://github.blog/news-insights/product-news/sunsetting-atom/) 是轻量级的编辑器,在本教程中很好用。 - [VSCode](https://code.visualstudio.com/) 也是一个广泛使用的编辑器,具有很多强大的功能。 你还需要建立一个干净的LeviLamina安装,关于如何安装LeviLamina的细节可以在 [这里](https://docs.levimc.org/LeviLamina/zh/user_guides/install/) 找到。这个服务器将被用来测试你的插件。 diff --git a/kit/.vendored b/kit/.vendored new file mode 100644 index 00000000..d97a3e21 --- /dev/null +++ b/kit/.vendored @@ -0,0 +1,3 @@ +levimc-kit 1.0.0 +vendored 2026-10-17T14:26:51.757Z +Do not edit files in this folder; update the kit and re-vendor. diff --git a/kit/README.md b/kit/README.md new file mode 100644 index 00000000..1115db65 --- /dev/null +++ b/kit/README.md @@ -0,0 +1,603 @@ +# levimc-kit + +The shared design system and static docs engine for every LeviMC website — levimc.org, pkg.levimc.org and +the project docs at `docs.levimc.org//` (LeviLamina, LegacyScriptEngine, lip, LeviLauncher, +LeviLaunchroid), plus the Doxygen API reference. + +**Design concept: "Impression, Craft".** Monet's Giverny rendered as if built in Minecraft. +*Painterly = atmosphere* (impressionist colour fields and brush-dab texture in heroes, backdrops and margins); +*Pixel = structure* (crisp stepped geometry on every interactive affordance). Reading surfaces stay calm +"canvas" at WCAG AA contrast and a ~76ch measure. Light theme = *Nymphéas*, dark theme = *Impression, soleil levant*. + +**Stack:** Vite 8 + React 19 + react-router 7 + TypeScript + Tailwind CSS v4 (`@tailwindcss/vite`). +Docs sites are compiled at build time (unified/remark/rehype + Shiki) and statically prerendered — one real +HTML file per URL for GitHub Pages — then hydrated into a SPA. + +Version: see `VERSION` (1.0.0). + +--- + +## Contents + +1. [Layout](#layout) +2. [Vendoring](#vendoring) +3. [Dependencies](#dependencies) +4. [Docs site: app structure & commands](#docs-site-app-structure--commands) +5. [Site config API (`defineDocsConfig`)](#site-config-api-definedocsconfig) +6. [Markdown support](#markdown-support) +7. [Plain Vite apps (levimc.org, pkg.levimc.org)](#plain-vite-apps-levimcorg-pkglevimcorg) +8. [Components](#components) +9. [Static chrome & Doxygen](#static-chrome--doxygen) +10. [Verification scripts](#verification-scripts) +11. [Design rules — do / don't](#design-rules--do--dont) +12. [Porting checklist: MkDocs sites](#porting-checklist-mkdocs-sites-levilamina-legacyscriptengine) +13. [Porting checklist: VitePress sites](#porting-checklist-vitepress-sites-lip-levilauncher-levilaunchroid) +14. [Known limitations](#known-limitations) +15. [Maintaining the kit](#maintaining-the-kit) + +--- + +## Layout + +``` +levimc-kit/ +├── README.md VERSION package.template.json tsconfig.template.json +├── theme/ Tailwind v4 CSS-first theme +│ ├── tailwind.css one-line entry: @import "tailwindcss" + index.css + @source for the kit +│ ├── index.css imports everything below (use after your own @import "tailwindcss") +│ ├── tokens.css @theme tokens (light on :root, dark on .dark) + @custom-variant dark +│ ├── generated.css textures & sprites as data URIs (generated — do not edit) +│ ├── base.css document defaults, focus ring, skip link, reduced motion +│ ├── pixel.css .px-corners .mc-btn .mc-btn-primary .mc-icon-btn .mc-input .mc-kbd .px-card +│ │ .kit-slot .hotbar .mc-tooltip .grass-divider .px-dot +│ ├── painterly.css .kit-backdrop* .kit-hero* .kit-painted .kit-item-frame +│ ├── prose.css .kit-prose doc typography (headings, lists, tables, quotes, footnotes, details…) +│ ├── code.css .kit-code Shiki blocks (title bar, CSS line numbers, copy button) +│ ├── admonitions.css .kit-adm (all MkDocs + VitePress + GitHub types) and .kit-tabs +│ └── chrome.css GlobalBar, footer, menus, theme toggle, badges, tooltips, cards, hero layout +├── assets/ +│ ├── sprites.mjs 16×16 pixel sprites as text grids (the source of truth) +│ ├── build-assets.mjs → icons/*.svg, components/pixel-icons.ts, theme/generated.css +│ └── icons/*.svg 35 crisp-edge sprites (grass, chest, pickaxe, map, book-quill, emerald, …) +├── components/ React + TS, SSR-safe (no window access during render) +│ ├── index.ts barrel export +│ ├── GlobalBar.tsx SiteFooter.tsx ThemeToggle.tsx LocaleSwitcher.tsx +│ ├── PaintedBackdrop.tsx PaintedHero.tsx PixelButton.tsx Card.tsx Badge.tsx Tooltip.tsx +│ ├── Hotbar.tsx (HotbarTabs, Pagination) PixelIcon.tsx (PixelIcon, BrandIcon) +│ ├── theme.ts (ThemeProvider, useTheme, themeInitScript) projects.ts (cross-site registry) +│ ├── i18n.ts (chrome strings: en zh-CN zh-HK es ru de ja ko fr) fonts.ts menu.ts +│ ├── paint.ts deterministic painted scenes (lily pond + block bridge / harbour sunrise + pixel boats) +│ └── pixel-icons.ts generated sprite data +├── docs/ the static docs engine +│ ├── node/ build side (Node): config.ts vite.ts site.ts content.ts links.ts nav.ts git.ts +│ │ └── markdown/ preprocess.ts render.ts slug.ts shiki.ts shiki-themes.ts html-tags.ts +│ ├── shared/ types.ts routing.ts head.ts search.ts (used by build and browser) +│ ├── app/ React app: index.html entry-client.tsx entry-server.tsx App.tsx data.ts enhance.ts +│ │ layouts/ (DocLayout HomeLayout NotFound) components/ (SiteHeader Sidebar Toc +│ │ SearchModal MobileDrawer DocFooter KitLink) docs.css styles.css layout-api.ts +│ ├── build.mjs client build → SSR build → prerender +│ └── prerender.mjs +├── ssg/prerender.mjs prerenderRoutes() for plain Vite apps +├── static/ non-React chrome (prebuilt; regenerate with build-static.mjs) +│ ├── kit.css kit-chrome.css kit.js theme-init.js theme-init-doxygen.js +│ ├── globalbar.html footer.html i18n/{globalbar,footer}..html +│ ├── pages/index.html pages/404.html docs.levimc.org root redirect + themed 404 +│ ├── doxygen/header.html footer.html doxygen-kit.css +│ └── icons/ grass.svg +├── scripts/ serve-pages · linkcheck · url-parity · text-parity · smoke · shot · vendor · mkdocs-nav +├── demo/ demo docs sites (not vendored): suffix/directory/pymdownx + folder/html/vitepress +└── screens/ review screenshots (not vendored) +``` + +## Vendoring + +Copy the kit into each app as `/kit/` (everything except `demo/`, `screens/`, `node_modules/`): + +```sh +node path/to/levimc-kit/scripts/vendor.mjs path/to/app # → path/to/app/kit/ (replaces it) +``` + +`vendor.mjs` produces a clean copy: it skips `demo/`, `screens/`, `node_modules/`, `dist/`, `.kit/` and every +dotfile, replaces `/kit/` completely (re-running is idempotent) and writes `kit/.vendored` with the version. +Verified: 194 files / 2.1 MB, no demo, screenshots or dependencies; running the vendored copy's own +`kit/scripts/vendor.mjs ` reproduces it byte for byte. `--dest ` changes the folder name. +Never edit files under `kit/` in an app; change the kit and re-vendor. The demo vendors itself the same way +(`cd demo && npm run vendor`). + +## Dependencies + +Pinned, verified together (Node 24.22, npm 11.19; any Node ≥ 22.12 works — `assets/build-assets.mjs` +needs Node ≥ 22.18 for native TypeScript stripping). Copy the fields of `package.template.json`. + +| Package | Version | | Package | Version | +|---|---|---|---|---| +| react | 19.3.1 | | unified | 11.0.5 | +| react-dom | 19.3.1 | | remark-parse | 11.0.0 | +| react-router | 7.18.4 (`version-7` tag; 8.x exists but the LeviMC stack is v7) | | remark-gfm | 4.0.1 | +| minisearch | 7.2.0 | | remark-frontmatter | 5.0.0 | +| vite | 8.3.4 | | remark-rehype | 11.1.2 | +| @vitejs/plugin-react | 6.1.2 | | rehype-raw | 7.0.0 | +| tailwindcss | 4.3.3 | | hast-util-to-html | 9.0.5 | +| @tailwindcss/vite | 4.3.3 | | hast-util-to-string | 3.0.1 | +| typescript | 7.0.2 | | mdast-util-to-string | 4.0.0 | +| @types/react | 19.3.0 | | unist-util-visit | 5.1.0 | +| @types/react-dom | 19.3.0 | | shiki | 4.5.0 | +| @types/node | 24.19.2 | | @shikijs/transformers | 4.5.0 | +| @types/hast | 3.0.5 | | yaml | 2.9.1 | +| @types/mdast | 4.0.4 | | picomatch | 4.0.7 | +| @types/unist | 3.0.3 | | @types/picomatch | 4.0.3 | + +Playwright is only needed for `smoke.mjs`, `text-parity.mjs` and `shot.mjs`; they resolve it from +`$LEVIMC_PW_DIR` (a directory containing `node_modules/playwright`) or from the app (`npm i -D playwright@1.56.1`). + +Plain Vite apps (levimc.org, pkg.levimc.org) only need react, react-dom, react-router, vite, +@vitejs/plugin-react, tailwindcss, @tailwindcss/vite, typescript and the @types packages. + +## Docs site: app structure & commands + +A docs site is the repository's existing markdown plus four small files: + +``` +/ +├── kit/ vendored levimc-kit +├── docs.config.ts defineDocsConfig({...}) (replaces mkdocs.yml / .vitepress/config.mts) +├── vite.config.ts plugins: [kitDocs(docs)] +├── tsconfig.json from tsconfig.template.json +├── package.json from package.template.json +├── .gitignore node_modules/ dist/ .kit/ +└── docs/… (contentDir) unchanged markdown, images, logo.svg … +``` + +### Where the app lives + +The app sits where the old generator config was; `kit/` sits next to `package.json`. + +**VitePress-style repos (lip, LeviLauncher, LeviLaunchroid) — markdown directly in `docs/`:** the app *is* +`docs/` (it already holds a `package.json`): + +``` +docs/ +├── kit/ vendored (excluded from content automatically) +├── package.json replaces the VitePress one +├── vite.config.ts docs.config.ts tsconfig.json .gitignore (node_modules/ dist/ .kit/) +├── public/ unchanged (served at the site root) +├── index.md guide/… zh-CN/… unchanged content +└── .vitepress/ delete after the port (ignored meanwhile) +``` + +```ts +// docs/docs.config.ts +export default defineDocsConfig({ base: '/lip/', contentDir: '.', urlStyle: 'html', i18n: { mode: 'folder', … }, … }); +``` + +With `contentDir: '.'` the engine automatically excludes the vendored `kit/` folder, the output directory +(`dist/`) and `.kit/`; `node_modules/`, every dot-folder (`.vitepress/`) and `public/` are always excluded. +Add `exclude: ['README.md']` only if `docs/` has a README that is not a page. CI: `working-directory: docs`, +upload `docs/dist`. + +**LeviLamina — app in `docs/main/`, content in `docs/main/contents/`:** + +``` +docs/main/ +├── kit/ package.json vite.config.ts docs.config.ts tsconfig.json .gitignore +├── contents/ unchanged (index.md, *.zh.md, logo.svg, favicon.ico …) ← contentDir: 'contents' +└── (mkdocs.yml, requirements.txt, overrides/ — delete after the port) +``` + +The Doxyfile (`docs/api/Doxyfile`, run from the repo root) then references +`docs/main/kit/static/kit-chrome.css`, `docs/main/kit/static/doxygen/doxygen-kit.css` and +`docs/main/kit/static/kit.js`; CI builds in `docs/main` and merges the Doxygen output into `docs/main/dist/api/`. + +**LegacyScriptEngine — `mkdocs.yml` at the repo root, content in `docs/`:** the app is the repository root +(`kit/`, `package.json`, … next to the old `mkdocs.yml`) with `contentDir: 'docs'` and +`exclude: ['overrides/**']` (the theme overrides live inside `docs/`). + +```ts +// vite.config.ts +import { defineConfig } from 'vite'; +import { kitDocs } from './kit/docs/node/vite.ts'; +import docs from './docs.config.ts'; +export default defineConfig({ plugins: [kitDocs(docs)] }); // includes @vitejs/plugin-react + @tailwindcss/vite +``` + +| Command | What it does | +|---|---| +| `npm run dev` (`vite`) | dev server with content hot-rebuild (open `http://localhost:5173//`) | +| `npm run build` (`node kit/docs/build.mjs [--config vite.config.ts]`) | client build → SSR build (`.kit/ssr/`) → prerender every route to `dist/` + `404.html`, `sitemap.xml`, `.nojekyll`, search indexes; prints warnings (unresolved links, missing anchors, escaped pseudo-tags) and writes them to `.kit/warnings.txt` | +| `npm run preview` | `serve-pages.mjs dist --base // --port 4173` (GitHub Pages semantics) | +| `npm run typecheck` | `tsc --noEmit` (covers the kit and the app) | +| `npm run linkcheck` | internal links, redirects and anchors (add `--external` for every external URL) | +| `npm run smoke` | Playwright smoke test against the preview server | + +Equivalent manual steps: `vite build && vite build --ssr && node kit/docs/prerender.mjs`. + +GitHub Actions (Pages): + +```yaml +- uses: actions/setup-node@v4 + with: { node-version: 24 } +- run: npm ci && npm run build +- run: node kit/scripts/linkcheck.mjs dist --base // --site-origin https://docs.levimc.org +- uses: actions/upload-pages-artifact@v5 + with: { path: dist } +``` + +Use `fetch-depth: 0` in `actions/checkout` if you want accurate "Last updated" dates (git history). + +### What the engine produces + +* `dist/` — real HTML per URL. MkDocs-style sites: `a/b.md` → `a/b/index.html` (URL `a/b/`); + VitePress-style: `a/b.md` → `a/b.html` (URL `a/b` with `cleanUrls`, else `a/b.html`). GitHub Pages serves + both `a/b` and `a/b.html`, so every URL that works today keeps working with **no redirect**. +* ``: title, description, canonical, hreflang alternates (+ x-default), Open Graph, theme-color, + the no-flash theme script and the root-only language redirect. +* `dist/assets/pages/*.js` — one lazily loaded chunk per page (SPA navigation); the first load reuses the + prerendered HTML (no duplicate download) and hydrates with `hydrateRoot`. +* `dist/assets/search-..json` — MiniSearch index per locale (CJK indexed as character + bigrams), lazy-loaded on first search. +* `404.html` (themed, locale-aware), `sitemap.xml` (with hreflang), `.nojekyll`, content assets + (MkDocs: every non-markdown file in `contentDir`, verbatim; VitePress: `public/` + hashed images). + +## Site config API (`defineDocsConfig`) + +```ts +import { defineDocsConfig } from './kit/docs/node/config.ts'; +export default defineDocsConfig({ … }); +``` + +| Option | Type / default | Notes (MkDocs ↔ VitePress) | +|---|---|---| +| `base` | `'/LeviLamina/'` | `site_url` path / `base` | +| `title`, `description` | string | `site_name` / `title` | +| `logo` | `'logo.svg'` or `{ src, alt, dark? }` | path relative to base; each project keeps its own logo | +| `favicon` | path | | +| `project` | default = base segment | highlights the project in the GlobalBar "Docs" menu | +| `repo` | URL | header GitHub button (if `social` not given) | +| `editLink` | `'https://github.com///edit///:path'` or `{ pattern: string \| (source) => url \| undefined, text?: { [locale]: label } }` | `:path` = path relative to `contentDir`; evaluated at build time | +| `contentDir` | string (required) | `docs_dir` / `srcDir` | +| `publicDir` | default `/public` if present, or `false` | VitePress `public/` (copied verbatim) | +| `copyContentAssets` | default `true` for `urlStyle: 'directory'` | MkDocs: copy every non-md file (logo.svg stays at `/LeviLamina/logo.svg`) | +| `exclude` | globs relative to contentDir | e.g. `['overrides/**']`; `node_modules`, dot folders, `.vitepress`, `public` are always excluded | +| `i18n.mode` | `'suffix'` \| `'folder'` | mkdocs-static-i18n (`x.md`, `x.zh.md`, `x.en.md` = default) / VitePress (`zh-CN/x.md`) | +| `i18n.defaultLocale` | locale code | | +| `i18n.locales[]` | `{ code, label, lang?, prefix?, suffix?, folder? }` | `prefix` defaults to `''` (default) / `'/'`; `lang` is used for ``/hreflang | +| `i18n.fallback` | default `true` (suffix) / `false` (folder) | build default-locale content at localized URLs when a translation is missing (static-i18n `fallback_to_default`) | +| `urlStyle` | `'directory'` (default) \| `'html'` | MkDocs directory URLs / VitePress `.html` files | +| `cleanUrls` | `false` | html style: link `a/b` instead of `a/b.html` | +| `slug` | `'pymdownx'` \| `'vitepress'` | heading ids (see below); default by compat | +| `markdown.compat` | `'python-markdown'` (default for directory) \| `'commonmark'` | see [Markdown support](#markdown-support) | +| `markdown.containers` | `{ mkdocs?, vitepress? }` | which container syntaxes to recognise (default by compat) | +| `markdown.lineNumbers` | `true` | multi-line blocks; per block `:no-line-numbers` / `linenums="1"` | +| `markdown.codeTitle` | `'pygments'` (MkDocs `auto_title`: "C++", "GAS", "Text Only") \| `'lang'` \| `'none'` | | +| `markdown.languageAlias` | `{ xmake: 'lua' }` | extra fence-language aliases | +| `markdown.admonitionTitles` | `'mkdocs'` ("Note") \| `'vitepress'` ("TIP") | default titles | +| `markdown.autoTitle` | default `true` for python-markdown | MkDocs Material: pages without `# H1` get one from their nav title / file name | +| `markdown.literalBackslashes` | `false` | python-markdown only: keep backslashes Python-Markdown does not treat as escapes (`\` → `\`, byte-identical to MkDocs) | +| `nav` | `NavEntry[]` or `{ [locale]: NavEntry[] }` | MkDocs `nav` (verbatim YAML structure works) / VitePress `themeConfig.nav` | +| `navTranslations` | `{ [locale]: { 'User Guides': '用户指南' } }` | static-i18n `nav_translations` | +| `sidebar` | `'tabs'` (default) \| `'tree'` \| `false` \| `SidebarConfig` \| `{ [locale]: SidebarConfig }` | `'tabs'` = Material `navigation.tabs` (header shows top-level sections, sidebar shows the active one); `SidebarConfig` = VitePress array or `{ '/guide/': [...] }` multi-sidebar | +| `layouts` | `{ name: './path/Component.tsx' }` | custom page layouts for `layout: ` frontmatter (props: `CustomLayoutProps` from `kit/docs/app/layout-api.ts`) | +| `lastUpdated` | `true` | `git log` timestamp per file; silently absent without git history | +| `hostname` | `'https://docs.levimc.org'` | canonical / og:url / hreflang origin (defaults to `sitemap.hostname`) | +| `sitemap` | `{ hostname }` \| `false` | | +| `head` | `[[tag, attrs, content?], …]` | extra head tags (VitePress format) | +| `outline` | `[2, 4]` (python-markdown) / `[2, 3]` (commonmark) | "On this page" levels (`outline: false` in frontmatter hides it) | +| `social` | `[{ icon: 'github'\|'discord'\|'telegram'\|'x'\|'youtube'\|'email', link, label? }]` | header icons | +| `footer` | `{ message?, copyright? }` | extra line in the shared footer | +| `ui` | `{ [locale]: Partial }` | override chrome strings (e.g. VitePress `docFooter`, `editLink.text`) | +| `titleTemplate` | `':title \| :site'` | use `':title - :site'` to match MkDocs | +| `outDir` | `'dist'` | | +| `searchExclude` | globs on page keys | | + +`NavEntry` accepts every MkDocs and VitePress form: + +```ts +'user_guides/install.md' // title = the page's H1 in each locale +{ 'Install': 'user_guides/install.md' } // titled (translated via navTranslations) +{ 'User Guides': [ … ] } // group +{ 'About': 'https://levimc.org/about/' } // external +{ text: 'Guide', link: '/guide/quick-start' } // VitePress (root-absolute, locale prefix allowed) +{ text: 'Developer', items: [ … ], collapsed: true } // VitePress group / dropdown +``` + +Home pages: frontmatter `layout: home` with VitePress `hero` (`name`, `text`, `tagline`, `image`, +`actions[{ theme: brand|alt, text, link }]`) and `features[{ title, details, icon?, link? }]`. +`icon` may be a kit sprite name (`grass`, `chest`, `pickaxe`, `map`, `compass`, `emerald`, `diamond`, +`bookQuill`, `torch`, …) or an emoji. Links in frontmatter are resolved like markdown links. + +Generate a starting config from an existing `mkdocs.yml`: +`node kit/scripts/mkdocs-nav.mjs path/to/mkdocs.yml > docs.config.generated.json`. + +### Language behaviour + +* The locale switcher maps the current page to the same page in the target locale (falls back to that + locale's home), and stores the choice in `localStorage['levimc-locale-']`. +* Auto-redirect runs only when the URL is exactly the site root (`base` or `base/index.html`): the stored + choice wins, otherwise the first `navigator.languages` entry that matches a locale (`zh-TW/HK/MO/Hant` + prefer a `zh-HK`-style locale). Deep links are never redirected. + +## Markdown support + +Build-time only (unified → remark-parse + remark-gfm → mdast transforms → remark-rehype → rehype-raw → +kit transforms → Shiki → HTML). No markdown is parsed in the browser. + +* **GFM**: tables, strikethrough, autolinks, task lists; **footnotes** (definitions may contain fenced code); + YAML frontmatter; raw HTML (`
`, `
`, ``, …). +* **Unknown pseudo-tags** such as `Array` are escaped and render literally (MkDocs dropped them; + this is a visible text *improvement*), and are listed as build warnings. +* **MkDocs**: admonitions `!!! type "Title"` (case-insensitive type, optional title, `""` = no title, + 4-space indented bodies with fences/lists/tables/nested admonitions; allowed directly after a paragraph + line), collapsible `??? type` / `???+ type`, pymdownx tabs `=== "Label"` (consecutive blocks form one + set, `===!` starts a new set, `===+` selects), `{#id}` / `{: #id }` heading ids. + Types: note abstract(summary, tldr) info(todo) tip(hint, important) success(check, done) + question(help, faq) warning(caution, attention) failure(fail, missing) danger(error) bug example + quote(cite); unknown types use the note style. +* **VitePress**: containers `::: tip|info|warning|danger|details [Title]` (`{open}` for details), + `::: code-group`, GitHub alerts `> [!NOTE|TIP|IMPORTANT|WARNING|CAUTION]`, `` (kept; `{{ }}` + is never interpolated), fence meta `{1,3-5}` / `[file.js]` / `:line-numbers`. +* **`compat: 'python-markdown'`** (MkDocs sites) reproduces Python-Markdown's block rules so the text and + structure match the live MkDocs output: 4-space list nesting (2–3-space items are siblings), a list + cannot interrupt a paragraph, an un-indented block after a blank line ends the list, an indented + paragraph block inside a list keeps later `-` lines literal, `#Heading` without space, block-level raw + HTML is captured to its closing tag (even inside list items), tables need a blank line before them and + pipes inside code spans don't split cells, and code spans are trimmed. pymdownx extras that are configured but unused + (betterem, caret, mark, tilde, critic, keys, smartsymbols, emoji, arithmatex…) are ignored. +* **Code**: Shiki with the kit's dual themes (all token colours ≥ 4.5:1), class-based tokens, CSS line + numbers (never copied), title bar with the language (pymdownx `auto_title` names) or file name, copy + button. Languages: cpp/c/c++, js/javascript, ts/tsx/jsx, lua, json/jsonc, shell/sh/bash/console, + powershell, bat/batch/cmd, sql, asm, md, cmake, python, yaml, toml, xml/svg, html, css, go, csharp, + ini, diff, rust, java, kotlin; `text`/`log`/unknown → plain. +* **Escapes**: standard CommonMark backslash escapes by default, so `### Observable\` renders — and appears + in the TOC, search, sidebar, prev/next and `` — as `Observable<T>`. All labels use the rendered plain + text (inline code, emphasis and entities resolved). MkDocs printed a stray backslash there + (`Observable\<T>`, Python-Markdown does not escape `<`); `markdown.literalBackslashes: true` reproduces that + byte for byte if ever needed. Heading ids are unaffected (`#observable` either way). +* **Heading ids**: `pymdownx` = Python-Markdown toc + `pymdownx.slugs.slugify(case='lower')` (text → + strip tags → NFC → lowercase → drop chars outside `[\w\- ]` (Unicode) → spaces to `-`, no trimming, + duplicates `_1`, `_2`; "🔑 SQL数据库" → `-sql数据库`). `vitepress` = @mdit-vue slugify (duplicates `-1`). + Verified identical to the live sites on every LeviLamina/LSE page. +* **Links** are rewritten at build time to the target's canonical, base-prefixed URL: relative `.md` + (with/without locale suffix, `./`, `../`, anchors), extensionless VitePress links, root-absolute links + (`/zh-CN/guide/x`), own-origin absolute links. The current page's locale wins when that translation exists + (static-i18n semantics); `x.zh.md` / `/zh-CN/…` pin a locale. External links get + `target="_blank" rel="noopener"`. Unresolvable links and missing anchors are build warnings. + +## Plain Vite apps (levimc.org, pkg.levimc.org) + +``` +<app>/ +├── kit/ vendored +├── index.html <!--app-head--> in <head>, <div id="root"><!--app-html--></div> +├── public/levimc-theme-init.js copy of kit/static/theme-init.js (or inline themeInitScript) +├── src/styles.css @import "../kit/theme/tailwind.css"; @source "./"; +├── src/App.tsx routes; wrap in <ThemeProvider>; <PaintedBackdrop/> <GlobalBar/> … <SiteFooter/> +├── src/entry-client.tsx hydrateRoot(…, <BrowserRouter><App/></BrowserRouter>) +├── src/entry-server.tsx export function render(url) { return { html, head, lang } } +├── prerender.mjs prerenderRoutes({ routes, notFound }) +└── vite.config.ts plugins: [react(), tailwindcss()] +``` + +`index.html` head: the theme init script must run before CSS paints (blocking `<script src="/levimc-theme-init.js">` +or an inline `<script>` with `themeInitScript`), then the fonts (`FONT_HEAD_HTML` from `kit/components/fonts.ts`): +preconnect to fonts.googleapis.com / fonts.gstatic.com and the css2 URL for Inter, Fraunces, Silkscreen, +JetBrains Mono (`display=swap`). CJK uses the system stack — never ship a CJK webfont. + +```tsx +// src/entry-server.tsx +import { renderToString } from 'react-dom/server'; +import { StaticRouter } from 'react-router'; +import { App } from './App'; +export function render(url: string) { + const html = renderToString(<StaticRouter location={url}><App /></StaticRouter>); + return { html, head: `<title>…`, lang: 'en' }; +} +``` + +```js +// prerender.mjs +import { prerenderRoutes } from './kit/ssg/prerender.mjs'; +await prerenderRoutes({ + routes: ['/', '/projects/', '/features/', '/community/', '/about/', '/support/'], // levimc.org + // pkg.levimc.org: routes: async () => ['/', ...(await listTeeth()).map((t) => `/packages/${t}/`)], + notFound: '/404', +}); +``` + +Build: `vite build && vite build --ssr src/entry-server.tsx --outDir .kit/ssr && node prerender.mjs` +(`npm run ssg:build` in `package.template.json`). Routes are written directory-style (`/about/` → +`about/index.html`); use trailing-slash routes in react-router (`path="/about/"`) and link to them exactly +(the canonical URLs in `components/projects.ts` all end in `/`). `prerenderRoutes` also writes `404.html` +and `.nojekyll`. Verified with a two-route example app (hydration without warnings). + +## Components + +All components are SSR-safe and render identical markup on server and client. + +| Component | Purpose / key props | +|---|---| +| `GlobalBar` | cross-site bar: `current` (`'home'\|'projects'\|'docs'\|'packages'\|'community'\|'blog'\|'about'`), `currentDocs`, `locale`, `end` (extra controls). `
` dropdowns work without JS; mobile collapses into a sites menu | +| `SiteFooter` | grass horizon over soil: docs projects, ecosystem, Discord/Telegram/X/YouTube/email/GitHub, `© LeviMC`, "Not affiliated with Mojang Studios."; `extra`, `year`, `locale` | +| `ThemeToggle` | one button with 16×16 sun / moon / monitor ("system") sprites and a Minecraft item tooltip ("Theme: Dark — Switch theme"), both chosen by CSS from `html[data-theme-pref]` (correct on first paint, no mismatch); `aria-label` reflects the state after hydration; cycle system → opposite → other → system | +| `LocaleSwitcher` | `options[{code,label,lang,href}]`, `current`, `onSelect`, `linkComponent` | +| `PaintedBackdrop` | fixed impressionist dabs + brush + grain; optional painted scene band at the page top | +| `PaintedHero` | painted pond with block-built Japanese bridge (light) / harbour sunrise with pixel boats (dark), AA scrim, grass horizon; `eyebrow name text tagline actions image linkComponent` | +| `PixelButton` | Minecraft bevel button: `variant` default/primary/ghost, `size`, `icon`, `iconRight`, `href` | +| `Card` | stepped-corner card with sprite in an inventory slot; `title description icon eyebrow href footer` | +| `Badge` | `tone` grass/diamond/gold/redstone/enchant/stone/pond, `pixel` (Silkscreen, Latin only) | +| `Tooltip` | Minecraft item tooltip on hover/focus (`aria-describedby`) | +| `HotbarTabs`, `Pagination` | hotbar-style tabs (WAI-ARIA keyboard) and numbered pagination (crawlable hrefs) | +| `PixelIcon`, `BrandIcon` | 16×16 crisp sprites (`PIXEL_ICONS`); vector brand marks for social links | +| `theme.ts` | `ThemeProvider`, `useTheme()`, `themeInitScript`, `createThemeInitScript({ doxygen })`, `applyThemePreference`, key `levimc-theme` | +| `projects.ts` | `LINKS`, `DOCS_PROJECTS`, `SOCIAL`, `globalNav()` — the redirect-free canonical cross-site URLs | +| `i18n.ts` | `uiStrings(lang)`, `resolveUiLocale(tag)` for en, zh-CN, zh-HK, es, ru, de, ja, ko, fr | + +Stable test hooks: `data-kit-theme-toggle`, `data-kit-locale-switcher`, `data-kit-search-trigger`, +`data-kit-nav-toggle`, `data-kit-copy`, `data-kit-tabs`, `data-doc-content` (wraps rendered markdown only), +`data-kit-globalbar`, `data-kit-footer`, `data-kit-hero`. + +Canonical cross-site URLs (exact, no redirect): Home `https://levimc.org/`, Projects +`https://levimc.org/projects/`, Community `https://levimc.org/community/`, About `https://levimc.org/about/`, +Packages `https://pkg.levimc.org/`, Blog `https://blog.levimc.org/`, GitHub `https://github.com/LiteLDev`, +Docs `https://docs.levimc.org/{LeviLamina,LegacyScriptEngine,lip,LeviLauncher,LeviLaunchroid}/`, +Discord `https://discord.gg/v5R5P4vRZk`, Telegram `https://t.me/LiteLoader`, X `https://x.com/levimc_org`, +YouTube `https://www.youtube.com/@LeviLamina`, `mailto:contact@levimc.org`. lip's repository is +`https://github.com/LiteLDev/lip` (`futrime/lip` redirects). + +## Static chrome & Doxygen + +`static/` is prebuilt — consumers copy files, no build needed: + +* `kit.css` — full theme incl. Tailwind preflight (standalone pages). `kit-chrome.css` — only the chrome, + no preflight, cascade layers flattened so it can sit next to foreign CSS (Doxygen). +* `globalbar.html`, `footer.html` (+ `i18n/*..html`) — rendered from the React components. +* `kit.js` — vanilla theme toggle and menus. `theme-init.js` / `theme-init-doxygen.js` — blocking head scripts. +* `pages/index.html` (docs.levimc.org root → levimc.org redirect, with project cards) and `pages/404.html` + reference assets under `/levimc-kit/` (copy `kit.css`, `kit.js`, `icons/`, `grass.svg` there). + +**LeviLamina Doxygen** (`docs/api/`): copy `static/doxygen/header.html` → `docs/api/header.html`, +`static/doxygen/footer.html` → `docs/api/footer.html`, and set in the Doxyfile: + +``` +HTML_HEADER = docs/api/header.html +HTML_FOOTER = docs/api/footer.html +HTML_EXTRA_STYLESHEET = docs/api/doxygen-awesome-css/doxygen-awesome.css kit/static/kit-chrome.css kit/static/doxygen/doxygen-kit.css +HTML_EXTRA_FILES = kit/static/kit.js +``` + +Drop `doxygen-awesome-darkmode-toggle.js` (kit.js owns the theme and keeps `html.dark-mode` / +`html.light-mode` in sync for doxygen-awesome v2.4.1). Verified with doxygen 1.16.1 + doxygen-awesome-css +2.4.1 in both themes (`screens/doxygen-*.png`). + +## Verification scripts + +All are Node ESM with no dependencies beyond Playwright (where noted). + +```sh +# GitHub Pages emulation: file → 200, /x → x.html, /x → 301 /x/ for directories, else 404.html (404) +node kit/scripts/serve-pages.mjs dist --base /LeviLamina/ --port 4173 + +# internal links (+ redirects + #anchors); --external checks every external URL with curl +node kit/scripts/linkcheck.mjs dist --base /LeviLamina/ --site-origin https://docs.levimc.org \ + [--external] [--allow-redirect-hosts aka.ms,discord.gg,qm.qq.com] [--ignore-paths /LeviLamina/api/] [--json out.json] + +# every live URL (sitemap.xml, else crawl) must answer 200 with 0 redirects locally; +# --anchors also requires every live heading id (old #deep-links) to exist on the local page +node kit/scripts/url-parity.mjs --live https://docs.levimc.org/LeviLamina/ --local http://127.0.0.1:4173/LeviLamina/ --anchors + +# word-level text diff of the main content, live vs local (Playwright) +node kit/scripts/text-parity.mjs --live https://docs.levimc.org/LeviLamina/ --local http://127.0.0.1:4173/LeviLamina/ \ + [--paths a/,b/ | --paths-file f] [--live-selector 'article.md-content__inner' | '.vp-doc'] [--json out.json] + # a path may differ per side: --paths 'daemon/overview.html=>daemon/overview/' + +# browser smoke test (Playwright) +node kit/scripts/smoke.mjs --url http://127.0.0.1:4173/LeviLamina/ [--search-term hook] [--pages a/,b/,c/] + +node kit/scripts/shot.mjs [light|dark] [w] [h] [--full] +``` + +External link verdicts: `ok`, `ok-redirect` (`/releases/latest` and allow-listed hosts), `ok-auth` +(GitHub edit links redirect to sign-in), `redirect` (update the link to the final URL), `blocked` +(403/429 bot walls — verify by hand), `broken`, `error`. + +## Design rules — do / don't + +**Do** +* Use semantic tokens (`bg-canvas`, `text-ink`, `text-muted`, `border-line`, `text-link`, `bg-primary-strong`, + `--color-adm-*`) — never raw hex in app code; dark mode then comes for free. +* Keep painterly effects in heroes, backdrops, margins and cards' backgrounds; keep text on calm canvas. +* Use the pixel vocabulary for interactive things: `mc-btn` for actions, `hotbar` for tab sets / pagination / + segmented controls, `kit-slot` for icons, `px-corners` / `px-card` for frames, `mc-kbd` for keys. +* Use sprites at 16 or 32 px (crisp multiples). Use Fraunces only for display headings (H1, hero, section + titles), Silkscreen only for short Latin labels (badges, eyebrows, versions — never CJK, never body copy). +* Keep each project's own logo; the kit provides the shared chrome around it. +* Link to the canonical, redirect-free URLs (trailing slash for directories); run `linkcheck --external`. +* Respect `prefers-reduced-motion` (all kit animations stop) and keep focus visible (`--color-focus`). + +* Lay pages out as `.kit-shell` (min-height 100dvh flex column) → header → `
` (grows) → `SiteFooter`, so + the footer is flush with the bottom on short pages; give flex/grid children that hold text `min-width: 0` + (kit components already do: cards, search results, sidebar, TOC, pager, admonition titles wrap long URLs, + identifiers and CJK/emoji runs). + +**Don't** +* Don't round corners or add soft drop shadows to controls — pixel frames and the 2px "pixel drop" only. +* Don't put painted scenes or brush texture behind body text, code or tables. +* Don't ship CJK webfonts, recolour sprites, or add new display typefaces. +* Don't render dates/random values differently on server and client (hydration); format dates with + `timeZone: 'UTC'` like the kit does. +* Don't edit vendored `kit/` files. + +## Porting checklist: MkDocs sites (LeviLamina, LegacyScriptEngine) + +1. Vendor the kit; add `package.json` (template), `tsconfig.json`, `vite.config.ts`, `.gitignore`. +2. `node kit/scripts/mkdocs-nav.mjs mkdocs.yml` → paste into `docs.config.ts`. Keep `urlStyle: 'directory'`, + `i18n.mode: 'suffix'` (locales `en` default + `zh`, `lang: 'zh'` like the live site), `slug: 'pymdownx'`, + `markdown.compat: 'python-markdown'`, `sidebar: 'tabs'`, `hostname`/`sitemap: { hostname: 'https://docs.levimc.org' }`. +3. `exclude: ['overrides/**']` (theme overrides are not content). Delete `mkdocs.yml`, `requirements.txt`, + `overrides/` once the port is merged (the language-redirect script there is replaced by the kit's). +4. `logo`/`favicon` paths stay as in `theme.logo`/`theme.favicon` (they are copied verbatim). +5. `editLink: 'https://github.com/LiteLDev//edit///:path'`. +6. Fix nav entries pointing at external own-site URLs: `https://docs.levimc.org/LeviLamina/api` → + `https://docs.levimc.org/LeviLamina/api/`; `https://levimc.org/about` → `https://levimc.org/about/`. +7. `npm run build` — fix every warning (unresolved links, missing anchors). Known in LeviLamina today: + `build_guide(.zh).md` links `architecture.md` (should be `../architecture.md`) and + `how_to_guides/testing_guide.md` (missing page). +8. Serve, then: `linkcheck` (0 internal errors; `--ignore-paths /LeviLamina/api` because Doxygen is merged + later in CI), `linkcheck --external` (fix `redirect`/`broken`), `url-parity --anchors` (all live URLs 200, + 0 redirects, every old #anchor present), `text-parity` (expect only the documented differences below), `smoke`. + + Reference results for the unmodified upstream content built with this kit (kit 1.0.0): + LeviLamina — 88 pages, URL parity 88/88 + all 1106 heading anchors, text parity 99.978 % (74/87 pages + identical; 12 of the 13 differences are only MkDocs' stray backslash before `<` — `Observable\`, + `Overload\`, `CoroTask\`, `Generator\`, `Listener\`, `Cancellable\`, `Expected\`, + `\<=1.7.5` — which the kit renders as the author wrote them; with `markdown.literalBackslashes: true` it is + 86/87 identical, 99.998 %). LegacyScriptEngine — 92 pages, URL parity 92/92 + all 1537 anchors, text parity + 80/91 identical (99.977 %, every remaining difference listed under Known limitations). +9. CI: replace the mkdocs job with `npm ci && npm run build`; keep the Doxygen job and merge + `site/api` into `dist/api` as before (header/footer/CSS from `kit/static/doxygen`). + +## Porting checklist: VitePress sites (lip, LeviLauncher, LeviLaunchroid) + +1. Vendor; add the four files. `contentDir: 'docs'`, `urlStyle: 'html'`, `cleanUrls` as in the old config + (LeviLauncher: `true`; lip: `false`), `i18n.mode: 'folder'` with the old locales (`root` → default with + `prefix: ''`; `zh-CN`, `zh-HK`, `es-ES`, … with `prefix: '/'`), `slug: 'vitepress'`, + `markdown.compat: 'commonmark'`. +2. Move `themeConfig.nav` → `nav: { [locale]: … }`, `themeConfig.sidebar` → `sidebar: { [locale]: … }` (the + builder functions can be pasted as-is; they return the same shapes). `docFooter`/`editLink.text`/labels → + `ui` or `editLink.text`. `head` stays VitePress-shaped. `public/` is picked up automatically. +3. Remove the inline language-redirect ` + + diff --git a/kit/docs/app/layout-api.ts b/kit/docs/app/layout-api.ts new file mode 100644 index 00000000..0e894876 --- /dev/null +++ b/kit/docs/app/layout-api.ts @@ -0,0 +1,14 @@ +// Public API for custom page layouts (config.layouts → frontmatter `layout: `). +import type { PageData, RouteMeta, SiteData } from '../shared/types'; +import type { UiStrings } from '../../components/i18n'; + +export interface CustomLayoutProps { + route: RouteMeta; + page: PageData; + site: SiteData; + t: UiStrings; +} + +export { KitLink } from './components/KitLink'; +export { useContentEnhancements } from './enhance'; +export { href, site } from './data'; diff --git a/kit/docs/app/layouts/DocLayout.tsx b/kit/docs/app/layouts/DocLayout.tsx new file mode 100644 index 00000000..9019cfb7 --- /dev/null +++ b/kit/docs/app/layouts/DocLayout.tsx @@ -0,0 +1,57 @@ +import { useRef } from 'react'; +import type { PageData, RouteMeta } from '../../shared/types'; +import { langOf, site } from '../data'; +import { Sidebar } from '../components/Sidebar'; +import { Toc, TocList, useActiveHeading } from '../components/Toc'; +import { DocFooter } from '../components/DocFooter'; +import { useContentEnhancements } from '../enhance'; +import { PixelIcon } from '../../../components/PixelIcon'; +import type { UiStrings } from '../../../components/i18n'; + +function MobileToc({ page, t }: { page: PageData; t: UiStrings }) { + const active = useActiveHeading(page.toc.map((x) => x.id)); + const ref = useRef(null); + if (!page.toc.length) return null; + return ( +
+ + {t.onThisPage} + + + ref.current && (ref.current.open = false)} /> +
+ ); +} + +export function DocLayout({ route, page, t }: { route: RouteMeta; page: PageData; t: UiStrings }) { + const contentRef = useRef(null); + useContentEnhancements(contentRef, route.page); + const sidebar = route.sidebar ? site.sidebars[route.sidebar] : undefined; + const contentLang = route.fallback ? langOf(site.defaultLocale) : langOf(route.locale); + const showToc = page.toc.length > 0 && page.frontmatter?.aside !== false; + // With a sidebar the TOC column is always reserved, so the text column never jumps between pages. + const tocColumn = showToc || !!sidebar; + return ( +
+ {sidebar ? ( + + ) : null} +
+ {showToc ? : null} +
+
+
+ +
+ {tocColumn ? ( + + ) : null} +
+ ); +} diff --git a/kit/docs/app/layouts/HomeLayout.tsx b/kit/docs/app/layouts/HomeLayout.tsx new file mode 100644 index 00000000..eeb807b1 --- /dev/null +++ b/kit/docs/app/layouts/HomeLayout.tsx @@ -0,0 +1,60 @@ +import { useRef } from 'react'; +import type { PageData, RouteMeta } from '../../shared/types'; +import { langOf, site } from '../data'; +import { KitLink } from '../components/KitLink'; +import { useContentEnhancements } from '../enhance'; +import { PaintedHero } from '../../../components/PaintedHero'; +import { Card } from '../../../components/Card'; +import { PIXEL_ICONS, type PixelIconName } from '../../../components/pixel-icons'; +import type { UiStrings } from '../../../components/i18n'; + +const FEATURE_ICONS: PixelIconName[] = ['map', 'chest', 'emerald', 'pickaxe', 'compass', 'diamond', 'bookQuill', 'torch', 'grass']; + +export function HomeLayout({ route, page }: { route: RouteMeta; page: PageData; t: UiStrings }) { + const contentRef = useRef(null); + useContentEnhancements(contentRef, route.page); + const hero = page.hero ?? {}; + const features = page.features ?? []; + return ( +
+ + {features.length ? ( +
+
+ {features.map((f, i) => { + const icon = (f.icon && f.icon in PIXEL_ICONS ? f.icon : FEATURE_ICONS[i % FEATURE_ICONS.length]) as PixelIconName; + return ( + {f.icon} : icon} + title={f.title} + description={f.details} + href={f.link} + external={f.external} + linkComponent={KitLink} + /> + ); + })} +
+
+ ) : null} + {page.html.trim() ? ( +
+
+
+
+
+ ) : ( +
+ ); +} diff --git a/kit/docs/app/layouts/NotFound.tsx b/kit/docs/app/layouts/NotFound.tsx new file mode 100644 index 00000000..f3d56a74 --- /dev/null +++ b/kit/docs/app/layouts/NotFound.tsx @@ -0,0 +1,29 @@ +import { href, site } from '../data'; +import { KitLink } from '../components/KitLink'; +import { PixelIcon } from '../../../components/PixelIcon'; +import type { UiStrings } from '../../../components/i18n'; + +export function NotFound({ locale, t, onSearch }: { locale: string; t: UiStrings; onSearch: () => void }) { + return ( +
+
+ +

Error 404

+

{t.notFoundTitle}

+

{t.notFoundText}

+
+ + + {t.goHome} + + +
+
+
+ ); +} diff --git a/kit/docs/app/styles.css b/kit/docs/app/styles.css new file mode 100644 index 00000000..713aaca9 --- /dev/null +++ b/kit/docs/app/styles.css @@ -0,0 +1,6 @@ +/* Docs app stylesheet: Tailwind v4 + levimc-kit theme + docs layout + generated Shiki token colours. */ +@import "tailwindcss"; +@import "../../theme/index.css"; +@import "./docs.css"; +@source "../../components"; +@source "./"; diff --git a/kit/docs/app/virtual.d.ts b/kit/docs/app/virtual.d.ts new file mode 100644 index 00000000..7620e732 --- /dev/null +++ b/kit/docs/app/virtual.d.ts @@ -0,0 +1,10 @@ +// Types for the virtual modules provided by kit/docs/node/vite.ts (typed precisely in app/data.ts). +declare module 'virtual:kit-docs/site' { + export const site: unknown; + export const routes: unknown; + export const pages: unknown; +} +declare module 'virtual:kit-docs/layouts' { + export const layouts: unknown; +} +declare module 'virtual:kit-docs/tokens.css'; diff --git a/kit/docs/build.mjs b/kit/docs/build.mjs new file mode 100644 index 00000000..7b61301e --- /dev/null +++ b/kit/docs/build.mjs @@ -0,0 +1,19 @@ +#!/usr/bin/env node +// One-shot production build for a levimc-kit docs site: +// 1. client build (vite build) → dist/ +// 2. SSR build (vite build --ssr) → .kit/ssr/entry-server.js +// 3. prerender (react-dom/server) → dist/**/index.html, 404.html (+ sitemap.xml, .nojekyll, search indexes from step 1) +// Usage: node kit/docs/build.mjs [--config vite.config.ts] +import { resolve } from 'node:path'; +import { build } from 'vite'; +import { prerenderDocs } from './prerender.mjs'; + +const args = process.argv.slice(2); +const configFile = args.includes('--config') ? resolve(args[args.indexOf('--config') + 1]) : undefined; +const root = process.cwd(); +const t0 = Date.now(); + +await build({ configFile, root, logLevel: 'warn' }); +await build({ configFile, root, logLevel: 'warn', build: { ssr: true } }); +const { count } = await prerenderDocs({ root }); +console.log(`[kit-docs] built ${count} pages in ${((Date.now() - t0) / 1000).toFixed(1)} s`); diff --git a/kit/docs/node/config.ts b/kit/docs/node/config.ts new file mode 100644 index 00000000..47db6a8f --- /dev/null +++ b/kit/docs/node/config.ts @@ -0,0 +1,262 @@ +// levimc-kit docs engine — configuration API. +// +// // docs.config.ts +// import { defineDocsConfig } from './kit/docs/node/config'; +// export default defineDocsConfig({ base: '/LeviLamina/', title: 'LeviLamina', contentDir: 'docs/main/contents', … }); +// +// See README.md ("Site config API") for every option with MkDocs / VitePress equivalents. + +import { existsSync } from 'node:fs'; +import { isAbsolute, join, resolve } from 'node:path'; +import type { UiStrings } from '../../components/i18n.ts'; + +export type I18nMode = 'suffix' | 'folder'; + +export interface LocaleConfig { + /** Locale code used in config maps (nav per locale…), e.g. 'en', 'zh', 'zh-CN'. */ + code: string; + /** Native display name, e.g. 'English', '中文', '简体中文'. */ + label: string; + /** BCP-47 tag for and hreflang, e.g. 'en', 'zh-CN'. Defaults to `code`. */ + lang?: string; + /** URL prefix relative to base ('' for the default locale; 'zh/' …). Defaults to '' / `${code}/`. */ + prefix?: string; + /** suffix mode: file suffix (x..md). Defaults to `code`. folder mode: folder name (defaults to prefix without '/'). */ + suffix?: string; + folder?: string; +} + +/** + * Navigation entry. Accepts MkDocs nav semantics and VitePress objects: + * 'user_guides/install.md' page, title = the page's H1 in each locale + * { 'Install': 'user_guides/install.md' } titled page (MkDocs) + * { 'User Guides': [ … ] } group (MkDocs) + * { text: 'Guide', link: '/guide/quick-start' } (VitePress), external links allowed + * { text: 'Developer', items: [ … ], collapsed?: boolean } + */ +export type NavEntry = + | string + | { text?: string; link: string; activeMatch?: string } + | { text: string; items: NavEntry[]; link?: string; collapsed?: boolean } + | { [title: string]: string | NavEntry[] }; + +/** VitePress-style sidebar: one list, or a map of path prefix → list (multi-sidebar). */ +export type SidebarConfig = NavEntry[] | Record; + +export type HeadTag = [tag: string, attrs: Record, content?: string]; + +export interface DocsConfig { + /** Public base path with leading and trailing slash, e.g. '/LeviLamina/'. */ + base: string; + /** Site title (header, suffix). */ + title: string; + description?: string; + /** Project logo (path relative to base, e.g. '/logo.svg' or 'img/logo.png'). Each project keeps its own. */ + logo?: string | { src: string; alt?: string; dark?: string }; + favicon?: string; + /** Which docs project this is (highlights it in the GlobalBar). Defaults to the base segment. */ + project?: string; + /** Repository URL (GitHub link in the header). */ + repo?: string; + /** + * Edit link: a pattern with :path (path relative to contentDir), e.g. + * 'https://github.com/LiteLDev/LeviLamina/edit/develop/docs/main/contents/:path', or a function + * (source path) → URL | undefined (evaluated at build time). `text` overrides the label per locale. + */ + editLink?: string | { pattern: string | ((source: string) => string | undefined); text?: Record<string, string> }; + /** Markdown root, relative to the config file (MkDocs docs_dir / VitePress srcDir). */ + contentDir: string; + /** Static files copied verbatim (VitePress public/). Default: '<contentDir>/public' if it exists. */ + publicDir?: string | false; + /** Copy every non-markdown file of contentDir verbatim (MkDocs behaviour). Default: true for urlStyle 'directory'. */ + copyContentAssets?: boolean; + i18n?: { + mode: I18nMode; + defaultLocale: string; + locales: LocaleConfig[]; + /** Build default-locale content at localized URLs when a translation is missing. Default: true (suffix), false (folder). */ + fallback?: boolean; + }; + /** 'directory' (MkDocs: a/b.md → a/b/) or 'html' (VitePress: a/b.md → a/b.html). */ + urlStyle?: 'directory' | 'html'; + /** html style only: link to a/b instead of a/b.html (VitePress cleanUrls). */ + cleanUrls?: boolean; + /** Heading id algorithm. */ + slug?: 'pymdownx' | 'vitepress'; + markdown?: { + /** 'python-markdown' reproduces Python-Markdown block rules (4-space list nesting, raw HTML blocks…). */ + compat?: 'python-markdown' | 'commonmark'; + /** Show line numbers on multi-line code blocks (default true). */ + lineNumbers?: boolean; + /** Code title bar label: Pygments lexer names like pymdownx auto_title ('pygments'), the raw language ('lang') or none. */ + codeTitle?: 'pygments' | 'lang' | 'none'; + /** Extra language aliases, e.g. { xmake: 'lua' }. */ + languageAlias?: Record<string, string>; + /** Default admonition titles: MkDocs capitalised type ('Note') or VitePress labels ('TIP'). */ + admonitionTitles?: 'mkdocs' | 'vitepress'; + /** MkDocs Material: pages without an H1 get one from their nav title (or file name). Default: true for python-markdown. */ + autoTitle?: boolean; + /** + * python-markdown compat only: reproduce Python-Markdown's limited escape set literally (`\<T\>` → "\<T>", + * as the live MkDocs sites print it). Default false: CommonMark escapes, i.e. the author's intent ("<T>"). + */ + literalBackslashes?: boolean; + /** Which container syntaxes are recognised. Default: MkDocs (!!! ??? ===) for python-markdown, VitePress (:::) for commonmark. */ + containers?: { mkdocs?: boolean; vitepress?: boolean }; + }; + /** Custom page layouts: frontmatter `layout: <name>` renders the default export of the module (React component). */ + layouts?: Record<string, string>; + /** Header navigation (MkDocs `nav` or VitePress `themeConfig.nav`), shared or per locale code. */ + nav?: NavEntry[] | Record<string, NavEntry[]>; + /** MkDocs nav_translations: locale code → { 'User Guides': '用户指南' }. */ + navTranslations?: Record<string, Record<string, string>>; + /** + * Sidebar: 'tabs' (MkDocs Material navigation.tabs: header shows top-level sections, sidebar shows the + * active section), 'tree' (whole nav), false, or explicit VitePress sidebars (shared or per locale code). + */ + sidebar?: 'tabs' | 'tree' | false | SidebarConfig | Record<string, SidebarConfig>; + /** Globs (relative to contentDir) excluded from the build. */ + exclude?: string[]; + /** Image/asset handling for files referenced from markdown: 'verbatim' (keep path) or 'hashed' (assets/x.hash.ext). */ + assets?: 'verbatim' | 'hashed'; + /** "Last updated" from `git log -1 --format=%ct -- <file>`. Default true. */ + lastUpdated?: boolean; + /** Emit sitemap.xml (with hreflang alternates). */ + sitemap?: { hostname: string } | false; + /** Canonical origin for <link rel=canonical> / og:url. Defaults to sitemap.hostname. */ + hostname?: string; + /** Extra <head> tags: [tag, attrs, content?]. */ + head?: HeadTag[]; + /** Heading levels shown in "On this page" (default [2, 3]). */ + outline?: number | [number, number]; + social?: { icon: 'github' | 'discord' | 'telegram' | 'x' | 'youtube' | 'email'; link: string; label?: string }[]; + footer?: { message?: string; copyright?: string }; + /** Override chrome strings per locale code. */ + ui?: Record<string, Partial<UiStrings>>; + /** <title> template; ':title' and ':site' are replaced. Default ':title | :site'. */ + titleTemplate?: string; + /** Output directory (default 'dist'). */ + outDir?: string; + /** Exclude pages from the search index (globs on page keys). */ + searchExclude?: string[]; +} + +export function defineDocsConfig(config: DocsConfig): DocsConfig { + return config; +} + +// ---------------------------------------------------------------------------------------------- resolved + +export interface ResolvedLocale { + code: string; + label: string; + lang: string; + prefix: string; + suffix: string; + folder: string; + isDefault: boolean; +} + +export interface ResolvedConfig extends Omit<DocsConfig, 'i18n' | 'outline' | 'logo' | 'editLink' | 'markdown'> { + root: string; + contentRoot: string; + publicRoot: string | null; + outRoot: string; + base: string; + siteKey: string; + project: string; + i18nMode: I18nMode; + fallback: boolean; + defaultLocale: string; + locales: ResolvedLocale[]; + urlStyle: 'directory' | 'html'; + cleanUrls: boolean; + slug: 'pymdownx' | 'vitepress'; + markdown: Required<NonNullable<DocsConfig['markdown']>>; + copyContentAssets: boolean; + assets: 'verbatim' | 'hashed'; + lastUpdated: boolean; + outline: [number, number]; + logo?: { src: string; alt: string; dark?: string }; + editLink?: { pattern: string | ((source: string) => string | undefined); text?: Record<string, string> }; + titleTemplate: string; + hostname?: string; +} + +export function resolveConfig(config: DocsConfig, root: string): ResolvedConfig { + let base = config.base || '/'; + if (!base.startsWith('/')) base = '/' + base; + if (!base.endsWith('/')) base += '/'; + const contentRoot = isAbsolute(config.contentDir) ? config.contentDir : resolve(root, config.contentDir); + const urlStyle = config.urlStyle ?? 'directory'; + const mode: I18nMode = config.i18n?.mode ?? 'suffix'; + const defaultLocale = config.i18n?.defaultLocale ?? config.i18n?.locales[0]?.code ?? 'en'; + const locales: ResolvedLocale[] = (config.i18n?.locales ?? [{ code: defaultLocale, label: 'English', lang: 'en' }]).map((l) => { + const isDefault = l.code === defaultLocale; + const prefix = l.prefix ?? (isDefault ? '' : `${l.code}/`); + return { + code: l.code, + label: l.label, + lang: l.lang ?? l.code, + prefix: prefix && !prefix.endsWith('/') ? prefix + '/' : prefix, + suffix: l.suffix ?? l.code, + folder: l.folder ?? prefix.replace(/\/$/, ''), + isDefault, + }; + }); + // default locale first + locales.sort((a, b) => Number(b.isDefault) - Number(a.isDefault)); + + let publicRoot: string | null = null; + if (config.publicDir !== false) { + const p = config.publicDir ? resolve(root, config.publicDir) : join(contentRoot, 'public'); + if (existsSync(p)) publicRoot = p; + } + // MkDocs Material lists every heading level in its TOC; VitePress defaults to [2, 3]. + const compatEarly = config.markdown?.compat ?? (urlStyle === 'directory' ? 'python-markdown' : 'commonmark'); + const outline = + config.outline === undefined ? (compatEarly === 'python-markdown' ? [2, 4] : [2, 3]) : typeof config.outline === 'number' ? [config.outline, config.outline] : config.outline; + const logo = typeof config.logo === 'string' ? { src: config.logo, alt: config.title } : config.logo ? { alt: config.title, ...config.logo } : undefined; + const editLink = typeof config.editLink === 'string' ? { pattern: config.editLink } : config.editLink; + const siteKey = base.replace(/^\/|\/$/g, '') || 'root'; + const compat = config.markdown?.compat ?? (urlStyle === 'directory' ? 'python-markdown' : 'commonmark'); + return { + ...config, + root, + contentRoot, + publicRoot, + outRoot: resolve(root, config.outDir ?? 'dist'), + base, + siteKey, + project: config.project ?? siteKey, + i18nMode: mode, + fallback: config.i18n?.fallback ?? mode === 'suffix', + defaultLocale, + locales, + urlStyle, + cleanUrls: config.cleanUrls ?? false, + slug: config.slug ?? (compat === 'python-markdown' ? 'pymdownx' : 'vitepress'), + markdown: { + compat, + lineNumbers: config.markdown?.lineNumbers ?? true, + codeTitle: config.markdown?.codeTitle ?? (compat === 'python-markdown' ? 'pygments' : 'lang'), + languageAlias: config.markdown?.languageAlias ?? {}, + admonitionTitles: config.markdown?.admonitionTitles ?? (compat === 'python-markdown' ? 'mkdocs' : 'vitepress'), + autoTitle: config.markdown?.autoTitle ?? compat === 'python-markdown', + literalBackslashes: config.markdown?.literalBackslashes ?? false, + containers: { + mkdocs: config.markdown?.containers?.mkdocs ?? compat === 'python-markdown', + vitepress: config.markdown?.containers?.vitepress ?? compat === 'commonmark', + }, + }, + layouts: Object.fromEntries(Object.entries(config.layouts ?? {}).map(([k, v]) => [k, isAbsolute(v) ? v : resolve(root, v)])), + copyContentAssets: config.copyContentAssets ?? urlStyle === 'directory', + assets: config.assets ?? (urlStyle === 'directory' ? 'verbatim' : 'hashed'), + lastUpdated: config.lastUpdated ?? true, + outline: outline as [number, number], + logo, + editLink, + titleTemplate: config.titleTemplate ?? ':title | :site', + hostname: (config.hostname ?? (config.sitemap ? config.sitemap.hostname : undefined))?.replace(/\/$/, ''), + }; +} diff --git a/kit/docs/node/content.ts b/kit/docs/node/content.ts new file mode 100644 index 00000000..52e687a0 --- /dev/null +++ b/kit/docs/node/content.ts @@ -0,0 +1,182 @@ +// Content discovery: markdown pages (with locale detection for mkdocs-static-i18n "suffix" mode and +// VitePress "folder" mode), routes (MkDocs directory URLs or VitePress .html URLs) and static assets. + +import { readdirSync, statSync } from 'node:fs'; +import { dirname, join, posix, relative, resolve, sep } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import picomatch from 'picomatch'; +import type { ResolvedConfig, ResolvedLocale } from './config.ts'; + +export interface SourceFile { + /** Path relative to contentDir (posix). */ + rel: string; + abs: string; + /** Page key: rel without .md and without locale suffix/folder. */ + key: string; + /** Locale whose content this file holds. */ + locale: string; + /** True when the locale was written explicitly (x.zh.md / zh-CN/x.md / x.en.md). */ + explicitLocale: boolean; +} + +export interface PageRoute { + /** Unique id = `${locale}:${key}` */ + id: string; + key: string; + locale: string; + /** Canonical URL path relative to base ('' = root). */ + path: string; + /** Output file relative to outDir. */ + file: string; + source: SourceFile; + fallback: boolean; +} + +const ALWAYS_EXCLUDE = ['**/node_modules/**', '**/.*/**', '**/.*', '.vitepress/**', 'public/**']; +/** The vendored kit folder (…/kit), wherever it is. */ +const KIT_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '../..'); + +/** Folders inside contentDir that are never content: the vendored kit and the build output. */ +function implicitExcludes(cfg: ResolvedConfig): string[] { + const out: string[] = []; + for (const dir of [KIT_ROOT, cfg.outRoot, join(cfg.root, '.kit')]) { + const rel = relative(cfg.contentRoot, dir); + if (rel && !rel.startsWith('..') && !rel.startsWith(sep) && !rel.includes(':')) out.push(rel.split(sep).join('/') + '/**'); + } + return out; +} + +export function walk(dir: string, base = dir, out: string[] = []): string[] { + let entries: string[]; + try { + entries = readdirSync(dir); + } catch { + return out; + } + for (const name of entries.sort()) { + const abs = join(dir, name); + const st = statSync(abs); + if (st.isDirectory()) walk(abs, base, out); + else out.push(posix.normalize(abs.slice(base.length + 1).split('\\').join('/'))); + } + return out; +} + +export interface ContentScan { + sources: SourceFile[]; + /** rel path → source (for link resolution). */ + bySource: Map<string, SourceFile>; + /** Non-markdown files (rel paths). */ + assets: string[]; + routes: PageRoute[]; + /** key → locale → route */ + byKey: Map<string, Map<string, PageRoute>>; + /** canonical path → route */ + byPath: Map<string, PageRoute>; +} + +export function scanContent(cfg: ResolvedConfig): ContentScan { + const isExcluded = picomatch([...ALWAYS_EXCLUDE, ...implicitExcludes(cfg), ...(cfg.exclude ?? [])], { dot: true }); + const files = walk(cfg.contentRoot).filter((f) => !isExcluded(f)); + const md = files.filter((f) => f.toLowerCase().endsWith('.md')); + const assets = files.filter((f) => !f.toLowerCase().endsWith('.md')); + const def = cfg.locales.find((l) => l.isDefault)!; + + const sources: SourceFile[] = []; + for (const rel of md) { + let key = rel.slice(0, -3); + let locale = def.code; + let explicit = false; + if (cfg.i18nMode === 'suffix') { + const m = /^(.*)\.([A-Za-z]{2,3}(?:[-_][A-Za-z0-9]+)?)$/.exec(key); + const loc = m ? cfg.locales.find((l) => l.suffix === m[2]) : undefined; + if (m && loc) { + key = m[1]!; + locale = loc.code; + explicit = true; + } + } else { + const first = key.split('/')[0]!; + const loc = cfg.locales.find((l) => !l.isDefault && l.folder === first); + if (loc && key.includes('/')) { + key = key.slice(first.length + 1); + locale = loc.code; + explicit = true; + } + } + // MkDocs: README.md is the directory index (index.md wins when both exist). + if (cfg.urlStyle === 'directory' && /(^|\/)README$/.test(key)) key = key.replace(/README$/, 'index'); + sources.push({ rel, abs: join(cfg.contentRoot, rel), key, locale, explicitLocale: explicit }); + } + + const byKeyLoc = new Map<string, SourceFile>(); + for (const s of sources) { + const id = `${s.locale}:${s.key}`; + const prev = byKeyLoc.get(id); + if (prev) { + // prefer index.md over README.md, and x.md over x.en.md for the default locale + const sIsReadme = /(^|\/)README(\.[^/]+)?\.md$/.test(s.rel); + const prevIsReadme = /(^|\/)README(\.[^/]+)?\.md$/.test(prev.rel); + const prefer = (prevIsReadme && !sIsReadme) || (!s.explicitLocale && prev.explicitLocale && sIsReadme === prevIsReadme); + if (!prefer) continue; + } + byKeyLoc.set(id, s); + } + const unique = [...byKeyLoc.values()]; + const bySource = new Map<string, SourceFile>(); + for (const s of sources) bySource.set(s.rel, byKeyLoc.get(`${s.locale}:${s.key}`) ?? s); + + const routes: PageRoute[] = []; + const byKey = new Map<string, Map<string, PageRoute>>(); + const byPath = new Map<string, PageRoute>(); + const add = (r: PageRoute) => { + if (byPath.has(r.path)) return; + routes.push(r); + byPath.set(r.path, r); + if (!byKey.has(r.key)) byKey.set(r.key, new Map()); + byKey.get(r.key)!.set(r.locale, r); + }; + const keys = [...new Set(unique.map((s) => s.key))].sort(); + for (const key of keys) { + for (const loc of cfg.locales) { + const own = byKeyLoc.get(`${loc.code}:${key}`); + const fallbackSrc = loc.isDefault ? undefined : byKeyLoc.get(`${def.code}:${key}`); + const src = own ?? (cfg.fallback ? fallbackSrc : undefined); + if (!src) continue; + const { path, file } = routeFor(cfg, key, loc); + add({ id: `${loc.code}:${key}`, key, locale: loc.code, path, file, source: src, fallback: !own }); + } + } + return { sources, bySource, assets, routes, byKey, byPath }; +} + +export function routeFor(cfg: ResolvedConfig, key: string, loc: ResolvedLocale): { path: string; file: string } { + let rel: string; + let file: string; + const isIndex = /(^|\/)index$/.test(key) || (cfg.urlStyle === 'directory' && /(^|\/)README$/.test(key)); + const dir = key.replace(/(^|\/)(index|README)$/, '$1'); + if (isIndex) { + rel = dir; + file = dir + 'index.html'; + } else if (cfg.urlStyle === 'directory') { + rel = key + '/'; + file = key + '/index.html'; + } else { + rel = cfg.cleanUrls ? key : key + '.html'; + file = key + '.html'; + } + return { path: loc.prefix + rel, file: loc.prefix + file }; +} + +/** Normalise a pathname (relative to base) to the canonical route path it would be served for. */ +export function normalizeRoutePath(p: string, cfg: Pick<ResolvedConfig, 'urlStyle' | 'cleanUrls'>): string[] { + const out = new Set<string>([p]); + if (p.endsWith('index.html')) out.add(p.slice(0, -'index.html'.length)); + if (p.endsWith('.html')) out.add(p.slice(0, -5)); + if (!p.endsWith('/') && !p.endsWith('.html')) { + out.add(p + '/'); + out.add(p + '.html'); + } + void cfg; + return [...out]; +} diff --git a/kit/docs/node/git.ts b/kit/docs/node/git.ts new file mode 100644 index 00000000..6113feb0 --- /dev/null +++ b/kit/docs/node/git.ts @@ -0,0 +1,33 @@ +// "Last updated" timestamps: one `git log` pass over the content dir (equivalent to running +// `git log -1 --format=%ct -- <file>` per file). Returns an empty map when git or history is unavailable. + +import { execFileSync } from 'node:child_process'; +import { relative, resolve, sep } from 'node:path'; + +export function gitLastUpdated(contentRoot: string): Map<string, number> { + const out = new Map<string, number>(); + try { + const top = execFileSync('git', ['rev-parse', '--show-toplevel'], { cwd: contentRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim(); + const log = execFileSync('git', ['log', '--format=%x00%ct', '--name-only', '--no-renames', '--', '.'], { + cwd: contentRoot, + encoding: 'utf8', + maxBuffer: 256 * 1024 * 1024, + stdio: ['ignore', 'pipe', 'ignore'], + }); + let ts = 0; + for (const line of log.split('\n')) { + if (line.startsWith('\0')) { + ts = Number(line.slice(1)) * 1000; + continue; + } + const f = line.trim(); + if (!f) continue; + const rel = relative(contentRoot, resolve(top, f)).split(sep).join('/'); + if (rel.startsWith('..')) continue; + if (!out.has(rel)) out.set(rel, ts); + } + } catch { + /* not a git checkout, or git missing: no timestamps */ + } + return out; +} diff --git a/kit/docs/node/links.ts b/kit/docs/node/links.ts new file mode 100644 index 00000000..db05fb8b --- /dev/null +++ b/kit/docs/node/links.ts @@ -0,0 +1,163 @@ +// Build-time link rewriting. Every internal link is resolved to the target page's canonical URL +// (base-prefixed, no redirect needed on GitHub Pages) in the current page's locale when that translation +// exists (mkdocs-static-i18n semantics), otherwise in the default locale. + +import { existsSync, readFileSync } from 'node:fs'; +import { createHash } from 'node:crypto'; +import { basename, extname, join, posix } from 'node:path'; +import type { ResolvedConfig } from './config.ts'; +import type { ContentScan, PageRoute, SourceFile } from './content.ts'; +import type { LinkResolution } from './markdown/render.ts'; + +export interface AssetRef { + /** Absolute source path. */ + abs: string; + /** Output path relative to outDir. */ + out: string; +} + +export interface LinkContext { + cfg: ResolvedConfig; + scan: ContentScan; + /** Hashed assets collected during the build (out path → source). */ + assets: Map<string, AssetRef>; +} + +const SCHEME = /^[a-z][a-z0-9+.-]*:/i; + +function splitHref(href: string): { path: string; query: string; hash: string } { + let path = href; + let hash = ''; + let query = ''; + const hi = path.indexOf('#'); + if (hi >= 0) { + hash = path.slice(hi); + path = path.slice(0, hi); + } + const qi = path.indexOf('?'); + if (qi >= 0) { + query = path.slice(qi); + path = path.slice(0, qi); + } + return { path, query, hash }; +} + +function safeDecode(s: string): string { + try { + return decodeURI(s); + } catch { + return s; + } +} + +/** + * Find the source file for a content-relative path (with or without .md / locale suffix). + * `explicit` is true when the link itself names a locale (x.zh.md, zh-CN/x.md); a plain x.md that only + * exists as x.en.md / x.zh.md (mkdocs-static-i18n) resolves to that page without pinning the locale. + */ +export function findSource(ctx: Pick<LinkContext, 'cfg' | 'scan'>, p: string): { src: SourceFile; explicit: boolean } | undefined { + const { bySource } = ctx.scan; + const tryRel = (r: string) => bySource.get(r.replace(/^\.\//, '')); + const clean = p.replace(/^\/+/, ''); + const candidates: string[] = []; + if (clean.endsWith('.md')) candidates.push(clean); + else if (clean === '' || clean.endsWith('/')) candidates.push(clean + 'index.md', clean + 'README.md'); + else if (clean.endsWith('.html')) { + const b = clean.slice(0, -5); + candidates.push(b + '.md', b.endsWith('index') ? b + '.md' : b + '/index.md'); + } else candidates.push(clean + '.md', clean + '/index.md', clean + '/README.md'); + for (const c of candidates) { + const s = tryRel(c); + if (s) return { src: s, explicit: s.explicitLocale }; + } + if (ctx.cfg.i18nMode === 'suffix') { + // x.md → x.<suffix>.md (default locale first) + for (const c of candidates) { + for (const loc of ctx.cfg.locales) { + const s = tryRel(c.replace(/\.md$/, `.${loc.suffix}.md`)); + if (s) return { src: s, explicit: false }; + } + } + } + return undefined; +} + +export function createLinkResolver(ctx: LinkContext, page: PageRoute) { + const { cfg, scan } = ctx; + const origin = cfg.hostname; + const ownPrefix = origin ? origin + cfg.base : null; + const curDir = posix.dirname(page.source.rel); + + const routeUrl = (r: PageRoute) => cfg.base + r.path; + + const resolveContentPath = (contentPath: string, kind: 'a' | 'img'): { url: string; route?: PageRoute } | null => { + const p = posix.normalize(contentPath || '.').replace(/^\.$/, ''); + if (p.startsWith('..')) return null; + if (kind === 'a') { + const found = findSource(ctx, p); + if (found) { + const src = found.src; + const routes = scan.byKey.get(src.key); + if (!routes) return null; + const want = found.explicit ? src.locale : page.locale; + const r = routes.get(want) ?? routes.get(cfg.defaultLocale) ?? [...routes.values()][0]!; + return { url: routeUrl(r), route: r }; + } + // a canonical route path written directly (e.g. '/zh-CN/guide/x' in folder mode, or 'a/b/') + const direct = scan.byPath.get(p) ?? scan.byPath.get(p + '/') ?? scan.byPath.get(p.replace(/\/index\.html$/, '/')) ?? scan.byPath.get(p.replace(/\.html$/, '')); + if (direct) return { url: routeUrl(direct), route: direct }; + } + // static asset: content dir (MkDocs) or public dir (VitePress) + const decoded = safeDecode(p); + const inContent = join(cfg.contentRoot, decoded); + const inPublic = cfg.publicRoot ? join(cfg.publicRoot, decoded) : null; + if (decoded && existsSync(inContent) && !decoded.endsWith('/')) { + if (cfg.assets === 'hashed' && kind === 'img') { + const buf = readFileSync(inContent); + const hash = createHash('sha256').update(buf).digest('hex').slice(0, 8); + const ext = extname(decoded); + const out = `assets/${basename(decoded, ext).replace(/[^\w.-]/g, '_')}.${hash}${ext}`; + ctx.assets.set(out, { abs: inContent, out }); + return { url: cfg.base + out }; + } + if (!cfg.copyContentAssets) ctx.assets.set(decoded, { abs: inContent, out: decoded }); + return { url: cfg.base + p }; + } + if (inPublic && decoded && existsSync(inPublic)) return { url: cfg.base + p }; + return null; + }; + + return (href: string, kind: 'a' | 'img'): LinkResolution | null => { + const raw = href.trim(); + if (!raw) return null; + let h = raw; + // own-site absolute URL → treat as root-absolute internal link + if (ownPrefix && h.toLowerCase().startsWith(ownPrefix.toLowerCase())) { + h = '/' + h.slice(ownPrefix.length).replace(/^\/*/, ''); + const { path, query, hash } = splitHref(h.slice(1)); + const res = resolveContentPath(safeDecode(path), kind); + if (res) return { href: res.url + query + hash, target: res.route && hash ? { route: res.route.id, anchor: safeDecode(hash.slice(1)) } : undefined }; + return { href: raw, external: true }; + } + if (SCHEME.test(h) || h.startsWith('//')) { + return /^(https?:)?\/\//i.test(h) ? { href: raw, external: true } : { href: raw }; + } + const { path, query, hash } = splitHref(h); + let contentPath: string; + if (path.startsWith('/')) { + // root-absolute: '/LeviLamina/x' (with base) or '/guide/x' (VitePress, relative to srcDir) + contentPath = path.startsWith(cfg.base) ? path.slice(cfg.base.length) : path.slice(1); + } else if (path === '') { + return { href: raw }; + } else { + contentPath = posix.join(curDir === '.' ? '' : curDir, path); + if (path.endsWith('/') && !contentPath.endsWith('/')) contentPath += '/'; + } + const res = resolveContentPath(safeDecode(contentPath), kind); + if (!res) return null; + return { + href: res.url + query + hash, + target: res.route && hash ? { route: res.route.id, anchor: safeDecode(hash.slice(1)) } : undefined, + }; + }; +} diff --git a/kit/docs/node/markdown/html-tags.ts b/kit/docs/node/markdown/html-tags.ts new file mode 100644 index 00000000..994c16b2 --- /dev/null +++ b/kit/docs/node/markdown/html-tags.ts @@ -0,0 +1,19 @@ +// Known HTML (and inline SVG/MathML) element names. Raw "tags" outside this list — e.g. Array<NBT object>, +// Object<string, NBT Object>, std::vector<T> in prose — are escaped so they render literally instead of +// being swallowed by the browser as unknown elements. +export const HTML_TAGS = new Set( + ( + 'a abbr acronym address area article aside audio b base bdi bdo big blink blockquote body br button canvas caption ' + + 'center cite code col colgroup data datalist dd del details dfn dialog dir div dl dt em embed fieldset figcaption ' + + 'figure font footer form frame frameset h1 h2 h3 h4 h5 h6 head header hgroup hr html i iframe img input ins kbd ' + + 'label legend li link main map mark marquee menu meta meter nav nobr noframes noscript object ol optgroup option ' + + 'output p param picture plaintext pre progress q rb rp rt rtc ruby s samp script search section select slot small ' + + 'source span strike strong style sub summary sup table tbody td template textarea tfoot th thead time title tr ' + + 'track tt u ul var video wbr ' + + // svg + 'svg g path rect circle ellipse line polyline polygon text tspan defs use symbol lineargradient radialgradient stop ' + + 'clippath mask pattern filter image foreignobject marker desc ' + + // mathml + 'math mi mo mn ms mrow msup msub mfrac msqrt mroot mtext mtable mtr mtd semantics annotation' + ).split(/\s+/), +); diff --git a/kit/docs/node/markdown/preprocess.ts b/kit/docs/node/markdown/preprocess.ts new file mode 100644 index 00000000..dc7cef45 --- /dev/null +++ b/kit/docs/node/markdown/preprocess.ts @@ -0,0 +1,519 @@ +// Source-level preprocessing that turns MkDocs / VitePress block extensions into CommonMark that +// micromark understands, and (in python-markdown compat) rewrites list/HTML-block layout so CommonMark +// produces the same structure Python-Markdown produced on the live sites. +// +// Containers become raw HTML wrappers around ordinary markdown (blank lines keep micromark parsing the +// body as markdown); a rehype pass later turns the wrappers into the final admonition / tab markup: +// +// <div data-kit-container="adm" data-type="note" data-title="…" data-collapse="none|closed|open"> +// +// …body markdown… +// +// </div> + +export interface PreprocessOptions { + compat: 'python-markdown' | 'commonmark'; + /** Enable MkDocs extensions (!!!, ???, ===). Default: compat === 'python-markdown'. */ + mkdocs?: boolean; + /** Enable VitePress ::: containers. Default: compat === 'commonmark'. */ + vitepress?: boolean; + /** + * Keep backslashes that Python-Markdown does not treat as escapes (`\<T\>` renders "\<T>" on MkDocs). + * Off by default: the kit renders the author's intent ("<T>") — the live sites' stray backslash is a quirk. + */ + literalBackslashes?: boolean; +} + +const FENCE_OPEN = /^(\s*)(`{3,}|~{3,})(.*)$/; +// Python-Markdown admonition / pymdownx.details title line +const ADM_RE = /^(!!!|\?\?\?\+?) ?([\w-]+(?: +[\w-]+)*)(?: +"(.*?)")? *$/; +// pymdownx.tabbed +const TAB_RE = /^===(!?\+?|\+?!?) +"(.*?)" *$/; +// VitePress container +const VP_OPEN = /^(:{3,})\s*([\w-]+)\s*(.*?)\s*$/; +const VP_CLOSE = /^(:{3,})\s*$/; +const VP_TYPES = new Set(['tip', 'info', 'warning', 'danger', 'details', 'note', 'important', 'caution', 'code-group']); + +// Python-Markdown block-level elements (markdown/util.py BLOCK_LEVEL_ELEMENTS) +const BLOCK_TAGS = new Set( + ( + 'address article aside blockquote details dialog div dl fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 ' + + 'header hgroup hr main menu nav ol p pre section table ul canvas colgroup dd body dt group html iframe li legend ' + + 'math map noscript output object option progress script style summary tbody td textarea tfoot th thead tr video center' + ).split(' '), +); +// CommonMark HTML block type 1 tags: blank lines do not end them. +const TYPE1_TAGS = new Set(['pre', 'script', 'style', 'textarea']); + +const LIST_RE = /^( *)([*+-]|\d{1,9}[.)])( +|$)(.*)$/; +const HR_RE = /^ {0,3}([-*_])(?: *\1){2,} *$/; + +const indentOf = (s: string) => { + let n = 0; + for (const ch of s) { + if (ch === ' ') n++; + else if (ch === '\t') n += 4 - (n % 4); + else break; + } + return n; +}; +const isBlank = (s: string) => /^\s*$/.test(s); +const expandTabs = (s: string) => { + // Expand leading tabs only (Python-Markdown converts tabs to 4 spaces before parsing). + const m = /^[ \t]*/.exec(s)![0]; + if (!m.includes('\t')) return s; + return ' '.repeat(indentOf(m)) + s.slice(m.length); +}; +const dedent = (lines: string[], n: number) => lines.map((l) => (isBlank(l) ? '' : l.slice(Math.min(n, indentOf(l))))); +const indent = (lines: string[], n: number) => { + const pad = ' '.repeat(n); + return lines.map((l) => (l === '' ? '' : pad + l)); +}; +export const escAttr = (s: string) => s.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>'); + +type Kind = 'blank' | 'para' | 'list' | 'heading' | 'block'; + +/** Split a line into [isCode, text] segments using CommonMark backtick code-span rules. */ +function codeSegments(line: string): [boolean, string][] { + const out: [boolean, string][] = []; + let i = 0; + let last = 0; + while (i < line.length) { + if (line[i] === '\\' && line[i + 1] === '`') { + i += 2; + continue; + } + if (line[i] !== '`') { + i++; + continue; + } + let n = 0; + while (line[i + n] === '`') n++; + const fence = '`'.repeat(n); + let j = i + n; + let close = -1; + while (j < line.length) { + const k = line.indexOf(fence, j); + if (k < 0) break; + let m = 0; + while (line[k + m] === '`') m++; + if (m === n) { + close = k; + break; + } + j = k + m; + } + if (close < 0) { + i += n; + continue; + } + if (i > last) out.push([false, line.slice(last, i)]); + out.push([true, line.slice(i, close + n)]); + i = close + n; + last = i; + } + if (last < line.length) out.push([false, line.slice(last)]); + return out; +} + +// Python-Markdown only treats these as backslash escapes (+ '|' from tables, '^' caret, '~' tilde, +// '=' mark). CommonMark escapes every ASCII punctuation character, so "\<" must keep its backslash. +const PY_ESCAPABLE = new Set([...'\\`*_{}[]()>#+-.!|^~=']); +function pythonEscapes(text: string): string { + return text.replace(/\\([!-/:-@[-`{-~])/g, (m, ch: string) => (PY_ESCAPABLE.has(ch) ? m : '\\\\' + ch)); +} +function mapOutsideCode(line: string, fn: (s: string) => string): string { + return codeSegments(line) + .map(([code, t]) => (code ? t : fn(t))) + .join(''); +} +/** In GFM table rows, a '|' inside a code span splits the cell; Python-Markdown keeps it. Escape it. */ +function escapeTablePipes(line: string): string { + return codeSegments(line) + .map(([code, t]) => (code ? t.replace(/(?<!\\)\|/g, '\\|') : t)) + .join(''); +} +const TABLE_DELIM = /^\s*\|?\s*:?-{1,}:?\s*(\|\s*:?-{1,}:?\s*)*\|?\s*$/; + +export function preprocess(src: string, opts: PreprocessOptions): string { + const lines = src.replace(/\r\n?/g, '\n').split('\n').map(expandTabs); + const out = processBlock(lines, { + literalBackslashes: opts.literalBackslashes ?? false, + compat: opts.compat, + mkdocs: opts.mkdocs ?? opts.compat === 'python-markdown', + vitepress: opts.vitepress ?? opts.compat === 'commonmark', + }); + return out.join('\n'); +} + +function processBlock(lines: string[], o: Required<PreprocessOptions>): string[] { + const out: string[] = []; + const py = o.compat === 'python-markdown'; + const escText = (t: string) => (o.literalBackslashes ? pythonEscapes(t) : t); + const pyEsc = (l: string) => (py && o.literalBackslashes ? mapOutsideCode(l, pythonEscapes) : l); + let prev: Kind = 'blank'; + // list context (python-markdown compat) + let inList = false; + let depth = -1; + // Python-Markdown: after a blank line, a block indented ≥ 4 inside a list is re-parsed as the last item's + // content; when that block starts with paragraph text, later list markers in it are literal text. + let literalMarkers = false; + let lastBlank = true; + let tabGroupOpen = false; + + const emitWrapped = (ind: number, open: string, body: string[], close = '</div>') => { + const pad = ' '.repeat(ind); + if (out.length && out[out.length - 1] !== '') out.push(''); + out.push(pad + open, ''); + out.push(...indent(body, ind)); + if (out[out.length - 1] !== '') out.push(''); + out.push(pad + close, ''); + }; + + let i = 0; + while (i < lines.length) { + const line = lines[i]!; + const ind = indentOf(line); + const trimmed = line.slice(ind); + + // ---------------------------------------------------------------- fenced code: copy verbatim + const fm = FENCE_OPEN.exec(line); + if (fm && !(fm[2]![0] === '`' && fm[3]!.includes('`'))) { + const marker = fm[2]!; + out.push(line); + i++; + while (i < lines.length) { + const l = lines[i]!; + const close = new RegExp(`^\\s*${marker[0] === '`' ? '`' : '~'}{${marker.length},}\\s*$`); + out.push(l); + i++; + if (close.test(l)) break; + } + prev = 'block'; + lastBlank = false; + continue; + } + + // ---------------------------------------------------------------- blank + if (isBlank(line)) { + out.push(''); + i++; + prev = 'blank'; + lastBlank = true; + continue; + } + + // ---------------------------------------------------------------- python-markdown: list boundaries + if (py && inList && lastBlank && ind < 4 && !LIST_RE.test(line)) { + // un-indented block after a blank line ends the list (CommonMark would keep it inside the item): + // drop the indentation and re-process the line outside the list + inList = false; + depth = -1; + literalMarkers = false; + if (ind > 0) { + lines[i] = line.trimStart(); + continue; + } + } + if (py && inList && lastBlank) literalMarkers = ind >= 4 && !LIST_RE.test(line); + + // ---------------------------------------------------------------- MkDocs containers (!!! ??? ===) + const containerAllowed = ind === 0 || (inList && ind % 4 === 0 && ind <= (depth + 1) * 4); + if (o.mkdocs && containerAllowed) { + const am = ADM_RE.exec(trimmed); + const tm = !am ? TAB_RE.exec(trimmed) : null; + if (am || tm) { + // collect the indented body + let j = i + 1; + const body: string[] = []; + while (j < lines.length) { + const l = lines[j]!; + if (isBlank(l) || indentOf(l) >= ind + 4) { + body.push(l); + j++; + } else break; + } + while (body.length && isBlank(body[body.length - 1]!)) { + body.pop(); + j--; + } + const inner = processBlock(dedent(body, ind + 4), o); + if (am) { + if (tabGroupOpen) { + out.push(' '.repeat(ind) + '</div>', ''); + tabGroupOpen = false; + } + const marker = am[1]!; + const classes = am[2]!.toLowerCase().replace(/ +/g, ' '); + const type = classes.split(' ')[0]!; + const rawTitle = am[3]; + const collapse = marker === '!!!' ? 'none' : marker === '???+' ? 'open' : 'closed'; + const title = rawTitle === undefined ? type.charAt(0).toUpperCase() + type.slice(1) : rawTitle; + emitWrapped( + ind, + `<div data-kit-container="adm" data-type="${escAttr(type)}" data-classes="${escAttr(classes)}" data-title="${escAttr(title)}" data-collapse="${collapse}">`, + inner, + ); + } else { + const flags = tm![1]!; + const label = tm![2]!; + if (!tabGroupOpen || flags.includes('!')) { + if (tabGroupOpen) out.push(' '.repeat(ind) + '</div>', ''); + if (out.length && out[out.length - 1] !== '') out.push(''); + out.push(' '.repeat(ind) + '<div data-kit-container="tabs">', ''); + tabGroupOpen = true; + } + emitWrapped(ind, `<div data-kit-container="tab" data-label="${escAttr(label)}"${flags.includes('+') ? ' data-selected="1"' : ''}>`, inner); + // keep the group open only if the next non-blank line is another tab at the same indent + let k = j; + while (k < lines.length && isBlank(lines[k]!)) k++; + const nxt = k < lines.length ? lines[k]! : ''; + const nm = indentOf(nxt) === ind ? TAB_RE.exec(nxt.slice(ind)) : null; + if (!nm || nm[1]!.includes('!')) { + out.push(' '.repeat(ind) + '</div>', ''); + tabGroupOpen = false; + } + } + i = j; + prev = 'block'; + lastBlank = false; + continue; + } + } + + // ---------------------------------------------------------------- VitePress containers + if (o.vitepress) { + const vm = VP_OPEN.exec(trimmed); + if (vm && VP_TYPES.has(vm[2]!.toLowerCase())) { + const colons = vm[1]!.length; + let j = i + 1; + let nest = 0; + const body: string[] = []; + let inFence: string | null = null; + while (j < lines.length) { + const l = lines[j]!; + const t = l.trim(); + if (inFence) { + if (new RegExp(`^${inFence[0] === '`' ? '`' : '~'}{${inFence.length},}\\s*$`).test(t)) inFence = null; + } else { + const f = /^(`{3,}|~{3,})/.exec(t); + if (f) inFence = f[1]!; + else { + const open2 = VP_OPEN.exec(t); + const close2 = VP_CLOSE.exec(t); + if (close2 && close2[1]!.length >= colons && nest === 0) break; + if (open2 && VP_TYPES.has(open2[2]!.toLowerCase()) && open2[1]!.length < colons) { + /* nested container with fewer colons */ + } else if (open2 && VP_TYPES.has(open2[2]!.toLowerCase())) nest++; + else if (close2 && nest > 0) nest--; + } + } + body.push(l); + j++; + } + const type = vm[2]!.toLowerCase(); + let rest = vm[3] ?? ''; + let open = false; + const om = /\s*\{open\}\s*$/.exec(rest); + if (om) { + open = true; + rest = rest.slice(0, om.index); + } + const inner = processBlock(dedent(body, ind), o); + if (type === 'code-group') { + emitWrapped(ind, '<div data-kit-container="code-group">', inner); + } else { + emitWrapped( + ind, + `<div data-kit-container="adm" data-type="${escAttr(type)}" data-classes="${escAttr(type)}" data-title="${escAttr(rest)}" data-default-title="${rest ? '0' : '1'}" data-collapse="${ + type === 'details' ? (open ? 'open' : 'closed') : 'none' + }">`, + inner, + ); + } + i = j + 1; + prev = 'block'; + lastBlank = false; + continue; + } + } + + // ---------------------------------------------------------------- python-markdown raw HTML blocks + if (py && ind <= 3) { + const hm = /^<([a-zA-Z][a-zA-Z0-9]*)(?=[\s>/])/.exec(trimmed); + const tag = hm?.[1]!.toLowerCase(); + if (tag && BLOCK_TAGS.has(tag)) { + // capture until the matching close tag (nesting-aware), like Python-Markdown's HTML extractor + const block: string[] = []; + let level = 0; + let j = i; + const openRe = new RegExp(`<${tag}(?=[\\s>/])`, 'gi'); + const closeRe = new RegExp(`</${tag}\\s*>`, 'gi'); + const selfClosing = new RegExp(`^<${tag}\\b[^>]*/>\\s*$`, 'i'); + if (selfClosing.test(trimmed) || tag === 'hr') { + block.push(lines[j]!); + j++; + } else { + for (; j < lines.length; j++) { + const l = lines[j]!; + block.push(l); + level += (l.match(openRe) || []).length; + level -= (l.match(closeRe) || []).length; + if (level <= 0) { + j++; + break; + } + } + } + const keepBlank = TYPE1_TAGS.has(tag); + const padded = block.map((l, n) => { + if (n === 0) return l; + if (isBlank(l)) return keepBlank ? l : ' '.repeat(ind) + '<!-- -->'; + return indentOf(l) < ind ? ' '.repeat(ind) + l.trimStart() : l; + }); + out.push(...padded); + i = j; + prev = 'block'; + lastBlank = false; + continue; + } + } + + // ---------------------------------------------------------------- python-markdown tables + if (py && line.includes('|') && i + 1 < lines.length && TABLE_DELIM.test(lines[i + 1]!) && lines[i + 1]!.includes('-')) { + if (prev === 'para' && !inList) { + // Python-Markdown: a table cannot interrupt a paragraph — keep the rows as literal paragraph text + out.push(mapOutsideCode(line, (t) => escText(t).replace(/\|/g, '\\|'))); + i++; + lastBlank = false; + continue; + } + // Python-Markdown strips each row; keep rows at the header's indentation (0 outside lists). + const pad = ' '.repeat(inList ? Math.min(ind, (depth + 1) * 4) : 0); + const row = (l: string) => pad + mapOutsideCode(escapeTablePipes(l.trim()), escText); + out.push(row(line), pad + lines[i + 1]!.trim()); + i += 2; + while (i < lines.length && !isBlank(lines[i]!)) { + out.push(row(lines[i]!)); + i++; + } + prev = 'block'; + lastBlank = false; + continue; + } + + // ---------------------------------------------------------------- python-markdown lists + if (py) { + const lm = LIST_RE.exec(line); + if (lm && !HR_RE.test(line) && literalMarkers && inList) { + // marker inside an indented paragraph block → literal paragraph text (lazy continuation) + out.push(pyEsc(line).replace(/^(\s*)([*+-]|\d+\.)/, (_m, sp: string, mk: string) => sp + (/\d/.test(mk) ? mk.replace('.', '\\.') : '\\' + mk))); + i++; + lastBlank = false; + continue; + } + if (lm && !HR_RE.test(line)) { + const markerIndent = lm[1]!.length; + let marker = lm[2]!; + const ordered = /\d/.test(marker); + if (ordered && marker.endsWith(')')) { + // Python-Markdown has no "1)" lists: keep as text + out.push(line.replace(/^(\s*\d+)\)/, '$1\\)')); + i++; + prev = 'para'; + lastBlank = false; + continue; + } + if (!inList) { + if (markerIndent >= 4) { + out.push(line); + i++; + prev = 'block'; + lastBlank = false; + continue; + } + if (prev === 'para') { + // Python-Markdown: a list cannot interrupt a paragraph — the line stays paragraph text + out.push(pyEsc(line).replace(/^(\s*)([*+-]|\d+\.)/, (_m, sp: string, mk: string) => sp + (ordered ? mk.replace('.', '\\.') : '\\' + mk))); + i++; + lastBlank = false; + continue; + } + inList = true; + depth = 0; + out.push(pyEsc(rewriteMarker(line, 0, ordered ? marker : '-', ordered))); + i++; + prev = 'list'; + lastBlank = false; + continue; + } + const level = Math.min(Math.floor(markerIndent / 4), depth + 1); + depth = level; + if (!ordered) marker = '-'; + out.push(pyEsc(rewriteMarker(line, level * 4, marker, ordered))); + i++; + prev = 'list'; + lastBlank = false; + continue; + } + if (inList && ind < 4 && classify(trimmed) === 'heading') { + inList = false; + depth = -1; + } + if (inList) { + if (!lastBlank) { + // lazy continuation of the current item + out.push(pyEsc(line)); + i++; + lastBlank = false; + continue; + } + if (ind >= 4) { + out.push(pyEsc(line)); + i++; + prev = 'list'; + lastBlank = false; + continue; + } + // un-indented text after a blank line ends the list (CommonMark would keep it in the item) + inList = false; + depth = -1; + out.push(pyEsc(trimmed)); + i++; + prev = classify(trimmed); + lastBlank = false; + continue; + } + // Python-Markdown accepts "#Heading" without a space + const hm = /^(#{1,6})([^#\s].*)$/.exec(line); + if (hm && prev !== 'para') { + out.push(pyEsc(`${hm[1]} ${hm[2]}`)); + i++; + prev = 'heading'; + lastBlank = false; + continue; + } + } + + out.push(pyEsc(line)); + i++; + prev = classify(trimmed); + lastBlank = false; + } + if (tabGroupOpen) out.push('</div>', ''); + return out; +} + +function rewriteMarker(line: string, newIndent: number, marker: string, ordered: boolean): string { + const m = LIST_RE.exec(line)!; + const mk = ordered ? m[2]! : marker; + return ' '.repeat(newIndent) + mk + (m[3] || ' ') + m[4]; +} + +function classify(trimmed: string): Kind { + if (/^#{1,6}(\s|$)/.test(trimmed)) return 'heading'; + if (HR_RE.test(trimmed)) return 'block'; + if (/^(<|>|\||```|~~~|\[\^?[^\]]+\]:)/.test(trimmed)) return 'block'; + if (/^(=+|-+)\s*$/.test(trimmed)) return 'block'; + return 'para'; +} diff --git a/kit/docs/node/markdown/render.ts b/kit/docs/node/markdown/render.ts new file mode 100644 index 00000000..5d9b704b --- /dev/null +++ b/kit/docs/node/markdown/render.ts @@ -0,0 +1,471 @@ +// Markdown → HTML at build time: unified/remark/rehype + Shiki. No markdown is parsed at runtime. + +import { unified } from 'unified'; +import remarkParse from 'remark-parse'; +import remarkGfm from 'remark-gfm'; +import remarkRehype from 'remark-rehype'; +import rehypeRaw from 'rehype-raw'; +import { toHtml } from 'hast-util-to-html'; +import { visit, SKIP } from 'unist-util-visit'; +import { parse as parseYaml } from 'yaml'; +import type { Root as MdRoot, Html, Blockquote, Paragraph, Text } from 'mdast'; +import type { Element, ElementContent, Root as HastRoot, RootContent, Properties } from 'hast'; +import { preprocess, escAttr } from './preprocess.ts'; +import { createSlugger, type SlugMode } from './slug.ts'; +import { highlightToHast, type TokenStyles } from './shiki.ts'; +import { HTML_TAGS } from './html-tags.ts'; + +export interface LinkResolution { + href: string; + /** Absolute external URL (gets target=_blank). */ + external?: boolean; + /** Internal page target for anchor validation. */ + target?: { route: string; anchor: string }; +} + +export interface RenderOptions { + compat: 'python-markdown' | 'commonmark'; + slug: SlugMode; + lineNumbers: boolean; + codeTitle: 'pygments' | 'lang' | 'none'; + languageAlias: Record<string, string>; + admonitionTitles: 'mkdocs' | 'vitepress'; + containers?: { mkdocs?: boolean; vitepress?: boolean }; + literalBackslashes?: boolean; + outline: [number, number]; + styles: TokenStyles; + strings: { copyCode: string; copied: string; footnotes: string; backToRef: string }; + /** Rewrite a link/src found in the page. Return null to leave it unchanged (and report it). */ + resolveLink: (href: string, kind: 'a' | 'img') => LinkResolution | null; + /** Called for every link that could not be resolved. */ + onWarning?: (message: string) => void; +} + +export interface Section { + id: string; + title: string; + level: number; + text: string; +} + +export interface RenderResult { + html: string; + frontmatter: Record<string, unknown>; + title: string; + /** Whether the markdown contains its own H1. */ + hasH1: boolean; + description: string; + toc: { level: number; id: string; text: string }[]; + ids: string[]; + sections: Section[]; + anchors: { route: string; anchor: string; href: string }[]; +} + +const VP_DEFAULT_TITLES: Record<string, string> = { tip: 'TIP', info: 'INFO', warning: 'WARNING', danger: 'DANGER', details: 'Details', note: 'NOTE', important: 'IMPORTANT', caution: 'CAUTION' }; + +/** Admonition type → canonical style kind (Material for MkDocs aliases + VitePress + GitHub alerts). */ +const KIND: Record<string, string> = { + note: 'note', + seealso: 'note', + abstract: 'abstract', + summary: 'abstract', + tldr: 'abstract', + info: 'info', + todo: 'info', + tip: 'tip', + hint: 'tip', + important: 'tip', + success: 'success', + check: 'success', + done: 'success', + question: 'question', + help: 'question', + faq: 'question', + warning: 'warning', + caution: 'warning', + attention: 'warning', + failure: 'failure', + fail: 'failure', + missing: 'failure', + danger: 'danger', + error: 'danger', + bug: 'bug', + example: 'example', + quote: 'quote', + cite: 'quote', + details: 'details', +}; + +export function splitFrontmatter(src: string): { data: Record<string, unknown>; body: string } { + const m = /^?---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/.exec(src); + if (!m) return { data: {}, body: src.replace(/^/, '') }; + let data: Record<string, unknown> = {}; + try { + data = (parseYaml(m[1]!) as Record<string, unknown>) ?? {}; + } catch { + data = {}; + } + return { data, body: src.slice(m[0].length) }; +} + +// ------------------------------------------------------------------------------------- mdast helpers + +/** Escape raw-HTML "tags" that are not HTML (e.g. Array<NBT object>) so they render literally. */ +function escapePseudoTags(value: string, report: (tag: string) => void): string { + return value.replace(/<(\/?)([A-Za-z][A-Za-z0-9-]*)((?:\s[^<>]*)?)(\/?)>/g, (all, _slash: string, name: string) => { + const n = name.toLowerCase(); + if (HTML_TAGS.has(n) || n.includes('-')) return all; + report(all); + return all.replace(/</g, '<').replace(/>/g, '>'); + }); +} + +function remarkKit(opts: { onPseudo: (t: string) => void; titles: 'mkdocs' | 'vitepress' }) { + return (tree: MdRoot) => { + visit(tree, 'html', (node: Html) => { + node.value = escapePseudoTags(node.value, opts.onPseudo); + }); + // GitHub alerts: > [!NOTE] → admonition + visit(tree, 'blockquote', (node: Blockquote, index, parent) => { + const first = node.children[0] as Paragraph | undefined; + if (!first || first.type !== 'paragraph') return; + const t = first.children[0] as Text | undefined; + if (!t || t.type !== 'text') return; + const m = /^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\][ \t]*(?:\n|$)/i.exec(t.value); + if (!m || !parent || index === undefined) return; + const type = m[1]!.toLowerCase(); + t.value = t.value.slice(m[0].length); + if (!t.value) first.children.shift(); + if (!first.children.length) node.children.shift(); + const kind = type === 'caution' ? 'danger' : type === 'important' ? 'example' : type; + // VitePress prints GitHub alert titles in capitals ("TIP"); MkDocs-style sites capitalise ("Tip"). + const title = opts.titles === 'vitepress' ? type.toUpperCase() : type.charAt(0).toUpperCase() + type.slice(1); + parent.children.splice(index, 1, { + type: 'html', + value: `<div data-kit-container="adm" data-type="${type}" data-kind-override="${kind}" data-classes="${type}" data-title="${escAttr(title)}" data-collapse="none">`, + } as Html, ...(node.children as MdRoot['children']), { type: 'html', value: '</div>' } as Html); + return [SKIP, index]; + }); + }; +} + +// ------------------------------------------------------------------------------------- hast helpers + +const h = (tagName: string, properties: Properties, children: ElementContent[] = []): Element => ({ type: 'element', tagName, properties, children }); +const text = (value: string) => ({ type: 'text' as const, value }); +const isEl = (n: unknown, tag?: string): n is Element => !!n && (n as Element).type === 'element' && (!tag || (n as Element).tagName === tag); +const classes = (el: Element): string[] => { + const c = el.properties.className; + if (Array.isArray(c)) return c.map(String); + return c === undefined || c === null || c === false ? [] : String(c).split(' '); +}; + +/** Text content of a heading for slugging (skips footnote refs and permalinks). */ +function headingText(node: Element | RootContent): string { + if (node.type === 'text') return node.value; + if (node.type !== 'element') return ''; + if (node.tagName === 'sup' && node.children.some((c) => isEl(c, 'a') && 'dataFootnoteRef' in c.properties)) return ''; + if (classes(node).includes('kit-anchor')) return ''; + return node.children.map((c) => headingText(c as Element)).join(''); +} + +function plainText(node: RootContent | Element, skip?: (el: Element) => boolean): string { + if (node.type === 'text') return node.value; + if (node.type !== 'element') return ''; + if (skip?.(node)) return ''; + const block = /^(p|div|li|tr|h[1-6]|pre|blockquote|table|ul|ol|section|details|summary|dd|dt)$/.test(node.tagName); + const inner = node.children.map((c) => plainText(c as Element, skip)).join(''); + if (node.tagName === 'br') return '\n'; + if (node.tagName === 'td' || node.tagName === 'th') return inner + ' '; + return block ? `\n${inner}\n` : inner; +} + +const PERMALINK_ICON = '<svg viewBox="0 0 16 16" width="16" height="16" shape-rendering="crispEdges" aria-hidden="true" fill="currentColor"><path d="M5 2h2v2h3V2h2v2h2v2h-2v3h2v2h-2v2h-2v-2H7v2H5v-2H3V9h2V6H3V4h2zm2 4v3h3V6z"/></svg>'; + +export async function renderMarkdown(source: string, o: RenderOptions): Promise<RenderResult> { + const { data: frontmatter, body } = splitFrontmatter(source); + const pre = preprocess(body, { compat: o.compat, mkdocs: o.containers?.mkdocs, vitepress: o.containers?.vitepress, literalBackslashes: o.literalBackslashes }); + + const pseudo: string[] = []; + const processor = unified() + .use(remarkParse) + .use(remarkGfm, { singleTilde: false }) + .use(remarkKit, { onPseudo: (t: string) => pseudo.push(t), titles: o.admonitionTitles }) + .use(remarkRehype, { + allowDangerousHtml: true, + clobberPrefix: '', + footnoteLabel: o.strings.footnotes, + footnoteBackLabel: (n: number) => `${o.strings.backToRef} ${n + 1}`, + }) + // fence meta (title="…", {1,3}, [file]) lives in node.data, which rehype-raw drops: keep it as a property + .use(() => (tree: HastRoot) => { + visit(tree, 'element', (el: Element) => { + const meta = (el.data as { meta?: string } | undefined)?.meta; + if (el.tagName === 'code' && meta) el.properties.dataMeta = meta; + }); + }) + .use(rehypeRaw); + const mdast = processor.parse(pre); + const tree = (await processor.run(mdast)) as HastRoot; + + // ---- code blocks (Shiki) + const codeJobs: { parent: Element | HastRoot; index: number; lang: string; meta: string; code: string }[] = []; + visit(tree, 'element', (node: Element, index, parent) => { + if (node.tagName !== 'pre' || index === undefined || !parent) return; + const code = node.children.find((c): c is Element => isEl(c, 'code')); + if (!code) return; + const langClass = classes(code).find((c) => c.startsWith('language-')); + const lang = langClass ? langClass.slice('language-'.length) : ''; + const meta = String((code.data as { meta?: string } | undefined)?.meta ?? code.properties.dataMeta ?? ''); + codeJobs.push({ parent: parent as Element, index, lang, meta, code: plainText(code) }); + return SKIP; + }); + for (const job of codeJobs) { + job.parent.children[job.index] = await highlightToHast({ + lang: job.lang, + meta: job.meta, + code: job.code, + lineNumbers: o.lineNumbers, + codeTitle: o.codeTitle, + aliases: o.languageAlias, + copyLabel: o.strings.copyCode, + copiedLabel: o.strings.copied, + styles: o.styles, + }); + } + + // ---- containers (admonitions, tabs, code groups) + let tabSet = 0; + const containerPass = (parent: HastRoot | Element) => { + for (let i = 0; i < parent.children.length; i++) { + const node = parent.children[i]; + if (!isEl(node)) continue; + containerPass(node); + const kind = node.properties.dataKitContainer as string | undefined; + if (!kind) continue; + if (kind === 'adm') { + const type = String(node.properties.dataType ?? 'note'); + const styleKind = String(node.properties.dataKindOverride ?? KIND[type] ?? 'note'); + let title = String(node.properties.dataTitle ?? ''); + if (node.properties.dataDefaultTitle === '1') { + title = o.admonitionTitles === 'vitepress' ? (VP_DEFAULT_TITLES[type] ?? type.toUpperCase()) : type.charAt(0).toUpperCase() + type.slice(1); + } + const collapse = String(node.properties.dataCollapse ?? 'none'); + const bodyEl = h('div', { className: ['kit-adm-body'] }, node.children.filter((c) => !(c.type === 'text' && !c.value.trim()))); + // wrap the inline title in one span so the flex row is [icon][text…][chevron], never one column per inline node + const titleChildren: ElementContent[] = title ? [h('span', { className: ['kit-adm-title-text'] }, inlineMarkdown(title))] : []; + const extra = String(node.properties.dataClasses ?? '').split(' ').filter((c) => c && c !== type); + const props: Properties = { className: ['kit-adm', ...extra.map((c) => `is-${c}`)], dataType: type, dataKind: styleKind }; + if (collapse === 'none') { + parent.children[i] = h('div', props, [...(title ? [h('p', { className: ['kit-adm-title'] }, titleChildren)] : []), bodyEl]); + } else { + parent.children[i] = h('details', { ...props, ...(collapse === 'open' ? { open: true } : {}) }, [ + h( + 'summary', + { className: ['kit-adm-title'] }, + titleChildren.length ? titleChildren : [h('span', { className: ['kit-adm-title-text'] }, [text(type.charAt(0).toUpperCase() + type.slice(1))])], + ), + bodyEl, + ]); + } + } else if (kind === 'tabs' || kind === 'code-group') { + tabSet++; + const tabs: { label: string; content: ElementContent[]; selected: boolean }[] = []; + if (kind === 'tabs') { + for (const c of node.children) { + if (isEl(c) && c.properties.dataKitContainer === 'tab') { + tabs.push({ + label: String(c.properties.dataLabel ?? ''), + selected: c.properties.dataSelected === '1', + content: c.children.filter((x) => !(x.type === 'text' && !x.value.trim())), + }); + } + } + } else { + for (const c of node.children) { + if (isEl(c) && classes(c).includes('kit-code')) { + const title = c.children.find((x) => isEl(x) && classes(x).includes('kit-code-head')); + const label = title ? plainText(title as Element).trim() : `Tab ${tabs.length + 1}`; + tabs.push({ label, selected: false, content: [c] }); + } + } + } + if (!tabs.length) continue; + let sel = tabs.findIndex((t) => t.selected); + if (sel < 0) sel = 0; + const id = `kit-tabs-${tabSet}`; + parent.children[i] = h('div', { className: ['kit-tabs'], dataKitTabs: '' }, [ + h( + 'div', + { className: ['hotbar', 'kit-tabs-bar'], role: 'tablist' }, + tabs.map((t, n) => + h( + 'button', + { + type: 'button', + role: 'tab', + id: `${id}-t${n + 1}`, + ariaSelected: n === sel ? 'true' : 'false', + ariaControls: [`${id}-p${n + 1}`], + tabIndex: n === sel ? 0 : -1, + }, + [text(t.label)], + ), + ), + ), + ...tabs.map((t, n) => + h( + 'div', + { + className: ['kit-tab-panel'], + role: 'tabpanel', + id: `${id}-p${n + 1}`, + ariaLabelledBy: [`${id}-t${n + 1}`], + tabIndex: 0, + ...(n === sel ? {} : { hidden: true }), + }, + t.content, + ), + ), + ]); + } + } + }; + containerPass(tree); + + // ---- heading ids, permalinks, toc + const slugger = createSlugger(o.slug); + visit(tree, 'element', (node: Element) => { + if (node.properties.id !== undefined && !/^h[1-6]$/.test(node.tagName)) slugger.reserve(String(node.properties.id)); + }); + const toc: RenderResult['toc'] = []; + let title = typeof frontmatter.title === 'string' ? frontmatter.title : ''; + let h1Seen = false; + visit(tree, 'element', (node: Element) => { + const m = /^h([1-6])$/.exec(node.tagName); + if (!m) return; + const level = Number(m[1]); + // custom ids: "Title {#id}" (VitePress / attr_list) + const last = node.children[node.children.length - 1]; + if (last && last.type === 'text') { + const cm = /\s*\{:?\s*#([\w-]+)\s*\}\s*$/.exec(last.value); + if (cm) { + last.value = last.value.slice(0, cm.index); + node.properties.id = cm[1]; + slugger.reserve(cm[1]!); + } + } + const raw = headingText(node); + const id = node.properties.id ? String(node.properties.id) : slugger.slug(raw); + node.properties.id = id; + const label = raw.replace(/\s+/g, ' ').trim(); + if (level === 1 && !h1Seen) { + h1Seen = true; + if (!title) title = label; + } + if (level >= o.outline[0] && level <= o.outline[1]) toc.push({ level, id, text: label }); + node.children.push(h('a', { className: ['kit-anchor'], href: `#${id}`, ariaHidden: 'true', tabIndex: -1 }, [{ type: 'raw', value: PERMALINK_ICON } as unknown as ElementContent])); + return SKIP; + }); + + // ---- links & images + const anchors: RenderResult['anchors'] = []; + const ids = new Set<string>(); + visit(tree, 'element', (node: Element) => { + if (node.properties.id !== undefined) ids.add(String(node.properties.id)); + }); + visit(tree, 'element', (node: Element) => { + if (node.tagName === 'a' && typeof node.properties.href === 'string') { + if (classes(node).includes('kit-anchor')) return; + const href = node.properties.href; + if (href.startsWith('#')) { + const a = decodeURIComponent(href.slice(1)); + if (a && !ids.has(a)) o.onWarning?.(`missing anchor ${href}`); + return; + } + const r = o.resolveLink(href, 'a'); + if (!r) { + o.onWarning?.(`unresolved link ${href}`); + return; + } + node.properties.href = r.href; + if (r.external) { + node.properties.target = '_blank'; + node.properties.rel = ['noopener']; + } + if (r.target?.anchor) anchors.push({ route: r.target.route, anchor: r.target.anchor, href }); + } else if (node.tagName === 'img' && typeof node.properties.src === 'string') { + const r = o.resolveLink(node.properties.src, 'img'); + if (r) node.properties.src = r.href; + else o.onWarning?.(`unresolved image ${node.properties.src}`); + if (node.properties.loading === undefined) node.properties.loading = 'lazy'; + if (node.properties.decoding === undefined) node.properties.decoding = 'async'; + } + }); + + // ---- Python-Markdown strips whitespace inside code spans (`IntPos `/ → IntPos/) + if (o.compat === 'python-markdown') { + visit(tree, 'element', (node: Element, _i, parent) => { + if (node.tagName !== 'code' || (parent && isEl(parent, 'pre'))) return; + const first = node.children[0]; + const last = node.children[node.children.length - 1]; + if (first?.type === 'text') first.value = first.value.replace(/^\s+/, ''); + if (last?.type === 'text') last.value = last.value.replace(/\s+$/, ''); + }); + } + + // ---- GFM task list checkboxes: give them an accessible name + visit(tree, 'element', (node: Element) => { + if (node.tagName === 'input' && node.properties.type === 'checkbox' && node.properties.ariaLabel === undefined) { + node.properties.ariaLabel = node.properties.checked ? 'Completed' : 'Not completed'; + } + }); + + // ---- tables: horizontal scroll wrapper + const wrapTables = (parent: HastRoot | Element) => { + parent.children.forEach((c, i) => { + if (!isEl(c)) return; + if (c.tagName === 'table') parent.children[i] = h('div', { className: ['kit-table-wrap'] }, [c]); + else wrapTables(c); + }); + }; + wrapTables(tree); + + // ---- search sections (top-level walk, split at h1–h3) + const sections: Section[] = []; + let cur: Section = { id: '', title, level: 1, text: '' }; + const skipForSearch = (el: Element) => classes(el).includes('kit-anchor') || classes(el).includes('kit-code-head') || el.tagName === 'pre' || el.tagName === 'button'; + const flush = () => { + cur.text = cur.text.replace(/\s+/g, ' ').trim(); + if (cur.text || cur.id) sections.push(cur); + }; + for (const node of tree.children) { + if (isEl(node) && /^h[1-3]$/.test(node.tagName)) { + flush(); + const lvl = Number(node.tagName[1]); + cur = { id: lvl === 1 ? '' : String(node.properties.id), title: headingText(node).replace(/\s+/g, ' ').trim(), level: lvl, text: '' }; + } else { + cur.text += ' ' + plainText(node as Element, skipForSearch); + } + } + flush(); + + if (pseudo.length) o.onWarning?.(`escaped non-HTML tags: ${[...new Set(pseudo)].join(' ')}`); + + let description = typeof frontmatter.description === 'string' ? frontmatter.description : ''; + if (!description) { + const firstP = tree.children.find((c) => isEl(c, 'p')); + if (firstP) description = plainText(firstP).replace(/\s+/g, ' ').trim().slice(0, 200); + } + + const html = toHtml(tree, { allowDangerousHtml: true }); + return { html, frontmatter, title, hasH1: h1Seen, description, toc, ids: [...ids], sections, anchors }; +} + +/** Render a short inline markdown string (admonition/tab titles) to hast phrasing content. */ +function inlineMarkdown(src: string): ElementContent[] { + const proc = unified().use(remarkParse).use(remarkRehype); + const tree = proc.runSync(proc.parse(src)) as HastRoot; + const p = tree.children.find((c): c is Element => isEl(c, 'p')); + return p ? p.children : [text(src)]; +} diff --git a/kit/docs/node/markdown/shiki-themes.ts b/kit/docs/node/markdown/shiki-themes.ts new file mode 100644 index 00000000..4a00244c --- /dev/null +++ b/kit/docs/node/markdown/shiki-themes.ts @@ -0,0 +1,145 @@ +// Shiki (TextMate) themes harmonised with the kit palette. Every token colour was checked for +// ≥ 4.5:1 contrast against its code background (light #FBF8EF, dark #0B1620). + +interface Palette { + bg: string; + fg: string; + comment: string; + keyword: string; + storage: string; + string: string; + number: string; + func: string; + type: string; + variable: string; + property: string; + punct: string; + tag: string; + attr: string; + macro: string; + regexp: string; + invalid: string; + heading: string; +} + +const nymphéas: Palette = { + bg: '#fbf8ef', + fg: '#26323b', + comment: '#69737b', + keyword: '#7a3f9c', // wisteria, deepened + storage: '#7a3f9c', + string: '#2f6f3d', // lily green + number: '#a4470f', // sunrise, earthen + func: '#2a5d84', // pond + type: '#0e6a73', // harbour teal + variable: '#26323b', + property: '#3b5566', + punct: '#56616a', + tag: '#a12f4f', // rose, deepened + attr: '#8a5a00', // sunlight, ochre + macro: '#a12f4f', + regexp: '#8a5a00', + invalid: '#b42318', + heading: '#2a5d84', +}; + +const soleilLevant: Palette = { + bg: '#0b1620', + fg: '#dce5ec', + comment: '#8496a8', + keyword: '#c6a8ff', // mist violet, lifted + storage: '#c6a8ff', + string: '#9bd69e', // lily + number: '#f5a26b', // sunrise + func: '#8fd3e0', // harbour light + type: '#e9c46a', // sunlight + variable: '#dce5ec', + property: '#b8cad8', + punct: '#9aaab8', + tag: '#f394b4', + attr: '#f2c230', + macro: '#f394b4', + regexp: '#f2c230', + invalid: '#ff8a80', + heading: '#8fd3e0', +}; + +function theme(name: string, type: 'light' | 'dark', p: Palette) { + return { + name, + type, + colors: { + 'editor.background': p.bg, + 'editor.foreground': p.fg, + }, + fg: p.fg, + bg: p.bg, + tokenColors: [ + { settings: { foreground: p.fg, background: p.bg } }, + { scope: ['comment', 'punctuation.definition.comment', 'string.comment'], settings: { foreground: p.comment, fontStyle: 'italic' } }, + { + scope: ['keyword', 'keyword.control', 'keyword.other', 'keyword.operator.new', 'keyword.operator.expression', 'keyword.operator.logical.python', 'keyword.operator.wordlike'], + settings: { foreground: p.keyword }, + }, + { scope: ['storage', 'storage.type', 'storage.modifier', 'keyword.type'], settings: { foreground: p.storage } }, + { scope: ['keyword.operator', 'punctuation', 'meta.brace', 'punctuation.separator', 'punctuation.terminator'], settings: { foreground: p.punct } }, + { + scope: ['string', 'string.quoted', 'string.template', 'punctuation.definition.string', 'string.unquoted', 'markup.inline.raw', 'markup.raw'], + settings: { foreground: p.string }, + }, + { scope: ['string.regexp', 'constant.character.escape', 'constant.other.placeholder'], settings: { foreground: p.regexp } }, + { + scope: ['constant.numeric', 'constant.language', 'constant.other', 'support.constant', 'variable.other.constant', 'constant.other.enum', 'keyword.other.unit'], + settings: { foreground: p.number }, + }, + { + scope: ['entity.name.function', 'support.function', 'meta.function-call entity.name.function', 'variable.function', 'entity.name.function.member', 'support.function.builtin'], + settings: { foreground: p.func }, + }, + { + scope: [ + 'entity.name.type', + 'entity.name.class', + 'entity.name.namespace', + 'entity.name.scope-resolution', + 'support.type', + 'support.class', + 'entity.other.inherited-class', + 'storage.type.built-in', + 'entity.name.type.class', + 'meta.type.annotation entity.name.type', + ], + settings: { foreground: p.type }, + }, + { scope: ['variable', 'variable.other', 'variable.parameter', 'meta.definition.variable'], settings: { foreground: p.variable } }, + { + scope: ['variable.other.property', 'variable.other.object.property', 'support.variable.property', 'meta.object-literal.key', 'support.type.property-name', 'entity.name.tag.yaml', 'entity.name.tag.toml'], + settings: { foreground: p.property }, + }, + { scope: ['support.type.property-name.json', 'support.type.property-name.json.comments'], settings: { foreground: p.func } }, + { scope: ['variable.language', 'variable.language.this', 'variable.language.self'], settings: { foreground: p.keyword, fontStyle: 'italic' } }, + { scope: ['entity.name.tag', 'meta.tag.sgml', 'punctuation.definition.tag'], settings: { foreground: p.tag } }, + { scope: ['entity.other.attribute-name'], settings: { foreground: p.attr } }, + { + scope: ['meta.preprocessor', 'keyword.control.directive', 'punctuation.definition.directive', 'entity.name.function.preprocessor', 'keyword.control.import', 'keyword.other.import'], + settings: { foreground: p.macro }, + }, + { scope: ['meta.preprocessor.include string', 'string.quoted.other.lt-gt.include'], settings: { foreground: p.string } }, + { scope: ['entity.name.label', 'entity.name.section', 'markup.heading', 'entity.name.section.markdown'], settings: { foreground: p.heading, fontStyle: 'bold' } }, + { scope: ['markup.bold'], settings: { fontStyle: 'bold' } }, + { scope: ['markup.italic'], settings: { fontStyle: 'italic' } }, + { scope: ['markup.underline.link', 'string.other.link'], settings: { foreground: p.func } }, + { scope: ['markup.inserted', 'punctuation.definition.inserted'], settings: { foreground: p.string } }, + { scope: ['markup.deleted', 'punctuation.definition.deleted'], settings: { foreground: p.tag } }, + { scope: ['markup.changed'], settings: { foreground: p.attr } }, + { scope: ['invalid', 'invalid.illegal'], settings: { foreground: p.invalid } }, + { scope: ['support.function.shell', 'support.function.builtin.shell', 'entity.name.command.shell'], settings: { foreground: p.func } }, + { scope: ['variable.other.normal.shell', 'variable.other.positional.shell', 'punctuation.definition.variable.shell'], settings: { foreground: p.number } }, + { scope: ['constant.other.option', 'variable.parameter.option'], settings: { foreground: p.type } }, + ], + }; +} + +export const kitLightTheme = theme('levimc-light', 'light', nymphéas); +export const kitDarkTheme = theme('levimc-dark', 'dark', soleilLevant); +export const SHIKI_PALETTES = { light: nymphéas, dark: soleilLevant }; diff --git a/kit/docs/node/markdown/shiki.ts b/kit/docs/node/markdown/shiki.ts new file mode 100644 index 00000000..e4fa9d61 --- /dev/null +++ b/kit/docs/node/markdown/shiki.ts @@ -0,0 +1,288 @@ +// Build-time syntax highlighting with Shiki (dual light/dark theme, class-based tokens). + +import { createHighlighter, type Highlighter } from 'shiki'; +import type { Element, ElementContent, Root as HastRoot } from 'hast'; +import { kitDarkTheme, kitLightTheme } from './shiki-themes.ts'; + +/** Languages loaded up front (covers every fence used across LiteLDev docs). */ +export const SHIKI_LANGS = [ + 'cpp', + 'c', + 'javascript', + 'typescript', + 'tsx', + 'jsx', + 'lua', + 'json', + 'jsonc', + 'shellscript', + 'powershell', + 'bat', + 'sql', + 'asm', + 'markdown', + 'cmake', + 'python', + 'yaml', + 'toml', + 'xml', + 'html', + 'css', + 'go', + 'csharp', + 'ini', + 'diff', + 'rust', + 'java', + 'kotlin', +] as const; + +/** fence language (lowercased) → Shiki language id. Unknown languages render as plain text. */ +const ALIASES: Record<string, string> = { + 'c++': 'cpp', + cc: 'cpp', + cxx: 'cpp', + hpp: 'cpp', + h: 'cpp', + js: 'javascript', + mjs: 'javascript', + cjs: 'javascript', + ts: 'typescript', + mts: 'typescript', + sh: 'shellscript', + shell: 'shellscript', + bash: 'shellscript', + zsh: 'shellscript', + console: 'shellscript', + ps: 'powershell', + ps1: 'powershell', + pwsh: 'powershell', + batch: 'bat', + cmd: 'bat', + bat: 'bat', + md: 'markdown', + py: 'python', + yml: 'yaml', + cs: 'csharp', + 'c#': 'csharp', + golang: 'go', + nasm: 'asm', + masm: 'asm', + gas: 'asm', + rs: 'rust', + kt: 'kotlin', + svg: 'xml', +}; + +/** Pygments lexer names (what pymdownx.highlight auto_title prints). */ +const PYGMENTS_NAMES: Record<string, string> = { + cpp: 'C++', + 'c++': 'C++', + c: 'C', + javascript: 'JavaScript', + js: 'JavaScript', + typescript: 'TypeScript', + ts: 'TypeScript', + tsx: 'TSX', + jsx: 'JSX', + lua: 'Lua', + json: 'JSON', + jsonc: 'JSON', + shell: 'Bash', + sh: 'Bash', + bash: 'Bash', + zsh: 'Bash', + console: 'Bash Session', + powershell: 'PowerShell', + ps1: 'PowerShell', + pwsh: 'PowerShell', + batch: 'Batchfile', + bat: 'Batchfile', + cmd: 'Batchfile', + sql: 'SQL', + asm: 'GAS', + nasm: 'NASM', + md: 'Markdown', + markdown: 'Markdown', + cmake: 'CMake', + python: 'Python', + py: 'Python', + yaml: 'YAML', + yml: 'YAML', + toml: 'TOML', + xml: 'XML', + html: 'HTML', + css: 'CSS', + go: 'Go', + csharp: 'C#', + cs: 'C#', + ini: 'INI', + diff: 'Diff', + rust: 'Rust', + java: 'Java', + kotlin: 'Kotlin', +}; + +let highlighterPromise: Promise<Highlighter> | null = null; +export function getHighlighter(): Promise<Highlighter> { + highlighterPromise ??= createHighlighter({ + themes: [kitLightTheme, kitDarkTheme], + langs: [...SHIKI_LANGS], + }); + return highlighterPromise; +} + +/** Collected token styles → short class names (shared across all pages of a build). */ +export class TokenStyles { + private map = new Map<string, string>(); + classFor(style: string): string { + let c = this.map.get(style); + if (!c) { + c = `k${this.map.size.toString(36)}`; + this.map.set(style, c); + } + return c; + } + css(): string { + let out = '/* Generated by levimc-kit docs: Shiki token colours (light/dark via CSS variables). */\n'; + for (const [style, cls] of this.map) out += `.kit-shiki .${cls}{${style}}\n`; + return out; + } +} + +export interface CodeOptions { + lang: string; + meta: string; + code: string; + lineNumbers: boolean; + codeTitle: 'pygments' | 'lang' | 'none'; + aliases: Record<string, string>; + copyLabel: string; + copiedLabel: string; + styles: TokenStyles; +} + +const COPY_ICON = + '<svg class="kit-pixel-icon kit-icon-copy" viewBox="0 0 16 16" width="16" height="16" shape-rendering="crispEdges" aria-hidden="true" fill="currentColor"><path d="M5 2h9v1H5zM5 3h1v1H5zM13 3h1v7h-1zM2 4h9v1H2zM2 5h1v8H2zM10 5h1v8h-1zM4 6h5v1H4zM4 8h4v1H4zM11 9h3v1h-3zM4 10h5v1H4zM2 12h9v1H2z"/></svg>'; +const DONE_ICON = + '<svg class="kit-pixel-icon kit-icon-done" viewBox="0 0 16 16" width="16" height="16" shape-rendering="crispEdges" aria-hidden="true" fill="currentColor"><path d="M12 3h2v1h-2zM11 4h3v1h-3zM10 5h3v1h-3zM9 6h3v1H9zM2 7h2v1H2zM8 7h3v1H8zM2 8h3v1H2zM7 8h3v1H7zM3 9h6v1H3zM4 10h4v1H4zM5 11h2v1H5z"/></svg>'; + +function parseMeta(langRaw: string, meta: string) { + // VitePress: ```js{1,3-4} [file.js] pymdownx: ```py title="file.py" hl_lines="1 3" linenums="1" + let lang = langRaw; + let highlight = new Set<number>(); + let title: string | undefined; + let lineNumbers: boolean | undefined; + const braced = /^([^{]*)\{([\d,\s-]+)\}$/.exec(lang); + if (braced) { + lang = braced[1]!; + for (const part of braced[2]!.split(',')) addRange(highlight, part); + } + const all = `${meta}`; + const bm = /\{([\d,\s-]+)\}/.exec(all); + if (bm) for (const part of bm[1]!.split(',')) addRange(highlight, part); + const tm = /\[([^\]]+)\]/.exec(all) ?? /title="([^"]*)"/.exec(all); + if (tm) title = tm[1]; + const hl = /hl_lines="([^"]*)"/.exec(all); + if (hl) for (const part of hl[1]!.split(/\s+/)) addRange(highlight, part); + if (/:line-numbers\b|linenums="[1-9]/.test(all)) lineNumbers = true; + if (/:no-line-numbers\b/.test(all)) lineNumbers = false; + return { lang, highlight, title, lineNumbers }; +} +function addRange(set: Set<number>, part: string) { + const m = /^\s*(\d+)(?:-(\d+))?\s*$/.exec(part); + if (!m) return; + const a = Number(m[1]); + const b = m[2] ? Number(m[2]) : a; + for (let i = a; i <= b; i++) set.add(i); +} + +export async function highlightToHast(o: CodeOptions): Promise<Element> { + const hl = await getHighlighter(); + const meta = parseMeta(o.lang, o.meta); + const langKey = meta.lang.trim().toLowerCase(); + const target = o.aliases[langKey] ?? ALIASES[langKey] ?? langKey; + const loaded = hl.getLoadedLanguages(); + const shikiLang = loaded.includes(target) ? target : 'text'; + const code = o.code.replace(/\n$/, ''); + const root = hl.codeToHast(code, { + lang: shikiLang, + themes: { light: 'levimc-light', dark: 'levimc-dark' }, + defaultColor: false, + transformers: [ + { + span(node) { + const style = node.properties.style; + if (typeof style === 'string' && style) { + delete node.properties.style; + const cls = o.styles.classFor(style); + const prev = node.properties.class; + node.properties.class = prev ? `${String(prev)} ${cls}` : cls; + } + }, + line(node, line) { + if (meta.highlight.has(line)) this.addClassToHast(node, 'highlighted'); + }, + pre(node) { + // Shiki uses raw `class`/`tabindex` keys; replace them (never mix with className/tabIndex). + node.properties = { class: 'shiki kit-shiki', tabindex: '0' }; + }, + }, + ], + }) as HastRoot; + const pre = root.children.find((c): c is Element => c.type === 'element' && c.tagName === 'pre')!; + const lines = code.split('\n').length; + + let titleText = ''; + let isFile = false; + if (meta.title) { + titleText = meta.title; + isFile = true; + } else if (o.codeTitle === 'pygments') { + titleText = PYGMENTS_NAMES[langKey] ?? 'Text Only'; + } else if (o.codeTitle === 'lang') { + titleText = langKey || 'text'; + } + const showNumbers = (meta.lineNumbers ?? o.lineNumbers) && lines > 1; + const head: Element = { + type: 'element', + tagName: 'div', + properties: { className: ['kit-code-head'] }, + children: [ + ...(titleText + ? [ + { + type: 'element', + tagName: 'span', + properties: { className: isFile ? ['kit-code-title', 'is-file'] : ['kit-code-title'], dataKitCodeTitle: '' }, + children: [{ type: 'text', value: titleText }], + } as Element, + ] + : [{ type: 'element', tagName: 'span', properties: { className: ['kit-code-title'], dataKitCodeTitle: '' }, children: [] } as Element]), + { + type: 'element', + tagName: 'button', + properties: { + type: 'button', + className: ['kit-code-copy'], + dataKitCopy: '', + ariaLabel: o.copyLabel, + title: o.copyLabel, + dataCopiedLabel: o.copiedLabel, + }, + children: [{ type: 'raw', value: COPY_ICON + DONE_ICON } as unknown as ElementContent], + }, + ], + }; + return { + type: 'element', + tagName: 'div', + properties: { + className: ['kit-code'], + dataLang: langKey || 'text', + dataLines: String(lines), + ...(showNumbers ? { dataLinenos: '', style: `--kit-gutter:${String(lines).length}ch` } : {}), + }, + children: [head, pre], + }; +} diff --git a/kit/docs/node/markdown/slug.ts b/kit/docs/node/markdown/slug.ts new file mode 100644 index 00000000..e75bf9a9 --- /dev/null +++ b/kit/docs/node/markdown/slug.ts @@ -0,0 +1,70 @@ +// Heading id algorithms, byte-compatible with the generators the live sites used. + +/** + * Python-Markdown toc + pymdownx.slugs.slugify(case='lower'), as configured by LeviLamina / LSE mkdocs.yml. + * Input is the heading's text content (Python-Markdown: strip_tags(inner HTML) then html.unescape()). + * 1. trim (inner whitespace is kept: "A / B" → "a---b", as on the live sites) + * 2. strip <…> tag-like sequences (RE_TAGS = </?[^>]*>) + * 3. Unicode NFC, lowercase + * 4. delete chars not in [\w\- ] (Python's Unicode \w: letters, digits/numerics, underscore) + * 5. spaces → '-' (no trimming: "🔑 SQL数据库" → "-sql数据库") + */ +export function slugPymdownx(text: string): string { + let s = text.trim(); + s = s.replace(/<\/?[^>]*>/g, ''); + s = s.normalize('NFC').toLowerCase(); + s = s.replace(/[^\p{L}\p{N}_\- ]/gu, ''); + return s.replace(/ /g, '-'); +} + +/** Python-Markdown toc `unique()`: foo, foo_1, foo_2 … (also used for empty slugs → _1). */ +export function uniquePymdownx(id: string, used: Set<string>): string { + let out = id; + while (used.has(out) || !out) { + const m = /^(.*)_([0-9]+)$/.exec(out); + out = m ? `${m[1]}_${Number(m[2]) + 1}` : `${out}_1`; + } + used.add(out); + return out; +} + +// @mdit-vue/shared slugify (VitePress default). +const rControl = /[\u0000-\u001f]/g; +const rSpecial = /[\s~`!@#$%^&*()\-_+=[\]{}|\\;:"'“”‘’<>,.?/]+/g; +const rCombining = /[̀-ͯ]/g; + +export function slugVitepress(text: string): string { + return text + .normalize('NFKD') + .replace(rCombining, '') + .replace(rControl, '') + .replace(rSpecial, '-') + .replace(/-{2,}/g, '-') + .replace(/^-+|-+$/g, '') + .replace(/^(\d)/, '_$1') + .toLowerCase(); +} + +/** markdown-it-anchor uniqueSlug: foo, foo-1, foo-2 … */ +export function uniqueVitepress(id: string, used: Set<string>): string { + let out = id; + let i = 1; + while (used.has(out)) out = `${id}-${i++}`; + used.add(out); + return out; +} + +export type SlugMode = 'pymdownx' | 'vitepress'; + +export function createSlugger(mode: SlugMode) { + const used = new Set<string>(); + return { + used, + reserve(id: string) { + used.add(id); + }, + slug(text: string): string { + return mode === 'pymdownx' ? uniquePymdownx(slugPymdownx(text), used) : uniqueVitepress(slugVitepress(text), used); + }, + }; +} diff --git a/kit/docs/node/nav.ts b/kit/docs/node/nav.ts new file mode 100644 index 00000000..475ae4cd --- /dev/null +++ b/kit/docs/node/nav.ts @@ -0,0 +1,227 @@ +// Navigation: MkDocs nav trees (untitled entries take the page H1 per locale, group titles translated via +// nav_translations, external links allowed) and VitePress nav/sidebar objects (single or multi-sidebar). + +import { posix } from 'node:path'; +import type { NavEntry, ResolvedConfig, SidebarConfig } from './config.ts'; +import type { ContentScan, PageRoute } from './content.ts'; +import { findSource } from './links.ts'; +import type { NavItem, SidebarData } from '../shared/types.ts'; + +type Node = + | { kind: 'page'; key: string; locale?: string; text?: string; external?: false } + | { kind: 'link'; text: string; href: string } + | { kind: 'group'; text: string; children: Node[]; collapsed?: boolean }; + +const isExternal = (s: string) => /^[a-z][a-z0-9+.-]*:|^\/\//i.test(s); + +function findSourceForNav(scan: ContentScan, cfg: ResolvedConfig, link: string): { key: string; locale?: string } | null { + let p = link.split('#')[0]!.split('?')[0]!; + if (p.startsWith(cfg.base)) p = p.slice(cfg.base.length); + p = posix.normalize(p.replace(/^\/+/, '') || '.').replace(/^\.$/, ''); + const found = findSource({ cfg, scan }, p); + if (found) return { key: found.src.key, locale: found.explicit ? found.src.locale : undefined }; + const direct = scan.byPath.get(p) ?? scan.byPath.get(p + '/'); + if (direct) return { key: direct.key, locale: direct.locale }; + return null; +} + +export function parseNav(entries: NavEntry[], scan: ContentScan, cfg: ResolvedConfig, warn: (m: string) => void): Node[] { + const out: Node[] = []; + const asTarget = (text: string | undefined, link: string): Node | null => { + if (isExternal(link)) { + // own-site absolute URL pointing into this build → internal page + if (cfg.hostname && link.startsWith(cfg.hostname + cfg.base)) { + const t = findSourceForNav(scan, cfg, link.slice(cfg.hostname.length)); + if (t) return { kind: 'page', key: t.key, locale: t.locale, text }; + } + return { kind: 'link', text: text ?? link, href: link }; + } + const t = findSourceForNav(scan, cfg, link); + if (!t) { + warn(`nav: cannot resolve '${link}'`); + return null; + } + return { kind: 'page', key: t.key, locale: t.locale, text }; + }; + for (const e of entries) { + if (typeof e === 'string') { + const n = asTarget(undefined, e); + if (n) out.push(n); + } else if ('items' in e && Array.isArray(e.items)) { + const children = parseNav(e.items as NavEntry[], scan, cfg, warn); + if (typeof e.link === 'string' && e.link) { + const head = asTarget(String(e.text), e.link); + if (head) children.unshift(head); + } + out.push({ kind: 'group', text: String(e.text), children, collapsed: (e as { collapsed?: boolean }).collapsed }); + } else if ('link' in e && typeof e.link === 'string') { + const n = asTarget(typeof e.text === 'string' ? e.text : undefined, e.link); + if (n) out.push(n); + } else { + for (const [title, v] of Object.entries(e as Record<string, string | NavEntry[]>)) { + if (typeof v === 'string') { + const n = asTarget(title, v); + if (n) out.push(n); + } else if (Array.isArray(v)) out.push({ kind: 'group', text: title, children: parseNav(v, scan, cfg, warn) }); + } + } + } + return out; +} + +export interface NavBuildInput { + cfg: ResolvedConfig; + scan: ContentScan; + /** route id → page title in that locale */ + titles: Map<string, string>; + warn: (m: string) => void; +} + +export interface NavBuildResult { + nav: Record<string, NavItem[]>; + sidebars: Record<string, SidebarData>; + /** route id → { sidebar id, nav index, prev, next } */ + placement: Map<string, { sidebar?: string; nav?: number; prev?: { text: string; path: string }; next?: { text: string; path: string } }>; + /** `${locale}:${key}` → explicit (translated) nav title, for pages listed with a title in the nav. */ + navTitles: Map<string, string>; +} + +export function buildNavigation({ cfg, scan, titles, warn }: NavBuildInput): NavBuildResult { + const nav: Record<string, NavItem[]> = {}; + const sidebars: Record<string, SidebarData> = {}; + const placement: NavBuildResult['placement'] = new Map(); + const navTitles = new Map<string, string>(); + const perLocale = <T,>(v: T[] | Record<string, T[]> | undefined, code: string): T[] | undefined => { + if (!v) return undefined; + if (Array.isArray(v)) return v; + return v[code] ?? v[cfg.defaultLocale]; + }; + const tr = (code: string, text: string) => cfg.navTranslations?.[code]?.[text] ?? text; + + const routeOf = (key: string, locale: string | undefined, code: string): PageRoute | undefined => { + const m = scan.byKey.get(key); + if (!m) return undefined; + return m.get(locale ?? code) ?? m.get(cfg.defaultLocale) ?? [...m.values()][0]; + }; + + const materialize = (nodes: Node[], code: string): NavItem[] => + nodes + .map((n): NavItem | null => { + if (n.kind === 'link') return { text: tr(code, n.text), link: n.href, external: true }; + if (n.kind === 'page') { + const r = routeOf(n.key, n.locale, code); + if (!r) return null; + if (n.text && !navTitles.has(`${code}:${n.key}`)) navTitles.set(`${code}:${n.key}`, tr(code, n.text)); + return { text: n.text ? tr(code, n.text) : (titles.get(r.id) ?? n.key), link: r.path, key: r.key }; + } + return { text: tr(code, n.text), items: materialize(n.children, code), collapsed: n.collapsed }; + }) + .filter((x): x is NavItem => !!x); + + const firstLink = (items: NavItem[]): NavItem | undefined => { + for (const it of items) { + if (it.link && !it.external) return it; + if (it.items) { + const f = firstLink(it.items); + if (f) return f; + } + } + return undefined; + }; + const flatten = (items: NavItem[], acc: NavItem[] = []): NavItem[] => { + for (const it of items) { + if (it.link && !it.external && !acc.some((a) => a.link === it.link)) acc.push(it); + if (it.items) flatten(it.items, acc); + } + return acc; + }; + const contains = (it: NavItem, key: string): boolean => it.key === key || !!it.items?.some((c) => contains(c, key)); + + const mode = cfg.sidebar === undefined ? 'tabs' : cfg.sidebar; + const isMkdocsMode = mode === 'tabs' || mode === 'tree'; + + for (const loc of cfg.locales) { + const code = loc.code; + const navEntries = perLocale<NavEntry>(cfg.nav as NavEntry[] | Record<string, NavEntry[]> | undefined, code) ?? []; + const tree = materialize(parseNav(navEntries, scan, cfg, warn), code); + + if (isMkdocsMode) { + // header: top-level entries; groups link to their first page + nav[code] = tree.map((it) => { + if (!it.items) return { ...it, activePrefix: undefined }; + const f = firstLink(it.items); + return { text: it.text, link: f?.link, key: f?.key, items: undefined }; + }); + if (mode === 'tree') sidebars[`${code}:tree`] = { items: tree }; + tree.forEach((it, i) => { + if (mode === 'tabs' && it.items) sidebars[`${code}:tab${i}`] = { title: it.text, items: it.items }; + }); + const flat = flatten(tree); + for (const r of scan.routes.filter((x) => x.locale === code)) { + const idx = tree.findIndex((it) => contains(it, r.key)); + const pos = flat.findIndex((it) => it.key === r.key); + const sidebar = mode === 'tree' ? `${code}:tree` : idx >= 0 && tree[idx]!.items ? `${code}:tab${idx}` : undefined; + placement.set(r.id, { + sidebar, + nav: idx >= 0 ? idx : undefined, + prev: pos > 0 ? { text: flat[pos - 1]!.text, path: flat[pos - 1]!.link! } : undefined, + next: pos >= 0 && pos < flat.length - 1 ? { text: flat[pos + 1]!.text, path: flat[pos + 1]!.link! } : undefined, + }); + } + } else { + // VitePress: explicit nav + sidebar(s) + nav[code] = tree.map((it) => ({ ...it, activePrefix: it.link && !it.external ? posix.dirname('/' + it.link).replace(/^\/$/, '') + '/' : undefined })); + let sb: SidebarConfig | undefined; + if (mode && typeof mode === 'object') { + const rec = mode as Record<string, SidebarConfig> | SidebarConfig; + if (Array.isArray(rec)) sb = rec; + else { + const keys = Object.keys(rec); + const looksLikeLocales = keys.every((k) => cfg.locales.some((l) => l.code === k)); + sb = looksLikeLocales ? (rec as Record<string, SidebarConfig>)[code] : (rec as SidebarConfig); + } + } + const groups: { prefix: string; id: string; items: NavItem[] }[] = []; + if (Array.isArray(sb)) { + const id = `${code}:main`; + const items = materialize(parseNav(sb, scan, cfg, warn), code); + sidebars[id] = { items, expand: true }; + groups.push({ prefix: '/', id, items }); + } else if (sb) { + Object.entries(sb).forEach(([prefix, entries], i) => { + const id = `${code}:sb${i}`; + const items = materialize(parseNav(entries, scan, cfg, warn), code); + sidebars[id] = { items, expand: true }; + groups.push({ prefix: prefix.startsWith('/') ? prefix : '/' + prefix, id, items }); + }); + } + for (const r of scan.routes.filter((x) => x.locale === code)) { + const url = '/' + r.path; + const g = groups.filter((x) => url.startsWith(x.prefix) || ('/' + r.source.rel).startsWith(x.prefix)).sort((a, b) => b.prefix.length - a.prefix.length)[0]; + const flat = g ? flatten(g.items) : []; + const pos = flat.findIndex((it) => it.key === r.key); + // header item: exact match first, else longest active prefix + const items = nav[code]!; + let navIdx = items.findIndex((it) => it.key === r.key); + if (navIdx < 0) { + let best = -1; + let bestLen = 1; + items.forEach((it, i) => { + if (it.activePrefix && it.activePrefix.length > bestLen && url.startsWith(it.activePrefix)) { + best = i; + bestLen = it.activePrefix.length; + } + }); + navIdx = best; + } + placement.set(r.id, { + sidebar: g?.id, + nav: navIdx >= 0 ? navIdx : undefined, + prev: pos > 0 ? { text: flat[pos - 1]!.text, path: flat[pos - 1]!.link! } : undefined, + next: pos >= 0 && pos < flat.length - 1 ? { text: flat[pos + 1]!.text, path: flat[pos + 1]!.link! } : undefined, + }); + } + } + } + return { nav, sidebars, placement, navTitles }; +} diff --git a/kit/docs/node/site.ts b/kit/docs/node/site.ts new file mode 100644 index 00000000..00d645b4 --- /dev/null +++ b/kit/docs/node/site.ts @@ -0,0 +1,241 @@ +// Compiles the whole site: content scan → markdown render (per route) → navigation → route metadata, +// search indexes and diagnostics. Used by the Vite plugin (dev + build) and the prerenderer. + +import { readFileSync } from 'node:fs'; +import MiniSearch from 'minisearch'; +import picomatch from 'picomatch'; +import type { ResolvedConfig } from './config.ts'; +import { scanContent, type ContentScan, type PageRoute } from './content.ts'; +import { createLinkResolver, type AssetRef } from './links.ts'; +import { renderMarkdown, type RenderResult } from './markdown/render.ts'; +import { TokenStyles } from './markdown/shiki.ts'; +import { buildNavigation } from './nav.ts'; +import { gitLastUpdated } from './git.ts'; +import { uiStrings } from '../../components/i18n.ts'; +import { searchOptions, SNIPPET_STORE_CHARS } from '../shared/search.ts'; +import type { FeatureData, HeroData, PageData, RouteMeta, SearchDoc, SiteData } from '../shared/types.ts'; + +export interface BuiltPage extends PageData { + route: RouteMeta; + render: RenderResult; +} + +export interface BuiltSite { + cfg: ResolvedConfig; + scan: ContentScan; + site: SiteData; + routes: RouteMeta[]; + pages: Map<string, BuiltPage>; + /** locale → serialised MiniSearch index */ + searchIndexes: Map<string, string>; + assets: Map<string, AssetRef>; + warnings: string[]; + tokenCss: string; +} + +export const pageModuleId = (r: Pick<PageRoute, 'id'>) => + r.id.replace(/[^A-Za-z0-9_\-/]/g, (c) => (c === ':' ? '/' : '_')).replace(/\/+/g, '/').replace(/\/$/, '') || 'index'; + +const cache = new Map<string, { mtime: string; result: RenderResult }>(); +// One token-class registry per process: class names stay stable across incremental (dev) rebuilds. +const styles = new TokenStyles(); + +export async function buildSite(cfg: ResolvedConfig, opts: { changed?: Set<string> } = {}): Promise<BuiltSite> { + const warnings: string[] = []; + const scan = scanContent(cfg); + const lastUpdated = cfg.lastUpdated ? gitLastUpdated(cfg.contentRoot) : new Map<string, number>(); + const assets = new Map<string, AssetRef>(); + + // ---- render every route + const rendered = new Map<string, RenderResult>(); + const queue = [...scan.routes]; + const worker = async () => { + for (let r = queue.shift(); r; r = queue.shift()) { + const route = r; + const src = readFileSync(route.source.abs, 'utf8'); + const t = uiStrings(cfg.locales.find((l) => l.code === route.locale)?.lang, cfg.ui?.[route.locale]); + const resolve = createLinkResolver({ cfg, scan, assets }, route); + const pageWarn = (m: string) => warnings.push(`${route.source.rel}${route.fallback ? ` (as ${route.locale})` : ''}: ${m}`); + const cacheKey = `${route.id}|${route.source.abs}`; + const hit = cache.get(cacheKey); + if (hit && hit.mtime === src && !opts.changed?.has(route.source.abs)) { + rendered.set(route.id, hit.result); + continue; + } + const result = await renderMarkdown(src, { + compat: cfg.markdown.compat, + slug: cfg.slug, + lineNumbers: cfg.markdown.lineNumbers, + codeTitle: cfg.markdown.codeTitle, + languageAlias: cfg.markdown.languageAlias, + admonitionTitles: cfg.markdown.admonitionTitles, + containers: cfg.markdown.containers, + literalBackslashes: cfg.markdown.literalBackslashes, + outline: cfg.outline, + styles, + strings: { copyCode: t.copyCode, copied: t.copied, footnotes: 'Footnotes', backToRef: 'Back to reference' }, + resolveLink: resolve, + onWarning: pageWarn, + }); + cache.set(cacheKey, { mtime: src, result }); + rendered.set(route.id, result); + } + }; + await Promise.all(Array.from({ length: 6 }, worker)); + + // ---- titles & navigation + const titles = new Map<string, string>(); + for (const r of scan.routes) { + const res = rendered.get(r.id)!; + const hero = res.frontmatter.hero as HeroData | undefined; + titles.set(r.id, res.title || hero?.name || r.key.split('/').pop() || cfg.title); + } + const { nav, sidebars, placement, navTitles } = buildNavigation({ cfg, scan, titles, warn: (m) => warnings.push(m) }); + // MkDocs: page.title = nav title > first H1 > prettified file name; Material prints it as the H1 when the + // markdown has none. + for (const r of scan.routes) { + const res = rendered.get(r.id)!; + const navTitle = navTitles.get(`${r.locale}:${r.key}`); + if (cfg.markdown.autoTitle) { + const base = r.key.split('/').filter((x) => x !== 'index').pop() ?? ''; + const pretty = base ? base.replace(/[-_]/g, ' ').replace(/^./, (c) => c.toUpperCase()) : cfg.title; + const t = navTitle ?? (res.title || pretty); + if (!res.hasH1 && res.frontmatter.layout !== 'home' && typeof res.frontmatter.layout !== 'string') { + res.html = `<h1>${t.replace(/&/g, '&').replace(/</g, '<')}</h1>\n` + res.html; + res.hasH1 = true; + } + titles.set(r.id, t); + } + } + + // ---- anchors across pages + const idsByRoute = new Map<string, Set<string>>(); + for (const [id, res] of rendered) idsByRoute.set(id, new Set(res.ids)); + for (const r of scan.routes) { + for (const a of rendered.get(r.id)!.anchors) { + const ids = idsByRoute.get(a.route); + if (ids && a.anchor && !ids.has(a.anchor)) warnings.push(`${r.source.rel}${r.fallback ? ` (as ${r.locale})` : ''}: missing anchor '#${a.anchor}' in ${a.href}`); + } + } + + // ---- route metadata + page data + const pages = new Map<string, BuiltPage>(); + const routes: RouteMeta[] = []; + const homePaths: Record<string, string> = {}; + for (const loc of cfg.locales) homePaths[loc.code] = scan.byKey.get('index')?.get(loc.code)?.path ?? loc.prefix; + + for (const r of scan.routes) { + const res = rendered.get(r.id)!; + const fm = res.frontmatter; + const layout = + typeof fm.layout === 'string' && (fm.layout === 'home' || fm.layout === 'page' || fm.layout in (cfg.layouts ?? {})) ? fm.layout : 'doc'; + const alternates: Record<string, string> = {}; + for (const [code, ar] of scan.byKey.get(r.key) ?? []) alternates[code] = ar.path; + const p = placement.get(r.id) ?? {}; + const resolve = createLinkResolver({ cfg, scan, assets }, r); + const resolveHref = (href: string) => resolve(href, 'a')?.href ?? href; + const resolveImg = (href: string) => resolve(href, 'img')?.href ?? href; + let hero: HeroData | undefined; + let features: FeatureData[] | undefined; + if (layout === 'home') { + const fh = (fm.hero ?? {}) as HeroData & { image?: string | HeroData['image'] }; + const img = typeof fh.image === 'string' ? { src: fh.image } : fh.image; + hero = { + name: fh.name, + text: fh.text, + tagline: fh.tagline, + image: img ? { ...img, src: resolveImg(img.src) } : undefined, + actions: (fh.actions ?? []).map((a) => ({ ...a, external: /^[a-z]+:/i.test(a.link), link: resolveHref(a.link) })), + }; + features = ((fm.features ?? []) as FeatureData[]).map((f) => ({ ...f, external: f.link ? /^[a-z]+:/i.test(f.link) : undefined, link: f.link ? resolveHref(f.link) : undefined })); + } + const meta: RouteMeta = { + path: r.path, + locale: r.locale, + page: pageModuleId(r), + key: r.key, + title: layout === 'home' && !res.title ? (hero?.name ?? cfg.title) : titles.get(r.id)!, + description: (typeof fm.description === 'string' && fm.description) || res.description || cfg.description, + layout, + alternates, + source: r.source.rel, + lastUpdated: lastUpdated.get(r.source.rel), + editUrl: cfg.editLink + ? typeof cfg.editLink.pattern === 'function' + ? cfg.editLink.pattern(r.source.rel) + : cfg.editLink.pattern.replace(':path', r.source.rel) + : undefined, + fallback: r.fallback || undefined, + sidebar: fm.sidebar === false ? undefined : p.sidebar, + nav: p.nav, + prev: fm.prev === false ? undefined : p.prev, + next: fm.next === false ? undefined : p.next, + }; + routes.push(meta); + const keepFm: Record<string, unknown> = {}; + for (const k of ['layout', 'outline', 'aside', 'sidebar', 'editLink', 'lastUpdated', 'pageClass']) if (k in fm) keepFm[k] = fm[k]; + pages.set(r.id, { route: meta, html: res.html, toc: fm.outline === false ? [] : res.toc, hero, features, frontmatter: keepFm, render: res }); + } + + // ---- search (one MiniSearch index per locale) + const searchIndexes = new Map<string, string>(); + const excluded = cfg.searchExclude?.length ? picomatch(cfg.searchExclude) : null; + for (const loc of cfg.locales) { + const ms = new MiniSearch<SearchDoc>(searchOptions); + let id = 0; + for (const r of scan.routes.filter((x) => x.locale === loc.code)) { + if (excluded?.(r.key)) continue; + const page = pages.get(r.id)!; + const pageTitle = page.route.title; + const crumbs = page.route.sidebar ? (sidebars[page.route.sidebar]?.title ?? '') : ''; + for (const s of page.render.sections) { + ms.add({ + id: id++, + title: s.title || pageTitle, + page: pageTitle, + crumbs, + path: r.path + (s.id ? `#${s.id}` : ''), + text: s.text.slice(0, 4000), + }); + } + } + // keep stored snippet text short; the full text is in the inverted index + const json = JSON.parse(JSON.stringify(ms)) as { storedFields: Record<string, { text?: string }> }; + for (const v of Object.values(json.storedFields)) if (v.text && v.text.length > SNIPPET_STORE_CHARS) v.text = v.text.slice(0, SNIPPET_STORE_CHARS); + searchIndexes.set(loc.code, JSON.stringify(json)); + } + + const site: SiteData = { + base: cfg.base, + title: cfg.title, + description: cfg.description ?? '', + hostname: cfg.hostname, + logo: cfg.logo ? { ...cfg.logo, src: assetUrl(cfg, cfg.logo.src), dark: cfg.logo.dark ? assetUrl(cfg, cfg.logo.dark) : undefined } : undefined, + favicon: cfg.favicon ? assetUrl(cfg, cfg.favicon) : undefined, + project: cfg.project, + siteKey: cfg.siteKey, + urlStyle: cfg.urlStyle, + cleanUrls: cfg.cleanUrls, + defaultLocale: cfg.defaultLocale, + locales: cfg.locales.map((l) => ({ code: l.code, label: l.label, lang: l.lang, prefix: l.prefix })), + nav, + sidebars, + social: cfg.social ?? (cfg.repo ? [{ icon: 'github', link: cfg.repo }] : []), + editLink: cfg.editLink ? { text: cfg.editLink.text } : undefined, + footer: cfg.footer, + outline: cfg.outline, + search: {}, + ui: (cfg.ui ?? {}) as Record<string, Record<string, unknown>>, + titleTemplate: cfg.titleTemplate, + lastUpdated: cfg.lastUpdated, + homePaths, + }; + + return { cfg, scan, site, routes, pages, searchIndexes, assets, warnings, tokenCss: styles.css() }; +} + +export function assetUrl(cfg: ResolvedConfig, src: string): string { + if (/^[a-z]+:|^\/\//i.test(src)) return src; + if (src.startsWith(cfg.base)) return src; + return cfg.base + src.replace(/^\/+/, ''); +} diff --git a/kit/docs/node/vite.ts b/kit/docs/node/vite.ts new file mode 100644 index 00000000..25641444 --- /dev/null +++ b/kit/docs/node/vite.ts @@ -0,0 +1,302 @@ +// Vite plugin for levimc-kit docs sites. +// +// // vite.config.ts +// import { defineConfig } from 'vite'; +// import { kitDocs } from './kit/docs/node/vite'; +// import docs from './docs.config'; +// export default defineConfig({ plugins: [kitDocs(docs)] }); +// +// It compiles all markdown at build start, exposes the site through virtual modules (one lazily loaded +// chunk per page), serves the SPA in dev, and emits search indexes, sitemap.xml, .nojekyll and content +// assets for the client build. `node kit/docs/build.mjs` runs client build → SSR build → prerender. + +import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'; +import { createHash } from 'node:crypto'; +import { dirname, extname, join, relative, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import type { Plugin, PluginOption, ViteDevServer } from 'vite'; +import react from '@vitejs/plugin-react'; +import tailwindcss from '@tailwindcss/vite'; +import { resolveConfig, type DocsConfig, type ResolvedConfig } from './config.ts'; +import { buildSite, type BuiltSite } from './site.ts'; +import { localeRedirectScript } from '../shared/head.ts'; +import { themeInitScript } from '../../components/theme.ts'; +import { GOOGLE_FONTS_HREF } from '../../components/fonts.ts'; + +const SITE_ID = 'virtual:kit-docs/site'; +const PAGE_PREFIX = 'virtual:kit-docs/page/'; +const TOKENS_ID = 'virtual:kit-docs/tokens.css'; +const LAYOUTS_ID = 'virtual:kit-docs/layouts'; +const R_LAYOUTS = '\0kit-docs:layouts'; +const R_SITE = '\0kit-docs:site'; +const R_PAGE = '\0kit-docs:page:'; +const R_TOKENS = '/__kit-docs-tokens.css'; + +export interface KitDocsPluginOptions { + /** Include @vitejs/plugin-react (default true). */ + react?: boolean; + /** Include @tailwindcss/vite (default true). */ + tailwind?: boolean; +} + +const here = dirname(fileURLToPath(import.meta.url)); +export const KIT_DOCS_APP_DIR = resolve(here, '../app'); + +function hash8(s: string) { + return createHash('sha256').update(s).digest('hex').slice(0, 8); +} + +export function kitDocs(userConfig: DocsConfig, options: KitDocsPluginOptions = {}): PluginOption[] { + let root = process.cwd(); + let cfg: ResolvedConfig; + let built: BuiltSite | null = null; + let building: Promise<BuiltSite> | null = null; + let isSsr = false; + let isBuild = false; + let searchFiles = new Map<string, { file: string; json: string }>(); + + const appHtml = join(KIT_DOCS_APP_DIR, 'index.html'); + const entryServer = join(KIT_DOCS_APP_DIR, 'entry-server.tsx'); + + const rebuild = async (changed?: Set<string>) => { + building = buildSite(cfg, { changed }).then((b) => { + built = b; + searchFiles = new Map( + [...b.searchIndexes].map(([code, json]) => [code, { file: `assets/search-${code.replace(/[^\w-]/g, '_')}.${hash8(json)}.json`, json }]), + ); + b.site.search = Object.fromEntries([...searchFiles].map(([code, f]) => [code, cfg.base + f.file])); + return b; + }); + return building; + }; + const ensure = async () => built ?? (await (building ?? rebuild())); + + const reportWarnings = (b: BuiltSite, log: (m: string) => void) => { + if (!b.warnings.length) return; + log(`[kit-docs] ${b.warnings.length} warning(s):`); + for (const w of b.warnings.slice(0, 200)) log(` - ${w}`); + if (b.warnings.length > 200) log(` … and ${b.warnings.length - 200} more (see .kit/warnings.txt)`); + }; + + const plugin: Plugin = { + name: 'levimc-kit-docs', + enforce: 'pre', + config(vc, env) { + root = vc.root ? resolve(vc.root) : process.cwd(); + cfg = resolveConfig(userConfig, root); + isSsr = !!env.isSsrBuild; + isBuild = env.command === 'build'; + return { + base: cfg.base, + appType: 'custom', + publicDir: cfg.publicRoot ?? false, + resolve: { dedupe: ['react', 'react-dom', 'react-router'] }, + server: { fs: { allow: [root, cfg.contentRoot, KIT_DOCS_APP_DIR, resolve(KIT_DOCS_APP_DIR, '../..')] } }, + build: isSsr + ? { + outDir: join(root, '.kit/ssr'), + emptyOutDir: true, + ssr: entryServer, + copyPublicDir: false, + rollupOptions: { input: entryServer, output: { entryFileNames: 'entry-server.js', format: 'es' } }, + } + : { + outDir: cfg.outRoot, + emptyOutDir: true, + assetsDir: 'assets', + rollupOptions: { + input: { app: appHtml }, + output: { + chunkFileNames: (chunk) => (chunk.facadeModuleId?.startsWith(R_PAGE) ? 'assets/pages/[name].[hash].js' : 'assets/[name].[hash].js'), + }, + }, + }, + ssr: { noExternal: [] }, + }; + }, + async buildStart() { + const b = await rebuild(); + if (isBuild && !isSsr) { + reportWarnings(b, (m) => this.warn(m)); + mkdirSync(join(root, '.kit'), { recursive: true }); + writeFileSync(join(root, '.kit/warnings.txt'), b.warnings.join('\n') + '\n'); + } + }, + resolveId(id) { + if (id === SITE_ID) return R_SITE; + if (id.startsWith(PAGE_PREFIX)) return R_PAGE + id.slice(PAGE_PREFIX.length); + if (id === TOKENS_ID) return R_TOKENS; + if (id === LAYOUTS_ID) return R_LAYOUTS; + return null; + }, + async load(id) { + if (id === R_SITE) { + const b = await ensure(); + const pages = b.routes + .map((r) => `${JSON.stringify(r.page)}: () => import(${JSON.stringify(PAGE_PREFIX + r.page)})`) + .filter((v, i, a) => a.indexOf(v) === i) + .join(',\n '); + return ( + `export const site = ${JSON.stringify(b.site)};\n` + + `export const routes = ${JSON.stringify(b.routes)};\n` + + `export const pages = {\n ${pages}\n};\n` + ); + } + if (id.startsWith(R_PAGE)) { + const b = await ensure(); + const pageId = id.slice(R_PAGE.length); + const page = [...b.pages.values()].find((p) => p.route.page === pageId); + if (!page) return 'export default { html: "", toc: [] }'; + const data = { html: page.html, toc: page.toc, hero: page.hero, features: page.features, frontmatter: page.frontmatter }; + return `export default ${JSON.stringify(data)};`; + } + if (id === R_TOKENS) { + const b = await ensure(); + return b.tokenCss; + } + if (id === R_LAYOUTS) { + const entries = Object.entries(cfg.layouts ?? {}); + return ( + entries.map(([, file], i) => `import L${i} from ${JSON.stringify(file.split('\\').join('/'))};`).join('\n') + + `\nexport const layouts = { ${entries.map(([name], i) => `${JSON.stringify(name)}: L${i}`).join(', ')} };\n` + ); + } + return null; + }, + transformIndexHtml: { + order: 'pre', + async handler(html) { + const b = await ensure(); + const redirect = localeRedirectScript(b.site); + const favicon = b.site.favicon ?? b.site.logo?.src; + const headExtra = (cfg.head ?? []) + .map(([tag, attrs, content]) => { + const a = Object.entries(attrs) + .map(([k, v]) => (v === true ? k : v === false ? '' : `${k}="${String(v).replace(/"/g, '"')}"`)) + .filter(Boolean) + .join(' '); + return ['meta', 'link', 'base'].includes(tag) ? `<${tag} ${a}>` : `<${tag}${a ? ' ' + a : ''}>${content ?? ''}</${tag}>`; + }) + .join('\n '); + const entryClient = '/' + relative(root, join(KIT_DOCS_APP_DIR, 'entry-client.tsx')).split('\\').join('/'); + return html + .replace('src="./entry-client.tsx"', `src="${entryClient}"`) + .replace('<!--kit-theme-->', `<script>${themeInitScript}</script>${redirect ? `\n <script>${redirect}</script>` : ''}`) + .replace( + '<!--kit-fonts-->', + `<link rel="preconnect" href="https://fonts.googleapis.com">\n <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>\n <link rel="stylesheet" href="${GOOGLE_FONTS_HREF}">`, + ) + .replace('<!--kit-favicon-->', favicon ? `<link rel="icon" href="${favicon}">` : '') + .replace('<!--kit-head-extra-->', headExtra); + }, + }, + configureServer(server: ViteDevServer) { + server.watcher.add(cfg.contentRoot); + const onChange = async (file: string) => { + if (!resolve(file).startsWith(cfg.contentRoot)) return; + await rebuild(new Set([resolve(file)])); + for (const id of [R_SITE, R_TOKENS]) { + const m = server.moduleGraph.getModuleById(id); + if (m) server.moduleGraph.invalidateModule(m); + } + for (const m of server.moduleGraph.idToModuleMap.values()) if (m.id?.startsWith(R_PAGE)) server.moduleGraph.invalidateModule(m); + server.ws.send({ type: 'full-reload' }); + }; + server.watcher.on('change', onChange); + server.watcher.on('add', onChange); + server.watcher.on('unlink', onChange); + return () => { + server.middlewares.use(async (req, res, next) => { + // Vite's base middleware strips the base from req.url; use the original URL. + const url = ((req as { originalUrl?: string }).originalUrl ?? req.url ?? '/').split('?')[0]!; + if (req.method !== 'GET' && req.method !== 'HEAD') return next(); + if (!url.startsWith(cfg.base)) return next(); + const rel = decodeURIComponent(url.slice(cfg.base.length)); + await ensure(); + for (const f of searchFiles.values()) { + if (f.file === rel) { + res.setHeader('content-type', 'application/json'); + res.end(f.json); + return; + } + } + // content assets (MkDocs: images next to markdown) + if (rel && extname(rel) && !rel.endsWith('.html')) { + const p = join(cfg.contentRoot, rel); + if (existsSync(p) && statSync(p).isFile()) { + res.end(readFileSync(p)); + return; + } + return next(); + } + const template = readFileSync(appHtml, 'utf8'); + // Transform as if requested at the template's own location so ./entry-client.tsx resolves. + const html = await server.transformIndexHtml('/' + relative(root, appHtml).split('\\').join('/'), template); + res.setHeader('content-type', 'text/html; charset=utf-8'); + res.end(html); + }); + }; + }, + generateBundle(_opts, bundle) { + if (isSsr || !built) return; + const b = built; + for (const f of searchFiles.values()) this.emitFile({ type: 'asset', fileName: f.file, source: f.json }); + this.emitFile({ type: 'asset', fileName: '.nojekyll', source: '' }); + // page module → chunk (+ its static imports) for <link rel=modulepreload> during prerender + const pages: Record<string, string[]> = {}; + for (const out of Object.values(bundle)) { + if (out.type === 'chunk' && out.facadeModuleId?.startsWith(R_PAGE)) { + pages[out.facadeModuleId.slice(R_PAGE.length)] = [out.fileName, ...out.imports]; + } + } + mkdirSync(join(root, '.kit'), { recursive: true }); + writeFileSync(join(root, '.kit/client-pages.json'), JSON.stringify({ pages, appHtml: relative(root, appHtml).split('\\').join('/'), outDir: cfg.outRoot }, null, 2)); + // sitemap + if (cfg.sitemap && cfg.hostname) { + const urls = b.routes + .map((r) => { + const alts = Object.entries(r.alternates); + const links = + alts.length > 1 + ? alts + .map(([code, p]) => ` <xhtml:link rel="alternate" hreflang="${b.site.locales.find((l) => l.code === code)?.lang ?? code}" href="${cfg.hostname}${cfg.base}${encodeURI(p)}"/>`) + .join('\n') + '\n' + : ''; + const lastmod = r.lastUpdated ? ` <lastmod>${new Date(r.lastUpdated).toISOString().slice(0, 10)}</lastmod>\n` : ''; + return ` <url>\n <loc>${cfg.hostname}${cfg.base}${encodeURI(r.path)}</loc>\n${lastmod}${links} </url>`; + }) + .join('\n'); + this.emitFile({ + type: 'asset', + fileName: 'sitemap.xml', + source: `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">\n${urls}\n</urlset>\n`, + }); + } + }, + writeBundle() { + if (isSsr || !built) return; + const b = built; + // MkDocs: every non-markdown file in the content dir is copied verbatim (logo.svg, favicon.ico, img/…) + if (cfg.copyContentAssets) { + for (const rel of b.scan.assets) { + const to = join(cfg.outRoot, rel); + mkdirSync(dirname(to), { recursive: true }); + copyFileSync(join(cfg.contentRoot, rel), to); + } + } + for (const a of b.assets.values()) { + const to = join(cfg.outRoot, a.out); + mkdirSync(dirname(to), { recursive: true }); + copyFileSync(a.abs, to); + } + }, + }; + + const plugins: PluginOption[] = [plugin]; + if (options.react !== false) plugins.push(react()); + if (options.tailwind !== false) plugins.push(tailwindcss()); + return plugins; +} + +export { defineDocsConfig } from './config.ts'; +export type { DocsConfig } from './config.ts'; diff --git a/kit/docs/prerender.mjs b/kit/docs/prerender.mjs new file mode 100644 index 00000000..34288d09 --- /dev/null +++ b/kit/docs/prerender.mjs @@ -0,0 +1,60 @@ +#!/usr/bin/env node +// Prerender every route of a levimc-kit docs site into static HTML (run after the client + SSR builds). +// Usage: node kit/docs/prerender.mjs [--root <appDir>] +import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; +import { pathToFileURL } from 'node:url'; + +export async function prerenderDocs({ root = process.cwd(), outDir } = {}) { + const ssrEntry = join(root, '.kit/ssr/entry-server.js'); + const manifestPath = join(root, '.kit/client-pages.json'); + if (!existsSync(ssrEntry)) throw new Error(`SSR bundle not found at ${ssrEntry} — run the SSR build first.`); + const mod = await import(pathToFileURL(ssrEntry).href); + const { site, routes, render } = mod; + const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); + const out = outDir ?? manifest.outDir ?? join(root, 'dist'); + const templatePath = join(out, manifest.appHtml); + const template = readFileSync(templatePath, 'utf8'); + const escJson = (v) => JSON.stringify(v).replace(/</g, '\\u003c').replace(/[\u2028\u2029]/g, (c) => (c === '\u2028' ? '\\u2028' : '\\u2029')); + + const fill = (r, preload) => + template + .replace(/<html lang="[^"]*"/, `<html lang="${r.lang}"`) + .replace('<!--kit-head-->', r.head + preload) + .replace('<!--kit-app-->', r.html) + .replace('<!--kit-page-data-->', r.pageData ? `<script type="application/json" id="kit-page-data">${escJson(r.pageData)}</script>` : ''); + + let count = 0; + for (const route of routes) { + const r = await render(site.base + route.path); + const chunks = manifest.pages[route.page] ?? []; + const preload = chunks.map((f) => `\n <link rel="modulepreload" href="${site.base}${f}">`).join(''); + const file = join(out, r.file); + mkdirSync(dirname(file), { recursive: true }); + writeFileSync(file, fill(r, preload)); + count++; + } + // themed, locale-aware 404 (GitHub Pages serves it for every missing path under the site) + const nf = await render(site.base + '__kit_404__'); + writeFileSync(join(out, '404.html'), fill({ ...nf, file: '404.html' }, '')); + // the raw template is not a page + rmSync(templatePath); + let d = dirname(templatePath); + while (d.startsWith(out) && d !== out) { + try { + rmSync(d); + } catch { + break; + } + d = dirname(d); + } + return { count }; +} + +if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) { + const args = process.argv.slice(2); + const root = args.includes('--root') ? resolve(args[args.indexOf('--root') + 1]) : process.cwd(); + const t0 = Date.now(); + const { count } = await prerenderDocs({ root }); + console.log(`[kit-docs] prerendered ${count} pages + 404.html in ${Date.now() - t0} ms`); +} diff --git a/kit/docs/shared/head.ts b/kit/docs/shared/head.ts new file mode 100644 index 00000000..e3f832bb --- /dev/null +++ b/kit/docs/shared/head.ts @@ -0,0 +1,85 @@ +// <head> generation for prerendered pages + the root-only language redirect script. +import type { RouteMeta, SiteData } from './types.ts'; + +const esc = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); + +export function pageTitle(site: SiteData, route: RouteMeta | undefined, fallback?: string): string { + if (!route) return fallback ? `${fallback} | ${site.title}` : site.title; + if (route.layout === 'home' || route.title === site.title) return site.title; + return site.titleTemplate.replace(':title', route.title).replace(':site', site.title); +} + +export function absoluteUrl(site: SiteData, path: string): string { + return (site.hostname ?? '') + site.base + path; +} + +/** + * Language auto-redirect, inlined in <head>. Runs only when the URL is exactly the site root (base or + * base + index.html) — never on deep links. Stored choice (localStorage `levimc-locale-<site>`) wins, + * otherwise the first navigator.languages entry that matches a locale. + */ +export function localeRedirectScript(site: Pick<SiteData, 'base' | 'siteKey' | 'locales' | 'defaultLocale'>): string { + if (site.locales.length < 2) return ''; + const L = site.locales.map((l) => ({ c: l.code, l: l.lang.toLowerCase(), p: l.prefix })); + return ( + `(function(){try{var b=${JSON.stringify(site.base)},p=location.pathname;if(p!==b&&p!==b+"index.html")return;` + + `var L=${JSON.stringify(L)},k=${JSON.stringify('levimc-locale-' + site.siteKey)},s=null,pick=null,i,j;` + + `try{s=localStorage.getItem(k)}catch(e){}` + + `if(s){for(i=0;i<L.length;i++)if(L[i].c===s)pick=L[i]}` + + `else{var N=(navigator.languages&&navigator.languages.length?navigator.languages:[navigator.language||""]);` + + `for(j=0;j<N.length&&!pick;j++){var t=String(N[j]||"").toLowerCase(),q=t.split("-")[0],tw=/^zh-(tw|hk|mo|hant)/.test(t);` + + `for(i=0;i<L.length;i++)if(L[i].l===t||L[i].c.toLowerCase()===t){pick=L[i];break}` + + `if(!pick&&q==="zh"){for(i=0;i<L.length;i++){var z=L[i].l;if(z.split("-")[0]==="zh"&&(tw?/^zh-(tw|hk|mo|hant)/.test(z):!/^zh-(tw|hk|mo|hant)/.test(z))){pick=L[i];break}}}` + + `if(!pick)for(i=0;i<L.length;i++)if(L[i].l.split("-")[0]===q){pick=L[i];break}}}` + + `if(pick&&pick.p)location.replace(b+pick.p+location.search+location.hash)}catch(e){}})();` + ); +} + +export interface HeadOptions { + title: string; + description?: string; + canonical?: string; + alternates?: { lang: string; href: string }[]; + xDefault?: string; + locale?: string; + image?: string; + noindex?: boolean; + siteName: string; +} + +export function headTags(o: HeadOptions): string { + const t: string[] = []; + t.push(`<title>${esc(o.title)}`); + if (o.description) t.push(``); + if (o.noindex) t.push(''); + if (o.canonical) t.push(``); + for (const a of o.alternates ?? []) t.push(``); + if (o.xDefault) t.push(``); + t.push(``); + t.push(``); + t.push(``); + if (o.description) t.push(``); + if (o.canonical) t.push(``); + if (o.locale) t.push(``); + if (o.image) t.push(``); + t.push(``); + return t.join('\n '); +} + +export function routeHead(site: SiteData, route: RouteMeta | undefined, notFoundTitle?: string): string { + if (!route) return headTags({ title: pageTitle(site, undefined, notFoundTitle ?? '404'), siteName: site.title, noindex: true, description: site.description }); + const alternates = Object.entries(route.alternates) + .map(([code, path]) => ({ lang: site.locales.find((l) => l.code === code)?.lang ?? code, href: absoluteUrl(site, path) })) + .filter(() => Object.keys(route.alternates).length > 1); + const def = route.alternates[site.defaultLocale]; + return headTags({ + title: pageTitle(site, route), + description: route.description, + canonical: site.hostname ? absoluteUrl(site, route.path) : undefined, + alternates: site.hostname ? alternates : undefined, + xDefault: site.hostname && def !== undefined && alternates.length ? absoluteUrl(site, def) : undefined, + locale: site.locales.find((l) => l.code === route.locale)?.lang, + image: site.hostname && site.logo ? (/^https?:/.test(site.logo.src) ? site.logo.src : site.hostname + site.logo.src) : undefined, + siteName: site.title, + }); +} diff --git a/kit/docs/shared/routing.ts b/kit/docs/shared/routing.ts new file mode 100644 index 00000000..8bd3dc6e --- /dev/null +++ b/kit/docs/shared/routing.ts @@ -0,0 +1,45 @@ +// Route matching shared by SSR, the client router and the prerenderer. +import type { RouteMeta, SiteData } from './types.ts'; + +export function stripBase(pathname: string, base: string): string | null { + let p = pathname; + try { + p = decodeURI(pathname); + } catch { + /* keep raw */ + } + if (p === base.slice(0, -1)) return ''; + if (!p.startsWith(base)) return null; + return p.slice(base.length); +} + +/** All the request paths GitHub Pages would serve for a canonical route path. */ +export function pathVariants(path: string): string[] { + const out = [path]; + if (path === '' || path.endsWith('/')) out.push(path + 'index.html'); + else if (path.endsWith('.html')) out.push(path.slice(0, -5)); + else out.push(path + '.html', path + '/'); + return out; +} + +export function createRouteMatcher(routes: RouteMeta[]) { + const map = new Map(); + for (const r of routes) for (const v of pathVariants(r.path)) if (!map.has(v)) map.set(v, r); + return (relPath: string | null): RouteMeta | undefined => (relPath === null ? undefined : map.get(relPath)); +} + +/** Output file (relative to outDir) for a canonical route path. */ +export function outFileFor(path: string): string { + if (path === '' || path.endsWith('/')) return path + 'index.html'; + if (path.endsWith('.html')) return path; + return path + '.html'; +} + +/** Locale of an arbitrary path (relative to base) from its prefix. */ +export function localeFromPath(site: Pick, relPath: string | null): string { + if (relPath) { + const hit = site.locales.filter((l) => l.prefix && relPath.startsWith(l.prefix)).sort((a, b) => b.prefix.length - a.prefix.length)[0]; + if (hit) return hit.code; + } + return site.defaultLocale; +} diff --git a/kit/docs/shared/search.ts b/kit/docs/shared/search.ts new file mode 100644 index 00000000..fcff3d91 --- /dev/null +++ b/kit/docs/shared/search.ts @@ -0,0 +1,50 @@ +// Search tokenisation shared by the build-time indexer and the browser (MiniSearch needs identical options +// for indexing and querying). CJK runs are indexed as overlapping character bigrams (single characters for +// one-character runs) so Chinese/Japanese/Korean text is searchable without a dictionary. + +const TOKEN_RE = /([\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]+)|([\p{L}\p{N}_]+)/gu; + +export function tokenize(text: string): string[] { + const out: string[] = []; + for (const m of text.matchAll(TOKEN_RE)) { + const cjk = m[1]; + if (cjk) { + if (cjk.length === 1) out.push(cjk); + else for (let i = 0; i < cjk.length - 1; i++) out.push(cjk.slice(i, i + 2)); + } else if (m[2]) { + out.push(m[2]); + // also index camelCase / PascalCase parts: getPosition → get, position + const parts = m[2].split(/(?<=[a-z0-9])(?=[A-Z])|_/).filter((p) => p && p.length > 1); + if (parts.length > 1) out.push(...parts); + } + } + return out; +} + +export function processTerm(term: string): string { + return term.toLowerCase(); +} + +export const SEARCH_FIELDS = ['title', 'page', 'crumbs', 'text'] as const; +export const SEARCH_STORE_FIELDS = ['title', 'page', 'crumbs', 'path', 'text'] as const; +export const SNIPPET_STORE_CHARS = 700; + +export const searchOptions = { + fields: [...SEARCH_FIELDS], + storeFields: [...SEARCH_STORE_FIELDS], + tokenize, + processTerm, +}; + +/** Query-time tokenizer: like tokenize(), without the camelCase expansion. */ +export function tokenizeQuery(text: string): string[] { + const out: string[] = []; + for (const m of text.matchAll(TOKEN_RE)) { + const cjk = m[1]; + if (cjk) { + if (cjk.length === 1) out.push(cjk); + else for (let i = 0; i < cjk.length - 1; i++) out.push(cjk.slice(i, i + 2)); + } else if (m[2]) out.push(m[2]); + } + return out; +} diff --git a/kit/docs/shared/types.ts b/kit/docs/shared/types.ts new file mode 100644 index 00000000..48a44e7a --- /dev/null +++ b/kit/docs/shared/types.ts @@ -0,0 +1,140 @@ +// Data shapes shared by the build (docs/node) and the runtime app (docs/app). +// Everything here is plain JSON so it can be serialised into virtual modules and page HTML. + +export interface LocaleInfo { + code: string; + label: string; + lang: string; + /** URL prefix relative to base: '' for the default locale, e.g. 'zh/' or 'zh-CN/'. */ + prefix: string; +} + +export interface NavLink { + text: string; + /** Path relative to base (internal) or absolute URL (external). */ + link: string; + external?: boolean; + /** For internal links: the page key, used for active-state matching. */ + key?: string; +} + +export interface NavItem extends Partial { + text: string; + items?: NavItem[]; + /** Internal path prefix that marks this item active (relative to base). */ + activePrefix?: string; + collapsed?: boolean; +} + +export interface TocEntry { + level: number; + id: string; + text: string; +} + +export interface HeroData { + name?: string; + text?: string; + tagline?: string; + image?: { src: string; alt?: string; width?: number; height?: number }; + actions?: { theme?: 'brand' | 'alt'; text: string; link: string; external?: boolean }[]; +} + +export interface FeatureData { + title: string; + details?: string; + icon?: string; + link?: string; + linkText?: string; + external?: boolean; +} + +export interface RouteMeta { + /** Canonical path relative to base ('' = site root). */ + path: string; + locale: string; + /** Page module id (stable, URL-safe). */ + page: string; + /** Page key without locale (e.g. 'api_reference/data'). */ + key: string; + title: string; + description?: string; + /** 'doc' | 'home' | 'page' | a custom layout name from config.layouts */ + layout: string; + /** Locale code → canonical path of the same page in that locale. */ + alternates: Record; + /** Source path relative to the content dir (for edit links). */ + source: string; + lastUpdated?: number; + /** "Edit this page" URL (computed at build time from config.editLink). */ + editUrl?: string; + /** True when the page shows default-locale content at a localized URL (missing translation). */ + fallback?: boolean; + sidebar?: string; + nav?: number; + prev?: { text: string; path: string }; + next?: { text: string; path: string }; +} + +export interface SidebarData { + title?: string; + items: NavItem[]; + /** VitePress semantics: every group is open unless `collapsed: true`. MkDocs: nested groups open only on the active path. */ + expand?: boolean; +} + +export interface SiteData { + base: string; + title: string; + description: string; + hostname?: string; + logo?: { src: string; alt: string; dark?: string }; + favicon?: string; + project?: string; + siteKey: string; + urlStyle: 'directory' | 'html'; + cleanUrls: boolean; + defaultLocale: string; + locales: LocaleInfo[]; + nav: Record; + sidebars: Record; + social: { icon: string; link: string; label?: string }[]; + editLink?: { text?: Record }; + footer?: { message?: string; copyright?: string }; + outline: [number, number]; + search: Record; + ui: Record>; + titleTemplate: string; + lastUpdated: boolean; + homePaths: Record; +} + +export interface PageData { + html: string; + toc: TocEntry[]; + hero?: HeroData; + features?: FeatureData[]; + frontmatter?: Record; +} + +/** Embedded into every prerendered page as + ${fonts.FONT_HEAD_HTML} + + + ${extra}`; +const docsCards = projects.DOCS_PROJECTS.map( + (p) => `${p.name}${i18n.UI_STRINGS.en.projectBlurbs[p.id]}`, +).join('\n '); +const page = ({ title, extraHead = '', main }) => ` + + + ${head(title, extraHead)} + + + + +
+ ${snippets.globalBarHtml({ locale: 'en', current: 'docs' })} +
+${main} +
+ ${snippets.footerHtml({ locale: 'en' })} +
+ + + +`; +writeFileSync( + join(out, 'pages', 'index.html'), + page({ + title: 'LeviMC Docs', + extraHead: `\n \n `, + main: `
+

docs.levimc.org

+

Redirecting to levimc.org…

+

Project documentation lives under docs.levimc.org/<Project>/:

+
+ ${docsCards} +
+
`, + }), +); +writeFileSync( + join(out, 'pages', '404.html'), + page({ + title: 'Page not found | LeviMC Docs', + extraHead: '', + main: `
+ +

Error 404

+

This page wandered off

+

Your compass is spinning — the page you are looking for does not exist or has moved. Pick a project:

+
+ ${docsCards} +
+

levimc.org

+
`, + }), +); + +// ---------------------------------------------------------------- 3. Doxygen header/footer templates +const doxHeader = ` + + + + + + + +$projectname: $title +$title + +${fonts.FONT_HEAD_HTML.replace(/ \/>/g, '/>')} + + + + + + + + +$treeview +$search +$mathjax +$darkmode + +$extrastylesheet + + + + + +
+ + + +
+${snippets.globalBarHtml({ locale: 'en', current: 'docs', currentDocs: 'LeviLamina' })} + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
$projectname $projectnumber +
+
$projectbrief
+
+
$projectbrief
+
$searchbox
$searchbox
+
+ + +`; +writeFileSync(join(out, 'doxygen', 'header.html'), doxHeader); +const doxFooter = ` + + + + + + + + + + +`; +writeFileSync(join(out, 'doxygen', 'footer.html'), doxFooter); + +// ---------------------------------------------------------------- 4. kit.css (Tailwind v4) +const tmp = join(out, '.css-build'); +await build({ + root: here, + configFile: false, + logLevel: 'warn', + plugins: [tailwindcss()], + build: { + outDir: tmp, + emptyOutDir: true, + cssMinify: true, + rollupOptions: { input: join(here, 'static-entry.css'), output: { assetFileNames: 'kit[extname]' } }, + }, +}); +const cssFile = readdirSync(tmp).find((f) => f.endsWith('.css')); +renameSync(join(tmp, cssFile), join(out, 'kit.css')); +rmSync(tmp, { recursive: true, force: true }); + +// kit-chrome.css: chrome only, no preflight, cascade layers unwrapped (for Doxygen and other foreign pages) +await build({ + root: here, + configFile: false, + logLevel: 'warn', + plugins: [tailwindcss()], + build: { + outDir: tmp, + emptyOutDir: true, + cssMinify: true, + rollupOptions: { input: join(here, 'chrome-entry.css'), output: { assetFileNames: 'kit-chrome[extname]' } }, + }, +}); +const chromeFile = readdirSync(tmp).find((f) => f.endsWith('.css')); +writeFileSync(join(out, 'kit-chrome.css'), unwrapLayers(readFileSync(join(tmp, chromeFile), 'utf8'))); +rmSync(tmp, { recursive: true, force: true }); + +/** Remove `@layer a,b;` statements and unwrap `@layer x { … }` blocks (brace matching, strings respected). */ +function unwrapLayers(css) { + let s = css.replace(/@layer\s+[\w-]+(\s*,\s*[\w-]+)*\s*;/g, ''); + for (;;) { + const m = /@layer\s+[\w-]+\s*\{/.exec(s); + if (!m) break; + let depth = 1; + let i = m.index + m[0].length; + let quote = null; + for (; i < s.length && depth > 0; i++) { + const c = s[i]; + if (quote) { + if (c === '\\') i++; + else if (c === quote) quote = null; + } else if (c === '"' || c === "'") quote = c; + else if (c === '{') depth++; + else if (c === '}') depth--; + } + s = s.slice(0, m.index) + s.slice(m.index + m[0].length, i - 1) + s.slice(i); + } + return s; +} +console.log(`static: wrote globalbar/footer snippets (${i18n.UI_LOCALES.length} locales), theme-init*.js, pages/, doxygen/, kit.css and kit-chrome.css → ${out}`); +// copy pixel icons next to the pages (pages reference icons/*.svg) +mkdirSync(join(out, 'icons'), { recursive: true }); +for (const f of readdirSync(join(here, '../assets/icons'))) writeFileSync(join(out, 'icons', f), readFileSync(join(here, '../assets/icons', f))); +writeFileSync(join(out, 'grass.svg'), readFileSync(join(here, '../assets/icons/grass.svg'))); diff --git a/kit/static/chrome-entry.css b/kit/static/chrome-entry.css new file mode 100644 index 00000000..a38a941e --- /dev/null +++ b/kit/static/chrome-entry.css @@ -0,0 +1,13 @@ +/* Source for static/kit-chrome.css: only the shared chrome (GlobalBar, SiteFooter, menus, pixel + utilities, painterly textures) for pages that bring their own CSS (Doxygen). No Tailwind preflight; + build-static.mjs unwraps the cascade layers so these rules can compete with foreign unlayered CSS. */ +@import "tailwindcss/theme.css"; +@import "tailwindcss/utilities.css"; +@import "../theme/tokens.css"; +@import "../theme/generated.css"; +@import "../theme/pixel.css"; +@import "../theme/painterly.css"; +@import "../theme/chrome.css"; +@import "./chrome-reset.css"; +@source "./globalbar.html"; +@source "./footer.html"; diff --git a/kit/static/chrome-reset.css b/kit/static/chrome-reset.css new file mode 100644 index 00000000..d9435e75 --- /dev/null +++ b/kit/static/chrome-reset.css @@ -0,0 +1,55 @@ +/* Scoped reset for the kit chrome when it is embedded in foreign pages (no Tailwind preflight there). */ +.kit-gbar, +.kit-gbar *, +.kit-gbar *::before, +.kit-gbar *::after, +.kit-footer, +.kit-footer *, +.kit-footer *::before, +.kit-footer *::after { + box-sizing: border-box; +} +.kit-gbar, +.kit-footer { + font-family: var(--font-sans); + line-height: 1.5; + -webkit-font-smoothing: antialiased; + text-align: left; +} +.kit-gbar :is(div, p, span, ul, li, nav, details, summary, a, button), +.kit-footer :is(div, p, span, ul, li, nav, a) { + font-size: inherit; + font-family: inherit; +} +.kit-gbar :is(ul, ol, p, h1, h2, h3), +.kit-footer :is(ul, ol, p, h1, h2, h3) { + margin: 0; + padding: 0; + border: 0; +} +.kit-gbar button, +.kit-footer button { + font: inherit; + color: inherit; + background: none; + border: 0; + padding: 0; +} +.kit-gbar a, +.kit-footer a { + text-decoration: none; +} +.kit-gbar svg, +.kit-footer svg { + display: block; +} +.kit-gbar summary { + display: inline-flex; + list-style: none; +} +.kit-gbar summary::marker { + content: ""; +} +.kit-gbar summary::before { + content: none !important; +} diff --git a/kit/static/doxygen/doxygen-kit.css b/kit/static/doxygen/doxygen-kit.css new file mode 100644 index 00000000..39a38b90 --- /dev/null +++ b/kit/static/doxygen/doxygen-kit.css @@ -0,0 +1,356 @@ +/* + * levimc-kit overlay for doxygen-awesome-css v2.4.1 ("Impression, Craft" on Doxygen API pages). + * + * Doxyfile: + * HTML_HEADER = docs/api/header.html (copy of kit/static/doxygen/header.html) + * HTML_FOOTER = docs/api/footer.html (copy of kit/static/doxygen/footer.html) + * HTML_EXTRA_STYLESHEET = docs/api/doxygen-awesome-css/doxygen-awesome.css \ + * kit/static/kit-chrome.css \ + * kit/static/doxygen/doxygen-kit.css + * HTML_EXTRA_FILES = kit/static/kit.js + * HTML_COLORSTYLE = LIGHT (the kit scripts toggle html.dark-mode / html.light-mode) + * Do NOT include doxygen-awesome-darkmode-toggle.js: kit.js owns the theme (localStorage "levimc-theme"). + */ + +html { + --primary-color: #3a7047; + --primary-dark-color: #2b5636; + --primary-light-color: #6fbf73; + --on-primary-color: #ffffff; + --link-color: #356b42; + + --page-background-color: #f7f3e8; + --page-foreground-color: #1f2a33; + --page-secondary-foreground-color: #5b6770; + --separator-color: #e2dacb; + + --border-radius-large: 0px; + --border-radius-small: 0px; + --border-radius-medium: 0px; + + --box-shadow: 0 2px 0 0 rgb(31 42 51 / 0.12), 0 6px 0 0 rgb(31 42 51 / 0.05); + --odd-color: rgb(31 42 51 / 0.025); + + --font-family: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", sans-serif; + --font-family-monospace: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + --page-font-size: 15.5px; + --content-line-height: 27px; + + --warning-color: #faf1dc; + --warning-color-dark: #b7791f; + --warning-color-darker: #5c3d0c; + --note-color: #e3edf3; + --note-color-dark: #3e6e8e; + --note-color-darker: #1f3a4d; + --todo-color: #ece6f6; + --todo-color-dark: #7a63a8; + --todo-color-darker: #3b2c5c; + --deprecated-color: #eeebe3; + --deprecated-color-dark: #6f7479; + --deprecated-color-darker: #3c3f42; + --bug-color: #f8e1e0; + --bug-color-dark: #c0392b; + --bug-color-darker: #6e1d16; + --invariant-color: #e3eddc; + --invariant-color-dark: #2f8a4f; + --invariant-color-darker: #1d4a2c; + + --blockquote-background: #f0ebdd; + --blockquote-foreground: #5b6770; + --tablehead-background: #f0ebdd; + --tablehead-foreground: #1f2a33; + + --menu-focus-foreground: #ffffff; + --menu-focus-background: #3a7047; + --menu-selected-background: rgb(79 138 91 / 0.12); + + --header-background: #fffdf7; + --header-foreground: #1f2a33; + --searchbar-background: #fffdf7; + --searchbar-foreground: #1f2a33; + --searchbar-border-radius: 0px; + + --code-background: #fbf8ef; + --code-foreground: #26323b; + --fragment-background: #fbf8ef; + --fragment-foreground: #26323b; + --fragment-keyword: #7a3f9c; + --fragment-keywordtype: #0e6a73; + --fragment-keywordflow: #a12f4f; + --fragment-token: #2f6f3d; + --fragment-comment: #69737b; + --fragment-link: #2a5d84; + --fragment-preprocessor: #a12f4f; + --fragment-linenumber-color: #9aa0a3; + --fragment-linenumber-background: #f1ecdf; + --fragment-linenumber-border: #e2dacb; + + --side-nav-background: #fbf8ef; + --side-nav-foreground: #1f2a33; + --toc-background: #fffdf7; + --toc-foreground: #1f2a33; + --webkit-scrollbar-color: #c4b9a2; +} + +html.dark-mode { + color-scheme: dark; + --primary-color: #6fbf73; + --primary-dark-color: #8fd48f; + --primary-light-color: #3a7047; + --on-primary-color: #0f1b26; + --link-color: #7fcc83; + + --page-background-color: #0f1b26; + --page-foreground-color: #e8eef2; + --page-secondary-foreground-color: #9aaab8; + --separator-color: #233648; + --box-shadow: 0 2px 0 0 rgb(0 0 0 / 0.35), 0 6px 0 0 rgb(0 0 0 / 0.18); + --odd-color: rgb(255 255 255 / 0.025); + + --warning-color: #2b2416; + --warning-color-dark: #f2b05e; + --warning-color-darker: #f7d9a8; + --note-color: #17283a; + --note-color-dark: #78aedb; + --note-color-darker: #cfe3f3; + --todo-color: #221d33; + --todo-color-dark: #b7a4e6; + --todo-color-darker: #e3daf7; + --deprecated-color: #1c2731; + --deprecated-color-dark: #a3adb6; + --deprecated-color-darker: #dce3e8; + --bug-color: #2e1a1d; + --bug-color-dark: #f07a6e; + --bug-color-darker: #f8cdc8; + --invariant-color: #15291f; + --invariant-color-dark: #6fcf8a; + --invariant-color-darker: #cdeed5; + + --blockquote-background: #152535; + --blockquote-foreground: #9aaab8; + --tablehead-background: #1a2d3f; + --tablehead-foreground: #e8eef2; + --menu-selected-background: rgb(111 191 115 / 0.14); + --menu-focus-foreground: #0f1b26; + --menu-focus-background: #6fbf73; + + --header-background: #152535; + --header-foreground: #e8eef2; + --searchbar-background: #0b1620; + --searchbar-foreground: #e8eef2; + + --code-background: #0b1620; + --code-foreground: #dce5ec; + --fragment-background: #0b1620; + --fragment-foreground: #dce5ec; + --fragment-keyword: #c6a8ff; + --fragment-keywordtype: #e9c46a; + --fragment-keywordflow: #f394b4; + --fragment-token: #9bd69e; + --fragment-comment: #8496a8; + --fragment-link: #8fd3e0; + --fragment-preprocessor: #f394b4; + --fragment-linenumber-color: #5d7184; + --fragment-linenumber-background: #0e1b27; + --fragment-linenumber-border: #1a2d3f; + + --side-nav-background: #122130; + --side-nav-foreground: #e8eef2; + --toc-background: #152535; + --toc-foreground: #e8eef2; + --webkit-scrollbar-color: #36506a; +} + +/* doxygen-awesome applies its own dark palette for prefers-color-scheme: dark unless html.light-mode is set; + the kit's theme-init script always sets exactly one of .dark-mode / .light-mode, so mirror the dark + values here for that media query too (covers the first paint before kit.js loads). */ +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + --page-background-color: #0f1b26; + --page-foreground-color: #e8eef2; + --side-nav-background: #122130; + --header-background: #152535; + } +} + +/* ------------------------------------------------------------------ page frame */ +body { + background: var(--page-background-color); +} +#top { + background: var(--header-background); + border-bottom: 0; +} +#top > .kit-gbar { + position: relative; + flex: 0 0 100%; + width: 100%; + order: -1; +} +#top > #titlearea { + flex: 1 1 100%; +} +#titlearea { + position: relative; + padding: 14px 20px 18px; + border-bottom: 0; + background: + linear-gradient(90deg, var(--header-background) 0%, color-mix(in srgb, var(--header-background) 82%, transparent) 46%, transparent 100%), + var(--kit-paint-lilies) center 32% / cover no-repeat; +} +html.dark-mode #titlearea { + background: + linear-gradient(90deg, var(--header-background) 0%, color-mix(in srgb, var(--header-background) 80%, transparent) 46%, transparent 100%), + var(--kit-paint-sunrise) center 30% / cover no-repeat; +} +#titlearea::after { + content: ""; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 8px; + background: var(--kit-grass-strip) repeat-x 0 0 / 16px 8px; + image-rendering: pixelated; +} +#projectname { + font-family: "Fraunces", Georgia, serif; + font-size: 28px; + font-weight: 600; + letter-spacing: -0.02em; +} +#projectlogo img { + max-height: 44px; +} +#main-nav { + border-bottom: 1px solid var(--separator-color); +} +.sm-dox, +.sm-dox a, +.sm-dox a:hover { + font-family: var(--font-family); +} +.sm-dox a.highlighted, +.sm-dox a:hover { + border-radius: 0 !important; +} +#MSearchBox { + border-radius: 0 !important; + box-shadow: + 0 -2px 0 0 var(--separator-color), + 0 2px 0 0 var(--separator-color), + -2px 0 0 0 var(--separator-color), + 2px 0 0 0 var(--separator-color) !important; +} + +/* page title in the display face */ +div.header .title, +div.headertitle .title { + font-family: "Fraunces", Georgia, "PingFang SC", "Microsoft YaHei", serif; + font-weight: 560; + letter-spacing: -0.015em; +} + +/* side tree: active item like the docs sidebar */ +#nav-tree .selected { + background: var(--menu-selected-background) !important; + box-shadow: inset 3px 0 0 0 var(--primary-color); + text-shadow: none; +} +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: 600; +} + +/* members & fragments get stepped pixel frames instead of rounded cards */ +.memitem, +div.fragment, +pre.fragment, +.memproto, +table.memberdecls, +table.fieldtable, +div.contents table.doxtable, +div.contents table.markdownTable { + border-radius: 0 !important; +} +.memitem { + box-shadow: + 0 -2px 0 0 var(--separator-color), + 0 2px 0 0 var(--separator-color), + -2px 0 0 0 var(--separator-color), + 2px 0 0 0 var(--separator-color), + 0 6px 0 0 var(--odd-color) !important; + margin: 2px 2px 28px; +} +.memtitle { + border-radius: 0 !important; + background: var(--tablehead-background) !important; + font-family: var(--font-family-monospace); +} +div.fragment { + box-shadow: + 0 -2px 0 0 var(--fragment-linenumber-border), + 0 2px 0 0 var(--fragment-linenumber-border), + -2px 0 0 0 var(--fragment-linenumber-border), + 2px 0 0 0 var(--fragment-linenumber-border); + border: 0 !important; + margin: 12px 2px; +} + +/* @note / @warning / @bug …: kit admonition edge */ +dl.section { + border-radius: 0 !important; + border-left-width: 4px !important; +} + +/* footer from the kit */ +.kit-dox-footer .kit-footer { + margin-top: 3rem; +} +#nav-path { + border-radius: 0; +} + +/* focus ring */ +a:focus-visible, +button:focus-visible, +summary:focus-visible { + outline: 2px solid #8e5cf6; + outline-offset: 2px; +} +html.dark-mode a:focus-visible, +html.dark-mode button:focus-visible, +html.dark-mode summary:focus-visible { + outline-color: #5de0e6; +} + +/* ------------------------------------------------------------------ kit chrome inside Doxygen + doxygen-awesome forces `a:link … { color: var(--link-color) !important }`; restore the chrome colours. */ +.kit-gbar a:is(:link, :visited, :hover, :focus, :active), +.kit-gbar summary { + color: var(--gbar-muted) !important; + font-weight: 500; + text-decoration: none !important; + background: transparent; +} +.kit-gbar a.kit-gbar-brand:is(:link, :visited, :hover, :focus, :active), +.kit-gbar a.kit-gbar-link:is(:hover, [aria-current="page"]), +.kit-gbar a.kit-gbar-icon:hover { + color: #ffffff !important; +} +.kit-gbar .kit-menu-panel a:is(:link, :visited, :hover, :focus, :active) { + color: var(--color-ink) !important; +} +.kit-footer a:is(:link, :visited, :active, :focus) { + color: #e0d3bc !important; + font-weight: 400; +} +.kit-footer a:hover { + color: #ffffff !important; +} +.kit-footer a.kit-footer-logo:is(:link, :visited, :hover) { + color: #ffffff !important; +} +.kit-footer a.kit-footer-social-link:is(:link, :visited, :hover) { + color: #eadfcb !important; +} diff --git a/kit/static/doxygen/footer.html b/kit/static/doxygen/footer.html new file mode 100644 index 00000000..95ca8065 --- /dev/null +++ b/kit/static/doxygen/footer.html @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/kit/static/doxygen/header.html b/kit/static/doxygen/header.html new file mode 100644 index 00000000..474752ff --- /dev/null +++ b/kit/static/doxygen/header.html @@ -0,0 +1,78 @@ + + + + + + + + +$projectname: $title +$title + + + + + + + + + + +$treeview +$search +$mathjax +$darkmode + +$extrastylesheet + + + + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
$projectname $projectnumber +
+
$projectbrief
+
+
$projectbrief
+
$searchbox
$searchbox
+
+ + diff --git a/kit/static/footer.html b/kit/static/footer.html new file mode 100644 index 00000000..bb4155e2 --- /dev/null +++ b/kit/static/footer.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/globalbar.html b/kit/static/globalbar.html new file mode 100644 index 00000000..9611457a --- /dev/null +++ b/kit/static/globalbar.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/grass.svg b/kit/static/grass.svg new file mode 100644 index 00000000..04673727 --- /dev/null +++ b/kit/static/grass.svg @@ -0,0 +1 @@ +Grass block diff --git a/kit/static/i18n/footer.de.html b/kit/static/i18n/footer.de.html new file mode 100644 index 00000000..c341d9bd --- /dev/null +++ b/kit/static/i18n/footer.de.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/footer.en.html b/kit/static/i18n/footer.en.html new file mode 100644 index 00000000..6a7c94a0 --- /dev/null +++ b/kit/static/i18n/footer.en.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/footer.es.html b/kit/static/i18n/footer.es.html new file mode 100644 index 00000000..8e1e5f0f --- /dev/null +++ b/kit/static/i18n/footer.es.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/footer.fr.html b/kit/static/i18n/footer.fr.html new file mode 100644 index 00000000..0d6b5d87 --- /dev/null +++ b/kit/static/i18n/footer.fr.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/footer.ja.html b/kit/static/i18n/footer.ja.html new file mode 100644 index 00000000..65bdb179 --- /dev/null +++ b/kit/static/i18n/footer.ja.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/footer.ko.html b/kit/static/i18n/footer.ko.html new file mode 100644 index 00000000..bd432ece --- /dev/null +++ b/kit/static/i18n/footer.ko.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/footer.ru.html b/kit/static/i18n/footer.ru.html new file mode 100644 index 00000000..ed1d59f8 --- /dev/null +++ b/kit/static/i18n/footer.ru.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/footer.zh-CN.html b/kit/static/i18n/footer.zh-CN.html new file mode 100644 index 00000000..40024a94 --- /dev/null +++ b/kit/static/i18n/footer.zh-CN.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/footer.zh-HK.html b/kit/static/i18n/footer.zh-HK.html new file mode 100644 index 00000000..215e0ba5 --- /dev/null +++ b/kit/static/i18n/footer.zh-HK.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/globalbar.de.html b/kit/static/i18n/globalbar.de.html new file mode 100644 index 00000000..e8b1a8dc --- /dev/null +++ b/kit/static/i18n/globalbar.de.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/globalbar.en.html b/kit/static/i18n/globalbar.en.html new file mode 100644 index 00000000..6ae4c0a7 --- /dev/null +++ b/kit/static/i18n/globalbar.en.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/globalbar.es.html b/kit/static/i18n/globalbar.es.html new file mode 100644 index 00000000..b2205168 --- /dev/null +++ b/kit/static/i18n/globalbar.es.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/globalbar.fr.html b/kit/static/i18n/globalbar.fr.html new file mode 100644 index 00000000..4346f850 --- /dev/null +++ b/kit/static/i18n/globalbar.fr.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/globalbar.ja.html b/kit/static/i18n/globalbar.ja.html new file mode 100644 index 00000000..0376604d --- /dev/null +++ b/kit/static/i18n/globalbar.ja.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/globalbar.ko.html b/kit/static/i18n/globalbar.ko.html new file mode 100644 index 00000000..3edfb93c --- /dev/null +++ b/kit/static/i18n/globalbar.ko.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/globalbar.ru.html b/kit/static/i18n/globalbar.ru.html new file mode 100644 index 00000000..6b59ebc7 --- /dev/null +++ b/kit/static/i18n/globalbar.ru.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/globalbar.zh-CN.html b/kit/static/i18n/globalbar.zh-CN.html new file mode 100644 index 00000000..67938636 --- /dev/null +++ b/kit/static/i18n/globalbar.zh-CN.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/i18n/globalbar.zh-HK.html b/kit/static/i18n/globalbar.zh-HK.html new file mode 100644 index 00000000..c6afa044 --- /dev/null +++ b/kit/static/i18n/globalbar.zh-HK.html @@ -0,0 +1,2 @@ + + diff --git a/kit/static/icons/apps.svg b/kit/static/icons/apps.svg new file mode 100644 index 00000000..1b06fba6 --- /dev/null +++ b/kit/static/icons/apps.svg @@ -0,0 +1 @@ +Sites diff --git a/kit/static/icons/arrow-left.svg b/kit/static/icons/arrow-left.svg new file mode 100644 index 00000000..a5a34ced --- /dev/null +++ b/kit/static/icons/arrow-left.svg @@ -0,0 +1 @@ +Arrow left diff --git a/kit/static/icons/arrow-right.svg b/kit/static/icons/arrow-right.svg new file mode 100644 index 00000000..e21ad27b --- /dev/null +++ b/kit/static/icons/arrow-right.svg @@ -0,0 +1 @@ +Arrow right diff --git a/kit/static/icons/arrow-up.svg b/kit/static/icons/arrow-up.svg new file mode 100644 index 00000000..8d20c6b3 --- /dev/null +++ b/kit/static/icons/arrow-up.svg @@ -0,0 +1 @@ +Arrow up diff --git a/kit/static/icons/book-quill.svg b/kit/static/icons/book-quill.svg new file mode 100644 index 00000000..dad6652a --- /dev/null +++ b/kit/static/icons/book-quill.svg @@ -0,0 +1 @@ +Book and quill diff --git a/kit/static/icons/bug.svg b/kit/static/icons/bug.svg new file mode 100644 index 00000000..0063ae36 --- /dev/null +++ b/kit/static/icons/bug.svg @@ -0,0 +1 @@ +Bug diff --git a/kit/static/icons/check.svg b/kit/static/icons/check.svg new file mode 100644 index 00000000..2fc38d8c --- /dev/null +++ b/kit/static/icons/check.svg @@ -0,0 +1 @@ +Check diff --git a/kit/static/icons/chest.svg b/kit/static/icons/chest.svg new file mode 100644 index 00000000..bebe7bd6 --- /dev/null +++ b/kit/static/icons/chest.svg @@ -0,0 +1 @@ +Chest diff --git a/kit/static/icons/chevron-down.svg b/kit/static/icons/chevron-down.svg new file mode 100644 index 00000000..fb10ef2a --- /dev/null +++ b/kit/static/icons/chevron-down.svg @@ -0,0 +1 @@ +Chevron down diff --git a/kit/static/icons/chevron-right.svg b/kit/static/icons/chevron-right.svg new file mode 100644 index 00000000..b47e45cc --- /dev/null +++ b/kit/static/icons/chevron-right.svg @@ -0,0 +1 @@ +Chevron right diff --git a/kit/static/icons/clock.svg b/kit/static/icons/clock.svg new file mode 100644 index 00000000..455738fd --- /dev/null +++ b/kit/static/icons/clock.svg @@ -0,0 +1 @@ +Clock diff --git a/kit/static/icons/close.svg b/kit/static/icons/close.svg new file mode 100644 index 00000000..bc165c34 --- /dev/null +++ b/kit/static/icons/close.svg @@ -0,0 +1 @@ +Close diff --git a/kit/static/icons/compass.svg b/kit/static/icons/compass.svg new file mode 100644 index 00000000..39e08463 --- /dev/null +++ b/kit/static/icons/compass.svg @@ -0,0 +1 @@ +Compass diff --git a/kit/static/icons/copy.svg b/kit/static/icons/copy.svg new file mode 100644 index 00000000..15140db3 --- /dev/null +++ b/kit/static/icons/copy.svg @@ -0,0 +1 @@ +Copy diff --git a/kit/static/icons/diamond.svg b/kit/static/icons/diamond.svg new file mode 100644 index 00000000..ff131c8d --- /dev/null +++ b/kit/static/icons/diamond.svg @@ -0,0 +1 @@ +Diamond diff --git a/kit/static/icons/edit.svg b/kit/static/icons/edit.svg new file mode 100644 index 00000000..a897adb8 --- /dev/null +++ b/kit/static/icons/edit.svg @@ -0,0 +1 @@ +Edit diff --git a/kit/static/icons/emerald.svg b/kit/static/icons/emerald.svg new file mode 100644 index 00000000..c1890cec --- /dev/null +++ b/kit/static/icons/emerald.svg @@ -0,0 +1 @@ +Emerald diff --git a/kit/static/icons/external.svg b/kit/static/icons/external.svg new file mode 100644 index 00000000..7049697f --- /dev/null +++ b/kit/static/icons/external.svg @@ -0,0 +1 @@ +External link diff --git a/kit/static/icons/globe.svg b/kit/static/icons/globe.svg new file mode 100644 index 00000000..a8df9bb7 --- /dev/null +++ b/kit/static/icons/globe.svg @@ -0,0 +1 @@ +Language diff --git a/kit/static/icons/grass.svg b/kit/static/icons/grass.svg new file mode 100644 index 00000000..04673727 --- /dev/null +++ b/kit/static/icons/grass.svg @@ -0,0 +1 @@ +Grass block diff --git a/kit/static/icons/hash.svg b/kit/static/icons/hash.svg new file mode 100644 index 00000000..d2118647 --- /dev/null +++ b/kit/static/icons/hash.svg @@ -0,0 +1 @@ +Permalink diff --git a/kit/static/icons/heart.svg b/kit/static/icons/heart.svg new file mode 100644 index 00000000..f1c7b01a --- /dev/null +++ b/kit/static/icons/heart.svg @@ -0,0 +1 @@ +Heart diff --git a/kit/static/icons/history.svg b/kit/static/icons/history.svg new file mode 100644 index 00000000..e24f5343 --- /dev/null +++ b/kit/static/icons/history.svg @@ -0,0 +1 @@ +Last updated diff --git a/kit/static/icons/map.svg b/kit/static/icons/map.svg new file mode 100644 index 00000000..b91e4055 --- /dev/null +++ b/kit/static/icons/map.svg @@ -0,0 +1 @@ +Map diff --git a/kit/static/icons/menu.svg b/kit/static/icons/menu.svg new file mode 100644 index 00000000..b47b820e --- /dev/null +++ b/kit/static/icons/menu.svg @@ -0,0 +1 @@ +Menu diff --git a/kit/static/icons/monitor.svg b/kit/static/icons/monitor.svg new file mode 100644 index 00000000..763c946c --- /dev/null +++ b/kit/static/icons/monitor.svg @@ -0,0 +1 @@ +System theme diff --git a/kit/static/icons/moon.svg b/kit/static/icons/moon.svg new file mode 100644 index 00000000..d835e5b5 --- /dev/null +++ b/kit/static/icons/moon.svg @@ -0,0 +1 @@ +Moon diff --git a/kit/static/icons/paper.svg b/kit/static/icons/paper.svg new file mode 100644 index 00000000..33ad7e4d --- /dev/null +++ b/kit/static/icons/paper.svg @@ -0,0 +1 @@ +Paper diff --git a/kit/static/icons/pickaxe.svg b/kit/static/icons/pickaxe.svg new file mode 100644 index 00000000..aeaf01a5 --- /dev/null +++ b/kit/static/icons/pickaxe.svg @@ -0,0 +1 @@ +Pickaxe diff --git a/kit/static/icons/potion.svg b/kit/static/icons/potion.svg new file mode 100644 index 00000000..2fb07418 --- /dev/null +++ b/kit/static/icons/potion.svg @@ -0,0 +1 @@ +Potion diff --git a/kit/static/icons/question.svg b/kit/static/icons/question.svg new file mode 100644 index 00000000..ef35688b --- /dev/null +++ b/kit/static/icons/question.svg @@ -0,0 +1 @@ +Question diff --git a/kit/static/icons/quote.svg b/kit/static/icons/quote.svg new file mode 100644 index 00000000..85c6b769 --- /dev/null +++ b/kit/static/icons/quote.svg @@ -0,0 +1 @@ +Quote diff --git a/kit/static/icons/search.svg b/kit/static/icons/search.svg new file mode 100644 index 00000000..14e57ed5 --- /dev/null +++ b/kit/static/icons/search.svg @@ -0,0 +1 @@ +Search diff --git a/kit/static/icons/sun.svg b/kit/static/icons/sun.svg new file mode 100644 index 00000000..fb47d8f6 --- /dev/null +++ b/kit/static/icons/sun.svg @@ -0,0 +1 @@ +Sun diff --git a/kit/static/icons/tnt.svg b/kit/static/icons/tnt.svg new file mode 100644 index 00000000..c40b854b --- /dev/null +++ b/kit/static/icons/tnt.svg @@ -0,0 +1 @@ +TNT diff --git a/kit/static/icons/torch.svg b/kit/static/icons/torch.svg new file mode 100644 index 00000000..4d047cf4 --- /dev/null +++ b/kit/static/icons/torch.svg @@ -0,0 +1 @@ +Torch diff --git a/kit/static/kit-chrome.css b/kit/static/kit-chrome.css new file mode 100644 index 00000000..bd0bf23c --- /dev/null +++ b/kit/static/kit-chrome.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ +:root,:host{--font-sans:"Inter", "InterVariable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", "Noto Sans CJK SC", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji";--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", "PingFang SC", "Microsoft YaHei", monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-display:"Fraunces", ui-serif, Georgia, "Songti SC", "Noto Serif SC", "PingFang SC", "Microsoft YaHei", serif;--font-pixel:"Silkscreen", ui-monospace, "JetBrains Mono", monospace;--color-canvas:#f7f3e8;--color-surface:#fffdf7;--color-surface-2:#f0ebdd;--color-surface-3:#e7e0cd;--color-ink:#1f2a33;--color-muted:#5b6770;--color-faint:#8a939a;--color-line:#e2dacb;--color-line-strong:#c4b9a2;--color-primary:#4f8a5b;--color-primary-strong:#3a7047;--color-primary-soft:#e3eddc;--color-on-primary:#fff;--color-link:#356b42;--color-focus:#8e5cf6;--color-mark:#f6e3a1;--color-accent-1:#3e6e8e;--color-accent-2:#9a86c2;--color-accent-3:#d98a9e;--color-accent-4:#e9c46a;--color-code-bg:#fbf8ef;--color-code-head:#f1ecdf;--color-code-ink:#26323b;--color-code-gutter:#9aa0a3;--color-pond:#3e6e8e;--color-sunrise:#f08a4b;--color-mc-grass:#5da130;--color-mc-stone:#8b8b8b;--color-mc-diamond:#5de0e6;--color-mc-gold:#f2c230;--color-mc-redstone:#d23b3b;--color-mc-enchant:#8e5cf6;--color-adm-note:#3e6e8e;--color-adm-abstract:#4a63b0;--color-adm-info:#2c7f8a;--color-adm-tip:#2f8a4f;--color-adm-success:#1f8a90;--color-adm-question:#7a63a8;--color-adm-warning:#b7791f;--color-adm-failure:#c0392b;--color-adm-danger:#c0392b;--color-adm-bug:#c2577a;--color-adm-example:#7a4fd6;--color-adm-quote:#6f7479;--px:2px;--spacing-header:3.75rem;--spacing-globalbar:2.5rem;--shadow-float:0 18px 40px -18px #1f2a3359, 0 2px 0 0 #1f2a330f;--ease-pixel:steps(4, end);--ease-soft:cubic-bezier(.22, .61, .36, 1);--animate-kit-drift:kit-drift 48s var(--ease-soft) infinite alternate}.static{position:static}.block{display:block}.dark{--color-canvas:#0f1b26;--color-surface:#152535;--color-surface-2:#1a2d3f;--color-surface-3:#22384c;--color-ink:#e8eef2;--color-muted:#9aaab8;--color-faint:#6f8293;--color-line:#233648;--color-line-strong:#36506a;--color-primary:#6fbf73;--color-primary-strong:#6fbf73;--color-primary-soft:#1d3a32;--color-on-primary:#0f1b26;--color-link:#7fcc83;--color-focus:#5de0e6;--color-mark:#5b4a1f;--color-accent-1:#3f7f8c;--color-accent-2:#7d6f9e;--color-accent-3:#f08a4b;--color-accent-4:#f5b26b;--color-code-bg:#0b1620;--color-code-head:#112231;--color-code-ink:#dce5ec;--color-code-gutter:#5d7184;--color-scrim:#040a109e;--color-adm-note:#78aedb;--color-adm-abstract:#8ea2ef;--color-adm-info:#5cc9d3;--color-adm-tip:#6fcf8a;--color-adm-success:#5de0e6;--color-adm-question:#b7a4e6;--color-adm-warning:#f2b05e;--color-adm-failure:#f07a6e;--color-adm-danger:#f07a6e;--color-adm-bug:#f08fb0;--color-adm-example:#b493ff;--color-adm-quote:#a3adb6;--shadow-pixel:0 var(--px) 0 0 #00000059, 0 calc(var(--px) * 3) 0 0 #0000002e;--shadow-float:0 22px 48px -18px #000000a6, 0 2px 0 0 #0000004d;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root{--kit-grass-strip:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 8' shape-rendering='crispEdges'%3E%3Cpath fill='%235da130' d='M0 0h1v1h-1zM2 0h3v1h-3zM7 0h3v1h-3zM11 0h5v1h-5zM0 1h3v1h-3zM4 1h4v1h-4zM9 1h4v1h-4zM14 1h2v1h-2zM1 2h3v1h-3zM5 2h5v1h-5zM12 2h2v1h-2zM15 2h1v1h-1zM3 3h1v1h-1zM7 3h2v1h-2zM12 3h1v1h-1zM15 3h1v1h-1zM12 4h1v1h-1z'/%3E%3Cpath fill='%2370b83f' d='M1 0h1v1h-1zM5 0h2v1h-2zM10 0h1v1h-1zM3 1h1v1h-1zM8 1h1v1h-1zM13 1h1v1h-1z'/%3E%3Cpath fill='%23478a22' d='M0 2h1v1h-1zM4 2h1v1h-1zM10 2h2v1h-2zM14 2h1v1h-1z'/%3E%3Cpath fill='%238a5a33' d='M0 3h3v1h-3zM4 3h3v1h-3zM9 3h3v1h-3zM13 3h2v1h-2zM0 4h5v1h-5zM6 4h1v1h-1zM8 4h1v1h-1zM10 4h2v1h-2zM13 4h3v1h-3zM0 5h2v1h-2zM3 5h8v1h-8zM12 5h3v1h-3zM0 6h1v1h-1zM2 6h3v1h-3zM6 6h2v1h-2zM9 6h4v1h-4zM14 6h2v1h-2zM1 7h2v1h-2zM4 7h6v1h-6zM11 7h3v1h-3zM15 7h1v1h-1z'/%3E%3Cpath fill='%23a0703f' d='M5 4h1v1h-1zM11 5h1v1h-1zM1 6h1v1h-1zM8 6h1v1h-1zM3 7h1v1h-1zM14 7h1v1h-1z'/%3E%3Cpath fill='%236b4426' d='M7 4h1v1h-1zM9 4h1v1h-1zM2 5h1v1h-1zM15 5h1v1h-1zM5 6h1v1h-1zM13 6h1v1h-1zM0 7h1v1h-1zM10 7h1v1h-1z'/%3E%3C/svg%3E");--kit-brush:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='256' height='256' viewBox='0 0 256 256'%3E%3Cfilter id='p' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.03 0.11' numOctaves='2' seed='4' stitchTiles='stitch' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='9' xChannelSelector='R' yChannelSelector='G' result='d'/%3E%3CfeGaussianBlur in='d' stdDeviation='0.6'/%3E%3C/filter%3E%3Cg filter='url(%23p)'%3E%3Cellipse cx='148.5' cy='207.3' rx='10.1' ry='1.7' transform='rotate(2.8 148.5 207.3)' fill='%23fff' opacity='0.26'/%3E%3Cellipse cx='-34.3' cy='99.2' rx='27.7' ry='5.2' transform='rotate(8.5 -34.3 99.2)' fill='%23000' opacity='0.42'/%3E%3Cellipse cx='221.7' cy='99.2' rx='27.7' ry='5.2' transform='rotate(8.5 221.7 99.2)' fill='%23000' opacity='0.42'/%3E%3Cellipse cx='186.4' cy='101.5' rx='21.3' ry='1.8' transform='rotate(0.8 186.4 101.5)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='229.0' cy='191.2' rx='10.7' ry='5.1' transform='rotate(4.5 229.0 191.2)' fill='%23000' opacity='0.32'/%3E%3Cellipse cx='41.8' cy='153.8' rx='9.2' ry='4.1' transform='rotate(7.6 41.8 153.8)' fill='%23fff' opacity='0.29'/%3E%3Cellipse cx='31.6' cy='-4.8' rx='25.8' ry='5.0' transform='rotate(7.9 31.6 -4.8)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='31.6' cy='251.2' rx='25.8' ry='5.0' transform='rotate(7.9 31.6 251.2)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='287.6' cy='-4.8' rx='25.8' ry='5.0' transform='rotate(7.9 287.6 -4.8)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='287.6' cy='251.2' rx='25.8' ry='5.0' transform='rotate(7.9 287.6 251.2)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='86.4' cy='-10.5' rx='9.8' ry='3.4' transform='rotate(2.1 86.4 -10.5)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='86.4' cy='245.5' rx='9.8' ry='3.4' transform='rotate(2.1 86.4 245.5)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='173.3' cy='121.6' rx='14.2' ry='5.0' transform='rotate(-3.2 173.3 121.6)' fill='%23fff' opacity='0.23'/%3E%3Cellipse cx='71.1' cy='120.2' rx='18.7' ry='3.4' transform='rotate(-7.7 71.1 120.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='138.1' cy='208.2' rx='30.2' ry='2.1' transform='rotate(-7.6 138.1 208.2)' fill='%23000' opacity='0.30'/%3E%3Cellipse cx='38.4' cy='101.9' rx='12.3' ry='2.7' transform='rotate(-4.8 38.4 101.9)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='53.8' cy='53.5' rx='24.6' ry='4.2' transform='rotate(8.8 53.8 53.5)' fill='%23fff' opacity='0.36'/%3E%3Cellipse cx='-6.3' cy='101.6' rx='13.2' ry='2.1' transform='rotate(-0.5 -6.3 101.6)' fill='%23fff' opacity='0.22'/%3E%3Cellipse cx='249.7' cy='101.6' rx='13.2' ry='2.1' transform='rotate(-0.5 249.7 101.6)' fill='%23fff' opacity='0.22'/%3E%3Cellipse cx='112.6' cy='65.9' rx='11.5' ry='4.0' transform='rotate(-2.3 112.6 65.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='9.7' cy='112.1' rx='18.7' ry='2.8' transform='rotate(-6.3 9.7 112.1)' fill='%23fff' opacity='0.39'/%3E%3Cellipse cx='265.7' cy='112.1' rx='18.7' ry='2.8' transform='rotate(-6.3 265.7 112.1)' fill='%23fff' opacity='0.39'/%3E%3Cellipse cx='74.8' cy='136.0' rx='24.3' ry='2.9' transform='rotate(7.2 74.8 136.0)' fill='%23fff' opacity='0.39'/%3E%3Cellipse cx='-2.9' cy='-9.1' rx='18.9' ry='4.2' transform='rotate(-8.1 -2.9 -9.1)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='-2.9' cy='246.9' rx='18.9' ry='4.2' transform='rotate(-8.1 -2.9 246.9)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='253.1' cy='-9.1' rx='18.9' ry='4.2' transform='rotate(-8.1 253.1 -9.1)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='253.1' cy='246.9' rx='18.9' ry='4.2' transform='rotate(-8.1 253.1 246.9)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='2.2' cy='32.2' rx='10.4' ry='3.3' transform='rotate(-8.5 2.2 32.2)' fill='%23fff' opacity='0.19'/%3E%3Cellipse cx='258.2' cy='32.2' rx='10.4' ry='3.3' transform='rotate(-8.5 258.2 32.2)' fill='%23fff' opacity='0.19'/%3E%3Cellipse cx='133.7' cy='-15.7' rx='19.8' ry='3.7' transform='rotate(-3.2 133.7 -15.7)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='133.7' cy='240.3' rx='19.8' ry='3.7' transform='rotate(-3.2 133.7 240.3)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='197.1' cy='-4.3' rx='18.0' ry='3.6' transform='rotate(-7.6 197.1 -4.3)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='197.1' cy='251.7' rx='18.0' ry='3.6' transform='rotate(-7.6 197.1 251.7)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='92.7' cy='-9.1' rx='29.8' ry='1.8' transform='rotate(-4.4 92.7 -9.1)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='92.7' cy='246.9' rx='29.8' ry='1.8' transform='rotate(-4.4 92.7 246.9)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='111.3' cy='-13.8' rx='28.3' ry='3.1' transform='rotate(-7.3 111.3 -13.8)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='111.3' cy='242.2' rx='28.3' ry='3.1' transform='rotate(-7.3 111.3 242.2)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='143.5' cy='210.3' rx='12.6' ry='2.0' transform='rotate(0.1 143.5 210.3)' fill='%23000' opacity='0.45'/%3E%3Cellipse cx='83.9' cy='211.5' rx='12.8' ry='3.8' transform='rotate(4.6 83.9 211.5)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='170.0' cy='203.3' rx='27.8' ry='4.7' transform='rotate(-6.4 170.0 203.3)' fill='%23fff' opacity='0.38'/%3E%3Cellipse cx='34.1' cy='190.8' rx='10.3' ry='2.8' transform='rotate(6.4 34.1 190.8)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='196.5' cy='34.7' rx='28.4' ry='4.5' transform='rotate(-7.4 196.5 34.7)' fill='%23fff' opacity='0.31'/%3E%3Cellipse cx='196.5' cy='290.7' rx='28.4' ry='4.5' transform='rotate(-7.4 196.5 290.7)' fill='%23fff' opacity='0.31'/%3E%3Cellipse cx='-1.8' cy='196.0' rx='30.3' ry='4.6' transform='rotate(1.3 -1.8 196.0)' fill='%23000' opacity='0.35'/%3E%3Cellipse cx='254.2' cy='196.0' rx='30.3' ry='4.6' transform='rotate(1.3 254.2 196.0)' fill='%23000' opacity='0.35'/%3E%3Cellipse cx='60.2' cy='156.4' rx='10.4' ry='3.6' transform='rotate(2.6 60.2 156.4)' fill='%23fff' opacity='0.16'/%3E%3Cellipse cx='142.2' cy='3.2' rx='15.4' ry='2.7' transform='rotate(6.7 142.2 3.2)' fill='%23000' opacity='0.48'/%3E%3Cellipse cx='142.2' cy='259.2' rx='15.4' ry='2.7' transform='rotate(6.7 142.2 259.2)' fill='%23000' opacity='0.48'/%3E%3Cellipse cx='57.1' cy='45.7' rx='19.6' ry='3.1' transform='rotate(5.0 57.1 45.7)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='110.4' cy='104.1' rx='23.8' ry='4.3' transform='rotate(4.1 110.4 104.1)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='124.7' cy='201.0' rx='28.7' ry='2.6' transform='rotate(0.9 124.7 201.0)' fill='%23fff' opacity='0.16'/%3E%3Cellipse cx='113.5' cy='210.7' rx='30.1' ry='4.2' transform='rotate(3.5 113.5 210.7)' fill='%23000' opacity='0.37'/%3E%3Cellipse cx='38.6' cy='136.0' rx='17.7' ry='2.9' transform='rotate(-0.0 38.6 136.0)' fill='%23fff' opacity='0.20'/%3E%3Cellipse cx='160.8' cy='25.4' rx='30.8' ry='4.6' transform='rotate(0.3 160.8 25.4)' fill='%23000' opacity='0.19'/%3E%3Cellipse cx='160.8' cy='281.4' rx='30.8' ry='4.6' transform='rotate(0.3 160.8 281.4)' fill='%23000' opacity='0.19'/%3E%3Cellipse cx='-10.8' cy='125.3' rx='26.4' ry='1.8' transform='rotate(6.1 -10.8 125.3)' fill='%23fff' opacity='0.40'/%3E%3Cellipse cx='245.2' cy='125.3' rx='26.4' ry='1.8' transform='rotate(6.1 245.2 125.3)' fill='%23fff' opacity='0.40'/%3E%3Cellipse cx='110.1' cy='143.0' rx='27.8' ry='1.7' transform='rotate(4.4 110.1 143.0)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='128.3' cy='174.5' rx='12.8' ry='3.3' transform='rotate(-6.0 128.3 174.5)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='54.3' cy='18.2' rx='12.4' ry='1.9' transform='rotate(5.2 54.3 18.2)' fill='%23000' opacity='0.37'/%3E%3Cellipse cx='54.3' cy='274.2' rx='12.4' ry='1.9' transform='rotate(5.2 54.3 274.2)' fill='%23000' opacity='0.37'/%3E%3Cellipse cx='206.3' cy='224.6' rx='19.9' ry='4.7' transform='rotate(-6.9 206.3 224.6)' fill='%23000' opacity='0.26'/%3E%3Cellipse cx='180.1' cy='97.8' rx='30.8' ry='4.9' transform='rotate(2.4 180.1 97.8)' fill='%23fff' opacity='0.31'/%3E%3Cellipse cx='196.7' cy='12.6' rx='12.5' ry='4.3' transform='rotate(1.6 196.7 12.6)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='196.7' cy='268.6' rx='12.5' ry='4.3' transform='rotate(1.6 196.7 268.6)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='35.2' cy='10.8' rx='20.4' ry='2.4' transform='rotate(-3.2 35.2 10.8)' fill='%23000' opacity='0.47'/%3E%3Cellipse cx='35.2' cy='266.8' rx='20.4' ry='2.4' transform='rotate(-3.2 35.2 266.8)' fill='%23000' opacity='0.47'/%3E%3Cellipse cx='55.7' cy='31.5' rx='9.4' ry='5.0' transform='rotate(-6.3 55.7 31.5)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='107.6' cy='6.0' rx='26.0' ry='4.9' transform='rotate(6.9 107.6 6.0)' fill='%23000' opacity='0.30'/%3E%3Cellipse cx='107.6' cy='262.0' rx='26.0' ry='4.9' transform='rotate(6.9 107.6 262.0)' fill='%23000' opacity='0.30'/%3E%3Cellipse cx='-8.5' cy='186.5' rx='10.4' ry='4.4' transform='rotate(-5.7 -8.5 186.5)' fill='%23000' opacity='0.32'/%3E%3Cellipse cx='247.5' cy='186.5' rx='10.4' ry='4.4' transform='rotate(-5.7 247.5 186.5)' fill='%23000' opacity='0.32'/%3E%3Cellipse cx='129.9' cy='22.2' rx='10.9' ry='2.5' transform='rotate(-5.6 129.9 22.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='221.6' cy='151.0' rx='18.1' ry='2.7' transform='rotate(-6.0 221.6 151.0)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='127.0' cy='-18.3' rx='28.4' ry='1.7' transform='rotate(8.8 127.0 -18.3)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='127.0' cy='237.7' rx='28.4' ry='1.7' transform='rotate(8.8 127.0 237.7)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='146.5' cy='134.5' rx='20.4' ry='3.3' transform='rotate(2.4 146.5 134.5)' fill='%23000' opacity='0.24'/%3E%3Cellipse cx='207.6' cy='71.6' rx='16.8' ry='4.4' transform='rotate(-6.2 207.6 71.6)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='88.3' cy='72.0' rx='12.4' ry='3.3' transform='rotate(-8.5 88.3 72.0)' fill='%23fff' opacity='0.26'/%3E%3Cellipse cx='102.7' cy='56.7' rx='19.4' ry='4.1' transform='rotate(4.6 102.7 56.7)' fill='%23000' opacity='0.33'/%3E%3Cellipse cx='-3.6' cy='100.9' rx='12.9' ry='1.8' transform='rotate(-8.9 -3.6 100.9)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='252.4' cy='100.9' rx='12.9' ry='1.8' transform='rotate(-8.9 252.4 100.9)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='126.2' cy='166.7' rx='15.1' ry='2.5' transform='rotate(-0.5 126.2 166.7)' fill='%23fff' opacity='0.21'/%3E%3Cellipse cx='-10.7' cy='24.5' rx='15.0' ry='3.4' transform='rotate(-8.8 -10.7 24.5)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='245.3' cy='24.5' rx='15.0' ry='3.4' transform='rotate(-8.8 245.3 24.5)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='15.5' cy='139.4' rx='30.8' ry='2.7' transform='rotate(1.3 15.5 139.4)' fill='%23fff' opacity='0.32'/%3E%3Cellipse cx='271.5' cy='139.4' rx='30.8' ry='2.7' transform='rotate(1.3 271.5 139.4)' fill='%23fff' opacity='0.32'/%3E%3Cellipse cx='201.1' cy='154.5' rx='15.1' ry='3.5' transform='rotate(-7.7 201.1 154.5)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='204.3' cy='136.1' rx='19.6' ry='3.1' transform='rotate(3.7 204.3 136.1)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='-7.9' cy='218.9' rx='11.4' ry='3.2' transform='rotate(7.2 -7.9 218.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='248.1' cy='218.9' rx='11.4' ry='3.2' transform='rotate(7.2 248.1 218.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='11.1' cy='-21.1' rx='29.6' ry='4.1' transform='rotate(-1.7 11.1 -21.1)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='11.1' cy='234.9' rx='29.6' ry='4.1' transform='rotate(-1.7 11.1 234.9)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='267.1' cy='-21.1' rx='29.6' ry='4.1' transform='rotate(-1.7 267.1 -21.1)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='267.1' cy='234.9' rx='29.6' ry='4.1' transform='rotate(-1.7 267.1 234.9)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='228.0' cy='133.0' rx='17.0' ry='3.8' transform='rotate(0.4 228.0 133.0)' fill='%23fff' opacity='0.22'/%3E%3Cellipse cx='157.3' cy='65.3' rx='21.3' ry='3.0' transform='rotate(0.9 157.3 65.3)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='129.0' cy='202.2' rx='17.1' ry='3.2' transform='rotate(1.6 129.0 202.2)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='150.4' cy='-21.2' rx='25.3' ry='2.5' transform='rotate(-1.4 150.4 -21.2)' fill='%23fff' opacity='0.23'/%3E%3Cellipse cx='150.4' cy='234.8' rx='25.3' ry='2.5' transform='rotate(-1.4 150.4 234.8)' fill='%23fff' opacity='0.23'/%3E%3Cellipse cx='174.4' cy='36.6' rx='26.1' ry='1.9' transform='rotate(-5.8 174.4 36.6)' fill='%23fff' opacity='0.45'/%3E%3Cellipse cx='160.2' cy='187.3' rx='23.3' ry='4.0' transform='rotate(-3.0 160.2 187.3)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='17.4' cy='-2.6' rx='20.6' ry='2.2' transform='rotate(-7.3 17.4 -2.6)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='17.4' cy='253.4' rx='20.6' ry='2.2' transform='rotate(-7.3 17.4 253.4)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='273.4' cy='-2.6' rx='20.6' ry='2.2' transform='rotate(-7.3 273.4 -2.6)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='273.4' cy='253.4' rx='20.6' ry='2.2' transform='rotate(-7.3 273.4 253.4)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='63.1' cy='87.9' rx='29.4' ry='2.3' transform='rotate(5.0 63.1 87.9)' fill='%23fff' opacity='0.29'/%3E%3Cellipse cx='48.1' cy='194.4' rx='29.4' ry='4.6' transform='rotate(2.0 48.1 194.4)' fill='%23000' opacity='0.25'/%3E%3Cellipse cx='-19.3' cy='214.2' rx='29.3' ry='2.5' transform='rotate(0.4 -19.3 214.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='236.7' cy='214.2' rx='29.3' ry='2.5' transform='rotate(0.4 236.7 214.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='204.6' cy='33.1' rx='28.6' ry='4.7' transform='rotate(5.0 204.6 33.1)' fill='%23000' opacity='0.44'/%3E%3Cellipse cx='204.6' cy='289.1' rx='28.6' ry='4.7' transform='rotate(5.0 204.6 289.1)' fill='%23000' opacity='0.44'/%3E%3Cellipse cx='202.7' cy='90.0' rx='11.6' ry='5.0' transform='rotate(-0.2 202.7 90.0)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='-27.7' cy='124.2' rx='21.4' ry='4.7' transform='rotate(-2.2 -27.7 124.2)' fill='%23fff' opacity='0.28'/%3E%3Cellipse cx='228.3' cy='124.2' rx='21.4' ry='4.7' transform='rotate(-2.2 228.3 124.2)' fill='%23fff' opacity='0.28'/%3E%3Cellipse cx='171.1' cy='33.4' rx='28.9' ry='2.0' transform='rotate(-3.2 171.1 33.4)' fill='%23000' opacity='0.17'/%3E%3Cellipse cx='171.1' cy='289.4' rx='28.9' ry='2.0' transform='rotate(-3.2 171.1 289.4)' fill='%23000' opacity='0.17'/%3E%3Cellipse cx='1.6' cy='-11.8' rx='31.0' ry='2.1' transform='rotate(5.8 1.6 -11.8)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='1.6' cy='244.2' rx='31.0' ry='2.1' transform='rotate(5.8 1.6 244.2)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='257.6' cy='-11.8' rx='31.0' ry='2.1' transform='rotate(5.8 257.6 -11.8)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='257.6' cy='244.2' rx='31.0' ry='2.1' transform='rotate(5.8 257.6 244.2)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='13.7' cy='186.9' rx='19.3' ry='3.1' transform='rotate(-1.0 13.7 186.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='269.7' cy='186.9' rx='19.3' ry='3.1' transform='rotate(-1.0 269.7 186.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='109.1' cy='170.7' rx='14.5' ry='1.6' transform='rotate(-1.6 109.1 170.7)' fill='%23fff' opacity='0.20'/%3E%3Cellipse cx='43.8' cy='152.2' rx='28.2' ry='2.5' transform='rotate(-8.5 43.8 152.2)' fill='%23000' opacity='0.17'/%3E%3Cellipse cx='87.5' cy='134.7' rx='29.4' ry='2.5' transform='rotate(-0.4 87.5 134.7)' fill='%23fff' opacity='0.24'/%3E%3Cellipse cx='33.6' cy='171.2' rx='22.9' ry='4.1' transform='rotate(7.6 33.6 171.2)' fill='%23fff' opacity='0.26'/%3E%3Cellipse cx='183.8' cy='47.5' rx='25.5' ry='5.0' transform='rotate(4.2 183.8 47.5)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='217.2' cy='64.4' rx='15.5' ry='5.0' transform='rotate(-8.6 217.2 64.4)' fill='%23000' opacity='0.42'/%3E%3Cellipse cx='189.7' cy='165.2' rx='17.8' ry='2.7' transform='rotate(-7.5 189.7 165.2)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='-8.9' cy='64.8' rx='22.0' ry='2.8' transform='rotate(-7.3 -8.9 64.8)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='247.1' cy='64.8' rx='22.0' ry='2.8' transform='rotate(-7.3 247.1 64.8)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='-10.2' cy='-5.1' rx='21.3' ry='3.1' transform='rotate(-0.1 -10.2 -5.1)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='-10.2' cy='250.9' rx='21.3' ry='3.1' transform='rotate(-0.1 -10.2 250.9)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='245.8' cy='-5.1' rx='21.3' ry='3.1' transform='rotate(-0.1 245.8 -5.1)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='245.8' cy='250.9' rx='21.3' ry='3.1' transform='rotate(-0.1 245.8 250.9)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='212.2' cy='-26.2' rx='19.1' ry='1.6' transform='rotate(7.8 212.2 -26.2)' fill='%23fff' opacity='0.38'/%3E%3Cellipse cx='212.2' cy='229.8' rx='19.1' ry='1.6' transform='rotate(7.8 212.2 229.8)' fill='%23fff' opacity='0.38'/%3E%3Cellipse cx='137.8' cy='36.0' rx='26.1' ry='3.5' transform='rotate(-5.8 137.8 36.0)' fill='%23000' opacity='0.39'/%3E%3Cellipse cx='77.7' cy='194.9' rx='23.4' ry='4.5' transform='rotate(-0.4 77.7 194.9)' fill='%23000' opacity='0.28'/%3E%3C/g%3E%3C/svg%3E");--kit-grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='0.6'/%3E%3C/svg%3E");--kit-dirt:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Crect width='16' height='16' fill='%233d2b1f'/%3E%3Cpath fill='%2335251a' d='M0 0h1v1h-1zM2 1h1v1h-1zM14 1h1v1h-1zM1 2h1v1h-1zM11 2h1v1h-1zM13 4h1v1h-1zM1 7h1v1h-1zM2 7h1v1h-1zM5 7h1v1h-1zM4 12h1v1h-1zM5 13h1v1h-1zM7 13h1v1h-1zM0 14h1v1h-1zM13 14h1v1h-1zM4 15h1v1h-1zM13 15h1v1h-1zM15 15h1v1h-1z'/%3E%3Cpath fill='%234d3828' d='M6 0h1v1h-1zM14 2h1v1h-1zM0 3h1v1h-1zM6 3h1v1h-1zM0 4h1v1h-1zM1 5h1v1h-1zM8 6h1v1h-1zM11 6h1v1h-1zM1 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 11h1v1h-1zM9 15h1v1h-1zM12 15h1v1h-1z'/%3E%3Cpath fill='%232f2117' d='M9 0h1v1h-1zM6 1h1v1h-1zM14 4h1v1h-1zM11 5h1v1h-1zM15 5h1v1h-1zM3 7h1v1h-1zM1 11h1v1h-1zM9 14h1v1h-1zM14 15h1v1h-1z'/%3E%3Cpath fill='%23463223' d='M11 0h1v1h-1zM3 1h1v1h-1zM14 5h1v1h-1zM14 6h1v1h-1zM5 8h1v1h-1zM14 13h1v1h-1zM6 14h1v1h-1z'/%3E%3C/svg%3E");--kit-dirt-dark:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Crect width='16' height='16' fill='%231d150f'/%3E%3Cpath fill='%2318110c' d='M0 0h1v1h-1zM2 1h1v1h-1zM14 1h1v1h-1zM1 2h1v1h-1zM11 2h1v1h-1zM13 4h1v1h-1zM1 7h1v1h-1zM2 7h1v1h-1zM5 7h1v1h-1zM4 12h1v1h-1zM5 13h1v1h-1zM7 13h1v1h-1zM0 14h1v1h-1zM13 14h1v1h-1zM4 15h1v1h-1zM13 15h1v1h-1zM15 15h1v1h-1z'/%3E%3Cpath fill='%23281d15' d='M6 0h1v1h-1zM14 2h1v1h-1zM0 3h1v1h-1zM6 3h1v1h-1zM0 4h1v1h-1zM1 5h1v1h-1zM8 6h1v1h-1zM11 6h1v1h-1zM1 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 11h1v1h-1zM9 15h1v1h-1zM12 15h1v1h-1z'/%3E%3Cpath fill='%23140e09' d='M9 0h1v1h-1zM6 1h1v1h-1zM14 4h1v1h-1zM11 5h1v1h-1zM15 5h1v1h-1zM3 7h1v1h-1zM1 11h1v1h-1zM9 14h1v1h-1zM14 15h1v1h-1z'/%3E%3Cpath fill='%23231a12' d='M11 0h1v1h-1zM3 1h1v1h-1zM14 5h1v1h-1zM14 6h1v1h-1zM5 8h1v1h-1zM14 13h1v1h-1zM6 14h1v1h-1z'/%3E%3C/svg%3E");--kit-paint-lilies:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 520' preserveAspectRatio='xMidYMid slice'%3E%3Cdefs%3E%3ClinearGradient id='bl-sky' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%23d9e7cf'/%3E%3Cstop offset='0.38' stop-color='%23c5ddd2'/%3E%3Cstop offset='0.5' stop-color='%23a7cbc6'/%3E%3Cstop offset='1' stop-color='%237eaab0'/%3E%3C/linearGradient%3E%3CradialGradient id='bl-sun' cx='0.72' cy='0.18' r='0.5'%3E%3Cstop offset='0' stop-color='%23fff4cf' stop-opacity='0.85'/%3E%3Cstop offset='1' stop-color='%23fff4cf' stop-opacity='0'/%3E%3C/radialGradient%3E%3Cfilter id='bl-paint' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.012 0.045' numOctaves='2' seed='3' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='16' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bl-water' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.006 0.08' numOctaves='2' seed='9' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='10' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bl-wash' x='-10%25' y='-20%25' width='120%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='9'/%3E%3C/filter%3E%3C/defs%3E%3Cg%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bl-sky)'/%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bl-sun)'/%3E%3C/g%3E%3Cg filter='url(%23bl-water)'%3E%3Cellipse cx='1506.7' cy='393.7' rx='89.6' ry='3.3' transform='rotate(1.8 1506.7 393.7)' fill='%23cfc6e4' opacity='0.27'/%3E%3Cellipse cx='165' cy='248.9' rx='52.1' ry='2.4' transform='rotate(-1 165 248.9)' fill='%23cfc6e4' opacity='0.5'/%3E%3Cellipse cx='1531.9' cy='350.2' rx='90.5' ry='2.4' transform='rotate(1.7 1531.9 350.2)' fill='%238fbcbc' opacity='0.33'/%3E%3Cellipse cx='765.3' cy='434' rx='104.7' ry='5.4' transform='rotate(0.6 765.3 434)' fill='%238fbcbc' opacity='0.36'/%3E%3Cellipse cx='818.9' cy='253.9' rx='24.9' ry='2.3' transform='rotate(-0.7 818.9 253.9)' fill='%23c4dcd6' opacity='0.57'/%3E%3Cellipse cx='434.7' cy='517.3' rx='53.4' ry='4.4' transform='rotate(1 434.7 517.3)' fill='%238fbcbc' opacity='0.57'/%3E%3Cellipse cx='628.4' cy='509.9' rx='101.7' ry='6' transform='rotate(0.2 628.4 509.9)' fill='%23a9cbe0' opacity='0.66'/%3E%3Cellipse cx='1146.7' cy='352.8' rx='69.6' ry='2.8' transform='rotate(0.7 1146.7 352.8)' fill='%23cfc6e4' opacity='0.71'/%3E%3Cellipse cx='975.2' cy='295.4' rx='20.6' ry='2.4' transform='rotate(1.2 975.2 295.4)' fill='%23cfc6e4' opacity='0.66'/%3E%3Cellipse cx='1370.6' cy='353.5' rx='100.9' ry='4' transform='rotate(1.6 1370.6 353.5)' fill='%23c4dcd6' opacity='0.3'/%3E%3Cellipse cx='1240.6' cy='512.1' rx='122.3' ry='3.3' transform='rotate(-1 1240.6 512.1)' fill='%238fbcbc' opacity='0.7'/%3E%3Cellipse cx='523.5' cy='387.6' rx='68.5' ry='2.2' transform='rotate(-0.4 523.5 387.6)' fill='%23eef2ee' opacity='0.59'/%3E%3Cellipse cx='1237' cy='379.2' rx='108.2' ry='4.8' transform='rotate(-1 1237 379.2)' fill='%23a9cbe0' opacity='0.68'/%3E%3Cellipse cx='1464.7' cy='420.6' rx='113' ry='3.2' transform='rotate(-1.1 1464.7 420.6)' fill='%23a9cbe0' opacity='0.31'/%3E%3Cellipse cx='748.6' cy='389.8' rx='91.6' ry='4' transform='rotate(-1.5 748.6 389.8)' fill='%23a9cbe0' opacity='0.6'/%3E%3Cellipse cx='798' cy='459.5' rx='63.1' ry='3.9' transform='rotate(-0.7 798 459.5)' fill='%238fbcbc' opacity='0.32'/%3E%3Cellipse cx='1500.6' cy='456.1' rx='83.5' ry='5' transform='rotate(-0.1 1500.6 456.1)' fill='%23a9cbe0' opacity='0.51'/%3E%3Cellipse cx='768.9' cy='496.1' rx='165.2' ry='5' transform='rotate(-0.5 768.9 496.1)' fill='%23c4dcd6' opacity='0.61'/%3E%3Cellipse cx='1560.3' cy='505.6' rx='57.1' ry='3' transform='rotate(-0.7 1560.3 505.6)' fill='%23cfc6e4' opacity='0.48'/%3E%3Cellipse cx='901.5' cy='412.1' rx='63.3' ry='2.6' transform='rotate(1.3 901.5 412.1)' fill='%238fbcbc' opacity='0.3'/%3E%3Cellipse cx='1473.4' cy='324.5' rx='87.1' ry='3.2' transform='rotate(-0.7 1473.4 324.5)' fill='%23cfc6e4' opacity='0.59'/%3E%3Cellipse cx='314.7' cy='320.3' rx='85.1' ry='2.5' transform='rotate(0.1 314.7 320.3)' fill='%238fbcbc' opacity='0.68'/%3E%3Cellipse cx='921.8' cy='495.6' rx='67.5' ry='3.7' transform='rotate(1 921.8 495.6)' fill='%23a9cbe0' opacity='0.44'/%3E%3Cellipse cx='29.3' cy='450.3' rx='80.4' ry='6.5' transform='rotate(-1.4 29.3 450.3)' fill='%23eef2ee' opacity='0.63'/%3E%3Cellipse cx='1263.4' cy='267.3' rx='17.5' ry='1.8' transform='rotate(-1.7 1263.4 267.3)' fill='%23a9cbe0' opacity='0.64'/%3E%3Cellipse cx='660.9' cy='401.4' rx='50.5' ry='2.6' transform='rotate(0.9 660.9 401.4)' fill='%238fbcbc' opacity='0.37'/%3E%3Cellipse cx='749.4' cy='347.9' rx='56.9' ry='2.5' transform='rotate(0.6 749.4 347.9)' fill='%238fbcbc' opacity='0.73'/%3E%3Cellipse cx='1384.3' cy='360.3' rx='66.5' ry='3.6' transform='rotate(0.9 1384.3 360.3)' fill='%23eef2ee' opacity='0.44'/%3E%3Cellipse cx='1559.3' cy='452.5' rx='100.4' ry='5.4' transform='rotate(-1.6 1559.3 452.5)' fill='%23a9cbe0' opacity='0.71'/%3E%3Cellipse cx='338.1' cy='352' rx='69.5' ry='4.2' transform='rotate(-0.4 338.1 352)' fill='%238fbcbc' opacity='0.7'/%3E%3Cellipse cx='1435.8' cy='260.1' rx='31' ry='1.6' transform='rotate(0.3 1435.8 260.1)' fill='%23a9cbe0' opacity='0.38'/%3E%3Cellipse cx='1172.1' cy='515.9' rx='40.3' ry='4.3' transform='rotate(-1.4 1172.1 515.9)' fill='%23a9cbe0' opacity='0.47'/%3E%3Cellipse cx='131.2' cy='419.9' rx='87.8' ry='5.4' transform='rotate(1.3 131.2 419.9)' fill='%238fbcbc' opacity='0.6'/%3E%3Cellipse cx='61.6' cy='402.9' rx='35.2' ry='4.8' transform='rotate(1.1 61.6 402.9)' fill='%23cfc6e4' opacity='0.74'/%3E%3Cellipse cx='789' cy='458.1' rx='83.2' ry='3.8' transform='rotate(1.2 789 458.1)' fill='%238fbcbc' opacity='0.71'/%3E%3Cellipse cx='1333.4' cy='404.2' rx='30.1' ry='4' transform='rotate(-1.8 1333.4 404.2)' fill='%238fbcbc' opacity='0.31'/%3E%3Cellipse cx='443.3' cy='390.7' rx='108.2' ry='4.2' transform='rotate(-1.7 443.3 390.7)' fill='%23c4dcd6' opacity='0.34'/%3E%3Cellipse cx='643.5' cy='502.1' rx='145.9' ry='4.4' transform='rotate(0.8 643.5 502.1)' fill='%23eef2ee' opacity='0.41'/%3E%3Cellipse cx='1534.1' cy='399.2' rx='80.1' ry='4.2' transform='rotate(-1.4 1534.1 399.2)' fill='%23a9cbe0' opacity='0.5'/%3E%3Cellipse cx='1395.3' cy='412.5' rx='117.1' ry='5.2' transform='rotate(0.9 1395.3 412.5)' fill='%23cfc6e4' opacity='0.49'/%3E%3Cellipse cx='521.4' cy='407.9' rx='87.3' ry='4.4' transform='rotate(-1.9 521.4 407.9)' fill='%23f3efe2' opacity='0.32'/%3E%3Cellipse cx='1423.4' cy='280.6' rx='50.1' ry='2.9' transform='rotate(-1.2 1423.4 280.6)' fill='%23a9cbe0' opacity='0.46'/%3E%3Cellipse cx='1479' cy='401.5' rx='49' ry='4.5' transform='rotate(-0.9 1479 401.5)' fill='%238fbcbc' opacity='0.38'/%3E%3Cellipse cx='1148.5' cy='514.1' rx='110.2' ry='4.1' transform='rotate(0.9 1148.5 514.1)' fill='%23cfc6e4' opacity='0.53'/%3E%3Cellipse cx='752.1' cy='316.1' rx='23.8' ry='1.7' transform='rotate(-1.9 752.1 316.1)' fill='%238fbcbc' opacity='0.71'/%3E%3Cellipse cx='73' cy='327.5' rx='58.6' ry='2.2' transform='rotate(0.8 73 327.5)' fill='%23eef2ee' opacity='0.61'/%3E%3Cellipse cx='740.5' cy='367.4' rx='89.4' ry='3.8' transform='rotate(-0.7 740.5 367.4)' fill='%23cfc6e4' opacity='0.65'/%3E%3Cellipse cx='1487.1' cy='436' rx='100.1' ry='5.7' transform='rotate(0.5 1487.1 436)' fill='%23f3efe2' opacity='0.7'/%3E%3Cellipse cx='1101' cy='305.4' rx='58.7' ry='1.5' transform='rotate(1.2 1101 305.4)' fill='%23c4dcd6' opacity='0.57'/%3E%3Cellipse cx='996.3' cy='290.4' rx='68.5' ry='2.7' transform='rotate(-0.3 996.3 290.4)' fill='%23f3efe2' opacity='0.47'/%3E%3Cellipse cx='388.9' cy='316.1' rx='48.1' ry='2.2' transform='rotate(-1.6 388.9 316.1)' fill='%238fbcbc' opacity='0.43'/%3E%3Cellipse cx='139.7' cy='275.8' rx='35.9' ry='2.8' transform='rotate(-1.1 139.7 275.8)' fill='%23c4dcd6' opacity='0.46'/%3E%3Cellipse cx='519.6' cy='495.1' rx='119' ry='4.6' transform='rotate(1 519.6 495.1)' fill='%23a9cbe0' opacity='0.57'/%3E%3Cellipse cx='62.5' cy='346.5' rx='75' ry='2.6' transform='rotate(-1.5 62.5 346.5)' fill='%23eef2ee' opacity='0.71'/%3E%3Cellipse cx='382.6' cy='429.6' rx='81.1' ry='3.8' transform='rotate(-1.8 382.6 429.6)' fill='%23eef2ee' opacity='0.52'/%3E%3Cellipse cx='1431' cy='426.5' rx='114.7' ry='3.8' transform='rotate(0.7 1431 426.5)' fill='%23c4dcd6' opacity='0.4'/%3E%3Cellipse cx='126.9' cy='442' rx='131.1' ry='3.9' transform='rotate(0.2 126.9 442)' fill='%23a9cbe0' opacity='0.53'/%3E%3Cellipse cx='1292.3' cy='507.2' rx='135.1' ry='3.2' transform='rotate(1.2 1292.3 507.2)' fill='%23eef2ee' opacity='0.44'/%3E%3Cellipse cx='1259' cy='388.9' rx='35.2' ry='4.3' transform='rotate(0 1259 388.9)' fill='%23f3efe2' opacity='0.49'/%3E%3Cellipse cx='845.9' cy='257.7' rx='24.2' ry='1.4' transform='rotate(1.2 845.9 257.7)' fill='%238fbcbc' opacity='0.52'/%3E%3Cellipse cx='1077.4' cy='297.8' rx='57.6' ry='2.9' transform='rotate(1.3 1077.4 297.8)' fill='%23eef2ee' opacity='0.35'/%3E%3Cellipse cx='1466' cy='329.5' rx='79.1' ry='2.1' transform='rotate(-1.4 1466 329.5)' fill='%23eef2ee' opacity='0.75'/%3E%3Cellipse cx='1357.5' cy='412.5' rx='40.9' ry='3.2' transform='rotate(0.9 1357.5 412.5)' fill='%23cfc6e4' opacity='0.66'/%3E%3Cellipse cx='1473.8' cy='275.1' rx='60.9' ry='2.7' transform='rotate(1.3 1473.8 275.1)' fill='%23a9cbe0' opacity='0.25'/%3E%3Cellipse cx='1365' cy='434.9' rx='129' ry='2.8' transform='rotate(-0.6 1365 434.9)' fill='%23c4dcd6' opacity='0.35'/%3E%3Cellipse cx='86' cy='269' rx='41.9' ry='2.2' transform='rotate(0.7 86 269)' fill='%23cfc6e4' opacity='0.42'/%3E%3Cellipse cx='1035.8' cy='315.1' rx='78.5' ry='2.3' transform='rotate(0.7 1035.8 315.1)' fill='%23c4dcd6' opacity='0.52'/%3E%3Cellipse cx='197.2' cy='511.5' rx='154.8' ry='5.9' transform='rotate(1.1 197.2 511.5)' fill='%23f3efe2' opacity='0.75'/%3E%3Cellipse cx='729.8' cy='497.2' rx='62.4' ry='7.2' transform='rotate(0.9 729.8 497.2)' fill='%23f3efe2' opacity='0.43'/%3E%3Cellipse cx='755.7' cy='384.7' rx='77.8' ry='2.7' transform='rotate(1.2 755.7 384.7)' fill='%238fbcbc' opacity='0.63'/%3E%3Cellipse cx='918' cy='322.6' rx='57.3' ry='1.7' transform='rotate(-0.4 918 322.6)' fill='%23a9cbe0' opacity='0.45'/%3E%3Cellipse cx='591.4' cy='298.7' rx='65.2' ry='3.3' transform='rotate(0.8 591.4 298.7)' fill='%23f3efe2' opacity='0.62'/%3E%3Cellipse cx='360.6' cy='481.7' rx='73' ry='4.5' transform='rotate(0.9 360.6 481.7)' fill='%23eef2ee' opacity='0.72'/%3E%3Cellipse cx='551.4' cy='322' rx='23.6' ry='3.6' transform='rotate(-1.6 551.4 322)' fill='%23c4dcd6' opacity='0.41'/%3E%3Cellipse cx='398.5' cy='322.2' rx='67.9' ry='3.4' transform='rotate(0.2 398.5 322.2)' fill='%23cfc6e4' opacity='0.66'/%3E%3Cellipse cx='100' cy='246' rx='38.5' ry='1' transform='rotate(0.5 100 246)' fill='%238fbcbc' opacity='0.71'/%3E%3Cellipse cx='361.3' cy='457.3' rx='123.8' ry='3.5' transform='rotate(-0.8 361.3 457.3)' fill='%23c4dcd6' opacity='0.42'/%3E%3Cellipse cx='698.6' cy='446.6' rx='107.1' ry='3.6' transform='rotate(-1.5 698.6 446.6)' fill='%23a9cbe0' opacity='0.69'/%3E%3Cellipse cx='387.8' cy='497.5' rx='83.8' ry='6.7' transform='rotate(-1.3 387.8 497.5)' fill='%23a9cbe0' opacity='0.62'/%3E%3Cellipse cx='388.6' cy='375.9' rx='104.7' ry='3.2' transform='rotate(-0.9 388.6 375.9)' fill='%23c4dcd6' opacity='0.35'/%3E%3Cellipse cx='1338.2' cy='432' rx='136.7' ry='4' transform='rotate(1.2 1338.2 432)' fill='%23f3efe2' opacity='0.46'/%3E%3Cellipse cx='792.1' cy='289.9' rx='43.5' ry='2.2' transform='rotate(0.3 792.1 289.9)' fill='%23f3efe2' opacity='0.41'/%3E%3Cellipse cx='1486.6' cy='516.5' rx='79.1' ry='3.2' transform='rotate(-0.1 1486.6 516.5)' fill='%23f3efe2' opacity='0.63'/%3E%3Cellipse cx='471.2' cy='314.5' rx='29.6' ry='3.7' transform='rotate(1.1 471.2 314.5)' fill='%238fbcbc' opacity='0.45'/%3E%3Cellipse cx='965.9' cy='412' rx='40.6' ry='3.6' transform='rotate(0.7 965.9 412)' fill='%23eef2ee' opacity='0.59'/%3E%3Cellipse cx='1215.6' cy='325.1' rx='23.3' ry='3' transform='rotate(-2 1215.6 325.1)' fill='%238fbcbc' opacity='0.55'/%3E%3Cellipse cx='877.8' cy='407.8' rx='55.5' ry='4.5' transform='rotate(1.3 877.8 407.8)' fill='%238fbcbc' opacity='0.65'/%3E%3Cellipse cx='929.2' cy='384' rx='103' ry='3.1' transform='rotate(0.9 929.2 384)' fill='%23cfc6e4' opacity='0.63'/%3E%3Cellipse cx='1127.6' cy='276.5' rx='45.9' ry='1.2' transform='rotate(0.3 1127.6 276.5)' fill='%238fbcbc' opacity='0.57'/%3E%3Cellipse cx='1527.8' cy='467.7' rx='50.8' ry='4.3' transform='rotate(-0.5 1527.8 467.7)' fill='%23eef2ee' opacity='0.49'/%3E%3Cellipse cx='863.6' cy='350.6' rx='42.6' ry='3.6' transform='rotate(0.5 863.6 350.6)' fill='%23a9cbe0' opacity='0.54'/%3E%3Cellipse cx='500.2' cy='405.6' rx='34.3' ry='2.8' transform='rotate(-1.4 500.2 405.6)' fill='%23a9cbe0' opacity='0.55'/%3E%3Cellipse cx='941.3' cy='497.2' rx='59.9' ry='7.2' transform='rotate(0.2 941.3 497.2)' fill='%23cfc6e4' opacity='0.68'/%3E%3Cellipse cx='1386.7' cy='335.4' rx='70.5' ry='2.6' transform='rotate(1.2 1386.7 335.4)' fill='%23a9cbe0' opacity='0.48'/%3E%3C/g%3E%3Cg filter='url(%23bl-wash)'%3E%3Cellipse cx='-12.9' cy='69.7' rx='150.6' ry='61.7' transform='rotate(3.5 -12.9 69.7)' fill='%235c8b57' opacity='0.26'/%3E%3Cellipse cx='137.4' cy='16.4' rx='154.5' ry='66.4' transform='rotate(-4.6 137.4 16.4)' fill='%236f9f5e' opacity='0.23'/%3E%3Cellipse cx='210.7' cy='8.6' rx='108.7' ry='35.1' transform='rotate(-0.5 210.7 8.6)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='278.5' cy='10' rx='103' ry='50' transform='rotate(8.5 278.5 10)' fill='%234e7d4a' opacity='0.37'/%3E%3Cellipse cx='269.2' cy='77' rx='173.3' ry='65.5' transform='rotate(5.2 269.2 77)' fill='%236f9f5e' opacity='0.41'/%3E%3Cellipse cx='441.8' cy='2' rx='106.4' ry='55.9' transform='rotate(-0.2 441.8 2)' fill='%237d9fb0' opacity='0.41'/%3E%3Cellipse cx='477.3' cy='0.1' rx='244.6' ry='42.8' transform='rotate(-5.7 477.3 0.1)' fill='%238e8fbf' opacity='0.43'/%3E%3Cellipse cx='525.8' cy='5.6' rx='166' ry='70.2' transform='rotate(-8.5 525.8 5.6)' fill='%234e7d4a' opacity='0.34'/%3E%3Cellipse cx='625.4' cy='38.5' rx='98.6' ry='54.5' transform='rotate(0.4 625.4 38.5)' fill='%234e7d4a' opacity='0.23'/%3E%3Cellipse cx='728.5' cy='10.9' rx='222.7' ry='46.4' transform='rotate(-0.8 728.5 10.9)' fill='%234e7d4a' opacity='0.28'/%3E%3Cellipse cx='834.7' cy='14.6' rx='190.8' ry='37.3' transform='rotate(2.8 834.7 14.6)' fill='%237d9fb0' opacity='0.44'/%3E%3Cellipse cx='888.5' cy='65.5' rx='187.9' ry='41.8' transform='rotate(2.6 888.5 65.5)' fill='%237d9fb0' opacity='0.28'/%3E%3Cellipse cx='937' cy='64.4' rx='217.6' ry='56.9' transform='rotate(-7.4 937 64.4)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='1069.3' cy='19.2' rx='231.9' ry='63.8' transform='rotate(-4.9 1069.3 19.2)' fill='%235c8b57' opacity='0.36'/%3E%3Cellipse cx='1097.1' cy='63.8' rx='190.7' ry='49.2' transform='rotate(9.1 1097.1 63.8)' fill='%237d9fb0' opacity='0.45'/%3E%3Cellipse cx='1170.9' cy='45.7' rx='100.5' ry='57.8' transform='rotate(2.1 1170.9 45.7)' fill='%235c8b57' opacity='0.41'/%3E%3Cellipse cx='1278.6' cy='65.3' rx='98.4' ry='73.4' transform='rotate(-8.9 1278.6 65.3)' fill='%234e7d4a' opacity='0.42'/%3E%3Cellipse cx='1344.7' cy='59.5' rx='139' ry='41.4' transform='rotate(3.9 1344.7 59.5)' fill='%237d9fb0' opacity='0.39'/%3E%3Cellipse cx='1476.5' cy='8.7' rx='223.5' ry='54.4' transform='rotate(5.4 1476.5 8.7)' fill='%234e7d4a' opacity='0.42'/%3E%3Cellipse cx='1535.8' cy='21' rx='180.2' ry='54.4' transform='rotate(-5.7 1535.8 21)' fill='%237d9fb0' opacity='0.38'/%3E%3Cellipse cx='1578.8' cy='2.5' rx='127.3' ry='67' transform='rotate(3.2 1578.8 2.5)' fill='%238e8fbf' opacity='0.24'/%3E%3C/g%3E%3Cg filter='url(%23bl-paint)'%3E%3Cellipse cx='1451.8' cy='69' rx='49.5' ry='11.4' transform='rotate(88.9 1451.8 69)' fill='%234e7d4a' opacity='0.42'/%3E%3Cellipse cx='436.9' cy='172.2' rx='37.8' ry='9.8' transform='rotate(102.3 436.9 172.2)' fill='%2386b26b' opacity='0.42'/%3E%3Cellipse cx='809.7' cy='29.7' rx='53.4' ry='5.7' transform='rotate(82.5 809.7 29.7)' fill='%23a9c98a' opacity='0.64'/%3E%3Cellipse cx='636.3' cy='11.1' rx='42.9' ry='7.1' transform='rotate(99.4 636.3 11.1)' fill='%234e7d4a' opacity='0.35'/%3E%3Cellipse cx='1525.1' cy='8.6' rx='47.2' ry='9.3' transform='rotate(104.2 1525.1 8.6)' fill='%233f6e45' opacity='0.45'/%3E%3Cellipse cx='827.5' cy='95.2' rx='22.3' ry='6' transform='rotate(99.2 827.5 95.2)' fill='%234e7d4a' opacity='0.72'/%3E%3Cellipse cx='1158.9' cy='67.9' rx='19.6' ry='6' transform='rotate(99.3 1158.9 67.9)' fill='%23a9c98a' opacity='0.52'/%3E%3Cellipse cx='1543.2' cy='5.1' rx='33.3' ry='9.2' transform='rotate(78.3 1543.2 5.1)' fill='%2386b26b' opacity='0.34'/%3E%3Cellipse cx='248.9' cy='135.7' rx='28.1' ry='12.6' transform='rotate(82.3 248.9 135.7)' fill='%23b9b3d9' opacity='0.43'/%3E%3Cellipse cx='193' cy='87' rx='19.7' ry='9.4' transform='rotate(102.2 193 87)' fill='%2386b26b' opacity='0.3'/%3E%3Cellipse cx='1491.4' cy='38.2' rx='51.6' ry='7' transform='rotate(77.6 1491.4 38.2)' fill='%23c8dcb0' opacity='0.53'/%3E%3Cellipse cx='105.1' cy='9.1' rx='52.8' ry='11.1' transform='rotate(82.4 105.1 9.1)' fill='%239a86c2' opacity='0.64'/%3E%3Cellipse cx='454.9' cy='101.7' rx='53' ry='8.2' transform='rotate(93.5 454.9 101.7)' fill='%239a86c2' opacity='0.67'/%3E%3Cellipse cx='514.4' cy='158.8' rx='19.9' ry='7' transform='rotate(103.3 514.4 158.8)' fill='%237fae74' opacity='0.68'/%3E%3Cellipse cx='1004.6' cy='17.3' rx='52.7' ry='8.7' transform='rotate(98.1 1004.6 17.3)' fill='%233f6e45' opacity='0.56'/%3E%3Cellipse cx='1439.5' cy='0.3' rx='47.1' ry='11.5' transform='rotate(96.3 1439.5 0.3)' fill='%235c8b57' opacity='0.71'/%3E%3Cellipse cx='1466.9' cy='105.8' rx='54.8' ry='5.5' transform='rotate(91.4 1466.9 105.8)' fill='%233f6e45' opacity='0.4'/%3E%3Cellipse cx='346.6' cy='45.4' rx='24.9' ry='8.8' transform='rotate(94.4 346.6 45.4)' fill='%237fae74' opacity='0.53'/%3E%3Cellipse cx='696.5' cy='63.9' rx='34.1' ry='11.2' transform='rotate(77.5 696.5 63.9)' fill='%234e7d4a' opacity='0.35'/%3E%3Cellipse cx='1200.9' cy='139' rx='45.6' ry='7' transform='rotate(102.1 1200.9 139)' fill='%236f9f5e' opacity='0.42'/%3E%3Cellipse cx='1316' cy='7.2' rx='45.9' ry='6.3' transform='rotate(100.9 1316 7.2)' fill='%23c8dcb0' opacity='0.59'/%3E%3Cellipse cx='1189.8' cy='19.4' rx='24.3' ry='11.1' transform='rotate(82.9 1189.8 19.4)' fill='%235c8b57' opacity='0.73'/%3E%3Cellipse cx='626.9' cy='20.8' rx='20.4' ry='8.8' transform='rotate(76.5 626.9 20.8)' fill='%234e7d4a' opacity='0.4'/%3E%3Cellipse cx='568' cy='152.2' rx='28.8' ry='5.1' transform='rotate(83.1 568 152.2)' fill='%239a86c2' opacity='0.69'/%3E%3Cellipse cx='699.4' cy='196.7' rx='22.7' ry='5.7' transform='rotate(75.6 699.4 196.7)' fill='%236f9f5e' opacity='0.53'/%3E%3Cellipse cx='234.1' cy='12.1' rx='26.7' ry='9.2' transform='rotate(105 234.1 12.1)' fill='%235c8b57' opacity='0.61'/%3E%3Cellipse cx='338.6' cy='142.4' rx='40.1' ry='9.3' transform='rotate(104.3 338.6 142.4)' fill='%237fae74' opacity='0.35'/%3E%3Cellipse cx='1008.4' cy='127.7' rx='25.1' ry='6.8' transform='rotate(75.3 1008.4 127.7)' fill='%23a9c98a' opacity='0.59'/%3E%3Cellipse cx='298.5' cy='117.1' rx='39.5' ry='11.6' transform='rotate(75.9 298.5 117.1)' fill='%233f6e45' opacity='0.66'/%3E%3Cellipse cx='702.7' cy='69.3' rx='48.4' ry='12.4' transform='rotate(85.6 702.7 69.3)' fill='%23b9b3d9' opacity='0.75'/%3E%3Cellipse cx='226.4' cy='49.9' rx='51.9' ry='10.2' transform='rotate(94.7 226.4 49.9)' fill='%235c8b57' opacity='0.3'/%3E%3Cellipse cx='1187.9' cy='20.8' rx='46.3' ry='5.6' transform='rotate(90.6 1187.9 20.8)' fill='%23b9b3d9' opacity='0.55'/%3E%3Cellipse cx='1053.5' cy='103.7' rx='37.3' ry='9.9' transform='rotate(84.2 1053.5 103.7)' fill='%23c8dcb0' opacity='0.58'/%3E%3Cellipse cx='757.6' cy='140.2' rx='27.9' ry='9.4' transform='rotate(76.4 757.6 140.2)' fill='%23b9b3d9' opacity='0.64'/%3E%3Cellipse cx='720.1' cy='102.3' rx='38.7' ry='8.2' transform='rotate(91.3 720.1 102.3)' fill='%2386b26b' opacity='0.44'/%3E%3Cellipse cx='901' cy='5.3' rx='26.5' ry='11.2' transform='rotate(75.4 901 5.3)' fill='%23c8dcb0' opacity='0.34'/%3E%3Cellipse cx='553.1' cy='141.3' rx='37.6' ry='12.7' transform='rotate(95 553.1 141.3)' fill='%239a86c2' opacity='0.64'/%3E%3Cellipse cx='1561.2' cy='41.1' rx='24.1' ry='11.4' transform='rotate(86 1561.2 41.1)' fill='%239a86c2' opacity='0.73'/%3E%3Cellipse cx='1297.5' cy='17.9' rx='47.5' ry='9.3' transform='rotate(87.2 1297.5 17.9)' fill='%23c8dcb0' opacity='0.34'/%3E%3Cellipse cx='1302' cy='167.4' rx='55' ry='7.4' transform='rotate(98.1 1302 167.4)' fill='%2386b26b' opacity='0.58'/%3E%3Cellipse cx='766.8' cy='140.8' rx='53.9' ry='7.3' transform='rotate(100.6 766.8 140.8)' fill='%234e7d4a' opacity='0.43'/%3E%3Cellipse cx='577.8' cy='201.7' rx='45.5' ry='12.9' transform='rotate(80.5 577.8 201.7)' fill='%237fae74' opacity='0.48'/%3E%3Cellipse cx='346.8' cy='203.9' rx='48' ry='5.2' transform='rotate(101.3 346.8 203.9)' fill='%23b9b3d9' opacity='0.34'/%3E%3Cellipse cx='1539' cy='212.3' rx='29.6' ry='5.2' transform='rotate(104.2 1539 212.3)' fill='%2386b26b' opacity='0.66'/%3E%3Cellipse cx='252.2' cy='112.5' rx='29.2' ry='11' transform='rotate(102.4 252.2 112.5)' fill='%236f9f5e' opacity='0.69'/%3E%3Cellipse cx='958.4' cy='118.9' rx='43' ry='12.6' transform='rotate(82.3 958.4 118.9)' fill='%239a86c2' opacity='0.42'/%3E%3Cellipse cx='1076.1' cy='109' rx='28.1' ry='8.8' transform='rotate(82.9 1076.1 109)' fill='%233f6e45' opacity='0.35'/%3E%3Cellipse cx='475.3' cy='28.6' rx='38' ry='8.3' transform='rotate(89.3 475.3 28.6)' fill='%23c8dcb0' opacity='0.37'/%3E%3Cellipse cx='72.6' cy='187.8' rx='24.1' ry='9.5' transform='rotate(74.7 72.6 187.8)' fill='%239a86c2' opacity='0.54'/%3E%3Cellipse cx='695.6' cy='242.6' rx='37.5' ry='6.7' transform='rotate(99.2 695.6 242.6)' fill='%235c8b57' opacity='0.74'/%3E%3Cellipse cx='224.8' cy='64' rx='17.9' ry='9.9' transform='rotate(105.8 224.8 64)' fill='%237fae74' opacity='0.66'/%3E%3Cellipse cx='248.6' cy='5.8' rx='44.8' ry='9' transform='rotate(94.7 248.6 5.8)' fill='%23c8dcb0' opacity='0.34'/%3E%3Cellipse cx='1399.1' cy='156.5' rx='35.7' ry='10.1' transform='rotate(98.2 1399.1 156.5)' fill='%236f9f5e' opacity='0.53'/%3E%3Cellipse cx='78.3' cy='29.2' rx='36' ry='5' transform='rotate(98 78.3 29.2)' fill='%2386b26b' opacity='0.41'/%3E%3Cellipse cx='394.7' cy='0.1' rx='31.3' ry='8' transform='rotate(88 394.7 0.1)' fill='%239a86c2' opacity='0.32'/%3E%3Cellipse cx='1244.6' cy='13' rx='27.6' ry='6.4' transform='rotate(79.8 1244.6 13)' fill='%235c8b57' opacity='0.38'/%3E%3Cellipse cx='953.9' cy='129.1' rx='46.9' ry='7.4' transform='rotate(93.4 953.9 129.1)' fill='%237fae74' opacity='0.68'/%3E%3Cellipse cx='931.2' cy='1.3' rx='41' ry='9.8' transform='rotate(75.7 931.2 1.3)' fill='%237fae74' opacity='0.4'/%3E%3Cellipse cx='710.1' cy='96.2' rx='26.3' ry='12.4' transform='rotate(91.7 710.1 96.2)' fill='%236f9f5e' opacity='0.42'/%3E%3Cellipse cx='1354' cy='214.2' rx='41.8' ry='10.2' transform='rotate(74.9 1354 214.2)' fill='%2386b26b' opacity='0.41'/%3E%3Cellipse cx='980.9' cy='28.9' rx='40.3' ry='9' transform='rotate(82 980.9 28.9)' fill='%2386b26b' opacity='0.5'/%3E%3Cellipse cx='774.9' cy='5.2' rx='24' ry='6.4' transform='rotate(96.9 774.9 5.2)' fill='%2386b26b' opacity='0.42'/%3E%3Cellipse cx='734.1' cy='111.3' rx='39.3' ry='7.9' transform='rotate(99.3 734.1 111.3)' fill='%237fae74' opacity='0.68'/%3E%3Cellipse cx='276.8' cy='27.7' rx='27.4' ry='10.7' transform='rotate(103 276.8 27.7)' fill='%233f6e45' opacity='0.47'/%3E%3Cellipse cx='415' cy='63.7' rx='44.2' ry='10.5' transform='rotate(83.6 415 63.7)' fill='%23b9b3d9' opacity='0.47'/%3E%3Cellipse cx='100.9' cy='105' rx='22.5' ry='11.6' transform='rotate(88.3 100.9 105)' fill='%2386b26b' opacity='0.64'/%3E%3Cellipse cx='865.5' cy='27.1' rx='37.8' ry='7.2' transform='rotate(80 865.5 27.1)' fill='%234e7d4a' opacity='0.57'/%3E%3Cellipse cx='600' cy='139.5' rx='53.4' ry='7.9' transform='rotate(99.1 600 139.5)' fill='%23a9c98a' opacity='0.47'/%3E%3Cellipse cx='1154.2' cy='88.7' rx='39' ry='9' transform='rotate(84.6 1154.2 88.7)' fill='%23c8dcb0' opacity='0.47'/%3E%3Cellipse cx='887.4' cy='195.6' rx='37.8' ry='6.5' transform='rotate(88.2 887.4 195.6)' fill='%233f6e45' opacity='0.71'/%3E%3Cellipse cx='620.4' cy='26.1' rx='21.1' ry='11.6' transform='rotate(98.9 620.4 26.1)' fill='%234e7d4a' opacity='0.45'/%3E%3Cellipse cx='1314.6' cy='31.5' rx='48.9' ry='12.1' transform='rotate(85.9 1314.6 31.5)' fill='%2386b26b' opacity='0.4'/%3E%3Cellipse cx='762.9' cy='74.6' rx='18.7' ry='7.8' transform='rotate(87.7 762.9 74.6)' fill='%239a86c2' opacity='0.43'/%3E%3Cellipse cx='502.1' cy='43.8' rx='46.9' ry='12.1' transform='rotate(91.1 502.1 43.8)' fill='%239a86c2' opacity='0.35'/%3E%3Cellipse cx='311' cy='9.6' rx='28.6' ry='5.1' transform='rotate(76.8 311 9.6)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='509.7' cy='106.1' rx='32.4' ry='12.8' transform='rotate(104.7 509.7 106.1)' fill='%236f9f5e' opacity='0.59'/%3E%3Cellipse cx='1235.5' cy='18.3' rx='31.6' ry='8.5' transform='rotate(78.1 1235.5 18.3)' fill='%2386b26b' opacity='0.32'/%3E%3Cellipse cx='303.7' cy='84.7' rx='42.9' ry='10.7' transform='rotate(94.9 303.7 84.7)' fill='%23c8dcb0' opacity='0.53'/%3E%3Cellipse cx='1120.2' cy='132.6' rx='55.1' ry='9.2' transform='rotate(94.8 1120.2 132.6)' fill='%23b9b3d9' opacity='0.54'/%3E%3Cellipse cx='770.1' cy='148.6' rx='25.8' ry='9.7' transform='rotate(82.3 770.1 148.6)' fill='%2386b26b' opacity='0.38'/%3E%3Cellipse cx='1018.6' cy='6.5' rx='26.3' ry='8.7' transform='rotate(97.4 1018.6 6.5)' fill='%239a86c2' opacity='0.67'/%3E%3Cellipse cx='162.6' cy='137' rx='38.2' ry='10.7' transform='rotate(105 162.6 137)' fill='%233f6e45' opacity='0.63'/%3E%3Cellipse cx='1295.6' cy='0.1' rx='39.2' ry='12.4' transform='rotate(75.5 1295.6 0.1)' fill='%2386b26b' opacity='0.65'/%3E%3Cellipse cx='572.4' cy='0.1' rx='27.7' ry='11.7' transform='rotate(87 572.4 0.1)' fill='%23c8dcb0' opacity='0.51'/%3E%3Cellipse cx='761.7' cy='46.5' rx='47.2' ry='12.1' transform='rotate(92.3 761.7 46.5)' fill='%233f6e45' opacity='0.51'/%3E%3Cellipse cx='39.5' cy='24.8' rx='48.4' ry='8.4' transform='rotate(78.4 39.5 24.8)' fill='%23c8dcb0' opacity='0.66'/%3E%3Cellipse cx='487.8' cy='77.5' rx='46.5' ry='7.7' transform='rotate(97.8 487.8 77.5)' fill='%2386b26b' opacity='0.3'/%3E%3Cellipse cx='97.9' cy='2.1' rx='22.4' ry='8.1' transform='rotate(98.8 97.9 2.1)' fill='%234e7d4a' opacity='0.73'/%3E%3Cellipse cx='304.2' cy='32.8' rx='37.6' ry='11.8' transform='rotate(100.5 304.2 32.8)' fill='%239a86c2' opacity='0.38'/%3E%3Cellipse cx='862.5' cy='11.1' rx='48.1' ry='6' transform='rotate(101.2 862.5 11.1)' fill='%235c8b57' opacity='0.66'/%3E%3Cellipse cx='1476.1' cy='0.5' rx='21.1' ry='9.4' transform='rotate(95.6 1476.1 0.5)' fill='%23a9c98a' opacity='0.65'/%3E%3Cellipse cx='55.4' cy='4.1' rx='28.4' ry='10' transform='rotate(82.2 55.4 4.1)' fill='%234e7d4a' opacity='0.47'/%3E%3Cellipse cx='49' cy='155.4' rx='53.2' ry='12.9' transform='rotate(99.3 49 155.4)' fill='%23c8dcb0' opacity='0.71'/%3E%3Cellipse cx='332.6' cy='181.8' rx='42.5' ry='6.5' transform='rotate(85.4 332.6 181.8)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='1276.8' cy='48.1' rx='38.1' ry='10.1' transform='rotate(87 1276.8 48.1)' fill='%23a9c98a' opacity='0.66'/%3E%3Cellipse cx='673' cy='237.2' rx='46.1' ry='6.7' transform='rotate(77.6 673 237.2)' fill='%23c8dcb0' opacity='0.73'/%3E%3Cellipse cx='278.2' cy='29.6' rx='33.5' ry='7.4' transform='rotate(87.8 278.2 29.6)' fill='%23c8dcb0' opacity='0.75'/%3E%3Cellipse cx='94.7' cy='230.5' rx='21' ry='9.3' transform='rotate(101.3 94.7 230.5)' fill='%235c8b57' opacity='0.42'/%3E%3Cellipse cx='239.2' cy='68.3' rx='34' ry='11.1' transform='rotate(84.5 239.2 68.3)' fill='%233f6e45' opacity='0.5'/%3E%3Cellipse cx='925.5' cy='50.9' rx='46.3' ry='5.6' transform='rotate(102 925.5 50.9)' fill='%239a86c2' opacity='0.42'/%3E%3Cellipse cx='850.1' cy='41.5' rx='32.2' ry='12.7' transform='rotate(90.6 850.1 41.5)' fill='%239a86c2' opacity='0.74'/%3E%3Cellipse cx='623.7' cy='222.2' rx='32.1' ry='11.5' transform='rotate(88.5 623.7 222.2)' fill='%234e7d4a' opacity='0.65'/%3E%3Cellipse cx='1056.1' cy='16' rx='41.5' ry='11.2' transform='rotate(81.6 1056.1 16)' fill='%239a86c2' opacity='0.37'/%3E%3Cellipse cx='1245.6' cy='23.5' rx='19.4' ry='8.6' transform='rotate(80.5 1245.6 23.5)' fill='%23a9c98a' opacity='0.63'/%3E%3Cellipse cx='1522.1' cy='3.8' rx='18' ry='10.1' transform='rotate(104.8 1522.1 3.8)' fill='%2386b26b' opacity='0.66'/%3E%3Cellipse cx='1143.5' cy='17.9' rx='31' ry='8.6' transform='rotate(83.3 1143.5 17.9)' fill='%233f6e45' opacity='0.64'/%3E%3Cellipse cx='1347' cy='78.8' rx='37.2' ry='11.7' transform='rotate(93.4 1347 78.8)' fill='%2386b26b' opacity='0.6'/%3E%3Cellipse cx='273' cy='206.5' rx='39.8' ry='10.5' transform='rotate(90.1 273 206.5)' fill='%2386b26b' opacity='0.52'/%3E%3Cellipse cx='1343.8' cy='51.2' rx='36.2' ry='8.3' transform='rotate(94.1 1343.8 51.2)' fill='%236f9f5e' opacity='0.58'/%3E%3Cellipse cx='75.5' cy='21.9' rx='39.2' ry='13' transform='rotate(99.6 75.5 21.9)' fill='%234e7d4a' opacity='0.48'/%3E%3Cellipse cx='726.8' cy='235.1' rx='49' ry='6.3' transform='rotate(91.6 726.8 235.1)' fill='%23c8dcb0' opacity='0.71'/%3E%3Cellipse cx='121.8' cy='0' rx='50.7' ry='7.5' transform='rotate(94.8 121.8 0)' fill='%236f9f5e' opacity='0.47'/%3E%3Cellipse cx='390.7' cy='0' rx='53.8' ry='5.8' transform='rotate(102.5 390.7 0)' fill='%239a86c2' opacity='0.61'/%3E%3Cellipse cx='689.2' cy='10.1' rx='43.8' ry='6.9' transform='rotate(90.1 689.2 10.1)' fill='%236f9f5e' opacity='0.52'/%3E%3Cellipse cx='1221.5' cy='6.3' rx='51' ry='5.4' transform='rotate(82.7 1221.5 6.3)' fill='%233f6e45' opacity='0.68'/%3E%3Cellipse cx='778' cy='117.7' rx='31.5' ry='11.3' transform='rotate(74.6 778 117.7)' fill='%236f9f5e' opacity='0.39'/%3E%3Cellipse cx='478.8' cy='123.8' rx='25.3' ry='8.6' transform='rotate(93.7 478.8 123.8)' fill='%234e7d4a' opacity='0.36'/%3E%3Cellipse cx='572.4' cy='220.5' rx='19.6' ry='10.5' transform='rotate(82.4 572.4 220.5)' fill='%2386b26b' opacity='0.53'/%3E%3Cellipse cx='39.4' cy='67.4' rx='40.2' ry='7.3' transform='rotate(96.8 39.4 67.4)' fill='%23c8dcb0' opacity='0.47'/%3E%3Cellipse cx='785' cy='0.6' rx='34.8' ry='9.9' transform='rotate(105 785 0.6)' fill='%234e7d4a' opacity='0.34'/%3E%3Cellipse cx='615.2' cy='136.3' rx='32.1' ry='5.9' transform='rotate(95.1 615.2 136.3)' fill='%239a86c2' opacity='0.62'/%3E%3Cellipse cx='379.1' cy='1.2' rx='20.5' ry='10.6' transform='rotate(81 379.1 1.2)' fill='%23c8dcb0' opacity='0.45'/%3E%3Cellipse cx='436.6' cy='2.3' rx='31' ry='11.7' transform='rotate(87 436.6 2.3)' fill='%233f6e45' opacity='0.35'/%3E%3Cellipse cx='181' cy='25.3' rx='22' ry='7.6' transform='rotate(89.7 181 25.3)' fill='%236f9f5e' opacity='0.52'/%3E%3Cellipse cx='427.7' cy='218.9' rx='20.5' ry='7.9' transform='rotate(84.2 427.7 218.9)' fill='%235c8b57' opacity='0.65'/%3E%3Cellipse cx='745.4' cy='77' rx='42.6' ry='9.6' transform='rotate(96 745.4 77)' fill='%234e7d4a' opacity='0.5'/%3E%3Cellipse cx='178.7' cy='91.6' rx='48.6' ry='7.4' transform='rotate(99.2 178.7 91.6)' fill='%235c8b57' opacity='0.69'/%3E%3Cellipse cx='406.5' cy='213.6' rx='47.3' ry='12.6' transform='rotate(79.4 406.5 213.6)' fill='%2386b26b' opacity='0.58'/%3E%3Cellipse cx='1470.4' cy='36' rx='39.9' ry='10.4' transform='rotate(99.4 1470.4 36)' fill='%236f9f5e' opacity='0.54'/%3E%3Cellipse cx='1241.8' cy='11.6' rx='19.7' ry='7.9' transform='rotate(105.8 1241.8 11.6)' fill='%236f9f5e' opacity='0.73'/%3E%3Cellipse cx='631.1' cy='3.8' rx='33.6' ry='11.3' transform='rotate(92.4 631.1 3.8)' fill='%233f6e45' opacity='0.3'/%3E%3Cellipse cx='117.9' cy='100.4' rx='39.4' ry='6.2' transform='rotate(83.4 117.9 100.4)' fill='%2386b26b' opacity='0.52'/%3E%3C/g%3E%3Cg filter='url(%23bl-paint)'%3E%3Cellipse cx='1391.2' cy='362.1' rx='39.6' ry='12.2' transform='rotate(-2.5 1391.2 362.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1388.7' cy='359.7' rx='39.6' ry='12.2' transform='rotate(-2.3 1388.7 359.7)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1378.8' cy='356' rx='19.8' ry='4.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1387.3' cy='354.8' rx='8.5' ry='4.5' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='1387.3' cy='353.1' rx='4.5' ry='3.1' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1387.3' cy='353.7' r='1.6' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1360.4' cy='382.6' rx='22.7' ry='6.9' transform='rotate(2.7 1360.4 382.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1357.9' cy='380.2' rx='22.7' ry='6.9' transform='rotate(3 1357.9 380.2)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1352.2' cy='378.1' rx='11.4' ry='2.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1400.7' cy='386.4' rx='34' ry='10' transform='rotate(-1.7 1400.7 386.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1398.3' cy='384' rx='34' ry='10' transform='rotate(3.1 1398.3 384)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1389.8' cy='381' rx='17' ry='3.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1399' cy='380' rx='9.9' ry='5.3' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='1399' cy='378' rx='5.3' ry='3.6' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1399' cy='378.7' r='1.9' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1337.2' cy='365.8' rx='43.4' ry='13.2' transform='rotate(3.2 1337.2 365.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1334.7' cy='363.4' rx='43.4' ry='13.2' transform='rotate(-1.3 1334.7 363.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1323.9' cy='359.4' rx='21.7' ry='4.6' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1337.3' cy='364.6' rx='34.3' ry='8.6' transform='rotate(1.7 1337.3 364.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1334.8' cy='362.1' rx='34.3' ry='8.6' transform='rotate(0.9 1334.8 362.1)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='1326.2' cy='359.5' rx='17.2' ry='3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1348.5' cy='358.7' rx='10.5' ry='5.6' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='1348.5' cy='356.6' rx='5.6' ry='3.8' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1348.5' cy='357.3' r='2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='70.3' cy='432.4' rx='39.1' ry='10.5' transform='rotate(-2.3 70.3 432.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='66.9' cy='429' rx='39.1' ry='10.5' transform='rotate(-2.4 66.9 429)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='57.1' cy='425.9' rx='19.6' ry='3.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='74.9' cy='424.8' rx='16.7' ry='8.9' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='74.9' cy='421.5' rx='8.9' ry='6.1' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='74.9' cy='422.6' r='3.1' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='199.3' cy='456.8' rx='58.2' ry='18.5' transform='rotate(-0.8 199.3 456.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='195.9' cy='453.4' rx='58.2' ry='18.5' transform='rotate(0.7 195.9 453.4)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='181.3' cy='447.9' rx='29.1' ry='6.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='117.4' cy='463.1' rx='60.7' ry='16.1' transform='rotate(2.2 117.4 463.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='114.1' cy='459.8' rx='60.7' ry='16.1' transform='rotate(-3.5 114.1 459.8)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='98.9' cy='454.9' rx='30.3' ry='5.6' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='117.6' cy='453.3' rx='9.9' ry='5.3' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='117.6' cy='451.3' rx='5.3' ry='3.6' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='117.6' cy='452' r='1.8' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='785.2' cy='481' rx='50.1' ry='14.9' transform='rotate(1.4 785.2 481)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='781.6' cy='477.3' rx='50.1' ry='14.9' transform='rotate(3.1 781.6 477.3)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='769.1' cy='472.9' rx='25.1' ry='5.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='723.6' cy='458.7' rx='58.6' ry='14.6' transform='rotate(-0.6 723.6 458.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='719.9' cy='455' rx='58.6' ry='14.6' transform='rotate(-0.5 719.9 455)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='705.3' cy='450.6' rx='29.3' ry='5.1' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='729.9' cy='449.2' rx='13.7' ry='7.3' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='729.9' cy='446.4' rx='7.3' ry='5' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='729.9' cy='447.3' r='2.6' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='731.5' cy='450.9' rx='46.3' ry='12.6' transform='rotate(3.5 731.5 450.9)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='727.9' cy='447.3' rx='46.3' ry='12.6' transform='rotate(-0.8 727.9 447.3)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='716.3' cy='443.5' rx='23.2' ry='4.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='713.9' cy='442.2' rx='14.6' ry='7.8' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='713.9' cy='439.3' rx='7.8' ry='5.3' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='713.9' cy='440.3' r='2.7' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='647.4' cy='475.1' rx='39.6' ry='10.8' transform='rotate(2.3 647.4 475.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='643.8' cy='471.4' rx='39.6' ry='10.8' transform='rotate(1.2 643.8 471.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='633.9' cy='468.2' rx='19.8' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='641.1' cy='467.1' rx='16.4' ry='8.8' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='641.1' cy='463.8' rx='8.8' ry='6' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='641.1' cy='464.9' r='3.1' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='711' cy='487.8' rx='56.2' ry='13.8' transform='rotate(0.5 711 487.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='707.3' cy='484.1' rx='56.2' ry='13.8' transform='rotate(-1 707.3 484.1)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='693.3' cy='480' rx='28.1' ry='4.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='679.7' cy='472.7' rx='56' ry='14.8' transform='rotate(-2.9 679.7 472.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='676.1' cy='469' rx='56' ry='14.8' transform='rotate(-1.2 676.1 469)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='662.1' cy='464.6' rx='28' ry='5.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='594.8' cy='461.3' rx='47.8' ry='13.3' transform='rotate(1.1 594.8 461.3)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='591.1' cy='457.7' rx='47.8' ry='13.3' transform='rotate(-0.5 591.1 457.7)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='579.2' cy='453.7' rx='23.9' ry='4.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='574.4' cy='452.3' rx='12' ry='6.4' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='574.4' cy='449.9' rx='6.4' ry='4.4' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='574.4' cy='450.7' r='2.2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='763.1' cy='392.7' rx='36.1' ry='9.4' transform='rotate(0.5 763.1 392.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='760.4' cy='390' rx='36.1' ry='9.4' transform='rotate(-2.9 760.4 390)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='751.4' cy='387.2' rx='18' ry='3.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='768.2' cy='386.2' rx='11.5' ry='6.2' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='768.2' cy='383.9' rx='6.2' ry='4.2' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='768.2' cy='384.7' r='2.2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='773.5' cy='399.8' rx='26' ry='6.8' transform='rotate(3.5 773.5 399.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='770.8' cy='397.1' rx='26' ry='6.8' transform='rotate(-2.6 770.8 397.1)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='764.3' cy='395.1' rx='13' ry='2.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='807.8' cy='389.2' rx='24.3' ry='6.4' transform='rotate(3.2 807.8 389.2)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='805.1' cy='386.5' rx='24.3' ry='6.4' transform='rotate(3.9 805.1 386.5)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='799' cy='384.6' rx='12.2' ry='2.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='801' cy='383.9' rx='10.7' ry='5.7' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='801' cy='381.8' rx='5.7' ry='3.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='801' cy='382.5' r='2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='818.1' cy='399.7' rx='24.8' ry='6.2' transform='rotate(-1.1 818.1 399.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='815.5' cy='397' rx='24.8' ry='6.2' transform='rotate(3.4 815.5 397)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='809.3' cy='395.1' rx='12.4' ry='2.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='824.1' cy='394.5' rx='9.6' ry='5.1' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='824.1' cy='392.6' rx='5.1' ry='3.5' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='824.1' cy='393.2' r='1.8' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='788.9' cy='401.1' rx='25.4' ry='7.4' transform='rotate(0 788.9 401.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='786.2' cy='398.4' rx='25.4' ry='7.4' transform='rotate(1.9 786.2 398.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='779.9' cy='396.2' rx='12.7' ry='2.6' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1163.6' cy='406.3' rx='49.5' ry='14.2' transform='rotate(-1.6 1163.6 406.3)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1160.9' cy='403.6' rx='49.5' ry='14.2' transform='rotate(-2.4 1160.9 403.6)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1148.5' cy='399.3' rx='24.8' ry='5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1151.8' cy='397.9' rx='13.6' ry='7.2' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='1151.8' cy='395.2' rx='7.2' ry='5' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1151.8' cy='396.1' r='2.5' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1076.4' cy='390.6' rx='35.2' ry='10.8' transform='rotate(-2.2 1076.4 390.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1073.7' cy='387.9' rx='35.2' ry='10.8' transform='rotate(0.9 1073.7 387.9)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1064.9' cy='384.7' rx='17.6' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1073.3' cy='383.6' rx='7.9' ry='4.2' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='1073.3' cy='382' rx='4.2' ry='2.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1073.3' cy='382.5' r='1.5' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1105.7' cy='392.4' rx='29.2' ry='7.2' transform='rotate(-1.3 1105.7 392.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1103' cy='389.7' rx='29.2' ry='7.2' transform='rotate(-0.3 1103 389.7)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='1095.7' cy='387.5' rx='14.6' ry='2.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1100.3' cy='384.7' rx='39.3' ry='10.5' transform='rotate(2.8 1100.3 384.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1097.6' cy='382' rx='39.3' ry='10.5' transform='rotate(3.6 1097.6 382)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1087.7' cy='378.8' rx='19.7' ry='3.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1204.1' cy='385.5' rx='38.8' ry='10.8' transform='rotate(2.3 1204.1 385.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1201.3' cy='382.8' rx='38.8' ry='10.8' transform='rotate(-3.1 1201.3 382.8)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1191.7' cy='379.5' rx='19.4' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1080.7' cy='403.5' rx='25.3' ry='6.7' transform='rotate(-0.2 1080.7 403.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1078' cy='400.8' rx='25.3' ry='6.7' transform='rotate(-1.4 1078 400.8)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='1071.6' cy='398.7' rx='12.7' ry='2.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1082' cy='394.4' rx='28.9' ry='8' transform='rotate(0.1 1082 394.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1079.3' cy='391.7' rx='28.9' ry='8' transform='rotate(-0.2 1079.3 391.7)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1072.1' cy='389.3' rx='14.5' ry='2.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1350.2' cy='317.8' rx='24.5' ry='7.1' transform='rotate(3.2 1350.2 317.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1348.3' cy='315.9' rx='24.5' ry='7.1' transform='rotate(1.2 1348.3 315.9)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1342.2' cy='313.8' rx='12.2' ry='2.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1349' cy='313.1' rx='7.8' ry='4.1' fill='%23fff7f0' opacity='0.95'/%3E%3Cellipse cx='1349' cy='311.5' rx='4.1' ry='2.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1349' cy='312.1' r='1.5' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1302.5' cy='324.7' rx='16.1' ry='4.9' transform='rotate(-2.3 1302.5 324.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1300.7' cy='322.9' rx='16.1' ry='4.9' transform='rotate(-3.5 1300.7 322.9)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1296.6' cy='321.4' rx='8.1' ry='1.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1317.5' cy='321.7' rx='26.3' ry='6.6' transform='rotate(-0.4 1317.5 321.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1315.7' cy='319.9' rx='26.3' ry='6.6' transform='rotate(-3.3 1315.7 319.9)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1309.1' cy='317.9' rx='13.1' ry='2.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1317.7' cy='317.2' rx='4.9' ry='2.6' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='1317.7' cy='316.2' rx='2.6' ry='1.8' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1317.7' cy='316.6' r='0.9' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1289.6' cy='326.1' rx='33.8' ry='9.7' transform='rotate(1.4 1289.6 326.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1287.8' cy='324.3' rx='33.8' ry='9.7' transform='rotate(2.2 1287.8 324.3)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1279.4' cy='321.4' rx='16.9' ry='3.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1279.5' cy='320.4' rx='4.9' ry='2.6' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='1279.5' cy='319.4' rx='2.6' ry='1.8' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1279.5' cy='319.8' r='0.9' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1239.9' cy='320.2' rx='31' ry='7.9' transform='rotate(-0.5 1239.9 320.2)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1238' cy='318.4' rx='31' ry='7.9' transform='rotate(0.7 1238 318.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1230.3' cy='316' rx='15.5' ry='2.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1357.7' cy='319.4' rx='32.2' ry='8.6' transform='rotate(1.3 1357.7 319.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1355.9' cy='317.6' rx='32.2' ry='8.6' transform='rotate(-0.9 1355.9 317.6)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1347.9' cy='315' rx='16.1' ry='3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='705.9' cy='504.5' rx='36' ry='10.7' transform='rotate(2.7 705.9 504.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='701.8' cy='500.4' rx='36' ry='10.7' transform='rotate(-3.3 701.8 500.4)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='692.8' cy='497.2' rx='18' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='555' cy='483.6' rx='44.7' ry='13.7' transform='rotate(0.9 555 483.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='550.9' cy='479.6' rx='44.7' ry='13.7' transform='rotate(-1.1 550.9 479.6)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='539.7' cy='475.4' rx='22.3' ry='4.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='535.6' cy='474.1' rx='16.5' ry='8.8' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='535.6' cy='470.8' rx='8.8' ry='6.1' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='535.6' cy='471.9' r='3.1' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='706.9' cy='514' rx='74.8' ry='21.3' transform='rotate(-1.3 706.9 514)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='702.9' cy='510' rx='74.8' ry='21.3' transform='rotate(-3 702.9 510)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='684.2' cy='503.6' rx='37.4' ry='7.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='516.1' cy='511.4' rx='42.1' ry='11.2' transform='rotate(4 516.1 511.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='512.1' cy='507.4' rx='42.1' ry='11.2' transform='rotate(0 512.1 507.4)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='501.6' cy='504' rx='21' ry='3.9' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='669.8' cy='489.5' rx='63.2' ry='18.6' transform='rotate(3.9 669.8 489.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='665.7' cy='485.4' rx='63.2' ry='18.6' transform='rotate(-0.8 665.7 485.4)' fill='%238dbb6c' opacity='0.85'/%3E%3Cellipse cx='649.9' cy='479.8' rx='31.6' ry='6.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='669.9' cy='509.5' rx='35.2' ry='9.3' transform='rotate(1.9 669.9 509.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='665.9' cy='505.5' rx='35.2' ry='9.3' transform='rotate(-2 665.9 505.5)' fill='%238dbb6c' opacity='0.85'/%3E%3Cellipse cx='657.1' cy='502.7' rx='17.6' ry='3.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='670.1' cy='480.5' rx='39.5' ry='11' transform='rotate(-0.1 670.1 480.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='666.1' cy='476.5' rx='39.5' ry='11' transform='rotate(-3.2 666.1 476.5)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='656.2' cy='473.2' rx='19.8' ry='3.9' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='653.8' cy='472.1' rx='18.8' ry='10' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='653.8' cy='468.3' rx='10' ry='6.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='653.8' cy='469.6' r='3.5' fill='%23f2c94c' opacity='0.95'/%3E%3C/g%3E%3Cg%3E%3Cellipse cx='1215.1' cy='312' rx='13.4' ry='1.9' fill='%23fffbe8' opacity='0.85'/%3E%3Cellipse cx='1247.9' cy='473.8' rx='19.6' ry='1.6' fill='%23fffbe8' opacity='0.75'/%3E%3Cellipse cx='1265' cy='323.1' rx='11.8' ry='2.9' fill='%23fffbe8' opacity='0.88'/%3E%3Cellipse cx='1253.4' cy='318.6' rx='20.8' ry='1.8' fill='%23fffbe8' opacity='0.82'/%3E%3Cellipse cx='1387.1' cy='320.6' rx='17.1' ry='2.1' fill='%23fffbe8' opacity='0.8'/%3E%3Cellipse cx='887.3' cy='353' rx='18.1' ry='2.2' fill='%23fffbe8' opacity='0.74'/%3E%3Cellipse cx='1084.2' cy='516.6' rx='17.8' ry='2.8' fill='%23fffbe8' opacity='0.89'/%3E%3Cellipse cx='1347.2' cy='405.4' rx='8.4' ry='2.9' fill='%23fffbe8' opacity='0.8'/%3E%3Cellipse cx='1403' cy='502.3' rx='14.8' ry='2' fill='%23fffbe8' opacity='0.72'/%3E%3Cellipse cx='1452.9' cy='485.8' rx='6.4' ry='1.7' fill='%23fffbe8' opacity='0.74'/%3E%3Cellipse cx='1135' cy='274.7' rx='14.1' ry='2.5' fill='%23fffbe8' opacity='0.67'/%3E%3Cellipse cx='998.9' cy='446.9' rx='16.3' ry='2.4' fill='%23fffbe8' opacity='0.52'/%3E%3Cellipse cx='875' cy='466.2' rx='16.6' ry='2' fill='%23fffbe8' opacity='0.74'/%3E%3Cellipse cx='1238.3' cy='462.3' rx='9.3' ry='2.1' fill='%23fffbe8' opacity='0.59'/%3E%3Cellipse cx='1127.3' cy='413.9' rx='13' ry='1.8' fill='%23fffbe8' opacity='0.87'/%3E%3Cellipse cx='851.3' cy='497.3' rx='21.4' ry='1.4' fill='%23fffbe8' opacity='0.52'/%3E%3Cellipse cx='845.4' cy='305.4' rx='15.4' ry='1.8' fill='%23fffbe8' opacity='0.69'/%3E%3Cellipse cx='1445.8' cy='300.8' rx='10.9' ry='2.9' fill='%23fffbe8' opacity='0.63'/%3E%3Cellipse cx='1426' cy='329.8' rx='7.4' ry='1.9' fill='%23fffbe8' opacity='0.82'/%3E%3Cellipse cx='1490.6' cy='427.5' rx='20.9' ry='1.8' fill='%23fffbe8' opacity='0.64'/%3E%3Cellipse cx='1505.3' cy='287.7' rx='19.4' ry='2.5' fill='%23fffbe8' opacity='0.85'/%3E%3Cellipse cx='1310.6' cy='447.1' rx='19.4' ry='2.7' fill='%23fffbe8' opacity='0.71'/%3E%3C/g%3E%3C/svg%3E");--kit-paint-sunrise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 520' preserveAspectRatio='xMidYMid slice'%3E%3Cdefs%3E%3ClinearGradient id='bs-sky' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%231b2e41'/%3E%3Cstop offset='0.32' stop-color='%232c465a'/%3E%3Cstop offset='0.5' stop-color='%2336576a'/%3E%3Cstop offset='0.56' stop-color='%2322394c'/%3E%3Cstop offset='1' stop-color='%230f1b26'/%3E%3C/linearGradient%3E%3CradialGradient id='bs-glow' gradientUnits='userSpaceOnUse' cx='1376' cy='156' r='286'%3E%3Cstop offset='0' stop-color='%23f08a4b' stop-opacity='0.55'/%3E%3Cstop offset='0.35' stop-color='%23e0764a' stop-opacity='0.18'/%3E%3Cstop offset='1' stop-color='%237d6f9e' stop-opacity='0'/%3E%3C/radialGradient%3E%3Cfilter id='bs-paint' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.008 0.05' numOctaves='2' seed='5' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='14' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bs-water' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.005 0.09' numOctaves='2' seed='11' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='9' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bs-soft' x='-5%25' y='-5%25' width='110%25' height='110%25'%3E%3CfeGaussianBlur stdDeviation='1.1'/%3E%3C/filter%3E%3C/defs%3E%3Cg%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bs-sky)'/%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bs-glow)'/%3E%3C/g%3E%3Cg filter='url(%23bs-paint)'%3E%3Cellipse cx='1295.8' cy='171.6' rx='58' ry='3.8' transform='rotate(0.6 1295.8 171.6)' fill='%234a6b7a' opacity='0.12'/%3E%3Cellipse cx='620.1' cy='236.4' rx='185.8' ry='11.5' transform='rotate(1.9 620.1 236.4)' fill='%235b6f86' opacity='0.2'/%3E%3Cellipse cx='634.4' cy='205.7' rx='139.4' ry='4' transform='rotate(0.2 634.4 205.7)' fill='%235b6f86' opacity='0.21'/%3E%3Cellipse cx='1194.8' cy='242.6' rx='62.5' ry='11.3' transform='rotate(1 1194.8 242.6)' fill='%235b6f86' opacity='0.15'/%3E%3Cellipse cx='961.2' cy='62.2' rx='51.8' ry='9.1' transform='rotate(1.7 961.2 62.2)' fill='%238c8fb0' opacity='0.14'/%3E%3Cellipse cx='1569.8' cy='49.8' rx='172.3' ry='11' transform='rotate(1.8 1569.8 49.8)' fill='%235b6f86' opacity='0.16'/%3E%3Cellipse cx='1534.5' cy='111.2' rx='56.1' ry='7.6' transform='rotate(0.5 1534.5 111.2)' fill='%233f5a70' opacity='0.21'/%3E%3Cellipse cx='760.2' cy='194.1' rx='87.7' ry='11.1' transform='rotate(-0.7 760.2 194.1)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='751.2' cy='95.2' rx='120.4' ry='7.5' transform='rotate(-1.7 751.2 95.2)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='1301.4' cy='161.9' rx='204.1' ry='4.7' transform='rotate(-1.7 1301.4 161.9)' fill='%237d6f9e' opacity='0.14'/%3E%3Cellipse cx='636.6' cy='58.1' rx='74' ry='6' transform='rotate(-1.1 636.6 58.1)' fill='%233f5a70' opacity='0.22'/%3E%3Cellipse cx='334.1' cy='76.1' rx='163.5' ry='9.4' transform='rotate(2 334.1 76.1)' fill='%238c8fb0' opacity='0.17'/%3E%3Cellipse cx='635.2' cy='260' rx='80.6' ry='4.5' transform='rotate(-0.1 635.2 260)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='411.6' cy='137.4' rx='68.1' ry='8.8' transform='rotate(-0.5 411.6 137.4)' fill='%234a6b7a' opacity='0.08'/%3E%3Cellipse cx='700.8' cy='19.4' rx='120.9' ry='6.2' transform='rotate(-1.4 700.8 19.4)' fill='%233f5a70' opacity='0.18'/%3E%3Cellipse cx='850' cy='99.1' rx='161.6' ry='6.4' transform='rotate(1.6 850 99.1)' fill='%238c8fb0' opacity='0.18'/%3E%3Cellipse cx='1543.3' cy='262.8' rx='121.8' ry='9.2' transform='rotate(-1.8 1543.3 262.8)' fill='%234a6b7a' opacity='0.23'/%3E%3Cellipse cx='201.5' cy='6' rx='60.2' ry='7.4' transform='rotate(-1.9 201.5 6)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='1501.9' cy='157.7' rx='128.7' ry='8.2' transform='rotate(-0.7 1501.9 157.7)' fill='%238c8fb0' opacity='0.22'/%3E%3Cellipse cx='1573' cy='215.1' rx='115.5' ry='8' transform='rotate(-1.7 1573 215.1)' fill='%233f5a70' opacity='0.21'/%3E%3Cellipse cx='1543.3' cy='117.7' rx='201.5' ry='4' transform='rotate(-1 1543.3 117.7)' fill='%233f5a70' opacity='0.2'/%3E%3Cellipse cx='1513.8' cy='136.2' rx='190.2' ry='6.7' transform='rotate(-1.6 1513.8 136.2)' fill='%233f5a70' opacity='0.16'/%3E%3Cellipse cx='1314.6' cy='166.9' rx='76.5' ry='4.4' transform='rotate(0 1314.6 166.9)' fill='%235b6f86' opacity='0.22'/%3E%3Cellipse cx='1321.6' cy='108.6' rx='77.4' ry='8.4' transform='rotate(1 1321.6 108.6)' fill='%235b6f86' opacity='0.2'/%3E%3Cellipse cx='1270.5' cy='191.1' rx='186.8' ry='10.4' transform='rotate(-1.4 1270.5 191.1)' fill='%233f5a70' opacity='0.18'/%3E%3Cellipse cx='1192.4' cy='52.8' rx='59.4' ry='6.3' transform='rotate(1.4 1192.4 52.8)' fill='%233f5a70' opacity='0.16'/%3E%3Cellipse cx='216.8' cy='214.6' rx='190.8' ry='10' transform='rotate(-1.6 216.8 214.6)' fill='%233f5a70' opacity='0.15'/%3E%3Cellipse cx='1225' cy='263.7' rx='204.7' ry='10.1' transform='rotate(0.3 1225 263.7)' fill='%235b6f86' opacity='0.17'/%3E%3Cellipse cx='977.6' cy='83.3' rx='59.9' ry='7.8' transform='rotate(0.6 977.6 83.3)' fill='%238c8fb0' opacity='0.07'/%3E%3Cellipse cx='20.2' cy='165.7' rx='96.5' ry='6' transform='rotate(1.5 20.2 165.7)' fill='%235b6f86' opacity='0.23'/%3E%3Cellipse cx='285.8' cy='79.9' rx='127' ry='6.9' transform='rotate(1.1 285.8 79.9)' fill='%233f5a70' opacity='0.2'/%3E%3Cellipse cx='650.3' cy='135.3' rx='157.8' ry='9.5' transform='rotate(0.9 650.3 135.3)' fill='%237d6f9e' opacity='0.21'/%3E%3Cellipse cx='1256.5' cy='149.2' rx='193.4' ry='5.6' transform='rotate(0.2 1256.5 149.2)' fill='%238c8fb0' opacity='0.07'/%3E%3Cellipse cx='1317' cy='138.3' rx='203.6' ry='9.2' transform='rotate(0.8 1317 138.3)' fill='%237d6f9e' opacity='0.17'/%3E%3Cellipse cx='849.8' cy='58.4' rx='113.4' ry='6.3' transform='rotate(0 849.8 58.4)' fill='%238c8fb0' opacity='0.09'/%3E%3Cellipse cx='159' cy='182.8' rx='208.7' ry='10.1' transform='rotate(0.1 159 182.8)' fill='%237d6f9e' opacity='0.09'/%3E%3Cellipse cx='782.9' cy='256.2' rx='176.7' ry='3.9' transform='rotate(1.3 782.9 256.2)' fill='%238c8fb0' opacity='0.19'/%3E%3Cellipse cx='893.7' cy='135' rx='186.6' ry='3.6' transform='rotate(1 893.7 135)' fill='%238c8fb0' opacity='0.23'/%3E%3Cellipse cx='1090.8' cy='152.6' rx='77.3' ry='7.2' transform='rotate(-1.3 1090.8 152.6)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='113.5' cy='76.7' rx='74.4' ry='4.1' transform='rotate(1.2 113.5 76.7)' fill='%237d6f9e' opacity='0.18'/%3E%3Cellipse cx='1403.6' cy='223.2' rx='129.3' ry='10.5' transform='rotate(-1.5 1403.6 223.2)' fill='%235b6f86' opacity='0.12'/%3E%3Cellipse cx='611.4' cy='200.1' rx='208.5' ry='10.8' transform='rotate(0.5 611.4 200.1)' fill='%238c8fb0' opacity='0.14'/%3E%3Cellipse cx='78.6' cy='214.8' rx='75.4' ry='9.6' transform='rotate(0.4 78.6 214.8)' fill='%234a6b7a' opacity='0.08'/%3E%3Cellipse cx='67.7' cy='54.3' rx='132.8' ry='5.2' transform='rotate(-0.7 67.7 54.3)' fill='%234a6b7a' opacity='0.23'/%3E%3Cellipse cx='197' cy='78.2' rx='52.6' ry='11.2' transform='rotate(-1.4 197 78.2)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='37.8' cy='132.6' rx='173.6' ry='10.8' transform='rotate(1.5 37.8 132.6)' fill='%237d6f9e' opacity='0.14'/%3E%3Cellipse cx='1165.9' cy='258.2' rx='60.4' ry='9.8' transform='rotate(-1.3 1165.9 258.2)' fill='%235b6f86' opacity='0.15'/%3E%3Cellipse cx='139' cy='154.1' rx='64.1' ry='5.6' transform='rotate(-1.2 139 154.1)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='943.6' cy='236.3' rx='116.1' ry='6' transform='rotate(-1.3 943.6 236.3)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1485.4' cy='151.4' rx='190.9' ry='3.7' transform='rotate(2 1485.4 151.4)' fill='%237d6f9e' opacity='0.16'/%3E%3Cellipse cx='840.5' cy='169.7' rx='132.6' ry='7.2' transform='rotate(0.5 840.5 169.7)' fill='%235b6f86' opacity='0.11'/%3E%3Cellipse cx='447.4' cy='224.2' rx='106.4' ry='9.8' transform='rotate(-1.4 447.4 224.2)' fill='%237d6f9e' opacity='0.1'/%3E%3Cellipse cx='449.8' cy='113.1' rx='74.5' ry='7.3' transform='rotate(-1.9 449.8 113.1)' fill='%238c8fb0' opacity='0.12'/%3E%3Cellipse cx='354.6' cy='127.7' rx='125.4' ry='9.1' transform='rotate(1 354.6 127.7)' fill='%235b6f86' opacity='0.16'/%3E%3Cellipse cx='630.9' cy='262.2' rx='78.6' ry='3.9' transform='rotate(-2 630.9 262.2)' fill='%235b6f86' opacity='0.16'/%3E%3Cellipse cx='1041.7' cy='150.6' rx='94.6' ry='5.5' transform='rotate(-0.1 1041.7 150.6)' fill='%238c8fb0' opacity='0.1'/%3E%3Cellipse cx='153.3' cy='256.3' rx='93.3' ry='7.6' transform='rotate(-2 153.3 256.3)' fill='%233f5a70' opacity='0.15'/%3E%3Cellipse cx='871' cy='28.2' rx='208.5' ry='5.9' transform='rotate(0.3 871 28.2)' fill='%233f5a70' opacity='0.15'/%3E%3Cellipse cx='965.5' cy='218.6' rx='94' ry='7.6' transform='rotate(-1.7 965.5 218.6)' fill='%238c8fb0' opacity='0.23'/%3E%3Cellipse cx='850.5' cy='221.4' rx='127.2' ry='6.9' transform='rotate(0.8 850.5 221.4)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1368.1' cy='258.7' rx='67.6' ry='7.1' transform='rotate(1.6 1368.1 258.7)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='1468.1' cy='21.5' rx='199.7' ry='9.1' transform='rotate(-0.4 1468.1 21.5)' fill='%237d6f9e' opacity='0.18'/%3E%3Cellipse cx='831' cy='241.7' rx='108.2' ry='8.3' transform='rotate(0.1 831 241.7)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='408.2' cy='179.6' rx='139.5' ry='6.7' transform='rotate(0.2 408.2 179.6)' fill='%235b6f86' opacity='0.18'/%3E%3Cellipse cx='1264' cy='153.3' rx='109.2' ry='7' transform='rotate(0.3 1264 153.3)' fill='%238c8fb0' opacity='0.16'/%3E%3Cellipse cx='1467.5' cy='173.3' rx='168.6' ry='5.5' transform='rotate(-0.3 1467.5 173.3)' fill='%238c8fb0' opacity='0.11'/%3E%3Cellipse cx='228.7' cy='195.1' rx='174.5' ry='4.1' transform='rotate(-1.3 228.7 195.1)' fill='%238c8fb0' opacity='0.22'/%3E%3Cellipse cx='1170.4' cy='182.3' rx='154.3' ry='8.8' transform='rotate(-0.7 1170.4 182.3)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1583.7' cy='30.8' rx='134.2' ry='4.9' transform='rotate(-1.6 1583.7 30.8)' fill='%237d6f9e' opacity='0.2'/%3E%3Cellipse cx='549.2' cy='86.5' rx='198.1' ry='5' transform='rotate(1.1 549.2 86.5)' fill='%234a6b7a' opacity='0.13'/%3E%3Cellipse cx='1214.8' cy='69.7' rx='198.5' ry='10.2' transform='rotate(0.4 1214.8 69.7)' fill='%237d6f9e' opacity='0.12'/%3E%3Cellipse cx='1338.9' cy='249.1' rx='197.9' ry='5.5' transform='rotate(0.1 1338.9 249.1)' fill='%234a6b7a' opacity='0.2'/%3E%3Cellipse cx='206.8' cy='221.7' rx='192.8' ry='10.5' transform='rotate(1.1 206.8 221.7)' fill='%234a6b7a' opacity='0.21'/%3E%3Cellipse cx='562.3' cy='220' rx='69.1' ry='11' transform='rotate(0 562.3 220)' fill='%237d6f9e' opacity='0.16'/%3E%3Cellipse cx='776.1' cy='242' rx='140.1' ry='10.4' transform='rotate(-0.5 776.1 242)' fill='%233f5a70' opacity='0.13'/%3E%3Cellipse cx='208.6' cy='192.1' rx='195.1' ry='4.5' transform='rotate(-0.7 208.6 192.1)' fill='%237d6f9e' opacity='0.07'/%3E%3Cellipse cx='1526.2' cy='4.5' rx='209.7' ry='4.5' transform='rotate(1.3 1526.2 4.5)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1167.9' cy='25.5' rx='125.2' ry='6.8' transform='rotate(-0.2 1167.9 25.5)' fill='%233f5a70' opacity='0.08'/%3E%3Cellipse cx='1066.6' cy='134' rx='89.6' ry='3.5' transform='rotate(-0.4 1066.6 134)' fill='%233f5a70' opacity='0.09'/%3E%3Cellipse cx='951.5' cy='64.6' rx='189.3' ry='5.5' transform='rotate(-1.9 951.5 64.6)' fill='%234a6b7a' opacity='0.08'/%3E%3Cellipse cx='841.7' cy='112.4' rx='198.5' ry='5.6' transform='rotate(-0.1 841.7 112.4)' fill='%233f5a70' opacity='0.11'/%3E%3Cellipse cx='1070.2' cy='52.3' rx='150.8' ry='9' transform='rotate(1.7 1070.2 52.3)' fill='%233f5a70' opacity='0.12'/%3E%3Cellipse cx='296.9' cy='203.4' rx='169.7' ry='11.1' transform='rotate(0.9 296.9 203.4)' fill='%234a6b7a' opacity='0.22'/%3E%3Cellipse cx='402.7' cy='232.5' rx='97' ry='11.1' transform='rotate(-1.9 402.7 232.5)' fill='%235b6f86' opacity='0.2'/%3E%3Cellipse cx='1032.2' cy='208.7' rx='114.1' ry='5.9' transform='rotate(-1.7 1032.2 208.7)' fill='%234a6b7a' opacity='0.2'/%3E%3Cellipse cx='404.9' cy='257.8' rx='144.4' ry='6.1' transform='rotate(-1.6 404.9 257.8)' fill='%234a6b7a' opacity='0.16'/%3E%3Cellipse cx='1568.2' cy='256.7' rx='139.3' ry='6.8' transform='rotate(0 1568.2 256.7)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='1436.4' cy='228.2' rx='123.6' ry='3.6' transform='rotate(1.7 1436.4 228.2)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='225' cy='161.6' rx='174.6' ry='7.6' transform='rotate(-1.3 225 161.6)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='1217.9' cy='102.2' rx='154.6' ry='9.8' transform='rotate(-0.1 1217.9 102.2)' fill='%235b6f86' opacity='0.13'/%3E%3Cellipse cx='365.5' cy='27.2' rx='172.6' ry='6' transform='rotate(0.7 365.5 27.2)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='168.1' cy='140.6' rx='154.9' ry='8.8' transform='rotate(-0.9 168.1 140.6)' fill='%238c8fb0' opacity='0.1'/%3E%3Cellipse cx='1282' cy='132.4' rx='200.3' ry='5.4' transform='rotate(-1.9 1282 132.4)' fill='%237d6f9e' opacity='0.17'/%3E%3Cellipse cx='66.5' cy='129.1' rx='102' ry='9.8' transform='rotate(-1.9 66.5 129.1)' fill='%237d6f9e' opacity='0.08'/%3E%3Cellipse cx='1487.8' cy='14.9' rx='128.9' ry='4.8' transform='rotate(1.5 1487.8 14.9)' fill='%237d6f9e' opacity='0.1'/%3E%3Cellipse cx='1292.8' cy='244' rx='88.5' ry='5.4' transform='rotate(-1.6 1292.8 244)' fill='%234a6b7a' opacity='0.14'/%3E%3Cellipse cx='385.3' cy='143.6' rx='58.2' ry='10.6' transform='rotate(-0.8 385.3 143.6)' fill='%238c8fb0' opacity='0.19'/%3E%3Cellipse cx='955.7' cy='204' rx='166.4' ry='7.9' transform='rotate(0.3 955.7 204)' fill='%238c8fb0' opacity='0.19'/%3E%3Cellipse cx='128.8' cy='106.1' rx='85' ry='10.9' transform='rotate(-0.6 128.8 106.1)' fill='%234a6b7a' opacity='0.11'/%3E%3Cellipse cx='1522.1' cy='61.3' rx='154.1' ry='3.6' transform='rotate(-1.4 1522.1 61.3)' fill='%237d6f9e' opacity='0.13'/%3E%3Cellipse cx='1327.4' cy='228.1' rx='53.4' ry='10.4' transform='rotate(1.3 1327.4 228.1)' fill='%233f5a70' opacity='0.19'/%3E%3Cellipse cx='1076.3' cy='201.9' rx='132' ry='5.5' transform='rotate(1.8 1076.3 201.9)' fill='%237d6f9e' opacity='0.22'/%3E%3Cellipse cx='1554.9' cy='237.5' rx='136.7' ry='10.5' transform='rotate(-0.6 1554.9 237.5)' fill='%237d6f9e' opacity='0.07'/%3E%3Cellipse cx='684.5' cy='200.8' rx='147.7' ry='9.5' transform='rotate(-1.3 684.5 200.8)' fill='%237d6f9e' opacity='0.13'/%3E%3Cellipse cx='575' cy='259.8' rx='98.6' ry='10.1' transform='rotate(-0.6 575 259.8)' fill='%234a6b7a' opacity='0.19'/%3E%3Cellipse cx='626' cy='168.3' rx='155.5' ry='4.9' transform='rotate(0.8 626 168.3)' fill='%237d6f9e' opacity='0.23'/%3E%3Cellipse cx='328.9' cy='131.6' rx='205' ry='9.4' transform='rotate(1.9 328.9 131.6)' fill='%238c8fb0' opacity='0.11'/%3E%3Cellipse cx='571.8' cy='124.2' rx='89.4' ry='7.8' transform='rotate(0.7 571.8 124.2)' fill='%237d6f9e' opacity='0.22'/%3E%3Cellipse cx='937.4' cy='203.5' rx='91.5' ry='4.4' transform='rotate(1 937.4 203.5)' fill='%237d6f9e' opacity='0.12'/%3E%3Cellipse cx='858' cy='102.3' rx='152.9' ry='10' transform='rotate(-0.9 858 102.3)' fill='%234a6b7a' opacity='0.11'/%3E%3Cellipse cx='771.4' cy='145.2' rx='88.4' ry='5.1' transform='rotate(0 771.4 145.2)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='1034.9' cy='237.3' rx='133.2' ry='6.1' transform='rotate(0.2 1034.9 237.3)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='1461.6' cy='0.5' rx='62.3' ry='10.8' transform='rotate(-0.4 1461.6 0.5)' fill='%234a6b7a' opacity='0.16'/%3E%3Cellipse cx='823.1' cy='225.3' rx='85.6' ry='6' transform='rotate(-1.6 823.1 225.3)' fill='%238c8fb0' opacity='0.13'/%3E%3Cellipse cx='865.1' cy='39.8' rx='117.5' ry='9.8' transform='rotate(-1.5 865.1 39.8)' fill='%237d6f9e' opacity='0.14'/%3E%3Cellipse cx='1287.4' cy='12.8' rx='68.9' ry='10' transform='rotate(-0.2 1287.4 12.8)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='340.7' cy='178.8' rx='127.9' ry='10.1' transform='rotate(1.1 340.7 178.8)' fill='%234a6b7a' opacity='0.22'/%3E%3Cellipse cx='704.8' cy='44.8' rx='145.7' ry='4.9' transform='rotate(0.3 704.8 44.8)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='325.3' cy='176.5' rx='106.6' ry='5.6' transform='rotate(-0.2 325.3 176.5)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='113.1' cy='81.6' rx='105.9' ry='7.6' transform='rotate(0.8 113.1 81.6)' fill='%235b6f86' opacity='0.21'/%3E%3Cellipse cx='1555.8' cy='196.6' rx='204.4' ry='10.7' transform='rotate(-1.1 1555.8 196.6)' fill='%235b6f86' opacity='0.15'/%3E%3Cellipse cx='185.7' cy='195.6' rx='74.2' ry='11.3' transform='rotate(-1.2 185.7 195.6)' fill='%233f5a70' opacity='0.22'/%3E%3Cellipse cx='1588.3' cy='217.4' rx='169.8' ry='9.6' transform='rotate(-1.2 1588.3 217.4)' fill='%234a6b7a' opacity='0.22'/%3E%3Cellipse cx='437.1' cy='166.8' rx='134' ry='6.6' transform='rotate(0.4 437.1 166.8)' fill='%237d6f9e' opacity='0.15'/%3E%3Cellipse cx='1359.1' cy='153.9' rx='116.1' ry='3.8' transform='rotate(1.7 1359.1 153.9)' fill='%235b6f86' opacity='0.23'/%3E%3Cellipse cx='1517.7' cy='145.7' rx='58.4' ry='3.8' transform='rotate(-1.6 1517.7 145.7)' fill='%233f5a70' opacity='0.23'/%3E%3Cellipse cx='303.4' cy='171.5' rx='156' ry='7' transform='rotate(0.7 303.4 171.5)' fill='%237d6f9e' opacity='0.13'/%3E%3Cellipse cx='1434.7' cy='79.5' rx='80.9' ry='8.5' transform='rotate(1.3 1434.7 79.5)' fill='%238c8fb0' opacity='0.11'/%3E%3Cellipse cx='41.2' cy='244.8' rx='190.8' ry='5.5' transform='rotate(0.3 41.2 244.8)' fill='%234a6b7a' opacity='0.21'/%3E%3Cellipse cx='290.2' cy='257.9' rx='74.1' ry='11.2' transform='rotate(1.1 290.2 257.9)' fill='%234a6b7a' opacity='0.19'/%3E%3Cellipse cx='201.6' cy='238.5' rx='99.2' ry='9.5' transform='rotate(0.7 201.6 238.5)' fill='%234a6b7a' opacity='0.19'/%3E%3Cellipse cx='815.5' cy='206' rx='109.4' ry='11' transform='rotate(-0.4 815.5 206)' fill='%237d6f9e' opacity='0.17'/%3E%3Cellipse cx='1556' cy='210.4' rx='65.4' ry='12' transform='rotate(-0.5 1556 210.4)' fill='%23a0687a' opacity='0.2'/%3E%3Cellipse cx='1539.1' cy='247.2' rx='88.5' ry='11.4' transform='rotate(0 1539.1 247.2)' fill='%23c9775a' opacity='0.1'/%3E%3Cellipse cx='1154.8' cy='247.4' rx='80.7' ry='9.8' transform='rotate(1.2 1154.8 247.4)' fill='%23c9775a' opacity='0.15'/%3E%3Cellipse cx='1567.4' cy='222.5' rx='100.5' ry='13.2' transform='rotate(0.1 1567.4 222.5)' fill='%23a0687a' opacity='0.2'/%3E%3Cellipse cx='1517.5' cy='201.3' rx='139.8' ry='11' transform='rotate(-0.5 1517.5 201.3)' fill='%23e0905e' opacity='0.17'/%3E%3Cellipse cx='1345.1' cy='121.8' rx='132.8' ry='14.9' transform='rotate(-0.4 1345.1 121.8)' fill='%23e0905e' opacity='0.19'/%3E%3Cellipse cx='1690.3' cy='212.4' rx='123.6' ry='13.5' transform='rotate(1.5 1690.3 212.4)' fill='%23a0687a' opacity='0.19'/%3E%3Cellipse cx='1397.9' cy='239' rx='123' ry='11.4' transform='rotate(-2 1397.9 239)' fill='%23e0905e' opacity='0.18'/%3E%3Cellipse cx='1340.2' cy='163.5' rx='94.4' ry='14.8' transform='rotate(0 1340.2 163.5)' fill='%23c9775a' opacity='0.13'/%3E%3Cellipse cx='1576.8' cy='120.2' rx='51.5' ry='8.5' transform='rotate(-1.4 1576.8 120.2)' fill='%23a0687a' opacity='0.19'/%3E%3Cellipse cx='1183.5' cy='218.6' rx='68.8' ry='12.1' transform='rotate(-0.2 1183.5 218.6)' fill='%23a0687a' opacity='0.18'/%3E%3Cellipse cx='1238.3' cy='175.2' rx='111.2' ry='13.3' transform='rotate(1.6 1238.3 175.2)' fill='%23e0905e' opacity='0.14'/%3E%3Cellipse cx='1124.6' cy='249.6' rx='69' ry='12.6' transform='rotate(0 1124.6 249.6)' fill='%23c9775a' opacity='0.18'/%3E%3Cellipse cx='1173.9' cy='129.2' rx='93.6' ry='8.5' transform='rotate(1 1173.9 129.2)' fill='%23c9775a' opacity='0.18'/%3E%3Cellipse cx='1554' cy='147.6' rx='51.3' ry='11.1' transform='rotate(1.6 1554 147.6)' fill='%23e0905e' opacity='0.18'/%3E%3C/g%3E%3Cg filter='url(%23bs-soft)'%3E%3Crect x='910.3' y='110.9' width='2.2' height='149.1' fill='%232b4357' opacity='0.36'/%3E%3Crect x='1245.7' y='169.4' width='1.8' height='90.6' fill='%232b4357' opacity='0.38'/%3E%3Crect x='642.3' y='169.7' width='2' height='90.3' fill='%232b4357' opacity='0.39'/%3E%3Cpath d='M642.3 175.7l78.9 14.2' stroke='%232b4357' stroke-width='1.8' opacity='0.39' fill='none'/%3E%3Crect x='399.2' y='97' width='3.1' height='163' fill='%232b4357' opacity='0.35'/%3E%3Crect x='562.8' y='186.2' width='1.6' height='73.8' fill='%232b4357' opacity='0.36'/%3E%3Crect x='229.3' y='97.7' width='2.1' height='162.3' fill='%232b4357' opacity='0.36'/%3E%3Cpath d='M229.3 103.7l46.6 8.4' stroke='%232b4357' stroke-width='1.9' opacity='0.36' fill='none'/%3E%3Cellipse cx='247.3' cy='83.7' rx='35' ry='11.4' transform='rotate(-14 247.3 83.7)' fill='%235d6f88' opacity='0.16'/%3E%3Crect x='366.9' y='93.8' width='2.7' height='166.2' fill='%232b4357' opacity='0.36'/%3E%3Cpath d='M366.9 99.8l33.5 6' stroke='%232b4357' stroke-width='2.4' opacity='0.36' fill='none'/%3E%3Crect x='1571.7' y='180.1' width='1.5' height='79.9' fill='%232b4357' opacity='0.4'/%3E%3Crect x='898.1' y='203.9' width='3.2' height='56.1' fill='%232b4357' opacity='0.44'/%3E%3Cellipse cx='916.1' cy='189.9' rx='54.2' ry='11.4' transform='rotate(-14 916.1 189.9)' fill='%235d6f88' opacity='0.21'/%3E%3Crect x='380.1' y='139.5' width='2.9' height='120.5' fill='%232b4357' opacity='0.38'/%3E%3Crect x='208.5' y='94.1' width='2.2' height='165.9' fill='%232b4357' opacity='0.27'/%3E%3Cpath d='M208.5 100.1l65.8 11.8' stroke='%232b4357' stroke-width='2' opacity='0.27' fill='none'/%3E%3Cellipse cx='226.5' cy='80.1' rx='39.2' ry='8.7' transform='rotate(-14 226.5 80.1)' fill='%235d6f88' opacity='0.17'/%3E%3Crect x='882.6' y='147.6' width='2.7' height='112.4' fill='%232b4357' opacity='0.22'/%3E%3C/g%3E%3Cg filter='url(%23bs-paint)'%3E%3Cellipse cx='16.9' cy='256.9' rx='141.1' ry='16.9' fill='%231a2a38' opacity='0.64'/%3E%3Cellipse cx='131.2' cy='257.9' rx='228.1' ry='11.4' fill='%231c2e3e' opacity='0.77'/%3E%3Cellipse cx='268.2' cy='254.8' rx='91' ry='12.7' fill='%2322374a' opacity='0.58'/%3E%3Cellipse cx='379.4' cy='257.3' rx='234' ry='9.4' fill='%231a2a38' opacity='0.77'/%3E%3Cellipse cx='457.3' cy='257.1' rx='148.7' ry='14.2' fill='%231c2e3e' opacity='0.66'/%3E%3Cellipse cx='584.8' cy='254.4' rx='102' ry='10.4' fill='%231a2a38' opacity='0.77'/%3E%3Cellipse cx='718.6' cy='259.9' rx='178.6' ry='18.3' fill='%231a2a38' opacity='0.7'/%3E%3Cellipse cx='850.5' cy='259.3' rx='176.2' ry='11.9' fill='%2322374a' opacity='0.66'/%3E%3Cellipse cx='954.8' cy='255' rx='121.9' ry='15.9' fill='%2322374a' opacity='0.68'/%3E%3Cellipse cx='1052.3' cy='256.7' rx='168.2' ry='18.2' fill='%231a2a38' opacity='0.77'/%3E%3Cellipse cx='1193.7' cy='259' rx='125.4' ry='15.2' fill='%231a2a38' opacity='0.7'/%3E%3Cellipse cx='1300.2' cy='255.6' rx='142.1' ry='9.1' fill='%2322374a' opacity='0.74'/%3E%3Cellipse cx='1393.7' cy='255.8' rx='96.1' ry='16.9' fill='%231c2e3e' opacity='0.78'/%3E%3Cellipse cx='1503.1' cy='259.9' rx='220.9' ry='17.7' fill='%231c2e3e' opacity='0.77'/%3E%3C/g%3E%3Cg filter='url(%23bs-water)'%3E%3Cellipse cx='1182.1' cy='327.7' rx='75.8' ry='2.4' transform='rotate(0.8 1182.1 327.7)' fill='%231f3a4e' opacity='0.37'/%3E%3Cellipse cx='1465.8' cy='444.9' rx='120.3' ry='5.7' transform='rotate(-0.2 1465.8 444.9)' fill='%233f7f8c' opacity='0.42'/%3E%3Cellipse cx='1305.8' cy='334' rx='54.2' ry='3' transform='rotate(1.2 1305.8 334)' fill='%231f3a4e' opacity='0.63'/%3E%3Cellipse cx='119.3' cy='372.5' rx='29.1' ry='3.3' transform='rotate(-0.9 119.3 372.5)' fill='%233f7f8c' opacity='0.44'/%3E%3Cellipse cx='29' cy='418.6' rx='47.6' ry='3.2' transform='rotate(-1.3 29 418.6)' fill='%2324405a' opacity='0.51'/%3E%3Cellipse cx='1223' cy='277.1' rx='21.1' ry='2.4' transform='rotate(1 1223 277.1)' fill='%232b4a5e' opacity='0.63'/%3E%3Cellipse cx='1340.9' cy='391.8' rx='67.9' ry='2.9' transform='rotate(-0.8 1340.9 391.8)' fill='%232b4a5e' opacity='0.73'/%3E%3Cellipse cx='1332' cy='510' rx='131.9' ry='4.5' transform='rotate(0.9 1332 510)' fill='%2324405a' opacity='0.58'/%3E%3Cellipse cx='496.9' cy='482.7' rx='56.2' ry='6.7' transform='rotate(0.2 496.9 482.7)' fill='%233f7f8c' opacity='0.73'/%3E%3Cellipse cx='1144.9' cy='274.4' rx='48.3' ry='1.2' transform='rotate(0.7 1144.9 274.4)' fill='%235c7f95' opacity='0.6'/%3E%3Cellipse cx='327.4' cy='492.3' rx='52.3' ry='6.5' transform='rotate(0.1 327.4 492.3)' fill='%233f7f8c' opacity='0.47'/%3E%3Cellipse cx='382.9' cy='461.1' rx='49.5' ry='6' transform='rotate(1.3 382.9 461.1)' fill='%235c7f95' opacity='0.67'/%3E%3Cellipse cx='990.2' cy='445.9' rx='89' ry='3' transform='rotate(1.1 990.2 445.9)' fill='%2324405a' opacity='0.51'/%3E%3Cellipse cx='1529.5' cy='329.9' rx='75.4' ry='2.3' transform='rotate(0.1 1529.5 329.9)' fill='%2324405a' opacity='0.35'/%3E%3Cellipse cx='741.5' cy='357' rx='53.5' ry='2.4' transform='rotate(-0.9 741.5 357)' fill='%2324405a' opacity='0.73'/%3E%3Cellipse cx='380.6' cy='340.5' rx='45' ry='1.7' transform='rotate(0.6 380.6 340.5)' fill='%233f7f8c' opacity='0.68'/%3E%3Cellipse cx='747.2' cy='499.7' rx='86.6' ry='6.1' transform='rotate(-0.3 747.2 499.7)' fill='%233f7f8c' opacity='0.33'/%3E%3Cellipse cx='1534.6' cy='331.6' rx='75.6' ry='2.7' transform='rotate(0.1 1534.6 331.6)' fill='%235c7f95' opacity='0.34'/%3E%3Cellipse cx='747.1' cy='287' rx='52.9' ry='2.1' transform='rotate(-1.2 747.1 287)' fill='%2324405a' opacity='0.32'/%3E%3Cellipse cx='1311.3' cy='485.5' rx='130.9' ry='7' transform='rotate(-1.1 1311.3 485.5)' fill='%231f3a4e' opacity='0.31'/%3E%3Cellipse cx='421.2' cy='370.8' rx='82.4' ry='3' transform='rotate(1 421.2 370.8)' fill='%235c7f95' opacity='0.74'/%3E%3Cellipse cx='140.4' cy='407.9' rx='110.1' ry='2.5' transform='rotate(-1.4 140.4 407.9)' fill='%235c7f95' opacity='0.7'/%3E%3Cellipse cx='1341' cy='485.5' rx='121.5' ry='5.4' transform='rotate(-1.2 1341 485.5)' fill='%233f7f8c' opacity='0.49'/%3E%3Cellipse cx='789.5' cy='484.6' rx='55.6' ry='6.2' transform='rotate(1 789.5 484.6)' fill='%232b4a5e' opacity='0.59'/%3E%3Cellipse cx='1068.8' cy='282.7' rx='19.9' ry='2.3' transform='rotate(-0.9 1068.8 282.7)' fill='%2324405a' opacity='0.43'/%3E%3Cellipse cx='222.8' cy='285.5' rx='37' ry='2.1' transform='rotate(-1.5 222.8 285.5)' fill='%231f3a4e' opacity='0.49'/%3E%3Cellipse cx='1374.6' cy='402.1' rx='68.8' ry='4.1' transform='rotate(0.3 1374.6 402.1)' fill='%231f3a4e' opacity='0.33'/%3E%3Cellipse cx='228.8' cy='516.7' rx='51.1' ry='6.7' transform='rotate(-0.8 228.8 516.7)' fill='%232b4a5e' opacity='0.32'/%3E%3Cellipse cx='912.7' cy='450.6' rx='121.1' ry='4.8' transform='rotate(0.4 912.7 450.6)' fill='%231f3a4e' opacity='0.35'/%3E%3Cellipse cx='14.2' cy='345.1' rx='31.1' ry='2.7' transform='rotate(-1.5 14.2 345.1)' fill='%231f3a4e' opacity='0.54'/%3E%3Cellipse cx='249.4' cy='335.5' rx='69.8' ry='2.3' transform='rotate(-0.9 249.4 335.5)' fill='%2324405a' opacity='0.61'/%3E%3Cellipse cx='377.8' cy='391.6' rx='87.2' ry='4.5' transform='rotate(-0.6 377.8 391.6)' fill='%2324405a' opacity='0.59'/%3E%3Cellipse cx='1431' cy='323.2' rx='36.3' ry='2.4' transform='rotate(0.7 1431 323.2)' fill='%2324405a' opacity='0.48'/%3E%3Cellipse cx='875.2' cy='324.7' rx='51.3' ry='3.6' transform='rotate(1.4 875.2 324.7)' fill='%235c7f95' opacity='0.59'/%3E%3Cellipse cx='599.3' cy='489.9' rx='80.3' ry='3.9' transform='rotate(0.1 599.3 489.9)' fill='%2324405a' opacity='0.66'/%3E%3Cellipse cx='1561.8' cy='312.8' rx='17.9' ry='2.2' transform='rotate(1 1561.8 312.8)' fill='%235c7f95' opacity='0.55'/%3E%3Cellipse cx='1114' cy='342.4' rx='62.7' ry='3.6' transform='rotate(-0.9 1114 342.4)' fill='%232b4a5e' opacity='0.6'/%3E%3Cellipse cx='122.1' cy='335.3' rx='73.6' ry='3.3' transform='rotate(-1.2 122.1 335.3)' fill='%235c7f95' opacity='0.61'/%3E%3Cellipse cx='1020.9' cy='324.1' rx='30.5' ry='2.4' transform='rotate(1.3 1020.9 324.1)' fill='%235c7f95' opacity='0.43'/%3E%3Cellipse cx='1473.2' cy='431.3' rx='53' ry='4.3' transform='rotate(0.3 1473.2 431.3)' fill='%235c7f95' opacity='0.37'/%3E%3Cellipse cx='1182.8' cy='260.6' rx='34.3' ry='2' transform='rotate(1 1182.8 260.6)' fill='%235c7f95' opacity='0.59'/%3E%3Cellipse cx='745.3' cy='490.7' rx='79.8' ry='5.4' transform='rotate(-0.2 745.3 490.7)' fill='%233f7f8c' opacity='0.43'/%3E%3Cellipse cx='1553' cy='410.7' rx='71' ry='5.2' transform='rotate(1.5 1553 410.7)' fill='%2324405a' opacity='0.47'/%3E%3Cellipse cx='228.2' cy='513.5' rx='53' ry='3.6' transform='rotate(1.1 228.2 513.5)' fill='%232b4a5e' opacity='0.53'/%3E%3Cellipse cx='1576.7' cy='357.5' rx='89.7' ry='3.1' transform='rotate(1.3 1576.7 357.5)' fill='%231f3a4e' opacity='0.7'/%3E%3Cellipse cx='564.6' cy='294.6' rx='38.1' ry='2.8' transform='rotate(0.1 564.6 294.6)' fill='%232b4a5e' opacity='0.35'/%3E%3Cellipse cx='560.8' cy='515.1' rx='108.6' ry='6.2' transform='rotate(-0.9 560.8 515.1)' fill='%235c7f95' opacity='0.31'/%3E%3Cellipse cx='786.5' cy='440.2' rx='58.9' ry='5.1' transform='rotate(0.9 786.5 440.2)' fill='%2324405a' opacity='0.72'/%3E%3Cellipse cx='435.1' cy='353' rx='80' ry='3.5' transform='rotate(0.6 435.1 353)' fill='%2324405a' opacity='0.44'/%3E%3Cellipse cx='328.9' cy='295.4' rx='45.2' ry='2.4' transform='rotate(-1.1 328.9 295.4)' fill='%231f3a4e' opacity='0.65'/%3E%3Cellipse cx='754.2' cy='397.4' rx='58' ry='2.4' transform='rotate(-1 754.2 397.4)' fill='%232b4a5e' opacity='0.52'/%3E%3Cellipse cx='105.3' cy='490.8' rx='39.8' ry='5.8' transform='rotate(1.4 105.3 490.8)' fill='%233f7f8c' opacity='0.56'/%3E%3Cellipse cx='799.8' cy='379.4' rx='55.8' ry='4.6' transform='rotate(-0.6 799.8 379.4)' fill='%232b4a5e' opacity='0.74'/%3E%3Cellipse cx='335.6' cy='275.2' rx='41' ry='2.4' transform='rotate(-1.3 335.6 275.2)' fill='%231f3a4e' opacity='0.54'/%3E%3Cellipse cx='1462.7' cy='293.5' rx='45.8' ry='2.3' transform='rotate(-1.1 1462.7 293.5)' fill='%232b4a5e' opacity='0.69'/%3E%3Cellipse cx='1356.7' cy='356.4' rx='42.6' ry='4.2' transform='rotate(-1.5 1356.7 356.4)' fill='%2324405a' opacity='0.6'/%3E%3Cellipse cx='852.8' cy='398.1' rx='86.1' ry='3.1' transform='rotate(1.2 852.8 398.1)' fill='%2324405a' opacity='0.49'/%3E%3Cellipse cx='941.4' cy='271.2' rx='13.2' ry='2.1' transform='rotate(-0.6 941.4 271.2)' fill='%233f7f8c' opacity='0.56'/%3E%3Cellipse cx='1139.9' cy='354.4' rx='57.5' ry='1.7' transform='rotate(-0.5 1139.9 354.4)' fill='%233f7f8c' opacity='0.57'/%3E%3Cellipse cx='1239.3' cy='420.3' rx='46' ry='3.8' transform='rotate(0.1 1239.3 420.3)' fill='%232b4a5e' opacity='0.71'/%3E%3Cellipse cx='88.6' cy='493.5' rx='57.9' ry='5.8' transform='rotate(0.6 88.6 493.5)' fill='%232b4a5e' opacity='0.36'/%3E%3Cellipse cx='761.5' cy='309.2' rx='18' ry='2' transform='rotate(0.2 761.5 309.2)' fill='%2324405a' opacity='0.36'/%3E%3Cellipse cx='613.9' cy='488' rx='93.3' ry='3.6' transform='rotate(-0.3 613.9 488)' fill='%233f7f8c' opacity='0.74'/%3E%3Cellipse cx='771.9' cy='344.3' rx='61.7' ry='2.4' transform='rotate(-0.2 771.9 344.3)' fill='%232b4a5e' opacity='0.46'/%3E%3Cellipse cx='879.5' cy='268.2' rx='30.1' ry='2.2' transform='rotate(-1.3 879.5 268.2)' fill='%233f7f8c' opacity='0.31'/%3E%3Cellipse cx='732.9' cy='295.3' rx='46.2' ry='1.8' transform='rotate(0.3 732.9 295.3)' fill='%232b4a5e' opacity='0.45'/%3E%3Cellipse cx='846.9' cy='411.1' rx='100.3' ry='4.7' transform='rotate(0.3 846.9 411.1)' fill='%235c7f95' opacity='0.67'/%3E%3Cellipse cx='1126.8' cy='358.7' rx='32.4' ry='4.2' transform='rotate(-1 1126.8 358.7)' fill='%231f3a4e' opacity='0.62'/%3E%3Cellipse cx='498.4' cy='490.8' rx='148.5' ry='3.2' transform='rotate(0.1 498.4 490.8)' fill='%233f7f8c' opacity='0.4'/%3E%3Cellipse cx='376.9' cy='313.3' rx='65' ry='1.6' transform='rotate(-1.5 376.9 313.3)' fill='%233f7f8c' opacity='0.57'/%3E%3Cellipse cx='347.1' cy='406.3' rx='86.3' ry='5' transform='rotate(-1.1 347.1 406.3)' fill='%235c7f95' opacity='0.54'/%3E%3Cellipse cx='690.1' cy='292.4' rx='31.7' ry='2' transform='rotate(0.1 690.1 292.4)' fill='%231f3a4e' opacity='0.54'/%3E%3Cellipse cx='451.1' cy='266.8' rx='15.3' ry='1.1' transform='rotate(0.7 451.1 266.8)' fill='%2324405a' opacity='0.38'/%3E%3Cellipse cx='1156.7' cy='307.9' rx='50.3' ry='2.9' transform='rotate(1 1156.7 307.9)' fill='%232b4a5e' opacity='0.41'/%3E%3Cellipse cx='476.9' cy='394.6' rx='64.4' ry='4.6' transform='rotate(-1.4 476.9 394.6)' fill='%233f7f8c' opacity='0.69'/%3E%3Cellipse cx='353.7' cy='477.8' rx='80.3' ry='5.3' transform='rotate(-0.6 353.7 477.8)' fill='%233f7f8c' opacity='0.41'/%3E%3Cellipse cx='682.5' cy='316.5' rx='27.7' ry='3.4' transform='rotate(-1.1 682.5 316.5)' fill='%235c7f95' opacity='0.69'/%3E%3Cellipse cx='111.3' cy='303' rx='20.8' ry='2' transform='rotate(1.1 111.3 303)' fill='%232b4a5e' opacity='0.37'/%3E%3Cellipse cx='764.9' cy='422.6' rx='92.9' ry='4.9' transform='rotate(-0.6 764.9 422.6)' fill='%231f3a4e' opacity='0.47'/%3E%3Cellipse cx='1247.7' cy='269.3' rx='48.4' ry='2.1' transform='rotate(0.5 1247.7 269.3)' fill='%235c7f95' opacity='0.39'/%3E%3Cellipse cx='649.4' cy='272.8' rx='22.2' ry='1.7' transform='rotate(0.8 649.4 272.8)' fill='%2324405a' opacity='0.59'/%3E%3Cellipse cx='1289.6' cy='321.3' rx='35.7' ry='2.8' transform='rotate(0.5 1289.6 321.3)' fill='%233f7f8c' opacity='0.41'/%3E%3Cellipse cx='994' cy='500' rx='112.4' ry='3.6' transform='rotate(-0.4 994 500)' fill='%2324405a' opacity='0.72'/%3E%3Cellipse cx='540.3' cy='313' rx='19.8' ry='2.8' transform='rotate(-1 540.3 313)' fill='%232b4a5e' opacity='0.55'/%3E%3Cellipse cx='724.6' cy='442.3' rx='109.3' ry='2.5' transform='rotate(0.1 724.6 442.3)' fill='%2324405a' opacity='0.7'/%3E%3Cellipse cx='153' cy='296.1' rx='22.3' ry='1.5' transform='rotate(-0.8 153 296.1)' fill='%235c7f95' opacity='0.46'/%3E%3Cellipse cx='108.7' cy='415.4' rx='51.1' ry='5' transform='rotate(1 108.7 415.4)' fill='%232b4a5e' opacity='0.52'/%3E%3Cellipse cx='1191.4' cy='297.1' rx='40.6' ry='1.7' transform='rotate(-0.5 1191.4 297.1)' fill='%2324405a' opacity='0.41'/%3E%3Cellipse cx='696.1' cy='446.6' rx='99.8' ry='5.9' transform='rotate(1.4 696.1 446.6)' fill='%235c7f95' opacity='0.38'/%3E%3Cellipse cx='769.6' cy='438.9' rx='102.8' ry='5.5' transform='rotate(0.5 769.6 438.9)' fill='%231f3a4e' opacity='0.35'/%3E%3Cellipse cx='340.8' cy='293.6' rx='55.5' ry='2.8' transform='rotate(1.2 340.8 293.6)' fill='%232b4a5e' opacity='0.69'/%3E%3Cellipse cx='1107.2' cy='300.5' rx='60.4' ry='2.2' transform='rotate(0.8 1107.2 300.5)' fill='%233f7f8c' opacity='0.45'/%3E%3Cellipse cx='122.7' cy='334.7' rx='68.4' ry='2.9' transform='rotate(0.3 122.7 334.7)' fill='%235c7f95' opacity='0.38'/%3E%3Cellipse cx='509.5' cy='362.7' rx='37.4' ry='2' transform='rotate(0.1 509.5 362.7)' fill='%231f3a4e' opacity='0.59'/%3E%3Cellipse cx='1596.4' cy='500.6' rx='92.7' ry='5.3' transform='rotate(0.4 1596.4 500.6)' fill='%2324405a' opacity='0.67'/%3E%3Cellipse cx='63.2' cy='400.1' rx='76.9' ry='3.3' transform='rotate(1 63.2 400.1)' fill='%235c7f95' opacity='0.52'/%3E%3Cellipse cx='502.8' cy='288.7' rx='27.9' ry='1.2' transform='rotate(-0.6 502.8 288.7)' fill='%233f7f8c' opacity='0.66'/%3E%3Cellipse cx='250.6' cy='500.2' rx='154.2' ry='3.4' transform='rotate(-0.1 250.6 500.2)' fill='%231f3a4e' opacity='0.37'/%3E%3Cellipse cx='1193.6' cy='333' rx='24.9' ry='2.3' transform='rotate(-1.3 1193.6 333)' fill='%235c7f95' opacity='0.66'/%3E%3Cellipse cx='337.2' cy='516.6' rx='79.6' ry='5.4' transform='rotate(0.7 337.2 516.6)' fill='%235c7f95' opacity='0.37'/%3E%3Cellipse cx='1279.9' cy='297.1' rx='33.1' ry='2.2' transform='rotate(0.4 1279.9 297.1)' fill='%2324405a' opacity='0.73'/%3E%3Cellipse cx='753' cy='291.2' rx='26.2' ry='1.6' transform='rotate(0 753 291.2)' fill='%2324405a' opacity='0.74'/%3E%3Cellipse cx='1534.7' cy='369.6' rx='49.6' ry='1.9' transform='rotate(1 1534.7 369.6)' fill='%2324405a' opacity='0.63'/%3E%3Cellipse cx='1069.5' cy='267.7' rx='12.8' ry='2.2' transform='rotate(1 1069.5 267.7)' fill='%235c7f95' opacity='0.36'/%3E%3Cellipse cx='42.2' cy='449.2' rx='106.3' ry='3.9' transform='rotate(-0.6 42.2 449.2)' fill='%235c7f95' opacity='0.71'/%3E%3C/g%3E%3Cg filter='url(%23bs-soft)'%3E%3C/g%3E%3Cg filter='url(%23bs-water)'%3E%3Cellipse cx='1379.2' cy='272' rx='11' ry='2.4' transform='rotate(-0.8 1379.2 272)' fill='%23f08a4b' opacity='0.85'/%3E%3Cellipse cx='1373.8' cy='281.2' rx='14.2' ry='2.5' transform='rotate(1.7 1373.8 281.2)' fill='%23f08a4b' opacity='0.83'/%3E%3Cellipse cx='1369.5' cy='290.3' rx='22.4' ry='2.6' transform='rotate(-0.7 1369.5 290.3)' fill='%23f08a4b' opacity='0.81'/%3E%3Cellipse cx='1370' cy='299.5' rx='19.4' ry='2.7' transform='rotate(-0.4 1370 299.5)' fill='%23f08a4b' opacity='0.79'/%3E%3Cellipse cx='1376.7' cy='308.7' rx='24.8' ry='2.8' transform='rotate(0.9 1376.7 308.7)' fill='%23f6a56b' opacity='0.77'/%3E%3Cellipse cx='1375' cy='317.8' rx='20.8' ry='2.9' transform='rotate(0.4 1375 317.8)' fill='%23f6a56b' opacity='0.75'/%3E%3Cellipse cx='1370.5' cy='327' rx='25' ry='3' transform='rotate(0.9 1370.5 327)' fill='%23f08a4b' opacity='0.73'/%3E%3Cellipse cx='1375.6' cy='336.2' rx='26.5' ry='3.1' transform='rotate(0.6 1375.6 336.2)' fill='%23f08a4b' opacity='0.7'/%3E%3Cellipse cx='1383.7' cy='345.3' rx='28.3' ry='3.2' transform='rotate(-0.7 1383.7 345.3)' fill='%23f08a4b' opacity='0.68'/%3E%3Cellipse cx='1385.3' cy='354.5' rx='32.7' ry='3.3' transform='rotate(0 1385.3 354.5)' fill='%23f6a56b' opacity='0.66'/%3E%3Cellipse cx='1367.8' cy='363.7' rx='29.9' ry='3.4' transform='rotate(0.2 1367.8 363.7)' fill='%23f6a56b' opacity='0.64'/%3E%3Cellipse cx='1369.5' cy='372.8' rx='34.4' ry='3.5' transform='rotate(1.4 1369.5 372.8)' fill='%23f08a4b' opacity='0.62'/%3E%3Cellipse cx='1382.2' cy='382' rx='31.1' ry='3.6' transform='rotate(0.6 1382.2 382)' fill='%23f6a56b' opacity='0.6'/%3E%3Cellipse cx='1371' cy='391.2' rx='33.2' ry='3.7' transform='rotate(-1.6 1371 391.2)' fill='%23f08a4b' opacity='0.58'/%3E%3Cellipse cx='1371.1' cy='400.3' rx='39.8' ry='3.8' transform='rotate(0.8 1371.1 400.3)' fill='%23f6a56b' opacity='0.56'/%3E%3Cellipse cx='1380.2' cy='409.5' rx='37.1' ry='3.9' transform='rotate(1.4 1380.2 409.5)' fill='%23f08a4b' opacity='0.54'/%3E%3Cellipse cx='1373.3' cy='418.7' rx='37.3' ry='4' transform='rotate(1.5 1373.3 418.7)' fill='%23f08a4b' opacity='0.52'/%3E%3Cellipse cx='1383.4' cy='427.8' rx='43.3' ry='4.1' transform='rotate(0 1383.4 427.8)' fill='%23f08a4b' opacity='0.5'/%3E%3Cellipse cx='1383.1' cy='437' rx='43.5' ry='4.2' transform='rotate(0.2 1383.1 437)' fill='%23f08a4b' opacity='0.48'/%3E%3Cellipse cx='1393.2' cy='446.2' rx='41.8' ry='4.3' transform='rotate(0.7 1393.2 446.2)' fill='%23f6a56b' opacity='0.45'/%3E%3Cellipse cx='1361.2' cy='455.3' rx='44.9' ry='4.4' transform='rotate(1.3 1361.2 455.3)' fill='%23f6a56b' opacity='0.43'/%3E%3Cellipse cx='1379.6' cy='464.5' rx='45.2' ry='4.5' transform='rotate(-0.5 1379.6 464.5)' fill='%23f6a56b' opacity='0.41'/%3E%3Cellipse cx='1390.5' cy='473.7' rx='49.4' ry='4.6' transform='rotate(1.2 1390.5 473.7)' fill='%23f08a4b' opacity='0.39'/%3E%3Cellipse cx='1393.3' cy='482.8' rx='47.5' ry='4.7' transform='rotate(1.8 1393.3 482.8)' fill='%23f08a4b' opacity='0.37'/%3E%3C/g%3E%3C/svg%3E");--kit-icon-grass:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%2324331a' d='M6 0h4v1h-4zM4 1h2v1h-2zM10 1h2v1h-2zM2 2h2v1h-2zM12 2h2v1h-2zM0 3h2v1h-2zM14 3h2v1h-2zM0 4h1v1h-1zM15 4h1v1h-1zM0 5h1v1h-1zM3 5h2v1h-2zM12 5h2v1h-2zM15 5h1v1h-1zM0 6h1v1h-1zM5 6h2v1h-2zM10 6h2v1h-2zM15 6h1v1h-1zM0 7h1v1h-1zM7 7h3v1h-3zM15 7h1v1h-1zM0 8h1v1h-1zM8 8h1v1h-1zM15 8h1v1h-1zM0 9h1v1h-1zM8 9h1v1h-1zM15 9h1v1h-1zM0 10h1v1h-1zM8 10h1v1h-1zM15 10h1v1h-1zM0 11h1v1h-1zM8 11h1v1h-1zM15 11h1v1h-1zM1 12h2v1h-2zM8 12h1v1h-1zM13 12h2v1h-2zM3 13h2v1h-2zM8 13h1v1h-1zM11 13h2v1h-2zM5 14h2v1h-2zM8 14h3v1h-3zM7 15h2v1h-2z'/%3E%3Cpath fill='%235da130' d='M6 1h1v1h-1zM8 1h2v1h-2zM4 2h4v1h-4zM9 2h2v1h-2zM2 3h1v1h-1zM4 3h2v1h-2zM7 3h7v1h-7zM1 4h8v1h-8zM10 4h2v1h-2zM13 4h2v1h-2zM5 5h2v1h-2zM8 5h4v1h-4zM7 6h2v1h-2z'/%3E%3Cpath fill='%2379bf45' d='M7 1h1v1h-1zM11 2h1v1h-1zM3 3h1v1h-1zM9 4h1v1h-1zM7 5h1v1h-1z'/%3E%3Cpath fill='%234a8a26' d='M8 2h1v1h-1zM6 3h1v1h-1zM12 4h1v1h-1zM9 6h1v1h-1z'/%3E%3Cpath fill='%234f8f28' d='M1 5h2v1h-2zM1 6h1v1h-1zM3 6h2v1h-2zM2 7h1v1h-1zM5 7h2v1h-2zM4 8h1v1h-1z'/%3E%3Cpath fill='%233f7a1f' d='M14 5h1v1h-1zM12 6h2v1h-2zM10 7h1v1h-1zM12 7h1v1h-1zM10 8h1v1h-1zM13 8h1v1h-1z'/%3E%3Cpath fill='%238a5a33' d='M2 6h1v1h-1zM1 7h1v1h-1zM3 7h1v1h-1zM1 8h1v1h-1zM3 8h1v1h-1zM5 8h1v1h-1zM7 8h1v1h-1zM1 9h2v1h-2zM4 9h3v1h-3zM1 10h1v1h-1zM3 10h2v1h-2zM6 10h2v1h-2zM2 11h2v1h-2zM5 11h3v1h-3zM3 12h3v1h-3zM7 12h1v1h-1zM5 13h2v1h-2zM7 14h1v1h-1z'/%3E%3Cpath fill='%237d5230' d='M14 6h1v1h-1zM11 7h1v1h-1zM14 7h1v1h-1zM12 8h1v1h-1zM14 9h1v1h-1zM10 10h1v1h-1zM12 11h1v1h-1z'/%3E%3Cpath fill='%23a0703f' d='M4 7h1v1h-1zM2 8h1v1h-1zM7 9h1v1h-1zM2 10h1v1h-1zM4 11h1v1h-1zM7 13h1v1h-1z'/%3E%3Cpath fill='%236e4526' d='M13 7h1v1h-1zM9 8h1v1h-1zM11 8h1v1h-1zM14 8h1v1h-1zM9 9h2v1h-2zM12 9h2v1h-2zM9 10h1v1h-1zM11 10h2v1h-2zM14 10h1v1h-1zM9 11h3v1h-3zM13 11h2v1h-2zM9 12h1v1h-1zM11 12h2v1h-2zM9 13h2v1h-2z'/%3E%3Cpath fill='%236b4426' d='M6 8h1v1h-1zM3 9h1v1h-1zM5 10h1v1h-1zM1 11h1v1h-1zM6 12h1v1h-1z'/%3E%3Cpath fill='%23553319' d='M11 9h1v1h-1zM13 10h1v1h-1zM10 12h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-chest:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a1a0c' d='M1 2h14v1h-14zM1 3h1v1h-1zM14 3h1v1h-1zM1 4h1v1h-1zM14 4h1v1h-1zM1 5h1v1h-1zM14 5h1v1h-1zM1 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM14 7h1v1h-1zM1 8h6v1h-6zM9 8h6v1h-6zM1 9h1v1h-1zM14 9h1v1h-1zM1 10h1v1h-1zM14 10h1v1h-1zM1 11h1v1h-1zM14 11h1v1h-1zM1 12h1v1h-1zM14 12h1v1h-1zM1 13h1v1h-1zM14 13h1v1h-1zM1 14h14v1h-14z'/%3E%3Cpath fill='%23c48b45' d='M2 3h12v1h-12zM2 4h1v1h-1zM2 5h1v1h-1zM2 6h1v1h-1zM2 9h1v1h-1zM2 10h1v1h-1zM2 11h1v1h-1zM2 12h1v1h-1z'/%3E%3Cpath fill='%23a46a2c' d='M3 4h10v1h-10zM3 5h10v1h-10zM3 6h10v1h-10zM3 9h4v1h-4zM9 9h4v1h-4zM3 10h4v1h-4zM9 10h4v1h-4zM3 11h10v1h-10zM3 12h10v1h-10z'/%3E%3Cpath fill='%237a4a1c' d='M13 4h1v1h-1zM13 5h1v1h-1zM13 6h1v1h-1zM13 9h1v1h-1zM13 10h1v1h-1zM13 11h1v1h-1zM13 12h1v1h-1zM2 13h12v1h-12z'/%3E%3Cpath fill='%235e3612' d='M2 7h5v1h-5zM9 7h5v1h-5z'/%3E%3Cpath fill='%23e3e3e3' d='M7 7h2v1h-2zM7 8h1v1h-1zM7 9h1v1h-1z'/%3E%3Cpath fill='%239a9a9a' d='M8 8h1v1h-1zM8 9h1v1h-1z'/%3E%3Cpath fill='%234a4a4a' d='M7 10h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-pickaxe:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%230d3a3d' d='M4 1h6v1h-6zM3 2h1v1h-1zM11 2h1v1h-1zM2 3h3v1h-3zM12 3h1v1h-1zM9 4h1v1h-1zM13 4h1v1h-1zM8 5h1v1h-1zM11 5h1v1h-1zM14 5h1v1h-1zM7 6h1v1h-1zM10 6h1v1h-1zM12 6h1v1h-1zM14 6h1v1h-1zM6 7h1v1h-1zM9 7h1v1h-1zM12 7h1v1h-1zM14 7h1v1h-1zM5 8h1v1h-1zM8 8h1v1h-1zM13 8h2v1h-2zM4 9h1v1h-1zM7 9h1v1h-1zM3 10h1v1h-1zM6 10h1v1h-1zM2 11h1v1h-1zM5 11h1v1h-1zM1 12h1v1h-1zM4 12h1v1h-1zM1 13h1v1h-1z'/%3E%3Cpath fill='%23c9fbfd' d='M4 2h1v1h-1z'/%3E%3Cpath fill='%235de0e6' d='M5 2h6v1h-6zM10 3h2v1h-2zM11 4h2v1h-2zM12 5h2v1h-2zM13 6h1v1h-1zM13 7h1v1h-1z'/%3E%3Cpath fill='%232aa7b0' d='M5 3h5v1h-5zM10 4h1v1h-1z'/%3E%3Cpath fill='%238a5a33' d='M9 5h1v1h-1zM8 6h1v1h-1zM7 7h1v1h-1zM6 8h1v1h-1zM5 9h1v1h-1zM4 10h1v1h-1zM3 11h1v1h-1zM2 12h1v1h-1z'/%3E%3Cpath fill='%235e3b1f' d='M10 5h1v1h-1zM9 6h1v1h-1zM8 7h1v1h-1zM7 8h1v1h-1zM6 9h1v1h-1zM5 10h1v1h-1zM4 11h1v1h-1zM3 12h1v1h-1zM2 13h1v1h-1z'/%3E%3Cpath fill='%232a1a0c' d='M3 13h1v1h-1zM2 14h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-map:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%234a3a22' d='M1 1h14v1h-14zM1 2h1v1h-1zM14 2h1v1h-1zM1 3h1v1h-1zM14 3h1v1h-1zM1 4h1v1h-1zM14 4h1v1h-1zM1 5h1v1h-1zM14 5h1v1h-1zM1 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM14 7h1v1h-1zM1 8h1v1h-1zM14 8h1v1h-1zM1 9h1v1h-1zM14 9h1v1h-1zM1 10h1v1h-1zM14 10h1v1h-1zM1 11h1v1h-1zM14 11h1v1h-1zM1 12h1v1h-1zM14 12h1v1h-1zM1 13h1v1h-1zM14 13h1v1h-1zM1 14h14v1h-14z'/%3E%3Cpath fill='%23d9c690' d='M2 2h12v1h-12zM2 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM2 5h1v1h-1zM13 5h1v1h-1zM2 6h1v1h-1zM13 6h1v1h-1zM2 7h1v1h-1zM13 7h1v1h-1zM2 8h1v1h-1zM13 8h1v1h-1zM2 9h1v1h-1zM13 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM2 12h1v1h-1zM13 12h1v1h-1zM2 13h12v1h-12z'/%3E%3Cpath fill='%23efe3bd' d='M3 3h2v1h-2zM8 3h2v1h-2zM3 4h1v1h-1zM8 4h2v1h-2zM3 5h1v1h-1zM7 5h2v1h-2zM12 5h1v1h-1zM3 6h2v1h-2zM6 6h2v1h-2zM11 6h1v1h-1zM3 7h3v1h-3zM9 7h2v1h-2zM3 8h2v1h-2zM9 8h1v1h-1zM3 9h1v1h-1zM8 9h2v1h-2zM12 9h1v1h-1zM3 10h1v1h-1zM6 10h4v1h-4zM11 10h2v1h-2zM5 11h2v1h-2zM8 11h1v1h-1zM12 11h1v1h-1zM5 12h2v1h-2zM9 12h1v1h-1zM11 12h2v1h-2z'/%3E%3Cpath fill='%236aa84f' d='M5 3h3v1h-3zM4 4h2v1h-2zM7 4h1v1h-1zM4 5h3v1h-3zM5 6h1v1h-1zM12 6h1v1h-1zM11 7h2v1h-2zM10 8h1v1h-1zM12 8h1v1h-1zM10 9h2v1h-2zM3 11h2v1h-2zM7 11h1v1h-1zM4 12h1v1h-1zM7 12h2v1h-2z'/%3E%3Cpath fill='%236aa6d8' d='M10 3h3v1h-3zM10 4h1v1h-1zM12 4h1v1h-1zM9 5h3v1h-3zM8 6h3v1h-3zM6 7h3v1h-3zM5 8h2v1h-2zM8 8h1v1h-1zM4 9h4v1h-4zM4 10h2v1h-2z'/%3E%3Cpath fill='%234f8a3a' d='M6 4h1v1h-1zM11 8h1v1h-1zM3 12h1v1h-1z'/%3E%3Cpath fill='%233e6e8e' d='M11 4h1v1h-1zM7 8h1v1h-1z'/%3E%3Cpath fill='%23c0392b' d='M10 10h1v1h-1zM9 11h3v1h-3zM10 12h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-book-quill:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a1a12' d='M12 0h2v1h-2zM11 1h1v1h-1zM14 1h1v1h-1zM10 2h1v1h-1zM14 2h1v1h-1zM9 3h1v1h-1zM13 3h1v1h-1zM2 4h7v1h-7zM12 4h1v1h-1zM1 5h1v1h-1zM11 5h2v1h-2zM1 6h1v1h-1zM7 6h1v1h-1zM10 6h1v1h-1zM12 6h1v1h-1zM1 7h1v1h-1zM7 7h1v1h-1zM9 7h2v1h-2zM13 7h1v1h-1zM1 8h1v1h-1zM7 8h1v1h-1zM13 8h1v1h-1zM1 9h1v1h-1zM13 9h1v1h-1zM1 10h1v1h-1zM13 10h1v1h-1zM1 11h1v1h-1zM13 11h1v1h-1zM1 12h1v1h-1zM13 12h1v1h-1zM1 13h1v1h-1zM13 13h1v1h-1zM2 14h11v1h-11z'/%3E%3Cpath fill='%23ffffff' d='M12 1h2v1h-2zM11 2h2v1h-2zM10 3h2v1h-2zM9 4h2v1h-2zM8 5h2v1h-2zM8 6h1v1h-1z'/%3E%3Cpath fill='%23c9c9c9' d='M13 2h1v1h-1zM12 3h1v1h-1zM11 4h1v1h-1zM10 5h1v1h-1zM9 6h1v1h-1zM8 7h1v1h-1z'/%3E%3Cpath fill='%238b4a2b' d='M2 5h6v1h-6zM2 6h1v1h-1zM2 7h1v1h-1zM12 7h1v1h-1zM2 8h1v1h-1zM12 8h1v1h-1zM2 9h1v1h-1zM12 9h1v1h-1zM2 10h1v1h-1zM12 10h1v1h-1zM2 11h1v1h-1zM12 11h1v1h-1zM2 12h1v1h-1zM12 12h1v1h-1z'/%3E%3Cpath fill='%23f4ecd6' d='M3 6h4v1h-4zM3 7h1v1h-1zM6 7h1v1h-1zM11 7h1v1h-1zM3 8h4v1h-4zM9 8h2v1h-2zM3 9h1v1h-1zM8 9h3v1h-3zM3 10h8v1h-8zM3 11h1v1h-1zM10 11h1v1h-1zM3 12h8v1h-8z'/%3E%3Cpath fill='%233a3a3a' d='M11 6h1v1h-1zM8 8h1v1h-1z'/%3E%3Cpath fill='%23d8cba7' d='M4 7h2v1h-2zM11 8h1v1h-1zM4 9h4v1h-4zM11 9h1v1h-1zM11 10h1v1h-1zM4 11h6v1h-6zM11 11h1v1h-1zM11 12h1v1h-1z'/%3E%3Cpath fill='%236a3520' d='M2 13h11v1h-11z'/%3E%3C/svg%3E");--kit-icon-emerald:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%2306401d' d='M7 1h2v1h-2zM6 2h1v1h-1zM9 2h1v1h-1zM5 3h1v1h-1zM10 3h1v1h-1zM4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1zM3 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM4 10h1v1h-1zM11 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM5 12h1v1h-1zM10 12h1v1h-1zM6 13h1v1h-1zM9 13h1v1h-1zM7 14h2v1h-2z'/%3E%3Cpath fill='%23b8ffcb' d='M7 2h2v1h-2zM6 3h1v1h-1zM5 4h1v1h-1zM4 6h1v1h-1z'/%3E%3Cpath fill='%2341f08a' d='M7 3h1v1h-1zM6 4h1v1h-1zM5 5h1v1h-1zM5 6h1v1h-1zM4 7h1v1h-1zM4 8h1v1h-1z'/%3E%3Cpath fill='%2317dd62' d='M8 3h1v1h-1zM7 4h2v1h-2zM6 5h3v1h-3zM6 6h5v1h-5zM5 7h5v1h-5zM5 8h4v1h-4zM4 9h4v1h-4zM5 10h3v1h-3zM5 11h2v1h-2zM6 12h1v1h-1z'/%3E%3Cpath fill='%230e9f45' d='M9 3h1v1h-1zM9 4h2v1h-2zM9 5h2v1h-2zM11 6h1v1h-1zM10 7h2v1h-2zM9 8h3v1h-3zM8 9h4v1h-4zM8 10h2v1h-2zM7 11h3v1h-3zM7 12h2v1h-2zM7 13h1v1h-1z'/%3E%3Cpath fill='%230a7a34' d='M10 10h1v1h-1zM10 11h1v1h-1zM9 12h1v1h-1zM8 13h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-diamond:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%230b3b40' d='M4 2h8v1h-8zM3 3h1v1h-1zM12 3h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM1 5h14v1h-14zM1 6h1v1h-1zM14 6h1v1h-1zM2 7h1v1h-1zM13 7h1v1h-1zM3 8h1v1h-1zM13 8h1v1h-1zM3 9h2v1h-2zM12 9h1v1h-1zM4 10h2v1h-2zM12 10h1v1h-1zM5 11h2v1h-2zM11 11h1v1h-1zM6 12h2v1h-2zM10 12h1v1h-1zM7 13h3v1h-3zM8 14h1v1h-1z'/%3E%3Cpath fill='%23ffffff' d='M4 3h1v1h-1zM3 4h1v1h-1z'/%3E%3Cpath fill='%23b8fbff' d='M5 3h3v1h-3zM4 4h2v1h-2zM2 6h2v1h-2zM3 7h1v1h-1zM4 8h1v1h-1z'/%3E%3Cpath fill='%235de0e6' d='M8 3h3v1h-3zM6 4h6v1h-6zM4 6h7v1h-7zM4 7h7v1h-7zM5 8h6v1h-6zM5 9h5v1h-5zM6 10h4v1h-4zM7 11h2v1h-2zM8 12h1v1h-1z'/%3E%3Cpath fill='%232aa7b0' d='M11 3h1v1h-1zM12 4h1v1h-1zM11 6h2v1h-2zM11 7h1v1h-1zM11 8h1v1h-1zM10 9h1v1h-1zM10 10h1v1h-1zM9 11h1v1h-1zM9 12h1v1h-1z'/%3E%3Cpath fill='%231b7d86' d='M13 6h1v1h-1zM12 7h1v1h-1zM12 8h1v1h-1zM11 9h1v1h-1zM11 10h1v1h-1zM10 11h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-compass:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%231e1e22' d='M5 1h6v1h-6zM4 2h1v1h-1zM11 2h1v1h-1zM3 3h1v1h-1zM12 3h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM2 5h1v1h-1zM13 5h1v1h-1zM2 6h1v1h-1zM13 6h1v1h-1zM2 7h1v1h-1zM13 7h1v1h-1zM2 8h1v1h-1zM13 8h1v1h-1zM2 9h1v1h-1zM13 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM3 12h1v1h-1zM12 12h1v1h-1zM4 13h1v1h-1zM11 13h1v1h-1zM5 14h6v1h-6z'/%3E%3Cpath fill='%23c6c6c6' d='M5 2h6v1h-6zM4 3h1v1h-1zM11 3h1v1h-1zM3 4h1v1h-1zM12 4h1v1h-1zM3 5h1v1h-1zM12 5h1v1h-1zM3 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM3 10h1v1h-1zM12 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM5 13h6v1h-6z'/%3E%3Cpath fill='%238b8b8b' d='M5 3h6v1h-6zM4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1zM4 6h1v1h-1zM11 6h1v1h-1zM4 7h1v1h-1zM11 7h1v1h-1zM4 8h1v1h-1zM11 8h1v1h-1zM4 9h1v1h-1zM11 9h1v1h-1zM4 10h1v1h-1zM11 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM5 12h6v1h-6z'/%3E%3Cpath fill='%235b6b7c' d='M5 4h1v1h-1zM7 4h1v1h-1zM9 4h2v1h-2zM6 5h3v1h-3zM5 6h1v1h-1zM7 6h1v1h-1zM5 7h2v1h-2zM10 7h1v1h-1zM6 8h1v1h-1zM10 8h1v1h-1zM5 9h1v1h-1zM8 9h1v1h-1zM10 9h1v1h-1zM7 10h1v1h-1zM9 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM9 11h2v1h-2z'/%3E%3Cpath fill='%236f8293' d='M6 4h1v1h-1zM8 4h1v1h-1zM5 5h1v1h-1zM9 5h1v1h-1zM6 6h1v1h-1zM8 6h1v1h-1zM7 7h1v1h-1zM5 8h1v1h-1zM9 8h1v1h-1zM9 9h1v1h-1zM8 10h1v1h-1zM10 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1z'/%3E%3Cpath fill='%23ff6a5a' d='M10 5h1v1h-1z'/%3E%3Cpath fill='%23d23b3b' d='M9 6h2v1h-2zM8 7h2v1h-2z'/%3E%3Cpath fill='%23dcdcdc' d='M7 8h1v1h-1zM6 9h1v1h-1zM5 10h1v1h-1z'/%3E%3Cpath fill='%239a9a9a' d='M8 8h1v1h-1zM7 9h1v1h-1zM6 10h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-torch:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a1a0c' d='M7 1h2v1h-2zM6 2h1v1h-1zM9 2h1v1h-1zM5 3h1v1h-1zM10 3h1v1h-1zM5 4h1v1h-1zM10 4h1v1h-1zM5 5h1v1h-1zM10 5h1v1h-1zM6 6h1v1h-1zM9 6h1v1h-1zM6 7h1v1h-1zM9 7h1v1h-1zM6 8h1v1h-1zM9 8h1v1h-1zM6 9h1v1h-1zM9 9h1v1h-1zM6 10h1v1h-1zM9 10h1v1h-1zM6 11h1v1h-1zM9 11h1v1h-1zM6 12h1v1h-1zM9 12h1v1h-1zM6 13h1v1h-1zM9 13h1v1h-1zM6 14h4v1h-4z'/%3E%3Cpath fill='%23fff6b0' d='M7 2h2v1h-2zM6 3h1v1h-1zM9 3h1v1h-1zM9 4h1v1h-1z'/%3E%3Cpath fill='%23ffd84a' d='M7 3h2v1h-2zM6 4h1v1h-1z'/%3E%3Cpath fill='%23f08a2b' d='M7 4h2v1h-2zM6 5h1v1h-1zM9 5h1v1h-1z'/%3E%3Cpath fill='%23d2501b' d='M7 5h2v1h-2z'/%3E%3Cpath fill='%23b07a3f' d='M7 6h1v1h-1zM7 7h1v1h-1zM7 8h1v1h-1zM7 9h1v1h-1zM7 10h1v1h-1zM7 11h1v1h-1zM7 12h1v1h-1zM7 13h1v1h-1z'/%3E%3Cpath fill='%236b4a26' d='M8 6h1v1h-1zM8 7h1v1h-1zM8 8h1v1h-1zM8 9h1v1h-1zM8 10h1v1h-1zM8 11h1v1h-1zM8 12h1v1h-1zM8 13h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-tnt:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a0606' d='M0 0h16v1h-16zM0 1h1v1h-1zM15 1h1v1h-1zM0 2h1v1h-1zM15 2h1v1h-1zM0 3h1v1h-1zM15 3h1v1h-1zM0 4h1v1h-1zM15 4h1v1h-1zM0 5h1v1h-1zM15 5h1v1h-1zM0 6h1v1h-1zM15 6h1v1h-1zM0 7h1v1h-1zM15 7h1v1h-1zM0 8h1v1h-1zM15 8h1v1h-1zM0 9h1v1h-1zM15 9h1v1h-1zM0 10h1v1h-1zM15 10h1v1h-1zM0 11h1v1h-1zM15 11h1v1h-1zM0 12h1v1h-1zM15 12h1v1h-1zM0 13h1v1h-1zM15 13h1v1h-1zM0 14h1v1h-1zM15 14h1v1h-1zM0 15h16v1h-16z'/%3E%3Cpath fill='%23d23b3b' d='M1 1h1v1h-1zM3 1h1v1h-1zM5 1h1v1h-1zM7 1h1v1h-1zM9 1h1v1h-1zM11 1h1v1h-1zM13 1h1v1h-1zM1 2h1v1h-1zM3 2h1v1h-1zM5 2h1v1h-1zM7 2h1v1h-1zM9 2h1v1h-1zM11 2h1v1h-1zM13 2h1v1h-1zM1 3h1v1h-1zM3 3h1v1h-1zM5 3h1v1h-1zM7 3h1v1h-1zM9 3h1v1h-1zM11 3h1v1h-1zM13 3h1v1h-1zM1 11h1v1h-1zM3 11h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1zM1 12h1v1h-1zM3 12h1v1h-1zM5 12h1v1h-1zM7 12h1v1h-1zM9 12h1v1h-1zM11 12h1v1h-1zM13 12h1v1h-1zM1 13h1v1h-1zM3 13h1v1h-1zM5 13h1v1h-1zM7 13h1v1h-1zM9 13h1v1h-1zM11 13h1v1h-1zM13 13h1v1h-1zM1 14h1v1h-1zM3 14h1v1h-1zM5 14h1v1h-1zM7 14h1v1h-1zM9 14h1v1h-1zM11 14h1v1h-1zM13 14h1v1h-1z'/%3E%3Cpath fill='%23a62626' d='M2 1h1v1h-1zM4 1h1v1h-1zM6 1h1v1h-1zM8 1h1v1h-1zM10 1h1v1h-1zM12 1h1v1h-1zM14 1h1v1h-1zM2 2h1v1h-1zM4 2h1v1h-1zM6 2h1v1h-1zM8 2h1v1h-1zM10 2h1v1h-1zM12 2h1v1h-1zM14 2h1v1h-1zM2 3h1v1h-1zM4 3h1v1h-1zM6 3h1v1h-1zM8 3h1v1h-1zM10 3h1v1h-1zM12 3h1v1h-1zM14 3h1v1h-1zM2 11h1v1h-1zM4 11h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1zM2 12h1v1h-1zM4 12h1v1h-1zM6 12h1v1h-1zM8 12h1v1h-1zM10 12h1v1h-1zM12 12h1v1h-1zM14 12h1v1h-1zM2 13h1v1h-1zM4 13h1v1h-1zM6 13h1v1h-1zM8 13h1v1h-1zM10 13h1v1h-1zM12 13h1v1h-1zM14 13h1v1h-1zM2 14h1v1h-1zM4 14h1v1h-1zM6 14h1v1h-1zM8 14h1v1h-1zM10 14h1v1h-1zM12 14h1v1h-1zM14 14h1v1h-1z'/%3E%3Cpath fill='%23f4efe6' d='M1 4h14v1h-14zM1 5h1v1h-1zM5 5h1v1h-1zM7 5h2v1h-2zM10 5h1v1h-1zM14 5h1v1h-1zM1 6h2v1h-2zM4 6h2v1h-2zM8 6h1v1h-1zM10 6h2v1h-2zM13 6h2v1h-2zM1 7h2v1h-2zM4 7h2v1h-2zM7 7h1v1h-1zM10 7h2v1h-2zM13 7h2v1h-2zM1 8h2v1h-2zM4 8h2v1h-2zM7 8h2v1h-2zM10 8h2v1h-2zM13 8h2v1h-2zM1 9h2v1h-2zM4 9h2v1h-2zM7 9h2v1h-2zM10 9h2v1h-2zM13 9h2v1h-2z'/%3E%3Cpath fill='%231a1a1a' d='M2 5h3v1h-3zM6 5h1v1h-1zM9 5h1v1h-1zM11 5h3v1h-3zM3 6h1v1h-1zM6 6h2v1h-2zM9 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM6 7h1v1h-1zM8 7h2v1h-2zM12 7h1v1h-1zM3 8h1v1h-1zM6 8h1v1h-1zM9 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM6 9h1v1h-1zM9 9h1v1h-1zM12 9h1v1h-1z'/%3E%3Cpath fill='%23bdb5a8' d='M1 10h14v1h-14z'/%3E%3C/svg%3E");--kit-icon-paper:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%234a4a40' d='M3 1h9v1h-9zM3 2h1v1h-1zM12 2h1v1h-1zM3 3h1v1h-1zM13 3h1v1h-1zM3 4h1v1h-1zM13 4h1v1h-1zM3 5h1v1h-1zM13 5h1v1h-1zM3 6h1v1h-1zM13 6h1v1h-1zM3 7h1v1h-1zM13 7h1v1h-1zM3 8h1v1h-1zM13 8h1v1h-1zM3 9h1v1h-1zM13 9h1v1h-1zM3 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM13 11h1v1h-1zM3 12h1v1h-1zM13 12h1v1h-1zM3 13h11v1h-11z'/%3E%3Cpath fill='%23f7f4ea' d='M4 2h8v1h-8zM4 3h9v1h-9zM4 4h1v1h-1zM11 4h2v1h-2zM4 5h8v1h-8zM4 6h1v1h-1zM10 6h3v1h-3zM4 7h8v1h-8zM4 8h1v1h-1zM12 8h1v1h-1zM4 9h8v1h-8zM4 10h1v1h-1zM9 10h3v1h-3zM4 11h8v1h-8z'/%3E%3Cpath fill='%239aa3ab' d='M5 4h6v1h-6zM5 6h5v1h-5zM5 8h7v1h-7zM5 10h4v1h-4z'/%3E%3Cpath fill='%23d8d2bf' d='M12 5h1v1h-1zM12 7h1v1h-1zM12 9h1v1h-1zM12 10h1v1h-1zM12 11h1v1h-1zM4 12h9v1h-9z'/%3E%3C/svg%3E");--kit-icon-question:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 1h6v1h-6zM4 2h8v1h-8zM3 3h3v1h-3zM10 3h3v1h-3zM3 4h3v1h-3zM10 4h3v1h-3zM10 5h3v1h-3zM9 6h3v1h-3zM8 7h3v1h-3zM7 8h3v1h-3zM7 9h3v1h-3zM7 10h3v1h-3zM7 12h3v1h-3zM7 13h3v1h-3z'/%3E%3C/svg%3E");--kit-icon-bug:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%233a2a30' d='M4 1h1v1h-1zM11 1h1v1h-1zM5 2h1v1h-1zM10 2h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM3 5h1v1h-1zM12 5h1v1h-1zM1 7h2v1h-2zM13 7h2v1h-2zM1 9h2v1h-2zM13 9h2v1h-2zM2 11h1v1h-1zM13 11h1v1h-1z'/%3E%3Cpath fill='%232a1018' d='M6 3h4v1h-4zM5 4h1v1h-1zM7 4h2v1h-2zM10 4h1v1h-1zM4 5h8v1h-8zM4 6h1v1h-1zM11 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM3 10h1v1h-1zM12 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM5 13h6v1h-6z'/%3E%3Cpath fill='%23ff5a5a' d='M6 4h1v1h-1zM9 4h1v1h-1z'/%3E%3Cpath fill='%23c2577a' d='M5 6h2v1h-2zM8 6h3v1h-3zM4 7h3v1h-3zM8 7h4v1h-4zM4 8h3v1h-3zM8 8h4v1h-4zM4 9h3v1h-3zM8 9h4v1h-4zM4 10h3v1h-3zM8 10h4v1h-4zM4 11h3v1h-3zM8 11h4v1h-4zM5 12h2v1h-2zM8 12h3v1h-3z'/%3E%3Cpath fill='%238f3a57' d='M7 6h1v1h-1zM7 7h1v1h-1zM7 8h1v1h-1zM7 9h1v1h-1zM7 10h1v1h-1zM7 11h1v1h-1zM7 12h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-potion:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%231c1630' d='M6 1h4v1h-4zM6 2h1v1h-1zM9 2h1v1h-1zM7 3h2v1h-2zM6 4h1v1h-1zM9 4h1v1h-1zM6 5h1v1h-1zM9 5h1v1h-1zM5 6h1v1h-1zM10 6h1v1h-1zM4 7h1v1h-1zM11 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM3 10h1v1h-1zM12 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM3 12h1v1h-1zM12 12h1v1h-1zM4 13h1v1h-1zM11 13h1v1h-1zM5 14h6v1h-6z'/%3E%3Cpath fill='%238a5a33' d='M7 2h2v1h-2z'/%3E%3Cpath fill='%23d8e6ee' d='M7 4h2v1h-2zM7 5h1v1h-1zM6 6h3v1h-3zM5 7h1v1h-1zM10 7h1v1h-1zM4 8h1v1h-1zM11 8h1v1h-1z'/%3E%3Cpath fill='%23ffffff' d='M8 5h1v1h-1zM9 6h1v1h-1zM6 9h1v1h-1zM5 10h1v1h-1z'/%3E%3Cpath fill='%23b493ff' d='M6 7h4v1h-4zM5 8h1v1h-1zM4 9h1v1h-1z'/%3E%3Cpath fill='%238e5cf6' d='M6 8h5v1h-5zM5 9h1v1h-1zM7 9h5v1h-5zM4 10h1v1h-1zM6 10h4v1h-4zM4 11h6v1h-6zM4 12h5v1h-5z'/%3E%3Cpath fill='%236a3fd0' d='M10 10h2v1h-2zM10 11h2v1h-2zM9 12h3v1h-3zM5 13h6v1h-6z'/%3E%3C/svg%3E");--kit-icon-quote:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 3h4v1h-4zM10 3h4v1h-4zM2 4h4v1h-4zM10 4h4v1h-4zM2 5h4v1h-4zM10 5h4v1h-4zM2 6h4v1h-4zM10 6h4v1h-4zM4 7h2v1h-2zM12 7h2v1h-2zM3 8h2v1h-2zM11 8h2v1h-2zM2 9h2v1h-2zM10 9h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-sun:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%239a5a12' d='M7 0h2v1h-2zM2 2h1v1h-1zM13 2h1v1h-1zM5 4h6v1h-6zM4 5h1v1h-1zM11 5h1v1h-1zM4 6h1v1h-1zM11 6h1v1h-1zM0 7h1v1h-1zM4 7h1v1h-1zM11 7h1v1h-1zM15 7h1v1h-1zM0 8h1v1h-1zM4 8h1v1h-1zM11 8h1v1h-1zM15 8h1v1h-1zM4 9h1v1h-1zM11 9h1v1h-1zM4 10h1v1h-1zM11 10h1v1h-1zM5 11h6v1h-6zM2 13h1v1h-1zM13 13h1v1h-1zM7 15h2v1h-2z'/%3E%3Cpath fill='%23ffd84a' d='M7 1h2v1h-2zM7 2h2v1h-2zM3 3h1v1h-1zM12 3h1v1h-1zM5 5h6v1h-6zM5 6h1v1h-1zM7 6h3v1h-3zM1 7h2v1h-2zM5 7h5v1h-5zM13 7h2v1h-2zM1 8h2v1h-2zM5 8h5v1h-5zM13 8h2v1h-2zM5 9h4v1h-4zM5 10h1v1h-1zM3 12h1v1h-1zM12 12h1v1h-1zM7 13h2v1h-2zM7 14h2v1h-2z'/%3E%3Cpath fill='%23fff6c4' d='M6 6h1v1h-1z'/%3E%3Cpath fill='%23f2a52e' d='M10 6h1v1h-1zM10 7h1v1h-1zM10 8h1v1h-1zM9 9h2v1h-2zM6 10h5v1h-5z'/%3E%3C/svg%3E");--kit-icon-moon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%233a3f6b' d='M5 1h2v1h-2zM3 2h2v1h-2zM6 2h1v1h-1zM2 3h1v1h-1zM6 3h1v1h-1zM2 4h1v1h-1zM6 4h1v1h-1zM1 5h1v1h-1zM6 5h1v1h-1zM1 6h1v1h-1zM6 6h1v1h-1zM1 7h1v1h-1zM7 7h1v1h-1zM1 8h1v1h-1zM8 8h1v1h-1zM1 9h1v1h-1zM9 9h5v1h-5zM1 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM2 12h1v1h-1zM12 12h1v1h-1zM3 13h2v1h-2zM10 13h2v1h-2zM5 14h5v1h-5z'/%3E%3Cpath fill='%23f2c230' d='M13 1h1v1h-1zM12 4h1v1h-1z'/%3E%3Cpath fill='%23aab4e6' d='M5 2h1v1h-1zM5 3h1v1h-1zM5 4h1v1h-1zM5 5h1v1h-1zM6 7h1v1h-1zM7 8h1v1h-1zM8 9h1v1h-1zM10 10h3v1h-3z'/%3E%3Cpath fill='%23e6ecff' d='M3 3h2v1h-2zM3 4h2v1h-2zM2 5h3v1h-3zM2 6h4v1h-4zM2 7h4v1h-4zM2 8h5v1h-5zM2 9h6v1h-6zM2 10h8v1h-8zM3 11h10v1h-10zM3 12h9v1h-9zM5 13h5v1h-5z'/%3E%3C/svg%3E");--kit-icon-clock:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%234a3608' d='M5 1h6v1h-6zM4 2h1v1h-1zM12 2h1v1h-1zM3 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM14 4h1v1h-1zM2 5h1v1h-1zM14 5h1v1h-1zM2 6h1v1h-1zM14 6h1v1h-1zM2 7h1v1h-1zM14 7h1v1h-1zM2 8h1v1h-1zM14 8h1v1h-1zM2 9h1v1h-1zM14 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM5 13h6v1h-6z'/%3E%3Cpath fill='%23f2c230' d='M5 2h6v1h-6zM4 3h1v1h-1zM11 3h1v1h-1zM3 4h1v1h-1zM12 4h1v1h-1zM3 5h1v1h-1zM3 6h1v1h-1zM3 7h1v1h-1zM3 8h1v1h-1zM3 9h1v1h-1zM3 10h1v1h-1z'/%3E%3Cpath fill='%23c99a16' d='M11 2h1v1h-1zM12 3h1v1h-1zM13 4h1v1h-1zM13 5h1v1h-1zM13 6h1v1h-1zM13 7h1v1h-1zM13 9h1v1h-1zM12 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM5 12h6v1h-6z'/%3E%3Cpath fill='%23ffe680' d='M5 3h2v1h-2zM4 4h2v1h-2zM4 5h1v1h-1zM8 5h1v1h-1zM7 6h3v1h-3zM8 7h1v1h-1z'/%3E%3Cpath fill='%233e6eb8' d='M7 3h4v1h-4zM6 4h6v1h-6zM5 5h3v1h-3zM9 5h4v1h-4zM4 6h3v1h-3zM10 6h3v1h-3zM4 7h4v1h-4zM9 7h4v1h-4z'/%3E%3Cpath fill='%231b2e5a' d='M4 8h10v1h-10zM4 9h2v1h-2zM7 9h3v1h-3zM11 9h2v1h-2zM4 10h5v1h-5zM10 10h2v1h-2zM5 11h2v1h-2zM8 11h3v1h-3z'/%3E%3Cpath fill='%230f1b26' d='M6 9h1v1h-1zM10 9h1v1h-1zM9 10h1v1h-1zM7 11h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-monitor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%2326313a' d='M0 1h16v1h-16zM0 2h1v1h-1zM15 2h1v1h-1zM0 3h1v1h-1zM15 3h1v1h-1zM0 4h1v1h-1zM15 4h1v1h-1zM0 5h1v1h-1zM15 5h1v1h-1zM0 6h1v1h-1zM15 6h1v1h-1zM0 7h1v1h-1zM15 7h1v1h-1zM0 8h1v1h-1zM15 8h1v1h-1zM0 9h1v1h-1zM15 9h1v1h-1zM0 10h1v1h-1zM15 10h1v1h-1zM0 11h16v1h-16z'/%3E%3Cpath fill='%23bfe3f0' d='M1 2h13v1h-13zM1 3h3v1h-3zM5 3h8v1h-8zM1 4h1v1h-1zM5 4h7v1h-7zM1 5h2v1h-2zM6 5h5v1h-5zM1 6h2v1h-2zM4 6h6v1h-6zM1 7h8v1h-8zM1 8h7v1h-7zM1 9h6v1h-6zM1 10h5v1h-5z'/%3E%3Cpath fill='%232b3a66' d='M14 2h1v1h-1zM13 3h2v1h-2zM12 4h3v1h-3zM11 5h4v1h-4zM10 6h2v1h-2zM13 6h2v1h-2zM9 7h2v1h-2zM13 7h2v1h-2zM8 8h4v1h-4zM13 8h2v1h-2zM7 9h4v1h-4zM12 9h3v1h-3zM6 10h9v1h-9z'/%3E%3Cpath fill='%23f2a52e' d='M4 3h1v1h-1zM2 4h1v1h-1zM5 5h1v1h-1zM3 6h1v1h-1z'/%3E%3Cpath fill='%23ffd84a' d='M3 4h2v1h-2zM3 5h2v1h-2z'/%3E%3Cpath fill='%23e6ecff' d='M12 6h1v1h-1zM11 7h2v1h-2zM12 8h1v1h-1zM11 9h1v1h-1z'/%3E%3Cpath fill='%238b8b8b' d='M6 12h4v1h-4z'/%3E%3Cpath fill='%235b6770' d='M4 13h8v1h-8z'/%3E%3C/svg%3E");--kit-icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 2h5v1h-5zM4 3h2v1h-2zM9 3h2v1h-2zM3 4h2v1h-2zM10 4h2v1h-2zM3 5h1v1h-1zM11 5h1v1h-1zM3 6h1v1h-1zM11 6h1v1h-1zM3 7h1v1h-1zM11 7h1v1h-1zM3 8h2v1h-2zM10 8h2v1h-2zM4 9h2v1h-2zM9 9h3v1h-3zM5 10h8v1h-8zM10 11h4v1h-4zM11 12h4v1h-4zM12 13h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-apps:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 2h4v1h-4zM10 2h4v1h-4zM2 3h4v1h-4zM10 3h4v1h-4zM2 4h4v1h-4zM10 4h4v1h-4zM2 5h4v1h-4zM10 5h4v1h-4zM2 10h4v1h-4zM10 10h4v1h-4zM2 11h4v1h-4zM10 11h4v1h-4zM2 12h4v1h-4zM10 12h4v1h-4zM2 13h4v1h-4zM10 13h4v1h-4z'/%3E%3C/svg%3E");--kit-icon-menu:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 3h12v1h-12zM2 4h12v1h-12zM2 7h12v1h-12zM2 8h12v1h-12zM2 11h12v1h-12zM2 12h12v1h-12z'/%3E%3C/svg%3E");--kit-icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 2h2v1h-2zM12 2h2v1h-2zM2 3h3v1h-3zM11 3h3v1h-3zM3 4h3v1h-3zM10 4h3v1h-3zM4 5h3v1h-3zM9 5h3v1h-3zM5 6h6v1h-6zM6 7h4v1h-4zM6 8h4v1h-4zM5 9h6v1h-6zM4 10h3v1h-3zM9 10h3v1h-3zM3 11h3v1h-3zM10 11h3v1h-3zM2 12h3v1h-3zM11 12h3v1h-3zM2 13h2v1h-2zM12 13h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-chevron-down:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M3 5h2v1h-2zM11 5h2v1h-2zM3 6h3v1h-3zM10 6h3v1h-3zM4 7h3v1h-3zM9 7h3v1h-3zM5 8h6v1h-6zM6 9h4v1h-4zM7 10h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-chevron-right:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 3h2v1h-2zM5 4h3v1h-3zM6 5h3v1h-3zM7 6h3v1h-3zM8 7h3v1h-3zM8 8h3v1h-3zM7 9h3v1h-3zM6 10h3v1h-3zM5 11h3v1h-3zM5 12h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-arrow-left:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M6 3h2v1h-2zM5 4h3v1h-3zM4 5h3v1h-3zM3 6h3v1h-3zM2 7h12v1h-12zM2 8h12v1h-12zM3 9h3v1h-3zM4 10h3v1h-3zM5 11h3v1h-3zM6 12h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-arrow-right:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M8 3h2v1h-2zM8 4h3v1h-3zM9 5h3v1h-3zM10 6h3v1h-3zM2 7h12v1h-12zM2 8h12v1h-12zM10 9h3v1h-3zM9 10h3v1h-3zM8 11h3v1h-3zM8 12h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-arrow-up:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M7 2h2v1h-2zM6 3h4v1h-4zM5 4h6v1h-6zM4 5h3v1h-3zM9 5h3v1h-3zM3 6h3v1h-3zM7 6h2v1h-2zM10 6h3v1h-3zM2 7h2v1h-2zM7 7h2v1h-2zM12 7h2v1h-2zM7 8h2v1h-2zM7 9h2v1h-2zM7 10h2v1h-2zM7 11h2v1h-2zM7 12h2v1h-2zM7 13h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-external:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M9 2h5v1h-5zM11 3h3v1h-3zM10 4h4v1h-4zM2 5h5v1h-5zM9 5h3v1h-3zM13 5h1v1h-1zM2 6h1v1h-1zM8 6h3v1h-3zM2 7h1v1h-1zM7 7h3v1h-3zM2 8h1v1h-1zM6 8h3v1h-3zM2 9h1v1h-1zM7 9h1v1h-1zM12 9h1v1h-1zM2 10h1v1h-1zM12 10h1v1h-1zM2 11h1v1h-1zM12 11h1v1h-1zM2 12h11v1h-11z'/%3E%3C/svg%3E");--kit-icon-copy:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 2h9v1h-9zM5 3h1v1h-1zM13 3h1v1h-1zM2 4h9v1h-9zM13 4h1v1h-1zM2 5h1v1h-1zM10 5h1v1h-1zM13 5h1v1h-1zM2 6h1v1h-1zM4 6h5v1h-5zM10 6h1v1h-1zM13 6h1v1h-1zM2 7h1v1h-1zM10 7h1v1h-1zM13 7h1v1h-1zM2 8h1v1h-1zM4 8h4v1h-4zM10 8h1v1h-1zM13 8h1v1h-1zM2 9h1v1h-1zM10 9h4v1h-4zM2 10h1v1h-1zM4 10h5v1h-5zM10 10h1v1h-1zM2 11h1v1h-1zM10 11h1v1h-1zM2 12h9v1h-9z'/%3E%3C/svg%3E");--kit-icon-check:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M12 3h2v1h-2zM11 4h3v1h-3zM10 5h3v1h-3zM9 6h3v1h-3zM2 7h2v1h-2zM8 7h3v1h-3zM2 8h3v1h-3zM7 8h3v1h-3zM3 9h6v1h-6zM4 10h4v1h-4zM5 11h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-hash:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 2h2v1h-2zM10 2h2v1h-2zM5 3h2v1h-2zM10 3h2v1h-2zM2 4h12v1h-12zM2 5h12v1h-12zM4 6h2v1h-2zM9 6h2v1h-2zM4 7h2v1h-2zM9 7h2v1h-2zM4 8h2v1h-2zM9 8h2v1h-2zM1 9h12v1h-12zM1 10h12v1h-12zM3 11h2v1h-2zM8 11h2v1h-2zM3 12h2v1h-2zM8 12h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-globe:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 1h6v1h-6zM3 2h2v1h-2zM7 2h2v1h-2zM11 2h2v1h-2zM2 3h1v1h-1zM6 3h1v1h-1zM9 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM5 4h1v1h-1zM10 4h1v1h-1zM13 4h1v1h-1zM1 5h14v1h-14zM1 6h1v1h-1zM5 6h1v1h-1zM10 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM5 7h1v1h-1zM10 7h1v1h-1zM14 7h1v1h-1zM1 8h1v1h-1zM5 8h1v1h-1zM10 8h1v1h-1zM14 8h1v1h-1zM1 9h14v1h-14zM2 10h1v1h-1zM5 10h1v1h-1zM10 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM6 11h1v1h-1zM9 11h1v1h-1zM13 11h1v1h-1zM3 12h2v1h-2zM7 12h2v1h-2zM11 12h2v1h-2zM5 13h6v1h-6z'/%3E%3C/svg%3E");--kit-icon-edit:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M11 1h2v1h-2zM10 2h4v1h-4zM9 3h1v1h-1zM11 3h3v1h-3zM8 4h1v1h-1zM12 4h1v1h-1zM7 5h1v1h-1zM11 5h1v1h-1zM6 6h1v1h-1zM10 6h1v1h-1zM5 7h1v1h-1zM9 7h1v1h-1zM4 8h1v1h-1zM8 8h1v1h-1zM3 9h1v1h-1zM7 9h1v1h-1zM3 10h2v1h-2zM6 10h1v1h-1zM3 11h3v1h-3zM2 12h12v1h-12z'/%3E%3C/svg%3E");--kit-icon-history:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 1h6v1h-6zM3 2h2v1h-2zM11 2h2v1h-2zM2 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM7 4h1v1h-1zM13 4h1v1h-1zM1 5h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1zM1 6h1v1h-1zM7 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM7 7h4v1h-4zM14 7h1v1h-1zM1 8h1v1h-1zM14 8h1v1h-1zM1 9h1v1h-1zM14 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM3 12h2v1h-2zM11 12h2v1h-2zM5 13h6v1h-6z'/%3E%3C/svg%3E");--kit-icon-heart:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%233a0a0a' d='M2 2h3v1h-3zM9 2h3v1h-3zM1 3h1v1h-1zM5 3h1v1h-1zM8 3h1v1h-1zM12 3h1v1h-1zM0 4h1v1h-1zM6 4h2v1h-2zM13 4h1v1h-1zM0 5h1v1h-1zM13 5h1v1h-1zM0 6h1v1h-1zM13 6h1v1h-1zM1 7h1v1h-1zM12 7h1v1h-1zM2 8h1v1h-1zM11 8h1v1h-1zM3 9h1v1h-1zM10 9h1v1h-1zM4 10h1v1h-1zM9 10h1v1h-1zM5 11h1v1h-1zM8 11h1v1h-1zM6 12h2v1h-2z'/%3E%3Cpath fill='%23d23b3b' d='M2 3h3v1h-3zM9 3h3v1h-3zM1 4h1v1h-1zM3 4h3v1h-3zM8 4h4v1h-4zM1 5h1v1h-1zM3 5h9v1h-9zM1 6h11v1h-11zM2 7h9v1h-9zM3 8h7v1h-7zM4 9h5v1h-5zM5 10h3v1h-3zM6 11h1v1h-1z'/%3E%3Cpath fill='%23ffb3b3' d='M2 4h1v1h-1zM2 5h1v1h-1z'/%3E%3Cpath fill='%239e1f1f' d='M12 4h1v1h-1zM12 5h1v1h-1zM12 6h1v1h-1zM11 7h1v1h-1zM10 8h1v1h-1zM9 9h1v1h-1zM8 10h1v1h-1zM7 11h1v1h-1z'/%3E%3C/svg%3E")}.px-corners,.mc-btn,.mc-icon-btn,.mc-kbd,.mc-input,.px-card,.kit-slot,.hotbar{--px-border:var(--color-line-strong);--px-ring-color:transparent;box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border), 0 calc(var(--px) * -2) 0 0 var(--px-ring-color), 0 calc(var(--px) * 2) 0 0 var(--px-ring-color), calc(var(--px) * -2) 0 0 0 var(--px-ring-color), calc(var(--px) * 2) 0 0 0 var(--px-ring-color), var(--px-bevel,0 0 #0000), var(--px-drop,0 0 #0000)}.px-corners:focus-visible,.mc-btn:focus-visible,.mc-icon-btn:focus-visible,.mc-input:focus-within,.px-card:focus-visible,.kit-slot:focus-visible,.hotbar>:focus-visible,.px-focus:focus-visible{--px-ring-color:var(--color-focus);outline:none}.mc-btn{--mc-btn-bg:#ebe5d6;--mc-btn-bg-hover:#f3eee2;--mc-btn-ink:var(--color-ink);--px-border:#2a343c;--px-bevel:inset 0 var(--px) 0 0 #ffffffbf, inset 0 calc(var(--px) * -2) 0 0 #3c301e29;min-height:2.5rem;margin:var(--px);font-family:var(--font-sans);letter-spacing:.005em;white-space:nowrap;color:var(--mc-btn-ink);background:var(--mc-btn-bg);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s var(--ease-soft), transform 60ms linear;justify-content:center;align-items:center;gap:.5rem;padding:.5rem 1.125rem .625rem;font-size:.9375rem;font-weight:600;line-height:1.2;display:inline-flex;position:relative}.mc-btn:hover{background:var(--mc-btn-bg-hover)}.mc-btn:active,.mc-btn[aria-pressed=true]{transform:translateY(var(--px));--px-bevel:inset 0 var(--px) 0 0 #3c301e2e}.mc-btn:disabled,.mc-btn[aria-disabled=true]{cursor:not-allowed;opacity:.55;transform:none}.mc-btn>svg{flex:none}.mc-btn-primary{--mc-btn-bg:var(--color-primary-strong);--mc-btn-bg-hover:#43804f;--mc-btn-ink:var(--color-on-primary);--px-border:#183520;--px-bevel:inset 0 var(--px) 0 0 #ffffff47, inset 0 calc(var(--px) * -2) 0 0 #0000003d;text-shadow:0 1px #0000002e}.mc-btn-primary:active,.mc-btn-primary[aria-pressed=true]{--px-bevel:inset 0 var(--px) 0 0 #00000040}.mc-btn-ghost{--mc-btn-bg:transparent;--mc-btn-bg-hover:#1f2a3312}@supports (color:color-mix(in lab, red, red)){.mc-btn-ghost{--mc-btn-bg-hover:color-mix(in srgb, var(--color-ink) 7%, transparent)}}.mc-btn-ghost{--px-border:transparent;--px-bevel:none}.mc-btn-ghost:hover{--px-border:var(--color-line-strong)}.mc-btn-ghost:active{--px-bevel:none}.mc-btn-sm{min-height:2rem;padding:.3125rem .75rem .4375rem;font-size:.8125rem}.mc-btn-lg{min-height:3rem;padding:.75rem 1.5rem .875rem;font-size:1rem}.dark .mc-btn{--mc-btn-bg:#22384c;--mc-btn-bg-hover:#2a4560;--px-border:#04090e;--px-bevel:inset 0 var(--px) 0 0 #ffffff1f, inset 0 calc(var(--px) * -2) 0 0 #00000061}.dark .mc-btn:active,.dark .mc-btn[aria-pressed=true]{--px-bevel:inset 0 var(--px) 0 0 #0006}.dark .mc-btn-primary{--mc-btn-bg:var(--color-primary);--mc-btn-bg-hover:#82cc85;--mc-btn-ink:#0b1a10;--px-border:#06120a;--px-bevel:inset 0 var(--px) 0 0 #ffffff52, inset 0 calc(var(--px) * -2) 0 0 #00000047;text-shadow:none}.dark .mc-btn-ghost{--mc-btn-bg:transparent;--mc-btn-bg-hover:#ffffff12;--px-border:transparent;--px-bevel:none}.dark .mc-btn-ghost:hover{--px-border:var(--color-line-strong)}.mc-icon-btn{--px-border:transparent;width:2.25rem;height:2.25rem;margin:var(--px);color:var(--color-muted);cursor:pointer;background:0 0;place-items:center;transition:color .15s,background-color .15s;display:inline-grid}.mc-icon-btn:hover{color:var(--color-ink);background:#1f2a3312}@supports (color:color-mix(in lab, red, red)){.mc-icon-btn:hover{background:color-mix(in srgb, var(--color-ink) 7%, transparent)}}.mc-icon-btn:hover{--px-border:var(--color-line-strong)}.mc-icon-btn:active{transform:translateY(1px)}.mc-icon-btn[aria-expanded=true]{color:var(--color-ink);background:#1f2a3317}@supports (color:color-mix(in lab, red, red)){.mc-icon-btn[aria-expanded=true]{background:color-mix(in srgb, var(--color-ink) 9%, transparent)}}.mc-icon-btn[aria-expanded=true]{--px-border:var(--color-line-strong)}.mc-input{--px-border:var(--color-line-strong);--px-bevel:inset 0 var(--px) 0 0 #1f2a3312}@supports (color:color-mix(in lab, red, red)){.mc-input{--px-bevel:inset 0 var(--px) 0 0 color-mix(in srgb, var(--color-ink) 7%, transparent)}}.mc-input{margin:var(--px);background:var(--color-surface);min-height:2.5rem;color:var(--color-ink);align-items:center;gap:.5rem;padding:0 .75rem;display:flex}.mc-input input{min-width:0;font:inherit;color:inherit;background:0 0;border:0;outline:none;flex:1}.mc-input input::placeholder{color:var(--color-faint)}.mc-kbd{--px-border:var(--color-line-strong);--px-bevel:inset 0 calc(var(--px) * -2) 0 0 #1f2a3324}@supports (color:color-mix(in lab, red, red)){.mc-kbd{--px-bevel:inset 0 calc(var(--px) * -2) 0 0 color-mix(in srgb, var(--color-ink) 14%, transparent)}}.mc-kbd{min-width:1.5rem;height:1.5rem;margin:0 var(--px);font-family:var(--font-mono);color:var(--color-ink);background:var(--color-surface);vertical-align:middle;justify-content:center;align-items:center;padding:0 .375rem .125rem;font-size:.75rem;font-weight:500;line-height:1;display:inline-flex}.px-card{--px-border:var(--color-line);--px-drop:0 calc(var(--px) * 3) 0 0 #1f2a3312}@supports (color:color-mix(in lab, red, red)){.px-card{--px-drop:0 calc(var(--px) * 3) 0 0 color-mix(in srgb, var(--color-ink) 7%, transparent)}}.px-card{margin:var(--px);background:var(--color-surface);transition:transform .18s var(--ease-soft), background-color .2s;position:relative}a.px-card:hover,.px-card[data-interactive]:hover{--px-border:#729870}@supports (color:color-mix(in lab, red, red)){a.px-card:hover,.px-card[data-interactive]:hover{--px-border:color-mix(in srgb, var(--color-primary) 70%, var(--color-line-strong))}}a.px-card:hover,.px-card[data-interactive]:hover{--px-drop:0 calc(var(--px) * 4) 0 0 #4f8a5b38}@supports (color:color-mix(in lab, red, red)){a.px-card:hover,.px-card[data-interactive]:hover{--px-drop:0 calc(var(--px) * 4) 0 0 color-mix(in srgb, var(--color-primary) 22%, transparent)}}a.px-card:hover,.px-card[data-interactive]:hover{transform:translateY(calc(var(--px) * -1))}.kit-slot{--px-border:#c2c1b8}@supports (color:color-mix(in lab, red, red)){.kit-slot{--px-border:color-mix(in srgb, var(--color-ink) 22%, var(--color-surface-2))}}.kit-slot{--px-bevel:inset var(--px) var(--px) 0 0 #1f2a331f, inset calc(var(--px) * -1) calc(var(--px) * -1) 0 0 #ffffff8c}@supports (color:color-mix(in lab, red, red)){.kit-slot{--px-bevel:inset var(--px) var(--px) 0 0 color-mix(in srgb, var(--color-ink) 12%, transparent), inset calc(var(--px) * -1) calc(var(--px) * -1) 0 0 #ffffff8c}}.kit-slot{width:2.75rem;height:2.75rem;margin:var(--px);background:#ece6d5;place-items:center;display:inline-grid}@supports (color:color-mix(in lab, red, red)){.kit-slot{background:color-mix(in srgb, var(--color-surface-3) 80%, var(--color-surface))}}.dark .kit-slot{--px-border:#06101a;--px-bevel:inset var(--px) var(--px) 0 0 #0006, inset calc(var(--px) * -1) calc(var(--px) * -1) 0 0 #ffffff12;background:#12212f}.hotbar{--px-border:#938e81}@supports (color:color-mix(in lab, red, red)){.hotbar{--px-border:color-mix(in srgb, var(--color-ink) 30%, var(--color-line-strong))}}.hotbar{--px-bevel:inset 0 var(--px) 0 0 #1f2a330f}@supports (color:color-mix(in lab, red, red)){.hotbar{--px-bevel:inset 0 var(--px) 0 0 color-mix(in srgb, var(--color-ink) 6%, transparent)}}.hotbar{align-items:stretch;gap:var(--px);margin:var(--px);padding:var(--px);background:#e1ddd1;flex-wrap:wrap;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.hotbar{background:color-mix(in srgb, var(--color-ink) 7%, var(--color-surface-2))}}.hotbar{max-width:calc(100% - var(--px) * 2)}.hotbar>a,.hotbar>button,.hotbar>[role=tab],.hotbar>.hotbar-slot{--px-border:transparent;color:#303b44;justify-content:center;align-items:center;gap:.4rem;min-width:2rem;min-height:2rem;padding:.3125rem .75rem;font-size:.8125rem;font-weight:500;line-height:1.3;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.hotbar>a,.hotbar>button,.hotbar>[role=tab],.hotbar>.hotbar-slot{color:color-mix(in srgb, var(--color-ink) 72%, var(--color-muted))}}.hotbar>a,.hotbar>button,.hotbar>[role=tab],.hotbar>.hotbar-slot{cursor:pointer;box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border), 0 calc(var(--px) * -2) 0 0 var(--px-ring-color,transparent), 0 calc(var(--px) * 2) 0 0 var(--px-ring-color,transparent), calc(var(--px) * -2) 0 0 0 var(--px-ring-color,transparent), calc(var(--px) * 2) 0 0 0 var(--px-ring-color,transparent);background:0 0;transition:color .12s,background-color .12s}.hotbar>:hover{color:var(--color-ink);background:#fffdf7b3}@supports (color:color-mix(in lab, red, red)){.hotbar>:hover{background:color-mix(in srgb, var(--color-surface) 70%, transparent)}}.hotbar>[aria-selected=true],.hotbar>[aria-current=page],.hotbar>[aria-pressed=true],.hotbar>.is-active{--px-border:var(--color-ink);z-index:1;color:var(--color-ink);background:var(--color-surface);outline:var(--px) solid var(--color-surface);outline-offset:calc(var(--px) * -2);font-weight:600}.dark .hotbar{--px-border:#05101a;background:#0b1824}.dark .hotbar>[aria-selected=true],.dark .hotbar>[aria-current=page],.dark .hotbar>[aria-pressed=true],.dark .hotbar>.is-active{--px-border:#dfe7ee;background:#1d3246;outline-color:#0b1824}.hotbar-pixel>a,.hotbar-pixel>button,.hotbar-pixel>.hotbar-slot{font-family:var(--font-pixel);min-width:2.25rem;padding-inline:.5rem;font-size:.75rem}.mc-tooltip{--mc-tip-bg:#100010f2;max-width:22rem;margin:var(--px);color:#f4f0ff;background:var(--mc-tip-bg);box-shadow:0 calc(var(--px) * -1) 0 0 var(--mc-tip-bg), 0 var(--px) 0 0 var(--mc-tip-bg), calc(var(--px) * -1) 0 0 0 var(--mc-tip-bg), var(--px) 0 0 0 var(--mc-tip-bg), 0 10px 24px -8px #00000073;text-shadow:1px 1px #28003c99;padding:.4375rem .625rem .5rem;font-size:.8125rem;font-weight:500;line-height:1.4;display:inline-block;position:relative}.mc-tooltip:before{content:"";border:var(--px) solid transparent;pointer-events:none;border-image:linear-gradient(#7030ffd9,#380096bf) 1;position:absolute;inset:0}.mc-tooltip-title{color:#fff;font-weight:600;display:block}.mc-tooltip-lore{color:#b9b4c8;display:block}.mc-tooltip-enchant{color:#c8b6ff;display:block}.grass-divider{background-image:var(--kit-grass-strip);width:100%;height:16px;image-rendering:pixelated;background-repeat:repeat-x;background-size:32px 16px;border:0;margin:0;display:block}.grass-divider-thin{background-size:16px 8px;height:8px}.px-dot{width:calc(var(--px) * 3);height:calc(var(--px) * 3);box-shadow:var(--px) var(--px) 0 0 currentColor;background:currentColor;display:inline-block}@supports (color:color-mix(in lab, red, red)){.px-dot{box-shadow:var(--px) var(--px) 0 0 color-mix(in srgb, currentColor 45%, transparent)}}.pixelated,.kit-pixel-icon{image-rendering:pixelated;shape-rendering:crispedges}.kit-backdrop{z-index:0;pointer-events:none;contain:strict;background:var(--color-canvas);position:fixed;inset:0;overflow:hidden}.kit-backdrop>div{position:absolute}.kit-backdrop-dabs{animation:var(--animate-kit-drift);will-change:transform;background:radial-gradient(28% 22% at 6% 10%,#4f8a5b33,#0000 70%),radial-gradient(20% 16% at 16% 4%,#9a86c22b,#0000 72%),radial-gradient(24% 20% at 94% 8%,#3e6e8e2b,#0000 70%),radial-gradient(16% 12% at 82% 2%,#e9c46a3d,#0000 72%),radial-gradient(14% 11% at 70% 14%,#d98a9e1f,#0000 72%),radial-gradient(26% 20% at 2% 92%,#3e6e8e1f,#0000 72%),radial-gradient(24% 22% at 98% 96%,#4f8a5b24,#0000 72%),radial-gradient(14% 12% at 88% 70%,#9a86c21a,#0000 72%);inset:-12%}.dark .kit-backdrop-dabs{background:radial-gradient(26% 20% at 88% 6%,#f08a4b33,#0000 70%),radial-gradient(14% 10% at 84% 3%,#f5b26b2e,#0000 70%),radial-gradient(30% 24% at 8% 8%,#3f7f8c38,#0000 72%),radial-gradient(22% 18% at 40% 0,#7d6f9e33,#0000 72%),radial-gradient(28% 22% at 4% 94%,#3f7f8c29,#0000 72%),radial-gradient(22% 18% at 96% 92%,#7d6f9e29,#0000 72%),radial-gradient(12% 10% at 92% 62%,#f08a4b12,#0000 72%)}.kit-backdrop-scene{z-index:0;pointer-events:none;height:var(--kit-scene-height,21rem);background-image:var(--kit-paint-lilies);opacity:var(--kit-scene-opacity,.3);background-position:50% 35%;background-size:cover;position:absolute;top:0;left:0;right:0;-webkit-mask-image:linear-gradient(#000 0%,#000000bf 30%,#00000040 62%,#0000 100%);mask-image:linear-gradient(#000 0%,#000000bf 30%,#00000040 62%,#0000 100%)}.dark .kit-backdrop-scene{background-image:var(--kit-paint-sunrise);opacity:var(--kit-scene-opacity-dark,.42)}.kit-backdrop-brush{background-image:var(--kit-brush);mix-blend-mode:soft-light;opacity:.28;background-size:256px 256px;inset:0}.dark .kit-backdrop-brush{opacity:.22}.kit-backdrop-grain{background-image:var(--kit-grain);opacity:.05;mix-blend-mode:multiply;background-size:180px 180px;inset:0}.dark .kit-backdrop-grain{mix-blend-mode:screen;opacity:.035}.kit-above-backdrop{z-index:1;position:relative}.kit-canvas-surface{background:#f7f3e8f0}@supports (color:color-mix(in lab, red, red)){.kit-canvas-surface{background:color-mix(in srgb, var(--color-canvas) 94%, transparent)}}.kit-painted{isolation:isolate;position:relative;overflow:hidden}.kit-painted:before,.kit-painted:after{content:"";z-index:-1;pointer-events:none;position:absolute;inset:0}.kit-painted:before{background:radial-gradient(60% 80% at 0 0,#4f8a5b33,#0000 70%),radial-gradient(50% 70% at 100% 0,#9a86c233,#0000 70%),radial-gradient(60% 80% at 100% 100%,#3e6e8e2e,#0000 70%),radial-gradient(50% 60% at 10% 100%,#e9c46a2e,#0000 70%)}@supports (color:color-mix(in lab, red, red)){.kit-painted:before{background:radial-gradient(60% 80% at 0% 0%, color-mix(in srgb, var(--color-primary) 20%, transparent), transparent 70%), radial-gradient(50% 70% at 100% 0%, color-mix(in srgb, var(--color-accent-2) 20%, transparent), transparent 70%), radial-gradient(60% 80% at 100% 100%, color-mix(in srgb, var(--color-accent-1) 18%, transparent), transparent 70%), radial-gradient(50% 60% at 10% 100%, color-mix(in srgb, var(--color-accent-4) 18%, transparent), transparent 70%)}}.kit-painted:after{background:var(--kit-brush) 0 0 / 256px 256px;mix-blend-mode:soft-light;opacity:.3}.kit-hero{isolation:isolate;background:var(--color-canvas);position:relative;overflow:hidden}.kit-hero-art{z-index:-2;position:absolute;inset:0}.kit-hero-art svg{width:100%;height:100%;display:block;position:absolute;inset:0}.kit-hero-art .kit-scene-dark,.dark .kit-hero-art .kit-scene-light{display:none}.dark .kit-hero-art .kit-scene-dark{display:block}.kit-hero-art .kit-scene-glints{animation:7s ease-in-out infinite alternate kit-glint}.kit-hero-art .kit-scene-sun{animation:9s ease-in-out infinite alternate kit-glint}.kit-hero-brush{z-index:-1;background-image:var(--kit-brush);mix-blend-mode:soft-light;opacity:.5;pointer-events:none;background-size:256px 256px;position:absolute;inset:0}.kit-hero-scrim{z-index:-1;background:linear-gradient(90deg, var(--color-canvas) 0%, #f7f3e8f0 30%, #f7f3e88c 50%, transparent 68%);position:absolute;inset:0}@supports (color:color-mix(in lab, red, red)){.kit-hero-scrim{background:linear-gradient(90deg, var(--color-canvas) 0%, color-mix(in srgb, var(--color-canvas) 94%, transparent) 30%, color-mix(in srgb, var(--color-canvas) 55%, transparent) 50%, transparent 68%)}}.kit-hero-scrim{pointer-events:none}@media (width<=960px){.kit-hero-art,.kit-hero-brush{height:var(--kit-hero-band,clamp(15rem, 64vw, 24rem));inset:0 0 auto}.kit-hero-scrim{height:var(--kit-hero-band,clamp(15rem, 64vw, 24rem));background:linear-gradient(180deg, transparent 0%, transparent 55%, #f7f3e8b3 82%, var(--color-canvas) 100%);inset:0 0 auto}@supports (color:color-mix(in lab, red, red)){.kit-hero-scrim{background:linear-gradient(180deg, transparent 0%, transparent 55%, color-mix(in srgb, var(--color-canvas) 70%, transparent) 82%, var(--color-canvas) 100%)}}}.kit-hero-horizon{z-index:1;position:absolute;bottom:0;left:0;right:0}.dark .grass-divider{filter:brightness(.78)saturate(.9)}.kit-item-frame{--px-border:#3b2412;--px-bevel:inset 0 0 0 calc(var(--px) * 3) #8a5a33, inset 0 0 0 calc(var(--px) * 4) #5e3b1f, inset calc(var(--px) * 3) calc(var(--px) * 3) 0 calc(var(--px) * 3) #ffffff14;background:#efe2cd;place-items:center;padding:1.25rem;display:grid}@supports (color:color-mix(in lab, red, red)){.kit-item-frame{background:color-mix(in srgb, #c9a46a 30%, var(--color-surface))}}.kit-item-frame{box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border), var(--px-bevel), 0 18px 40px -16px #00000073}.kit-shell{flex-direction:column;min-height:100dvh;display:flex}.kit-shell>main,.kit-shell>.kit-main{flex:1 0 auto}.kit-shell>.kit-footer{flex:none}.kit-menu{position:relative}.kit-menu>summary{cursor:pointer;list-style:none}.kit-menu>summary::-webkit-details-marker{display:none}.kit-menu-chevron{opacity:.7;width:12px;height:12px;transition:transform .18s var(--ease-pixel);flex:none}.kit-menu[open]>summary .kit-menu-chevron{transform:rotate(180deg)}.kit-menu-trigger{gap:.375rem;width:auto;min-width:2.25rem;padding:0 .5rem;font-size:.8125rem;font-weight:500;display:inline-flex}.kit-menu-trigger-label{white-space:nowrap}.kit-menu-panel{--px-border:var(--color-line-strong);z-index:70;min-width:11rem;max-height:min(70vh,32rem);color:var(--color-ink);background:var(--color-surface);box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border), var(--shadow-float);animation:kit-menu-in .14s var(--ease-soft);padding:.375rem;position:absolute;top:calc(100% + .5rem);right:0;overflow-y:auto}.kit-menu-item{color:var(--color-ink);white-space:nowrap;justify-content:space-between;align-items:center;gap:.75rem;padding:.5rem .625rem;font-size:.875rem;text-decoration:none;display:flex}.kit-menu-item:hover,.kit-menu-item:focus-visible{background:#1f2a3312}@supports (color:color-mix(in lab, red, red)){.kit-menu-item:hover,.kit-menu-item:focus-visible{background:color-mix(in srgb, var(--color-ink) 7%, transparent)}}.kit-menu-item:hover,.kit-menu-item:focus-visible{outline:none}.kit-menu-item.is-active{color:var(--color-primary-strong);background:var(--color-primary-soft);font-weight:600}.dark .kit-menu-item.is-active{color:var(--color-primary)}.kit-menu-check{flex:none}.kit-theme-toggle .kit-theme-icon,.kit-theme-tip .kit-theme-state{display:none}:root[data-theme-pref=light] .kit-theme-toggle .kit-theme-icon-light,:root[data-theme-pref=dark] .kit-theme-toggle .kit-theme-icon-dark,:root[data-theme-pref=system] .kit-theme-toggle .kit-theme-icon-system,:root:not([data-theme-pref]) .kit-theme-toggle .kit-theme-icon-system{display:block}:root[data-theme-pref=light] .kit-theme-tip .kit-theme-state-light,:root[data-theme-pref=dark] .kit-theme-tip .kit-theme-state-dark,:root[data-theme-pref=system] .kit-theme-tip .kit-theme-state-system,:root:not([data-theme-pref]) .kit-theme-tip .kit-theme-state-system{display:inline}.kit-theme-toggle-host{vertical-align:middle}.kit-gbar{--gbar-bg:#16222c;--gbar-ink:#e3eaef;--gbar-muted:#b4c2cd;z-index:60;height:var(--spacing-globalbar);color:var(--gbar-ink);background:linear-gradient(90deg, #4f8a5b29, transparent 22%, transparent 78%, #3e6e8e2e), var(--gbar-bg);border-bottom:1px solid #00000040;font-size:.8125rem;line-height:1;position:relative}.dark .kit-gbar{--gbar-bg:#08111a;background:linear-gradient(90deg, #3f7f8c24, transparent 25%, transparent 72%, #f08a4b1a), var(--gbar-bg);border-bottom-color:#ffffff0d}.kit-gbar-inner{align-items:center;gap:1.25rem;max-width:90rem;height:100%;margin:0 auto;padding:0 1rem;display:flex}@media (width>=640px){.kit-gbar-inner{padding:0 1.5rem}}.kit-gbar-brand{color:#fff;align-items:center;gap:.5rem;height:100%;text-decoration:none;display:inline-flex}.kit-gbar-brand-text{font-family:var(--font-pixel);letter-spacing:.04em;font-size:.8125rem}.kit-gbar-brand:hover .kit-gbar-brand-text{color:#c9f0a8}.kit-gbar-nav{height:100%}.kit-gbar-nav>ul{align-items:stretch;gap:.125rem;height:100%;margin:0;padding:0;list-style:none;display:flex}.kit-gbar-nav>ul>li{display:flex;position:relative}.kit-gbar-link{height:var(--spacing-globalbar);color:var(--gbar-muted);white-space:nowrap;align-items:center;gap:.3rem;padding:0 .625rem;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex;position:relative}.kit-gbar-link:hover,.kit-menu[open]>.kit-gbar-link,.kit-gbar-link[aria-current=page]{color:#fff}.kit-gbar-link[aria-current=page]:after{content:"";background:var(--color-mc-grass);height:3px;position:absolute;bottom:0;left:.625rem;right:.625rem;box-shadow:0 -1px #8fd45e}.kit-gbar-docs .kit-menu-panel{width:min(34rem,100vw - 2rem);padding:.5rem;left:-.5rem;right:auto}.kit-gbar-docs-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.25rem;display:grid}.kit-gbar-docs-item{color:var(--color-ink);align-items:center;gap:.75rem;padding:.5rem;line-height:1.3;text-decoration:none;display:flex}.kit-gbar-docs-item:hover,.kit-gbar-docs-item:focus-visible{background:#1f2a330f}@supports (color:color-mix(in lab, red, red)){.kit-gbar-docs-item:hover,.kit-gbar-docs-item:focus-visible{background:color-mix(in srgb, var(--color-ink) 6%, transparent)}}.kit-gbar-docs-item:hover,.kit-gbar-docs-item:focus-visible{outline:none}.kit-gbar-docs-item[aria-current=page]{background:var(--color-primary-soft)}.kit-gbar-docs-slot{flex:none;width:2.25rem;height:2.25rem}.kit-gbar-docs-text{overflow-wrap:anywhere;flex-direction:column;gap:.2rem;min-width:0;display:flex}.kit-gbar-docs-name{font-size:.875rem;font-weight:650}.kit-gbar-docs-blurb{color:var(--color-muted);font-size:.75rem}.kit-gbar-end{align-items:center;gap:.25rem;margin-left:auto;display:flex}.kit-gbar-icon{width:2rem;height:2rem;color:var(--gbar-muted);place-items:center;text-decoration:none;transition:color .12s,background-color .12s;display:inline-grid}.kit-gbar-icon:hover,.kit-menu[open]>.kit-gbar-icon{color:#fff;background:#ffffff14}.kit-gbar .mc-icon-btn{color:var(--gbar-muted);width:2rem;height:2rem}.kit-gbar .mc-icon-btn:hover{color:#fff;--px-border:#ffffff29;background:#ffffff14}.kit-gbar-more{display:none}.kit-gbar-more-panel{width:min(22rem,100vw - 1.5rem);padding:.5rem}.kit-gbar-more-panel .kit-gbar-docs-grid{grid-template-columns:1fr}.kit-gbar-more-link{color:var(--color-ink);padding:.625rem .75rem;font-size:.9375rem;font-weight:500;text-decoration:none;display:block}.kit-gbar-more-link:hover{background:#1f2a330f}@supports (color:color-mix(in lab, red, red)){.kit-gbar-more-link:hover{background:color-mix(in srgb, var(--color-ink) 6%, transparent)}}.kit-gbar-more-link[aria-current=page]{color:var(--color-primary-strong);font-weight:650}.kit-gbar-more-heading{border-top:1px solid var(--color-line);letter-spacing:.06em;text-transform:uppercase;color:var(--color-muted);margin:.5rem .75rem .25rem;padding-top:.625rem;font-size:.75rem;font-weight:650}@media (width<=860px){.kit-gbar-nav{display:none}.kit-gbar-more{display:block}}.kit-footer{z-index:1;color:#eadfcb;margin-top:5rem;position:relative}.kit-footer .grass-divider{z-index:1;position:relative}.kit-footer-soil{background:linear-gradient(to bottom, #0000002e, transparent 3rem), var(--kit-dirt) 0 0 / 32px 32px;image-rendering:pixelated}.dark .kit-footer-soil{background:linear-gradient(to bottom, #00000040, transparent 3rem), var(--kit-dirt-dark) 0 0 / 32px 32px}.kit-footer-soil>*{image-rendering:auto}.kit-footer-inner{grid-template-columns:minmax(0,2fr) repeat(3,minmax(0,1fr));gap:2.5rem;max-width:80rem;margin:0 auto;padding:3rem 1.5rem 2.5rem;display:grid}@media (width<=860px){.kit-footer-inner{grid-template-columns:repeat(2,minmax(0,1fr));gap:2rem}.kit-footer-brand{grid-column:1/-1}}@media (width<=480px){.kit-footer-inner{padding:2.5rem 1rem 2rem}}.kit-footer-logo{color:#fff;font-family:var(--font-pixel);letter-spacing:.04em;align-items:center;gap:.75rem;font-size:1.125rem;text-decoration:none;display:inline-flex}.kit-footer-tagline{color:#d8c9b0;max-width:26rem;margin:1rem 0 1.25rem;font-size:.875rem;line-height:1.6}.kit-footer-social{flex-wrap:wrap;gap:.5rem;margin:0;padding:0;list-style:none;display:flex}.kit-footer-social-link{--px-border:#eadfcb38;width:2.25rem;height:2.25rem;margin:var(--px);color:#eadfcb;box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border);background:#0000002e;place-items:center;transition:background-color .12s,color .12s;display:inline-grid}.kit-footer-social-link:hover{color:#fff;--px-border:#8fd45e;background:#5da13059}.kit-footer-social-link:focus-visible{outline:var(--px) solid var(--color-mc-diamond);outline-offset:3px}.kit-footer-heading{letter-spacing:.08em;text-transform:uppercase;color:#c9f0a8;margin:.25rem 0 .875rem;font-size:.75rem;font-weight:650}.kit-footer-col ul{margin:0;padding:0;list-style:none}.kit-footer-col li{margin:.5rem 0}.kit-footer-col a{overflow-wrap:anywhere;color:#e0d3bc;font-size:.875rem;text-decoration:none}.kit-footer-col a:hover{color:#fff;text-underline-offset:.2em;text-decoration:underline}.kit-footer a:focus-visible{outline:var(--px) solid var(--color-mc-diamond);outline-offset:2px}.kit-footer-legal{background:#00000029;border-top:1px solid #eadfcb1a}.kit-footer-legal-inner{color:#cdbd9f;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1.5rem;padding-top:1rem;padding-bottom:1rem;font-size:.8125rem;display:flex}.kit-footer-legal-inner p{margin:0}.kit-footer-extra{color:#cdbd9f}.kit-footer-extra a{color:#eadfcb}.kit-footer-sep{opacity:.6;margin:0 .5rem}.kit-badge{--badge:var(--color-mc-stone);--badge-ink:#4b5258;margin:var(--px);white-space:nowrap;vertical-align:middle;color:var(--badge-ink);background:var(--badge);align-items:center;gap:.3rem;padding:.125rem .5rem;font-size:.75rem;font-weight:600;line-height:1.2rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.kit-badge{background:color-mix(in srgb, var(--badge) 14%, var(--color-surface))}}.kit-badge{box-shadow:0 calc(var(--px) * -1) 0 0 var(--badge), 0 var(--px) 0 0 var(--badge), calc(var(--px) * -1) 0 0 0 var(--badge), var(--px) 0 0 0 var(--badge)}@supports (color:color-mix(in lab, red, red)){.kit-badge{box-shadow:0 calc(var(--px) * -1) 0 0 color-mix(in srgb, var(--badge) 45%, transparent), 0 var(--px) 0 0 color-mix(in srgb, var(--badge) 45%, transparent), calc(var(--px) * -1) 0 0 0 color-mix(in srgb, var(--badge) 45%, transparent), var(--px) 0 0 0 color-mix(in srgb, var(--badge) 45%, transparent)}}.kit-badge-pixel{font-family:var(--font-pixel);letter-spacing:.04em;text-transform:uppercase;font-size:.625rem;font-weight:400}.kit-badge-grass{--badge:var(--color-mc-grass);--badge-ink:#2f6a14}.kit-badge-diamond{--badge:var(--color-mc-diamond);--badge-ink:#10666b}.kit-badge-gold{--badge:var(--color-mc-gold);--badge-ink:#7a5a00}.kit-badge-redstone{--badge:var(--color-mc-redstone);--badge-ink:#a32121}.kit-badge-enchant{--badge:var(--color-mc-enchant);--badge-ink:#5b32c0}.kit-badge-pond{--badge:var(--color-pond);--badge-ink:#2f5a76}.dark .kit-badge{--badge-ink:#c3ccd3;background:var(--badge)}@supports (color:color-mix(in lab, red, red)){.dark .kit-badge{background:color-mix(in srgb, var(--badge) 16%, var(--color-surface))}}.dark .kit-badge-grass{--badge-ink:#9fdc72}.dark .kit-badge-diamond{--badge-ink:#7eeaef}.dark .kit-badge-gold{--badge-ink:#f5cf5a}.dark .kit-badge-redstone{--badge-ink:#f59a92}.dark .kit-badge-enchant{--badge-ink:#c4a9ff}.dark .kit-badge-pond{--badge-ink:#8fc0e6}.kit-tooltip-host{display:inline-flex;position:relative}.kit-tooltip{z-index:80;white-space:normal;opacity:0;visibility:hidden;pointer-events:none;width:max-content;max-width:min(22rem,80vw);transition:opacity .12s steps(3,end),transform .12s steps(3,end),visibility 0s .12s;position:absolute;bottom:calc(100% + .625rem);left:50%;transform:translate(-50%,4px)}.kit-tooltip-host[data-placement=bottom]>.kit-tooltip{top:calc(100% + .625rem);bottom:auto;transform:translate(-50%,-4px)}.kit-tooltip-host[data-align=end]>.kit-tooltip{left:auto;right:0;transform:translateY(4px)}.kit-tooltip-host[data-align=end][data-placement=bottom]>.kit-tooltip{transform:translateY(-4px)}.kit-tooltip-host[data-align=end]:hover>.kit-tooltip,.kit-tooltip-host[data-align=end]:focus-within>.kit-tooltip{transform:none}.kit-tooltip-host:hover>.kit-tooltip,.kit-tooltip-host:focus-within>.kit-tooltip{opacity:1;visibility:visible;transition:opacity .12s steps(3,end),transform .12s steps(3,end);transform:translate(-50%)}.kit-card{min-width:0;max-width:calc(100% - var(--px) * 2);color:var(--color-ink);align-items:flex-start;gap:1rem;padding:1.25rem;text-decoration:none;display:flex}.kit-card-icon{flex:none;width:3.25rem;height:3.25rem}.kit-card-icon img{object-fit:contain;width:2rem;height:2rem}.kit-card-body{overflow-wrap:anywhere;flex-direction:column;flex:auto;gap:.375rem;min-width:0;display:flex}.kit-card-eyebrow{color:var(--color-primary-strong)}.dark .kit-card-eyebrow{color:var(--color-primary)}.kit-card-title{font-size:1.0625rem;font-weight:650;line-height:1.35}.kit-card-desc{overflow-wrap:anywhere;color:var(--color-muted);font-size:.9375rem;line-height:1.6}.kit-card-footer{margin-top:auto}.kit-pagination{justify-content:center;margin:2rem 0;display:flex}.kit-pagination .hotbar-slot.is-disabled{opacity:.35;cursor:default}.kit-pagination .hotbar-slot.is-gap{cursor:default;min-width:1.5rem}.kit-hero-inner{grid-template-columns:minmax(0,1fr);align-items:center;gap:2rem;max-width:80rem;min-height:clamp(26rem,58vh,38rem);margin:0 auto;padding:clamp(3.5rem,7vw,6.5rem) 1.5rem clamp(4.5rem,8vw,7.5rem);display:grid;position:relative}.kit-hero-copy{max-width:40rem}.kit-hero-eyebrow{color:var(--color-primary-strong);align-items:center;gap:.5rem;margin:0 0 1.25rem;display:inline-flex}.dark .kit-hero-eyebrow{color:var(--color-primary)}.kit-hero-title{font-family:var(--font-display);font-optical-sizing:auto;letter-spacing:-.025em;margin:0}.kit-hero-name{color:#0000;background:linear-gradient(115deg,#2f6a3e 0%,#3a7047 30%,#3e6e8e 68%,#6f58a3 100%);-webkit-background-clip:text;background-clip:text;width:fit-content;padding-bottom:.08em;font-size:clamp(2.75rem,1.6rem + 4.6vw,5rem);font-weight:600;line-height:1.02;display:block}.dark .kit-hero-name{background-image:linear-gradient(115deg,#8fd48f 0%,#6fbf73 30%,#6cc3cf 66%,#f5b26b 100%)}.kit-hero-text{color:var(--color-ink);text-wrap:balance;margin-top:.4rem;font-size:clamp(1.625rem,1.1rem + 2vw,2.75rem);font-weight:500;line-height:1.14;display:block}.kit-hero-tagline{max-width:36rem;color:var(--color-muted);text-wrap:pretty;margin:1.375rem 0 0;font-size:1.125rem;line-height:1.65}.kit-hero-actions{flex-wrap:wrap;gap:.875rem;margin-top:2.25rem;display:flex}.kit-hero-badge{align-items:center;gap:1rem;margin-bottom:1.5rem;display:flex}.kit-hero-badge .kit-hero-eyebrow{margin:0}.kit-hero-icon{flex:none;padding:.5rem}.kit-hero-icon img{object-fit:contain;width:3.5rem;height:3.5rem;display:block}@media (width<=960px){.kit-hero-inner{min-height:0;padding-top:calc(var(--kit-hero-band,clamp(15rem, 64vw, 24rem)) - 2.5rem);grid-template-columns:1fr;padding-bottom:4rem}}.kit-static-main{flex:1;place-items:center;padding:4rem 1rem 2rem;display:grid}.kit-static-card{text-align:center;width:min(46rem,100%);padding:2.25rem 2rem 2rem}.kit-static-eyebrow{color:var(--color-primary-strong);margin:0 0 .75rem}.dark .kit-static-eyebrow{color:var(--color-primary)}.kit-static-title{font-family:var(--font-display);letter-spacing:-.02em;color:var(--color-ink);margin:0;font-size:clamp(1.75rem,1.3rem + 1.6vw,2.5rem);font-weight:560;line-height:1.15}.kit-static-title a{color:var(--color-link)}.kit-static-text{max-width:32rem;color:var(--color-muted);margin:1rem auto 1.5rem}.kit-static-grid{text-align:left;grid-template-columns:repeat(auto-fill,minmax(min(100%,19rem),1fr));gap:.75rem;display:grid}.kit-static-actions{margin:1.75rem 0 0}.kit-notfound-compass{width:6rem;height:6rem;margin-bottom:1.25rem}.kit-notfound-spin{animation:2.4s steps(12,end) infinite kit-compass-spin}@keyframes kit-glint{0%{opacity:.55}to{opacity:1}}@media (prefers-reduced-motion:reduce){.kit-backdrop-dabs,.kit-hero-art .kit-scene-glints,.kit-hero-art .kit-scene-sun{animation:none!important}}@keyframes kit-compass-spin{0%{transform:rotate(0)}40%{transform:rotate(250deg)}55%{transform:rotate(200deg)}to{transform:rotate(720deg)}}@keyframes kit-menu-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}@keyframes kit-float{0%{transform:translateY(0)}to{transform:translateY(-6px)}}.kit-gbar,.kit-gbar *,.kit-gbar :before,.kit-gbar :after,.kit-footer,.kit-footer *,.kit-footer :before,.kit-footer :after{box-sizing:border-box}.kit-gbar,.kit-footer{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;text-align:left;line-height:1.5}.kit-gbar :is(div,p,span,ul,li,nav,details,summary,a,button),.kit-footer :is(div,p,span,ul,li,nav,a){font-size:inherit;font-family:inherit}.kit-gbar :is(ul,ol,p,h1,h2,h3),.kit-footer :is(ul,ol,p,h1,h2,h3){border:0;margin:0;padding:0}.kit-gbar button,.kit-footer button{font:inherit;color:inherit;background:0 0;border:0;padding:0}.kit-gbar a,.kit-footer a{text-decoration:none}.kit-gbar svg,.kit-footer svg{display:block}.kit-gbar summary{list-style:none;display:inline-flex}.kit-gbar summary::marker{content:""}.kit-gbar summary:before{content:none!important}@keyframes kit-drift{0%{transform:translate(0)scale(1)}50%{transform:translate(1.5%,-1%)scale(1.03)}to{transform:translate(-1%,1.2%)scale(1.01)}} diff --git a/kit/static/kit.css b/kit/static/kit.css new file mode 100644 index 00000000..496a2173 --- /dev/null +++ b/kit/static/kit.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ +@layer theme{:root,:host{--font-sans:"Inter", "InterVariable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", "Noto Sans CJK SC", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji";--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", "PingFang SC", "Microsoft YaHei", monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-display:"Fraunces", ui-serif, Georgia, "Songti SC", "Noto Serif SC", "PingFang SC", "Microsoft YaHei", serif;--font-pixel:"Silkscreen", ui-monospace, "JetBrains Mono", monospace;--color-canvas:#f7f3e8;--color-surface:#fffdf7;--color-surface-2:#f0ebdd;--color-surface-3:#e7e0cd;--color-ink:#1f2a33;--color-muted:#5b6770;--color-faint:#8a939a;--color-line:#e2dacb;--color-line-strong:#c4b9a2;--color-primary:#4f8a5b;--color-primary-strong:#3a7047;--color-primary-soft:#e3eddc;--color-on-primary:#fff;--color-link:#356b42;--color-focus:#8e5cf6;--color-mark:#f6e3a1;--color-accent-1:#3e6e8e;--color-accent-2:#9a86c2;--color-accent-3:#d98a9e;--color-accent-4:#e9c46a;--color-code-bg:#fbf8ef;--color-code-head:#f1ecdf;--color-code-ink:#26323b;--color-code-gutter:#9aa0a3;--color-pond:#3e6e8e;--color-sunrise:#f08a4b;--color-mc-grass:#5da130;--color-mc-stone:#8b8b8b;--color-mc-diamond:#5de0e6;--color-mc-gold:#f2c230;--color-mc-redstone:#d23b3b;--color-mc-enchant:#8e5cf6;--color-adm-note:#3e6e8e;--color-adm-abstract:#4a63b0;--color-adm-info:#2c7f8a;--color-adm-tip:#2f8a4f;--color-adm-success:#1f8a90;--color-adm-question:#7a63a8;--color-adm-warning:#b7791f;--color-adm-failure:#c0392b;--color-adm-danger:#c0392b;--color-adm-bug:#c2577a;--color-adm-example:#7a4fd6;--color-adm-quote:#6f7479;--px:2px;--spacing-header:3.75rem;--spacing-globalbar:2.5rem;--shadow-float:0 18px 40px -18px #1f2a3359, 0 2px 0 0 #1f2a330f;--ease-pixel:steps(4, end);--ease-soft:cubic-bezier(.22, .61, .36, 1);--animate-kit-drift:kit-drift 48s var(--ease-soft) infinite alternate}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;background-color:var(--color-canvas);color:var(--color-ink);font-family:var(--font-sans);font-feature-settings:"cv11", "ss01", "ss03";-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;scroll-padding-top:calc(var(--spacing-header) + 1rem);tab-size:4}html.dark{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}body{background-color:var(--color-canvas);min-height:100dvh;color:var(--color-ink);line-height:1.6;overflow-x:clip}.kit-no-transition,.kit-no-transition *{transition:none!important}::selection{background:#4f8a5b47}@supports (color:color-mix(in lab, red, red)){::selection{background:color-mix(in srgb, var(--color-primary) 28%, transparent)}}::selection{color:inherit}a{color:inherit;text-decoration:none}img,svg,video{max-width:100%}:focus{outline:none}:focus-visible{outline:var(--px) solid var(--color-focus);outline-offset:var(--px)}[hidden]{display:none!important}kbd,code,pre,samp{font-family:var(--font-mono);font-feature-settings:"calt" 0, "liga" 0}hr{border:0;border-top:1px solid var(--color-line)}*{scrollbar-width:thin;scrollbar-color:var(--color-line-strong) transparent}}@layer components{.kit-skip-link{z-index:100;background:var(--color-surface);color:var(--color-ink);box-shadow:0 calc(var(--px) * -1) 0 0 var(--color-focus), 0 var(--px) 0 0 var(--color-focus), calc(var(--px) * -1) 0 0 0 var(--color-focus), var(--px) 0 0 0 var(--color-focus);padding:.5rem .875rem;font-size:.875rem;font-weight:600;position:fixed;top:.75rem;left:1rem;transform:translateY(-200%)}.kit-skip-link:focus,.kit-skip-link:focus-visible{outline:none;transform:none}.kit-sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.kit-pixel-label{font-family:var(--font-pixel);letter-spacing:.04em;text-transform:uppercase;font-size:.6875rem;font-weight:400;line-height:1}.kit-display{font-family:var(--font-display);font-optical-sizing:auto;font-variation-settings:"SOFT" 50, "WONK" 0;letter-spacing:-.015em}.px-corners,.mc-btn,.mc-icon-btn,.mc-kbd,.mc-input,.px-card,.kit-slot,.hotbar{--px-border:var(--color-line-strong);--px-ring-color:transparent;box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border), 0 calc(var(--px) * -2) 0 0 var(--px-ring-color), 0 calc(var(--px) * 2) 0 0 var(--px-ring-color), calc(var(--px) * -2) 0 0 0 var(--px-ring-color), calc(var(--px) * 2) 0 0 0 var(--px-ring-color), var(--px-bevel,0 0 #0000), var(--px-drop,0 0 #0000)}.px-corners:focus-visible,.mc-btn:focus-visible,.mc-icon-btn:focus-visible,.mc-input:focus-within,.px-card:focus-visible,.kit-slot:focus-visible,.hotbar>:focus-visible,.px-focus:focus-visible{--px-ring-color:var(--color-focus);outline:none}.mc-btn{--mc-btn-bg:#ebe5d6;--mc-btn-bg-hover:#f3eee2;--mc-btn-ink:var(--color-ink);--px-border:#2a343c;--px-bevel:inset 0 var(--px) 0 0 #ffffffbf, inset 0 calc(var(--px) * -2) 0 0 #3c301e29;min-height:2.5rem;margin:var(--px);font-family:var(--font-sans);letter-spacing:.005em;white-space:nowrap;color:var(--mc-btn-ink);background:var(--mc-btn-bg);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s var(--ease-soft), transform 60ms linear;justify-content:center;align-items:center;gap:.5rem;padding:.5rem 1.125rem .625rem;font-size:.9375rem;font-weight:600;line-height:1.2;display:inline-flex;position:relative}.mc-btn:hover{background:var(--mc-btn-bg-hover)}.mc-btn:active,.mc-btn[aria-pressed=true]{transform:translateY(var(--px));--px-bevel:inset 0 var(--px) 0 0 #3c301e2e}.mc-btn:disabled,.mc-btn[aria-disabled=true]{cursor:not-allowed;opacity:.55;transform:none}.mc-btn>svg{flex:none}.mc-btn-primary{--mc-btn-bg:var(--color-primary-strong);--mc-btn-bg-hover:#43804f;--mc-btn-ink:var(--color-on-primary);--px-border:#183520;--px-bevel:inset 0 var(--px) 0 0 #ffffff47, inset 0 calc(var(--px) * -2) 0 0 #0000003d;text-shadow:0 1px #0000002e}.mc-btn-primary:active,.mc-btn-primary[aria-pressed=true]{--px-bevel:inset 0 var(--px) 0 0 #00000040}.mc-btn-ghost{--mc-btn-bg:transparent;--mc-btn-bg-hover:#1f2a3312}@supports (color:color-mix(in lab, red, red)){.mc-btn-ghost{--mc-btn-bg-hover:color-mix(in srgb, var(--color-ink) 7%, transparent)}}.mc-btn-ghost{--px-border:transparent;--px-bevel:none}.mc-btn-ghost:hover{--px-border:var(--color-line-strong)}.mc-btn-ghost:active{--px-bevel:none}.mc-btn-sm{min-height:2rem;padding:.3125rem .75rem .4375rem;font-size:.8125rem}.mc-btn-lg{min-height:3rem;padding:.75rem 1.5rem .875rem;font-size:1rem}.dark .mc-btn{--mc-btn-bg:#22384c;--mc-btn-bg-hover:#2a4560;--px-border:#04090e;--px-bevel:inset 0 var(--px) 0 0 #ffffff1f, inset 0 calc(var(--px) * -2) 0 0 #00000061}.dark .mc-btn:active,.dark .mc-btn[aria-pressed=true]{--px-bevel:inset 0 var(--px) 0 0 #0006}.dark .mc-btn-primary{--mc-btn-bg:var(--color-primary);--mc-btn-bg-hover:#82cc85;--mc-btn-ink:#0b1a10;--px-border:#06120a;--px-bevel:inset 0 var(--px) 0 0 #ffffff52, inset 0 calc(var(--px) * -2) 0 0 #00000047;text-shadow:none}.dark .mc-btn-ghost{--mc-btn-bg:transparent;--mc-btn-bg-hover:#ffffff12;--px-border:transparent;--px-bevel:none}.dark .mc-btn-ghost:hover{--px-border:var(--color-line-strong)}.mc-icon-btn{--px-border:transparent;width:2.25rem;height:2.25rem;margin:var(--px);color:var(--color-muted);cursor:pointer;background:0 0;place-items:center;transition:color .15s,background-color .15s;display:inline-grid}.mc-icon-btn:hover{color:var(--color-ink);background:#1f2a3312}@supports (color:color-mix(in lab, red, red)){.mc-icon-btn:hover{background:color-mix(in srgb, var(--color-ink) 7%, transparent)}}.mc-icon-btn:hover{--px-border:var(--color-line-strong)}.mc-icon-btn:active{transform:translateY(1px)}.mc-icon-btn[aria-expanded=true]{color:var(--color-ink);background:#1f2a3317}@supports (color:color-mix(in lab, red, red)){.mc-icon-btn[aria-expanded=true]{background:color-mix(in srgb, var(--color-ink) 9%, transparent)}}.mc-icon-btn[aria-expanded=true]{--px-border:var(--color-line-strong)}.mc-input{--px-border:var(--color-line-strong);--px-bevel:inset 0 var(--px) 0 0 #1f2a3312}@supports (color:color-mix(in lab, red, red)){.mc-input{--px-bevel:inset 0 var(--px) 0 0 color-mix(in srgb, var(--color-ink) 7%, transparent)}}.mc-input{margin:var(--px);background:var(--color-surface);min-height:2.5rem;color:var(--color-ink);align-items:center;gap:.5rem;padding:0 .75rem;display:flex}.mc-input input{min-width:0;font:inherit;color:inherit;background:0 0;border:0;outline:none;flex:1}.mc-input input::placeholder{color:var(--color-faint)}.mc-kbd{--px-border:var(--color-line-strong);--px-bevel:inset 0 calc(var(--px) * -2) 0 0 #1f2a3324}@supports (color:color-mix(in lab, red, red)){.mc-kbd{--px-bevel:inset 0 calc(var(--px) * -2) 0 0 color-mix(in srgb, var(--color-ink) 14%, transparent)}}.mc-kbd{min-width:1.5rem;height:1.5rem;margin:0 var(--px);font-family:var(--font-mono);color:var(--color-ink);background:var(--color-surface);vertical-align:middle;justify-content:center;align-items:center;padding:0 .375rem .125rem;font-size:.75rem;font-weight:500;line-height:1;display:inline-flex}.px-card{--px-border:var(--color-line);--px-drop:0 calc(var(--px) * 3) 0 0 #1f2a3312}@supports (color:color-mix(in lab, red, red)){.px-card{--px-drop:0 calc(var(--px) * 3) 0 0 color-mix(in srgb, var(--color-ink) 7%, transparent)}}.px-card{margin:var(--px);background:var(--color-surface);transition:transform .18s var(--ease-soft), background-color .2s;position:relative}a.px-card:hover,.px-card[data-interactive]:hover{--px-border:#729870}@supports (color:color-mix(in lab, red, red)){a.px-card:hover,.px-card[data-interactive]:hover{--px-border:color-mix(in srgb, var(--color-primary) 70%, var(--color-line-strong))}}a.px-card:hover,.px-card[data-interactive]:hover{--px-drop:0 calc(var(--px) * 4) 0 0 #4f8a5b38}@supports (color:color-mix(in lab, red, red)){a.px-card:hover,.px-card[data-interactive]:hover{--px-drop:0 calc(var(--px) * 4) 0 0 color-mix(in srgb, var(--color-primary) 22%, transparent)}}a.px-card:hover,.px-card[data-interactive]:hover{transform:translateY(calc(var(--px) * -1))}.kit-slot{--px-border:#c2c1b8}@supports (color:color-mix(in lab, red, red)){.kit-slot{--px-border:color-mix(in srgb, var(--color-ink) 22%, var(--color-surface-2))}}.kit-slot{--px-bevel:inset var(--px) var(--px) 0 0 #1f2a331f, inset calc(var(--px) * -1) calc(var(--px) * -1) 0 0 #ffffff8c}@supports (color:color-mix(in lab, red, red)){.kit-slot{--px-bevel:inset var(--px) var(--px) 0 0 color-mix(in srgb, var(--color-ink) 12%, transparent), inset calc(var(--px) * -1) calc(var(--px) * -1) 0 0 #ffffff8c}}.kit-slot{width:2.75rem;height:2.75rem;margin:var(--px);background:#ece6d5;place-items:center;display:inline-grid}@supports (color:color-mix(in lab, red, red)){.kit-slot{background:color-mix(in srgb, var(--color-surface-3) 80%, var(--color-surface))}}.dark .kit-slot{--px-border:#06101a;--px-bevel:inset var(--px) var(--px) 0 0 #0006, inset calc(var(--px) * -1) calc(var(--px) * -1) 0 0 #ffffff12;background:#12212f}.hotbar{--px-border:#938e81}@supports (color:color-mix(in lab, red, red)){.hotbar{--px-border:color-mix(in srgb, var(--color-ink) 30%, var(--color-line-strong))}}.hotbar{--px-bevel:inset 0 var(--px) 0 0 #1f2a330f}@supports (color:color-mix(in lab, red, red)){.hotbar{--px-bevel:inset 0 var(--px) 0 0 color-mix(in srgb, var(--color-ink) 6%, transparent)}}.hotbar{align-items:stretch;gap:var(--px);margin:var(--px);padding:var(--px);background:#e1ddd1;flex-wrap:wrap;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.hotbar{background:color-mix(in srgb, var(--color-ink) 7%, var(--color-surface-2))}}.hotbar{max-width:calc(100% - var(--px) * 2)}.hotbar>a,.hotbar>button,.hotbar>[role=tab],.hotbar>.hotbar-slot{--px-border:transparent;color:#303b44;justify-content:center;align-items:center;gap:.4rem;min-width:2rem;min-height:2rem;padding:.3125rem .75rem;font-size:.8125rem;font-weight:500;line-height:1.3;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.hotbar>a,.hotbar>button,.hotbar>[role=tab],.hotbar>.hotbar-slot{color:color-mix(in srgb, var(--color-ink) 72%, var(--color-muted))}}.hotbar>a,.hotbar>button,.hotbar>[role=tab],.hotbar>.hotbar-slot{cursor:pointer;box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border), 0 calc(var(--px) * -2) 0 0 var(--px-ring-color,transparent), 0 calc(var(--px) * 2) 0 0 var(--px-ring-color,transparent), calc(var(--px) * -2) 0 0 0 var(--px-ring-color,transparent), calc(var(--px) * 2) 0 0 0 var(--px-ring-color,transparent);background:0 0;transition:color .12s,background-color .12s}.hotbar>:hover{color:var(--color-ink);background:#fffdf7b3}@supports (color:color-mix(in lab, red, red)){.hotbar>:hover{background:color-mix(in srgb, var(--color-surface) 70%, transparent)}}.hotbar>[aria-selected=true],.hotbar>[aria-current=page],.hotbar>[aria-pressed=true],.hotbar>.is-active{--px-border:var(--color-ink);z-index:1;color:var(--color-ink);background:var(--color-surface);outline:var(--px) solid var(--color-surface);outline-offset:calc(var(--px) * -2);font-weight:600}.dark .hotbar{--px-border:#05101a;background:#0b1824}.dark .hotbar>[aria-selected=true],.dark .hotbar>[aria-current=page],.dark .hotbar>[aria-pressed=true],.dark .hotbar>.is-active{--px-border:#dfe7ee;background:#1d3246;outline-color:#0b1824}.hotbar-pixel>a,.hotbar-pixel>button,.hotbar-pixel>.hotbar-slot{font-family:var(--font-pixel);min-width:2.25rem;padding-inline:.5rem;font-size:.75rem}.mc-tooltip{--mc-tip-bg:#100010f2;max-width:22rem;margin:var(--px);color:#f4f0ff;background:var(--mc-tip-bg);box-shadow:0 calc(var(--px) * -1) 0 0 var(--mc-tip-bg), 0 var(--px) 0 0 var(--mc-tip-bg), calc(var(--px) * -1) 0 0 0 var(--mc-tip-bg), var(--px) 0 0 0 var(--mc-tip-bg), 0 10px 24px -8px #00000073;text-shadow:1px 1px #28003c99;padding:.4375rem .625rem .5rem;font-size:.8125rem;font-weight:500;line-height:1.4;display:inline-block;position:relative}.mc-tooltip:before{content:"";border:var(--px) solid transparent;pointer-events:none;border-image:linear-gradient(#7030ffd9,#380096bf) 1;position:absolute;inset:0}.mc-tooltip-title{color:#fff;font-weight:600;display:block}.mc-tooltip-lore{color:#b9b4c8;display:block}.mc-tooltip-enchant{color:#c8b6ff;display:block}.grass-divider{background-image:var(--kit-grass-strip);width:100%;height:16px;image-rendering:pixelated;background-repeat:repeat-x;background-size:32px 16px;border:0;margin:0;display:block}.grass-divider-thin{background-size:16px 8px;height:8px}.px-dot{width:calc(var(--px) * 3);height:calc(var(--px) * 3);box-shadow:var(--px) var(--px) 0 0 currentColor;background:currentColor;display:inline-block}@supports (color:color-mix(in lab, red, red)){.px-dot{box-shadow:var(--px) var(--px) 0 0 color-mix(in srgb, currentColor 45%, transparent)}}.pixelated,.kit-pixel-icon{image-rendering:pixelated;shape-rendering:crispedges}.kit-backdrop{z-index:0;pointer-events:none;contain:strict;background:var(--color-canvas);position:fixed;inset:0;overflow:hidden}.kit-backdrop>div{position:absolute}.kit-backdrop-dabs{animation:var(--animate-kit-drift);will-change:transform;background:radial-gradient(28% 22% at 6% 10%,#4f8a5b33,#0000 70%),radial-gradient(20% 16% at 16% 4%,#9a86c22b,#0000 72%),radial-gradient(24% 20% at 94% 8%,#3e6e8e2b,#0000 70%),radial-gradient(16% 12% at 82% 2%,#e9c46a3d,#0000 72%),radial-gradient(14% 11% at 70% 14%,#d98a9e1f,#0000 72%),radial-gradient(26% 20% at 2% 92%,#3e6e8e1f,#0000 72%),radial-gradient(24% 22% at 98% 96%,#4f8a5b24,#0000 72%),radial-gradient(14% 12% at 88% 70%,#9a86c21a,#0000 72%);inset:-12%}.dark .kit-backdrop-dabs{background:radial-gradient(26% 20% at 88% 6%,#f08a4b33,#0000 70%),radial-gradient(14% 10% at 84% 3%,#f5b26b2e,#0000 70%),radial-gradient(30% 24% at 8% 8%,#3f7f8c38,#0000 72%),radial-gradient(22% 18% at 40% 0,#7d6f9e33,#0000 72%),radial-gradient(28% 22% at 4% 94%,#3f7f8c29,#0000 72%),radial-gradient(22% 18% at 96% 92%,#7d6f9e29,#0000 72%),radial-gradient(12% 10% at 92% 62%,#f08a4b12,#0000 72%)}.kit-backdrop-scene{z-index:0;pointer-events:none;height:var(--kit-scene-height,21rem);background-image:var(--kit-paint-lilies);opacity:var(--kit-scene-opacity,.3);background-position:50% 35%;background-size:cover;position:absolute;top:0;left:0;right:0;-webkit-mask-image:linear-gradient(#000 0%,#000000bf 30%,#00000040 62%,#0000 100%);mask-image:linear-gradient(#000 0%,#000000bf 30%,#00000040 62%,#0000 100%)}.dark .kit-backdrop-scene{background-image:var(--kit-paint-sunrise);opacity:var(--kit-scene-opacity-dark,.42)}.kit-backdrop-brush{background-image:var(--kit-brush);mix-blend-mode:soft-light;opacity:.28;background-size:256px 256px;inset:0}.dark .kit-backdrop-brush{opacity:.22}.kit-backdrop-grain{background-image:var(--kit-grain);opacity:.05;mix-blend-mode:multiply;background-size:180px 180px;inset:0}.dark .kit-backdrop-grain{mix-blend-mode:screen;opacity:.035}.kit-above-backdrop{z-index:1;position:relative}.kit-canvas-surface{background:#f7f3e8f0}@supports (color:color-mix(in lab, red, red)){.kit-canvas-surface{background:color-mix(in srgb, var(--color-canvas) 94%, transparent)}}.kit-painted{isolation:isolate;position:relative;overflow:hidden}.kit-painted:before,.kit-painted:after{content:"";z-index:-1;pointer-events:none;position:absolute;inset:0}.kit-painted:before{background:radial-gradient(60% 80% at 0 0,#4f8a5b33,#0000 70%),radial-gradient(50% 70% at 100% 0,#9a86c233,#0000 70%),radial-gradient(60% 80% at 100% 100%,#3e6e8e2e,#0000 70%),radial-gradient(50% 60% at 10% 100%,#e9c46a2e,#0000 70%)}@supports (color:color-mix(in lab, red, red)){.kit-painted:before{background:radial-gradient(60% 80% at 0% 0%, color-mix(in srgb, var(--color-primary) 20%, transparent), transparent 70%), radial-gradient(50% 70% at 100% 0%, color-mix(in srgb, var(--color-accent-2) 20%, transparent), transparent 70%), radial-gradient(60% 80% at 100% 100%, color-mix(in srgb, var(--color-accent-1) 18%, transparent), transparent 70%), radial-gradient(50% 60% at 10% 100%, color-mix(in srgb, var(--color-accent-4) 18%, transparent), transparent 70%)}}.kit-painted:after{background:var(--kit-brush) 0 0 / 256px 256px;mix-blend-mode:soft-light;opacity:.3}.kit-hero{isolation:isolate;background:var(--color-canvas);position:relative;overflow:hidden}.kit-hero-art{z-index:-2;position:absolute;inset:0}.kit-hero-art svg{width:100%;height:100%;display:block;position:absolute;inset:0}.kit-hero-art .kit-scene-dark,.dark .kit-hero-art .kit-scene-light{display:none}.dark .kit-hero-art .kit-scene-dark{display:block}.kit-hero-art .kit-scene-glints{animation:7s ease-in-out infinite alternate kit-glint}.kit-hero-art .kit-scene-sun{animation:9s ease-in-out infinite alternate kit-glint}.kit-hero-brush{z-index:-1;background-image:var(--kit-brush);mix-blend-mode:soft-light;opacity:.5;pointer-events:none;background-size:256px 256px;position:absolute;inset:0}.kit-hero-scrim{z-index:-1;background:linear-gradient(90deg, var(--color-canvas) 0%, #f7f3e8f0 30%, #f7f3e88c 50%, transparent 68%);position:absolute;inset:0}@supports (color:color-mix(in lab, red, red)){.kit-hero-scrim{background:linear-gradient(90deg, var(--color-canvas) 0%, color-mix(in srgb, var(--color-canvas) 94%, transparent) 30%, color-mix(in srgb, var(--color-canvas) 55%, transparent) 50%, transparent 68%)}}.kit-hero-scrim{pointer-events:none}@media (width<=960px){.kit-hero-art,.kit-hero-brush{height:var(--kit-hero-band,clamp(15rem, 64vw, 24rem));inset:0 0 auto}.kit-hero-scrim{height:var(--kit-hero-band,clamp(15rem, 64vw, 24rem));background:linear-gradient(180deg, transparent 0%, transparent 55%, #f7f3e8b3 82%, var(--color-canvas) 100%);inset:0 0 auto}@supports (color:color-mix(in lab, red, red)){.kit-hero-scrim{background:linear-gradient(180deg, transparent 0%, transparent 55%, color-mix(in srgb, var(--color-canvas) 70%, transparent) 82%, var(--color-canvas) 100%)}}}.kit-hero-horizon{z-index:1;position:absolute;bottom:0;left:0;right:0}.dark .grass-divider{filter:brightness(.78)saturate(.9)}.kit-item-frame{--px-border:#3b2412;--px-bevel:inset 0 0 0 calc(var(--px) * 3) #8a5a33, inset 0 0 0 calc(var(--px) * 4) #5e3b1f, inset calc(var(--px) * 3) calc(var(--px) * 3) 0 calc(var(--px) * 3) #ffffff14;background:#efe2cd;place-items:center;padding:1.25rem;display:grid}@supports (color:color-mix(in lab, red, red)){.kit-item-frame{background:color-mix(in srgb, #c9a46a 30%, var(--color-surface))}}.kit-item-frame{box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border), var(--px-bevel), 0 18px 40px -16px #00000073}.kit-prose{--prose-gap:1.125rem;color:var(--color-ink);overflow-wrap:anywhere;min-width:0;font-size:1rem;line-height:1.75}.kit-prose:lang(zh),.kit-prose:lang(ja),.kit-prose:lang(ko){letter-spacing:.01em;line-height:1.85}.kit-prose>:first-child{margin-top:0}.kit-prose>:last-child{margin-bottom:0}.kit-prose :is(h1,h2,h3,h4,h5,h6){overflow-wrap:anywhere;color:var(--color-ink);scroll-margin-top:calc(var(--spacing-header) + 1.25rem);text-wrap:balance;position:relative}.kit-prose h1{font-family:var(--font-display);font-optical-sizing:auto;letter-spacing:-.02em;margin:0 0 1.5rem;font-size:clamp(2rem,1.6rem + 1.4vw,2.625rem);font-weight:560;line-height:1.15}.kit-prose h2{letter-spacing:-.012em;border-top:1px solid var(--color-line);margin:3rem 0 1rem;padding-top:1.5rem;font-size:1.5rem;font-weight:650;line-height:1.3}.kit-prose h3{letter-spacing:-.006em;margin:2.25rem 0 .75rem;font-size:1.1875rem;font-weight:650;line-height:1.4}.kit-prose h4{margin:1.875rem 0 .625rem;font-size:1.0625rem;font-weight:650;line-height:1.45}.kit-prose :is(h5,h6){margin:1.5rem 0 .5rem;font-size:.9375rem;font-weight:650;line-height:1.5}.kit-prose h6{color:var(--color-muted)}.kit-prose :is(h1,h2,h3,h4) code{font-size:.86em}.kit-prose .kit-anchor{width:1.25rem;height:1.25rem;color:var(--color-faint);opacity:0;place-items:center;margin-top:-.625rem;text-decoration:none;transition:opacity .15s;display:inline-grid;position:absolute;top:50%;left:-1.5rem}.kit-prose h2 .kit-anchor{top:calc(50% + .75rem)}.kit-prose :is(h1,h2,h3,h4,h5,h6):hover .kit-anchor,.kit-prose .kit-anchor:focus-visible{opacity:1}.kit-prose .kit-anchor:hover{color:var(--color-primary-strong)}.kit-prose .kit-anchor svg{width:16px;height:16px}@media (width<=960px){.kit-prose .kit-anchor{vertical-align:middle;opacity:.55;margin:0 0 0 .375rem;position:relative;top:auto;left:auto;right:-.25rem}.kit-prose h2 .kit-anchor{top:auto}}.kit-prose h1 .kit-anchor{display:none}.kit-prose :is(h1,h2,h3,h4,h5,h6):target{animation:kit-target-flash 1.6s var(--ease-soft)}.kit-prose p{margin:var(--prose-gap) 0}.kit-prose strong{color:var(--color-ink);font-weight:650}.kit-prose em{font-style:italic}.kit-prose :is(del,s){color:var(--color-muted)}.kit-prose mark{background:var(--color-mark);color:inherit;padding:0 .15em}.kit-prose small{font-size:.875em}.kit-prose u,.kit-prose ins{text-underline-offset:.2em;text-decoration-thickness:1px}.kit-prose abbr[title]{cursor:help;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.kit-prose sub,.kit-prose sup{font-size:.75em;line-height:0}.kit-prose a{color:var(--color-link);font-weight:500;text-decoration-line:underline;text-decoration-color:#356b4261}@supports (color:color-mix(in lab, red, red)){.kit-prose a{-webkit-text-decoration-color:color-mix(in srgb, var(--color-link) 38%, transparent);-webkit-text-decoration-color:color-mix(in srgb, var(--color-link) 38%, transparent);-webkit-text-decoration-color:color-mix(in srgb, var(--color-link) 38%, transparent);text-decoration-color:color-mix(in srgb, var(--color-link) 38%, transparent)}}.kit-prose a{text-underline-offset:.22em;text-decoration-thickness:1px;transition:text-decoration-color .15s,color .15s}.kit-prose a:hover{text-decoration-color:currentColor;text-decoration-thickness:2px}.kit-prose a code{color:inherit}.kit-prose a[target=_blank]:not(:has(img)):after{content:"";vertical-align:.05em;opacity:.55;width:.75em;height:.75em;-webkit-mask:var(--kit-icon-external) center / contain no-repeat;-webkit-mask:var(--kit-icon-external) center / contain no-repeat;-webkit-mask:var(--kit-icon-external) center / contain no-repeat;-webkit-mask:var(--kit-icon-external) center / contain no-repeat;mask:var(--kit-icon-external) center / contain no-repeat;background:currentColor;margin-left:.15em;display:inline-block}.kit-prose :is(ul,ol){margin:var(--prose-gap) 0;padding-left:1.625rem}.kit-prose li{margin:.375rem 0;padding-left:.125rem}.kit-prose li>:is(ul,ol){margin:.375rem 0}.kit-prose li>p{margin:.5rem 0}.kit-prose ul{list-style:none}.kit-prose ul>li{position:relative}.kit-prose ul>li:before{content:"";background:var(--color-primary);width:6px;height:6px;position:absolute;top:.72em;left:-1.125rem;box-shadow:2px 2px #4f8a5b59}@supports (color:color-mix(in lab, red, red)){.kit-prose ul>li:before{box-shadow:2px 2px 0 0 color-mix(in srgb, var(--color-primary) 35%, transparent)}}.kit-prose ul ul>li:before{box-shadow:inset 0 0 0 2px var(--color-accent-1);background:0 0}.kit-prose ul ul ul>li:before{background:var(--color-accent-2);box-shadow:none;width:4px;height:4px;top:.8em}.kit-prose ol{list-style:decimal}.kit-prose ol>li::marker{color:var(--color-muted);font-variant-numeric:tabular-nums;font-weight:600}.kit-prose li.task-list-item{list-style:none}.kit-prose ul>li.task-list-item:before{display:none}.kit-prose .task-list-item input[type=checkbox]{appearance:none;vertical-align:-2px;background:var(--color-surface);width:14px;height:14px;box-shadow:inset 0 0 0 2px var(--color-line-strong);margin:0 .5rem 0 -1.25rem}.kit-prose .task-list-item input[type=checkbox]:checked{background:var(--kit-icon-check-mask,none) center / 12px 12px no-repeat, var(--color-primary);box-shadow:inset 0 0 0 2px var(--color-primary-strong)}.kit-prose dl{margin:var(--prose-gap) 0}.kit-prose dt{font-weight:650}.kit-prose dd{margin:.25rem 0 .75rem 1.5rem}.kit-prose :not(pre)>code{color:var(--color-code-ink);background:#f2f0eb;padding:.125em .375em;font-size:.86em}@supports (color:color-mix(in lab, red, red)){.kit-prose :not(pre)>code{background:color-mix(in srgb, var(--color-ink) 6%, var(--color-surface))}}.kit-prose :not(pre)>code{box-shadow:inset 0 0 0 1px #1f2a3317}@supports (color:color-mix(in lab, red, red)){.kit-prose :not(pre)>code{box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--color-ink) 9%, transparent)}}.kit-prose :not(pre)>code{overflow-wrap:anywhere;-webkit-box-decoration-break:clone;box-decoration-break:clone}.dark .kit-prose :not(pre)>code{background:#f8f4ea}@supports (color:color-mix(in lab, red, red)){.dark .kit-prose :not(pre)>code{background:color-mix(in srgb, #fff 7%, var(--color-canvas))}}.dark .kit-prose :not(pre)>code{box-shadow:inset 0 0 0 1px #ffffff14}.kit-prose kbd{text-align:center;min-width:1.5em;color:var(--color-ink);background:var(--color-surface);box-shadow:0 -2px 0 0 var(--color-line-strong), 0 2px 0 0 var(--color-line-strong), -2px 0 0 0 var(--color-line-strong), 2px 0 0 0 var(--color-line-strong), inset 0 -2px 0 0 #1f2a3324;padding:0 .375em .0625em;font-size:.8em;line-height:1.6;display:inline-block}@supports (color:color-mix(in lab, red, red)){.kit-prose kbd{box-shadow:0 -2px 0 0 var(--color-line-strong), 0 2px 0 0 var(--color-line-strong), -2px 0 0 0 var(--color-line-strong), 2px 0 0 0 var(--color-line-strong), inset 0 -2px 0 0 color-mix(in srgb, var(--color-ink) 14%, transparent)}}.kit-prose kbd{margin:0 .2em}.kit-prose blockquote{color:var(--color-muted);background:linear-gradient(90deg,#9a86c217,#0000 70%);margin:1.5rem 0;padding:.25rem 1.125rem}@supports (color:color-mix(in lab, red, red)){.kit-prose blockquote{background:linear-gradient(90deg, color-mix(in srgb, var(--color-accent-2) 9%, transparent), transparent 70%)}}.kit-prose blockquote{box-shadow:inset 4px 0 0 0 var(--color-accent-2)}.kit-prose blockquote>p{margin:.625rem 0}.kit-prose blockquote strong{color:inherit}.kit-prose .kit-table-wrap{background:var(--color-surface);max-width:100%;box-shadow:0 -1px 0 0 var(--color-line), 0 1px 0 0 var(--color-line), -1px 0 0 0 var(--color-line), 1px 0 0 0 var(--color-line);margin:1.5rem 0;overflow-x:auto}.kit-prose table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;font-size:.9rem;line-height:1.55}.kit-prose .kit-table-wrap>table{margin:0}.kit-prose :is(th,td){text-align:left;vertical-align:top;border-bottom:1px solid var(--color-line);padding:.625rem .875rem}.kit-prose :is(th,td)+:is(th,td){border-left:1px solid #e2dacb99}@supports (color:color-mix(in lab, red, red)){.kit-prose :is(th,td)+:is(th,td){border-left:1px solid color-mix(in srgb, var(--color-line) 60%, transparent)}}.kit-prose th{letter-spacing:.01em;color:var(--color-ink);background:#f6f5ef;font-size:.8125rem;font-weight:650}@supports (color:color-mix(in lab, red, red)){.kit-prose th{background:color-mix(in srgb, var(--color-ink) 4%, var(--color-surface))}}.kit-prose th{border-bottom:2px solid var(--color-line-strong);white-space:nowrap}.kit-prose tbody tr:nth-child(2n){background:#1f2a3305}@supports (color:color-mix(in lab, red, red)){.kit-prose tbody tr:nth-child(2n){background:color-mix(in srgb, var(--color-ink) 1.8%, transparent)}}.kit-prose tbody tr:last-child td{border-bottom:0}.kit-prose tbody tr:hover{background:#4f8a5b0f}@supports (color:color-mix(in lab, red, red)){.kit-prose tbody tr:hover{background:color-mix(in srgb, var(--color-primary) 6%, transparent)}}.kit-prose td code{font-size:.82em}.kit-prose .kit-table-wrap table,.kit-prose .kit-table-wrap :not(pre)>code{overflow-wrap:normal}.kit-prose img{vertical-align:middle;max-width:100%;height:auto;display:inline-block}.kit-prose p>img:only-child,.kit-prose figure img{box-shadow:0 -2px 0 0 var(--color-line), 0 2px 0 0 var(--color-line), -2px 0 0 0 var(--color-line), 2px 0 0 0 var(--color-line);margin:1.5rem auto;display:block}.kit-prose figure{margin:1.5rem 0}.kit-prose figcaption{text-align:center;color:var(--color-muted);margin-top:.5rem;font-size:.875rem}.kit-prose hr{background:repeating-linear-gradient(90deg, var(--color-line-strong) 0 4px, transparent 4px 10px);border:0;height:2px;margin:2.5rem 0}.kit-prose details:not(.kit-adm){background:var(--color-surface);box-shadow:0 -2px 0 0 var(--color-line), 0 2px 0 0 var(--color-line), -2px 0 0 0 var(--color-line), 2px 0 0 0 var(--color-line);margin:1.25rem 0;padding:.5rem 1rem}.kit-prose details:not(.kit-adm)>summary{cursor:pointer;align-items:center;gap:.5rem;font-weight:600;list-style:none;display:flex}.kit-prose details:not(.kit-adm)>summary::-webkit-details-marker{display:none}.kit-prose details:not(.kit-adm)>summary:before{content:"";width:12px;height:12px;-webkit-mask:var(--kit-icon-chevron-right) center / contain no-repeat;-webkit-mask:var(--kit-icon-chevron-right) center / contain no-repeat;-webkit-mask:var(--kit-icon-chevron-right) center / contain no-repeat;-webkit-mask:var(--kit-icon-chevron-right) center / contain no-repeat;mask:var(--kit-icon-chevron-right) center / contain no-repeat;transition:transform .15s var(--ease-pixel);background:currentColor;flex:none}.kit-prose details:not(.kit-adm)[open]>summary:before{transform:rotate(90deg)}.kit-prose details:not(.kit-adm)[open]>summary{margin-bottom:.5rem}.kit-prose sup>a[data-footnote-ref],.kit-prose .footnote-ref{min-width:1.25em;font-family:var(--font-mono);text-align:center;color:var(--color-primary-strong);background:var(--color-primary-soft);vertical-align:.4em;margin-left:.1em;padding:0 .25em;font-size:.72rem;font-weight:600;line-height:1.4;text-decoration:none;display:inline-block}.dark .kit-prose sup>a[data-footnote-ref]{color:var(--color-primary)}.kit-prose section.footnotes,.kit-prose .footnotes{color:var(--color-muted);border-top:1px solid var(--color-line);margin-top:3rem;padding-top:1.25rem;font-size:.875rem}.kit-prose .footnotes ol{padding-left:1.5rem}.kit-prose .footnotes li:target{background:#e9c46a2e}@supports (color:color-mix(in lab, red, red)){.kit-prose .footnotes li:target{background:color-mix(in srgb, var(--color-accent-4) 18%, transparent)}}.kit-prose .footnotes .data-footnote-backref,.kit-prose .footnotes [data-footnote-backref]{font-family:var(--font-mono);margin-left:.25rem;text-decoration:none}.kit-prose .footnotes h2{clip:rect(0 0 0 0);border:0;width:1px;height:1px;margin:0;padding:0;position:absolute;overflow:hidden}.kit-prose .kit-math,.kit-prose .arithmatex{overflow-x:auto}.kit-prose iframe,.kit-prose video{max-width:100%}.kit-code{--kit-code-frame:#c3beb3}@supports (color:color-mix(in lab, red, red)){.kit-code{--kit-code-frame:color-mix(in srgb, var(--color-ink) 16%, var(--color-line))}}.kit-code{margin:1.5rem var(--px);background:var(--color-code-bg);box-shadow:0 calc(var(--px) * -1) 0 0 var(--kit-code-frame), 0 var(--px) 0 0 var(--kit-code-frame), calc(var(--px) * -1) 0 0 0 var(--kit-code-frame), var(--px) 0 0 0 var(--kit-code-frame), 0 calc(var(--px) * 3) 0 0 #1f2a330d;position:relative}@supports (color:color-mix(in lab, red, red)){.kit-code{box-shadow:0 calc(var(--px) * -1) 0 0 var(--kit-code-frame), 0 var(--px) 0 0 var(--kit-code-frame), calc(var(--px) * -1) 0 0 0 var(--kit-code-frame), var(--px) 0 0 0 var(--kit-code-frame), 0 calc(var(--px) * 3) 0 0 color-mix(in srgb, var(--color-ink) 5%, transparent)}}.kit-code{font-size:.8125rem}.dark .kit-code{--kit-code-frame:#04090e;box-shadow:0 calc(var(--px) * -1) 0 0 var(--kit-code-frame), 0 var(--px) 0 0 var(--kit-code-frame), calc(var(--px) * -1) 0 0 0 var(--kit-code-frame), var(--px) 0 0 0 var(--kit-code-frame), 0 calc(var(--px) * 3) 0 0 #0000004d}.kit-code-head{background:var(--color-code-head);border-bottom:var(--px) solid #1f2a3314;align-items:center;gap:.5rem;min-height:2.125rem;padding:0 .25rem 0 .875rem;display:flex}@supports (color:color-mix(in lab, red, red)){.kit-code-head{border-bottom:var(--px) solid color-mix(in srgb, var(--color-ink) 8%, transparent)}}.dark .kit-code-head{border-bottom-color:#00000059}.kit-code-title{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--font-pixel);letter-spacing:.05em;text-transform:uppercase;color:var(--color-muted);flex:1;font-size:.6875rem;overflow:hidden}.kit-code-title.is-file{font-family:var(--font-mono);letter-spacing:0;text-transform:none;color:var(--color-ink);font-size:.75rem}.kit-code-title:before{content:"";vertical-align:.1em;background:var(--kit-code-dot,var(--color-primary));width:6px;height:6px;box-shadow:2px 2px 0 0 var(--kit-code-dot,#4f8a5b);margin-right:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.kit-code-title:before{box-shadow:2px 2px 0 0 color-mix(in srgb, var(--kit-code-dot,var(--color-primary)) 40%, transparent)}}.kit-code[data-lang=cpp],.kit-code[data-lang=c]{--kit-code-dot:var(--color-accent-1)}.kit-code:is([data-lang=js],[data-lang=javascript],[data-lang=ts],[data-lang=typescript]){--kit-code-dot:var(--color-mc-gold)}.kit-code[data-lang=lua]{--kit-code-dot:var(--color-accent-2)}.kit-code:is([data-lang=shell],[data-lang=sh],[data-lang=bash],[data-lang=powershell],[data-lang=cmd],[data-lang=batch]){--kit-code-dot:var(--color-faint)}.kit-code:is([data-lang=json],[data-lang=jsonc],[data-lang=yaml],[data-lang=toml]){--kit-code-dot:var(--color-accent-3)}.kit-code-copy{width:2rem;height:2rem;color:var(--color-muted);cursor:pointer;background:0 0;place-items:center;transition:color .15s,background-color .15s;display:inline-grid;position:relative}.kit-code-copy:hover{color:var(--color-ink);background:#1f2a3314}@supports (color:color-mix(in lab, red, red)){.kit-code-copy:hover{background:color-mix(in srgb, var(--color-ink) 8%, transparent)}}.kit-code-copy:focus-visible{outline:var(--px) solid var(--color-focus);outline-offset:calc(var(--px) * -1)}.kit-code-copy .kit-icon-done{display:none}.kit-code-copy[data-copied]{color:var(--color-primary-strong)}.dark .kit-code-copy[data-copied]{color:var(--color-primary)}.kit-code-copy[data-copied] .kit-icon-copy{display:none}.kit-code-copy[data-copied] .kit-icon-done{display:block}.kit-code-copy[data-copied]:after{content:attr(data-copied);font-family:var(--font-sans);white-space:nowrap;color:#fff;pointer-events:none;background:#100010f2;padding:.25rem .5rem;font-size:.75rem;font-weight:600;line-height:1.2;position:absolute;top:50%;right:calc(100% + .375rem);transform:translateY(-50%);box-shadow:0 -2px #100010f2,0 2px #100010f2,-2px 0 #100010f2,2px 0 #100010f2,inset 0 0 0 2px #6028dcb3}.kit-code pre,.kit-prose pre{font-family:var(--font-mono);color:var(--color-code-ink);tab-size:4;margin:0;padding:.875rem 0;font-size:.8125rem;line-height:1.7;overflow-x:auto;background:0 0!important}.kit-prose pre:not(.shiki){padding:.875rem 1rem;background:var(--color-code-bg)!important}.kit-code pre:focus-visible{outline:var(--px) solid var(--color-focus);outline-offset:calc(var(--px) * -1)}.kit-code code{min-width:max-content;font:inherit;counter-reset:kit-line;display:block}.kit-code .line{min-width:100%;padding:0 1.125rem 0 1rem;display:inline-block}.kit-code[data-linenos] .line{padding-left:0}.kit-code[data-linenos] .line:before{counter-increment:kit-line;content:counter(kit-line);box-sizing:content-box;width:var(--kit-gutter,2ch);text-align:right;color:var(--color-code-gutter);border-right:1px solid #1f2a3314;margin-right:.875rem;padding:0 .875rem 0 1rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.kit-code[data-linenos] .line:before{border-right:1px solid color-mix(in srgb, var(--color-ink) 8%, transparent)}}.kit-code[data-linenos] .line:before{-webkit-user-select:none;user-select:none}.dark .kit-code[data-linenos] .line:before{border-right-color:#ffffff0f}.kit-code .line.highlighted{background:#e9c46a2e}@supports (color:color-mix(in lab, red, red)){.kit-code .line.highlighted{background:color-mix(in srgb, var(--color-accent-4) 18%, transparent)}}.kit-code .line.highlighted{box-shadow:inset 3px 0 0 0 var(--color-accent-4)}.dark .kit-code .line.highlighted{box-shadow:inset 3px 0 0 0 var(--color-sunrise);background:#f08a4b1f}.kit-shiki span{color:var(--shiki-light);font-style:var(--shiki-light-font-style,inherit);font-weight:var(--shiki-light-font-weight,inherit)}.dark .kit-shiki span{color:var(--shiki-dark);font-style:var(--shiki-dark-font-style,inherit);font-weight:var(--shiki-dark-font-weight,inherit)}.kit-shiki .line{color:var(--color-code-ink)}.kit-adm{--adm:var(--color-adm-note);--adm-icon:var(--kit-icon-book-quill);--adm-frame:var(--adm)}@supports (color:color-mix(in lab, red, red)){.kit-adm{--adm-frame:color-mix(in srgb, var(--adm) 32%, var(--color-line))}}.kit-adm{margin:1.5rem var(--px);background:var(--adm);padding:0;font-size:.9375rem;line-height:1.7;position:relative}@supports (color:color-mix(in lab, red, red)){.kit-adm{background:color-mix(in srgb, var(--adm) 6.5%, var(--color-surface))}}.kit-adm{box-shadow:0 calc(var(--px) * -1) 0 0 var(--adm-frame), 0 var(--px) 0 0 var(--adm-frame), calc(var(--px) * -1) 0 0 0 var(--adm-frame), var(--px) 0 0 0 var(--adm-frame), inset calc(var(--px) * 2) 0 0 0 var(--adm)}.dark .kit-adm{background:var(--adm)}@supports (color:color-mix(in lab, red, red)){.dark .kit-adm{background:color-mix(in srgb, var(--adm) 9%, var(--color-surface))}}.dark .kit-adm{--adm-frame:var(--adm)}@supports (color:color-mix(in lab, red, red)){.dark .kit-adm{--adm-frame:color-mix(in srgb, var(--adm) 30%, var(--color-line))}}.kit-adm>.kit-adm-title,.kit-adm-title{color:var(--color-ink);overflow-wrap:anywhere;align-items:center;gap:.625rem;min-width:0;margin:0;padding:.75rem 1rem .125rem 1.25rem;font-size:.9375rem;font-weight:650;line-height:1.45;display:flex}.kit-adm-title-text{flex:auto;min-width:0}.kit-adm-title:before{content:"";background:var(--adm-icon) center / 16px 16px no-repeat;width:16px;height:16px;image-rendering:pixelated;flex:none}.kit-adm-body{padding:.25rem 1.125rem .875rem 1.25rem}.kit-adm-body>:first-child{margin-top:.25rem}.kit-adm-body>:last-child{margin-bottom:0}.kit-adm:not(:has(>.kit-adm-title))>.kit-adm-body{padding-top:.875rem}.kit-adm .kit-adm,.kit-adm .kit-code{margin:1rem var(--px)}.kit-adm:is([data-kind=question],[data-kind=quote])>.kit-adm-title:before{background:var(--adm);-webkit-mask:var(--adm-icon) center / 16px 16px no-repeat;-webkit-mask:var(--adm-icon) center / 16px 16px no-repeat;-webkit-mask:var(--adm-icon) center / 16px 16px no-repeat;-webkit-mask:var(--adm-icon) center / 16px 16px no-repeat;mask:var(--adm-icon) center / 16px 16px no-repeat}details.kit-adm>summary{cursor:pointer;-webkit-user-select:none;user-select:none;padding-bottom:.75rem;list-style:none}details.kit-adm[open]>summary{padding-bottom:.125rem}details.kit-adm>summary::-webkit-details-marker{display:none}details.kit-adm>summary:after{content:"";background:var(--color-muted);width:16px;height:16px;-webkit-mask:var(--kit-icon-chevron-right) center / 16px 16px no-repeat;-webkit-mask:var(--kit-icon-chevron-right) center / 16px 16px no-repeat;-webkit-mask:var(--kit-icon-chevron-right) center / 16px 16px no-repeat;-webkit-mask:var(--kit-icon-chevron-right) center / 16px 16px no-repeat;mask:var(--kit-icon-chevron-right) center / 16px 16px no-repeat;transition:transform .18s var(--ease-pixel);flex:none;margin-left:auto}details.kit-adm[open]>summary:after{transform:rotate(90deg)}details.kit-adm>summary:hover:after{background:var(--color-ink)}details.kit-adm>summary:focus-visible{outline:var(--px) solid var(--color-focus);outline-offset:calc(var(--px) * -1)}.kit-adm[data-kind=abstract]{--adm:var(--color-adm-abstract);--adm-icon:var(--kit-icon-paper)}.kit-adm[data-kind=info]{--adm:var(--color-adm-info);--adm-icon:var(--kit-icon-compass)}.kit-adm[data-kind=tip]{--adm:var(--color-adm-tip);--adm-icon:var(--kit-icon-emerald)}.kit-adm[data-kind=success]{--adm:var(--color-adm-success);--adm-icon:var(--kit-icon-diamond)}.kit-adm[data-kind=question]{--adm:var(--color-adm-question);--adm-icon:var(--kit-icon-question)}.kit-adm[data-kind=warning]{--adm:var(--color-adm-warning);--adm-icon:var(--kit-icon-torch)}.kit-adm[data-kind=failure]{--adm:var(--color-adm-failure);--adm-icon:var(--kit-icon-tnt)}.kit-adm[data-kind=danger]{--adm:var(--color-adm-danger);--adm-icon:var(--kit-icon-tnt)}.kit-adm[data-kind=bug]{--adm:var(--color-adm-bug);--adm-icon:var(--kit-icon-bug)}.kit-adm[data-kind=example]{--adm:var(--color-adm-example);--adm-icon:var(--kit-icon-potion)}.kit-adm[data-kind=quote]{--adm:var(--color-adm-quote);--adm-icon:var(--kit-icon-quote)}.kit-adm[data-kind=details]{--adm:var(--color-line-strong);--adm-icon:var(--kit-icon-chest)}.dark .kit-adm[data-kind=details]{--adm:#4a6580}.kit-tabs{margin:1.5rem 0}.kit-tabs-bar{margin-bottom:.875rem}.kit-tab-panel>:first-child{margin-top:0}.kit-tab-panel>:last-child{margin-bottom:0}.kit-tab-panel>.kit-code:first-child{margin-top:var(--px)}.kit-tab-panel:focus-visible{outline:var(--px) dashed var(--color-focus);outline-offset:4px}.kit-shell{flex-direction:column;min-height:100dvh;display:flex}.kit-shell>main,.kit-shell>.kit-main{flex:1 0 auto}.kit-shell>.kit-footer{flex:none}.kit-menu{position:relative}.kit-menu>summary{cursor:pointer;list-style:none}.kit-menu>summary::-webkit-details-marker{display:none}.kit-menu-chevron{opacity:.7;width:12px;height:12px;transition:transform .18s var(--ease-pixel);flex:none}.kit-menu[open]>summary .kit-menu-chevron{transform:rotate(180deg)}.kit-menu-trigger{gap:.375rem;width:auto;min-width:2.25rem;padding:0 .5rem;font-size:.8125rem;font-weight:500;display:inline-flex}.kit-menu-trigger-label{white-space:nowrap}.kit-menu-panel{--px-border:var(--color-line-strong);z-index:70;min-width:11rem;max-height:min(70vh,32rem);color:var(--color-ink);background:var(--color-surface);box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border), var(--shadow-float);animation:kit-menu-in .14s var(--ease-soft);padding:.375rem;position:absolute;top:calc(100% + .5rem);right:0;overflow-y:auto}.kit-menu-item{color:var(--color-ink);white-space:nowrap;justify-content:space-between;align-items:center;gap:.75rem;padding:.5rem .625rem;font-size:.875rem;text-decoration:none;display:flex}.kit-menu-item:hover,.kit-menu-item:focus-visible{background:#1f2a3312}@supports (color:color-mix(in lab, red, red)){.kit-menu-item:hover,.kit-menu-item:focus-visible{background:color-mix(in srgb, var(--color-ink) 7%, transparent)}}.kit-menu-item:hover,.kit-menu-item:focus-visible{outline:none}.kit-menu-item.is-active{color:var(--color-primary-strong);background:var(--color-primary-soft);font-weight:600}.dark .kit-menu-item.is-active{color:var(--color-primary)}.kit-menu-check{flex:none}.kit-theme-toggle .kit-theme-icon,.kit-theme-tip .kit-theme-state{display:none}:root[data-theme-pref=light] .kit-theme-toggle .kit-theme-icon-light,:root[data-theme-pref=dark] .kit-theme-toggle .kit-theme-icon-dark,:root[data-theme-pref=system] .kit-theme-toggle .kit-theme-icon-system,:root:not([data-theme-pref]) .kit-theme-toggle .kit-theme-icon-system{display:block}:root[data-theme-pref=light] .kit-theme-tip .kit-theme-state-light,:root[data-theme-pref=dark] .kit-theme-tip .kit-theme-state-dark,:root[data-theme-pref=system] .kit-theme-tip .kit-theme-state-system,:root:not([data-theme-pref]) .kit-theme-tip .kit-theme-state-system{display:inline}.kit-theme-toggle-host{vertical-align:middle}.kit-gbar{--gbar-bg:#16222c;--gbar-ink:#e3eaef;--gbar-muted:#b4c2cd;z-index:60;height:var(--spacing-globalbar);color:var(--gbar-ink);background:linear-gradient(90deg, #4f8a5b29, transparent 22%, transparent 78%, #3e6e8e2e), var(--gbar-bg);border-bottom:1px solid #00000040;font-size:.8125rem;line-height:1;position:relative}.dark .kit-gbar{--gbar-bg:#08111a;background:linear-gradient(90deg, #3f7f8c24, transparent 25%, transparent 72%, #f08a4b1a), var(--gbar-bg);border-bottom-color:#ffffff0d}.kit-gbar-inner{align-items:center;gap:1.25rem;max-width:90rem;height:100%;margin:0 auto;padding:0 1rem;display:flex}@media (width>=640px){.kit-gbar-inner{padding:0 1.5rem}}.kit-gbar-brand{color:#fff;align-items:center;gap:.5rem;height:100%;text-decoration:none;display:inline-flex}.kit-gbar-brand-text{font-family:var(--font-pixel);letter-spacing:.04em;font-size:.8125rem}.kit-gbar-brand:hover .kit-gbar-brand-text{color:#c9f0a8}.kit-gbar-nav{height:100%}.kit-gbar-nav>ul{align-items:stretch;gap:.125rem;height:100%;margin:0;padding:0;list-style:none;display:flex}.kit-gbar-nav>ul>li{display:flex;position:relative}.kit-gbar-link{height:var(--spacing-globalbar);color:var(--gbar-muted);white-space:nowrap;align-items:center;gap:.3rem;padding:0 .625rem;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex;position:relative}.kit-gbar-link:hover,.kit-menu[open]>.kit-gbar-link,.kit-gbar-link[aria-current=page]{color:#fff}.kit-gbar-link[aria-current=page]:after{content:"";background:var(--color-mc-grass);height:3px;position:absolute;bottom:0;left:.625rem;right:.625rem;box-shadow:0 -1px #8fd45e}.kit-gbar-docs .kit-menu-panel{width:min(34rem,100vw - 2rem);padding:.5rem;left:-.5rem;right:auto}.kit-gbar-docs-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.25rem;display:grid}.kit-gbar-docs-item{color:var(--color-ink);align-items:center;gap:.75rem;padding:.5rem;line-height:1.3;text-decoration:none;display:flex}.kit-gbar-docs-item:hover,.kit-gbar-docs-item:focus-visible{background:#1f2a330f}@supports (color:color-mix(in lab, red, red)){.kit-gbar-docs-item:hover,.kit-gbar-docs-item:focus-visible{background:color-mix(in srgb, var(--color-ink) 6%, transparent)}}.kit-gbar-docs-item:hover,.kit-gbar-docs-item:focus-visible{outline:none}.kit-gbar-docs-item[aria-current=page]{background:var(--color-primary-soft)}.kit-gbar-docs-slot{flex:none;width:2.25rem;height:2.25rem}.kit-gbar-docs-text{overflow-wrap:anywhere;flex-direction:column;gap:.2rem;min-width:0;display:flex}.kit-gbar-docs-name{font-size:.875rem;font-weight:650}.kit-gbar-docs-blurb{color:var(--color-muted);font-size:.75rem}.kit-gbar-end{align-items:center;gap:.25rem;margin-left:auto;display:flex}.kit-gbar-icon{width:2rem;height:2rem;color:var(--gbar-muted);place-items:center;text-decoration:none;transition:color .12s,background-color .12s;display:inline-grid}.kit-gbar-icon:hover,.kit-menu[open]>.kit-gbar-icon{color:#fff;background:#ffffff14}.kit-gbar .mc-icon-btn{color:var(--gbar-muted);width:2rem;height:2rem}.kit-gbar .mc-icon-btn:hover{color:#fff;--px-border:#ffffff29;background:#ffffff14}.kit-gbar-more{display:none}.kit-gbar-more-panel{width:min(22rem,100vw - 1.5rem);padding:.5rem}.kit-gbar-more-panel .kit-gbar-docs-grid{grid-template-columns:1fr}.kit-gbar-more-link{color:var(--color-ink);padding:.625rem .75rem;font-size:.9375rem;font-weight:500;text-decoration:none;display:block}.kit-gbar-more-link:hover{background:#1f2a330f}@supports (color:color-mix(in lab, red, red)){.kit-gbar-more-link:hover{background:color-mix(in srgb, var(--color-ink) 6%, transparent)}}.kit-gbar-more-link[aria-current=page]{color:var(--color-primary-strong);font-weight:650}.kit-gbar-more-heading{border-top:1px solid var(--color-line);letter-spacing:.06em;text-transform:uppercase;color:var(--color-muted);margin:.5rem .75rem .25rem;padding-top:.625rem;font-size:.75rem;font-weight:650}@media (width<=860px){.kit-gbar-nav{display:none}.kit-gbar-more{display:block}}.kit-footer{z-index:1;color:#eadfcb;margin-top:5rem;position:relative}.kit-footer .grass-divider{z-index:1;position:relative}.kit-footer-soil{background:linear-gradient(to bottom, #0000002e, transparent 3rem), var(--kit-dirt) 0 0 / 32px 32px;image-rendering:pixelated}.dark .kit-footer-soil{background:linear-gradient(to bottom, #00000040, transparent 3rem), var(--kit-dirt-dark) 0 0 / 32px 32px}.kit-footer-soil>*{image-rendering:auto}.kit-footer-inner{grid-template-columns:minmax(0,2fr) repeat(3,minmax(0,1fr));gap:2.5rem;max-width:80rem;margin:0 auto;padding:3rem 1.5rem 2.5rem;display:grid}@media (width<=860px){.kit-footer-inner{grid-template-columns:repeat(2,minmax(0,1fr));gap:2rem}.kit-footer-brand{grid-column:1/-1}}@media (width<=480px){.kit-footer-inner{padding:2.5rem 1rem 2rem}}.kit-footer-logo{color:#fff;font-family:var(--font-pixel);letter-spacing:.04em;align-items:center;gap:.75rem;font-size:1.125rem;text-decoration:none;display:inline-flex}.kit-footer-tagline{color:#d8c9b0;max-width:26rem;margin:1rem 0 1.25rem;font-size:.875rem;line-height:1.6}.kit-footer-social{flex-wrap:wrap;gap:.5rem;margin:0;padding:0;list-style:none;display:flex}.kit-footer-social-link{--px-border:#eadfcb38;width:2.25rem;height:2.25rem;margin:var(--px);color:#eadfcb;box-shadow:0 calc(var(--px) * -1) 0 0 var(--px-border), 0 var(--px) 0 0 var(--px-border), calc(var(--px) * -1) 0 0 0 var(--px-border), var(--px) 0 0 0 var(--px-border);background:#0000002e;place-items:center;transition:background-color .12s,color .12s;display:inline-grid}.kit-footer-social-link:hover{color:#fff;--px-border:#8fd45e;background:#5da13059}.kit-footer-social-link:focus-visible{outline:var(--px) solid var(--color-mc-diamond);outline-offset:3px}.kit-footer-heading{letter-spacing:.08em;text-transform:uppercase;color:#c9f0a8;margin:.25rem 0 .875rem;font-size:.75rem;font-weight:650}.kit-footer-col ul{margin:0;padding:0;list-style:none}.kit-footer-col li{margin:.5rem 0}.kit-footer-col a{overflow-wrap:anywhere;color:#e0d3bc;font-size:.875rem;text-decoration:none}.kit-footer-col a:hover{color:#fff;text-underline-offset:.2em;text-decoration:underline}.kit-footer a:focus-visible{outline:var(--px) solid var(--color-mc-diamond);outline-offset:2px}.kit-footer-legal{background:#00000029;border-top:1px solid #eadfcb1a}.kit-footer-legal-inner{color:#cdbd9f;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1.5rem;padding-top:1rem;padding-bottom:1rem;font-size:.8125rem;display:flex}.kit-footer-legal-inner p{margin:0}.kit-footer-extra{color:#cdbd9f}.kit-footer-extra a{color:#eadfcb}.kit-footer-sep{opacity:.6;margin:0 .5rem}.kit-badge{--badge:var(--color-mc-stone);--badge-ink:#4b5258;margin:var(--px);white-space:nowrap;vertical-align:middle;color:var(--badge-ink);background:var(--badge);align-items:center;gap:.3rem;padding:.125rem .5rem;font-size:.75rem;font-weight:600;line-height:1.2rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.kit-badge{background:color-mix(in srgb, var(--badge) 14%, var(--color-surface))}}.kit-badge{box-shadow:0 calc(var(--px) * -1) 0 0 var(--badge), 0 var(--px) 0 0 var(--badge), calc(var(--px) * -1) 0 0 0 var(--badge), var(--px) 0 0 0 var(--badge)}@supports (color:color-mix(in lab, red, red)){.kit-badge{box-shadow:0 calc(var(--px) * -1) 0 0 color-mix(in srgb, var(--badge) 45%, transparent), 0 var(--px) 0 0 color-mix(in srgb, var(--badge) 45%, transparent), calc(var(--px) * -1) 0 0 0 color-mix(in srgb, var(--badge) 45%, transparent), var(--px) 0 0 0 color-mix(in srgb, var(--badge) 45%, transparent)}}.kit-badge-pixel{font-family:var(--font-pixel);letter-spacing:.04em;text-transform:uppercase;font-size:.625rem;font-weight:400}.kit-badge-grass{--badge:var(--color-mc-grass);--badge-ink:#2f6a14}.kit-badge-diamond{--badge:var(--color-mc-diamond);--badge-ink:#10666b}.kit-badge-gold{--badge:var(--color-mc-gold);--badge-ink:#7a5a00}.kit-badge-redstone{--badge:var(--color-mc-redstone);--badge-ink:#a32121}.kit-badge-enchant{--badge:var(--color-mc-enchant);--badge-ink:#5b32c0}.kit-badge-pond{--badge:var(--color-pond);--badge-ink:#2f5a76}.dark .kit-badge{--badge-ink:#c3ccd3;background:var(--badge)}@supports (color:color-mix(in lab, red, red)){.dark .kit-badge{background:color-mix(in srgb, var(--badge) 16%, var(--color-surface))}}.dark .kit-badge-grass{--badge-ink:#9fdc72}.dark .kit-badge-diamond{--badge-ink:#7eeaef}.dark .kit-badge-gold{--badge-ink:#f5cf5a}.dark .kit-badge-redstone{--badge-ink:#f59a92}.dark .kit-badge-enchant{--badge-ink:#c4a9ff}.dark .kit-badge-pond{--badge-ink:#8fc0e6}.kit-tooltip-host{display:inline-flex;position:relative}.kit-tooltip{z-index:80;white-space:normal;opacity:0;visibility:hidden;pointer-events:none;width:max-content;max-width:min(22rem,80vw);transition:opacity .12s steps(3,end),transform .12s steps(3,end),visibility 0s .12s;position:absolute;bottom:calc(100% + .625rem);left:50%;transform:translate(-50%,4px)}.kit-tooltip-host[data-placement=bottom]>.kit-tooltip{top:calc(100% + .625rem);bottom:auto;transform:translate(-50%,-4px)}.kit-tooltip-host[data-align=end]>.kit-tooltip{left:auto;right:0;transform:translateY(4px)}.kit-tooltip-host[data-align=end][data-placement=bottom]>.kit-tooltip{transform:translateY(-4px)}.kit-tooltip-host[data-align=end]:hover>.kit-tooltip,.kit-tooltip-host[data-align=end]:focus-within>.kit-tooltip{transform:none}.kit-tooltip-host:hover>.kit-tooltip,.kit-tooltip-host:focus-within>.kit-tooltip{opacity:1;visibility:visible;transition:opacity .12s steps(3,end),transform .12s steps(3,end);transform:translate(-50%)}.kit-card{min-width:0;max-width:calc(100% - var(--px) * 2);color:var(--color-ink);align-items:flex-start;gap:1rem;padding:1.25rem;text-decoration:none;display:flex}.kit-card-icon{flex:none;width:3.25rem;height:3.25rem}.kit-card-icon img{object-fit:contain;width:2rem;height:2rem}.kit-card-body{overflow-wrap:anywhere;flex-direction:column;flex:auto;gap:.375rem;min-width:0;display:flex}.kit-card-eyebrow{color:var(--color-primary-strong)}.dark .kit-card-eyebrow{color:var(--color-primary)}.kit-card-title{font-size:1.0625rem;font-weight:650;line-height:1.35}.kit-card-desc{overflow-wrap:anywhere;color:var(--color-muted);font-size:.9375rem;line-height:1.6}.kit-card-footer{margin-top:auto}.kit-pagination{justify-content:center;margin:2rem 0;display:flex}.kit-pagination .hotbar-slot.is-disabled{opacity:.35;cursor:default}.kit-pagination .hotbar-slot.is-gap{cursor:default;min-width:1.5rem}.kit-hero-inner{grid-template-columns:minmax(0,1fr);align-items:center;gap:2rem;max-width:80rem;min-height:clamp(26rem,58vh,38rem);margin:0 auto;padding:clamp(3.5rem,7vw,6.5rem) 1.5rem clamp(4.5rem,8vw,7.5rem);display:grid;position:relative}.kit-hero-copy{max-width:40rem}.kit-hero-eyebrow{color:var(--color-primary-strong);align-items:center;gap:.5rem;margin:0 0 1.25rem;display:inline-flex}.dark .kit-hero-eyebrow{color:var(--color-primary)}.kit-hero-title{font-family:var(--font-display);font-optical-sizing:auto;letter-spacing:-.025em;margin:0}.kit-hero-name{color:#0000;background:linear-gradient(115deg,#2f6a3e 0%,#3a7047 30%,#3e6e8e 68%,#6f58a3 100%);-webkit-background-clip:text;background-clip:text;width:fit-content;padding-bottom:.08em;font-size:clamp(2.75rem,1.6rem + 4.6vw,5rem);font-weight:600;line-height:1.02;display:block}.dark .kit-hero-name{background-image:linear-gradient(115deg,#8fd48f 0%,#6fbf73 30%,#6cc3cf 66%,#f5b26b 100%)}.kit-hero-text{color:var(--color-ink);text-wrap:balance;margin-top:.4rem;font-size:clamp(1.625rem,1.1rem + 2vw,2.75rem);font-weight:500;line-height:1.14;display:block}.kit-hero-tagline{max-width:36rem;color:var(--color-muted);text-wrap:pretty;margin:1.375rem 0 0;font-size:1.125rem;line-height:1.65}.kit-hero-actions{flex-wrap:wrap;gap:.875rem;margin-top:2.25rem;display:flex}.kit-hero-badge{align-items:center;gap:1rem;margin-bottom:1.5rem;display:flex}.kit-hero-badge .kit-hero-eyebrow{margin:0}.kit-hero-icon{flex:none;padding:.5rem}.kit-hero-icon img{object-fit:contain;width:3.5rem;height:3.5rem;display:block}@media (width<=960px){.kit-hero-inner{min-height:0;padding-top:calc(var(--kit-hero-band,clamp(15rem, 64vw, 24rem)) - 2.5rem);grid-template-columns:1fr;padding-bottom:4rem}}.kit-static-main{flex:1;place-items:center;padding:4rem 1rem 2rem;display:grid}.kit-static-card{text-align:center;width:min(46rem,100%);padding:2.25rem 2rem 2rem}.kit-static-eyebrow{color:var(--color-primary-strong);margin:0 0 .75rem}.dark .kit-static-eyebrow{color:var(--color-primary)}.kit-static-title{font-family:var(--font-display);letter-spacing:-.02em;color:var(--color-ink);margin:0;font-size:clamp(1.75rem,1.3rem + 1.6vw,2.5rem);font-weight:560;line-height:1.15}.kit-static-title a{color:var(--color-link)}.kit-static-text{max-width:32rem;color:var(--color-muted);margin:1rem auto 1.5rem}.kit-static-grid{text-align:left;grid-template-columns:repeat(auto-fill,minmax(min(100%,19rem),1fr));gap:.75rem;display:grid}.kit-static-actions{margin:1.75rem 0 0}.kit-notfound-compass{width:6rem;height:6rem;margin-bottom:1.25rem}.kit-notfound-spin{animation:2.4s steps(12,end) infinite kit-compass-spin}}@layer utilities{.static{position:static}.block{display:block}}.dark{--color-canvas:#0f1b26;--color-surface:#152535;--color-surface-2:#1a2d3f;--color-surface-3:#22384c;--color-ink:#e8eef2;--color-muted:#9aaab8;--color-faint:#6f8293;--color-line:#233648;--color-line-strong:#36506a;--color-primary:#6fbf73;--color-primary-strong:#6fbf73;--color-primary-soft:#1d3a32;--color-on-primary:#0f1b26;--color-link:#7fcc83;--color-focus:#5de0e6;--color-mark:#5b4a1f;--color-accent-1:#3f7f8c;--color-accent-2:#7d6f9e;--color-accent-3:#f08a4b;--color-accent-4:#f5b26b;--color-code-bg:#0b1620;--color-code-head:#112231;--color-code-ink:#dce5ec;--color-code-gutter:#5d7184;--color-scrim:#040a109e;--color-adm-note:#78aedb;--color-adm-abstract:#8ea2ef;--color-adm-info:#5cc9d3;--color-adm-tip:#6fcf8a;--color-adm-success:#5de0e6;--color-adm-question:#b7a4e6;--color-adm-warning:#f2b05e;--color-adm-failure:#f07a6e;--color-adm-danger:#f07a6e;--color-adm-bug:#f08fb0;--color-adm-example:#b493ff;--color-adm-quote:#a3adb6;--shadow-pixel:0 var(--px) 0 0 #00000059, 0 calc(var(--px) * 3) 0 0 #0000002e;--shadow-float:0 22px 48px -18px #000000a6, 0 2px 0 0 #0000004d;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root{--kit-grass-strip:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 8' shape-rendering='crispEdges'%3E%3Cpath fill='%235da130' d='M0 0h1v1h-1zM2 0h3v1h-3zM7 0h3v1h-3zM11 0h5v1h-5zM0 1h3v1h-3zM4 1h4v1h-4zM9 1h4v1h-4zM14 1h2v1h-2zM1 2h3v1h-3zM5 2h5v1h-5zM12 2h2v1h-2zM15 2h1v1h-1zM3 3h1v1h-1zM7 3h2v1h-2zM12 3h1v1h-1zM15 3h1v1h-1zM12 4h1v1h-1z'/%3E%3Cpath fill='%2370b83f' d='M1 0h1v1h-1zM5 0h2v1h-2zM10 0h1v1h-1zM3 1h1v1h-1zM8 1h1v1h-1zM13 1h1v1h-1z'/%3E%3Cpath fill='%23478a22' d='M0 2h1v1h-1zM4 2h1v1h-1zM10 2h2v1h-2zM14 2h1v1h-1z'/%3E%3Cpath fill='%238a5a33' d='M0 3h3v1h-3zM4 3h3v1h-3zM9 3h3v1h-3zM13 3h2v1h-2zM0 4h5v1h-5zM6 4h1v1h-1zM8 4h1v1h-1zM10 4h2v1h-2zM13 4h3v1h-3zM0 5h2v1h-2zM3 5h8v1h-8zM12 5h3v1h-3zM0 6h1v1h-1zM2 6h3v1h-3zM6 6h2v1h-2zM9 6h4v1h-4zM14 6h2v1h-2zM1 7h2v1h-2zM4 7h6v1h-6zM11 7h3v1h-3zM15 7h1v1h-1z'/%3E%3Cpath fill='%23a0703f' d='M5 4h1v1h-1zM11 5h1v1h-1zM1 6h1v1h-1zM8 6h1v1h-1zM3 7h1v1h-1zM14 7h1v1h-1z'/%3E%3Cpath fill='%236b4426' d='M7 4h1v1h-1zM9 4h1v1h-1zM2 5h1v1h-1zM15 5h1v1h-1zM5 6h1v1h-1zM13 6h1v1h-1zM0 7h1v1h-1zM10 7h1v1h-1z'/%3E%3C/svg%3E");--kit-brush:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='256' height='256' viewBox='0 0 256 256'%3E%3Cfilter id='p' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.03 0.11' numOctaves='2' seed='4' stitchTiles='stitch' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='9' xChannelSelector='R' yChannelSelector='G' result='d'/%3E%3CfeGaussianBlur in='d' stdDeviation='0.6'/%3E%3C/filter%3E%3Cg filter='url(%23p)'%3E%3Cellipse cx='148.5' cy='207.3' rx='10.1' ry='1.7' transform='rotate(2.8 148.5 207.3)' fill='%23fff' opacity='0.26'/%3E%3Cellipse cx='-34.3' cy='99.2' rx='27.7' ry='5.2' transform='rotate(8.5 -34.3 99.2)' fill='%23000' opacity='0.42'/%3E%3Cellipse cx='221.7' cy='99.2' rx='27.7' ry='5.2' transform='rotate(8.5 221.7 99.2)' fill='%23000' opacity='0.42'/%3E%3Cellipse cx='186.4' cy='101.5' rx='21.3' ry='1.8' transform='rotate(0.8 186.4 101.5)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='229.0' cy='191.2' rx='10.7' ry='5.1' transform='rotate(4.5 229.0 191.2)' fill='%23000' opacity='0.32'/%3E%3Cellipse cx='41.8' cy='153.8' rx='9.2' ry='4.1' transform='rotate(7.6 41.8 153.8)' fill='%23fff' opacity='0.29'/%3E%3Cellipse cx='31.6' cy='-4.8' rx='25.8' ry='5.0' transform='rotate(7.9 31.6 -4.8)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='31.6' cy='251.2' rx='25.8' ry='5.0' transform='rotate(7.9 31.6 251.2)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='287.6' cy='-4.8' rx='25.8' ry='5.0' transform='rotate(7.9 287.6 -4.8)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='287.6' cy='251.2' rx='25.8' ry='5.0' transform='rotate(7.9 287.6 251.2)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='86.4' cy='-10.5' rx='9.8' ry='3.4' transform='rotate(2.1 86.4 -10.5)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='86.4' cy='245.5' rx='9.8' ry='3.4' transform='rotate(2.1 86.4 245.5)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='173.3' cy='121.6' rx='14.2' ry='5.0' transform='rotate(-3.2 173.3 121.6)' fill='%23fff' opacity='0.23'/%3E%3Cellipse cx='71.1' cy='120.2' rx='18.7' ry='3.4' transform='rotate(-7.7 71.1 120.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='138.1' cy='208.2' rx='30.2' ry='2.1' transform='rotate(-7.6 138.1 208.2)' fill='%23000' opacity='0.30'/%3E%3Cellipse cx='38.4' cy='101.9' rx='12.3' ry='2.7' transform='rotate(-4.8 38.4 101.9)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='53.8' cy='53.5' rx='24.6' ry='4.2' transform='rotate(8.8 53.8 53.5)' fill='%23fff' opacity='0.36'/%3E%3Cellipse cx='-6.3' cy='101.6' rx='13.2' ry='2.1' transform='rotate(-0.5 -6.3 101.6)' fill='%23fff' opacity='0.22'/%3E%3Cellipse cx='249.7' cy='101.6' rx='13.2' ry='2.1' transform='rotate(-0.5 249.7 101.6)' fill='%23fff' opacity='0.22'/%3E%3Cellipse cx='112.6' cy='65.9' rx='11.5' ry='4.0' transform='rotate(-2.3 112.6 65.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='9.7' cy='112.1' rx='18.7' ry='2.8' transform='rotate(-6.3 9.7 112.1)' fill='%23fff' opacity='0.39'/%3E%3Cellipse cx='265.7' cy='112.1' rx='18.7' ry='2.8' transform='rotate(-6.3 265.7 112.1)' fill='%23fff' opacity='0.39'/%3E%3Cellipse cx='74.8' cy='136.0' rx='24.3' ry='2.9' transform='rotate(7.2 74.8 136.0)' fill='%23fff' opacity='0.39'/%3E%3Cellipse cx='-2.9' cy='-9.1' rx='18.9' ry='4.2' transform='rotate(-8.1 -2.9 -9.1)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='-2.9' cy='246.9' rx='18.9' ry='4.2' transform='rotate(-8.1 -2.9 246.9)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='253.1' cy='-9.1' rx='18.9' ry='4.2' transform='rotate(-8.1 253.1 -9.1)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='253.1' cy='246.9' rx='18.9' ry='4.2' transform='rotate(-8.1 253.1 246.9)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='2.2' cy='32.2' rx='10.4' ry='3.3' transform='rotate(-8.5 2.2 32.2)' fill='%23fff' opacity='0.19'/%3E%3Cellipse cx='258.2' cy='32.2' rx='10.4' ry='3.3' transform='rotate(-8.5 258.2 32.2)' fill='%23fff' opacity='0.19'/%3E%3Cellipse cx='133.7' cy='-15.7' rx='19.8' ry='3.7' transform='rotate(-3.2 133.7 -15.7)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='133.7' cy='240.3' rx='19.8' ry='3.7' transform='rotate(-3.2 133.7 240.3)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='197.1' cy='-4.3' rx='18.0' ry='3.6' transform='rotate(-7.6 197.1 -4.3)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='197.1' cy='251.7' rx='18.0' ry='3.6' transform='rotate(-7.6 197.1 251.7)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='92.7' cy='-9.1' rx='29.8' ry='1.8' transform='rotate(-4.4 92.7 -9.1)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='92.7' cy='246.9' rx='29.8' ry='1.8' transform='rotate(-4.4 92.7 246.9)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='111.3' cy='-13.8' rx='28.3' ry='3.1' transform='rotate(-7.3 111.3 -13.8)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='111.3' cy='242.2' rx='28.3' ry='3.1' transform='rotate(-7.3 111.3 242.2)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='143.5' cy='210.3' rx='12.6' ry='2.0' transform='rotate(0.1 143.5 210.3)' fill='%23000' opacity='0.45'/%3E%3Cellipse cx='83.9' cy='211.5' rx='12.8' ry='3.8' transform='rotate(4.6 83.9 211.5)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='170.0' cy='203.3' rx='27.8' ry='4.7' transform='rotate(-6.4 170.0 203.3)' fill='%23fff' opacity='0.38'/%3E%3Cellipse cx='34.1' cy='190.8' rx='10.3' ry='2.8' transform='rotate(6.4 34.1 190.8)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='196.5' cy='34.7' rx='28.4' ry='4.5' transform='rotate(-7.4 196.5 34.7)' fill='%23fff' opacity='0.31'/%3E%3Cellipse cx='196.5' cy='290.7' rx='28.4' ry='4.5' transform='rotate(-7.4 196.5 290.7)' fill='%23fff' opacity='0.31'/%3E%3Cellipse cx='-1.8' cy='196.0' rx='30.3' ry='4.6' transform='rotate(1.3 -1.8 196.0)' fill='%23000' opacity='0.35'/%3E%3Cellipse cx='254.2' cy='196.0' rx='30.3' ry='4.6' transform='rotate(1.3 254.2 196.0)' fill='%23000' opacity='0.35'/%3E%3Cellipse cx='60.2' cy='156.4' rx='10.4' ry='3.6' transform='rotate(2.6 60.2 156.4)' fill='%23fff' opacity='0.16'/%3E%3Cellipse cx='142.2' cy='3.2' rx='15.4' ry='2.7' transform='rotate(6.7 142.2 3.2)' fill='%23000' opacity='0.48'/%3E%3Cellipse cx='142.2' cy='259.2' rx='15.4' ry='2.7' transform='rotate(6.7 142.2 259.2)' fill='%23000' opacity='0.48'/%3E%3Cellipse cx='57.1' cy='45.7' rx='19.6' ry='3.1' transform='rotate(5.0 57.1 45.7)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='110.4' cy='104.1' rx='23.8' ry='4.3' transform='rotate(4.1 110.4 104.1)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='124.7' cy='201.0' rx='28.7' ry='2.6' transform='rotate(0.9 124.7 201.0)' fill='%23fff' opacity='0.16'/%3E%3Cellipse cx='113.5' cy='210.7' rx='30.1' ry='4.2' transform='rotate(3.5 113.5 210.7)' fill='%23000' opacity='0.37'/%3E%3Cellipse cx='38.6' cy='136.0' rx='17.7' ry='2.9' transform='rotate(-0.0 38.6 136.0)' fill='%23fff' opacity='0.20'/%3E%3Cellipse cx='160.8' cy='25.4' rx='30.8' ry='4.6' transform='rotate(0.3 160.8 25.4)' fill='%23000' opacity='0.19'/%3E%3Cellipse cx='160.8' cy='281.4' rx='30.8' ry='4.6' transform='rotate(0.3 160.8 281.4)' fill='%23000' opacity='0.19'/%3E%3Cellipse cx='-10.8' cy='125.3' rx='26.4' ry='1.8' transform='rotate(6.1 -10.8 125.3)' fill='%23fff' opacity='0.40'/%3E%3Cellipse cx='245.2' cy='125.3' rx='26.4' ry='1.8' transform='rotate(6.1 245.2 125.3)' fill='%23fff' opacity='0.40'/%3E%3Cellipse cx='110.1' cy='143.0' rx='27.8' ry='1.7' transform='rotate(4.4 110.1 143.0)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='128.3' cy='174.5' rx='12.8' ry='3.3' transform='rotate(-6.0 128.3 174.5)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='54.3' cy='18.2' rx='12.4' ry='1.9' transform='rotate(5.2 54.3 18.2)' fill='%23000' opacity='0.37'/%3E%3Cellipse cx='54.3' cy='274.2' rx='12.4' ry='1.9' transform='rotate(5.2 54.3 274.2)' fill='%23000' opacity='0.37'/%3E%3Cellipse cx='206.3' cy='224.6' rx='19.9' ry='4.7' transform='rotate(-6.9 206.3 224.6)' fill='%23000' opacity='0.26'/%3E%3Cellipse cx='180.1' cy='97.8' rx='30.8' ry='4.9' transform='rotate(2.4 180.1 97.8)' fill='%23fff' opacity='0.31'/%3E%3Cellipse cx='196.7' cy='12.6' rx='12.5' ry='4.3' transform='rotate(1.6 196.7 12.6)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='196.7' cy='268.6' rx='12.5' ry='4.3' transform='rotate(1.6 196.7 268.6)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='35.2' cy='10.8' rx='20.4' ry='2.4' transform='rotate(-3.2 35.2 10.8)' fill='%23000' opacity='0.47'/%3E%3Cellipse cx='35.2' cy='266.8' rx='20.4' ry='2.4' transform='rotate(-3.2 35.2 266.8)' fill='%23000' opacity='0.47'/%3E%3Cellipse cx='55.7' cy='31.5' rx='9.4' ry='5.0' transform='rotate(-6.3 55.7 31.5)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='107.6' cy='6.0' rx='26.0' ry='4.9' transform='rotate(6.9 107.6 6.0)' fill='%23000' opacity='0.30'/%3E%3Cellipse cx='107.6' cy='262.0' rx='26.0' ry='4.9' transform='rotate(6.9 107.6 262.0)' fill='%23000' opacity='0.30'/%3E%3Cellipse cx='-8.5' cy='186.5' rx='10.4' ry='4.4' transform='rotate(-5.7 -8.5 186.5)' fill='%23000' opacity='0.32'/%3E%3Cellipse cx='247.5' cy='186.5' rx='10.4' ry='4.4' transform='rotate(-5.7 247.5 186.5)' fill='%23000' opacity='0.32'/%3E%3Cellipse cx='129.9' cy='22.2' rx='10.9' ry='2.5' transform='rotate(-5.6 129.9 22.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='221.6' cy='151.0' rx='18.1' ry='2.7' transform='rotate(-6.0 221.6 151.0)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='127.0' cy='-18.3' rx='28.4' ry='1.7' transform='rotate(8.8 127.0 -18.3)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='127.0' cy='237.7' rx='28.4' ry='1.7' transform='rotate(8.8 127.0 237.7)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='146.5' cy='134.5' rx='20.4' ry='3.3' transform='rotate(2.4 146.5 134.5)' fill='%23000' opacity='0.24'/%3E%3Cellipse cx='207.6' cy='71.6' rx='16.8' ry='4.4' transform='rotate(-6.2 207.6 71.6)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='88.3' cy='72.0' rx='12.4' ry='3.3' transform='rotate(-8.5 88.3 72.0)' fill='%23fff' opacity='0.26'/%3E%3Cellipse cx='102.7' cy='56.7' rx='19.4' ry='4.1' transform='rotate(4.6 102.7 56.7)' fill='%23000' opacity='0.33'/%3E%3Cellipse cx='-3.6' cy='100.9' rx='12.9' ry='1.8' transform='rotate(-8.9 -3.6 100.9)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='252.4' cy='100.9' rx='12.9' ry='1.8' transform='rotate(-8.9 252.4 100.9)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='126.2' cy='166.7' rx='15.1' ry='2.5' transform='rotate(-0.5 126.2 166.7)' fill='%23fff' opacity='0.21'/%3E%3Cellipse cx='-10.7' cy='24.5' rx='15.0' ry='3.4' transform='rotate(-8.8 -10.7 24.5)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='245.3' cy='24.5' rx='15.0' ry='3.4' transform='rotate(-8.8 245.3 24.5)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='15.5' cy='139.4' rx='30.8' ry='2.7' transform='rotate(1.3 15.5 139.4)' fill='%23fff' opacity='0.32'/%3E%3Cellipse cx='271.5' cy='139.4' rx='30.8' ry='2.7' transform='rotate(1.3 271.5 139.4)' fill='%23fff' opacity='0.32'/%3E%3Cellipse cx='201.1' cy='154.5' rx='15.1' ry='3.5' transform='rotate(-7.7 201.1 154.5)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='204.3' cy='136.1' rx='19.6' ry='3.1' transform='rotate(3.7 204.3 136.1)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='-7.9' cy='218.9' rx='11.4' ry='3.2' transform='rotate(7.2 -7.9 218.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='248.1' cy='218.9' rx='11.4' ry='3.2' transform='rotate(7.2 248.1 218.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='11.1' cy='-21.1' rx='29.6' ry='4.1' transform='rotate(-1.7 11.1 -21.1)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='11.1' cy='234.9' rx='29.6' ry='4.1' transform='rotate(-1.7 11.1 234.9)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='267.1' cy='-21.1' rx='29.6' ry='4.1' transform='rotate(-1.7 267.1 -21.1)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='267.1' cy='234.9' rx='29.6' ry='4.1' transform='rotate(-1.7 267.1 234.9)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='228.0' cy='133.0' rx='17.0' ry='3.8' transform='rotate(0.4 228.0 133.0)' fill='%23fff' opacity='0.22'/%3E%3Cellipse cx='157.3' cy='65.3' rx='21.3' ry='3.0' transform='rotate(0.9 157.3 65.3)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='129.0' cy='202.2' rx='17.1' ry='3.2' transform='rotate(1.6 129.0 202.2)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='150.4' cy='-21.2' rx='25.3' ry='2.5' transform='rotate(-1.4 150.4 -21.2)' fill='%23fff' opacity='0.23'/%3E%3Cellipse cx='150.4' cy='234.8' rx='25.3' ry='2.5' transform='rotate(-1.4 150.4 234.8)' fill='%23fff' opacity='0.23'/%3E%3Cellipse cx='174.4' cy='36.6' rx='26.1' ry='1.9' transform='rotate(-5.8 174.4 36.6)' fill='%23fff' opacity='0.45'/%3E%3Cellipse cx='160.2' cy='187.3' rx='23.3' ry='4.0' transform='rotate(-3.0 160.2 187.3)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='17.4' cy='-2.6' rx='20.6' ry='2.2' transform='rotate(-7.3 17.4 -2.6)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='17.4' cy='253.4' rx='20.6' ry='2.2' transform='rotate(-7.3 17.4 253.4)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='273.4' cy='-2.6' rx='20.6' ry='2.2' transform='rotate(-7.3 273.4 -2.6)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='273.4' cy='253.4' rx='20.6' ry='2.2' transform='rotate(-7.3 273.4 253.4)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='63.1' cy='87.9' rx='29.4' ry='2.3' transform='rotate(5.0 63.1 87.9)' fill='%23fff' opacity='0.29'/%3E%3Cellipse cx='48.1' cy='194.4' rx='29.4' ry='4.6' transform='rotate(2.0 48.1 194.4)' fill='%23000' opacity='0.25'/%3E%3Cellipse cx='-19.3' cy='214.2' rx='29.3' ry='2.5' transform='rotate(0.4 -19.3 214.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='236.7' cy='214.2' rx='29.3' ry='2.5' transform='rotate(0.4 236.7 214.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='204.6' cy='33.1' rx='28.6' ry='4.7' transform='rotate(5.0 204.6 33.1)' fill='%23000' opacity='0.44'/%3E%3Cellipse cx='204.6' cy='289.1' rx='28.6' ry='4.7' transform='rotate(5.0 204.6 289.1)' fill='%23000' opacity='0.44'/%3E%3Cellipse cx='202.7' cy='90.0' rx='11.6' ry='5.0' transform='rotate(-0.2 202.7 90.0)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='-27.7' cy='124.2' rx='21.4' ry='4.7' transform='rotate(-2.2 -27.7 124.2)' fill='%23fff' opacity='0.28'/%3E%3Cellipse cx='228.3' cy='124.2' rx='21.4' ry='4.7' transform='rotate(-2.2 228.3 124.2)' fill='%23fff' opacity='0.28'/%3E%3Cellipse cx='171.1' cy='33.4' rx='28.9' ry='2.0' transform='rotate(-3.2 171.1 33.4)' fill='%23000' opacity='0.17'/%3E%3Cellipse cx='171.1' cy='289.4' rx='28.9' ry='2.0' transform='rotate(-3.2 171.1 289.4)' fill='%23000' opacity='0.17'/%3E%3Cellipse cx='1.6' cy='-11.8' rx='31.0' ry='2.1' transform='rotate(5.8 1.6 -11.8)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='1.6' cy='244.2' rx='31.0' ry='2.1' transform='rotate(5.8 1.6 244.2)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='257.6' cy='-11.8' rx='31.0' ry='2.1' transform='rotate(5.8 257.6 -11.8)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='257.6' cy='244.2' rx='31.0' ry='2.1' transform='rotate(5.8 257.6 244.2)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='13.7' cy='186.9' rx='19.3' ry='3.1' transform='rotate(-1.0 13.7 186.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='269.7' cy='186.9' rx='19.3' ry='3.1' transform='rotate(-1.0 269.7 186.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='109.1' cy='170.7' rx='14.5' ry='1.6' transform='rotate(-1.6 109.1 170.7)' fill='%23fff' opacity='0.20'/%3E%3Cellipse cx='43.8' cy='152.2' rx='28.2' ry='2.5' transform='rotate(-8.5 43.8 152.2)' fill='%23000' opacity='0.17'/%3E%3Cellipse cx='87.5' cy='134.7' rx='29.4' ry='2.5' transform='rotate(-0.4 87.5 134.7)' fill='%23fff' opacity='0.24'/%3E%3Cellipse cx='33.6' cy='171.2' rx='22.9' ry='4.1' transform='rotate(7.6 33.6 171.2)' fill='%23fff' opacity='0.26'/%3E%3Cellipse cx='183.8' cy='47.5' rx='25.5' ry='5.0' transform='rotate(4.2 183.8 47.5)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='217.2' cy='64.4' rx='15.5' ry='5.0' transform='rotate(-8.6 217.2 64.4)' fill='%23000' opacity='0.42'/%3E%3Cellipse cx='189.7' cy='165.2' rx='17.8' ry='2.7' transform='rotate(-7.5 189.7 165.2)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='-8.9' cy='64.8' rx='22.0' ry='2.8' transform='rotate(-7.3 -8.9 64.8)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='247.1' cy='64.8' rx='22.0' ry='2.8' transform='rotate(-7.3 247.1 64.8)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='-10.2' cy='-5.1' rx='21.3' ry='3.1' transform='rotate(-0.1 -10.2 -5.1)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='-10.2' cy='250.9' rx='21.3' ry='3.1' transform='rotate(-0.1 -10.2 250.9)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='245.8' cy='-5.1' rx='21.3' ry='3.1' transform='rotate(-0.1 245.8 -5.1)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='245.8' cy='250.9' rx='21.3' ry='3.1' transform='rotate(-0.1 245.8 250.9)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='212.2' cy='-26.2' rx='19.1' ry='1.6' transform='rotate(7.8 212.2 -26.2)' fill='%23fff' opacity='0.38'/%3E%3Cellipse cx='212.2' cy='229.8' rx='19.1' ry='1.6' transform='rotate(7.8 212.2 229.8)' fill='%23fff' opacity='0.38'/%3E%3Cellipse cx='137.8' cy='36.0' rx='26.1' ry='3.5' transform='rotate(-5.8 137.8 36.0)' fill='%23000' opacity='0.39'/%3E%3Cellipse cx='77.7' cy='194.9' rx='23.4' ry='4.5' transform='rotate(-0.4 77.7 194.9)' fill='%23000' opacity='0.28'/%3E%3C/g%3E%3C/svg%3E");--kit-grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='0.6'/%3E%3C/svg%3E");--kit-dirt:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Crect width='16' height='16' fill='%233d2b1f'/%3E%3Cpath fill='%2335251a' d='M0 0h1v1h-1zM2 1h1v1h-1zM14 1h1v1h-1zM1 2h1v1h-1zM11 2h1v1h-1zM13 4h1v1h-1zM1 7h1v1h-1zM2 7h1v1h-1zM5 7h1v1h-1zM4 12h1v1h-1zM5 13h1v1h-1zM7 13h1v1h-1zM0 14h1v1h-1zM13 14h1v1h-1zM4 15h1v1h-1zM13 15h1v1h-1zM15 15h1v1h-1z'/%3E%3Cpath fill='%234d3828' d='M6 0h1v1h-1zM14 2h1v1h-1zM0 3h1v1h-1zM6 3h1v1h-1zM0 4h1v1h-1zM1 5h1v1h-1zM8 6h1v1h-1zM11 6h1v1h-1zM1 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 11h1v1h-1zM9 15h1v1h-1zM12 15h1v1h-1z'/%3E%3Cpath fill='%232f2117' d='M9 0h1v1h-1zM6 1h1v1h-1zM14 4h1v1h-1zM11 5h1v1h-1zM15 5h1v1h-1zM3 7h1v1h-1zM1 11h1v1h-1zM9 14h1v1h-1zM14 15h1v1h-1z'/%3E%3Cpath fill='%23463223' d='M11 0h1v1h-1zM3 1h1v1h-1zM14 5h1v1h-1zM14 6h1v1h-1zM5 8h1v1h-1zM14 13h1v1h-1zM6 14h1v1h-1z'/%3E%3C/svg%3E");--kit-dirt-dark:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Crect width='16' height='16' fill='%231d150f'/%3E%3Cpath fill='%2318110c' d='M0 0h1v1h-1zM2 1h1v1h-1zM14 1h1v1h-1zM1 2h1v1h-1zM11 2h1v1h-1zM13 4h1v1h-1zM1 7h1v1h-1zM2 7h1v1h-1zM5 7h1v1h-1zM4 12h1v1h-1zM5 13h1v1h-1zM7 13h1v1h-1zM0 14h1v1h-1zM13 14h1v1h-1zM4 15h1v1h-1zM13 15h1v1h-1zM15 15h1v1h-1z'/%3E%3Cpath fill='%23281d15' d='M6 0h1v1h-1zM14 2h1v1h-1zM0 3h1v1h-1zM6 3h1v1h-1zM0 4h1v1h-1zM1 5h1v1h-1zM8 6h1v1h-1zM11 6h1v1h-1zM1 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 11h1v1h-1zM9 15h1v1h-1zM12 15h1v1h-1z'/%3E%3Cpath fill='%23140e09' d='M9 0h1v1h-1zM6 1h1v1h-1zM14 4h1v1h-1zM11 5h1v1h-1zM15 5h1v1h-1zM3 7h1v1h-1zM1 11h1v1h-1zM9 14h1v1h-1zM14 15h1v1h-1z'/%3E%3Cpath fill='%23231a12' d='M11 0h1v1h-1zM3 1h1v1h-1zM14 5h1v1h-1zM14 6h1v1h-1zM5 8h1v1h-1zM14 13h1v1h-1zM6 14h1v1h-1z'/%3E%3C/svg%3E");--kit-paint-lilies:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 520' preserveAspectRatio='xMidYMid slice'%3E%3Cdefs%3E%3ClinearGradient id='bl-sky' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%23d9e7cf'/%3E%3Cstop offset='0.38' stop-color='%23c5ddd2'/%3E%3Cstop offset='0.5' stop-color='%23a7cbc6'/%3E%3Cstop offset='1' stop-color='%237eaab0'/%3E%3C/linearGradient%3E%3CradialGradient id='bl-sun' cx='0.72' cy='0.18' r='0.5'%3E%3Cstop offset='0' stop-color='%23fff4cf' stop-opacity='0.85'/%3E%3Cstop offset='1' stop-color='%23fff4cf' stop-opacity='0'/%3E%3C/radialGradient%3E%3Cfilter id='bl-paint' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.012 0.045' numOctaves='2' seed='3' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='16' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bl-water' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.006 0.08' numOctaves='2' seed='9' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='10' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bl-wash' x='-10%25' y='-20%25' width='120%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='9'/%3E%3C/filter%3E%3C/defs%3E%3Cg%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bl-sky)'/%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bl-sun)'/%3E%3C/g%3E%3Cg filter='url(%23bl-water)'%3E%3Cellipse cx='1506.7' cy='393.7' rx='89.6' ry='3.3' transform='rotate(1.8 1506.7 393.7)' fill='%23cfc6e4' opacity='0.27'/%3E%3Cellipse cx='165' cy='248.9' rx='52.1' ry='2.4' transform='rotate(-1 165 248.9)' fill='%23cfc6e4' opacity='0.5'/%3E%3Cellipse cx='1531.9' cy='350.2' rx='90.5' ry='2.4' transform='rotate(1.7 1531.9 350.2)' fill='%238fbcbc' opacity='0.33'/%3E%3Cellipse cx='765.3' cy='434' rx='104.7' ry='5.4' transform='rotate(0.6 765.3 434)' fill='%238fbcbc' opacity='0.36'/%3E%3Cellipse cx='818.9' cy='253.9' rx='24.9' ry='2.3' transform='rotate(-0.7 818.9 253.9)' fill='%23c4dcd6' opacity='0.57'/%3E%3Cellipse cx='434.7' cy='517.3' rx='53.4' ry='4.4' transform='rotate(1 434.7 517.3)' fill='%238fbcbc' opacity='0.57'/%3E%3Cellipse cx='628.4' cy='509.9' rx='101.7' ry='6' transform='rotate(0.2 628.4 509.9)' fill='%23a9cbe0' opacity='0.66'/%3E%3Cellipse cx='1146.7' cy='352.8' rx='69.6' ry='2.8' transform='rotate(0.7 1146.7 352.8)' fill='%23cfc6e4' opacity='0.71'/%3E%3Cellipse cx='975.2' cy='295.4' rx='20.6' ry='2.4' transform='rotate(1.2 975.2 295.4)' fill='%23cfc6e4' opacity='0.66'/%3E%3Cellipse cx='1370.6' cy='353.5' rx='100.9' ry='4' transform='rotate(1.6 1370.6 353.5)' fill='%23c4dcd6' opacity='0.3'/%3E%3Cellipse cx='1240.6' cy='512.1' rx='122.3' ry='3.3' transform='rotate(-1 1240.6 512.1)' fill='%238fbcbc' opacity='0.7'/%3E%3Cellipse cx='523.5' cy='387.6' rx='68.5' ry='2.2' transform='rotate(-0.4 523.5 387.6)' fill='%23eef2ee' opacity='0.59'/%3E%3Cellipse cx='1237' cy='379.2' rx='108.2' ry='4.8' transform='rotate(-1 1237 379.2)' fill='%23a9cbe0' opacity='0.68'/%3E%3Cellipse cx='1464.7' cy='420.6' rx='113' ry='3.2' transform='rotate(-1.1 1464.7 420.6)' fill='%23a9cbe0' opacity='0.31'/%3E%3Cellipse cx='748.6' cy='389.8' rx='91.6' ry='4' transform='rotate(-1.5 748.6 389.8)' fill='%23a9cbe0' opacity='0.6'/%3E%3Cellipse cx='798' cy='459.5' rx='63.1' ry='3.9' transform='rotate(-0.7 798 459.5)' fill='%238fbcbc' opacity='0.32'/%3E%3Cellipse cx='1500.6' cy='456.1' rx='83.5' ry='5' transform='rotate(-0.1 1500.6 456.1)' fill='%23a9cbe0' opacity='0.51'/%3E%3Cellipse cx='768.9' cy='496.1' rx='165.2' ry='5' transform='rotate(-0.5 768.9 496.1)' fill='%23c4dcd6' opacity='0.61'/%3E%3Cellipse cx='1560.3' cy='505.6' rx='57.1' ry='3' transform='rotate(-0.7 1560.3 505.6)' fill='%23cfc6e4' opacity='0.48'/%3E%3Cellipse cx='901.5' cy='412.1' rx='63.3' ry='2.6' transform='rotate(1.3 901.5 412.1)' fill='%238fbcbc' opacity='0.3'/%3E%3Cellipse cx='1473.4' cy='324.5' rx='87.1' ry='3.2' transform='rotate(-0.7 1473.4 324.5)' fill='%23cfc6e4' opacity='0.59'/%3E%3Cellipse cx='314.7' cy='320.3' rx='85.1' ry='2.5' transform='rotate(0.1 314.7 320.3)' fill='%238fbcbc' opacity='0.68'/%3E%3Cellipse cx='921.8' cy='495.6' rx='67.5' ry='3.7' transform='rotate(1 921.8 495.6)' fill='%23a9cbe0' opacity='0.44'/%3E%3Cellipse cx='29.3' cy='450.3' rx='80.4' ry='6.5' transform='rotate(-1.4 29.3 450.3)' fill='%23eef2ee' opacity='0.63'/%3E%3Cellipse cx='1263.4' cy='267.3' rx='17.5' ry='1.8' transform='rotate(-1.7 1263.4 267.3)' fill='%23a9cbe0' opacity='0.64'/%3E%3Cellipse cx='660.9' cy='401.4' rx='50.5' ry='2.6' transform='rotate(0.9 660.9 401.4)' fill='%238fbcbc' opacity='0.37'/%3E%3Cellipse cx='749.4' cy='347.9' rx='56.9' ry='2.5' transform='rotate(0.6 749.4 347.9)' fill='%238fbcbc' opacity='0.73'/%3E%3Cellipse cx='1384.3' cy='360.3' rx='66.5' ry='3.6' transform='rotate(0.9 1384.3 360.3)' fill='%23eef2ee' opacity='0.44'/%3E%3Cellipse cx='1559.3' cy='452.5' rx='100.4' ry='5.4' transform='rotate(-1.6 1559.3 452.5)' fill='%23a9cbe0' opacity='0.71'/%3E%3Cellipse cx='338.1' cy='352' rx='69.5' ry='4.2' transform='rotate(-0.4 338.1 352)' fill='%238fbcbc' opacity='0.7'/%3E%3Cellipse cx='1435.8' cy='260.1' rx='31' ry='1.6' transform='rotate(0.3 1435.8 260.1)' fill='%23a9cbe0' opacity='0.38'/%3E%3Cellipse cx='1172.1' cy='515.9' rx='40.3' ry='4.3' transform='rotate(-1.4 1172.1 515.9)' fill='%23a9cbe0' opacity='0.47'/%3E%3Cellipse cx='131.2' cy='419.9' rx='87.8' ry='5.4' transform='rotate(1.3 131.2 419.9)' fill='%238fbcbc' opacity='0.6'/%3E%3Cellipse cx='61.6' cy='402.9' rx='35.2' ry='4.8' transform='rotate(1.1 61.6 402.9)' fill='%23cfc6e4' opacity='0.74'/%3E%3Cellipse cx='789' cy='458.1' rx='83.2' ry='3.8' transform='rotate(1.2 789 458.1)' fill='%238fbcbc' opacity='0.71'/%3E%3Cellipse cx='1333.4' cy='404.2' rx='30.1' ry='4' transform='rotate(-1.8 1333.4 404.2)' fill='%238fbcbc' opacity='0.31'/%3E%3Cellipse cx='443.3' cy='390.7' rx='108.2' ry='4.2' transform='rotate(-1.7 443.3 390.7)' fill='%23c4dcd6' opacity='0.34'/%3E%3Cellipse cx='643.5' cy='502.1' rx='145.9' ry='4.4' transform='rotate(0.8 643.5 502.1)' fill='%23eef2ee' opacity='0.41'/%3E%3Cellipse cx='1534.1' cy='399.2' rx='80.1' ry='4.2' transform='rotate(-1.4 1534.1 399.2)' fill='%23a9cbe0' opacity='0.5'/%3E%3Cellipse cx='1395.3' cy='412.5' rx='117.1' ry='5.2' transform='rotate(0.9 1395.3 412.5)' fill='%23cfc6e4' opacity='0.49'/%3E%3Cellipse cx='521.4' cy='407.9' rx='87.3' ry='4.4' transform='rotate(-1.9 521.4 407.9)' fill='%23f3efe2' opacity='0.32'/%3E%3Cellipse cx='1423.4' cy='280.6' rx='50.1' ry='2.9' transform='rotate(-1.2 1423.4 280.6)' fill='%23a9cbe0' opacity='0.46'/%3E%3Cellipse cx='1479' cy='401.5' rx='49' ry='4.5' transform='rotate(-0.9 1479 401.5)' fill='%238fbcbc' opacity='0.38'/%3E%3Cellipse cx='1148.5' cy='514.1' rx='110.2' ry='4.1' transform='rotate(0.9 1148.5 514.1)' fill='%23cfc6e4' opacity='0.53'/%3E%3Cellipse cx='752.1' cy='316.1' rx='23.8' ry='1.7' transform='rotate(-1.9 752.1 316.1)' fill='%238fbcbc' opacity='0.71'/%3E%3Cellipse cx='73' cy='327.5' rx='58.6' ry='2.2' transform='rotate(0.8 73 327.5)' fill='%23eef2ee' opacity='0.61'/%3E%3Cellipse cx='740.5' cy='367.4' rx='89.4' ry='3.8' transform='rotate(-0.7 740.5 367.4)' fill='%23cfc6e4' opacity='0.65'/%3E%3Cellipse cx='1487.1' cy='436' rx='100.1' ry='5.7' transform='rotate(0.5 1487.1 436)' fill='%23f3efe2' opacity='0.7'/%3E%3Cellipse cx='1101' cy='305.4' rx='58.7' ry='1.5' transform='rotate(1.2 1101 305.4)' fill='%23c4dcd6' opacity='0.57'/%3E%3Cellipse cx='996.3' cy='290.4' rx='68.5' ry='2.7' transform='rotate(-0.3 996.3 290.4)' fill='%23f3efe2' opacity='0.47'/%3E%3Cellipse cx='388.9' cy='316.1' rx='48.1' ry='2.2' transform='rotate(-1.6 388.9 316.1)' fill='%238fbcbc' opacity='0.43'/%3E%3Cellipse cx='139.7' cy='275.8' rx='35.9' ry='2.8' transform='rotate(-1.1 139.7 275.8)' fill='%23c4dcd6' opacity='0.46'/%3E%3Cellipse cx='519.6' cy='495.1' rx='119' ry='4.6' transform='rotate(1 519.6 495.1)' fill='%23a9cbe0' opacity='0.57'/%3E%3Cellipse cx='62.5' cy='346.5' rx='75' ry='2.6' transform='rotate(-1.5 62.5 346.5)' fill='%23eef2ee' opacity='0.71'/%3E%3Cellipse cx='382.6' cy='429.6' rx='81.1' ry='3.8' transform='rotate(-1.8 382.6 429.6)' fill='%23eef2ee' opacity='0.52'/%3E%3Cellipse cx='1431' cy='426.5' rx='114.7' ry='3.8' transform='rotate(0.7 1431 426.5)' fill='%23c4dcd6' opacity='0.4'/%3E%3Cellipse cx='126.9' cy='442' rx='131.1' ry='3.9' transform='rotate(0.2 126.9 442)' fill='%23a9cbe0' opacity='0.53'/%3E%3Cellipse cx='1292.3' cy='507.2' rx='135.1' ry='3.2' transform='rotate(1.2 1292.3 507.2)' fill='%23eef2ee' opacity='0.44'/%3E%3Cellipse cx='1259' cy='388.9' rx='35.2' ry='4.3' transform='rotate(0 1259 388.9)' fill='%23f3efe2' opacity='0.49'/%3E%3Cellipse cx='845.9' cy='257.7' rx='24.2' ry='1.4' transform='rotate(1.2 845.9 257.7)' fill='%238fbcbc' opacity='0.52'/%3E%3Cellipse cx='1077.4' cy='297.8' rx='57.6' ry='2.9' transform='rotate(1.3 1077.4 297.8)' fill='%23eef2ee' opacity='0.35'/%3E%3Cellipse cx='1466' cy='329.5' rx='79.1' ry='2.1' transform='rotate(-1.4 1466 329.5)' fill='%23eef2ee' opacity='0.75'/%3E%3Cellipse cx='1357.5' cy='412.5' rx='40.9' ry='3.2' transform='rotate(0.9 1357.5 412.5)' fill='%23cfc6e4' opacity='0.66'/%3E%3Cellipse cx='1473.8' cy='275.1' rx='60.9' ry='2.7' transform='rotate(1.3 1473.8 275.1)' fill='%23a9cbe0' opacity='0.25'/%3E%3Cellipse cx='1365' cy='434.9' rx='129' ry='2.8' transform='rotate(-0.6 1365 434.9)' fill='%23c4dcd6' opacity='0.35'/%3E%3Cellipse cx='86' cy='269' rx='41.9' ry='2.2' transform='rotate(0.7 86 269)' fill='%23cfc6e4' opacity='0.42'/%3E%3Cellipse cx='1035.8' cy='315.1' rx='78.5' ry='2.3' transform='rotate(0.7 1035.8 315.1)' fill='%23c4dcd6' opacity='0.52'/%3E%3Cellipse cx='197.2' cy='511.5' rx='154.8' ry='5.9' transform='rotate(1.1 197.2 511.5)' fill='%23f3efe2' opacity='0.75'/%3E%3Cellipse cx='729.8' cy='497.2' rx='62.4' ry='7.2' transform='rotate(0.9 729.8 497.2)' fill='%23f3efe2' opacity='0.43'/%3E%3Cellipse cx='755.7' cy='384.7' rx='77.8' ry='2.7' transform='rotate(1.2 755.7 384.7)' fill='%238fbcbc' opacity='0.63'/%3E%3Cellipse cx='918' cy='322.6' rx='57.3' ry='1.7' transform='rotate(-0.4 918 322.6)' fill='%23a9cbe0' opacity='0.45'/%3E%3Cellipse cx='591.4' cy='298.7' rx='65.2' ry='3.3' transform='rotate(0.8 591.4 298.7)' fill='%23f3efe2' opacity='0.62'/%3E%3Cellipse cx='360.6' cy='481.7' rx='73' ry='4.5' transform='rotate(0.9 360.6 481.7)' fill='%23eef2ee' opacity='0.72'/%3E%3Cellipse cx='551.4' cy='322' rx='23.6' ry='3.6' transform='rotate(-1.6 551.4 322)' fill='%23c4dcd6' opacity='0.41'/%3E%3Cellipse cx='398.5' cy='322.2' rx='67.9' ry='3.4' transform='rotate(0.2 398.5 322.2)' fill='%23cfc6e4' opacity='0.66'/%3E%3Cellipse cx='100' cy='246' rx='38.5' ry='1' transform='rotate(0.5 100 246)' fill='%238fbcbc' opacity='0.71'/%3E%3Cellipse cx='361.3' cy='457.3' rx='123.8' ry='3.5' transform='rotate(-0.8 361.3 457.3)' fill='%23c4dcd6' opacity='0.42'/%3E%3Cellipse cx='698.6' cy='446.6' rx='107.1' ry='3.6' transform='rotate(-1.5 698.6 446.6)' fill='%23a9cbe0' opacity='0.69'/%3E%3Cellipse cx='387.8' cy='497.5' rx='83.8' ry='6.7' transform='rotate(-1.3 387.8 497.5)' fill='%23a9cbe0' opacity='0.62'/%3E%3Cellipse cx='388.6' cy='375.9' rx='104.7' ry='3.2' transform='rotate(-0.9 388.6 375.9)' fill='%23c4dcd6' opacity='0.35'/%3E%3Cellipse cx='1338.2' cy='432' rx='136.7' ry='4' transform='rotate(1.2 1338.2 432)' fill='%23f3efe2' opacity='0.46'/%3E%3Cellipse cx='792.1' cy='289.9' rx='43.5' ry='2.2' transform='rotate(0.3 792.1 289.9)' fill='%23f3efe2' opacity='0.41'/%3E%3Cellipse cx='1486.6' cy='516.5' rx='79.1' ry='3.2' transform='rotate(-0.1 1486.6 516.5)' fill='%23f3efe2' opacity='0.63'/%3E%3Cellipse cx='471.2' cy='314.5' rx='29.6' ry='3.7' transform='rotate(1.1 471.2 314.5)' fill='%238fbcbc' opacity='0.45'/%3E%3Cellipse cx='965.9' cy='412' rx='40.6' ry='3.6' transform='rotate(0.7 965.9 412)' fill='%23eef2ee' opacity='0.59'/%3E%3Cellipse cx='1215.6' cy='325.1' rx='23.3' ry='3' transform='rotate(-2 1215.6 325.1)' fill='%238fbcbc' opacity='0.55'/%3E%3Cellipse cx='877.8' cy='407.8' rx='55.5' ry='4.5' transform='rotate(1.3 877.8 407.8)' fill='%238fbcbc' opacity='0.65'/%3E%3Cellipse cx='929.2' cy='384' rx='103' ry='3.1' transform='rotate(0.9 929.2 384)' fill='%23cfc6e4' opacity='0.63'/%3E%3Cellipse cx='1127.6' cy='276.5' rx='45.9' ry='1.2' transform='rotate(0.3 1127.6 276.5)' fill='%238fbcbc' opacity='0.57'/%3E%3Cellipse cx='1527.8' cy='467.7' rx='50.8' ry='4.3' transform='rotate(-0.5 1527.8 467.7)' fill='%23eef2ee' opacity='0.49'/%3E%3Cellipse cx='863.6' cy='350.6' rx='42.6' ry='3.6' transform='rotate(0.5 863.6 350.6)' fill='%23a9cbe0' opacity='0.54'/%3E%3Cellipse cx='500.2' cy='405.6' rx='34.3' ry='2.8' transform='rotate(-1.4 500.2 405.6)' fill='%23a9cbe0' opacity='0.55'/%3E%3Cellipse cx='941.3' cy='497.2' rx='59.9' ry='7.2' transform='rotate(0.2 941.3 497.2)' fill='%23cfc6e4' opacity='0.68'/%3E%3Cellipse cx='1386.7' cy='335.4' rx='70.5' ry='2.6' transform='rotate(1.2 1386.7 335.4)' fill='%23a9cbe0' opacity='0.48'/%3E%3C/g%3E%3Cg filter='url(%23bl-wash)'%3E%3Cellipse cx='-12.9' cy='69.7' rx='150.6' ry='61.7' transform='rotate(3.5 -12.9 69.7)' fill='%235c8b57' opacity='0.26'/%3E%3Cellipse cx='137.4' cy='16.4' rx='154.5' ry='66.4' transform='rotate(-4.6 137.4 16.4)' fill='%236f9f5e' opacity='0.23'/%3E%3Cellipse cx='210.7' cy='8.6' rx='108.7' ry='35.1' transform='rotate(-0.5 210.7 8.6)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='278.5' cy='10' rx='103' ry='50' transform='rotate(8.5 278.5 10)' fill='%234e7d4a' opacity='0.37'/%3E%3Cellipse cx='269.2' cy='77' rx='173.3' ry='65.5' transform='rotate(5.2 269.2 77)' fill='%236f9f5e' opacity='0.41'/%3E%3Cellipse cx='441.8' cy='2' rx='106.4' ry='55.9' transform='rotate(-0.2 441.8 2)' fill='%237d9fb0' opacity='0.41'/%3E%3Cellipse cx='477.3' cy='0.1' rx='244.6' ry='42.8' transform='rotate(-5.7 477.3 0.1)' fill='%238e8fbf' opacity='0.43'/%3E%3Cellipse cx='525.8' cy='5.6' rx='166' ry='70.2' transform='rotate(-8.5 525.8 5.6)' fill='%234e7d4a' opacity='0.34'/%3E%3Cellipse cx='625.4' cy='38.5' rx='98.6' ry='54.5' transform='rotate(0.4 625.4 38.5)' fill='%234e7d4a' opacity='0.23'/%3E%3Cellipse cx='728.5' cy='10.9' rx='222.7' ry='46.4' transform='rotate(-0.8 728.5 10.9)' fill='%234e7d4a' opacity='0.28'/%3E%3Cellipse cx='834.7' cy='14.6' rx='190.8' ry='37.3' transform='rotate(2.8 834.7 14.6)' fill='%237d9fb0' opacity='0.44'/%3E%3Cellipse cx='888.5' cy='65.5' rx='187.9' ry='41.8' transform='rotate(2.6 888.5 65.5)' fill='%237d9fb0' opacity='0.28'/%3E%3Cellipse cx='937' cy='64.4' rx='217.6' ry='56.9' transform='rotate(-7.4 937 64.4)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='1069.3' cy='19.2' rx='231.9' ry='63.8' transform='rotate(-4.9 1069.3 19.2)' fill='%235c8b57' opacity='0.36'/%3E%3Cellipse cx='1097.1' cy='63.8' rx='190.7' ry='49.2' transform='rotate(9.1 1097.1 63.8)' fill='%237d9fb0' opacity='0.45'/%3E%3Cellipse cx='1170.9' cy='45.7' rx='100.5' ry='57.8' transform='rotate(2.1 1170.9 45.7)' fill='%235c8b57' opacity='0.41'/%3E%3Cellipse cx='1278.6' cy='65.3' rx='98.4' ry='73.4' transform='rotate(-8.9 1278.6 65.3)' fill='%234e7d4a' opacity='0.42'/%3E%3Cellipse cx='1344.7' cy='59.5' rx='139' ry='41.4' transform='rotate(3.9 1344.7 59.5)' fill='%237d9fb0' opacity='0.39'/%3E%3Cellipse cx='1476.5' cy='8.7' rx='223.5' ry='54.4' transform='rotate(5.4 1476.5 8.7)' fill='%234e7d4a' opacity='0.42'/%3E%3Cellipse cx='1535.8' cy='21' rx='180.2' ry='54.4' transform='rotate(-5.7 1535.8 21)' fill='%237d9fb0' opacity='0.38'/%3E%3Cellipse cx='1578.8' cy='2.5' rx='127.3' ry='67' transform='rotate(3.2 1578.8 2.5)' fill='%238e8fbf' opacity='0.24'/%3E%3C/g%3E%3Cg filter='url(%23bl-paint)'%3E%3Cellipse cx='1451.8' cy='69' rx='49.5' ry='11.4' transform='rotate(88.9 1451.8 69)' fill='%234e7d4a' opacity='0.42'/%3E%3Cellipse cx='436.9' cy='172.2' rx='37.8' ry='9.8' transform='rotate(102.3 436.9 172.2)' fill='%2386b26b' opacity='0.42'/%3E%3Cellipse cx='809.7' cy='29.7' rx='53.4' ry='5.7' transform='rotate(82.5 809.7 29.7)' fill='%23a9c98a' opacity='0.64'/%3E%3Cellipse cx='636.3' cy='11.1' rx='42.9' ry='7.1' transform='rotate(99.4 636.3 11.1)' fill='%234e7d4a' opacity='0.35'/%3E%3Cellipse cx='1525.1' cy='8.6' rx='47.2' ry='9.3' transform='rotate(104.2 1525.1 8.6)' fill='%233f6e45' opacity='0.45'/%3E%3Cellipse cx='827.5' cy='95.2' rx='22.3' ry='6' transform='rotate(99.2 827.5 95.2)' fill='%234e7d4a' opacity='0.72'/%3E%3Cellipse cx='1158.9' cy='67.9' rx='19.6' ry='6' transform='rotate(99.3 1158.9 67.9)' fill='%23a9c98a' opacity='0.52'/%3E%3Cellipse cx='1543.2' cy='5.1' rx='33.3' ry='9.2' transform='rotate(78.3 1543.2 5.1)' fill='%2386b26b' opacity='0.34'/%3E%3Cellipse cx='248.9' cy='135.7' rx='28.1' ry='12.6' transform='rotate(82.3 248.9 135.7)' fill='%23b9b3d9' opacity='0.43'/%3E%3Cellipse cx='193' cy='87' rx='19.7' ry='9.4' transform='rotate(102.2 193 87)' fill='%2386b26b' opacity='0.3'/%3E%3Cellipse cx='1491.4' cy='38.2' rx='51.6' ry='7' transform='rotate(77.6 1491.4 38.2)' fill='%23c8dcb0' opacity='0.53'/%3E%3Cellipse cx='105.1' cy='9.1' rx='52.8' ry='11.1' transform='rotate(82.4 105.1 9.1)' fill='%239a86c2' opacity='0.64'/%3E%3Cellipse cx='454.9' cy='101.7' rx='53' ry='8.2' transform='rotate(93.5 454.9 101.7)' fill='%239a86c2' opacity='0.67'/%3E%3Cellipse cx='514.4' cy='158.8' rx='19.9' ry='7' transform='rotate(103.3 514.4 158.8)' fill='%237fae74' opacity='0.68'/%3E%3Cellipse cx='1004.6' cy='17.3' rx='52.7' ry='8.7' transform='rotate(98.1 1004.6 17.3)' fill='%233f6e45' opacity='0.56'/%3E%3Cellipse cx='1439.5' cy='0.3' rx='47.1' ry='11.5' transform='rotate(96.3 1439.5 0.3)' fill='%235c8b57' opacity='0.71'/%3E%3Cellipse cx='1466.9' cy='105.8' rx='54.8' ry='5.5' transform='rotate(91.4 1466.9 105.8)' fill='%233f6e45' opacity='0.4'/%3E%3Cellipse cx='346.6' cy='45.4' rx='24.9' ry='8.8' transform='rotate(94.4 346.6 45.4)' fill='%237fae74' opacity='0.53'/%3E%3Cellipse cx='696.5' cy='63.9' rx='34.1' ry='11.2' transform='rotate(77.5 696.5 63.9)' fill='%234e7d4a' opacity='0.35'/%3E%3Cellipse cx='1200.9' cy='139' rx='45.6' ry='7' transform='rotate(102.1 1200.9 139)' fill='%236f9f5e' opacity='0.42'/%3E%3Cellipse cx='1316' cy='7.2' rx='45.9' ry='6.3' transform='rotate(100.9 1316 7.2)' fill='%23c8dcb0' opacity='0.59'/%3E%3Cellipse cx='1189.8' cy='19.4' rx='24.3' ry='11.1' transform='rotate(82.9 1189.8 19.4)' fill='%235c8b57' opacity='0.73'/%3E%3Cellipse cx='626.9' cy='20.8' rx='20.4' ry='8.8' transform='rotate(76.5 626.9 20.8)' fill='%234e7d4a' opacity='0.4'/%3E%3Cellipse cx='568' cy='152.2' rx='28.8' ry='5.1' transform='rotate(83.1 568 152.2)' fill='%239a86c2' opacity='0.69'/%3E%3Cellipse cx='699.4' cy='196.7' rx='22.7' ry='5.7' transform='rotate(75.6 699.4 196.7)' fill='%236f9f5e' opacity='0.53'/%3E%3Cellipse cx='234.1' cy='12.1' rx='26.7' ry='9.2' transform='rotate(105 234.1 12.1)' fill='%235c8b57' opacity='0.61'/%3E%3Cellipse cx='338.6' cy='142.4' rx='40.1' ry='9.3' transform='rotate(104.3 338.6 142.4)' fill='%237fae74' opacity='0.35'/%3E%3Cellipse cx='1008.4' cy='127.7' rx='25.1' ry='6.8' transform='rotate(75.3 1008.4 127.7)' fill='%23a9c98a' opacity='0.59'/%3E%3Cellipse cx='298.5' cy='117.1' rx='39.5' ry='11.6' transform='rotate(75.9 298.5 117.1)' fill='%233f6e45' opacity='0.66'/%3E%3Cellipse cx='702.7' cy='69.3' rx='48.4' ry='12.4' transform='rotate(85.6 702.7 69.3)' fill='%23b9b3d9' opacity='0.75'/%3E%3Cellipse cx='226.4' cy='49.9' rx='51.9' ry='10.2' transform='rotate(94.7 226.4 49.9)' fill='%235c8b57' opacity='0.3'/%3E%3Cellipse cx='1187.9' cy='20.8' rx='46.3' ry='5.6' transform='rotate(90.6 1187.9 20.8)' fill='%23b9b3d9' opacity='0.55'/%3E%3Cellipse cx='1053.5' cy='103.7' rx='37.3' ry='9.9' transform='rotate(84.2 1053.5 103.7)' fill='%23c8dcb0' opacity='0.58'/%3E%3Cellipse cx='757.6' cy='140.2' rx='27.9' ry='9.4' transform='rotate(76.4 757.6 140.2)' fill='%23b9b3d9' opacity='0.64'/%3E%3Cellipse cx='720.1' cy='102.3' rx='38.7' ry='8.2' transform='rotate(91.3 720.1 102.3)' fill='%2386b26b' opacity='0.44'/%3E%3Cellipse cx='901' cy='5.3' rx='26.5' ry='11.2' transform='rotate(75.4 901 5.3)' fill='%23c8dcb0' opacity='0.34'/%3E%3Cellipse cx='553.1' cy='141.3' rx='37.6' ry='12.7' transform='rotate(95 553.1 141.3)' fill='%239a86c2' opacity='0.64'/%3E%3Cellipse cx='1561.2' cy='41.1' rx='24.1' ry='11.4' transform='rotate(86 1561.2 41.1)' fill='%239a86c2' opacity='0.73'/%3E%3Cellipse cx='1297.5' cy='17.9' rx='47.5' ry='9.3' transform='rotate(87.2 1297.5 17.9)' fill='%23c8dcb0' opacity='0.34'/%3E%3Cellipse cx='1302' cy='167.4' rx='55' ry='7.4' transform='rotate(98.1 1302 167.4)' fill='%2386b26b' opacity='0.58'/%3E%3Cellipse cx='766.8' cy='140.8' rx='53.9' ry='7.3' transform='rotate(100.6 766.8 140.8)' fill='%234e7d4a' opacity='0.43'/%3E%3Cellipse cx='577.8' cy='201.7' rx='45.5' ry='12.9' transform='rotate(80.5 577.8 201.7)' fill='%237fae74' opacity='0.48'/%3E%3Cellipse cx='346.8' cy='203.9' rx='48' ry='5.2' transform='rotate(101.3 346.8 203.9)' fill='%23b9b3d9' opacity='0.34'/%3E%3Cellipse cx='1539' cy='212.3' rx='29.6' ry='5.2' transform='rotate(104.2 1539 212.3)' fill='%2386b26b' opacity='0.66'/%3E%3Cellipse cx='252.2' cy='112.5' rx='29.2' ry='11' transform='rotate(102.4 252.2 112.5)' fill='%236f9f5e' opacity='0.69'/%3E%3Cellipse cx='958.4' cy='118.9' rx='43' ry='12.6' transform='rotate(82.3 958.4 118.9)' fill='%239a86c2' opacity='0.42'/%3E%3Cellipse cx='1076.1' cy='109' rx='28.1' ry='8.8' transform='rotate(82.9 1076.1 109)' fill='%233f6e45' opacity='0.35'/%3E%3Cellipse cx='475.3' cy='28.6' rx='38' ry='8.3' transform='rotate(89.3 475.3 28.6)' fill='%23c8dcb0' opacity='0.37'/%3E%3Cellipse cx='72.6' cy='187.8' rx='24.1' ry='9.5' transform='rotate(74.7 72.6 187.8)' fill='%239a86c2' opacity='0.54'/%3E%3Cellipse cx='695.6' cy='242.6' rx='37.5' ry='6.7' transform='rotate(99.2 695.6 242.6)' fill='%235c8b57' opacity='0.74'/%3E%3Cellipse cx='224.8' cy='64' rx='17.9' ry='9.9' transform='rotate(105.8 224.8 64)' fill='%237fae74' opacity='0.66'/%3E%3Cellipse cx='248.6' cy='5.8' rx='44.8' ry='9' transform='rotate(94.7 248.6 5.8)' fill='%23c8dcb0' opacity='0.34'/%3E%3Cellipse cx='1399.1' cy='156.5' rx='35.7' ry='10.1' transform='rotate(98.2 1399.1 156.5)' fill='%236f9f5e' opacity='0.53'/%3E%3Cellipse cx='78.3' cy='29.2' rx='36' ry='5' transform='rotate(98 78.3 29.2)' fill='%2386b26b' opacity='0.41'/%3E%3Cellipse cx='394.7' cy='0.1' rx='31.3' ry='8' transform='rotate(88 394.7 0.1)' fill='%239a86c2' opacity='0.32'/%3E%3Cellipse cx='1244.6' cy='13' rx='27.6' ry='6.4' transform='rotate(79.8 1244.6 13)' fill='%235c8b57' opacity='0.38'/%3E%3Cellipse cx='953.9' cy='129.1' rx='46.9' ry='7.4' transform='rotate(93.4 953.9 129.1)' fill='%237fae74' opacity='0.68'/%3E%3Cellipse cx='931.2' cy='1.3' rx='41' ry='9.8' transform='rotate(75.7 931.2 1.3)' fill='%237fae74' opacity='0.4'/%3E%3Cellipse cx='710.1' cy='96.2' rx='26.3' ry='12.4' transform='rotate(91.7 710.1 96.2)' fill='%236f9f5e' opacity='0.42'/%3E%3Cellipse cx='1354' cy='214.2' rx='41.8' ry='10.2' transform='rotate(74.9 1354 214.2)' fill='%2386b26b' opacity='0.41'/%3E%3Cellipse cx='980.9' cy='28.9' rx='40.3' ry='9' transform='rotate(82 980.9 28.9)' fill='%2386b26b' opacity='0.5'/%3E%3Cellipse cx='774.9' cy='5.2' rx='24' ry='6.4' transform='rotate(96.9 774.9 5.2)' fill='%2386b26b' opacity='0.42'/%3E%3Cellipse cx='734.1' cy='111.3' rx='39.3' ry='7.9' transform='rotate(99.3 734.1 111.3)' fill='%237fae74' opacity='0.68'/%3E%3Cellipse cx='276.8' cy='27.7' rx='27.4' ry='10.7' transform='rotate(103 276.8 27.7)' fill='%233f6e45' opacity='0.47'/%3E%3Cellipse cx='415' cy='63.7' rx='44.2' ry='10.5' transform='rotate(83.6 415 63.7)' fill='%23b9b3d9' opacity='0.47'/%3E%3Cellipse cx='100.9' cy='105' rx='22.5' ry='11.6' transform='rotate(88.3 100.9 105)' fill='%2386b26b' opacity='0.64'/%3E%3Cellipse cx='865.5' cy='27.1' rx='37.8' ry='7.2' transform='rotate(80 865.5 27.1)' fill='%234e7d4a' opacity='0.57'/%3E%3Cellipse cx='600' cy='139.5' rx='53.4' ry='7.9' transform='rotate(99.1 600 139.5)' fill='%23a9c98a' opacity='0.47'/%3E%3Cellipse cx='1154.2' cy='88.7' rx='39' ry='9' transform='rotate(84.6 1154.2 88.7)' fill='%23c8dcb0' opacity='0.47'/%3E%3Cellipse cx='887.4' cy='195.6' rx='37.8' ry='6.5' transform='rotate(88.2 887.4 195.6)' fill='%233f6e45' opacity='0.71'/%3E%3Cellipse cx='620.4' cy='26.1' rx='21.1' ry='11.6' transform='rotate(98.9 620.4 26.1)' fill='%234e7d4a' opacity='0.45'/%3E%3Cellipse cx='1314.6' cy='31.5' rx='48.9' ry='12.1' transform='rotate(85.9 1314.6 31.5)' fill='%2386b26b' opacity='0.4'/%3E%3Cellipse cx='762.9' cy='74.6' rx='18.7' ry='7.8' transform='rotate(87.7 762.9 74.6)' fill='%239a86c2' opacity='0.43'/%3E%3Cellipse cx='502.1' cy='43.8' rx='46.9' ry='12.1' transform='rotate(91.1 502.1 43.8)' fill='%239a86c2' opacity='0.35'/%3E%3Cellipse cx='311' cy='9.6' rx='28.6' ry='5.1' transform='rotate(76.8 311 9.6)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='509.7' cy='106.1' rx='32.4' ry='12.8' transform='rotate(104.7 509.7 106.1)' fill='%236f9f5e' opacity='0.59'/%3E%3Cellipse cx='1235.5' cy='18.3' rx='31.6' ry='8.5' transform='rotate(78.1 1235.5 18.3)' fill='%2386b26b' opacity='0.32'/%3E%3Cellipse cx='303.7' cy='84.7' rx='42.9' ry='10.7' transform='rotate(94.9 303.7 84.7)' fill='%23c8dcb0' opacity='0.53'/%3E%3Cellipse cx='1120.2' cy='132.6' rx='55.1' ry='9.2' transform='rotate(94.8 1120.2 132.6)' fill='%23b9b3d9' opacity='0.54'/%3E%3Cellipse cx='770.1' cy='148.6' rx='25.8' ry='9.7' transform='rotate(82.3 770.1 148.6)' fill='%2386b26b' opacity='0.38'/%3E%3Cellipse cx='1018.6' cy='6.5' rx='26.3' ry='8.7' transform='rotate(97.4 1018.6 6.5)' fill='%239a86c2' opacity='0.67'/%3E%3Cellipse cx='162.6' cy='137' rx='38.2' ry='10.7' transform='rotate(105 162.6 137)' fill='%233f6e45' opacity='0.63'/%3E%3Cellipse cx='1295.6' cy='0.1' rx='39.2' ry='12.4' transform='rotate(75.5 1295.6 0.1)' fill='%2386b26b' opacity='0.65'/%3E%3Cellipse cx='572.4' cy='0.1' rx='27.7' ry='11.7' transform='rotate(87 572.4 0.1)' fill='%23c8dcb0' opacity='0.51'/%3E%3Cellipse cx='761.7' cy='46.5' rx='47.2' ry='12.1' transform='rotate(92.3 761.7 46.5)' fill='%233f6e45' opacity='0.51'/%3E%3Cellipse cx='39.5' cy='24.8' rx='48.4' ry='8.4' transform='rotate(78.4 39.5 24.8)' fill='%23c8dcb0' opacity='0.66'/%3E%3Cellipse cx='487.8' cy='77.5' rx='46.5' ry='7.7' transform='rotate(97.8 487.8 77.5)' fill='%2386b26b' opacity='0.3'/%3E%3Cellipse cx='97.9' cy='2.1' rx='22.4' ry='8.1' transform='rotate(98.8 97.9 2.1)' fill='%234e7d4a' opacity='0.73'/%3E%3Cellipse cx='304.2' cy='32.8' rx='37.6' ry='11.8' transform='rotate(100.5 304.2 32.8)' fill='%239a86c2' opacity='0.38'/%3E%3Cellipse cx='862.5' cy='11.1' rx='48.1' ry='6' transform='rotate(101.2 862.5 11.1)' fill='%235c8b57' opacity='0.66'/%3E%3Cellipse cx='1476.1' cy='0.5' rx='21.1' ry='9.4' transform='rotate(95.6 1476.1 0.5)' fill='%23a9c98a' opacity='0.65'/%3E%3Cellipse cx='55.4' cy='4.1' rx='28.4' ry='10' transform='rotate(82.2 55.4 4.1)' fill='%234e7d4a' opacity='0.47'/%3E%3Cellipse cx='49' cy='155.4' rx='53.2' ry='12.9' transform='rotate(99.3 49 155.4)' fill='%23c8dcb0' opacity='0.71'/%3E%3Cellipse cx='332.6' cy='181.8' rx='42.5' ry='6.5' transform='rotate(85.4 332.6 181.8)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='1276.8' cy='48.1' rx='38.1' ry='10.1' transform='rotate(87 1276.8 48.1)' fill='%23a9c98a' opacity='0.66'/%3E%3Cellipse cx='673' cy='237.2' rx='46.1' ry='6.7' transform='rotate(77.6 673 237.2)' fill='%23c8dcb0' opacity='0.73'/%3E%3Cellipse cx='278.2' cy='29.6' rx='33.5' ry='7.4' transform='rotate(87.8 278.2 29.6)' fill='%23c8dcb0' opacity='0.75'/%3E%3Cellipse cx='94.7' cy='230.5' rx='21' ry='9.3' transform='rotate(101.3 94.7 230.5)' fill='%235c8b57' opacity='0.42'/%3E%3Cellipse cx='239.2' cy='68.3' rx='34' ry='11.1' transform='rotate(84.5 239.2 68.3)' fill='%233f6e45' opacity='0.5'/%3E%3Cellipse cx='925.5' cy='50.9' rx='46.3' ry='5.6' transform='rotate(102 925.5 50.9)' fill='%239a86c2' opacity='0.42'/%3E%3Cellipse cx='850.1' cy='41.5' rx='32.2' ry='12.7' transform='rotate(90.6 850.1 41.5)' fill='%239a86c2' opacity='0.74'/%3E%3Cellipse cx='623.7' cy='222.2' rx='32.1' ry='11.5' transform='rotate(88.5 623.7 222.2)' fill='%234e7d4a' opacity='0.65'/%3E%3Cellipse cx='1056.1' cy='16' rx='41.5' ry='11.2' transform='rotate(81.6 1056.1 16)' fill='%239a86c2' opacity='0.37'/%3E%3Cellipse cx='1245.6' cy='23.5' rx='19.4' ry='8.6' transform='rotate(80.5 1245.6 23.5)' fill='%23a9c98a' opacity='0.63'/%3E%3Cellipse cx='1522.1' cy='3.8' rx='18' ry='10.1' transform='rotate(104.8 1522.1 3.8)' fill='%2386b26b' opacity='0.66'/%3E%3Cellipse cx='1143.5' cy='17.9' rx='31' ry='8.6' transform='rotate(83.3 1143.5 17.9)' fill='%233f6e45' opacity='0.64'/%3E%3Cellipse cx='1347' cy='78.8' rx='37.2' ry='11.7' transform='rotate(93.4 1347 78.8)' fill='%2386b26b' opacity='0.6'/%3E%3Cellipse cx='273' cy='206.5' rx='39.8' ry='10.5' transform='rotate(90.1 273 206.5)' fill='%2386b26b' opacity='0.52'/%3E%3Cellipse cx='1343.8' cy='51.2' rx='36.2' ry='8.3' transform='rotate(94.1 1343.8 51.2)' fill='%236f9f5e' opacity='0.58'/%3E%3Cellipse cx='75.5' cy='21.9' rx='39.2' ry='13' transform='rotate(99.6 75.5 21.9)' fill='%234e7d4a' opacity='0.48'/%3E%3Cellipse cx='726.8' cy='235.1' rx='49' ry='6.3' transform='rotate(91.6 726.8 235.1)' fill='%23c8dcb0' opacity='0.71'/%3E%3Cellipse cx='121.8' cy='0' rx='50.7' ry='7.5' transform='rotate(94.8 121.8 0)' fill='%236f9f5e' opacity='0.47'/%3E%3Cellipse cx='390.7' cy='0' rx='53.8' ry='5.8' transform='rotate(102.5 390.7 0)' fill='%239a86c2' opacity='0.61'/%3E%3Cellipse cx='689.2' cy='10.1' rx='43.8' ry='6.9' transform='rotate(90.1 689.2 10.1)' fill='%236f9f5e' opacity='0.52'/%3E%3Cellipse cx='1221.5' cy='6.3' rx='51' ry='5.4' transform='rotate(82.7 1221.5 6.3)' fill='%233f6e45' opacity='0.68'/%3E%3Cellipse cx='778' cy='117.7' rx='31.5' ry='11.3' transform='rotate(74.6 778 117.7)' fill='%236f9f5e' opacity='0.39'/%3E%3Cellipse cx='478.8' cy='123.8' rx='25.3' ry='8.6' transform='rotate(93.7 478.8 123.8)' fill='%234e7d4a' opacity='0.36'/%3E%3Cellipse cx='572.4' cy='220.5' rx='19.6' ry='10.5' transform='rotate(82.4 572.4 220.5)' fill='%2386b26b' opacity='0.53'/%3E%3Cellipse cx='39.4' cy='67.4' rx='40.2' ry='7.3' transform='rotate(96.8 39.4 67.4)' fill='%23c8dcb0' opacity='0.47'/%3E%3Cellipse cx='785' cy='0.6' rx='34.8' ry='9.9' transform='rotate(105 785 0.6)' fill='%234e7d4a' opacity='0.34'/%3E%3Cellipse cx='615.2' cy='136.3' rx='32.1' ry='5.9' transform='rotate(95.1 615.2 136.3)' fill='%239a86c2' opacity='0.62'/%3E%3Cellipse cx='379.1' cy='1.2' rx='20.5' ry='10.6' transform='rotate(81 379.1 1.2)' fill='%23c8dcb0' opacity='0.45'/%3E%3Cellipse cx='436.6' cy='2.3' rx='31' ry='11.7' transform='rotate(87 436.6 2.3)' fill='%233f6e45' opacity='0.35'/%3E%3Cellipse cx='181' cy='25.3' rx='22' ry='7.6' transform='rotate(89.7 181 25.3)' fill='%236f9f5e' opacity='0.52'/%3E%3Cellipse cx='427.7' cy='218.9' rx='20.5' ry='7.9' transform='rotate(84.2 427.7 218.9)' fill='%235c8b57' opacity='0.65'/%3E%3Cellipse cx='745.4' cy='77' rx='42.6' ry='9.6' transform='rotate(96 745.4 77)' fill='%234e7d4a' opacity='0.5'/%3E%3Cellipse cx='178.7' cy='91.6' rx='48.6' ry='7.4' transform='rotate(99.2 178.7 91.6)' fill='%235c8b57' opacity='0.69'/%3E%3Cellipse cx='406.5' cy='213.6' rx='47.3' ry='12.6' transform='rotate(79.4 406.5 213.6)' fill='%2386b26b' opacity='0.58'/%3E%3Cellipse cx='1470.4' cy='36' rx='39.9' ry='10.4' transform='rotate(99.4 1470.4 36)' fill='%236f9f5e' opacity='0.54'/%3E%3Cellipse cx='1241.8' cy='11.6' rx='19.7' ry='7.9' transform='rotate(105.8 1241.8 11.6)' fill='%236f9f5e' opacity='0.73'/%3E%3Cellipse cx='631.1' cy='3.8' rx='33.6' ry='11.3' transform='rotate(92.4 631.1 3.8)' fill='%233f6e45' opacity='0.3'/%3E%3Cellipse cx='117.9' cy='100.4' rx='39.4' ry='6.2' transform='rotate(83.4 117.9 100.4)' fill='%2386b26b' opacity='0.52'/%3E%3C/g%3E%3Cg filter='url(%23bl-paint)'%3E%3Cellipse cx='1391.2' cy='362.1' rx='39.6' ry='12.2' transform='rotate(-2.5 1391.2 362.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1388.7' cy='359.7' rx='39.6' ry='12.2' transform='rotate(-2.3 1388.7 359.7)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1378.8' cy='356' rx='19.8' ry='4.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1387.3' cy='354.8' rx='8.5' ry='4.5' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='1387.3' cy='353.1' rx='4.5' ry='3.1' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1387.3' cy='353.7' r='1.6' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1360.4' cy='382.6' rx='22.7' ry='6.9' transform='rotate(2.7 1360.4 382.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1357.9' cy='380.2' rx='22.7' ry='6.9' transform='rotate(3 1357.9 380.2)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1352.2' cy='378.1' rx='11.4' ry='2.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1400.7' cy='386.4' rx='34' ry='10' transform='rotate(-1.7 1400.7 386.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1398.3' cy='384' rx='34' ry='10' transform='rotate(3.1 1398.3 384)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1389.8' cy='381' rx='17' ry='3.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1399' cy='380' rx='9.9' ry='5.3' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='1399' cy='378' rx='5.3' ry='3.6' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1399' cy='378.7' r='1.9' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1337.2' cy='365.8' rx='43.4' ry='13.2' transform='rotate(3.2 1337.2 365.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1334.7' cy='363.4' rx='43.4' ry='13.2' transform='rotate(-1.3 1334.7 363.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1323.9' cy='359.4' rx='21.7' ry='4.6' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1337.3' cy='364.6' rx='34.3' ry='8.6' transform='rotate(1.7 1337.3 364.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1334.8' cy='362.1' rx='34.3' ry='8.6' transform='rotate(0.9 1334.8 362.1)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='1326.2' cy='359.5' rx='17.2' ry='3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1348.5' cy='358.7' rx='10.5' ry='5.6' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='1348.5' cy='356.6' rx='5.6' ry='3.8' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1348.5' cy='357.3' r='2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='70.3' cy='432.4' rx='39.1' ry='10.5' transform='rotate(-2.3 70.3 432.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='66.9' cy='429' rx='39.1' ry='10.5' transform='rotate(-2.4 66.9 429)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='57.1' cy='425.9' rx='19.6' ry='3.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='74.9' cy='424.8' rx='16.7' ry='8.9' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='74.9' cy='421.5' rx='8.9' ry='6.1' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='74.9' cy='422.6' r='3.1' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='199.3' cy='456.8' rx='58.2' ry='18.5' transform='rotate(-0.8 199.3 456.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='195.9' cy='453.4' rx='58.2' ry='18.5' transform='rotate(0.7 195.9 453.4)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='181.3' cy='447.9' rx='29.1' ry='6.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='117.4' cy='463.1' rx='60.7' ry='16.1' transform='rotate(2.2 117.4 463.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='114.1' cy='459.8' rx='60.7' ry='16.1' transform='rotate(-3.5 114.1 459.8)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='98.9' cy='454.9' rx='30.3' ry='5.6' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='117.6' cy='453.3' rx='9.9' ry='5.3' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='117.6' cy='451.3' rx='5.3' ry='3.6' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='117.6' cy='452' r='1.8' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='785.2' cy='481' rx='50.1' ry='14.9' transform='rotate(1.4 785.2 481)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='781.6' cy='477.3' rx='50.1' ry='14.9' transform='rotate(3.1 781.6 477.3)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='769.1' cy='472.9' rx='25.1' ry='5.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='723.6' cy='458.7' rx='58.6' ry='14.6' transform='rotate(-0.6 723.6 458.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='719.9' cy='455' rx='58.6' ry='14.6' transform='rotate(-0.5 719.9 455)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='705.3' cy='450.6' rx='29.3' ry='5.1' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='729.9' cy='449.2' rx='13.7' ry='7.3' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='729.9' cy='446.4' rx='7.3' ry='5' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='729.9' cy='447.3' r='2.6' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='731.5' cy='450.9' rx='46.3' ry='12.6' transform='rotate(3.5 731.5 450.9)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='727.9' cy='447.3' rx='46.3' ry='12.6' transform='rotate(-0.8 727.9 447.3)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='716.3' cy='443.5' rx='23.2' ry='4.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='713.9' cy='442.2' rx='14.6' ry='7.8' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='713.9' cy='439.3' rx='7.8' ry='5.3' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='713.9' cy='440.3' r='2.7' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='647.4' cy='475.1' rx='39.6' ry='10.8' transform='rotate(2.3 647.4 475.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='643.8' cy='471.4' rx='39.6' ry='10.8' transform='rotate(1.2 643.8 471.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='633.9' cy='468.2' rx='19.8' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='641.1' cy='467.1' rx='16.4' ry='8.8' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='641.1' cy='463.8' rx='8.8' ry='6' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='641.1' cy='464.9' r='3.1' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='711' cy='487.8' rx='56.2' ry='13.8' transform='rotate(0.5 711 487.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='707.3' cy='484.1' rx='56.2' ry='13.8' transform='rotate(-1 707.3 484.1)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='693.3' cy='480' rx='28.1' ry='4.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='679.7' cy='472.7' rx='56' ry='14.8' transform='rotate(-2.9 679.7 472.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='676.1' cy='469' rx='56' ry='14.8' transform='rotate(-1.2 676.1 469)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='662.1' cy='464.6' rx='28' ry='5.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='594.8' cy='461.3' rx='47.8' ry='13.3' transform='rotate(1.1 594.8 461.3)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='591.1' cy='457.7' rx='47.8' ry='13.3' transform='rotate(-0.5 591.1 457.7)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='579.2' cy='453.7' rx='23.9' ry='4.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='574.4' cy='452.3' rx='12' ry='6.4' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='574.4' cy='449.9' rx='6.4' ry='4.4' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='574.4' cy='450.7' r='2.2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='763.1' cy='392.7' rx='36.1' ry='9.4' transform='rotate(0.5 763.1 392.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='760.4' cy='390' rx='36.1' ry='9.4' transform='rotate(-2.9 760.4 390)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='751.4' cy='387.2' rx='18' ry='3.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='768.2' cy='386.2' rx='11.5' ry='6.2' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='768.2' cy='383.9' rx='6.2' ry='4.2' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='768.2' cy='384.7' r='2.2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='773.5' cy='399.8' rx='26' ry='6.8' transform='rotate(3.5 773.5 399.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='770.8' cy='397.1' rx='26' ry='6.8' transform='rotate(-2.6 770.8 397.1)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='764.3' cy='395.1' rx='13' ry='2.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='807.8' cy='389.2' rx='24.3' ry='6.4' transform='rotate(3.2 807.8 389.2)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='805.1' cy='386.5' rx='24.3' ry='6.4' transform='rotate(3.9 805.1 386.5)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='799' cy='384.6' rx='12.2' ry='2.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='801' cy='383.9' rx='10.7' ry='5.7' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='801' cy='381.8' rx='5.7' ry='3.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='801' cy='382.5' r='2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='818.1' cy='399.7' rx='24.8' ry='6.2' transform='rotate(-1.1 818.1 399.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='815.5' cy='397' rx='24.8' ry='6.2' transform='rotate(3.4 815.5 397)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='809.3' cy='395.1' rx='12.4' ry='2.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='824.1' cy='394.5' rx='9.6' ry='5.1' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='824.1' cy='392.6' rx='5.1' ry='3.5' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='824.1' cy='393.2' r='1.8' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='788.9' cy='401.1' rx='25.4' ry='7.4' transform='rotate(0 788.9 401.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='786.2' cy='398.4' rx='25.4' ry='7.4' transform='rotate(1.9 786.2 398.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='779.9' cy='396.2' rx='12.7' ry='2.6' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1163.6' cy='406.3' rx='49.5' ry='14.2' transform='rotate(-1.6 1163.6 406.3)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1160.9' cy='403.6' rx='49.5' ry='14.2' transform='rotate(-2.4 1160.9 403.6)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1148.5' cy='399.3' rx='24.8' ry='5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1151.8' cy='397.9' rx='13.6' ry='7.2' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='1151.8' cy='395.2' rx='7.2' ry='5' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1151.8' cy='396.1' r='2.5' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1076.4' cy='390.6' rx='35.2' ry='10.8' transform='rotate(-2.2 1076.4 390.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1073.7' cy='387.9' rx='35.2' ry='10.8' transform='rotate(0.9 1073.7 387.9)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1064.9' cy='384.7' rx='17.6' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1073.3' cy='383.6' rx='7.9' ry='4.2' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='1073.3' cy='382' rx='4.2' ry='2.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1073.3' cy='382.5' r='1.5' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1105.7' cy='392.4' rx='29.2' ry='7.2' transform='rotate(-1.3 1105.7 392.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1103' cy='389.7' rx='29.2' ry='7.2' transform='rotate(-0.3 1103 389.7)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='1095.7' cy='387.5' rx='14.6' ry='2.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1100.3' cy='384.7' rx='39.3' ry='10.5' transform='rotate(2.8 1100.3 384.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1097.6' cy='382' rx='39.3' ry='10.5' transform='rotate(3.6 1097.6 382)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1087.7' cy='378.8' rx='19.7' ry='3.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1204.1' cy='385.5' rx='38.8' ry='10.8' transform='rotate(2.3 1204.1 385.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1201.3' cy='382.8' rx='38.8' ry='10.8' transform='rotate(-3.1 1201.3 382.8)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1191.7' cy='379.5' rx='19.4' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1080.7' cy='403.5' rx='25.3' ry='6.7' transform='rotate(-0.2 1080.7 403.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1078' cy='400.8' rx='25.3' ry='6.7' transform='rotate(-1.4 1078 400.8)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='1071.6' cy='398.7' rx='12.7' ry='2.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1082' cy='394.4' rx='28.9' ry='8' transform='rotate(0.1 1082 394.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1079.3' cy='391.7' rx='28.9' ry='8' transform='rotate(-0.2 1079.3 391.7)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1072.1' cy='389.3' rx='14.5' ry='2.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1350.2' cy='317.8' rx='24.5' ry='7.1' transform='rotate(3.2 1350.2 317.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1348.3' cy='315.9' rx='24.5' ry='7.1' transform='rotate(1.2 1348.3 315.9)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1342.2' cy='313.8' rx='12.2' ry='2.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1349' cy='313.1' rx='7.8' ry='4.1' fill='%23fff7f0' opacity='0.95'/%3E%3Cellipse cx='1349' cy='311.5' rx='4.1' ry='2.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1349' cy='312.1' r='1.5' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1302.5' cy='324.7' rx='16.1' ry='4.9' transform='rotate(-2.3 1302.5 324.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1300.7' cy='322.9' rx='16.1' ry='4.9' transform='rotate(-3.5 1300.7 322.9)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1296.6' cy='321.4' rx='8.1' ry='1.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1317.5' cy='321.7' rx='26.3' ry='6.6' transform='rotate(-0.4 1317.5 321.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1315.7' cy='319.9' rx='26.3' ry='6.6' transform='rotate(-3.3 1315.7 319.9)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1309.1' cy='317.9' rx='13.1' ry='2.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1317.7' cy='317.2' rx='4.9' ry='2.6' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='1317.7' cy='316.2' rx='2.6' ry='1.8' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1317.7' cy='316.6' r='0.9' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1289.6' cy='326.1' rx='33.8' ry='9.7' transform='rotate(1.4 1289.6 326.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1287.8' cy='324.3' rx='33.8' ry='9.7' transform='rotate(2.2 1287.8 324.3)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1279.4' cy='321.4' rx='16.9' ry='3.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1279.5' cy='320.4' rx='4.9' ry='2.6' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='1279.5' cy='319.4' rx='2.6' ry='1.8' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1279.5' cy='319.8' r='0.9' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1239.9' cy='320.2' rx='31' ry='7.9' transform='rotate(-0.5 1239.9 320.2)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1238' cy='318.4' rx='31' ry='7.9' transform='rotate(0.7 1238 318.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1230.3' cy='316' rx='15.5' ry='2.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1357.7' cy='319.4' rx='32.2' ry='8.6' transform='rotate(1.3 1357.7 319.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1355.9' cy='317.6' rx='32.2' ry='8.6' transform='rotate(-0.9 1355.9 317.6)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1347.9' cy='315' rx='16.1' ry='3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='705.9' cy='504.5' rx='36' ry='10.7' transform='rotate(2.7 705.9 504.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='701.8' cy='500.4' rx='36' ry='10.7' transform='rotate(-3.3 701.8 500.4)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='692.8' cy='497.2' rx='18' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='555' cy='483.6' rx='44.7' ry='13.7' transform='rotate(0.9 555 483.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='550.9' cy='479.6' rx='44.7' ry='13.7' transform='rotate(-1.1 550.9 479.6)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='539.7' cy='475.4' rx='22.3' ry='4.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='535.6' cy='474.1' rx='16.5' ry='8.8' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='535.6' cy='470.8' rx='8.8' ry='6.1' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='535.6' cy='471.9' r='3.1' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='706.9' cy='514' rx='74.8' ry='21.3' transform='rotate(-1.3 706.9 514)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='702.9' cy='510' rx='74.8' ry='21.3' transform='rotate(-3 702.9 510)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='684.2' cy='503.6' rx='37.4' ry='7.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='516.1' cy='511.4' rx='42.1' ry='11.2' transform='rotate(4 516.1 511.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='512.1' cy='507.4' rx='42.1' ry='11.2' transform='rotate(0 512.1 507.4)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='501.6' cy='504' rx='21' ry='3.9' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='669.8' cy='489.5' rx='63.2' ry='18.6' transform='rotate(3.9 669.8 489.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='665.7' cy='485.4' rx='63.2' ry='18.6' transform='rotate(-0.8 665.7 485.4)' fill='%238dbb6c' opacity='0.85'/%3E%3Cellipse cx='649.9' cy='479.8' rx='31.6' ry='6.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='669.9' cy='509.5' rx='35.2' ry='9.3' transform='rotate(1.9 669.9 509.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='665.9' cy='505.5' rx='35.2' ry='9.3' transform='rotate(-2 665.9 505.5)' fill='%238dbb6c' opacity='0.85'/%3E%3Cellipse cx='657.1' cy='502.7' rx='17.6' ry='3.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='670.1' cy='480.5' rx='39.5' ry='11' transform='rotate(-0.1 670.1 480.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='666.1' cy='476.5' rx='39.5' ry='11' transform='rotate(-3.2 666.1 476.5)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='656.2' cy='473.2' rx='19.8' ry='3.9' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='653.8' cy='472.1' rx='18.8' ry='10' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='653.8' cy='468.3' rx='10' ry='6.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='653.8' cy='469.6' r='3.5' fill='%23f2c94c' opacity='0.95'/%3E%3C/g%3E%3Cg%3E%3Cellipse cx='1215.1' cy='312' rx='13.4' ry='1.9' fill='%23fffbe8' opacity='0.85'/%3E%3Cellipse cx='1247.9' cy='473.8' rx='19.6' ry='1.6' fill='%23fffbe8' opacity='0.75'/%3E%3Cellipse cx='1265' cy='323.1' rx='11.8' ry='2.9' fill='%23fffbe8' opacity='0.88'/%3E%3Cellipse cx='1253.4' cy='318.6' rx='20.8' ry='1.8' fill='%23fffbe8' opacity='0.82'/%3E%3Cellipse cx='1387.1' cy='320.6' rx='17.1' ry='2.1' fill='%23fffbe8' opacity='0.8'/%3E%3Cellipse cx='887.3' cy='353' rx='18.1' ry='2.2' fill='%23fffbe8' opacity='0.74'/%3E%3Cellipse cx='1084.2' cy='516.6' rx='17.8' ry='2.8' fill='%23fffbe8' opacity='0.89'/%3E%3Cellipse cx='1347.2' cy='405.4' rx='8.4' ry='2.9' fill='%23fffbe8' opacity='0.8'/%3E%3Cellipse cx='1403' cy='502.3' rx='14.8' ry='2' fill='%23fffbe8' opacity='0.72'/%3E%3Cellipse cx='1452.9' cy='485.8' rx='6.4' ry='1.7' fill='%23fffbe8' opacity='0.74'/%3E%3Cellipse cx='1135' cy='274.7' rx='14.1' ry='2.5' fill='%23fffbe8' opacity='0.67'/%3E%3Cellipse cx='998.9' cy='446.9' rx='16.3' ry='2.4' fill='%23fffbe8' opacity='0.52'/%3E%3Cellipse cx='875' cy='466.2' rx='16.6' ry='2' fill='%23fffbe8' opacity='0.74'/%3E%3Cellipse cx='1238.3' cy='462.3' rx='9.3' ry='2.1' fill='%23fffbe8' opacity='0.59'/%3E%3Cellipse cx='1127.3' cy='413.9' rx='13' ry='1.8' fill='%23fffbe8' opacity='0.87'/%3E%3Cellipse cx='851.3' cy='497.3' rx='21.4' ry='1.4' fill='%23fffbe8' opacity='0.52'/%3E%3Cellipse cx='845.4' cy='305.4' rx='15.4' ry='1.8' fill='%23fffbe8' opacity='0.69'/%3E%3Cellipse cx='1445.8' cy='300.8' rx='10.9' ry='2.9' fill='%23fffbe8' opacity='0.63'/%3E%3Cellipse cx='1426' cy='329.8' rx='7.4' ry='1.9' fill='%23fffbe8' opacity='0.82'/%3E%3Cellipse cx='1490.6' cy='427.5' rx='20.9' ry='1.8' fill='%23fffbe8' opacity='0.64'/%3E%3Cellipse cx='1505.3' cy='287.7' rx='19.4' ry='2.5' fill='%23fffbe8' opacity='0.85'/%3E%3Cellipse cx='1310.6' cy='447.1' rx='19.4' ry='2.7' fill='%23fffbe8' opacity='0.71'/%3E%3C/g%3E%3C/svg%3E");--kit-paint-sunrise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 520' preserveAspectRatio='xMidYMid slice'%3E%3Cdefs%3E%3ClinearGradient id='bs-sky' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%231b2e41'/%3E%3Cstop offset='0.32' stop-color='%232c465a'/%3E%3Cstop offset='0.5' stop-color='%2336576a'/%3E%3Cstop offset='0.56' stop-color='%2322394c'/%3E%3Cstop offset='1' stop-color='%230f1b26'/%3E%3C/linearGradient%3E%3CradialGradient id='bs-glow' gradientUnits='userSpaceOnUse' cx='1376' cy='156' r='286'%3E%3Cstop offset='0' stop-color='%23f08a4b' stop-opacity='0.55'/%3E%3Cstop offset='0.35' stop-color='%23e0764a' stop-opacity='0.18'/%3E%3Cstop offset='1' stop-color='%237d6f9e' stop-opacity='0'/%3E%3C/radialGradient%3E%3Cfilter id='bs-paint' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.008 0.05' numOctaves='2' seed='5' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='14' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bs-water' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.005 0.09' numOctaves='2' seed='11' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='9' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bs-soft' x='-5%25' y='-5%25' width='110%25' height='110%25'%3E%3CfeGaussianBlur stdDeviation='1.1'/%3E%3C/filter%3E%3C/defs%3E%3Cg%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bs-sky)'/%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bs-glow)'/%3E%3C/g%3E%3Cg filter='url(%23bs-paint)'%3E%3Cellipse cx='1295.8' cy='171.6' rx='58' ry='3.8' transform='rotate(0.6 1295.8 171.6)' fill='%234a6b7a' opacity='0.12'/%3E%3Cellipse cx='620.1' cy='236.4' rx='185.8' ry='11.5' transform='rotate(1.9 620.1 236.4)' fill='%235b6f86' opacity='0.2'/%3E%3Cellipse cx='634.4' cy='205.7' rx='139.4' ry='4' transform='rotate(0.2 634.4 205.7)' fill='%235b6f86' opacity='0.21'/%3E%3Cellipse cx='1194.8' cy='242.6' rx='62.5' ry='11.3' transform='rotate(1 1194.8 242.6)' fill='%235b6f86' opacity='0.15'/%3E%3Cellipse cx='961.2' cy='62.2' rx='51.8' ry='9.1' transform='rotate(1.7 961.2 62.2)' fill='%238c8fb0' opacity='0.14'/%3E%3Cellipse cx='1569.8' cy='49.8' rx='172.3' ry='11' transform='rotate(1.8 1569.8 49.8)' fill='%235b6f86' opacity='0.16'/%3E%3Cellipse cx='1534.5' cy='111.2' rx='56.1' ry='7.6' transform='rotate(0.5 1534.5 111.2)' fill='%233f5a70' opacity='0.21'/%3E%3Cellipse cx='760.2' cy='194.1' rx='87.7' ry='11.1' transform='rotate(-0.7 760.2 194.1)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='751.2' cy='95.2' rx='120.4' ry='7.5' transform='rotate(-1.7 751.2 95.2)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='1301.4' cy='161.9' rx='204.1' ry='4.7' transform='rotate(-1.7 1301.4 161.9)' fill='%237d6f9e' opacity='0.14'/%3E%3Cellipse cx='636.6' cy='58.1' rx='74' ry='6' transform='rotate(-1.1 636.6 58.1)' fill='%233f5a70' opacity='0.22'/%3E%3Cellipse cx='334.1' cy='76.1' rx='163.5' ry='9.4' transform='rotate(2 334.1 76.1)' fill='%238c8fb0' opacity='0.17'/%3E%3Cellipse cx='635.2' cy='260' rx='80.6' ry='4.5' transform='rotate(-0.1 635.2 260)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='411.6' cy='137.4' rx='68.1' ry='8.8' transform='rotate(-0.5 411.6 137.4)' fill='%234a6b7a' opacity='0.08'/%3E%3Cellipse cx='700.8' cy='19.4' rx='120.9' ry='6.2' transform='rotate(-1.4 700.8 19.4)' fill='%233f5a70' opacity='0.18'/%3E%3Cellipse cx='850' cy='99.1' rx='161.6' ry='6.4' transform='rotate(1.6 850 99.1)' fill='%238c8fb0' opacity='0.18'/%3E%3Cellipse cx='1543.3' cy='262.8' rx='121.8' ry='9.2' transform='rotate(-1.8 1543.3 262.8)' fill='%234a6b7a' opacity='0.23'/%3E%3Cellipse cx='201.5' cy='6' rx='60.2' ry='7.4' transform='rotate(-1.9 201.5 6)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='1501.9' cy='157.7' rx='128.7' ry='8.2' transform='rotate(-0.7 1501.9 157.7)' fill='%238c8fb0' opacity='0.22'/%3E%3Cellipse cx='1573' cy='215.1' rx='115.5' ry='8' transform='rotate(-1.7 1573 215.1)' fill='%233f5a70' opacity='0.21'/%3E%3Cellipse cx='1543.3' cy='117.7' rx='201.5' ry='4' transform='rotate(-1 1543.3 117.7)' fill='%233f5a70' opacity='0.2'/%3E%3Cellipse cx='1513.8' cy='136.2' rx='190.2' ry='6.7' transform='rotate(-1.6 1513.8 136.2)' fill='%233f5a70' opacity='0.16'/%3E%3Cellipse cx='1314.6' cy='166.9' rx='76.5' ry='4.4' transform='rotate(0 1314.6 166.9)' fill='%235b6f86' opacity='0.22'/%3E%3Cellipse cx='1321.6' cy='108.6' rx='77.4' ry='8.4' transform='rotate(1 1321.6 108.6)' fill='%235b6f86' opacity='0.2'/%3E%3Cellipse cx='1270.5' cy='191.1' rx='186.8' ry='10.4' transform='rotate(-1.4 1270.5 191.1)' fill='%233f5a70' opacity='0.18'/%3E%3Cellipse cx='1192.4' cy='52.8' rx='59.4' ry='6.3' transform='rotate(1.4 1192.4 52.8)' fill='%233f5a70' opacity='0.16'/%3E%3Cellipse cx='216.8' cy='214.6' rx='190.8' ry='10' transform='rotate(-1.6 216.8 214.6)' fill='%233f5a70' opacity='0.15'/%3E%3Cellipse cx='1225' cy='263.7' rx='204.7' ry='10.1' transform='rotate(0.3 1225 263.7)' fill='%235b6f86' opacity='0.17'/%3E%3Cellipse cx='977.6' cy='83.3' rx='59.9' ry='7.8' transform='rotate(0.6 977.6 83.3)' fill='%238c8fb0' opacity='0.07'/%3E%3Cellipse cx='20.2' cy='165.7' rx='96.5' ry='6' transform='rotate(1.5 20.2 165.7)' fill='%235b6f86' opacity='0.23'/%3E%3Cellipse cx='285.8' cy='79.9' rx='127' ry='6.9' transform='rotate(1.1 285.8 79.9)' fill='%233f5a70' opacity='0.2'/%3E%3Cellipse cx='650.3' cy='135.3' rx='157.8' ry='9.5' transform='rotate(0.9 650.3 135.3)' fill='%237d6f9e' opacity='0.21'/%3E%3Cellipse cx='1256.5' cy='149.2' rx='193.4' ry='5.6' transform='rotate(0.2 1256.5 149.2)' fill='%238c8fb0' opacity='0.07'/%3E%3Cellipse cx='1317' cy='138.3' rx='203.6' ry='9.2' transform='rotate(0.8 1317 138.3)' fill='%237d6f9e' opacity='0.17'/%3E%3Cellipse cx='849.8' cy='58.4' rx='113.4' ry='6.3' transform='rotate(0 849.8 58.4)' fill='%238c8fb0' opacity='0.09'/%3E%3Cellipse cx='159' cy='182.8' rx='208.7' ry='10.1' transform='rotate(0.1 159 182.8)' fill='%237d6f9e' opacity='0.09'/%3E%3Cellipse cx='782.9' cy='256.2' rx='176.7' ry='3.9' transform='rotate(1.3 782.9 256.2)' fill='%238c8fb0' opacity='0.19'/%3E%3Cellipse cx='893.7' cy='135' rx='186.6' ry='3.6' transform='rotate(1 893.7 135)' fill='%238c8fb0' opacity='0.23'/%3E%3Cellipse cx='1090.8' cy='152.6' rx='77.3' ry='7.2' transform='rotate(-1.3 1090.8 152.6)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='113.5' cy='76.7' rx='74.4' ry='4.1' transform='rotate(1.2 113.5 76.7)' fill='%237d6f9e' opacity='0.18'/%3E%3Cellipse cx='1403.6' cy='223.2' rx='129.3' ry='10.5' transform='rotate(-1.5 1403.6 223.2)' fill='%235b6f86' opacity='0.12'/%3E%3Cellipse cx='611.4' cy='200.1' rx='208.5' ry='10.8' transform='rotate(0.5 611.4 200.1)' fill='%238c8fb0' opacity='0.14'/%3E%3Cellipse cx='78.6' cy='214.8' rx='75.4' ry='9.6' transform='rotate(0.4 78.6 214.8)' fill='%234a6b7a' opacity='0.08'/%3E%3Cellipse cx='67.7' cy='54.3' rx='132.8' ry='5.2' transform='rotate(-0.7 67.7 54.3)' fill='%234a6b7a' opacity='0.23'/%3E%3Cellipse cx='197' cy='78.2' rx='52.6' ry='11.2' transform='rotate(-1.4 197 78.2)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='37.8' cy='132.6' rx='173.6' ry='10.8' transform='rotate(1.5 37.8 132.6)' fill='%237d6f9e' opacity='0.14'/%3E%3Cellipse cx='1165.9' cy='258.2' rx='60.4' ry='9.8' transform='rotate(-1.3 1165.9 258.2)' fill='%235b6f86' opacity='0.15'/%3E%3Cellipse cx='139' cy='154.1' rx='64.1' ry='5.6' transform='rotate(-1.2 139 154.1)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='943.6' cy='236.3' rx='116.1' ry='6' transform='rotate(-1.3 943.6 236.3)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1485.4' cy='151.4' rx='190.9' ry='3.7' transform='rotate(2 1485.4 151.4)' fill='%237d6f9e' opacity='0.16'/%3E%3Cellipse cx='840.5' cy='169.7' rx='132.6' ry='7.2' transform='rotate(0.5 840.5 169.7)' fill='%235b6f86' opacity='0.11'/%3E%3Cellipse cx='447.4' cy='224.2' rx='106.4' ry='9.8' transform='rotate(-1.4 447.4 224.2)' fill='%237d6f9e' opacity='0.1'/%3E%3Cellipse cx='449.8' cy='113.1' rx='74.5' ry='7.3' transform='rotate(-1.9 449.8 113.1)' fill='%238c8fb0' opacity='0.12'/%3E%3Cellipse cx='354.6' cy='127.7' rx='125.4' ry='9.1' transform='rotate(1 354.6 127.7)' fill='%235b6f86' opacity='0.16'/%3E%3Cellipse cx='630.9' cy='262.2' rx='78.6' ry='3.9' transform='rotate(-2 630.9 262.2)' fill='%235b6f86' opacity='0.16'/%3E%3Cellipse cx='1041.7' cy='150.6' rx='94.6' ry='5.5' transform='rotate(-0.1 1041.7 150.6)' fill='%238c8fb0' opacity='0.1'/%3E%3Cellipse cx='153.3' cy='256.3' rx='93.3' ry='7.6' transform='rotate(-2 153.3 256.3)' fill='%233f5a70' opacity='0.15'/%3E%3Cellipse cx='871' cy='28.2' rx='208.5' ry='5.9' transform='rotate(0.3 871 28.2)' fill='%233f5a70' opacity='0.15'/%3E%3Cellipse cx='965.5' cy='218.6' rx='94' ry='7.6' transform='rotate(-1.7 965.5 218.6)' fill='%238c8fb0' opacity='0.23'/%3E%3Cellipse cx='850.5' cy='221.4' rx='127.2' ry='6.9' transform='rotate(0.8 850.5 221.4)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1368.1' cy='258.7' rx='67.6' ry='7.1' transform='rotate(1.6 1368.1 258.7)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='1468.1' cy='21.5' rx='199.7' ry='9.1' transform='rotate(-0.4 1468.1 21.5)' fill='%237d6f9e' opacity='0.18'/%3E%3Cellipse cx='831' cy='241.7' rx='108.2' ry='8.3' transform='rotate(0.1 831 241.7)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='408.2' cy='179.6' rx='139.5' ry='6.7' transform='rotate(0.2 408.2 179.6)' fill='%235b6f86' opacity='0.18'/%3E%3Cellipse cx='1264' cy='153.3' rx='109.2' ry='7' transform='rotate(0.3 1264 153.3)' fill='%238c8fb0' opacity='0.16'/%3E%3Cellipse cx='1467.5' cy='173.3' rx='168.6' ry='5.5' transform='rotate(-0.3 1467.5 173.3)' fill='%238c8fb0' opacity='0.11'/%3E%3Cellipse cx='228.7' cy='195.1' rx='174.5' ry='4.1' transform='rotate(-1.3 228.7 195.1)' fill='%238c8fb0' opacity='0.22'/%3E%3Cellipse cx='1170.4' cy='182.3' rx='154.3' ry='8.8' transform='rotate(-0.7 1170.4 182.3)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1583.7' cy='30.8' rx='134.2' ry='4.9' transform='rotate(-1.6 1583.7 30.8)' fill='%237d6f9e' opacity='0.2'/%3E%3Cellipse cx='549.2' cy='86.5' rx='198.1' ry='5' transform='rotate(1.1 549.2 86.5)' fill='%234a6b7a' opacity='0.13'/%3E%3Cellipse cx='1214.8' cy='69.7' rx='198.5' ry='10.2' transform='rotate(0.4 1214.8 69.7)' fill='%237d6f9e' opacity='0.12'/%3E%3Cellipse cx='1338.9' cy='249.1' rx='197.9' ry='5.5' transform='rotate(0.1 1338.9 249.1)' fill='%234a6b7a' opacity='0.2'/%3E%3Cellipse cx='206.8' cy='221.7' rx='192.8' ry='10.5' transform='rotate(1.1 206.8 221.7)' fill='%234a6b7a' opacity='0.21'/%3E%3Cellipse cx='562.3' cy='220' rx='69.1' ry='11' transform='rotate(0 562.3 220)' fill='%237d6f9e' opacity='0.16'/%3E%3Cellipse cx='776.1' cy='242' rx='140.1' ry='10.4' transform='rotate(-0.5 776.1 242)' fill='%233f5a70' opacity='0.13'/%3E%3Cellipse cx='208.6' cy='192.1' rx='195.1' ry='4.5' transform='rotate(-0.7 208.6 192.1)' fill='%237d6f9e' opacity='0.07'/%3E%3Cellipse cx='1526.2' cy='4.5' rx='209.7' ry='4.5' transform='rotate(1.3 1526.2 4.5)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1167.9' cy='25.5' rx='125.2' ry='6.8' transform='rotate(-0.2 1167.9 25.5)' fill='%233f5a70' opacity='0.08'/%3E%3Cellipse cx='1066.6' cy='134' rx='89.6' ry='3.5' transform='rotate(-0.4 1066.6 134)' fill='%233f5a70' opacity='0.09'/%3E%3Cellipse cx='951.5' cy='64.6' rx='189.3' ry='5.5' transform='rotate(-1.9 951.5 64.6)' fill='%234a6b7a' opacity='0.08'/%3E%3Cellipse cx='841.7' cy='112.4' rx='198.5' ry='5.6' transform='rotate(-0.1 841.7 112.4)' fill='%233f5a70' opacity='0.11'/%3E%3Cellipse cx='1070.2' cy='52.3' rx='150.8' ry='9' transform='rotate(1.7 1070.2 52.3)' fill='%233f5a70' opacity='0.12'/%3E%3Cellipse cx='296.9' cy='203.4' rx='169.7' ry='11.1' transform='rotate(0.9 296.9 203.4)' fill='%234a6b7a' opacity='0.22'/%3E%3Cellipse cx='402.7' cy='232.5' rx='97' ry='11.1' transform='rotate(-1.9 402.7 232.5)' fill='%235b6f86' opacity='0.2'/%3E%3Cellipse cx='1032.2' cy='208.7' rx='114.1' ry='5.9' transform='rotate(-1.7 1032.2 208.7)' fill='%234a6b7a' opacity='0.2'/%3E%3Cellipse cx='404.9' cy='257.8' rx='144.4' ry='6.1' transform='rotate(-1.6 404.9 257.8)' fill='%234a6b7a' opacity='0.16'/%3E%3Cellipse cx='1568.2' cy='256.7' rx='139.3' ry='6.8' transform='rotate(0 1568.2 256.7)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='1436.4' cy='228.2' rx='123.6' ry='3.6' transform='rotate(1.7 1436.4 228.2)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='225' cy='161.6' rx='174.6' ry='7.6' transform='rotate(-1.3 225 161.6)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='1217.9' cy='102.2' rx='154.6' ry='9.8' transform='rotate(-0.1 1217.9 102.2)' fill='%235b6f86' opacity='0.13'/%3E%3Cellipse cx='365.5' cy='27.2' rx='172.6' ry='6' transform='rotate(0.7 365.5 27.2)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='168.1' cy='140.6' rx='154.9' ry='8.8' transform='rotate(-0.9 168.1 140.6)' fill='%238c8fb0' opacity='0.1'/%3E%3Cellipse cx='1282' cy='132.4' rx='200.3' ry='5.4' transform='rotate(-1.9 1282 132.4)' fill='%237d6f9e' opacity='0.17'/%3E%3Cellipse cx='66.5' cy='129.1' rx='102' ry='9.8' transform='rotate(-1.9 66.5 129.1)' fill='%237d6f9e' opacity='0.08'/%3E%3Cellipse cx='1487.8' cy='14.9' rx='128.9' ry='4.8' transform='rotate(1.5 1487.8 14.9)' fill='%237d6f9e' opacity='0.1'/%3E%3Cellipse cx='1292.8' cy='244' rx='88.5' ry='5.4' transform='rotate(-1.6 1292.8 244)' fill='%234a6b7a' opacity='0.14'/%3E%3Cellipse cx='385.3' cy='143.6' rx='58.2' ry='10.6' transform='rotate(-0.8 385.3 143.6)' fill='%238c8fb0' opacity='0.19'/%3E%3Cellipse cx='955.7' cy='204' rx='166.4' ry='7.9' transform='rotate(0.3 955.7 204)' fill='%238c8fb0' opacity='0.19'/%3E%3Cellipse cx='128.8' cy='106.1' rx='85' ry='10.9' transform='rotate(-0.6 128.8 106.1)' fill='%234a6b7a' opacity='0.11'/%3E%3Cellipse cx='1522.1' cy='61.3' rx='154.1' ry='3.6' transform='rotate(-1.4 1522.1 61.3)' fill='%237d6f9e' opacity='0.13'/%3E%3Cellipse cx='1327.4' cy='228.1' rx='53.4' ry='10.4' transform='rotate(1.3 1327.4 228.1)' fill='%233f5a70' opacity='0.19'/%3E%3Cellipse cx='1076.3' cy='201.9' rx='132' ry='5.5' transform='rotate(1.8 1076.3 201.9)' fill='%237d6f9e' opacity='0.22'/%3E%3Cellipse cx='1554.9' cy='237.5' rx='136.7' ry='10.5' transform='rotate(-0.6 1554.9 237.5)' fill='%237d6f9e' opacity='0.07'/%3E%3Cellipse cx='684.5' cy='200.8' rx='147.7' ry='9.5' transform='rotate(-1.3 684.5 200.8)' fill='%237d6f9e' opacity='0.13'/%3E%3Cellipse cx='575' cy='259.8' rx='98.6' ry='10.1' transform='rotate(-0.6 575 259.8)' fill='%234a6b7a' opacity='0.19'/%3E%3Cellipse cx='626' cy='168.3' rx='155.5' ry='4.9' transform='rotate(0.8 626 168.3)' fill='%237d6f9e' opacity='0.23'/%3E%3Cellipse cx='328.9' cy='131.6' rx='205' ry='9.4' transform='rotate(1.9 328.9 131.6)' fill='%238c8fb0' opacity='0.11'/%3E%3Cellipse cx='571.8' cy='124.2' rx='89.4' ry='7.8' transform='rotate(0.7 571.8 124.2)' fill='%237d6f9e' opacity='0.22'/%3E%3Cellipse cx='937.4' cy='203.5' rx='91.5' ry='4.4' transform='rotate(1 937.4 203.5)' fill='%237d6f9e' opacity='0.12'/%3E%3Cellipse cx='858' cy='102.3' rx='152.9' ry='10' transform='rotate(-0.9 858 102.3)' fill='%234a6b7a' opacity='0.11'/%3E%3Cellipse cx='771.4' cy='145.2' rx='88.4' ry='5.1' transform='rotate(0 771.4 145.2)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='1034.9' cy='237.3' rx='133.2' ry='6.1' transform='rotate(0.2 1034.9 237.3)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='1461.6' cy='0.5' rx='62.3' ry='10.8' transform='rotate(-0.4 1461.6 0.5)' fill='%234a6b7a' opacity='0.16'/%3E%3Cellipse cx='823.1' cy='225.3' rx='85.6' ry='6' transform='rotate(-1.6 823.1 225.3)' fill='%238c8fb0' opacity='0.13'/%3E%3Cellipse cx='865.1' cy='39.8' rx='117.5' ry='9.8' transform='rotate(-1.5 865.1 39.8)' fill='%237d6f9e' opacity='0.14'/%3E%3Cellipse cx='1287.4' cy='12.8' rx='68.9' ry='10' transform='rotate(-0.2 1287.4 12.8)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='340.7' cy='178.8' rx='127.9' ry='10.1' transform='rotate(1.1 340.7 178.8)' fill='%234a6b7a' opacity='0.22'/%3E%3Cellipse cx='704.8' cy='44.8' rx='145.7' ry='4.9' transform='rotate(0.3 704.8 44.8)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='325.3' cy='176.5' rx='106.6' ry='5.6' transform='rotate(-0.2 325.3 176.5)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='113.1' cy='81.6' rx='105.9' ry='7.6' transform='rotate(0.8 113.1 81.6)' fill='%235b6f86' opacity='0.21'/%3E%3Cellipse cx='1555.8' cy='196.6' rx='204.4' ry='10.7' transform='rotate(-1.1 1555.8 196.6)' fill='%235b6f86' opacity='0.15'/%3E%3Cellipse cx='185.7' cy='195.6' rx='74.2' ry='11.3' transform='rotate(-1.2 185.7 195.6)' fill='%233f5a70' opacity='0.22'/%3E%3Cellipse cx='1588.3' cy='217.4' rx='169.8' ry='9.6' transform='rotate(-1.2 1588.3 217.4)' fill='%234a6b7a' opacity='0.22'/%3E%3Cellipse cx='437.1' cy='166.8' rx='134' ry='6.6' transform='rotate(0.4 437.1 166.8)' fill='%237d6f9e' opacity='0.15'/%3E%3Cellipse cx='1359.1' cy='153.9' rx='116.1' ry='3.8' transform='rotate(1.7 1359.1 153.9)' fill='%235b6f86' opacity='0.23'/%3E%3Cellipse cx='1517.7' cy='145.7' rx='58.4' ry='3.8' transform='rotate(-1.6 1517.7 145.7)' fill='%233f5a70' opacity='0.23'/%3E%3Cellipse cx='303.4' cy='171.5' rx='156' ry='7' transform='rotate(0.7 303.4 171.5)' fill='%237d6f9e' opacity='0.13'/%3E%3Cellipse cx='1434.7' cy='79.5' rx='80.9' ry='8.5' transform='rotate(1.3 1434.7 79.5)' fill='%238c8fb0' opacity='0.11'/%3E%3Cellipse cx='41.2' cy='244.8' rx='190.8' ry='5.5' transform='rotate(0.3 41.2 244.8)' fill='%234a6b7a' opacity='0.21'/%3E%3Cellipse cx='290.2' cy='257.9' rx='74.1' ry='11.2' transform='rotate(1.1 290.2 257.9)' fill='%234a6b7a' opacity='0.19'/%3E%3Cellipse cx='201.6' cy='238.5' rx='99.2' ry='9.5' transform='rotate(0.7 201.6 238.5)' fill='%234a6b7a' opacity='0.19'/%3E%3Cellipse cx='815.5' cy='206' rx='109.4' ry='11' transform='rotate(-0.4 815.5 206)' fill='%237d6f9e' opacity='0.17'/%3E%3Cellipse cx='1556' cy='210.4' rx='65.4' ry='12' transform='rotate(-0.5 1556 210.4)' fill='%23a0687a' opacity='0.2'/%3E%3Cellipse cx='1539.1' cy='247.2' rx='88.5' ry='11.4' transform='rotate(0 1539.1 247.2)' fill='%23c9775a' opacity='0.1'/%3E%3Cellipse cx='1154.8' cy='247.4' rx='80.7' ry='9.8' transform='rotate(1.2 1154.8 247.4)' fill='%23c9775a' opacity='0.15'/%3E%3Cellipse cx='1567.4' cy='222.5' rx='100.5' ry='13.2' transform='rotate(0.1 1567.4 222.5)' fill='%23a0687a' opacity='0.2'/%3E%3Cellipse cx='1517.5' cy='201.3' rx='139.8' ry='11' transform='rotate(-0.5 1517.5 201.3)' fill='%23e0905e' opacity='0.17'/%3E%3Cellipse cx='1345.1' cy='121.8' rx='132.8' ry='14.9' transform='rotate(-0.4 1345.1 121.8)' fill='%23e0905e' opacity='0.19'/%3E%3Cellipse cx='1690.3' cy='212.4' rx='123.6' ry='13.5' transform='rotate(1.5 1690.3 212.4)' fill='%23a0687a' opacity='0.19'/%3E%3Cellipse cx='1397.9' cy='239' rx='123' ry='11.4' transform='rotate(-2 1397.9 239)' fill='%23e0905e' opacity='0.18'/%3E%3Cellipse cx='1340.2' cy='163.5' rx='94.4' ry='14.8' transform='rotate(0 1340.2 163.5)' fill='%23c9775a' opacity='0.13'/%3E%3Cellipse cx='1576.8' cy='120.2' rx='51.5' ry='8.5' transform='rotate(-1.4 1576.8 120.2)' fill='%23a0687a' opacity='0.19'/%3E%3Cellipse cx='1183.5' cy='218.6' rx='68.8' ry='12.1' transform='rotate(-0.2 1183.5 218.6)' fill='%23a0687a' opacity='0.18'/%3E%3Cellipse cx='1238.3' cy='175.2' rx='111.2' ry='13.3' transform='rotate(1.6 1238.3 175.2)' fill='%23e0905e' opacity='0.14'/%3E%3Cellipse cx='1124.6' cy='249.6' rx='69' ry='12.6' transform='rotate(0 1124.6 249.6)' fill='%23c9775a' opacity='0.18'/%3E%3Cellipse cx='1173.9' cy='129.2' rx='93.6' ry='8.5' transform='rotate(1 1173.9 129.2)' fill='%23c9775a' opacity='0.18'/%3E%3Cellipse cx='1554' cy='147.6' rx='51.3' ry='11.1' transform='rotate(1.6 1554 147.6)' fill='%23e0905e' opacity='0.18'/%3E%3C/g%3E%3Cg filter='url(%23bs-soft)'%3E%3Crect x='910.3' y='110.9' width='2.2' height='149.1' fill='%232b4357' opacity='0.36'/%3E%3Crect x='1245.7' y='169.4' width='1.8' height='90.6' fill='%232b4357' opacity='0.38'/%3E%3Crect x='642.3' y='169.7' width='2' height='90.3' fill='%232b4357' opacity='0.39'/%3E%3Cpath d='M642.3 175.7l78.9 14.2' stroke='%232b4357' stroke-width='1.8' opacity='0.39' fill='none'/%3E%3Crect x='399.2' y='97' width='3.1' height='163' fill='%232b4357' opacity='0.35'/%3E%3Crect x='562.8' y='186.2' width='1.6' height='73.8' fill='%232b4357' opacity='0.36'/%3E%3Crect x='229.3' y='97.7' width='2.1' height='162.3' fill='%232b4357' opacity='0.36'/%3E%3Cpath d='M229.3 103.7l46.6 8.4' stroke='%232b4357' stroke-width='1.9' opacity='0.36' fill='none'/%3E%3Cellipse cx='247.3' cy='83.7' rx='35' ry='11.4' transform='rotate(-14 247.3 83.7)' fill='%235d6f88' opacity='0.16'/%3E%3Crect x='366.9' y='93.8' width='2.7' height='166.2' fill='%232b4357' opacity='0.36'/%3E%3Cpath d='M366.9 99.8l33.5 6' stroke='%232b4357' stroke-width='2.4' opacity='0.36' fill='none'/%3E%3Crect x='1571.7' y='180.1' width='1.5' height='79.9' fill='%232b4357' opacity='0.4'/%3E%3Crect x='898.1' y='203.9' width='3.2' height='56.1' fill='%232b4357' opacity='0.44'/%3E%3Cellipse cx='916.1' cy='189.9' rx='54.2' ry='11.4' transform='rotate(-14 916.1 189.9)' fill='%235d6f88' opacity='0.21'/%3E%3Crect x='380.1' y='139.5' width='2.9' height='120.5' fill='%232b4357' opacity='0.38'/%3E%3Crect x='208.5' y='94.1' width='2.2' height='165.9' fill='%232b4357' opacity='0.27'/%3E%3Cpath d='M208.5 100.1l65.8 11.8' stroke='%232b4357' stroke-width='2' opacity='0.27' fill='none'/%3E%3Cellipse cx='226.5' cy='80.1' rx='39.2' ry='8.7' transform='rotate(-14 226.5 80.1)' fill='%235d6f88' opacity='0.17'/%3E%3Crect x='882.6' y='147.6' width='2.7' height='112.4' fill='%232b4357' opacity='0.22'/%3E%3C/g%3E%3Cg filter='url(%23bs-paint)'%3E%3Cellipse cx='16.9' cy='256.9' rx='141.1' ry='16.9' fill='%231a2a38' opacity='0.64'/%3E%3Cellipse cx='131.2' cy='257.9' rx='228.1' ry='11.4' fill='%231c2e3e' opacity='0.77'/%3E%3Cellipse cx='268.2' cy='254.8' rx='91' ry='12.7' fill='%2322374a' opacity='0.58'/%3E%3Cellipse cx='379.4' cy='257.3' rx='234' ry='9.4' fill='%231a2a38' opacity='0.77'/%3E%3Cellipse cx='457.3' cy='257.1' rx='148.7' ry='14.2' fill='%231c2e3e' opacity='0.66'/%3E%3Cellipse cx='584.8' cy='254.4' rx='102' ry='10.4' fill='%231a2a38' opacity='0.77'/%3E%3Cellipse cx='718.6' cy='259.9' rx='178.6' ry='18.3' fill='%231a2a38' opacity='0.7'/%3E%3Cellipse cx='850.5' cy='259.3' rx='176.2' ry='11.9' fill='%2322374a' opacity='0.66'/%3E%3Cellipse cx='954.8' cy='255' rx='121.9' ry='15.9' fill='%2322374a' opacity='0.68'/%3E%3Cellipse cx='1052.3' cy='256.7' rx='168.2' ry='18.2' fill='%231a2a38' opacity='0.77'/%3E%3Cellipse cx='1193.7' cy='259' rx='125.4' ry='15.2' fill='%231a2a38' opacity='0.7'/%3E%3Cellipse cx='1300.2' cy='255.6' rx='142.1' ry='9.1' fill='%2322374a' opacity='0.74'/%3E%3Cellipse cx='1393.7' cy='255.8' rx='96.1' ry='16.9' fill='%231c2e3e' opacity='0.78'/%3E%3Cellipse cx='1503.1' cy='259.9' rx='220.9' ry='17.7' fill='%231c2e3e' opacity='0.77'/%3E%3C/g%3E%3Cg filter='url(%23bs-water)'%3E%3Cellipse cx='1182.1' cy='327.7' rx='75.8' ry='2.4' transform='rotate(0.8 1182.1 327.7)' fill='%231f3a4e' opacity='0.37'/%3E%3Cellipse cx='1465.8' cy='444.9' rx='120.3' ry='5.7' transform='rotate(-0.2 1465.8 444.9)' fill='%233f7f8c' opacity='0.42'/%3E%3Cellipse cx='1305.8' cy='334' rx='54.2' ry='3' transform='rotate(1.2 1305.8 334)' fill='%231f3a4e' opacity='0.63'/%3E%3Cellipse cx='119.3' cy='372.5' rx='29.1' ry='3.3' transform='rotate(-0.9 119.3 372.5)' fill='%233f7f8c' opacity='0.44'/%3E%3Cellipse cx='29' cy='418.6' rx='47.6' ry='3.2' transform='rotate(-1.3 29 418.6)' fill='%2324405a' opacity='0.51'/%3E%3Cellipse cx='1223' cy='277.1' rx='21.1' ry='2.4' transform='rotate(1 1223 277.1)' fill='%232b4a5e' opacity='0.63'/%3E%3Cellipse cx='1340.9' cy='391.8' rx='67.9' ry='2.9' transform='rotate(-0.8 1340.9 391.8)' fill='%232b4a5e' opacity='0.73'/%3E%3Cellipse cx='1332' cy='510' rx='131.9' ry='4.5' transform='rotate(0.9 1332 510)' fill='%2324405a' opacity='0.58'/%3E%3Cellipse cx='496.9' cy='482.7' rx='56.2' ry='6.7' transform='rotate(0.2 496.9 482.7)' fill='%233f7f8c' opacity='0.73'/%3E%3Cellipse cx='1144.9' cy='274.4' rx='48.3' ry='1.2' transform='rotate(0.7 1144.9 274.4)' fill='%235c7f95' opacity='0.6'/%3E%3Cellipse cx='327.4' cy='492.3' rx='52.3' ry='6.5' transform='rotate(0.1 327.4 492.3)' fill='%233f7f8c' opacity='0.47'/%3E%3Cellipse cx='382.9' cy='461.1' rx='49.5' ry='6' transform='rotate(1.3 382.9 461.1)' fill='%235c7f95' opacity='0.67'/%3E%3Cellipse cx='990.2' cy='445.9' rx='89' ry='3' transform='rotate(1.1 990.2 445.9)' fill='%2324405a' opacity='0.51'/%3E%3Cellipse cx='1529.5' cy='329.9' rx='75.4' ry='2.3' transform='rotate(0.1 1529.5 329.9)' fill='%2324405a' opacity='0.35'/%3E%3Cellipse cx='741.5' cy='357' rx='53.5' ry='2.4' transform='rotate(-0.9 741.5 357)' fill='%2324405a' opacity='0.73'/%3E%3Cellipse cx='380.6' cy='340.5' rx='45' ry='1.7' transform='rotate(0.6 380.6 340.5)' fill='%233f7f8c' opacity='0.68'/%3E%3Cellipse cx='747.2' cy='499.7' rx='86.6' ry='6.1' transform='rotate(-0.3 747.2 499.7)' fill='%233f7f8c' opacity='0.33'/%3E%3Cellipse cx='1534.6' cy='331.6' rx='75.6' ry='2.7' transform='rotate(0.1 1534.6 331.6)' fill='%235c7f95' opacity='0.34'/%3E%3Cellipse cx='747.1' cy='287' rx='52.9' ry='2.1' transform='rotate(-1.2 747.1 287)' fill='%2324405a' opacity='0.32'/%3E%3Cellipse cx='1311.3' cy='485.5' rx='130.9' ry='7' transform='rotate(-1.1 1311.3 485.5)' fill='%231f3a4e' opacity='0.31'/%3E%3Cellipse cx='421.2' cy='370.8' rx='82.4' ry='3' transform='rotate(1 421.2 370.8)' fill='%235c7f95' opacity='0.74'/%3E%3Cellipse cx='140.4' cy='407.9' rx='110.1' ry='2.5' transform='rotate(-1.4 140.4 407.9)' fill='%235c7f95' opacity='0.7'/%3E%3Cellipse cx='1341' cy='485.5' rx='121.5' ry='5.4' transform='rotate(-1.2 1341 485.5)' fill='%233f7f8c' opacity='0.49'/%3E%3Cellipse cx='789.5' cy='484.6' rx='55.6' ry='6.2' transform='rotate(1 789.5 484.6)' fill='%232b4a5e' opacity='0.59'/%3E%3Cellipse cx='1068.8' cy='282.7' rx='19.9' ry='2.3' transform='rotate(-0.9 1068.8 282.7)' fill='%2324405a' opacity='0.43'/%3E%3Cellipse cx='222.8' cy='285.5' rx='37' ry='2.1' transform='rotate(-1.5 222.8 285.5)' fill='%231f3a4e' opacity='0.49'/%3E%3Cellipse cx='1374.6' cy='402.1' rx='68.8' ry='4.1' transform='rotate(0.3 1374.6 402.1)' fill='%231f3a4e' opacity='0.33'/%3E%3Cellipse cx='228.8' cy='516.7' rx='51.1' ry='6.7' transform='rotate(-0.8 228.8 516.7)' fill='%232b4a5e' opacity='0.32'/%3E%3Cellipse cx='912.7' cy='450.6' rx='121.1' ry='4.8' transform='rotate(0.4 912.7 450.6)' fill='%231f3a4e' opacity='0.35'/%3E%3Cellipse cx='14.2' cy='345.1' rx='31.1' ry='2.7' transform='rotate(-1.5 14.2 345.1)' fill='%231f3a4e' opacity='0.54'/%3E%3Cellipse cx='249.4' cy='335.5' rx='69.8' ry='2.3' transform='rotate(-0.9 249.4 335.5)' fill='%2324405a' opacity='0.61'/%3E%3Cellipse cx='377.8' cy='391.6' rx='87.2' ry='4.5' transform='rotate(-0.6 377.8 391.6)' fill='%2324405a' opacity='0.59'/%3E%3Cellipse cx='1431' cy='323.2' rx='36.3' ry='2.4' transform='rotate(0.7 1431 323.2)' fill='%2324405a' opacity='0.48'/%3E%3Cellipse cx='875.2' cy='324.7' rx='51.3' ry='3.6' transform='rotate(1.4 875.2 324.7)' fill='%235c7f95' opacity='0.59'/%3E%3Cellipse cx='599.3' cy='489.9' rx='80.3' ry='3.9' transform='rotate(0.1 599.3 489.9)' fill='%2324405a' opacity='0.66'/%3E%3Cellipse cx='1561.8' cy='312.8' rx='17.9' ry='2.2' transform='rotate(1 1561.8 312.8)' fill='%235c7f95' opacity='0.55'/%3E%3Cellipse cx='1114' cy='342.4' rx='62.7' ry='3.6' transform='rotate(-0.9 1114 342.4)' fill='%232b4a5e' opacity='0.6'/%3E%3Cellipse cx='122.1' cy='335.3' rx='73.6' ry='3.3' transform='rotate(-1.2 122.1 335.3)' fill='%235c7f95' opacity='0.61'/%3E%3Cellipse cx='1020.9' cy='324.1' rx='30.5' ry='2.4' transform='rotate(1.3 1020.9 324.1)' fill='%235c7f95' opacity='0.43'/%3E%3Cellipse cx='1473.2' cy='431.3' rx='53' ry='4.3' transform='rotate(0.3 1473.2 431.3)' fill='%235c7f95' opacity='0.37'/%3E%3Cellipse cx='1182.8' cy='260.6' rx='34.3' ry='2' transform='rotate(1 1182.8 260.6)' fill='%235c7f95' opacity='0.59'/%3E%3Cellipse cx='745.3' cy='490.7' rx='79.8' ry='5.4' transform='rotate(-0.2 745.3 490.7)' fill='%233f7f8c' opacity='0.43'/%3E%3Cellipse cx='1553' cy='410.7' rx='71' ry='5.2' transform='rotate(1.5 1553 410.7)' fill='%2324405a' opacity='0.47'/%3E%3Cellipse cx='228.2' cy='513.5' rx='53' ry='3.6' transform='rotate(1.1 228.2 513.5)' fill='%232b4a5e' opacity='0.53'/%3E%3Cellipse cx='1576.7' cy='357.5' rx='89.7' ry='3.1' transform='rotate(1.3 1576.7 357.5)' fill='%231f3a4e' opacity='0.7'/%3E%3Cellipse cx='564.6' cy='294.6' rx='38.1' ry='2.8' transform='rotate(0.1 564.6 294.6)' fill='%232b4a5e' opacity='0.35'/%3E%3Cellipse cx='560.8' cy='515.1' rx='108.6' ry='6.2' transform='rotate(-0.9 560.8 515.1)' fill='%235c7f95' opacity='0.31'/%3E%3Cellipse cx='786.5' cy='440.2' rx='58.9' ry='5.1' transform='rotate(0.9 786.5 440.2)' fill='%2324405a' opacity='0.72'/%3E%3Cellipse cx='435.1' cy='353' rx='80' ry='3.5' transform='rotate(0.6 435.1 353)' fill='%2324405a' opacity='0.44'/%3E%3Cellipse cx='328.9' cy='295.4' rx='45.2' ry='2.4' transform='rotate(-1.1 328.9 295.4)' fill='%231f3a4e' opacity='0.65'/%3E%3Cellipse cx='754.2' cy='397.4' rx='58' ry='2.4' transform='rotate(-1 754.2 397.4)' fill='%232b4a5e' opacity='0.52'/%3E%3Cellipse cx='105.3' cy='490.8' rx='39.8' ry='5.8' transform='rotate(1.4 105.3 490.8)' fill='%233f7f8c' opacity='0.56'/%3E%3Cellipse cx='799.8' cy='379.4' rx='55.8' ry='4.6' transform='rotate(-0.6 799.8 379.4)' fill='%232b4a5e' opacity='0.74'/%3E%3Cellipse cx='335.6' cy='275.2' rx='41' ry='2.4' transform='rotate(-1.3 335.6 275.2)' fill='%231f3a4e' opacity='0.54'/%3E%3Cellipse cx='1462.7' cy='293.5' rx='45.8' ry='2.3' transform='rotate(-1.1 1462.7 293.5)' fill='%232b4a5e' opacity='0.69'/%3E%3Cellipse cx='1356.7' cy='356.4' rx='42.6' ry='4.2' transform='rotate(-1.5 1356.7 356.4)' fill='%2324405a' opacity='0.6'/%3E%3Cellipse cx='852.8' cy='398.1' rx='86.1' ry='3.1' transform='rotate(1.2 852.8 398.1)' fill='%2324405a' opacity='0.49'/%3E%3Cellipse cx='941.4' cy='271.2' rx='13.2' ry='2.1' transform='rotate(-0.6 941.4 271.2)' fill='%233f7f8c' opacity='0.56'/%3E%3Cellipse cx='1139.9' cy='354.4' rx='57.5' ry='1.7' transform='rotate(-0.5 1139.9 354.4)' fill='%233f7f8c' opacity='0.57'/%3E%3Cellipse cx='1239.3' cy='420.3' rx='46' ry='3.8' transform='rotate(0.1 1239.3 420.3)' fill='%232b4a5e' opacity='0.71'/%3E%3Cellipse cx='88.6' cy='493.5' rx='57.9' ry='5.8' transform='rotate(0.6 88.6 493.5)' fill='%232b4a5e' opacity='0.36'/%3E%3Cellipse cx='761.5' cy='309.2' rx='18' ry='2' transform='rotate(0.2 761.5 309.2)' fill='%2324405a' opacity='0.36'/%3E%3Cellipse cx='613.9' cy='488' rx='93.3' ry='3.6' transform='rotate(-0.3 613.9 488)' fill='%233f7f8c' opacity='0.74'/%3E%3Cellipse cx='771.9' cy='344.3' rx='61.7' ry='2.4' transform='rotate(-0.2 771.9 344.3)' fill='%232b4a5e' opacity='0.46'/%3E%3Cellipse cx='879.5' cy='268.2' rx='30.1' ry='2.2' transform='rotate(-1.3 879.5 268.2)' fill='%233f7f8c' opacity='0.31'/%3E%3Cellipse cx='732.9' cy='295.3' rx='46.2' ry='1.8' transform='rotate(0.3 732.9 295.3)' fill='%232b4a5e' opacity='0.45'/%3E%3Cellipse cx='846.9' cy='411.1' rx='100.3' ry='4.7' transform='rotate(0.3 846.9 411.1)' fill='%235c7f95' opacity='0.67'/%3E%3Cellipse cx='1126.8' cy='358.7' rx='32.4' ry='4.2' transform='rotate(-1 1126.8 358.7)' fill='%231f3a4e' opacity='0.62'/%3E%3Cellipse cx='498.4' cy='490.8' rx='148.5' ry='3.2' transform='rotate(0.1 498.4 490.8)' fill='%233f7f8c' opacity='0.4'/%3E%3Cellipse cx='376.9' cy='313.3' rx='65' ry='1.6' transform='rotate(-1.5 376.9 313.3)' fill='%233f7f8c' opacity='0.57'/%3E%3Cellipse cx='347.1' cy='406.3' rx='86.3' ry='5' transform='rotate(-1.1 347.1 406.3)' fill='%235c7f95' opacity='0.54'/%3E%3Cellipse cx='690.1' cy='292.4' rx='31.7' ry='2' transform='rotate(0.1 690.1 292.4)' fill='%231f3a4e' opacity='0.54'/%3E%3Cellipse cx='451.1' cy='266.8' rx='15.3' ry='1.1' transform='rotate(0.7 451.1 266.8)' fill='%2324405a' opacity='0.38'/%3E%3Cellipse cx='1156.7' cy='307.9' rx='50.3' ry='2.9' transform='rotate(1 1156.7 307.9)' fill='%232b4a5e' opacity='0.41'/%3E%3Cellipse cx='476.9' cy='394.6' rx='64.4' ry='4.6' transform='rotate(-1.4 476.9 394.6)' fill='%233f7f8c' opacity='0.69'/%3E%3Cellipse cx='353.7' cy='477.8' rx='80.3' ry='5.3' transform='rotate(-0.6 353.7 477.8)' fill='%233f7f8c' opacity='0.41'/%3E%3Cellipse cx='682.5' cy='316.5' rx='27.7' ry='3.4' transform='rotate(-1.1 682.5 316.5)' fill='%235c7f95' opacity='0.69'/%3E%3Cellipse cx='111.3' cy='303' rx='20.8' ry='2' transform='rotate(1.1 111.3 303)' fill='%232b4a5e' opacity='0.37'/%3E%3Cellipse cx='764.9' cy='422.6' rx='92.9' ry='4.9' transform='rotate(-0.6 764.9 422.6)' fill='%231f3a4e' opacity='0.47'/%3E%3Cellipse cx='1247.7' cy='269.3' rx='48.4' ry='2.1' transform='rotate(0.5 1247.7 269.3)' fill='%235c7f95' opacity='0.39'/%3E%3Cellipse cx='649.4' cy='272.8' rx='22.2' ry='1.7' transform='rotate(0.8 649.4 272.8)' fill='%2324405a' opacity='0.59'/%3E%3Cellipse cx='1289.6' cy='321.3' rx='35.7' ry='2.8' transform='rotate(0.5 1289.6 321.3)' fill='%233f7f8c' opacity='0.41'/%3E%3Cellipse cx='994' cy='500' rx='112.4' ry='3.6' transform='rotate(-0.4 994 500)' fill='%2324405a' opacity='0.72'/%3E%3Cellipse cx='540.3' cy='313' rx='19.8' ry='2.8' transform='rotate(-1 540.3 313)' fill='%232b4a5e' opacity='0.55'/%3E%3Cellipse cx='724.6' cy='442.3' rx='109.3' ry='2.5' transform='rotate(0.1 724.6 442.3)' fill='%2324405a' opacity='0.7'/%3E%3Cellipse cx='153' cy='296.1' rx='22.3' ry='1.5' transform='rotate(-0.8 153 296.1)' fill='%235c7f95' opacity='0.46'/%3E%3Cellipse cx='108.7' cy='415.4' rx='51.1' ry='5' transform='rotate(1 108.7 415.4)' fill='%232b4a5e' opacity='0.52'/%3E%3Cellipse cx='1191.4' cy='297.1' rx='40.6' ry='1.7' transform='rotate(-0.5 1191.4 297.1)' fill='%2324405a' opacity='0.41'/%3E%3Cellipse cx='696.1' cy='446.6' rx='99.8' ry='5.9' transform='rotate(1.4 696.1 446.6)' fill='%235c7f95' opacity='0.38'/%3E%3Cellipse cx='769.6' cy='438.9' rx='102.8' ry='5.5' transform='rotate(0.5 769.6 438.9)' fill='%231f3a4e' opacity='0.35'/%3E%3Cellipse cx='340.8' cy='293.6' rx='55.5' ry='2.8' transform='rotate(1.2 340.8 293.6)' fill='%232b4a5e' opacity='0.69'/%3E%3Cellipse cx='1107.2' cy='300.5' rx='60.4' ry='2.2' transform='rotate(0.8 1107.2 300.5)' fill='%233f7f8c' opacity='0.45'/%3E%3Cellipse cx='122.7' cy='334.7' rx='68.4' ry='2.9' transform='rotate(0.3 122.7 334.7)' fill='%235c7f95' opacity='0.38'/%3E%3Cellipse cx='509.5' cy='362.7' rx='37.4' ry='2' transform='rotate(0.1 509.5 362.7)' fill='%231f3a4e' opacity='0.59'/%3E%3Cellipse cx='1596.4' cy='500.6' rx='92.7' ry='5.3' transform='rotate(0.4 1596.4 500.6)' fill='%2324405a' opacity='0.67'/%3E%3Cellipse cx='63.2' cy='400.1' rx='76.9' ry='3.3' transform='rotate(1 63.2 400.1)' fill='%235c7f95' opacity='0.52'/%3E%3Cellipse cx='502.8' cy='288.7' rx='27.9' ry='1.2' transform='rotate(-0.6 502.8 288.7)' fill='%233f7f8c' opacity='0.66'/%3E%3Cellipse cx='250.6' cy='500.2' rx='154.2' ry='3.4' transform='rotate(-0.1 250.6 500.2)' fill='%231f3a4e' opacity='0.37'/%3E%3Cellipse cx='1193.6' cy='333' rx='24.9' ry='2.3' transform='rotate(-1.3 1193.6 333)' fill='%235c7f95' opacity='0.66'/%3E%3Cellipse cx='337.2' cy='516.6' rx='79.6' ry='5.4' transform='rotate(0.7 337.2 516.6)' fill='%235c7f95' opacity='0.37'/%3E%3Cellipse cx='1279.9' cy='297.1' rx='33.1' ry='2.2' transform='rotate(0.4 1279.9 297.1)' fill='%2324405a' opacity='0.73'/%3E%3Cellipse cx='753' cy='291.2' rx='26.2' ry='1.6' transform='rotate(0 753 291.2)' fill='%2324405a' opacity='0.74'/%3E%3Cellipse cx='1534.7' cy='369.6' rx='49.6' ry='1.9' transform='rotate(1 1534.7 369.6)' fill='%2324405a' opacity='0.63'/%3E%3Cellipse cx='1069.5' cy='267.7' rx='12.8' ry='2.2' transform='rotate(1 1069.5 267.7)' fill='%235c7f95' opacity='0.36'/%3E%3Cellipse cx='42.2' cy='449.2' rx='106.3' ry='3.9' transform='rotate(-0.6 42.2 449.2)' fill='%235c7f95' opacity='0.71'/%3E%3C/g%3E%3Cg filter='url(%23bs-soft)'%3E%3C/g%3E%3Cg filter='url(%23bs-water)'%3E%3Cellipse cx='1379.2' cy='272' rx='11' ry='2.4' transform='rotate(-0.8 1379.2 272)' fill='%23f08a4b' opacity='0.85'/%3E%3Cellipse cx='1373.8' cy='281.2' rx='14.2' ry='2.5' transform='rotate(1.7 1373.8 281.2)' fill='%23f08a4b' opacity='0.83'/%3E%3Cellipse cx='1369.5' cy='290.3' rx='22.4' ry='2.6' transform='rotate(-0.7 1369.5 290.3)' fill='%23f08a4b' opacity='0.81'/%3E%3Cellipse cx='1370' cy='299.5' rx='19.4' ry='2.7' transform='rotate(-0.4 1370 299.5)' fill='%23f08a4b' opacity='0.79'/%3E%3Cellipse cx='1376.7' cy='308.7' rx='24.8' ry='2.8' transform='rotate(0.9 1376.7 308.7)' fill='%23f6a56b' opacity='0.77'/%3E%3Cellipse cx='1375' cy='317.8' rx='20.8' ry='2.9' transform='rotate(0.4 1375 317.8)' fill='%23f6a56b' opacity='0.75'/%3E%3Cellipse cx='1370.5' cy='327' rx='25' ry='3' transform='rotate(0.9 1370.5 327)' fill='%23f08a4b' opacity='0.73'/%3E%3Cellipse cx='1375.6' cy='336.2' rx='26.5' ry='3.1' transform='rotate(0.6 1375.6 336.2)' fill='%23f08a4b' opacity='0.7'/%3E%3Cellipse cx='1383.7' cy='345.3' rx='28.3' ry='3.2' transform='rotate(-0.7 1383.7 345.3)' fill='%23f08a4b' opacity='0.68'/%3E%3Cellipse cx='1385.3' cy='354.5' rx='32.7' ry='3.3' transform='rotate(0 1385.3 354.5)' fill='%23f6a56b' opacity='0.66'/%3E%3Cellipse cx='1367.8' cy='363.7' rx='29.9' ry='3.4' transform='rotate(0.2 1367.8 363.7)' fill='%23f6a56b' opacity='0.64'/%3E%3Cellipse cx='1369.5' cy='372.8' rx='34.4' ry='3.5' transform='rotate(1.4 1369.5 372.8)' fill='%23f08a4b' opacity='0.62'/%3E%3Cellipse cx='1382.2' cy='382' rx='31.1' ry='3.6' transform='rotate(0.6 1382.2 382)' fill='%23f6a56b' opacity='0.6'/%3E%3Cellipse cx='1371' cy='391.2' rx='33.2' ry='3.7' transform='rotate(-1.6 1371 391.2)' fill='%23f08a4b' opacity='0.58'/%3E%3Cellipse cx='1371.1' cy='400.3' rx='39.8' ry='3.8' transform='rotate(0.8 1371.1 400.3)' fill='%23f6a56b' opacity='0.56'/%3E%3Cellipse cx='1380.2' cy='409.5' rx='37.1' ry='3.9' transform='rotate(1.4 1380.2 409.5)' fill='%23f08a4b' opacity='0.54'/%3E%3Cellipse cx='1373.3' cy='418.7' rx='37.3' ry='4' transform='rotate(1.5 1373.3 418.7)' fill='%23f08a4b' opacity='0.52'/%3E%3Cellipse cx='1383.4' cy='427.8' rx='43.3' ry='4.1' transform='rotate(0 1383.4 427.8)' fill='%23f08a4b' opacity='0.5'/%3E%3Cellipse cx='1383.1' cy='437' rx='43.5' ry='4.2' transform='rotate(0.2 1383.1 437)' fill='%23f08a4b' opacity='0.48'/%3E%3Cellipse cx='1393.2' cy='446.2' rx='41.8' ry='4.3' transform='rotate(0.7 1393.2 446.2)' fill='%23f6a56b' opacity='0.45'/%3E%3Cellipse cx='1361.2' cy='455.3' rx='44.9' ry='4.4' transform='rotate(1.3 1361.2 455.3)' fill='%23f6a56b' opacity='0.43'/%3E%3Cellipse cx='1379.6' cy='464.5' rx='45.2' ry='4.5' transform='rotate(-0.5 1379.6 464.5)' fill='%23f6a56b' opacity='0.41'/%3E%3Cellipse cx='1390.5' cy='473.7' rx='49.4' ry='4.6' transform='rotate(1.2 1390.5 473.7)' fill='%23f08a4b' opacity='0.39'/%3E%3Cellipse cx='1393.3' cy='482.8' rx='47.5' ry='4.7' transform='rotate(1.8 1393.3 482.8)' fill='%23f08a4b' opacity='0.37'/%3E%3C/g%3E%3C/svg%3E");--kit-icon-grass:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%2324331a' d='M6 0h4v1h-4zM4 1h2v1h-2zM10 1h2v1h-2zM2 2h2v1h-2zM12 2h2v1h-2zM0 3h2v1h-2zM14 3h2v1h-2zM0 4h1v1h-1zM15 4h1v1h-1zM0 5h1v1h-1zM3 5h2v1h-2zM12 5h2v1h-2zM15 5h1v1h-1zM0 6h1v1h-1zM5 6h2v1h-2zM10 6h2v1h-2zM15 6h1v1h-1zM0 7h1v1h-1zM7 7h3v1h-3zM15 7h1v1h-1zM0 8h1v1h-1zM8 8h1v1h-1zM15 8h1v1h-1zM0 9h1v1h-1zM8 9h1v1h-1zM15 9h1v1h-1zM0 10h1v1h-1zM8 10h1v1h-1zM15 10h1v1h-1zM0 11h1v1h-1zM8 11h1v1h-1zM15 11h1v1h-1zM1 12h2v1h-2zM8 12h1v1h-1zM13 12h2v1h-2zM3 13h2v1h-2zM8 13h1v1h-1zM11 13h2v1h-2zM5 14h2v1h-2zM8 14h3v1h-3zM7 15h2v1h-2z'/%3E%3Cpath fill='%235da130' d='M6 1h1v1h-1zM8 1h2v1h-2zM4 2h4v1h-4zM9 2h2v1h-2zM2 3h1v1h-1zM4 3h2v1h-2zM7 3h7v1h-7zM1 4h8v1h-8zM10 4h2v1h-2zM13 4h2v1h-2zM5 5h2v1h-2zM8 5h4v1h-4zM7 6h2v1h-2z'/%3E%3Cpath fill='%2379bf45' d='M7 1h1v1h-1zM11 2h1v1h-1zM3 3h1v1h-1zM9 4h1v1h-1zM7 5h1v1h-1z'/%3E%3Cpath fill='%234a8a26' d='M8 2h1v1h-1zM6 3h1v1h-1zM12 4h1v1h-1zM9 6h1v1h-1z'/%3E%3Cpath fill='%234f8f28' d='M1 5h2v1h-2zM1 6h1v1h-1zM3 6h2v1h-2zM2 7h1v1h-1zM5 7h2v1h-2zM4 8h1v1h-1z'/%3E%3Cpath fill='%233f7a1f' d='M14 5h1v1h-1zM12 6h2v1h-2zM10 7h1v1h-1zM12 7h1v1h-1zM10 8h1v1h-1zM13 8h1v1h-1z'/%3E%3Cpath fill='%238a5a33' d='M2 6h1v1h-1zM1 7h1v1h-1zM3 7h1v1h-1zM1 8h1v1h-1zM3 8h1v1h-1zM5 8h1v1h-1zM7 8h1v1h-1zM1 9h2v1h-2zM4 9h3v1h-3zM1 10h1v1h-1zM3 10h2v1h-2zM6 10h2v1h-2zM2 11h2v1h-2zM5 11h3v1h-3zM3 12h3v1h-3zM7 12h1v1h-1zM5 13h2v1h-2zM7 14h1v1h-1z'/%3E%3Cpath fill='%237d5230' d='M14 6h1v1h-1zM11 7h1v1h-1zM14 7h1v1h-1zM12 8h1v1h-1zM14 9h1v1h-1zM10 10h1v1h-1zM12 11h1v1h-1z'/%3E%3Cpath fill='%23a0703f' d='M4 7h1v1h-1zM2 8h1v1h-1zM7 9h1v1h-1zM2 10h1v1h-1zM4 11h1v1h-1zM7 13h1v1h-1z'/%3E%3Cpath fill='%236e4526' d='M13 7h1v1h-1zM9 8h1v1h-1zM11 8h1v1h-1zM14 8h1v1h-1zM9 9h2v1h-2zM12 9h2v1h-2zM9 10h1v1h-1zM11 10h2v1h-2zM14 10h1v1h-1zM9 11h3v1h-3zM13 11h2v1h-2zM9 12h1v1h-1zM11 12h2v1h-2zM9 13h2v1h-2z'/%3E%3Cpath fill='%236b4426' d='M6 8h1v1h-1zM3 9h1v1h-1zM5 10h1v1h-1zM1 11h1v1h-1zM6 12h1v1h-1z'/%3E%3Cpath fill='%23553319' d='M11 9h1v1h-1zM13 10h1v1h-1zM10 12h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-chest:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a1a0c' d='M1 2h14v1h-14zM1 3h1v1h-1zM14 3h1v1h-1zM1 4h1v1h-1zM14 4h1v1h-1zM1 5h1v1h-1zM14 5h1v1h-1zM1 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM14 7h1v1h-1zM1 8h6v1h-6zM9 8h6v1h-6zM1 9h1v1h-1zM14 9h1v1h-1zM1 10h1v1h-1zM14 10h1v1h-1zM1 11h1v1h-1zM14 11h1v1h-1zM1 12h1v1h-1zM14 12h1v1h-1zM1 13h1v1h-1zM14 13h1v1h-1zM1 14h14v1h-14z'/%3E%3Cpath fill='%23c48b45' d='M2 3h12v1h-12zM2 4h1v1h-1zM2 5h1v1h-1zM2 6h1v1h-1zM2 9h1v1h-1zM2 10h1v1h-1zM2 11h1v1h-1zM2 12h1v1h-1z'/%3E%3Cpath fill='%23a46a2c' d='M3 4h10v1h-10zM3 5h10v1h-10zM3 6h10v1h-10zM3 9h4v1h-4zM9 9h4v1h-4zM3 10h4v1h-4zM9 10h4v1h-4zM3 11h10v1h-10zM3 12h10v1h-10z'/%3E%3Cpath fill='%237a4a1c' d='M13 4h1v1h-1zM13 5h1v1h-1zM13 6h1v1h-1zM13 9h1v1h-1zM13 10h1v1h-1zM13 11h1v1h-1zM13 12h1v1h-1zM2 13h12v1h-12z'/%3E%3Cpath fill='%235e3612' d='M2 7h5v1h-5zM9 7h5v1h-5z'/%3E%3Cpath fill='%23e3e3e3' d='M7 7h2v1h-2zM7 8h1v1h-1zM7 9h1v1h-1z'/%3E%3Cpath fill='%239a9a9a' d='M8 8h1v1h-1zM8 9h1v1h-1z'/%3E%3Cpath fill='%234a4a4a' d='M7 10h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-pickaxe:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%230d3a3d' d='M4 1h6v1h-6zM3 2h1v1h-1zM11 2h1v1h-1zM2 3h3v1h-3zM12 3h1v1h-1zM9 4h1v1h-1zM13 4h1v1h-1zM8 5h1v1h-1zM11 5h1v1h-1zM14 5h1v1h-1zM7 6h1v1h-1zM10 6h1v1h-1zM12 6h1v1h-1zM14 6h1v1h-1zM6 7h1v1h-1zM9 7h1v1h-1zM12 7h1v1h-1zM14 7h1v1h-1zM5 8h1v1h-1zM8 8h1v1h-1zM13 8h2v1h-2zM4 9h1v1h-1zM7 9h1v1h-1zM3 10h1v1h-1zM6 10h1v1h-1zM2 11h1v1h-1zM5 11h1v1h-1zM1 12h1v1h-1zM4 12h1v1h-1zM1 13h1v1h-1z'/%3E%3Cpath fill='%23c9fbfd' d='M4 2h1v1h-1z'/%3E%3Cpath fill='%235de0e6' d='M5 2h6v1h-6zM10 3h2v1h-2zM11 4h2v1h-2zM12 5h2v1h-2zM13 6h1v1h-1zM13 7h1v1h-1z'/%3E%3Cpath fill='%232aa7b0' d='M5 3h5v1h-5zM10 4h1v1h-1z'/%3E%3Cpath fill='%238a5a33' d='M9 5h1v1h-1zM8 6h1v1h-1zM7 7h1v1h-1zM6 8h1v1h-1zM5 9h1v1h-1zM4 10h1v1h-1zM3 11h1v1h-1zM2 12h1v1h-1z'/%3E%3Cpath fill='%235e3b1f' d='M10 5h1v1h-1zM9 6h1v1h-1zM8 7h1v1h-1zM7 8h1v1h-1zM6 9h1v1h-1zM5 10h1v1h-1zM4 11h1v1h-1zM3 12h1v1h-1zM2 13h1v1h-1z'/%3E%3Cpath fill='%232a1a0c' d='M3 13h1v1h-1zM2 14h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-map:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%234a3a22' d='M1 1h14v1h-14zM1 2h1v1h-1zM14 2h1v1h-1zM1 3h1v1h-1zM14 3h1v1h-1zM1 4h1v1h-1zM14 4h1v1h-1zM1 5h1v1h-1zM14 5h1v1h-1zM1 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM14 7h1v1h-1zM1 8h1v1h-1zM14 8h1v1h-1zM1 9h1v1h-1zM14 9h1v1h-1zM1 10h1v1h-1zM14 10h1v1h-1zM1 11h1v1h-1zM14 11h1v1h-1zM1 12h1v1h-1zM14 12h1v1h-1zM1 13h1v1h-1zM14 13h1v1h-1zM1 14h14v1h-14z'/%3E%3Cpath fill='%23d9c690' d='M2 2h12v1h-12zM2 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM2 5h1v1h-1zM13 5h1v1h-1zM2 6h1v1h-1zM13 6h1v1h-1zM2 7h1v1h-1zM13 7h1v1h-1zM2 8h1v1h-1zM13 8h1v1h-1zM2 9h1v1h-1zM13 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM2 12h1v1h-1zM13 12h1v1h-1zM2 13h12v1h-12z'/%3E%3Cpath fill='%23efe3bd' d='M3 3h2v1h-2zM8 3h2v1h-2zM3 4h1v1h-1zM8 4h2v1h-2zM3 5h1v1h-1zM7 5h2v1h-2zM12 5h1v1h-1zM3 6h2v1h-2zM6 6h2v1h-2zM11 6h1v1h-1zM3 7h3v1h-3zM9 7h2v1h-2zM3 8h2v1h-2zM9 8h1v1h-1zM3 9h1v1h-1zM8 9h2v1h-2zM12 9h1v1h-1zM3 10h1v1h-1zM6 10h4v1h-4zM11 10h2v1h-2zM5 11h2v1h-2zM8 11h1v1h-1zM12 11h1v1h-1zM5 12h2v1h-2zM9 12h1v1h-1zM11 12h2v1h-2z'/%3E%3Cpath fill='%236aa84f' d='M5 3h3v1h-3zM4 4h2v1h-2zM7 4h1v1h-1zM4 5h3v1h-3zM5 6h1v1h-1zM12 6h1v1h-1zM11 7h2v1h-2zM10 8h1v1h-1zM12 8h1v1h-1zM10 9h2v1h-2zM3 11h2v1h-2zM7 11h1v1h-1zM4 12h1v1h-1zM7 12h2v1h-2z'/%3E%3Cpath fill='%236aa6d8' d='M10 3h3v1h-3zM10 4h1v1h-1zM12 4h1v1h-1zM9 5h3v1h-3zM8 6h3v1h-3zM6 7h3v1h-3zM5 8h2v1h-2zM8 8h1v1h-1zM4 9h4v1h-4zM4 10h2v1h-2z'/%3E%3Cpath fill='%234f8a3a' d='M6 4h1v1h-1zM11 8h1v1h-1zM3 12h1v1h-1z'/%3E%3Cpath fill='%233e6e8e' d='M11 4h1v1h-1zM7 8h1v1h-1z'/%3E%3Cpath fill='%23c0392b' d='M10 10h1v1h-1zM9 11h3v1h-3zM10 12h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-book-quill:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a1a12' d='M12 0h2v1h-2zM11 1h1v1h-1zM14 1h1v1h-1zM10 2h1v1h-1zM14 2h1v1h-1zM9 3h1v1h-1zM13 3h1v1h-1zM2 4h7v1h-7zM12 4h1v1h-1zM1 5h1v1h-1zM11 5h2v1h-2zM1 6h1v1h-1zM7 6h1v1h-1zM10 6h1v1h-1zM12 6h1v1h-1zM1 7h1v1h-1zM7 7h1v1h-1zM9 7h2v1h-2zM13 7h1v1h-1zM1 8h1v1h-1zM7 8h1v1h-1zM13 8h1v1h-1zM1 9h1v1h-1zM13 9h1v1h-1zM1 10h1v1h-1zM13 10h1v1h-1zM1 11h1v1h-1zM13 11h1v1h-1zM1 12h1v1h-1zM13 12h1v1h-1zM1 13h1v1h-1zM13 13h1v1h-1zM2 14h11v1h-11z'/%3E%3Cpath fill='%23ffffff' d='M12 1h2v1h-2zM11 2h2v1h-2zM10 3h2v1h-2zM9 4h2v1h-2zM8 5h2v1h-2zM8 6h1v1h-1z'/%3E%3Cpath fill='%23c9c9c9' d='M13 2h1v1h-1zM12 3h1v1h-1zM11 4h1v1h-1zM10 5h1v1h-1zM9 6h1v1h-1zM8 7h1v1h-1z'/%3E%3Cpath fill='%238b4a2b' d='M2 5h6v1h-6zM2 6h1v1h-1zM2 7h1v1h-1zM12 7h1v1h-1zM2 8h1v1h-1zM12 8h1v1h-1zM2 9h1v1h-1zM12 9h1v1h-1zM2 10h1v1h-1zM12 10h1v1h-1zM2 11h1v1h-1zM12 11h1v1h-1zM2 12h1v1h-1zM12 12h1v1h-1z'/%3E%3Cpath fill='%23f4ecd6' d='M3 6h4v1h-4zM3 7h1v1h-1zM6 7h1v1h-1zM11 7h1v1h-1zM3 8h4v1h-4zM9 8h2v1h-2zM3 9h1v1h-1zM8 9h3v1h-3zM3 10h8v1h-8zM3 11h1v1h-1zM10 11h1v1h-1zM3 12h8v1h-8z'/%3E%3Cpath fill='%233a3a3a' d='M11 6h1v1h-1zM8 8h1v1h-1z'/%3E%3Cpath fill='%23d8cba7' d='M4 7h2v1h-2zM11 8h1v1h-1zM4 9h4v1h-4zM11 9h1v1h-1zM11 10h1v1h-1zM4 11h6v1h-6zM11 11h1v1h-1zM11 12h1v1h-1z'/%3E%3Cpath fill='%236a3520' d='M2 13h11v1h-11z'/%3E%3C/svg%3E");--kit-icon-emerald:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%2306401d' d='M7 1h2v1h-2zM6 2h1v1h-1zM9 2h1v1h-1zM5 3h1v1h-1zM10 3h1v1h-1zM4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1zM3 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM4 10h1v1h-1zM11 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM5 12h1v1h-1zM10 12h1v1h-1zM6 13h1v1h-1zM9 13h1v1h-1zM7 14h2v1h-2z'/%3E%3Cpath fill='%23b8ffcb' d='M7 2h2v1h-2zM6 3h1v1h-1zM5 4h1v1h-1zM4 6h1v1h-1z'/%3E%3Cpath fill='%2341f08a' d='M7 3h1v1h-1zM6 4h1v1h-1zM5 5h1v1h-1zM5 6h1v1h-1zM4 7h1v1h-1zM4 8h1v1h-1z'/%3E%3Cpath fill='%2317dd62' d='M8 3h1v1h-1zM7 4h2v1h-2zM6 5h3v1h-3zM6 6h5v1h-5zM5 7h5v1h-5zM5 8h4v1h-4zM4 9h4v1h-4zM5 10h3v1h-3zM5 11h2v1h-2zM6 12h1v1h-1z'/%3E%3Cpath fill='%230e9f45' d='M9 3h1v1h-1zM9 4h2v1h-2zM9 5h2v1h-2zM11 6h1v1h-1zM10 7h2v1h-2zM9 8h3v1h-3zM8 9h4v1h-4zM8 10h2v1h-2zM7 11h3v1h-3zM7 12h2v1h-2zM7 13h1v1h-1z'/%3E%3Cpath fill='%230a7a34' d='M10 10h1v1h-1zM10 11h1v1h-1zM9 12h1v1h-1zM8 13h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-diamond:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%230b3b40' d='M4 2h8v1h-8zM3 3h1v1h-1zM12 3h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM1 5h14v1h-14zM1 6h1v1h-1zM14 6h1v1h-1zM2 7h1v1h-1zM13 7h1v1h-1zM3 8h1v1h-1zM13 8h1v1h-1zM3 9h2v1h-2zM12 9h1v1h-1zM4 10h2v1h-2zM12 10h1v1h-1zM5 11h2v1h-2zM11 11h1v1h-1zM6 12h2v1h-2zM10 12h1v1h-1zM7 13h3v1h-3zM8 14h1v1h-1z'/%3E%3Cpath fill='%23ffffff' d='M4 3h1v1h-1zM3 4h1v1h-1z'/%3E%3Cpath fill='%23b8fbff' d='M5 3h3v1h-3zM4 4h2v1h-2zM2 6h2v1h-2zM3 7h1v1h-1zM4 8h1v1h-1z'/%3E%3Cpath fill='%235de0e6' d='M8 3h3v1h-3zM6 4h6v1h-6zM4 6h7v1h-7zM4 7h7v1h-7zM5 8h6v1h-6zM5 9h5v1h-5zM6 10h4v1h-4zM7 11h2v1h-2zM8 12h1v1h-1z'/%3E%3Cpath fill='%232aa7b0' d='M11 3h1v1h-1zM12 4h1v1h-1zM11 6h2v1h-2zM11 7h1v1h-1zM11 8h1v1h-1zM10 9h1v1h-1zM10 10h1v1h-1zM9 11h1v1h-1zM9 12h1v1h-1z'/%3E%3Cpath fill='%231b7d86' d='M13 6h1v1h-1zM12 7h1v1h-1zM12 8h1v1h-1zM11 9h1v1h-1zM11 10h1v1h-1zM10 11h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-compass:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%231e1e22' d='M5 1h6v1h-6zM4 2h1v1h-1zM11 2h1v1h-1zM3 3h1v1h-1zM12 3h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM2 5h1v1h-1zM13 5h1v1h-1zM2 6h1v1h-1zM13 6h1v1h-1zM2 7h1v1h-1zM13 7h1v1h-1zM2 8h1v1h-1zM13 8h1v1h-1zM2 9h1v1h-1zM13 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM3 12h1v1h-1zM12 12h1v1h-1zM4 13h1v1h-1zM11 13h1v1h-1zM5 14h6v1h-6z'/%3E%3Cpath fill='%23c6c6c6' d='M5 2h6v1h-6zM4 3h1v1h-1zM11 3h1v1h-1zM3 4h1v1h-1zM12 4h1v1h-1zM3 5h1v1h-1zM12 5h1v1h-1zM3 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM3 10h1v1h-1zM12 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM5 13h6v1h-6z'/%3E%3Cpath fill='%238b8b8b' d='M5 3h6v1h-6zM4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1zM4 6h1v1h-1zM11 6h1v1h-1zM4 7h1v1h-1zM11 7h1v1h-1zM4 8h1v1h-1zM11 8h1v1h-1zM4 9h1v1h-1zM11 9h1v1h-1zM4 10h1v1h-1zM11 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM5 12h6v1h-6z'/%3E%3Cpath fill='%235b6b7c' d='M5 4h1v1h-1zM7 4h1v1h-1zM9 4h2v1h-2zM6 5h3v1h-3zM5 6h1v1h-1zM7 6h1v1h-1zM5 7h2v1h-2zM10 7h1v1h-1zM6 8h1v1h-1zM10 8h1v1h-1zM5 9h1v1h-1zM8 9h1v1h-1zM10 9h1v1h-1zM7 10h1v1h-1zM9 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM9 11h2v1h-2z'/%3E%3Cpath fill='%236f8293' d='M6 4h1v1h-1zM8 4h1v1h-1zM5 5h1v1h-1zM9 5h1v1h-1zM6 6h1v1h-1zM8 6h1v1h-1zM7 7h1v1h-1zM5 8h1v1h-1zM9 8h1v1h-1zM9 9h1v1h-1zM8 10h1v1h-1zM10 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1z'/%3E%3Cpath fill='%23ff6a5a' d='M10 5h1v1h-1z'/%3E%3Cpath fill='%23d23b3b' d='M9 6h2v1h-2zM8 7h2v1h-2z'/%3E%3Cpath fill='%23dcdcdc' d='M7 8h1v1h-1zM6 9h1v1h-1zM5 10h1v1h-1z'/%3E%3Cpath fill='%239a9a9a' d='M8 8h1v1h-1zM7 9h1v1h-1zM6 10h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-torch:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a1a0c' d='M7 1h2v1h-2zM6 2h1v1h-1zM9 2h1v1h-1zM5 3h1v1h-1zM10 3h1v1h-1zM5 4h1v1h-1zM10 4h1v1h-1zM5 5h1v1h-1zM10 5h1v1h-1zM6 6h1v1h-1zM9 6h1v1h-1zM6 7h1v1h-1zM9 7h1v1h-1zM6 8h1v1h-1zM9 8h1v1h-1zM6 9h1v1h-1zM9 9h1v1h-1zM6 10h1v1h-1zM9 10h1v1h-1zM6 11h1v1h-1zM9 11h1v1h-1zM6 12h1v1h-1zM9 12h1v1h-1zM6 13h1v1h-1zM9 13h1v1h-1zM6 14h4v1h-4z'/%3E%3Cpath fill='%23fff6b0' d='M7 2h2v1h-2zM6 3h1v1h-1zM9 3h1v1h-1zM9 4h1v1h-1z'/%3E%3Cpath fill='%23ffd84a' d='M7 3h2v1h-2zM6 4h1v1h-1z'/%3E%3Cpath fill='%23f08a2b' d='M7 4h2v1h-2zM6 5h1v1h-1zM9 5h1v1h-1z'/%3E%3Cpath fill='%23d2501b' d='M7 5h2v1h-2z'/%3E%3Cpath fill='%23b07a3f' d='M7 6h1v1h-1zM7 7h1v1h-1zM7 8h1v1h-1zM7 9h1v1h-1zM7 10h1v1h-1zM7 11h1v1h-1zM7 12h1v1h-1zM7 13h1v1h-1z'/%3E%3Cpath fill='%236b4a26' d='M8 6h1v1h-1zM8 7h1v1h-1zM8 8h1v1h-1zM8 9h1v1h-1zM8 10h1v1h-1zM8 11h1v1h-1zM8 12h1v1h-1zM8 13h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-tnt:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a0606' d='M0 0h16v1h-16zM0 1h1v1h-1zM15 1h1v1h-1zM0 2h1v1h-1zM15 2h1v1h-1zM0 3h1v1h-1zM15 3h1v1h-1zM0 4h1v1h-1zM15 4h1v1h-1zM0 5h1v1h-1zM15 5h1v1h-1zM0 6h1v1h-1zM15 6h1v1h-1zM0 7h1v1h-1zM15 7h1v1h-1zM0 8h1v1h-1zM15 8h1v1h-1zM0 9h1v1h-1zM15 9h1v1h-1zM0 10h1v1h-1zM15 10h1v1h-1zM0 11h1v1h-1zM15 11h1v1h-1zM0 12h1v1h-1zM15 12h1v1h-1zM0 13h1v1h-1zM15 13h1v1h-1zM0 14h1v1h-1zM15 14h1v1h-1zM0 15h16v1h-16z'/%3E%3Cpath fill='%23d23b3b' d='M1 1h1v1h-1zM3 1h1v1h-1zM5 1h1v1h-1zM7 1h1v1h-1zM9 1h1v1h-1zM11 1h1v1h-1zM13 1h1v1h-1zM1 2h1v1h-1zM3 2h1v1h-1zM5 2h1v1h-1zM7 2h1v1h-1zM9 2h1v1h-1zM11 2h1v1h-1zM13 2h1v1h-1zM1 3h1v1h-1zM3 3h1v1h-1zM5 3h1v1h-1zM7 3h1v1h-1zM9 3h1v1h-1zM11 3h1v1h-1zM13 3h1v1h-1zM1 11h1v1h-1zM3 11h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1zM1 12h1v1h-1zM3 12h1v1h-1zM5 12h1v1h-1zM7 12h1v1h-1zM9 12h1v1h-1zM11 12h1v1h-1zM13 12h1v1h-1zM1 13h1v1h-1zM3 13h1v1h-1zM5 13h1v1h-1zM7 13h1v1h-1zM9 13h1v1h-1zM11 13h1v1h-1zM13 13h1v1h-1zM1 14h1v1h-1zM3 14h1v1h-1zM5 14h1v1h-1zM7 14h1v1h-1zM9 14h1v1h-1zM11 14h1v1h-1zM13 14h1v1h-1z'/%3E%3Cpath fill='%23a62626' d='M2 1h1v1h-1zM4 1h1v1h-1zM6 1h1v1h-1zM8 1h1v1h-1zM10 1h1v1h-1zM12 1h1v1h-1zM14 1h1v1h-1zM2 2h1v1h-1zM4 2h1v1h-1zM6 2h1v1h-1zM8 2h1v1h-1zM10 2h1v1h-1zM12 2h1v1h-1zM14 2h1v1h-1zM2 3h1v1h-1zM4 3h1v1h-1zM6 3h1v1h-1zM8 3h1v1h-1zM10 3h1v1h-1zM12 3h1v1h-1zM14 3h1v1h-1zM2 11h1v1h-1zM4 11h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1zM2 12h1v1h-1zM4 12h1v1h-1zM6 12h1v1h-1zM8 12h1v1h-1zM10 12h1v1h-1zM12 12h1v1h-1zM14 12h1v1h-1zM2 13h1v1h-1zM4 13h1v1h-1zM6 13h1v1h-1zM8 13h1v1h-1zM10 13h1v1h-1zM12 13h1v1h-1zM14 13h1v1h-1zM2 14h1v1h-1zM4 14h1v1h-1zM6 14h1v1h-1zM8 14h1v1h-1zM10 14h1v1h-1zM12 14h1v1h-1zM14 14h1v1h-1z'/%3E%3Cpath fill='%23f4efe6' d='M1 4h14v1h-14zM1 5h1v1h-1zM5 5h1v1h-1zM7 5h2v1h-2zM10 5h1v1h-1zM14 5h1v1h-1zM1 6h2v1h-2zM4 6h2v1h-2zM8 6h1v1h-1zM10 6h2v1h-2zM13 6h2v1h-2zM1 7h2v1h-2zM4 7h2v1h-2zM7 7h1v1h-1zM10 7h2v1h-2zM13 7h2v1h-2zM1 8h2v1h-2zM4 8h2v1h-2zM7 8h2v1h-2zM10 8h2v1h-2zM13 8h2v1h-2zM1 9h2v1h-2zM4 9h2v1h-2zM7 9h2v1h-2zM10 9h2v1h-2zM13 9h2v1h-2z'/%3E%3Cpath fill='%231a1a1a' d='M2 5h3v1h-3zM6 5h1v1h-1zM9 5h1v1h-1zM11 5h3v1h-3zM3 6h1v1h-1zM6 6h2v1h-2zM9 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM6 7h1v1h-1zM8 7h2v1h-2zM12 7h1v1h-1zM3 8h1v1h-1zM6 8h1v1h-1zM9 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM6 9h1v1h-1zM9 9h1v1h-1zM12 9h1v1h-1z'/%3E%3Cpath fill='%23bdb5a8' d='M1 10h14v1h-14z'/%3E%3C/svg%3E");--kit-icon-paper:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%234a4a40' d='M3 1h9v1h-9zM3 2h1v1h-1zM12 2h1v1h-1zM3 3h1v1h-1zM13 3h1v1h-1zM3 4h1v1h-1zM13 4h1v1h-1zM3 5h1v1h-1zM13 5h1v1h-1zM3 6h1v1h-1zM13 6h1v1h-1zM3 7h1v1h-1zM13 7h1v1h-1zM3 8h1v1h-1zM13 8h1v1h-1zM3 9h1v1h-1zM13 9h1v1h-1zM3 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM13 11h1v1h-1zM3 12h1v1h-1zM13 12h1v1h-1zM3 13h11v1h-11z'/%3E%3Cpath fill='%23f7f4ea' d='M4 2h8v1h-8zM4 3h9v1h-9zM4 4h1v1h-1zM11 4h2v1h-2zM4 5h8v1h-8zM4 6h1v1h-1zM10 6h3v1h-3zM4 7h8v1h-8zM4 8h1v1h-1zM12 8h1v1h-1zM4 9h8v1h-8zM4 10h1v1h-1zM9 10h3v1h-3zM4 11h8v1h-8z'/%3E%3Cpath fill='%239aa3ab' d='M5 4h6v1h-6zM5 6h5v1h-5zM5 8h7v1h-7zM5 10h4v1h-4z'/%3E%3Cpath fill='%23d8d2bf' d='M12 5h1v1h-1zM12 7h1v1h-1zM12 9h1v1h-1zM12 10h1v1h-1zM12 11h1v1h-1zM4 12h9v1h-9z'/%3E%3C/svg%3E");--kit-icon-question:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 1h6v1h-6zM4 2h8v1h-8zM3 3h3v1h-3zM10 3h3v1h-3zM3 4h3v1h-3zM10 4h3v1h-3zM10 5h3v1h-3zM9 6h3v1h-3zM8 7h3v1h-3zM7 8h3v1h-3zM7 9h3v1h-3zM7 10h3v1h-3zM7 12h3v1h-3zM7 13h3v1h-3z'/%3E%3C/svg%3E");--kit-icon-bug:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%233a2a30' d='M4 1h1v1h-1zM11 1h1v1h-1zM5 2h1v1h-1zM10 2h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM3 5h1v1h-1zM12 5h1v1h-1zM1 7h2v1h-2zM13 7h2v1h-2zM1 9h2v1h-2zM13 9h2v1h-2zM2 11h1v1h-1zM13 11h1v1h-1z'/%3E%3Cpath fill='%232a1018' d='M6 3h4v1h-4zM5 4h1v1h-1zM7 4h2v1h-2zM10 4h1v1h-1zM4 5h8v1h-8zM4 6h1v1h-1zM11 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM3 10h1v1h-1zM12 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM5 13h6v1h-6z'/%3E%3Cpath fill='%23ff5a5a' d='M6 4h1v1h-1zM9 4h1v1h-1z'/%3E%3Cpath fill='%23c2577a' d='M5 6h2v1h-2zM8 6h3v1h-3zM4 7h3v1h-3zM8 7h4v1h-4zM4 8h3v1h-3zM8 8h4v1h-4zM4 9h3v1h-3zM8 9h4v1h-4zM4 10h3v1h-3zM8 10h4v1h-4zM4 11h3v1h-3zM8 11h4v1h-4zM5 12h2v1h-2zM8 12h3v1h-3z'/%3E%3Cpath fill='%238f3a57' d='M7 6h1v1h-1zM7 7h1v1h-1zM7 8h1v1h-1zM7 9h1v1h-1zM7 10h1v1h-1zM7 11h1v1h-1zM7 12h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-potion:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%231c1630' d='M6 1h4v1h-4zM6 2h1v1h-1zM9 2h1v1h-1zM7 3h2v1h-2zM6 4h1v1h-1zM9 4h1v1h-1zM6 5h1v1h-1zM9 5h1v1h-1zM5 6h1v1h-1zM10 6h1v1h-1zM4 7h1v1h-1zM11 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM3 10h1v1h-1zM12 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM3 12h1v1h-1zM12 12h1v1h-1zM4 13h1v1h-1zM11 13h1v1h-1zM5 14h6v1h-6z'/%3E%3Cpath fill='%238a5a33' d='M7 2h2v1h-2z'/%3E%3Cpath fill='%23d8e6ee' d='M7 4h2v1h-2zM7 5h1v1h-1zM6 6h3v1h-3zM5 7h1v1h-1zM10 7h1v1h-1zM4 8h1v1h-1zM11 8h1v1h-1z'/%3E%3Cpath fill='%23ffffff' d='M8 5h1v1h-1zM9 6h1v1h-1zM6 9h1v1h-1zM5 10h1v1h-1z'/%3E%3Cpath fill='%23b493ff' d='M6 7h4v1h-4zM5 8h1v1h-1zM4 9h1v1h-1z'/%3E%3Cpath fill='%238e5cf6' d='M6 8h5v1h-5zM5 9h1v1h-1zM7 9h5v1h-5zM4 10h1v1h-1zM6 10h4v1h-4zM4 11h6v1h-6zM4 12h5v1h-5z'/%3E%3Cpath fill='%236a3fd0' d='M10 10h2v1h-2zM10 11h2v1h-2zM9 12h3v1h-3zM5 13h6v1h-6z'/%3E%3C/svg%3E");--kit-icon-quote:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 3h4v1h-4zM10 3h4v1h-4zM2 4h4v1h-4zM10 4h4v1h-4zM2 5h4v1h-4zM10 5h4v1h-4zM2 6h4v1h-4zM10 6h4v1h-4zM4 7h2v1h-2zM12 7h2v1h-2zM3 8h2v1h-2zM11 8h2v1h-2zM2 9h2v1h-2zM10 9h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-sun:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%239a5a12' d='M7 0h2v1h-2zM2 2h1v1h-1zM13 2h1v1h-1zM5 4h6v1h-6zM4 5h1v1h-1zM11 5h1v1h-1zM4 6h1v1h-1zM11 6h1v1h-1zM0 7h1v1h-1zM4 7h1v1h-1zM11 7h1v1h-1zM15 7h1v1h-1zM0 8h1v1h-1zM4 8h1v1h-1zM11 8h1v1h-1zM15 8h1v1h-1zM4 9h1v1h-1zM11 9h1v1h-1zM4 10h1v1h-1zM11 10h1v1h-1zM5 11h6v1h-6zM2 13h1v1h-1zM13 13h1v1h-1zM7 15h2v1h-2z'/%3E%3Cpath fill='%23ffd84a' d='M7 1h2v1h-2zM7 2h2v1h-2zM3 3h1v1h-1zM12 3h1v1h-1zM5 5h6v1h-6zM5 6h1v1h-1zM7 6h3v1h-3zM1 7h2v1h-2zM5 7h5v1h-5zM13 7h2v1h-2zM1 8h2v1h-2zM5 8h5v1h-5zM13 8h2v1h-2zM5 9h4v1h-4zM5 10h1v1h-1zM3 12h1v1h-1zM12 12h1v1h-1zM7 13h2v1h-2zM7 14h2v1h-2z'/%3E%3Cpath fill='%23fff6c4' d='M6 6h1v1h-1z'/%3E%3Cpath fill='%23f2a52e' d='M10 6h1v1h-1zM10 7h1v1h-1zM10 8h1v1h-1zM9 9h2v1h-2zM6 10h5v1h-5z'/%3E%3C/svg%3E");--kit-icon-moon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%233a3f6b' d='M5 1h2v1h-2zM3 2h2v1h-2zM6 2h1v1h-1zM2 3h1v1h-1zM6 3h1v1h-1zM2 4h1v1h-1zM6 4h1v1h-1zM1 5h1v1h-1zM6 5h1v1h-1zM1 6h1v1h-1zM6 6h1v1h-1zM1 7h1v1h-1zM7 7h1v1h-1zM1 8h1v1h-1zM8 8h1v1h-1zM1 9h1v1h-1zM9 9h5v1h-5zM1 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM2 12h1v1h-1zM12 12h1v1h-1zM3 13h2v1h-2zM10 13h2v1h-2zM5 14h5v1h-5z'/%3E%3Cpath fill='%23f2c230' d='M13 1h1v1h-1zM12 4h1v1h-1z'/%3E%3Cpath fill='%23aab4e6' d='M5 2h1v1h-1zM5 3h1v1h-1zM5 4h1v1h-1zM5 5h1v1h-1zM6 7h1v1h-1zM7 8h1v1h-1zM8 9h1v1h-1zM10 10h3v1h-3z'/%3E%3Cpath fill='%23e6ecff' d='M3 3h2v1h-2zM3 4h2v1h-2zM2 5h3v1h-3zM2 6h4v1h-4zM2 7h4v1h-4zM2 8h5v1h-5zM2 9h6v1h-6zM2 10h8v1h-8zM3 11h10v1h-10zM3 12h9v1h-9zM5 13h5v1h-5z'/%3E%3C/svg%3E");--kit-icon-clock:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%234a3608' d='M5 1h6v1h-6zM4 2h1v1h-1zM12 2h1v1h-1zM3 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM14 4h1v1h-1zM2 5h1v1h-1zM14 5h1v1h-1zM2 6h1v1h-1zM14 6h1v1h-1zM2 7h1v1h-1zM14 7h1v1h-1zM2 8h1v1h-1zM14 8h1v1h-1zM2 9h1v1h-1zM14 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM5 13h6v1h-6z'/%3E%3Cpath fill='%23f2c230' d='M5 2h6v1h-6zM4 3h1v1h-1zM11 3h1v1h-1zM3 4h1v1h-1zM12 4h1v1h-1zM3 5h1v1h-1zM3 6h1v1h-1zM3 7h1v1h-1zM3 8h1v1h-1zM3 9h1v1h-1zM3 10h1v1h-1z'/%3E%3Cpath fill='%23c99a16' d='M11 2h1v1h-1zM12 3h1v1h-1zM13 4h1v1h-1zM13 5h1v1h-1zM13 6h1v1h-1zM13 7h1v1h-1zM13 9h1v1h-1zM12 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM5 12h6v1h-6z'/%3E%3Cpath fill='%23ffe680' d='M5 3h2v1h-2zM4 4h2v1h-2zM4 5h1v1h-1zM8 5h1v1h-1zM7 6h3v1h-3zM8 7h1v1h-1z'/%3E%3Cpath fill='%233e6eb8' d='M7 3h4v1h-4zM6 4h6v1h-6zM5 5h3v1h-3zM9 5h4v1h-4zM4 6h3v1h-3zM10 6h3v1h-3zM4 7h4v1h-4zM9 7h4v1h-4z'/%3E%3Cpath fill='%231b2e5a' d='M4 8h10v1h-10zM4 9h2v1h-2zM7 9h3v1h-3zM11 9h2v1h-2zM4 10h5v1h-5zM10 10h2v1h-2zM5 11h2v1h-2zM8 11h3v1h-3z'/%3E%3Cpath fill='%230f1b26' d='M6 9h1v1h-1zM10 9h1v1h-1zM9 10h1v1h-1zM7 11h1v1h-1z'/%3E%3C/svg%3E");--kit-icon-monitor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%2326313a' d='M0 1h16v1h-16zM0 2h1v1h-1zM15 2h1v1h-1zM0 3h1v1h-1zM15 3h1v1h-1zM0 4h1v1h-1zM15 4h1v1h-1zM0 5h1v1h-1zM15 5h1v1h-1zM0 6h1v1h-1zM15 6h1v1h-1zM0 7h1v1h-1zM15 7h1v1h-1zM0 8h1v1h-1zM15 8h1v1h-1zM0 9h1v1h-1zM15 9h1v1h-1zM0 10h1v1h-1zM15 10h1v1h-1zM0 11h16v1h-16z'/%3E%3Cpath fill='%23bfe3f0' d='M1 2h13v1h-13zM1 3h3v1h-3zM5 3h8v1h-8zM1 4h1v1h-1zM5 4h7v1h-7zM1 5h2v1h-2zM6 5h5v1h-5zM1 6h2v1h-2zM4 6h6v1h-6zM1 7h8v1h-8zM1 8h7v1h-7zM1 9h6v1h-6zM1 10h5v1h-5z'/%3E%3Cpath fill='%232b3a66' d='M14 2h1v1h-1zM13 3h2v1h-2zM12 4h3v1h-3zM11 5h4v1h-4zM10 6h2v1h-2zM13 6h2v1h-2zM9 7h2v1h-2zM13 7h2v1h-2zM8 8h4v1h-4zM13 8h2v1h-2zM7 9h4v1h-4zM12 9h3v1h-3zM6 10h9v1h-9z'/%3E%3Cpath fill='%23f2a52e' d='M4 3h1v1h-1zM2 4h1v1h-1zM5 5h1v1h-1zM3 6h1v1h-1z'/%3E%3Cpath fill='%23ffd84a' d='M3 4h2v1h-2zM3 5h2v1h-2z'/%3E%3Cpath fill='%23e6ecff' d='M12 6h1v1h-1zM11 7h2v1h-2zM12 8h1v1h-1zM11 9h1v1h-1z'/%3E%3Cpath fill='%238b8b8b' d='M6 12h4v1h-4z'/%3E%3Cpath fill='%235b6770' d='M4 13h8v1h-8z'/%3E%3C/svg%3E");--kit-icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 2h5v1h-5zM4 3h2v1h-2zM9 3h2v1h-2zM3 4h2v1h-2zM10 4h2v1h-2zM3 5h1v1h-1zM11 5h1v1h-1zM3 6h1v1h-1zM11 6h1v1h-1zM3 7h1v1h-1zM11 7h1v1h-1zM3 8h2v1h-2zM10 8h2v1h-2zM4 9h2v1h-2zM9 9h3v1h-3zM5 10h8v1h-8zM10 11h4v1h-4zM11 12h4v1h-4zM12 13h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-apps:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 2h4v1h-4zM10 2h4v1h-4zM2 3h4v1h-4zM10 3h4v1h-4zM2 4h4v1h-4zM10 4h4v1h-4zM2 5h4v1h-4zM10 5h4v1h-4zM2 10h4v1h-4zM10 10h4v1h-4zM2 11h4v1h-4zM10 11h4v1h-4zM2 12h4v1h-4zM10 12h4v1h-4zM2 13h4v1h-4zM10 13h4v1h-4z'/%3E%3C/svg%3E");--kit-icon-menu:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 3h12v1h-12zM2 4h12v1h-12zM2 7h12v1h-12zM2 8h12v1h-12zM2 11h12v1h-12zM2 12h12v1h-12z'/%3E%3C/svg%3E");--kit-icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 2h2v1h-2zM12 2h2v1h-2zM2 3h3v1h-3zM11 3h3v1h-3zM3 4h3v1h-3zM10 4h3v1h-3zM4 5h3v1h-3zM9 5h3v1h-3zM5 6h6v1h-6zM6 7h4v1h-4zM6 8h4v1h-4zM5 9h6v1h-6zM4 10h3v1h-3zM9 10h3v1h-3zM3 11h3v1h-3zM10 11h3v1h-3zM2 12h3v1h-3zM11 12h3v1h-3zM2 13h2v1h-2zM12 13h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-chevron-down:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M3 5h2v1h-2zM11 5h2v1h-2zM3 6h3v1h-3zM10 6h3v1h-3zM4 7h3v1h-3zM9 7h3v1h-3zM5 8h6v1h-6zM6 9h4v1h-4zM7 10h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-chevron-right:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 3h2v1h-2zM5 4h3v1h-3zM6 5h3v1h-3zM7 6h3v1h-3zM8 7h3v1h-3zM8 8h3v1h-3zM7 9h3v1h-3zM6 10h3v1h-3zM5 11h3v1h-3zM5 12h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-arrow-left:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M6 3h2v1h-2zM5 4h3v1h-3zM4 5h3v1h-3zM3 6h3v1h-3zM2 7h12v1h-12zM2 8h12v1h-12zM3 9h3v1h-3zM4 10h3v1h-3zM5 11h3v1h-3zM6 12h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-arrow-right:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M8 3h2v1h-2zM8 4h3v1h-3zM9 5h3v1h-3zM10 6h3v1h-3zM2 7h12v1h-12zM2 8h12v1h-12zM10 9h3v1h-3zM9 10h3v1h-3zM8 11h3v1h-3zM8 12h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-arrow-up:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M7 2h2v1h-2zM6 3h4v1h-4zM5 4h6v1h-6zM4 5h3v1h-3zM9 5h3v1h-3zM3 6h3v1h-3zM7 6h2v1h-2zM10 6h3v1h-3zM2 7h2v1h-2zM7 7h2v1h-2zM12 7h2v1h-2zM7 8h2v1h-2zM7 9h2v1h-2zM7 10h2v1h-2zM7 11h2v1h-2zM7 12h2v1h-2zM7 13h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-external:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M9 2h5v1h-5zM11 3h3v1h-3zM10 4h4v1h-4zM2 5h5v1h-5zM9 5h3v1h-3zM13 5h1v1h-1zM2 6h1v1h-1zM8 6h3v1h-3zM2 7h1v1h-1zM7 7h3v1h-3zM2 8h1v1h-1zM6 8h3v1h-3zM2 9h1v1h-1zM7 9h1v1h-1zM12 9h1v1h-1zM2 10h1v1h-1zM12 10h1v1h-1zM2 11h1v1h-1zM12 11h1v1h-1zM2 12h11v1h-11z'/%3E%3C/svg%3E");--kit-icon-copy:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 2h9v1h-9zM5 3h1v1h-1zM13 3h1v1h-1zM2 4h9v1h-9zM13 4h1v1h-1zM2 5h1v1h-1zM10 5h1v1h-1zM13 5h1v1h-1zM2 6h1v1h-1zM4 6h5v1h-5zM10 6h1v1h-1zM13 6h1v1h-1zM2 7h1v1h-1zM10 7h1v1h-1zM13 7h1v1h-1zM2 8h1v1h-1zM4 8h4v1h-4zM10 8h1v1h-1zM13 8h1v1h-1zM2 9h1v1h-1zM10 9h4v1h-4zM2 10h1v1h-1zM4 10h5v1h-5zM10 10h1v1h-1zM2 11h1v1h-1zM10 11h1v1h-1zM2 12h9v1h-9z'/%3E%3C/svg%3E");--kit-icon-check:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M12 3h2v1h-2zM11 4h3v1h-3zM10 5h3v1h-3zM9 6h3v1h-3zM2 7h2v1h-2zM8 7h3v1h-3zM2 8h3v1h-3zM7 8h3v1h-3zM3 9h6v1h-6zM4 10h4v1h-4zM5 11h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-hash:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 2h2v1h-2zM10 2h2v1h-2zM5 3h2v1h-2zM10 3h2v1h-2zM2 4h12v1h-12zM2 5h12v1h-12zM4 6h2v1h-2zM9 6h2v1h-2zM4 7h2v1h-2zM9 7h2v1h-2zM4 8h2v1h-2zM9 8h2v1h-2zM1 9h12v1h-12zM1 10h12v1h-12zM3 11h2v1h-2zM8 11h2v1h-2zM3 12h2v1h-2zM8 12h2v1h-2z'/%3E%3C/svg%3E");--kit-icon-globe:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 1h6v1h-6zM3 2h2v1h-2zM7 2h2v1h-2zM11 2h2v1h-2zM2 3h1v1h-1zM6 3h1v1h-1zM9 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM5 4h1v1h-1zM10 4h1v1h-1zM13 4h1v1h-1zM1 5h14v1h-14zM1 6h1v1h-1zM5 6h1v1h-1zM10 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM5 7h1v1h-1zM10 7h1v1h-1zM14 7h1v1h-1zM1 8h1v1h-1zM5 8h1v1h-1zM10 8h1v1h-1zM14 8h1v1h-1zM1 9h14v1h-14zM2 10h1v1h-1zM5 10h1v1h-1zM10 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM6 11h1v1h-1zM9 11h1v1h-1zM13 11h1v1h-1zM3 12h2v1h-2zM7 12h2v1h-2zM11 12h2v1h-2zM5 13h6v1h-6z'/%3E%3C/svg%3E");--kit-icon-edit:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M11 1h2v1h-2zM10 2h4v1h-4zM9 3h1v1h-1zM11 3h3v1h-3zM8 4h1v1h-1zM12 4h1v1h-1zM7 5h1v1h-1zM11 5h1v1h-1zM6 6h1v1h-1zM10 6h1v1h-1zM5 7h1v1h-1zM9 7h1v1h-1zM4 8h1v1h-1zM8 8h1v1h-1zM3 9h1v1h-1zM7 9h1v1h-1zM3 10h2v1h-2zM6 10h1v1h-1zM3 11h3v1h-3zM2 12h12v1h-12z'/%3E%3C/svg%3E");--kit-icon-history:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 1h6v1h-6zM3 2h2v1h-2zM11 2h2v1h-2zM2 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM7 4h1v1h-1zM13 4h1v1h-1zM1 5h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1zM1 6h1v1h-1zM7 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM7 7h4v1h-4zM14 7h1v1h-1zM1 8h1v1h-1zM14 8h1v1h-1zM1 9h1v1h-1zM14 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM3 12h2v1h-2zM11 12h2v1h-2zM5 13h6v1h-6z'/%3E%3C/svg%3E");--kit-icon-heart:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%233a0a0a' d='M2 2h3v1h-3zM9 2h3v1h-3zM1 3h1v1h-1zM5 3h1v1h-1zM8 3h1v1h-1zM12 3h1v1h-1zM0 4h1v1h-1zM6 4h2v1h-2zM13 4h1v1h-1zM0 5h1v1h-1zM13 5h1v1h-1zM0 6h1v1h-1zM13 6h1v1h-1zM1 7h1v1h-1zM12 7h1v1h-1zM2 8h1v1h-1zM11 8h1v1h-1zM3 9h1v1h-1zM10 9h1v1h-1zM4 10h1v1h-1zM9 10h1v1h-1zM5 11h1v1h-1zM8 11h1v1h-1zM6 12h2v1h-2z'/%3E%3Cpath fill='%23d23b3b' d='M2 3h3v1h-3zM9 3h3v1h-3zM1 4h1v1h-1zM3 4h3v1h-3zM8 4h4v1h-4zM1 5h1v1h-1zM3 5h9v1h-9zM1 6h11v1h-11zM2 7h9v1h-9zM3 8h7v1h-7zM4 9h5v1h-5zM5 10h3v1h-3zM6 11h1v1h-1z'/%3E%3Cpath fill='%23ffb3b3' d='M2 4h1v1h-1zM2 5h1v1h-1z'/%3E%3Cpath fill='%239e1f1f' d='M12 4h1v1h-1zM12 5h1v1h-1zM12 6h1v1h-1zM11 7h1v1h-1zM10 8h1v1h-1zM9 9h1v1h-1zM8 10h1v1h-1zM7 11h1v1h-1z'/%3E%3C/svg%3E")}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}}@keyframes kit-glint{0%{opacity:.55}to{opacity:1}}@media (prefers-reduced-motion:reduce){.kit-backdrop-dabs,.kit-hero-art .kit-scene-glints,.kit-hero-art .kit-scene-sun{animation:none!important}}@keyframes kit-target-flash{0%{background:color-mix(in srgb, var(--color-accent-4) 45%, transparent)}to{background:0 0}}:root{--kit-icon-check-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='white' d='M12 3h2v2h-2v2h-2v2H8v2H6v2H4v-2H2V9h2v2h2V9h2V7h2V5h2z'/%3E%3C/svg%3E")}@keyframes kit-compass-spin{0%{transform:rotate(0)}40%{transform:rotate(250deg)}55%{transform:rotate(200deg)}to{transform:rotate(720deg)}}@keyframes kit-menu-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}@keyframes kit-float{0%{transform:translateY(0)}to{transform:translateY(-6px)}}@keyframes kit-drift{0%{transform:translate(0)scale(1)}50%{transform:translate(1.5%,-1%)scale(1.03)}to{transform:translate(-1%,1.2%)scale(1.01)}} diff --git a/kit/static/kit.js b/kit/static/kit.js new file mode 100644 index 00000000..9d075ec7 --- /dev/null +++ b/kit/static/kit.js @@ -0,0 +1,96 @@ +/* levimc-kit vanilla runtime for static pages (no React): theme toggle +
menus. + Include once, deferred: + The pre-paint theme script (theme-init.js) must run in before this. */ +(function () { + 'use strict'; + var KEY = 'levimc-theme'; + var root = document.documentElement; + var mq = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null; + var doxygen = root.classList.contains('dark-mode') || root.classList.contains('light-mode') || root.hasAttribute('data-kit-doxygen'); + + function read() { + try { + var v = localStorage.getItem(KEY); + return v === 'light' || v === 'dark' ? v : 'system'; + } catch (e) { + return 'system'; + } + } + function sysDark() { + return !!(mq && mq.matches); + } + function apply(pref, persist) { + var dark = pref === 'dark' || (pref === 'system' && sysDark()); + root.classList.add('kit-no-transition'); + root.classList.toggle('dark', dark); + if (doxygen) { + root.classList.toggle('dark-mode', dark); + root.classList.toggle('light-mode', !dark); + } + root.setAttribute('data-theme-pref', pref); + root.style.colorScheme = dark ? 'dark' : 'light'; + if (persist) { + try { + if (pref === 'system') localStorage.removeItem(KEY); + else localStorage.setItem(KEY, pref); + } catch (e) {} + } + requestAnimationFrame(function () { + requestAnimationFrame(function () { + root.classList.remove('kit-no-transition'); + }); + }); + var label = { light: 'Light', dark: 'Dark', system: 'System' }[pref]; + document.querySelectorAll('[data-kit-theme-toggle]').forEach(function (b) { + b.setAttribute('aria-label', 'Theme: ' + label + ' — Switch theme'); + b.setAttribute('title', 'Theme: ' + label + ' — Switch theme'); + }); + } + function next(pref) { + var sys = sysDark() ? 'dark' : 'light'; + if (pref === 'system') return sys === 'dark' ? 'light' : 'dark'; + if (pref === 'light') return sys === 'light' ? 'dark' : 'system'; + return sys === 'dark' ? 'light' : 'system'; + } + + document.addEventListener('click', function (e) { + var t = e.target && e.target.closest ? e.target.closest('[data-kit-theme-toggle]') : null; + if (t) { + e.preventDefault(); + apply(next(read()), true); + } + // close
when clicking outside or following a link inside + document.querySelectorAll('details.kit-menu[open]').forEach(function (d) { + var inside = d.contains(e.target); + var link = inside && e.target.closest && e.target.closest('a'); + if (!inside || link) d.open = false; + }); + }); + document.addEventListener('keydown', function (e) { + if (e.key !== 'Escape') return; + document.querySelectorAll('details.kit-menu[open]').forEach(function (d) { + d.open = false; + var s = d.querySelector('summary'); + if (s) s.focus(); + }); + }); + document.addEventListener( + 'toggle', + function (e) { + var d = e.target; + if (!d || !d.matches || !d.matches('details.kit-menu') || !d.open) return; + document.querySelectorAll('details.kit-menu[open]').forEach(function (o) { + if (o !== d) o.open = false; + }); + }, + true, + ); + if (mq && mq.addEventListener) + mq.addEventListener('change', function () { + if (read() === 'system') apply('system', false); + }); + window.addEventListener('storage', function (e) { + if (e.key === KEY) apply(read(), false); + }); + apply(read(), false); +})(); diff --git a/kit/static/pages/404.html b/kit/static/pages/404.html new file mode 100644 index 00000000..63e2010e --- /dev/null +++ b/kit/static/pages/404.html @@ -0,0 +1,38 @@ + + + + + + Page not found | LeviMC Docs + + + + + + + + + + + + + diff --git a/kit/static/pages/index.html b/kit/static/pages/index.html new file mode 100644 index 00000000..552fde29 --- /dev/null +++ b/kit/static/pages/index.html @@ -0,0 +1,38 @@ + + + + + + LeviMC Docs + + + + + + + + + + + + + + + diff --git a/kit/static/snippets.tsx b/kit/static/snippets.tsx new file mode 100644 index 00000000..b8cc1924 --- /dev/null +++ b/kit/static/snippets.tsx @@ -0,0 +1,14 @@ +// Rendered by build-static.mjs with react-dom/server into plain HTML snippets for non-React pages. +import { renderToStaticMarkup } from 'react-dom/server'; +import { GlobalBar } from '../components/GlobalBar'; +import { SiteFooter } from '../components/SiteFooter'; +import { ThemeToggle } from '../components/ThemeToggle'; +import type { DocsProjectId, SiteId } from '../components/projects'; + +export function globalBarHtml(opts: { locale?: string; current?: SiteId; currentDocs?: DocsProjectId | string } = {}): string { + return renderToStaticMarkup(} />); +} + +export function footerHtml(opts: { locale?: string; extra?: string } = {}): string { + return renderToStaticMarkup(); +} diff --git a/kit/static/static-entry.css b/kit/static/static-entry.css new file mode 100644 index 00000000..f1762f39 --- /dev/null +++ b/kit/static/static-entry.css @@ -0,0 +1,7 @@ +/* Source for static/kit.css: the full levimc-kit theme for pages that are not React apps + (Doxygen API reference, docs.levimc.org root redirect/404 pages). Built by build-static.mjs. */ +@import "tailwindcss"; +@import "../theme/index.css"; +@source "./globalbar.html"; +@source "./footer.html"; +@source "./pages"; diff --git a/kit/static/theme-init-doxygen.js b/kit/static/theme-init-doxygen.js new file mode 100644 index 00000000..04baff44 --- /dev/null +++ b/kit/static/theme-init-doxygen.js @@ -0,0 +1 @@ +(function(){try{var d=document.documentElement,p=null;try{p=localStorage.getItem("levimc-theme")}catch(e){}if(p!=="light"&&p!=="dark")p="system";var m=!!(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches);var k=p==="dark"||(p==="system"&&m);d.classList.toggle("dark",k);d.classList.toggle("dark-mode",k);d.classList.toggle("light-mode",!k);d.setAttribute("data-theme-pref",p);d.style.colorScheme=k?"dark":"light"}catch(e){}})(); diff --git a/kit/static/theme-init.js b/kit/static/theme-init.js new file mode 100644 index 00000000..b07c2745 --- /dev/null +++ b/kit/static/theme-init.js @@ -0,0 +1 @@ +(function(){try{var d=document.documentElement,p=null;try{p=localStorage.getItem("levimc-theme")}catch(e){}if(p!=="light"&&p!=="dark")p="system";var m=!!(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches);var k=p==="dark"||(p==="system"&&m);d.classList.toggle("dark",k);d.setAttribute("data-theme-pref",p);d.style.colorScheme=k?"dark":"light"}catch(e){}})(); diff --git a/kit/theme/admonitions.css b/kit/theme/admonitions.css new file mode 100644 index 00000000..b170b893 --- /dev/null +++ b/kit/theme/admonitions.css @@ -0,0 +1,196 @@ +/* + * levimc-kit — admonitions (MkDocs `!!!`/`???`, VitePress `:::`, GitHub `> [!NOTE]`) and content tabs. + * + *
(static) + *

Warning

…
+ *
(collapsible: ??? / ???+ / ::: details) + * Tip
…
+ * + * data-kind is the canonical style (aliases resolved by the engine): note abstract info tip success question + * warning failure danger bug example quote details. Icons are 16×16 pixel sprites from theme/generated.css. + */ + +@layer components { + .kit-adm { + --adm: var(--color-adm-note); + --adm-icon: var(--kit-icon-book-quill); + --adm-frame: color-mix(in srgb, var(--adm) 32%, var(--color-line)); + position: relative; + margin: 1.5rem var(--px); + padding: 0; + font-size: 0.9375rem; + line-height: 1.7; + background: color-mix(in srgb, var(--adm) 6.5%, var(--color-surface)); + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--adm-frame), + 0 var(--px) 0 0 var(--adm-frame), + calc(var(--px) * -1) 0 0 0 var(--adm-frame), + var(--px) 0 0 0 var(--adm-frame), + inset calc(var(--px) * 2) 0 0 0 var(--adm); + } + .dark .kit-adm { + background: color-mix(in srgb, var(--adm) 9%, var(--color-surface)); + --adm-frame: color-mix(in srgb, var(--adm) 30%, var(--color-line)); + } + + .kit-adm > .kit-adm-title, + .kit-adm-title { + display: flex; + align-items: center; + gap: 0.625rem; + margin: 0; + padding: 0.75rem 1rem 0.125rem 1.25rem; + font-size: 0.9375rem; + font-weight: 650; + line-height: 1.45; + color: var(--color-ink); + min-width: 0; + overflow-wrap: anywhere; + } + .kit-adm-title-text { + flex: 1 1 auto; + min-width: 0; + } + .kit-adm-title::before { + content: ""; + flex: none; + width: 16px; + height: 16px; + background: var(--adm-icon) center / 16px 16px no-repeat; + image-rendering: pixelated; + } + .kit-adm-body { + padding: 0.25rem 1.125rem 0.875rem 1.25rem; + } + .kit-adm-body > :first-child { + margin-top: 0.25rem; + } + .kit-adm-body > :last-child { + margin-bottom: 0; + } + .kit-adm:not(:has(> .kit-adm-title)) > .kit-adm-body { + padding-top: 0.875rem; + } + .kit-adm .kit-adm { + margin: 1rem var(--px); + } + .kit-adm .kit-code { + margin: 1rem var(--px); + } + + /* monochrome glyph kinds: tint the sprite with the kind colour */ + .kit-adm:is([data-kind="question"], [data-kind="quote"]) > .kit-adm-title::before { + background: var(--adm); + -webkit-mask: var(--adm-icon) center / 16px 16px no-repeat; + mask: var(--adm-icon) center / 16px 16px no-repeat; + } + + /* collapsible */ + details.kit-adm > summary { + cursor: pointer; + list-style: none; + user-select: none; + padding-bottom: 0.75rem; + } + details.kit-adm[open] > summary { + padding-bottom: 0.125rem; + } + details.kit-adm > summary::-webkit-details-marker { + display: none; + } + details.kit-adm > summary::after { + content: ""; + flex: none; + width: 16px; + height: 16px; + margin-left: auto; + background: var(--color-muted); + -webkit-mask: var(--kit-icon-chevron-right) center / 16px 16px no-repeat; + mask: var(--kit-icon-chevron-right) center / 16px 16px no-repeat; + transition: transform 0.18s var(--ease-pixel); + } + details.kit-adm[open] > summary::after { + transform: rotate(90deg); + } + details.kit-adm > summary:hover::after { + background: var(--color-ink); + } + details.kit-adm > summary:focus-visible { + outline: var(--px) solid var(--color-focus); + outline-offset: calc(var(--px) * -1); + } + + /* kinds */ + .kit-adm[data-kind="abstract"] { + --adm: var(--color-adm-abstract); + --adm-icon: var(--kit-icon-paper); + } + .kit-adm[data-kind="info"] { + --adm: var(--color-adm-info); + --adm-icon: var(--kit-icon-compass); + } + .kit-adm[data-kind="tip"] { + --adm: var(--color-adm-tip); + --adm-icon: var(--kit-icon-emerald); + } + .kit-adm[data-kind="success"] { + --adm: var(--color-adm-success); + --adm-icon: var(--kit-icon-diamond); + } + .kit-adm[data-kind="question"] { + --adm: var(--color-adm-question); + --adm-icon: var(--kit-icon-question); + } + .kit-adm[data-kind="warning"] { + --adm: var(--color-adm-warning); + --adm-icon: var(--kit-icon-torch); + } + .kit-adm[data-kind="failure"] { + --adm: var(--color-adm-failure); + --adm-icon: var(--kit-icon-tnt); + } + .kit-adm[data-kind="danger"] { + --adm: var(--color-adm-danger); + --adm-icon: var(--kit-icon-tnt); + } + .kit-adm[data-kind="bug"] { + --adm: var(--color-adm-bug); + --adm-icon: var(--kit-icon-bug); + } + .kit-adm[data-kind="example"] { + --adm: var(--color-adm-example); + --adm-icon: var(--kit-icon-potion); + } + .kit-adm[data-kind="quote"] { + --adm: var(--color-adm-quote); + --adm-icon: var(--kit-icon-quote); + } + .kit-adm[data-kind="details"] { + --adm: var(--color-line-strong); + --adm-icon: var(--kit-icon-chest); + } + .dark .kit-adm[data-kind="details"] { + --adm: #4a6580; + } + + /* ---------------------------------------------------------------- content tabs (pymdownx.tabbed) */ + .kit-tabs { + margin: 1.5rem 0; + } + .kit-tabs-bar { + margin-bottom: 0.875rem; + } + .kit-tab-panel > :first-child { + margin-top: 0; + } + .kit-tab-panel > :last-child { + margin-bottom: 0; + } + .kit-tab-panel > .kit-code:first-child { + margin-top: var(--px); + } + .kit-tab-panel:focus-visible { + outline: var(--px) dashed var(--color-focus); + outline-offset: 4px; + } +} diff --git a/kit/theme/base.css b/kit/theme/base.css new file mode 100644 index 00000000..0784998f --- /dev/null +++ b/kit/theme/base.css @@ -0,0 +1,147 @@ +/* levimc-kit — base layer: document defaults shared by every LeviMC site. */ + +@layer base { + html { + color-scheme: light; + background-color: var(--color-canvas); + color: var(--color-ink); + font-family: var(--font-sans); + font-feature-settings: "cv11", "ss01", "ss03"; /* Inter: single-storey a, open digits */ + -webkit-text-size-adjust: 100%; + text-size-adjust: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + scroll-padding-top: calc(var(--spacing-header) + 1rem); + tab-size: 4; + } + html.dark { + color-scheme: dark; + } + body { + min-height: 100dvh; + background-color: var(--color-canvas); + color: var(--color-ink); + line-height: 1.6; + overflow-x: clip; + } + /* Theme switches should not animate every property on the page. The toggle adds this class for 1 frame. */ + .kit-no-transition, + .kit-no-transition * { + transition: none !important; + } + + ::selection { + background: color-mix(in srgb, var(--color-primary) 28%, transparent); + color: inherit; + } + + a { + color: inherit; + text-decoration: none; + } + + img, + svg, + video { + max-width: 100%; + } + + :focus { + outline: none; + } + /* Pixel focus outline: a hard 2px ring in the enchant colour (diamond in dark). */ + :focus-visible { + outline: var(--px) solid var(--color-focus); + outline-offset: var(--px); + } + + [hidden] { + display: none !important; + } + + kbd, + code, + pre, + samp { + font-family: var(--font-mono); + font-feature-settings: "calt" 0, "liga" 0; + } + + hr { + border: 0; + border-top: 1px solid var(--color-line); + } + + /* Thin, flat scrollbars that pick up the palette. */ + * { + scrollbar-width: thin; + scrollbar-color: var(--color-line-strong) transparent; + } +} + +@layer components { + /* Accessible skip link — visible only when focused. */ + .kit-skip-link { + position: fixed; + left: 1rem; + top: 0.75rem; + z-index: 100; + transform: translateY(-200%); + padding: 0.5rem 0.875rem; + background: var(--color-surface); + color: var(--color-ink); + font-weight: 600; + font-size: 0.875rem; + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--color-focus), + 0 var(--px) 0 0 var(--color-focus), + calc(var(--px) * -1) 0 0 0 var(--color-focus), + var(--px) 0 0 0 var(--color-focus); + } + .kit-skip-link:focus, + .kit-skip-link:focus-visible { + transform: none; + outline: none; + } + + .kit-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + } + + /* Short Latin micro-labels only (badges, eyebrows, version tags). Never CJK, never body copy. */ + .kit-pixel-label { + font-family: var(--font-pixel); + font-weight: 400; + font-size: 0.6875rem; + line-height: 1; + letter-spacing: 0.04em; + text-transform: uppercase; + } + + .kit-display { + font-family: var(--font-display); + font-optical-sizing: auto; + font-variation-settings: "SOFT" 50, "WONK" 0; + letter-spacing: -0.015em; + } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.001ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.001ms !important; + scroll-behavior: auto !important; + } +} diff --git a/kit/theme/chrome.css b/kit/theme/chrome.css new file mode 100644 index 00000000..02372155 --- /dev/null +++ b/kit/theme/chrome.css @@ -0,0 +1,879 @@ +/* + * levimc-kit — shared chrome: GlobalBar, menus, theme toggle, footer, badges, tooltips, cards, hero layout. + * Plain classes (not utilities) so the same CSS styles the React components, the static snippets + * (static/globalbar.html, static/footer.html) and Doxygen pages. + */ + +@layer components { + /* ================================================================== app shell: footer sticks to the bottom */ + .kit-shell { + display: flex; + flex-direction: column; + min-height: 100vh; + min-height: 100dvh; + } + .kit-shell > main, + .kit-shell > .kit-main { + flex: 1 0 auto; + } + .kit-shell > .kit-footer { + flex: none; + } + + /* ================================================================== menus (
) */ + .kit-menu { + position: relative; + } + .kit-menu > summary { + list-style: none; + cursor: pointer; + } + .kit-menu > summary::-webkit-details-marker { + display: none; + } + .kit-menu-chevron { + width: 12px; + height: 12px; + flex: none; + opacity: 0.7; + transition: transform 0.18s var(--ease-pixel); + } + .kit-menu[open] > summary .kit-menu-chevron { + transform: rotate(180deg); + } + .kit-menu-trigger { + width: auto; + min-width: 2.25rem; + padding: 0 0.5rem; + gap: 0.375rem; + display: inline-flex; + font-size: 0.8125rem; + font-weight: 500; + } + .kit-menu-trigger-label { + white-space: nowrap; + } + .kit-menu-panel { + --px-border: var(--color-line-strong); + position: absolute; + top: calc(100% + 0.5rem); + right: 0; + z-index: 70; + min-width: 11rem; + max-height: min(70vh, 32rem); + overflow-y: auto; + padding: 0.375rem; + color: var(--color-ink); + background: var(--color-surface); + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--px-border), + 0 var(--px) 0 0 var(--px-border), + calc(var(--px) * -1) 0 0 0 var(--px-border), + var(--px) 0 0 0 var(--px-border), + var(--shadow-float); + animation: kit-menu-in 0.14s var(--ease-soft); + } + .kit-menu-item { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; + padding: 0.5rem 0.625rem; + font-size: 0.875rem; + color: var(--color-ink); + text-decoration: none; + white-space: nowrap; + } + .kit-menu-item:hover, + .kit-menu-item:focus-visible { + background: color-mix(in srgb, var(--color-ink) 7%, transparent); + outline: none; + } + .kit-menu-item.is-active { + font-weight: 600; + color: var(--color-primary-strong); + background: var(--color-primary-soft); + } + .dark .kit-menu-item.is-active { + color: var(--color-primary); + } + .kit-menu-check { + flex: none; + } + + /* ================================================================== theme toggle (+ its item tooltip) */ + .kit-theme-toggle .kit-theme-icon, + .kit-theme-tip .kit-theme-state { + display: none; + } + :root[data-theme-pref="light"] .kit-theme-toggle .kit-theme-icon-light, + :root[data-theme-pref="dark"] .kit-theme-toggle .kit-theme-icon-dark, + :root[data-theme-pref="system"] .kit-theme-toggle .kit-theme-icon-system, + :root:not([data-theme-pref]) .kit-theme-toggle .kit-theme-icon-system { + display: block; + } + :root[data-theme-pref="light"] .kit-theme-tip .kit-theme-state-light, + :root[data-theme-pref="dark"] .kit-theme-tip .kit-theme-state-dark, + :root[data-theme-pref="system"] .kit-theme-tip .kit-theme-state-system, + :root:not([data-theme-pref]) .kit-theme-tip .kit-theme-state-system { + display: inline; + } + .kit-theme-toggle-host { + vertical-align: middle; + } + + /* ================================================================== GlobalBar */ + .kit-gbar { + --gbar-bg: #16222c; + --gbar-ink: #e3eaef; + --gbar-muted: #b4c2cd; + position: relative; + z-index: 60; + height: var(--spacing-globalbar); + color: var(--gbar-ink); + background: + linear-gradient(90deg, rgb(79 138 91 / 0.16), transparent 22%, transparent 78%, rgb(62 110 142 / 0.18)), + var(--gbar-bg); + border-bottom: 1px solid rgb(0 0 0 / 0.25); + font-size: 0.8125rem; + line-height: 1; + } + .dark .kit-gbar { + --gbar-bg: #08111a; + background: + linear-gradient(90deg, rgb(63 127 140 / 0.14), transparent 25%, transparent 72%, rgb(240 138 75 / 0.1)), + var(--gbar-bg); + border-bottom-color: rgb(255 255 255 / 0.05); + } + .kit-gbar-inner { + display: flex; + align-items: center; + gap: 1.25rem; + height: 100%; + max-width: 90rem; + margin: 0 auto; + padding: 0 1rem; + } + @media (min-width: 640px) { + .kit-gbar-inner { + padding: 0 1.5rem; + } + } + .kit-gbar-brand { + display: inline-flex; + align-items: center; + gap: 0.5rem; + height: 100%; + color: #fff; + text-decoration: none; + } + .kit-gbar-brand-text { + font-family: var(--font-pixel); + font-size: 0.8125rem; + letter-spacing: 0.04em; + } + .kit-gbar-brand:hover .kit-gbar-brand-text { + color: #c9f0a8; + } + .kit-gbar-nav { + height: 100%; + } + .kit-gbar-nav > ul { + display: flex; + align-items: stretch; + gap: 0.125rem; + height: 100%; + margin: 0; + padding: 0; + list-style: none; + } + .kit-gbar-nav > ul > li { + position: relative; + display: flex; + } + .kit-gbar-link { + position: relative; + display: inline-flex; + align-items: center; + gap: 0.3rem; + height: var(--spacing-globalbar); + padding: 0 0.625rem; + color: var(--gbar-muted); + font-weight: 500; + text-decoration: none; + white-space: nowrap; + transition: color 0.12s; + } + .kit-gbar-link:hover, + .kit-menu[open] > .kit-gbar-link { + color: #fff; + } + .kit-gbar-link[aria-current="page"] { + color: #fff; + } + .kit-gbar-link[aria-current="page"]::after { + content: ""; + position: absolute; + left: 0.625rem; + right: 0.625rem; + bottom: 0; + height: 3px; + background: var(--color-mc-grass); + box-shadow: 0 -1px 0 0 #8fd45e; + } + .kit-gbar-docs .kit-menu-panel { + left: -0.5rem; + right: auto; + width: min(34rem, calc(100vw - 2rem)); + padding: 0.5rem; + } + .kit-gbar-docs-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.25rem; + } + .kit-gbar-docs-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.5rem; + color: var(--color-ink); + text-decoration: none; + line-height: 1.3; + } + .kit-gbar-docs-item:hover, + .kit-gbar-docs-item:focus-visible { + background: color-mix(in srgb, var(--color-ink) 6%, transparent); + outline: none; + } + .kit-gbar-docs-item[aria-current="page"] { + background: var(--color-primary-soft); + } + .kit-gbar-docs-slot { + width: 2.25rem; + height: 2.25rem; + flex: none; + } + .kit-gbar-docs-text { + display: flex; + flex-direction: column; + gap: 0.2rem; + min-width: 0; + overflow-wrap: anywhere; + } + .kit-gbar-docs-name { + font-size: 0.875rem; + font-weight: 650; + } + .kit-gbar-docs-blurb { + font-size: 0.75rem; + color: var(--color-muted); + } + .kit-gbar-end { + display: flex; + align-items: center; + gap: 0.25rem; + margin-left: auto; + } + .kit-gbar-icon { + display: inline-grid; + place-items: center; + width: 2rem; + height: 2rem; + color: var(--gbar-muted); + text-decoration: none; + transition: color 0.12s, background-color 0.12s; + } + .kit-gbar-icon:hover, + .kit-menu[open] > .kit-gbar-icon { + color: #fff; + background: rgb(255 255 255 / 0.08); + } + .kit-gbar .mc-icon-btn { + color: var(--gbar-muted); + width: 2rem; + height: 2rem; + } + .kit-gbar .mc-icon-btn:hover { + color: #fff; + background: rgb(255 255 255 / 0.08); + --px-border: rgb(255 255 255 / 0.16); + } + .kit-gbar-more { + display: none; + } + .kit-gbar-more-panel { + width: min(22rem, calc(100vw - 1.5rem)); + padding: 0.5rem; + } + .kit-gbar-more-panel .kit-gbar-docs-grid { + grid-template-columns: 1fr; + } + .kit-gbar-more-link { + display: block; + padding: 0.625rem 0.75rem; + font-size: 0.9375rem; + font-weight: 500; + color: var(--color-ink); + text-decoration: none; + } + .kit-gbar-more-link:hover { + background: color-mix(in srgb, var(--color-ink) 6%, transparent); + } + .kit-gbar-more-link[aria-current="page"] { + color: var(--color-primary-strong); + font-weight: 650; + } + .kit-gbar-more-heading { + margin: 0.5rem 0.75rem 0.25rem; + padding-top: 0.625rem; + border-top: 1px solid var(--color-line); + font-size: 0.75rem; + font-weight: 650; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--color-muted); + } + @media (max-width: 860px) { + .kit-gbar-nav { + display: none; + } + .kit-gbar-more { + display: block; + } + } + + /* ================================================================== footer (grass horizon over soil) */ + .kit-footer { + position: relative; + z-index: 1; + margin-top: 5rem; + color: #eadfcb; + } + .kit-footer .grass-divider { + position: relative; + z-index: 1; + } + .kit-footer-soil { + background: + linear-gradient(to bottom, rgb(0 0 0 / 0.18), transparent 3rem), + var(--kit-dirt) 0 0 / 32px 32px; + image-rendering: pixelated; + } + .dark .kit-footer-soil { + background: + linear-gradient(to bottom, rgb(0 0 0 / 0.25), transparent 3rem), + var(--kit-dirt-dark) 0 0 / 32px 32px; + } + .kit-footer-soil > * { + image-rendering: auto; + } + .kit-footer-inner { + display: grid; + grid-template-columns: minmax(0, 2fr) repeat(3, minmax(0, 1fr)); + gap: 2.5rem; + max-width: 80rem; + margin: 0 auto; + padding: 3rem 1.5rem 2.5rem; + } + @media (max-width: 860px) { + .kit-footer-inner { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 2rem; + } + .kit-footer-brand { + grid-column: 1 / -1; + } + } + @media (max-width: 480px) { + .kit-footer-inner { + padding: 2.5rem 1rem 2rem; + } + } + .kit-footer-logo { + display: inline-flex; + align-items: center; + gap: 0.75rem; + color: #fff; + text-decoration: none; + font-family: var(--font-pixel); + font-size: 1.125rem; + letter-spacing: 0.04em; + } + .kit-footer-tagline { + max-width: 26rem; + margin: 1rem 0 1.25rem; + font-size: 0.875rem; + line-height: 1.6; + color: #d8c9b0; + } + .kit-footer-social { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin: 0; + padding: 0; + list-style: none; + } + .kit-footer-social-link { + --px-border: rgb(234 223 203 / 0.22); + display: inline-grid; + place-items: center; + width: 2.25rem; + height: 2.25rem; + margin: var(--px); + color: #eadfcb; + background: rgb(0 0 0 / 0.18); + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--px-border), + 0 var(--px) 0 0 var(--px-border), + calc(var(--px) * -1) 0 0 0 var(--px-border), + var(--px) 0 0 0 var(--px-border); + transition: background-color 0.12s, color 0.12s; + } + .kit-footer-social-link:hover { + color: #fff; + background: rgb(93 161 48 / 0.35); + --px-border: #8fd45e; + } + .kit-footer-social-link:focus-visible { + outline: var(--px) solid var(--color-mc-diamond); + outline-offset: 3px; + } + .kit-footer-heading { + margin: 0.25rem 0 0.875rem; + font-size: 0.75rem; + font-weight: 650; + letter-spacing: 0.08em; + text-transform: uppercase; + color: #c9f0a8; + } + .kit-footer-col ul { + margin: 0; + padding: 0; + list-style: none; + } + .kit-footer-col li { + margin: 0.5rem 0; + } + .kit-footer-col a { + overflow-wrap: anywhere; + font-size: 0.875rem; + color: #e0d3bc; + text-decoration: none; + } + .kit-footer-col a:hover { + color: #fff; + text-decoration: underline; + text-underline-offset: 0.2em; + } + .kit-footer a:focus-visible { + outline: var(--px) solid var(--color-mc-diamond); + outline-offset: 2px; + } + .kit-footer-legal { + border-top: 1px solid rgb(234 223 203 / 0.1); + background: rgb(0 0 0 / 0.16); + } + .kit-footer-legal-inner { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 0.5rem 1.5rem; + padding-top: 1rem; + padding-bottom: 1rem; + font-size: 0.8125rem; + color: #cdbd9f; + } + .kit-footer-legal-inner p { + margin: 0; + } + .kit-footer-extra { + color: #cdbd9f; + } + .kit-footer-extra a { + color: #eadfcb; + } + .kit-footer-sep { + margin: 0 0.5rem; + opacity: 0.6; + } + + /* ================================================================== badges */ + .kit-badge { + --badge: var(--color-mc-stone); + --badge-ink: #4b5258; + display: inline-flex; + align-items: center; + gap: 0.3rem; + padding: 0.125rem 0.5rem; + margin: var(--px); + font-size: 0.75rem; + font-weight: 600; + line-height: 1.2rem; + white-space: nowrap; + vertical-align: middle; + color: var(--badge-ink); + background: color-mix(in srgb, var(--badge) 14%, var(--color-surface)); + box-shadow: + 0 calc(var(--px) * -1) 0 0 color-mix(in srgb, var(--badge) 45%, transparent), + 0 var(--px) 0 0 color-mix(in srgb, var(--badge) 45%, transparent), + calc(var(--px) * -1) 0 0 0 color-mix(in srgb, var(--badge) 45%, transparent), + var(--px) 0 0 0 color-mix(in srgb, var(--badge) 45%, transparent); + } + .kit-badge-pixel { + font-family: var(--font-pixel); + font-weight: 400; + font-size: 0.625rem; + letter-spacing: 0.04em; + text-transform: uppercase; + } + .kit-badge-grass { + --badge: var(--color-mc-grass); + --badge-ink: #2f6a14; + } + .kit-badge-diamond { + --badge: var(--color-mc-diamond); + --badge-ink: #10666b; + } + .kit-badge-gold { + --badge: var(--color-mc-gold); + --badge-ink: #7a5a00; + } + .kit-badge-redstone { + --badge: var(--color-mc-redstone); + --badge-ink: #a32121; + } + .kit-badge-enchant { + --badge: var(--color-mc-enchant); + --badge-ink: #5b32c0; + } + .kit-badge-pond { + --badge: var(--color-pond); + --badge-ink: #2f5a76; + } + .dark .kit-badge { + --badge-ink: #c3ccd3; + background: color-mix(in srgb, var(--badge) 16%, var(--color-surface)); + } + .dark .kit-badge-grass { + --badge-ink: #9fdc72; + } + .dark .kit-badge-diamond { + --badge-ink: #7eeaef; + } + .dark .kit-badge-gold { + --badge-ink: #f5cf5a; + } + .dark .kit-badge-redstone { + --badge-ink: #f59a92; + } + .dark .kit-badge-enchant { + --badge-ink: #c4a9ff; + } + .dark .kit-badge-pond { + --badge-ink: #8fc0e6; + } + + /* ================================================================== tooltip host */ + .kit-tooltip-host { + position: relative; + display: inline-flex; + } + .kit-tooltip { + position: absolute; + left: 50%; + bottom: calc(100% + 0.625rem); + z-index: 80; + width: max-content; + max-width: min(22rem, 80vw); + white-space: normal; + opacity: 0; + visibility: hidden; + pointer-events: none; + transform: translate(-50%, 4px); + transition: + opacity 0.12s steps(3, end), + transform 0.12s steps(3, end), + visibility 0s 0.12s; + } + .kit-tooltip-host[data-placement="bottom"] > .kit-tooltip { + bottom: auto; + top: calc(100% + 0.625rem); + transform: translate(-50%, -4px); + } + .kit-tooltip-host[data-align="end"] > .kit-tooltip { + left: auto; + right: 0; + transform: translateY(4px); + } + .kit-tooltip-host[data-align="end"][data-placement="bottom"] > .kit-tooltip { + transform: translateY(-4px); + } + .kit-tooltip-host[data-align="end"]:hover > .kit-tooltip, + .kit-tooltip-host[data-align="end"]:focus-within > .kit-tooltip { + transform: none; + } + .kit-tooltip-host:hover > .kit-tooltip, + .kit-tooltip-host:focus-within > .kit-tooltip { + opacity: 1; + visibility: visible; + transform: translate(-50%, 0); + transition: + opacity 0.12s steps(3, end), + transform 0.12s steps(3, end); + } + + /* ================================================================== cards */ + .kit-card { + display: flex; + align-items: flex-start; + gap: 1rem; + min-width: 0; + max-width: calc(100% - var(--px) * 2); + padding: 1.25rem; + color: var(--color-ink); + text-decoration: none; + } + .kit-card-icon { + width: 3.25rem; + height: 3.25rem; + flex: none; + } + .kit-card-icon img { + width: 2rem; + height: 2rem; + object-fit: contain; + } + .kit-card-body { + display: flex; + flex-direction: column; + gap: 0.375rem; + flex: 1 1 auto; + min-width: 0; + overflow-wrap: anywhere; + } + .kit-card-eyebrow { + color: var(--color-primary-strong); + } + .dark .kit-card-eyebrow { + color: var(--color-primary); + } + .kit-card-title { + font-size: 1.0625rem; + font-weight: 650; + line-height: 1.35; + } + .kit-card-desc { + overflow-wrap: anywhere; + font-size: 0.9375rem; + line-height: 1.6; + color: var(--color-muted); + } + .kit-card-footer { + margin-top: auto; + } + + /* ================================================================== pagination */ + .kit-pagination { + display: flex; + justify-content: center; + margin: 2rem 0; + } + .kit-pagination .hotbar-slot.is-disabled { + opacity: 0.35; + cursor: default; + } + .kit-pagination .hotbar-slot.is-gap { + cursor: default; + min-width: 1.5rem; + } + + /* ================================================================== hero layout */ + .kit-hero-inner { + position: relative; + display: grid; + grid-template-columns: minmax(0, 1fr); + align-items: center; + gap: 2rem; + max-width: 80rem; + min-height: clamp(26rem, 58vh, 38rem); + margin: 0 auto; + padding: clamp(3.5rem, 7vw, 6.5rem) 1.5rem clamp(4.5rem, 8vw, 7.5rem); + } + .kit-hero-copy { + max-width: 40rem; + } + .kit-hero-eyebrow { + display: inline-flex; + align-items: center; + gap: 0.5rem; + margin: 0 0 1.25rem; + color: var(--color-primary-strong); + } + .dark .kit-hero-eyebrow { + color: var(--color-primary); + } + .kit-hero-title { + margin: 0; + font-family: var(--font-display); + font-optical-sizing: auto; + letter-spacing: -0.025em; + } + .kit-hero-name { + display: block; + width: fit-content; + font-size: clamp(2.75rem, 1.6rem + 4.6vw, 5rem); + font-weight: 600; + line-height: 1.02; + background: linear-gradient(115deg, #2f6a3e 0%, #3a7047 30%, #3e6e8e 68%, #6f58a3 100%); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + padding-bottom: 0.08em; + } + .dark .kit-hero-name { + background-image: linear-gradient(115deg, #8fd48f 0%, #6fbf73 30%, #6cc3cf 66%, #f5b26b 100%); + } + .kit-hero-text { + display: block; + margin-top: 0.4rem; + font-size: clamp(1.625rem, 1.1rem + 2vw, 2.75rem); + font-weight: 500; + line-height: 1.14; + color: var(--color-ink); + text-wrap: balance; + } + .kit-hero-tagline { + max-width: 36rem; + margin: 1.375rem 0 0; + font-size: 1.125rem; + line-height: 1.65; + color: var(--color-muted); + text-wrap: pretty; + } + .kit-hero-actions { + display: flex; + flex-wrap: wrap; + gap: 0.875rem; + margin-top: 2.25rem; + } + .kit-hero-badge { + display: flex; + align-items: center; + gap: 1rem; + margin-bottom: 1.5rem; + } + .kit-hero-badge .kit-hero-eyebrow { + margin: 0; + } + .kit-hero-icon { + padding: 0.5rem; + flex: none; + } + .kit-hero-icon img { + display: block; + width: 3.5rem; + height: 3.5rem; + object-fit: contain; + } + @media (max-width: 960px) { + .kit-hero-inner { + grid-template-columns: 1fr; + min-height: 0; + padding-top: calc(var(--kit-hero-band, clamp(15rem, 64vw, 24rem)) - 2.5rem); + padding-bottom: 4rem; + } + } +} + +@layer components { + /* ================================================================== static pages (kit/static/pages) */ + .kit-static-main { + flex: 1; + display: grid; + place-items: center; + padding: 4rem 1rem 2rem; + } + .kit-static-card { + width: min(46rem, 100%); + padding: 2.25rem 2rem 2rem; + text-align: center; + } + .kit-static-eyebrow { + margin: 0 0 0.75rem; + color: var(--color-primary-strong); + } + .dark .kit-static-eyebrow { + color: var(--color-primary); + } + .kit-static-title { + margin: 0; + font-family: var(--font-display); + font-size: clamp(1.75rem, 1.3rem + 1.6vw, 2.5rem); + font-weight: 560; + line-height: 1.15; + letter-spacing: -0.02em; + color: var(--color-ink); + } + .kit-static-title a { + color: var(--color-link); + } + .kit-static-text { + margin: 1rem auto 1.5rem; + max-width: 32rem; + color: var(--color-muted); + } + .kit-static-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(min(100%, 19rem), 1fr)); + gap: 0.75rem; + text-align: left; + } + .kit-static-actions { + margin: 1.75rem 0 0; + } + .kit-notfound-compass { + width: 6rem; + height: 6rem; + margin-bottom: 1.25rem; + } + .kit-notfound-spin { + animation: kit-compass-spin 2.4s steps(12, end) infinite; + } +} + +@keyframes kit-compass-spin { + 0% { + transform: rotate(0deg); + } + 40% { + transform: rotate(250deg); + } + 55% { + transform: rotate(200deg); + } + 100% { + transform: rotate(720deg); + } +} + +@keyframes kit-menu-in { + from { + opacity: 0; + transform: translateY(-4px); + } + to { + opacity: 1; + transform: none; + } +} +@keyframes kit-float { + from { + transform: translateY(0); + } + to { + transform: translateY(-6px); + } +} diff --git a/kit/theme/code.css b/kit/theme/code.css new file mode 100644 index 00000000..a2d2dd79 --- /dev/null +++ b/kit/theme/code.css @@ -0,0 +1,229 @@ +/* + * levimc-kit — code blocks. Markup produced by the docs engine (Shiki dual theme, class-based tokens): + * + *
+ *
C++ + *
+ *
……
+ *
+ * + * Line numbers are CSS counters (never copied, never part of the text). Token colours come from the + * generated Shiki stylesheet; both themes are present and `.dark` switches them. + */ + +@layer components { + .kit-code { + --kit-code-frame: color-mix(in srgb, var(--color-ink) 16%, var(--color-line)); + position: relative; + margin: 1.5rem var(--px); + background: var(--color-code-bg); + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--kit-code-frame), + 0 var(--px) 0 0 var(--kit-code-frame), + calc(var(--px) * -1) 0 0 0 var(--kit-code-frame), + var(--px) 0 0 0 var(--kit-code-frame), + 0 calc(var(--px) * 3) 0 0 color-mix(in srgb, var(--color-ink) 5%, transparent); + font-size: 0.8125rem; + } + .dark .kit-code { + --kit-code-frame: #04090e; + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--kit-code-frame), + 0 var(--px) 0 0 var(--kit-code-frame), + calc(var(--px) * -1) 0 0 0 var(--kit-code-frame), + var(--px) 0 0 0 var(--kit-code-frame), + 0 calc(var(--px) * 3) 0 0 rgb(0 0 0 / 0.3); + } + .kit-code-head { + display: flex; + align-items: center; + gap: 0.5rem; + min-height: 2.125rem; + padding: 0 0.25rem 0 0.875rem; + background: var(--color-code-head); + border-bottom: var(--px) solid color-mix(in srgb, var(--color-ink) 8%, transparent); + } + .dark .kit-code-head { + border-bottom-color: rgb(0 0 0 / 0.35); + } + .kit-code-title { + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-family: var(--font-pixel); + font-size: 0.6875rem; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--color-muted); + } + .kit-code-title.is-file { + font-family: var(--font-mono); + font-size: 0.75rem; + letter-spacing: 0; + text-transform: none; + color: var(--color-ink); + } + .kit-code-title::before { + content: ""; + display: inline-block; + width: 6px; + height: 6px; + margin-right: 0.5rem; + vertical-align: 0.1em; + background: var(--kit-code-dot, var(--color-primary)); + box-shadow: 2px 2px 0 0 color-mix(in srgb, var(--kit-code-dot, var(--color-primary)) 40%, transparent); + } + .kit-code[data-lang="cpp"], + .kit-code[data-lang="c"] { + --kit-code-dot: var(--color-accent-1); + } + .kit-code:is([data-lang="js"], [data-lang="javascript"], [data-lang="ts"], [data-lang="typescript"]) { + --kit-code-dot: var(--color-mc-gold); + } + .kit-code[data-lang="lua"] { + --kit-code-dot: var(--color-accent-2); + } + .kit-code:is([data-lang="shell"], [data-lang="sh"], [data-lang="bash"], [data-lang="powershell"], [data-lang="cmd"], [data-lang="batch"]) { + --kit-code-dot: var(--color-faint); + } + .kit-code:is([data-lang="json"], [data-lang="jsonc"], [data-lang="yaml"], [data-lang="toml"]) { + --kit-code-dot: var(--color-accent-3); + } + + .kit-code-copy { + position: relative; + display: inline-grid; + place-items: center; + width: 2rem; + height: 2rem; + color: var(--color-muted); + background: transparent; + cursor: pointer; + transition: + color 0.15s, + background-color 0.15s; + } + .kit-code-copy:hover { + color: var(--color-ink); + background: color-mix(in srgb, var(--color-ink) 8%, transparent); + } + .kit-code-copy:focus-visible { + outline: var(--px) solid var(--color-focus); + outline-offset: calc(var(--px) * -1); + } + .kit-code-copy .kit-icon-done { + display: none; + } + .kit-code-copy[data-copied] { + color: var(--color-primary-strong); + } + .dark .kit-code-copy[data-copied] { + color: var(--color-primary); + } + .kit-code-copy[data-copied] .kit-icon-copy { + display: none; + } + .kit-code-copy[data-copied] .kit-icon-done { + display: block; + } + .kit-code-copy[data-copied]::after { + content: attr(data-copied); + position: absolute; + right: calc(100% + 0.375rem); + top: 50%; + transform: translateY(-50%); + padding: 0.25rem 0.5rem; + font-family: var(--font-sans); + font-size: 0.75rem; + font-weight: 600; + line-height: 1.2; + white-space: nowrap; + color: #fff; + background: rgb(16 0 16 / 0.95); + box-shadow: + 0 -2px 0 0 rgb(16 0 16 / 0.95), + 0 2px 0 0 rgb(16 0 16 / 0.95), + -2px 0 0 0 rgb(16 0 16 / 0.95), + 2px 0 0 0 rgb(16 0 16 / 0.95), + inset 0 0 0 2px rgb(96 40 220 / 0.7); + pointer-events: none; + } + + .kit-code pre, + .kit-prose pre { + margin: 0; + padding: 0.875rem 0; + overflow-x: auto; + font-family: var(--font-mono); + font-size: 0.8125rem; + line-height: 1.7; + color: var(--color-code-ink); + background: transparent !important; + tab-size: 4; + } + .kit-prose pre:not(.shiki) { + padding: 0.875rem 1rem; + background: var(--color-code-bg) !important; + } + .kit-code pre:focus-visible { + outline: var(--px) solid var(--color-focus); + outline-offset: calc(var(--px) * -1); + } + .kit-code code { + display: block; + min-width: max-content; + font: inherit; + counter-reset: kit-line; + } + .kit-code .line { + display: inline-block; + min-width: 100%; + padding: 0 1.125rem 0 1rem; + } + /* Line numbers: rendered by CSS only. */ + .kit-code[data-linenos] .line { + padding-left: 0; + } + .kit-code[data-linenos] .line::before { + counter-increment: kit-line; + content: counter(kit-line); + display: inline-block; + box-sizing: content-box; + width: var(--kit-gutter, 2ch); + padding: 0 0.875rem 0 1rem; + margin-right: 0.875rem; + text-align: right; + color: var(--color-code-gutter); + border-right: 1px solid color-mix(in srgb, var(--color-ink) 8%, transparent); + user-select: none; + -webkit-user-select: none; + } + .dark .kit-code[data-linenos] .line::before { + border-right-color: rgb(255 255 255 / 0.06); + } + .kit-code .line.highlighted { + background: color-mix(in srgb, var(--color-accent-4) 18%, transparent); + box-shadow: inset 3px 0 0 0 var(--color-accent-4); + } + .dark .kit-code .line.highlighted { + background: rgb(240 138 75 / 0.12); + box-shadow: inset 3px 0 0 0 var(--color-sunrise); + } + + /* Shiki dual-theme token colours (class tokens are generated; these are the variable fallbacks). */ + .kit-shiki span { + color: var(--shiki-light); + font-style: var(--shiki-light-font-style, inherit); + font-weight: var(--shiki-light-font-weight, inherit); + } + .dark .kit-shiki span { + color: var(--shiki-dark); + font-style: var(--shiki-dark-font-style, inherit); + font-weight: var(--shiki-dark-font-weight, inherit); + } + .kit-shiki .line { + color: var(--color-code-ink); + } +} diff --git a/kit/theme/generated.css b/kit/theme/generated.css new file mode 100644 index 00000000..d4c633dc --- /dev/null +++ b/kit/theme/generated.css @@ -0,0 +1,52 @@ +/* Generated by assets/build-assets.mjs — do not edit by hand. Shared texture tokens. */ +:root { + /* 16×8 grass-over-dirt pixel strip (render at 2×: background-size 32px 16px; image-rendering: pixelated). */ + --kit-grass-strip: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 8' shape-rendering='crispEdges'%3E%3Cpath fill='%235da130' d='M0 0h1v1h-1zM2 0h3v1h-3zM7 0h3v1h-3zM11 0h5v1h-5zM0 1h3v1h-3zM4 1h4v1h-4zM9 1h4v1h-4zM14 1h2v1h-2zM1 2h3v1h-3zM5 2h5v1h-5zM12 2h2v1h-2zM15 2h1v1h-1zM3 3h1v1h-1zM7 3h2v1h-2zM12 3h1v1h-1zM15 3h1v1h-1zM12 4h1v1h-1z'/%3E%3Cpath fill='%2370b83f' d='M1 0h1v1h-1zM5 0h2v1h-2zM10 0h1v1h-1zM3 1h1v1h-1zM8 1h1v1h-1zM13 1h1v1h-1z'/%3E%3Cpath fill='%23478a22' d='M0 2h1v1h-1zM4 2h1v1h-1zM10 2h2v1h-2zM14 2h1v1h-1z'/%3E%3Cpath fill='%238a5a33' d='M0 3h3v1h-3zM4 3h3v1h-3zM9 3h3v1h-3zM13 3h2v1h-2zM0 4h5v1h-5zM6 4h1v1h-1zM8 4h1v1h-1zM10 4h2v1h-2zM13 4h3v1h-3zM0 5h2v1h-2zM3 5h8v1h-8zM12 5h3v1h-3zM0 6h1v1h-1zM2 6h3v1h-3zM6 6h2v1h-2zM9 6h4v1h-4zM14 6h2v1h-2zM1 7h2v1h-2zM4 7h6v1h-6zM11 7h3v1h-3zM15 7h1v1h-1z'/%3E%3Cpath fill='%23a0703f' d='M5 4h1v1h-1zM11 5h1v1h-1zM1 6h1v1h-1zM8 6h1v1h-1zM3 7h1v1h-1zM14 7h1v1h-1z'/%3E%3Cpath fill='%236b4426' d='M7 4h1v1h-1zM9 4h1v1h-1zM2 5h1v1h-1zM15 5h1v1h-1zM5 6h1v1h-1zM13 6h1v1h-1zM0 7h1v1h-1zM10 7h1v1h-1z'/%3E%3C/svg%3E"); + /* Impressionist brush-dab texture: ellipse dabs displaced by feTurbulence. Tile 256px, use at low opacity. */ + --kit-brush: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='256' height='256' viewBox='0 0 256 256'%3E%3Cfilter id='p' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.03 0.11' numOctaves='2' seed='4' stitchTiles='stitch' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='9' xChannelSelector='R' yChannelSelector='G' result='d'/%3E%3CfeGaussianBlur in='d' stdDeviation='0.6'/%3E%3C/filter%3E%3Cg filter='url(%23p)'%3E%3Cellipse cx='148.5' cy='207.3' rx='10.1' ry='1.7' transform='rotate(2.8 148.5 207.3)' fill='%23fff' opacity='0.26'/%3E%3Cellipse cx='-34.3' cy='99.2' rx='27.7' ry='5.2' transform='rotate(8.5 -34.3 99.2)' fill='%23000' opacity='0.42'/%3E%3Cellipse cx='221.7' cy='99.2' rx='27.7' ry='5.2' transform='rotate(8.5 221.7 99.2)' fill='%23000' opacity='0.42'/%3E%3Cellipse cx='186.4' cy='101.5' rx='21.3' ry='1.8' transform='rotate(0.8 186.4 101.5)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='229.0' cy='191.2' rx='10.7' ry='5.1' transform='rotate(4.5 229.0 191.2)' fill='%23000' opacity='0.32'/%3E%3Cellipse cx='41.8' cy='153.8' rx='9.2' ry='4.1' transform='rotate(7.6 41.8 153.8)' fill='%23fff' opacity='0.29'/%3E%3Cellipse cx='31.6' cy='-4.8' rx='25.8' ry='5.0' transform='rotate(7.9 31.6 -4.8)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='31.6' cy='251.2' rx='25.8' ry='5.0' transform='rotate(7.9 31.6 251.2)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='287.6' cy='-4.8' rx='25.8' ry='5.0' transform='rotate(7.9 287.6 -4.8)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='287.6' cy='251.2' rx='25.8' ry='5.0' transform='rotate(7.9 287.6 251.2)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='86.4' cy='-10.5' rx='9.8' ry='3.4' transform='rotate(2.1 86.4 -10.5)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='86.4' cy='245.5' rx='9.8' ry='3.4' transform='rotate(2.1 86.4 245.5)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='173.3' cy='121.6' rx='14.2' ry='5.0' transform='rotate(-3.2 173.3 121.6)' fill='%23fff' opacity='0.23'/%3E%3Cellipse cx='71.1' cy='120.2' rx='18.7' ry='3.4' transform='rotate(-7.7 71.1 120.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='138.1' cy='208.2' rx='30.2' ry='2.1' transform='rotate(-7.6 138.1 208.2)' fill='%23000' opacity='0.30'/%3E%3Cellipse cx='38.4' cy='101.9' rx='12.3' ry='2.7' transform='rotate(-4.8 38.4 101.9)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='53.8' cy='53.5' rx='24.6' ry='4.2' transform='rotate(8.8 53.8 53.5)' fill='%23fff' opacity='0.36'/%3E%3Cellipse cx='-6.3' cy='101.6' rx='13.2' ry='2.1' transform='rotate(-0.5 -6.3 101.6)' fill='%23fff' opacity='0.22'/%3E%3Cellipse cx='249.7' cy='101.6' rx='13.2' ry='2.1' transform='rotate(-0.5 249.7 101.6)' fill='%23fff' opacity='0.22'/%3E%3Cellipse cx='112.6' cy='65.9' rx='11.5' ry='4.0' transform='rotate(-2.3 112.6 65.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='9.7' cy='112.1' rx='18.7' ry='2.8' transform='rotate(-6.3 9.7 112.1)' fill='%23fff' opacity='0.39'/%3E%3Cellipse cx='265.7' cy='112.1' rx='18.7' ry='2.8' transform='rotate(-6.3 265.7 112.1)' fill='%23fff' opacity='0.39'/%3E%3Cellipse cx='74.8' cy='136.0' rx='24.3' ry='2.9' transform='rotate(7.2 74.8 136.0)' fill='%23fff' opacity='0.39'/%3E%3Cellipse cx='-2.9' cy='-9.1' rx='18.9' ry='4.2' transform='rotate(-8.1 -2.9 -9.1)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='-2.9' cy='246.9' rx='18.9' ry='4.2' transform='rotate(-8.1 -2.9 246.9)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='253.1' cy='-9.1' rx='18.9' ry='4.2' transform='rotate(-8.1 253.1 -9.1)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='253.1' cy='246.9' rx='18.9' ry='4.2' transform='rotate(-8.1 253.1 246.9)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='2.2' cy='32.2' rx='10.4' ry='3.3' transform='rotate(-8.5 2.2 32.2)' fill='%23fff' opacity='0.19'/%3E%3Cellipse cx='258.2' cy='32.2' rx='10.4' ry='3.3' transform='rotate(-8.5 258.2 32.2)' fill='%23fff' opacity='0.19'/%3E%3Cellipse cx='133.7' cy='-15.7' rx='19.8' ry='3.7' transform='rotate(-3.2 133.7 -15.7)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='133.7' cy='240.3' rx='19.8' ry='3.7' transform='rotate(-3.2 133.7 240.3)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='197.1' cy='-4.3' rx='18.0' ry='3.6' transform='rotate(-7.6 197.1 -4.3)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='197.1' cy='251.7' rx='18.0' ry='3.6' transform='rotate(-7.6 197.1 251.7)' fill='%23fff' opacity='0.44'/%3E%3Cellipse cx='92.7' cy='-9.1' rx='29.8' ry='1.8' transform='rotate(-4.4 92.7 -9.1)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='92.7' cy='246.9' rx='29.8' ry='1.8' transform='rotate(-4.4 92.7 246.9)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='111.3' cy='-13.8' rx='28.3' ry='3.1' transform='rotate(-7.3 111.3 -13.8)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='111.3' cy='242.2' rx='28.3' ry='3.1' transform='rotate(-7.3 111.3 242.2)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='143.5' cy='210.3' rx='12.6' ry='2.0' transform='rotate(0.1 143.5 210.3)' fill='%23000' opacity='0.45'/%3E%3Cellipse cx='83.9' cy='211.5' rx='12.8' ry='3.8' transform='rotate(4.6 83.9 211.5)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='170.0' cy='203.3' rx='27.8' ry='4.7' transform='rotate(-6.4 170.0 203.3)' fill='%23fff' opacity='0.38'/%3E%3Cellipse cx='34.1' cy='190.8' rx='10.3' ry='2.8' transform='rotate(6.4 34.1 190.8)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='196.5' cy='34.7' rx='28.4' ry='4.5' transform='rotate(-7.4 196.5 34.7)' fill='%23fff' opacity='0.31'/%3E%3Cellipse cx='196.5' cy='290.7' rx='28.4' ry='4.5' transform='rotate(-7.4 196.5 290.7)' fill='%23fff' opacity='0.31'/%3E%3Cellipse cx='-1.8' cy='196.0' rx='30.3' ry='4.6' transform='rotate(1.3 -1.8 196.0)' fill='%23000' opacity='0.35'/%3E%3Cellipse cx='254.2' cy='196.0' rx='30.3' ry='4.6' transform='rotate(1.3 254.2 196.0)' fill='%23000' opacity='0.35'/%3E%3Cellipse cx='60.2' cy='156.4' rx='10.4' ry='3.6' transform='rotate(2.6 60.2 156.4)' fill='%23fff' opacity='0.16'/%3E%3Cellipse cx='142.2' cy='3.2' rx='15.4' ry='2.7' transform='rotate(6.7 142.2 3.2)' fill='%23000' opacity='0.48'/%3E%3Cellipse cx='142.2' cy='259.2' rx='15.4' ry='2.7' transform='rotate(6.7 142.2 259.2)' fill='%23000' opacity='0.48'/%3E%3Cellipse cx='57.1' cy='45.7' rx='19.6' ry='3.1' transform='rotate(5.0 57.1 45.7)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='110.4' cy='104.1' rx='23.8' ry='4.3' transform='rotate(4.1 110.4 104.1)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='124.7' cy='201.0' rx='28.7' ry='2.6' transform='rotate(0.9 124.7 201.0)' fill='%23fff' opacity='0.16'/%3E%3Cellipse cx='113.5' cy='210.7' rx='30.1' ry='4.2' transform='rotate(3.5 113.5 210.7)' fill='%23000' opacity='0.37'/%3E%3Cellipse cx='38.6' cy='136.0' rx='17.7' ry='2.9' transform='rotate(-0.0 38.6 136.0)' fill='%23fff' opacity='0.20'/%3E%3Cellipse cx='160.8' cy='25.4' rx='30.8' ry='4.6' transform='rotate(0.3 160.8 25.4)' fill='%23000' opacity='0.19'/%3E%3Cellipse cx='160.8' cy='281.4' rx='30.8' ry='4.6' transform='rotate(0.3 160.8 281.4)' fill='%23000' opacity='0.19'/%3E%3Cellipse cx='-10.8' cy='125.3' rx='26.4' ry='1.8' transform='rotate(6.1 -10.8 125.3)' fill='%23fff' opacity='0.40'/%3E%3Cellipse cx='245.2' cy='125.3' rx='26.4' ry='1.8' transform='rotate(6.1 245.2 125.3)' fill='%23fff' opacity='0.40'/%3E%3Cellipse cx='110.1' cy='143.0' rx='27.8' ry='1.7' transform='rotate(4.4 110.1 143.0)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='128.3' cy='174.5' rx='12.8' ry='3.3' transform='rotate(-6.0 128.3 174.5)' fill='%23fff' opacity='0.43'/%3E%3Cellipse cx='54.3' cy='18.2' rx='12.4' ry='1.9' transform='rotate(5.2 54.3 18.2)' fill='%23000' opacity='0.37'/%3E%3Cellipse cx='54.3' cy='274.2' rx='12.4' ry='1.9' transform='rotate(5.2 54.3 274.2)' fill='%23000' opacity='0.37'/%3E%3Cellipse cx='206.3' cy='224.6' rx='19.9' ry='4.7' transform='rotate(-6.9 206.3 224.6)' fill='%23000' opacity='0.26'/%3E%3Cellipse cx='180.1' cy='97.8' rx='30.8' ry='4.9' transform='rotate(2.4 180.1 97.8)' fill='%23fff' opacity='0.31'/%3E%3Cellipse cx='196.7' cy='12.6' rx='12.5' ry='4.3' transform='rotate(1.6 196.7 12.6)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='196.7' cy='268.6' rx='12.5' ry='4.3' transform='rotate(1.6 196.7 268.6)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='35.2' cy='10.8' rx='20.4' ry='2.4' transform='rotate(-3.2 35.2 10.8)' fill='%23000' opacity='0.47'/%3E%3Cellipse cx='35.2' cy='266.8' rx='20.4' ry='2.4' transform='rotate(-3.2 35.2 266.8)' fill='%23000' opacity='0.47'/%3E%3Cellipse cx='55.7' cy='31.5' rx='9.4' ry='5.0' transform='rotate(-6.3 55.7 31.5)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='107.6' cy='6.0' rx='26.0' ry='4.9' transform='rotate(6.9 107.6 6.0)' fill='%23000' opacity='0.30'/%3E%3Cellipse cx='107.6' cy='262.0' rx='26.0' ry='4.9' transform='rotate(6.9 107.6 262.0)' fill='%23000' opacity='0.30'/%3E%3Cellipse cx='-8.5' cy='186.5' rx='10.4' ry='4.4' transform='rotate(-5.7 -8.5 186.5)' fill='%23000' opacity='0.32'/%3E%3Cellipse cx='247.5' cy='186.5' rx='10.4' ry='4.4' transform='rotate(-5.7 247.5 186.5)' fill='%23000' opacity='0.32'/%3E%3Cellipse cx='129.9' cy='22.2' rx='10.9' ry='2.5' transform='rotate(-5.6 129.9 22.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='221.6' cy='151.0' rx='18.1' ry='2.7' transform='rotate(-6.0 221.6 151.0)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='127.0' cy='-18.3' rx='28.4' ry='1.7' transform='rotate(8.8 127.0 -18.3)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='127.0' cy='237.7' rx='28.4' ry='1.7' transform='rotate(8.8 127.0 237.7)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='146.5' cy='134.5' rx='20.4' ry='3.3' transform='rotate(2.4 146.5 134.5)' fill='%23000' opacity='0.24'/%3E%3Cellipse cx='207.6' cy='71.6' rx='16.8' ry='4.4' transform='rotate(-6.2 207.6 71.6)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='88.3' cy='72.0' rx='12.4' ry='3.3' transform='rotate(-8.5 88.3 72.0)' fill='%23fff' opacity='0.26'/%3E%3Cellipse cx='102.7' cy='56.7' rx='19.4' ry='4.1' transform='rotate(4.6 102.7 56.7)' fill='%23000' opacity='0.33'/%3E%3Cellipse cx='-3.6' cy='100.9' rx='12.9' ry='1.8' transform='rotate(-8.9 -3.6 100.9)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='252.4' cy='100.9' rx='12.9' ry='1.8' transform='rotate(-8.9 252.4 100.9)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='126.2' cy='166.7' rx='15.1' ry='2.5' transform='rotate(-0.5 126.2 166.7)' fill='%23fff' opacity='0.21'/%3E%3Cellipse cx='-10.7' cy='24.5' rx='15.0' ry='3.4' transform='rotate(-8.8 -10.7 24.5)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='245.3' cy='24.5' rx='15.0' ry='3.4' transform='rotate(-8.8 245.3 24.5)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='15.5' cy='139.4' rx='30.8' ry='2.7' transform='rotate(1.3 15.5 139.4)' fill='%23fff' opacity='0.32'/%3E%3Cellipse cx='271.5' cy='139.4' rx='30.8' ry='2.7' transform='rotate(1.3 271.5 139.4)' fill='%23fff' opacity='0.32'/%3E%3Cellipse cx='201.1' cy='154.5' rx='15.1' ry='3.5' transform='rotate(-7.7 201.1 154.5)' fill='%23fff' opacity='0.48'/%3E%3Cellipse cx='204.3' cy='136.1' rx='19.6' ry='3.1' transform='rotate(3.7 204.3 136.1)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='-7.9' cy='218.9' rx='11.4' ry='3.2' transform='rotate(7.2 -7.9 218.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='248.1' cy='218.9' rx='11.4' ry='3.2' transform='rotate(7.2 248.1 218.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='11.1' cy='-21.1' rx='29.6' ry='4.1' transform='rotate(-1.7 11.1 -21.1)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='11.1' cy='234.9' rx='29.6' ry='4.1' transform='rotate(-1.7 11.1 234.9)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='267.1' cy='-21.1' rx='29.6' ry='4.1' transform='rotate(-1.7 267.1 -21.1)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='267.1' cy='234.9' rx='29.6' ry='4.1' transform='rotate(-1.7 267.1 234.9)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='228.0' cy='133.0' rx='17.0' ry='3.8' transform='rotate(0.4 228.0 133.0)' fill='%23fff' opacity='0.22'/%3E%3Cellipse cx='157.3' cy='65.3' rx='21.3' ry='3.0' transform='rotate(0.9 157.3 65.3)' fill='%23000' opacity='0.38'/%3E%3Cellipse cx='129.0' cy='202.2' rx='17.1' ry='3.2' transform='rotate(1.6 129.0 202.2)' fill='%23fff' opacity='0.34'/%3E%3Cellipse cx='150.4' cy='-21.2' rx='25.3' ry='2.5' transform='rotate(-1.4 150.4 -21.2)' fill='%23fff' opacity='0.23'/%3E%3Cellipse cx='150.4' cy='234.8' rx='25.3' ry='2.5' transform='rotate(-1.4 150.4 234.8)' fill='%23fff' opacity='0.23'/%3E%3Cellipse cx='174.4' cy='36.6' rx='26.1' ry='1.9' transform='rotate(-5.8 174.4 36.6)' fill='%23fff' opacity='0.45'/%3E%3Cellipse cx='160.2' cy='187.3' rx='23.3' ry='4.0' transform='rotate(-3.0 160.2 187.3)' fill='%23000' opacity='0.22'/%3E%3Cellipse cx='17.4' cy='-2.6' rx='20.6' ry='2.2' transform='rotate(-7.3 17.4 -2.6)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='17.4' cy='253.4' rx='20.6' ry='2.2' transform='rotate(-7.3 17.4 253.4)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='273.4' cy='-2.6' rx='20.6' ry='2.2' transform='rotate(-7.3 273.4 -2.6)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='273.4' cy='253.4' rx='20.6' ry='2.2' transform='rotate(-7.3 273.4 253.4)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='63.1' cy='87.9' rx='29.4' ry='2.3' transform='rotate(5.0 63.1 87.9)' fill='%23fff' opacity='0.29'/%3E%3Cellipse cx='48.1' cy='194.4' rx='29.4' ry='4.6' transform='rotate(2.0 48.1 194.4)' fill='%23000' opacity='0.25'/%3E%3Cellipse cx='-19.3' cy='214.2' rx='29.3' ry='2.5' transform='rotate(0.4 -19.3 214.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='236.7' cy='214.2' rx='29.3' ry='2.5' transform='rotate(0.4 236.7 214.2)' fill='%23fff' opacity='0.42'/%3E%3Cellipse cx='204.6' cy='33.1' rx='28.6' ry='4.7' transform='rotate(5.0 204.6 33.1)' fill='%23000' opacity='0.44'/%3E%3Cellipse cx='204.6' cy='289.1' rx='28.6' ry='4.7' transform='rotate(5.0 204.6 289.1)' fill='%23000' opacity='0.44'/%3E%3Cellipse cx='202.7' cy='90.0' rx='11.6' ry='5.0' transform='rotate(-0.2 202.7 90.0)' fill='%23000' opacity='0.34'/%3E%3Cellipse cx='-27.7' cy='124.2' rx='21.4' ry='4.7' transform='rotate(-2.2 -27.7 124.2)' fill='%23fff' opacity='0.28'/%3E%3Cellipse cx='228.3' cy='124.2' rx='21.4' ry='4.7' transform='rotate(-2.2 228.3 124.2)' fill='%23fff' opacity='0.28'/%3E%3Cellipse cx='171.1' cy='33.4' rx='28.9' ry='2.0' transform='rotate(-3.2 171.1 33.4)' fill='%23000' opacity='0.17'/%3E%3Cellipse cx='171.1' cy='289.4' rx='28.9' ry='2.0' transform='rotate(-3.2 171.1 289.4)' fill='%23000' opacity='0.17'/%3E%3Cellipse cx='1.6' cy='-11.8' rx='31.0' ry='2.1' transform='rotate(5.8 1.6 -11.8)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='1.6' cy='244.2' rx='31.0' ry='2.1' transform='rotate(5.8 1.6 244.2)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='257.6' cy='-11.8' rx='31.0' ry='2.1' transform='rotate(5.8 257.6 -11.8)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='257.6' cy='244.2' rx='31.0' ry='2.1' transform='rotate(5.8 257.6 244.2)' fill='%23000' opacity='0.21'/%3E%3Cellipse cx='13.7' cy='186.9' rx='19.3' ry='3.1' transform='rotate(-1.0 13.7 186.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='269.7' cy='186.9' rx='19.3' ry='3.1' transform='rotate(-1.0 269.7 186.9)' fill='%23fff' opacity='0.18'/%3E%3Cellipse cx='109.1' cy='170.7' rx='14.5' ry='1.6' transform='rotate(-1.6 109.1 170.7)' fill='%23fff' opacity='0.20'/%3E%3Cellipse cx='43.8' cy='152.2' rx='28.2' ry='2.5' transform='rotate(-8.5 43.8 152.2)' fill='%23000' opacity='0.17'/%3E%3Cellipse cx='87.5' cy='134.7' rx='29.4' ry='2.5' transform='rotate(-0.4 87.5 134.7)' fill='%23fff' opacity='0.24'/%3E%3Cellipse cx='33.6' cy='171.2' rx='22.9' ry='4.1' transform='rotate(7.6 33.6 171.2)' fill='%23fff' opacity='0.26'/%3E%3Cellipse cx='183.8' cy='47.5' rx='25.5' ry='5.0' transform='rotate(4.2 183.8 47.5)' fill='%23fff' opacity='0.47'/%3E%3Cellipse cx='217.2' cy='64.4' rx='15.5' ry='5.0' transform='rotate(-8.6 217.2 64.4)' fill='%23000' opacity='0.42'/%3E%3Cellipse cx='189.7' cy='165.2' rx='17.8' ry='2.7' transform='rotate(-7.5 189.7 165.2)' fill='%23000' opacity='0.43'/%3E%3Cellipse cx='-8.9' cy='64.8' rx='22.0' ry='2.8' transform='rotate(-7.3 -8.9 64.8)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='247.1' cy='64.8' rx='22.0' ry='2.8' transform='rotate(-7.3 247.1 64.8)' fill='%23fff' opacity='0.33'/%3E%3Cellipse cx='-10.2' cy='-5.1' rx='21.3' ry='3.1' transform='rotate(-0.1 -10.2 -5.1)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='-10.2' cy='250.9' rx='21.3' ry='3.1' transform='rotate(-0.1 -10.2 250.9)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='245.8' cy='-5.1' rx='21.3' ry='3.1' transform='rotate(-0.1 245.8 -5.1)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='245.8' cy='250.9' rx='21.3' ry='3.1' transform='rotate(-0.1 245.8 250.9)' fill='%23fff' opacity='0.41'/%3E%3Cellipse cx='212.2' cy='-26.2' rx='19.1' ry='1.6' transform='rotate(7.8 212.2 -26.2)' fill='%23fff' opacity='0.38'/%3E%3Cellipse cx='212.2' cy='229.8' rx='19.1' ry='1.6' transform='rotate(7.8 212.2 229.8)' fill='%23fff' opacity='0.38'/%3E%3Cellipse cx='137.8' cy='36.0' rx='26.1' ry='3.5' transform='rotate(-5.8 137.8 36.0)' fill='%23000' opacity='0.39'/%3E%3Cellipse cx='77.7' cy='194.9' rx='23.4' ry='4.5' transform='rotate(-0.4 77.7 194.9)' fill='%23000' opacity='0.28'/%3E%3C/g%3E%3C/svg%3E"); + /* Fine canvas grain. */ + --kit-grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='0.6'/%3E%3C/svg%3E"); + /* Speckled soil (footer) for light / dark themes. */ + --kit-dirt: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Crect width='16' height='16' fill='%233d2b1f'/%3E%3Cpath fill='%2335251a' d='M0 0h1v1h-1zM2 1h1v1h-1zM14 1h1v1h-1zM1 2h1v1h-1zM11 2h1v1h-1zM13 4h1v1h-1zM1 7h1v1h-1zM2 7h1v1h-1zM5 7h1v1h-1zM4 12h1v1h-1zM5 13h1v1h-1zM7 13h1v1h-1zM0 14h1v1h-1zM13 14h1v1h-1zM4 15h1v1h-1zM13 15h1v1h-1zM15 15h1v1h-1z'/%3E%3Cpath fill='%234d3828' d='M6 0h1v1h-1zM14 2h1v1h-1zM0 3h1v1h-1zM6 3h1v1h-1zM0 4h1v1h-1zM1 5h1v1h-1zM8 6h1v1h-1zM11 6h1v1h-1zM1 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 11h1v1h-1zM9 15h1v1h-1zM12 15h1v1h-1z'/%3E%3Cpath fill='%232f2117' d='M9 0h1v1h-1zM6 1h1v1h-1zM14 4h1v1h-1zM11 5h1v1h-1zM15 5h1v1h-1zM3 7h1v1h-1zM1 11h1v1h-1zM9 14h1v1h-1zM14 15h1v1h-1z'/%3E%3Cpath fill='%23463223' d='M11 0h1v1h-1zM3 1h1v1h-1zM14 5h1v1h-1zM14 6h1v1h-1zM5 8h1v1h-1zM14 13h1v1h-1zM6 14h1v1h-1z'/%3E%3C/svg%3E"); + --kit-dirt-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Crect width='16' height='16' fill='%231d150f'/%3E%3Cpath fill='%2318110c' d='M0 0h1v1h-1zM2 1h1v1h-1zM14 1h1v1h-1zM1 2h1v1h-1zM11 2h1v1h-1zM13 4h1v1h-1zM1 7h1v1h-1zM2 7h1v1h-1zM5 7h1v1h-1zM4 12h1v1h-1zM5 13h1v1h-1zM7 13h1v1h-1zM0 14h1v1h-1zM13 14h1v1h-1zM4 15h1v1h-1zM13 15h1v1h-1zM15 15h1v1h-1z'/%3E%3Cpath fill='%23281d15' d='M6 0h1v1h-1zM14 2h1v1h-1zM0 3h1v1h-1zM6 3h1v1h-1zM0 4h1v1h-1zM1 5h1v1h-1zM8 6h1v1h-1zM11 6h1v1h-1zM1 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 11h1v1h-1zM9 15h1v1h-1zM12 15h1v1h-1z'/%3E%3Cpath fill='%23140e09' d='M9 0h1v1h-1zM6 1h1v1h-1zM14 4h1v1h-1zM11 5h1v1h-1zM15 5h1v1h-1zM3 7h1v1h-1zM1 11h1v1h-1zM9 14h1v1h-1zM14 15h1v1h-1z'/%3E%3Cpath fill='%23231a12' d='M11 0h1v1h-1zM3 1h1v1h-1zM14 5h1v1h-1zM14 6h1v1h-1zM5 8h1v1h-1zM14 13h1v1h-1zM6 14h1v1h-1z'/%3E%3C/svg%3E"); + /* Painted backdrop scenes: Nymphéas (light) and Impression, soleil levant (dark). */ + --kit-paint-lilies: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 520' preserveAspectRatio='xMidYMid slice'%3E%3Cdefs%3E%3ClinearGradient id='bl-sky' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%23d9e7cf'/%3E%3Cstop offset='0.38' stop-color='%23c5ddd2'/%3E%3Cstop offset='0.5' stop-color='%23a7cbc6'/%3E%3Cstop offset='1' stop-color='%237eaab0'/%3E%3C/linearGradient%3E%3CradialGradient id='bl-sun' cx='0.72' cy='0.18' r='0.5'%3E%3Cstop offset='0' stop-color='%23fff4cf' stop-opacity='0.85'/%3E%3Cstop offset='1' stop-color='%23fff4cf' stop-opacity='0'/%3E%3C/radialGradient%3E%3Cfilter id='bl-paint' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.012 0.045' numOctaves='2' seed='3' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='16' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bl-water' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.006 0.08' numOctaves='2' seed='9' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='10' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bl-wash' x='-10%25' y='-20%25' width='120%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='9'/%3E%3C/filter%3E%3C/defs%3E%3Cg%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bl-sky)'/%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bl-sun)'/%3E%3C/g%3E%3Cg filter='url(%23bl-water)'%3E%3Cellipse cx='1506.7' cy='393.7' rx='89.6' ry='3.3' transform='rotate(1.8 1506.7 393.7)' fill='%23cfc6e4' opacity='0.27'/%3E%3Cellipse cx='165' cy='248.9' rx='52.1' ry='2.4' transform='rotate(-1 165 248.9)' fill='%23cfc6e4' opacity='0.5'/%3E%3Cellipse cx='1531.9' cy='350.2' rx='90.5' ry='2.4' transform='rotate(1.7 1531.9 350.2)' fill='%238fbcbc' opacity='0.33'/%3E%3Cellipse cx='765.3' cy='434' rx='104.7' ry='5.4' transform='rotate(0.6 765.3 434)' fill='%238fbcbc' opacity='0.36'/%3E%3Cellipse cx='818.9' cy='253.9' rx='24.9' ry='2.3' transform='rotate(-0.7 818.9 253.9)' fill='%23c4dcd6' opacity='0.57'/%3E%3Cellipse cx='434.7' cy='517.3' rx='53.4' ry='4.4' transform='rotate(1 434.7 517.3)' fill='%238fbcbc' opacity='0.57'/%3E%3Cellipse cx='628.4' cy='509.9' rx='101.7' ry='6' transform='rotate(0.2 628.4 509.9)' fill='%23a9cbe0' opacity='0.66'/%3E%3Cellipse cx='1146.7' cy='352.8' rx='69.6' ry='2.8' transform='rotate(0.7 1146.7 352.8)' fill='%23cfc6e4' opacity='0.71'/%3E%3Cellipse cx='975.2' cy='295.4' rx='20.6' ry='2.4' transform='rotate(1.2 975.2 295.4)' fill='%23cfc6e4' opacity='0.66'/%3E%3Cellipse cx='1370.6' cy='353.5' rx='100.9' ry='4' transform='rotate(1.6 1370.6 353.5)' fill='%23c4dcd6' opacity='0.3'/%3E%3Cellipse cx='1240.6' cy='512.1' rx='122.3' ry='3.3' transform='rotate(-1 1240.6 512.1)' fill='%238fbcbc' opacity='0.7'/%3E%3Cellipse cx='523.5' cy='387.6' rx='68.5' ry='2.2' transform='rotate(-0.4 523.5 387.6)' fill='%23eef2ee' opacity='0.59'/%3E%3Cellipse cx='1237' cy='379.2' rx='108.2' ry='4.8' transform='rotate(-1 1237 379.2)' fill='%23a9cbe0' opacity='0.68'/%3E%3Cellipse cx='1464.7' cy='420.6' rx='113' ry='3.2' transform='rotate(-1.1 1464.7 420.6)' fill='%23a9cbe0' opacity='0.31'/%3E%3Cellipse cx='748.6' cy='389.8' rx='91.6' ry='4' transform='rotate(-1.5 748.6 389.8)' fill='%23a9cbe0' opacity='0.6'/%3E%3Cellipse cx='798' cy='459.5' rx='63.1' ry='3.9' transform='rotate(-0.7 798 459.5)' fill='%238fbcbc' opacity='0.32'/%3E%3Cellipse cx='1500.6' cy='456.1' rx='83.5' ry='5' transform='rotate(-0.1 1500.6 456.1)' fill='%23a9cbe0' opacity='0.51'/%3E%3Cellipse cx='768.9' cy='496.1' rx='165.2' ry='5' transform='rotate(-0.5 768.9 496.1)' fill='%23c4dcd6' opacity='0.61'/%3E%3Cellipse cx='1560.3' cy='505.6' rx='57.1' ry='3' transform='rotate(-0.7 1560.3 505.6)' fill='%23cfc6e4' opacity='0.48'/%3E%3Cellipse cx='901.5' cy='412.1' rx='63.3' ry='2.6' transform='rotate(1.3 901.5 412.1)' fill='%238fbcbc' opacity='0.3'/%3E%3Cellipse cx='1473.4' cy='324.5' rx='87.1' ry='3.2' transform='rotate(-0.7 1473.4 324.5)' fill='%23cfc6e4' opacity='0.59'/%3E%3Cellipse cx='314.7' cy='320.3' rx='85.1' ry='2.5' transform='rotate(0.1 314.7 320.3)' fill='%238fbcbc' opacity='0.68'/%3E%3Cellipse cx='921.8' cy='495.6' rx='67.5' ry='3.7' transform='rotate(1 921.8 495.6)' fill='%23a9cbe0' opacity='0.44'/%3E%3Cellipse cx='29.3' cy='450.3' rx='80.4' ry='6.5' transform='rotate(-1.4 29.3 450.3)' fill='%23eef2ee' opacity='0.63'/%3E%3Cellipse cx='1263.4' cy='267.3' rx='17.5' ry='1.8' transform='rotate(-1.7 1263.4 267.3)' fill='%23a9cbe0' opacity='0.64'/%3E%3Cellipse cx='660.9' cy='401.4' rx='50.5' ry='2.6' transform='rotate(0.9 660.9 401.4)' fill='%238fbcbc' opacity='0.37'/%3E%3Cellipse cx='749.4' cy='347.9' rx='56.9' ry='2.5' transform='rotate(0.6 749.4 347.9)' fill='%238fbcbc' opacity='0.73'/%3E%3Cellipse cx='1384.3' cy='360.3' rx='66.5' ry='3.6' transform='rotate(0.9 1384.3 360.3)' fill='%23eef2ee' opacity='0.44'/%3E%3Cellipse cx='1559.3' cy='452.5' rx='100.4' ry='5.4' transform='rotate(-1.6 1559.3 452.5)' fill='%23a9cbe0' opacity='0.71'/%3E%3Cellipse cx='338.1' cy='352' rx='69.5' ry='4.2' transform='rotate(-0.4 338.1 352)' fill='%238fbcbc' opacity='0.7'/%3E%3Cellipse cx='1435.8' cy='260.1' rx='31' ry='1.6' transform='rotate(0.3 1435.8 260.1)' fill='%23a9cbe0' opacity='0.38'/%3E%3Cellipse cx='1172.1' cy='515.9' rx='40.3' ry='4.3' transform='rotate(-1.4 1172.1 515.9)' fill='%23a9cbe0' opacity='0.47'/%3E%3Cellipse cx='131.2' cy='419.9' rx='87.8' ry='5.4' transform='rotate(1.3 131.2 419.9)' fill='%238fbcbc' opacity='0.6'/%3E%3Cellipse cx='61.6' cy='402.9' rx='35.2' ry='4.8' transform='rotate(1.1 61.6 402.9)' fill='%23cfc6e4' opacity='0.74'/%3E%3Cellipse cx='789' cy='458.1' rx='83.2' ry='3.8' transform='rotate(1.2 789 458.1)' fill='%238fbcbc' opacity='0.71'/%3E%3Cellipse cx='1333.4' cy='404.2' rx='30.1' ry='4' transform='rotate(-1.8 1333.4 404.2)' fill='%238fbcbc' opacity='0.31'/%3E%3Cellipse cx='443.3' cy='390.7' rx='108.2' ry='4.2' transform='rotate(-1.7 443.3 390.7)' fill='%23c4dcd6' opacity='0.34'/%3E%3Cellipse cx='643.5' cy='502.1' rx='145.9' ry='4.4' transform='rotate(0.8 643.5 502.1)' fill='%23eef2ee' opacity='0.41'/%3E%3Cellipse cx='1534.1' cy='399.2' rx='80.1' ry='4.2' transform='rotate(-1.4 1534.1 399.2)' fill='%23a9cbe0' opacity='0.5'/%3E%3Cellipse cx='1395.3' cy='412.5' rx='117.1' ry='5.2' transform='rotate(0.9 1395.3 412.5)' fill='%23cfc6e4' opacity='0.49'/%3E%3Cellipse cx='521.4' cy='407.9' rx='87.3' ry='4.4' transform='rotate(-1.9 521.4 407.9)' fill='%23f3efe2' opacity='0.32'/%3E%3Cellipse cx='1423.4' cy='280.6' rx='50.1' ry='2.9' transform='rotate(-1.2 1423.4 280.6)' fill='%23a9cbe0' opacity='0.46'/%3E%3Cellipse cx='1479' cy='401.5' rx='49' ry='4.5' transform='rotate(-0.9 1479 401.5)' fill='%238fbcbc' opacity='0.38'/%3E%3Cellipse cx='1148.5' cy='514.1' rx='110.2' ry='4.1' transform='rotate(0.9 1148.5 514.1)' fill='%23cfc6e4' opacity='0.53'/%3E%3Cellipse cx='752.1' cy='316.1' rx='23.8' ry='1.7' transform='rotate(-1.9 752.1 316.1)' fill='%238fbcbc' opacity='0.71'/%3E%3Cellipse cx='73' cy='327.5' rx='58.6' ry='2.2' transform='rotate(0.8 73 327.5)' fill='%23eef2ee' opacity='0.61'/%3E%3Cellipse cx='740.5' cy='367.4' rx='89.4' ry='3.8' transform='rotate(-0.7 740.5 367.4)' fill='%23cfc6e4' opacity='0.65'/%3E%3Cellipse cx='1487.1' cy='436' rx='100.1' ry='5.7' transform='rotate(0.5 1487.1 436)' fill='%23f3efe2' opacity='0.7'/%3E%3Cellipse cx='1101' cy='305.4' rx='58.7' ry='1.5' transform='rotate(1.2 1101 305.4)' fill='%23c4dcd6' opacity='0.57'/%3E%3Cellipse cx='996.3' cy='290.4' rx='68.5' ry='2.7' transform='rotate(-0.3 996.3 290.4)' fill='%23f3efe2' opacity='0.47'/%3E%3Cellipse cx='388.9' cy='316.1' rx='48.1' ry='2.2' transform='rotate(-1.6 388.9 316.1)' fill='%238fbcbc' opacity='0.43'/%3E%3Cellipse cx='139.7' cy='275.8' rx='35.9' ry='2.8' transform='rotate(-1.1 139.7 275.8)' fill='%23c4dcd6' opacity='0.46'/%3E%3Cellipse cx='519.6' cy='495.1' rx='119' ry='4.6' transform='rotate(1 519.6 495.1)' fill='%23a9cbe0' opacity='0.57'/%3E%3Cellipse cx='62.5' cy='346.5' rx='75' ry='2.6' transform='rotate(-1.5 62.5 346.5)' fill='%23eef2ee' opacity='0.71'/%3E%3Cellipse cx='382.6' cy='429.6' rx='81.1' ry='3.8' transform='rotate(-1.8 382.6 429.6)' fill='%23eef2ee' opacity='0.52'/%3E%3Cellipse cx='1431' cy='426.5' rx='114.7' ry='3.8' transform='rotate(0.7 1431 426.5)' fill='%23c4dcd6' opacity='0.4'/%3E%3Cellipse cx='126.9' cy='442' rx='131.1' ry='3.9' transform='rotate(0.2 126.9 442)' fill='%23a9cbe0' opacity='0.53'/%3E%3Cellipse cx='1292.3' cy='507.2' rx='135.1' ry='3.2' transform='rotate(1.2 1292.3 507.2)' fill='%23eef2ee' opacity='0.44'/%3E%3Cellipse cx='1259' cy='388.9' rx='35.2' ry='4.3' transform='rotate(0 1259 388.9)' fill='%23f3efe2' opacity='0.49'/%3E%3Cellipse cx='845.9' cy='257.7' rx='24.2' ry='1.4' transform='rotate(1.2 845.9 257.7)' fill='%238fbcbc' opacity='0.52'/%3E%3Cellipse cx='1077.4' cy='297.8' rx='57.6' ry='2.9' transform='rotate(1.3 1077.4 297.8)' fill='%23eef2ee' opacity='0.35'/%3E%3Cellipse cx='1466' cy='329.5' rx='79.1' ry='2.1' transform='rotate(-1.4 1466 329.5)' fill='%23eef2ee' opacity='0.75'/%3E%3Cellipse cx='1357.5' cy='412.5' rx='40.9' ry='3.2' transform='rotate(0.9 1357.5 412.5)' fill='%23cfc6e4' opacity='0.66'/%3E%3Cellipse cx='1473.8' cy='275.1' rx='60.9' ry='2.7' transform='rotate(1.3 1473.8 275.1)' fill='%23a9cbe0' opacity='0.25'/%3E%3Cellipse cx='1365' cy='434.9' rx='129' ry='2.8' transform='rotate(-0.6 1365 434.9)' fill='%23c4dcd6' opacity='0.35'/%3E%3Cellipse cx='86' cy='269' rx='41.9' ry='2.2' transform='rotate(0.7 86 269)' fill='%23cfc6e4' opacity='0.42'/%3E%3Cellipse cx='1035.8' cy='315.1' rx='78.5' ry='2.3' transform='rotate(0.7 1035.8 315.1)' fill='%23c4dcd6' opacity='0.52'/%3E%3Cellipse cx='197.2' cy='511.5' rx='154.8' ry='5.9' transform='rotate(1.1 197.2 511.5)' fill='%23f3efe2' opacity='0.75'/%3E%3Cellipse cx='729.8' cy='497.2' rx='62.4' ry='7.2' transform='rotate(0.9 729.8 497.2)' fill='%23f3efe2' opacity='0.43'/%3E%3Cellipse cx='755.7' cy='384.7' rx='77.8' ry='2.7' transform='rotate(1.2 755.7 384.7)' fill='%238fbcbc' opacity='0.63'/%3E%3Cellipse cx='918' cy='322.6' rx='57.3' ry='1.7' transform='rotate(-0.4 918 322.6)' fill='%23a9cbe0' opacity='0.45'/%3E%3Cellipse cx='591.4' cy='298.7' rx='65.2' ry='3.3' transform='rotate(0.8 591.4 298.7)' fill='%23f3efe2' opacity='0.62'/%3E%3Cellipse cx='360.6' cy='481.7' rx='73' ry='4.5' transform='rotate(0.9 360.6 481.7)' fill='%23eef2ee' opacity='0.72'/%3E%3Cellipse cx='551.4' cy='322' rx='23.6' ry='3.6' transform='rotate(-1.6 551.4 322)' fill='%23c4dcd6' opacity='0.41'/%3E%3Cellipse cx='398.5' cy='322.2' rx='67.9' ry='3.4' transform='rotate(0.2 398.5 322.2)' fill='%23cfc6e4' opacity='0.66'/%3E%3Cellipse cx='100' cy='246' rx='38.5' ry='1' transform='rotate(0.5 100 246)' fill='%238fbcbc' opacity='0.71'/%3E%3Cellipse cx='361.3' cy='457.3' rx='123.8' ry='3.5' transform='rotate(-0.8 361.3 457.3)' fill='%23c4dcd6' opacity='0.42'/%3E%3Cellipse cx='698.6' cy='446.6' rx='107.1' ry='3.6' transform='rotate(-1.5 698.6 446.6)' fill='%23a9cbe0' opacity='0.69'/%3E%3Cellipse cx='387.8' cy='497.5' rx='83.8' ry='6.7' transform='rotate(-1.3 387.8 497.5)' fill='%23a9cbe0' opacity='0.62'/%3E%3Cellipse cx='388.6' cy='375.9' rx='104.7' ry='3.2' transform='rotate(-0.9 388.6 375.9)' fill='%23c4dcd6' opacity='0.35'/%3E%3Cellipse cx='1338.2' cy='432' rx='136.7' ry='4' transform='rotate(1.2 1338.2 432)' fill='%23f3efe2' opacity='0.46'/%3E%3Cellipse cx='792.1' cy='289.9' rx='43.5' ry='2.2' transform='rotate(0.3 792.1 289.9)' fill='%23f3efe2' opacity='0.41'/%3E%3Cellipse cx='1486.6' cy='516.5' rx='79.1' ry='3.2' transform='rotate(-0.1 1486.6 516.5)' fill='%23f3efe2' opacity='0.63'/%3E%3Cellipse cx='471.2' cy='314.5' rx='29.6' ry='3.7' transform='rotate(1.1 471.2 314.5)' fill='%238fbcbc' opacity='0.45'/%3E%3Cellipse cx='965.9' cy='412' rx='40.6' ry='3.6' transform='rotate(0.7 965.9 412)' fill='%23eef2ee' opacity='0.59'/%3E%3Cellipse cx='1215.6' cy='325.1' rx='23.3' ry='3' transform='rotate(-2 1215.6 325.1)' fill='%238fbcbc' opacity='0.55'/%3E%3Cellipse cx='877.8' cy='407.8' rx='55.5' ry='4.5' transform='rotate(1.3 877.8 407.8)' fill='%238fbcbc' opacity='0.65'/%3E%3Cellipse cx='929.2' cy='384' rx='103' ry='3.1' transform='rotate(0.9 929.2 384)' fill='%23cfc6e4' opacity='0.63'/%3E%3Cellipse cx='1127.6' cy='276.5' rx='45.9' ry='1.2' transform='rotate(0.3 1127.6 276.5)' fill='%238fbcbc' opacity='0.57'/%3E%3Cellipse cx='1527.8' cy='467.7' rx='50.8' ry='4.3' transform='rotate(-0.5 1527.8 467.7)' fill='%23eef2ee' opacity='0.49'/%3E%3Cellipse cx='863.6' cy='350.6' rx='42.6' ry='3.6' transform='rotate(0.5 863.6 350.6)' fill='%23a9cbe0' opacity='0.54'/%3E%3Cellipse cx='500.2' cy='405.6' rx='34.3' ry='2.8' transform='rotate(-1.4 500.2 405.6)' fill='%23a9cbe0' opacity='0.55'/%3E%3Cellipse cx='941.3' cy='497.2' rx='59.9' ry='7.2' transform='rotate(0.2 941.3 497.2)' fill='%23cfc6e4' opacity='0.68'/%3E%3Cellipse cx='1386.7' cy='335.4' rx='70.5' ry='2.6' transform='rotate(1.2 1386.7 335.4)' fill='%23a9cbe0' opacity='0.48'/%3E%3C/g%3E%3Cg filter='url(%23bl-wash)'%3E%3Cellipse cx='-12.9' cy='69.7' rx='150.6' ry='61.7' transform='rotate(3.5 -12.9 69.7)' fill='%235c8b57' opacity='0.26'/%3E%3Cellipse cx='137.4' cy='16.4' rx='154.5' ry='66.4' transform='rotate(-4.6 137.4 16.4)' fill='%236f9f5e' opacity='0.23'/%3E%3Cellipse cx='210.7' cy='8.6' rx='108.7' ry='35.1' transform='rotate(-0.5 210.7 8.6)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='278.5' cy='10' rx='103' ry='50' transform='rotate(8.5 278.5 10)' fill='%234e7d4a' opacity='0.37'/%3E%3Cellipse cx='269.2' cy='77' rx='173.3' ry='65.5' transform='rotate(5.2 269.2 77)' fill='%236f9f5e' opacity='0.41'/%3E%3Cellipse cx='441.8' cy='2' rx='106.4' ry='55.9' transform='rotate(-0.2 441.8 2)' fill='%237d9fb0' opacity='0.41'/%3E%3Cellipse cx='477.3' cy='0.1' rx='244.6' ry='42.8' transform='rotate(-5.7 477.3 0.1)' fill='%238e8fbf' opacity='0.43'/%3E%3Cellipse cx='525.8' cy='5.6' rx='166' ry='70.2' transform='rotate(-8.5 525.8 5.6)' fill='%234e7d4a' opacity='0.34'/%3E%3Cellipse cx='625.4' cy='38.5' rx='98.6' ry='54.5' transform='rotate(0.4 625.4 38.5)' fill='%234e7d4a' opacity='0.23'/%3E%3Cellipse cx='728.5' cy='10.9' rx='222.7' ry='46.4' transform='rotate(-0.8 728.5 10.9)' fill='%234e7d4a' opacity='0.28'/%3E%3Cellipse cx='834.7' cy='14.6' rx='190.8' ry='37.3' transform='rotate(2.8 834.7 14.6)' fill='%237d9fb0' opacity='0.44'/%3E%3Cellipse cx='888.5' cy='65.5' rx='187.9' ry='41.8' transform='rotate(2.6 888.5 65.5)' fill='%237d9fb0' opacity='0.28'/%3E%3Cellipse cx='937' cy='64.4' rx='217.6' ry='56.9' transform='rotate(-7.4 937 64.4)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='1069.3' cy='19.2' rx='231.9' ry='63.8' transform='rotate(-4.9 1069.3 19.2)' fill='%235c8b57' opacity='0.36'/%3E%3Cellipse cx='1097.1' cy='63.8' rx='190.7' ry='49.2' transform='rotate(9.1 1097.1 63.8)' fill='%237d9fb0' opacity='0.45'/%3E%3Cellipse cx='1170.9' cy='45.7' rx='100.5' ry='57.8' transform='rotate(2.1 1170.9 45.7)' fill='%235c8b57' opacity='0.41'/%3E%3Cellipse cx='1278.6' cy='65.3' rx='98.4' ry='73.4' transform='rotate(-8.9 1278.6 65.3)' fill='%234e7d4a' opacity='0.42'/%3E%3Cellipse cx='1344.7' cy='59.5' rx='139' ry='41.4' transform='rotate(3.9 1344.7 59.5)' fill='%237d9fb0' opacity='0.39'/%3E%3Cellipse cx='1476.5' cy='8.7' rx='223.5' ry='54.4' transform='rotate(5.4 1476.5 8.7)' fill='%234e7d4a' opacity='0.42'/%3E%3Cellipse cx='1535.8' cy='21' rx='180.2' ry='54.4' transform='rotate(-5.7 1535.8 21)' fill='%237d9fb0' opacity='0.38'/%3E%3Cellipse cx='1578.8' cy='2.5' rx='127.3' ry='67' transform='rotate(3.2 1578.8 2.5)' fill='%238e8fbf' opacity='0.24'/%3E%3C/g%3E%3Cg filter='url(%23bl-paint)'%3E%3Cellipse cx='1451.8' cy='69' rx='49.5' ry='11.4' transform='rotate(88.9 1451.8 69)' fill='%234e7d4a' opacity='0.42'/%3E%3Cellipse cx='436.9' cy='172.2' rx='37.8' ry='9.8' transform='rotate(102.3 436.9 172.2)' fill='%2386b26b' opacity='0.42'/%3E%3Cellipse cx='809.7' cy='29.7' rx='53.4' ry='5.7' transform='rotate(82.5 809.7 29.7)' fill='%23a9c98a' opacity='0.64'/%3E%3Cellipse cx='636.3' cy='11.1' rx='42.9' ry='7.1' transform='rotate(99.4 636.3 11.1)' fill='%234e7d4a' opacity='0.35'/%3E%3Cellipse cx='1525.1' cy='8.6' rx='47.2' ry='9.3' transform='rotate(104.2 1525.1 8.6)' fill='%233f6e45' opacity='0.45'/%3E%3Cellipse cx='827.5' cy='95.2' rx='22.3' ry='6' transform='rotate(99.2 827.5 95.2)' fill='%234e7d4a' opacity='0.72'/%3E%3Cellipse cx='1158.9' cy='67.9' rx='19.6' ry='6' transform='rotate(99.3 1158.9 67.9)' fill='%23a9c98a' opacity='0.52'/%3E%3Cellipse cx='1543.2' cy='5.1' rx='33.3' ry='9.2' transform='rotate(78.3 1543.2 5.1)' fill='%2386b26b' opacity='0.34'/%3E%3Cellipse cx='248.9' cy='135.7' rx='28.1' ry='12.6' transform='rotate(82.3 248.9 135.7)' fill='%23b9b3d9' opacity='0.43'/%3E%3Cellipse cx='193' cy='87' rx='19.7' ry='9.4' transform='rotate(102.2 193 87)' fill='%2386b26b' opacity='0.3'/%3E%3Cellipse cx='1491.4' cy='38.2' rx='51.6' ry='7' transform='rotate(77.6 1491.4 38.2)' fill='%23c8dcb0' opacity='0.53'/%3E%3Cellipse cx='105.1' cy='9.1' rx='52.8' ry='11.1' transform='rotate(82.4 105.1 9.1)' fill='%239a86c2' opacity='0.64'/%3E%3Cellipse cx='454.9' cy='101.7' rx='53' ry='8.2' transform='rotate(93.5 454.9 101.7)' fill='%239a86c2' opacity='0.67'/%3E%3Cellipse cx='514.4' cy='158.8' rx='19.9' ry='7' transform='rotate(103.3 514.4 158.8)' fill='%237fae74' opacity='0.68'/%3E%3Cellipse cx='1004.6' cy='17.3' rx='52.7' ry='8.7' transform='rotate(98.1 1004.6 17.3)' fill='%233f6e45' opacity='0.56'/%3E%3Cellipse cx='1439.5' cy='0.3' rx='47.1' ry='11.5' transform='rotate(96.3 1439.5 0.3)' fill='%235c8b57' opacity='0.71'/%3E%3Cellipse cx='1466.9' cy='105.8' rx='54.8' ry='5.5' transform='rotate(91.4 1466.9 105.8)' fill='%233f6e45' opacity='0.4'/%3E%3Cellipse cx='346.6' cy='45.4' rx='24.9' ry='8.8' transform='rotate(94.4 346.6 45.4)' fill='%237fae74' opacity='0.53'/%3E%3Cellipse cx='696.5' cy='63.9' rx='34.1' ry='11.2' transform='rotate(77.5 696.5 63.9)' fill='%234e7d4a' opacity='0.35'/%3E%3Cellipse cx='1200.9' cy='139' rx='45.6' ry='7' transform='rotate(102.1 1200.9 139)' fill='%236f9f5e' opacity='0.42'/%3E%3Cellipse cx='1316' cy='7.2' rx='45.9' ry='6.3' transform='rotate(100.9 1316 7.2)' fill='%23c8dcb0' opacity='0.59'/%3E%3Cellipse cx='1189.8' cy='19.4' rx='24.3' ry='11.1' transform='rotate(82.9 1189.8 19.4)' fill='%235c8b57' opacity='0.73'/%3E%3Cellipse cx='626.9' cy='20.8' rx='20.4' ry='8.8' transform='rotate(76.5 626.9 20.8)' fill='%234e7d4a' opacity='0.4'/%3E%3Cellipse cx='568' cy='152.2' rx='28.8' ry='5.1' transform='rotate(83.1 568 152.2)' fill='%239a86c2' opacity='0.69'/%3E%3Cellipse cx='699.4' cy='196.7' rx='22.7' ry='5.7' transform='rotate(75.6 699.4 196.7)' fill='%236f9f5e' opacity='0.53'/%3E%3Cellipse cx='234.1' cy='12.1' rx='26.7' ry='9.2' transform='rotate(105 234.1 12.1)' fill='%235c8b57' opacity='0.61'/%3E%3Cellipse cx='338.6' cy='142.4' rx='40.1' ry='9.3' transform='rotate(104.3 338.6 142.4)' fill='%237fae74' opacity='0.35'/%3E%3Cellipse cx='1008.4' cy='127.7' rx='25.1' ry='6.8' transform='rotate(75.3 1008.4 127.7)' fill='%23a9c98a' opacity='0.59'/%3E%3Cellipse cx='298.5' cy='117.1' rx='39.5' ry='11.6' transform='rotate(75.9 298.5 117.1)' fill='%233f6e45' opacity='0.66'/%3E%3Cellipse cx='702.7' cy='69.3' rx='48.4' ry='12.4' transform='rotate(85.6 702.7 69.3)' fill='%23b9b3d9' opacity='0.75'/%3E%3Cellipse cx='226.4' cy='49.9' rx='51.9' ry='10.2' transform='rotate(94.7 226.4 49.9)' fill='%235c8b57' opacity='0.3'/%3E%3Cellipse cx='1187.9' cy='20.8' rx='46.3' ry='5.6' transform='rotate(90.6 1187.9 20.8)' fill='%23b9b3d9' opacity='0.55'/%3E%3Cellipse cx='1053.5' cy='103.7' rx='37.3' ry='9.9' transform='rotate(84.2 1053.5 103.7)' fill='%23c8dcb0' opacity='0.58'/%3E%3Cellipse cx='757.6' cy='140.2' rx='27.9' ry='9.4' transform='rotate(76.4 757.6 140.2)' fill='%23b9b3d9' opacity='0.64'/%3E%3Cellipse cx='720.1' cy='102.3' rx='38.7' ry='8.2' transform='rotate(91.3 720.1 102.3)' fill='%2386b26b' opacity='0.44'/%3E%3Cellipse cx='901' cy='5.3' rx='26.5' ry='11.2' transform='rotate(75.4 901 5.3)' fill='%23c8dcb0' opacity='0.34'/%3E%3Cellipse cx='553.1' cy='141.3' rx='37.6' ry='12.7' transform='rotate(95 553.1 141.3)' fill='%239a86c2' opacity='0.64'/%3E%3Cellipse cx='1561.2' cy='41.1' rx='24.1' ry='11.4' transform='rotate(86 1561.2 41.1)' fill='%239a86c2' opacity='0.73'/%3E%3Cellipse cx='1297.5' cy='17.9' rx='47.5' ry='9.3' transform='rotate(87.2 1297.5 17.9)' fill='%23c8dcb0' opacity='0.34'/%3E%3Cellipse cx='1302' cy='167.4' rx='55' ry='7.4' transform='rotate(98.1 1302 167.4)' fill='%2386b26b' opacity='0.58'/%3E%3Cellipse cx='766.8' cy='140.8' rx='53.9' ry='7.3' transform='rotate(100.6 766.8 140.8)' fill='%234e7d4a' opacity='0.43'/%3E%3Cellipse cx='577.8' cy='201.7' rx='45.5' ry='12.9' transform='rotate(80.5 577.8 201.7)' fill='%237fae74' opacity='0.48'/%3E%3Cellipse cx='346.8' cy='203.9' rx='48' ry='5.2' transform='rotate(101.3 346.8 203.9)' fill='%23b9b3d9' opacity='0.34'/%3E%3Cellipse cx='1539' cy='212.3' rx='29.6' ry='5.2' transform='rotate(104.2 1539 212.3)' fill='%2386b26b' opacity='0.66'/%3E%3Cellipse cx='252.2' cy='112.5' rx='29.2' ry='11' transform='rotate(102.4 252.2 112.5)' fill='%236f9f5e' opacity='0.69'/%3E%3Cellipse cx='958.4' cy='118.9' rx='43' ry='12.6' transform='rotate(82.3 958.4 118.9)' fill='%239a86c2' opacity='0.42'/%3E%3Cellipse cx='1076.1' cy='109' rx='28.1' ry='8.8' transform='rotate(82.9 1076.1 109)' fill='%233f6e45' opacity='0.35'/%3E%3Cellipse cx='475.3' cy='28.6' rx='38' ry='8.3' transform='rotate(89.3 475.3 28.6)' fill='%23c8dcb0' opacity='0.37'/%3E%3Cellipse cx='72.6' cy='187.8' rx='24.1' ry='9.5' transform='rotate(74.7 72.6 187.8)' fill='%239a86c2' opacity='0.54'/%3E%3Cellipse cx='695.6' cy='242.6' rx='37.5' ry='6.7' transform='rotate(99.2 695.6 242.6)' fill='%235c8b57' opacity='0.74'/%3E%3Cellipse cx='224.8' cy='64' rx='17.9' ry='9.9' transform='rotate(105.8 224.8 64)' fill='%237fae74' opacity='0.66'/%3E%3Cellipse cx='248.6' cy='5.8' rx='44.8' ry='9' transform='rotate(94.7 248.6 5.8)' fill='%23c8dcb0' opacity='0.34'/%3E%3Cellipse cx='1399.1' cy='156.5' rx='35.7' ry='10.1' transform='rotate(98.2 1399.1 156.5)' fill='%236f9f5e' opacity='0.53'/%3E%3Cellipse cx='78.3' cy='29.2' rx='36' ry='5' transform='rotate(98 78.3 29.2)' fill='%2386b26b' opacity='0.41'/%3E%3Cellipse cx='394.7' cy='0.1' rx='31.3' ry='8' transform='rotate(88 394.7 0.1)' fill='%239a86c2' opacity='0.32'/%3E%3Cellipse cx='1244.6' cy='13' rx='27.6' ry='6.4' transform='rotate(79.8 1244.6 13)' fill='%235c8b57' opacity='0.38'/%3E%3Cellipse cx='953.9' cy='129.1' rx='46.9' ry='7.4' transform='rotate(93.4 953.9 129.1)' fill='%237fae74' opacity='0.68'/%3E%3Cellipse cx='931.2' cy='1.3' rx='41' ry='9.8' transform='rotate(75.7 931.2 1.3)' fill='%237fae74' opacity='0.4'/%3E%3Cellipse cx='710.1' cy='96.2' rx='26.3' ry='12.4' transform='rotate(91.7 710.1 96.2)' fill='%236f9f5e' opacity='0.42'/%3E%3Cellipse cx='1354' cy='214.2' rx='41.8' ry='10.2' transform='rotate(74.9 1354 214.2)' fill='%2386b26b' opacity='0.41'/%3E%3Cellipse cx='980.9' cy='28.9' rx='40.3' ry='9' transform='rotate(82 980.9 28.9)' fill='%2386b26b' opacity='0.5'/%3E%3Cellipse cx='774.9' cy='5.2' rx='24' ry='6.4' transform='rotate(96.9 774.9 5.2)' fill='%2386b26b' opacity='0.42'/%3E%3Cellipse cx='734.1' cy='111.3' rx='39.3' ry='7.9' transform='rotate(99.3 734.1 111.3)' fill='%237fae74' opacity='0.68'/%3E%3Cellipse cx='276.8' cy='27.7' rx='27.4' ry='10.7' transform='rotate(103 276.8 27.7)' fill='%233f6e45' opacity='0.47'/%3E%3Cellipse cx='415' cy='63.7' rx='44.2' ry='10.5' transform='rotate(83.6 415 63.7)' fill='%23b9b3d9' opacity='0.47'/%3E%3Cellipse cx='100.9' cy='105' rx='22.5' ry='11.6' transform='rotate(88.3 100.9 105)' fill='%2386b26b' opacity='0.64'/%3E%3Cellipse cx='865.5' cy='27.1' rx='37.8' ry='7.2' transform='rotate(80 865.5 27.1)' fill='%234e7d4a' opacity='0.57'/%3E%3Cellipse cx='600' cy='139.5' rx='53.4' ry='7.9' transform='rotate(99.1 600 139.5)' fill='%23a9c98a' opacity='0.47'/%3E%3Cellipse cx='1154.2' cy='88.7' rx='39' ry='9' transform='rotate(84.6 1154.2 88.7)' fill='%23c8dcb0' opacity='0.47'/%3E%3Cellipse cx='887.4' cy='195.6' rx='37.8' ry='6.5' transform='rotate(88.2 887.4 195.6)' fill='%233f6e45' opacity='0.71'/%3E%3Cellipse cx='620.4' cy='26.1' rx='21.1' ry='11.6' transform='rotate(98.9 620.4 26.1)' fill='%234e7d4a' opacity='0.45'/%3E%3Cellipse cx='1314.6' cy='31.5' rx='48.9' ry='12.1' transform='rotate(85.9 1314.6 31.5)' fill='%2386b26b' opacity='0.4'/%3E%3Cellipse cx='762.9' cy='74.6' rx='18.7' ry='7.8' transform='rotate(87.7 762.9 74.6)' fill='%239a86c2' opacity='0.43'/%3E%3Cellipse cx='502.1' cy='43.8' rx='46.9' ry='12.1' transform='rotate(91.1 502.1 43.8)' fill='%239a86c2' opacity='0.35'/%3E%3Cellipse cx='311' cy='9.6' rx='28.6' ry='5.1' transform='rotate(76.8 311 9.6)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='509.7' cy='106.1' rx='32.4' ry='12.8' transform='rotate(104.7 509.7 106.1)' fill='%236f9f5e' opacity='0.59'/%3E%3Cellipse cx='1235.5' cy='18.3' rx='31.6' ry='8.5' transform='rotate(78.1 1235.5 18.3)' fill='%2386b26b' opacity='0.32'/%3E%3Cellipse cx='303.7' cy='84.7' rx='42.9' ry='10.7' transform='rotate(94.9 303.7 84.7)' fill='%23c8dcb0' opacity='0.53'/%3E%3Cellipse cx='1120.2' cy='132.6' rx='55.1' ry='9.2' transform='rotate(94.8 1120.2 132.6)' fill='%23b9b3d9' opacity='0.54'/%3E%3Cellipse cx='770.1' cy='148.6' rx='25.8' ry='9.7' transform='rotate(82.3 770.1 148.6)' fill='%2386b26b' opacity='0.38'/%3E%3Cellipse cx='1018.6' cy='6.5' rx='26.3' ry='8.7' transform='rotate(97.4 1018.6 6.5)' fill='%239a86c2' opacity='0.67'/%3E%3Cellipse cx='162.6' cy='137' rx='38.2' ry='10.7' transform='rotate(105 162.6 137)' fill='%233f6e45' opacity='0.63'/%3E%3Cellipse cx='1295.6' cy='0.1' rx='39.2' ry='12.4' transform='rotate(75.5 1295.6 0.1)' fill='%2386b26b' opacity='0.65'/%3E%3Cellipse cx='572.4' cy='0.1' rx='27.7' ry='11.7' transform='rotate(87 572.4 0.1)' fill='%23c8dcb0' opacity='0.51'/%3E%3Cellipse cx='761.7' cy='46.5' rx='47.2' ry='12.1' transform='rotate(92.3 761.7 46.5)' fill='%233f6e45' opacity='0.51'/%3E%3Cellipse cx='39.5' cy='24.8' rx='48.4' ry='8.4' transform='rotate(78.4 39.5 24.8)' fill='%23c8dcb0' opacity='0.66'/%3E%3Cellipse cx='487.8' cy='77.5' rx='46.5' ry='7.7' transform='rotate(97.8 487.8 77.5)' fill='%2386b26b' opacity='0.3'/%3E%3Cellipse cx='97.9' cy='2.1' rx='22.4' ry='8.1' transform='rotate(98.8 97.9 2.1)' fill='%234e7d4a' opacity='0.73'/%3E%3Cellipse cx='304.2' cy='32.8' rx='37.6' ry='11.8' transform='rotate(100.5 304.2 32.8)' fill='%239a86c2' opacity='0.38'/%3E%3Cellipse cx='862.5' cy='11.1' rx='48.1' ry='6' transform='rotate(101.2 862.5 11.1)' fill='%235c8b57' opacity='0.66'/%3E%3Cellipse cx='1476.1' cy='0.5' rx='21.1' ry='9.4' transform='rotate(95.6 1476.1 0.5)' fill='%23a9c98a' opacity='0.65'/%3E%3Cellipse cx='55.4' cy='4.1' rx='28.4' ry='10' transform='rotate(82.2 55.4 4.1)' fill='%234e7d4a' opacity='0.47'/%3E%3Cellipse cx='49' cy='155.4' rx='53.2' ry='12.9' transform='rotate(99.3 49 155.4)' fill='%23c8dcb0' opacity='0.71'/%3E%3Cellipse cx='332.6' cy='181.8' rx='42.5' ry='6.5' transform='rotate(85.4 332.6 181.8)' fill='%236f9f5e' opacity='0.44'/%3E%3Cellipse cx='1276.8' cy='48.1' rx='38.1' ry='10.1' transform='rotate(87 1276.8 48.1)' fill='%23a9c98a' opacity='0.66'/%3E%3Cellipse cx='673' cy='237.2' rx='46.1' ry='6.7' transform='rotate(77.6 673 237.2)' fill='%23c8dcb0' opacity='0.73'/%3E%3Cellipse cx='278.2' cy='29.6' rx='33.5' ry='7.4' transform='rotate(87.8 278.2 29.6)' fill='%23c8dcb0' opacity='0.75'/%3E%3Cellipse cx='94.7' cy='230.5' rx='21' ry='9.3' transform='rotate(101.3 94.7 230.5)' fill='%235c8b57' opacity='0.42'/%3E%3Cellipse cx='239.2' cy='68.3' rx='34' ry='11.1' transform='rotate(84.5 239.2 68.3)' fill='%233f6e45' opacity='0.5'/%3E%3Cellipse cx='925.5' cy='50.9' rx='46.3' ry='5.6' transform='rotate(102 925.5 50.9)' fill='%239a86c2' opacity='0.42'/%3E%3Cellipse cx='850.1' cy='41.5' rx='32.2' ry='12.7' transform='rotate(90.6 850.1 41.5)' fill='%239a86c2' opacity='0.74'/%3E%3Cellipse cx='623.7' cy='222.2' rx='32.1' ry='11.5' transform='rotate(88.5 623.7 222.2)' fill='%234e7d4a' opacity='0.65'/%3E%3Cellipse cx='1056.1' cy='16' rx='41.5' ry='11.2' transform='rotate(81.6 1056.1 16)' fill='%239a86c2' opacity='0.37'/%3E%3Cellipse cx='1245.6' cy='23.5' rx='19.4' ry='8.6' transform='rotate(80.5 1245.6 23.5)' fill='%23a9c98a' opacity='0.63'/%3E%3Cellipse cx='1522.1' cy='3.8' rx='18' ry='10.1' transform='rotate(104.8 1522.1 3.8)' fill='%2386b26b' opacity='0.66'/%3E%3Cellipse cx='1143.5' cy='17.9' rx='31' ry='8.6' transform='rotate(83.3 1143.5 17.9)' fill='%233f6e45' opacity='0.64'/%3E%3Cellipse cx='1347' cy='78.8' rx='37.2' ry='11.7' transform='rotate(93.4 1347 78.8)' fill='%2386b26b' opacity='0.6'/%3E%3Cellipse cx='273' cy='206.5' rx='39.8' ry='10.5' transform='rotate(90.1 273 206.5)' fill='%2386b26b' opacity='0.52'/%3E%3Cellipse cx='1343.8' cy='51.2' rx='36.2' ry='8.3' transform='rotate(94.1 1343.8 51.2)' fill='%236f9f5e' opacity='0.58'/%3E%3Cellipse cx='75.5' cy='21.9' rx='39.2' ry='13' transform='rotate(99.6 75.5 21.9)' fill='%234e7d4a' opacity='0.48'/%3E%3Cellipse cx='726.8' cy='235.1' rx='49' ry='6.3' transform='rotate(91.6 726.8 235.1)' fill='%23c8dcb0' opacity='0.71'/%3E%3Cellipse cx='121.8' cy='0' rx='50.7' ry='7.5' transform='rotate(94.8 121.8 0)' fill='%236f9f5e' opacity='0.47'/%3E%3Cellipse cx='390.7' cy='0' rx='53.8' ry='5.8' transform='rotate(102.5 390.7 0)' fill='%239a86c2' opacity='0.61'/%3E%3Cellipse cx='689.2' cy='10.1' rx='43.8' ry='6.9' transform='rotate(90.1 689.2 10.1)' fill='%236f9f5e' opacity='0.52'/%3E%3Cellipse cx='1221.5' cy='6.3' rx='51' ry='5.4' transform='rotate(82.7 1221.5 6.3)' fill='%233f6e45' opacity='0.68'/%3E%3Cellipse cx='778' cy='117.7' rx='31.5' ry='11.3' transform='rotate(74.6 778 117.7)' fill='%236f9f5e' opacity='0.39'/%3E%3Cellipse cx='478.8' cy='123.8' rx='25.3' ry='8.6' transform='rotate(93.7 478.8 123.8)' fill='%234e7d4a' opacity='0.36'/%3E%3Cellipse cx='572.4' cy='220.5' rx='19.6' ry='10.5' transform='rotate(82.4 572.4 220.5)' fill='%2386b26b' opacity='0.53'/%3E%3Cellipse cx='39.4' cy='67.4' rx='40.2' ry='7.3' transform='rotate(96.8 39.4 67.4)' fill='%23c8dcb0' opacity='0.47'/%3E%3Cellipse cx='785' cy='0.6' rx='34.8' ry='9.9' transform='rotate(105 785 0.6)' fill='%234e7d4a' opacity='0.34'/%3E%3Cellipse cx='615.2' cy='136.3' rx='32.1' ry='5.9' transform='rotate(95.1 615.2 136.3)' fill='%239a86c2' opacity='0.62'/%3E%3Cellipse cx='379.1' cy='1.2' rx='20.5' ry='10.6' transform='rotate(81 379.1 1.2)' fill='%23c8dcb0' opacity='0.45'/%3E%3Cellipse cx='436.6' cy='2.3' rx='31' ry='11.7' transform='rotate(87 436.6 2.3)' fill='%233f6e45' opacity='0.35'/%3E%3Cellipse cx='181' cy='25.3' rx='22' ry='7.6' transform='rotate(89.7 181 25.3)' fill='%236f9f5e' opacity='0.52'/%3E%3Cellipse cx='427.7' cy='218.9' rx='20.5' ry='7.9' transform='rotate(84.2 427.7 218.9)' fill='%235c8b57' opacity='0.65'/%3E%3Cellipse cx='745.4' cy='77' rx='42.6' ry='9.6' transform='rotate(96 745.4 77)' fill='%234e7d4a' opacity='0.5'/%3E%3Cellipse cx='178.7' cy='91.6' rx='48.6' ry='7.4' transform='rotate(99.2 178.7 91.6)' fill='%235c8b57' opacity='0.69'/%3E%3Cellipse cx='406.5' cy='213.6' rx='47.3' ry='12.6' transform='rotate(79.4 406.5 213.6)' fill='%2386b26b' opacity='0.58'/%3E%3Cellipse cx='1470.4' cy='36' rx='39.9' ry='10.4' transform='rotate(99.4 1470.4 36)' fill='%236f9f5e' opacity='0.54'/%3E%3Cellipse cx='1241.8' cy='11.6' rx='19.7' ry='7.9' transform='rotate(105.8 1241.8 11.6)' fill='%236f9f5e' opacity='0.73'/%3E%3Cellipse cx='631.1' cy='3.8' rx='33.6' ry='11.3' transform='rotate(92.4 631.1 3.8)' fill='%233f6e45' opacity='0.3'/%3E%3Cellipse cx='117.9' cy='100.4' rx='39.4' ry='6.2' transform='rotate(83.4 117.9 100.4)' fill='%2386b26b' opacity='0.52'/%3E%3C/g%3E%3Cg filter='url(%23bl-paint)'%3E%3Cellipse cx='1391.2' cy='362.1' rx='39.6' ry='12.2' transform='rotate(-2.5 1391.2 362.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1388.7' cy='359.7' rx='39.6' ry='12.2' transform='rotate(-2.3 1388.7 359.7)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1378.8' cy='356' rx='19.8' ry='4.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1387.3' cy='354.8' rx='8.5' ry='4.5' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='1387.3' cy='353.1' rx='4.5' ry='3.1' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1387.3' cy='353.7' r='1.6' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1360.4' cy='382.6' rx='22.7' ry='6.9' transform='rotate(2.7 1360.4 382.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1357.9' cy='380.2' rx='22.7' ry='6.9' transform='rotate(3 1357.9 380.2)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1352.2' cy='378.1' rx='11.4' ry='2.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1400.7' cy='386.4' rx='34' ry='10' transform='rotate(-1.7 1400.7 386.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1398.3' cy='384' rx='34' ry='10' transform='rotate(3.1 1398.3 384)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1389.8' cy='381' rx='17' ry='3.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1399' cy='380' rx='9.9' ry='5.3' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='1399' cy='378' rx='5.3' ry='3.6' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1399' cy='378.7' r='1.9' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1337.2' cy='365.8' rx='43.4' ry='13.2' transform='rotate(3.2 1337.2 365.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1334.7' cy='363.4' rx='43.4' ry='13.2' transform='rotate(-1.3 1334.7 363.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1323.9' cy='359.4' rx='21.7' ry='4.6' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1337.3' cy='364.6' rx='34.3' ry='8.6' transform='rotate(1.7 1337.3 364.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1334.8' cy='362.1' rx='34.3' ry='8.6' transform='rotate(0.9 1334.8 362.1)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='1326.2' cy='359.5' rx='17.2' ry='3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1348.5' cy='358.7' rx='10.5' ry='5.6' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='1348.5' cy='356.6' rx='5.6' ry='3.8' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1348.5' cy='357.3' r='2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='70.3' cy='432.4' rx='39.1' ry='10.5' transform='rotate(-2.3 70.3 432.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='66.9' cy='429' rx='39.1' ry='10.5' transform='rotate(-2.4 66.9 429)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='57.1' cy='425.9' rx='19.6' ry='3.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='74.9' cy='424.8' rx='16.7' ry='8.9' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='74.9' cy='421.5' rx='8.9' ry='6.1' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='74.9' cy='422.6' r='3.1' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='199.3' cy='456.8' rx='58.2' ry='18.5' transform='rotate(-0.8 199.3 456.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='195.9' cy='453.4' rx='58.2' ry='18.5' transform='rotate(0.7 195.9 453.4)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='181.3' cy='447.9' rx='29.1' ry='6.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='117.4' cy='463.1' rx='60.7' ry='16.1' transform='rotate(2.2 117.4 463.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='114.1' cy='459.8' rx='60.7' ry='16.1' transform='rotate(-3.5 114.1 459.8)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='98.9' cy='454.9' rx='30.3' ry='5.6' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='117.6' cy='453.3' rx='9.9' ry='5.3' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='117.6' cy='451.3' rx='5.3' ry='3.6' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='117.6' cy='452' r='1.8' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='785.2' cy='481' rx='50.1' ry='14.9' transform='rotate(1.4 785.2 481)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='781.6' cy='477.3' rx='50.1' ry='14.9' transform='rotate(3.1 781.6 477.3)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='769.1' cy='472.9' rx='25.1' ry='5.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='723.6' cy='458.7' rx='58.6' ry='14.6' transform='rotate(-0.6 723.6 458.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='719.9' cy='455' rx='58.6' ry='14.6' transform='rotate(-0.5 719.9 455)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='705.3' cy='450.6' rx='29.3' ry='5.1' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='729.9' cy='449.2' rx='13.7' ry='7.3' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='729.9' cy='446.4' rx='7.3' ry='5' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='729.9' cy='447.3' r='2.6' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='731.5' cy='450.9' rx='46.3' ry='12.6' transform='rotate(3.5 731.5 450.9)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='727.9' cy='447.3' rx='46.3' ry='12.6' transform='rotate(-0.8 727.9 447.3)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='716.3' cy='443.5' rx='23.2' ry='4.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='713.9' cy='442.2' rx='14.6' ry='7.8' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='713.9' cy='439.3' rx='7.8' ry='5.3' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='713.9' cy='440.3' r='2.7' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='647.4' cy='475.1' rx='39.6' ry='10.8' transform='rotate(2.3 647.4 475.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='643.8' cy='471.4' rx='39.6' ry='10.8' transform='rotate(1.2 643.8 471.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='633.9' cy='468.2' rx='19.8' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='641.1' cy='467.1' rx='16.4' ry='8.8' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='641.1' cy='463.8' rx='8.8' ry='6' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='641.1' cy='464.9' r='3.1' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='711' cy='487.8' rx='56.2' ry='13.8' transform='rotate(0.5 711 487.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='707.3' cy='484.1' rx='56.2' ry='13.8' transform='rotate(-1 707.3 484.1)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='693.3' cy='480' rx='28.1' ry='4.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='679.7' cy='472.7' rx='56' ry='14.8' transform='rotate(-2.9 679.7 472.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='676.1' cy='469' rx='56' ry='14.8' transform='rotate(-1.2 676.1 469)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='662.1' cy='464.6' rx='28' ry='5.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='594.8' cy='461.3' rx='47.8' ry='13.3' transform='rotate(1.1 594.8 461.3)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='591.1' cy='457.7' rx='47.8' ry='13.3' transform='rotate(-0.5 591.1 457.7)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='579.2' cy='453.7' rx='23.9' ry='4.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='574.4' cy='452.3' rx='12' ry='6.4' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='574.4' cy='449.9' rx='6.4' ry='4.4' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='574.4' cy='450.7' r='2.2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='763.1' cy='392.7' rx='36.1' ry='9.4' transform='rotate(0.5 763.1 392.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='760.4' cy='390' rx='36.1' ry='9.4' transform='rotate(-2.9 760.4 390)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='751.4' cy='387.2' rx='18' ry='3.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='768.2' cy='386.2' rx='11.5' ry='6.2' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='768.2' cy='383.9' rx='6.2' ry='4.2' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='768.2' cy='384.7' r='2.2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='773.5' cy='399.8' rx='26' ry='6.8' transform='rotate(3.5 773.5 399.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='770.8' cy='397.1' rx='26' ry='6.8' transform='rotate(-2.6 770.8 397.1)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='764.3' cy='395.1' rx='13' ry='2.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='807.8' cy='389.2' rx='24.3' ry='6.4' transform='rotate(3.2 807.8 389.2)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='805.1' cy='386.5' rx='24.3' ry='6.4' transform='rotate(3.9 805.1 386.5)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='799' cy='384.6' rx='12.2' ry='2.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='801' cy='383.9' rx='10.7' ry='5.7' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='801' cy='381.8' rx='5.7' ry='3.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='801' cy='382.5' r='2' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='818.1' cy='399.7' rx='24.8' ry='6.2' transform='rotate(-1.1 818.1 399.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='815.5' cy='397' rx='24.8' ry='6.2' transform='rotate(3.4 815.5 397)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='809.3' cy='395.1' rx='12.4' ry='2.2' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='824.1' cy='394.5' rx='9.6' ry='5.1' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='824.1' cy='392.6' rx='5.1' ry='3.5' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='824.1' cy='393.2' r='1.8' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='788.9' cy='401.1' rx='25.4' ry='7.4' transform='rotate(0 788.9 401.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='786.2' cy='398.4' rx='25.4' ry='7.4' transform='rotate(1.9 786.2 398.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='779.9' cy='396.2' rx='12.7' ry='2.6' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1163.6' cy='406.3' rx='49.5' ry='14.2' transform='rotate(-1.6 1163.6 406.3)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1160.9' cy='403.6' rx='49.5' ry='14.2' transform='rotate(-2.4 1160.9 403.6)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1148.5' cy='399.3' rx='24.8' ry='5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1151.8' cy='397.9' rx='13.6' ry='7.2' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='1151.8' cy='395.2' rx='7.2' ry='5' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1151.8' cy='396.1' r='2.5' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1076.4' cy='390.6' rx='35.2' ry='10.8' transform='rotate(-2.2 1076.4 390.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1073.7' cy='387.9' rx='35.2' ry='10.8' transform='rotate(0.9 1073.7 387.9)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1064.9' cy='384.7' rx='17.6' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1073.3' cy='383.6' rx='7.9' ry='4.2' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='1073.3' cy='382' rx='4.2' ry='2.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1073.3' cy='382.5' r='1.5' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1105.7' cy='392.4' rx='29.2' ry='7.2' transform='rotate(-1.3 1105.7 392.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1103' cy='389.7' rx='29.2' ry='7.2' transform='rotate(-0.3 1103 389.7)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='1095.7' cy='387.5' rx='14.6' ry='2.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1100.3' cy='384.7' rx='39.3' ry='10.5' transform='rotate(2.8 1100.3 384.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1097.6' cy='382' rx='39.3' ry='10.5' transform='rotate(3.6 1097.6 382)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1087.7' cy='378.8' rx='19.7' ry='3.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1204.1' cy='385.5' rx='38.8' ry='10.8' transform='rotate(2.3 1204.1 385.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1201.3' cy='382.8' rx='38.8' ry='10.8' transform='rotate(-3.1 1201.3 382.8)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1191.7' cy='379.5' rx='19.4' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1080.7' cy='403.5' rx='25.3' ry='6.7' transform='rotate(-0.2 1080.7 403.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1078' cy='400.8' rx='25.3' ry='6.7' transform='rotate(-1.4 1078 400.8)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='1071.6' cy='398.7' rx='12.7' ry='2.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1082' cy='394.4' rx='28.9' ry='8' transform='rotate(0.1 1082 394.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1079.3' cy='391.7' rx='28.9' ry='8' transform='rotate(-0.2 1079.3 391.7)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='1072.1' cy='389.3' rx='14.5' ry='2.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1350.2' cy='317.8' rx='24.5' ry='7.1' transform='rotate(3.2 1350.2 317.8)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1348.3' cy='315.9' rx='24.5' ry='7.1' transform='rotate(1.2 1348.3 315.9)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1342.2' cy='313.8' rx='12.2' ry='2.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1349' cy='313.1' rx='7.8' ry='4.1' fill='%23fff7f0' opacity='0.95'/%3E%3Cellipse cx='1349' cy='311.5' rx='4.1' ry='2.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1349' cy='312.1' r='1.5' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1302.5' cy='324.7' rx='16.1' ry='4.9' transform='rotate(-2.3 1302.5 324.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1300.7' cy='322.9' rx='16.1' ry='4.9' transform='rotate(-3.5 1300.7 322.9)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1296.6' cy='321.4' rx='8.1' ry='1.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1317.5' cy='321.7' rx='26.3' ry='6.6' transform='rotate(-0.4 1317.5 321.7)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1315.7' cy='319.9' rx='26.3' ry='6.6' transform='rotate(-3.3 1315.7 319.9)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1309.1' cy='317.9' rx='13.1' ry='2.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1317.7' cy='317.2' rx='4.9' ry='2.6' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='1317.7' cy='316.2' rx='2.6' ry='1.8' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1317.7' cy='316.6' r='0.9' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1289.6' cy='326.1' rx='33.8' ry='9.7' transform='rotate(1.4 1289.6 326.1)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1287.8' cy='324.3' rx='33.8' ry='9.7' transform='rotate(2.2 1287.8 324.3)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1279.4' cy='321.4' rx='16.9' ry='3.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1279.5' cy='320.4' rx='4.9' ry='2.6' fill='%23f6d8de' opacity='0.95'/%3E%3Cellipse cx='1279.5' cy='319.4' rx='2.6' ry='1.8' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='1279.5' cy='319.8' r='0.9' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='1239.9' cy='320.2' rx='31' ry='7.9' transform='rotate(-0.5 1239.9 320.2)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1238' cy='318.4' rx='31' ry='7.9' transform='rotate(0.7 1238 318.4)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='1230.3' cy='316' rx='15.5' ry='2.7' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='1357.7' cy='319.4' rx='32.2' ry='8.6' transform='rotate(1.3 1357.7 319.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='1355.9' cy='317.6' rx='32.2' ry='8.6' transform='rotate(-0.9 1355.9 317.6)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='1347.9' cy='315' rx='16.1' ry='3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='705.9' cy='504.5' rx='36' ry='10.7' transform='rotate(2.7 705.9 504.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='701.8' cy='500.4' rx='36' ry='10.7' transform='rotate(-3.3 701.8 500.4)' fill='%234f8a5b' opacity='0.85'/%3E%3Cellipse cx='692.8' cy='497.2' rx='18' ry='3.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='555' cy='483.6' rx='44.7' ry='13.7' transform='rotate(0.9 555 483.6)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='550.9' cy='479.6' rx='44.7' ry='13.7' transform='rotate(-1.1 550.9 479.6)' fill='%2378ad63' opacity='0.85'/%3E%3Cellipse cx='539.7' cy='475.4' rx='22.3' ry='4.8' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='535.6' cy='474.1' rx='16.5' ry='8.8' fill='%23e9a7b8' opacity='0.95'/%3E%3Cellipse cx='535.6' cy='470.8' rx='8.8' ry='6.1' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='535.6' cy='471.9' r='3.1' fill='%23f2c94c' opacity='0.95'/%3E%3Cellipse cx='706.9' cy='514' rx='74.8' ry='21.3' transform='rotate(-1.3 706.9 514)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='702.9' cy='510' rx='74.8' ry='21.3' transform='rotate(-3 702.9 510)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='684.2' cy='503.6' rx='37.4' ry='7.4' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='516.1' cy='511.4' rx='42.1' ry='11.2' transform='rotate(4 516.1 511.4)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='512.1' cy='507.4' rx='42.1' ry='11.2' transform='rotate(0 512.1 507.4)' fill='%235f9a5a' opacity='0.85'/%3E%3Cellipse cx='501.6' cy='504' rx='21' ry='3.9' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='669.8' cy='489.5' rx='63.2' ry='18.6' transform='rotate(3.9 669.8 489.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='665.7' cy='485.4' rx='63.2' ry='18.6' transform='rotate(-0.8 665.7 485.4)' fill='%238dbb6c' opacity='0.85'/%3E%3Cellipse cx='649.9' cy='479.8' rx='31.6' ry='6.5' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='669.9' cy='509.5' rx='35.2' ry='9.3' transform='rotate(1.9 669.9 509.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='665.9' cy='505.5' rx='35.2' ry='9.3' transform='rotate(-2 665.9 505.5)' fill='%238dbb6c' opacity='0.85'/%3E%3Cellipse cx='657.1' cy='502.7' rx='17.6' ry='3.3' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='670.1' cy='480.5' rx='39.5' ry='11' transform='rotate(-0.1 670.1 480.5)' fill='%233d6e4c' opacity='0.35'/%3E%3Cellipse cx='666.1' cy='476.5' rx='39.5' ry='11' transform='rotate(-3.2 666.1 476.5)' fill='%236aa060' opacity='0.85'/%3E%3Cellipse cx='656.2' cy='473.2' rx='19.8' ry='3.9' fill='%23b6d68f' opacity='0.45'/%3E%3Cellipse cx='653.8' cy='472.1' rx='18.8' ry='10' fill='%23d98a9e' opacity='0.95'/%3E%3Cellipse cx='653.8' cy='468.3' rx='10' ry='6.9' fill='%23fff6f2' opacity='0.9'/%3E%3Ccircle cx='653.8' cy='469.6' r='3.5' fill='%23f2c94c' opacity='0.95'/%3E%3C/g%3E%3Cg%3E%3Cellipse cx='1215.1' cy='312' rx='13.4' ry='1.9' fill='%23fffbe8' opacity='0.85'/%3E%3Cellipse cx='1247.9' cy='473.8' rx='19.6' ry='1.6' fill='%23fffbe8' opacity='0.75'/%3E%3Cellipse cx='1265' cy='323.1' rx='11.8' ry='2.9' fill='%23fffbe8' opacity='0.88'/%3E%3Cellipse cx='1253.4' cy='318.6' rx='20.8' ry='1.8' fill='%23fffbe8' opacity='0.82'/%3E%3Cellipse cx='1387.1' cy='320.6' rx='17.1' ry='2.1' fill='%23fffbe8' opacity='0.8'/%3E%3Cellipse cx='887.3' cy='353' rx='18.1' ry='2.2' fill='%23fffbe8' opacity='0.74'/%3E%3Cellipse cx='1084.2' cy='516.6' rx='17.8' ry='2.8' fill='%23fffbe8' opacity='0.89'/%3E%3Cellipse cx='1347.2' cy='405.4' rx='8.4' ry='2.9' fill='%23fffbe8' opacity='0.8'/%3E%3Cellipse cx='1403' cy='502.3' rx='14.8' ry='2' fill='%23fffbe8' opacity='0.72'/%3E%3Cellipse cx='1452.9' cy='485.8' rx='6.4' ry='1.7' fill='%23fffbe8' opacity='0.74'/%3E%3Cellipse cx='1135' cy='274.7' rx='14.1' ry='2.5' fill='%23fffbe8' opacity='0.67'/%3E%3Cellipse cx='998.9' cy='446.9' rx='16.3' ry='2.4' fill='%23fffbe8' opacity='0.52'/%3E%3Cellipse cx='875' cy='466.2' rx='16.6' ry='2' fill='%23fffbe8' opacity='0.74'/%3E%3Cellipse cx='1238.3' cy='462.3' rx='9.3' ry='2.1' fill='%23fffbe8' opacity='0.59'/%3E%3Cellipse cx='1127.3' cy='413.9' rx='13' ry='1.8' fill='%23fffbe8' opacity='0.87'/%3E%3Cellipse cx='851.3' cy='497.3' rx='21.4' ry='1.4' fill='%23fffbe8' opacity='0.52'/%3E%3Cellipse cx='845.4' cy='305.4' rx='15.4' ry='1.8' fill='%23fffbe8' opacity='0.69'/%3E%3Cellipse cx='1445.8' cy='300.8' rx='10.9' ry='2.9' fill='%23fffbe8' opacity='0.63'/%3E%3Cellipse cx='1426' cy='329.8' rx='7.4' ry='1.9' fill='%23fffbe8' opacity='0.82'/%3E%3Cellipse cx='1490.6' cy='427.5' rx='20.9' ry='1.8' fill='%23fffbe8' opacity='0.64'/%3E%3Cellipse cx='1505.3' cy='287.7' rx='19.4' ry='2.5' fill='%23fffbe8' opacity='0.85'/%3E%3Cellipse cx='1310.6' cy='447.1' rx='19.4' ry='2.7' fill='%23fffbe8' opacity='0.71'/%3E%3C/g%3E%3C/svg%3E"); + --kit-paint-sunrise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 520' preserveAspectRatio='xMidYMid slice'%3E%3Cdefs%3E%3ClinearGradient id='bs-sky' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%231b2e41'/%3E%3Cstop offset='0.32' stop-color='%232c465a'/%3E%3Cstop offset='0.5' stop-color='%2336576a'/%3E%3Cstop offset='0.56' stop-color='%2322394c'/%3E%3Cstop offset='1' stop-color='%230f1b26'/%3E%3C/linearGradient%3E%3CradialGradient id='bs-glow' gradientUnits='userSpaceOnUse' cx='1376' cy='156' r='286'%3E%3Cstop offset='0' stop-color='%23f08a4b' stop-opacity='0.55'/%3E%3Cstop offset='0.35' stop-color='%23e0764a' stop-opacity='0.18'/%3E%3Cstop offset='1' stop-color='%237d6f9e' stop-opacity='0'/%3E%3C/radialGradient%3E%3Cfilter id='bs-paint' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.008 0.05' numOctaves='2' seed='5' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='14' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bs-water' x='-5%25' y='-5%25' width='110%25' height='110%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.005 0.09' numOctaves='2' seed='11' result='n'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='9' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3Cfilter id='bs-soft' x='-5%25' y='-5%25' width='110%25' height='110%25'%3E%3CfeGaussianBlur stdDeviation='1.1'/%3E%3C/filter%3E%3C/defs%3E%3Cg%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bs-sky)'/%3E%3Crect x='0' y='0' width='1600' height='520' fill='url(%23bs-glow)'/%3E%3C/g%3E%3Cg filter='url(%23bs-paint)'%3E%3Cellipse cx='1295.8' cy='171.6' rx='58' ry='3.8' transform='rotate(0.6 1295.8 171.6)' fill='%234a6b7a' opacity='0.12'/%3E%3Cellipse cx='620.1' cy='236.4' rx='185.8' ry='11.5' transform='rotate(1.9 620.1 236.4)' fill='%235b6f86' opacity='0.2'/%3E%3Cellipse cx='634.4' cy='205.7' rx='139.4' ry='4' transform='rotate(0.2 634.4 205.7)' fill='%235b6f86' opacity='0.21'/%3E%3Cellipse cx='1194.8' cy='242.6' rx='62.5' ry='11.3' transform='rotate(1 1194.8 242.6)' fill='%235b6f86' opacity='0.15'/%3E%3Cellipse cx='961.2' cy='62.2' rx='51.8' ry='9.1' transform='rotate(1.7 961.2 62.2)' fill='%238c8fb0' opacity='0.14'/%3E%3Cellipse cx='1569.8' cy='49.8' rx='172.3' ry='11' transform='rotate(1.8 1569.8 49.8)' fill='%235b6f86' opacity='0.16'/%3E%3Cellipse cx='1534.5' cy='111.2' rx='56.1' ry='7.6' transform='rotate(0.5 1534.5 111.2)' fill='%233f5a70' opacity='0.21'/%3E%3Cellipse cx='760.2' cy='194.1' rx='87.7' ry='11.1' transform='rotate(-0.7 760.2 194.1)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='751.2' cy='95.2' rx='120.4' ry='7.5' transform='rotate(-1.7 751.2 95.2)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='1301.4' cy='161.9' rx='204.1' ry='4.7' transform='rotate(-1.7 1301.4 161.9)' fill='%237d6f9e' opacity='0.14'/%3E%3Cellipse cx='636.6' cy='58.1' rx='74' ry='6' transform='rotate(-1.1 636.6 58.1)' fill='%233f5a70' opacity='0.22'/%3E%3Cellipse cx='334.1' cy='76.1' rx='163.5' ry='9.4' transform='rotate(2 334.1 76.1)' fill='%238c8fb0' opacity='0.17'/%3E%3Cellipse cx='635.2' cy='260' rx='80.6' ry='4.5' transform='rotate(-0.1 635.2 260)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='411.6' cy='137.4' rx='68.1' ry='8.8' transform='rotate(-0.5 411.6 137.4)' fill='%234a6b7a' opacity='0.08'/%3E%3Cellipse cx='700.8' cy='19.4' rx='120.9' ry='6.2' transform='rotate(-1.4 700.8 19.4)' fill='%233f5a70' opacity='0.18'/%3E%3Cellipse cx='850' cy='99.1' rx='161.6' ry='6.4' transform='rotate(1.6 850 99.1)' fill='%238c8fb0' opacity='0.18'/%3E%3Cellipse cx='1543.3' cy='262.8' rx='121.8' ry='9.2' transform='rotate(-1.8 1543.3 262.8)' fill='%234a6b7a' opacity='0.23'/%3E%3Cellipse cx='201.5' cy='6' rx='60.2' ry='7.4' transform='rotate(-1.9 201.5 6)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='1501.9' cy='157.7' rx='128.7' ry='8.2' transform='rotate(-0.7 1501.9 157.7)' fill='%238c8fb0' opacity='0.22'/%3E%3Cellipse cx='1573' cy='215.1' rx='115.5' ry='8' transform='rotate(-1.7 1573 215.1)' fill='%233f5a70' opacity='0.21'/%3E%3Cellipse cx='1543.3' cy='117.7' rx='201.5' ry='4' transform='rotate(-1 1543.3 117.7)' fill='%233f5a70' opacity='0.2'/%3E%3Cellipse cx='1513.8' cy='136.2' rx='190.2' ry='6.7' transform='rotate(-1.6 1513.8 136.2)' fill='%233f5a70' opacity='0.16'/%3E%3Cellipse cx='1314.6' cy='166.9' rx='76.5' ry='4.4' transform='rotate(0 1314.6 166.9)' fill='%235b6f86' opacity='0.22'/%3E%3Cellipse cx='1321.6' cy='108.6' rx='77.4' ry='8.4' transform='rotate(1 1321.6 108.6)' fill='%235b6f86' opacity='0.2'/%3E%3Cellipse cx='1270.5' cy='191.1' rx='186.8' ry='10.4' transform='rotate(-1.4 1270.5 191.1)' fill='%233f5a70' opacity='0.18'/%3E%3Cellipse cx='1192.4' cy='52.8' rx='59.4' ry='6.3' transform='rotate(1.4 1192.4 52.8)' fill='%233f5a70' opacity='0.16'/%3E%3Cellipse cx='216.8' cy='214.6' rx='190.8' ry='10' transform='rotate(-1.6 216.8 214.6)' fill='%233f5a70' opacity='0.15'/%3E%3Cellipse cx='1225' cy='263.7' rx='204.7' ry='10.1' transform='rotate(0.3 1225 263.7)' fill='%235b6f86' opacity='0.17'/%3E%3Cellipse cx='977.6' cy='83.3' rx='59.9' ry='7.8' transform='rotate(0.6 977.6 83.3)' fill='%238c8fb0' opacity='0.07'/%3E%3Cellipse cx='20.2' cy='165.7' rx='96.5' ry='6' transform='rotate(1.5 20.2 165.7)' fill='%235b6f86' opacity='0.23'/%3E%3Cellipse cx='285.8' cy='79.9' rx='127' ry='6.9' transform='rotate(1.1 285.8 79.9)' fill='%233f5a70' opacity='0.2'/%3E%3Cellipse cx='650.3' cy='135.3' rx='157.8' ry='9.5' transform='rotate(0.9 650.3 135.3)' fill='%237d6f9e' opacity='0.21'/%3E%3Cellipse cx='1256.5' cy='149.2' rx='193.4' ry='5.6' transform='rotate(0.2 1256.5 149.2)' fill='%238c8fb0' opacity='0.07'/%3E%3Cellipse cx='1317' cy='138.3' rx='203.6' ry='9.2' transform='rotate(0.8 1317 138.3)' fill='%237d6f9e' opacity='0.17'/%3E%3Cellipse cx='849.8' cy='58.4' rx='113.4' ry='6.3' transform='rotate(0 849.8 58.4)' fill='%238c8fb0' opacity='0.09'/%3E%3Cellipse cx='159' cy='182.8' rx='208.7' ry='10.1' transform='rotate(0.1 159 182.8)' fill='%237d6f9e' opacity='0.09'/%3E%3Cellipse cx='782.9' cy='256.2' rx='176.7' ry='3.9' transform='rotate(1.3 782.9 256.2)' fill='%238c8fb0' opacity='0.19'/%3E%3Cellipse cx='893.7' cy='135' rx='186.6' ry='3.6' transform='rotate(1 893.7 135)' fill='%238c8fb0' opacity='0.23'/%3E%3Cellipse cx='1090.8' cy='152.6' rx='77.3' ry='7.2' transform='rotate(-1.3 1090.8 152.6)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='113.5' cy='76.7' rx='74.4' ry='4.1' transform='rotate(1.2 113.5 76.7)' fill='%237d6f9e' opacity='0.18'/%3E%3Cellipse cx='1403.6' cy='223.2' rx='129.3' ry='10.5' transform='rotate(-1.5 1403.6 223.2)' fill='%235b6f86' opacity='0.12'/%3E%3Cellipse cx='611.4' cy='200.1' rx='208.5' ry='10.8' transform='rotate(0.5 611.4 200.1)' fill='%238c8fb0' opacity='0.14'/%3E%3Cellipse cx='78.6' cy='214.8' rx='75.4' ry='9.6' transform='rotate(0.4 78.6 214.8)' fill='%234a6b7a' opacity='0.08'/%3E%3Cellipse cx='67.7' cy='54.3' rx='132.8' ry='5.2' transform='rotate(-0.7 67.7 54.3)' fill='%234a6b7a' opacity='0.23'/%3E%3Cellipse cx='197' cy='78.2' rx='52.6' ry='11.2' transform='rotate(-1.4 197 78.2)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='37.8' cy='132.6' rx='173.6' ry='10.8' transform='rotate(1.5 37.8 132.6)' fill='%237d6f9e' opacity='0.14'/%3E%3Cellipse cx='1165.9' cy='258.2' rx='60.4' ry='9.8' transform='rotate(-1.3 1165.9 258.2)' fill='%235b6f86' opacity='0.15'/%3E%3Cellipse cx='139' cy='154.1' rx='64.1' ry='5.6' transform='rotate(-1.2 139 154.1)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='943.6' cy='236.3' rx='116.1' ry='6' transform='rotate(-1.3 943.6 236.3)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1485.4' cy='151.4' rx='190.9' ry='3.7' transform='rotate(2 1485.4 151.4)' fill='%237d6f9e' opacity='0.16'/%3E%3Cellipse cx='840.5' cy='169.7' rx='132.6' ry='7.2' transform='rotate(0.5 840.5 169.7)' fill='%235b6f86' opacity='0.11'/%3E%3Cellipse cx='447.4' cy='224.2' rx='106.4' ry='9.8' transform='rotate(-1.4 447.4 224.2)' fill='%237d6f9e' opacity='0.1'/%3E%3Cellipse cx='449.8' cy='113.1' rx='74.5' ry='7.3' transform='rotate(-1.9 449.8 113.1)' fill='%238c8fb0' opacity='0.12'/%3E%3Cellipse cx='354.6' cy='127.7' rx='125.4' ry='9.1' transform='rotate(1 354.6 127.7)' fill='%235b6f86' opacity='0.16'/%3E%3Cellipse cx='630.9' cy='262.2' rx='78.6' ry='3.9' transform='rotate(-2 630.9 262.2)' fill='%235b6f86' opacity='0.16'/%3E%3Cellipse cx='1041.7' cy='150.6' rx='94.6' ry='5.5' transform='rotate(-0.1 1041.7 150.6)' fill='%238c8fb0' opacity='0.1'/%3E%3Cellipse cx='153.3' cy='256.3' rx='93.3' ry='7.6' transform='rotate(-2 153.3 256.3)' fill='%233f5a70' opacity='0.15'/%3E%3Cellipse cx='871' cy='28.2' rx='208.5' ry='5.9' transform='rotate(0.3 871 28.2)' fill='%233f5a70' opacity='0.15'/%3E%3Cellipse cx='965.5' cy='218.6' rx='94' ry='7.6' transform='rotate(-1.7 965.5 218.6)' fill='%238c8fb0' opacity='0.23'/%3E%3Cellipse cx='850.5' cy='221.4' rx='127.2' ry='6.9' transform='rotate(0.8 850.5 221.4)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1368.1' cy='258.7' rx='67.6' ry='7.1' transform='rotate(1.6 1368.1 258.7)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='1468.1' cy='21.5' rx='199.7' ry='9.1' transform='rotate(-0.4 1468.1 21.5)' fill='%237d6f9e' opacity='0.18'/%3E%3Cellipse cx='831' cy='241.7' rx='108.2' ry='8.3' transform='rotate(0.1 831 241.7)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='408.2' cy='179.6' rx='139.5' ry='6.7' transform='rotate(0.2 408.2 179.6)' fill='%235b6f86' opacity='0.18'/%3E%3Cellipse cx='1264' cy='153.3' rx='109.2' ry='7' transform='rotate(0.3 1264 153.3)' fill='%238c8fb0' opacity='0.16'/%3E%3Cellipse cx='1467.5' cy='173.3' rx='168.6' ry='5.5' transform='rotate(-0.3 1467.5 173.3)' fill='%238c8fb0' opacity='0.11'/%3E%3Cellipse cx='228.7' cy='195.1' rx='174.5' ry='4.1' transform='rotate(-1.3 228.7 195.1)' fill='%238c8fb0' opacity='0.22'/%3E%3Cellipse cx='1170.4' cy='182.3' rx='154.3' ry='8.8' transform='rotate(-0.7 1170.4 182.3)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1583.7' cy='30.8' rx='134.2' ry='4.9' transform='rotate(-1.6 1583.7 30.8)' fill='%237d6f9e' opacity='0.2'/%3E%3Cellipse cx='549.2' cy='86.5' rx='198.1' ry='5' transform='rotate(1.1 549.2 86.5)' fill='%234a6b7a' opacity='0.13'/%3E%3Cellipse cx='1214.8' cy='69.7' rx='198.5' ry='10.2' transform='rotate(0.4 1214.8 69.7)' fill='%237d6f9e' opacity='0.12'/%3E%3Cellipse cx='1338.9' cy='249.1' rx='197.9' ry='5.5' transform='rotate(0.1 1338.9 249.1)' fill='%234a6b7a' opacity='0.2'/%3E%3Cellipse cx='206.8' cy='221.7' rx='192.8' ry='10.5' transform='rotate(1.1 206.8 221.7)' fill='%234a6b7a' opacity='0.21'/%3E%3Cellipse cx='562.3' cy='220' rx='69.1' ry='11' transform='rotate(0 562.3 220)' fill='%237d6f9e' opacity='0.16'/%3E%3Cellipse cx='776.1' cy='242' rx='140.1' ry='10.4' transform='rotate(-0.5 776.1 242)' fill='%233f5a70' opacity='0.13'/%3E%3Cellipse cx='208.6' cy='192.1' rx='195.1' ry='4.5' transform='rotate(-0.7 208.6 192.1)' fill='%237d6f9e' opacity='0.07'/%3E%3Cellipse cx='1526.2' cy='4.5' rx='209.7' ry='4.5' transform='rotate(1.3 1526.2 4.5)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='1167.9' cy='25.5' rx='125.2' ry='6.8' transform='rotate(-0.2 1167.9 25.5)' fill='%233f5a70' opacity='0.08'/%3E%3Cellipse cx='1066.6' cy='134' rx='89.6' ry='3.5' transform='rotate(-0.4 1066.6 134)' fill='%233f5a70' opacity='0.09'/%3E%3Cellipse cx='951.5' cy='64.6' rx='189.3' ry='5.5' transform='rotate(-1.9 951.5 64.6)' fill='%234a6b7a' opacity='0.08'/%3E%3Cellipse cx='841.7' cy='112.4' rx='198.5' ry='5.6' transform='rotate(-0.1 841.7 112.4)' fill='%233f5a70' opacity='0.11'/%3E%3Cellipse cx='1070.2' cy='52.3' rx='150.8' ry='9' transform='rotate(1.7 1070.2 52.3)' fill='%233f5a70' opacity='0.12'/%3E%3Cellipse cx='296.9' cy='203.4' rx='169.7' ry='11.1' transform='rotate(0.9 296.9 203.4)' fill='%234a6b7a' opacity='0.22'/%3E%3Cellipse cx='402.7' cy='232.5' rx='97' ry='11.1' transform='rotate(-1.9 402.7 232.5)' fill='%235b6f86' opacity='0.2'/%3E%3Cellipse cx='1032.2' cy='208.7' rx='114.1' ry='5.9' transform='rotate(-1.7 1032.2 208.7)' fill='%234a6b7a' opacity='0.2'/%3E%3Cellipse cx='404.9' cy='257.8' rx='144.4' ry='6.1' transform='rotate(-1.6 404.9 257.8)' fill='%234a6b7a' opacity='0.16'/%3E%3Cellipse cx='1568.2' cy='256.7' rx='139.3' ry='6.8' transform='rotate(0 1568.2 256.7)' fill='%238c8fb0' opacity='0.2'/%3E%3Cellipse cx='1436.4' cy='228.2' rx='123.6' ry='3.6' transform='rotate(1.7 1436.4 228.2)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='225' cy='161.6' rx='174.6' ry='7.6' transform='rotate(-1.3 225 161.6)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='1217.9' cy='102.2' rx='154.6' ry='9.8' transform='rotate(-0.1 1217.9 102.2)' fill='%235b6f86' opacity='0.13'/%3E%3Cellipse cx='365.5' cy='27.2' rx='172.6' ry='6' transform='rotate(0.7 365.5 27.2)' fill='%235b6f86' opacity='0.1'/%3E%3Cellipse cx='168.1' cy='140.6' rx='154.9' ry='8.8' transform='rotate(-0.9 168.1 140.6)' fill='%238c8fb0' opacity='0.1'/%3E%3Cellipse cx='1282' cy='132.4' rx='200.3' ry='5.4' transform='rotate(-1.9 1282 132.4)' fill='%237d6f9e' opacity='0.17'/%3E%3Cellipse cx='66.5' cy='129.1' rx='102' ry='9.8' transform='rotate(-1.9 66.5 129.1)' fill='%237d6f9e' opacity='0.08'/%3E%3Cellipse cx='1487.8' cy='14.9' rx='128.9' ry='4.8' transform='rotate(1.5 1487.8 14.9)' fill='%237d6f9e' opacity='0.1'/%3E%3Cellipse cx='1292.8' cy='244' rx='88.5' ry='5.4' transform='rotate(-1.6 1292.8 244)' fill='%234a6b7a' opacity='0.14'/%3E%3Cellipse cx='385.3' cy='143.6' rx='58.2' ry='10.6' transform='rotate(-0.8 385.3 143.6)' fill='%238c8fb0' opacity='0.19'/%3E%3Cellipse cx='955.7' cy='204' rx='166.4' ry='7.9' transform='rotate(0.3 955.7 204)' fill='%238c8fb0' opacity='0.19'/%3E%3Cellipse cx='128.8' cy='106.1' rx='85' ry='10.9' transform='rotate(-0.6 128.8 106.1)' fill='%234a6b7a' opacity='0.11'/%3E%3Cellipse cx='1522.1' cy='61.3' rx='154.1' ry='3.6' transform='rotate(-1.4 1522.1 61.3)' fill='%237d6f9e' opacity='0.13'/%3E%3Cellipse cx='1327.4' cy='228.1' rx='53.4' ry='10.4' transform='rotate(1.3 1327.4 228.1)' fill='%233f5a70' opacity='0.19'/%3E%3Cellipse cx='1076.3' cy='201.9' rx='132' ry='5.5' transform='rotate(1.8 1076.3 201.9)' fill='%237d6f9e' opacity='0.22'/%3E%3Cellipse cx='1554.9' cy='237.5' rx='136.7' ry='10.5' transform='rotate(-0.6 1554.9 237.5)' fill='%237d6f9e' opacity='0.07'/%3E%3Cellipse cx='684.5' cy='200.8' rx='147.7' ry='9.5' transform='rotate(-1.3 684.5 200.8)' fill='%237d6f9e' opacity='0.13'/%3E%3Cellipse cx='575' cy='259.8' rx='98.6' ry='10.1' transform='rotate(-0.6 575 259.8)' fill='%234a6b7a' opacity='0.19'/%3E%3Cellipse cx='626' cy='168.3' rx='155.5' ry='4.9' transform='rotate(0.8 626 168.3)' fill='%237d6f9e' opacity='0.23'/%3E%3Cellipse cx='328.9' cy='131.6' rx='205' ry='9.4' transform='rotate(1.9 328.9 131.6)' fill='%238c8fb0' opacity='0.11'/%3E%3Cellipse cx='571.8' cy='124.2' rx='89.4' ry='7.8' transform='rotate(0.7 571.8 124.2)' fill='%237d6f9e' opacity='0.22'/%3E%3Cellipse cx='937.4' cy='203.5' rx='91.5' ry='4.4' transform='rotate(1 937.4 203.5)' fill='%237d6f9e' opacity='0.12'/%3E%3Cellipse cx='858' cy='102.3' rx='152.9' ry='10' transform='rotate(-0.9 858 102.3)' fill='%234a6b7a' opacity='0.11'/%3E%3Cellipse cx='771.4' cy='145.2' rx='88.4' ry='5.1' transform='rotate(0 771.4 145.2)' fill='%233f5a70' opacity='0.1'/%3E%3Cellipse cx='1034.9' cy='237.3' rx='133.2' ry='6.1' transform='rotate(0.2 1034.9 237.3)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='1461.6' cy='0.5' rx='62.3' ry='10.8' transform='rotate(-0.4 1461.6 0.5)' fill='%234a6b7a' opacity='0.16'/%3E%3Cellipse cx='823.1' cy='225.3' rx='85.6' ry='6' transform='rotate(-1.6 823.1 225.3)' fill='%238c8fb0' opacity='0.13'/%3E%3Cellipse cx='865.1' cy='39.8' rx='117.5' ry='9.8' transform='rotate(-1.5 865.1 39.8)' fill='%237d6f9e' opacity='0.14'/%3E%3Cellipse cx='1287.4' cy='12.8' rx='68.9' ry='10' transform='rotate(-0.2 1287.4 12.8)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='340.7' cy='178.8' rx='127.9' ry='10.1' transform='rotate(1.1 340.7 178.8)' fill='%234a6b7a' opacity='0.22'/%3E%3Cellipse cx='704.8' cy='44.8' rx='145.7' ry='4.9' transform='rotate(0.3 704.8 44.8)' fill='%234a6b7a' opacity='0.18'/%3E%3Cellipse cx='325.3' cy='176.5' rx='106.6' ry='5.6' transform='rotate(-0.2 325.3 176.5)' fill='%238c8fb0' opacity='0.08'/%3E%3Cellipse cx='113.1' cy='81.6' rx='105.9' ry='7.6' transform='rotate(0.8 113.1 81.6)' fill='%235b6f86' opacity='0.21'/%3E%3Cellipse cx='1555.8' cy='196.6' rx='204.4' ry='10.7' transform='rotate(-1.1 1555.8 196.6)' fill='%235b6f86' opacity='0.15'/%3E%3Cellipse cx='185.7' cy='195.6' rx='74.2' ry='11.3' transform='rotate(-1.2 185.7 195.6)' fill='%233f5a70' opacity='0.22'/%3E%3Cellipse cx='1588.3' cy='217.4' rx='169.8' ry='9.6' transform='rotate(-1.2 1588.3 217.4)' fill='%234a6b7a' opacity='0.22'/%3E%3Cellipse cx='437.1' cy='166.8' rx='134' ry='6.6' transform='rotate(0.4 437.1 166.8)' fill='%237d6f9e' opacity='0.15'/%3E%3Cellipse cx='1359.1' cy='153.9' rx='116.1' ry='3.8' transform='rotate(1.7 1359.1 153.9)' fill='%235b6f86' opacity='0.23'/%3E%3Cellipse cx='1517.7' cy='145.7' rx='58.4' ry='3.8' transform='rotate(-1.6 1517.7 145.7)' fill='%233f5a70' opacity='0.23'/%3E%3Cellipse cx='303.4' cy='171.5' rx='156' ry='7' transform='rotate(0.7 303.4 171.5)' fill='%237d6f9e' opacity='0.13'/%3E%3Cellipse cx='1434.7' cy='79.5' rx='80.9' ry='8.5' transform='rotate(1.3 1434.7 79.5)' fill='%238c8fb0' opacity='0.11'/%3E%3Cellipse cx='41.2' cy='244.8' rx='190.8' ry='5.5' transform='rotate(0.3 41.2 244.8)' fill='%234a6b7a' opacity='0.21'/%3E%3Cellipse cx='290.2' cy='257.9' rx='74.1' ry='11.2' transform='rotate(1.1 290.2 257.9)' fill='%234a6b7a' opacity='0.19'/%3E%3Cellipse cx='201.6' cy='238.5' rx='99.2' ry='9.5' transform='rotate(0.7 201.6 238.5)' fill='%234a6b7a' opacity='0.19'/%3E%3Cellipse cx='815.5' cy='206' rx='109.4' ry='11' transform='rotate(-0.4 815.5 206)' fill='%237d6f9e' opacity='0.17'/%3E%3Cellipse cx='1556' cy='210.4' rx='65.4' ry='12' transform='rotate(-0.5 1556 210.4)' fill='%23a0687a' opacity='0.2'/%3E%3Cellipse cx='1539.1' cy='247.2' rx='88.5' ry='11.4' transform='rotate(0 1539.1 247.2)' fill='%23c9775a' opacity='0.1'/%3E%3Cellipse cx='1154.8' cy='247.4' rx='80.7' ry='9.8' transform='rotate(1.2 1154.8 247.4)' fill='%23c9775a' opacity='0.15'/%3E%3Cellipse cx='1567.4' cy='222.5' rx='100.5' ry='13.2' transform='rotate(0.1 1567.4 222.5)' fill='%23a0687a' opacity='0.2'/%3E%3Cellipse cx='1517.5' cy='201.3' rx='139.8' ry='11' transform='rotate(-0.5 1517.5 201.3)' fill='%23e0905e' opacity='0.17'/%3E%3Cellipse cx='1345.1' cy='121.8' rx='132.8' ry='14.9' transform='rotate(-0.4 1345.1 121.8)' fill='%23e0905e' opacity='0.19'/%3E%3Cellipse cx='1690.3' cy='212.4' rx='123.6' ry='13.5' transform='rotate(1.5 1690.3 212.4)' fill='%23a0687a' opacity='0.19'/%3E%3Cellipse cx='1397.9' cy='239' rx='123' ry='11.4' transform='rotate(-2 1397.9 239)' fill='%23e0905e' opacity='0.18'/%3E%3Cellipse cx='1340.2' cy='163.5' rx='94.4' ry='14.8' transform='rotate(0 1340.2 163.5)' fill='%23c9775a' opacity='0.13'/%3E%3Cellipse cx='1576.8' cy='120.2' rx='51.5' ry='8.5' transform='rotate(-1.4 1576.8 120.2)' fill='%23a0687a' opacity='0.19'/%3E%3Cellipse cx='1183.5' cy='218.6' rx='68.8' ry='12.1' transform='rotate(-0.2 1183.5 218.6)' fill='%23a0687a' opacity='0.18'/%3E%3Cellipse cx='1238.3' cy='175.2' rx='111.2' ry='13.3' transform='rotate(1.6 1238.3 175.2)' fill='%23e0905e' opacity='0.14'/%3E%3Cellipse cx='1124.6' cy='249.6' rx='69' ry='12.6' transform='rotate(0 1124.6 249.6)' fill='%23c9775a' opacity='0.18'/%3E%3Cellipse cx='1173.9' cy='129.2' rx='93.6' ry='8.5' transform='rotate(1 1173.9 129.2)' fill='%23c9775a' opacity='0.18'/%3E%3Cellipse cx='1554' cy='147.6' rx='51.3' ry='11.1' transform='rotate(1.6 1554 147.6)' fill='%23e0905e' opacity='0.18'/%3E%3C/g%3E%3Cg filter='url(%23bs-soft)'%3E%3Crect x='910.3' y='110.9' width='2.2' height='149.1' fill='%232b4357' opacity='0.36'/%3E%3Crect x='1245.7' y='169.4' width='1.8' height='90.6' fill='%232b4357' opacity='0.38'/%3E%3Crect x='642.3' y='169.7' width='2' height='90.3' fill='%232b4357' opacity='0.39'/%3E%3Cpath d='M642.3 175.7l78.9 14.2' stroke='%232b4357' stroke-width='1.8' opacity='0.39' fill='none'/%3E%3Crect x='399.2' y='97' width='3.1' height='163' fill='%232b4357' opacity='0.35'/%3E%3Crect x='562.8' y='186.2' width='1.6' height='73.8' fill='%232b4357' opacity='0.36'/%3E%3Crect x='229.3' y='97.7' width='2.1' height='162.3' fill='%232b4357' opacity='0.36'/%3E%3Cpath d='M229.3 103.7l46.6 8.4' stroke='%232b4357' stroke-width='1.9' opacity='0.36' fill='none'/%3E%3Cellipse cx='247.3' cy='83.7' rx='35' ry='11.4' transform='rotate(-14 247.3 83.7)' fill='%235d6f88' opacity='0.16'/%3E%3Crect x='366.9' y='93.8' width='2.7' height='166.2' fill='%232b4357' opacity='0.36'/%3E%3Cpath d='M366.9 99.8l33.5 6' stroke='%232b4357' stroke-width='2.4' opacity='0.36' fill='none'/%3E%3Crect x='1571.7' y='180.1' width='1.5' height='79.9' fill='%232b4357' opacity='0.4'/%3E%3Crect x='898.1' y='203.9' width='3.2' height='56.1' fill='%232b4357' opacity='0.44'/%3E%3Cellipse cx='916.1' cy='189.9' rx='54.2' ry='11.4' transform='rotate(-14 916.1 189.9)' fill='%235d6f88' opacity='0.21'/%3E%3Crect x='380.1' y='139.5' width='2.9' height='120.5' fill='%232b4357' opacity='0.38'/%3E%3Crect x='208.5' y='94.1' width='2.2' height='165.9' fill='%232b4357' opacity='0.27'/%3E%3Cpath d='M208.5 100.1l65.8 11.8' stroke='%232b4357' stroke-width='2' opacity='0.27' fill='none'/%3E%3Cellipse cx='226.5' cy='80.1' rx='39.2' ry='8.7' transform='rotate(-14 226.5 80.1)' fill='%235d6f88' opacity='0.17'/%3E%3Crect x='882.6' y='147.6' width='2.7' height='112.4' fill='%232b4357' opacity='0.22'/%3E%3C/g%3E%3Cg filter='url(%23bs-paint)'%3E%3Cellipse cx='16.9' cy='256.9' rx='141.1' ry='16.9' fill='%231a2a38' opacity='0.64'/%3E%3Cellipse cx='131.2' cy='257.9' rx='228.1' ry='11.4' fill='%231c2e3e' opacity='0.77'/%3E%3Cellipse cx='268.2' cy='254.8' rx='91' ry='12.7' fill='%2322374a' opacity='0.58'/%3E%3Cellipse cx='379.4' cy='257.3' rx='234' ry='9.4' fill='%231a2a38' opacity='0.77'/%3E%3Cellipse cx='457.3' cy='257.1' rx='148.7' ry='14.2' fill='%231c2e3e' opacity='0.66'/%3E%3Cellipse cx='584.8' cy='254.4' rx='102' ry='10.4' fill='%231a2a38' opacity='0.77'/%3E%3Cellipse cx='718.6' cy='259.9' rx='178.6' ry='18.3' fill='%231a2a38' opacity='0.7'/%3E%3Cellipse cx='850.5' cy='259.3' rx='176.2' ry='11.9' fill='%2322374a' opacity='0.66'/%3E%3Cellipse cx='954.8' cy='255' rx='121.9' ry='15.9' fill='%2322374a' opacity='0.68'/%3E%3Cellipse cx='1052.3' cy='256.7' rx='168.2' ry='18.2' fill='%231a2a38' opacity='0.77'/%3E%3Cellipse cx='1193.7' cy='259' rx='125.4' ry='15.2' fill='%231a2a38' opacity='0.7'/%3E%3Cellipse cx='1300.2' cy='255.6' rx='142.1' ry='9.1' fill='%2322374a' opacity='0.74'/%3E%3Cellipse cx='1393.7' cy='255.8' rx='96.1' ry='16.9' fill='%231c2e3e' opacity='0.78'/%3E%3Cellipse cx='1503.1' cy='259.9' rx='220.9' ry='17.7' fill='%231c2e3e' opacity='0.77'/%3E%3C/g%3E%3Cg filter='url(%23bs-water)'%3E%3Cellipse cx='1182.1' cy='327.7' rx='75.8' ry='2.4' transform='rotate(0.8 1182.1 327.7)' fill='%231f3a4e' opacity='0.37'/%3E%3Cellipse cx='1465.8' cy='444.9' rx='120.3' ry='5.7' transform='rotate(-0.2 1465.8 444.9)' fill='%233f7f8c' opacity='0.42'/%3E%3Cellipse cx='1305.8' cy='334' rx='54.2' ry='3' transform='rotate(1.2 1305.8 334)' fill='%231f3a4e' opacity='0.63'/%3E%3Cellipse cx='119.3' cy='372.5' rx='29.1' ry='3.3' transform='rotate(-0.9 119.3 372.5)' fill='%233f7f8c' opacity='0.44'/%3E%3Cellipse cx='29' cy='418.6' rx='47.6' ry='3.2' transform='rotate(-1.3 29 418.6)' fill='%2324405a' opacity='0.51'/%3E%3Cellipse cx='1223' cy='277.1' rx='21.1' ry='2.4' transform='rotate(1 1223 277.1)' fill='%232b4a5e' opacity='0.63'/%3E%3Cellipse cx='1340.9' cy='391.8' rx='67.9' ry='2.9' transform='rotate(-0.8 1340.9 391.8)' fill='%232b4a5e' opacity='0.73'/%3E%3Cellipse cx='1332' cy='510' rx='131.9' ry='4.5' transform='rotate(0.9 1332 510)' fill='%2324405a' opacity='0.58'/%3E%3Cellipse cx='496.9' cy='482.7' rx='56.2' ry='6.7' transform='rotate(0.2 496.9 482.7)' fill='%233f7f8c' opacity='0.73'/%3E%3Cellipse cx='1144.9' cy='274.4' rx='48.3' ry='1.2' transform='rotate(0.7 1144.9 274.4)' fill='%235c7f95' opacity='0.6'/%3E%3Cellipse cx='327.4' cy='492.3' rx='52.3' ry='6.5' transform='rotate(0.1 327.4 492.3)' fill='%233f7f8c' opacity='0.47'/%3E%3Cellipse cx='382.9' cy='461.1' rx='49.5' ry='6' transform='rotate(1.3 382.9 461.1)' fill='%235c7f95' opacity='0.67'/%3E%3Cellipse cx='990.2' cy='445.9' rx='89' ry='3' transform='rotate(1.1 990.2 445.9)' fill='%2324405a' opacity='0.51'/%3E%3Cellipse cx='1529.5' cy='329.9' rx='75.4' ry='2.3' transform='rotate(0.1 1529.5 329.9)' fill='%2324405a' opacity='0.35'/%3E%3Cellipse cx='741.5' cy='357' rx='53.5' ry='2.4' transform='rotate(-0.9 741.5 357)' fill='%2324405a' opacity='0.73'/%3E%3Cellipse cx='380.6' cy='340.5' rx='45' ry='1.7' transform='rotate(0.6 380.6 340.5)' fill='%233f7f8c' opacity='0.68'/%3E%3Cellipse cx='747.2' cy='499.7' rx='86.6' ry='6.1' transform='rotate(-0.3 747.2 499.7)' fill='%233f7f8c' opacity='0.33'/%3E%3Cellipse cx='1534.6' cy='331.6' rx='75.6' ry='2.7' transform='rotate(0.1 1534.6 331.6)' fill='%235c7f95' opacity='0.34'/%3E%3Cellipse cx='747.1' cy='287' rx='52.9' ry='2.1' transform='rotate(-1.2 747.1 287)' fill='%2324405a' opacity='0.32'/%3E%3Cellipse cx='1311.3' cy='485.5' rx='130.9' ry='7' transform='rotate(-1.1 1311.3 485.5)' fill='%231f3a4e' opacity='0.31'/%3E%3Cellipse cx='421.2' cy='370.8' rx='82.4' ry='3' transform='rotate(1 421.2 370.8)' fill='%235c7f95' opacity='0.74'/%3E%3Cellipse cx='140.4' cy='407.9' rx='110.1' ry='2.5' transform='rotate(-1.4 140.4 407.9)' fill='%235c7f95' opacity='0.7'/%3E%3Cellipse cx='1341' cy='485.5' rx='121.5' ry='5.4' transform='rotate(-1.2 1341 485.5)' fill='%233f7f8c' opacity='0.49'/%3E%3Cellipse cx='789.5' cy='484.6' rx='55.6' ry='6.2' transform='rotate(1 789.5 484.6)' fill='%232b4a5e' opacity='0.59'/%3E%3Cellipse cx='1068.8' cy='282.7' rx='19.9' ry='2.3' transform='rotate(-0.9 1068.8 282.7)' fill='%2324405a' opacity='0.43'/%3E%3Cellipse cx='222.8' cy='285.5' rx='37' ry='2.1' transform='rotate(-1.5 222.8 285.5)' fill='%231f3a4e' opacity='0.49'/%3E%3Cellipse cx='1374.6' cy='402.1' rx='68.8' ry='4.1' transform='rotate(0.3 1374.6 402.1)' fill='%231f3a4e' opacity='0.33'/%3E%3Cellipse cx='228.8' cy='516.7' rx='51.1' ry='6.7' transform='rotate(-0.8 228.8 516.7)' fill='%232b4a5e' opacity='0.32'/%3E%3Cellipse cx='912.7' cy='450.6' rx='121.1' ry='4.8' transform='rotate(0.4 912.7 450.6)' fill='%231f3a4e' opacity='0.35'/%3E%3Cellipse cx='14.2' cy='345.1' rx='31.1' ry='2.7' transform='rotate(-1.5 14.2 345.1)' fill='%231f3a4e' opacity='0.54'/%3E%3Cellipse cx='249.4' cy='335.5' rx='69.8' ry='2.3' transform='rotate(-0.9 249.4 335.5)' fill='%2324405a' opacity='0.61'/%3E%3Cellipse cx='377.8' cy='391.6' rx='87.2' ry='4.5' transform='rotate(-0.6 377.8 391.6)' fill='%2324405a' opacity='0.59'/%3E%3Cellipse cx='1431' cy='323.2' rx='36.3' ry='2.4' transform='rotate(0.7 1431 323.2)' fill='%2324405a' opacity='0.48'/%3E%3Cellipse cx='875.2' cy='324.7' rx='51.3' ry='3.6' transform='rotate(1.4 875.2 324.7)' fill='%235c7f95' opacity='0.59'/%3E%3Cellipse cx='599.3' cy='489.9' rx='80.3' ry='3.9' transform='rotate(0.1 599.3 489.9)' fill='%2324405a' opacity='0.66'/%3E%3Cellipse cx='1561.8' cy='312.8' rx='17.9' ry='2.2' transform='rotate(1 1561.8 312.8)' fill='%235c7f95' opacity='0.55'/%3E%3Cellipse cx='1114' cy='342.4' rx='62.7' ry='3.6' transform='rotate(-0.9 1114 342.4)' fill='%232b4a5e' opacity='0.6'/%3E%3Cellipse cx='122.1' cy='335.3' rx='73.6' ry='3.3' transform='rotate(-1.2 122.1 335.3)' fill='%235c7f95' opacity='0.61'/%3E%3Cellipse cx='1020.9' cy='324.1' rx='30.5' ry='2.4' transform='rotate(1.3 1020.9 324.1)' fill='%235c7f95' opacity='0.43'/%3E%3Cellipse cx='1473.2' cy='431.3' rx='53' ry='4.3' transform='rotate(0.3 1473.2 431.3)' fill='%235c7f95' opacity='0.37'/%3E%3Cellipse cx='1182.8' cy='260.6' rx='34.3' ry='2' transform='rotate(1 1182.8 260.6)' fill='%235c7f95' opacity='0.59'/%3E%3Cellipse cx='745.3' cy='490.7' rx='79.8' ry='5.4' transform='rotate(-0.2 745.3 490.7)' fill='%233f7f8c' opacity='0.43'/%3E%3Cellipse cx='1553' cy='410.7' rx='71' ry='5.2' transform='rotate(1.5 1553 410.7)' fill='%2324405a' opacity='0.47'/%3E%3Cellipse cx='228.2' cy='513.5' rx='53' ry='3.6' transform='rotate(1.1 228.2 513.5)' fill='%232b4a5e' opacity='0.53'/%3E%3Cellipse cx='1576.7' cy='357.5' rx='89.7' ry='3.1' transform='rotate(1.3 1576.7 357.5)' fill='%231f3a4e' opacity='0.7'/%3E%3Cellipse cx='564.6' cy='294.6' rx='38.1' ry='2.8' transform='rotate(0.1 564.6 294.6)' fill='%232b4a5e' opacity='0.35'/%3E%3Cellipse cx='560.8' cy='515.1' rx='108.6' ry='6.2' transform='rotate(-0.9 560.8 515.1)' fill='%235c7f95' opacity='0.31'/%3E%3Cellipse cx='786.5' cy='440.2' rx='58.9' ry='5.1' transform='rotate(0.9 786.5 440.2)' fill='%2324405a' opacity='0.72'/%3E%3Cellipse cx='435.1' cy='353' rx='80' ry='3.5' transform='rotate(0.6 435.1 353)' fill='%2324405a' opacity='0.44'/%3E%3Cellipse cx='328.9' cy='295.4' rx='45.2' ry='2.4' transform='rotate(-1.1 328.9 295.4)' fill='%231f3a4e' opacity='0.65'/%3E%3Cellipse cx='754.2' cy='397.4' rx='58' ry='2.4' transform='rotate(-1 754.2 397.4)' fill='%232b4a5e' opacity='0.52'/%3E%3Cellipse cx='105.3' cy='490.8' rx='39.8' ry='5.8' transform='rotate(1.4 105.3 490.8)' fill='%233f7f8c' opacity='0.56'/%3E%3Cellipse cx='799.8' cy='379.4' rx='55.8' ry='4.6' transform='rotate(-0.6 799.8 379.4)' fill='%232b4a5e' opacity='0.74'/%3E%3Cellipse cx='335.6' cy='275.2' rx='41' ry='2.4' transform='rotate(-1.3 335.6 275.2)' fill='%231f3a4e' opacity='0.54'/%3E%3Cellipse cx='1462.7' cy='293.5' rx='45.8' ry='2.3' transform='rotate(-1.1 1462.7 293.5)' fill='%232b4a5e' opacity='0.69'/%3E%3Cellipse cx='1356.7' cy='356.4' rx='42.6' ry='4.2' transform='rotate(-1.5 1356.7 356.4)' fill='%2324405a' opacity='0.6'/%3E%3Cellipse cx='852.8' cy='398.1' rx='86.1' ry='3.1' transform='rotate(1.2 852.8 398.1)' fill='%2324405a' opacity='0.49'/%3E%3Cellipse cx='941.4' cy='271.2' rx='13.2' ry='2.1' transform='rotate(-0.6 941.4 271.2)' fill='%233f7f8c' opacity='0.56'/%3E%3Cellipse cx='1139.9' cy='354.4' rx='57.5' ry='1.7' transform='rotate(-0.5 1139.9 354.4)' fill='%233f7f8c' opacity='0.57'/%3E%3Cellipse cx='1239.3' cy='420.3' rx='46' ry='3.8' transform='rotate(0.1 1239.3 420.3)' fill='%232b4a5e' opacity='0.71'/%3E%3Cellipse cx='88.6' cy='493.5' rx='57.9' ry='5.8' transform='rotate(0.6 88.6 493.5)' fill='%232b4a5e' opacity='0.36'/%3E%3Cellipse cx='761.5' cy='309.2' rx='18' ry='2' transform='rotate(0.2 761.5 309.2)' fill='%2324405a' opacity='0.36'/%3E%3Cellipse cx='613.9' cy='488' rx='93.3' ry='3.6' transform='rotate(-0.3 613.9 488)' fill='%233f7f8c' opacity='0.74'/%3E%3Cellipse cx='771.9' cy='344.3' rx='61.7' ry='2.4' transform='rotate(-0.2 771.9 344.3)' fill='%232b4a5e' opacity='0.46'/%3E%3Cellipse cx='879.5' cy='268.2' rx='30.1' ry='2.2' transform='rotate(-1.3 879.5 268.2)' fill='%233f7f8c' opacity='0.31'/%3E%3Cellipse cx='732.9' cy='295.3' rx='46.2' ry='1.8' transform='rotate(0.3 732.9 295.3)' fill='%232b4a5e' opacity='0.45'/%3E%3Cellipse cx='846.9' cy='411.1' rx='100.3' ry='4.7' transform='rotate(0.3 846.9 411.1)' fill='%235c7f95' opacity='0.67'/%3E%3Cellipse cx='1126.8' cy='358.7' rx='32.4' ry='4.2' transform='rotate(-1 1126.8 358.7)' fill='%231f3a4e' opacity='0.62'/%3E%3Cellipse cx='498.4' cy='490.8' rx='148.5' ry='3.2' transform='rotate(0.1 498.4 490.8)' fill='%233f7f8c' opacity='0.4'/%3E%3Cellipse cx='376.9' cy='313.3' rx='65' ry='1.6' transform='rotate(-1.5 376.9 313.3)' fill='%233f7f8c' opacity='0.57'/%3E%3Cellipse cx='347.1' cy='406.3' rx='86.3' ry='5' transform='rotate(-1.1 347.1 406.3)' fill='%235c7f95' opacity='0.54'/%3E%3Cellipse cx='690.1' cy='292.4' rx='31.7' ry='2' transform='rotate(0.1 690.1 292.4)' fill='%231f3a4e' opacity='0.54'/%3E%3Cellipse cx='451.1' cy='266.8' rx='15.3' ry='1.1' transform='rotate(0.7 451.1 266.8)' fill='%2324405a' opacity='0.38'/%3E%3Cellipse cx='1156.7' cy='307.9' rx='50.3' ry='2.9' transform='rotate(1 1156.7 307.9)' fill='%232b4a5e' opacity='0.41'/%3E%3Cellipse cx='476.9' cy='394.6' rx='64.4' ry='4.6' transform='rotate(-1.4 476.9 394.6)' fill='%233f7f8c' opacity='0.69'/%3E%3Cellipse cx='353.7' cy='477.8' rx='80.3' ry='5.3' transform='rotate(-0.6 353.7 477.8)' fill='%233f7f8c' opacity='0.41'/%3E%3Cellipse cx='682.5' cy='316.5' rx='27.7' ry='3.4' transform='rotate(-1.1 682.5 316.5)' fill='%235c7f95' opacity='0.69'/%3E%3Cellipse cx='111.3' cy='303' rx='20.8' ry='2' transform='rotate(1.1 111.3 303)' fill='%232b4a5e' opacity='0.37'/%3E%3Cellipse cx='764.9' cy='422.6' rx='92.9' ry='4.9' transform='rotate(-0.6 764.9 422.6)' fill='%231f3a4e' opacity='0.47'/%3E%3Cellipse cx='1247.7' cy='269.3' rx='48.4' ry='2.1' transform='rotate(0.5 1247.7 269.3)' fill='%235c7f95' opacity='0.39'/%3E%3Cellipse cx='649.4' cy='272.8' rx='22.2' ry='1.7' transform='rotate(0.8 649.4 272.8)' fill='%2324405a' opacity='0.59'/%3E%3Cellipse cx='1289.6' cy='321.3' rx='35.7' ry='2.8' transform='rotate(0.5 1289.6 321.3)' fill='%233f7f8c' opacity='0.41'/%3E%3Cellipse cx='994' cy='500' rx='112.4' ry='3.6' transform='rotate(-0.4 994 500)' fill='%2324405a' opacity='0.72'/%3E%3Cellipse cx='540.3' cy='313' rx='19.8' ry='2.8' transform='rotate(-1 540.3 313)' fill='%232b4a5e' opacity='0.55'/%3E%3Cellipse cx='724.6' cy='442.3' rx='109.3' ry='2.5' transform='rotate(0.1 724.6 442.3)' fill='%2324405a' opacity='0.7'/%3E%3Cellipse cx='153' cy='296.1' rx='22.3' ry='1.5' transform='rotate(-0.8 153 296.1)' fill='%235c7f95' opacity='0.46'/%3E%3Cellipse cx='108.7' cy='415.4' rx='51.1' ry='5' transform='rotate(1 108.7 415.4)' fill='%232b4a5e' opacity='0.52'/%3E%3Cellipse cx='1191.4' cy='297.1' rx='40.6' ry='1.7' transform='rotate(-0.5 1191.4 297.1)' fill='%2324405a' opacity='0.41'/%3E%3Cellipse cx='696.1' cy='446.6' rx='99.8' ry='5.9' transform='rotate(1.4 696.1 446.6)' fill='%235c7f95' opacity='0.38'/%3E%3Cellipse cx='769.6' cy='438.9' rx='102.8' ry='5.5' transform='rotate(0.5 769.6 438.9)' fill='%231f3a4e' opacity='0.35'/%3E%3Cellipse cx='340.8' cy='293.6' rx='55.5' ry='2.8' transform='rotate(1.2 340.8 293.6)' fill='%232b4a5e' opacity='0.69'/%3E%3Cellipse cx='1107.2' cy='300.5' rx='60.4' ry='2.2' transform='rotate(0.8 1107.2 300.5)' fill='%233f7f8c' opacity='0.45'/%3E%3Cellipse cx='122.7' cy='334.7' rx='68.4' ry='2.9' transform='rotate(0.3 122.7 334.7)' fill='%235c7f95' opacity='0.38'/%3E%3Cellipse cx='509.5' cy='362.7' rx='37.4' ry='2' transform='rotate(0.1 509.5 362.7)' fill='%231f3a4e' opacity='0.59'/%3E%3Cellipse cx='1596.4' cy='500.6' rx='92.7' ry='5.3' transform='rotate(0.4 1596.4 500.6)' fill='%2324405a' opacity='0.67'/%3E%3Cellipse cx='63.2' cy='400.1' rx='76.9' ry='3.3' transform='rotate(1 63.2 400.1)' fill='%235c7f95' opacity='0.52'/%3E%3Cellipse cx='502.8' cy='288.7' rx='27.9' ry='1.2' transform='rotate(-0.6 502.8 288.7)' fill='%233f7f8c' opacity='0.66'/%3E%3Cellipse cx='250.6' cy='500.2' rx='154.2' ry='3.4' transform='rotate(-0.1 250.6 500.2)' fill='%231f3a4e' opacity='0.37'/%3E%3Cellipse cx='1193.6' cy='333' rx='24.9' ry='2.3' transform='rotate(-1.3 1193.6 333)' fill='%235c7f95' opacity='0.66'/%3E%3Cellipse cx='337.2' cy='516.6' rx='79.6' ry='5.4' transform='rotate(0.7 337.2 516.6)' fill='%235c7f95' opacity='0.37'/%3E%3Cellipse cx='1279.9' cy='297.1' rx='33.1' ry='2.2' transform='rotate(0.4 1279.9 297.1)' fill='%2324405a' opacity='0.73'/%3E%3Cellipse cx='753' cy='291.2' rx='26.2' ry='1.6' transform='rotate(0 753 291.2)' fill='%2324405a' opacity='0.74'/%3E%3Cellipse cx='1534.7' cy='369.6' rx='49.6' ry='1.9' transform='rotate(1 1534.7 369.6)' fill='%2324405a' opacity='0.63'/%3E%3Cellipse cx='1069.5' cy='267.7' rx='12.8' ry='2.2' transform='rotate(1 1069.5 267.7)' fill='%235c7f95' opacity='0.36'/%3E%3Cellipse cx='42.2' cy='449.2' rx='106.3' ry='3.9' transform='rotate(-0.6 42.2 449.2)' fill='%235c7f95' opacity='0.71'/%3E%3C/g%3E%3Cg filter='url(%23bs-soft)'%3E%3C/g%3E%3Cg filter='url(%23bs-water)'%3E%3Cellipse cx='1379.2' cy='272' rx='11' ry='2.4' transform='rotate(-0.8 1379.2 272)' fill='%23f08a4b' opacity='0.85'/%3E%3Cellipse cx='1373.8' cy='281.2' rx='14.2' ry='2.5' transform='rotate(1.7 1373.8 281.2)' fill='%23f08a4b' opacity='0.83'/%3E%3Cellipse cx='1369.5' cy='290.3' rx='22.4' ry='2.6' transform='rotate(-0.7 1369.5 290.3)' fill='%23f08a4b' opacity='0.81'/%3E%3Cellipse cx='1370' cy='299.5' rx='19.4' ry='2.7' transform='rotate(-0.4 1370 299.5)' fill='%23f08a4b' opacity='0.79'/%3E%3Cellipse cx='1376.7' cy='308.7' rx='24.8' ry='2.8' transform='rotate(0.9 1376.7 308.7)' fill='%23f6a56b' opacity='0.77'/%3E%3Cellipse cx='1375' cy='317.8' rx='20.8' ry='2.9' transform='rotate(0.4 1375 317.8)' fill='%23f6a56b' opacity='0.75'/%3E%3Cellipse cx='1370.5' cy='327' rx='25' ry='3' transform='rotate(0.9 1370.5 327)' fill='%23f08a4b' opacity='0.73'/%3E%3Cellipse cx='1375.6' cy='336.2' rx='26.5' ry='3.1' transform='rotate(0.6 1375.6 336.2)' fill='%23f08a4b' opacity='0.7'/%3E%3Cellipse cx='1383.7' cy='345.3' rx='28.3' ry='3.2' transform='rotate(-0.7 1383.7 345.3)' fill='%23f08a4b' opacity='0.68'/%3E%3Cellipse cx='1385.3' cy='354.5' rx='32.7' ry='3.3' transform='rotate(0 1385.3 354.5)' fill='%23f6a56b' opacity='0.66'/%3E%3Cellipse cx='1367.8' cy='363.7' rx='29.9' ry='3.4' transform='rotate(0.2 1367.8 363.7)' fill='%23f6a56b' opacity='0.64'/%3E%3Cellipse cx='1369.5' cy='372.8' rx='34.4' ry='3.5' transform='rotate(1.4 1369.5 372.8)' fill='%23f08a4b' opacity='0.62'/%3E%3Cellipse cx='1382.2' cy='382' rx='31.1' ry='3.6' transform='rotate(0.6 1382.2 382)' fill='%23f6a56b' opacity='0.6'/%3E%3Cellipse cx='1371' cy='391.2' rx='33.2' ry='3.7' transform='rotate(-1.6 1371 391.2)' fill='%23f08a4b' opacity='0.58'/%3E%3Cellipse cx='1371.1' cy='400.3' rx='39.8' ry='3.8' transform='rotate(0.8 1371.1 400.3)' fill='%23f6a56b' opacity='0.56'/%3E%3Cellipse cx='1380.2' cy='409.5' rx='37.1' ry='3.9' transform='rotate(1.4 1380.2 409.5)' fill='%23f08a4b' opacity='0.54'/%3E%3Cellipse cx='1373.3' cy='418.7' rx='37.3' ry='4' transform='rotate(1.5 1373.3 418.7)' fill='%23f08a4b' opacity='0.52'/%3E%3Cellipse cx='1383.4' cy='427.8' rx='43.3' ry='4.1' transform='rotate(0 1383.4 427.8)' fill='%23f08a4b' opacity='0.5'/%3E%3Cellipse cx='1383.1' cy='437' rx='43.5' ry='4.2' transform='rotate(0.2 1383.1 437)' fill='%23f08a4b' opacity='0.48'/%3E%3Cellipse cx='1393.2' cy='446.2' rx='41.8' ry='4.3' transform='rotate(0.7 1393.2 446.2)' fill='%23f6a56b' opacity='0.45'/%3E%3Cellipse cx='1361.2' cy='455.3' rx='44.9' ry='4.4' transform='rotate(1.3 1361.2 455.3)' fill='%23f6a56b' opacity='0.43'/%3E%3Cellipse cx='1379.6' cy='464.5' rx='45.2' ry='4.5' transform='rotate(-0.5 1379.6 464.5)' fill='%23f6a56b' opacity='0.41'/%3E%3Cellipse cx='1390.5' cy='473.7' rx='49.4' ry='4.6' transform='rotate(1.2 1390.5 473.7)' fill='%23f08a4b' opacity='0.39'/%3E%3Cellipse cx='1393.3' cy='482.8' rx='47.5' ry='4.7' transform='rotate(1.8 1393.3 482.8)' fill='%23f08a4b' opacity='0.37'/%3E%3C/g%3E%3C/svg%3E"); + /* Pixel sprites (16×16). Monochrome glyphs are black: use them as mask-image with background: currentColor. */ + --kit-icon-grass: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%2324331a' d='M6 0h4v1h-4zM4 1h2v1h-2zM10 1h2v1h-2zM2 2h2v1h-2zM12 2h2v1h-2zM0 3h2v1h-2zM14 3h2v1h-2zM0 4h1v1h-1zM15 4h1v1h-1zM0 5h1v1h-1zM3 5h2v1h-2zM12 5h2v1h-2zM15 5h1v1h-1zM0 6h1v1h-1zM5 6h2v1h-2zM10 6h2v1h-2zM15 6h1v1h-1zM0 7h1v1h-1zM7 7h3v1h-3zM15 7h1v1h-1zM0 8h1v1h-1zM8 8h1v1h-1zM15 8h1v1h-1zM0 9h1v1h-1zM8 9h1v1h-1zM15 9h1v1h-1zM0 10h1v1h-1zM8 10h1v1h-1zM15 10h1v1h-1zM0 11h1v1h-1zM8 11h1v1h-1zM15 11h1v1h-1zM1 12h2v1h-2zM8 12h1v1h-1zM13 12h2v1h-2zM3 13h2v1h-2zM8 13h1v1h-1zM11 13h2v1h-2zM5 14h2v1h-2zM8 14h3v1h-3zM7 15h2v1h-2z'/%3E%3Cpath fill='%235da130' d='M6 1h1v1h-1zM8 1h2v1h-2zM4 2h4v1h-4zM9 2h2v1h-2zM2 3h1v1h-1zM4 3h2v1h-2zM7 3h7v1h-7zM1 4h8v1h-8zM10 4h2v1h-2zM13 4h2v1h-2zM5 5h2v1h-2zM8 5h4v1h-4zM7 6h2v1h-2z'/%3E%3Cpath fill='%2379bf45' d='M7 1h1v1h-1zM11 2h1v1h-1zM3 3h1v1h-1zM9 4h1v1h-1zM7 5h1v1h-1z'/%3E%3Cpath fill='%234a8a26' d='M8 2h1v1h-1zM6 3h1v1h-1zM12 4h1v1h-1zM9 6h1v1h-1z'/%3E%3Cpath fill='%234f8f28' d='M1 5h2v1h-2zM1 6h1v1h-1zM3 6h2v1h-2zM2 7h1v1h-1zM5 7h2v1h-2zM4 8h1v1h-1z'/%3E%3Cpath fill='%233f7a1f' d='M14 5h1v1h-1zM12 6h2v1h-2zM10 7h1v1h-1zM12 7h1v1h-1zM10 8h1v1h-1zM13 8h1v1h-1z'/%3E%3Cpath fill='%238a5a33' d='M2 6h1v1h-1zM1 7h1v1h-1zM3 7h1v1h-1zM1 8h1v1h-1zM3 8h1v1h-1zM5 8h1v1h-1zM7 8h1v1h-1zM1 9h2v1h-2zM4 9h3v1h-3zM1 10h1v1h-1zM3 10h2v1h-2zM6 10h2v1h-2zM2 11h2v1h-2zM5 11h3v1h-3zM3 12h3v1h-3zM7 12h1v1h-1zM5 13h2v1h-2zM7 14h1v1h-1z'/%3E%3Cpath fill='%237d5230' d='M14 6h1v1h-1zM11 7h1v1h-1zM14 7h1v1h-1zM12 8h1v1h-1zM14 9h1v1h-1zM10 10h1v1h-1zM12 11h1v1h-1z'/%3E%3Cpath fill='%23a0703f' d='M4 7h1v1h-1zM2 8h1v1h-1zM7 9h1v1h-1zM2 10h1v1h-1zM4 11h1v1h-1zM7 13h1v1h-1z'/%3E%3Cpath fill='%236e4526' d='M13 7h1v1h-1zM9 8h1v1h-1zM11 8h1v1h-1zM14 8h1v1h-1zM9 9h2v1h-2zM12 9h2v1h-2zM9 10h1v1h-1zM11 10h2v1h-2zM14 10h1v1h-1zM9 11h3v1h-3zM13 11h2v1h-2zM9 12h1v1h-1zM11 12h2v1h-2zM9 13h2v1h-2z'/%3E%3Cpath fill='%236b4426' d='M6 8h1v1h-1zM3 9h1v1h-1zM5 10h1v1h-1zM1 11h1v1h-1zM6 12h1v1h-1z'/%3E%3Cpath fill='%23553319' d='M11 9h1v1h-1zM13 10h1v1h-1zM10 12h1v1h-1z'/%3E%3C/svg%3E"); + --kit-icon-chest: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a1a0c' d='M1 2h14v1h-14zM1 3h1v1h-1zM14 3h1v1h-1zM1 4h1v1h-1zM14 4h1v1h-1zM1 5h1v1h-1zM14 5h1v1h-1zM1 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM14 7h1v1h-1zM1 8h6v1h-6zM9 8h6v1h-6zM1 9h1v1h-1zM14 9h1v1h-1zM1 10h1v1h-1zM14 10h1v1h-1zM1 11h1v1h-1zM14 11h1v1h-1zM1 12h1v1h-1zM14 12h1v1h-1zM1 13h1v1h-1zM14 13h1v1h-1zM1 14h14v1h-14z'/%3E%3Cpath fill='%23c48b45' d='M2 3h12v1h-12zM2 4h1v1h-1zM2 5h1v1h-1zM2 6h1v1h-1zM2 9h1v1h-1zM2 10h1v1h-1zM2 11h1v1h-1zM2 12h1v1h-1z'/%3E%3Cpath fill='%23a46a2c' d='M3 4h10v1h-10zM3 5h10v1h-10zM3 6h10v1h-10zM3 9h4v1h-4zM9 9h4v1h-4zM3 10h4v1h-4zM9 10h4v1h-4zM3 11h10v1h-10zM3 12h10v1h-10z'/%3E%3Cpath fill='%237a4a1c' d='M13 4h1v1h-1zM13 5h1v1h-1zM13 6h1v1h-1zM13 9h1v1h-1zM13 10h1v1h-1zM13 11h1v1h-1zM13 12h1v1h-1zM2 13h12v1h-12z'/%3E%3Cpath fill='%235e3612' d='M2 7h5v1h-5zM9 7h5v1h-5z'/%3E%3Cpath fill='%23e3e3e3' d='M7 7h2v1h-2zM7 8h1v1h-1zM7 9h1v1h-1z'/%3E%3Cpath fill='%239a9a9a' d='M8 8h1v1h-1zM8 9h1v1h-1z'/%3E%3Cpath fill='%234a4a4a' d='M7 10h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-pickaxe: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%230d3a3d' d='M4 1h6v1h-6zM3 2h1v1h-1zM11 2h1v1h-1zM2 3h3v1h-3zM12 3h1v1h-1zM9 4h1v1h-1zM13 4h1v1h-1zM8 5h1v1h-1zM11 5h1v1h-1zM14 5h1v1h-1zM7 6h1v1h-1zM10 6h1v1h-1zM12 6h1v1h-1zM14 6h1v1h-1zM6 7h1v1h-1zM9 7h1v1h-1zM12 7h1v1h-1zM14 7h1v1h-1zM5 8h1v1h-1zM8 8h1v1h-1zM13 8h2v1h-2zM4 9h1v1h-1zM7 9h1v1h-1zM3 10h1v1h-1zM6 10h1v1h-1zM2 11h1v1h-1zM5 11h1v1h-1zM1 12h1v1h-1zM4 12h1v1h-1zM1 13h1v1h-1z'/%3E%3Cpath fill='%23c9fbfd' d='M4 2h1v1h-1z'/%3E%3Cpath fill='%235de0e6' d='M5 2h6v1h-6zM10 3h2v1h-2zM11 4h2v1h-2zM12 5h2v1h-2zM13 6h1v1h-1zM13 7h1v1h-1z'/%3E%3Cpath fill='%232aa7b0' d='M5 3h5v1h-5zM10 4h1v1h-1z'/%3E%3Cpath fill='%238a5a33' d='M9 5h1v1h-1zM8 6h1v1h-1zM7 7h1v1h-1zM6 8h1v1h-1zM5 9h1v1h-1zM4 10h1v1h-1zM3 11h1v1h-1zM2 12h1v1h-1z'/%3E%3Cpath fill='%235e3b1f' d='M10 5h1v1h-1zM9 6h1v1h-1zM8 7h1v1h-1zM7 8h1v1h-1zM6 9h1v1h-1zM5 10h1v1h-1zM4 11h1v1h-1zM3 12h1v1h-1zM2 13h1v1h-1z'/%3E%3Cpath fill='%232a1a0c' d='M3 13h1v1h-1zM2 14h1v1h-1z'/%3E%3C/svg%3E"); + --kit-icon-map: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%234a3a22' d='M1 1h14v1h-14zM1 2h1v1h-1zM14 2h1v1h-1zM1 3h1v1h-1zM14 3h1v1h-1zM1 4h1v1h-1zM14 4h1v1h-1zM1 5h1v1h-1zM14 5h1v1h-1zM1 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM14 7h1v1h-1zM1 8h1v1h-1zM14 8h1v1h-1zM1 9h1v1h-1zM14 9h1v1h-1zM1 10h1v1h-1zM14 10h1v1h-1zM1 11h1v1h-1zM14 11h1v1h-1zM1 12h1v1h-1zM14 12h1v1h-1zM1 13h1v1h-1zM14 13h1v1h-1zM1 14h14v1h-14z'/%3E%3Cpath fill='%23d9c690' d='M2 2h12v1h-12zM2 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM2 5h1v1h-1zM13 5h1v1h-1zM2 6h1v1h-1zM13 6h1v1h-1zM2 7h1v1h-1zM13 7h1v1h-1zM2 8h1v1h-1zM13 8h1v1h-1zM2 9h1v1h-1zM13 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM2 12h1v1h-1zM13 12h1v1h-1zM2 13h12v1h-12z'/%3E%3Cpath fill='%23efe3bd' d='M3 3h2v1h-2zM8 3h2v1h-2zM3 4h1v1h-1zM8 4h2v1h-2zM3 5h1v1h-1zM7 5h2v1h-2zM12 5h1v1h-1zM3 6h2v1h-2zM6 6h2v1h-2zM11 6h1v1h-1zM3 7h3v1h-3zM9 7h2v1h-2zM3 8h2v1h-2zM9 8h1v1h-1zM3 9h1v1h-1zM8 9h2v1h-2zM12 9h1v1h-1zM3 10h1v1h-1zM6 10h4v1h-4zM11 10h2v1h-2zM5 11h2v1h-2zM8 11h1v1h-1zM12 11h1v1h-1zM5 12h2v1h-2zM9 12h1v1h-1zM11 12h2v1h-2z'/%3E%3Cpath fill='%236aa84f' d='M5 3h3v1h-3zM4 4h2v1h-2zM7 4h1v1h-1zM4 5h3v1h-3zM5 6h1v1h-1zM12 6h1v1h-1zM11 7h2v1h-2zM10 8h1v1h-1zM12 8h1v1h-1zM10 9h2v1h-2zM3 11h2v1h-2zM7 11h1v1h-1zM4 12h1v1h-1zM7 12h2v1h-2z'/%3E%3Cpath fill='%236aa6d8' d='M10 3h3v1h-3zM10 4h1v1h-1zM12 4h1v1h-1zM9 5h3v1h-3zM8 6h3v1h-3zM6 7h3v1h-3zM5 8h2v1h-2zM8 8h1v1h-1zM4 9h4v1h-4zM4 10h2v1h-2z'/%3E%3Cpath fill='%234f8a3a' d='M6 4h1v1h-1zM11 8h1v1h-1zM3 12h1v1h-1z'/%3E%3Cpath fill='%233e6e8e' d='M11 4h1v1h-1zM7 8h1v1h-1z'/%3E%3Cpath fill='%23c0392b' d='M10 10h1v1h-1zM9 11h3v1h-3zM10 12h1v1h-1z'/%3E%3C/svg%3E"); + --kit-icon-book-quill: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a1a12' d='M12 0h2v1h-2zM11 1h1v1h-1zM14 1h1v1h-1zM10 2h1v1h-1zM14 2h1v1h-1zM9 3h1v1h-1zM13 3h1v1h-1zM2 4h7v1h-7zM12 4h1v1h-1zM1 5h1v1h-1zM11 5h2v1h-2zM1 6h1v1h-1zM7 6h1v1h-1zM10 6h1v1h-1zM12 6h1v1h-1zM1 7h1v1h-1zM7 7h1v1h-1zM9 7h2v1h-2zM13 7h1v1h-1zM1 8h1v1h-1zM7 8h1v1h-1zM13 8h1v1h-1zM1 9h1v1h-1zM13 9h1v1h-1zM1 10h1v1h-1zM13 10h1v1h-1zM1 11h1v1h-1zM13 11h1v1h-1zM1 12h1v1h-1zM13 12h1v1h-1zM1 13h1v1h-1zM13 13h1v1h-1zM2 14h11v1h-11z'/%3E%3Cpath fill='%23ffffff' d='M12 1h2v1h-2zM11 2h2v1h-2zM10 3h2v1h-2zM9 4h2v1h-2zM8 5h2v1h-2zM8 6h1v1h-1z'/%3E%3Cpath fill='%23c9c9c9' d='M13 2h1v1h-1zM12 3h1v1h-1zM11 4h1v1h-1zM10 5h1v1h-1zM9 6h1v1h-1zM8 7h1v1h-1z'/%3E%3Cpath fill='%238b4a2b' d='M2 5h6v1h-6zM2 6h1v1h-1zM2 7h1v1h-1zM12 7h1v1h-1zM2 8h1v1h-1zM12 8h1v1h-1zM2 9h1v1h-1zM12 9h1v1h-1zM2 10h1v1h-1zM12 10h1v1h-1zM2 11h1v1h-1zM12 11h1v1h-1zM2 12h1v1h-1zM12 12h1v1h-1z'/%3E%3Cpath fill='%23f4ecd6' d='M3 6h4v1h-4zM3 7h1v1h-1zM6 7h1v1h-1zM11 7h1v1h-1zM3 8h4v1h-4zM9 8h2v1h-2zM3 9h1v1h-1zM8 9h3v1h-3zM3 10h8v1h-8zM3 11h1v1h-1zM10 11h1v1h-1zM3 12h8v1h-8z'/%3E%3Cpath fill='%233a3a3a' d='M11 6h1v1h-1zM8 8h1v1h-1z'/%3E%3Cpath fill='%23d8cba7' d='M4 7h2v1h-2zM11 8h1v1h-1zM4 9h4v1h-4zM11 9h1v1h-1zM11 10h1v1h-1zM4 11h6v1h-6zM11 11h1v1h-1zM11 12h1v1h-1z'/%3E%3Cpath fill='%236a3520' d='M2 13h11v1h-11z'/%3E%3C/svg%3E"); + --kit-icon-emerald: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%2306401d' d='M7 1h2v1h-2zM6 2h1v1h-1zM9 2h1v1h-1zM5 3h1v1h-1zM10 3h1v1h-1zM4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1zM3 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM4 10h1v1h-1zM11 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM5 12h1v1h-1zM10 12h1v1h-1zM6 13h1v1h-1zM9 13h1v1h-1zM7 14h2v1h-2z'/%3E%3Cpath fill='%23b8ffcb' d='M7 2h2v1h-2zM6 3h1v1h-1zM5 4h1v1h-1zM4 6h1v1h-1z'/%3E%3Cpath fill='%2341f08a' d='M7 3h1v1h-1zM6 4h1v1h-1zM5 5h1v1h-1zM5 6h1v1h-1zM4 7h1v1h-1zM4 8h1v1h-1z'/%3E%3Cpath fill='%2317dd62' d='M8 3h1v1h-1zM7 4h2v1h-2zM6 5h3v1h-3zM6 6h5v1h-5zM5 7h5v1h-5zM5 8h4v1h-4zM4 9h4v1h-4zM5 10h3v1h-3zM5 11h2v1h-2zM6 12h1v1h-1z'/%3E%3Cpath fill='%230e9f45' d='M9 3h1v1h-1zM9 4h2v1h-2zM9 5h2v1h-2zM11 6h1v1h-1zM10 7h2v1h-2zM9 8h3v1h-3zM8 9h4v1h-4zM8 10h2v1h-2zM7 11h3v1h-3zM7 12h2v1h-2zM7 13h1v1h-1z'/%3E%3Cpath fill='%230a7a34' d='M10 10h1v1h-1zM10 11h1v1h-1zM9 12h1v1h-1zM8 13h1v1h-1z'/%3E%3C/svg%3E"); + --kit-icon-diamond: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%230b3b40' d='M4 2h8v1h-8zM3 3h1v1h-1zM12 3h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM1 5h14v1h-14zM1 6h1v1h-1zM14 6h1v1h-1zM2 7h1v1h-1zM13 7h1v1h-1zM3 8h1v1h-1zM13 8h1v1h-1zM3 9h2v1h-2zM12 9h1v1h-1zM4 10h2v1h-2zM12 10h1v1h-1zM5 11h2v1h-2zM11 11h1v1h-1zM6 12h2v1h-2zM10 12h1v1h-1zM7 13h3v1h-3zM8 14h1v1h-1z'/%3E%3Cpath fill='%23ffffff' d='M4 3h1v1h-1zM3 4h1v1h-1z'/%3E%3Cpath fill='%23b8fbff' d='M5 3h3v1h-3zM4 4h2v1h-2zM2 6h2v1h-2zM3 7h1v1h-1zM4 8h1v1h-1z'/%3E%3Cpath fill='%235de0e6' d='M8 3h3v1h-3zM6 4h6v1h-6zM4 6h7v1h-7zM4 7h7v1h-7zM5 8h6v1h-6zM5 9h5v1h-5zM6 10h4v1h-4zM7 11h2v1h-2zM8 12h1v1h-1z'/%3E%3Cpath fill='%232aa7b0' d='M11 3h1v1h-1zM12 4h1v1h-1zM11 6h2v1h-2zM11 7h1v1h-1zM11 8h1v1h-1zM10 9h1v1h-1zM10 10h1v1h-1zM9 11h1v1h-1zM9 12h1v1h-1z'/%3E%3Cpath fill='%231b7d86' d='M13 6h1v1h-1zM12 7h1v1h-1zM12 8h1v1h-1zM11 9h1v1h-1zM11 10h1v1h-1zM10 11h1v1h-1z'/%3E%3C/svg%3E"); + --kit-icon-compass: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%231e1e22' d='M5 1h6v1h-6zM4 2h1v1h-1zM11 2h1v1h-1zM3 3h1v1h-1zM12 3h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM2 5h1v1h-1zM13 5h1v1h-1zM2 6h1v1h-1zM13 6h1v1h-1zM2 7h1v1h-1zM13 7h1v1h-1zM2 8h1v1h-1zM13 8h1v1h-1zM2 9h1v1h-1zM13 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM3 12h1v1h-1zM12 12h1v1h-1zM4 13h1v1h-1zM11 13h1v1h-1zM5 14h6v1h-6z'/%3E%3Cpath fill='%23c6c6c6' d='M5 2h6v1h-6zM4 3h1v1h-1zM11 3h1v1h-1zM3 4h1v1h-1zM12 4h1v1h-1zM3 5h1v1h-1zM12 5h1v1h-1zM3 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM3 10h1v1h-1zM12 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM5 13h6v1h-6z'/%3E%3Cpath fill='%238b8b8b' d='M5 3h6v1h-6zM4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1zM4 6h1v1h-1zM11 6h1v1h-1zM4 7h1v1h-1zM11 7h1v1h-1zM4 8h1v1h-1zM11 8h1v1h-1zM4 9h1v1h-1zM11 9h1v1h-1zM4 10h1v1h-1zM11 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM5 12h6v1h-6z'/%3E%3Cpath fill='%235b6b7c' d='M5 4h1v1h-1zM7 4h1v1h-1zM9 4h2v1h-2zM6 5h3v1h-3zM5 6h1v1h-1zM7 6h1v1h-1zM5 7h2v1h-2zM10 7h1v1h-1zM6 8h1v1h-1zM10 8h1v1h-1zM5 9h1v1h-1zM8 9h1v1h-1zM10 9h1v1h-1zM7 10h1v1h-1zM9 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM9 11h2v1h-2z'/%3E%3Cpath fill='%236f8293' d='M6 4h1v1h-1zM8 4h1v1h-1zM5 5h1v1h-1zM9 5h1v1h-1zM6 6h1v1h-1zM8 6h1v1h-1zM7 7h1v1h-1zM5 8h1v1h-1zM9 8h1v1h-1zM9 9h1v1h-1zM8 10h1v1h-1zM10 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1z'/%3E%3Cpath fill='%23ff6a5a' d='M10 5h1v1h-1z'/%3E%3Cpath fill='%23d23b3b' d='M9 6h2v1h-2zM8 7h2v1h-2z'/%3E%3Cpath fill='%23dcdcdc' d='M7 8h1v1h-1zM6 9h1v1h-1zM5 10h1v1h-1z'/%3E%3Cpath fill='%239a9a9a' d='M8 8h1v1h-1zM7 9h1v1h-1zM6 10h1v1h-1z'/%3E%3C/svg%3E"); + --kit-icon-torch: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a1a0c' d='M7 1h2v1h-2zM6 2h1v1h-1zM9 2h1v1h-1zM5 3h1v1h-1zM10 3h1v1h-1zM5 4h1v1h-1zM10 4h1v1h-1zM5 5h1v1h-1zM10 5h1v1h-1zM6 6h1v1h-1zM9 6h1v1h-1zM6 7h1v1h-1zM9 7h1v1h-1zM6 8h1v1h-1zM9 8h1v1h-1zM6 9h1v1h-1zM9 9h1v1h-1zM6 10h1v1h-1zM9 10h1v1h-1zM6 11h1v1h-1zM9 11h1v1h-1zM6 12h1v1h-1zM9 12h1v1h-1zM6 13h1v1h-1zM9 13h1v1h-1zM6 14h4v1h-4z'/%3E%3Cpath fill='%23fff6b0' d='M7 2h2v1h-2zM6 3h1v1h-1zM9 3h1v1h-1zM9 4h1v1h-1z'/%3E%3Cpath fill='%23ffd84a' d='M7 3h2v1h-2zM6 4h1v1h-1z'/%3E%3Cpath fill='%23f08a2b' d='M7 4h2v1h-2zM6 5h1v1h-1zM9 5h1v1h-1z'/%3E%3Cpath fill='%23d2501b' d='M7 5h2v1h-2z'/%3E%3Cpath fill='%23b07a3f' d='M7 6h1v1h-1zM7 7h1v1h-1zM7 8h1v1h-1zM7 9h1v1h-1zM7 10h1v1h-1zM7 11h1v1h-1zM7 12h1v1h-1zM7 13h1v1h-1z'/%3E%3Cpath fill='%236b4a26' d='M8 6h1v1h-1zM8 7h1v1h-1zM8 8h1v1h-1zM8 9h1v1h-1zM8 10h1v1h-1zM8 11h1v1h-1zM8 12h1v1h-1zM8 13h1v1h-1z'/%3E%3C/svg%3E"); + --kit-icon-tnt: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%232a0606' d='M0 0h16v1h-16zM0 1h1v1h-1zM15 1h1v1h-1zM0 2h1v1h-1zM15 2h1v1h-1zM0 3h1v1h-1zM15 3h1v1h-1zM0 4h1v1h-1zM15 4h1v1h-1zM0 5h1v1h-1zM15 5h1v1h-1zM0 6h1v1h-1zM15 6h1v1h-1zM0 7h1v1h-1zM15 7h1v1h-1zM0 8h1v1h-1zM15 8h1v1h-1zM0 9h1v1h-1zM15 9h1v1h-1zM0 10h1v1h-1zM15 10h1v1h-1zM0 11h1v1h-1zM15 11h1v1h-1zM0 12h1v1h-1zM15 12h1v1h-1zM0 13h1v1h-1zM15 13h1v1h-1zM0 14h1v1h-1zM15 14h1v1h-1zM0 15h16v1h-16z'/%3E%3Cpath fill='%23d23b3b' d='M1 1h1v1h-1zM3 1h1v1h-1zM5 1h1v1h-1zM7 1h1v1h-1zM9 1h1v1h-1zM11 1h1v1h-1zM13 1h1v1h-1zM1 2h1v1h-1zM3 2h1v1h-1zM5 2h1v1h-1zM7 2h1v1h-1zM9 2h1v1h-1zM11 2h1v1h-1zM13 2h1v1h-1zM1 3h1v1h-1zM3 3h1v1h-1zM5 3h1v1h-1zM7 3h1v1h-1zM9 3h1v1h-1zM11 3h1v1h-1zM13 3h1v1h-1zM1 11h1v1h-1zM3 11h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1zM1 12h1v1h-1zM3 12h1v1h-1zM5 12h1v1h-1zM7 12h1v1h-1zM9 12h1v1h-1zM11 12h1v1h-1zM13 12h1v1h-1zM1 13h1v1h-1zM3 13h1v1h-1zM5 13h1v1h-1zM7 13h1v1h-1zM9 13h1v1h-1zM11 13h1v1h-1zM13 13h1v1h-1zM1 14h1v1h-1zM3 14h1v1h-1zM5 14h1v1h-1zM7 14h1v1h-1zM9 14h1v1h-1zM11 14h1v1h-1zM13 14h1v1h-1z'/%3E%3Cpath fill='%23a62626' d='M2 1h1v1h-1zM4 1h1v1h-1zM6 1h1v1h-1zM8 1h1v1h-1zM10 1h1v1h-1zM12 1h1v1h-1zM14 1h1v1h-1zM2 2h1v1h-1zM4 2h1v1h-1zM6 2h1v1h-1zM8 2h1v1h-1zM10 2h1v1h-1zM12 2h1v1h-1zM14 2h1v1h-1zM2 3h1v1h-1zM4 3h1v1h-1zM6 3h1v1h-1zM8 3h1v1h-1zM10 3h1v1h-1zM12 3h1v1h-1zM14 3h1v1h-1zM2 11h1v1h-1zM4 11h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1zM2 12h1v1h-1zM4 12h1v1h-1zM6 12h1v1h-1zM8 12h1v1h-1zM10 12h1v1h-1zM12 12h1v1h-1zM14 12h1v1h-1zM2 13h1v1h-1zM4 13h1v1h-1zM6 13h1v1h-1zM8 13h1v1h-1zM10 13h1v1h-1zM12 13h1v1h-1zM14 13h1v1h-1zM2 14h1v1h-1zM4 14h1v1h-1zM6 14h1v1h-1zM8 14h1v1h-1zM10 14h1v1h-1zM12 14h1v1h-1zM14 14h1v1h-1z'/%3E%3Cpath fill='%23f4efe6' d='M1 4h14v1h-14zM1 5h1v1h-1zM5 5h1v1h-1zM7 5h2v1h-2zM10 5h1v1h-1zM14 5h1v1h-1zM1 6h2v1h-2zM4 6h2v1h-2zM8 6h1v1h-1zM10 6h2v1h-2zM13 6h2v1h-2zM1 7h2v1h-2zM4 7h2v1h-2zM7 7h1v1h-1zM10 7h2v1h-2zM13 7h2v1h-2zM1 8h2v1h-2zM4 8h2v1h-2zM7 8h2v1h-2zM10 8h2v1h-2zM13 8h2v1h-2zM1 9h2v1h-2zM4 9h2v1h-2zM7 9h2v1h-2zM10 9h2v1h-2zM13 9h2v1h-2z'/%3E%3Cpath fill='%231a1a1a' d='M2 5h3v1h-3zM6 5h1v1h-1zM9 5h1v1h-1zM11 5h3v1h-3zM3 6h1v1h-1zM6 6h2v1h-2zM9 6h1v1h-1zM12 6h1v1h-1zM3 7h1v1h-1zM6 7h1v1h-1zM8 7h2v1h-2zM12 7h1v1h-1zM3 8h1v1h-1zM6 8h1v1h-1zM9 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM6 9h1v1h-1zM9 9h1v1h-1zM12 9h1v1h-1z'/%3E%3Cpath fill='%23bdb5a8' d='M1 10h14v1h-14z'/%3E%3C/svg%3E"); + --kit-icon-paper: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%234a4a40' d='M3 1h9v1h-9zM3 2h1v1h-1zM12 2h1v1h-1zM3 3h1v1h-1zM13 3h1v1h-1zM3 4h1v1h-1zM13 4h1v1h-1zM3 5h1v1h-1zM13 5h1v1h-1zM3 6h1v1h-1zM13 6h1v1h-1zM3 7h1v1h-1zM13 7h1v1h-1zM3 8h1v1h-1zM13 8h1v1h-1zM3 9h1v1h-1zM13 9h1v1h-1zM3 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM13 11h1v1h-1zM3 12h1v1h-1zM13 12h1v1h-1zM3 13h11v1h-11z'/%3E%3Cpath fill='%23f7f4ea' d='M4 2h8v1h-8zM4 3h9v1h-9zM4 4h1v1h-1zM11 4h2v1h-2zM4 5h8v1h-8zM4 6h1v1h-1zM10 6h3v1h-3zM4 7h8v1h-8zM4 8h1v1h-1zM12 8h1v1h-1zM4 9h8v1h-8zM4 10h1v1h-1zM9 10h3v1h-3zM4 11h8v1h-8z'/%3E%3Cpath fill='%239aa3ab' d='M5 4h6v1h-6zM5 6h5v1h-5zM5 8h7v1h-7zM5 10h4v1h-4z'/%3E%3Cpath fill='%23d8d2bf' d='M12 5h1v1h-1zM12 7h1v1h-1zM12 9h1v1h-1zM12 10h1v1h-1zM12 11h1v1h-1zM4 12h9v1h-9z'/%3E%3C/svg%3E"); + --kit-icon-question: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 1h6v1h-6zM4 2h8v1h-8zM3 3h3v1h-3zM10 3h3v1h-3zM3 4h3v1h-3zM10 4h3v1h-3zM10 5h3v1h-3zM9 6h3v1h-3zM8 7h3v1h-3zM7 8h3v1h-3zM7 9h3v1h-3zM7 10h3v1h-3zM7 12h3v1h-3zM7 13h3v1h-3z'/%3E%3C/svg%3E"); + --kit-icon-bug: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%233a2a30' d='M4 1h1v1h-1zM11 1h1v1h-1zM5 2h1v1h-1zM10 2h1v1h-1zM2 4h1v1h-1zM13 4h1v1h-1zM3 5h1v1h-1zM12 5h1v1h-1zM1 7h2v1h-2zM13 7h2v1h-2zM1 9h2v1h-2zM13 9h2v1h-2zM2 11h1v1h-1zM13 11h1v1h-1z'/%3E%3Cpath fill='%232a1018' d='M6 3h4v1h-4zM5 4h1v1h-1zM7 4h2v1h-2zM10 4h1v1h-1zM4 5h8v1h-8zM4 6h1v1h-1zM11 6h1v1h-1zM3 7h1v1h-1zM12 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM3 10h1v1h-1zM12 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM5 13h6v1h-6z'/%3E%3Cpath fill='%23ff5a5a' d='M6 4h1v1h-1zM9 4h1v1h-1z'/%3E%3Cpath fill='%23c2577a' d='M5 6h2v1h-2zM8 6h3v1h-3zM4 7h3v1h-3zM8 7h4v1h-4zM4 8h3v1h-3zM8 8h4v1h-4zM4 9h3v1h-3zM8 9h4v1h-4zM4 10h3v1h-3zM8 10h4v1h-4zM4 11h3v1h-3zM8 11h4v1h-4zM5 12h2v1h-2zM8 12h3v1h-3z'/%3E%3Cpath fill='%238f3a57' d='M7 6h1v1h-1zM7 7h1v1h-1zM7 8h1v1h-1zM7 9h1v1h-1zM7 10h1v1h-1zM7 11h1v1h-1zM7 12h1v1h-1z'/%3E%3C/svg%3E"); + --kit-icon-potion: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%231c1630' d='M6 1h4v1h-4zM6 2h1v1h-1zM9 2h1v1h-1zM7 3h2v1h-2zM6 4h1v1h-1zM9 4h1v1h-1zM6 5h1v1h-1zM9 5h1v1h-1zM5 6h1v1h-1zM10 6h1v1h-1zM4 7h1v1h-1zM11 7h1v1h-1zM3 8h1v1h-1zM12 8h1v1h-1zM3 9h1v1h-1zM12 9h1v1h-1zM3 10h1v1h-1zM12 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM3 12h1v1h-1zM12 12h1v1h-1zM4 13h1v1h-1zM11 13h1v1h-1zM5 14h6v1h-6z'/%3E%3Cpath fill='%238a5a33' d='M7 2h2v1h-2z'/%3E%3Cpath fill='%23d8e6ee' d='M7 4h2v1h-2zM7 5h1v1h-1zM6 6h3v1h-3zM5 7h1v1h-1zM10 7h1v1h-1zM4 8h1v1h-1zM11 8h1v1h-1z'/%3E%3Cpath fill='%23ffffff' d='M8 5h1v1h-1zM9 6h1v1h-1zM6 9h1v1h-1zM5 10h1v1h-1z'/%3E%3Cpath fill='%23b493ff' d='M6 7h4v1h-4zM5 8h1v1h-1zM4 9h1v1h-1z'/%3E%3Cpath fill='%238e5cf6' d='M6 8h5v1h-5zM5 9h1v1h-1zM7 9h5v1h-5zM4 10h1v1h-1zM6 10h4v1h-4zM4 11h6v1h-6zM4 12h5v1h-5z'/%3E%3Cpath fill='%236a3fd0' d='M10 10h2v1h-2zM10 11h2v1h-2zM9 12h3v1h-3zM5 13h6v1h-6z'/%3E%3C/svg%3E"); + --kit-icon-quote: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 3h4v1h-4zM10 3h4v1h-4zM2 4h4v1h-4zM10 4h4v1h-4zM2 5h4v1h-4zM10 5h4v1h-4zM2 6h4v1h-4zM10 6h4v1h-4zM4 7h2v1h-2zM12 7h2v1h-2zM3 8h2v1h-2zM11 8h2v1h-2zM2 9h2v1h-2zM10 9h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-sun: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%239a5a12' d='M7 0h2v1h-2zM2 2h1v1h-1zM13 2h1v1h-1zM5 4h6v1h-6zM4 5h1v1h-1zM11 5h1v1h-1zM4 6h1v1h-1zM11 6h1v1h-1zM0 7h1v1h-1zM4 7h1v1h-1zM11 7h1v1h-1zM15 7h1v1h-1zM0 8h1v1h-1zM4 8h1v1h-1zM11 8h1v1h-1zM15 8h1v1h-1zM4 9h1v1h-1zM11 9h1v1h-1zM4 10h1v1h-1zM11 10h1v1h-1zM5 11h6v1h-6zM2 13h1v1h-1zM13 13h1v1h-1zM7 15h2v1h-2z'/%3E%3Cpath fill='%23ffd84a' d='M7 1h2v1h-2zM7 2h2v1h-2zM3 3h1v1h-1zM12 3h1v1h-1zM5 5h6v1h-6zM5 6h1v1h-1zM7 6h3v1h-3zM1 7h2v1h-2zM5 7h5v1h-5zM13 7h2v1h-2zM1 8h2v1h-2zM5 8h5v1h-5zM13 8h2v1h-2zM5 9h4v1h-4zM5 10h1v1h-1zM3 12h1v1h-1zM12 12h1v1h-1zM7 13h2v1h-2zM7 14h2v1h-2z'/%3E%3Cpath fill='%23fff6c4' d='M6 6h1v1h-1z'/%3E%3Cpath fill='%23f2a52e' d='M10 6h1v1h-1zM10 7h1v1h-1zM10 8h1v1h-1zM9 9h2v1h-2zM6 10h5v1h-5z'/%3E%3C/svg%3E"); + --kit-icon-moon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%233a3f6b' d='M5 1h2v1h-2zM3 2h2v1h-2zM6 2h1v1h-1zM2 3h1v1h-1zM6 3h1v1h-1zM2 4h1v1h-1zM6 4h1v1h-1zM1 5h1v1h-1zM6 5h1v1h-1zM1 6h1v1h-1zM6 6h1v1h-1zM1 7h1v1h-1zM7 7h1v1h-1zM1 8h1v1h-1zM8 8h1v1h-1zM1 9h1v1h-1zM9 9h5v1h-5zM1 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM2 12h1v1h-1zM12 12h1v1h-1zM3 13h2v1h-2zM10 13h2v1h-2zM5 14h5v1h-5z'/%3E%3Cpath fill='%23f2c230' d='M13 1h1v1h-1zM12 4h1v1h-1z'/%3E%3Cpath fill='%23aab4e6' d='M5 2h1v1h-1zM5 3h1v1h-1zM5 4h1v1h-1zM5 5h1v1h-1zM6 7h1v1h-1zM7 8h1v1h-1zM8 9h1v1h-1zM10 10h3v1h-3z'/%3E%3Cpath fill='%23e6ecff' d='M3 3h2v1h-2zM3 4h2v1h-2zM2 5h3v1h-3zM2 6h4v1h-4zM2 7h4v1h-4zM2 8h5v1h-5zM2 9h6v1h-6zM2 10h8v1h-8zM3 11h10v1h-10zM3 12h9v1h-9zM5 13h5v1h-5z'/%3E%3C/svg%3E"); + --kit-icon-clock: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%234a3608' d='M5 1h6v1h-6zM4 2h1v1h-1zM12 2h1v1h-1zM3 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM14 4h1v1h-1zM2 5h1v1h-1zM14 5h1v1h-1zM2 6h1v1h-1zM14 6h1v1h-1zM2 7h1v1h-1zM14 7h1v1h-1zM2 8h1v1h-1zM14 8h1v1h-1zM2 9h1v1h-1zM14 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM12 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM5 13h6v1h-6z'/%3E%3Cpath fill='%23f2c230' d='M5 2h6v1h-6zM4 3h1v1h-1zM11 3h1v1h-1zM3 4h1v1h-1zM12 4h1v1h-1zM3 5h1v1h-1zM3 6h1v1h-1zM3 7h1v1h-1zM3 8h1v1h-1zM3 9h1v1h-1zM3 10h1v1h-1z'/%3E%3Cpath fill='%23c99a16' d='M11 2h1v1h-1zM12 3h1v1h-1zM13 4h1v1h-1zM13 5h1v1h-1zM13 6h1v1h-1zM13 7h1v1h-1zM13 9h1v1h-1zM12 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM5 12h6v1h-6z'/%3E%3Cpath fill='%23ffe680' d='M5 3h2v1h-2zM4 4h2v1h-2zM4 5h1v1h-1zM8 5h1v1h-1zM7 6h3v1h-3zM8 7h1v1h-1z'/%3E%3Cpath fill='%233e6eb8' d='M7 3h4v1h-4zM6 4h6v1h-6zM5 5h3v1h-3zM9 5h4v1h-4zM4 6h3v1h-3zM10 6h3v1h-3zM4 7h4v1h-4zM9 7h4v1h-4z'/%3E%3Cpath fill='%231b2e5a' d='M4 8h10v1h-10zM4 9h2v1h-2zM7 9h3v1h-3zM11 9h2v1h-2zM4 10h5v1h-5zM10 10h2v1h-2zM5 11h2v1h-2zM8 11h3v1h-3z'/%3E%3Cpath fill='%230f1b26' d='M6 9h1v1h-1zM10 9h1v1h-1zM9 10h1v1h-1zM7 11h1v1h-1z'/%3E%3C/svg%3E"); + --kit-icon-monitor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%2326313a' d='M0 1h16v1h-16zM0 2h1v1h-1zM15 2h1v1h-1zM0 3h1v1h-1zM15 3h1v1h-1zM0 4h1v1h-1zM15 4h1v1h-1zM0 5h1v1h-1zM15 5h1v1h-1zM0 6h1v1h-1zM15 6h1v1h-1zM0 7h1v1h-1zM15 7h1v1h-1zM0 8h1v1h-1zM15 8h1v1h-1zM0 9h1v1h-1zM15 9h1v1h-1zM0 10h1v1h-1zM15 10h1v1h-1zM0 11h16v1h-16z'/%3E%3Cpath fill='%23bfe3f0' d='M1 2h13v1h-13zM1 3h3v1h-3zM5 3h8v1h-8zM1 4h1v1h-1zM5 4h7v1h-7zM1 5h2v1h-2zM6 5h5v1h-5zM1 6h2v1h-2zM4 6h6v1h-6zM1 7h8v1h-8zM1 8h7v1h-7zM1 9h6v1h-6zM1 10h5v1h-5z'/%3E%3Cpath fill='%232b3a66' d='M14 2h1v1h-1zM13 3h2v1h-2zM12 4h3v1h-3zM11 5h4v1h-4zM10 6h2v1h-2zM13 6h2v1h-2zM9 7h2v1h-2zM13 7h2v1h-2zM8 8h4v1h-4zM13 8h2v1h-2zM7 9h4v1h-4zM12 9h3v1h-3zM6 10h9v1h-9z'/%3E%3Cpath fill='%23f2a52e' d='M4 3h1v1h-1zM2 4h1v1h-1zM5 5h1v1h-1zM3 6h1v1h-1z'/%3E%3Cpath fill='%23ffd84a' d='M3 4h2v1h-2zM3 5h2v1h-2z'/%3E%3Cpath fill='%23e6ecff' d='M12 6h1v1h-1zM11 7h2v1h-2zM12 8h1v1h-1zM11 9h1v1h-1z'/%3E%3Cpath fill='%238b8b8b' d='M6 12h4v1h-4z'/%3E%3Cpath fill='%235b6770' d='M4 13h8v1h-8z'/%3E%3C/svg%3E"); + --kit-icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 2h5v1h-5zM4 3h2v1h-2zM9 3h2v1h-2zM3 4h2v1h-2zM10 4h2v1h-2zM3 5h1v1h-1zM11 5h1v1h-1zM3 6h1v1h-1zM11 6h1v1h-1zM3 7h1v1h-1zM11 7h1v1h-1zM3 8h2v1h-2zM10 8h2v1h-2zM4 9h2v1h-2zM9 9h3v1h-3zM5 10h8v1h-8zM10 11h4v1h-4zM11 12h4v1h-4zM12 13h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-apps: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 2h4v1h-4zM10 2h4v1h-4zM2 3h4v1h-4zM10 3h4v1h-4zM2 4h4v1h-4zM10 4h4v1h-4zM2 5h4v1h-4zM10 5h4v1h-4zM2 10h4v1h-4zM10 10h4v1h-4zM2 11h4v1h-4zM10 11h4v1h-4zM2 12h4v1h-4zM10 12h4v1h-4zM2 13h4v1h-4zM10 13h4v1h-4z'/%3E%3C/svg%3E"); + --kit-icon-menu: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 3h12v1h-12zM2 4h12v1h-12zM2 7h12v1h-12zM2 8h12v1h-12zM2 11h12v1h-12zM2 12h12v1h-12z'/%3E%3C/svg%3E"); + --kit-icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M2 2h2v1h-2zM12 2h2v1h-2zM2 3h3v1h-3zM11 3h3v1h-3zM3 4h3v1h-3zM10 4h3v1h-3zM4 5h3v1h-3zM9 5h3v1h-3zM5 6h6v1h-6zM6 7h4v1h-4zM6 8h4v1h-4zM5 9h6v1h-6zM4 10h3v1h-3zM9 10h3v1h-3zM3 11h3v1h-3zM10 11h3v1h-3zM2 12h3v1h-3zM11 12h3v1h-3zM2 13h2v1h-2zM12 13h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-chevron-down: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M3 5h2v1h-2zM11 5h2v1h-2zM3 6h3v1h-3zM10 6h3v1h-3zM4 7h3v1h-3zM9 7h3v1h-3zM5 8h6v1h-6zM6 9h4v1h-4zM7 10h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-chevron-right: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 3h2v1h-2zM5 4h3v1h-3zM6 5h3v1h-3zM7 6h3v1h-3zM8 7h3v1h-3zM8 8h3v1h-3zM7 9h3v1h-3zM6 10h3v1h-3zM5 11h3v1h-3zM5 12h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-arrow-left: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M6 3h2v1h-2zM5 4h3v1h-3zM4 5h3v1h-3zM3 6h3v1h-3zM2 7h12v1h-12zM2 8h12v1h-12zM3 9h3v1h-3zM4 10h3v1h-3zM5 11h3v1h-3zM6 12h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-arrow-right: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M8 3h2v1h-2zM8 4h3v1h-3zM9 5h3v1h-3zM10 6h3v1h-3zM2 7h12v1h-12zM2 8h12v1h-12zM10 9h3v1h-3zM9 10h3v1h-3zM8 11h3v1h-3zM8 12h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-arrow-up: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M7 2h2v1h-2zM6 3h4v1h-4zM5 4h6v1h-6zM4 5h3v1h-3zM9 5h3v1h-3zM3 6h3v1h-3zM7 6h2v1h-2zM10 6h3v1h-3zM2 7h2v1h-2zM7 7h2v1h-2zM12 7h2v1h-2zM7 8h2v1h-2zM7 9h2v1h-2zM7 10h2v1h-2zM7 11h2v1h-2zM7 12h2v1h-2zM7 13h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-external: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M9 2h5v1h-5zM11 3h3v1h-3zM10 4h4v1h-4zM2 5h5v1h-5zM9 5h3v1h-3zM13 5h1v1h-1zM2 6h1v1h-1zM8 6h3v1h-3zM2 7h1v1h-1zM7 7h3v1h-3zM2 8h1v1h-1zM6 8h3v1h-3zM2 9h1v1h-1zM7 9h1v1h-1zM12 9h1v1h-1zM2 10h1v1h-1zM12 10h1v1h-1zM2 11h1v1h-1zM12 11h1v1h-1zM2 12h11v1h-11z'/%3E%3C/svg%3E"); + --kit-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 2h9v1h-9zM5 3h1v1h-1zM13 3h1v1h-1zM2 4h9v1h-9zM13 4h1v1h-1zM2 5h1v1h-1zM10 5h1v1h-1zM13 5h1v1h-1zM2 6h1v1h-1zM4 6h5v1h-5zM10 6h1v1h-1zM13 6h1v1h-1zM2 7h1v1h-1zM10 7h1v1h-1zM13 7h1v1h-1zM2 8h1v1h-1zM4 8h4v1h-4zM10 8h1v1h-1zM13 8h1v1h-1zM2 9h1v1h-1zM10 9h4v1h-4zM2 10h1v1h-1zM4 10h5v1h-5zM10 10h1v1h-1zM2 11h1v1h-1zM10 11h1v1h-1zM2 12h9v1h-9z'/%3E%3C/svg%3E"); + --kit-icon-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M12 3h2v1h-2zM11 4h3v1h-3zM10 5h3v1h-3zM9 6h3v1h-3zM2 7h2v1h-2zM8 7h3v1h-3zM2 8h3v1h-3zM7 8h3v1h-3zM3 9h6v1h-6zM4 10h4v1h-4zM5 11h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-hash: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 2h2v1h-2zM10 2h2v1h-2zM5 3h2v1h-2zM10 3h2v1h-2zM2 4h12v1h-12zM2 5h12v1h-12zM4 6h2v1h-2zM9 6h2v1h-2zM4 7h2v1h-2zM9 7h2v1h-2zM4 8h2v1h-2zM9 8h2v1h-2zM1 9h12v1h-12zM1 10h12v1h-12zM3 11h2v1h-2zM8 11h2v1h-2zM3 12h2v1h-2zM8 12h2v1h-2z'/%3E%3C/svg%3E"); + --kit-icon-globe: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 1h6v1h-6zM3 2h2v1h-2zM7 2h2v1h-2zM11 2h2v1h-2zM2 3h1v1h-1zM6 3h1v1h-1zM9 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM5 4h1v1h-1zM10 4h1v1h-1zM13 4h1v1h-1zM1 5h14v1h-14zM1 6h1v1h-1zM5 6h1v1h-1zM10 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM5 7h1v1h-1zM10 7h1v1h-1zM14 7h1v1h-1zM1 8h1v1h-1zM5 8h1v1h-1zM10 8h1v1h-1zM14 8h1v1h-1zM1 9h14v1h-14zM2 10h1v1h-1zM5 10h1v1h-1zM10 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM6 11h1v1h-1zM9 11h1v1h-1zM13 11h1v1h-1zM3 12h2v1h-2zM7 12h2v1h-2zM11 12h2v1h-2zM5 13h6v1h-6z'/%3E%3C/svg%3E"); + --kit-icon-edit: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M11 1h2v1h-2zM10 2h4v1h-4zM9 3h1v1h-1zM11 3h3v1h-3zM8 4h1v1h-1zM12 4h1v1h-1zM7 5h1v1h-1zM11 5h1v1h-1zM6 6h1v1h-1zM10 6h1v1h-1zM5 7h1v1h-1zM9 7h1v1h-1zM4 8h1v1h-1zM8 8h1v1h-1zM3 9h1v1h-1zM7 9h1v1h-1zM3 10h2v1h-2zM6 10h1v1h-1zM3 11h3v1h-3zM2 12h12v1h-12z'/%3E%3C/svg%3E"); + --kit-icon-history: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M5 1h6v1h-6zM3 2h2v1h-2zM11 2h2v1h-2zM2 3h1v1h-1zM13 3h1v1h-1zM2 4h1v1h-1zM7 4h1v1h-1zM13 4h1v1h-1zM1 5h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1zM1 6h1v1h-1zM7 6h1v1h-1zM14 6h1v1h-1zM1 7h1v1h-1zM7 7h4v1h-4zM14 7h1v1h-1zM1 8h1v1h-1zM14 8h1v1h-1zM1 9h1v1h-1zM14 9h1v1h-1zM2 10h1v1h-1zM13 10h1v1h-1zM2 11h1v1h-1zM13 11h1v1h-1zM3 12h2v1h-2zM11 12h2v1h-2zM5 13h6v1h-6z'/%3E%3C/svg%3E"); + --kit-icon-heart: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='%233a0a0a' d='M2 2h3v1h-3zM9 2h3v1h-3zM1 3h1v1h-1zM5 3h1v1h-1zM8 3h1v1h-1zM12 3h1v1h-1zM0 4h1v1h-1zM6 4h2v1h-2zM13 4h1v1h-1zM0 5h1v1h-1zM13 5h1v1h-1zM0 6h1v1h-1zM13 6h1v1h-1zM1 7h1v1h-1zM12 7h1v1h-1zM2 8h1v1h-1zM11 8h1v1h-1zM3 9h1v1h-1zM10 9h1v1h-1zM4 10h1v1h-1zM9 10h1v1h-1zM5 11h1v1h-1zM8 11h1v1h-1zM6 12h2v1h-2z'/%3E%3Cpath fill='%23d23b3b' d='M2 3h3v1h-3zM9 3h3v1h-3zM1 4h1v1h-1zM3 4h3v1h-3zM8 4h4v1h-4zM1 5h1v1h-1zM3 5h9v1h-9zM1 6h11v1h-11zM2 7h9v1h-9zM3 8h7v1h-7zM4 9h5v1h-5zM5 10h3v1h-3zM6 11h1v1h-1z'/%3E%3Cpath fill='%23ffb3b3' d='M2 4h1v1h-1zM2 5h1v1h-1z'/%3E%3Cpath fill='%239e1f1f' d='M12 4h1v1h-1zM12 5h1v1h-1zM12 6h1v1h-1zM11 7h1v1h-1zM10 8h1v1h-1zM9 9h1v1h-1zM8 10h1v1h-1zM7 11h1v1h-1z'/%3E%3C/svg%3E"); +} diff --git a/kit/theme/index.css b/kit/theme/index.css new file mode 100644 index 00000000..b26b3e59 --- /dev/null +++ b/kit/theme/index.css @@ -0,0 +1,18 @@ +/* + * levimc-kit theme entry (Tailwind v4, CSS-first). Import AFTER `@import "tailwindcss";`, e.g. + * + * @import "tailwindcss"; + * @import "../kit/theme/index.css"; + * @source "../kit"; + * + * or simply `@import "../kit/theme/tailwind.css";` which does exactly that. + */ +@import "./tokens.css"; +@import "./generated.css"; +@import "./base.css"; +@import "./pixel.css"; +@import "./painterly.css"; +@import "./prose.css"; +@import "./code.css"; +@import "./admonitions.css"; +@import "./chrome.css"; diff --git a/kit/theme/painterly.css b/kit/theme/painterly.css new file mode 100644 index 00000000..43459bac --- /dev/null +++ b/kit/theme/painterly.css @@ -0,0 +1,243 @@ +/* + * levimc-kit — painterly layer. "Painterly = atmosphere": colour fields and brush-dab texture live in + * heroes, backdrops and margins only. Reading surfaces stay calm canvas. + * + * Textures (--kit-brush, --kit-grain, --kit-paint-*) are generated into theme/generated.css. + */ + +@layer components { + /* ------------------------------------------------------------------ page backdrop */ + .kit-backdrop { + position: fixed; + inset: 0; + z-index: 0; + pointer-events: none; + overflow: hidden; + contain: strict; + background: var(--color-canvas); + } + .kit-backdrop > div { + position: absolute; + } + /* Soft colour dabs: water-lily pads and light on water, mostly in the margins. */ + .kit-backdrop-dabs { + inset: -12%; + background: + radial-gradient(28% 22% at 6% 10%, rgb(79 138 91 / 0.2), transparent 70%), + radial-gradient(20% 16% at 16% 4%, rgb(154 134 194 / 0.17), transparent 72%), + radial-gradient(24% 20% at 94% 8%, rgb(62 110 142 / 0.17), transparent 70%), + radial-gradient(16% 12% at 82% 2%, rgb(233 196 106 / 0.24), transparent 72%), + radial-gradient(14% 11% at 70% 14%, rgb(217 138 158 / 0.12), transparent 72%), + radial-gradient(26% 20% at 2% 92%, rgb(62 110 142 / 0.12), transparent 72%), + radial-gradient(24% 22% at 98% 96%, rgb(79 138 91 / 0.14), transparent 72%), + radial-gradient(14% 12% at 88% 70%, rgb(154 134 194 / 0.1), transparent 72%); + animation: var(--animate-kit-drift); + will-change: transform; + } + .dark .kit-backdrop-dabs { + background: + radial-gradient(26% 20% at 88% 6%, rgb(240 138 75 / 0.2), transparent 70%), + radial-gradient(14% 10% at 84% 3%, rgb(245 178 107 / 0.18), transparent 70%), + radial-gradient(30% 24% at 8% 8%, rgb(63 127 140 / 0.22), transparent 72%), + radial-gradient(22% 18% at 40% 0%, rgb(125 111 158 / 0.2), transparent 72%), + radial-gradient(28% 22% at 4% 94%, rgb(63 127 140 / 0.16), transparent 72%), + radial-gradient(22% 18% at 96% 92%, rgb(125 111 158 / 0.16), transparent 72%), + radial-gradient(12% 10% at 92% 62%, rgb(240 138 75 / 0.07), transparent 72%); + } + /* Painted scene band at the very top of the page (scrolls away), fading into the canvas. */ + .kit-backdrop-scene { + position: absolute; + z-index: 0; + pointer-events: none; + top: 0; + left: 0; + right: 0; + height: var(--kit-scene-height, 21rem); + background-image: var(--kit-paint-lilies); + background-size: cover; + background-position: center 35%; + opacity: var(--kit-scene-opacity, 0.3); + -webkit-mask-image: linear-gradient(to bottom, #000 0%, rgb(0 0 0 / 0.75) 30%, rgb(0 0 0 / 0.25) 62%, transparent 100%); + mask-image: linear-gradient(to bottom, #000 0%, rgb(0 0 0 / 0.75) 30%, rgb(0 0 0 / 0.25) 62%, transparent 100%); + } + .dark .kit-backdrop-scene { + background-image: var(--kit-paint-sunrise); + opacity: var(--kit-scene-opacity-dark, 0.42); + } + .kit-backdrop-brush { + inset: 0; + background-image: var(--kit-brush); + background-size: 256px 256px; + mix-blend-mode: soft-light; + opacity: 0.28; + } + .dark .kit-backdrop-brush { + opacity: 0.22; + } + .kit-backdrop-grain { + inset: 0; + background-image: var(--kit-grain); + background-size: 180px 180px; + opacity: 0.05; + mix-blend-mode: multiply; + } + .dark .kit-backdrop-grain { + mix-blend-mode: screen; + opacity: 0.035; + } + + /* Anything placed after the backdrop sits above it. */ + .kit-above-backdrop { + position: relative; + z-index: 1; + } + + /* A calm reading surface on top of the painted page. */ + .kit-canvas-surface { + background: color-mix(in srgb, var(--color-canvas) 94%, transparent); + } + + /* Painted panel: impressionist texture inside a block (cards, banners, callouts). */ + .kit-painted { + position: relative; + isolation: isolate; + overflow: hidden; + } + .kit-painted::before, + .kit-painted::after { + content: ""; + position: absolute; + inset: 0; + z-index: -1; + pointer-events: none; + } + .kit-painted::before { + background: + radial-gradient(60% 80% at 0% 0%, color-mix(in srgb, var(--color-primary) 20%, transparent), transparent 70%), + radial-gradient(50% 70% at 100% 0%, color-mix(in srgb, var(--color-accent-2) 20%, transparent), transparent 70%), + radial-gradient(60% 80% at 100% 100%, color-mix(in srgb, var(--color-accent-1) 18%, transparent), transparent 70%), + radial-gradient(50% 60% at 10% 100%, color-mix(in srgb, var(--color-accent-4) 18%, transparent), transparent 70%); + } + .kit-painted::after { + background: var(--kit-brush) 0 0 / 256px 256px; + mix-blend-mode: soft-light; + opacity: 0.3; + } + + /* ------------------------------------------------------------------ painted hero */ + .kit-hero { + position: relative; + isolation: isolate; + overflow: hidden; + background: var(--color-canvas); + } + .kit-hero-art { + position: absolute; + inset: 0; + z-index: -2; + } + .kit-hero-art svg { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + display: block; + } + .kit-hero-art .kit-scene-dark { + display: none; + } + .dark .kit-hero-art .kit-scene-light { + display: none; + } + .dark .kit-hero-art .kit-scene-dark { + display: block; + } + .kit-hero-art .kit-scene-glints { + animation: kit-glint 7s ease-in-out infinite alternate; + } + .kit-hero-art .kit-scene-sun { + animation: kit-glint 9s ease-in-out infinite alternate; + } + .kit-hero-brush { + position: absolute; + inset: 0; + z-index: -1; + background-image: var(--kit-brush); + background-size: 256px 256px; + mix-blend-mode: soft-light; + opacity: 0.5; + pointer-events: none; + } + /* Scrim that keeps hero text at AA contrast: canvas fades into the painting. */ + .kit-hero-scrim { + position: absolute; + inset: 0; + z-index: -1; + background: linear-gradient( + 90deg, + var(--color-canvas) 0%, + color-mix(in srgb, var(--color-canvas) 94%, transparent) 30%, + color-mix(in srgb, var(--color-canvas) 55%, transparent) 50%, + transparent 68% + ); + pointer-events: none; + } + @media (max-width: 960px) { + /* the painting becomes a band at the top; the copy sits on calm canvas below it */ + .kit-hero-art, + .kit-hero-brush { + inset: 0 0 auto 0; + height: var(--kit-hero-band, clamp(15rem, 64vw, 24rem)); + } + .kit-hero-scrim { + inset: 0 0 auto 0; + height: var(--kit-hero-band, clamp(15rem, 64vw, 24rem)); + background: linear-gradient(180deg, transparent 0%, transparent 55%, color-mix(in srgb, var(--color-canvas) 70%, transparent) 82%, var(--color-canvas) 100%); + } + } + .kit-hero-horizon { + position: absolute; + left: 0; + right: 0; + bottom: 0; + z-index: 1; + } + .dark .grass-divider { + filter: brightness(0.78) saturate(0.9); + } + + /* MC item frame: a wooden frame for the hero image / project logo. */ + .kit-item-frame { + --px-border: #3b2412; + --px-bevel: inset 0 0 0 calc(var(--px) * 3) #8a5a33, inset 0 0 0 calc(var(--px) * 4) #5e3b1f, + inset calc(var(--px) * 3) calc(var(--px) * 3) 0 calc(var(--px) * 3) rgb(255 255 255 / 0.08); + display: grid; + place-items: center; + padding: 1.25rem; + background: color-mix(in srgb, #c9a46a 30%, var(--color-surface)); + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--px-border), + 0 var(--px) 0 0 var(--px-border), + calc(var(--px) * -1) 0 0 0 var(--px-border), + var(--px) 0 0 0 var(--px-border), + var(--px-bevel), + 0 18px 40px -16px rgb(0 0 0 / 0.45); + } +} + +@keyframes kit-glint { + from { + opacity: 0.55; + } + to { + opacity: 1; + } +} + +@media (prefers-reduced-motion: reduce) { + .kit-backdrop-dabs, + .kit-hero-art .kit-scene-glints, + .kit-hero-art .kit-scene-sun { + animation: none !important; + } +} diff --git a/kit/theme/pixel.css b/kit/theme/pixel.css new file mode 100644 index 00000000..03876442 --- /dev/null +++ b/kit/theme/pixel.css @@ -0,0 +1,433 @@ +/* + * levimc-kit — pixel vocabulary. "Pixel = structure": every interactive affordance is drawn with crisp, + * stepped geometry. One "pixel" is var(--px) = 2px. + * + * Technique: stepped corners are made with four offset box-shadows (top/bottom/left/right strips) so the + * 2×2 corner pixel stays empty — no clip-path, so focus rings and drop shadows are never clipped. + * Compose with CSS variables instead of overriding box-shadow: + * --px-border colour of the 1-pixel frame (default: line-strong) + * --px-bevel inset bevel shadows (default: none) + * --px-ring focus ring (set automatically on :focus-visible) + * --px-drop pixel drop shadow (default: none) + */ + +@layer components { + .px-corners, + .mc-btn, + .mc-icon-btn, + .mc-kbd, + .mc-input, + .px-card, + .kit-slot, + .hotbar { + --px-border: var(--color-line-strong); + --px-ring-color: transparent; + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--px-border), + 0 var(--px) 0 0 var(--px-border), + calc(var(--px) * -1) 0 0 0 var(--px-border), + var(--px) 0 0 0 var(--px-border), + 0 calc(var(--px) * -2) 0 0 var(--px-ring-color), + 0 calc(var(--px) * 2) 0 0 var(--px-ring-color), + calc(var(--px) * -2) 0 0 0 var(--px-ring-color), + calc(var(--px) * 2) 0 0 0 var(--px-ring-color), + var(--px-bevel, 0 0 #0000), + var(--px-drop, 0 0 #0000); + } + + /* Pixel focus ring for any px element (sits outside the frame, corners stay stepped). */ + .px-corners:focus-visible, + .mc-btn:focus-visible, + .mc-icon-btn:focus-visible, + .mc-input:focus-within, + .px-card:focus-visible, + .kit-slot:focus-visible, + .hotbar > :focus-visible, + .px-focus:focus-visible { + outline: none; + --px-ring-color: var(--color-focus); + } + + /* ------------------------------------------------------------------ buttons */ + .mc-btn { + --mc-btn-bg: #ebe5d6; + --mc-btn-bg-hover: #f3eee2; + --mc-btn-ink: var(--color-ink); + --px-border: #2a343c; + --px-bevel: inset 0 var(--px) 0 0 rgb(255 255 255 / 0.75), inset 0 calc(var(--px) * -2) 0 0 rgb(60 48 30 / 0.16); + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + min-height: 2.5rem; + padding: 0.5rem 1.125rem 0.625rem; + margin: var(--px); + font-family: var(--font-sans); + font-size: 0.9375rem; + font-weight: 600; + line-height: 1.2; + letter-spacing: 0.005em; + white-space: nowrap; + color: var(--mc-btn-ink); + background: var(--mc-btn-bg); + cursor: pointer; + user-select: none; + transition: + background-color 0.15s var(--ease-soft), + transform 0.06s linear; + } + .mc-btn:hover { + background: var(--mc-btn-bg-hover); + } + .mc-btn:active, + .mc-btn[aria-pressed="true"] { + transform: translateY(var(--px)); + --px-bevel: inset 0 var(--px) 0 0 rgb(60 48 30 / 0.18); + } + .mc-btn:disabled, + .mc-btn[aria-disabled="true"] { + cursor: not-allowed; + opacity: 0.55; + transform: none; + } + .mc-btn > svg { + flex: none; + } + + .mc-btn-primary { + --mc-btn-bg: var(--color-primary-strong); + --mc-btn-bg-hover: #43804f; + --mc-btn-ink: var(--color-on-primary); + --px-border: #183520; + --px-bevel: inset 0 var(--px) 0 0 rgb(255 255 255 / 0.28), inset 0 calc(var(--px) * -2) 0 0 rgb(0 0 0 / 0.24); + text-shadow: 0 1px 0 rgb(0 0 0 / 0.18); + } + .mc-btn-primary:active, + .mc-btn-primary[aria-pressed="true"] { + --px-bevel: inset 0 var(--px) 0 0 rgb(0 0 0 / 0.25); + } + + .mc-btn-ghost { + --mc-btn-bg: transparent; + --mc-btn-bg-hover: color-mix(in srgb, var(--color-ink) 7%, transparent); + --px-border: transparent; + --px-bevel: none; + } + .mc-btn-ghost:hover { + --px-border: var(--color-line-strong); + } + .mc-btn-ghost:active { + --px-bevel: none; + } + + .mc-btn-sm { + min-height: 2rem; + padding: 0.3125rem 0.75rem 0.4375rem; + font-size: 0.8125rem; + } + .mc-btn-lg { + min-height: 3rem; + padding: 0.75rem 1.5rem 0.875rem; + font-size: 1rem; + } + + .dark .mc-btn { + --mc-btn-bg: #22384c; + --mc-btn-bg-hover: #2a4560; + --px-border: #04090e; + --px-bevel: inset 0 var(--px) 0 0 rgb(255 255 255 / 0.12), inset 0 calc(var(--px) * -2) 0 0 rgb(0 0 0 / 0.38); + } + .dark .mc-btn:active, + .dark .mc-btn[aria-pressed="true"] { + --px-bevel: inset 0 var(--px) 0 0 rgb(0 0 0 / 0.4); + } + .dark .mc-btn-primary { + --mc-btn-bg: var(--color-primary); + --mc-btn-bg-hover: #82cc85; + --mc-btn-ink: #0b1a10; + --px-border: #06120a; + --px-bevel: inset 0 var(--px) 0 0 rgb(255 255 255 / 0.32), inset 0 calc(var(--px) * -2) 0 0 rgb(0 0 0 / 0.28); + text-shadow: none; + } + .dark .mc-btn-ghost { + --mc-btn-bg: transparent; + --mc-btn-bg-hover: rgb(255 255 255 / 0.07); + --px-border: transparent; + --px-bevel: none; + } + .dark .mc-btn-ghost:hover { + --px-border: var(--color-line-strong); + } + + /* Square icon button (header actions, copy buttons, close buttons). */ + .mc-icon-btn { + --px-border: transparent; + display: inline-grid; + place-items: center; + width: 2.25rem; + height: 2.25rem; + margin: var(--px); + color: var(--color-muted); + background: transparent; + cursor: pointer; + transition: + color 0.15s, + background-color 0.15s; + } + .mc-icon-btn:hover { + color: var(--color-ink); + background: color-mix(in srgb, var(--color-ink) 7%, transparent); + --px-border: var(--color-line-strong); + } + .mc-icon-btn:active { + transform: translateY(1px); + } + .mc-icon-btn[aria-expanded="true"] { + color: var(--color-ink); + background: color-mix(in srgb, var(--color-ink) 9%, transparent); + --px-border: var(--color-line-strong); + } + + /* ------------------------------------------------------------------ inputs */ + .mc-input { + --px-border: var(--color-line-strong); + --px-bevel: inset 0 var(--px) 0 0 color-mix(in srgb, var(--color-ink) 7%, transparent); + display: flex; + align-items: center; + gap: 0.5rem; + margin: var(--px); + padding: 0 0.75rem; + min-height: 2.5rem; + background: var(--color-surface); + color: var(--color-ink); + } + .mc-input input { + flex: 1; + min-width: 0; + background: transparent; + border: 0; + outline: none; + font: inherit; + color: inherit; + } + .mc-input input::placeholder { + color: var(--color-faint); + } + + /* ------------------------------------------------------------------ keycaps */ + .mc-kbd { + --px-border: var(--color-line-strong); + --px-bevel: inset 0 calc(var(--px) * -2) 0 0 color-mix(in srgb, var(--color-ink) 14%, transparent); + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 1.5rem; + height: 1.5rem; + padding: 0 0.375rem 0.125rem; + margin: 0 var(--px); + font-family: var(--font-mono); + font-size: 0.75rem; + font-weight: 500; + line-height: 1; + color: var(--color-ink); + background: var(--color-surface); + vertical-align: middle; + } + + /* ------------------------------------------------------------------ cards & slots */ + .px-card { + --px-border: var(--color-line); + --px-drop: 0 calc(var(--px) * 3) 0 0 color-mix(in srgb, var(--color-ink) 7%, transparent); + position: relative; + margin: var(--px); + background: var(--color-surface); + transition: + transform 0.18s var(--ease-soft), + background-color 0.2s; + } + a.px-card:hover, + .px-card[data-interactive]:hover { + --px-border: color-mix(in srgb, var(--color-primary) 70%, var(--color-line-strong)); + --px-drop: 0 calc(var(--px) * 4) 0 0 color-mix(in srgb, var(--color-primary) 22%, transparent); + transform: translateY(calc(var(--px) * -1)); + } + + /* Inventory slot: sunken square for item icons (inset bevel: dark top-left, light bottom-right). */ + .kit-slot { + --px-border: color-mix(in srgb, var(--color-ink) 22%, var(--color-surface-2)); + --px-bevel: inset var(--px) var(--px) 0 0 color-mix(in srgb, var(--color-ink) 12%, transparent), + inset calc(var(--px) * -1) calc(var(--px) * -1) 0 0 rgb(255 255 255 / 0.55); + display: inline-grid; + place-items: center; + width: 2.75rem; + height: 2.75rem; + margin: var(--px); + background: color-mix(in srgb, var(--color-surface-3) 80%, var(--color-surface)); + } + .dark .kit-slot { + --px-border: #06101a; + --px-bevel: inset var(--px) var(--px) 0 0 rgb(0 0 0 / 0.4), inset calc(var(--px) * -1) calc(var(--px) * -1) 0 0 rgb(255 255 255 / 0.07); + background: #12212f; + } + + /* ------------------------------------------------------------------ hotbar (tabs, pagination, segmented) */ + .hotbar { + --px-border: color-mix(in srgb, var(--color-ink) 30%, var(--color-line-strong)); + --px-bevel: inset 0 var(--px) 0 0 color-mix(in srgb, var(--color-ink) 6%, transparent); + display: inline-flex; + flex-wrap: wrap; + align-items: stretch; + gap: var(--px); + margin: var(--px); + padding: var(--px); + background: color-mix(in srgb, var(--color-ink) 7%, var(--color-surface-2)); + max-width: calc(100% - var(--px) * 2); + } + .hotbar > a, + .hotbar > button, + .hotbar > [role="tab"], + .hotbar > .hotbar-slot { + --px-border: transparent; + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.4rem; + min-height: 2rem; + min-width: 2rem; + padding: 0.3125rem 0.75rem; + font-size: 0.8125rem; + font-weight: 500; + line-height: 1.3; + color: color-mix(in srgb, var(--color-ink) 72%, var(--color-muted)); + background: transparent; + cursor: pointer; + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--px-border), + 0 var(--px) 0 0 var(--px-border), + calc(var(--px) * -1) 0 0 0 var(--px-border), + var(--px) 0 0 0 var(--px-border), + 0 calc(var(--px) * -2) 0 0 var(--px-ring-color, transparent), + 0 calc(var(--px) * 2) 0 0 var(--px-ring-color, transparent), + calc(var(--px) * -2) 0 0 0 var(--px-ring-color, transparent), + calc(var(--px) * 2) 0 0 0 var(--px-ring-color, transparent); + transition: + color 0.12s, + background-color 0.12s; + } + .hotbar > :hover { + color: var(--color-ink); + background: color-mix(in srgb, var(--color-surface) 70%, transparent); + } + /* Selected slot: the bright hotbar frame. */ + .hotbar > [aria-selected="true"], + .hotbar > [aria-current="page"], + .hotbar > [aria-pressed="true"], + .hotbar > .is-active { + --px-border: var(--color-ink); + z-index: 1; + color: var(--color-ink); + font-weight: 600; + background: var(--color-surface); + outline: var(--px) solid var(--color-surface); + outline-offset: calc(var(--px) * -2); + } + .dark .hotbar { + --px-border: #05101a; + background: #0b1824; + } + .dark .hotbar > [aria-selected="true"], + .dark .hotbar > [aria-current="page"], + .dark .hotbar > [aria-pressed="true"], + .dark .hotbar > .is-active { + --px-border: #dfe7ee; + background: #1d3246; + outline-color: #0b1824; + } + .hotbar-pixel > a, + .hotbar-pixel > button, + .hotbar-pixel > .hotbar-slot { + font-family: var(--font-pixel); + font-size: 0.75rem; + min-width: 2.25rem; + padding-inline: 0.5rem; + } + + /* ------------------------------------------------------------------ Minecraft item tooltip */ + .mc-tooltip { + --mc-tip-bg: rgb(16 0 16 / 0.95); + position: relative; + display: inline-block; + max-width: 22rem; + padding: 0.4375rem 0.625rem 0.5rem; + margin: var(--px); + font-size: 0.8125rem; + font-weight: 500; + line-height: 1.4; + color: #f4f0ff; + background: var(--mc-tip-bg); + box-shadow: + 0 calc(var(--px) * -1) 0 0 var(--mc-tip-bg), + 0 var(--px) 0 0 var(--mc-tip-bg), + calc(var(--px) * -1) 0 0 0 var(--mc-tip-bg), + var(--px) 0 0 0 var(--mc-tip-bg), + 0 10px 24px -8px rgb(0 0 0 / 0.45); + text-shadow: 1px 1px 0 rgb(40 0 60 / 0.6); + } + .mc-tooltip::before { + content: ""; + position: absolute; + inset: 0; + border: var(--px) solid transparent; + border-image: linear-gradient(to bottom, rgb(112 48 255 / 0.85), rgb(56 0 150 / 0.75)) 1; + pointer-events: none; + } + .mc-tooltip-title { + display: block; + color: #ffffff; + font-weight: 600; + } + .mc-tooltip-lore { + display: block; + color: #b9b4c8; + } + .mc-tooltip-enchant { + display: block; + color: #c8b6ff; + } + + /* ------------------------------------------------------------------ grass strip divider */ + .grass-divider { + display: block; + height: 16px; + width: 100%; + border: 0; + margin: 0; + background-image: var(--kit-grass-strip); + background-repeat: repeat-x; + background-size: 32px 16px; + image-rendering: pixelated; + } + .grass-divider-thin { + height: 8px; + background-size: 16px 8px; + } + + /* Pixel heading marker / bullets */ + .px-dot { + display: inline-block; + width: calc(var(--px) * 3); + height: calc(var(--px) * 3); + background: currentColor; + box-shadow: var(--px) var(--px) 0 0 color-mix(in srgb, currentColor 45%, transparent); + } + + /* Crisp rendering for pixel art. */ + .pixelated, + .kit-pixel-icon { + image-rendering: pixelated; + shape-rendering: crispEdges; + } +} + diff --git a/kit/theme/prose.css b/kit/theme/prose.css new file mode 100644 index 00000000..be6d9d0c --- /dev/null +++ b/kit/theme/prose.css @@ -0,0 +1,535 @@ +/* + * levimc-kit — document typography. Apply `.kit-prose` to the element that wraps rendered markdown. + * Calm canvas, ~76ch measure, AA contrast; pixel details only on small affordances (bullets, anchors, keys). + */ + +@layer components { + .kit-prose { + --prose-gap: 1.125rem; + font-size: 1rem; + line-height: 1.75; + color: var(--color-ink); + overflow-wrap: anywhere; + min-width: 0; + } + .kit-prose:lang(zh), + .kit-prose:lang(ja), + .kit-prose:lang(ko) { + line-height: 1.85; + letter-spacing: 0.01em; + } + + .kit-prose > :first-child { + margin-top: 0; + } + .kit-prose > :last-child { + margin-bottom: 0; + } + + /* ---------------------------------------------------------------- headings */ + .kit-prose :is(h1, h2, h3, h4, h5, h6) { + position: relative; + overflow-wrap: anywhere; + color: var(--color-ink); + scroll-margin-top: calc(var(--spacing-header) + 1.25rem); + text-wrap: balance; + } + .kit-prose h1 { + margin: 0 0 1.5rem; + font-family: var(--font-display); + font-optical-sizing: auto; + font-size: clamp(2rem, 1.6rem + 1.4vw, 2.625rem); + font-weight: 560; + line-height: 1.15; + letter-spacing: -0.02em; + } + .kit-prose h2 { + margin: 3rem 0 1rem; + padding-top: 1.5rem; + font-size: 1.5rem; + font-weight: 650; + line-height: 1.3; + letter-spacing: -0.012em; + border-top: 1px solid var(--color-line); + } + .kit-prose h3 { + margin: 2.25rem 0 0.75rem; + font-size: 1.1875rem; + font-weight: 650; + line-height: 1.4; + letter-spacing: -0.006em; + } + .kit-prose h4 { + margin: 1.875rem 0 0.625rem; + font-size: 1.0625rem; + font-weight: 650; + line-height: 1.45; + } + .kit-prose :is(h5, h6) { + margin: 1.5rem 0 0.5rem; + font-size: 0.9375rem; + font-weight: 650; + line-height: 1.5; + } + .kit-prose h6 { + color: var(--color-muted); + } + .kit-prose :is(h1, h2, h3, h4) code { + font-size: 0.86em; + } + + /* Heading permalink: a pixel '#' that appears in the left margin on hover/focus. */ + .kit-prose .kit-anchor { + position: absolute; + left: -1.5rem; + top: 50%; + display: inline-grid; + place-items: center; + width: 1.25rem; + height: 1.25rem; + margin-top: -0.625rem; + color: var(--color-faint); + opacity: 0; + text-decoration: none; + transition: opacity 0.15s; + } + .kit-prose h2 .kit-anchor { + top: calc(50% + 0.75rem); + } + .kit-prose :is(h1, h2, h3, h4, h5, h6):hover .kit-anchor, + .kit-prose .kit-anchor:focus-visible { + opacity: 1; + } + .kit-prose .kit-anchor:hover { + color: var(--color-primary-strong); + } + .kit-prose .kit-anchor svg { + width: 16px; + height: 16px; + } + @media (max-width: 960px) { + .kit-prose .kit-anchor { + left: auto; + right: -0.25rem; + position: relative; + top: auto; + margin: 0 0 0 0.375rem; + vertical-align: middle; + opacity: 0.55; + } + .kit-prose h2 .kit-anchor { + top: auto; + } + } + .kit-prose h1 .kit-anchor { + display: none; + } + .kit-prose :is(h1, h2, h3, h4, h5, h6):target { + animation: kit-target-flash 1.6s var(--ease-soft); + } + + /* ---------------------------------------------------------------- text */ + .kit-prose p { + margin: var(--prose-gap) 0; + } + .kit-prose strong { + font-weight: 650; + color: var(--color-ink); + } + .kit-prose em { + font-style: italic; + } + .kit-prose :is(del, s) { + color: var(--color-muted); + } + .kit-prose mark { + background: var(--color-mark); + color: inherit; + padding: 0 0.15em; + } + .kit-prose small { + font-size: 0.875em; + } + .kit-prose u, + .kit-prose ins { + text-decoration-thickness: 1px; + text-underline-offset: 0.2em; + } + .kit-prose abbr[title] { + text-decoration: underline dotted; + cursor: help; + } + .kit-prose sub, + .kit-prose sup { + font-size: 0.75em; + line-height: 0; + } + + .kit-prose a { + color: var(--color-link); + font-weight: 500; + text-decoration-line: underline; + text-decoration-color: color-mix(in srgb, var(--color-link) 38%, transparent); + text-decoration-thickness: 1px; + text-underline-offset: 0.22em; + transition: + text-decoration-color 0.15s, + color 0.15s; + } + .kit-prose a:hover { + text-decoration-color: currentColor; + text-decoration-thickness: 2px; + } + .kit-prose a code { + color: inherit; + } + /* external links get a tiny pixel arrow (CSS only, not part of the text) */ + .kit-prose a[target="_blank"]:not(:has(img))::after { + content: ""; + display: inline-block; + width: 0.75em; + height: 0.75em; + margin-left: 0.15em; + vertical-align: 0.05em; + background: currentColor; + opacity: 0.55; + -webkit-mask: var(--kit-icon-external) center / contain no-repeat; + mask: var(--kit-icon-external) center / contain no-repeat; + } + + /* ---------------------------------------------------------------- lists: pixel bullets */ + .kit-prose :is(ul, ol) { + margin: var(--prose-gap) 0; + padding-left: 1.625rem; + } + .kit-prose li { + margin: 0.375rem 0; + padding-left: 0.125rem; + } + .kit-prose li > :is(ul, ol) { + margin: 0.375rem 0; + } + .kit-prose li > p { + margin: 0.5rem 0; + } + .kit-prose ul { + list-style: none; + } + .kit-prose ul > li { + position: relative; + } + .kit-prose ul > li::before { + content: ""; + position: absolute; + left: -1.125rem; + top: 0.72em; + width: 6px; + height: 6px; + background: var(--color-primary); + box-shadow: 2px 2px 0 0 color-mix(in srgb, var(--color-primary) 35%, transparent); + } + .kit-prose ul ul > li::before { + background: transparent; + box-shadow: inset 0 0 0 2px var(--color-accent-1); + } + .kit-prose ul ul ul > li::before { + background: var(--color-accent-2); + box-shadow: none; + width: 4px; + height: 4px; + top: 0.8em; + } + .kit-prose ol { + list-style: decimal; + } + .kit-prose ol > li::marker { + color: var(--color-muted); + font-weight: 600; + font-variant-numeric: tabular-nums; + } + /* GFM task lists */ + .kit-prose li.task-list-item { + list-style: none; + } + .kit-prose ul > li.task-list-item::before { + display: none; + } + .kit-prose .task-list-item input[type="checkbox"] { + appearance: none; + width: 14px; + height: 14px; + margin: 0 0.5rem 0 -1.25rem; + vertical-align: -2px; + background: var(--color-surface); + box-shadow: inset 0 0 0 2px var(--color-line-strong); + } + .kit-prose .task-list-item input[type="checkbox"]:checked { + background: + var(--kit-icon-check-mask, none) center / 12px 12px no-repeat, + var(--color-primary); + box-shadow: inset 0 0 0 2px var(--color-primary-strong); + } + + /* ---------------------------------------------------------------- definition lists */ + .kit-prose dl { + margin: var(--prose-gap) 0; + } + .kit-prose dt { + font-weight: 650; + } + .kit-prose dd { + margin: 0.25rem 0 0.75rem 1.5rem; + } + + /* ---------------------------------------------------------------- inline code & keys */ + .kit-prose :not(pre) > code { + padding: 0.125em 0.375em; + font-size: 0.86em; + color: var(--color-code-ink); + background: color-mix(in srgb, var(--color-ink) 6%, var(--color-surface)); + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-ink) 9%, transparent); + overflow-wrap: anywhere; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; + } + .dark .kit-prose :not(pre) > code { + background: color-mix(in srgb, #ffffff 7%, var(--color-canvas)); + box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.08); + } + .kit-prose kbd { + display: inline-block; + min-width: 1.5em; + padding: 0 0.375em 0.0625em; + font-size: 0.8em; + line-height: 1.6; + text-align: center; + color: var(--color-ink); + background: var(--color-surface); + box-shadow: + 0 -2px 0 0 var(--color-line-strong), + 0 2px 0 0 var(--color-line-strong), + -2px 0 0 0 var(--color-line-strong), + 2px 0 0 0 var(--color-line-strong), + inset 0 -2px 0 0 color-mix(in srgb, var(--color-ink) 14%, transparent); + margin: 0 0.2em; + } + + /* ---------------------------------------------------------------- blockquote */ + .kit-prose blockquote { + margin: 1.5rem 0; + padding: 0.25rem 1.125rem; + color: var(--color-muted); + background: linear-gradient(90deg, color-mix(in srgb, var(--color-accent-2) 9%, transparent), transparent 70%); + box-shadow: inset 4px 0 0 0 var(--color-accent-2); + } + .kit-prose blockquote > p { + margin: 0.625rem 0; + } + .kit-prose blockquote strong { + color: inherit; + } + + /* ---------------------------------------------------------------- tables */ + .kit-prose .kit-table-wrap { + margin: 1.5rem 0; + overflow-x: auto; + max-width: 100%; + background: var(--color-surface); + box-shadow: + 0 -1px 0 0 var(--color-line), + 0 1px 0 0 var(--color-line), + -1px 0 0 0 var(--color-line), + 1px 0 0 0 var(--color-line); + } + .kit-prose table { + width: 100%; + border-collapse: collapse; + font-size: 0.9rem; + line-height: 1.55; + font-variant-numeric: tabular-nums; + } + .kit-prose .kit-table-wrap > table { + margin: 0; + } + .kit-prose :is(th, td) { + padding: 0.625rem 0.875rem; + text-align: left; + vertical-align: top; + border-bottom: 1px solid var(--color-line); + } + .kit-prose :is(th, td) + :is(th, td) { + border-left: 1px solid color-mix(in srgb, var(--color-line) 60%, transparent); + } + .kit-prose th { + font-size: 0.8125rem; + font-weight: 650; + letter-spacing: 0.01em; + color: var(--color-ink); + background: color-mix(in srgb, var(--color-ink) 4%, var(--color-surface)); + border-bottom: 2px solid var(--color-line-strong); + white-space: nowrap; + } + .kit-prose tbody tr:nth-child(even) { + background: color-mix(in srgb, var(--color-ink) 1.8%, transparent); + } + .kit-prose tbody tr:last-child td { + border-bottom: 0; + } + .kit-prose tbody tr:hover { + background: color-mix(in srgb, var(--color-primary) 6%, transparent); + } + .kit-prose td code { + font-size: 0.82em; + } + /* tables scroll horizontally instead of breaking words mid-way */ + .kit-prose .kit-table-wrap table, + .kit-prose .kit-table-wrap :not(pre) > code { + overflow-wrap: normal; + } + + /* ---------------------------------------------------------------- media, rules */ + .kit-prose img { + display: inline-block; + max-width: 100%; + height: auto; + vertical-align: middle; + } + .kit-prose p > img:only-child, + .kit-prose figure img { + display: block; + margin: 1.5rem auto; + box-shadow: + 0 -2px 0 0 var(--color-line), + 0 2px 0 0 var(--color-line), + -2px 0 0 0 var(--color-line), + 2px 0 0 0 var(--color-line); + } + .kit-prose figure { + margin: 1.5rem 0; + } + .kit-prose figcaption { + margin-top: 0.5rem; + text-align: center; + font-size: 0.875rem; + color: var(--color-muted); + } + .kit-prose hr { + height: 2px; + margin: 2.5rem 0; + border: 0; + background: repeating-linear-gradient(90deg, var(--color-line-strong) 0 4px, transparent 4px 10px); + } + + /* ---------------------------------------------------------------- raw
*/ + .kit-prose details:not(.kit-adm) { + margin: 1.25rem 0; + padding: 0.5rem 1rem; + background: var(--color-surface); + box-shadow: + 0 -2px 0 0 var(--color-line), + 0 2px 0 0 var(--color-line), + -2px 0 0 0 var(--color-line), + 2px 0 0 0 var(--color-line); + } + .kit-prose details:not(.kit-adm) > summary { + cursor: pointer; + font-weight: 600; + list-style: none; + display: flex; + align-items: center; + gap: 0.5rem; + } + .kit-prose details:not(.kit-adm) > summary::-webkit-details-marker { + display: none; + } + .kit-prose details:not(.kit-adm) > summary::before { + content: ""; + width: 12px; + height: 12px; + flex: none; + background: currentColor; + -webkit-mask: var(--kit-icon-chevron-right) center / contain no-repeat; + mask: var(--kit-icon-chevron-right) center / contain no-repeat; + transition: transform 0.15s var(--ease-pixel); + } + .kit-prose details:not(.kit-adm)[open] > summary::before { + transform: rotate(90deg); + } + .kit-prose details:not(.kit-adm)[open] > summary { + margin-bottom: 0.5rem; + } + + /* ---------------------------------------------------------------- footnotes */ + .kit-prose sup > a[data-footnote-ref], + .kit-prose .footnote-ref { + display: inline-block; + min-width: 1.25em; + padding: 0 0.25em; + margin-left: 0.1em; + font-family: var(--font-mono); + font-size: 0.72rem; + font-weight: 600; + line-height: 1.4; + text-align: center; + text-decoration: none; + color: var(--color-primary-strong); + background: var(--color-primary-soft); + vertical-align: 0.4em; + } + .dark .kit-prose sup > a[data-footnote-ref] { + color: var(--color-primary); + } + .kit-prose section.footnotes, + .kit-prose .footnotes { + margin-top: 3rem; + padding-top: 1.25rem; + font-size: 0.875rem; + color: var(--color-muted); + border-top: 1px solid var(--color-line); + } + .kit-prose .footnotes ol { + padding-left: 1.5rem; + } + .kit-prose .footnotes li:target { + background: color-mix(in srgb, var(--color-accent-4) 18%, transparent); + } + .kit-prose .footnotes .data-footnote-backref, + .kit-prose .footnotes [data-footnote-backref] { + margin-left: 0.25rem; + text-decoration: none; + font-family: var(--font-mono); + } + .kit-prose .footnotes h2 { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0 0 0 0); + margin: 0; + padding: 0; + border: 0; + } + + /* ---------------------------------------------------------------- misc blocks */ + .kit-prose .kit-math, + .kit-prose .arithmatex { + overflow-x: auto; + } + .kit-prose iframe, + .kit-prose video { + max-width: 100%; + } +} + +@keyframes kit-target-flash { + 0% { + background: color-mix(in srgb, var(--color-accent-4) 45%, transparent); + } + 100% { + background: transparent; + } +} + +:root { + --kit-icon-check-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Cpath fill='white' d='M12 3h2v2h-2v2h-2v2H8v2H6v2H4v-2H2V9h2v2h2V9h2V7h2V5h2z'/%3E%3C/svg%3E"); +} diff --git a/kit/theme/tailwind.css b/kit/theme/tailwind.css new file mode 100644 index 00000000..2ee6e418 --- /dev/null +++ b/kit/theme/tailwind.css @@ -0,0 +1,5 @@ +/* One-line entry for apps: Tailwind v4 + the full levimc-kit theme + kit sources for class detection. */ +@import "tailwindcss"; +@import "./index.css"; +@source "../components"; +@source "../docs/app"; diff --git a/kit/theme/tokens.css b/kit/theme/tokens.css new file mode 100644 index 00000000..40534935 --- /dev/null +++ b/kit/theme/tokens.css @@ -0,0 +1,180 @@ +/* + * levimc-kit — design tokens ("Impression, Craft") + * + * Light = Nymphéas (water lilies at Giverny), Dark = Impression, soleil levant (harbour at sunrise). + * Every semantic colour is a CSS variable registered with Tailwind v4 (`bg-canvas`, `text-ink`, + * `border-line`, `text-primary-strong`, `bg-mc-grass`, …). Light values live on :root; `.dark` + * (set on by the theme script) swaps them. Contrast notes (WCAG 2.x, measured): + * light: ink/canvas 13.2:1 · muted/canvas 5.2:1 · link/canvas 5.7:1 · white/primary-strong 5.9:1 + * dark : ink/canvas 14.9:1 · muted/canvas 7.3:1 · link/canvas 7.8:1 · canvas/primary 7.8:1 + */ + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + /* ---- type ---- */ + --font-sans: "Inter", "InterVariable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", "PingFang SC", + "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", "Noto Sans CJK SC", sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Noto Color Emoji"; + --font-display: "Fraunces", ui-serif, Georgia, "Songti SC", "Noto Serif SC", "PingFang SC", "Microsoft YaHei", + serif; + --font-pixel: "Silkscreen", ui-monospace, "JetBrains Mono", monospace; + --font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", "PingFang SC", + "Microsoft YaHei", monospace; + + /* ---- semantic surfaces (light defaults; dark overrides below) ---- */ + --color-canvas: #f7f3e8; + --color-surface: #fffdf7; + --color-surface-2: #f0ebdd; + --color-surface-3: #e7e0cd; + --color-ink: #1f2a33; + --color-muted: #5b6770; + --color-faint: #8a939a; + --color-line: #e2dacb; + --color-line-strong: #c4b9a2; + --color-primary: #4f8a5b; + --color-primary-strong: #3a7047; + --color-primary-soft: #e3eddc; + --color-on-primary: #ffffff; + --color-link: #356b42; + --color-focus: #8e5cf6; + --color-mark: #f6e3a1; + --color-accent-1: #3e6e8e; /* pond blue / harbour teal */ + --color-accent-2: #9a86c2; /* wisteria / mist violet */ + --color-accent-3: #d98a9e; /* rose / sunrise */ + --color-accent-4: #e9c46a; /* sunlight / sunrise glow */ + --color-code-bg: #fbf8ef; + --color-code-head: #f1ecdf; + --color-code-ink: #26323b; + --color-code-gutter: #9aa0a3; + --color-scrim: rgb(31 42 51 / 0.38); + + /* ---- fixed palette (identical in both themes) ---- */ + --color-lily: #4f8a5b; + --color-pond: #3e6e8e; + --color-wisteria: #9a86c2; + --color-rose: #d98a9e; + --color-sunlight: #e9c46a; + --color-linen: #f7f3e8; + --color-harbor: #3f7f8c; + --color-harbor-night: #0f1b26; + --color-sunrise: #f08a4b; + --color-mist: #7d6f9e; + + /* ---- Minecraft accents ---- */ + --color-mc-grass: #5da130; + --color-mc-grass-dark: #3f7a1f; + --color-mc-dirt: #8a5a33; + --color-mc-dirt-dark: #5e3b1f; + --color-mc-stone: #8b8b8b; + --color-mc-diamond: #5de0e6; + --color-mc-gold: #f2c230; + --color-mc-redstone: #d23b3b; + --color-mc-enchant: #8e5cf6; + --color-mc-tooltip: #100010; + + /* ---- admonition hues (edge/icon colour; tints are derived with color-mix) ---- */ + --color-adm-note: #3e6e8e; + --color-adm-abstract: #4a63b0; + --color-adm-info: #2c7f8a; + --color-adm-tip: #2f8a4f; + --color-adm-success: #1f8a90; + --color-adm-question: #7a63a8; + --color-adm-warning: #b7791f; + --color-adm-failure: #c0392b; + --color-adm-danger: #c0392b; + --color-adm-bug: #c2577a; + --color-adm-example: #7a4fd6; + --color-adm-quote: #6f7479; + + /* ---- geometry ---- */ + --px: 2px; /* one "pixel" of the pixel vocabulary */ + --radius-none: 0; + --spacing-header: 3.75rem; + --spacing-globalbar: 2.5rem; + --spacing-sidebar: 17.5rem; + --spacing-toc: 14rem; + --spacing-measure: 76ch; + + --shadow-pixel: 0 var(--px) 0 0 rgb(31 42 51 / 0.12), 0 calc(var(--px) * 3) 0 0 rgb(31 42 51 / 0.05); + --shadow-float: 0 18px 40px -18px rgb(31 42 51 / 0.35), 0 2px 0 0 rgb(31 42 51 / 0.06); + + --ease-pixel: steps(4, end); + --ease-soft: cubic-bezier(0.22, 0.61, 0.36, 1); + + --animate-kit-drift: kit-drift 48s var(--ease-soft) infinite alternate; + --animate-kit-shimmer: kit-shimmer 9s linear infinite; + --animate-kit-spin-steps: kit-spin-steps 1.6s steps(8, end) infinite; + + @keyframes kit-drift { + 0% { + transform: translate3d(0, 0, 0) scale(1); + } + 50% { + transform: translate3d(1.5%, -1%, 0) scale(1.03); + } + 100% { + transform: translate3d(-1%, 1.2%, 0) scale(1.01); + } + } + @keyframes kit-shimmer { + 0% { + background-position: 0% 50%; + } + 100% { + background-position: 200% 50%; + } + } + @keyframes kit-spin-steps { + to { + transform: rotate(360deg); + } + } +} + +/* ---- Dark: Impression, soleil levant ---- */ +.dark { + --color-canvas: #0f1b26; + --color-surface: #152535; + --color-surface-2: #1a2d3f; + --color-surface-3: #22384c; + --color-ink: #e8eef2; + --color-muted: #9aaab8; + --color-faint: #6f8293; + --color-line: #233648; + --color-line-strong: #36506a; + --color-primary: #6fbf73; + --color-primary-strong: #6fbf73; + --color-primary-soft: #1d3a32; + --color-on-primary: #0f1b26; + --color-link: #7fcc83; + --color-focus: #5de0e6; + --color-mark: #5b4a1f; + --color-accent-1: #3f7f8c; + --color-accent-2: #7d6f9e; + --color-accent-3: #f08a4b; + --color-accent-4: #f5b26b; + --color-code-bg: #0b1620; + --color-code-head: #112231; + --color-code-ink: #dce5ec; + --color-code-gutter: #5d7184; + --color-scrim: rgb(4 10 16 / 0.62); + + --color-adm-note: #78aedb; + --color-adm-abstract: #8ea2ef; + --color-adm-info: #5cc9d3; + --color-adm-tip: #6fcf8a; + --color-adm-success: #5de0e6; + --color-adm-question: #b7a4e6; + --color-adm-warning: #f2b05e; + --color-adm-failure: #f07a6e; + --color-adm-danger: #f07a6e; + --color-adm-bug: #f08fb0; + --color-adm-example: #b493ff; + --color-adm-quote: #a3adb6; + + --shadow-pixel: 0 var(--px) 0 0 rgb(0 0 0 / 0.35), 0 calc(var(--px) * 3) 0 0 rgb(0 0 0 / 0.18); + --shadow-float: 0 22px 48px -18px rgb(0 0 0 / 0.65), 0 2px 0 0 rgb(0 0 0 / 0.3); + + color-scheme: dark; +} diff --git a/kit/tsconfig.template.json b/kit/tsconfig.template.json new file mode 100644 index 00000000..03a52395 --- /dev/null +++ b/kit/tsconfig.template.json @@ -0,0 +1,21 @@ +// Copy to /tsconfig.json. Covers the vendored kit (kit/**) and the app's own sources. +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "noUncheckedIndexedAccess": true, + "noFallthroughCasesInSwitch": true, + "noEmit": true, + "skipLibCheck": true, + "isolatedModules": true, + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "types": ["node", "vite/client"] + }, + "include": ["kit/**/*.ts", "kit/**/*.tsx", "src", "*.ts"], + "exclude": ["node_modules", "dist", ".kit"] +} diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index cf23b49f..00000000 --- a/mkdocs.yml +++ /dev/null @@ -1,134 +0,0 @@ -site_name: LegacyScriptEngine -site_url: https://docs.levimc.org/LegacyScriptEngine/ -repo_url: https://github.com/LiteLDev/LegacyScriptEngine - -nav: - - Home: index.md - - - Tutorials: - - tutorials/create_your_first_plugin.md - - - faq.md - - - APIs: - - apis/README.md - - apis/LanguageSupport.md - - DataAPI: - - apis/DataAPI/ConfigFile.md - - apis/DataAPI/DataBase.md - - apis/DataAPI/Economy.md - - apis/DataAPI/OtherData.md - - apis/DataAPI/PlayerData.md - - EventAPI: - - apis/EventAPI/Listen.md - - apis/EventAPI/BlockEvents.md - - apis/EventAPI/EconomicEvents.md - - apis/EventAPI/EntityEvents.md - - apis/EventAPI/OtherEvents.md - - apis/EventAPI/PlayerEvents.md - - GameAPI: - - apis/GameAPI/Basic.md - - apis/GameAPI/Block.md - - apis/GameAPI/BlockEntity.md - - apis/GameAPI/Command.md - - apis/GameAPI/Container.md - - apis/GameAPI/Device.md - - apis/GameAPI/Entity.md - - apis/GameAPI/GameUtils.md - - apis/GameAPI/Item.md - - apis/GameAPI/Packet.md - - apis/GameAPI/Particle.md - - apis/GameAPI/Player.md - - apis/GameAPI/ScoreBoard.md - - apis/GameAPI/Server.md - - GuiAPI: - - apis/GuiAPI/Form.md - - apis/GuiAPI/FormBuilder.md - - NbtAPI: - - apis/NbtAPI/NBT.md - - apis/NbtAPI/NBTCompound.md - - apis/NbtAPI/NBTList.md - - apis/NbtAPI/NBTValue.md - - ScriptAPI: - - apis/ScriptAPI/Logger.md - - apis/ScriptAPI/ScriptHelp.md - - apis/ScriptAPI/i18n.md - - apis/ScriptAPI/Ll.md - - apis/ScriptAPI/VanillaI18n.md - - SystemAPI: - - apis/SystemAPI/File.md - - apis/SystemAPI/FileSystem.md - - apis/SystemAPI/Network.md - - apis/SystemAPI/SystemCall.md - - apis/SystemAPI/SystemInfo.md - -theme: - name: material - custom_dir: docs/overrides - features: - - navigation.tabs - - navigation.tabs.sticky - - content.code.copy - - content.code.select - favicon: img/logo.png - logo: img/logo.png - palette: - - media: "(prefers-color-scheme: light)" - scheme: default - primary: white - toggle: - icon: material/brightness-7 - name: Switch to dark mode - - - media: "(prefers-color-scheme: dark)" - scheme: slate - toggle: - icon: material/brightness-4 - name: Switch to light mode - -markdown_extensions: - - abbr - - admonition - - attr_list - - def_list - - footnotes - - md_in_html - - toc: - slugify: !!python/object/apply:pymdownx.slugs.slugify - kwds: - case: lower - - tables - - pymdownx.arithmatex - - pymdownx.betterem - - pymdownx.caret - - pymdownx.mark - - pymdownx.tilde - - pymdownx.critic - - pymdownx.details - - pymdownx.emoji - - pymdownx.highlight: - auto_title: true - linenums: true - - pymdownx.inlinehilite - - pymdownx.keys - - pymdownx.smartsymbols - - pymdownx.snippets - - pymdownx.superfences - - pymdownx.tabbed: - alternate_style: true - - pymdownx.tasklist - -plugins: - - i18n: - languages: - - locale: en - default: true - name: English - - - locale: zh - name: 中文 - nav_translations: - Home: 主页 - Tutorials: 教程 - APIs: 接口 - - search diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..4ec84b50 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3905 @@ +{ + "name": "legacy-script-engine-docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "legacy-script-engine-docs", + "dependencies": { + "minisearch": "7.2.0", + "react": "19.3.1", + "react-dom": "19.3.1", + "react-router": "7.18.4" + }, + "devDependencies": { + "@shikijs/transformers": "4.5.0", + "@tailwindcss/vite": "4.3.3", + "@types/hast": "3.0.5", + "@types/mdast": "4.0.4", + "@types/node": "24.19.2", + "@types/picomatch": "4.0.3", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", + "@types/unist": "3.0.3", + "@vitejs/plugin-react": "6.1.2", + "hast-util-to-html": "9.0.5", + "hast-util-to-string": "3.0.1", + "mdast-util-to-string": "4.0.0", + "picomatch": "4.0.7", + "rehype-raw": "7.0.0", + "remark-frontmatter": "5.0.0", + "remark-gfm": "4.0.1", + "remark-parse": "11.0.0", + "remark-rehype": "11.1.2", + "shiki": "4.5.0", + "tailwindcss": "4.3.3", + "typescript": "7.0.2", + "unified": "11.0.5", + "unist-util-visit": "5.1.0", + "vite": "8.3.4", + "yaml": "2.9.1" + }, + "engines": { + "node": ">=22.12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.154.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.154.0.tgz", + "integrity": "sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.14.tgz", + "integrity": "sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.14.tgz", + "integrity": "sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.14.tgz", + "integrity": "sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.14.tgz", + "integrity": "sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.14.tgz", + "integrity": "sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.14.tgz", + "integrity": "sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.14.tgz", + "integrity": "sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.14.tgz", + "integrity": "sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.14.tgz", + "integrity": "sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.14.tgz", + "integrity": "sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.14.tgz", + "integrity": "sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.14.tgz", + "integrity": "sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.14.tgz", + "integrity": "sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.14.tgz", + "integrity": "sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.14.tgz", + "integrity": "sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shikijs/core": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.5.0.tgz", + "integrity": "sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.5.0", + "@shikijs/types": "4.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.5.0.tgz", + "integrity": "sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.5.0.tgz", + "integrity": "sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.5.0.tgz", + "integrity": "sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.5.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.5.0.tgz", + "integrity": "sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.5.0.tgz", + "integrity": "sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.5.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/transformers": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-4.5.0.tgz", + "integrity": "sha512-LM7twi043qCC3gRyGQfjoC2/sowzbEltWuruyRtT3RlBlk1hKzWk9ETnU7RcDBoVWQBmC8Mebnr7p28W7kPoaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.5.0", + "@shikijs/types": "4.5.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.5.0.tgz", + "integrity": "sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.2.tgz", + "integrity": "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.2.tgz", + "integrity": "sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.152.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.3.tgz", + "integrity": "sha512-xPgpDNl0/OXHsI7TlaIs22lWnH3KlpvZdXG1ET/m/YT2Hhdkx8lJV4kLphE6l9simyM4KPDFBwas08BgEob6Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.1.0.tgz", + "integrity": "sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.1.tgz", + "integrity": "sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.2.0.tgz", + "integrity": "sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.3.tgz", + "integrity": "sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-edit-map": "^1.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.4.tgz", + "integrity": "sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.1.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-edit-map": "^1.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.3" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.2.tgz", + "integrity": "sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.1.0.tgz", + "integrity": "sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-edit-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-edit-map/-/micromark-util-edit-map-1.0.0.tgz", + "integrity": "sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.3.tgz", + "integrity": "sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", + "dev": true, + "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/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.30.tgz", + "integrity": "sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==", + "dev": true, + "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.20", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", + "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz", + "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.1" + } + }, + "node_modules/react-router": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.4.tgz", + "integrity": "sha512-PUPQcMhMGRAslLcvtlPz/kmzBEWPhLdgLFrL7pLNepBL6dX0lWj4WD2cUYVgYCuT3jxvghYFg81cDTj44DhetQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rolldown": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.14.tgz", + "integrity": "sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.154.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.14", + "@rolldown/binding-android-arm64": "1.2.14", + "@rolldown/binding-darwin-arm64": "1.2.14", + "@rolldown/binding-darwin-x64": "1.2.14", + "@rolldown/binding-freebsd-x64": "1.2.14", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.14", + "@rolldown/binding-linux-arm64-gnu": "1.2.14", + "@rolldown/binding-linux-arm64-musl": "1.2.14", + "@rolldown/binding-linux-ppc64-gnu": "1.2.14", + "@rolldown/binding-linux-s390x-gnu": "1.2.14", + "@rolldown/binding-linux-x64-gnu": "1.2.14", + "@rolldown/binding-linux-x64-musl": "1.2.14", + "@rolldown/binding-openharmony-arm64": "1.2.14", + "@rolldown/binding-win32-arm64-msvc": "1.2.14", + "@rolldown/binding-win32-x64-msvc": "1.2.14" + } + }, + "node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shiki": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.5.0.tgz", + "integrity": "sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.5.0", + "@shikijs/engine-javascript": "4.5.0", + "@shikijs/engine-oniguruma": "4.5.0", + "@shikijs/langs": "4.5.0", + "@shikijs/themes": "4.5.0", + "@shikijs/types": "4.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.4.tgz", + "integrity": "sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.29", + "rolldown": "~1.2.12", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.7.1", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..88131e83 --- /dev/null +++ b/package.json @@ -0,0 +1,50 @@ +{ + "name": "legacy-script-engine-docs", + "private": true, + "type": "module", + "engines": { + "node": ">=22.12" + }, + "scripts": { + "dev": "vite", + "build": "node kit/docs/build.mjs", + "preview": "node kit/scripts/serve-pages.mjs dist --base /LegacyScriptEngine/ --port 4173", + "typecheck": "tsc --noEmit", + "linkcheck": "node kit/scripts/linkcheck.mjs dist --base /LegacyScriptEngine/ --site-origin https://docs.levimc.org", + "smoke": "node kit/scripts/smoke.mjs --url http://127.0.0.1:4173/LegacyScriptEngine/" + }, + "dependencies": { + "minisearch": "7.2.0", + "react": "19.3.1", + "react-dom": "19.3.1", + "react-router": "7.18.4" + }, + "devDependencies": { + "@shikijs/transformers": "4.5.0", + "@tailwindcss/vite": "4.3.3", + "@types/hast": "3.0.5", + "@types/mdast": "4.0.4", + "@types/node": "24.19.2", + "@types/picomatch": "4.0.3", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", + "@types/unist": "3.0.3", + "@vitejs/plugin-react": "6.1.2", + "hast-util-to-html": "9.0.5", + "hast-util-to-string": "3.0.1", + "mdast-util-to-string": "4.0.0", + "picomatch": "4.0.7", + "rehype-raw": "7.0.0", + "remark-frontmatter": "5.0.0", + "remark-gfm": "4.0.1", + "remark-parse": "11.0.0", + "remark-rehype": "11.1.2", + "shiki": "4.5.0", + "tailwindcss": "4.3.3", + "typescript": "7.0.2", + "unified": "11.0.5", + "unist-util-visit": "5.1.0", + "vite": "8.3.4", + "yaml": "2.9.1" + } +} diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 5ef9ad55..00000000 --- a/requirements.txt +++ /dev/null @@ -1,29 +0,0 @@ -Babel==2.12.1 -certifi==2023.7.22 -charset-normalizer==3.2.0 -click==8.1.7 -colorama==0.4.6 -ghp-import==2.1.0 -idna==3.4 -Jinja2==3.1.2 -Markdown==3.4.4 -MarkupSafe==2.1.3 -mergedeep==1.3.4 -mkdocs==1.5.2 -mkdocs-material==9.3.1 -mkdocs-material-extensions==1.1.1 -mkdocs-static-i18n==1.0.3 -packaging==23.1 -paginate==0.5.6 -pathspec==0.11.2 -platformdirs==3.10.0 -Pygments==2.16.1 -pymdown-extensions==10.3 -python-dateutil==2.8.2 -PyYAML==6.0.1 -pyyaml_env_tag==0.1 -regex==2023.8.8 -requests==2.31.0 -six==1.16.0 -urllib3==2.0.4 -watchdog==3.0.0 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..a809be1f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "noUncheckedIndexedAccess": true, + "noFallthroughCasesInSwitch": true, + "noEmit": true, + "skipLibCheck": true, + "isolatedModules": true, + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "types": ["node", "vite/client"] + }, + "include": ["kit/**/*.ts", "kit/**/*.tsx", "*.ts"], + "exclude": ["node_modules", "dist", ".kit"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..91ff0ffc --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; +import { kitDocs } from './kit/docs/node/vite.ts'; +import docs from './docs.config.ts'; + +export default defineConfig({ + plugins: [kitDocs(docs)], +}); From dc4e10d2b5019b52463c34001a1d8cd11f8d2e51 Mon Sep 17 00:00:00 2001 From: Zijian Zhang <35801754+futrime@users.noreply.github.com> Date: Sat, 17 Oct 2026 23:51:39 +0800 Subject: [PATCH 2/2] docs: address review of the levimc-kit migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - nav: API sub-groups start collapsed except the one holding the current page, like MkDocs Material; the active sidebar/drawer link and the active "On this page" entry are scrolled into view - python-markdown compat: lazy blockquote continuation after an empty '>' line, 5+ spaces after a list marker are not indented code, and code spans pair backticks like Python-Markdown (reverts the NBTValue source edit) - Python-Markdown footnote ids (fn:1 / fnref:1), MkDocs home and 404 titles, sitemap.xml.gz, no empty dist/kit folder, full project name in the 390px header - zh particle link points at the Bedrock particle page (old page is now a disambiguation page without #类型) - CI: drop the duplicate pull_request trigger; deploy job gets the github-pages environment and a pages concurrency group --- .github/workflows/build_docs.yml | 19 +++---- docs.config.ts | 29 ++++++++--- docs/apis/GameAPI/Block.zh.md | 2 +- docs/apis/NbtAPI/NBTValue.md | 2 +- docs/apis/NbtAPI/NBTValue.zh.md | 2 +- kit/docs/app/components/MobileDrawer.tsx | 11 ++++- kit/docs/app/components/Sidebar.tsx | 15 +++++- kit/docs/app/components/Toc.tsx | 11 ++++- kit/docs/app/components/reveal.ts | 23 +++++++++ kit/docs/app/docs.css | 20 +++++++- kit/docs/node/markdown/preprocess.ts | 63 ++++++++++++++++++++++-- kit/docs/node/markdown/render.ts | 25 ++++++++++ kit/docs/node/vite.ts | 10 ++-- kit/docs/prerender.mjs | 4 +- kit/docs/shared/head.ts | 8 +-- 15 files changed, 203 insertions(+), 41 deletions(-) create mode 100644 kit/docs/app/components/reveal.ts diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml index 02d9e89b..dba13b33 100644 --- a/.github/workflows/build_docs.yml +++ b/.github/workflows/build_docs.yml @@ -1,14 +1,4 @@ on: - pull_request: - paths: - - .github/workflows/build_docs.yml - - docs/** - - kit/** - - docs.config.ts - - vite.config.ts - - tsconfig.json - - package.json - - package-lock.json push: paths: - .github/workflows/build_docs.yml @@ -59,6 +49,13 @@ jobs: permissions: id-token: write pages: write + concurrency: + group: pages + cancel-in-progress: false + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - - uses: actions/deploy-pages@v5 + - id: deployment + uses: actions/deploy-pages@v5 diff --git a/docs.config.ts b/docs.config.ts index 12cba06d..d75508b1 100644 --- a/docs.config.ts +++ b/docs.config.ts @@ -30,6 +30,9 @@ export default defineDocsConfig({ // and LanguageSupport are h5 headings, so keep the full depth instead of the kit default [2, 4]. outline: [2, 6], sidebar: 'tabs', + // Same tree as mkdocs.yml. The API sub-groups use the `{ text, collapsed, items }` form because MkDocs Material + // (without navigation.expand) shows them collapsed, except the group that holds the current page; the kit + // would otherwise open every first-level sidebar group and push the current page out of view. nav: [ { Home: 'index.md' }, { Tutorials: ['tutorials/create_your_first_plugin.md'] }, @@ -39,7 +42,9 @@ export default defineDocsConfig({ 'apis/README.md', 'apis/LanguageSupport.md', { - DataAPI: [ + text: 'DataAPI', + collapsed: true, + items: [ 'apis/DataAPI/ConfigFile.md', 'apis/DataAPI/DataBase.md', 'apis/DataAPI/Economy.md', @@ -48,7 +53,9 @@ export default defineDocsConfig({ ], }, { - EventAPI: [ + text: 'EventAPI', + collapsed: true, + items: [ 'apis/EventAPI/Listen.md', 'apis/EventAPI/BlockEvents.md', 'apis/EventAPI/EconomicEvents.md', @@ -58,7 +65,9 @@ export default defineDocsConfig({ ], }, { - GameAPI: [ + text: 'GameAPI', + collapsed: true, + items: [ 'apis/GameAPI/Basic.md', 'apis/GameAPI/Block.md', 'apis/GameAPI/BlockEntity.md', @@ -75,9 +84,11 @@ export default defineDocsConfig({ 'apis/GameAPI/Server.md', ], }, - { GuiAPI: ['apis/GuiAPI/Form.md', 'apis/GuiAPI/FormBuilder.md'] }, + { text: 'GuiAPI', collapsed: true, items: ['apis/GuiAPI/Form.md', 'apis/GuiAPI/FormBuilder.md'] }, { - NbtAPI: [ + text: 'NbtAPI', + collapsed: true, + items: [ 'apis/NbtAPI/NBT.md', 'apis/NbtAPI/NBTCompound.md', 'apis/NbtAPI/NBTList.md', @@ -85,7 +96,9 @@ export default defineDocsConfig({ ], }, { - ScriptAPI: [ + text: 'ScriptAPI', + collapsed: true, + items: [ 'apis/ScriptAPI/Logger.md', 'apis/ScriptAPI/ScriptHelp.md', 'apis/ScriptAPI/i18n.md', @@ -94,7 +107,9 @@ export default defineDocsConfig({ ], }, { - SystemAPI: [ + text: 'SystemAPI', + collapsed: true, + items: [ 'apis/SystemAPI/File.md', 'apis/SystemAPI/FileSystem.md', 'apis/SystemAPI/Network.md', diff --git a/docs/apis/GameAPI/Block.zh.md b/docs/apis/GameAPI/Block.zh.md index c33af374..c79c3eee 100644 --- a/docs/apis/GameAPI/Block.zh.md +++ b/docs/apis/GameAPI/Block.zh.md @@ -209,4 +209,4 @@ - 返回值:是否成功生成 - 返回值类型:`Boolean` -粒子效果名称可以查阅[Minecraft Wiki](https://zh.minecraft.wiki/w/粒子#类型)得知,在传入参数的时候不要忘记命名空间前缀。类似于 `minecraft:heart_particle` +粒子效果名称可以查阅[Minecraft Wiki](https://zh.minecraft.wiki/w/基岩版粒子#类型)得知,在传入参数的时候不要忘记命名空间前缀。类似于 `minecraft:heart_particle` diff --git a/docs/apis/NbtAPI/NBTValue.md b/docs/apis/NbtAPI/NBTValue.md index 9371ec3b..b3a1698e 100644 --- a/docs/apis/NbtAPI/NBTValue.md +++ b/docs/apis/NbtAPI/NBTValue.md @@ -60,6 +60,6 @@ For an NBT object that stores common data types `value`, with the following memb `value.get()` - Return value: The data stored in the object. -- Return value type: \``Number` / `Float` / `Double` / `ByteBuffer` / `String`, depending on the type of the data stored. +- Return value type: ``Number` / `Float` / `Double` / `ByteBuffer` / `String`, depending on the type of the data stored. diff --git a/docs/apis/NbtAPI/NBTValue.zh.md b/docs/apis/NbtAPI/NBTValue.zh.md index 73f3750e..2c5960fc 100644 --- a/docs/apis/NbtAPI/NBTValue.zh.md +++ b/docs/apis/NbtAPI/NBTValue.zh.md @@ -61,6 +61,6 @@ `value.get()` - 返回值:对象中储存的数据 -- 返回值类型:\``Number` / `Float` / `Double` / `ByteBuffer` / `String`,以储存的实际数据类型为准 +- 返回值类型:``Number` / `Float` / `Double` / `ByteBuffer` / `String`,以储存的实际数据类型为准 diff --git a/kit/docs/app/components/MobileDrawer.tsx b/kit/docs/app/components/MobileDrawer.tsx index d91e814f..3e2a2a8e 100644 --- a/kit/docs/app/components/MobileDrawer.tsx +++ b/kit/docs/app/components/MobileDrawer.tsx @@ -1,9 +1,10 @@ -import { useRef } from 'react'; +import { useEffect, useRef } from 'react'; import type { NavItem, RouteMeta, SidebarData } from '../../shared/types'; import { href, site } from '../data'; import { KitLink } from './KitLink'; import { Sidebar } from './Sidebar'; import { useFocusTrap } from './focus'; +import { afterPaint, revealIn } from './reveal'; import { PixelIcon } from '../../../components/PixelIcon'; import type { UiStrings } from '../../../components/i18n'; @@ -26,6 +27,14 @@ export function MobileDrawer({ }) { const ref = useRef(null); useFocusTrap(ref, open, onClose); + // open the drawer with the current page's link in view + useEffect(() => { + if (!open) return; + return afterPaint(() => { + const d = ref.current; + revealIn(d, d?.querySelector('.kit-sb-link.is-active') ?? d?.querySelector('.kit-drawer-link.is-active') ?? null, 'center'); + }); + }, [open, path]); const items: NavItem[] = site.nav[locale] ?? []; return ( ') => { const pad = ' '.repeat(ind); @@ -191,6 +198,7 @@ function processBlock(lines: string[], o: Required): string[] } prev = 'block'; lastBlank = false; + quoteOpen = false; continue; } @@ -200,9 +208,26 @@ function processBlock(lines: string[], o: Required): string[] i++; prev = 'blank'; lastBlank = true; + quoteOpen = false; continue; } + // ---------------------------------------------------------------- python-markdown: blockquote continuation + if (py && quoteOpen && !/^ {0,3}>/.test(line)) { + if (classify(trimmed) === 'heading' || HR_RE.test(line) || /^(=+|-+)\s*$/.test(trimmed) || (o.mkdocs && (ADM_RE.test(trimmed) || TAB_RE.test(trimmed)))) { + // headings, rules and MkDocs containers split the block before the quote processor sees them + quoteOpen = false; + } else { + // CommonMark ends the quote after an empty '>' line (no lazy continuation); Python-Markdown keeps the line + // as quote text (its indentation never starts code there) + out.push(pyEsc('> ' + trimmed)); + i++; + prev = 'block'; + lastBlank = false; + continue; + } + } + // ---------------------------------------------------------------- python-markdown: list boundaries if (py && inList && lastBlank && ind < 4 && !LIST_RE.test(line)) { // un-indented block after a blank line ends the list (CommonMark would keep it inside the item): @@ -469,7 +494,7 @@ function processBlock(lines: string[], o: Required): string[] continue; } if (ind >= 4) { - out.push(pyEsc(line)); + out.push(pyEsc(line, ind >= (depth + 2) * 4)); i++; prev = 'list'; lastBlank = false; @@ -495,7 +520,8 @@ function processBlock(lines: string[], o: Required): string[] } } - out.push(pyEsc(line)); + out.push(pyEsc(line, ind >= 4 && prev !== 'para')); + if (py && !inList && ind <= 3 && trimmed.startsWith('>')) quoteOpen = true; i++; prev = classify(trimmed); lastBlank = false; @@ -507,7 +533,36 @@ function processBlock(lines: string[], o: Required): string[] function rewriteMarker(line: string, newIndent: number, marker: string, ordered: boolean): string { const m = LIST_RE.exec(line)!; const mk = ordered ? m[2]! : marker; - return ' '.repeat(newIndent) + mk + (m[3] || ' ') + m[4]; + // Python-Markdown strips the gap after the marker; in CommonMark 5+ spaces would start an indented code block. + const gap = m[3] && m[3].length < 5 ? m[3] : ' '; + return ' '.repeat(newIndent) + mk + gap + m[4]; +} + +// Python-Markdown's code-span pattern (markdown/inlinepatterns.py BACKTICK_RE). Unlike CommonMark, an opening run +// without a closing run of the same length still matches with fewer backticks: "``a` b" → `a b. +const PY_BACKTICK = /(? + codeSegments(line) + .filter(([code]) => code) + .map(([, t]) => t.replace(/^`+|`+$/g, '').trim()); +/** + * python-markdown compat: rewrite the code spans of a line that holds a run of 2+ backticks so CommonMark pairs + * them exactly like Python-Markdown did. The line is left alone unless the rewritten spans match Python's. + */ +function pyCodeSpans(line: string): string { + if (!line.includes('``')) return line; + const py: string[] = []; + const out = line.replace(PY_BACKTICK, (m: string, _esc: string | undefined, ticks: string | undefined, content: string) => { + if (!ticks) return m; + const c = content.trim(); + py.push(c); + const longest = Math.max(0, ...(c.match(/`+/g) ?? []).map((r) => r.length)); + const fence = '`'.repeat(longest + 1); + const pad = c.startsWith('`') || c.endsWith('`') ? ' ' : ''; + return fence + pad + c + pad + fence; + }); + const cm = cmCodes(out); + return cm.length === py.length && cm.every((c, n) => c === py[n]) ? out : line; } function classify(trimmed: string): Kind { diff --git a/kit/docs/node/markdown/render.ts b/kit/docs/node/markdown/render.ts index 5d9b704b..1a73c92b 100644 --- a/kit/docs/node/markdown/render.ts +++ b/kit/docs/node/markdown/render.ts @@ -333,6 +333,31 @@ export async function renderMarkdown(source: string, o: RenderOptions): Promise< }; containerPass(tree); + // ---- Python-Markdown footnote ids (fn:1, fnref:1, fnref2:1) so old #fn: deep links keep working + if (o.compat === 'python-markdown') { + const notes: Element[] = []; + const refs: Element[] = []; + visit(tree, 'element', (el: Element) => { + if ('dataFootnotes' in el.properties) { + for (const ol of el.children) if (isEl(ol, 'ol')) notes.push(...ol.children.filter((li): li is Element => isEl(li, 'li'))); + } else if (el.tagName === 'a' && ('dataFootnoteRef' in el.properties || 'dataFootnoteBackref' in el.properties)) refs.push(el); + }); + const labels = new Set(notes.map((li) => String(li.properties.id ?? '')).filter((id) => id.startsWith('fn-')).map((id) => id.slice(3))); + const pyId = (id: string): string => { + if (id.startsWith('fn-') && labels.has(id.slice(3))) return 'fn:' + id.slice(3); + if (!id.startsWith('fnref-')) return id; + const r = id.slice(6); + if (labels.has(r)) return 'fnref:' + r; + const m = /^(.*)-(\d+)$/.exec(r); + return m && labels.has(m[1]!) ? `fnref${m[2]}:${m[1]}` : id; + }; + for (const li of notes) if (li.properties.id !== undefined) li.properties.id = pyId(String(li.properties.id)); + for (const a of refs) { + if (a.properties.id !== undefined) a.properties.id = pyId(String(a.properties.id)); + if (typeof a.properties.href === 'string' && a.properties.href.startsWith('#')) a.properties.href = '#' + pyId(a.properties.href.slice(1)); + } + } + // ---- heading ids, permalinks, toc const slugger = createSlugger(o.slug); visit(tree, 'element', (node: Element) => { diff --git a/kit/docs/node/vite.ts b/kit/docs/node/vite.ts index 25641444..d80c4ad1 100644 --- a/kit/docs/node/vite.ts +++ b/kit/docs/node/vite.ts @@ -12,6 +12,7 @@ import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'; import { createHash } from 'node:crypto'; +import { gzipSync } from 'node:zlib'; import { dirname, extname, join, relative, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import type { Plugin, PluginOption, ViteDevServer } from 'vite'; @@ -266,11 +267,10 @@ export function kitDocs(userConfig: DocsConfig, options: KitDocsPluginOptions = return ` \n ${cfg.hostname}${cfg.base}${encodeURI(r.path)}\n${lastmod}${links} `; }) .join('\n'); - this.emitFile({ - type: 'asset', - fileName: 'sitemap.xml', - source: `\n\n${urls}\n\n`, - }); + const sitemap = `\n\n${urls}\n\n`; + this.emitFile({ type: 'asset', fileName: 'sitemap.xml', source: sitemap }); + // MkDocs also published sitemap.xml.gz; keep that URL alive for crawlers that registered it + if (cfg.urlStyle === 'directory') this.emitFile({ type: 'asset', fileName: 'sitemap.xml.gz', source: gzipSync(sitemap, { level: 9 }) }); } }, writeBundle() { diff --git a/kit/docs/prerender.mjs b/kit/docs/prerender.mjs index 34288d09..b5623603 100644 --- a/kit/docs/prerender.mjs +++ b/kit/docs/prerender.mjs @@ -1,7 +1,7 @@ #!/usr/bin/env node // Prerender every route of a levimc-kit docs site into static HTML (run after the client + SSR builds). // Usage: node kit/docs/prerender.mjs [--root ] -import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { existsSync, mkdirSync, readFileSync, rmdirSync, rmSync, writeFileSync } from 'node:fs'; import { dirname, join, resolve } from 'node:path'; import { pathToFileURL } from 'node:url'; @@ -42,7 +42,7 @@ export async function prerenderDocs({ root = process.cwd(), outDir } = {}) { let d = dirname(templatePath); while (d.startsWith(out) && d !== out) { try { - rmSync(d); + rmdirSync(d); // only removes empty folders (rmSync throws EISDIR on any folder) } catch { break; } diff --git a/kit/docs/shared/head.ts b/kit/docs/shared/head.ts index e3f832bb..2dc1da4c 100644 --- a/kit/docs/shared/head.ts +++ b/kit/docs/shared/head.ts @@ -4,9 +4,11 @@ import type { RouteMeta, SiteData } from './types.ts'; const esc = (s: string) => s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); export function pageTitle(site: SiteData, route: RouteMeta | undefined, fallback?: string): string { - if (!route) return fallback ? `${fallback} | ${site.title}` : site.title; - if (route.layout === 'home' || route.title === site.title) return site.title; - return site.titleTemplate.replace(':title', route.title).replace(':site', site.title); + const fill = (title: string) => site.titleTemplate.replace(':title', () => title).replace(':site', () => site.title); + if (!route) return fallback ? fill(fallback) : site.title; + // MkDocs (directory URLs) titles the site root page with the bare site name (Material's `page.is_homepage`) + if (route.layout === 'home' || route.title === site.title || (site.urlStyle === 'directory' && route.path === '')) return site.title; + return fill(route.title); } export function absoluteUrl(site: SiteData, path: string): string {